From 0525b1e6c12c2e0928651595444704c0821d5800 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Tue, 12 Jul 2016 19:55:59 +0300 Subject: [PATCH] Reflection: add KClass.declaredMembers --- .../box/reflection/classes/declaredMembers.kt | 50 +++++++++++++++++++ .../codegen/BlackBoxCodegenTestGenerated.java | 6 +++ .../src/kotlin/reflect/KClasses.kt | 10 ++++ 3 files changed, 66 insertions(+) create mode 100644 compiler/testData/codegen/box/reflection/classes/declaredMembers.kt diff --git a/compiler/testData/codegen/box/reflection/classes/declaredMembers.kt b/compiler/testData/codegen/box/reflection/classes/declaredMembers.kt new file mode 100644 index 00000000000..cd517434d41 --- /dev/null +++ b/compiler/testData/codegen/box/reflection/classes/declaredMembers.kt @@ -0,0 +1,50 @@ +// WITH_REFLECT +// FILE: I.java + +public class I { + public static void publicStaticI() {} + public void publicMemberI() {} + private static void privateStaticI() {} + private void privateMemberI() {} +} + +// FILE: J.java + +public class J extends I { + public static void publicStaticJ() {} + public void publicMemberJ() {} + private static void privateStaticJ() {} + private void privateMemberJ() {} +} + +// FILE: K.kt + +import kotlin.reflect.declaredMembers +import kotlin.test.assertEquals + +open class K : J() { + open fun publicKFun() {} + private fun privateKFun() {} + var publicKProp = Unit + private val privateKProp = Unit +} + +class L : K() { + fun publicLFun() {} + private fun privateLFun() {} + val publicLProp = Unit + private var privateLProp = Unit +} + +inline fun test(vararg names: String) { + assertEquals(names.toSet(), T::class.declaredMembers.map { it.name }.toSet()) +} + +fun box(): String { + test("publicStaticI", "publicMemberI", "privateStaticI", "privateMemberI") + test("publicStaticJ", "publicMemberJ", "privateStaticJ", "privateMemberJ") + test("publicKFun", "privateKFun", "publicKProp", "privateKProp") + test("publicLFun", "privateLFun", "publicLProp", "privateLProp") + + return "OK" +} diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java index 61a03b1f1f2..8820408fca1 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java @@ -11892,6 +11892,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { doTest(fileName); } + @TestMetadata("declaredMembers.kt") + public void testDeclaredMembers() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/reflection/classes/declaredMembers.kt"); + doTest(fileName); + } + @TestMetadata("jvmName.kt") public void testJvmName() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/reflection/classes/jvmName.kt"); diff --git a/core/reflection.jvm/src/kotlin/reflect/KClasses.kt b/core/reflection.jvm/src/kotlin/reflect/KClasses.kt index 37c7a17ba77..4053d531907 100644 --- a/core/reflection.jvm/src/kotlin/reflect/KClasses.kt +++ b/core/reflection.jvm/src/kotlin/reflect/KClasses.kt @@ -64,6 +64,16 @@ val KClass<*>.defaultType: KType get() = KTypeImpl((this as KClassImpl<*>).descriptor.defaultType) { jClass } +/** + * Returns all functions and properties declared in this class. + * Does not include members declared in supertypes. + */ +val KClass<*>.declaredMembers: Collection> + get() = with(this as KClassImpl) { + (getMembers(memberScope, declaredOnly = true, nonExtensions = true, extensions = true) + + getMembers(staticScope, declaredOnly = true, nonExtensions = true, extensions = true)).toList() + } + /** * Returns all functions declared in this class, including all non-static methods declared in the class * and the superclasses, as well as static methods declared in the class.