Rename: Fix class rename by constructor reference

This commit is contained in:
Alexey Sedunov
2015-06-15 15:18:56 +03:00
parent 36ae8790a1
commit 1506531e59
6 changed files with 41 additions and 7 deletions
@@ -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;
@@ -0,0 +1,8 @@
package testing.rename
public open class B() {
}
fun test() {
/*rename*/B()
}
@@ -0,0 +1,8 @@
package testing.rename
public open class A() {
}
fun test() {
/*rename*/A()
}
@@ -0,0 +1,6 @@
{
"type": "MARKED_ELEMENT",
"mainFile": "test.kt",
"newName": "B",
"byRef": "true"
}
@@ -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<PsiNamedElement>()!!
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<PsiNamedElement>()!!
}
val substitution = RenamePsiElementProcessor.forElement(toRename).substituteElementToRename(toRename, null)
runRenameProcessor(context, newName, substitution, true, true)
@@ -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");