diff --git a/java/codeserver/highlighting/resources/messages/JavaCompilationErrorBundle.properties b/java/codeserver/highlighting/resources/messages/JavaCompilationErrorBundle.properties index a955d079cbea..794f578c32e5 100644 --- a/java/codeserver/highlighting/resources/messages/JavaCompilationErrorBundle.properties +++ b/java/codeserver/highlighting/resources/messages/JavaCompilationErrorBundle.properties @@ -441,7 +441,7 @@ variable.must.be.effectively.final.lambda=Variable used in lambda expression sho variable.must.be.effectively.final.guard=Variable used in guard expression should be final or effectively final variable.not.initialized=Variable ''{0}'' might not have been initialized variable.already.assigned=Variable ''{0}'' might already have been assigned to -variable.already.assigned.constructor=Cannot assign final field ''{0}'' after chained constructor call +variable.already.assigned.constructor=Cannot assign final field ''{0}'' {1, choice, 1#before|2#after} chained constructor call variable.already.assigned.field=Final field ''{0}'' is already initialized in another field initializer variable.already.assigned.initializer=Final field ''{0}'' is already initialized in a class initializer variable.assigned.in.loop=Variable ''{0}'' might be assigned in a loop diff --git a/java/codeserver/highlighting/src/com/intellij/java/codeserver/highlighting/errors/JavaErrorKinds.java b/java/codeserver/highlighting/src/com/intellij/java/codeserver/highlighting/errors/JavaErrorKinds.java index 522585a962d6..b68af75d8d51 100644 --- a/java/codeserver/highlighting/src/com/intellij/java/codeserver/highlighting/errors/JavaErrorKinds.java +++ b/java/codeserver/highlighting/src/com/intellij/java/codeserver/highlighting/errors/JavaErrorKinds.java @@ -26,6 +26,7 @@ import com.intellij.psi.infos.MethodCandidateInfo; import com.intellij.psi.tree.TokenSet; import com.intellij.psi.util.*; import com.intellij.refactoring.util.RefactoringChangeUtil; +import com.intellij.util.JavaPsiConstructorUtil; import com.intellij.util.VisibilityUtil; import org.jetbrains.annotations.*; @@ -1492,7 +1493,14 @@ public final class JavaErrorKinds { .withDescription((ref, var) -> message("variable.already.assigned", var.getName())); public static final Parameterized VARIABLE_ALREADY_ASSIGNED_CONSTRUCTOR = parameterized(PsiReferenceExpression.class, PsiVariable.class, "variable.already.assigned.constructor") - .withDescription((ref, var) -> message("variable.already.assigned.constructor", var.getName())); + .withDescription((ref, var) -> { + PsiMethod constructor = PsiTreeUtil.getParentOfType(ref, PsiMethod.class); + assert constructor != null; + PsiMethodCallExpression thisCall = JavaPsiConstructorUtil.findThisOrSuperCallInConstructor(constructor); + assert thisCall != null; + return message("variable.already.assigned.constructor", var.getName(), + thisCall.getTextOffset() + thisCall.getTextLength() > ref.getTextOffset() ? 1 : 2); + }); public static final Parameterized VARIABLE_ALREADY_ASSIGNED_FIELD = parameterized(PsiReferenceExpression.class, PsiVariable.class, "variable.already.assigned.field") .withDescription((ref, var) -> message("variable.already.assigned.field", var.getName())); diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/FlexibleConstructorBodies.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/FlexibleConstructorBodies.java index 51c4728ae84d..0915536e55ee 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/FlexibleConstructorBodies.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/FlexibleConstructorBodies.java @@ -211,4 +211,19 @@ class Person { } class Other { Other(int x) {} +} +class Machine { + private final boolean big; + Machine(boolean big) { + this.big = big; + } + + Machine() { + big = false; + this(false); + } + + Machine(int size) { + this(big = size > 10); + } } \ No newline at end of file