Support introspection of parameter names and indices in reflection

This commit is contained in:
Alexander Udalov
2015-07-07 21:02:53 +03:00
parent 87c70aa2ae
commit 5962b79126
15 changed files with 228 additions and 22 deletions
@@ -0,0 +1,27 @@
import kotlin.reflect.*
import kotlin.test.assertEquals
fun foo(bar: String): Int = bar.length()
class A(val c: String) {
fun foz(baz: Int) {}
}
fun Int.qux(zux: String) {}
fun checkParameters(f: KFunction<*>, names: List<String?>) {
val params = f.parameters
assertEquals(names, params.map { it.name })
assertEquals((0..params.size() - 1).toList(), params.mapIndexed { index, element -> index })
}
fun box(): String {
checkParameters(::box, listOf())
checkParameters(::foo, listOf("bar"))
checkParameters(A::foz, listOf(null, "baz"))
checkParameters(Int::qux, listOf(null, "zux"))
checkParameters(::A, listOf("c"))
return "OK"
}
@@ -0,0 +1,24 @@
import kotlin.reflect.*
import kotlin.test.assertEquals
var default: Int = 0
var defaultAnnotated: Int = 0
public set
var custom: Int = 0
set(myName: Int) {}
fun checkPropertySetterParam(property: KMutableProperty<*>, name: String?) {
val parameter = property.setter.parameters.single()
assertEquals(0, parameter.index)
assertEquals(name, parameter.name)
}
fun box(): String {
checkPropertySetterParam(::default, null)
checkPropertySetterParam(::defaultAnnotated, null)
checkPropertySetterParam(::custom, "myName")
return "OK"
}
@@ -3196,6 +3196,27 @@ public class BlackBoxWithStdlibCodegenTestGenerated extends AbstractBlackBoxCode
}
}
@TestMetadata("compiler/testData/codegen/boxWithStdlib/reflection/parameters")
@TestDataPath("$PROJECT_ROOT")
@RunWith(JUnit3RunnerWithInners.class)
public static class Parameters extends AbstractBlackBoxCodegenTest {
public void testAllFilesPresentInParameters() throws Exception {
JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/codegen/boxWithStdlib/reflection/parameters"), Pattern.compile("^(.+)\\.kt$"), true);
}
@TestMetadata("functionParameterNameAndIndex.kt")
public void testFunctionParameterNameAndIndex() throws Exception {
String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/boxWithStdlib/reflection/parameters/functionParameterNameAndIndex.kt");
doTestWithStdlib(fileName);
}
@TestMetadata("propertySetter.kt")
public void testPropertySetter() throws Exception {
String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/boxWithStdlib/reflection/parameters/propertySetter.kt");
doTestWithStdlib(fileName);
}
}
@TestMetadata("compiler/testData/codegen/boxWithStdlib/reflection/properties")
@TestDataPath("$PROJECT_ROOT")
@RunWith(JUnit3RunnerWithInners.class)