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