From 8e57917700e5fb7a12e7526b8cd65d26aab71bba Mon Sep 17 00:00:00 2001 From: Tagir Valeev Date: Wed, 29 Nov 2023 10:40:45 +0100 Subject: [PATCH] [mod-commands] Rename: clear selection before the rename. Otherwise, renamer tries to rename the selected symbol instead Fixes IDEA-335357 Replace constructor with factory method renames also constructor GitOrigin-RevId: 93b5b9a8bcaabdb99796222b29449780dab7558a --- .../afterWithSelection.java | 17 ++++++++++++++ .../beforeWithSelection.java | 14 +++++++++++ .../ReplaceConstructorWithFactoryTest.java | 23 +++++++++++++++++++ .../modcommand/ModCommandExecutorImpl.java | 1 + 4 files changed, 55 insertions(+) create mode 100644 java/java-tests/testData/refactoring/replaceConstructorWithFactory/afterWithSelection.java create mode 100644 java/java-tests/testData/refactoring/replaceConstructorWithFactory/beforeWithSelection.java diff --git a/java/java-tests/testData/refactoring/replaceConstructorWithFactory/afterWithSelection.java b/java/java-tests/testData/refactoring/replaceConstructorWithFactory/afterWithSelection.java new file mode 100644 index 000000000000..e4e567d444b7 --- /dev/null +++ b/java/java-tests/testData/refactoring/replaceConstructorWithFactory/afterWithSelection.java @@ -0,0 +1,17 @@ +public class Main { + + private String s; + private int i; + + private Main() { + + } + public Main(String s, int i) { + this.s = s; + this.i = i; + } + + public static Main newMain() { + return new Main(); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/replaceConstructorWithFactory/beforeWithSelection.java b/java/java-tests/testData/refactoring/replaceConstructorWithFactory/beforeWithSelection.java new file mode 100644 index 000000000000..6de82bba0672 --- /dev/null +++ b/java/java-tests/testData/refactoring/replaceConstructorWithFactory/beforeWithSelection.java @@ -0,0 +1,14 @@ +public class Main { + + private String s; + private int i; + + public Main() { + + } + public Main(String s, int i) { + this.s = s; + this.i = i; + } + +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/java/refactoring/ReplaceConstructorWithFactoryTest.java b/java/java-tests/testSrc/com/intellij/java/refactoring/ReplaceConstructorWithFactoryTest.java index 3a82276e5939..e88a58746e48 100644 --- a/java/java-tests/testSrc/com/intellij/java/refactoring/ReplaceConstructorWithFactoryTest.java +++ b/java/java-tests/testSrc/com/intellij/java/refactoring/ReplaceConstructorWithFactoryTest.java @@ -3,6 +3,11 @@ package com.intellij.java.refactoring; import com.intellij.JavaTestUtil; import com.intellij.codeInsight.intention.ReplaceConstructorWithFactoryAction; +import com.intellij.codeInsight.lookup.LookupElement; +import com.intellij.codeInsight.lookup.LookupEx; +import com.intellij.codeInsight.lookup.LookupManager; +import com.intellij.codeInsight.lookup.impl.LookupImpl; +import com.intellij.codeInsight.template.impl.TemplateManagerImpl; import com.intellij.ide.IdeEventQueue; import com.intellij.modcommand.ActionContext; import com.intellij.modcommand.ModCommand; @@ -10,6 +15,7 @@ import com.intellij.modcommand.ModCommandExecutor; import com.intellij.modcommand.Presentation; import com.intellij.ui.ChooserInterceptor; import com.intellij.ui.UiInterceptors; +import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; @@ -23,6 +29,23 @@ public class ReplaceConstructorWithFactoryTest extends LightRefactoringTestCase } public void testEmptyConstructor() { runTest("01", null); } + + public void testWithSelection() { + TemplateManagerImpl.setTemplateTesting(getTestRootDisposable()); + configureByFile("/refactoring/replaceConstructorWithFactory/beforeWithSelection.java"); + ReplaceConstructorWithFactoryAction action = new ReplaceConstructorWithFactoryAction(); + ActionContext context = ActionContext.from(getEditor(), getFile()); + Presentation presentation = action.getPresentation(context); + assertNotNull(presentation); + ModCommand command = action.perform(context); + ModCommandExecutor.getInstance().executeInteractively(context, command, getEditor()); + final LookupEx lookup = LookupManager.getActiveLookup(getEditor()); + assertNotNull(lookup); + LookupElement newMain = ContainerUtil.find(lookup.getItems(), l -> l.getLookupString().equals("newMain")); + assertNotNull(newMain); + ((LookupImpl)lookup).finishLookup('\n', newMain); + checkResultByFile("/refactoring/replaceConstructorWithFactory/afterWithSelection.java"); + } public void testSubclass() { runTest("02", null); } diff --git a/platform/lang-impl/src/com/intellij/lang/impl/modcommand/ModCommandExecutorImpl.java b/platform/lang-impl/src/com/intellij/lang/impl/modcommand/ModCommandExecutorImpl.java index 0051f4fdbad0..aa22c6b0dd2e 100644 --- a/platform/lang-impl/src/com/intellij/lang/impl/modcommand/ModCommandExecutorImpl.java +++ b/platform/lang-impl/src/com/intellij/lang/impl/modcommand/ModCommandExecutorImpl.java @@ -417,6 +417,7 @@ public class ModCommandExecutorImpl implements ModCommandExecutor { .build(); PsiElement anchor = namedElement instanceof PsiNameIdentifierOwner owner ? requireNonNullElse(owner.getNameIdentifier(), namedElement) : namedElement; + finalEditor.getSelectionModel().removeSelection(); finalEditor.getCaretModel().moveToOffset(anchor.getTextOffset()); Renamer renamer = RenamerFactory.EP_NAME.getExtensionList().stream().flatMap(factory -> factory.createRenamers(finalContext).stream()) .findFirst().orElse(null);