IDEA-189603 Multi-parameter completion overwrites code if there is no closing parenthesis

This commit is contained in:
peter
2018-04-11 08:52:22 +02:00
parent f9a1746f33
commit 02b032eca2
4 changed files with 31 additions and 3 deletions
@@ -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<CompletionP
element = element.withInsertHandler(new InsertHandler<LookupElement>() {
@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()) {
@@ -0,0 +1,8 @@
class Dummy {
void caller(String someString, int number) {
toComplete(someString, number);<caret>
}
void toComplete(String someString, int number) {
}
}
@@ -0,0 +1,8 @@
class Dummy {
void caller(String someString, int number) {
toComplete(<caret>
}
void toComplete(String someString, int number) {
}
}
@@ -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");