KT-4683 KotlinNullPointerException at remove braces intention

#KT-4683 fixed
 EA-54686 fixed
 EA-54687 fixed
This commit is contained in:
Evgeny Gerashchenko
2014-03-19 23:20:24 +04:00
parent 7b8e6fa462
commit f61470943a
3 changed files with 18 additions and 23 deletions
@@ -32,35 +32,32 @@ import org.jetbrains.jet.JetNodeTypes
import com.intellij.psi.PsiWhiteSpace import com.intellij.psi.PsiWhiteSpace
public class AddBracesIntention : JetSelfTargetingIntention<JetExpressionImpl>("add.braces", javaClass()) { public class AddBracesIntention : JetSelfTargetingIntention<JetExpressionImpl>("add.braces", javaClass()) {
private var expressionKind: ExpressionKind? = null override fun isApplicableTo(element: JetExpressionImpl): Boolean {
private var caretLocation: Int = 1 throw IllegalStateException("isApplicableTo(JetExpressionImpl, Editor) should be called instead")
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 { override fun isApplicableTo(element: JetExpressionImpl, editor: Editor): Boolean {
expressionKind = element.getExpressionKind(caretLocation) val expressionKind = element.getExpressionKind(editor.getCaretModel().getOffset())
if (expressionKind == null) return false if (expressionKind == null) return false
val jetBlockElement = element.findBlockInExpression(expressionKind) val jetBlockElement = element.findBlockInExpression(expressionKind)
if (jetBlockElement != null) return false if (jetBlockElement != null) return false
setText("Add braces to '${expressionKind!!.text}' statement") setText("Add braces to '${expressionKind.text}' statement")
return true return true
} }
override fun applyTo(element: JetExpressionImpl, editor: Editor) { override fun applyTo(element: JetExpressionImpl, editor: Editor) {
val expressionKind = element.getExpressionKind(editor.getCaretModel().getOffset())!!
val bodyNode = when (expressionKind) { val bodyNode = when (expressionKind) {
ExpressionKind.ELSE -> element.getNode().findChildByType(JetNodeTypes.ELSE) ExpressionKind.ELSE -> element.getNode().findChildByType(JetNodeTypes.ELSE)
ExpressionKind.IF -> element.getNode().findChildByType(JetNodeTypes.THEN) ExpressionKind.IF -> element.getNode().findChildByType(JetNodeTypes.THEN)
else -> element.getNode().findChildByType(JetNodeTypes.BODY) 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() == ";") { if (element.getNextSibling()?.getText() == ";") {
element.getNextSibling()!!.delete() element.getNextSibling()!!.delete()
} }
@@ -30,11 +30,12 @@ public abstract class JetSelfTargetingIntention<T: JetElement>(val key: String,
} }
protected abstract fun isApplicableTo(element: T): Boolean 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 abstract fun applyTo(element: T, editor: Editor)
protected fun getTarget(editor: Editor, file: PsiFile): T? { protected fun getTarget(editor: Editor, file: PsiFile): T? {
val offset = editor.getCaretModel().getOffset() 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 { public override fun getFamilyName(): String {
@@ -30,29 +30,27 @@ import com.intellij.psi.PsiWhiteSpace
import com.intellij.psi.PsiComment import com.intellij.psi.PsiComment
public class RemoveBracesIntention : JetSelfTargetingIntention<JetExpressionImpl>("remove.braces", javaClass()) { public class RemoveBracesIntention : JetSelfTargetingIntention<JetExpressionImpl>("remove.braces", javaClass()) {
private var expressionKind: ExpressionKind? = null override fun isApplicableTo(element: JetExpressionImpl): Boolean {
private var caretLocation: Int = 1 throw IllegalStateException("isApplicableTo(JetExpressionImpl, Editor) should be called instead")
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 { override fun isApplicableTo(element: JetExpressionImpl, editor: Editor): Boolean {
expressionKind = element.getExpressionKind(caretLocation) val expressionKind = element.getExpressionKind(editor.getCaretModel().getOffset())
if (expressionKind == null) return false if (expressionKind == null) return false
val jetBlockElement = element.findBlockInExpression(expressionKind) val jetBlockElement = element.findBlockInExpression(expressionKind)
if (jetBlockElement == null) return false if (jetBlockElement == null) return false
if (jetBlockElement!!.getStatements().size == 1) { if (jetBlockElement.getStatements().size == 1) {
setText("Remove braces from '${expressionKind!!.text}' statement") setText("Remove braces from '${expressionKind.text}' statement")
return true return true
} }
return false return false
} }
override fun applyTo(element: JetExpressionImpl, editor: Editor) { override fun applyTo(element: JetExpressionImpl, editor: Editor) {
val expressionKind = element.getExpressionKind(editor.getCaretModel().getOffset())!!
val jetBlockElement = element.findBlockInExpression(expressionKind) val jetBlockElement = element.findBlockInExpression(expressionKind)
val firstStatement = jetBlockElement!!.getStatements().first() val firstStatement = jetBlockElement!!.getStatements().first()
@@ -63,7 +61,6 @@ public class RemoveBracesIntention : JetSelfTargetingIntention<JetExpressionImpl
if (expressionKind == ExpressionKind.DOWHILE) { if (expressionKind == ExpressionKind.DOWHILE) {
newElement.getParent()!!.addAfter(JetPsiFactory.createNewLine(element.getProject()), newElement) newElement.getParent()!!.addAfter(JetPsiFactory.createNewLine(element.getProject()), newElement)
} }
} }
fun handleComments(element: JetExpressionImpl, blockElement: JetBlockExpression) { fun handleComments(element: JetExpressionImpl, blockElement: JetBlockExpression) {