[java-intentions] CreateConstructorParameterFromFieldFix: fill variables before modifying constructors

When chain target constructor is already updated, it affected other constructors from the same chain
Fixes IDEA-345876 Unable to add constructor parameter via quick-fix

GitOrigin-RevId: e13d1d24ad16dbd32281b7f13be6d656871acef2
This commit is contained in:
Tagir Valeev
2024-06-05 14:50:40 +02:00
committed by intellij-monorepo-bot
parent 0d42693ef6
commit 2d3ed0f730
5 changed files with 90 additions and 4 deletions

View File

@@ -21,6 +21,7 @@ import com.intellij.util.JavaPsiConstructorUtil;
import com.intellij.util.containers.ContainerUtil;
import com.intellij.util.containers.MultiMap;
import com.siyeh.ig.psiutils.VariableAccessUtils;
import one.util.streamex.StreamEx;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -153,17 +154,18 @@ public class CreateConstructorParameterFromFieldFix extends PsiBasedModCommandAc
updater.trackDeclaration(constructor);
}
Map<PsiMethod, ChainedConstructorData> data = ChainedConstructorData.getChainedConstructorDataMap(writableFields, writableConstructors);
Map<PsiMethod, List<PsiVariable>> params = StreamEx.of(writableConstructors)
.toMap(ctr -> fillVariables(writableFields, ctr.getParameterList()));
for (PsiMethod constructor : writableConstructors) {
addParameterToConstructor(context, constructor, writableFields, updater, data.get(constructor));
addParameterToConstructor(context, constructor, updater, data.get(constructor), params.get(constructor));
}
});
}
private static void addParameterToConstructor(@NotNull ActionContext context, @NotNull PsiMethod constructor,
@NotNull List<PsiField> fields, @NotNull ModPsiUpdater updater,
@Nullable ChainedConstructorData chainedConstructorData) {
@NotNull ModPsiUpdater updater, @Nullable ChainedConstructorData chainedConstructorData,
@NotNull List<PsiVariable> params) {
final PsiParameterList parameterList = constructor.getParameterList();
final List<PsiVariable> params = fillVariables(fields, parameterList);
final Map<PsiField, String> usedFields = new LinkedHashMap<>();
final MultiMap<PsiType, PsiVariable> types = new MultiMap<>();

View File

@@ -0,0 +1,15 @@
// "Add constructor parameter" "true"
public class SimpleClass { // IDEA-333847
final boolean b;
final String s;
public SimpleClass(boolean b, String s) {
this.b = b;
this.s = s;
}
public SimpleClass(int i, boolean b, String s) {
this.b = b;
this.s = s;
}
}

View File

@@ -0,0 +1,29 @@
// "Add constructor parameter" "true"
import java.util.Collections;
import java.util.List;
// IDEA-345876
abstract class Test {
private final String taskName;
private final String config;
private final String moduleName;
public Test(String config, String taskName, String taskLocation, String moduleName) {
this(config, taskName, taskLocation, Collections.emptyList(), moduleName);
}
public Test(String config, String taskLocation,
List<String> additionalArguments, String moduleName) {
this(config, null, taskLocation, additionalArguments, moduleName);
}
public Test(String config, String taskName, String taskLocation,
List<String> additionalArguments, String moduleName) {
this.config = config;
this.taskName = taskName;
this.moduleName = moduleName;
System.out.println(additionalArguments);
}
}

View File

@@ -0,0 +1,12 @@
// "Add constructor parameter" "true"
public class SimpleClass { // IDEA-333847
final <caret>boolean b;
final String s;
public SimpleClass() {
}
public SimpleClass(int i, String s) {
this.s = s;
}
}

View File

@@ -0,0 +1,28 @@
// "Add constructor parameter" "true"
import java.util.Collections;
import java.util.List;
// IDEA-345876
abstract class Test {
private final String taskName;
private final String config;
private final String <caret>moduleName;
public Test(String config, String taskName, String taskLocation) {
this(config, taskName, taskLocation, Collections.emptyList());
}
public Test(String config, String taskLocation,
List<String> additionalArguments) {
this(config, null, taskLocation, additionalArguments);
}
public Test(String config, String taskName, String taskLocation,
List<String> additionalArguments) {
this.config = config;
this.taskName = taskName;
System.out.println(additionalArguments);
}
}