Reflection: add KClass.isInstance, KClass.cast, KClass.safeCast

#KT-11284 Fixed
This commit is contained in:
Alexander Udalov
2016-07-12 18:48:37 +03:00
parent 3702f4a7a7
commit ada81923dc
7 changed files with 136 additions and 3 deletions
@@ -0,0 +1,58 @@
// WITH_REFLECT
import kotlin.reflect.KClass
import kotlin.reflect.cast
import kotlin.reflect.safeCast
import kotlin.test.*
fun testInstance(value: Any?, klass: KClass<*>) {
assertTrue(klass.isInstance(value))
assertEquals(value, klass.safeCast(value))
assertEquals(value, klass.cast(value))
}
fun testNotInstance(value: Any?, klass: KClass<*>) {
assertFalse(klass.isInstance(value))
assertNull(klass.safeCast(value))
try {
klass.cast(value)
fail("Value should not be an instance of $klass: $value")
}
catch (e: Exception) { /* OK */ }
}
fun box(): String {
testInstance(Any(), Any::class)
testInstance("", String::class)
testInstance("", Any::class)
testNotInstance(Any(), String::class)
testNotInstance(null, Any::class)
testNotInstance(null, String::class)
testInstance(arrayOf(""), Array<String>::class)
testInstance(arrayOf(""), Array<Any>::class)
testNotInstance(arrayOf(Any()), Array<String>::class)
testInstance(listOf(""), List::class)
testInstance(listOf(""), Collection::class)
// TODO: support MutableList::class (KT-11754)
// testNotInstance(listOf(""), MutableList::class)
testInstance(42, Int::class)
testInstance(42, Int::class.javaPrimitiveType!!.kotlin)
testInstance(42, Int::class.javaObjectType!!.kotlin)
testNotInstance(3.14, Int::class)
// Function types
testInstance(fun() {}, Function0::class)
testNotInstance(fun() {}, Function1::class)
testNotInstance(fun() {}, Function2::class)
testNotInstance(::testInstance, Function0::class)
testNotInstance(::testInstance, Function1::class)
testInstance(::testInstance, Function2::class)
return "OK"
}
@@ -12235,6 +12235,21 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
}
}
@TestMetadata("compiler/testData/codegen/box/reflection/isInstance")
@TestDataPath("$PROJECT_ROOT")
@RunWith(JUnit3RunnerWithInners.class)
public static class IsInstance extends AbstractBlackBoxCodegenTest {
public void testAllFilesPresentInIsInstance() throws Exception {
KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/codegen/box/reflection/isInstance"), Pattern.compile("^(.+)\\.kt$"), true);
}
@TestMetadata("isInstanceCastAndSafeCast.kt")
public void testIsInstanceCastAndSafeCast() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/reflection/isInstance/isInstanceCastAndSafeCast.kt");
doTest(fileName);
}
}
@TestMetadata("compiler/testData/codegen/box/reflection/kClassInAnnotation")
@TestDataPath("$PROJECT_ROOT")
@RunWith(JUnit3RunnerWithInners.class)