diff --git a/idea/src/org/jetbrains/kotlin/idea/inspections/ConstantConditionIfInspection.kt b/idea/src/org/jetbrains/kotlin/idea/inspections/ConstantConditionIfInspection.kt index 159478f0e4f..57989166695 100644 --- a/idea/src/org/jetbrains/kotlin/idea/inspections/ConstantConditionIfInspection.kt +++ b/idea/src/org/jetbrains/kotlin/idea/inspections/ConstantConditionIfInspection.kt @@ -26,13 +26,17 @@ import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode class ConstantConditionIfInspection : AbstractKotlinInspection() { override fun buildVisitor(holder: ProblemsHolder, isOnTheFly: Boolean): PsiElementVisitor { - return ifExpressionVisitor(fun(expression) { - val condition = expression.condition ?: return + return ifExpressionVisitor { expression -> collectFixesAndRegisterProblem(expression, holder) } + } + + companion object { + private fun collectFixesAndRegisterProblem(expression: KtIfExpression, holder: ProblemsHolder?): List { + val condition = expression.condition ?: return emptyList() val context = condition.analyze(BodyResolveMode.PARTIAL_WITH_CFA) - val constantValue = condition.constantBooleanValue(context) ?: return + val constantValue = condition.constantBooleanValue(context) ?: return emptyList() - val fixes = mutableListOf() + val fixes = mutableListOf() if (expression.branch(constantValue) != null) { val keepBraces = expression.isElseIf() && expression.branch(constantValue) is KtBlockExpression @@ -43,39 +47,57 @@ class ConstantConditionIfInspection : AbstractKotlinInspection() { fixes += RemoveFix() } - holder.registerProblem(condition, - "Condition is always '$constantValue'", - *fixes.toTypedArray()) - }) + holder?.registerProblem( + condition, + "Condition is always '$constantValue'", + *fixes.toTypedArray() + ) + + return fixes + } + + fun applyFixIfSingle(ifExpression: KtIfExpression) { + collectFixesAndRegisterProblem(ifExpression, null).singleOrNull()?.applyFix(ifExpression) + } + } + + private interface ConstantConditionIfFix : LocalQuickFix { + fun applyFix(ifExpression: KtIfExpression) } private class SimplifyFix( - private val conditionValue: Boolean, - private val isUsedAsExpression: Boolean, - private val keepBraces: Boolean - ) : LocalQuickFix { + private val conditionValue: Boolean, + private val isUsedAsExpression: Boolean, + private val keepBraces: Boolean + ) : ConstantConditionIfFix { override fun getFamilyName() = name override fun getName() = "Simplify expression" override fun applyFix(project: Project, descriptor: ProblemDescriptor) { val ifExpression = descriptor.psiElement.getParentOfType(strict = true) ?: return + applyFix(ifExpression) + } + override fun applyFix(ifExpression: KtIfExpression) { val branch = ifExpression.branch(conditionValue)?.let { if (keepBraces) it else it.unwrapBlockOrParenthesis() } ?: return - ifExpression.replaceWithBranch(branch, isUsedAsExpression, keepBraces) } } - private class RemoveFix : LocalQuickFix { + private class RemoveFix : ConstantConditionIfFix { override fun getFamilyName() = name override fun getName() = "Delete expression" override fun applyFix(project: Project, descriptor: ProblemDescriptor) { val ifExpression = descriptor.psiElement.getParentOfType(strict = true) ?: return + applyFix(ifExpression) + } + + override fun applyFix(ifExpression: KtIfExpression) { ifExpression.delete() } } @@ -103,8 +125,7 @@ fun KtExpression.replaceWithBranch(branch: KtExpression, isUsedAsExpression: Boo if (firstChildSibling != lastChild) { if (keepBraces) { parent.addAfter(branch, this) - } - else { + } else { parent.addRangeAfter(firstChildSibling, lastChild.prevSibling, this) } } diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/SimplifyComparisonFix.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/SimplifyComparisonFix.kt index 48d715e5b19..7fd25bf6f8d 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/SimplifyComparisonFix.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/SimplifyComparisonFix.kt @@ -22,12 +22,11 @@ import com.intellij.openapi.project.Project import org.jetbrains.kotlin.diagnostics.Diagnostic import org.jetbrains.kotlin.diagnostics.DiagnosticWithParameters2 import org.jetbrains.kotlin.idea.core.replaced +import org.jetbrains.kotlin.idea.inspections.ConstantConditionIfInspection import org.jetbrains.kotlin.idea.intentions.SimplifyBooleanWithConstantsIntention -import org.jetbrains.kotlin.psi.KtBinaryExpression -import org.jetbrains.kotlin.psi.KtExpression -import org.jetbrains.kotlin.psi.KtFile -import org.jetbrains.kotlin.psi.KtPsiFactory +import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.getNonStrictParentOfType +import org.jetbrains.kotlin.psi.psiUtil.getStrictParentOfType class SimplifyComparisonFix(element: KtExpression, val value: Boolean) : KotlinQuickFixAction(element) { override fun getFamilyName() = "Simplify $element to '$value'" @@ -43,10 +42,12 @@ class SimplifyComparisonFix(element: KtExpression, val value: Boolean) : KotlinQ val simplifyIntention = SimplifyBooleanWithConstantsIntention() if (booleanExpression != null && simplifyIntention.isApplicableTo(booleanExpression)) { simplifyIntention.applyTo(booleanExpression, editor) - } - else { + } else { simplifyIntention.removeRedundantAssertion(result) } + + val ifExpression = result.getStrictParentOfType()?.takeIf { it.condition == result } + if (ifExpression != null) ConstantConditionIfInspection.applyFixIfSingle(ifExpression) } companion object : KotlinSingleIntentionActionFactory() { diff --git a/idea/testData/quickfix/simplifyComparison/doubleNull.kt b/idea/testData/quickfix/simplifyComparison/doubleNull.kt index c511864d2b5..fab83b68a76 100644 --- a/idea/testData/quickfix/simplifyComparison/doubleNull.kt +++ b/idea/testData/quickfix/simplifyComparison/doubleNull.kt @@ -5,7 +5,9 @@ fun foo(x: String?) { } else { if (x == null) { - + bar() } } -} \ No newline at end of file +} + +fun bar() {} \ No newline at end of file diff --git a/idea/testData/quickfix/simplifyComparison/doubleNull.kt.after b/idea/testData/quickfix/simplifyComparison/doubleNull.kt.after index e1ae66f7635..0bf342fb880 100644 --- a/idea/testData/quickfix/simplifyComparison/doubleNull.kt.after +++ b/idea/testData/quickfix/simplifyComparison/doubleNull.kt.after @@ -4,8 +4,7 @@ fun foo(x: String?) { } else { - if (false) { - - } } -} \ No newline at end of file +} + +fun bar() {} \ No newline at end of file diff --git a/idea/testData/quickfix/simplifyComparison/notNull.kt b/idea/testData/quickfix/simplifyComparison/notNull.kt index 7450d66f657..0235688ec23 100644 --- a/idea/testData/quickfix/simplifyComparison/notNull.kt +++ b/idea/testData/quickfix/simplifyComparison/notNull.kt @@ -1,6 +1,8 @@ // "Simplify comparison" "true" fun foo(x: Int) { if (x != null) { - + bar() } -} \ No newline at end of file +} + +fun bar() {} \ No newline at end of file diff --git a/idea/testData/quickfix/simplifyComparison/notNull.kt.after b/idea/testData/quickfix/simplifyComparison/notNull.kt.after index 42766ba832b..b2518059f01 100644 --- a/idea/testData/quickfix/simplifyComparison/notNull.kt.after +++ b/idea/testData/quickfix/simplifyComparison/notNull.kt.after @@ -1,6 +1,6 @@ // "Simplify comparison" "true" fun foo(x: Int) { - if (true) { + bar() +} - } -} \ No newline at end of file +fun bar() {} \ No newline at end of file