IDEA-198897 Parameter hints: Smart argument completion should insert comma if selected signature has more arguments

This commit is contained in:
Dmitry Batrak
2018-10-08 11:57:24 +03:00
parent 1840a1e280
commit 8b23bed2b1
3 changed files with 48 additions and 3 deletions
@@ -15,6 +15,8 @@
*/
package com.intellij.codeInsight;
import com.intellij.codeInsight.completion.CompletionMemory;
import com.intellij.codeInsight.completion.CompletionUtil;
import com.intellij.codeInsight.daemon.impl.analysis.LambdaHighlightingUtil;
import com.intellij.openapi.components.ServiceManager;
import com.intellij.openapi.diagnostic.Logger;
@@ -955,6 +957,10 @@ public class ExpectedTypesProvider {
return ExpectedTypeInfo.EMPTY_ARRAY;
}
if (CodeInsightSettings.getInstance().SHOW_PARAMETER_NAME_HINTS_ON_COMPLETION) {
allCandidates = selectCandidateChosenOnCompletion(argumentList.getParent(), allCandidates);
}
PsiMethod toExclude = JavaPsiConstructorUtil.isConstructorCall(argumentList.getParent())
? PsiTreeUtil.getParentOfType(argument, PsiMethod.class) : null;
@@ -1039,6 +1045,22 @@ public class ExpectedTypesProvider {
return array.toArray(ExpectedTypeInfo.EMPTY_ARRAY);
}
@NotNull
private static CandidateInfo[] selectCandidateChosenOnCompletion(@Nullable PsiElement call, @NotNull CandidateInfo[] candidates) {
if (call instanceof PsiCall) {
PsiCall originalCall = CompletionUtil.getOriginalElement((PsiCall)call);
if (originalCall != null) {
PsiMethod method = CompletionMemory.getChosenMethod(originalCall);
if (method != null) {
for (CandidateInfo candidate : candidates) {
if (CompletionUtil.getOriginalOrSelf(candidate.getElement()) == method) return new CandidateInfo[]{candidate};
}
}
}
}
return candidates;
}
@NotNull
private static TailType getMethodArgumentTailType(@NotNull final PsiExpression argument,
final int index,
@@ -3,6 +3,7 @@ package com.intellij.java.codeInsight;
import com.intellij.codeInsight.AutoPopupController;
import com.intellij.codeInsight.CodeInsightSettings;
import com.intellij.codeInsight.completion.CompletionType;
import com.intellij.codeInsight.completion.LightFixtureCompletionTestCase;
import com.intellij.codeInsight.daemon.impl.ParameterHintsPresentationManager;
import com.intellij.codeInsight.hint.ParameterInfoController;
@@ -14,6 +15,7 @@ import com.intellij.openapi.editor.Editor;
import com.intellij.testFramework.fixtures.EditorHintFixture;
import com.intellij.util.ui.UIUtil;
import java.util.NoSuchElementException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
import java.util.concurrent.locks.LockSupport;
@@ -60,11 +62,24 @@ public abstract class AbstractParameterInfoTestCase extends LightFixtureCompleti
public void complete(String partOfItemText) {
LookupElement[] elements = myFixture.completeBasic();
selectItem(elements, partOfItemText);
}
public void completeSmart() {
myFixture.complete(CompletionType.SMART);
}
public void completeSmart(String partOfItemText) {
LookupElement[] lookupElements = myFixture.complete(CompletionType.SMART);
selectItem(lookupElements, partOfItemText);
}
private void selectItem(LookupElement[] elements, String partOfItemText) {
LookupElement element = Stream.of(elements).filter(e -> {
LookupElementPresentation p = new LookupElementPresentation();
e.renderElement(p);
return (p.getItemText() + p.getTailText()).contains(partOfItemText);
}).findAny().get();
}).findAny().orElseThrow(NoSuchElementException::new);
selectItem(element);
}
@@ -2,7 +2,6 @@
package com.intellij.java.codeInsight.completion;
import com.intellij.codeInsight.CodeInsightSettings;
import com.intellij.codeInsight.completion.CompletionType;
import com.intellij.codeInsight.completion.StaticallyImportable;
import com.intellij.codeInsight.hints.JavaInlayParameterHintsProvider;
import com.intellij.codeInsight.hints.Option;
@@ -280,7 +279,7 @@ public class CompletionHintsTest extends AbstractParameterInfoTestCase {
configureJava("class C { void m() { System.setPro<caret> } }");
complete("setProperty");
type("new String().trim");
myFixture.complete(CompletionType.SMART);
completeSmart();
waitForAllAsyncStuff();
checkResultWithInlays("class C { void m() { System.setProperty(<Hint text=\"key:\"/>new String().trim(), <HINT text=\"value:\"/><caret>) } }");
}
@@ -1653,6 +1652,15 @@ public class CompletionHintsTest extends AbstractParameterInfoTestCase {
checkResultWithInlays("class C { void some(int a) {} void some(int a, int b) {} void m() { some(<Hint text=\"a:\"/>1, <HINT text=\"b:\"/><caret>); } }");
}
public void testCommaAfterSmartCompletionOfOverloadedMethodParameter() {
configureJava("class C { int codePoint = 123; void m() { Character.to<caret> } }");
complete("toChars(int codePoint, char[] dst, int dstIndex)");
type("codePoin");
completeSmart("codePoint");
waitForAllAsyncStuff();
checkResultWithInlays("class C { int codePoint = 123; void m() { Character.toChars(<Hint text=\"codePoint:\"/>codePoint, <HINT text=\"dst:\"/><caret><Hint text=\",dstIndex:\"/>) } }");
}
private void checkResultWithInlays(String text) {
myFixture.checkResultWithInlays(text);
}