Supported moving a labeled lambda outside parentheses

This commit is contained in:
Svetlana Isakova
2014-05-29 17:17:55 +04:00
parent 41df522234
commit beb7dc4524
4 changed files with 33 additions and 15 deletions
@@ -20,37 +20,34 @@ import com.intellij.openapi.editor.Editor
import org.jetbrains.jet.lang.psi.JetCallExpression
import org.jetbrains.jet.lang.psi.JetFunctionLiteralExpression
import org.jetbrains.jet.lang.psi.JetPsiFactory
import org.jetbrains.jet.lang.psi.JetExpression
import org.jetbrains.jet.lang.psi.JetLabeledExpression
public class MoveLambdaOutsideParenthesesIntention : JetSelfTargetingIntention<JetCallExpression>(
"move.lambda.outside.parentheses", javaClass()) {
private fun isLambdaOrLabeledLambda(expression: JetExpression?): Boolean =
expression is JetFunctionLiteralExpression ||
(expression is JetLabeledExpression && isLambdaOrLabeledLambda(expression.getBaseExpression()))
override fun isApplicableTo(element: JetCallExpression): Boolean {
val args = element.getValueArguments()
return args.size > 0 && args.last?.getArgumentExpression() is JetFunctionLiteralExpression
return args.size > 0 && isLambdaOrLabeledLambda(args.last?.getArgumentExpression())
}
override fun applyTo(element: JetCallExpression, editor: Editor) {
val args = element.getValueArguments()
val literal = args.last!!.getArgumentExpression()?.getText()
val functionLiteral = args.last!!.getArgumentExpression()?.getText()
val calleeText = element.getCalleeExpression()?.getText()
if (calleeText == null || literal == null) return
if (calleeText == null || functionLiteral == null) return
val params =
args.subList(0, args.size - 1).map {
val name = it?.getArgumentName()?.getText()
val arg = it?.getArgumentExpression()?.getText()
if (name != null) {
"$name = $arg"
} else {
"$arg"
}
}.makeString(", ", "(", ")")
val params = args.subList(0, args.size - 1).map { it?.asElement()?.getText() ?: "" }.makeString(", ", "(", ")")
val newCall =
if (params == "()") {
"$calleeText $literal"
"$calleeText $functionLiteral"
} else {
"$calleeText$params $literal"
"$calleeText$params $functionLiteral"
}
element.replace(JetPsiFactory.createExpression(element.getProject(), newCall))
}
@@ -0,0 +1,8 @@
// IS_APPLICABLE: true
fun foo() {
bar<caret>(2, @l{ it })
}
fun bar(a: Int, b: (Int) -> Int) {
b(a)
}
@@ -0,0 +1,8 @@
// IS_APPLICABLE: true
fun foo() {
bar(2) @l{ it }
}
fun bar(a: Int, b: (Int) -> Int) {
b(a)
}
@@ -2537,6 +2537,11 @@ public class CodeTransformationTestGenerated extends AbstractCodeTransformationT
doTestMoveLambdaOutsideParentheses("idea/testData/intentions/moveLambdaOutsideParentheses/inapplicable3.kt");
}
@TestMetadata("labeledLambda.kt")
public void testLabeledLambda() throws Exception {
doTestMoveLambdaOutsideParentheses("idea/testData/intentions/moveLambdaOutsideParentheses/labeledLambda.kt");
}
@TestMetadata("lambdaWithCommas.kt")
public void testLambdaWithCommas() throws Exception {
doTestMoveLambdaOutsideParentheses("idea/testData/intentions/moveLambdaOutsideParentheses/lambdaWithCommas.kt");