diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateConstructorParameterFromFieldFix.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateConstructorParameterFromFieldFix.java index 6285728cf954..8a899ef7d0fa 100644 --- a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateConstructorParameterFromFieldFix.java +++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateConstructorParameterFromFieldFix.java @@ -240,12 +240,14 @@ public class CreateConstructorParameterFromFieldFix implements IntentionAction { Collections.sort(params, new FieldParameterComparator(parameterList)); int i = 0; + final HashMap usedFields = new HashMap(); for (PsiVariable param : params) { final PsiType paramType = param.getType(); if (param instanceof PsiParameter) { newParamInfos[i++] = new ParameterInfoImpl(parameterList.getParameterIndex((PsiParameter)param), param.getName(), paramType, param.getName()); } else { - final String uniqueParameterName = getUniqueParameterName(parameters, param); + final String uniqueParameterName = getUniqueParameterName(parameters, param, usedFields); + usedFields.put((PsiField)param, uniqueParameterName); newParamInfos[i++] = new ParameterInfoImpl(-1, uniqueParameterName, paramType, uniqueParameterName); } } @@ -265,7 +267,7 @@ public class CreateConstructorParameterFromFieldFix implements IntentionAction { return ApplicationManager.getApplication().runWriteAction(new Computable() { @Override public Boolean compute() { - return doCreate(project, editor, parameters, constructorPointer, resultParams, fields); + return doCreate(project, editor, parameters, constructorPointer, resultParams, usedFields); } }); } @@ -279,7 +281,7 @@ public class CreateConstructorParameterFromFieldFix implements IntentionAction { }, ", ") + "){}"; } - private static String getUniqueParameterName(PsiParameter[] parameters, PsiVariable variable) { + private static String getUniqueParameterName(PsiParameter[] parameters, PsiVariable variable, HashMap usedNames) { final JavaCodeStyleManager styleManager = JavaCodeStyleManager.getInstance(variable.getProject()); final SuggestedNameInfo nameInfo = styleManager .suggestVariableName(VariableKind.PARAMETER, @@ -288,7 +290,7 @@ public class CreateConstructorParameterFromFieldFix implements IntentionAction { String newName = nameInfo.names[0]; int n = 1; while (true) { - if (isUnique(parameters, newName)) { + if (isUnique(parameters, newName, usedNames)) { break; } newName = nameInfo.names[0] + n++; @@ -296,7 +298,8 @@ public class CreateConstructorParameterFromFieldFix implements IntentionAction { return newName; } - private static boolean isUnique(PsiParameter[] params, String newName) { + private static boolean isUnique(PsiParameter[] params, String newName, HashMap usedNames) { + if (usedNames.containsValue(newName)) return false; for (PsiParameter parameter : params) { if (Comparing.strEqual(parameter.getName(), newName)) { return false; @@ -306,7 +309,7 @@ public class CreateConstructorParameterFromFieldFix implements IntentionAction { } private static boolean doCreate(Project project, Editor editor, PsiParameter[] parameters, SmartPsiElementPointer constructorPointer, - ParameterInfoImpl[] parameterInfos, PsiField[] fields) { + ParameterInfoImpl[] parameterInfos, HashMap fields) { PsiMethod constructor = (PsiMethod)constructorPointer.getElement(); assert constructor != null; PsiParameter[] newParameters = constructor.getParameterList().getParameters(); @@ -316,16 +319,11 @@ public class CreateConstructorParameterFromFieldFix implements IntentionAction { if (HighlightControlFlowUtil.getChainedConstructors(constructor) == null) { final JavaCodeStyleManager styleManager = JavaCodeStyleManager.getInstance(project); - for (PsiField field : fields) { - final String defaultParamName = styleManager - .suggestVariableName(VariableKind.PARAMETER, styleManager.variableNameToPropertyName(field.getName(), VariableKind.FIELD), null, - field.getType()).names[0]; + for (PsiField field : fields.keySet()) { + final String defaultParamName = fields.get(field); PsiParameter parameter = findParamByName(defaultParamName, newParameters); if (parameter == null) { - parameter = fields.length == 1 ? findParamByName(ChangeMethodSignatureFromUsageFix.getNewParameterNameByOldIndex(-1, parameterInfos), newParameters) : null; - if (parameter == null) { - continue; - } + continue; } notNull(project, field, parameter); AssignFieldFromParameterAction.addFieldAssignmentStatement(project, field, parameter, editor); diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createConstructorParameterFromField/afterSameParameterSimpleNames.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createConstructorParameterFromField/afterSameParameterSimpleNames.java new file mode 100644 index 000000000000..3f64bdcda609 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createConstructorParameterFromField/afterSameParameterSimpleNames.java @@ -0,0 +1,10 @@ +// "Add constructor parameters" "true" +class A { + private final int _field; + private final int field; + A(int field, int field1) { + _field = field; + this.field = field1; + } + +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createConstructorParameterFromField/beforeSameParameterSimpleNames.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createConstructorParameterFromField/beforeSameParameterSimpleNames.java new file mode 100644 index 000000000000..ecf24e7efb67 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createConstructorParameterFromField/beforeSameParameterSimpleNames.java @@ -0,0 +1,8 @@ +// "Add constructor parameters" "true" +class A { + private final int _field; + private final int field; + A() { + } + +} \ No newline at end of file