Hi,
First post, so apologies in advance. I am relatively new to Kotlin. It’s my favourite language.
I recently found a subtle bug in my code that evaded a couple of code reviewer keen eyes, so I thought it was worth posting a simplified version here as feedback/discussion on this part of the language and/or IDE.
class House {
enum class State {
DOOR_CLOSED, DOOR_OPEN
}
var state = State.DOOR_CLOSED
fun processAction(action:String) {
val newState = when (state) {
State.DOOR_CLOSED -> {
if (action == "openDoor") State.DOOR_OPEN
State.DOOR_CLOSED
}
else -> State.DOOR_CLOSED // self-closing door :)
}
state = newState
}
}
fun main(args: Array<String>) {
var h = House()
h.processAction("openDoor")
println("${h.state}, but could easily expect DOOR_OPEN")
}
It’s clear to me now that, of course, the line with State.DOOR_OPEN will not set the value of the when expression, because it’s not the last expression in that block. The if statement is missing an else clause.
However, since I’ve become accustomed to the rich and helpful advice of kotlin/IntelliJ, I half expected it would somehow make it obvious if it wasn’t working as I intended. Clearly this is a case of user error, but it would have been very helpful if there was some way to be able to verify whether a particular expression is considered a “return value” for a block like this.
I notice, in Android Studio at least, return expressions inside let blocks are annotated with a ^let tag, and something like this would have helped me a lot in this case.
Thoughts?