~do not accept self nested classes in class declaration if they inherit nested classes from superclass (IDEA-55510)

This commit is contained in:
Anna Kozlova
2013-06-04 14:18:46 +04:00
parent 42ece72f79
commit 7982d35821
3 changed files with 42 additions and 2 deletions
@@ -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;
}
}
@@ -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); }