Open1

Kotlin 2.2 の context-sensitive resolution について

watabeewatabee

https://youtu.be/aF8RYQrJI8Q

Kotlin 2.2 から context-sensitive resolution という機能が導入された。

現時点ではコンパイラオプションでこの機能を有効にすることができる。

kotlin {
    compilerOptions {
        freeCompilerArgs.add("-Xcontext-sensitive-resolution")
    }
}

今までだと以下のように書いていた。

fun parseError(errorCode: Int): NetworkError = when (errorCode) {
    -1 -> NetworkError.Connection
    2 -> NetworkError.Authentication
    3 -> NetworkError.Permission
    else -> NetworkError.Unknown
}

個別にインポートしたりワイルドカードインポートすると、when 式の中で NetworkError を書く必要はなかった。

import com.example.NetworkError.*

fun parseError(errorCode: Int): NetworkError = when (errorCode) {
    -1 -> Connection
    2 -> Authentication
    3 -> Permission
    else -> Unknown
}

この機能を有効にすると、インポート文を追加せずに when 式の中で NetworkError を書く必要がなくなる。

fun parseError(errorCode: Int): NetworkError = when (errorCode) {
    -1 -> Connection
    2 -> Authentication
    3 -> Permission
    else -> Unknown
}

その他にも以下のように書くことができる。

fun message(error: NetworkError): String = when (error) {
    Connection -> "Connection failed"
    Authentication -> "User is not logged in"
    Permission -> "You don't have permission for this action"
    Unknown -> "Unknown problem"
}

fun log(error: NetworkError) {
    if (error == Unknown) {
        // We ignore unknown errors here
        return
    }
	  
    // Log the error
}

また、enum や sealed interface などだけではなく、以下のように事前に定義済みの値に対しても使える。

class Color(r: Int, g: Int, b: Int) {
    companion object {
        val WHITE: Color = Color(255, 255, 255)
        val BLACK: Color = Color(0, 0, 0)
        fun background(): Color = Color(0, 0, 0)
    }
}

val Color.Companion.KODEE get() = Color(127, 82, 255)

fun testColor(color: Color) {
    when (color) {
        WHITE -> println("It's white!")
        BLACK -> println("It's black!")
        KODEE -> println("It looks just like Kodee!")
        background() -> ... // これは使えない
        else -> println("I have no idea what it is.")
    }
}