[klibs] Refactored BasicIrModuleDeserializer

This commit is contained in:
Igor Chevdar
2022-04-25 14:20:21 +05:00
committed by Space
parent 31eedebec6
commit f62e4e7b97
@@ -32,9 +32,9 @@ abstract class BasicIrModuleDeserializer(
private val fileToDeserializerMap = mutableMapOf<IrFile, IrFileDeserializer>() private val fileToDeserializerMap = mutableMapOf<IrFile, IrFileDeserializer>()
private val moduleDeserializationState = ModuleDeserializationState(linker, this) private val moduleDeserializationState = ModuleDeserializationState()
val moduleReversedFileIndex = mutableMapOf<IdSignature, FileDeserializationState>() protected val moduleReversedFileIndex = mutableMapOf<IdSignature, FileDeserializationState>()
override val moduleDependencies by lazy { override val moduleDependencies by lazy {
moduleDescriptor.allDependencyModules moduleDescriptor.allDependencyModules
@@ -166,35 +166,35 @@ abstract class BasicIrModuleDeserializer(
} }
override val kind get() = IrModuleDeserializerKind.DESERIALIZED override val kind get() = IrModuleDeserializerKind.DESERIALIZED
}
private class ModuleDeserializationState(val linker: KotlinIrLinker, val moduleDeserializer: BasicIrModuleDeserializer) { private inner class ModuleDeserializationState {
private val filesWithPendingTopLevels = mutableSetOf<FileDeserializationState>() private val filesWithPendingTopLevels = mutableSetOf<FileDeserializationState>()
fun enqueueFile(fileDeserializationState: FileDeserializationState) { fun enqueueFile(fileDeserializationState: FileDeserializationState) {
filesWithPendingTopLevels.add(fileDeserializationState) filesWithPendingTopLevels.add(fileDeserializationState)
linker.modulesWithReachableTopLevels.add(moduleDeserializer) linker.modulesWithReachableTopLevels.add(this@BasicIrModuleDeserializer)
}
fun addIdSignature(key: IdSignature) {
val fileLocalDeserializationState = moduleDeserializer.moduleReversedFileIndex[key] ?: error("No file found for key $key")
fileLocalDeserializationState.addIdSignature(key)
enqueueFile(fileLocalDeserializationState)
}
fun deserializeReachableDeclarations() {
while (filesWithPendingTopLevels.isNotEmpty()) {
val pendingFileDeserializationState = filesWithPendingTopLevels.first()
pendingFileDeserializationState.fileDeserializer.deserializeFileImplicitDataIfFirstUse()
pendingFileDeserializationState.deserializeAllFileReachableTopLevel()
filesWithPendingTopLevels.remove(pendingFileDeserializationState)
} }
}
override fun toString(): String = moduleDeserializer.klib.toString() fun addIdSignature(key: IdSignature) {
val fileLocalDeserializationState = moduleReversedFileIndex[key] ?: error("No file found for key $key")
fileLocalDeserializationState.addIdSignature(key)
enqueueFile(fileLocalDeserializationState)
}
fun deserializeReachableDeclarations() {
while (filesWithPendingTopLevels.isNotEmpty()) {
val pendingFileDeserializationState = filesWithPendingTopLevels.first()
pendingFileDeserializationState.fileDeserializer.deserializeFileImplicitDataIfFirstUse()
pendingFileDeserializationState.deserializeAllFileReachableTopLevel()
filesWithPendingTopLevels.remove(pendingFileDeserializationState)
}
}
override fun toString(): String = klib.toString()
}
} }
fun IrModuleDeserializer.findModuleDeserializerForTopLevelId(idSignature: IdSignature): IrModuleDeserializer? { fun IrModuleDeserializer.findModuleDeserializerForTopLevelId(idSignature: IdSignature): IrModuleDeserializer? {