no enclosing instance (IDEA-97063)

This commit is contained in:
anna
2012-12-13 21:17:33 +01:00
parent 25782dcb7a
commit 7cff72c988
4 changed files with 17 additions and 4 deletions

View File

@@ -736,7 +736,7 @@ public class HighlightClassUtil {
if (!PsiUtil.isInnerClass(base)) return;
if (resolve == resolved && baseClass != null && !PsiTreeUtil.isAncestor(baseClass, extendRef, true) &&
!hasEnclosingInstanceInScope(baseClass, extendRef, true) && !qualifiedNewCalledInConstructors(aClass, baseClass)) {
!hasEnclosingInstanceInScope(baseClass, extendRef, true, true) && !qualifiedNewCalledInConstructors(aClass, baseClass)) {
String description = JavaErrorMessages.message("no.enclosing.instance.in.scope", HighlightUtil.formatClass(baseClass));
infos[0] = HighlightInfo.createHighlightInfo(HighlightInfoType.ERROR, extendRef, description);
}
@@ -772,7 +772,10 @@ public class HighlightClassUtil {
return true;
}
public static boolean hasEnclosingInstanceInScope(PsiClass aClass, PsiElement scope, final boolean isSuperClassAccepted) {
public static boolean hasEnclosingInstanceInScope(PsiClass aClass,
PsiElement scope,
final boolean isSuperClassAccepted,
boolean isTypeParamsAccepted) {
PsiManager manager = aClass.getManager();
PsiElement place = scope;
while (place != null && place != aClass && !(place instanceof PsiFile)) {
@@ -783,6 +786,9 @@ public class HighlightClassUtil {
else {
if (manager.areElementsEquivalent(place, aClass)) return true;
}
if (isTypeParamsAccepted && place instanceof PsiTypeParameter) {
return true;
}
}
if (place instanceof PsiModifierListOwner) {
final PsiModifierList modifierList = ((PsiModifierListOwner)place).getModifierList();
@@ -833,7 +839,7 @@ public class HighlightClassUtil {
PsiClass outerClass = aClass.getContainingClass();
if (outerClass == null) return null;
if (outerClass instanceof JspClass || hasEnclosingInstanceInScope(outerClass, placeToSearchEnclosingFrom, true)) return null;
if (outerClass instanceof JspClass || hasEnclosingInstanceInScope(outerClass, placeToSearchEnclosingFrom, true, false)) return null;
return reportIllegalEnclosingUsage(placeToSearchEnclosingFrom, aClass, outerClass, element);
}

View File

@@ -1302,7 +1302,7 @@ public class HighlightUtil extends HighlightUtilBase {
}
if (aClass == null) return null;
if (!HighlightClassUtil.hasEnclosingInstanceInScope(aClass, expr, false) &&
if (!HighlightClassUtil.hasEnclosingInstanceInScope(aClass, expr, false, false) &&
!resolvesToImmediateSuperInterface(expr, qualifier, aClass)) {
return HighlightClassUtil.reportIllegalEnclosingUsage(expr, null, aClass, expr);
}

View File

@@ -0,0 +1,6 @@
class OtherClass {
public class InnerClass {}
}
class Main<B extends OtherClass.InnerClass> { }
class Main1 extends <error descr="No enclosing instance of type 'OtherClass' is in scope">OtherClass.InnerClass</error> { }

View File

@@ -159,4 +159,5 @@ public class LightAdvHighlightingJdk7Test extends LightDaemonAnalyzerTestCase {
public void testUncheckedWarningIDEA21432() throws Exception { doTest(true, false); }
public void testUncheckedWarningIDEA26738() throws Exception { doTest(true, false); }
public void testDefaultMethodVisibility() throws Exception { doTest(true, false); }
public void testEnclosingInstance() throws Exception { doTest(false, false); }
}