diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightUtil.java b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightUtil.java
index 3b387593bfe7..d5816b66dab1 100644
--- a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightUtil.java
+++ b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightUtil.java
@@ -2800,7 +2800,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 =
@@ -2933,7 +2939,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;
}
}
diff --git a/java/java-psi-impl/resources/messages/JavaErrorBundle.properties b/java/java-psi-impl/resources/messages/JavaErrorBundle.properties
index 924405d02618..258df136f2da 100644
--- a/java/java-psi-impl/resources/messages/JavaErrorBundle.properties
+++ b/java/java-psi-impl/resources/messages/JavaErrorBundle.properties
@@ -269,6 +269,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
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/FlexibleConstructorBodies.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/FlexibleConstructorBodies.java
index 188e39a5d754..4c36cd8ed9be 100644
--- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/FlexibleConstructorBodies.java
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/FlexibleConstructorBodies.java
@@ -10,6 +10,11 @@ class A {
this.i++; // Error
this.hashCode(); // Error
System.out.print(this); // Error
+ Runnable r = () -> {
+ i = 1;
+ this.i = 1;
+ A.this.i = 1;
+ };
super();
}
A(int i) {}
@@ -180,4 +185,13 @@ enum EE {
this(1);
}
EE(int i) {}
+}
+class InitializeField {
+ private int i = 0;
+ InitializeField() {
+ i = 1;
+ this.i = 1;
+ InitializeField.this.i = 1;
+ super();
+ }
}
\ No newline at end of file