From a8f79fd185ba253b107071133eb0cca192c8b83d Mon Sep 17 00:00:00 2001 From: Alexandr Suhinin Date: Mon, 7 Feb 2022 16:21:12 +0200 Subject: [PATCH] IDEA-283316 [extract method] fix: inplace template should only rename inserted call GitOrigin-RevId: f6b2f583deb1726da8ac5672d94f55496c586ba0 --- .../newImpl/inplace/InplaceMethodExtractor.kt | 13 ++++++++++++- .../TemplateRenamesInsertedCallOnly.java | 10 ++++++++++ .../TemplateRenamesInsertedCallOnly_after.java | 17 +++++++++++++++++ .../ExtractMethodAndDuplicatesInplaceTest.kt | 4 ++++ 4 files changed, 43 insertions(+), 1 deletion(-) create mode 100644 java/java-tests/testData/refactoring/extractMethodAndDuplicatesInplace/TemplateRenamesInsertedCallOnly.java create mode 100644 java/java-tests/testData/refactoring/extractMethodAndDuplicatesInplace/TemplateRenamesInsertedCallOnly_after.java diff --git a/java/java-impl-refactorings/src/com/intellij/refactoring/extractMethod/newImpl/inplace/InplaceMethodExtractor.kt b/java/java-impl-refactorings/src/com/intellij/refactoring/extractMethod/newImpl/inplace/InplaceMethodExtractor.kt index c7b25ded4d46..1dcecad41833 100644 --- a/java/java-impl-refactorings/src/com/intellij/refactoring/extractMethod/newImpl/inplace/InplaceMethodExtractor.kt +++ b/java/java-impl-refactorings/src/com/intellij/refactoring/extractMethod/newImpl/inplace/InplaceMethodExtractor.kt @@ -15,6 +15,7 @@ import com.intellij.openapi.util.Disposer import com.intellij.openapi.util.Key import com.intellij.openapi.util.TextRange import com.intellij.psi.* +import com.intellij.psi.search.SearchScope import com.intellij.refactoring.extractMethod.ExtractMethodDialog import com.intellij.refactoring.extractMethod.ExtractMethodHandler import com.intellij.refactoring.extractMethod.newImpl.ExtractMethodHelper @@ -36,6 +37,7 @@ import com.intellij.refactoring.rename.inplace.InplaceRefactoring import com.intellij.refactoring.suggested.SuggestedRefactoringProvider import com.intellij.refactoring.suggested.range import com.intellij.refactoring.util.CommonRefactoringUtil +import com.intellij.util.SmartList import org.jetbrains.annotations.Nls class InplaceMethodExtractor(private val editor: Editor, @@ -160,6 +162,11 @@ class InplaceMethodExtractor(private val editor: Editor, return targetClass } + override fun collectRefs(referencesSearchScope: SearchScope?): MutableCollection { + val reference = call?.reference ?: return SmartList() + return SmartList(reference) + } + override fun revertState() { super.revertState() WriteCommandAction.runWriteCommandAction(myProject) { @@ -174,7 +181,11 @@ class InplaceMethodExtractor(private val editor: Editor, override fun afterTemplateStart() { setActiveExtractor(editor, this) - val templateState = TemplateManagerImpl.getTemplateState(myEditor) ?: return + val templateState = TemplateManagerImpl.getTemplateState(myEditor) + if (templateState == null) { + Disposer.dispose(disposable) + throw IllegalStateException("Failed to start code template.") + } Disposer.register(templateState) { SuggestedRefactoringProvider.getInstance(myProject).reset() } Disposer.register(templateState, disposable) super.afterTemplateStart() diff --git a/java/java-tests/testData/refactoring/extractMethodAndDuplicatesInplace/TemplateRenamesInsertedCallOnly.java b/java/java-tests/testData/refactoring/extractMethodAndDuplicatesInplace/TemplateRenamesInsertedCallOnly.java new file mode 100644 index 000000000000..6959e55e19c8 --- /dev/null +++ b/java/java-tests/testData/refactoring/extractMethodAndDuplicatesInplace/TemplateRenamesInsertedCallOnly.java @@ -0,0 +1,10 @@ +import static java.lang.Integer.getInteger; + +public abstract class Test { + + private void test() { + String integer = "4" + "2"; + int x = getInteger("0"); + System.out.println(integer); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/extractMethodAndDuplicatesInplace/TemplateRenamesInsertedCallOnly_after.java b/java/java-tests/testData/refactoring/extractMethodAndDuplicatesInplace/TemplateRenamesInsertedCallOnly_after.java new file mode 100644 index 000000000000..72d4a5e57e2a --- /dev/null +++ b/java/java-tests/testData/refactoring/extractMethodAndDuplicatesInplace/TemplateRenamesInsertedCallOnly_after.java @@ -0,0 +1,17 @@ +import org.jetbrains.annotations.NotNull; + +import static java.lang.Integer.getInteger; + +public abstract class Test { + + private void test() { + String integer = renamed(); + int x = getInteger("0"); + System.out.println(integer); + } + + @NotNull + private String renamed() { + return "4" + "2"; + } +} \ 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 06e19b436e54..ac7243b37c28 100644 --- a/java/java-tests/testSrc/com/intellij/java/refactoring/ExtractMethodAndDuplicatesInplaceTest.kt +++ b/java/java-tests/testSrc/com/intellij/java/refactoring/ExtractMethodAndDuplicatesInplaceTest.kt @@ -227,6 +227,10 @@ class ExtractMethodAndDuplicatesInplaceTest: LightJavaCodeInsightTestCase() { } } + fun testTemplateRenamesInsertedCallOnly(){ + doTest(changedName = "renamed") + } + fun testRefactoringListener(){ templateTest { configureByFile("$BASE_PATH/${getTestName(false)}.java")