[java] completion in modular projects (IDEA-193531)

Excludes type parameters from module accessibility checks, and makes JPMS implementation use target's original when looking for its module.
This commit is contained in:
Roman Shevchenko
2018-06-22 15:14:21 +03:00
parent 08f6504bb4
commit 0403941a1a
3 changed files with 12 additions and 4 deletions
@@ -30,10 +30,10 @@ class JavaPlatformModuleSystem : JavaModuleSystemEx {
override fun getName(): String = "Java Platform Module System"
override fun isAccessible(targetPackageName: String, targetFile: PsiFile?, place: PsiElement): Boolean =
checkAccess(targetPackageName, targetFile, place, quick = true) == null
checkAccess(targetPackageName, targetFile?.originalFile, place, quick = true) == null
override fun checkAccess(targetPackageName: String, targetFile: PsiFile?, place: PsiElement): ErrorWithFixes? =
checkAccess(targetPackageName, targetFile, place, quick = false)
checkAccess(targetPackageName, targetFile?.originalFile, place, quick = false)
private fun checkAccess(targetPackageName: String, targetFile: PsiFile?, place: PsiElement, quick: Boolean): ErrorWithFixes? {
val useFile = place.containingFile?.originalFile
@@ -114,7 +114,7 @@ public class PsiResolveHelperImpl implements PsiResolveHelper {
@Nullable PsiElement currentFileResolveScope) {
PsiClass containingClass = member.getContainingClass();
boolean accessible = JavaResolveUtil.isAccessible(member, containingClass, modifierList, place, accessObjectClass, currentFileResolveScope);
if (accessible && member instanceof PsiClass) {
if (accessible && member instanceof PsiClass && !(member instanceof PsiTypeParameter)) {
accessible = isAccessible(moduleSystem -> moduleSystem.isAccessible(((PsiClass)member), place));
}
return accessible;
@@ -1,4 +1,4 @@
// Copyright 2000-2017 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
package com.intellij.java.codeInsight.completion
import com.intellij.java.testFramework.fixtures.LightJava9ModulesCodeInsightFixtureTestCase
@@ -72,6 +72,14 @@ class ModuleCompletionTest : LightJava9ModulesCodeInsightFixtureTestCase() {
assertThat(myFixture.lookupElementStrings).containsExactly("*", "C2") // no 'C2Impl'
}
fun testTypeParameter() {
addFile("module-info.java", "module M { }")
addTestFile("whatever/test.txt", "-")
myFixture.configureByText("test.java", "package whatever;\nclass Foo<TParam> { TPar<caret> p; }")
myFixture.completeBasic()
myFixture.checkResult("package whatever;\nclass Foo<TParam> { TParam<caret> p; }")
}
//<editor-fold desc="Helpers.">
private fun complete(text: String, expected: String) {
myFixture.configureByText("module-info.java", text)