From db131df751a2c02ffa2effbaae2ce0afa27a78be Mon Sep 17 00:00:00 2001 From: Dmitry Petrov Date: Thu, 23 Aug 2018 15:18:08 +0300 Subject: [PATCH] Don't mangle function names with 'kotlin.SuccessOrFailure' --- .../codegen/state/inlineClassManglingUtils.kt | 25 +++++++++++++------ 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/state/inlineClassManglingUtils.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/state/inlineClassManglingUtils.kt index 402a7b57395..775d177b38f 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/state/inlineClassManglingUtils.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/state/inlineClassManglingUtils.kt @@ -7,10 +7,11 @@ package org.jetbrains.kotlin.codegen.state import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.load.kotlin.getRepresentativeUpperBound +import org.jetbrains.kotlin.resolve.DescriptorUtils.SUCCESS_OR_FAILURE_FQ_NAME +import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameSafe import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameUnsafe import org.jetbrains.kotlin.resolve.isInlineClassType import org.jetbrains.kotlin.types.KotlinType - import java.security.MessageDigest fun getInlineClassValueParametersManglingSuffix(descriptor: CallableMemberDescriptor): String? { @@ -19,11 +20,25 @@ fun getInlineClassValueParametersManglingSuffix(descriptor: CallableMemberDescri val actualValueParameterTypes = listOfNotNull(descriptor.extensionReceiverParameter?.type) + descriptor.valueParameters.map { it.type } - if (actualValueParameterTypes.none { it.isInlineClassType() || it.isTypeParameterWithInlineClassUpperBound() }) return null + if (actualValueParameterTypes.none { it.requiresFunctionNameMangling() }) return null return md5radix36string(collectSignatureForMangling(actualValueParameterTypes)) } +private fun KotlinType.requiresFunctionNameMangling() = + isInlineClassThatRequiresMangling() || isTypeParameterWithUpperBoundThatRequiresMangling() + +private fun KotlinType.isInlineClassThatRequiresMangling() = + isInlineClassType() && !isDontMangleClass(this.constructor.declarationDescriptor as ClassDescriptor) + +private fun isDontMangleClass(classDescriptor: ClassDescriptor) = + classDescriptor.fqNameSafe == SUCCESS_OR_FAILURE_FQ_NAME + +private fun KotlinType.isTypeParameterWithUpperBoundThatRequiresMangling(): Boolean { + val descriptor = constructor.declarationDescriptor as? TypeParameterDescriptor ?: return false + return getRepresentativeUpperBound(descriptor).requiresFunctionNameMangling() +} + private fun collectSignatureForMangling(types: List) = types.joinToString { getSignatureElementForMangling(it) } @@ -51,9 +66,3 @@ private fun md5radix36string(signatureForMangling: String): String { } return acc.toString(36) } - -fun KotlinType.isTypeParameterWithInlineClassUpperBound(): Boolean { - val descriptor = constructor.declarationDescriptor as? TypeParameterDescriptor ?: return false - val bound = getRepresentativeUpperBound(descriptor) - return bound.isInlineClassType() || bound.isTypeParameterWithInlineClassUpperBound() -} \ No newline at end of file