JVM_IR: read Klib
This commit is contained in:
+2
-2
@@ -27,11 +27,11 @@ import org.jetbrains.kotlin.serialization.deserialization.descriptors.Deserializ
|
||||
abstract class DescriptorReferenceDeserializer(
|
||||
val currentModule: ModuleDescriptor,
|
||||
val mangler: KotlinMangler,
|
||||
val builtIns: IrBuiltIns,
|
||||
val builtIns: IrBuiltIns?,
|
||||
val resolvedForwardDeclarations: MutableMap<UniqId, UniqId>
|
||||
) : DescriptorUniqIdAware {
|
||||
|
||||
protected open fun resolveSpecialDescriptor(fqn: FqName) = builtIns.builtIns.getBuiltInClassByFqName(fqn)
|
||||
protected open fun resolveSpecialDescriptor(fqn: FqName) = builtIns!!.builtIns.getBuiltInClassByFqName(fqn)
|
||||
open fun checkIfSpecialDescriptorId(id: Long) = with(mangler) { id.isSpecial }
|
||||
|
||||
protected open fun getDescriptorIdOrNull(descriptor: DeclarationDescriptor) =
|
||||
|
||||
+20
-4
@@ -46,7 +46,8 @@ abstract class KotlinIrLinker(
|
||||
val symbolTable: SymbolTable,
|
||||
private val exportedDependencies: List<ModuleDescriptor>,
|
||||
private val forwardModuleDescriptor: ModuleDescriptor?,
|
||||
mangler: KotlinMangler
|
||||
mangler: KotlinMangler,
|
||||
private val tolerateNonKlibDescriptors: Boolean = false
|
||||
) : DescriptorUniqIdAware, IrDeserializer {
|
||||
|
||||
private val expectUniqIdToActualUniqId = mutableMapOf<UniqId, UniqId>()
|
||||
@@ -133,7 +134,9 @@ abstract class KotlinIrLinker(
|
||||
private val moduleDeserializationState = DeserializationState.ModuleDeserializationState(this)
|
||||
val moduleReversedFileIndex = mutableMapOf<UniqId, IrDeserializerForFile>()
|
||||
private val moduleDependencies by lazy {
|
||||
moduleDescriptor.allDependencyModules.filter { it != moduleDescriptor }.map { deserializersForModules[it]!! }
|
||||
moduleDescriptor.allDependencyModules.filter { it != moduleDescriptor }.mapNotNull {
|
||||
deserializersForModules[it] ?: if (tolerateNonKlibDescriptors) null else error("Module without deserializer $it")
|
||||
}
|
||||
}
|
||||
|
||||
// This is a heavy initializer
|
||||
@@ -562,12 +565,21 @@ abstract class KotlinIrLinker(
|
||||
}
|
||||
|
||||
val descriptorUniqId = topLevelDescriptor.getUniqId()
|
||||
?: error("Could not get descriptor uniq id for $topLevelDescriptor")
|
||||
?: if (tolerateNonKlibDescriptors) {
|
||||
return null
|
||||
} else {
|
||||
error("Could not get descriptor uniq id for $topLevelDescriptor")
|
||||
}
|
||||
val topLevelKey = UniqId(descriptorUniqId)
|
||||
|
||||
val moduleOfOrigin = topLevelDescriptor.module
|
||||
|
||||
val moduleDeserializer = deserializersForModules[moduleOfOrigin] ?: error("No module deserializer found for $moduleOfOrigin")
|
||||
val moduleDeserializer = deserializersForModules[moduleOfOrigin] ?:
|
||||
if (tolerateNonKlibDescriptors) {
|
||||
return null
|
||||
} else {
|
||||
error("No module deserializer found for $moduleOfOrigin")
|
||||
}
|
||||
|
||||
moduleDeserializer.addModuleReachableTopLevel(topLevelKey)
|
||||
|
||||
@@ -697,6 +709,10 @@ abstract class KotlinIrLinker(
|
||||
|
||||
fun deserializeOnlyHeaderModule(moduleDescriptor: ModuleDescriptor): IrModuleFragment =
|
||||
deserializeIrModuleHeader(moduleDescriptor, DeserializationStrategy.ONLY_DECLARATION_HEADERS)
|
||||
|
||||
fun getAllIrFiles(): List<IrFile> {
|
||||
return deserializersForModules.values.flatMap { it.module.files }
|
||||
}
|
||||
}
|
||||
|
||||
enum class DeserializationStrategy(val needBodies: Boolean, val explicitlyExported: Boolean, val theWholeWorld: Boolean) {
|
||||
|
||||
Reference in New Issue
Block a user