From 7bce69f60f81629c2a4b2d7f6fe4090e3eaa92b4 Mon Sep 17 00:00:00 2001 From: Alexandr Suhinin Date: Thu, 9 Dec 2021 11:16:37 +0200 Subject: [PATCH] [extract method] fix: don't declare variable twice GitOrigin-RevId: a7b8bcccb1e4bf4fb5ea35975f12767dae882813 --- .../newImpl/ExtractMethodAnalyzer.kt | 3 ++- .../ChangedVariableDeclaredOnce.java | 7 +++++++ .../ChangedVariableDeclaredOnce_after.java | 15 +++++++++++++++ .../ExtractMethodAndDuplicatesInplaceTest.kt | 4 ++++ 4 files changed, 28 insertions(+), 1 deletion(-) create mode 100644 java/java-tests/testData/refactoring/extractMethodAndDuplicatesInplace/ChangedVariableDeclaredOnce.java create mode 100644 java/java-tests/testData/refactoring/extractMethodAndDuplicatesInplace/ChangedVariableDeclaredOnce_after.java diff --git a/java/java-impl/src/com/intellij/refactoring/extractMethod/newImpl/ExtractMethodAnalyzer.kt b/java/java-impl/src/com/intellij/refactoring/extractMethod/newImpl/ExtractMethodAnalyzer.kt index 074cdd8e677c..60b6e64dffdc 100644 --- a/java/java-impl/src/com/intellij/refactoring/extractMethod/newImpl/ExtractMethodAnalyzer.kt +++ b/java/java-impl/src/com/intellij/refactoring/extractMethod/newImpl/ExtractMethodAnalyzer.kt @@ -74,7 +74,8 @@ fun findExtractOptions(elements: List): ExtractOptions { .map { it.copy(type = normalizeType(it.type)) } val parameterNames = inputParameters.map { it.name }.toSet() - val exposedVariables = analyzer.findExposedLocalDeclarations() + val outputVariable = (dataOutput as? VariableOutput)?.variable + val exposedVariables = analyzer.findExposedLocalDeclarations().filter { exposedVariable -> exposedVariable != outputVariable } extractOptions = extractOptions.copy( dataOutput = normalizeDataOutput(dataOutput, flowOutput, elements, exposedVariables.mapNotNull { it.name }), diff --git a/java/java-tests/testData/refactoring/extractMethodAndDuplicatesInplace/ChangedVariableDeclaredOnce.java b/java/java-tests/testData/refactoring/extractMethodAndDuplicatesInplace/ChangedVariableDeclaredOnce.java new file mode 100644 index 000000000000..23cc87f13c4c --- /dev/null +++ b/java/java-tests/testData/refactoring/extractMethodAndDuplicatesInplace/ChangedVariableDeclaredOnce.java @@ -0,0 +1,7 @@ +public class Test { + void test(boolean condition) { + String s = "42"; + if (condition) s = "new"; + System.out.println(s); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/extractMethodAndDuplicatesInplace/ChangedVariableDeclaredOnce_after.java b/java/java-tests/testData/refactoring/extractMethodAndDuplicatesInplace/ChangedVariableDeclaredOnce_after.java new file mode 100644 index 000000000000..3b0098f7a646 --- /dev/null +++ b/java/java-tests/testData/refactoring/extractMethodAndDuplicatesInplace/ChangedVariableDeclaredOnce_after.java @@ -0,0 +1,15 @@ +import org.jetbrains.annotations.NotNull; + +public class Test { + void test(boolean condition) { + String s = getString(); + if (condition) s = "new"; + System.out.println(s); + } + + @NotNull + private String getString() { + String s = "42"; + return s; + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/java/refactoring/ExtractMethodAndDuplicatesInplaceTest.kt b/java/java-tests/testSrc/com/intellij/java/refactoring/ExtractMethodAndDuplicatesInplaceTest.kt index 5a90bf967cdf..68ebca487677 100644 --- a/java/java-tests/testSrc/com/intellij/java/refactoring/ExtractMethodAndDuplicatesInplaceTest.kt +++ b/java/java-tests/testSrc/com/intellij/java/refactoring/ExtractMethodAndDuplicatesInplaceTest.kt @@ -202,6 +202,10 @@ class ExtractMethodAndDuplicatesInplaceTest: LightJavaCodeInsightTestCase() { doTest() } + fun testChangedVariableDeclaredOnce(){ + doTest() + } + fun testRefactoringListener(){ templateTest { configureByFile("$BASE_PATH/${getTestName(false)}.java")