KT-4683 KotlinNullPointerException at remove braces intention
#KT-4683 fixed EA-54686 fixed EA-54687 fixed
This commit is contained in:
@@ -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) {
|
||||||
|
|||||||
Reference in New Issue
Block a user