From 05bf2e75165cee3170e71a3dd6dcc2c852c545ff Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Tue, 10 Nov 2015 20:45:05 +0100 Subject: [PATCH] rename field: ensure parameters through setters hierarchy is renamed (IDEA-146229) --- .../rename/RenameJavaVariableProcessor.java | 58 ++++++++++++++----- ...afterOverridingSetterParameterRenamed.java | 15 +++++ ...eforeOverridingSetterParameterRenamed.java | 16 +++++ .../intellij/refactoring/RenameFieldTest.java | 4 ++ 4 files changed, 78 insertions(+), 15 deletions(-) create mode 100644 java/java-tests/testData/refactoring/renameField/afterOverridingSetterParameterRenamed.java create mode 100644 java/java-tests/testData/refactoring/renameField/beforeOverridingSetterParameterRenamed.java diff --git a/java/java-impl/src/com/intellij/refactoring/rename/RenameJavaVariableProcessor.java b/java/java-impl/src/com/intellij/refactoring/rename/RenameJavaVariableProcessor.java index 73623205b438..24fd28be4c8d 100644 --- a/java/java-impl/src/com/intellij/refactoring/rename/RenameJavaVariableProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/rename/RenameJavaVariableProcessor.java @@ -46,7 +46,10 @@ import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.*; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.Map; public class RenameJavaVariableProcessor extends RenameJavaMemberProcessor { private static final Logger LOG = Logger.getInstance("#com.intellij.refactoring.rename.RenameJavaVariableProcessor"); @@ -147,7 +150,7 @@ public class RenameJavaVariableProcessor extends RenameJavaMemberProcessor { final JavaCodeStyleManager manager = JavaCodeStyleManager.getInstance(project); final String propertyName = PropertyUtil.suggestPropertyName(field, field.getName()); - String newPropertyName = PropertyUtil.suggestPropertyName(field, newName); + final String newPropertyName = PropertyUtil.suggestPropertyName(field, newName); boolean isStatic = field.hasModifierProperty(PsiModifier.STATIC); @@ -158,9 +161,7 @@ public class RenameJavaVariableProcessor extends RenameJavaMemberProcessor { boolean shouldRenameSetterParameter = false; if (setter != null) { - String parameterName = manager.propertyNameToVariableName(propertyName, VariableKind.PARAMETER); - PsiParameter setterParameter = setter.getParameterList().getParameters()[0]; - shouldRenameSetterParameter = parameterName.equals(setterParameter.getName()); + shouldRenameSetterParameter = shouldRenameSetterParameter(manager, propertyName, setter); } if (getters != null) { @@ -224,18 +225,21 @@ public class RenameJavaVariableProcessor extends RenameJavaMemberProcessor { if (newGetterName == null) { newGetterName = PropertyUtil.suggestGetterName(newPropertyName, field.getType(), getter.getName()); } - addOverriddenAndImplemented(getter, newGetterName, allRenames); + addOverriddenAndImplemented(getter, newGetterName, null, propertyName, manager, allRenames); } } if (setter != null) { - addOverriddenAndImplemented(setter, newSetterName, allRenames); + addOverriddenAndImplemented(setter, newSetterName, shouldRenameSetterParameter ? newPropertyName : null, propertyName, manager, allRenames); } + } - if (shouldRenameSetterParameter) { - PsiParameter parameter = setter.getParameterList().getParameters()[0]; - allRenames.put(parameter, manager.propertyNameToVariableName(newPropertyName, VariableKind.PARAMETER)); - } + private static boolean shouldRenameSetterParameter(JavaCodeStyleManager manager, String propertyName, PsiMethod setter) { + boolean shouldRenameSetterParameter; + String parameterName = manager.propertyNameToVariableName(propertyName, VariableKind.PARAMETER); + PsiParameter setterParameter = setter.getParameterList().getParameters()[0]; + shouldRenameSetterParameter = parameterName.equals(setterParameter.getName()); + return shouldRenameSetterParameter; } private static boolean askToRenameAccesors(PsiMethod getter, PsiMethod setter, String newName, final Project project) { @@ -244,8 +248,13 @@ public class RenameJavaVariableProcessor extends RenameJavaMemberProcessor { return Messages.showYesNoDialog(project, text, RefactoringBundle.message("rename.title"), Messages.getQuestionIcon()) != Messages.YES; } - private static void addOverriddenAndImplemented(PsiMethod methodPrototype, final String newName, final Map allRenames) { - allRenames.put(methodPrototype, newName); + private static void addOverriddenAndImplemented(@NotNull final PsiMethod methodPrototype, + @NotNull final String newName, + @Nullable final String newPropertyName, + @NotNull final String oldParameterName, + @NotNull final JavaCodeStyleManager manager, + @NotNull final Map allRenames) { + addGetterOrSetterWithParameter(methodPrototype, newName, newPropertyName, oldParameterName, manager, allRenames); PsiMethod[] methods = methodPrototype.findDeepestSuperMethods(); if (methods.length == 0) { methods = new PsiMethod[] {methodPrototype}; @@ -254,11 +263,30 @@ public class RenameJavaVariableProcessor extends RenameJavaMemberProcessor { OverridingMethodsSearch.search(method).forEach(new Processor() { public boolean process(PsiMethod psiMethod) { RenameProcessor.assertNonCompileElement(psiMethod); - allRenames.put(psiMethod, newName); + addGetterOrSetterWithParameter(psiMethod, newName, newPropertyName, oldParameterName, manager, allRenames); return true; } }); - allRenames.put(method, newName); + + addGetterOrSetterWithParameter(method, newName, newPropertyName, oldParameterName, manager, allRenames); + } + } + + public static void addGetterOrSetterWithParameter(@NotNull PsiMethod methodPrototype, + @NotNull String newName, + @Nullable String newPropertyName, + @NotNull String oldParameterName, + @NotNull JavaCodeStyleManager manager, + @NotNull Map allRenames) { + + allRenames.put(methodPrototype, newName); + if (newPropertyName != null) { + final PsiParameter[] parameters = methodPrototype.getParameterList().getParameters(); + LOG.assertTrue(parameters.length > 0, methodPrototype.getName()); + PsiParameter parameter = parameters[0]; + if (shouldRenameSetterParameter(manager, oldParameterName , methodPrototype)) { + allRenames.put(parameter, manager.propertyNameToVariableName(newPropertyName, VariableKind.PARAMETER)); + } } } diff --git a/java/java-tests/testData/refactoring/renameField/afterOverridingSetterParameterRenamed.java b/java/java-tests/testData/refactoring/renameField/afterOverridingSetterParameterRenamed.java new file mode 100644 index 000000000000..daf4812d2af4 --- /dev/null +++ b/java/java-tests/testData/refactoring/renameField/afterOverridingSetterParameterRenamed.java @@ -0,0 +1,15 @@ +interface I { + void setBar(int o); +} + +interface Foo { + void setBar(int bar); +} + +class Bar implements Foo, I { + int bar; + + public void setBar(int bar) { + this.bar = bar; + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/renameField/beforeOverridingSetterParameterRenamed.java b/java/java-tests/testData/refactoring/renameField/beforeOverridingSetterParameterRenamed.java new file mode 100644 index 000000000000..82e0587243b6 --- /dev/null +++ b/java/java-tests/testData/refactoring/renameField/beforeOverridingSetterParameterRenamed.java @@ -0,0 +1,16 @@ +interface I { + void setFoo(int o); +} + +interface Foo { + void setFoo(int foo); +} + +class Bar implements Foo, I { + int foo; + + @Override + public void setFoo(int foo) { + this.foo = foo; + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/refactoring/RenameFieldTest.java b/java/java-tests/testSrc/com/intellij/refactoring/RenameFieldTest.java index 62e5f327aa11..0020cb0488f4 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/RenameFieldTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/RenameFieldTest.java @@ -64,6 +64,10 @@ public class RenameFieldTest extends LightRefactoringTestCase { doTest("utm", "java"); } + public void testOverridingSetterParameterRenamed() throws Exception { + doTest("bar", "java"); + } + public void testHidesOuter() throws Exception { doTest("x", "java"); }