From b959c7f2c004e1cd6f37789979088e350e9f2c82 Mon Sep 17 00:00:00 2001 From: Valentin Kipyatkov Date: Tue, 28 Apr 2015 15:57:33 +0300 Subject: [PATCH] "Move lambda argument out of parentheses" intention - smaller range --- .../kotlin/idea/JetBundle.properties | 2 -- .../MoveLambdaOutsideParenthesesIntention.kt | 30 ++++++++++--------- .../inapplicable1.kt | 2 +- .../labeledLambda.kt | 2 +- .../moveLambda1.kt | 2 +- .../moveLambda1.kt.after | 2 +- .../moveLambda2.kt | 2 +- .../moveLambda2.kt.after | 2 +- .../moveLambda3.kt | 2 +- .../moveLambda4.kt | 4 +-- .../{moveLambda7.kt => moveLambda5.kt} | 2 +- ...eLambda7.kt.after => moveLambda5.kt.after} | 0 .../{moveLambda8.kt => moveLambda6.kt} | 2 +- ...eLambda8.kt.after => moveLambda6.kt.after} | 0 .../intentions/IntentionTestGenerated.java | 12 ++++---- 15 files changed, 33 insertions(+), 33 deletions(-) rename idea/testData/intentions/moveLambdaOutsideParentheses/{moveLambda7.kt => moveLambda5.kt} (70%) rename idea/testData/intentions/moveLambdaOutsideParentheses/{moveLambda7.kt.after => moveLambda5.kt.after} (100%) rename idea/testData/intentions/moveLambdaOutsideParentheses/{moveLambda8.kt => moveLambda6.kt} (82%) rename idea/testData/intentions/moveLambdaOutsideParentheses/{moveLambda8.kt.after => moveLambda6.kt.after} (100%) diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/JetBundle.properties b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/JetBundle.properties index fb97e3f46dc..7557400a6e7 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/JetBundle.properties +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/JetBundle.properties @@ -302,8 +302,6 @@ replace.with.infix.function.call.intention.error.resolution.failed=The element c replace.with.infix.function.call.intention.error.package.call=Cannot be applied with a package as the receiver replace.explicit.function.literal.param.with.it=Replace explicit parameter ''{0}'' with ''it'' replace.explicit.function.literal.param.with.it.family=Replace Explicit Parameter with 'it' -move.lambda.outside.parentheses=Move lambda expression out of parentheses -move.lambda.outside.parentheses.family=Move Lambda Expression out of Parentheses replace.it.with.explicit.function.literal.param=Replace 'it' with explicit parameter replace.it.with.explicit.function.literal.param.family=Replace 'it' with Explicit Parameter split.if=Split into 2 if's diff --git a/idea/src/org/jetbrains/kotlin/idea/intentions/MoveLambdaOutsideParenthesesIntention.kt b/idea/src/org/jetbrains/kotlin/idea/intentions/MoveLambdaOutsideParenthesesIntention.kt index c7cee2909f6..7098911e171 100644 --- a/idea/src/org/jetbrains/kotlin/idea/intentions/MoveLambdaOutsideParenthesesIntention.kt +++ b/idea/src/org/jetbrains/kotlin/idea/intentions/MoveLambdaOutsideParenthesesIntention.kt @@ -18,23 +18,25 @@ package org.jetbrains.kotlin.idea.intentions import com.intellij.openapi.editor.Editor import org.jetbrains.kotlin.idea.util.psiModificationUtil.moveLambdaOutsideParentheses -import org.jetbrains.kotlin.psi.JetCallExpression -import org.jetbrains.kotlin.psi.JetFunctionLiteralExpression -import org.jetbrains.kotlin.psi.JetPsiFactory -import org.jetbrains.kotlin.psi.JetExpression -import org.jetbrains.kotlin.psi.JetLabeledExpression +import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.resolve.calls.callUtil.getValueArgumentsInParentheses -public class MoveLambdaOutsideParenthesesIntention : JetSelfTargetingOffsetIndependentIntention( - "move.lambda.outside.parentheses", javaClass()) { +public class MoveLambdaOutsideParenthesesIntention : JetSelfTargetingIntention(javaClass(), "Move lambda argument out of parentheses") { + override fun isApplicableTo(element: JetCallExpression, caretOffset: Int): Boolean { + val argument = element.getValueArgumentsInParentheses().lastOrNull() ?: return false + val expression = argument.getArgumentExpression() ?: return false + val functionLiteral = getFunctionLiteral(expression) ?: return false + if (caretOffset < argument.asElement().getTextRange().getStartOffset()) return false + val bodyRange = functionLiteral.getBodyExpression()?.getTextRange() ?: return true + return caretOffset <= bodyRange.getStartOffset() || caretOffset >= bodyRange.getEndOffset() + } - private fun isLambdaOrLabeledLambda(expression: JetExpression?): Boolean = - expression is JetFunctionLiteralExpression || - (expression is JetLabeledExpression && isLambdaOrLabeledLambda(expression.getBaseExpression())) - - override fun isApplicableTo(element: JetCallExpression): Boolean { - val args = element.getValueArgumentsInParentheses() - return args.size > 0 && isLambdaOrLabeledLambda(args.last?.getArgumentExpression()) + private fun getFunctionLiteral(expression: JetExpression?): JetFunctionLiteral? { + return when (expression) { + is JetFunctionLiteralExpression -> expression.getFunctionLiteral() + is JetLabeledExpression -> getFunctionLiteral(expression.getBaseExpression()) + else -> null + } } override fun applyTo(element: JetCallExpression, editor: Editor) { diff --git a/idea/testData/intentions/moveLambdaOutsideParentheses/inapplicable1.kt b/idea/testData/intentions/moveLambdaOutsideParentheses/inapplicable1.kt index 24af5abf2ce..c34d970eac1 100644 --- a/idea/testData/intentions/moveLambdaOutsideParentheses/inapplicable1.kt +++ b/idea/testData/intentions/moveLambdaOutsideParentheses/inapplicable1.kt @@ -1,6 +1,6 @@ // IS_APPLICABLE: false fun foo() { - bar() { it } + bar() { it } } fun bar(b: (Int) -> Int) { diff --git a/idea/testData/intentions/moveLambdaOutsideParentheses/labeledLambda.kt b/idea/testData/intentions/moveLambdaOutsideParentheses/labeledLambda.kt index 45a4160ca44..8b70112ad9d 100644 --- a/idea/testData/intentions/moveLambdaOutsideParentheses/labeledLambda.kt +++ b/idea/testData/intentions/moveLambdaOutsideParentheses/labeledLambda.kt @@ -1,6 +1,6 @@ // IS_APPLICABLE: true fun foo() { - bar(2, l@{ it }) + bar(2, l@{ it }) } fun bar(a: Int, b: (Int) -> Int) { diff --git a/idea/testData/intentions/moveLambdaOutsideParentheses/moveLambda1.kt b/idea/testData/intentions/moveLambdaOutsideParentheses/moveLambda1.kt index 862f1c52a1d..934d23d4ffb 100644 --- a/idea/testData/intentions/moveLambdaOutsideParentheses/moveLambda1.kt +++ b/idea/testData/intentions/moveLambdaOutsideParentheses/moveLambda1.kt @@ -1,6 +1,6 @@ // IS_APPLICABLE: true fun foo() { - bar(2, { it }) + bar(2, { it }) } fun bar(a: Int, b: (Int) -> Int) { diff --git a/idea/testData/intentions/moveLambdaOutsideParentheses/moveLambda1.kt.after b/idea/testData/intentions/moveLambdaOutsideParentheses/moveLambda1.kt.after index 63796900007..d61f3ccb36e 100644 --- a/idea/testData/intentions/moveLambdaOutsideParentheses/moveLambda1.kt.after +++ b/idea/testData/intentions/moveLambdaOutsideParentheses/moveLambda1.kt.after @@ -1,6 +1,6 @@ // IS_APPLICABLE: true fun foo() { - bar(2) { it } + bar(2) { it } } fun bar(a: Int, b: (Int) -> Int) { diff --git a/idea/testData/intentions/moveLambdaOutsideParentheses/moveLambda2.kt b/idea/testData/intentions/moveLambdaOutsideParentheses/moveLambda2.kt index 3f9f7c2fe35..30cd047d8ef 100644 --- a/idea/testData/intentions/moveLambdaOutsideParentheses/moveLambda2.kt +++ b/idea/testData/intentions/moveLambdaOutsideParentheses/moveLambda2.kt @@ -1,6 +1,6 @@ // IS_APPLICABLE: true fun foo() { - bar(a = 2, b = { it }) + bar(a = 2, b = { it }) } fun bar(a: Int, b: (Int) -> Int) { diff --git a/idea/testData/intentions/moveLambdaOutsideParentheses/moveLambda2.kt.after b/idea/testData/intentions/moveLambdaOutsideParentheses/moveLambda2.kt.after index 99b0d279b5a..5da897035bd 100644 --- a/idea/testData/intentions/moveLambdaOutsideParentheses/moveLambda2.kt.after +++ b/idea/testData/intentions/moveLambdaOutsideParentheses/moveLambda2.kt.after @@ -1,6 +1,6 @@ // IS_APPLICABLE: true fun foo() { - bar(a = 2) { it } + bar(a = 2) { it } } fun bar(a: Int, b: (Int) -> Int) { diff --git a/idea/testData/intentions/moveLambdaOutsideParentheses/moveLambda3.kt b/idea/testData/intentions/moveLambdaOutsideParentheses/moveLambda3.kt index b64da51a30e..f03fd2148c4 100644 --- a/idea/testData/intentions/moveLambdaOutsideParentheses/moveLambda3.kt +++ b/idea/testData/intentions/moveLambdaOutsideParentheses/moveLambda3.kt @@ -3,7 +3,7 @@ // ERROR: No value passed for parameter b // ERROR: Unresolved reference: it fun foo() { - bar({ it }) + bar({ it }) } fun bar(a: Int, b: (Int) -> Int) { diff --git a/idea/testData/intentions/moveLambdaOutsideParentheses/moveLambda4.kt b/idea/testData/intentions/moveLambdaOutsideParentheses/moveLambda4.kt index c6af1292d25..748b2534dc6 100644 --- a/idea/testData/intentions/moveLambdaOutsideParentheses/moveLambda4.kt +++ b/idea/testData/intentions/moveLambdaOutsideParentheses/moveLambda4.kt @@ -1,9 +1,9 @@ // IS_APPLICABLE: true fun foo() { - bar(2, { + bar(2, { val x = 3 it * x - }) + }) } fun bar(a: Int, b: (Int) -> Int) { diff --git a/idea/testData/intentions/moveLambdaOutsideParentheses/moveLambda7.kt b/idea/testData/intentions/moveLambdaOutsideParentheses/moveLambda5.kt similarity index 70% rename from idea/testData/intentions/moveLambdaOutsideParentheses/moveLambda7.kt rename to idea/testData/intentions/moveLambdaOutsideParentheses/moveLambda5.kt index 3b9423e0be6..19a0b815728 100644 --- a/idea/testData/intentions/moveLambdaOutsideParentheses/moveLambda7.kt +++ b/idea/testData/intentions/moveLambdaOutsideParentheses/moveLambda5.kt @@ -1,6 +1,6 @@ // IS_APPLICABLE: true fun foo() { - bar(name1 = 3, name2 = 2, name3 = 1, name4 = { it }) + bar(name1 = 3, name2 = 2, name3 = 1, name4 = { it }) } fun bar(name1: Int, name2: Int, name3: Int, name4: (Int) -> Int) : Int { diff --git a/idea/testData/intentions/moveLambdaOutsideParentheses/moveLambda7.kt.after b/idea/testData/intentions/moveLambdaOutsideParentheses/moveLambda5.kt.after similarity index 100% rename from idea/testData/intentions/moveLambdaOutsideParentheses/moveLambda7.kt.after rename to idea/testData/intentions/moveLambdaOutsideParentheses/moveLambda5.kt.after diff --git a/idea/testData/intentions/moveLambdaOutsideParentheses/moveLambda8.kt b/idea/testData/intentions/moveLambdaOutsideParentheses/moveLambda6.kt similarity index 82% rename from idea/testData/intentions/moveLambdaOutsideParentheses/moveLambda8.kt rename to idea/testData/intentions/moveLambdaOutsideParentheses/moveLambda6.kt index 3622b3bb1f3..270d607f727 100644 --- a/idea/testData/intentions/moveLambdaOutsideParentheses/moveLambda8.kt +++ b/idea/testData/intentions/moveLambdaOutsideParentheses/moveLambda6.kt @@ -1,6 +1,6 @@ // IS_APPLICABLE: true fun foo() { - bar(3, 2, 1, { it }) + bar(3, 2, 1, { it }) } fun bar(name1: Int, name2: Int, name3: Int, name4: (Int) -> Int) : Int { diff --git a/idea/testData/intentions/moveLambdaOutsideParentheses/moveLambda8.kt.after b/idea/testData/intentions/moveLambdaOutsideParentheses/moveLambda6.kt.after similarity index 100% rename from idea/testData/intentions/moveLambdaOutsideParentheses/moveLambda8.kt.after rename to idea/testData/intentions/moveLambdaOutsideParentheses/moveLambda6.kt.after diff --git a/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java index 2de2f8caead..3d46d77b5a2 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java @@ -4591,15 +4591,15 @@ public class IntentionTestGenerated extends AbstractIntentionTest { doTest(fileName); } - @TestMetadata("moveLambda7.kt") - public void testMoveLambda7() throws Exception { - String fileName = JetTestUtils.navigationMetadata("idea/testData/intentions/moveLambdaOutsideParentheses/moveLambda7.kt"); + @TestMetadata("moveLambda5.kt") + public void testMoveLambda5() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/intentions/moveLambdaOutsideParentheses/moveLambda5.kt"); doTest(fileName); } - @TestMetadata("moveLambda8.kt") - public void testMoveLambda8() throws Exception { - String fileName = JetTestUtils.navigationMetadata("idea/testData/intentions/moveLambdaOutsideParentheses/moveLambda8.kt"); + @TestMetadata("moveLambda6.kt") + public void testMoveLambda6() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/intentions/moveLambdaOutsideParentheses/moveLambda6.kt"); doTest(fileName); } }