From f03580a0759310b53aabbc1f5c306a7efed0d313 Mon Sep 17 00:00:00 2001 From: peter Date: Mon, 12 Sep 2016 15:07:28 +0200 Subject: [PATCH] java completion: suggest inaccessible constructors of anonymous classes --- .../JavaConstructorCallElement.java | 20 ++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/JavaConstructorCallElement.java b/java/java-impl/src/com/intellij/codeInsight/completion/JavaConstructorCallElement.java index ea9b4f7178d8..4acc787e7b49 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaConstructorCallElement.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaConstructorCallElement.java @@ -26,7 +26,7 @@ import com.intellij.psi.impl.source.resolve.JavaResolveUtil; import com.intellij.psi.util.CachedValueProvider; import com.intellij.psi.util.CachedValuesManager; import com.intellij.psi.util.PsiTreeUtil; -import com.intellij.util.containers.JBIterable; +import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NotNull; import java.util.Collections; @@ -92,17 +92,23 @@ public class JavaConstructorCallElement extends JavaMethodCallElement { static List wrap(@NotNull LookupElement classItem, @NotNull PsiClass psiClass, @NotNull PsiElement position, @NotNull Supplier type) { if (Registry.is("java.completion.show.constructors") && isConstructorCallPlace(position)) { - PsiMethod[] constructors = psiClass.getConstructors(); - if (constructors.length > 0) { - return JBIterable.of(constructors). - filter(c -> JavaResolveUtil.isAccessible(c, psiClass, c.getModifierList(), position, null, null)). - map(c -> new JavaConstructorCallElement(classItem, c, type)). - toList(); + List constructors = ContainerUtil.filter(psiClass.getConstructors(), c -> shouldSuggestConstructor(psiClass, position, c)); + if (!constructors.isEmpty()) { + return ContainerUtil.map(constructors, c -> new JavaConstructorCallElement(classItem, c, type)); } } return Collections.singletonList(classItem); } + private static boolean shouldSuggestConstructor(@NotNull PsiClass psiClass, @NotNull PsiElement position, PsiMethod constructor) { + return JavaResolveUtil.isAccessible(constructor, psiClass, constructor.getModifierList(), position, null, null) || + willBeAccessibleInAnonymous(psiClass, constructor); + } + + private static boolean willBeAccessibleInAnonymous(@NotNull PsiClass psiClass, PsiMethod constructor) { + return !constructor.hasModifierProperty(PsiModifier.PRIVATE) && psiClass.hasModifierProperty(PsiModifier.ABSTRACT); + } + private static boolean isConstructorCallPlace(@NotNull PsiElement position) { return CachedValuesManager.getCachedValue(position, () -> { boolean result = JavaClassNameCompletionContributor.AFTER_NEW.accepts(position) &&