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()]); + } +}