Nested when structures are difficult to understand because you can easily confuse the cases of an inner when as belonging to an outer statement. Therefore nested when statements should be avoided.

Specifically, you should structure your code to avoid the need for nested when statements, but if you cannot, then consider moving the inner when to another function.

Noncompliant Code Example

fun foo(n: Int, m: Int) {
  when (n) {
    0 ->
      when (m) {  // Noncompliant; nested when
        // ...
      }
    1 -> print("1")
    else -> print("2")
  }
}

Compliant Solution

fun foo(n: Int, m: Int) {
  when (n) {
    0 -> bar(m)
    1 -> print("1")
    else -> print("2")
  }
}

fun bar(m: Int){
  when(m) {
    // ...
  }
}