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");