JS/RTTI: support safe casts

This commit is contained in:
Alexey Tsvetkov
2015-06-18 16:46:48 +03:00
committed by Alexey Andreev
parent 3fd387d4a6
commit 2b3ebc7e9f
9 changed files with 131 additions and 17 deletions
@@ -0,0 +1,16 @@
package foo
class A
class B
fun box(): String {
val a: Any? = A()
val nil: Any? = null
val b: Any? = B()
assertEquals(a, a as? A, "a")
assertEquals(null, nil as? A, "nil")
assertEquals(null, b as? A, "b")
return "OK"
}
@@ -0,0 +1,16 @@
package foo
class A
class B
fun box(): String {
val a: Any? = A()
val nil: Any? = null
val b: Any? = B()
assertEquals(a, a as? A?, "a")
assertEquals(null, nil as? A?, "nil")
assertEquals(null, b as? A?, "b")
return "OK"
}
@@ -0,0 +1,21 @@
package foo
// CHECK_NOT_CALLED: castTo
class A
class B
inline
fun Any?.castTo<reified T>(): T? = this as? T
fun box(): String {
val a: Any? = A()
val nil: Any? = null
val b: Any? = B()
assertEquals(a, a.castTo<A>(), "a")
assertEquals(null, nil.castTo<A>(), "nil")
assertEquals(null, b.castTo<A>(), "b")
return "OK"
}
@@ -0,0 +1,21 @@
package foo
// CHECK_NOT_CALLED: castTo
class A
class B
inline
fun Any?.castTo<reified T>(): T? = this as? T?
fun box(): String {
val a: Any? = A()
val nil: Any? = null
val b: Any? = B()
assertEquals(a, a.castTo<A>(), "a")
assertEquals(null, nil.castTo<A>(), "nil")
assertEquals(null, b.castTo<A>(), "b")
return "OK"
}