[java] quickfix for module accessibility issues in functional expressions (IDEA-179293)

This commit is contained in:
Roman Shevchenko
2017-09-28 10:22:56 +02:00
parent eefafcc464
commit 0f373e6142
3 changed files with 21 additions and 5 deletions
@@ -1576,9 +1576,10 @@ public class HighlightUtil extends HighlightUtilBase {
return accessProblemDescriptionAndFixes(ref, resolved, result).first;
}
private static Pair<String, List<IntentionAction>> accessProblemDescriptionAndFixes(PsiElement ref,
PsiElement resolved,
JavaResolveResult result) {
@NotNull
static Pair<String, List<IntentionAction>> 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());
@@ -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<String, List<IntentionAction>> 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()) {
@@ -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<C8> 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 <caret>M.missing; }")
fixes("module M { requires <caret>M3; }", arrayOf("AddModuleDependencyFix"))
@@ -212,6 +216,11 @@ class ModuleHighlightingTest : LightJava9ModulesCodeInsightFixtureTestCase() {
fixes("module M { uses <caret>pkg.m3.C3; }", arrayOf("AddModuleDependencyFix"))
fixes("pkg/main/C.java", "package pkg.main;\nimport <caret>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 <T> void sink(T t) { }\n}")
fixes("pkg/main/C.java", "package pkg.main;\nimport pkg.m6.*;class C {{ new C6().m(<caret>Util::sink); }}", arrayOf("AddRequiredModuleFix"))
fixes("pkg/main/C.java", "package pkg.main;\nimport pkg.m6.*;class C {{ new C6().m(<caret>t -> Util.sink(t)); }}", arrayOf("AddRequiredModuleFix"))
}
fun testPackageAccessibility() = doTestPackageAccessibility(moduleFileInTests = false, checkFileInTests = false)