red code green: warn about non inner classes used in super constructor call qualifiers (IDEA-57443)

This commit is contained in:
anna
2012-10-23 15:40:24 +02:00
parent e55f96812a
commit 0dfb29db51
3 changed files with 52 additions and 5 deletions

View File

@@ -836,11 +836,15 @@ public class HighlightClassUtil {
PsiClass targetClass = aClass.getSuperClass();
if (targetClass == null) return null;
PsiExpression qualifier = superCall.getMethodExpression().getQualifierExpression();
if (qualifier != null && PsiUtil.isInnerClass(targetClass)) {
PsiClass outerClass = targetClass.getContainingClass();
if (outerClass != null) {
PsiClassType outerType = JavaPsiFacade.getInstance(project).getElementFactory().createType(outerClass);
return HighlightUtil.checkAssignability(outerType, null, qualifier, qualifier);
if (qualifier != null) {
if (PsiUtil.isInnerClass(targetClass)) {
PsiClass outerClass = targetClass.getContainingClass();
if (outerClass != null) {
PsiClassType outerType = JavaPsiFacade.getInstance(project).getElementFactory().createType(outerClass);
return HighlightUtil.checkAssignability(outerType, null, qualifier, qualifier);
}
} else {
return HighlightInfo.createHighlightInfo(HighlightInfoType.ERROR, qualifier, "'" + HighlightUtil.formatClass(targetClass) + "' is not an inner class");
}
}
return null;

View File

@@ -0,0 +1,42 @@
class A {
class S {
}
class C extends S {
C(A c) {
c.super();
}
C(B b) {
b.super();
}
}
}
class B extends A {}
class A1 {
static class S {
}
class C extends S {
C(A1 c) {
<error descr="'A1.S' is not an inner class">c</error>.super();
}
}
}
class C2 {
C2(String c){
<error descr="'java.lang.Object' is not an inner class">c</error>.super();
}
}
class A3 {
class S {
}
class C extends S {
C(String c) {
<error descr="Incompatible types. Found: 'java.lang.String', required: 'A3'">c</error>.super();
}
}
}

View File

@@ -358,4 +358,5 @@ public class LightAdvHighlightingTest extends LightDaemonAnalyzerTestCase {
public void testRegexp() throws Exception { doTest(false, false); }
public void testUnsupportedFeatures() throws Exception { doTest(false, false); }
public void testThisBeforeSuper() throws Exception { doTest(false, false); }
public void testExplicitConstructorInvocation() throws Exception { doTest(false, false); }
}