From 434c23a343aef1a5c63f42af11bb335b809e81bc Mon Sep 17 00:00:00 2001 From: Anton Bannykh Date: Wed, 8 Dec 2021 11:15:40 +0300 Subject: [PATCH] [JS IR] IC: avoid conflicts in local declaration signatures --- .../serialization/IrFileDeserializer.kt | 1 + .../serialization/IrSymbolDeserializer.kt | 3 ++- .../common/serialization/KotlinIrLinker.kt | 3 ++- .../ir/backend/js/ic/IcFileDeserializer.kt | 2 +- .../js/lower/serialization/ir/JsIrLinker.kt | 19 ++++++++++++++----- 5 files changed, 20 insertions(+), 8 deletions(-) diff --git a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/IrFileDeserializer.kt b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/IrFileDeserializer.kt index 8370b7f4242..9500527ad53 100644 --- a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/IrFileDeserializer.kt +++ b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/IrFileDeserializer.kt @@ -73,6 +73,7 @@ class FileDeserializationState( fileProto.actualList, ::addIdSignature, linker::handleExpectActualMapping, + symbolProcessor = linker.symbolProcessor, ) { idSig, symbolKind -> val topLevelSig = idSig.topLevelSignature() diff --git a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/IrSymbolDeserializer.kt b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/IrSymbolDeserializer.kt index 70d522d73c0..826b49c630a 100644 --- a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/IrSymbolDeserializer.kt +++ b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/IrSymbolDeserializer.kt @@ -27,6 +27,7 @@ class IrSymbolDeserializer( val handleExpectActualMapping: (IdSignature, IrSymbol) -> IrSymbol, private val enqueueAllDeclarations: Boolean = false, val deserializedSymbols: MutableMap = 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, ) { @@ -39,7 +40,7 @@ class IrSymbolDeserializer( } 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) { diff --git a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/KotlinIrLinker.kt b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/KotlinIrLinker.kt index 83e0648bca2..bf8f08fa4bb 100644 --- a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/KotlinIrLinker.kt +++ b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/KotlinIrLinker.kt @@ -36,7 +36,8 @@ abstract class KotlinIrLinker( val builtIns: IrBuiltIns, val symbolTable: SymbolTable, private val exportedDependencies: List, - private val allowUnboundSymbols: Boolean = false + private val allowUnboundSymbols: Boolean = false, + val symbolProcessor: IrSymbolDeserializer.(IrSymbol, IdSignature) -> IrSymbol = { s, _ -> s }, ) : IrDeserializer, FileLocalAwareLinker { // Kotlin-MPP related data. Consider some refactoring diff --git a/compiler/ir/serialization.js/src/org/jetbrains/kotlin/ir/backend/js/ic/IcFileDeserializer.kt b/compiler/ir/serialization.js/src/org/jetbrains/kotlin/ir/backend/js/ic/IcFileDeserializer.kt index 4da7f83382b..08f5ad729fc 100644 --- a/compiler/ir/serialization.js/src/org/jetbrains/kotlin/ir/backend/js/ic/IcFileDeserializer.kt +++ b/compiler/ir/serialization.js/src/org/jetbrains/kotlin/ir/backend/js/ic/IcFileDeserializer.kt @@ -125,7 +125,7 @@ class IcFileDeserializer( { _, s -> s }, enqueueAllDeclarations = true, deserializedSymbols = deserializedSymbols, - ::deserializePublicSymbol + deserializePublicSymbol = ::deserializePublicSymbol ) private val declarationDeserializer = IrDeclarationDeserializer( diff --git a/compiler/ir/serialization.js/src/org/jetbrains/kotlin/ir/backend/js/lower/serialization/ir/JsIrLinker.kt b/compiler/ir/serialization.js/src/org/jetbrains/kotlin/ir/backend/js/lower/serialization/ir/JsIrLinker.kt index 8af88be9abe..668d01a6e7a 100644 --- a/compiler/ir/serialization.js/src/org/jetbrains/kotlin/ir/backend/js/lower/serialization/ir/JsIrLinker.kt +++ b/compiler/ir/serialization.js/src/org/jetbrains/kotlin/ir/backend/js/lower/serialization/ir/JsIrLinker.kt @@ -16,10 +16,7 @@ import org.jetbrains.kotlin.ir.builders.TranslationPluginContext import org.jetbrains.kotlin.ir.declarations.IrModuleFragment import org.jetbrains.kotlin.ir.declarations.persistent.PersistentIrFactory import org.jetbrains.kotlin.ir.types.IrTypeSystemContextImpl -import org.jetbrains.kotlin.ir.util.IrMessageLogger -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.ir.util.* import org.jetbrains.kotlin.library.IrLibrary import org.jetbrains.kotlin.library.KotlinAbiVersion import org.jetbrains.kotlin.library.KotlinLibrary @@ -32,7 +29,19 @@ class JsIrLinker( private val loweredIcData: Map = emptyMap(), friendModules: Map> = emptyMap(), 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)