mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
lambda completion: strip unnecessary parenthesis, generate parameter names as for override/implement (IDEA-121947)
(cherry picked from commit 273ae0329f28a5bec42847a8739faf8a815cab37)
This commit is contained in:
+14
-2
@@ -16,13 +16,16 @@
|
||||
package com.intellij.codeInsight.completion;
|
||||
|
||||
import com.intellij.codeInsight.ExpectedTypeInfo;
|
||||
import com.intellij.codeInsight.generation.GenerateMembersUtil;
|
||||
import com.intellij.codeInsight.lookup.AutoCompletionPolicy;
|
||||
import com.intellij.codeInsight.lookup.LookupElement;
|
||||
import com.intellij.codeInsight.lookup.LookupElementBuilder;
|
||||
import com.intellij.openapi.editor.Editor;
|
||||
import com.intellij.openapi.editor.EditorModificationUtil;
|
||||
import com.intellij.openapi.project.Project;
|
||||
import com.intellij.openapi.util.text.StringUtil;
|
||||
import com.intellij.psi.*;
|
||||
import com.intellij.psi.codeStyle.JavaCodeStyleManager;
|
||||
import com.intellij.psi.util.PsiUtil;
|
||||
import com.intellij.util.Function;
|
||||
import com.intellij.util.ProcessingContext;
|
||||
@@ -43,8 +46,17 @@ public class LambdaCompletionProvider extends CompletionProvider<CompletionParam
|
||||
if (LambdaUtil.isFunctionalType(defaultType)) {
|
||||
final PsiMethod method = LambdaUtil.getFunctionalInterfaceMethod(defaultType);
|
||||
if (method != null) {
|
||||
final PsiParameter[] params = method.getParameterList().getParameters();
|
||||
final String paramsString = "(" + StringUtil.join(params, new Function<PsiParameter, String>() {
|
||||
PsiParameter[] params = method.getParameterList().getParameters();
|
||||
final Project project = method.getProject();
|
||||
final PsiElement originalPosition = parameters.getOriginalPosition();
|
||||
final JVMElementFactory jvmElementFactory = originalPosition != null ? JVMElementFactories.getFactory(originalPosition.getLanguage(), project) : null;
|
||||
if (jvmElementFactory != null) {
|
||||
final PsiSubstitutor substitutor = LambdaUtil.getSubstitutor(method, PsiUtil.resolveGenericsClassInType(defaultType));
|
||||
final JavaCodeStyleManager codeStyleManager = JavaCodeStyleManager.getInstance(project);
|
||||
params = GenerateMembersUtil.overriddenParameters(params, jvmElementFactory, codeStyleManager, substitutor, originalPosition);
|
||||
}
|
||||
|
||||
final String paramsString = params.length == 1 ? params[0].getName() : "(" + StringUtil.join(params, new Function<PsiParameter, String>() {
|
||||
@Override
|
||||
public String fun(PsiParameter parameter) {
|
||||
return parameter.getName();
|
||||
|
||||
@@ -385,10 +385,25 @@ public class GenerateMembersUtil {
|
||||
@NotNull PsiParameterList sourceParameterList,
|
||||
@NotNull PsiParameterList targetParameterList,
|
||||
@NotNull PsiSubstitutor substitutor, PsiElement target) {
|
||||
PsiParameter[] parameters = sourceParameterList.getParameters();
|
||||
final PsiParameter[] parameters = sourceParameterList.getParameters();
|
||||
final PsiParameter[] newParameters = overriddenParameters(parameters, factory, codeStyleManager, substitutor, target);
|
||||
for (int i = 0; i < newParameters.length; i++) {
|
||||
final PsiParameter newParameter = newParameters[i];
|
||||
copyOrReplaceModifierList(parameters[i], newParameter);
|
||||
targetParameterList.add(newParameter);
|
||||
}
|
||||
}
|
||||
|
||||
public static PsiParameter[] overriddenParameters(PsiParameter[] parameters,
|
||||
@NotNull JVMElementFactory factory,
|
||||
@NotNull JavaCodeStyleManager codeStyleManager,
|
||||
@NotNull PsiSubstitutor substitutor,
|
||||
PsiElement target) {
|
||||
PsiParameter[] result = new PsiParameter[parameters.length];
|
||||
UniqueNameGenerator generator = new UniqueNameGenerator();
|
||||
|
||||
for (PsiParameter parameter : parameters) {
|
||||
for (int i = 0; i < parameters.length; i++) {
|
||||
PsiParameter parameter = parameters[i];
|
||||
final PsiType parameterType = parameter.getType();
|
||||
final PsiType substituted = substituteType(substitutor, parameterType, (PsiMethod)parameter.getDeclarationScope());
|
||||
@NonNls String paramName = parameter.getName();
|
||||
@@ -413,10 +428,9 @@ public class GenerateMembersUtil {
|
||||
paramName = generator.generateUniqueName(paramName);
|
||||
}
|
||||
generator.addExistingName(paramName);
|
||||
final PsiParameter newParameter = factory.createParameter(paramName, substituted, target);
|
||||
copyOrReplaceModifierList(parameter, newParameter);
|
||||
targetParameterList.add(newParameter);
|
||||
result[i] = factory.createParameter(paramName, substituted, target);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
private static void substituteThrows(@NotNull JVMElementFactory factory,
|
||||
|
||||
+9
@@ -0,0 +1,9 @@
|
||||
interface I<T> {
|
||||
void m(T t);
|
||||
}
|
||||
|
||||
class Test {
|
||||
public static void main(String[] args) {
|
||||
I<String> i = s -> <caret>
|
||||
}
|
||||
}
|
||||
+9
@@ -0,0 +1,9 @@
|
||||
interface I<T> {
|
||||
void m(T t);
|
||||
}
|
||||
|
||||
class Test {
|
||||
public static void main(String[] args) {
|
||||
I<String> i = <caret>
|
||||
}
|
||||
}
|
||||
+9
@@ -0,0 +1,9 @@
|
||||
interface I {
|
||||
void m(int x);
|
||||
}
|
||||
|
||||
class Test {
|
||||
public static void main(String[] args) {
|
||||
I i = x -> <caret>
|
||||
}
|
||||
}
|
||||
+9
@@ -0,0 +1,9 @@
|
||||
interface I {
|
||||
void m(int x);
|
||||
}
|
||||
|
||||
class Test {
|
||||
public static void main(String[] args) {
|
||||
I i = <caret>
|
||||
}
|
||||
}
|
||||
+8
@@ -73,6 +73,14 @@ public class SmartType18CompletionTest extends LightFixtureCompletionTestCase {
|
||||
doTest();
|
||||
}
|
||||
|
||||
public void testInLambdaPositionSingleParam() throws Exception {
|
||||
doTest();
|
||||
}
|
||||
|
||||
public void testInLambdaPositionNameSubstitution() throws Exception {
|
||||
doTest();
|
||||
}
|
||||
|
||||
public void testFilteredMethodReference() throws Exception {
|
||||
doTest();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user