mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
[java-completion] IDEA-63639 Completion after new offers in list classes with private constructors
GitOrigin-RevId: 141336a239f027b0eb5cc9f2f783f1415eeb5f76
This commit is contained in:
committed by
intellij-monorepo-bot
parent
7892f49681
commit
a64960d971
@@ -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();
|
||||
|
||||
+11
@@ -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 {
|
||||
|
||||
+1
-1
@@ -7,7 +7,7 @@ public class TestClass {
|
||||
}
|
||||
|
||||
class Xxx {
|
||||
private Xxx(String x) {
|
||||
Xxx(String x) {
|
||||
}
|
||||
|
||||
static class Yyy {
|
||||
|
||||
+8
@@ -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']
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user