KT-3255 Add ability to rename kotlin classes from java

#KT-3255 Fixed
This commit is contained in:
Nikolay Krasko
2013-11-17 00:44:23 -08:00
committed by Nikolay Krasko
parent 87fac21310
commit 76562f9aa5
5 changed files with 38 additions and 7 deletions
@@ -129,7 +129,7 @@ public class KotlinLightClassForExplicitDeclaration extends KotlinWrappingLightC
@NotNull @NotNull
@Override @Override
public PsiElement copy() { public PsiElement copy() {
return new KotlinLightClassForExplicitDeclaration(getManager(), classFqName, classOrObject); return new KotlinLightClassForExplicitDeclaration(getManager(), classFqName, (JetClassOrObject) classOrObject.copy());
} }
@NotNull @NotNull
@@ -394,7 +394,7 @@ public class KotlinLightClassForExplicitDeclaration extends KotlinWrappingLightC
@Override @Override
public PsiElement setName(@NonNls @NotNull String name) throws IncorrectOperationException { public PsiElement setName(@NonNls @NotNull String name) throws IncorrectOperationException {
return super.setName(name); // TODO throw new IncorrectOperationException("Cannot modify compiled kotlin element");
} }
@Override @Override
+3 -1
View File
@@ -213,7 +213,9 @@
<psi.referenceContributor language="jet" order="after JetCompletionContributor" <psi.referenceContributor language="jet" order="after JetCompletionContributor"
implementation="org.jetbrains.jet.plugin.references.JetReferenceContributor"/> implementation="org.jetbrains.jet.plugin.references.JetReferenceContributor"/>
<renamePsiElementProcessor implementation="org.jetbrains.jet.plugin.refactoring.rename.RenameJetClassProcessor"/> <renamePsiElementProcessor id="KotlinClass"
implementation="org.jetbrains.jet.plugin.refactoring.rename.RenameJetClassProcessor"
order="first"/>
<renamePsiElementProcessor implementation="org.jetbrains.jet.plugin.refactoring.rename.RenameKotlinFunctionProcessor"/> <renamePsiElementProcessor implementation="org.jetbrains.jet.plugin.refactoring.rename.RenameKotlinFunctionProcessor"/>
<liveTemplateContext implementation="org.jetbrains.jet.plugin.liveTemplates.JetTemplateContextType$Generic"/> <liveTemplateContext implementation="org.jetbrains.jet.plugin.liveTemplates.JetTemplateContextType$Generic"/>
@@ -16,10 +16,15 @@
package org.jetbrains.jet.plugin.refactoring.rename; package org.jetbrains.jet.plugin.refactoring.rename;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiElement; import com.intellij.psi.PsiElement;
import com.intellij.refactoring.rename.RenamePsiElementProcessor; import com.intellij.refactoring.rename.RenamePsiElementProcessor;
import org.jetbrains.annotations.NotNull; 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.JetClassOrObject;
import org.jetbrains.jet.lang.psi.JetFile; import org.jetbrains.jet.lang.psi.JetFile;
@@ -28,7 +33,26 @@ import java.util.Map;
public class RenameJetClassProcessor extends RenamePsiElementProcessor { public class RenameJetClassProcessor extends RenamePsiElementProcessor {
@Override @Override
public boolean canProcessElement(@NotNull PsiElement element) { 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 @Override
@@ -43,6 +67,7 @@ public class RenameJetClassProcessor extends RenamePsiElementProcessor {
allRenames.put(file, newName + "." + virtualFile.getExtension()); allRenames.put(file, newName + "." + virtualFile.getExtension());
} }
} }
super.prepareRenaming(element, newName, allRenames); super.prepareRenaming(element, newName, allRenames);
} }
} }
@@ -0,0 +1 @@
// RENAME: JAVA_CLASS->testing.rename.First->Third
@@ -33,9 +33,7 @@ import org.jetbrains.jet.plugin.refactoring.rename.AbstractRenameTest;
@TestMetadata("idea/testData/refactoring/rename") @TestMetadata("idea/testData/refactoring/rename")
public class RenameTestGenerated extends AbstractRenameTest { public class RenameTestGenerated extends AbstractRenameTest {
public void testAllFilesPresentInRename() throws Exception { public void testAllFilesPresentInRename() throws Exception {
JetTestUtils.assertAllTestsPresentInSingleGeneratedClass(this.getClass(), "org.jetbrains.jet.generators.tests.GenerateTests", JetTestUtils.assertAllTestsPresentInSingleGeneratedClass(this.getClass(), "org.jetbrains.jet.generators.tests.GenerateTests", new File("idea/testData/refactoring/rename"), Pattern.compile("^(.+)\\.test$"));
new File("idea/testData/refactoring/rename"),
Pattern.compile("^(.+)\\.test$"));
} }
@TestMetadata("renameJavaClass/renameJavaClass.test") @TestMetadata("renameJavaClass/renameJavaClass.test")
@@ -43,6 +41,11 @@ public class RenameTestGenerated extends AbstractRenameTest {
doTest("idea/testData/refactoring/rename/renameJavaClass/renameJavaClass.test"); 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") @TestMetadata("renameKotlinClass/kotlinClass.test")
public void testRenameKotlinClass_KotlinClass() throws Exception { public void testRenameKotlinClass_KotlinClass() throws Exception {
doTest("idea/testData/refactoring/rename/renameKotlinClass/kotlinClass.test"); doTest("idea/testData/refactoring/rename/renameKotlinClass/kotlinClass.test");