diff --git a/java/java-analysis-api/src/com/intellij/codeInsight/JavaModuleSystemEx.java b/java/java-analysis-api/src/com/intellij/codeInsight/JavaModuleSystemEx.java index 640530918a47..2c5658bcb7d1 100644 --- a/java/java-analysis-api/src/com/intellij/codeInsight/JavaModuleSystemEx.java +++ b/java/java-analysis-api/src/com/intellij/codeInsight/JavaModuleSystemEx.java @@ -16,19 +16,34 @@ package com.intellij.codeInsight; import com.intellij.codeInsight.intention.IntentionAction; -import com.intellij.openapi.util.Pair; import com.intellij.psi.JavaModuleSystem; import com.intellij.psi.PsiClass; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiPackage; import org.jetbrains.annotations.ApiStatus; +import org.jetbrains.annotations.Nls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.util.Collections; import java.util.List; @ApiStatus.Experimental public interface JavaModuleSystemEx extends JavaModuleSystem { - @Nullable Pair> checkAccess(@NotNull PsiPackage target, @NotNull PsiElement place); - @Nullable Pair> checkAccess(@NotNull PsiClass target, @NotNull PsiElement place); + final class ErrorWithFixes { + public final @NotNull @Nls String message; + public final @NotNull List fixes; + + public ErrorWithFixes(@NotNull @Nls String message) { + this(message, Collections.emptyList()); + } + + public ErrorWithFixes(@NotNull @Nls String message, @NotNull List fixes) { + this.message = message; + this.fixes = fixes; + } + } + + @Nullable ErrorWithFixes checkAccess(@NotNull PsiPackage target, @NotNull PsiElement place); + @Nullable ErrorWithFixes checkAccess(@NotNull PsiClass target, @NotNull PsiElement place); } \ No newline at end of file diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightUtil.java b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightUtil.java index 891cb27a5d2b..a414297157ff 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightUtil.java +++ b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightUtil.java @@ -18,6 +18,7 @@ package com.intellij.codeInsight.daemon.impl.analysis; import com.intellij.codeInsight.ContainerProvider; import com.intellij.codeInsight.ExceptionUtil; import com.intellij.codeInsight.JavaModuleSystemEx; +import com.intellij.codeInsight.JavaModuleSystemEx.ErrorWithFixes; import com.intellij.codeInsight.daemon.JavaErrorMessages; import com.intellij.codeInsight.daemon.impl.HighlightInfo; import com.intellij.codeInsight.daemon.impl.HighlightInfoType; @@ -1747,40 +1748,40 @@ public class HighlightUtil extends HighlightUtilBase { } else { String containerName = getContainerName(refElement, result.getSubstitutor()); - Pair> problem = checkModuleAccess(resolved, reference, symbolName, containerName); - if (problem != null) return problem; + ErrorWithFixes problem = checkModuleAccess(resolved, reference, symbolName, containerName); + if (problem != null) return pair(problem.message, problem.fixes); return pair(JavaErrorMessages.message("visibility.access.problem", symbolName, containerName), null); } } } - private static Pair> checkModuleAccess(PsiElement target, PsiElement place, String symbolName, String containerName) { + private static ErrorWithFixes checkModuleAccess(PsiElement target, PsiElement place, String symbolName, String containerName) { + ErrorWithFixes error = null; for (JavaModuleSystem moduleSystem : JavaModuleSystem.EP_NAME.getExtensions()) { - Pair> problem = null; if (moduleSystem instanceof JavaModuleSystemEx) { - problem = checkAccess((JavaModuleSystemEx)moduleSystem, target, place); + error = checkAccess((JavaModuleSystemEx)moduleSystem, target, place); } else if (!isAccessible(moduleSystem, target, place)) { String message = JavaErrorMessages.message("visibility.module.access.problem", symbolName, containerName, moduleSystem.getName()); - problem = pair(message, Collections.emptyList()); + error = new ErrorWithFixes(message); } - if (problem != null) { - return problem; + if (error != null) { + return error; } } return null; } - private static Pair> checkAccess(JavaModuleSystemEx system, PsiElement target, PsiElement place) { - if (target instanceof PsiPackage) return system.checkAccess(((PsiPackage)target), place); + private static ErrorWithFixes checkAccess(JavaModuleSystemEx system, PsiElement target, PsiElement place) { if (target instanceof PsiClass) return system.checkAccess(((PsiClass)target), place); + if (target instanceof PsiPackage) return system.checkAccess(((PsiPackage)target), place); return null; } private static boolean isAccessible(JavaModuleSystem system, PsiElement target, PsiElement place) { - if (target instanceof PsiPackage) return system.isAccessible(((PsiPackage)target), place); if (target instanceof PsiClass) return system.isAccessible(((PsiClass)target), place); + if (target instanceof PsiPackage) return system.isAccessible(((PsiPackage)target), place); return true; } 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 15398a22d8b1..ec51b31063a5 100644 --- a/java/java-impl/src/com/intellij/psi/impl/JavaPlatformModuleSystem.kt +++ b/java/java-impl/src/com/intellij/psi/impl/JavaPlatformModuleSystem.kt @@ -16,12 +16,11 @@ package com.intellij.psi.impl import com.intellij.codeInsight.JavaModuleSystemEx +import com.intellij.codeInsight.JavaModuleSystemEx.ErrorWithFixes import com.intellij.codeInsight.daemon.JavaErrorMessages import com.intellij.codeInsight.daemon.impl.analysis.JavaModuleGraphUtil import com.intellij.codeInsight.daemon.impl.quickfix.AddRequiredModuleFix -import com.intellij.codeInsight.intention.IntentionAction import com.intellij.openapi.roots.ProjectFileIndex -import com.intellij.openapi.util.Pair import com.intellij.openapi.vfs.jrt.JrtFileSystem import com.intellij.psi.* import com.intellij.psi.impl.light.LightJavaModule @@ -36,7 +35,7 @@ class JavaPlatformModuleSystem : JavaModuleSystemEx { override fun checkAccess(target: PsiPackage, place: PsiElement) = checkAccess(target, place, false) override fun checkAccess(target: PsiClass, place: PsiElement) = checkAccess(target, place, false) - private fun checkAccess(target: PsiClass, place: PsiElement, quick: Boolean): Pair>? { + private fun checkAccess(target: PsiClass, place: PsiElement, quick: Boolean): ErrorWithFixes? { val useFile = place.containingFile?.originalFile if (useFile != null && PsiUtil.isLanguageLevel9OrHigher(useFile)) { val targetFile = target.containingFile @@ -48,7 +47,7 @@ class JavaPlatformModuleSystem : JavaModuleSystemEx { return null } - private fun checkAccess(target: PsiPackage, place: PsiElement, quick: Boolean): Pair>? { + private fun checkAccess(target: PsiPackage, place: PsiElement, quick: Boolean): ErrorWithFixes? { val useFile = place.containingFile?.originalFile if (useFile != null && PsiUtil.isLanguageLevel9OrHigher(useFile)) { val useVFile = useFile.virtualFile @@ -68,12 +67,9 @@ class JavaPlatformModuleSystem : JavaModuleSystemEx { return null } - private val ERR = Pair("-", emptyList()) + private val ERR = ErrorWithFixes("-") - private fun checkAccess(target: PsiFileSystemItem, - place: PsiFileSystemItem, - packageName: String, - quick: Boolean): Pair>? { + private fun checkAccess(target: PsiFileSystemItem, place: PsiFileSystemItem, packageName: String, quick: Boolean): ErrorWithFixes? { val targetModule = JavaModuleGraphUtil.findDescriptorByElement(target) val useModule = JavaModuleGraphUtil.findDescriptorByElement(place) @@ -86,20 +82,20 @@ class JavaPlatformModuleSystem : JavaModuleSystemEx { } if (!(targetModule is LightJavaModule || JavaModuleGraphUtil.exports(targetModule, packageName, useModule))) { return if (quick) ERR - else if (useModule == null) Pair(JavaErrorMessages.message("module.access.from.unnamed", packageName, targetModule.name), emptyList()) - else Pair(JavaErrorMessages.message("module.access.from.named", packageName, targetModule.name, useModule.name), emptyList()) + else if (useModule == null) ErrorWithFixes(JavaErrorMessages.message("module.access.from.unnamed", packageName, targetModule.name)) + else ErrorWithFixes(JavaErrorMessages.message("module.access.from.named", packageName, targetModule.name, useModule.name)) } if (useModule == null) { return null } if (!(useModule.name == PsiJavaModule.JAVA_BASE || JavaModuleGraphUtil.reads(useModule, targetModule))) { - return if (quick) ERR else Pair( + return if (quick) ERR else ErrorWithFixes( JavaErrorMessages.message("module.access.does.not.read", packageName, targetModule.name, useModule.name), listOf(AddRequiredModuleFix(useModule, targetModule.name))) } } else if (useModule != null) { - return if (quick) ERR else Pair(JavaErrorMessages.message("module.access.to.unnamed", packageName, useModule.name), emptyList()) + return if (quick) ERR else ErrorWithFixes(JavaErrorMessages.message("module.access.to.unnamed", packageName, useModule.name)) } return null