From ea6b632cea3c9a28b0d430cbfb22ca0dd3eadf23 Mon Sep 17 00:00:00 2001 From: Valentin Kipyatkov Date: Wed, 6 May 2015 11:12:16 +0300 Subject: [PATCH] WhenToIfIntention - smaller range and refactoring --- .../kotlin/idea/JetBundle.properties | 2 - .../branchedTransformationUtils.kt | 32 --------------- .../intentions/WhenToIfIntention.kt | 41 +++++++++++++++---- 3 files changed, 34 insertions(+), 41 deletions(-) diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/JetBundle.properties b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/JetBundle.properties index 9b2639690ff..2366ef3ed9e 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/JetBundle.properties +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/JetBundle.properties @@ -248,8 +248,6 @@ elvis.to.if.then=Replace elvis expression with 'if' expression elvis.to.if.then.family=Replace Elvis Expression with 'if' Expression safe.access.to.if.then=Replace safe access expression with 'if' expression safe.access.to.if.then.family=Replace Safe Access Expression with 'if' Expression -when.to.if=Replace 'when' with 'if' -when.to.if.family=Replace 'when' with 'if' merge.when=Merge 'when' expressions merge.when.family=Merge 'when' Expression introduce.when.subject=Introduce argument to 'when' diff --git a/idea/src/org/jetbrains/kotlin/idea/intentions/branchedTransformations/branchedTransformationUtils.kt b/idea/src/org/jetbrains/kotlin/idea/intentions/branchedTransformations/branchedTransformationUtils.kt index 2fd5aea3170..98ffca33464 100644 --- a/idea/src/org/jetbrains/kotlin/idea/intentions/branchedTransformations/branchedTransformationUtils.kt +++ b/idea/src/org/jetbrains/kotlin/idea/intentions/branchedTransformations/branchedTransformationUtils.kt @@ -24,7 +24,6 @@ import org.jetbrains.kotlin.idea.util.psi.patternMatching.toRange import org.jetbrains.kotlin.lexer.JetTokens import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.JetPsiUnparsingUtils.parenthesizeIfNeeded -import org.jetbrains.kotlin.psi.JetPsiUnparsingUtils.parenthesizeTextIfNeeded import org.jetbrains.kotlin.psi.JetPsiUnparsingUtils.toBinaryExpression import org.jetbrains.kotlin.psi.psiUtil.* @@ -168,37 +167,6 @@ public fun JetWhenExpression.introduceSubject(): JetWhenExpression { return replaced(whenExpression) } -public fun JetWhenExpression.canTransformToIf(): Boolean = !getEntries().isEmpty() - -public fun JetWhenExpression.transformToIf() { - fun combineWhenConditions(conditions: Array, subject: JetExpression?): String { - return when (conditions.size()) { - 0 -> "" - 1 -> conditions[0].toExpressionText(subject) - else -> { - conditions - .map { condition -> parenthesizeTextIfNeeded(condition.toExpressionText(subject)) } - .joinToString(separator = " || ") - } - } - } - - val builder = JetPsiFactory(this).IfChainBuilder() - - for (entry in getEntries()) { - val branch = entry.getExpression() - if (entry.isElse()) { - builder.elseBranch(branch) - } - else { - val branchConditionText = combineWhenConditions(entry.getConditions(), getSubjectExpression()) - builder.ifBranch(branchConditionText, JetPsiUtil.getText(branch)) - } - } - - replace(builder.toExpression()) -} - public fun JetWhenExpression.canMergeWithNext(): Boolean { fun checkConditions(e1: JetWhenEntry, e2: JetWhenEntry): Boolean = e1.getConditions().toList().toRange().matches(e2.getConditions().toList().toRange()) diff --git a/idea/src/org/jetbrains/kotlin/idea/intentions/branchedTransformations/intentions/WhenToIfIntention.kt b/idea/src/org/jetbrains/kotlin/idea/intentions/branchedTransformations/intentions/WhenToIfIntention.kt index 0cdfe007240..a015fb70124 100644 --- a/idea/src/org/jetbrains/kotlin/idea/intentions/branchedTransformations/intentions/WhenToIfIntention.kt +++ b/idea/src/org/jetbrains/kotlin/idea/intentions/branchedTransformations/intentions/WhenToIfIntention.kt @@ -17,15 +17,42 @@ package org.jetbrains.kotlin.idea.intentions.branchedTransformations.intentions import com.intellij.openapi.editor.Editor -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 +import org.jetbrains.kotlin.idea.intentions.JetSelfTargetingIntention +import org.jetbrains.kotlin.idea.intentions.branchedTransformations.toExpressionText +import org.jetbrains.kotlin.psi.* -public class WhenToIfIntention : JetSelfTargetingOffsetIndependentIntention("when.to.if", javaClass()) { - override fun isApplicableTo(element: JetWhenExpression): Boolean = element.canTransformToIf() +public class WhenToIfIntention : JetSelfTargetingIntention(javaClass(), "Replace 'when' with 'if'") { + override fun isApplicableTo(element: JetWhenExpression, caretOffset: Int): Boolean { + if (element.getEntries().isEmpty()) return false + return element.getWhenKeywordElement().getTextRange().containsOffset(caretOffset) + } override fun applyTo(element: JetWhenExpression, editor: Editor) { - element.transformToIf() + val builder = JetPsiFactory(element).IfChainBuilder() + + for (entry in element.getEntries()) { + val branch = entry.getExpression() + if (entry.isElse()) { + builder.elseBranch(branch) + } + else { + val branchConditionText = combineWhenConditions(entry.getConditions(), element.getSubjectExpression()) + builder.ifBranch(branchConditionText, JetPsiUtil.getText(branch)) + } + } + + element.replace(builder.toExpression()) + } + + private fun combineWhenConditions(conditions: Array, subject: JetExpression?): String { + return when (conditions.size()) { + 0 -> "" + 1 -> conditions[0].toExpressionText(subject) + else -> { + conditions + .map { condition -> JetPsiUnparsingUtils.parenthesizeTextIfNeeded(condition.toExpressionText(subject)) } + .joinToString(separator = " || ") + } + } } }