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 af9a1ea5aaf2..e5b89ed7b9dc 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 @@ -1576,9 +1576,10 @@ public class HighlightUtil extends HighlightUtilBase { return accessProblemDescriptionAndFixes(ref, resolved, result).first; } - private static Pair> accessProblemDescriptionAndFixes(PsiElement ref, - PsiElement resolved, - JavaResolveResult result) { + @NotNull + static Pair> accessProblemDescriptionAndFixes(@NotNull PsiElement ref, + @NotNull PsiElement resolved, + @NotNull JavaResolveResult result) { assert resolved instanceof PsiModifierListOwner : resolved; PsiModifierListOwner refElement = (PsiModifierListOwner)resolved; String symbolName = HighlightMessageUtil.getSymbolName(refElement, result.getSubstitutor()); diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightVisitorImpl.java b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightVisitorImpl.java index 39df07d82849..1f09ff28b412 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightVisitorImpl.java +++ b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightVisitorImpl.java @@ -9,6 +9,7 @@ import com.intellij.codeInsight.daemon.impl.*; import com.intellij.codeInsight.daemon.impl.analysis.HighlightUtil.Feature; import com.intellij.codeInsight.daemon.impl.quickfix.AdjustFunctionContextFix; import com.intellij.codeInsight.daemon.impl.quickfix.QuickFixAction; +import com.intellij.codeInsight.intention.IntentionAction; import com.intellij.codeInsight.intention.QuickFixFactory; import com.intellij.lang.injection.InjectedLanguageManager; import com.intellij.openapi.application.ApplicationManager; @@ -1467,8 +1468,13 @@ public class HighlightVisitorImpl extends JavaElementVisitor implements Highligh PsiClass psiClass = resolveResult.getElement(); if (psiClass != null) { if (!PsiUtil.isAccessible(myFile.getProject(), psiClass, expression, null)) { - String text = HighlightUtil.accessProblemDescription(expression, psiClass, resolveResult); - myHolder.add(HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR).range(expression).descriptionAndTooltip(text).create()); + Pair> problem = HighlightUtil.accessProblemDescriptionAndFixes(expression, psiClass, resolveResult); + HighlightInfo info = + HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR).range(expression).descriptionAndTooltip(problem.first).create(); + myHolder.add(info); + if (problem.second != null) { + problem.second.forEach(fix -> QuickFixAction.registerQuickFixAction(info, fix)); + } } else { for (PsiType type : resolveResult.getSubstitutor().getSubstitutionMap().values()) { diff --git a/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/ModuleHighlightingTest.kt b/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/ModuleHighlightingTest.kt index ef86601a0362..93815772a102 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/ModuleHighlightingTest.kt +++ b/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/ModuleHighlightingTest.kt @@ -201,6 +201,10 @@ class ModuleHighlightingTest : LightJava9ModulesCodeInsightFixtureTestCase() { addFile("module-info.java", "module M2 { exports pkg.m2; }", M2) addFile("pkg/m2/C2.java", "package pkg.m2;\npublic class C2 { }", M2) addFile("pkg/m3/C3.java", "package pkg.m3;\npublic class C3 { }", M3) + addFile("module-info.java", "module M6 { exports pkg.m6; }", M6) + addFile("pkg/m6/C6.java", "package pkg.m6;\nimport pkg.m8.*;\nimport java.util.function.*;\npublic class C6 { public void m(Consumer c) { } }", M6) + addFile("module-info.java", "module M8 { exports pkg.m8; }", M8) + addFile("pkg/m8/C8.java", "package pkg.m8;\npublic class C8 { }", M8) fixes("module M { requires M.missing; }") fixes("module M { requires M3; }", arrayOf("AddModuleDependencyFix")) @@ -212,6 +216,11 @@ class ModuleHighlightingTest : LightJava9ModulesCodeInsightFixtureTestCase() { fixes("module M { uses pkg.m3.C3; }", arrayOf("AddModuleDependencyFix")) fixes("pkg/main/C.java", "package pkg.main;\nimport pkg.m2.C2;", arrayOf("AddRequiredModuleFix")) + + addFile("module-info.java", "module M { requires M6; }") + addFile("pkg/main/Util.java", "package pkg.main;\nclass Util {\n static void sink(T t) { }\n}") + fixes("pkg/main/C.java", "package pkg.main;\nimport pkg.m6.*;class C {{ new C6().m(Util::sink); }}", arrayOf("AddRequiredModuleFix")) + fixes("pkg/main/C.java", "package pkg.main;\nimport pkg.m6.*;class C {{ new C6().m(t -> Util.sink(t)); }}", arrayOf("AddRequiredModuleFix")) } fun testPackageAccessibility() = doTestPackageAccessibility(moduleFileInTests = false, checkFileInTests = false)