Refactoring of JetSelfTargetingInspection

This commit is contained in:
Valentin Kipyatkov
2015-04-14 13:17:58 +03:00
parent 894bf000e1
commit 00a4beae1d
51 changed files with 178 additions and 253 deletions
@@ -16,22 +16,18 @@
package org.jetbrains.kotlin.idea.inspections
import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.psi.JetElement
import com.intellij.psi.PsiElementVisitor
import com.intellij.codeInspection.LocalInspectionToolSession
import com.intellij.codeInspection.ProblemsHolder
import com.intellij.codeInspection.ProblemHighlightType
import com.intellij.codeInspection.LocalQuickFix
import com.intellij.openapi.project.Project
import com.intellij.codeInspection.ProblemDescriptor
import org.jetbrains.kotlin.idea.intentions.JetSelfTargetingIntention
import com.intellij.openapi.fileEditor.FileDocumentManager
import com.intellij.openapi.editor.EditorFactory
import com.intellij.codeInspection.*
import com.intellij.openapi.editor.Editor
import com.intellij.openapi.editor.EditorFactory
import com.intellij.openapi.fileEditor.FileDocumentManager
import com.intellij.openapi.project.Project
import com.intellij.psi.PsiElement
import com.intellij.psi.PsiElementVisitor
import org.jetbrains.kotlin.idea.intentions.JetSelfTargetingOffsetIndependentIntention
import org.jetbrains.kotlin.psi.JetElement
public abstract class IntentionBasedInspection<T: JetElement>(
protected val intention: JetSelfTargetingIntention<T>
protected val intention: JetSelfTargetingOffsetIndependentIntention<T>
) : AbstractKotlinInspection() {
override fun buildVisitor(holder: ProblemsHolder, isOnTheFly: Boolean, session: LocalInspectionToolSession): PsiElementVisitor {
return object: PsiElementVisitor() {
@@ -70,11 +66,8 @@ public abstract class IntentionBasedInspection<T: JetElement>(
}
private fun PsiElement.getOrCreateEditor(): Editor? {
val file = getContainingFile()?.getVirtualFile()
if (file == null) return null
val document = FileDocumentManager.getInstance()!!.getDocument(file)
if (document == null) return null
val file = getContainingFile()?.getVirtualFile() ?: return null
val document = FileDocumentManager.getInstance().getDocument(file) ?: return null
val editorFactory = EditorFactory.getInstance()!!
@@ -37,27 +37,42 @@ public abstract class JetSelfTargetingIntention<T: JetElement>(
this.text = text
}
override fun getText() = text
override fun getFamilyName() = familyName
final override fun getText() = text
final override fun getFamilyName() = familyName
public abstract fun isApplicableTo(element: T, caretOffset: Int): Boolean
public abstract fun isApplicableTo(element: T): Boolean
public open fun isApplicableTo(element: T, editor: Editor): Boolean = isApplicableTo(element)
public abstract fun applyTo(element: T, editor: Editor)
protected fun getTarget(editor: Editor, file: PsiFile): T? {
private fun getTarget(editor: Editor, file: PsiFile): T? {
val offset = editor.getCaretModel().getOffset()
return file.findElementAt(offset)?.getParentOfTypesAndPredicate(false, elementType) { element -> isApplicableTo(element, editor) }
return file.findElementAt(offset)?.getParentOfTypesAndPredicate(false, elementType) { element -> isApplicableTo(element, offset) }
}
override fun isAvailable(project: Project, editor: Editor, file: PsiFile)
final override fun isAvailable(project: Project, editor: Editor, file: PsiFile)
= getTarget(editor, file) != null
override fun invoke(project: Project, editor: Editor, file: PsiFile): Unit {
final override fun invoke(project: Project, editor: Editor, file: PsiFile): Unit {
val target = getTarget(editor, file) ?: error("Intention is not applicable")
applyTo(target, editor)
}
override fun startInWriteAction(): Boolean = true
override fun startInWriteAction() = true
override fun toString(): String = getText()
}
public abstract class JetSelfTargetingOffsetIndependentIntention<T: JetElement>(
elementType: Class<T>,
text: String,
familyName: String)
: JetSelfTargetingIntention<T>(elementType, text, familyName) {
deprecated("Use primary constructor, no need to use i18n")
public constructor(key: String, elementType: Class<T>) : this(elementType, JetBundle.message(key), JetBundle.message(key + ".family")) {
}
public abstract fun isApplicableTo(element: T): Boolean
override final fun isApplicableTo(element: T, caretOffset: Int): Boolean = isApplicableTo(element)
}
@@ -32,7 +32,7 @@ import org.jetbrains.kotlin.descriptors.FunctionDescriptor
import org.jetbrains.kotlin.resolve.calls.callUtil.getResolvedCall
import org.jetbrains.kotlin.idea.caches.resolve.analyze
public class OperatorToFunctionIntention : JetSelfTargetingIntention<JetExpression>("operator.to.function", javaClass()) {
public class OperatorToFunctionIntention : JetSelfTargetingOffsetIndependentIntention<JetExpression>("operator.to.function", javaClass()) {
companion object {
private fun isApplicablePrefix(element: JetPrefixExpression): Boolean {
return when (element.getOperationReference().getReferencedNameElementType()) {
@@ -37,7 +37,7 @@ import org.jetbrains.kotlin.idea.util.approximateFlexibleTypes
import org.jetbrains.kotlin.idea.caches.resolve.findModuleDescriptor
import org.jetbrains.kotlin.idea.caches.resolve.analyze
public class RemoveExplicitTypeArguments : JetSelfTargetingIntention<JetTypeArgumentList>(
public class RemoveExplicitTypeArguments : JetSelfTargetingOffsetIndependentIntention<JetTypeArgumentList>(
"remove.explicit.type.arguments", javaClass()) {
override fun isApplicableTo(element: JetTypeArgumentList): Boolean {
@@ -30,7 +30,7 @@ import org.jetbrains.kotlin.psi.JetPsiUtil
import org.jetbrains.kotlin.idea.JetBundle
import org.jetbrains.kotlin.psi.JetPsiFactory
public class SimplifyNegatedBinaryExpressionIntention : JetSelfTargetingIntention<JetPrefixExpression>("simplify.negated.binary.expression", javaClass()) {
public class SimplifyNegatedBinaryExpressionIntention : JetSelfTargetingOffsetIndependentIntention<JetPrefixExpression>("simplify.negated.binary.expression", javaClass()) {
private fun JetPrefixExpression.unparenthesize(): JetExpression? {
return (this.getBaseExpression() as? JetParenthesizedExpression)?.getExpression()
@@ -24,16 +24,10 @@ import org.jetbrains.kotlin.JetNodeTypes
import com.intellij.psi.PsiWhiteSpace
public class AddBracesIntention : JetSelfTargetingIntention<JetExpressionImpl>("add.braces", javaClass()) {
override fun isApplicableTo(element: JetExpressionImpl): Boolean {
throw IllegalStateException("isApplicableTo(JetExpressionImpl, Editor) should be called instead")
}
override fun isApplicableTo(element: JetExpressionImpl, caretOffset: Int): Boolean {
val expressionKind = element.getExpressionKind(caretOffset) ?: return false
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 (element.findBlockInExpression(expressionKind) != null) return false
setText("Add braces to '${expressionKind.text}' statement")
return true
@@ -33,7 +33,7 @@ import org.jetbrains.kotlin.psi.JetThrowExpression
import org.jetbrains.kotlin.psi.psiUtil.replaced
import org.jetbrains.kotlin.idea.caches.resolve.analyze
public class ConvertAssertToIfWithThrowIntention : JetSelfTargetingIntention<JetCallExpression>(
public class ConvertAssertToIfWithThrowIntention : JetSelfTargetingOffsetIndependentIntention<JetCallExpression>(
"convert.assert.to.if.with.throw", javaClass()) {
private var messageIsAFunction : Boolean by Delegates.notNull()
@@ -190,12 +190,8 @@ public class ConvertFunctionToPropertyIntention : JetSelfTargetingIntention<JetN
override fun startInWriteAction(): Boolean = false
override fun isApplicableTo(element: JetNamedFunction): Boolean {
throw IllegalStateException("isApplicableTo(JetExpressionImpl, Editor) should be called instead")
}
override fun isApplicableTo(element: JetNamedFunction, editor: Editor): Boolean {
val elementAtCaret = element.getContainingFile().findElementAt(editor.getCaretModel().getOffset())
override fun isApplicableTo(element: JetNamedFunction, caretOffset: Int): Boolean {
val elementAtCaret = element.getContainingFile().findElementAt(caretOffset)
if (!(element.getNameIdentifier()?.isAncestor(elementAtCaret) ?: false)) return false
if (element.getValueParameters().isNotEmpty() || element.isLocal()) return false
@@ -32,7 +32,7 @@ import org.jetbrains.kotlin.resolve.calls.callUtil.getResolvedCall
import org.jetbrains.kotlin.idea.caches.resolve.analyze
public class ConvertIfWithThrowToAssertIntention :
JetSelfTargetingIntention<JetIfExpression>("convert.if.with.throw.to.assert", javaClass()) {
JetSelfTargetingOffsetIndependentIntention<JetIfExpression>("convert.if.with.throw.to.assert", javaClass()) {
override fun isApplicableTo(element: JetIfExpression): Boolean {
if (element.getElse() != null) return false
@@ -26,7 +26,7 @@ import org.jetbrains.kotlin.psi.JetPsiUtil
import java.util.LinkedList
public class ConvertNegatedBooleanSequenceIntention : JetSelfTargetingIntention<JetBinaryExpression>(
public class ConvertNegatedBooleanSequenceIntention : JetSelfTargetingOffsetIndependentIntention<JetBinaryExpression>(
"convert.negated.boolean.sequence", javaClass()) {
override fun isApplicableTo(element: JetBinaryExpression): Boolean {
@@ -29,7 +29,7 @@ import org.jetbrains.kotlin.psi.JetSimpleNameExpression
import java.util.LinkedList
import org.jetbrains.kotlin.idea.JetBundle
public class ConvertNegatedExpressionWithDemorgansLawIntention : JetSelfTargetingIntention<JetPrefixExpression>(
public class ConvertNegatedExpressionWithDemorgansLawIntention : JetSelfTargetingOffsetIndependentIntention<JetPrefixExpression>(
"convert.negated.expression.with.demorgans.law", javaClass()
) {
@@ -29,7 +29,7 @@ import org.jetbrains.kotlin.idea.refactoring.changeSignature.JetMethodDescriptor
import org.jetbrains.kotlin.idea.refactoring.changeSignature.modify
import org.jetbrains.kotlin.idea.caches.resolve.analyzeFully
public class ConvertParameterToReceiverIntention: JetSelfTargetingIntention<JetParameter>("convert.parameter.to.receiver.intention", javaClass()) {
public class ConvertParameterToReceiverIntention: JetSelfTargetingOffsetIndependentIntention<JetParameter>("convert.parameter.to.receiver.intention", javaClass()) {
override fun isApplicableTo(element: JetParameter): Boolean {
if (element.isVarArg()) return false
val function = element.getStrictParentOfType<JetNamedFunction>() ?: return false
@@ -182,12 +182,8 @@ public class ConvertPropertyToFunctionIntention : JetSelfTargetingIntention<JetP
override fun startInWriteAction(): Boolean = false
override fun isApplicableTo(element: JetProperty): Boolean {
throw IllegalStateException("isApplicableTo(JetExpressionImpl, Editor) should be called instead")
}
override fun isApplicableTo(element: JetProperty, editor: Editor): Boolean {
val elementAtCaret = element.getContainingFile().findElementAt(editor.getCaretModel().getOffset())
override fun isApplicableTo(element: JetProperty, caretOffset: Int): Boolean {
val elementAtCaret = element.getContainingFile().findElementAt(caretOffset)
if (!(element.getNameIdentifier()?.isAncestor(elementAtCaret) ?: false)) return false
return element.getDelegate() == null && !element.isVar() && !element.isLocal()
@@ -27,7 +27,7 @@ import org.jetbrains.kotlin.idea.refactoring.changeSignature.JetChangeSignatureC
import org.jetbrains.kotlin.idea.refactoring.changeSignature.JetMethodDescriptor
import org.jetbrains.kotlin.idea.refactoring.changeSignature.modify
public class ConvertReceiverToParameterIntention: JetSelfTargetingIntention<JetTypeReference>("convert.receiver.to.parameter.intention", javaClass()) {
public class ConvertReceiverToParameterIntention: JetSelfTargetingOffsetIndependentIntention<JetTypeReference>("convert.receiver.to.parameter.intention", javaClass()) {
override fun isApplicableTo(element: JetTypeReference): Boolean {
return (element.getParent() as? JetNamedFunction)?.getReceiverTypeReference() == element
}
@@ -29,7 +29,7 @@ import org.jetbrains.kotlin.psi.JetIfExpression
import org.jetbrains.kotlin.psi.JetBlockExpression
import org.jetbrains.kotlin.idea.caches.resolve.analyze
public class ConvertToConcatenatedStringIntention : JetSelfTargetingIntention<JetStringTemplateExpression>("convert.to.concatenated.string.intention", javaClass()) {
public class ConvertToConcatenatedStringIntention : JetSelfTargetingOffsetIndependentIntention<JetStringTemplateExpression>("convert.to.concatenated.string.intention", javaClass()) {
override fun isApplicableTo(element: JetStringTemplateExpression): Boolean {
return element.getEntries().any { it is JetStringTemplateEntryWithExpression }
}
@@ -24,7 +24,7 @@ import org.jetbrains.kotlin.psi.JetElement
import org.jetbrains.kotlin.psi.JetParameter
import org.jetbrains.kotlin.psi.JetOperationExpression
public class ConvertToForEachFunctionCallIntention : JetSelfTargetingIntention<JetForExpression>("convert.to.for.each.function.call.intention", javaClass()) {
public class ConvertToForEachFunctionCallIntention : JetSelfTargetingOffsetIndependentIntention<JetForExpression>("convert.to.for.each.function.call.intention", javaClass()) {
override fun isApplicableTo(element: JetForExpression): Boolean {
return element.getLoopRange() != null && element.getLoopParameter() != null && element.getBody() != null
}
@@ -28,7 +28,7 @@ import org.jetbrains.kotlin.psi.JetParenthesizedExpression
import org.jetbrains.kotlin.resolve.calls.callUtil.getResolvedCall
import org.jetbrains.kotlin.idea.caches.resolve.analyze
public class ConvertToForEachLoopIntention : JetSelfTargetingIntention<JetExpression>("convert.to.for.each.loop.intention", javaClass()) {
public class ConvertToForEachLoopIntention : JetSelfTargetingOffsetIndependentIntention<JetExpression>("convert.to.for.each.loop.intention", javaClass()) {
private fun getFunctionLiteralArgument(element: JetExpression): JetFunctionLiteralExpression? {
val argument = when (element) {
is JetDotQualifiedExpression -> {
@@ -35,7 +35,7 @@ import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.idea.caches.resolve.analyze
public class ConvertToStringTemplateIntention : JetSelfTargetingIntention<JetBinaryExpression>("convert.to.string.template", javaClass()) {
public class ConvertToStringTemplateIntention : JetSelfTargetingOffsetIndependentIntention<JetBinaryExpression>("convert.to.string.template", javaClass()) {
override fun isApplicableTo(element: JetBinaryExpression): Boolean {
if (element.getOperationToken() != JetTokens.PLUS) return false
@@ -20,7 +20,7 @@ import com.intellij.openapi.editor.Editor
import org.jetbrains.kotlin.psi.JetSimpleNameStringTemplateEntry
import org.jetbrains.kotlin.psi.JetPsiFactory
public class InsertCurlyBracesToTemplateIntention : JetSelfTargetingIntention<JetSimpleNameStringTemplateEntry>(
public class InsertCurlyBracesToTemplateIntention : JetSelfTargetingOffsetIndependentIntention<JetSimpleNameStringTemplateEntry>(
"insert.curly.brackets.to.string.template", javaClass()) {
override fun isApplicableTo(element: JetSimpleNameStringTemplateEntry): Boolean = true
@@ -29,16 +29,12 @@ import org.jetbrains.kotlin.idea.caches.resolve.analyze
public class InsertExplicitTypeArguments : JetSelfTargetingIntention<JetCallExpression>(
"insert.explicit.type.arguments", javaClass()) {
override fun isApplicableTo(element: JetCallExpression): Boolean {
throw IllegalStateException("isApplicableTo(JetExpressionImpl, Editor) should be called instead")
}
override fun isApplicableTo(element: JetCallExpression, editor: Editor): Boolean {
override fun isApplicableTo(element: JetCallExpression, caretOffset: Int): Boolean {
if (!element.getTypeArguments().isEmpty()) return false
if (element.getText() == null) return false
val textRange = element.getCalleeExpression()?.getTextRange()
if (textRange == null || !textRange.contains(editor.getCaretModel().getOffset())) return false
if (textRange == null || !textRange.contains(caretOffset)) return false
val context = element.analyze()
val resolvedCall = element.getResolvedCall(context)
@@ -33,7 +33,7 @@ import org.jetbrains.kotlin.lexer.JetKeywordToken
import org.jetbrains.kotlin.psi.JetNamedFunction
import org.jetbrains.kotlin.psi.JetBlockExpression
public class InvertIfConditionIntention : JetSelfTargetingIntention<JetIfExpression>("invert.if.condition", javaClass()) {
public class InvertIfConditionIntention : JetSelfTargetingOffsetIndependentIntention<JetIfExpression>("invert.if.condition", javaClass()) {
fun checkForNegation(element: JetUnaryExpression): Boolean {
return element.getOperationReference().getReferencedName().equals("!")
}
@@ -29,18 +29,13 @@ import org.jetbrains.kotlin.idea.caches.resolve.analyze
public class MakeTypeExplicitInLambdaIntention : JetSelfTargetingIntention<JetFunctionLiteralExpression>(
"make.type.explicit.in.lambda", javaClass()) {
override fun isApplicableTo(element: JetFunctionLiteralExpression): Boolean {
throw IllegalStateException("isApplicableTo(JetExpressionImpl, Editor) should be called instead")
}
override fun isApplicableTo(element: JetFunctionLiteralExpression, editor: Editor): Boolean {
override fun isApplicableTo(element: JetFunctionLiteralExpression, caretOffset: Int): Boolean {
val openBraceOffset = element.getLeftCurlyBrace().getStartOffset()
val closeBraceOffset = element.getRightCurlyBrace()?.getStartOffset()
val caretLocation = editor.getCaretModel().getOffset()
val arrow = element.getFunctionLiteral().getArrowNode()
if (arrow != null && !(openBraceOffset < caretLocation && caretLocation < arrow.getStartOffset() + 2) &&
caretLocation != closeBraceOffset) return false
else if (arrow == null && caretLocation != openBraceOffset + 1 && caretLocation != closeBraceOffset) return false
if (arrow != null && !(openBraceOffset < caretOffset && caretOffset < arrow.getStartOffset() + 2) &&
caretOffset != closeBraceOffset) return false
else if (arrow == null && caretOffset != openBraceOffset + 1 && caretOffset != closeBraceOffset) return false
val context = element.analyze()
val func = context[BindingContext.FUNCTION, element.getFunctionLiteral()]
@@ -23,18 +23,13 @@ import org.jetbrains.kotlin.lexer.JetTokens
public class MakeTypeImplicitInLambdaIntention : JetSelfTargetingIntention<JetFunctionLiteralExpression>(
"make.type.implicit.in.lambda", javaClass()) {
override fun isApplicableTo(element: JetFunctionLiteralExpression): Boolean {
throw IllegalStateException("isApplicableTo(JetExpressionImpl, Editor) should be called instead")
}
override fun isApplicableTo(element: JetFunctionLiteralExpression, editor: Editor): Boolean {
override fun isApplicableTo(element: JetFunctionLiteralExpression, caretOffset: Int): Boolean {
val openBraceOffset = element.getLeftCurlyBrace().getStartOffset()
val closeBraceOffset = element.getRightCurlyBrace()?.getStartOffset()
val caretLocation = editor.getCaretModel().getOffset()
val arrow = element.getFunctionLiteral().getArrowNode()
if (arrow != null && !(openBraceOffset < caretLocation && caretLocation < arrow.getStartOffset() + 2) &&
caretLocation != closeBraceOffset) return false
else if (arrow == null && caretLocation != openBraceOffset + 1 && caretLocation != closeBraceOffset) return false
if (arrow != null && !(openBraceOffset < caretOffset && caretOffset < arrow.getStartOffset() + 2) &&
caretOffset != closeBraceOffset) return false
else if (arrow == null && caretOffset != openBraceOffset + 1 && caretOffset != closeBraceOffset) return false
return hasExplicitReturnType(element) || hasExplicitReceiverType(element) || hasExplicitParamType(element)
}
@@ -21,7 +21,7 @@ import org.jetbrains.kotlin.psi.JetFunctionLiteralArgument
import org.jetbrains.kotlin.idea.util.psiModificationUtil.moveInsideParentheses
import org.jetbrains.kotlin.idea.caches.resolve.analyzeFully
public class MoveLambdaInsideParenthesesIntention : JetSelfTargetingIntention<JetFunctionLiteralArgument>(
public class MoveLambdaInsideParenthesesIntention : JetSelfTargetingOffsetIndependentIntention<JetFunctionLiteralArgument>(
"move.lambda.inside.parentheses", javaClass()) {
override fun isApplicableTo(element: JetFunctionLiteralArgument): Boolean = true
@@ -25,7 +25,7 @@ import org.jetbrains.kotlin.psi.JetExpression
import org.jetbrains.kotlin.psi.JetLabeledExpression
import org.jetbrains.kotlin.resolve.calls.callUtil.getValueArgumentsInParentheses
public class MoveLambdaOutsideParenthesesIntention : JetSelfTargetingIntention<JetCallExpression>(
public class MoveLambdaOutsideParenthesesIntention : JetSelfTargetingOffsetIndependentIntention<JetCallExpression>(
"move.lambda.outside.parentheses", javaClass()) {
private fun isLambdaOrLabeledLambda(expression: JetExpression?): Boolean =
@@ -24,16 +24,10 @@ import com.intellij.psi.PsiWhiteSpace
import com.intellij.psi.PsiComment
public class RemoveBracesIntention : JetSelfTargetingIntention<JetExpressionImpl>("remove.braces", javaClass()) {
override fun isApplicableTo(element: JetExpressionImpl): Boolean {
throw IllegalStateException("isApplicableTo(JetExpressionImpl, Editor) should be called instead")
}
override fun isApplicableTo(element: JetExpressionImpl, caretOffset: Int): Boolean {
val expressionKind = element.getExpressionKind(caretOffset) ?: return false
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
val jetBlockElement = element.findBlockInExpression(expressionKind) ?: return false
if (jetBlockElement.getStatements().size == 1) {
setText("Remove braces from '${expressionKind.text}' statement")
@@ -23,7 +23,7 @@ import org.jetbrains.kotlin.psi.JetPsiFactory
import java.util.regex.*
import org.jetbrains.kotlin.psi.JetStringTemplateEntryWithExpression
public class RemoveCurlyBracesFromTemplateIntention : JetSelfTargetingIntention<JetBlockStringTemplateEntry>(
public class RemoveCurlyBracesFromTemplateIntention : JetSelfTargetingOffsetIndependentIntention<JetBlockStringTemplateEntry>(
"remove.unnecessary.curly.brackets.from.string.template", javaClass()) {
companion object {
@@ -20,7 +20,7 @@ import com.intellij.openapi.editor.Editor
import org.jetbrains.kotlin.psi.JetParenthesizedExpression
import org.jetbrains.kotlin.psi.JetPsiUtil
public class RemoveUnnecessaryParenthesesIntention : JetSelfTargetingIntention<JetParenthesizedExpression>(
public class RemoveUnnecessaryParenthesesIntention : JetSelfTargetingOffsetIndependentIntention<JetParenthesizedExpression>(
"remove.unnecessary.parentheses", javaClass()
) {
override fun isApplicableTo(element: JetParenthesizedExpression): Boolean = JetPsiUtil.areParenthesesUseless(element)
@@ -23,7 +23,7 @@ import org.jetbrains.kotlin.psi.JetFunctionLiteralExpression
import org.jetbrains.kotlin.psi.JetParenthesizedExpression
import org.jetbrains.kotlin.lexer.JetTokens
public class ReplaceWithDotQualifiedMethodCallIntention : JetSelfTargetingIntention<JetBinaryExpression>("replace.with.dot.qualified.method.call.intention", javaClass()) {
public class ReplaceWithDotQualifiedMethodCallIntention : JetSelfTargetingOffsetIndependentIntention<JetBinaryExpression>("replace.with.dot.qualified.method.call.intention", javaClass()) {
override fun isApplicableTo(element: JetBinaryExpression): Boolean {
return element.getLeft() != null && element.getRight() != null && element.getOperationToken() == JetTokens.IDENTIFIER
}
@@ -30,20 +30,14 @@ import org.jetbrains.kotlin.resolve.calls.callUtil.getResolvedCall
import org.jetbrains.kotlin.idea.caches.resolve.analyze
public open class ReplaceWithInfixFunctionCallIntention : JetSelfTargetingIntention<JetCallExpression>("replace.with.infix.function.call.intention", javaClass()) {
override fun isApplicableTo(element: JetCallExpression): Boolean {
throw IllegalStateException("isApplicableTo(JetExpressionImpl, Editor) should be called instead")
}
override fun isApplicableTo(element: JetCallExpression, editor: Editor): Boolean {
val caretLocation = editor.getCaretModel().getOffset()
override fun isApplicableTo(element: JetCallExpression, caretOffset: Int): Boolean {
val calleeExpr = element.getCalleeExpression()
if (calleeExpr == null) return false
val textRange = calleeExpr.getTextRange()
if (textRange == null) return false
if (caretLocation !in textRange) return false
if (caretOffset !in textRange) return false
val parent = element.getParent()
@@ -27,7 +27,7 @@ import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.idea.util.psi.patternMatching.matches
import org.jetbrains.kotlin.idea.caches.resolve.analyze
public class ReplaceWithOperatorAssignIntention : JetSelfTargetingIntention<JetBinaryExpression>("replace.with.operator.assign.intention", javaClass()) {
public class ReplaceWithOperatorAssignIntention : JetSelfTargetingOffsetIndependentIntention<JetBinaryExpression>("replace.with.operator.assign.intention", javaClass()) {
override fun isApplicableTo(element: JetBinaryExpression): Boolean {
fun isWellFormedAssignment(element : JetBinaryExpression): Boolean {
@@ -23,7 +23,7 @@ import org.jetbrains.kotlin.lexer.JetTokens
import org.jetbrains.kotlin.psi.JetPsiFactory
import org.jetbrains.kotlin.psi.JetPsiUnparsingUtils
public class ReplaceWithTraditionalAssignmentIntention : JetSelfTargetingIntention<JetBinaryExpression>("replace.with.traditional.assignment.intention", javaClass()) {
public class ReplaceWithTraditionalAssignmentIntention : JetSelfTargetingOffsetIndependentIntention<JetBinaryExpression>("replace.with.traditional.assignment.intention", javaClass()) {
override fun isApplicableTo(element: JetBinaryExpression): Boolean {
fun checkForNullSafety(element: JetBinaryExpression): Boolean = element.getLeft() != null && element.getRight() != null && element.getOperationToken() != null
@@ -30,7 +30,7 @@ import org.jetbrains.kotlin.psi.psiUtil.copied
import org.jetbrains.kotlin.psi.psiUtil.replaced
import org.jetbrains.kotlin.idea.caches.resolve.analyze
public class SimplifyBooleanWithConstantsIntention : JetSelfTargetingIntention<JetBinaryExpression>(
public class SimplifyBooleanWithConstantsIntention : JetSelfTargetingOffsetIndependentIntention<JetBinaryExpression>(
"simplify.boolean.with.constants", javaClass()) {
private var topParent : JetBinaryExpression? = null
@@ -28,11 +28,7 @@ import org.jetbrains.kotlin.psi.JetExpression
import org.jetbrains.kotlin.psi.JetPsiUtil
public class SplitIfIntention : JetSelfTargetingIntention<JetExpression>("split.if", javaClass()) {
override fun isApplicableTo(element: JetExpression): Boolean {
throw IllegalStateException("isApplicableTo(JetExpression, Editor) should be called instead")
}
override fun isApplicableTo(element: JetExpression, editor: Editor): Boolean {
override fun isApplicableTo(element: JetExpression, caretOffset: Int): Boolean {
if (element !is JetSimpleNameExpression && element !is JetIfExpression) return false
if (element is JetSimpleNameExpression) {
@@ -40,7 +36,7 @@ public class SplitIfIntention : JetSelfTargetingIntention<JetExpression>("split.
}
if (element is JetIfExpression) {
if (!isCursorOnIfKeyword(element, editor)) return false
if (!isCursorOnIfKeyword(element, caretOffset)) return false
if (getFirstValidOperator(element) == null) return false
}
return true
@@ -54,7 +50,7 @@ public class SplitIfIntention : JetSelfTargetingIntention<JetExpression>("split.
val ifExpression = currentElement!!.getNonStrictParentOfType<JetIfExpression>()
val expression = currentElement.getParent() as JetBinaryExpression
val rightExpression = getRight(expression, ifExpression!!.getCondition() as JetExpression)
val rightExpression = getRight(expression, ifExpression!!.getCondition())
val leftExpression = expression.getLeft()
val elseExpression = ifExpression.getElse()
val thenExpression = ifExpression.getThen()
@@ -75,7 +71,7 @@ public class SplitIfIntention : JetSelfTargetingIntention<JetExpression>("split.
}
}
fun getRight(element: JetBinaryExpression, condition: JetExpression): JetExpression {
private fun getRight(element: JetBinaryExpression, condition: JetExpression): JetExpression {
//gets the textOffset of the right side of the JetBinaryExpression in context to condition
val startOffset = element.getRight()!!.getTextOffset() - condition.getTextOffset()
val rightString = condition.getText()!![startOffset, condition.getTextLength()].toString()
@@ -83,20 +79,19 @@ public class SplitIfIntention : JetSelfTargetingIntention<JetExpression>("split.
return JetPsiFactory(element).createExpression(rightString)
}
fun isCursorOnIfKeyword(element: JetIfExpression, editor: Editor): Boolean {
private fun isCursorOnIfKeyword(element: JetIfExpression, offset: Int): Boolean {
val ifKeyword = JetPsiUtil.findChildByType(element, JetTokens.IF_KEYWORD) ?: return false
val cursor = editor.getCaretModel().getOffset()
return (cursor >= ifKeyword.getTextOffset() && cursor <= ifKeyword.getTextOffset() + ifKeyword.getTextLength())
return (offset >= ifKeyword.getTextOffset() && offset <= ifKeyword.getTextOffset() + ifKeyword.getTextLength())
}
fun getFirstValidOperator(element: JetIfExpression): JetSimpleNameExpression? {
private fun getFirstValidOperator(element: JetIfExpression): JetSimpleNameExpression? {
if (element.getCondition() == null) return null
val condition = element.getCondition()
val childElements = PsiTreeUtil.findChildrenOfType(condition, javaClass<JetSimpleNameExpression>())
return childElements.firstOrNull { isOperatorValid(it) }
}
fun isOperatorValid(element: JetSimpleNameExpression): Boolean {
private fun isOperatorValid(element: JetSimpleNameExpression): Boolean {
val operator = element.getReferencedNameElementType()
if (operator != JetTokens.ANDAND && operator != JetTokens.OROR) return false
@@ -24,7 +24,7 @@ import org.jetbrains.kotlin.idea.util.JetPsiPrecedences
import org.jetbrains.kotlin.lexer.JetTokens.*
import org.jetbrains.kotlin.types.expressions.OperatorConventions
public class SwapBinaryExpression : JetSelfTargetingIntention<JetBinaryExpression>(
public class SwapBinaryExpression : JetSelfTargetingOffsetIndependentIntention<JetBinaryExpression>(
"swap.binary.expression", javaClass()
) {
companion object {
@@ -16,23 +16,23 @@
package org.jetbrains.kotlin.idea.intentions.attributeCallReplacements
import org.jetbrains.kotlin.psi.JetCallExpression
import com.intellij.codeInsight.hint.HintManager
import com.intellij.openapi.editor.Editor
import org.jetbrains.kotlin.psi.JetQualifiedExpression
import org.jetbrains.kotlin.psi.JetDotQualifiedExpression
import org.jetbrains.kotlin.idea.intentions.JetSelfTargetingIntention
import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall
import org.jetbrains.kotlin.descriptors.CallableDescriptor
import org.jetbrains.kotlin.psi.ValueArgument
import org.jetbrains.kotlin.idea.JetBundle
import org.jetbrains.kotlin.resolve.calls.model.DefaultValueArgument
import org.jetbrains.kotlin.resolve.calls.model.VarargValueArgument
import org.jetbrains.kotlin.idea.caches.resolve.analyze
import org.jetbrains.kotlin.idea.intentions.JetSelfTargetingOffsetIndependentIntention
import org.jetbrains.kotlin.idea.util.Maybe
import org.jetbrains.kotlin.idea.util.MaybeError
import org.jetbrains.kotlin.idea.util.MaybeValue
import com.intellij.codeInsight.hint.HintManager
import org.jetbrains.kotlin.psi.JetCallExpression
import org.jetbrains.kotlin.psi.JetDotQualifiedExpression
import org.jetbrains.kotlin.psi.JetQualifiedExpression
import org.jetbrains.kotlin.psi.ValueArgument
import org.jetbrains.kotlin.resolve.calls.callUtil.getResolvedCall
import org.jetbrains.kotlin.idea.caches.resolve.analyze
import org.jetbrains.kotlin.resolve.calls.model.DefaultValueArgument
import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall
import org.jetbrains.kotlin.resolve.calls.model.VarargValueArgument
// Internal because you shouldn't construct this manually. You can end up with an inconsistant CallDescription.
public class CallDescription internal (
@@ -97,7 +97,7 @@ public fun JetQualifiedExpression.toCallDescription(): CallDescription? {
return CallDescription(this, callExpression, resolvedCall)
}
public abstract class AttributeCallReplacementIntention(private val name: String) : JetSelfTargetingIntention<JetDotQualifiedExpression>(name, javaClass()) {
public abstract class AttributeCallReplacementIntention(private val name: String) : JetSelfTargetingOffsetIndependentIntention<JetDotQualifiedExpression>(name, javaClass()) {
protected abstract fun isApplicableToCall(call: CallDescription): Boolean
@@ -16,30 +16,24 @@
package org.jetbrains.kotlin.idea.intentions.branchedTransformations.intentions
import org.jetbrains.kotlin.idea.intentions.JetSelfTargetingIntention
import com.intellij.openapi.editor.Editor
import org.jetbrains.kotlin.lexer.JetTokens
import org.jetbrains.kotlin.psi.JetPsiUtil
import org.jetbrains.kotlin.psi.JetPostfixExpression
import org.jetbrains.kotlin.idea.intentions.branchedTransformations.isStableVariable
import org.jetbrains.kotlin.idea.intentions.JetTypeLookupExpression
import com.intellij.codeInsight.template.Template
import com.intellij.codeInsight.template.TemplateBuilderImpl
import com.intellij.codeInsight.template.TemplateEditingAdapter
import com.intellij.codeInsight.template.impl.TemplateManagerImpl
import com.intellij.codeInsight.template.Template
import org.jetbrains.kotlin.idea.JetBundle
import org.jetbrains.kotlin.idea.intentions.branchedTransformations.convertToIfNotNullExpression
import org.jetbrains.kotlin.psi.JetPsiFactory
import org.jetbrains.kotlin.idea.intentions.branchedTransformations.introduceValueForCondition
import org.jetbrains.kotlin.psi.JetThrowExpression
import com.intellij.codeInsight.template.TemplateBuilderImpl
import com.intellij.openapi.editor.Editor
import com.intellij.psi.PsiDocumentManager
import org.apache.commons.lang.StringEscapeUtils.escapeJava
import org.jetbrains.kotlin.idea.intentions.branchedTransformations.convertToIfNullExpression
import org.jetbrains.kotlin.idea.intentions.branchedTransformations.NULL_PTR_EXCEPTION
import org.jetbrains.kotlin.idea.intentions.branchedTransformations.KOTLIN_NULL_PTR_EXCEPTION
import org.jetbrains.kotlin.idea.intentions.branchedTransformations.isStatement
import org.jetbrains.kotlin.idea.JetBundle
import org.jetbrains.kotlin.idea.intentions.JetSelfTargetingOffsetIndependentIntention
import org.jetbrains.kotlin.idea.intentions.JetTypeLookupExpression
import org.jetbrains.kotlin.idea.intentions.branchedTransformations.*
import org.jetbrains.kotlin.lexer.JetTokens
import org.jetbrains.kotlin.psi.JetPostfixExpression
import org.jetbrains.kotlin.psi.JetPsiFactory
import org.jetbrains.kotlin.psi.JetPsiUtil
import org.jetbrains.kotlin.psi.JetThrowExpression
public class DoubleBangToIfThenIntention : JetSelfTargetingIntention<JetPostfixExpression>("double.bang.to.if.then", javaClass()) {
public class DoubleBangToIfThenIntention : JetSelfTargetingOffsetIndependentIntention<JetPostfixExpression>("double.bang.to.if.then", javaClass()) {
override fun isApplicableTo(element: JetPostfixExpression): Boolean =
element.getOperationToken() == JetTokens.EXCLEXCL
@@ -16,12 +16,13 @@
package org.jetbrains.kotlin.idea.intentions.branchedTransformations.intentions
import org.jetbrains.kotlin.idea.intentions.JetSelfTargetingIntention
import org.jetbrains.kotlin.idea.intentions.branchedTransformations.*
import org.jetbrains.kotlin.psi.JetWhenExpression
import com.intellij.openapi.editor.Editor
import org.jetbrains.kotlin.idea.intentions.JetSelfTargetingOffsetIndependentIntention
import org.jetbrains.kotlin.idea.intentions.branchedTransformations.canEliminateSubject
import org.jetbrains.kotlin.idea.intentions.branchedTransformations.eliminateSubject
import org.jetbrains.kotlin.psi.JetWhenExpression
public class EliminateWhenSubjectIntention : JetSelfTargetingIntention<JetWhenExpression>("eliminate.when.subject", javaClass()) {
public class EliminateWhenSubjectIntention : JetSelfTargetingOffsetIndependentIntention<JetWhenExpression>("eliminate.when.subject", javaClass()) {
override fun isApplicableTo(element: JetWhenExpression): Boolean = element.canEliminateSubject()
override fun applyTo(element: JetWhenExpression, editor: Editor) {
@@ -16,16 +16,16 @@
package org.jetbrains.kotlin.idea.intentions.branchedTransformations.intentions
import org.jetbrains.kotlin.psi.JetBinaryExpression
import org.jetbrains.kotlin.idea.intentions.JetSelfTargetingIntention
import com.intellij.openapi.editor.Editor
import org.jetbrains.kotlin.lexer.JetTokens
import org.jetbrains.kotlin.psi.JetPsiUtil
import org.jetbrains.kotlin.idea.intentions.JetSelfTargetingOffsetIndependentIntention
import org.jetbrains.kotlin.idea.intentions.branchedTransformations.convertToIfNotNullExpression
import org.jetbrains.kotlin.idea.intentions.branchedTransformations.introduceValueForCondition
import org.jetbrains.kotlin.idea.intentions.branchedTransformations.isStableVariable
import org.jetbrains.kotlin.lexer.JetTokens
import org.jetbrains.kotlin.psi.JetBinaryExpression
import org.jetbrains.kotlin.psi.JetPsiUtil
public class ElvisToIfThenIntention : JetSelfTargetingIntention<JetBinaryExpression>("elvis.to.if.then", javaClass()) {
public class ElvisToIfThenIntention : JetSelfTargetingOffsetIndependentIntention<JetBinaryExpression>("elvis.to.if.then", javaClass()) {
override fun isApplicableTo(element: JetBinaryExpression): Boolean =
element.getOperationToken() == JetTokens.ELVIS
@@ -16,12 +16,13 @@
package org.jetbrains.kotlin.idea.intentions.branchedTransformations.intentions
import org.jetbrains.kotlin.idea.intentions.JetSelfTargetingIntention
import org.jetbrains.kotlin.idea.intentions.branchedTransformations.*
import org.jetbrains.kotlin.psi.JetWhenExpression
import com.intellij.openapi.editor.Editor
import org.jetbrains.kotlin.idea.intentions.JetSelfTargetingOffsetIndependentIntention
import org.jetbrains.kotlin.idea.intentions.branchedTransformations.canFlatten
import org.jetbrains.kotlin.idea.intentions.branchedTransformations.flatten
import org.jetbrains.kotlin.psi.JetWhenExpression
public class FlattenWhenIntention : JetSelfTargetingIntention<JetWhenExpression>("flatten.when", javaClass()) {
public class FlattenWhenIntention : JetSelfTargetingOffsetIndependentIntention<JetWhenExpression>("flatten.when", javaClass()) {
override fun isApplicableTo(element: JetWhenExpression): Boolean = element.canFlatten()
override fun applyTo(element: JetWhenExpression, editor: Editor) {
@@ -16,18 +16,18 @@
package org.jetbrains.kotlin.idea.intentions.branchedTransformations.intentions
import org.jetbrains.kotlin.psi.JetExpression
import org.jetbrains.kotlin.idea.intentions.JetSelfTargetingIntention
import com.intellij.openapi.editor.Editor
import org.jetbrains.kotlin.idea.intentions.JetSelfTargetingOffsetIndependentIntention
import org.jetbrains.kotlin.idea.intentions.branchedTransformations.BranchedFoldingUtils
import org.jetbrains.kotlin.idea.intentions.branchedTransformations.FoldableKind
import com.intellij.openapi.editor.Editor
import org.jetbrains.kotlin.psi.JetExpression
import org.jetbrains.kotlin.psi.JetFile
import org.jetbrains.kotlin.psi.JetIfExpression
import org.jetbrains.kotlin.psi.JetWhenExpression
public open class FoldBranchedExpressionIntention<T: JetExpression>(
val kind: FoldableKind, elementType: Class<T>
) : JetSelfTargetingIntention<T>(kind.getKey(), elementType) {
) : JetSelfTargetingOffsetIndependentIntention<T>(kind.getKey(), elementType) {
override fun isApplicableTo(element: T): Boolean = BranchedFoldingUtils.getFoldableExpressionKind(element) == kind
override fun applyTo(element: T, editor: Editor) {
@@ -16,26 +16,17 @@
package org.jetbrains.kotlin.idea.intentions.branchedTransformations.intentions
import org.jetbrains.kotlin.idea.intentions.JetSelfTargetingIntention
import com.intellij.openapi.editor.Editor
import org.jetbrains.kotlin.psi.JetIfExpression
import org.jetbrains.kotlin.psi.JetBinaryExpression
import org.jetbrains.kotlin.lexer.JetTokens
import org.jetbrains.kotlin.idea.intentions.branchedTransformations.evaluatesTo
import org.jetbrains.kotlin.idea.intentions.branchedTransformations.comparesNonNullToNull
import org.jetbrains.kotlin.idea.intentions.branchedTransformations.getNonNullExpression
import org.jetbrains.kotlin.idea.intentions.branchedTransformations.replace
import org.jetbrains.kotlin.idea.intentions.branchedTransformations.isStableVariable
import org.jetbrains.kotlin.psi.JetPostfixExpression
import org.jetbrains.kotlin.idea.intentions.branchedTransformations.inlineBaseExpressionIfApplicableWithPrompt
import org.jetbrains.kotlin.idea.intentions.branchedTransformations.extractExpressionIfSingle
import org.jetbrains.kotlin.psi.JetThrowExpression
import org.jetbrains.kotlin.idea.JetBundle
import org.jetbrains.kotlin.idea.intentions.branchedTransformations.isNullExpressionOrEmptyBlock
import org.jetbrains.kotlin.idea.intentions.branchedTransformations.throwsNullPointerExceptionWithNoArguments
import org.jetbrains.kotlin.idea.intentions.branchedTransformations.isStatement
import org.jetbrains.kotlin.idea.intentions.JetSelfTargetingOffsetIndependentIntention
import org.jetbrains.kotlin.idea.intentions.branchedTransformations.*
import org.jetbrains.kotlin.lexer.JetTokens
import org.jetbrains.kotlin.psi.JetBinaryExpression
import org.jetbrains.kotlin.psi.JetIfExpression
import org.jetbrains.kotlin.psi.JetPostfixExpression
import org.jetbrains.kotlin.psi.JetThrowExpression
public class IfThenToDoubleBangIntention : JetSelfTargetingIntention<JetIfExpression>("if.then.to.double.bang", javaClass()) {
public class IfThenToDoubleBangIntention : JetSelfTargetingOffsetIndependentIntention<JetIfExpression>("if.then.to.double.bang", javaClass()) {
override fun isApplicableTo(element: JetIfExpression): Boolean {
val condition = element.getCondition()
@@ -16,25 +16,13 @@
package org.jetbrains.kotlin.idea.intentions.branchedTransformations.intentions
import org.jetbrains.kotlin.idea.intentions.JetSelfTargetingIntention
import com.intellij.openapi.editor.Editor
import org.jetbrains.kotlin.psi.JetIfExpression
import org.jetbrains.kotlin.psi.JetBinaryExpression
import org.jetbrains.kotlin.idea.intentions.JetSelfTargetingOffsetIndependentIntention
import org.jetbrains.kotlin.idea.intentions.branchedTransformations.*
import org.jetbrains.kotlin.lexer.JetTokens
import org.jetbrains.kotlin.idea.intentions.branchedTransformations.extractExpressionIfSingle
import org.jetbrains.kotlin.idea.intentions.branchedTransformations.evaluatesTo
import org.jetbrains.kotlin.idea.intentions.branchedTransformations.comparesNonNullToNull
import org.jetbrains.kotlin.idea.intentions.branchedTransformations.getNonNullExpression
import org.jetbrains.kotlin.idea.intentions.branchedTransformations.isNotNullExpression
import org.jetbrains.kotlin.idea.intentions.branchedTransformations.replace
import org.jetbrains.kotlin.idea.intentions.branchedTransformations.inlineLeftSideIfApplicableWithPrompt
import org.jetbrains.kotlin.idea.intentions.branchedTransformations.isStableVariable
import org.jetbrains.kotlin.idea.intentions.branchedTransformations.throwsNullPointerExceptionWithNoArguments
import org.jetbrains.kotlin.psi.JetThrowExpression
import org.jetbrains.kotlin.psi.JetPsiUtil
import org.jetbrains.kotlin.psi.JetExpression
import org.jetbrains.kotlin.psi.*
public class IfThenToElvisIntention : JetSelfTargetingIntention<JetIfExpression>("if.then.to.elvis", javaClass()) {
public class IfThenToElvisIntention : JetSelfTargetingOffsetIndependentIntention<JetIfExpression>("if.then.to.elvis", javaClass()) {
override fun isApplicableTo(element: JetIfExpression): Boolean {
val condition = element.getCondition()
@@ -16,23 +16,13 @@
package org.jetbrains.kotlin.idea.intentions.branchedTransformations.intentions
import org.jetbrains.kotlin.idea.intentions.JetSelfTargetingIntention
import com.intellij.openapi.editor.Editor
import org.jetbrains.kotlin.psi.JetExpression
import org.jetbrains.kotlin.psi.JetIfExpression
import org.jetbrains.kotlin.psi.JetBinaryExpression
import org.jetbrains.kotlin.psi.JetDotQualifiedExpression
import org.jetbrains.kotlin.idea.intentions.JetSelfTargetingOffsetIndependentIntention
import org.jetbrains.kotlin.idea.intentions.branchedTransformations.*
import org.jetbrains.kotlin.lexer.JetTokens
import org.jetbrains.kotlin.idea.intentions.branchedTransformations.extractExpressionIfSingle
import org.jetbrains.kotlin.idea.intentions.branchedTransformations.comparesNonNullToNull
import org.jetbrains.kotlin.idea.intentions.branchedTransformations.getNonNullExpression
import org.jetbrains.kotlin.idea.intentions.branchedTransformations.isNullExpressionOrEmptyBlock
import org.jetbrains.kotlin.idea.intentions.branchedTransformations.replace
import org.jetbrains.kotlin.psi.JetSafeQualifiedExpression
import org.jetbrains.kotlin.idea.intentions.branchedTransformations.isStableVariable
import org.jetbrains.kotlin.idea.intentions.branchedTransformations.inlineReceiverIfApplicableWithPrompt
import org.jetbrains.kotlin.psi.*
public class IfThenToSafeAccessIntention : JetSelfTargetingIntention<JetIfExpression>("if.then.to.safe.access", javaClass()) {
public class IfThenToSafeAccessIntention : JetSelfTargetingOffsetIndependentIntention<JetIfExpression>("if.then.to.safe.access", javaClass()) {
override fun isApplicableTo(element: JetIfExpression): Boolean {
val condition = element.getCondition()
@@ -16,12 +16,13 @@
package org.jetbrains.kotlin.idea.intentions.branchedTransformations.intentions
import org.jetbrains.kotlin.idea.intentions.JetSelfTargetingIntention
import org.jetbrains.kotlin.psi.JetIfExpression
import com.intellij.openapi.editor.Editor
import org.jetbrains.kotlin.idea.intentions.branchedTransformations.*
import org.jetbrains.kotlin.idea.intentions.JetSelfTargetingOffsetIndependentIntention
import org.jetbrains.kotlin.idea.intentions.branchedTransformations.canTransformToWhen
import org.jetbrains.kotlin.idea.intentions.branchedTransformations.transformToWhen
import org.jetbrains.kotlin.psi.JetIfExpression
public class IfToWhenIntention : JetSelfTargetingIntention<JetIfExpression>("if.to.when", javaClass()) {
public class IfToWhenIntention : JetSelfTargetingOffsetIndependentIntention<JetIfExpression>("if.to.when", javaClass()) {
override fun isApplicableTo(element: JetIfExpression): Boolean = element.canTransformToWhen()
override fun applyTo(element: JetIfExpression, editor: Editor) {
@@ -16,12 +16,13 @@
package org.jetbrains.kotlin.idea.intentions.branchedTransformations.intentions
import org.jetbrains.kotlin.idea.intentions.JetSelfTargetingIntention
import org.jetbrains.kotlin.idea.intentions.branchedTransformations.*
import org.jetbrains.kotlin.psi.JetWhenExpression
import com.intellij.openapi.editor.Editor
import org.jetbrains.kotlin.idea.intentions.JetSelfTargetingOffsetIndependentIntention
import org.jetbrains.kotlin.idea.intentions.branchedTransformations.canIntroduceSubject
import org.jetbrains.kotlin.idea.intentions.branchedTransformations.introduceSubject
import org.jetbrains.kotlin.psi.JetWhenExpression
public class IntroduceWhenSubjectIntention : JetSelfTargetingIntention<JetWhenExpression>("introduce.when.subject", javaClass()) {
public class IntroduceWhenSubjectIntention : JetSelfTargetingOffsetIndependentIntention<JetWhenExpression>("introduce.when.subject", javaClass()) {
override fun isApplicableTo(element: JetWhenExpression): Boolean = element.canIntroduceSubject()
override fun applyTo(element: JetWhenExpression, editor: Editor) {
@@ -16,12 +16,13 @@
package org.jetbrains.kotlin.idea.intentions.branchedTransformations.intentions
import org.jetbrains.kotlin.idea.intentions.JetSelfTargetingIntention
import org.jetbrains.kotlin.idea.intentions.branchedTransformations.*
import org.jetbrains.kotlin.psi.JetWhenExpression
import com.intellij.openapi.editor.Editor
import org.jetbrains.kotlin.idea.intentions.JetSelfTargetingOffsetIndependentIntention
import org.jetbrains.kotlin.idea.intentions.branchedTransformations.canMergeWithNext
import org.jetbrains.kotlin.idea.intentions.branchedTransformations.mergeWithNext
import org.jetbrains.kotlin.psi.JetWhenExpression
public class MergeWhenIntention : JetSelfTargetingIntention<JetWhenExpression>("merge.when", javaClass()) {
public class MergeWhenIntention : JetSelfTargetingOffsetIndependentIntention<JetWhenExpression>("merge.when", javaClass()) {
override fun isApplicableTo(element: JetWhenExpression): Boolean = element.canMergeWithNext()
override fun applyTo(element: JetWhenExpression, editor: Editor) {
@@ -16,19 +16,15 @@
package org.jetbrains.kotlin.idea.intentions.branchedTransformations.intentions
import org.jetbrains.kotlin.psi.JetSafeQualifiedExpression
import org.jetbrains.kotlin.idea.intentions.JetSelfTargetingIntention
import com.intellij.openapi.editor.Editor
import org.jetbrains.kotlin.psi.JetPsiFactory
import org.jetbrains.kotlin.psi.JetPsiUtil
import org.jetbrains.kotlin.psi.JetBinaryExpression
import org.jetbrains.kotlin.idea.intentions.JetSelfTargetingOffsetIndependentIntention
import org.jetbrains.kotlin.idea.intentions.branchedTransformations.convertToIfNotNullExpression
import org.jetbrains.kotlin.idea.intentions.branchedTransformations.introduceValueForCondition
import org.jetbrains.kotlin.psi.JetDotQualifiedExpression
import org.jetbrains.kotlin.idea.intentions.branchedTransformations.isStableVariable
import org.jetbrains.kotlin.idea.intentions.branchedTransformations.isStatement
import org.jetbrains.kotlin.psi.*
public class SafeAccessToIfThenIntention : JetSelfTargetingIntention<JetSafeQualifiedExpression>("safe.access.to.if.then", javaClass()) {
public class SafeAccessToIfThenIntention : JetSelfTargetingOffsetIndependentIntention<JetSafeQualifiedExpression>("safe.access.to.if.then", javaClass()) {
override fun isApplicableTo(element: JetSafeQualifiedExpression): Boolean = true
override fun applyTo(element: JetSafeQualifiedExpression, editor: Editor) {
@@ -16,18 +16,15 @@
package org.jetbrains.kotlin.idea.intentions.branchedTransformations.intentions
import org.jetbrains.kotlin.psi.JetExpression
import org.jetbrains.kotlin.idea.intentions.branchedTransformations.*
import org.jetbrains.kotlin.idea.intentions.JetSelfTargetingIntention
import com.intellij.openapi.editor.Editor
import org.jetbrains.kotlin.psi.JetFile
import org.jetbrains.kotlin.psi.JetBinaryExpression
import org.jetbrains.kotlin.psi.JetReturnExpression
import org.jetbrains.kotlin.psi.JetProperty
import org.jetbrains.kotlin.idea.intentions.JetSelfTargetingOffsetIndependentIntention
import org.jetbrains.kotlin.idea.intentions.branchedTransformations.BranchedUnfoldingUtils
import org.jetbrains.kotlin.idea.intentions.branchedTransformations.UnfoldableKind
import org.jetbrains.kotlin.psi.*
public open class UnfoldBranchedExpressionIntention<T: JetExpression>(
val kind: UnfoldableKind, elementType: Class<T>
) : JetSelfTargetingIntention<T>(kind.getKey(), elementType) {
) : JetSelfTargetingOffsetIndependentIntention<T>(kind.getKey(), elementType) {
override fun isApplicableTo(element: T): Boolean = BranchedUnfoldingUtils.getUnfoldableExpressionKind(element) == kind
override fun applyTo(element: T, editor: Editor) {
@@ -16,12 +16,13 @@
package org.jetbrains.kotlin.idea.intentions.branchedTransformations.intentions
import org.jetbrains.kotlin.idea.intentions.JetSelfTargetingIntention
import org.jetbrains.kotlin.psi.JetWhenExpression
import com.intellij.openapi.editor.Editor
import org.jetbrains.kotlin.idea.intentions.branchedTransformations.*
import org.jetbrains.kotlin.idea.intentions.JetSelfTargetingOffsetIndependentIntention
import org.jetbrains.kotlin.idea.intentions.branchedTransformations.canTransformToIf
import org.jetbrains.kotlin.idea.intentions.branchedTransformations.transformToIf
import org.jetbrains.kotlin.psi.JetWhenExpression
public class WhenToIfIntention : JetSelfTargetingIntention<JetWhenExpression>("when.to.if", javaClass()) {
public class WhenToIfIntention : JetSelfTargetingOffsetIndependentIntention<JetWhenExpression>("when.to.if", javaClass()) {
override fun isApplicableTo(element: JetWhenExpression): Boolean = element.canTransformToIf()
override fun applyTo(element: JetWhenExpression, editor: Editor) {
@@ -17,10 +17,10 @@
package org.jetbrains.kotlin.idea.intentions.declarations
import com.intellij.openapi.editor.Editor
import org.jetbrains.kotlin.idea.intentions.JetSelfTargetingOffsetIndependentIntention
import org.jetbrains.kotlin.psi.JetProperty
import org.jetbrains.kotlin.idea.intentions.JetSelfTargetingIntention
public class SplitPropertyDeclarationIntention : JetSelfTargetingIntention<JetProperty>("split.property.declaration", javaClass()) {
public class SplitPropertyDeclarationIntention : JetSelfTargetingOffsetIndependentIntention<JetProperty>("split.property.declaration", javaClass()) {
override fun isApplicableTo(element: JetProperty): Boolean = DeclarationUtils.checkSplitProperty(element)
override fun applyTo(element: JetProperty, editor: Editor) {