Rename: Disable label rename outside of reference range

#KT-17128 Fixed
This commit is contained in:
Alexey Sedunov
2017-06-01 15:58:00 +03:00
parent 566e701131
commit 69c315443a
15 changed files with 100 additions and 4 deletions
@@ -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? {
@@ -0,0 +1,5 @@
fun <R> foo(f: () -> R) = f()
fun test() {
foo bar@ { return@bar false }
}
@@ -0,0 +1,5 @@
fun <R> foo(f: () -> R) = f()
fun test() {
foo bar@ { return@bar /*rename*/ false }
}
@@ -0,0 +1,5 @@
{
"type": "AUTO_DETECT",
"mainFile": "test.kt",
"newName": "baz"
}
@@ -0,0 +1,5 @@
fun <R> foo(f: () -> R) = f()
fun test() {
foo bar@ { return@bar false }
}
@@ -0,0 +1,5 @@
fun <R> foo(f: () -> R) = f()
fun test() {
foo bar@ { return/*rename*/@bar false }
}
@@ -0,0 +1,5 @@
{
"type": "AUTO_DETECT",
"mainFile": "test.kt",
"newName": "baz"
}
@@ -0,0 +1,7 @@
fun <R> foo(f: () -> R) = f()
fun test() {
foo {
return@foo false
}
}
@@ -0,0 +1,7 @@
fun <R> foo(f: () -> R) = f()
fun test() {
foo {
return/*rename*/@foo false
}
}
@@ -0,0 +1,5 @@
{
"type": "AUTO_DETECT",
"mainFile": "test.kt",
"newName": "bar"
}
@@ -0,0 +1,7 @@
fun <R> foo(f: () -> R) = f()
fun test() {
foo {
return@foo false
}
}
@@ -0,0 +1,7 @@
fun <R> foo(f: () -> R) = f()
fun test() {
foo {
return/*rename*/@foo false
}
}
@@ -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");