From b4789b95efeccf580c88a01d673fec90e3beaaeb Mon Sep 17 00:00:00 2001 From: Toshiaki Kameyama Date: Fri, 15 Feb 2019 12:42:01 +0900 Subject: [PATCH] Rename: fix renaming of label by label reference in loop #KT-29796 Fixed --- .../META-INF/plugin-kotlin-extensions.xml | 2 +- ....kt => RenameByLabeledReferenceHandler.kt} | 22 +++++++------------ .../after/test.kt | 6 +++++ .../before/test.kt | 6 +++++ .../labeledLoopByLabelRefInBreak.test | 5 +++++ .../after/test.kt | 6 +++++ .../before/test.kt | 6 +++++ .../labeledLoopByLabelRefInContinue.test | 5 +++++ .../rename/RenameTestGenerated.java | 10 +++++++++ 9 files changed, 53 insertions(+), 15 deletions(-) rename idea/src/org/jetbrains/kotlin/idea/refactoring/rename/{RenameByLabeledReferenceInLambdaArgumentHandler.kt => RenameByLabeledReferenceHandler.kt} (66%) create mode 100644 idea/testData/refactoring/rename/labeledLoopByLabelRefInBreak2/after/test.kt create mode 100644 idea/testData/refactoring/rename/labeledLoopByLabelRefInBreak2/before/test.kt create mode 100644 idea/testData/refactoring/rename/labeledLoopByLabelRefInBreak2/labeledLoopByLabelRefInBreak.test create mode 100644 idea/testData/refactoring/rename/labeledLoopByLabelRefInContinue2/after/test.kt create mode 100644 idea/testData/refactoring/rename/labeledLoopByLabelRefInContinue2/before/test.kt create mode 100644 idea/testData/refactoring/rename/labeledLoopByLabelRefInContinue2/labeledLoopByLabelRefInContinue.test diff --git a/idea/resources/META-INF/plugin-kotlin-extensions.xml b/idea/resources/META-INF/plugin-kotlin-extensions.xml index 6c4353a3982..22de41a8173 100644 --- a/idea/resources/META-INF/plugin-kotlin-extensions.xml +++ b/idea/resources/META-INF/plugin-kotlin-extensions.xml @@ -11,7 +11,7 @@ - + diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/rename/RenameByLabeledReferenceInLambdaArgumentHandler.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/rename/RenameByLabeledReferenceHandler.kt similarity index 66% rename from idea/src/org/jetbrains/kotlin/idea/refactoring/rename/RenameByLabeledReferenceInLambdaArgumentHandler.kt rename to idea/src/org/jetbrains/kotlin/idea/refactoring/rename/RenameByLabeledReferenceHandler.kt index 8670f7e7be3..60ef31d08df 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/rename/RenameByLabeledReferenceInLambdaArgumentHandler.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/rename/RenameByLabeledReferenceHandler.kt @@ -17,34 +17,28 @@ package org.jetbrains.kotlin.idea.refactoring.rename import com.intellij.openapi.actionSystem.DataContext -import com.intellij.openapi.project.Project import com.intellij.psi.PsiElement import org.jetbrains.kotlin.descriptors.FunctionDescriptor import org.jetbrains.kotlin.idea.caches.resolve.analyze import org.jetbrains.kotlin.idea.codeInsight.DescriptorToSourceUtilsIde import org.jetbrains.kotlin.idea.refactoring.project import org.jetbrains.kotlin.idea.references.getCalleeByLambdaArgument +import org.jetbrains.kotlin.psi.KtExpression import org.jetbrains.kotlin.psi.KtFunction import org.jetbrains.kotlin.psi.KtLabelReferenceExpression import org.jetbrains.kotlin.psi.psiUtil.getLabeledParent import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode -class RenameByLabeledReferenceInLambdaArgumentHandler : - AbstractReferenceSubstitutionRenameHandler(KotlinVariableInplaceRenameHandler()) { +class RenameByLabeledReferenceHandler : AbstractReferenceSubstitutionRenameHandler(KotlinVariableInplaceRenameHandler()) { override fun getElementToRename(dataContext: DataContext): PsiElement? { val refExpr = getReferenceExpression(dataContext) as? KtLabelReferenceExpression ?: return null val context = refExpr.analyze(BodyResolveMode.PARTIAL) - val lambda = context[BindingContext.LABEL_TARGET, refExpr] as? KtFunction ?: return null - val labeledParent = lambda.getLabeledParent(refExpr.getReferencedName()) - return if (labeledParent != null) { - labeledParent - } - else { - val calleeExpression = lambda.getCalleeByLambdaArgument() ?: return null - val descriptor = context[BindingContext.REFERENCE_TARGET, calleeExpression] as? FunctionDescriptor ?: return null - DescriptorToSourceUtilsIde.getAnyDeclaration(dataContext.project, descriptor) - } + val labelTarget = context[BindingContext.LABEL_TARGET, refExpr] as? KtExpression ?: return null + val labeledParent = labelTarget.getLabeledParent(refExpr.getReferencedName()) + if (labelTarget !is KtFunction || labeledParent != null) return labeledParent + val calleeExpression = labelTarget.getCalleeByLambdaArgument() ?: return null + val descriptor = context[BindingContext.REFERENCE_TARGET, calleeExpression] as? FunctionDescriptor ?: return null + return DescriptorToSourceUtilsIde.getAnyDeclaration(dataContext.project, descriptor) } - } diff --git a/idea/testData/refactoring/rename/labeledLoopByLabelRefInBreak2/after/test.kt b/idea/testData/refactoring/rename/labeledLoopByLabelRefInBreak2/after/test.kt new file mode 100644 index 00000000000..55b1fd35bb0 --- /dev/null +++ b/idea/testData/refactoring/rename/labeledLoopByLabelRefInBreak2/after/test.kt @@ -0,0 +1,6 @@ +fun test() { + bar@ for (n in 1..10) { + if (n == 5) continue@bar + if (n > 8) break@bar + } +} \ No newline at end of file diff --git a/idea/testData/refactoring/rename/labeledLoopByLabelRefInBreak2/before/test.kt b/idea/testData/refactoring/rename/labeledLoopByLabelRefInBreak2/before/test.kt new file mode 100644 index 00000000000..ae9781731cb --- /dev/null +++ b/idea/testData/refactoring/rename/labeledLoopByLabelRefInBreak2/before/test.kt @@ -0,0 +1,6 @@ +fun test() { + foo@ for (n in 1..10) { + if (n == 5) continue@foo + if (n > 8) break@/*rename*/foo + } +} \ No newline at end of file diff --git a/idea/testData/refactoring/rename/labeledLoopByLabelRefInBreak2/labeledLoopByLabelRefInBreak.test b/idea/testData/refactoring/rename/labeledLoopByLabelRefInBreak2/labeledLoopByLabelRefInBreak.test new file mode 100644 index 00000000000..29ce6c16b62 --- /dev/null +++ b/idea/testData/refactoring/rename/labeledLoopByLabelRefInBreak2/labeledLoopByLabelRefInBreak.test @@ -0,0 +1,5 @@ +{ + "type": "AUTO_DETECT", + "mainFile": "test.kt", + "newName": "bar" +} \ No newline at end of file diff --git a/idea/testData/refactoring/rename/labeledLoopByLabelRefInContinue2/after/test.kt b/idea/testData/refactoring/rename/labeledLoopByLabelRefInContinue2/after/test.kt new file mode 100644 index 00000000000..55b1fd35bb0 --- /dev/null +++ b/idea/testData/refactoring/rename/labeledLoopByLabelRefInContinue2/after/test.kt @@ -0,0 +1,6 @@ +fun test() { + bar@ for (n in 1..10) { + if (n == 5) continue@bar + if (n > 8) break@bar + } +} \ No newline at end of file diff --git a/idea/testData/refactoring/rename/labeledLoopByLabelRefInContinue2/before/test.kt b/idea/testData/refactoring/rename/labeledLoopByLabelRefInContinue2/before/test.kt new file mode 100644 index 00000000000..bfeda481e1e --- /dev/null +++ b/idea/testData/refactoring/rename/labeledLoopByLabelRefInContinue2/before/test.kt @@ -0,0 +1,6 @@ +fun test() { + foo@ for (n in 1..10) { + if (n == 5) continue@/*rename*/foo + if (n > 8) break@foo + } +} \ No newline at end of file diff --git a/idea/testData/refactoring/rename/labeledLoopByLabelRefInContinue2/labeledLoopByLabelRefInContinue.test b/idea/testData/refactoring/rename/labeledLoopByLabelRefInContinue2/labeledLoopByLabelRefInContinue.test new file mode 100644 index 00000000000..29ce6c16b62 --- /dev/null +++ b/idea/testData/refactoring/rename/labeledLoopByLabelRefInContinue2/labeledLoopByLabelRefInContinue.test @@ -0,0 +1,5 @@ +{ + "type": "AUTO_DETECT", + "mainFile": "test.kt", + "newName": "bar" +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/refactoring/rename/RenameTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/refactoring/rename/RenameTestGenerated.java index 04429f8b33c..0d8ac68204f 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/refactoring/rename/RenameTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/refactoring/rename/RenameTestGenerated.java @@ -289,11 +289,21 @@ public class RenameTestGenerated extends AbstractRenameTest { runTest("idea/testData/refactoring/rename/labeledLoopByLabel/labeledLoopByLabel.test"); } + @TestMetadata("labeledLoopByLabelRefInBreak2/labeledLoopByLabelRefInBreak.test") + public void testLabeledLoopByLabelRefInBreak2_LabeledLoopByLabelRefInBreak() throws Exception { + runTest("idea/testData/refactoring/rename/labeledLoopByLabelRefInBreak2/labeledLoopByLabelRefInBreak.test"); + } + @TestMetadata("labeledLoopByLabelRefInBreak/labeledLoopByLabelRefInBreak.test") public void testLabeledLoopByLabelRefInBreak_LabeledLoopByLabelRefInBreak() throws Exception { runTest("idea/testData/refactoring/rename/labeledLoopByLabelRefInBreak/labeledLoopByLabelRefInBreak.test"); } + @TestMetadata("labeledLoopByLabelRefInContinue2/labeledLoopByLabelRefInContinue.test") + public void testLabeledLoopByLabelRefInContinue2_LabeledLoopByLabelRefInContinue() throws Exception { + runTest("idea/testData/refactoring/rename/labeledLoopByLabelRefInContinue2/labeledLoopByLabelRefInContinue.test"); + } + @TestMetadata("labeledLoopByLabelRefInContinue/labeledLoopByLabelRefInContinue.test") public void testLabeledLoopByLabelRefInContinue_LabeledLoopByLabelRefInContinue() throws Exception { runTest("idea/testData/refactoring/rename/labeledLoopByLabelRefInContinue/labeledLoopByLabelRefInContinue.test");