From 0403941a1acceac58fd0cd36c183c2cb4b4ab844 Mon Sep 17 00:00:00 2001 From: Roman Shevchenko Date: Fri, 22 Jun 2018 15:13:14 +0300 Subject: [PATCH] [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. --- .../com/intellij/psi/impl/JavaPlatformModuleSystem.kt | 4 ++-- .../psi/impl/source/resolve/PsiResolveHelperImpl.java | 2 +- .../codeInsight/completion/ModuleCompletionTest.kt | 10 +++++++++- 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/java/java-impl/src/com/intellij/psi/impl/JavaPlatformModuleSystem.kt b/java/java-impl/src/com/intellij/psi/impl/JavaPlatformModuleSystem.kt index 44901194e15c..6dd7bf9b8e4c 100644 --- a/java/java-impl/src/com/intellij/psi/impl/JavaPlatformModuleSystem.kt +++ b/java/java-impl/src/com/intellij/psi/impl/JavaPlatformModuleSystem.kt @@ -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 diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/PsiResolveHelperImpl.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/PsiResolveHelperImpl.java index bf662936abd1..a41ccca07a08 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/PsiResolveHelperImpl.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/PsiResolveHelperImpl.java @@ -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; 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 8f721beb9b37..4b88ce5a0211 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 @@ -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 { TPar p; }") + myFixture.completeBasic() + myFixture.checkResult("package whatever;\nclass Foo { TParam p; }") + } + // private fun complete(text: String, expected: String) { myFixture.configureByText("module-info.java", text)