[JVM KLIB] Fix Type Parameter resolve

This commit is contained in:
Roman Artemev
2021-08-05 20:28:11 +03:00
committed by teamcityserver
parent 3dcee8fda8
commit 5a7298808e
2 changed files with 24 additions and 1 deletions
@@ -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
@@ -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 {