[JS IC] Properly handle type parameters of Functional interfaces

- drop redundant `IrSymbolTable` and `IrIcModuleDeserializerWithBuiltIns`
This commit is contained in:
Roman Artemev
2021-07-27 13:42:23 +03:00
committed by teamcityserver
parent 6aed492703
commit 3d3c70141c
7 changed files with 39 additions and 140 deletions
@@ -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)
}
@@ -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)