mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-18 09:34:34 +07:00
~do not accept self nested classes in class declaration if they inherit nested classes from superclass (IDEA-55510)
This commit is contained in:
+24
-2
@@ -1274,8 +1274,12 @@ public class GenericsHighlightUtil {
|
||||
final PsiElement resolve = ref.resolve();
|
||||
if (resolve instanceof PsiClass) {
|
||||
final PsiClass containingClass = ((PsiClass)resolve).getContainingClass();
|
||||
if (containingClass != null && psiClass.isInheritor(containingClass, true)) {
|
||||
return HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR).descriptionAndTooltip(((PsiClass)resolve).getName() + " is not accessible in current context").range(ref).create();
|
||||
if (containingClass != null) {
|
||||
if (psiClass.isInheritor(containingClass, true) ||
|
||||
unqualifiedNestedClassReferenceAccessedViaContainingClassInheritance(containingClass, ((PsiClass)resolve).getExtendsList()) ||
|
||||
unqualifiedNestedClassReferenceAccessedViaContainingClassInheritance(containingClass, ((PsiClass)resolve).getImplementsList())) {
|
||||
return HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR).descriptionAndTooltip(((PsiClass)resolve).getName() + " is not accessible in current context").range(ref).create();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1284,5 +1288,23 @@ public class GenericsHighlightUtil {
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
private static boolean unqualifiedNestedClassReferenceAccessedViaContainingClassInheritance(PsiClass containingClass,
|
||||
PsiReferenceList referenceList) {
|
||||
if (referenceList != null) {
|
||||
for (PsiJavaCodeReferenceElement referenceElement : referenceList.getReferenceElements()) {
|
||||
if (!referenceElement.isQualified()) {
|
||||
final PsiElement superClass = referenceElement.resolve();
|
||||
if (superClass instanceof PsiClass) {
|
||||
final PsiClass superContainingClass = ((PsiClass)superClass).getContainingClass();
|
||||
if (superContainingClass != null && containingClass.isInheritor(superContainingClass, true)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+14
@@ -0,0 +1,14 @@
|
||||
abstract class IdeaBugTest<M extends IdeaBugTest.Mapping>
|
||||
{
|
||||
static class Mapping {}
|
||||
}
|
||||
|
||||
class BugTestSub extends IdeaBugTest<<error descr="SubMapping is not accessible in current context">BugTestSub.SubMapping</error>>
|
||||
{
|
||||
public abstract static class SubMapping extends Mapping {}
|
||||
}
|
||||
|
||||
class BugTestSub1 extends IdeaBugTest<BugTestSub1.SubMapping>
|
||||
{
|
||||
public abstract static class SubMapping extends IdeaBugTest.Mapping {} //fqn here
|
||||
}
|
||||
@@ -251,6 +251,10 @@ public class GenericsHighlightingTest extends LightDaemonAnalyzerTestCase {
|
||||
doTest5(false);
|
||||
}
|
||||
|
||||
public void testIDEA55510() throws Exception {
|
||||
doTest5(false);
|
||||
}
|
||||
|
||||
public void testIDEA27185(){ doTest(LanguageLevel.JDK_1_6, JavaSdkVersion.JDK_1_6, false); }
|
||||
public void testIDEA67571(){ doTest(LanguageLevel.JDK_1_7, JavaSdkVersion.JDK_1_7, false); }
|
||||
public void testTypeArgumentsOnRawType(){ doTest(LanguageLevel.JDK_1_6, JavaSdkVersion.JDK_1_6, false); }
|
||||
|
||||
Reference in New Issue
Block a user