From 64d65111e70dc296aef0725f3191577e2daa1c9e Mon Sep 17 00:00:00 2001 From: peter Date: Mon, 3 Jul 2017 19:03:34 +0200 Subject: [PATCH] IDEA-168879 IDEA should not suggest not exported packages from JDK9 --- .../scope/JavaCompletionProcessor.java | 23 +++++++++++++++---- .../completion/ModuleCompletionTest.kt | 10 ++++++++ 2 files changed, 28 insertions(+), 5 deletions(-) diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/scope/JavaCompletionProcessor.java b/java/java-impl/src/com/intellij/codeInsight/completion/scope/JavaCompletionProcessor.java index 3b0569bb65d0..d285e41162c4 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/scope/JavaCompletionProcessor.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/scope/JavaCompletionProcessor.java @@ -246,17 +246,30 @@ public class JavaCompletionProcessor extends BaseScopeProcessor implements Eleme // if checkAccess is false, we only show inaccessible source elements because their access modifiers can be changed later by the user. // compiled element can't be changed so we don't pollute the completion with them. In Javadoc, everything is allowed. if (!myOptions.checkAccess && myInJavaDoc) return true; - if (!(element instanceof PsiMember)) return true; - PsiMember member = (PsiMember)element; - PsiClass accessObjectClass = myQualified ? myQualifierClass : null; - if (JavaPsiFacade.getInstance(element.getProject()).getResolveHelper().isAccessible(member, member.getModifierList(), myElement, - accessObjectClass, myDeclarationHolder)) { + if (isAccessibleForResolve(element)) { return true; } return !myOptions.checkAccess && !(element instanceof PsiCompiledElement); } + private boolean isAccessibleForResolve(@Nullable PsiElement element) { + if (element instanceof PsiMember) { + PsiClass accessObjectClass = myQualified ? myQualifierClass : null; + PsiMember member = (PsiMember)element; + return getResolveHelper().isAccessible(member, member.getModifierList(), myElement, accessObjectClass, myDeclarationHolder); + } + if (element instanceof PsiPackage) { + return getResolveHelper().isAccessible((PsiPackage)element, myElement); + } + return true; + } + + @NotNull + private PsiResolveHelper getResolveHelper() { + return JavaPsiFacade.getInstance(myElement.getProject()).getResolveHelper(); + } + public void setCompletionElements(@NotNull Object[] elements) { for (Object element: elements) { CompletionElement completion = new CompletionElement(element, PsiSubstitutor.EMPTY); diff --git a/java/java-tests/testSrc/com/intellij/java/codeInsight/completion/ModuleCompletionTest.kt b/java/java-tests/testSrc/com/intellij/java/codeInsight/completion/ModuleCompletionTest.kt index 703fa488c3f3..3d80ab9073bc 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInsight/completion/ModuleCompletionTest.kt +++ b/java/java-tests/testSrc/com/intellij/java/codeInsight/completion/ModuleCompletionTest.kt @@ -59,6 +59,16 @@ class ModuleCompletionTest : LightJava9ModulesCodeInsightFixtureTestCase() { complete("module M { provides pkg.main.MySvc with MSI }", "module M { provides pkg.main.MySvc with pkg.main.MySvcImpl; }") } + fun testImports() { + addFile("module-info.java", "module M { requires M2; }") + addFile("module-info.java", "module M2 { exports pkg.m2; }", M2) + addFile("pkg/m2/C2.java", "package pkg.m2;\npublic class C2 { }", M2) + addFile("pkg/m2/impl/C2Impl.java", "package pkg.m2.impl;\npublic class C2Impl { }", M2) + myFixture.configureByText("test.java", "import pkg.m2.") + myFixture.completeBasic() + assertOrderedEquals(myFixture.lookupElementStrings!!, "*", "C2") // no 'impl' + } + // private fun complete(text: String, expected: String) { myFixture.configureByText("module-info.java", text)