mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
Java: fix good code is red super() call problem 3 (IDEA-340994)
"Cannot reference class before supertype constructor has been called" GitOrigin-RevId: 70471c3f1a58c5c57ab229e24d39baa1794b8e72
This commit is contained in:
committed by
intellij-monorepo-bot
parent
6b8d6303b4
commit
d0adc5895a
+5
-3
@@ -2679,6 +2679,7 @@ public final class HighlightUtil {
|
||||
PsiClass referencedClass;
|
||||
String resolvedName;
|
||||
PsiType type;
|
||||
PsiElement parent = expression.getParent();
|
||||
if (expression instanceof PsiJavaCodeReferenceElement) {
|
||||
// redirected ctr
|
||||
if (PsiKeyword.THIS.equals(((PsiJavaCodeReferenceElement)expression).getReferenceName())
|
||||
@@ -2690,7 +2691,7 @@ public final class HighlightUtil {
|
||||
type = qualifier instanceof PsiExpression ? ((PsiExpression)qualifier).getType() : null;
|
||||
referencedClass = PsiUtil.resolveClassInType(type);
|
||||
|
||||
boolean isSuperCall = JavaPsiConstructorUtil.isSuperConstructorCall(expression.getParent());
|
||||
boolean isSuperCall = JavaPsiConstructorUtil.isSuperConstructorCall(parent);
|
||||
if (resolved == null && isSuperCall) {
|
||||
if (qualifier instanceof PsiReferenceExpression) {
|
||||
resolved = ((PsiReferenceExpression)qualifier).resolve();
|
||||
@@ -2778,7 +2779,7 @@ public final class HighlightUtil {
|
||||
return null;
|
||||
}
|
||||
|
||||
PsiElement element = expression.getParent();
|
||||
PsiElement element = parent;
|
||||
while (element != null) {
|
||||
// check if expression inside super()/this() call
|
||||
|
||||
@@ -2820,11 +2821,12 @@ public final class HighlightUtil {
|
||||
return null;
|
||||
}
|
||||
|
||||
if (expression.getParent() instanceof PsiNewExpression newExpression &&
|
||||
if (parent instanceof PsiNewExpression newExpression &&
|
||||
newExpression.isArrayCreation() &&
|
||||
newExpression.getClassOrAnonymousClassReference() == expression) {
|
||||
return null;
|
||||
}
|
||||
if (parent instanceof PsiThisExpression || parent instanceof PsiSuperExpression) return null;
|
||||
}
|
||||
|
||||
HighlightInfo.Builder builder = createMemberReferencedError(resolvedName, expression.getTextRange());
|
||||
|
||||
+22
@@ -0,0 +1,22 @@
|
||||
class FirstLevel {
|
||||
FirstLevel(int i) {
|
||||
}
|
||||
|
||||
int hello() {
|
||||
return 1;
|
||||
}
|
||||
|
||||
class SecondLevel extends FirstLevel {
|
||||
SecondLevel() {
|
||||
super(1);
|
||||
}
|
||||
|
||||
|
||||
class ThirdLevel extends FirstLevel {
|
||||
ThirdLevel() {
|
||||
super(SecondLevel.this.hello());
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
+1
@@ -380,6 +380,7 @@ public class LightAdvHighlightingTest extends LightDaemonAnalyzerTestCase {
|
||||
public void testExplicitConstructorInvocation() { doTest(false); }
|
||||
public void testExtendFinalClass() { doTest(false); }
|
||||
public void testPrivateMethodCalledFromSuper() { doTest(false); }
|
||||
public void testQualifiedThisCalledFromSuper() { doTest(false); }
|
||||
public void testReferenceToClassFromSuper() { IdeaTestUtil.withLevel(getModule(), LanguageLevel.JDK_16, () -> doTest(false)); }
|
||||
public void testThisInInterface() { doTest(false); }
|
||||
public void testInnerClassConstantReference() { doTest(false); }
|
||||
|
||||
Reference in New Issue
Block a user