[IR] Distinguish IrModuleDeserializers with and w/o underlying KLIBs

Fixes #KT-50591
This commit is contained in:
Dmitriy Dolovov
2022-01-10 12:40:15 +03:00
parent 7ff468d9e3
commit cb5a052227
7 changed files with 22 additions and 6 deletions
@@ -151,6 +151,8 @@ abstract class BasicIrModuleDeserializer(
return fileDeserializer.symbolDeserializer.signatureDeserializer
}
override val origin get() = IrModuleOrigin.DESERIALIZED
}
private class ModuleDeserializationState(val linker: KotlinIrLinker, val moduleDeserializer: BasicIrModuleDeserializer) {
@@ -162,8 +162,8 @@ class CurrentModuleWithICDeserializer(
get() = delegate.moduleFragment
override val moduleDependencies: Collection<IrModuleDeserializer>
get() = delegate.moduleDependencies
override val isCurrent: Boolean
get() = delegate.isCurrent
override val origin: IrModuleOrigin
get() = delegate.origin
override fun fileDeserializers(): Collection<IrFileDeserializer> {
return delegate.fileDeserializers()
@@ -51,6 +51,10 @@ class CompatibilityMode(val abiVersion: KotlinAbiVersion) {
}
}
enum class IrModuleOrigin {
CURRENT, DESERIALIZED, SYNTHETIC
}
abstract class IrModuleDeserializer(private val _moduleDescriptor: ModuleDescriptor?, val libraryAbiVersion: KotlinAbiVersion) {
abstract operator fun contains(idSig: IdSignature): Boolean
abstract fun deserializeIrSymbol(idSig: IdSignature, symbolKind: BinarySymbolData.SymbolKind): IrSymbol
@@ -90,7 +94,7 @@ abstract class IrModuleDeserializer(private val _moduleDescriptor: ModuleDescrip
open val strategyResolver: (String) -> DeserializationStrategy = { DeserializationStrategy.ONLY_DECLARATION_HEADERS }
open val isCurrent = false
abstract val origin: IrModuleOrigin
open fun fileDeserializers(): Collection<IrFileDeserializer> = error("Unsupported")
@@ -227,7 +231,7 @@ class IrModuleDeserializerWithBuiltIns(
override val moduleFragment: IrModuleFragment get() = delegate.moduleFragment
override val moduleDependencies: Collection<IrModuleDeserializer> get() = delegate.moduleDependencies
override val isCurrent get() = delegate.isCurrent
override val origin get() = delegate.origin
override fun fileDeserializers(): Collection<IrFileDeserializer> {
return delegate.fileDeserializers()
@@ -254,5 +258,5 @@ open class CurrentModuleDeserializer(
override fun declareIrSymbol(symbol: IrSymbol) {}
override val isCurrent = true
override val origin get() = IrModuleOrigin.CURRENT
}
@@ -75,6 +75,8 @@ abstract class KotlinIrLinker(
override val moduleFragment: IrModuleFragment
get() = TODO("Not yet implemented")
override val moduleDependencies: Collection<IrModuleDeserializer> get() = emptyList()
override val origin: IrModuleOrigin
get() = TODO("Not yet implemented")
}
} else {
throw SignatureIdNotFoundInModuleWithDependencies(
@@ -6,6 +6,7 @@
package org.jetbrains.kotlin.backend.common.serialization.linkerissues
import org.jetbrains.kotlin.backend.common.serialization.IrModuleDeserializer
import org.jetbrains.kotlin.backend.common.serialization.IrModuleOrigin
import org.jetbrains.kotlin.konan.file.File
import org.jetbrains.kotlin.library.KotlinLibrary
import org.jetbrains.kotlin.library.uniqueName
@@ -199,7 +200,7 @@ open class UserVisibleIrModulesSupport(externalDependenciesLoader: ExternalDepen
}
protected val IrModuleDeserializer.kotlinLibrary: KotlinLibrary?
get() = klib as? KotlinLibrary
get() = if (origin == IrModuleOrigin.DESERIALIZED) klib as? KotlinLibrary else null
val moduleIdComparator: Comparator<ResolvedDependencyId> = Comparator { a, b ->
when {
@@ -163,5 +163,6 @@ class JvmIrLinker(
override val moduleFragment: IrModuleFragment = IrModuleFragmentImpl(moduleDescriptor, builtIns, emptyList())
override val moduleDependencies: Collection<IrModuleDeserializer> = dependencies
override val origin get() = IrModuleOrigin.SYNTHETIC
}
}
@@ -610,6 +610,8 @@ internal class KonanIrLinker(
override val moduleFragment: IrModuleFragment = KonanIrModuleFragmentImpl(moduleDescriptor, builtIns)
override val moduleDependencies: Collection<IrModuleDeserializer> = listOfNotNull(forwardDeclarationDeserializer)
override val origin get() = IrModuleOrigin.DESERIALIZED
}
inner class KonanCachedLibraryModuleDeserializer(
@@ -842,6 +844,8 @@ internal class KonanIrLinker(
}
}
}
override val origin get() = IrModuleOrigin.DESERIALIZED
}
private inner class KonanForwardDeclarationModuleDeserializer(moduleDescriptor: ModuleDescriptor) : IrModuleDeserializer(moduleDescriptor, KotlinAbiVersion.CURRENT) {
@@ -892,6 +896,8 @@ internal class KonanIrLinker(
override val moduleFragment: IrModuleFragment = KonanIrModuleFragmentImpl(moduleDescriptor, builtIns)
override val moduleDependencies: Collection<IrModuleDeserializer> = emptyList()
override val origin get() = IrModuleOrigin.SYNTHETIC
}
private val String.isForwardDeclarationModuleName: Boolean get() = this == "<forward declarations>"