diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionUtil.java b/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionUtil.java index ef341897bf42..065ebb41c577 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionUtil.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionUtil.java @@ -557,18 +557,21 @@ public class JavaCompletionUtil { return Collections.singletonList(LookupItemUtil.objectToLookupItem(completion)); } - public static boolean hasAccessibleConstructor(PsiType type) { + public static boolean hasAccessibleConstructor(@NotNull PsiType type, @NotNull PsiElement place) { if (type instanceof PsiArrayType) return true; final PsiClass psiClass = PsiUtil.resolveClassInType(type); if (psiClass == null || psiClass.isEnum() || psiClass.isAnnotationType()) return false; PsiMethod[] methods = psiClass.getConstructors(); - return methods.length == 0 || Arrays.stream(methods).anyMatch(JavaCompletionUtil::isConstructorCompletable); + return methods.length == 0 || Arrays.stream(methods).anyMatch(constructor -> isConstructorCompletable(constructor, place)); } - private static boolean isConstructorCompletable(@NotNull PsiMethod constructor) { - return !(constructor instanceof PsiCompiledElement) || !constructor.hasModifierProperty(PsiModifier.PRIVATE); + private static boolean isConstructorCompletable(@NotNull PsiMethod constructor, @NotNull PsiElement place) { + if (!(constructor instanceof PsiCompiledElement)) return true; // it's possible to use a quick fix to make accessible after completion + if (constructor.hasModifierProperty(PsiModifier.PRIVATE)) return false; + if (constructor.hasModifierProperty(PsiModifier.PACKAGE_LOCAL)) return PsiUtil.isAccessible(constructor, place, null); + return true; } public static LinkedHashSet getAllLookupStrings(@NotNull PsiMember member) { diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/JavaInheritorsGetter.java b/java/java-impl/src/com/intellij/codeInsight/completion/JavaInheritorsGetter.java index 4648d5158c1b..825d93a89471 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaInheritorsGetter.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaInheritorsGetter.java @@ -134,7 +134,7 @@ public class JavaInheritorsGetter extends CompletionProvider + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/completion/smartType/FilterPrivateConstructors-out.java b/java/java-tests/testData/codeInsight/completion/smartType/FilterPrivateConstructors-out.java deleted file mode 100644 index 31d2d7b6fc2f..000000000000 --- a/java/java-tests/testData/codeInsight/completion/smartType/FilterPrivateConstructors-out.java +++ /dev/null @@ -1,5 +0,0 @@ -class Foo { - { - Class c = new - } -} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/java/codeInsight/completion/SmartType18CompletionTest.java b/java/java-tests/testSrc/com/intellij/java/codeInsight/completion/SmartType18CompletionTest.java index 113100f016f3..61e11bb139ad 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInsight/completion/SmartType18CompletionTest.java +++ b/java/java-tests/testSrc/com/intellij/java/codeInsight/completion/SmartType18CompletionTest.java @@ -292,4 +292,6 @@ public void testConvertToObjectStream() { configureByTestName(); myFixture.assertPreferredCompletionItems(0, "String.class"); } + + public void testFilterInaccessibleConstructors() { doAntiTest(); } } diff --git a/java/java-tests/testSrc/com/intellij/java/codeInsight/completion/SmartTypeCompletionTest.java b/java/java-tests/testSrc/com/intellij/java/codeInsight/completion/SmartTypeCompletionTest.java index 5138411913ad..cdab1db967d4 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInsight/completion/SmartTypeCompletionTest.java +++ b/java/java-tests/testSrc/com/intellij/java/codeInsight/completion/SmartTypeCompletionTest.java @@ -1044,7 +1044,7 @@ public class SmartTypeCompletionTest extends LightFixtureCompletionTestCase { public void testNewAbstractInsideAnonymous() { doTest(); } - public void testFilterPrivateConstructors() { doTest(); } + public void testFilterPrivateConstructors() { doAntiTest(); } public void testExplicitMethodTypeParametersQualify() { doTest(); } public void testExplicitMethodTypeParametersOverZealous() { doTest(); } diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GroovySmartCompletionContributor.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GroovySmartCompletionContributor.java index 93d4ec9aa877..34a51e0437fa 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GroovySmartCompletionContributor.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GroovySmartCompletionContributor.java @@ -338,7 +338,7 @@ public class GroovySmartCompletionContributor extends CompletionContributor { @Nullable private static LookupElement addExpectedType(PsiType type, final PsiElement place, CompletionParameters parameters, @Nullable PsiType diamond) { - if (!JavaCompletionUtil.hasAccessibleConstructor(type)) return null; + if (!JavaCompletionUtil.hasAccessibleConstructor(type, place)) return null; final PsiClass psiClass = com.intellij.psi.util.PsiUtil.resolveClassInType(type); if (psiClass == null) return null;