67 lines
1.4 KiB
Kotlin
Vendored
67 lines
1.4 KiB
Kotlin
Vendored
@file:OptIn(ExperimentalContracts::class)
|
|
|
|
import kotlin.contracts.InvocationKind
|
|
import kotlin.contracts.contract
|
|
import kotlin.contracts.ExperimentalContracts
|
|
|
|
fun returnsTrue(condition: Boolean) {
|
|
contract {
|
|
returns(true) implies (condition)
|
|
}
|
|
}
|
|
|
|
fun returnsNull(condition: Boolean) {
|
|
contract {
|
|
returns(null) implies (condition)
|
|
}
|
|
}
|
|
|
|
fun returnsNotNull(condition: Boolean) {
|
|
contract {
|
|
returnsNotNull() implies (condition)
|
|
}
|
|
}
|
|
|
|
fun Any?.receiverIsNotNull(): Boolean {
|
|
contract {
|
|
returns(true) implies (this@receiverIsNotNull != null)
|
|
}
|
|
return this != null
|
|
}
|
|
|
|
inline fun callsInPlaceAtMostOnce(block: () -> Unit) {
|
|
contract {
|
|
callsInPlace(block, InvocationKind.AT_MOST_ONCE)
|
|
}
|
|
}
|
|
|
|
inline fun callsInPlaceUnknown(block: () -> Unit) {
|
|
contract {
|
|
callsInPlace(block, InvocationKind.UNKNOWN)
|
|
}
|
|
}
|
|
|
|
fun conjunction(a: Boolean, b: Boolean, c: Boolean) {
|
|
contract {
|
|
returns() implies (a && !b && c)
|
|
}
|
|
}
|
|
|
|
fun disjunction(a: Boolean, b: Boolean, c: Boolean) {
|
|
contract {
|
|
returns() implies (a || !b || c)
|
|
}
|
|
}
|
|
|
|
fun complexBoolean(a: Any?, b: Any?, c: Any?, d: Any?) {
|
|
contract {
|
|
returns() implies ((a != null && c != null) || (b == null && d != null))
|
|
}
|
|
}
|
|
|
|
fun negatedIsAndConjunction(a: Any?, b: Boolean, c: Any?) {
|
|
contract {
|
|
returns() implies (a !is List<*> && b && c == null)
|
|
}
|
|
}
|