Better encapsulation of deserializer.

This commit is contained in:
Alexander Gorshenev
2019-03-21 15:06:02 +03:00
committed by alexander-gorshenev
parent 5f61fded79
commit bff20ebeea
2 changed files with 20 additions and 23 deletions
@@ -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)
@@ -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)
}
}
}