Rename: Disable label rename outside of reference range
#KT-17128 Fixed
This commit is contained in:
+7
-3
@@ -28,8 +28,10 @@ import com.intellij.refactoring.rename.PsiElementRenameHandler
|
||||
import com.intellij.refactoring.rename.RenameHandler
|
||||
import com.intellij.refactoring.rename.inplace.MemberInplaceRenameHandler
|
||||
import org.jetbrains.kotlin.idea.codeInsight.CodeInsightUtils
|
||||
import org.jetbrains.kotlin.lexer.KtTokens
|
||||
import org.jetbrains.kotlin.psi.KtFile
|
||||
import org.jetbrains.kotlin.psi.KtSimpleNameExpression
|
||||
import org.jetbrains.kotlin.psi.psiUtil.endOffset
|
||||
import org.jetbrains.kotlin.psi.psiUtil.getNonStrictParentOfType
|
||||
|
||||
abstract class AbstractReferenceSubstitutionRenameHandler(
|
||||
@@ -37,11 +39,13 @@ abstract class AbstractReferenceSubstitutionRenameHandler(
|
||||
) : PsiElementRenameHandler() {
|
||||
companion object {
|
||||
fun getReferenceExpression(file: PsiFile, offset: Int): KtSimpleNameExpression? {
|
||||
var elementAtCaret = file.findElementAt(offset)
|
||||
var elementAtCaret = file.findElementAt(offset) ?: return null
|
||||
if (elementAtCaret.node?.elementType == KtTokens.AT) return null
|
||||
if (elementAtCaret is PsiWhiteSpace) {
|
||||
elementAtCaret = CodeInsightUtils.getElementAtOffsetIgnoreWhitespaceAfter(file, offset)
|
||||
elementAtCaret = CodeInsightUtils.getElementAtOffsetIgnoreWhitespaceAfter(file, offset) ?: return null
|
||||
if (offset != elementAtCaret.endOffset) return null
|
||||
}
|
||||
return elementAtCaret?.getNonStrictParentOfType<KtSimpleNameExpression>()
|
||||
return elementAtCaret.getNonStrictParentOfType<KtSimpleNameExpression>()
|
||||
}
|
||||
|
||||
fun getReferenceExpression(dataContext: DataContext): KtSimpleNameExpression? {
|
||||
|
||||
+5
@@ -0,0 +1,5 @@
|
||||
fun <R> foo(f: () -> R) = f()
|
||||
|
||||
fun test() {
|
||||
foo bar@ { return@bar false }
|
||||
}
|
||||
+5
@@ -0,0 +1,5 @@
|
||||
fun <R> foo(f: () -> R) = f()
|
||||
|
||||
fun test() {
|
||||
foo bar@ { return@bar /*rename*/ false }
|
||||
}
|
||||
+5
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"type": "AUTO_DETECT",
|
||||
"mainFile": "test.kt",
|
||||
"newName": "baz"
|
||||
}
|
||||
+5
@@ -0,0 +1,5 @@
|
||||
fun <R> foo(f: () -> R) = f()
|
||||
|
||||
fun test() {
|
||||
foo bar@ { return@bar false }
|
||||
}
|
||||
+5
@@ -0,0 +1,5 @@
|
||||
fun <R> foo(f: () -> R) = f()
|
||||
|
||||
fun test() {
|
||||
foo bar@ { return/*rename*/@bar false }
|
||||
}
|
||||
+5
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"type": "AUTO_DETECT",
|
||||
"mainFile": "test.kt",
|
||||
"newName": "baz"
|
||||
}
|
||||
+7
@@ -0,0 +1,7 @@
|
||||
fun <R> foo(f: () -> R) = f()
|
||||
|
||||
fun test() {
|
||||
foo {
|
||||
return@foo false
|
||||
}
|
||||
}
|
||||
+7
@@ -0,0 +1,7 @@
|
||||
fun <R> foo(f: () -> R) = f()
|
||||
|
||||
fun test() {
|
||||
foo {
|
||||
return/*rename*/@foo false
|
||||
}
|
||||
}
|
||||
+5
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"type": "AUTO_DETECT",
|
||||
"mainFile": "test.kt",
|
||||
"newName": "bar"
|
||||
}
|
||||
+7
@@ -0,0 +1,7 @@
|
||||
fun <R> foo(f: () -> R) = f()
|
||||
|
||||
fun test() {
|
||||
foo {
|
||||
return@foo false
|
||||
}
|
||||
}
|
||||
+7
@@ -0,0 +1,7 @@
|
||||
fun <R> foo(f: () -> R) = f()
|
||||
|
||||
fun test() {
|
||||
foo {
|
||||
return/*rename*/@foo false
|
||||
}
|
||||
}
|
||||
+5
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"type": "AUTO_DETECT",
|
||||
"mainFile": "test.kt",
|
||||
"newName": "bar"
|
||||
}
|
||||
@@ -349,7 +349,7 @@ abstract class AbstractRenameTest : KotlinLightCodeInsightFixtureTestCase() {
|
||||
else -> null
|
||||
}
|
||||
}
|
||||
val handler = RenameHandlerRegistry.getInstance().getRenameHandler(dataContext)!!
|
||||
val handler = RenameHandlerRegistry.getInstance().getRenameHandler(dataContext) ?: return@doTestCommittingDocuments
|
||||
Assert.assertTrue(handler.isAvailableOnDataContext(dataContext))
|
||||
handler.invoke(project, editor, psiFile, dataContext)
|
||||
}
|
||||
|
||||
@@ -240,6 +240,18 @@ public class RenameTestGenerated extends AbstractRenameTest {
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("labeledLambdaByLabelRefAfterLabel/labeledLambdaByLabelRefAfterLabel.test")
|
||||
public void testLabeledLambdaByLabelRefAfterLabel_LabeledLambdaByLabelRefAfterLabel() throws Exception {
|
||||
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/refactoring/rename/labeledLambdaByLabelRefAfterLabel/labeledLambdaByLabelRefAfterLabel.test");
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("labeledLambdaByLabelRefBeforeLabel/labeledLambdaByLabelRefBeforeLabel.test")
|
||||
public void testLabeledLambdaByLabelRefBeforeLabel_LabeledLambdaByLabelRefBeforeLabel() throws Exception {
|
||||
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/refactoring/rename/labeledLambdaByLabelRefBeforeLabel/labeledLambdaByLabelRefBeforeLabel.test");
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("labeledLambdaByLabelWithParens/labeledLambdaByLabelWithParens.test")
|
||||
public void testLabeledLambdaByLabelWithParens_LabeledLambdaByLabelWithParens() throws Exception {
|
||||
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/refactoring/rename/labeledLambdaByLabelWithParens/labeledLambdaByLabelWithParens.test");
|
||||
@@ -294,6 +306,18 @@ public class RenameTestGenerated extends AbstractRenameTest {
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("labeledReturnInLambdaAfterLabel/labeledReturnInLambdaAfterLabel.test")
|
||||
public void testLabeledReturnInLambdaAfterLabel_LabeledReturnInLambdaAfterLabel() throws Exception {
|
||||
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/refactoring/rename/labeledReturnInLambdaAfterLabel/labeledReturnInLambdaAfterLabel.test");
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("labeledReturnInLambdaBeforeLabel/labeledReturnInLambdaBeforeLabel.test")
|
||||
public void testLabeledReturnInLambdaBeforeLabel_LabeledReturnInLambdaBeforeLabel() throws Exception {
|
||||
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/refactoring/rename/labeledReturnInLambdaBeforeLabel/labeledReturnInLambdaBeforeLabel.test");
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("lambdaParameterRedeclaration/lambdaParameterRedeclaration.test")
|
||||
public void testLambdaParameterRedeclaration_LambdaParameterRedeclaration() throws Exception {
|
||||
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/refactoring/rename/lambdaParameterRedeclaration/lambdaParameterRedeclaration.test");
|
||||
|
||||
Reference in New Issue
Block a user