Java: match javac from jdk 24 in error highlighting for Flexible Constructor Bodies - JEP 492 (IDEA-364189)

(cherry picked from commit 686bd65963483f93acd22ae8956681f889105409)

GitOrigin-RevId: b8c02f835e7173b68aa39aee57e4a8c590608482
This commit is contained in:
Bas Leijdekkers
2025-01-10 17:10:10 +01:00
committed by intellij-monorepo-bot
parent 8e0d1b142f
commit 3746633993
3 changed files with 23 additions and 2 deletions

View File

@@ -2801,7 +2801,13 @@ public final class HighlightUtil {
if (JavaFeature.STATEMENTS_BEFORE_SUPER.isSufficient(languageLevel) &&
languageLevel != LanguageLevel.JDK_22_PREVIEW &&
isOnSimpleAssignmentLeftHand(expression) &&
field.getContainingClass() == PsiTreeUtil.getParentOfType(expression, PsiClass.class, true)) {
field.getContainingClass() == PsiTreeUtil.getParentOfType(expression, PsiClass.class, PsiLambdaExpression.class)) {
if (field.hasInitializer()) {
String fieldName = PsiFormatUtil.formatVariable(
field, PsiFormatUtilBase.SHOW_CONTAINING_CLASS | PsiFormatUtilBase.SHOW_NAME, PsiSubstitutor.EMPTY);
String description = JavaErrorBundle.message("assign.initialized.field.before.constructor.call", fieldName);
return HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR).range(expression).descriptionAndTooltip(description);
}
return null;
}
resolvedName =
@@ -2934,7 +2940,7 @@ public final class HighlightUtil {
if (isOnSimpleAssignmentLeftHand(parent) &&
parent instanceof PsiReferenceExpression ref &&
ref.resolve() instanceof PsiField field &&
field.getContainingClass() == PsiTreeUtil.getParentOfType(expression, PsiClass.class, true)) {
field.getContainingClass() == PsiTreeUtil.getParentOfType(expression, PsiClass.class, PsiLambdaExpression.class)) {
return null;
}
}

View File

@@ -309,6 +309,7 @@ unknown.class=Unknown class: ''{0}''
illegal.type.void=Illegal type: 'void'
member.referenced.before.constructor.called=Cannot reference ''{0}'' before superclass constructor is called
method.called.before.constructor.called=Cannot call ''{0}'' before superclass constructor is called
assign.initialized.field.before.constructor.call=Cannot assign initialized field ''{0}'' before superclass constructor is called
label.without.statement=Label without statement
duplicate.label=Label ''{0}'' already in use
unclosed.comment=Unclosed comment

View File

@@ -10,6 +10,11 @@ class A {
<error descr="Cannot reference 'this' before superclass constructor is called">this</error>.i++; // Error
<error descr="Cannot reference 'this' before superclass constructor is called">this</error>.hashCode(); // Error
System.out.print(<error descr="Cannot reference 'this' before superclass constructor is called">this</error>); // Error
Runnable r = () -> {
<error descr="Cannot reference 'A.i' before superclass constructor is called">i</error> = 1;
<error descr="Cannot reference 'this' before superclass constructor is called">this</error>.i = 1;
<error descr="Cannot reference 'A.this' before superclass constructor is called">A.this</error>.i = 1;
};
super();
}
A(int i) {}
@@ -180,4 +185,13 @@ enum EE {
this(1);
}
EE(int i) {}
}
class InitializeField {
private int i = 0;
InitializeField() {
<error descr="Cannot assign initialized field 'InitializeField.i' before superclass constructor is called">i</error> = 1;
<error descr="Cannot assign initialized field 'InitializeField.i' before superclass constructor is called">this.i</error> = 1;
<error descr="Cannot assign initialized field 'InitializeField.i' before superclass constructor is called">InitializeField.this.i</error> = 1;
super();
}
}