From 5269cb606d62c64a2c32d61ebf2b80a7e82be3cf Mon Sep 17 00:00:00 2001 From: "Anna.Kozlova" Date: Thu, 3 May 2018 19:31:04 +0200 Subject: [PATCH] unnecessarily qualified inner class: check accessibility --- .../com/siyeh/ig/psiutils/ImportUtils.java | 2 +- ...lyQualifiedInnerClassAccessInspection.java | 47 ++++++------------- ...nnecessarilyQualifiedInnerClassAccess.java | 7 ++- 3 files changed, 22 insertions(+), 34 deletions(-) diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/ImportUtils.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/ImportUtils.java index 6b6f80ee2110..fe53921bb195 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/ImportUtils.java +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/ImportUtils.java @@ -75,7 +75,7 @@ public final class ImportUtils { } @Contract("_, null -> false") - private static boolean isInsideClassBody(@NotNull PsiElement element, @Nullable PsiClass outerClass) { + public static boolean isInsideClassBody(@NotNull PsiElement element, @Nullable PsiClass outerClass) { PsiElement brace = outerClass != null ? outerClass.getLBrace() : null; return brace != null && brace.getTextOffset() < element.getTextOffset(); } diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/style/UnnecessarilyQualifiedInnerClassAccessInspection.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/style/UnnecessarilyQualifiedInnerClassAccessInspection.java index 33e1f57c3985..bfe1aebd74d3 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/style/UnnecessarilyQualifiedInnerClassAccessInspection.java +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/style/UnnecessarilyQualifiedInnerClassAccessInspection.java @@ -22,6 +22,7 @@ import com.intellij.codeInspection.ui.SingleCheckboxOptionsPanel; import com.intellij.openapi.project.Project; import com.intellij.psi.*; import com.intellij.psi.util.PsiTreeUtil; +import com.intellij.psi.util.PsiUtil; import com.siyeh.InspectionGadgetsBundle; import com.siyeh.ig.BaseInspection; import com.siyeh.ig.BaseInspectionVisitor; @@ -68,8 +69,7 @@ public class UnnecessarilyQualifiedInnerClassAccessInspection extends BaseInspec return new UnnecessarilyQualifiedInnerClassAccessFix(); } - private static class UnnecessarilyQualifiedInnerClassAccessFix - extends InspectionGadgetsFix { + private static class UnnecessarilyQualifiedInnerClassAccessFix extends InspectionGadgetsFix { @Override @NotNull @@ -85,8 +85,7 @@ public class UnnecessarilyQualifiedInnerClassAccessInspection extends BaseInspec if (!(parent instanceof PsiJavaCodeReferenceElement)) { return; } - final PsiJavaCodeReferenceElement referenceElement = - (PsiJavaCodeReferenceElement)parent; + final PsiJavaCodeReferenceElement referenceElement = (PsiJavaCodeReferenceElement)parent; final PsiElement target = referenceElement.resolve(); if (!(target instanceof PsiClass)) { return; @@ -105,7 +104,7 @@ public class UnnecessarilyQualifiedInnerClassAccessInspection extends BaseInspec return new UnnecessarilyQualifiedInnerClassAccessVisitor(); } - static boolean isReferenceToTarget(String referenceText, @NotNull PsiClass target, PsiElement context) { + private static boolean isReferenceToTarget(String referenceText, @NotNull PsiClass target, PsiElement context) { final PsiJavaCodeReferenceElement reference = JavaPsiFacade.getElementFactory(target.getProject()).createReferenceFromText(referenceText, context); final JavaResolveResult[] results = reference.multiResolve(false); @@ -119,24 +118,20 @@ public class UnnecessarilyQualifiedInnerClassAccessInspection extends BaseInspec return result.isAccessible() && target.equals(result.getElement()); } - private class UnnecessarilyQualifiedInnerClassAccessVisitor - extends BaseInspectionVisitor { + private class UnnecessarilyQualifiedInnerClassAccessVisitor extends BaseInspectionVisitor { @Override - public void visitReferenceElement( - PsiJavaCodeReferenceElement reference) { + public void visitReferenceElement(PsiJavaCodeReferenceElement reference) { super.visitReferenceElement(reference); final PsiElement qualifier = reference.getQualifier(); if (!(qualifier instanceof PsiJavaCodeReferenceElement)) { return; } - if (isInImportOrPackage(reference)) { + if (PsiTreeUtil.getParentOfType(reference, PsiImportStatementBase.class, PsiPackageStatement.class) != null) { return; } - final PsiJavaCodeReferenceElement referenceElement = - (PsiJavaCodeReferenceElement)qualifier; - final PsiReferenceParameterList parameterList = - referenceElement.getParameterList(); + final PsiJavaCodeReferenceElement referenceElement = (PsiJavaCodeReferenceElement)qualifier; + final PsiReferenceParameterList parameterList = referenceElement.getParameterList(); if (parameterList != null && parameterList.getTypeParameterElements().length > 0) { return; @@ -145,14 +140,12 @@ public class UnnecessarilyQualifiedInnerClassAccessInspection extends BaseInspec if (!(qualifierTarget instanceof PsiClass)) { return; } - final PsiClass referenceClass = - PsiTreeUtil.getParentOfType(reference, PsiClass.class); + final PsiClass referenceClass = PsiTreeUtil.getParentOfType(reference, PsiClass.class); if (referenceClass == null) { return; } - final PsiElement brace = referenceClass.getLBrace(); ProblemHighlightType highlightType = ProblemHighlightType.LIKE_UNUSED_SYMBOL; - if (!referenceClass.equals(qualifierTarget) || brace != null && brace.getTextOffset() > reference.getTextOffset()) { + if (!referenceClass.equals(qualifierTarget) || !ImportUtils.isInsideClassBody(reference, referenceClass)) { if (ignoreReferencesNeedingImport && (PsiTreeUtil.isAncestor(referenceClass, qualifierTarget, true) || !PsiTreeUtil.isAncestor(qualifierTarget, referenceClass, true))) { @@ -165,6 +158,9 @@ public class UnnecessarilyQualifiedInnerClassAccessInspection extends BaseInspec return; } final PsiClass aClass = (PsiClass)target; + if (!PsiUtil.isAccessible(aClass, referenceClass, null)) { + return; + } final PsiClass containingClass = aClass.getContainingClass(); if (containingClass == null) { return; @@ -180,21 +176,8 @@ public class UnnecessarilyQualifiedInnerClassAccessInspection extends BaseInspec } @Override - public void visitReferenceExpression( - PsiReferenceExpression expression) { + public void visitReferenceExpression(PsiReferenceExpression expression) { visitReferenceElement(expression); } - - private boolean isInImportOrPackage(PsiElement element) { - while (element instanceof PsiJavaCodeReferenceElement) { - element = element.getParent(); - if (element instanceof PsiImportStatementBase || - element instanceof PsiPackageStatement || - element instanceof PsiImportStaticReferenceElement) { - return true; - } - } - return false; - } } } diff --git a/plugins/InspectionGadgets/test/com/siyeh/igtest/style/unnecessarily_qualified_inner_class_access/UnnecessarilyQualifiedInnerClassAccess.java b/plugins/InspectionGadgets/test/com/siyeh/igtest/style/unnecessarily_qualified_inner_class_access/UnnecessarilyQualifiedInnerClassAccess.java index bffd051d02b0..57d92ec44afc 100644 --- a/plugins/InspectionGadgets/test/com/siyeh/igtest/style/unnecessarily_qualified_inner_class_access/UnnecessarilyQualifiedInnerClassAccess.java +++ b/plugins/InspectionGadgets/test/com/siyeh/igtest/style/unnecessarily_qualified_inner_class_access/UnnecessarilyQualifiedInnerClassAccess.java @@ -101,4 +101,9 @@ class HiearchyWithDefaults { } } -} \ No newline at end of file +} + +/** + * {@link java.util.concurrent.ConcurrentHashMap.SearchValuesTask} + */ +class InaccessibleClassReferencedInsideJavadocLink { }