mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
IDEA-198897 Parameter hints: Smart argument completion should insert comma if selected signature has more arguments
This commit is contained in:
@@ -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,
|
||||
|
||||
+16
-1
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
+10
-2
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user