From 88cac53d88b648be41deedaf9872ce72e9915122 Mon Sep 17 00:00:00 2001 From: pyos Date: Wed, 8 Jan 2020 14:52:02 +0100 Subject: [PATCH] JVM_IR: skip synthetic enum parameters in signatures --- .../kotlin/backend/jvm/codegen/FunctionCodegen.kt | 10 +++++----- .../backend/jvm/codegen/MethodSignatureMapper.kt | 1 + .../box/reflection/mapping/types/constructors.kt | 3 +++ 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/FunctionCodegen.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/FunctionCodegen.kt index 67b8b234e4e..9902294567d 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/FunctionCodegen.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/FunctionCodegen.kt @@ -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) { diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/MethodSignatureMapper.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/MethodSignatureMapper.kt index 27bc878ef3f..571882dd22c 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/MethodSignatureMapper.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/MethodSignatureMapper.kt @@ -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 diff --git a/compiler/testData/codegen/box/reflection/mapping/types/constructors.kt b/compiler/testData/codegen/box/reflection/mapping/types/constructors.kt index adcf0d730c9..2c5837b08de 100644 --- a/compiler/testData/codegen/box/reflection/mapping/types/constructors.kt +++ b/compiler/testData/codegen/box/reflection/mapping/types/constructors.kt @@ -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)