From 37841f9d73abef4953145b564e22babb94f1d999 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Thu, 4 Dec 2014 14:10:50 +0100 Subject: [PATCH] extract method: resolve conflicts during params rename (IDEABKL-3749) --- .../extractMethod/ExtractMethodProcessor.java | 5 ++++- .../DefaultNamesConflictResolution.java | 7 +++++++ .../DefaultNamesConflictResolution_after.java | 11 +++++++++++ .../com/intellij/refactoring/ExtractMethodTest.java | 12 ++++++++++++ 4 files changed, 34 insertions(+), 1 deletion(-) create mode 100644 java/java-tests/testData/refactoring/extractMethod/DefaultNamesConflictResolution.java create mode 100644 java/java-tests/testData/refactoring/extractMethod/DefaultNamesConflictResolution_after.java diff --git a/java/java-impl/src/com/intellij/refactoring/extractMethod/ExtractMethodProcessor.java b/java/java-impl/src/com/intellij/refactoring/extractMethod/ExtractMethodProcessor.java index ba4c2471c7ce..76717fa50985 100644 --- a/java/java-impl/src/com/intellij/refactoring/extractMethod/ExtractMethodProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/extractMethod/ExtractMethodProcessor.java @@ -1239,7 +1239,10 @@ public class ExtractMethodProcessor implements MatchProvider { } private void renameInputVariables() throws IncorrectOperationException { - for (VariableData data : myVariableDatum) { + //when multiple input variables should have the same name, unique names are generated + //without reverse, the second rename would rename variable without a prefix into second one though it was already renamed + for (int i = myVariableDatum.length - 1; i >= 0; i--) { + VariableData data = myVariableDatum[i]; PsiVariable variable = data.variable; if (!data.name.equals(variable.getName())) { for (PsiElement element : myElements) { diff --git a/java/java-tests/testData/refactoring/extractMethod/DefaultNamesConflictResolution.java b/java/java-tests/testData/refactoring/extractMethod/DefaultNamesConflictResolution.java new file mode 100644 index 000000000000..9acf21ea6efb --- /dev/null +++ b/java/java-tests/testData/refactoring/extractMethod/DefaultNamesConflictResolution.java @@ -0,0 +1,7 @@ +class X { + public static void main(String[] args) { + boolean _user = true; + String user = "foo"; + System.out.println(_user + " " + user); + } +} diff --git a/java/java-tests/testData/refactoring/extractMethod/DefaultNamesConflictResolution_after.java b/java/java-tests/testData/refactoring/extractMethod/DefaultNamesConflictResolution_after.java new file mode 100644 index 000000000000..0749b6ad85a7 --- /dev/null +++ b/java/java-tests/testData/refactoring/extractMethod/DefaultNamesConflictResolution_after.java @@ -0,0 +1,11 @@ +class X { + public static void main(String[] args) { + boolean _user = true; + String user = "foo"; + newMethod(_user, user); + } + + private static void newMethod(boolean user, String user2) { + System.out.println(user + " " + user2); + } +} diff --git a/java/java-tests/testSrc/com/intellij/refactoring/ExtractMethodTest.java b/java/java-tests/testSrc/com/intellij/refactoring/ExtractMethodTest.java index 58678084b5d0..13b7300eb00a 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/ExtractMethodTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/ExtractMethodTest.java @@ -646,6 +646,18 @@ public class ExtractMethodTest extends LightCodeInsightTestCase { doTestPassFieldsAsParams(); } + public void testDefaultNamesConflictResolution() throws Exception { + final CodeStyleSettings settings = CodeStyleSettingsManager.getSettings(getProject()); + final String oldPrefix = settings.LOCAL_VARIABLE_NAME_PREFIX; + try { + settings.LOCAL_VARIABLE_NAME_PREFIX = "_"; + doTest(); + } + finally { + settings.LOCAL_VARIABLE_NAME_PREFIX = oldPrefix; + } + } + public void testCantPassFieldAsParameter() throws Exception { try { doTestPassFieldsAsParams();