mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
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:
+23
@@ -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
|
||||
|
||||
+7
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user