Files
kotlin-fork/compiler/testData/diagnostics/tests/smartCasts/complexSealedContracts.kt
T
Brian Norman 6df97dd199 [FIR] Add test cases to prove resolution of backlog tickets
^KT-41728 Fixed
^KT-46586 Fixed
^KT-49696 Fixed
^KT-51160 Fixed
^KT-53308 Fixed
2023-11-09 19:28:26 +00:00

83 lines
2.3 KiB
Kotlin
Vendored

// !OPT_IN: kotlin.contracts.ExperimentalContracts
// WITH_STDLIB
// ISSUE: KT-51160
import kotlin.contracts.*
sealed interface AsyncStatus<out T : Any> {
val value: T?
data class Pending<out T : Any>(
override val value: T? = null,
) : AsyncStatus<T>
sealed interface Terminal<out T : Any> : AsyncStatus<T>
data class Error<out T : Any>(
val error: Throwable,
override val value: T? = null,
) : Terminal<T>
data class Success<out T : Any>(
override val value: T,
) : Terminal<T>
}
fun <T : Any> AsyncStatus<T>.isPending(): Boolean {
contract {
returns(true) implies (this@isPending is AsyncStatus.Pending)
returns(false) implies (this@isPending is AsyncStatus.Terminal)
}
return (this is AsyncStatus.Pending)
}
fun <T : Any> AsyncStatus<T>.isSuccess(): Boolean {
contract { returns(true) implies (this@isSuccess is AsyncStatus.Success) }
return (this is AsyncStatus.Success)
}
fun <T : Any> AsyncStatus.Terminal<T>.isSuccess(): Boolean {
contract {
returns(true) implies (this@isSuccess is AsyncStatus.Success)
returns(false) implies (this@isSuccess is AsyncStatus.Error)
}
return (this is AsyncStatus.Success)
}
fun <T : Any> AsyncStatus<T>.isError(): Boolean {
contract { returns(true) implies (this@isError is AsyncStatus.Error) }
return (this is AsyncStatus.Error)
}
fun <T : Any> AsyncStatus.Terminal<T>.isError(): Boolean {
contract {
returns(true) implies (this@isError is AsyncStatus.Error)
returns(false) implies (this@isError is AsyncStatus.Success)
}
return (this is AsyncStatus.Error)
}
fun <T : Any> AsyncStatus<T>.isTerminal(): Boolean {
contract {
returns(true) implies (this@isTerminal is AsyncStatus.Terminal)
returns(false) implies (this@isTerminal is AsyncStatus.Pending)
}
return (this is AsyncStatus.Terminal)
}
fun main() {
val foo = AsyncStatus.Pending<String>()
if (!foo.isPending()) {
if (<!DEBUG_INFO_SMARTCAST!>foo<!>.isSuccess()) {
nonNullPrint(<!TYPE_MISMATCH!>foo.value<!>)
}
if (<!DEBUG_INFO_SMARTCAST!>foo<!>.isError()) {
foo.<!UNRESOLVED_REFERENCE!>error<!>.<!DEBUG_INFO_MISSING_UNRESOLVED!>printStackTrace<!>()
}
}
}
fun nonNullPrint(printMe: String) {
println(printMe)
}