[klibs] Refactored BasicIrModuleDeserializer
This commit is contained in:
+27
-27
@@ -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? {
|
||||||
|
|||||||
Reference in New Issue
Block a user