Fix parameter names of Java inner classes in reflection

#KT-25541 Fixed
This commit is contained in:
Alexander Udalov
2018-07-17 16:21:10 +02:00
parent 873e1b01d6
commit 0f0602230a
3 changed files with 15 additions and 1 deletions
@@ -9,6 +9,10 @@ public class J {
public void foo(int methodParam) {}
public static void bar(J staticMethodParam) {}
class Inner {
public Inner(double innerParam, Object innerParam2) {}
}
}
// FILE: K.kt
@@ -19,6 +23,7 @@ fun box(): String {
assertEquals(listOf("constructorParam"), ::J.parameters.map { it.name })
assertEquals(listOf(null, "methodParam"), J::foo.parameters.map { it.name })
assertEquals(listOf("staticMethodParam"), J::bar.parameters.map { it.name })
assertEquals(listOf(null, "innerParam", "innerParam2"), J::Inner.parameters.map { it.name })
return "OK"
}
@@ -8,6 +8,10 @@ public class J {
public void foo(int methodParam) {}
public static void bar(J staticMethodParam) {}
class Inner {
public Inner(double innerParam, Object innerParam2) {}
}
}
// FILE: K.kt
@@ -18,6 +22,7 @@ fun box(): String {
assertEquals(listOf("arg0"), ::J.parameters.map { it.name })
assertEquals(listOf(null, "arg0"), J::foo.parameters.map { it.name })
assertEquals(listOf("arg0"), J::bar.parameters.map { it.name })
assertEquals(listOf(null, "arg1", "arg2"), J::Inner.parameters.map { it.name })
return "OK"
}
@@ -46,9 +46,13 @@ abstract class ReflectJavaMember : ReflectJavaElement(), ReflectJavaAnnotationOw
): List<JavaValueParameter> {
val result = ArrayList<JavaValueParameter>(parameterTypes.size)
val names = Java8ParameterNamesLoader.loadParameterNames(member)
// Skip synthetic parameters such as outer class instance
val shift = names?.size?.minus(parameterTypes.size) ?: 0
for (i in parameterTypes.indices) {
val type = ReflectJavaType.create(parameterTypes[i])
val name = names?.run { get(i) }
val name = names?.getOrNull(i + shift) ?: error("No parameter with index $i+$shift (name=$name type=$type) in $this")
val isParamVararg = isVararg && i == parameterTypes.lastIndex
result.add(ReflectJavaValueParameter(type, parameterAnnotations[i], name, isParamVararg))
}