summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIlya Gorbunov <ilya.gorbunov@jetbrains.com>2020-07-10 21:21:31 +0300
committerIlya Gorbunov <ilya.gorbunov@jetbrains.com>2020-07-14 18:37:43 +0300
commit20674b13768b892dd1244618581f4d844d49e143 (patch)
tree179fb93bd2d7b1e2b3b6dd37668654739b6f060f
parentf57adc266a061a4242784c19250b872a4b5d702e (diff)
downloadkotlin-20674b13768b892dd1244618581f4d844d49e143.tar.gz
Make common KClass extend common KClassifier
It already does that in all platforms. Add KClass common API test. (cherry picked from commit 010e530ac4b2ca56f3a3df46a9eedc15fd5fc1d5)
-rw-r--r--libraries/stdlib/src/kotlin/reflect/KClass.kt4
-rw-r--r--libraries/stdlib/test/reflection/KClassTest.kt45
2 files changed, 47 insertions, 2 deletions
diff --git a/libraries/stdlib/src/kotlin/reflect/KClass.kt b/libraries/stdlib/src/kotlin/reflect/KClass.kt
index 2d8ee2ed2d7..f675514cffd 100644
--- a/libraries/stdlib/src/kotlin/reflect/KClass.kt
+++ b/libraries/stdlib/src/kotlin/reflect/KClass.kt
@@ -1,5 +1,5 @@
/*
- * Copyright 2010-2018 JetBrains s.r.o. and Kotlin Programming Language contributors.
+ * Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
@@ -13,7 +13,7 @@ package kotlin.reflect
*
* @param T the type of the class.
*/
-public expect interface KClass<T : Any> {
+public expect interface KClass<T : Any> : KClassifier {
/**
* The simple name of the class as it was declared in the source code,
* or `null` if the class has no name (if, for example, it is a class of an anonymous object).
diff --git a/libraries/stdlib/test/reflection/KClassTest.kt b/libraries/stdlib/test/reflection/KClassTest.kt
new file mode 100644
index 00000000000..f99338bd273
--- /dev/null
+++ b/libraries/stdlib/test/reflection/KClassTest.kt
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
+ * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
+ */
+
+package test.reflection
+
+import test.*
+import kotlin.reflect.*
+import kotlin.test.*
+
+class KClassTest {
+
+ @Test
+ fun className() {
+ assertEquals("KClassTest", KClassTest::class.simpleName)
+// assertEquals(null, object {}::class.simpleName) // doesn't work as documented in JDK < 9, see KT-23072
+ }
+
+ @Test
+ fun extendsKClassifier() {
+ assertStaticAndRuntimeTypeIs<KClassifier>(KClassTest::class)
+ }
+
+ @Test
+ fun isInstanceCastSafeCast() {
+ fun <T : Any> checkIsInstance(kclass: KClass<T>, value: Any?, expectedResult: Boolean) {
+ if (expectedResult) {
+ assertTrue(kclass.isInstance(value))
+ assertSame(value, kclass.safeCast(value))
+ assertSame(value, kclass.cast(value))
+ } else {
+ assertFalse(kclass.isInstance(value))
+ assertNull(kclass.safeCast(value))
+ assertFailsWith<ClassCastException> { kclass.cast(value) }
+ }
+ }
+
+ val numberClass = Number::class
+ checkIsInstance(numberClass, 1, true)
+ checkIsInstance(numberClass, 1.0, true)
+ checkIsInstance(numberClass, null, false)
+ checkIsInstance(numberClass, "42", false)
+ }
+}