From c98d7f0c5e47a0ef6cb717b8bf9f4de652424e4b Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Wed, 13 Aug 2014 18:37:05 +0400 Subject: [PATCH] lambda completion: reformat, ensure unique names (IDEA-128567) --- .../completion/LambdaCompletionProvider.java | 22 ++++++++++++++----- .../InLambdaPositionSameNames-out.java | 10 +++++++++ .../smartType/InLambdaPositionSameNames.java | 10 +++++++++ .../completion/SmartType18CompletionTest.java | 3 +++ 4 files changed, 40 insertions(+), 5 deletions(-) create mode 100644 java/java-tests/testData/codeInsight/completion/smartType/InLambdaPositionSameNames-out.java create mode 100644 java/java-tests/testData/codeInsight/completion/smartType/InLambdaPositionSameNames.java 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 f169ccd8aa56..4fd7df6c7e2e 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/LambdaCompletionProvider.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/LambdaCompletionProvider.java @@ -25,6 +25,7 @@ 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.CodeStyleManager; import com.intellij.psi.codeStyle.JavaCodeStyleManager; import com.intellij.psi.impl.source.resolve.graphInference.FunctionalInterfaceParameterizationUtil; import com.intellij.psi.util.PsiUtil; @@ -52,18 +53,25 @@ public class LambdaCompletionProvider extends CompletionProvider() { + String paramsString = + params.length == 1 ? getParamName(params[0], javaCodeStyleManager, originalPosition) : "(" + StringUtil.join(params, new Function() { @Override public String fun(PsiParameter parameter) { - return parameter.getName(); + return getParamName(parameter, javaCodeStyleManager, originalPosition); } - }, ",") + ")"; + }, ",") + ")"; + + final CodeStyleManager codeStyleManager = CodeStyleManager.getInstance(project); + PsiLambdaExpression lambdaExpression = (PsiLambdaExpression)JavaPsiFacade.getElementFactory(project) + .createExpressionFromText(paramsString + " -> {}", null); + lambdaExpression = (PsiLambdaExpression)codeStyleManager.reformat(lambdaExpression); + paramsString = lambdaExpression.getParameterList().getText(); final LookupElementBuilder builder = LookupElementBuilder.create(paramsString).withPresentableText(paramsString + " -> {}").withInsertHandler(new InsertHandler() { @Override @@ -77,4 +85,8 @@ public class LambdaCompletionProvider extends CompletionProvider { + void m(T t, String s); +} + +class Test { + public static void main(String[] args) { + String s = ""; + I i = (s1, s2) -> + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/completion/smartType/InLambdaPositionSameNames.java b/java/java-tests/testData/codeInsight/completion/smartType/InLambdaPositionSameNames.java new file mode 100644 index 000000000000..e7adb2ffb758 --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/smartType/InLambdaPositionSameNames.java @@ -0,0 +1,10 @@ +interface I { + void m(T t, String s); +} + +class Test { + public static void main(String[] args) { + String s = ""; + 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 d98f0a68b72b..eb3c4c4577b6 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/completion/SmartType18CompletionTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/completion/SmartType18CompletionTest.java @@ -80,6 +80,9 @@ public class SmartType18CompletionTest extends LightFixtureCompletionTestCase { public void testInLambdaPositionNameSubstitution() throws Exception { doTest(); } + public void testInLambdaPositionSameNames() throws Exception { + doTest(); + } public void testConstructorRef() throws Exception { doTest(false);