mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-01-05 01:50:56 +07:00
no enclosing instance (IDEA-97063)
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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> { }
|
||||
@@ -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); }
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user