[JS IC] Properly handle type parameters of Functional interfaces
- drop redundant `IrSymbolTable` and `IrIcModuleDeserializerWithBuiltIns`
This commit is contained in:
committed by
teamcityserver
parent
6aed492703
commit
3d3c70141c
+16
-7
@@ -95,7 +95,7 @@ abstract class IrModuleDeserializer(val moduleDescriptor: ModuleDescriptor, val
|
||||
}
|
||||
|
||||
// Used to resolve built in symbols like `kotlin.ir.internal.*` or `kotlin.FunctionN`
|
||||
open class IrModuleDeserializerWithBuiltIns(
|
||||
class IrModuleDeserializerWithBuiltIns(
|
||||
private val builtIns: IrBuiltIns,
|
||||
private val delegate: IrModuleDeserializer
|
||||
) : IrModuleDeserializer(delegate.moduleDescriptor, delegate.libraryAbiVersion) {
|
||||
@@ -108,11 +108,9 @@ open class IrModuleDeserializerWithBuiltIns(
|
||||
private val irBuiltInsMap = builtIns.knownBuiltins.map {
|
||||
val symbol = (it as IrSymbolOwner).symbol
|
||||
symbol.signature to symbol
|
||||
}.toMap() + additionalBuiltIns(builtIns)
|
||||
}.toMap()
|
||||
|
||||
protected open fun additionalBuiltIns(builtIns: IrBuiltIns): Map<IdSignature, IrSymbol> = emptyMap()
|
||||
|
||||
protected open fun checkIsFunctionInterface(idSig: IdSignature): Boolean {
|
||||
private fun checkIsFunctionInterface(idSig: IdSignature): Boolean {
|
||||
val publicSig = idSig.asPublic()
|
||||
return publicSig != null &&
|
||||
publicSig.packageFqName in functionalPackages &&
|
||||
@@ -150,7 +148,16 @@ open class IrModuleDeserializerWithBuiltIns(
|
||||
}
|
||||
}
|
||||
|
||||
protected open fun resolveFunctionalInterface(idSig: IdSignature, symbolKind: BinarySymbolData.SymbolKind): IrSymbol {
|
||||
private fun resolveFunctionalInterface(idSig: IdSignature, symbolKind: BinarySymbolData.SymbolKind): IrSymbol {
|
||||
if (symbolKind == BinarySymbolData.SymbolKind.TYPE_PARAMETER_SYMBOL) {
|
||||
val composite = idSig as IdSignature.CompositeSignature
|
||||
val classSignature = idSig.container
|
||||
val classSymbol = resolveFunctionalInterface(classSignature, BinarySymbolData.SymbolKind.CLASS_SYMBOL) as IrClassSymbol
|
||||
val typeParameterSig = composite.inner as IdSignature.LocalSignature
|
||||
val typeParameterIndex = typeParameterSig.hashSig ?: error("Expected index for $idSig")
|
||||
val typeParameter = classSymbol.owner.typeParameters[typeParameterIndex.toInt()]
|
||||
return typeParameter.symbol
|
||||
}
|
||||
val publicSig = idSig.asPublic() ?: error("$idSig has to be public")
|
||||
|
||||
val fqnParts = publicSig.nameSegments
|
||||
@@ -184,7 +191,9 @@ open class IrModuleDeserializerWithBuiltIns(
|
||||
override fun deserializeIrSymbol(idSig: IdSignature, symbolKind: BinarySymbolData.SymbolKind): IrSymbol {
|
||||
irBuiltInsMap[idSig]?.let { return it }
|
||||
|
||||
if (checkIsFunctionInterface(idSig)) return resolveFunctionalInterface(idSig, symbolKind)
|
||||
val topLevel = idSig.topLevelSignature()
|
||||
|
||||
if (checkIsFunctionInterface(topLevel)) return resolveFunctionalInterface(idSig, symbolKind)
|
||||
|
||||
return delegate.deserializeIrSymbol(idSig, symbolKind)
|
||||
}
|
||||
|
||||
+2
-2
@@ -56,7 +56,7 @@ class IrSymbolDeserializer(
|
||||
BinarySymbolData.SymbolKind.ANONYMOUS_INIT_SYMBOL -> if (useGlobalSignatures) IrAnonymousInitializerPublicSymbolImpl(idSig) else IrAnonymousInitializerSymbolImpl()
|
||||
BinarySymbolData.SymbolKind.CLASS_SYMBOL -> referenceClassFromLinker(idSig)
|
||||
BinarySymbolData.SymbolKind.CONSTRUCTOR_SYMBOL -> referenceConstructorFromLinker(idSig)
|
||||
BinarySymbolData.SymbolKind.TYPE_PARAMETER_SYMBOL -> referenceTypeParameterFromLinker(idSig)
|
||||
BinarySymbolData.SymbolKind.TYPE_PARAMETER_SYMBOL -> referenceGlobalTypeParameterFromLinker(idSig)
|
||||
BinarySymbolData.SymbolKind.ENUM_ENTRY_SYMBOL -> referenceEnumEntryFromLinker(idSig)
|
||||
BinarySymbolData.SymbolKind.STANDALONE_FIELD_SYMBOL -> referenceFieldFromLinker(idSig)
|
||||
BinarySymbolData.SymbolKind.FIELD_SYMBOL -> referenceFieldFromLinker(idSig)
|
||||
@@ -86,7 +86,7 @@ class IrSymbolDeserializer(
|
||||
deserializeIrSymbolData(idSignature, BinarySymbolData.SymbolKind.PROPERTY_SYMBOL) as IrPropertySymbol
|
||||
|
||||
private fun deserializeIrSymbolData(idSignature: IdSignature, symbolKind: BinarySymbolData.SymbolKind): IrSymbol {
|
||||
if (idSignature.isLocal) {
|
||||
if (!idSignature.isPubliclyVisible) {
|
||||
return deserializedSymbols.getOrPut(idSignature) {
|
||||
if (enqueueAllDeclarations) {
|
||||
enqueueLocalTopLevelDeclaration(idSignature)
|
||||
|
||||
Reference in New Issue
Block a user