Rename: Fix class rename by constructor reference
This commit is contained in:
@@ -19,7 +19,6 @@ package org.jetbrains.kotlin.idea.refactoring.rename;
|
|||||||
import com.intellij.openapi.editor.Editor;
|
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.psi.util.PsiTreeUtil;
|
|
||||||
import com.intellij.refactoring.RefactoringBundle;
|
import com.intellij.refactoring.RefactoringBundle;
|
||||||
import com.intellij.refactoring.util.CommonRefactoringUtil;
|
import com.intellij.refactoring.util.CommonRefactoringUtil;
|
||||||
import org.jetbrains.annotations.NotNull;
|
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.KotlinLightClassForExplicitDeclaration;
|
||||||
import org.jetbrains.kotlin.asJava.KotlinLightClassForPackage;
|
import org.jetbrains.kotlin.asJava.KotlinLightClassForPackage;
|
||||||
import org.jetbrains.kotlin.idea.JetBundle;
|
import org.jetbrains.kotlin.idea.JetBundle;
|
||||||
import org.jetbrains.kotlin.psi.JetClass;
|
|
||||||
import org.jetbrains.kotlin.psi.JetClassOrObject;
|
import org.jetbrains.kotlin.psi.JetClassOrObject;
|
||||||
|
import org.jetbrains.kotlin.psi.JetConstructor;
|
||||||
import org.jetbrains.kotlin.psi.JetFile;
|
import org.jetbrains.kotlin.psi.JetFile;
|
||||||
import org.jetbrains.kotlin.psi.JetSecondaryConstructor;
|
|
||||||
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
public class RenameJetClassProcessor extends RenameKotlinPsiProcessor {
|
public class RenameJetClassProcessor extends RenameKotlinPsiProcessor {
|
||||||
@Override
|
@Override
|
||||||
public boolean canProcessElement(@NotNull PsiElement element) {
|
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
|
@Nullable
|
||||||
@@ -86,8 +84,8 @@ public class RenameJetClassProcessor extends RenameKotlinPsiProcessor {
|
|||||||
assert false : "Should not be suggested to rename element of type " + element.getClass() + " " + element;
|
assert false : "Should not be suggested to rename element of type " + element.getClass() + " " + element;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (element instanceof JetSecondaryConstructor) {
|
else if (element instanceof JetConstructor) {
|
||||||
return PsiTreeUtil.getParentOfType(element, JetClassOrObject.class);
|
return ((JetConstructor) element).getContainingClassOrObject();
|
||||||
}
|
}
|
||||||
|
|
||||||
return (JetClassOrObject) element;
|
return (JetClassOrObject) element;
|
||||||
|
|||||||
+8
@@ -0,0 +1,8 @@
|
|||||||
|
package testing.rename
|
||||||
|
|
||||||
|
public open class B() {
|
||||||
|
}
|
||||||
|
|
||||||
|
fun test() {
|
||||||
|
/*rename*/B()
|
||||||
|
}
|
||||||
+8
@@ -0,0 +1,8 @@
|
|||||||
|
package testing.rename
|
||||||
|
|
||||||
|
public open class A() {
|
||||||
|
}
|
||||||
|
|
||||||
|
fun test() {
|
||||||
|
/*rename*/A()
|
||||||
|
}
|
||||||
+6
@@ -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.JsonObject
|
||||||
import com.google.gson.JsonParser
|
import com.google.gson.JsonParser
|
||||||
|
import com.intellij.codeInsight.TargetElementUtilBase
|
||||||
import com.intellij.openapi.extensions.Extensions
|
import com.intellij.openapi.extensions.Extensions
|
||||||
import com.intellij.openapi.fileEditor.FileDocumentManager
|
import com.intellij.openapi.fileEditor.FileDocumentManager
|
||||||
import com.intellij.openapi.module.Module
|
import com.intellij.openapi.module.Module
|
||||||
@@ -138,7 +139,14 @@ public abstract class AbstractRenameTest : KotlinMultiFileTestCase() {
|
|||||||
val marker = psiFile.getText().indexOf(MARKER_TEXT)
|
val marker = psiFile.getText().indexOf(MARKER_TEXT)
|
||||||
assert(marker != -1)
|
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)
|
val substitution = RenamePsiElementProcessor.forElement(toRename).substituteElementToRename(toRename, null)
|
||||||
|
|
||||||
runRenameProcessor(context, newName, substitution, true, true)
|
runRenameProcessor(context, newName, substitution, true, true)
|
||||||
|
|||||||
@@ -221,6 +221,12 @@ public class RenameTestGenerated extends AbstractRenameTest {
|
|||||||
doTest(fileName);
|
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")
|
@TestMetadata("renameKotlinClassConstructor/renameKotlinConstructor.test")
|
||||||
public void testRenameKotlinClassConstructor_RenameKotlinConstructor() throws Exception {
|
public void testRenameKotlinClassConstructor_RenameKotlinConstructor() throws Exception {
|
||||||
String fileName = JetTestUtils.navigationMetadata("idea/testData/refactoring/rename/renameKotlinClassConstructor/renameKotlinConstructor.test");
|
String fileName = JetTestUtils.navigationMetadata("idea/testData/refactoring/rename/renameKotlinClassConstructor/renameKotlinConstructor.test");
|
||||||
|
|||||||
Reference in New Issue
Block a user