[KLIB] Resolve deserialization on for each file separately

Needs for IC
This commit is contained in:
Roman Artemev
2021-09-07 13:49:01 +03:00
committed by TeamCityServer
parent 28ffcf1e81
commit 78cd45f937
9 changed files with 57 additions and 51 deletions
@@ -25,7 +25,7 @@ abstract class BasicIrModuleDeserializer(
val linker: KotlinIrLinker,
moduleDescriptor: ModuleDescriptor,
override val klib: IrLibrary,
override val strategy: DeserializationStrategy,
override val strategyResolver: (String) -> DeserializationStrategy,
libraryAbiVersion: KotlinAbiVersion,
private val containsErrorCode: Boolean = false
) :
@@ -106,15 +106,16 @@ abstract class BasicIrModuleDeserializer(
val fileReader = IrLibraryFileFromKlib(moduleDeserializer.klib, fileIndex)
val file = fileReader.createFile(moduleFragment, fileProto)
val fileStrategy = strategyResolver(file.fileEntry.name)
val fileDeserializationState = FileDeserializationState(
linker,
file,
fileReader,
fileProto,
strategy.needBodies,
fileStrategy.needBodies,
allowErrorNodes,
strategy.inlineBodies,
fileStrategy.inlineBodies,
moduleDeserializer
)
@@ -125,10 +126,10 @@ abstract class BasicIrModuleDeserializer(
moduleReversedFileIndex.putIfAbsent(it, fileDeserializationState) // TODO Why not simple put?
}
if (strategy.theWholeWorld) {
if (fileStrategy.theWholeWorld) {
fileDeserializationState.enqueueAllDeclarations()
}
if (strategy.theWholeWorld || strategy.explicitlyExported) {
if (fileStrategy.theWholeWorld || fileStrategy.explicitlyExported) {
moduleDeserializationState.enqueueFile(fileDeserializationState)
}
@@ -85,7 +85,7 @@ abstract class IrModuleDeserializer(val moduleDescriptor: ModuleDescriptor, val
abstract val moduleDependencies: Collection<IrModuleDeserializer>
open val strategy: DeserializationStrategy = DeserializationStrategy.ONLY_DECLARATION_HEADERS
open val strategyResolver: (String) -> DeserializationStrategy = { DeserializationStrategy.ONLY_DECLARATION_HEADERS }
open val isCurrent = false
@@ -215,8 +215,8 @@ class IrModuleDeserializerWithBuiltIns(
override val klib: IrLibrary
get() = delegate.klib
override val strategy: DeserializationStrategy
get() = delegate.strategy
override val strategyResolver: (String) -> DeserializationStrategy
get() = delegate.strategyResolver
override fun addModuleReachableTopLevel(idSig: IdSignature) {
delegate.addModuleReachableTopLevel(idSig)
@@ -75,7 +75,7 @@ abstract class KotlinIrLinker(
protected abstract fun createModuleDeserializer(
moduleDescriptor: ModuleDescriptor,
klib: KotlinLibrary?,
strategy: DeserializationStrategy,
strategyResolver: (String) -> DeserializationStrategy,
): IrModuleDeserializer
protected abstract fun isBuiltInModule(moduleDescriptor: ModuleDescriptor): Boolean
@@ -281,7 +281,7 @@ abstract class KotlinIrLinker(
fun deserializeIrModuleHeader(
moduleDescriptor: ModuleDescriptor,
kotlinLibrary: KotlinLibrary?,
deserializationStrategy: DeserializationStrategy = DeserializationStrategy.ONLY_REFERENCED,
deserializationStrategy: (String) -> DeserializationStrategy = { DeserializationStrategy.ONLY_REFERENCED },
_moduleName: String? = null
): IrModuleFragment {
assert(kotlinLibrary != null || _moduleName != null) { "Either library or explicit name have to be provided $moduleDescriptor" }
@@ -306,27 +306,29 @@ abstract class KotlinIrLinker(
fun deserializeIrModuleHeader(moduleDescriptor: ModuleDescriptor, kotlinLibrary: KotlinLibrary?, moduleName: String): IrModuleFragment {
// TODO: consider skip deserializing explicitly exported declarations for libraries.
// Now it's not valid because of all dependencies that must be computed.
val deserializationStrategy =
val deserializationStrategy: (String) -> DeserializationStrategy =
if (exportedDependencies.contains(moduleDescriptor)) {
DeserializationStrategy.ALL
{ DeserializationStrategy.ALL }
} else {
DeserializationStrategy.EXPLICITLY_EXPORTED
{ DeserializationStrategy.EXPLICITLY_EXPORTED }
}
return deserializeIrModuleHeader(moduleDescriptor, kotlinLibrary, deserializationStrategy, moduleName)
}
fun deserializeFullModule(moduleDescriptor: ModuleDescriptor, kotlinLibrary: KotlinLibrary): IrModuleFragment =
deserializeIrModuleHeader(moduleDescriptor, kotlinLibrary, DeserializationStrategy.ALL)
deserializeIrModuleHeader(moduleDescriptor, kotlinLibrary, { DeserializationStrategy.ALL })
fun deserializeOnlyHeaderModule(moduleDescriptor: ModuleDescriptor, kotlinLibrary: KotlinLibrary?): IrModuleFragment =
deserializeIrModuleHeader(moduleDescriptor, kotlinLibrary, DeserializationStrategy.ONLY_DECLARATION_HEADERS)
deserializeIrModuleHeader(moduleDescriptor, kotlinLibrary, { DeserializationStrategy.ONLY_DECLARATION_HEADERS })
fun deserializeHeadersWithInlineBodies(moduleDescriptor: ModuleDescriptor, kotlinLibrary: KotlinLibrary): IrModuleFragment =
deserializeIrModuleHeader(moduleDescriptor, kotlinLibrary, DeserializationStrategy.WITH_INLINE_BODIES)
deserializeIrModuleHeader(moduleDescriptor, kotlinLibrary, { DeserializationStrategy.WITH_INLINE_BODIES })
@Suppress("UNUSED_PARAMETER")
fun deserializeDirtyFiles(moduleDescriptor: ModuleDescriptor, kotlinLibrary: KotlinLibrary, dirtyFiles: Collection<String>): IrModuleFragment {
return deserializeFullModule(moduleDescriptor, kotlinLibrary)
return deserializeIrModuleHeader(moduleDescriptor, kotlinLibrary, {
if (it in dirtyFiles) DeserializationStrategy.ALL
else DeserializationStrategy.WITH_INLINE_BODIES
})
}
}