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:
Bas Leijdekkers
2023-12-15 12:27:55 +00:00
committed by intellij-monorepo-bot
parent 6b8d6303b4
commit d0adc5895a
3 changed files with 28 additions and 3 deletions
@@ -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());
@@ -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());
}
}
}
}
@@ -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); }