From 02b032eca2886cb5da3543c141a8db1139658b65 Mon Sep 17 00:00:00 2001 From: peter Date: Tue, 10 Apr 2018 18:01:42 +0200 Subject: [PATCH] IDEA-189603 Multi-parameter completion overwrites code if there is no closing parenthesis --- .../SameSignatureCallParametersProvider.java | 10 +++++++--- .../SameSignatureWithoutClosingParen-out.java | 8 ++++++++ .../smartType/SameSignatureWithoutClosingParen.java | 8 ++++++++ .../completion/SmartTypeCompletionTest.java | 8 ++++++++ 4 files changed, 31 insertions(+), 3 deletions(-) create mode 100644 java/java-tests/testData/codeInsight/completion/smartType/SameSignatureWithoutClosingParen-out.java create mode 100644 java/java-tests/testData/codeInsight/completion/smartType/SameSignatureWithoutClosingParen.java diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/SameSignatureCallParametersProvider.java b/java/java-impl/src/com/intellij/codeInsight/completion/SameSignatureCallParametersProvider.java index edf0a6d3d99c..5a4fd94c136c 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/SameSignatureCallParametersProvider.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/SameSignatureCallParametersProvider.java @@ -35,7 +35,6 @@ import com.intellij.util.JavaPsiConstructorUtil; import com.intellij.util.PlatformIcons; import com.intellij.util.ProcessingContext; import com.intellij.util.containers.ContainerUtil; -import com.intellij.util.text.CharArrayUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -105,9 +104,14 @@ class SameSignatureCallParametersProvider extends CompletionProvider() { @Override public void handleInsert(InsertionContext context, LookupElement item) { + context.commitDocument(); int startOffset = context.getTailOffset(); - int endOffset = CharArrayUtil.shiftForwardUntil(context.getDocument().getImmutableCharSequence(), startOffset, ")"); - context.getDocument().deleteString(startOffset, endOffset); + PsiExpressionList exprList = + PsiTreeUtil.findElementOfClassAtOffset(context.getFile(), startOffset - 1, PsiExpressionList.class, false); + PsiElement rParen = exprList == null ? null : exprList.getLastChild(); + if (rParen != null && rParen.textMatches(")")) { + context.getDocument().deleteString(startOffset, rParen.getTextRange().getStartOffset()); + } if (makeFinalIfNeeded) { context.commitDocument(); for (PsiParameter parameter : CompletionUtil.getOriginalOrSelf(takeParametersFrom).getParameterList().getParameters()) { diff --git a/java/java-tests/testData/codeInsight/completion/smartType/SameSignatureWithoutClosingParen-out.java b/java/java-tests/testData/codeInsight/completion/smartType/SameSignatureWithoutClosingParen-out.java new file mode 100644 index 000000000000..668a0a16afa7 --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/smartType/SameSignatureWithoutClosingParen-out.java @@ -0,0 +1,8 @@ +class Dummy { + void caller(String someString, int number) { + toComplete(someString, number); + } + void toComplete(String someString, int number) { + + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/completion/smartType/SameSignatureWithoutClosingParen.java b/java/java-tests/testData/codeInsight/completion/smartType/SameSignatureWithoutClosingParen.java new file mode 100644 index 000000000000..6274b271236a --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/smartType/SameSignatureWithoutClosingParen.java @@ -0,0 +1,8 @@ +class Dummy { + void caller(String someString, int number) { + toComplete( + } + void toComplete(String someString, int number) { + + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/java/codeInsight/completion/SmartTypeCompletionTest.java b/java/java-tests/testSrc/com/intellij/java/codeInsight/completion/SmartTypeCompletionTest.java index 2cf7b9256522..a1bad259d229 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInsight/completion/SmartTypeCompletionTest.java +++ b/java/java-tests/testSrc/com/intellij/java/codeInsight/completion/SmartTypeCompletionTest.java @@ -797,6 +797,14 @@ public class SmartTypeCompletionTest extends LightFixtureCompletionTestCase { myFixture.assertPreferredCompletionItems(0, "i", "z", "zz", "i, z, zz"); } + public void testSameSignatureWithoutClosingParen() { + configureByTestName(); + myFixture.assertPreferredCompletionItems(0, "someString", "someString, number"); + getLookup().setCurrentItem(getLookup().getItems().get(1)); + select(); + checkResultByTestName(); + } + public void testSuggestTypeParametersInTypeArgumentList() { configureByTestName(); myFixture.assertPreferredCompletionItems(0, "T", "String");