[java-completion] IDEA-340250 Use JavaQualifierAsArgumentContributor in case when class and first argument are similar

GitOrigin-RevId: ea318a11f10252b5cbef9a931dc8f5941d99f948
This commit is contained in:
Mikhail Pyltsin
2023-12-11 18:37:51 +01:00
committed by intellij-monorepo-bot
parent b1353c57a6
commit cdffacc3bd
3 changed files with 106 additions and 7 deletions

View File

@@ -23,11 +23,13 @@ import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.keymap.KeymapUtil;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.module.ModuleUtilCore;
import com.intellij.openapi.options.advanced.AdvancedSettings;
import com.intellij.openapi.project.DumbAware;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.roots.ModuleRootManager;
import com.intellij.openapi.util.Condition;
import com.intellij.openapi.util.NlsContexts;
import com.intellij.openapi.util.Ref;
import com.intellij.openapi.util.TextRange;
import com.intellij.openapi.util.registry.Registry;
import com.intellij.openapi.util.text.StringUtil;
@@ -75,6 +77,7 @@ import org.jetbrains.annotations.*;
import java.util.*;
import static com.intellij.codeInsight.completion.JavaQualifierAsArgumentContributor.JavaQualifierAsArgumentStaticMembersProcessor;
import static com.intellij.patterns.PsiJavaPatterns.*;
import static com.intellij.psi.CommonClassNames.JAVA_LANG_COMPARABLE;
import static com.intellij.psi.CommonClassNames.JAVA_LANG_OBJECT;
@@ -852,9 +855,31 @@ public final class JavaCompletionContributor extends CompletionContributor imple
ContainerUtil.addIfNotNull(items, ArrayMemberAccess.accessFirstElement(position, element));
}
if (parameters.getInvocationCount() > 0) {
items.addAll(getInnerScopeVariables(parameters, position));
}
if (ref.getQualifier() instanceof PsiExpression qualifierExpression &&
parameters.getInvocationCount() <= 2 &&
AdvancedSettings.getBoolean("java.completion.qualifier.as.argument")) {
JavaQualifierAsArgumentStaticMembersProcessor processor =
new JavaQualifierAsArgumentStaticMembersProcessor(parameters, qualifierExpression);
items = ContainerUtil.map(items, lookupItem -> {
JavaMethodCallElement javaMethodCallElement = lookupItem.as(JavaMethodCallElement.class);
if (javaMethodCallElement != null) {
PsiMethod psiMethod = javaMethodCallElement.getObject();
Ref<LookupElement> staticref = new Ref<>();
processor.processStaticMember(staticItem -> staticref.set(staticItem), psiMethod, new HashSet<>());
if (!staticref.isNull()) {
return staticref.get();
}
}
return lookupItem;
});
}
return items;
}
@@ -1019,7 +1044,7 @@ public final class JavaCompletionContributor extends CompletionContributor imple
PsiAnnotationMemberValue defaultValue = ((PsiAnnotationMethod)method).getDefaultValue();
String defText = defaultValue == null ? null : defaultValue.getText();
if (PsiKeyword.TRUE.equals(defText) || PsiKeyword.FALSE.equals(defText)) {
result.addElement(createAnnotationAttributeElement(method,
result.addElement(createAnnotationAttributeElement(method,
PsiKeyword.TRUE.equals(defText) ? PsiKeyword.FALSE : PsiKeyword.TRUE,
position));
result.addElement(PrioritizedLookupElement.withPriority(createAnnotationAttributeElement(method, defText, position)

View File

@@ -25,6 +25,7 @@ import com.intellij.psi.util.*;
import com.intellij.util.Processor;
import com.intellij.util.containers.ContainerUtil;
import com.intellij.util.containers.MultiMap;
import com.siyeh.ig.callMatcher.CallMatcher;
import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -69,13 +70,14 @@ public class JavaQualifierAsArgumentContributor extends CompletionContributor im
PrefixMatcher matcher = result.getPrefixMatcher();
Project project = parameters.getEditor().getProject();
if (project == null) return;
MyStaticMembersProcessor processor = new MyStaticMembersProcessor(parameters, qualifierExpression);
JavaQualifierAsArgumentStaticMembersProcessor
processor = new JavaQualifierAsArgumentStaticMembersProcessor(parameters, qualifierExpression);
process(parameters, matcher, processor, result);
}
private static void process(@NotNull CompletionParameters parameters,
@NotNull PrefixMatcher matcher,
@NotNull MyStaticMembersProcessor processor,
@NotNull JavaQualifierAsArgumentContributor.JavaQualifierAsArgumentStaticMembersProcessor processor,
@NotNull CompletionResultSet result) {
PsiElement position = parameters.getPosition();
@@ -183,7 +185,7 @@ public class JavaQualifierAsArgumentContributor extends CompletionContributor im
}
private static final class MyStaticMembersProcessor extends JavaStaticMemberProcessor {
static final class JavaQualifierAsArgumentStaticMembersProcessor extends JavaStaticMemberProcessor {
@NotNull
private final PsiExpression myOldQualifiedExpression;
@@ -194,9 +196,15 @@ public class JavaQualifierAsArgumentContributor extends CompletionContributor im
@NotNull
private final NotNullLazyValue<Collection<PsiType>> myExpectedTypes;
@NotNull
private static final CallMatcher MY_SKIP_METHODS =
CallMatcher.anyOf(
CallMatcher.staticCall(CommonClassNames.JAVA_LANG_STRING, "format")
);
private MyStaticMembersProcessor(@NotNull CompletionParameters parameters,
@NotNull PsiExpression oldQualifiedExpression) {
JavaQualifierAsArgumentStaticMembersProcessor(@NotNull CompletionParameters parameters,
@NotNull PsiExpression oldQualifiedExpression) {
super(parameters);
this.myOldQualifiedExpression = oldQualifiedExpression;
this.myOriginalPosition = parameters.getOriginalPosition();
@@ -212,7 +220,7 @@ public class JavaQualifierAsArgumentContributor extends CompletionContributor im
@Override
protected boolean additionalFilter(PsiMember member) {
return (member instanceof PsiMethod method && filter(method));
return (member instanceof PsiMethod method && filter(method) && !MY_SKIP_METHODS.methodMatches(method));
}
@Override