[JS IR] IC: avoid conflicts in local declaration signatures

This commit is contained in:
Anton Bannykh
2021-12-08 11:15:40 +03:00
parent 670572bbc6
commit 434c23a343
5 changed files with 20 additions and 8 deletions
@@ -73,6 +73,7 @@ class FileDeserializationState(
fileProto.actualList, fileProto.actualList,
::addIdSignature, ::addIdSignature,
linker::handleExpectActualMapping, linker::handleExpectActualMapping,
symbolProcessor = linker.symbolProcessor,
) { idSig, symbolKind -> ) { idSig, symbolKind ->
val topLevelSig = idSig.topLevelSignature() val topLevelSig = idSig.topLevelSignature()
@@ -27,6 +27,7 @@ class IrSymbolDeserializer(
val handleExpectActualMapping: (IdSignature, IrSymbol) -> IrSymbol, val handleExpectActualMapping: (IdSignature, IrSymbol) -> IrSymbol,
private val enqueueAllDeclarations: Boolean = false, private val enqueueAllDeclarations: Boolean = false,
val deserializedSymbols: MutableMap<IdSignature, IrSymbol> = mutableMapOf(), // Per-file signature cache. TODO: do we really need it? val deserializedSymbols: MutableMap<IdSignature, IrSymbol> = mutableMapOf(), // Per-file signature cache. TODO: do we really need it?
val symbolProcessor: IrSymbolDeserializer.(IrSymbol, IdSignature) -> IrSymbol = { s, _ -> s },
val deserializePublicSymbol: (IdSignature, BinarySymbolData.SymbolKind) -> IrSymbol, val deserializePublicSymbol: (IdSignature, BinarySymbolData.SymbolKind) -> IrSymbol,
) { ) {
@@ -39,7 +40,7 @@ class IrSymbolDeserializer(
} }
private fun referenceDeserializedSymbol(symbolKind: BinarySymbolData.SymbolKind, idSig: IdSignature): IrSymbol { private fun referenceDeserializedSymbol(symbolKind: BinarySymbolData.SymbolKind, idSig: IdSignature): IrSymbol {
return referenceDeserializedSymbol(symbolTable, fileSymbol, symbolKind, idSig) return symbolProcessor(referenceDeserializedSymbol(symbolTable, fileSymbol, symbolKind, idSig), idSig)
} }
fun referenceLocalIrSymbol(symbol: IrSymbol, signature: IdSignature) { fun referenceLocalIrSymbol(symbol: IrSymbol, signature: IdSignature) {
@@ -36,7 +36,8 @@ abstract class KotlinIrLinker(
val builtIns: IrBuiltIns, val builtIns: IrBuiltIns,
val symbolTable: SymbolTable, val symbolTable: SymbolTable,
private val exportedDependencies: List<ModuleDescriptor>, private val exportedDependencies: List<ModuleDescriptor>,
private val allowUnboundSymbols: Boolean = false private val allowUnboundSymbols: Boolean = false,
val symbolProcessor: IrSymbolDeserializer.(IrSymbol, IdSignature) -> IrSymbol = { s, _ -> s },
) : IrDeserializer, FileLocalAwareLinker { ) : IrDeserializer, FileLocalAwareLinker {
// Kotlin-MPP related data. Consider some refactoring // Kotlin-MPP related data. Consider some refactoring
@@ -125,7 +125,7 @@ class IcFileDeserializer(
{ _, s -> s }, { _, s -> s },
enqueueAllDeclarations = true, enqueueAllDeclarations = true,
deserializedSymbols = deserializedSymbols, deserializedSymbols = deserializedSymbols,
::deserializePublicSymbol deserializePublicSymbol = ::deserializePublicSymbol
) )
private val declarationDeserializer = IrDeclarationDeserializer( private val declarationDeserializer = IrDeclarationDeserializer(
@@ -16,10 +16,7 @@ import org.jetbrains.kotlin.ir.builders.TranslationPluginContext
import org.jetbrains.kotlin.ir.declarations.IrModuleFragment import org.jetbrains.kotlin.ir.declarations.IrModuleFragment
import org.jetbrains.kotlin.ir.declarations.persistent.PersistentIrFactory import org.jetbrains.kotlin.ir.declarations.persistent.PersistentIrFactory
import org.jetbrains.kotlin.ir.types.IrTypeSystemContextImpl import org.jetbrains.kotlin.ir.types.IrTypeSystemContextImpl
import org.jetbrains.kotlin.ir.util.IrMessageLogger import org.jetbrains.kotlin.ir.util.*
import org.jetbrains.kotlin.ir.util.ReferenceSymbolTable
import org.jetbrains.kotlin.ir.util.SymbolTable
import org.jetbrains.kotlin.ir.util.TypeTranslator
import org.jetbrains.kotlin.library.IrLibrary import org.jetbrains.kotlin.library.IrLibrary
import org.jetbrains.kotlin.library.KotlinAbiVersion import org.jetbrains.kotlin.library.KotlinAbiVersion
import org.jetbrains.kotlin.library.KotlinLibrary import org.jetbrains.kotlin.library.KotlinLibrary
@@ -32,7 +29,19 @@ class JsIrLinker(
private val loweredIcData: Map<ModuleDescriptor, SerializedIcData> = emptyMap(), private val loweredIcData: Map<ModuleDescriptor, SerializedIcData> = emptyMap(),
friendModules: Map<String, Collection<String>> = emptyMap(), friendModules: Map<String, Collection<String>> = emptyMap(),
allowUnboundSymbols: Boolean = false allowUnboundSymbols: Boolean = false
) : KotlinIrLinker(currentModule, messageLogger, builtIns, symbolTable, emptyList(), allowUnboundSymbols) { ) : KotlinIrLinker(
currentModule,
messageLogger,
builtIns,
symbolTable,
emptyList(),
allowUnboundSymbols,
symbolProcessor = { symbol, idSig ->
if (idSig.isLocal) {
symbol.privateSignature = IdSignature.CompositeSignature(IdSignature.FileSignature(fileSymbol), idSig)
}
symbol
}) {
override val fakeOverrideBuilder = FakeOverrideBuilder(this, symbolTable, JsManglerIr, IrTypeSystemContextImpl(builtIns), friendModules) override val fakeOverrideBuilder = FakeOverrideBuilder(this, symbolTable, JsManglerIr, IrTypeSystemContextImpl(builtIns), friendModules)