From f61470943aa0576c159190f589df483e68431d48 Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Wed, 19 Mar 2014 23:20:24 +0400 Subject: [PATCH] KT-4683 KotlinNullPointerException at remove braces intention #KT-4683 fixed EA-54686 fixed EA-54687 fixed --- .../plugin/intentions/AddBracesIntention.kt | 19 ++++++++----------- .../intentions/JetSelfTargetingIntention.kt | 3 ++- .../intentions/RemoveBracesIntention.kt | 19 ++++++++----------- 3 files changed, 18 insertions(+), 23 deletions(-) diff --git a/idea/src/org/jetbrains/jet/plugin/intentions/AddBracesIntention.kt b/idea/src/org/jetbrains/jet/plugin/intentions/AddBracesIntention.kt index 3d03d7cd685..b1fe96929b8 100644 --- a/idea/src/org/jetbrains/jet/plugin/intentions/AddBracesIntention.kt +++ b/idea/src/org/jetbrains/jet/plugin/intentions/AddBracesIntention.kt @@ -32,35 +32,32 @@ import org.jetbrains.jet.JetNodeTypes import com.intellij.psi.PsiWhiteSpace public class AddBracesIntention : JetSelfTargetingIntention("add.braces", javaClass()) { - private var expressionKind: ExpressionKind? = null - private var caretLocation: Int = 1 - - override fun isAvailable(project: Project, editor: Editor, file: PsiFile): Boolean { - caretLocation = editor.getCaretModel().getOffset() - return getTarget(editor, file) != null + override fun isApplicableTo(element: JetExpressionImpl): Boolean { + throw IllegalStateException("isApplicableTo(JetExpressionImpl, Editor) should be called instead") } - override fun isApplicableTo(element: JetExpressionImpl): Boolean { - expressionKind = element.getExpressionKind(caretLocation) + override fun isApplicableTo(element: JetExpressionImpl, editor: Editor): Boolean { + val expressionKind = element.getExpressionKind(editor.getCaretModel().getOffset()) if (expressionKind == null) return false val jetBlockElement = element.findBlockInExpression(expressionKind) if (jetBlockElement != null) return false - setText("Add braces to '${expressionKind!!.text}' statement") + setText("Add braces to '${expressionKind.text}' statement") return true } override fun applyTo(element: JetExpressionImpl, editor: Editor) { + val expressionKind = element.getExpressionKind(editor.getCaretModel().getOffset())!! val bodyNode = when (expressionKind) { ExpressionKind.ELSE -> element.getNode().findChildByType(JetNodeTypes.ELSE) ExpressionKind.IF -> element.getNode().findChildByType(JetNodeTypes.THEN) else -> element.getNode().findChildByType(JetNodeTypes.BODY) } - generateCleanOutput(element, bodyNode) + generateCleanOutput(element, bodyNode, expressionKind) } - fun generateCleanOutput(element: JetExpressionImpl, bodyNode: ASTNode?) { + fun generateCleanOutput(element: JetExpressionImpl, bodyNode: ASTNode?, expressionKind: ExpressionKind) { if (element.getNextSibling()?.getText() == ";") { element.getNextSibling()!!.delete() } diff --git a/idea/src/org/jetbrains/jet/plugin/intentions/JetSelfTargetingIntention.kt b/idea/src/org/jetbrains/jet/plugin/intentions/JetSelfTargetingIntention.kt index a61370e6720..0f8eb31abb5 100644 --- a/idea/src/org/jetbrains/jet/plugin/intentions/JetSelfTargetingIntention.kt +++ b/idea/src/org/jetbrains/jet/plugin/intentions/JetSelfTargetingIntention.kt @@ -30,11 +30,12 @@ public abstract class JetSelfTargetingIntention(val key: String, } protected abstract fun isApplicableTo(element: T): Boolean + protected open fun isApplicableTo(element: T, editor: Editor): Boolean = isApplicableTo(element) protected abstract fun applyTo(element: T, editor: Editor) protected fun getTarget(editor: Editor, file: PsiFile): T? { val offset = editor.getCaretModel().getOffset() - return file.findElementAt(offset)?.getParentByTypesAndPredicate(false, elementType) { element -> isApplicableTo(element) } + return file.findElementAt(offset)?.getParentByTypesAndPredicate(false, elementType) { element -> isApplicableTo(element, editor) } } public override fun getFamilyName(): String { diff --git a/idea/src/org/jetbrains/jet/plugin/intentions/RemoveBracesIntention.kt b/idea/src/org/jetbrains/jet/plugin/intentions/RemoveBracesIntention.kt index ec1a34e1694..f72b02ac7d1 100644 --- a/idea/src/org/jetbrains/jet/plugin/intentions/RemoveBracesIntention.kt +++ b/idea/src/org/jetbrains/jet/plugin/intentions/RemoveBracesIntention.kt @@ -30,29 +30,27 @@ import com.intellij.psi.PsiWhiteSpace import com.intellij.psi.PsiComment public class RemoveBracesIntention : JetSelfTargetingIntention("remove.braces", javaClass()) { - private var expressionKind: ExpressionKind? = null - private var caretLocation: Int = 1 - - override fun isAvailable(project: Project, editor: Editor, file: PsiFile): Boolean { - caretLocation = editor.getCaretModel().getOffset() - return getTarget(editor, file) != null + override fun isApplicableTo(element: JetExpressionImpl): Boolean { + throw IllegalStateException("isApplicableTo(JetExpressionImpl, Editor) should be called instead") } - override fun isApplicableTo(element: JetExpressionImpl): Boolean { - expressionKind = element.getExpressionKind(caretLocation) + override fun isApplicableTo(element: JetExpressionImpl, editor: Editor): Boolean { + val expressionKind = element.getExpressionKind(editor.getCaretModel().getOffset()) if (expressionKind == null) return false val jetBlockElement = element.findBlockInExpression(expressionKind) if (jetBlockElement == null) return false - if (jetBlockElement!!.getStatements().size == 1) { - setText("Remove braces from '${expressionKind!!.text}' statement") + if (jetBlockElement.getStatements().size == 1) { + setText("Remove braces from '${expressionKind.text}' statement") return true } return false } override fun applyTo(element: JetExpressionImpl, editor: Editor) { + val expressionKind = element.getExpressionKind(editor.getCaretModel().getOffset())!! + val jetBlockElement = element.findBlockInExpression(expressionKind) val firstStatement = jetBlockElement!!.getStatements().first() @@ -63,7 +61,6 @@ public class RemoveBracesIntention : JetSelfTargetingIntention