From 25de64c6ab0543a3ff4e3b9a53d0b515041f7d2d Mon Sep 17 00:00:00 2001 From: Denis Zharkov Date: Fri, 13 Mar 2015 11:33:20 +0300 Subject: [PATCH] Support class rename in place of secondary ctor call --- .../asJava/KotlinLightClassForExplicitDeclaration.java | 3 ++- .../refactoring/rename/RenameJetClassProcessor.java | 8 +++++++- .../after/RenameKotlinClassSecondaryConstructor.kt | 10 ++++++++++ .../before/RenameKotlinClassSecondaryConstructor.kt | 10 ++++++++++ .../renameKotlinSecondaryConstructor.test | 5 +++++ .../idea/refactoring/rename/RenameTestGenerated.java | 6 ++++++ 6 files changed, 40 insertions(+), 2 deletions(-) create mode 100644 idea/testData/refactoring/rename/renameKotlinClassSecondaryConstructor/after/RenameKotlinClassSecondaryConstructor.kt create mode 100644 idea/testData/refactoring/rename/renameKotlinClassSecondaryConstructor/before/RenameKotlinClassSecondaryConstructor.kt create mode 100644 idea/testData/refactoring/rename/renameKotlinClassSecondaryConstructor/renameKotlinSecondaryConstructor.test diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/KotlinLightClassForExplicitDeclaration.java b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/KotlinLightClassForExplicitDeclaration.java index ea9b4916a5d..445ce36706d 100644 --- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/KotlinLightClassForExplicitDeclaration.java +++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/KotlinLightClassForExplicitDeclaration.java @@ -548,7 +548,8 @@ public class KotlinLightClassForExplicitDeclaration extends KotlinWrappingLightC @Override public PsiElement setName(@NonNls @NotNull String name) throws IncorrectOperationException { - throw new IncorrectOperationException("Cannot modify compiled kotlin element"); + getOrigin().setName(name); + return this; } @Override 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 54e039b415d..516cd436183 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/rename/RenameJetClassProcessor.java +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/rename/RenameJetClassProcessor.java @@ -19,6 +19,7 @@ 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; @@ -27,15 +28,17 @@ 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.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; + return element instanceof JetClassOrObject || element instanceof KotlinLightClass || element instanceof JetSecondaryConstructor; } @Nullable @@ -83,6 +86,9 @@ 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); + } return (JetClassOrObject) element; } diff --git a/idea/testData/refactoring/rename/renameKotlinClassSecondaryConstructor/after/RenameKotlinClassSecondaryConstructor.kt b/idea/testData/refactoring/rename/renameKotlinClassSecondaryConstructor/after/RenameKotlinClassSecondaryConstructor.kt new file mode 100644 index 00000000000..6660b2748ad --- /dev/null +++ b/idea/testData/refactoring/rename/renameKotlinClassSecondaryConstructor/after/RenameKotlinClassSecondaryConstructor.kt @@ -0,0 +1,10 @@ +open class TestX { + constructor(x: Int) {} +} + +class Y1 : TestX(1) +class Y2 : TestX { + constructor(): super(1) {} +} + +val x = TestX(1) diff --git a/idea/testData/refactoring/rename/renameKotlinClassSecondaryConstructor/before/RenameKotlinClassSecondaryConstructor.kt b/idea/testData/refactoring/rename/renameKotlinClassSecondaryConstructor/before/RenameKotlinClassSecondaryConstructor.kt new file mode 100644 index 00000000000..3a58d1256b9 --- /dev/null +++ b/idea/testData/refactoring/rename/renameKotlinClassSecondaryConstructor/before/RenameKotlinClassSecondaryConstructor.kt @@ -0,0 +1,10 @@ +open class X { + constructor(x: Int) {} +} + +class Y1 : X(1) +class Y2 : X { + constructor(): super(1) {} +} + +val x = X(1) diff --git a/idea/testData/refactoring/rename/renameKotlinClassSecondaryConstructor/renameKotlinSecondaryConstructor.test b/idea/testData/refactoring/rename/renameKotlinClassSecondaryConstructor/renameKotlinSecondaryConstructor.test new file mode 100644 index 00000000000..604e88d0525 --- /dev/null +++ b/idea/testData/refactoring/rename/renameKotlinClassSecondaryConstructor/renameKotlinSecondaryConstructor.test @@ -0,0 +1,5 @@ +{ + "type": "KOTLIN_CLASS", + "classId": "/X", + "newName": "TestX" +} \ No newline at end of file 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 77a593341b9..a4a019ea217 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/refactoring/rename/RenameTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/refactoring/rename/RenameTestGenerated.java @@ -162,6 +162,12 @@ public class RenameTestGenerated extends AbstractRenameTest { doTest(fileName); } + @TestMetadata("renameKotlinClassSecondaryConstructor/renameKotlinSecondaryConstructor.test") + public void testRenameKotlinClassSecondaryConstructor_RenameKotlinSecondaryConstructor() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/refactoring/rename/renameKotlinClassSecondaryConstructor/renameKotlinSecondaryConstructor.test"); + doTest(fileName); + } + @TestMetadata("renameKotlinClassWithFile/javaClassWrapper.test") public void testRenameKotlinClassWithFile_JavaClassWrapper() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/testData/refactoring/rename/renameKotlinClassWithFile/javaClassWrapper.test");