Better encapsulation of deserializer.
This commit is contained in:
committed by
alexander-gorshenev
parent
5f61fded79
commit
bff20ebeea
+4
-14
@@ -74,11 +74,10 @@ internal val psiToIrPhase = konanUnitPhase(
|
|||||||
this as LoggingContext,
|
this as LoggingContext,
|
||||||
generatorContext.irBuiltIns,
|
generatorContext.irBuiltIns,
|
||||||
generatorContext.symbolTable,
|
generatorContext.symbolTable,
|
||||||
forwardDeclarationsModuleDescriptor
|
forwardDeclarationsModuleDescriptor,
|
||||||
|
getExportedDependencies()
|
||||||
)
|
)
|
||||||
|
|
||||||
val modules = mutableMapOf<String, IrModuleFragment>()
|
|
||||||
|
|
||||||
var dependenciesCount = 0
|
var dependenciesCount = 0
|
||||||
while (true) {
|
while (true) {
|
||||||
// context.config.librariesWithDependencies could change at each iteration.
|
// context.config.librariesWithDependencies could change at each iteration.
|
||||||
@@ -86,26 +85,17 @@ internal val psiToIrPhase = konanUnitPhase(
|
|||||||
config.librariesWithDependencies(moduleDescriptor).contains(it.konanLibrary)
|
config.librariesWithDependencies(moduleDescriptor).contains(it.konanLibrary)
|
||||||
}
|
}
|
||||||
for (dependency in dependencies) {
|
for (dependency in dependencies) {
|
||||||
val konanLibrary = dependency.konanLibrary!!
|
deserializer.deserializeIrModuleHeader(dependency)
|
||||||
if (modules.containsKey(konanLibrary.libraryName)) continue
|
|
||||||
konanLibrary.irHeader?.let { header ->
|
|
||||||
// TODO: consider skip deserializing explicitly exported declarations for libraries.
|
|
||||||
// Now it's not valid because of all dependencies that must be computed.
|
|
||||||
val deserializationStrategy = if (getExportedDependencies().contains(dependency))
|
|
||||||
DeserializationStrategy.ALL else DeserializationStrategy.EXPLICITLY_EXPORTED
|
|
||||||
modules[konanLibrary.libraryName] = deserializer.deserializeIrModuleHeader(dependency, header, deserializationStrategy)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if (dependencies.size == dependenciesCount) break
|
if (dependencies.size == dependenciesCount) break
|
||||||
dependenciesCount = dependencies.size
|
dependenciesCount = dependencies.size
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
val symbols = KonanSymbols(this, generatorContext.symbolTable, generatorContext.symbolTable.lazyWrapper)
|
val symbols = KonanSymbols(this, generatorContext.symbolTable, generatorContext.symbolTable.lazyWrapper)
|
||||||
val module = translator.generateModuleFragment(generatorContext, environment.getSourceFiles(), deserializer)
|
val module = translator.generateModuleFragment(generatorContext, environment.getSourceFiles(), deserializer)
|
||||||
|
|
||||||
irModule = module
|
irModule = module
|
||||||
irModules = modules
|
irModules = deserializer.modules
|
||||||
ir.symbols = symbols
|
ir.symbols = symbols
|
||||||
|
|
||||||
// validateIrModule(this, module)
|
// validateIrModule(this, module)
|
||||||
|
|||||||
+16
-9
@@ -20,12 +20,10 @@ import org.jetbrains.kotlin.backend.common.LoggingContext
|
|||||||
import org.jetbrains.kotlin.backend.common.serialization.DescriptorUniqIdAware
|
import org.jetbrains.kotlin.backend.common.serialization.DescriptorUniqIdAware
|
||||||
import org.jetbrains.kotlin.backend.common.serialization.KotlinIrLinker
|
import org.jetbrains.kotlin.backend.common.serialization.KotlinIrLinker
|
||||||
import org.jetbrains.kotlin.backend.common.serialization.UniqId
|
import org.jetbrains.kotlin.backend.common.serialization.UniqId
|
||||||
import org.jetbrains.kotlin.backend.common.serialization.UniqIdKey
|
|
||||||
import org.jetbrains.kotlin.backend.konan.descriptors.konanLibrary
|
import org.jetbrains.kotlin.backend.konan.descriptors.konanLibrary
|
||||||
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
|
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrFunction
|
import org.jetbrains.kotlin.ir.declarations.IrModuleFragment
|
||||||
import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns
|
import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns
|
||||||
import org.jetbrains.kotlin.ir.symbols.IrSymbol
|
|
||||||
import org.jetbrains.kotlin.ir.util.SymbolTable
|
import org.jetbrains.kotlin.ir.util.SymbolTable
|
||||||
|
|
||||||
class KonanIrLinker(
|
class KonanIrLinker(
|
||||||
@@ -33,13 +31,22 @@ class KonanIrLinker(
|
|||||||
logger: LoggingContext,
|
logger: LoggingContext,
|
||||||
builtIns: IrBuiltIns,
|
builtIns: IrBuiltIns,
|
||||||
symbolTable: SymbolTable,
|
symbolTable: SymbolTable,
|
||||||
val forwardModuleDescriptor: ModuleDescriptor?)
|
forwardModuleDescriptor: ModuleDescriptor?,
|
||||||
: KotlinIrLinker(logger, builtIns, symbolTable, forwardModuleDescriptor, 0L),
|
exportedDependencies: List<ModuleDescriptor>
|
||||||
|
) : KotlinIrLinker(logger, builtIns, symbolTable, exportedDependencies, forwardModuleDescriptor, 0L),
|
||||||
DescriptorUniqIdAware by KonanDescriptorUniqIdAware {
|
DescriptorUniqIdAware by KonanDescriptorUniqIdAware {
|
||||||
|
|
||||||
private val forwardDeclarations = mutableSetOf<IrSymbol>()
|
override val descriptorReferenceDeserializer =
|
||||||
|
KonanDescriptorReferenceDeserializer(currentModule, resolvedForwardDeclarations)
|
||||||
|
|
||||||
override val descriptorReferenceDeserializer = KonanDescriptorReferenceDeserializer(currentModule, resolvedForwardDeclarations)
|
override fun reader(moduleDescriptor: ModuleDescriptor, uniqId: UniqId) =
|
||||||
|
moduleDescriptor.konanLibrary!!.irDeclaration(uniqId.index, uniqId.isLocal)
|
||||||
|
|
||||||
override fun reader(moduleDescriptor: ModuleDescriptor, uniqId: UniqId) = moduleDescriptor.konanLibrary!!.irDeclaration(uniqId.index, uniqId.isLocal)
|
override val ModuleDescriptor.irHeader get() = this.konanLibrary!!.irHeader
|
||||||
}
|
|
||||||
|
val modules: Map<String, IrModuleFragment> get() = mutableMapOf<String, IrModuleFragment>().apply {
|
||||||
|
deserializersForModules.forEach {
|
||||||
|
this.put(it.key.konanLibrary!!.libraryName, it.value.module)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user