JVM IR: do not generate extension receiver parameter as ACC_MANDATED

Otherwise Java reflection is not able to load its type as a
parameterized type.

 #KT-40857 Fixed
This commit is contained in:
Alexander Udalov
2023-02-28 23:30:23 +01:00
committed by Space Team
parent d23a4f46cc
commit 47c48efa33
9 changed files with 62 additions and 16 deletions
@@ -1,5 +1,6 @@
// SKIP_JDK6
// TARGET_BACKEND: JVM
// IGNORE_BACKEND: JVM
// WITH_STDLIB
// FULL_JDK
// PARAMETERS_METADATA
@@ -15,7 +16,7 @@ fun box(): String {
val method = clazz.getDeclaredMethod("test", String::class.java, String::class.java)
val parameters = method.getParameters()
if (!parameters[0].isImplicit() || parameters[0].isSynthetic()) return "wrong modifier on receiver parameter: ${parameters[0].modifiers}"
if (parameters[0].isImplicit() || parameters[0].isSynthetic()) return "wrong modifier on receiver parameter: ${parameters[0].modifiers}"
return parameters[1].name
}
@@ -1,5 +1,6 @@
// SKIP_JDK6
// TARGET_BACKEND: JVM
// IGNORE_BACKEND: JVM
// WITH_STDLIB
// FULL_JDK
// PARAMETERS_METADATA
@@ -19,10 +20,8 @@ fun box(): String {
val extensionMethod = Class.forName("AKt").declaredMethods.single { it.name.contains("extension") }
val extensionMethodParameters = extensionMethod.getParameters()
if (extensionMethodParameters[0].isSynthetic())
return "wrong modifier (synthetic) on extension receiver parameter: ${extensionMethodParameters[0].modifiers}"
if (!extensionMethodParameters[0].isImplicit())
return "wrong modifier (not implicit) on extension receiver parameter: ${extensionMethodParameters[0].modifiers}"
if (extensionMethodParameters[0].isSynthetic() || extensionMethodParameters[0].isImplicit())
return "wrong modifier on extension receiver parameter: ${extensionMethodParameters[0].modifiers}"
return "OK"
}
@@ -0,0 +1,17 @@
// SKIP_JDK6
// TARGET_BACKEND: JVM
// IGNORE_BACKEND: JVM
// WITH_STDLIB
// FULL_JDK
// PARAMETERS_METADATA
import java.lang.reflect.ParameterizedType
fun List<String>.bar(i: Int) = Unit
fun box(): String {
val function = object {}.javaClass.enclosingClass.getDeclaredMethods().single { it.name == "bar" }
val type = function.parameters[0].parameterizedType
if (type !is ParameterizedType || type.toString() != "java.util.List<java.lang.String>") return "Fail: $type ${type.javaClass}"
return "OK"
}