Reflection: add KClass.declaredMembers

This commit is contained in:
Alexander Udalov
2016-07-12 19:55:59 +03:00
parent 30b7334e48
commit 0525b1e6c1
3 changed files with 66 additions and 0 deletions
@@ -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 <reified T> test(vararg names: String) {
assertEquals(names.toSet(), T::class.declaredMembers.map { it.name }.toSet())
}
fun box(): String {
test<I>("publicStaticI", "publicMemberI", "privateStaticI", "privateMemberI")
test<J>("publicStaticJ", "publicMemberJ", "privateStaticJ", "privateMemberJ")
test<K>("publicKFun", "privateKFun", "publicKProp", "privateKProp")
test<L>("publicLFun", "privateLFun", "publicLProp", "privateLProp")
return "OK"
}
@@ -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");
@@ -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<KCallable<*>>
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.