== Why is this an issue?

The Kotlin `when` statement can not only be used to compare a selector against a list of values,
but also to select from a list of conditions.

This is a more readable and elegant alternative to a chain of `if` statements and should be used instead.

=== What is the potential impact?

==== Readability and Understanding

This change makes it easier to understand a function because it will reduce its complexity.
This is because a single `when` statement has less cognitive complexity than multiple `if` statements, even if it has as many cases.

== How to fix it

Refactor the chain of `if` statements into a list of conditions for a `when` statement.
Note that the order of the conditions must stay the same as in the `if` chain.

=== Code examples

==== Noncompliant code example

[source,kotlin,diff-id=1,diff-type=noncompliant]
----
fun dispatchFunction(instance: Any) {
    if (instance is Foo) {
        instance.fooFunction()
    } else if (instance is Bar) {
        instance.barFunction()
    } else if (instance is Boo) {
        instance.booFunction()
    } else {
        throw IllegalArgumentException()
    }
}
----

==== Compliant solution

[source,kotlin,diff-id=1,diff-type=compliant]
----
fun dispatchFunction(instance: Any) {
    when (instance) {
        is Foo -> instance.fooFunction()
        is Bar -> instance.barFunction()
        is Boo -> instance.booFunction()
        else -> throw IllegalArgumentException()
    }
}
----

==== Noncompliant code example

When `threshold = 2`

[source,kotlin,diff-id=2,diff-type=noncompliant]
----
fun compare(a: Int, b: Int): Int {
    // ...
    return if (a > b) { // Noncompliant
        1
    } else if (a < b) {
        -1
    } else {
        0
    }
}
----

==== Compliant solution

[source,kotlin,diff-id=2,diff-type=compliant]
----
fun compare(a: Int, b: Int): Int {
    // ...
    return when { // Compliant
        a > b -> 1
        a < b -> -1
        else -> 0
    }
}
----

ifdef::env-github,rspecator-view[]

== Implementation Specification
(visible only on this page)

=== Parameters

.threshold
****

----
3
----

Number of "if" after which the chain should be replaced by a "when" statement.
****

endif::[]

== Resources

=== Documentation

* https://kotlinlang.org/docs/control-flow.html#when-expression[Kotlin Docs, When expression]

=== Articles & blog posts

* https://www.baeldung.com/kotlin/when[Baeldung, Guide to the “when{}” Block in Kotlin]
* https://superkotlin.com/kotlin-when-statement[Kotlin when: A switch with Superpowers]
* https://www.sonarsource.com/resources/cognitive-complexity[G. Ann Campbell, Cognitive Complexity]
