From 485b1b43367f90ab82c19748e86a09aa27853f7e Mon Sep 17 00:00:00 2001 From: Bartek Pacia Date: Fri, 12 Dec 2025 14:36:44 +0100 Subject: [PATCH] IDEA-383350 [java-intentions] fix 'Bind parameters to fields' producing red code when field is assigned indirectly GitOrigin-RevId: 8879b800315a194e8e04e9e0e6f7ca1b5b5205bc --- .../impl/FieldFromParameterUtils.java | 8 ++++++ .../beforeFieldAlreadyAssignedIndirectly.java | 10 ++++++++ .../beforeVarargIndirectlyUsed.java | 25 +++++++++++++++++++ 3 files changed, 43 insertions(+) create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/bindFieldsFromParameters/beforeFieldAlreadyAssignedIndirectly.java create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/bindFieldsFromParameters/beforeVarargIndirectlyUsed.java diff --git a/java/java-impl/src/com/intellij/codeInsight/intention/impl/FieldFromParameterUtils.java b/java/java-impl/src/com/intellij/codeInsight/intention/impl/FieldFromParameterUtils.java index 25016c1f3b12..3c35002a5595 100644 --- a/java/java-impl/src/com/intellij/codeInsight/intention/impl/FieldFromParameterUtils.java +++ b/java/java-impl/src/com/intellij/codeInsight/intention/impl/FieldFromParameterUtils.java @@ -18,6 +18,7 @@ import com.intellij.psi.util.TypeConversionUtil; import com.intellij.util.CommonJavaRefactoringUtil; import com.intellij.util.JavaPsiConstructorUtil; import com.intellij.util.ObjectUtils; +import com.siyeh.ig.psiutils.VariableAccessUtils; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -290,7 +291,14 @@ public final class FieldFromParameterUtils { existingField.hasModifierProperty(PsiModifier.FINAL) && !method.isConstructor()) { return false; } + + if (method.isConstructor()) { + if (VariableAccessUtils.variableIsAssigned(existingField, method)) { + return false; + } + } } + if (method.isConstructor()) { PsiMethodCallExpression chainedCall = JavaPsiConstructorUtil.findThisOrSuperCallInConstructor(method); if (JavaPsiConstructorUtil.isChainedConstructorCall(chainedCall)) { diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/bindFieldsFromParameters/beforeFieldAlreadyAssignedIndirectly.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/bindFieldsFromParameters/beforeFieldAlreadyAssignedIndirectly.java new file mode 100644 index 000000000000..a0ec0e07c227 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/bindFieldsFromParameters/beforeFieldAlreadyAssignedIndirectly.java @@ -0,0 +1,10 @@ +// "Bind constructor parameters to fields" "false" + +class Test { + private final String value; + + Test(String input) { + String processed = input.toUpperCase(); + this.value = processed; + } +} diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/bindFieldsFromParameters/beforeVarargIndirectlyUsed.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/bindFieldsFromParameters/beforeVarargIndirectlyUsed.java new file mode 100644 index 000000000000..05b3a7253d04 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/bindFieldsFromParameters/beforeVarargIndirectlyUsed.java @@ -0,0 +1,25 @@ +// "Bind constructor parameters to fields" "false" + +import java.util.Collections; +import java.util.LinkedHashSet; + +class Person { + String name; + int age; + + Person(String name, int age) { + this.name = name; + this.age = age; + } +} + +class Interesting extends Person { + private final String[] hobbies; + + Interesting(String name, int age, String... hobbies) { + super(name, age); + LinkedHashSet hobbySet = new LinkedHashSet<>(); + Collections.addAll(hobbySet, hobbies); + this.hobbies = hobbySet.toArray(new String[hobbySet.size()]); + } +}