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,
|
||||
generatorContext.irBuiltIns,
|
||||
generatorContext.symbolTable,
|
||||
forwardDeclarationsModuleDescriptor
|
||||
forwardDeclarationsModuleDescriptor,
|
||||
getExportedDependencies()
|
||||
)
|
||||
|
||||
val modules = mutableMapOf<String, IrModuleFragment>()
|
||||
|
||||
var dependenciesCount = 0
|
||||
while (true) {
|
||||
// context.config.librariesWithDependencies could change at each iteration.
|
||||
@@ -86,26 +85,17 @@ internal val psiToIrPhase = konanUnitPhase(
|
||||
config.librariesWithDependencies(moduleDescriptor).contains(it.konanLibrary)
|
||||
}
|
||||
for (dependency in dependencies) {
|
||||
val konanLibrary = dependency.konanLibrary!!
|
||||
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)
|
||||
}
|
||||
deserializer.deserializeIrModuleHeader(dependency)
|
||||
}
|
||||
if (dependencies.size == dependenciesCount) break
|
||||
dependenciesCount = dependencies.size
|
||||
}
|
||||
|
||||
|
||||
val symbols = KonanSymbols(this, generatorContext.symbolTable, generatorContext.symbolTable.lazyWrapper)
|
||||
val module = translator.generateModuleFragment(generatorContext, environment.getSourceFiles(), deserializer)
|
||||
|
||||
irModule = module
|
||||
irModules = modules
|
||||
irModules = deserializer.modules
|
||||
ir.symbols = symbols
|
||||
|
||||
// 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.KotlinIrLinker
|
||||
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.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.symbols.IrSymbol
|
||||
import org.jetbrains.kotlin.ir.util.SymbolTable
|
||||
|
||||
class KonanIrLinker(
|
||||
@@ -33,13 +31,22 @@ class KonanIrLinker(
|
||||
logger: LoggingContext,
|
||||
builtIns: IrBuiltIns,
|
||||
symbolTable: SymbolTable,
|
||||
val forwardModuleDescriptor: ModuleDescriptor?)
|
||||
: KotlinIrLinker(logger, builtIns, symbolTable, forwardModuleDescriptor, 0L),
|
||||
forwardModuleDescriptor: ModuleDescriptor?,
|
||||
exportedDependencies: List<ModuleDescriptor>
|
||||
) : KotlinIrLinker(logger, builtIns, symbolTable, exportedDependencies, forwardModuleDescriptor, 0L),
|
||||
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