[JVM KLIB] Fix Type Parameter resolve
This commit is contained in:
committed by
teamcityserver
parent
3dcee8fda8
commit
5a7298808e
+23
-1
@@ -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
|
||||
|
||||
+1
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user