From 791fa411d8b6a9d4bba8146e81f31e1966568388 Mon Sep 17 00:00:00 2001 From: pyos Date: Fri, 2 Jul 2021 10:59:32 +0200 Subject: [PATCH] JVM_IR: write correct lambda invoke() signature in metadata --- .../kotlin/fir/backend/jvm/FirMetadataSerializer.kt | 9 +++++++-- .../backend/jvm/codegen/DescriptorMetadataSerializer.kt | 9 +++++++-- .../backend/jvm/lower/FunctionReferenceLowering.kt | 1 + 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/compiler/fir/fir2ir/jvm-backend/src/org/jetbrains/kotlin/fir/backend/jvm/FirMetadataSerializer.kt b/compiler/fir/fir2ir/jvm-backend/src/org/jetbrains/kotlin/fir/backend/jvm/FirMetadataSerializer.kt index 082e22dfafc..5399ba44e44 100644 --- a/compiler/fir/fir2ir/jvm-backend/src/org/jetbrains/kotlin/fir/backend/jvm/FirMetadataSerializer.kt +++ b/compiler/fir/fir2ir/jvm-backend/src/org/jetbrains/kotlin/fir/backend/jvm/FirMetadataSerializer.kt @@ -183,8 +183,13 @@ class FirMetadataSerializer( serializer!!.packagePartProto(irClass.getPackageFragment()!!.fqName, metadata.fir).apply { serializerExtension.serializeJvmPackage(this) }.build() - is FirMetadataSource.Function -> - serializer!!.functionProto(metadata.fir.copyToFreeAnonymousFunction())?.build() + is FirMetadataSource.Function -> { + val withTypeParameters = metadata.fir.copyToFreeAnonymousFunction() + serializationBindings.get(FirJvmSerializerExtension.METHOD_FOR_FIR_FUNCTION, metadata.fir)?.let { + serializationBindings.put(FirJvmSerializerExtension.METHOD_FOR_FIR_FUNCTION, withTypeParameters, it) + } + serializer!!.functionProto(withTypeParameters)?.build() + } else -> null } ?: return null return message to serializer!!.stringTable as JvmStringTable diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/DescriptorMetadataSerializer.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/DescriptorMetadataSerializer.kt index fe0f58cae25..66e72995665 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/DescriptorMetadataSerializer.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/DescriptorMetadataSerializer.kt @@ -65,8 +65,13 @@ class DescriptorMetadataSerializer( serializer!!.packagePartProto(irClass.getPackageFragment()!!.fqName, metadata.descriptors).apply { serializerExtension.serializeJvmPackage(this, type) }.build() - is DescriptorMetadataSource.Function -> - serializer!!.functionProto(createFreeFakeLambdaDescriptor(metadata.descriptor, context.state.typeApproximator))?.build() + is DescriptorMetadataSource.Function -> { + val withTypeParameters = createFreeFakeLambdaDescriptor(metadata.descriptor, context.state.typeApproximator) + serializationBindings.get(JvmSerializationBindings.METHOD_FOR_FUNCTION, metadata.descriptor)?.let { + serializationBindings.put(JvmSerializationBindings.METHOD_FOR_FUNCTION, withTypeParameters, it) + } + serializer!!.functionProto(withTypeParameters)?.build() + } else -> null } ?: return null return message to serializer!!.stringTable as JvmStringTable diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/FunctionReferenceLowering.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/FunctionReferenceLowering.kt index 3690ff5e78c..7d770d26ba6 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/FunctionReferenceLowering.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/FunctionReferenceLowering.kt @@ -677,6 +677,7 @@ internal class FunctionReferenceLowering(private val context: JvmBackendContext) returnType = referenceReturnType isSuspend = callee.isSuspend }.apply { + metadata = functionReferenceClass.metadata overriddenSymbols += superMethod.symbol dispatchReceiverParameter = buildReceiverParameter( this,