From a664f8b8d60c67f2055d95bbb02e042571ca159a Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Fri, 17 Jun 2016 15:43:48 +0300 Subject: [PATCH] extract method: ensure call arguments are not changed during body substitution --- .../refactoring/extractMethod/ParametersFolder.java | 6 ++++-- .../extractMethod/FoldedWithNestedExpressions_after.java | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/java/java-analysis-impl/src/com/intellij/refactoring/extractMethod/ParametersFolder.java b/java/java-analysis-impl/src/com/intellij/refactoring/extractMethod/ParametersFolder.java index 1005a19a73af..4a21a5610ad8 100644 --- a/java/java-analysis-impl/src/com/intellij/refactoring/extractMethod/ParametersFolder.java +++ b/java/java-analysis-impl/src/com/intellij/refactoring/extractMethod/ParametersFolder.java @@ -41,6 +41,7 @@ import java.util.*; public class ParametersFolder { private final Map myExpressions = new HashMap(); + private final Map myArgs = new HashMap<>(); private final Map> myMentionedInExpressions = new HashMap>(); private final Set myUsedNames = new HashSet(); @@ -84,7 +85,7 @@ public class ParametersFolder { } public void foldParameterUsagesInBody(@NotNull List datum, PsiElement[] elements, SearchScope scope) { - Map> equivalentExpressions = new HashMap<>(); + Map> equivalentExpressions = new LinkedHashMap<>(); for (VariableData data : datum) { if (myDeleted.contains(data.variable)) continue; final PsiExpression psiExpression = myExpressions.get(data.variable); @@ -142,6 +143,7 @@ public class ParametersFolder { if (mostRanked != null) { myExpressions.put(data.variable, mostRanked); + myArgs.put(data.variable, mostRanked.getText()); data.type = RefactoringChangeUtil.getTypeByExpression(mostRanked); final JavaCodeStyleManager codeStyleManager = JavaCodeStyleManager.getInstance(mostRanked.getProject()); final SuggestedNameInfo nameInfo = codeStyleManager.suggestVariableName(VariableKind.PARAMETER, null, mostRanked, data.type); @@ -293,7 +295,7 @@ public class ParametersFolder { @NotNull public String getGeneratedCallArgument(@NotNull VariableData data) { - return myExpressions.containsKey(data.variable) ? myExpressions.get(data.variable).getText() : data.variable.getName(); + return myArgs.containsKey(data.variable) ? myArgs.get(data.variable) : data.variable.getName(); } public boolean annotateWithParameter(@NotNull VariableData data, @NotNull PsiElement element) { diff --git a/java/java-tests/testData/refactoring/extractMethod/FoldedWithNestedExpressions_after.java b/java/java-tests/testData/refactoring/extractMethod/FoldedWithNestedExpressions_after.java index bd90a8b60ee3..3c28513617cf 100644 --- a/java/java-tests/testData/refactoring/extractMethod/FoldedWithNestedExpressions_after.java +++ b/java/java-tests/testData/refactoring/extractMethod/FoldedWithNestedExpressions_after.java @@ -1,6 +1,6 @@ class Test { void h(int i, String[] s, String[] t) { - final String s1 = newMethod(t[i], s[x.length()]); + final String s1 = newMethod(t[i], s[t[i].length()]); System.out.println(s1); }