Rename: Replace name identifiers via AST to prevent unwanted reformatting
#KT-8563 Fixed
This commit is contained in:
@@ -92,7 +92,7 @@ abstract class KtNamedDeclarationStub<T extends KotlinStubWithFqName<?>> extends
|
|||||||
|
|
||||||
PsiElement newIdentifier = KtPsiFactory(this).createNameIdentifierIfPossible(name);
|
PsiElement newIdentifier = KtPsiFactory(this).createNameIdentifierIfPossible(name);
|
||||||
if (newIdentifier != null) {
|
if (newIdentifier != null) {
|
||||||
identifier.replace(newIdentifier);
|
KtPsiUtilKt.astReplace(identifier, newIdentifier);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
identifier.delete();
|
identifier.delete();
|
||||||
|
|||||||
@@ -568,4 +568,6 @@ fun KtExpression.getLabeledParent(labelName: String): KtLabeledExpression? {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun PsiElement.astReplace(newElement: PsiElement) = parent.node.replaceChild(node, newElement.node)
|
||||||
+7
-5
@@ -40,10 +40,7 @@ import org.jetbrains.kotlin.name.Name
|
|||||||
import org.jetbrains.kotlin.name.isOneSegmentFQN
|
import org.jetbrains.kotlin.name.isOneSegmentFQN
|
||||||
import org.jetbrains.kotlin.plugin.references.SimpleNameReferenceExtension
|
import org.jetbrains.kotlin.plugin.references.SimpleNameReferenceExtension
|
||||||
import org.jetbrains.kotlin.psi.*
|
import org.jetbrains.kotlin.psi.*
|
||||||
import org.jetbrains.kotlin.psi.psiUtil.getParentOfTypeAndBranch
|
import org.jetbrains.kotlin.psi.psiUtil.*
|
||||||
import org.jetbrains.kotlin.psi.psiUtil.getQualifiedElementOrCallableRef
|
|
||||||
import org.jetbrains.kotlin.psi.psiUtil.getQualifiedElementSelector
|
|
||||||
import org.jetbrains.kotlin.psi.psiUtil.startOffset
|
|
||||||
import org.jetbrains.kotlin.resolve.BindingContext
|
import org.jetbrains.kotlin.resolve.BindingContext
|
||||||
import org.jetbrains.kotlin.resolve.DataClassDescriptorResolver
|
import org.jetbrains.kotlin.resolve.DataClassDescriptorResolver
|
||||||
import org.jetbrains.kotlin.resolve.ImportedFromObjectCallableDescriptor
|
import org.jetbrains.kotlin.resolve.ImportedFromObjectCallableDescriptor
|
||||||
@@ -135,7 +132,12 @@ class KtSimpleNameReference(expression: KtSimpleNameExpression) : KtSimpleRefere
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
nameElement.replace(element)
|
if (element.node.elementType == KtTokens.IDENTIFIER) {
|
||||||
|
nameElement.astReplace(element)
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
nameElement.replace(element)
|
||||||
|
}
|
||||||
return expression
|
return expression
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,7 @@
|
|||||||
|
public class OneLineKotlin {
|
||||||
|
var <caret>subject = 1
|
||||||
|
var aux = 1
|
||||||
|
public fun simple0() { subject }
|
||||||
|
public fun simple1() { subject = 2 }
|
||||||
|
public fun simple2() { aux = subject }
|
||||||
|
}
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
public class OneLineKotlin {
|
||||||
|
var subject2 = 1
|
||||||
|
var aux = 1
|
||||||
|
public fun simple0() { subject2 }
|
||||||
|
public fun simple1() { subject2 = 2 }
|
||||||
|
public fun simple2() { aux = subject2 }
|
||||||
|
}
|
||||||
@@ -11,6 +11,7 @@ import com.intellij.codeInsight.template.impl.TemplateManagerImpl
|
|||||||
import com.intellij.openapi.actionSystem.CommonDataKeys
|
import com.intellij.openapi.actionSystem.CommonDataKeys
|
||||||
import com.intellij.openapi.actionSystem.impl.SimpleDataContext
|
import com.intellij.openapi.actionSystem.impl.SimpleDataContext
|
||||||
import com.intellij.openapi.command.WriteCommandAction
|
import com.intellij.openapi.command.WriteCommandAction
|
||||||
|
import com.intellij.refactoring.rename.inplace.MemberInplaceRenameHandler
|
||||||
import com.intellij.refactoring.rename.inplace.VariableInplaceRenameHandler
|
import com.intellij.refactoring.rename.inplace.VariableInplaceRenameHandler
|
||||||
import com.intellij.testFramework.LightPlatformCodeInsightTestCase
|
import com.intellij.testFramework.LightPlatformCodeInsightTestCase
|
||||||
import com.intellij.testFramework.fixtures.CodeInsightTestUtil
|
import com.intellij.testFramework.fixtures.CodeInsightTestUtil
|
||||||
@@ -81,6 +82,10 @@ class InplaceRenameTest : LightPlatformCodeInsightTestCase() {
|
|||||||
doTestInplaceRename("name1")
|
doTestInplaceRename("name1")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun testNoReformat() {
|
||||||
|
doTestInplaceRename("subject2", MemberInplaceRenameHandler())
|
||||||
|
}
|
||||||
|
|
||||||
private fun doTestImplicitLambdaParameter(newName: String) {
|
private fun doTestImplicitLambdaParameter(newName: String) {
|
||||||
configureByFile(getTestName(false) + ".kt")
|
configureByFile(getTestName(false) + ".kt")
|
||||||
|
|
||||||
@@ -131,7 +136,7 @@ class InplaceRenameTest : LightPlatformCodeInsightTestCase() {
|
|||||||
checkResultByFile(getTestName(false) + ".kt.after")
|
checkResultByFile(getTestName(false) + ".kt.after")
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun doTestInplaceRename(newName: String?) {
|
private fun doTestInplaceRename(newName: String?, handler: VariableInplaceRenameHandler = VariableInplaceRenameHandler()) {
|
||||||
configureByFile(getTestName(false) + ".kt")
|
configureByFile(getTestName(false) + ".kt")
|
||||||
val element = TargetElementUtil.findTargetElement(
|
val element = TargetElementUtil.findTargetElement(
|
||||||
LightPlatformCodeInsightTestCase.myEditor,
|
LightPlatformCodeInsightTestCase.myEditor,
|
||||||
@@ -143,7 +148,6 @@ class InplaceRenameTest : LightPlatformCodeInsightTestCase() {
|
|||||||
val dataContext = SimpleDataContext.getSimpleContext(CommonDataKeys.PSI_ELEMENT.name, element!!,
|
val dataContext = SimpleDataContext.getSimpleContext(CommonDataKeys.PSI_ELEMENT.name, element!!,
|
||||||
LightPlatformCodeInsightTestCase.getCurrentEditorDataContext())
|
LightPlatformCodeInsightTestCase.getCurrentEditorDataContext())
|
||||||
|
|
||||||
val handler = VariableInplaceRenameHandler()
|
|
||||||
if (newName == null) {
|
if (newName == null) {
|
||||||
assertFalse(handler.isRenaming(dataContext), "In-place rename is allowed for " + element)
|
assertFalse(handler.isRenaming(dataContext), "In-place rename is allowed for " + element)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user