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))
}