Java: fix error message when assignment before chained constructor call (IDEA-375281)

GitOrigin-RevId: 49c4a8ce04845726d1c35aa114612bf5410e1a37
This commit is contained in:
Bas Leijdekkers
2025-07-15 18:39:09 +00:00
committed by intellij-monorepo-bot
parent 6f36a457d7
commit 03fe273fb4
3 changed files with 25 additions and 2 deletions
@@ -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
@@ -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<PsiReferenceExpression, PsiVariable> 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<PsiReferenceExpression, PsiVariable> VARIABLE_ALREADY_ASSIGNED_FIELD =
parameterized(PsiReferenceExpression.class, PsiVariable.class, "variable.already.assigned.field")
.withDescription((ref, var) -> message("variable.already.assigned.field", var.getName()));
@@ -211,4 +211,19 @@ class Person {
}
class Other {
Other(int x) {}
}
class Machine {
private final boolean big;
Machine(boolean big) {
this.big = big;
}
Machine() {
<error descr="Cannot assign final field 'big' before chained constructor call">big</error> = false;
this(false);
}
Machine(int size) {
this(<error descr="Cannot assign final field 'big' before chained constructor call">big</error> = size > 10);
}
}