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
public class AddBracesIntention : JetSelfTargetingIntention<JetExpressionImpl>("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()
}
@@ -30,11 +30,12 @@ public abstract class JetSelfTargetingIntention<T: JetElement>(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 {
@@ -30,29 +30,27 @@ import com.intellij.psi.PsiWhiteSpace
import com.intellij.psi.PsiComment
public class RemoveBracesIntention : JetSelfTargetingIntention<JetExpressionImpl>("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<JetExpressionImpl
if (expressionKind == ExpressionKind.DOWHILE) {
newElement.getParent()!!.addAfter(JetPsiFactory.createNewLine(element.getProject()), newElement)
}
}
fun handleComments(element: JetExpressionImpl, blockElement: JetBlockExpression) {