diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/LambdaCompletionProvider.java b/java/java-impl/src/com/intellij/codeInsight/completion/LambdaCompletionProvider.java index 386c8a2296c6..3c0e9ace5e3b 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/LambdaCompletionProvider.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/LambdaCompletionProvider.java @@ -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() { + 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() { @Override public String fun(PsiParameter parameter) { return parameter.getName(); diff --git a/java/java-impl/src/com/intellij/codeInsight/generation/GenerateMembersUtil.java b/java/java-impl/src/com/intellij/codeInsight/generation/GenerateMembersUtil.java index a389a64436ea..1288318e4d52 100644 --- a/java/java-impl/src/com/intellij/codeInsight/generation/GenerateMembersUtil.java +++ b/java/java-impl/src/com/intellij/codeInsight/generation/GenerateMembersUtil.java @@ -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, diff --git a/java/java-tests/testData/codeInsight/completion/smartType/InLambdaPositionNameSubstitution-out.java b/java/java-tests/testData/codeInsight/completion/smartType/InLambdaPositionNameSubstitution-out.java new file mode 100644 index 000000000000..5412eabcf355 --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/smartType/InLambdaPositionNameSubstitution-out.java @@ -0,0 +1,9 @@ +interface I { + void m(T t); +} + +class Test { + public static void main(String[] args) { + I i = s -> + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/completion/smartType/InLambdaPositionNameSubstitution.java b/java/java-tests/testData/codeInsight/completion/smartType/InLambdaPositionNameSubstitution.java new file mode 100644 index 000000000000..6e57fe289d79 --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/smartType/InLambdaPositionNameSubstitution.java @@ -0,0 +1,9 @@ +interface I { + void m(T t); +} + +class Test { + public static void main(String[] args) { + I i = + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/completion/smartType/InLambdaPositionSingleParam-out.java b/java/java-tests/testData/codeInsight/completion/smartType/InLambdaPositionSingleParam-out.java new file mode 100644 index 000000000000..96fd5f16074b --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/smartType/InLambdaPositionSingleParam-out.java @@ -0,0 +1,9 @@ +interface I { + void m(int x); +} + +class Test { + public static void main(String[] args) { + I i = x -> + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/completion/smartType/InLambdaPositionSingleParam.java b/java/java-tests/testData/codeInsight/completion/smartType/InLambdaPositionSingleParam.java new file mode 100644 index 000000000000..7de98c3770c7 --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/smartType/InLambdaPositionSingleParam.java @@ -0,0 +1,9 @@ +interface I { + void m(int x); +} + +class Test { + public static void main(String[] args) { + I i = + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/completion/SmartType18CompletionTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/completion/SmartType18CompletionTest.java index 038d10226f7d..a9811983947e 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/completion/SmartType18CompletionTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/completion/SmartType18CompletionTest.java @@ -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(); }