diff --git a/java/java-impl/src/com/intellij/refactoring/extractMethod/JavaDuplicatesExtractMethodProcessor.java b/java/java-impl/src/com/intellij/refactoring/extractMethod/JavaDuplicatesExtractMethodProcessor.java index 9cc5831b4517..5a64d2fa08e4 100644 --- a/java/java-impl/src/com/intellij/refactoring/extractMethod/JavaDuplicatesExtractMethodProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/extractMethod/JavaDuplicatesExtractMethodProcessor.java @@ -53,16 +53,16 @@ public class JavaDuplicatesExtractMethodProcessor extends ExtractMethodProcessor myArtificialOutputVariable = variablesMapping.getOrDefault(from.myArtificialOutputVariable, from.myArtificialOutputVariable); List variableDatum = new ArrayList<>(); + List inputVariables = getInputVariables().getInputVariables(); for (int i = 0; i < from.myVariableDatum.length; i++) { VariableData fromData = from.myVariableDatum[i]; PsiVariable mappedVariable = variablesMapping.get(fromData.variable); - if (isReferenced(mappedVariable, fromData.variable)) { + if (isReferenced(mappedVariable, fromData.variable) && isUnchanged(mappedVariable, fromData.type, inputVariables)) { VariableData newData = fromData.substitute(mappedVariable); variableDatum.add(newData); } } Set parameterVariables = ContainerUtil.map2Set(variableDatum, data -> data.variable); - List inputVariables = getInputVariables().getInputVariables(); for (VariableData data : inputVariables) { if (!parameterVariables.contains(data.variable)) { variableDatum.add(data); @@ -71,6 +71,15 @@ public class JavaDuplicatesExtractMethodProcessor extends ExtractMethodProcessor myVariableDatum = variableDatum.toArray(new VariableData[0]); } + private static boolean isUnchanged(PsiVariable fromVariable, PsiType fromType, @NotNull List inputVariables) { + for (VariableData data : inputVariables) { + if (data.variable == fromVariable) { + return data.type != null && data.type.equalsToText(fromType.getCanonicalText()); + } + } + return true; + } + public void applyFromSnapshot(@NotNull ExtractMethodSnapshot from) { myMethodName = from.myMethodName; myStatic = from.myStatic; diff --git a/java/java-tests/testData/refactoring/extractMethod/ParametrizedDuplicateUnfoldArrayArgument.java b/java/java-tests/testData/refactoring/extractMethod/ParametrizedDuplicateUnfoldArrayArgument.java new file mode 100644 index 000000000000..6246b72512d1 --- /dev/null +++ b/java/java-tests/testData/refactoring/extractMethod/ParametrizedDuplicateUnfoldArrayArgument.java @@ -0,0 +1,17 @@ +class DeclaredOutputVariable { + void foo(String[] a) { + + String s = a[1]; + if (s == null) return; + System.out.println(s.charAt(1)); + + System.out.println(s.length()); + } + + void bar(String[] a) { + String s = a[2]; + if (s == null) return; + System.out.println(s.charAt(2)); + System.out.println(s.length()); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/extractMethod/ParametrizedDuplicateUnfoldArrayArgument_after.java b/java/java-tests/testData/refactoring/extractMethod/ParametrizedDuplicateUnfoldArrayArgument_after.java new file mode 100644 index 000000000000..af976f4e3a07 --- /dev/null +++ b/java/java-tests/testData/refactoring/extractMethod/ParametrizedDuplicateUnfoldArrayArgument_after.java @@ -0,0 +1,25 @@ +import org.jetbrains.annotations.Nullable; + +class DeclaredOutputVariable { + void foo(String[] a) { + + String s = newMethod(a, 1); + if (s == null) return; + + System.out.println(s.length()); + } + + @Nullable + private String newMethod(String[] a, int i) { + String s = a[i]; + if (s == null) return null; + System.out.println(s.charAt(i)); + return s; + } + + void bar(String[] a) { + String s = newMethod(a, 2); + if (s == null) return; + System.out.println(s.length()); + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/java/refactoring/ExtractMethodTest.java b/java/java-tests/testSrc/com/intellij/java/refactoring/ExtractMethodTest.java index d5f34236d612..68eb28cf3d08 100644 --- a/java/java-tests/testSrc/com/intellij/java/refactoring/ExtractMethodTest.java +++ b/java/java-tests/testSrc/com/intellij/java/refactoring/ExtractMethodTest.java @@ -889,6 +889,10 @@ public class ExtractMethodTest extends LightCodeInsightTestCase { doDuplicatesTest(); } + public void testParametrizedDuplicateUnfoldArrayArgument() throws Exception { + doDuplicatesTest(); + } + public void testSuggestChangeSignatureWithChangedParameterName() throws Exception { configureByFile(BASE_PATH + getTestName(false) + ".java"); boolean success = performExtractMethod(true, true, getEditor(), getFile(), getProject(), false, null, false, "p");