From 76562f9aa5d5f74320662b0eb849fe7b5c6657e1 Mon Sep 17 00:00:00 2001 From: Nikolay Krasko Date: Sun, 17 Nov 2013 00:44:23 -0800 Subject: [PATCH] KT-3255 Add ability to rename kotlin classes from java #KT-3255 Fixed --- ...otlinLightClassForExplicitDeclaration.java | 4 +-- idea/src/META-INF/plugin.xml | 4 ++- .../rename/RenameJetClassProcessor.java | 27 ++++++++++++++++++- .../javaWrapperForKotlinClass.test | 1 + .../rename/RenameTestGenerated.java | 9 ++++--- 5 files changed, 38 insertions(+), 7 deletions(-) create mode 100644 idea/testData/refactoring/rename/renameKotlinClass/javaWrapperForKotlinClass.test diff --git a/compiler/jet.as.java.psi/src/org/jetbrains/jet/asJava/KotlinLightClassForExplicitDeclaration.java b/compiler/jet.as.java.psi/src/org/jetbrains/jet/asJava/KotlinLightClassForExplicitDeclaration.java index 0b91e3176c0..5c4715c7f74 100644 --- a/compiler/jet.as.java.psi/src/org/jetbrains/jet/asJava/KotlinLightClassForExplicitDeclaration.java +++ b/compiler/jet.as.java.psi/src/org/jetbrains/jet/asJava/KotlinLightClassForExplicitDeclaration.java @@ -129,7 +129,7 @@ public class KotlinLightClassForExplicitDeclaration extends KotlinWrappingLightC @NotNull @Override public PsiElement copy() { - return new KotlinLightClassForExplicitDeclaration(getManager(), classFqName, classOrObject); + return new KotlinLightClassForExplicitDeclaration(getManager(), classFqName, (JetClassOrObject) classOrObject.copy()); } @NotNull @@ -394,7 +394,7 @@ public class KotlinLightClassForExplicitDeclaration extends KotlinWrappingLightC @Override public PsiElement setName(@NonNls @NotNull String name) throws IncorrectOperationException { - return super.setName(name); // TODO + throw new IncorrectOperationException("Cannot modify compiled kotlin element"); } @Override diff --git a/idea/src/META-INF/plugin.xml b/idea/src/META-INF/plugin.xml index 160cb5d3ad2..3a7073cdcc5 100644 --- a/idea/src/META-INF/plugin.xml +++ b/idea/src/META-INF/plugin.xml @@ -213,7 +213,9 @@ - + diff --git a/idea/src/org/jetbrains/jet/plugin/refactoring/rename/RenameJetClassProcessor.java b/idea/src/org/jetbrains/jet/plugin/refactoring/rename/RenameJetClassProcessor.java index 8324133fcb3..5365545c10d 100644 --- a/idea/src/org/jetbrains/jet/plugin/refactoring/rename/RenameJetClassProcessor.java +++ b/idea/src/org/jetbrains/jet/plugin/refactoring/rename/RenameJetClassProcessor.java @@ -16,10 +16,15 @@ package org.jetbrains.jet.plugin.refactoring.rename; +import com.intellij.openapi.editor.Editor; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiElement; import com.intellij.refactoring.rename.RenamePsiElementProcessor; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.jetbrains.jet.asJava.KotlinLightClass; +import org.jetbrains.jet.asJava.KotlinLightClassForExplicitDeclaration; +import org.jetbrains.jet.asJava.KotlinLightClassForPackage; import org.jetbrains.jet.lang.psi.JetClassOrObject; import org.jetbrains.jet.lang.psi.JetFile; @@ -28,7 +33,26 @@ import java.util.Map; public class RenameJetClassProcessor extends RenamePsiElementProcessor { @Override public boolean canProcessElement(@NotNull PsiElement element) { - return element instanceof JetClassOrObject; + return element instanceof JetClassOrObject || element instanceof KotlinLightClass; + } + + @Nullable + @Override + public PsiElement substituteElementToRename(PsiElement element, @Nullable Editor editor) { + if (element instanceof KotlinLightClass) { + if (element instanceof KotlinLightClassForExplicitDeclaration) { + return element.getNavigationElement(); + } + else if (element instanceof KotlinLightClassForPackage) { + // Cancel rename + return null; + } + else { + assert false : "Should not be suggested to rename element of type " + element.getClass() + " " + element; + } + } + + return element; } @Override @@ -43,6 +67,7 @@ public class RenameJetClassProcessor extends RenamePsiElementProcessor { allRenames.put(file, newName + "." + virtualFile.getExtension()); } } + super.prepareRenaming(element, newName, allRenames); } } diff --git a/idea/testData/refactoring/rename/renameKotlinClass/javaWrapperForKotlinClass.test b/idea/testData/refactoring/rename/renameKotlinClass/javaWrapperForKotlinClass.test new file mode 100644 index 00000000000..ba92cec85a8 --- /dev/null +++ b/idea/testData/refactoring/rename/renameKotlinClass/javaWrapperForKotlinClass.test @@ -0,0 +1 @@ +// RENAME: JAVA_CLASS->testing.rename.First->Third \ No newline at end of file diff --git a/idea/tests/org/jetbrains/jet/plugin/refactoring/rename/RenameTestGenerated.java b/idea/tests/org/jetbrains/jet/plugin/refactoring/rename/RenameTestGenerated.java index abef1646c1e..1bab7c5286e 100644 --- a/idea/tests/org/jetbrains/jet/plugin/refactoring/rename/RenameTestGenerated.java +++ b/idea/tests/org/jetbrains/jet/plugin/refactoring/rename/RenameTestGenerated.java @@ -33,9 +33,7 @@ import org.jetbrains.jet.plugin.refactoring.rename.AbstractRenameTest; @TestMetadata("idea/testData/refactoring/rename") public class RenameTestGenerated extends AbstractRenameTest { public void testAllFilesPresentInRename() throws Exception { - JetTestUtils.assertAllTestsPresentInSingleGeneratedClass(this.getClass(), "org.jetbrains.jet.generators.tests.GenerateTests", - new File("idea/testData/refactoring/rename"), - Pattern.compile("^(.+)\\.test$")); + JetTestUtils.assertAllTestsPresentInSingleGeneratedClass(this.getClass(), "org.jetbrains.jet.generators.tests.GenerateTests", new File("idea/testData/refactoring/rename"), Pattern.compile("^(.+)\\.test$")); } @TestMetadata("renameJavaClass/renameJavaClass.test") @@ -43,6 +41,11 @@ public class RenameTestGenerated extends AbstractRenameTest { doTest("idea/testData/refactoring/rename/renameJavaClass/renameJavaClass.test"); } + @TestMetadata("renameKotlinClass/javaWrapperForKotlinClass.test") + public void testRenameKotlinClass_JavaWrapperForKotlinClass() throws Exception { + doTest("idea/testData/refactoring/rename/renameKotlinClass/javaWrapperForKotlinClass.test"); + } + @TestMetadata("renameKotlinClass/kotlinClass.test") public void testRenameKotlinClass_KotlinClass() throws Exception { doTest("idea/testData/refactoring/rename/renameKotlinClass/kotlinClass.test");