From 5a7298808eb1c93e14a2996cc4d1011a5c233c18 Mon Sep 17 00:00:00 2001 From: Roman Artemev Date: Thu, 5 Aug 2021 20:28:11 +0300 Subject: [PATCH] [JVM KLIB] Fix Type Parameter resolve --- .../DescriptorByIdSignatureFinder.kt | 24 ++++++++++++++++++- .../deserializeLazyDeclarations.kt | 1 + 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/DescriptorByIdSignatureFinder.kt b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/DescriptorByIdSignatureFinder.kt index e8acb890b44..72a868d9f87 100644 --- a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/DescriptorByIdSignatureFinder.kt +++ b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/DescriptorByIdSignatureFinder.kt @@ -5,6 +5,7 @@ package org.jetbrains.kotlin.backend.common.serialization +import org.jetbrains.kotlin.backend.common.serialization.mangle.MangleConstant import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl import org.jetbrains.kotlin.incremental.components.NoLookupLocation @@ -43,10 +44,31 @@ class DescriptorByIdSignatureFinder( when (signature) { is IdSignature.AccessorSignature -> findDescriptorForAccessorSignature(signature) is IdSignature.CommonSignature -> findDescriptorForPublicSignature(signature) - is IdSignature.CompositeSignature -> findDescriptorBySignature(signature.nearestPublicSig()) + is IdSignature.CompositeSignature -> resolveCompositeSignature(signature) else -> error("only PublicSignature or AccessorSignature should reach this point, got $signature") } + private fun resolveCompositeSignature(signature: IdSignature.CompositeSignature): DeclarationDescriptor? { + val container = findDescriptorBySignature(signature.nearestPublicSig()) + val inner = signature.inner + if (inner is IdSignature.LocalSignature) { + + fun isTypeParameterSig(fqn: String): Boolean = + fqn == MangleConstant.TYPE_PARAMETER_MARKER_NAME || fqn == MangleConstant.TYPE_PARAMETER_MARKER_NAME_SETTER + + if (isTypeParameterSig(inner.localFqn)) { + val tpIndex = inner.hashSig?.toInt() ?: error("Expected index in $signature") + if (container is CallableDescriptor) { + return container.typeParameters[tpIndex] + } + if (container is ClassifierDescriptorWithTypeParameters) { + return container.declaredTypeParameters[tpIndex] + } + } + } + return container + } + private fun findDescriptorForAccessorSignature(signature: IdSignature.AccessorSignature): DeclarationDescriptor? { val propertyDescriptor = findDescriptorBySignature(signature.propertySignature) as? PropertyDescriptor ?: return null diff --git a/compiler/ir/serialization.jvm/src/org/jetbrains/kotlin/backend/jvm/serialization/deserializeLazyDeclarations.kt b/compiler/ir/serialization.jvm/src/org/jetbrains/kotlin/backend/jvm/serialization/deserializeLazyDeclarations.kt index 234e5493ecb..bc21d47a0a7 100644 --- a/compiler/ir/serialization.jvm/src/org/jetbrains/kotlin/backend/jvm/serialization/deserializeLazyDeclarations.kt +++ b/compiler/ir/serialization.jvm/src/org/jetbrains/kotlin/backend/jvm/serialization/deserializeLazyDeclarations.kt @@ -186,6 +186,7 @@ private fun referencePublicSymbol( BinarySymbolData.SymbolKind.FUNCTION_SYMBOL -> referenceSimpleFunction(descriptor as FunctionDescriptor) BinarySymbolData.SymbolKind.TYPEALIAS_SYMBOL -> referenceTypeAlias(descriptor as TypeAliasDescriptor) BinarySymbolData.SymbolKind.PROPERTY_SYMBOL -> referenceProperty(descriptor as PropertyDescriptor) + BinarySymbolData.SymbolKind.TYPE_PARAMETER_SYMBOL -> referenceTypeParameter(descriptor as TypeParameterDescriptor) else -> error("Unexpected classifier symbol kind: $symbolKind for signature $idSig") } } else {