diff --git a/idea/src/org/jetbrains/kotlin/idea/inspections/CascadeIfInspection.kt b/idea/src/org/jetbrains/kotlin/idea/inspections/CascadeIfInspection.kt index 09e6f5b0ba8..fc7fa21b322 100644 --- a/idea/src/org/jetbrains/kotlin/idea/inspections/CascadeIfInspection.kt +++ b/idea/src/org/jetbrains/kotlin/idea/inspections/CascadeIfInspection.kt @@ -23,6 +23,7 @@ import com.intellij.codeInspection.ProblemsHolder import org.jetbrains.kotlin.idea.intentions.branchedTransformations.intentions.IfToWhenIntention import org.jetbrains.kotlin.idea.intentions.branchedTransformations.isIfBranch import org.jetbrains.kotlin.idea.intentions.branches +import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.anyDescendantOfType import org.jetbrains.kotlin.psi.psiUtil.lastBlockStatementOrThis @@ -46,6 +47,20 @@ class CascadeIfInspection : AbstractKotlinInspection() { it is KtBreakExpression || it is KtContinueExpression }) return + var current: KtIfExpression? = expression + while (current != null) { + val condition = current.condition + when (condition) { + is KtBinaryExpression -> when (condition.operationToken) { + KtTokens.ANDAND, KtTokens.OROR -> return + } + is KtUnaryExpression -> when (condition.operationToken) { + KtTokens.EXCL -> return + } + } + current = current.`else` as? KtIfExpression + } + holder.registerProblem( expression.ifKeyword, "Cascade if can be replaced with when", diff --git a/idea/testData/inspectionsLocal/cascadeIf/complex.kt b/idea/testData/inspectionsLocal/cascadeIf/complex.kt new file mode 100644 index 00000000000..b4dc36f52c3 --- /dev/null +++ b/idea/testData/inspectionsLocal/cascadeIf/complex.kt @@ -0,0 +1,16 @@ +// PROBLEM: none + +fun foo(a: Boolean, b: Boolean, c: Boolean) { + if (a) { + + } + else if (b && c) { + + } + else if (!c) { + + } + else { + + } +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/inspections/LocalInspectionTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/inspections/LocalInspectionTestGenerated.java index 6783597d59a..89527b61c7d 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/inspections/LocalInspectionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/inspections/LocalInspectionTestGenerated.java @@ -59,6 +59,12 @@ public class LocalInspectionTestGenerated extends AbstractLocalInspectionTest { KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/testData/inspectionsLocal/cascadeIf"), Pattern.compile("^([\\w\\-_]+)\\.kt$"), TargetBackend.ANY, true); } + @TestMetadata("complex.kt") + public void testComplex() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/inspectionsLocal/cascadeIf/complex.kt"); + doTest(fileName); + } + @TestMetadata("four.kt") public void testFour() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/inspectionsLocal/cascadeIf/four.kt");