From cd72b8d540365f9b7c4cbbd24ca58be081369f9a Mon Sep 17 00:00:00 2001 From: Alexey Kudravtsev Date: Tue, 22 Dec 2015 16:17:51 +0300 Subject: [PATCH] IDEA-149684 'Declaration access can be weaker' inspection incorrectly suggests to make an inner class private even if it is used in generic parameters of the outer class --- .../AccessCanBeTightenedInspection.java | 23 +++++++++++++++++++ .../AccessCanBeTightenedInspectionTest.java | 7 ++++++ 2 files changed, 30 insertions(+) diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/visibility/AccessCanBeTightenedInspection.java b/java/java-analysis-impl/src/com/intellij/codeInspection/visibility/AccessCanBeTightenedInspection.java index 9c7b83744c01..afa5dffa0a38 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/visibility/AccessCanBeTightenedInspection.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/visibility/AccessCanBeTightenedInspection.java @@ -36,6 +36,7 @@ import com.intellij.util.containers.ContainerUtil; import com.siyeh.ig.fixes.ChangeModifierFix; import com.siyeh.ig.psiutils.MethodUtils; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.Set; import java.util.concurrent.atomic.AtomicBoolean; @@ -225,6 +226,11 @@ class AccessCanBeTightenedInspection extends BaseJavaBatchLocalInspectionTool { if (annotation != null && annotation.getParent() instanceof PsiModifierList && annotation.getParent().getParent() == aClass) { return suggestPackageLocal(member); } + // or in implements/extends clauses + if (isInReferenceList(aClass.getImplementsList(), member) || isInReferenceList(aClass.getExtendsList(), member)) { + return suggestPackageLocal(member); + } + return myVisibilityInspection.SUGGEST_PRIVATE_FOR_INNERS || memberClass == aClass && memberClass.getContainingClass() == null ? PsiUtil.ACCESS_LEVEL_PRIVATE : suggestPackageLocal(member); } @@ -249,6 +255,23 @@ class AccessCanBeTightenedInspection extends BaseJavaBatchLocalInspectionTool { } } + private static boolean isInReferenceList(@Nullable PsiReferenceList list, @NotNull final PsiMember member) { + if (list == null) return false; + final PsiManager psiManager = member.getManager(); + final boolean[] result = new boolean[1]; + list.accept(new JavaRecursiveElementWalkingVisitor() { + @Override + public void visitReferenceElement(PsiJavaCodeReferenceElement reference) { + super.visitReferenceElement(reference); + if (psiManager.areElementsEquivalent(reference.resolve(), member)) { + result[0] = true; + stopWalking(); + } + } + }); + return result[0]; + } + private int suggestPackageLocal(@NotNull PsiElement member) { boolean suggestPackageLocal = member instanceof PsiClass && ClassUtil.isTopLevelClass((PsiClass)member) ? myVisibilityInspection.SUGGEST_PACKAGE_LOCAL_FOR_TOP_CLASSES diff --git a/plugins/InspectionGadgets/testsrc/com/intellij/codeInspection/visibility/AccessCanBeTightenedInspectionTest.java b/plugins/InspectionGadgets/testsrc/com/intellij/codeInspection/visibility/AccessCanBeTightenedInspectionTest.java index b61f6e0d2e2b..a395dc96beea 100644 --- a/plugins/InspectionGadgets/testsrc/com/intellij/codeInspection/visibility/AccessCanBeTightenedInspectionTest.java +++ b/plugins/InspectionGadgets/testsrc/com/intellij/codeInspection/visibility/AccessCanBeTightenedInspectionTest.java @@ -108,6 +108,13 @@ public class AccessCanBeTightenedInspectionTest extends LightInspectionTestCase "}"); } + public void testDoNotSuggestPrivateIfInExtendsOrImplements() { + doTest("abstract class C implements Comparable {\n" + + " static class Inner {\n" + + " }\n"+ + "}"); + } + @Override protected LocalInspectionTool getInspection() { VisibilityInspection inspection = new VisibilityInspection();