From 1506531e599d19e4a537bc9bf800c2f65a2c3fd3 Mon Sep 17 00:00:00 2001 From: Alexey Sedunov Date: Mon, 15 Jun 2015 15:18:56 +0300 Subject: [PATCH] Rename: Fix class rename by constructor reference --- .../refactoring/rename/RenameJetClassProcessor.java | 10 ++++------ .../renameKotlinClassByConstructorRef/after/test.kt | 8 ++++++++ .../renameKotlinClassByConstructorRef/before/test.kt | 8 ++++++++ .../renameKotlinClassByConstructorRef/kotlinClass.test | 6 ++++++ .../idea/refactoring/rename/AbstractRenameTest.kt | 10 +++++++++- .../idea/refactoring/rename/RenameTestGenerated.java | 6 ++++++ 6 files changed, 41 insertions(+), 7 deletions(-) create mode 100644 idea/testData/refactoring/rename/renameKotlinClassByConstructorRef/after/test.kt create mode 100644 idea/testData/refactoring/rename/renameKotlinClassByConstructorRef/before/test.kt create mode 100644 idea/testData/refactoring/rename/renameKotlinClassByConstructorRef/kotlinClass.test diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/rename/RenameJetClassProcessor.java b/idea/src/org/jetbrains/kotlin/idea/refactoring/rename/RenameJetClassProcessor.java index 516cd436183..b6605564fec 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/rename/RenameJetClassProcessor.java +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/rename/RenameJetClassProcessor.java @@ -19,7 +19,6 @@ package org.jetbrains.kotlin.idea.refactoring.rename; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiElement; -import com.intellij.psi.util.PsiTreeUtil; import com.intellij.refactoring.RefactoringBundle; import com.intellij.refactoring.util.CommonRefactoringUtil; import org.jetbrains.annotations.NotNull; @@ -28,17 +27,16 @@ import org.jetbrains.kotlin.asJava.KotlinLightClass; import org.jetbrains.kotlin.asJava.KotlinLightClassForExplicitDeclaration; import org.jetbrains.kotlin.asJava.KotlinLightClassForPackage; import org.jetbrains.kotlin.idea.JetBundle; -import org.jetbrains.kotlin.psi.JetClass; import org.jetbrains.kotlin.psi.JetClassOrObject; +import org.jetbrains.kotlin.psi.JetConstructor; import org.jetbrains.kotlin.psi.JetFile; -import org.jetbrains.kotlin.psi.JetSecondaryConstructor; import java.util.Map; public class RenameJetClassProcessor extends RenameKotlinPsiProcessor { @Override public boolean canProcessElement(@NotNull PsiElement element) { - return element instanceof JetClassOrObject || element instanceof KotlinLightClass || element instanceof JetSecondaryConstructor; + return element instanceof JetClassOrObject || element instanceof KotlinLightClass || element instanceof JetConstructor; } @Nullable @@ -86,8 +84,8 @@ public class RenameJetClassProcessor extends RenameKotlinPsiProcessor { assert false : "Should not be suggested to rename element of type " + element.getClass() + " " + element; } } - else if (element instanceof JetSecondaryConstructor) { - return PsiTreeUtil.getParentOfType(element, JetClassOrObject.class); + else if (element instanceof JetConstructor) { + return ((JetConstructor) element).getContainingClassOrObject(); } return (JetClassOrObject) element; diff --git a/idea/testData/refactoring/rename/renameKotlinClassByConstructorRef/after/test.kt b/idea/testData/refactoring/rename/renameKotlinClassByConstructorRef/after/test.kt new file mode 100644 index 00000000000..62d85bae30c --- /dev/null +++ b/idea/testData/refactoring/rename/renameKotlinClassByConstructorRef/after/test.kt @@ -0,0 +1,8 @@ +package testing.rename + +public open class B() { +} + +fun test() { + /*rename*/B() +} \ No newline at end of file diff --git a/idea/testData/refactoring/rename/renameKotlinClassByConstructorRef/before/test.kt b/idea/testData/refactoring/rename/renameKotlinClassByConstructorRef/before/test.kt new file mode 100644 index 00000000000..98e3d1bb817 --- /dev/null +++ b/idea/testData/refactoring/rename/renameKotlinClassByConstructorRef/before/test.kt @@ -0,0 +1,8 @@ +package testing.rename + +public open class A() { +} + +fun test() { + /*rename*/A() +} \ No newline at end of file diff --git a/idea/testData/refactoring/rename/renameKotlinClassByConstructorRef/kotlinClass.test b/idea/testData/refactoring/rename/renameKotlinClassByConstructorRef/kotlinClass.test new file mode 100644 index 00000000000..1f953750c8f --- /dev/null +++ b/idea/testData/refactoring/rename/renameKotlinClassByConstructorRef/kotlinClass.test @@ -0,0 +1,6 @@ +{ + "type": "MARKED_ELEMENT", + "mainFile": "test.kt", + "newName": "B", + "byRef": "true" +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/refactoring/rename/AbstractRenameTest.kt b/idea/tests/org/jetbrains/kotlin/idea/refactoring/rename/AbstractRenameTest.kt index fe0ac8b66be..43fcd156d01 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/refactoring/rename/AbstractRenameTest.kt +++ b/idea/tests/org/jetbrains/kotlin/idea/refactoring/rename/AbstractRenameTest.kt @@ -18,6 +18,7 @@ package org.jetbrains.kotlin.idea.refactoring.rename import com.google.gson.JsonObject import com.google.gson.JsonParser +import com.intellij.codeInsight.TargetElementUtilBase import com.intellij.openapi.extensions.Extensions import com.intellij.openapi.fileEditor.FileDocumentManager import com.intellij.openapi.module.Module @@ -138,7 +139,14 @@ public abstract class AbstractRenameTest : KotlinMultiFileTestCase() { val marker = psiFile.getText().indexOf(MARKER_TEXT) assert(marker != -1) - val toRename = psiFile.findElementAt(marker + MARKER_TEXT.length())!!.getNonStrictParentOfType()!! + val toRename = if (renameParamsObject["byRef"]?.getAsBoolean() ?: false) { + val editor = createEditor(mainFile) + editor.getCaretModel().moveToOffset(marker + MARKER_TEXT.length()) + TargetElementUtilBase.findTargetElement(editor, TargetElementUtilBase.getInstance().getAllAccepted())!! + } + else { + psiFile.findElementAt(marker + MARKER_TEXT.length())!!.getNonStrictParentOfType()!! + } val substitution = RenamePsiElementProcessor.forElement(toRename).substituteElementToRename(toRename, null) runRenameProcessor(context, newName, substitution, true, true) diff --git a/idea/tests/org/jetbrains/kotlin/idea/refactoring/rename/RenameTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/refactoring/rename/RenameTestGenerated.java index bb3cadc9157..536fce18bfd 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/refactoring/rename/RenameTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/refactoring/rename/RenameTestGenerated.java @@ -221,6 +221,12 @@ public class RenameTestGenerated extends AbstractRenameTest { doTest(fileName); } + @TestMetadata("renameKotlinClassByConstructorRef/kotlinClass.test") + public void testRenameKotlinClassByConstructorRef_KotlinClass() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/refactoring/rename/renameKotlinClassByConstructorRef/kotlinClass.test"); + doTest(fileName); + } + @TestMetadata("renameKotlinClassConstructor/renameKotlinConstructor.test") public void testRenameKotlinClassConstructor_RenameKotlinConstructor() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/testData/refactoring/rename/renameKotlinClassConstructor/renameKotlinConstructor.test");