Explorar o código

Add contracts to `cast`, `safeCast` and `castOrNull`; Add `uncheckedCast`

Him188 %!s(int64=4) %!d(string=hai) anos
pai
achega
dad2d965ab
Modificáronse 1 ficheiros con 17 adicións e 3 borrados
  1. 17 3
      mirai-core-utils/src/commonMain/kotlin/StandardUtils.kt

+ 17 - 3
mirai-core-utils/src/commonMain/kotlin/StandardUtils.kt

@@ -13,13 +13,27 @@
 package net.mamoe.mirai.utils
 
 import java.util.*
+import kotlin.contracts.contract
 import kotlin.reflect.KClass
 
-public inline fun <reified T> Any?.cast(): T = this as T
+public inline fun <reified T> Any?.cast(): T {
+    contract { returns() implies (this@cast is T) }
+    return this as T
+}
+
+public inline fun <reified T> Any?.safeCast(): T? {
+    contract { returnsNotNull() implies (this@safeCast is T) }
+    return this as? T
+}
+
+public inline fun <reified T> Any?.castOrNull(): T? {
+    contract { returnsNotNull() implies (this@castOrNull is T) }
+    return this as? T
+}
 
-public inline fun <reified T> Any?.safeCast(): T? = this as? T
+@Suppress("NOTHING_TO_INLINE", "UNCHECKED_CAST")
+public inline fun <T> Any?.uncheckedCast(): T = this as T
 
-public inline fun <reified T> Any?.castOrNull(): T? = this as? T
 
 public inline fun <reified R> Iterable<*>.firstIsInstanceOrNull(): R? {
     for (it in this) {