Render contracts in kotlinp, fix minor bug in kotlinx-metadata-jvm

This commit is contained in:
Alexander Udalov
2019-05-07 15:04:00 +02:00
parent 2a3786e3f8
commit fd00999771
6 changed files with 280 additions and 3 deletions
+66
View File
@@ -0,0 +1,66 @@
@file:UseExperimental(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)
}
}
+71
View File
@@ -0,0 +1,71 @@
// ContractsKt.class
// ------------------------------------------
package {
// signature: callsInPlaceAtMostOnce(Lkotlin/jvm/functions/Function0;)V
public final inline fun callsInPlaceAtMostOnce(block: kotlin/Function0<kotlin/Unit>): kotlin/Unit
contract {
callsInPlace(p#1, InvocationKind.AT_MOST_ONCE)
}
// signature: callsInPlaceUnknown(Lkotlin/jvm/functions/Function0;)V
public final inline fun callsInPlaceUnknown(block: kotlin/Function0<kotlin/Unit>): kotlin/Unit
contract {
callsInPlace(p#1)
}
// signature: complexBoolean(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V
public final fun complexBoolean(a: kotlin/Any?, b: kotlin/Any?, c: kotlin/Any?, d: kotlin/Any?): kotlin/Unit
contract {
returns() implies ((p#1 != null && p#3 != null) || (p#2 == null && p#4 != null))
}
// signature: conjunction(ZZZ)V
public final fun conjunction(a: kotlin/Boolean, b: kotlin/Boolean, c: kotlin/Boolean): kotlin/Unit
contract {
returns() implies (p#1 && p#2 && p#3)
}
// signature: disjunction(ZZZ)V
public final fun disjunction(a: kotlin/Boolean, b: kotlin/Boolean, c: kotlin/Boolean): kotlin/Unit
contract {
returns() implies (p#1 || p#2 || p#3)
}
// signature: negatedIsAndConjunction(Ljava/lang/Object;ZLjava/lang/Object;)V
public final fun negatedIsAndConjunction(a: kotlin/Any?, b: kotlin/Boolean, c: kotlin/Any?): kotlin/Unit
contract {
returns() implies (p#1 !is kotlin/collections/List<*> && p#2 && p#3 == null)
}
// signature: returnsNotNull(Z)V
public final fun returnsNotNull(condition: kotlin/Boolean): kotlin/Unit
contract {
returnsNotNull() implies (p#1)
}
// signature: returnsNull(Z)V
public final fun returnsNull(condition: kotlin/Boolean): kotlin/Unit
contract {
returns(null) implies (p#1)
}
// signature: returnsTrue(Z)V
public final fun returnsTrue(condition: kotlin/Boolean): kotlin/Unit
contract {
returns(true) implies (p#1)
}
// signature: receiverIsNotNull(Ljava/lang/Object;)Z
public final fun kotlin/Any?.receiverIsNotNull(): kotlin/Boolean
contract {
returns(true) implies (p#0 != null)
}
}
// META-INF/test-module.kotlin_module
// ------------------------------------------
module {
package <root> {
ContractsKt
}
}