Skip to content

Commit a3f8816

Browse files
committed
Make add / remove labeled return: extract 'getParentLambdaLabelName'
Related to KT-20439
1 parent 86e6f3c commit a3f8816

File tree

3 files changed

+15
-22
lines changed

3 files changed

+15
-22
lines changed

idea/src/org/jetbrains/kotlin/idea/intentions/AddLabeledReturnInLambdaIntention.kt

Lines changed: 2 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ import com.intellij.openapi.editor.Editor
1010
import com.intellij.openapi.util.TextRange
1111
import org.jetbrains.kotlin.idea.caches.resolve.analyze
1212
import org.jetbrains.kotlin.psi.*
13-
import org.jetbrains.kotlin.psi.psiUtil.*
1413
import org.jetbrains.kotlin.resolve.bindingContextUtil.isUsedAsExpression
1514

1615
class AddLabeledReturnInLambdaIntention : SelfTargetingRangeIntention<KtBlockExpression>(
@@ -19,14 +18,13 @@ class AddLabeledReturnInLambdaIntention : SelfTargetingRangeIntention<KtBlockExp
1918
), LowPriorityAction {
2019
override fun applicabilityRange(element: KtBlockExpression): TextRange? {
2120
if (!isApplicableTo(element)) return null
22-
val labelName = createLabelName(element) ?: return null
21+
val labelName = element.getParentLambdaLabelName() ?: return null
2322
text = "Add return@$labelName"
2423
return element.statements.lastOrNull()?.textRange
2524
}
2625

2726
override fun applyTo(element: KtBlockExpression, editor: Editor?) {
28-
if (!isApplicableTo(element)) return
29-
val labelName = createLabelName(element) ?: return
27+
val labelName = element.getParentLambdaLabelName() ?: return
3028
val lastStatement = element.statements.lastOrNull() ?: return
3129
val newExpression = KtPsiFactory(element.project).createExpressionByPattern("return@$labelName $0", lastStatement)
3230
lastStatement.replace(newExpression)
@@ -36,14 +34,4 @@ class AddLabeledReturnInLambdaIntention : SelfTargetingRangeIntention<KtBlockExp
3634
val lastStatement = block.statements.lastOrNull()
3735
return lastStatement !is KtReturnExpression && lastStatement?.isUsedAsExpression(lastStatement.analyze()) == true
3836
}
39-
40-
private fun createLabelName(block: KtBlockExpression): String? {
41-
val lambdaExpression = block.getStrictParentOfType<KtLambdaExpression>() ?: return null
42-
val callExpression = lambdaExpression.getStrictParentOfType<KtCallExpression>() ?: return null
43-
val valueArgument = callExpression.valueArguments.find {
44-
it.getArgumentExpression()?.unpackFunctionLiteral(allowParentheses = false) === lambdaExpression
45-
} ?: return null
46-
val lambdaLabelName = (valueArgument.getArgumentExpression() as? KtLabeledExpression)?.getLabelName()
47-
return lambdaLabelName ?: callExpression.getCallNameExpression()?.text
48-
}
4937
}

idea/src/org/jetbrains/kotlin/idea/intentions/RemoveLabeledReturnInLambdaIntention.kt

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ package org.jetbrains.kotlin.idea.intentions
88
import com.intellij.codeInsight.intention.LowPriorityAction
99
import com.intellij.openapi.editor.Editor
1010
import org.jetbrains.kotlin.psi.*
11-
import org.jetbrains.kotlin.psi.psiUtil.getCallNameExpression
1211
import org.jetbrains.kotlin.psi.psiUtil.getStrictParentOfType
1312

1413
class RemoveLabeledReturnInLambdaIntention : SelfTargetingIntention<KtReturnExpression>(
@@ -19,13 +18,7 @@ class RemoveLabeledReturnInLambdaIntention : SelfTargetingIntention<KtReturnExpr
1918
val labelName = element.getLabelName() ?: return false
2019
val block = element.getStrictParentOfType<KtBlockExpression>() ?: return false
2120
if (block.statements.lastOrNull() != element) return false
22-
val lambdaExpression = block.getStrictParentOfType<KtLambdaExpression>() ?: return false
23-
val callExpression = lambdaExpression.getStrictParentOfType<KtCallExpression>() ?: return false
24-
val lambdaArgument = callExpression.lambdaArguments.find {
25-
it.getArgumentExpression().unpackFunctionLiteral(allowParentheses = false) === lambdaExpression
26-
} ?: return false
27-
val callName = (lambdaArgument.getArgumentExpression() as? KtLabeledExpression)?.getLabelName()
28-
?: callExpression.getCallNameExpression()?.text ?: return false
21+
val callName = block.getParentLambdaLabelName() ?: return false
2922
if (labelName != callName) return false
3023
text = "Remove return@$labelName"
3124
return true

idea/src/org/jetbrains/kotlin/idea/intentions/Utils.kt

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ import org.jetbrains.kotlin.idea.references.mainReference
3030
import org.jetbrains.kotlin.lexer.KtTokens
3131
import org.jetbrains.kotlin.name.Name
3232
import org.jetbrains.kotlin.psi.*
33+
import org.jetbrains.kotlin.psi.psiUtil.getCallNameExpression
34+
import org.jetbrains.kotlin.psi.psiUtil.getStrictParentOfType
3335
import org.jetbrains.kotlin.resolve.BindingContext
3436
import org.jetbrains.kotlin.resolve.CollectionLiteralResolver
3537
import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall
@@ -294,3 +296,13 @@ fun KtCallExpression.isArrayOfMethod(): Boolean {
294296
return (descriptor.containingDeclaration as? PackageFragmentDescriptor)?.fqName == KotlinBuiltIns.BUILT_INS_PACKAGE_FQ_NAME &&
295297
ARRAY_OF_METHODS.contains(descriptor.name)
296298
}
299+
300+
fun KtBlockExpression.getParentLambdaLabelName(): String? {
301+
val lambdaExpression = getStrictParentOfType<KtLambdaExpression>() ?: return null
302+
val callExpression = lambdaExpression.getStrictParentOfType<KtCallExpression>() ?: return null
303+
val valueArgument = callExpression.valueArguments.find {
304+
it.getArgumentExpression()?.unpackFunctionLiteral(allowParentheses = false) === lambdaExpression
305+
} ?: return null
306+
val lambdaLabelName = (valueArgument.getArgumentExpression() as? KtLabeledExpression)?.getLabelName()
307+
return lambdaLabelName ?: callExpression.getCallNameExpression()?.text
308+
}

0 commit comments

Comments
 (0)