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

This commit is contained in:
Alexey Kudravtsev
2015-12-23 16:57:38 +03:00
parent ec51643dff
commit cd72b8d540
2 changed files with 30 additions and 0 deletions
@@ -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
@@ -108,6 +108,13 @@ public class AccessCanBeTightenedInspectionTest extends LightInspectionTestCase
"}");
}
public void testDoNotSuggestPrivateIfInExtendsOrImplements() {
doTest("abstract class C implements Comparable<C.Inner> {\n" +
" static class Inner {\n" +
" }\n"+
"}");
}
@Override
protected LocalInspectionTool getInspection() {
VisibilityInspection inspection = new VisibilityInspection();