Fix substitution of generic types in contracts

#KT-41078 Fixed
This commit is contained in:
Dmitriy Novozhilov
2021-04-16 13:39:52 +03:00
committed by TeamCityServer
parent 91fedd6a12
commit b530427bb2
8 changed files with 155 additions and 15 deletions
@@ -0,0 +1,31 @@
// !USE_EXPERIMENTAL: kotlin.contracts.ExperimentalContracts
// ISSUE: KT-43260
import kotlin.contracts.ExperimentalContracts
import kotlin.contracts.contract
sealed class Either<L : Any, R : Any> {
data class Left<L : Any, R : Any>(val leftValue: L) : Either<L, R>()
data class Right<L : Any, R : Any>(val rightValue: R) : Either<L, R>()
}
inline fun <reified L : Any, reified R : Any> Either<L, R>.isLeft(): Boolean {
contract {
returns(true) implies (this@isLeft is Either.Left<L, R>)
}
return this is Either.Left<L, R>
}
inline fun <reified L : Any, reified R : Any> Either<L, R>.isRight(): Boolean {
contract {
returns(true) implies (this@isRight is Either.Right<L, R>)
}
return this is Either.Right<L, R>
}
fun test() {
val result: Either<Exception, Unit> = Either.Left(RuntimeException("simulating missing code"))
if (result.isLeft()) {
val cause = result.leftValue.cause
}
}