JVM_IR: skip synthetic enum parameters in signatures

This commit is contained in:
pyos
2020-01-08 14:52:02 +01:00
committed by max-kammerer
parent 94c008872e
commit 88cac53d88
3 changed files with 9 additions and 5 deletions
@@ -68,11 +68,11 @@ open class FunctionCodegen(
functionView,
signature.asmMethod.returnType
)
}
if (irFunction !is IrConstructor || !irFunction.parentAsClass.shouldNotGenerateConstructorParameterAnnotations()) {
generateParameterAnnotations(functionView, methodVisitor, signature, classCodegen, context)
// Not generating parameter annotations for default stubs fixes KT-7892, though
// this certainly looks like a workaround for a javac bug.
if (irFunction !is IrConstructor || !irFunction.parentAsClass.shouldNotGenerateConstructorParameterAnnotations()) {
generateParameterAnnotations(functionView, methodVisitor, signature, classCodegen, context)
}
}
if (!state.classBuilderMode.generateBodies || flags.and(Opcodes.ACC_ABSTRACT) != 0 || irFunction.isExternal) {
@@ -214,6 +214,7 @@ class MethodSignatureMapper(private val context: JvmBackendContext) {
for (parameter in function.valueParameters) {
val kind = when (parameter.origin) {
JvmLoweredDeclarationOrigin.FIELD_FOR_OUTER_THIS -> JvmMethodParameterKind.OUTER
JvmLoweredDeclarationOrigin.ENUM_CONSTRUCTOR_SYNTHETIC_PARAMETER -> JvmMethodParameterKind.ENUM_NAME_OR_ORDINAL
else -> JvmMethodParameterKind.VALUE
}
val type = if (forceSingleValueParameterBoxing(function.descriptor)) parameter.type.makeNullable() else parameter.type
@@ -12,10 +12,13 @@ class A(d: Double, s: String, parent: A?) {
inner class Inner(nested: Nested)
}
enum class E(val i: Int) { ENTRY(1) }
fun box(): String {
assertEquals(listOf(java.lang.Double.TYPE, String::class.java, A::class.java), ::A.parameters.map { it.type.javaType })
assertEquals(listOf(A::class.java), A::Nested.parameters.map { it.type.javaType })
assertEquals(listOf(A::class.java, A.Nested::class.java), A::Inner.parameters.map { it.type.javaType })
assertEquals(listOf(java.lang.Integer.TYPE), E::class.constructors.single().parameters.map { it.type.javaType })
assertEquals(A::class.java, ::A.returnType.javaType)
assertEquals(A.Nested::class.java, A::Nested.returnType.javaType)