diff --git a/compiler/testData/codegen/java8/box/reflection/parameters/realParameterNames.kt b/compiler/testData/codegen/java8/box/reflection/parameters/realParameterNames.kt index 2288e7f38d3..b731ab629ea 100644 --- a/compiler/testData/codegen/java8/box/reflection/parameters/realParameterNames.kt +++ b/compiler/testData/codegen/java8/box/reflection/parameters/realParameterNames.kt @@ -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" } diff --git a/compiler/testData/codegen/java8/box/reflection/parameters/synthesizedParameterNames.kt b/compiler/testData/codegen/java8/box/reflection/parameters/synthesizedParameterNames.kt index be9234e7a73..b96619ff5d4 100644 --- a/compiler/testData/codegen/java8/box/reflection/parameters/synthesizedParameterNames.kt +++ b/compiler/testData/codegen/java8/box/reflection/parameters/synthesizedParameterNames.kt @@ -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" } diff --git a/core/descriptors.runtime/src/kotlin/reflect/jvm/internal/structure/ReflectJavaMember.kt b/core/descriptors.runtime/src/kotlin/reflect/jvm/internal/structure/ReflectJavaMember.kt index b9efe8d6e1a..fa1437156ca 100644 --- a/core/descriptors.runtime/src/kotlin/reflect/jvm/internal/structure/ReflectJavaMember.kt +++ b/core/descriptors.runtime/src/kotlin/reflect/jvm/internal/structure/ReflectJavaMember.kt @@ -46,9 +46,13 @@ abstract class ReflectJavaMember : ReflectJavaElement(), ReflectJavaAnnotationOw ): List { val result = ArrayList(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)) }