[java-completion] IDEA-63639 Completion after new offers in list classes with private constructors

GitOrigin-RevId: 141336a239f027b0eb5cc9f2f783f1415eeb5f76
This commit is contained in:
Tagir Valeev
2020-11-19 05:49:13 +00:00
committed by intellij-monorepo-bot
parent 7892f49681
commit a64960d971
6 changed files with 40 additions and 3 deletions
@@ -595,6 +595,19 @@ public class JavaCompletionContributor extends CompletionContributor implements
PsiElement position = parameters.getPosition();
ElementFilter filter = getReferenceFilter(position);
if (filter == null) return Collections.emptyList();
if (parameters.getInvocationCount() <= 1 && JavaClassNameCompletionContributor.AFTER_NEW.accepts(position)) {
filter = new AndFilter(filter, new ElementFilter() {
@Override
public boolean isAcceptable(Object element, @Nullable PsiElement context) {
return !JavaPsiClassReferenceElement.isInaccessibleConstructorSuggestion(position, tryCast(element, PsiClass.class));
}
@Override
public boolean isClassAcceptable(Class hintClass) {
return true;
}
});
}
boolean smart = parameters.getCompletionType() == CompletionType.SMART;
if (smart) {
@@ -210,11 +210,16 @@ public class JavaNoVariantsDelegator extends CompletionContributor implements Du
return;
}
JavaPsiClassReferenceElement classElement = element.as(JavaPsiClassReferenceElement.CLASS_CONDITION_KEY);
PsiElement position = parameters.getPosition();
if (classElement != null && parameters.getInvocationCount() < 2) {
if (JavaClassNameCompletionContributor.AFTER_NEW.accepts(position) &&
JavaPsiClassReferenceElement.isInaccessibleConstructorSuggestion(position, classElement.getObject())) {
return;
}
classElement.setAutoCompletionPolicy(AutoCompletionPolicy.NEVER_AUTOCOMPLETE);
}
element = JavaCompletionUtil.highlightIfNeeded(null, element, element.getObject(), parameters.getPosition());
element = JavaCompletionUtil.highlightIfNeeded(null, element, element.getObject(), position);
if (!sameNamedBatch.isEmpty() && !element.getLookupString().equals(sameNamedBatch.get(0).getLookupString())) {
result.addAllElements(sameNamedBatch);
sameNamedBatch.clear();
@@ -24,8 +24,10 @@ import com.intellij.openapi.util.ClassConditionKey;
import com.intellij.openapi.util.Comparing;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.psi.*;
import com.intellij.psi.impl.source.resolve.JavaResolveUtil;
import com.intellij.psi.util.PsiFormatUtil;
import com.intellij.psi.util.PsiUtilCore;
import com.intellij.util.containers.ContainerUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -221,4 +223,13 @@ public class JavaPsiClassReferenceElement extends LookupItem<Object> implements
return CodeStyle.getLanguageSettings(element.getContainingFile(), JavaLanguage.INSTANCE).SPACE_AFTER_COMMA;
}
static boolean isInaccessibleConstructorSuggestion(@NotNull PsiElement position, @Nullable PsiClass cls) {
if (cls == null || cls.hasModifierProperty(PsiModifier.ABSTRACT)) return false;
PsiMethod[] constructors = cls.getConstructors();
if (constructors.length > 0) {
return !ContainerUtil.exists(constructors, ctor ->
JavaResolveUtil.isAccessible(ctor, cls, ctor.getModifierList(), position, null, null));
}
return false;
}
}
@@ -7,7 +7,7 @@ public class TestClass {
}
class Xxx {
private Xxx(String x) {
Xxx(String x) {
}
static class Yyy {
@@ -7,7 +7,7 @@ public class TestClass {
}
class Xxx {
private Xxx(String x) {
Xxx(String x) {
}
static class Yyy {
@@ -22,6 +22,7 @@ import com.intellij.psi.codeStyle.JavaCodeStyleSettings
import com.intellij.testFramework.LightProjectDescriptor
import com.intellij.testFramework.NeedsIndex
import com.intellij.testFramework.PlatformTestUtil
import com.intellij.util.containers.ContainerUtil
import com.intellij.util.ui.UIUtil
import com.siyeh.ig.style.UnqualifiedFieldAccessInspection
import groovy.transform.CompileStatic
@@ -2298,4 +2299,11 @@ class Abc {
assert myFixture.getLookupElementStrings().stream().filter({ it.contains("sss") }).collect(Collectors.toList()) ==
["A.sss", "sss"]
}
@NeedsIndex.ForStandardLibrary
void "test private constructor"() {
myFixture.configureByText("A.java", "class A {{new Syst<caret>}}")
myFixture.completeBasic()
assert ContainerUtil.filter(myFixture.getLookupElementStrings(), {it.startsWith("S")}) == ['System.Logger', 'System.LoggerFinder']
}
}