K1: support pre-release checks for klibs

This commit makes the compiler read the pre-release flag from loaded
klibs. Now the K1 frontend checks this flag in
MissingDependencyClassChecker checker, reporting errors if the current
compiler configuration doesn't allow using pre-release dependencies.

^KT-54905 Fixed
This commit is contained in:
Svyatoslav Scherbina
2022-12-28 16:29:36 +01:00
committed by Space Team
parent 7788304645
commit 5320fbeb6e
5 changed files with 53 additions and 28 deletions
@@ -11,11 +11,13 @@ import org.jetbrains.kotlin.metadata.deserialization.NameResolver
import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.serialization.deserialization.ClassData import org.jetbrains.kotlin.serialization.deserialization.ClassData
import org.jetbrains.kotlin.serialization.deserialization.ClassDataFinder import org.jetbrains.kotlin.serialization.deserialization.ClassDataFinder
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedContainerSource
import org.jetbrains.kotlin.serialization.deserialization.getClassId import org.jetbrains.kotlin.serialization.deserialization.getClassId
class KlibMetadataClassDataFinder( class KlibMetadataClassDataFinder(
private val fragment: PackageFragment, private val fragment: PackageFragment,
private val nameResolver: NameResolver private val nameResolver: NameResolver,
private val containerSource: DeserializedContainerSource? = null
) : ClassDataFinder { ) : ClassDataFinder {
val nameList = fragment.getExtension(KlibMetadataProtoBuf.className).orEmpty() val nameList = fragment.getExtension(KlibMetadataProtoBuf.className).orEmpty()
@@ -29,6 +31,6 @@ class KlibMetadataClassDataFinder(
val foundClass = fragment.getClass_(index) ?: error("Could not find data for serialized class $classId") val foundClass = fragment.getClass_(index) ?: error("Could not find data for serialized class $classId")
/* TODO: binary version supposed to be read from protobuf. */ /* TODO: binary version supposed to be read from protobuf. */
return ClassData(nameResolver, foundClass, KlibMetadataVersion.INSTANCE, SourceElement.NO_SOURCE) return ClassData(nameResolver, foundClass, KlibMetadataVersion.INSTANCE, containerSource ?: SourceElement.NO_SOURCE)
} }
} }
@@ -3,6 +3,7 @@ package org.jetbrains.kotlin.library.metadata
import org.jetbrains.kotlin.descriptors.ModuleDescriptor import org.jetbrains.kotlin.descriptors.ModuleDescriptor
import org.jetbrains.kotlin.descriptors.PackageFragmentDescriptor import org.jetbrains.kotlin.descriptors.PackageFragmentDescriptor
import org.jetbrains.kotlin.library.KotlinLibrary import org.jetbrains.kotlin.library.KotlinLibrary
import org.jetbrains.kotlin.serialization.deserialization.DeserializationConfiguration
import org.jetbrains.kotlin.storage.StorageManager import org.jetbrains.kotlin.storage.StorageManager
interface KlibMetadataDeserializedPackageFragmentsFactory { interface KlibMetadataDeserializedPackageFragmentsFactory {
@@ -11,7 +12,8 @@ interface KlibMetadataDeserializedPackageFragmentsFactory {
packageFragmentNames: List<String>, packageFragmentNames: List<String>,
moduleDescriptor: ModuleDescriptor, moduleDescriptor: ModuleDescriptor,
packageAccessedHandler: PackageAccessHandler?, packageAccessedHandler: PackageAccessHandler?,
storageManager: StorageManager storageManager: StorageManager,
configuration: DeserializationConfiguration
): List<KlibMetadataPackageFragment> ): List<KlibMetadataPackageFragment>
fun createCachedPackageFragments( fun createCachedPackageFragments(
@@ -14,6 +14,7 @@ import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.serialization.deserialization.DeserializationComponents import org.jetbrains.kotlin.serialization.deserialization.DeserializationComponents
import org.jetbrains.kotlin.serialization.deserialization.DeserializedPackageFragment import org.jetbrains.kotlin.serialization.deserialization.DeserializedPackageFragment
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedContainerSource
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedPackageMemberScope import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedPackageMemberScope
import org.jetbrains.kotlin.serialization.deserialization.getClassId import org.jetbrains.kotlin.serialization.deserialization.getClassId
import org.jetbrains.kotlin.serialization.deserialization.getName import org.jetbrains.kotlin.serialization.deserialization.getName
@@ -26,8 +27,9 @@ open class KlibMetadataDeserializedPackageFragment(
private val packageAccessHandler: PackageAccessHandler?, private val packageAccessHandler: PackageAccessHandler?,
storageManager: StorageManager, storageManager: StorageManager,
module: ModuleDescriptor, module: ModuleDescriptor,
private val partName: String private val partName: String,
) : KlibMetadataPackageFragment(fqName, storageManager, module) { containerSource: DeserializedContainerSource
) : KlibMetadataPackageFragment(fqName, storageManager, module, containerSource) {
// The proto field is lazy so that we can load only needed // The proto field is lazy so that we can load only needed
// packages from the library. // packages from the library.
@@ -57,8 +59,9 @@ class BuiltInKlibMetadataDeserializedPackageFragment(
packageAccessHandler: PackageAccessHandler?, packageAccessHandler: PackageAccessHandler?,
storageManager: StorageManager, storageManager: StorageManager,
module: ModuleDescriptor, module: ModuleDescriptor,
partName: String partName: String,
) : KlibMetadataDeserializedPackageFragment(fqName, library, packageAccessHandler, storageManager, module, partName), containerSource: DeserializedContainerSource
) : KlibMetadataDeserializedPackageFragment(fqName, library, packageAccessHandler, storageManager, module, partName, containerSource),
BuiltInsPackageFragment { BuiltInsPackageFragment {
override val isFallback: Boolean override val isFallback: Boolean
@@ -71,12 +74,13 @@ class KlibMetadataCachedPackageFragment(
module: ModuleDescriptor, module: ModuleDescriptor,
override val protoForNames: ProtoBuf.PackageFragment = parsePackageFragment(byteArray), override val protoForNames: ProtoBuf.PackageFragment = parsePackageFragment(byteArray),
fqName: FqName = FqName(protoForNames.getExtension(KlibMetadataProtoBuf.fqName)) fqName: FqName = FqName(protoForNames.getExtension(KlibMetadataProtoBuf.fqName))
) : KlibMetadataPackageFragment(fqName, storageManager, module) ) : KlibMetadataPackageFragment(fqName, storageManager, module, containerSource = null)
abstract class KlibMetadataPackageFragment( abstract class KlibMetadataPackageFragment(
fqName: FqName, fqName: FqName,
storageManager: StorageManager, storageManager: StorageManager,
module: ModuleDescriptor module: ModuleDescriptor,
containerSource: DeserializedContainerSource?
) : DeserializedPackageFragment(fqName, storageManager, module) { ) : DeserializedPackageFragment(fqName, storageManager, module) {
lateinit var components: DeserializationComponents lateinit var components: DeserializationComponents
@@ -97,7 +101,7 @@ abstract class KlibMetadataPackageFragment(
} }
override val classDataFinder by lazy { override val classDataFinder by lazy {
KlibMetadataClassDataFinder(protoForNames, nameResolver) KlibMetadataClassDataFinder(protoForNames, nameResolver, containerSource)
} }
private val _memberScope by lazy { private val _memberScope by lazy {
@@ -107,7 +111,7 @@ abstract class KlibMetadataPackageFragment(
proto.getPackage(), proto.getPackage(),
nameResolver, nameResolver,
KlibMetadataVersion.INSTANCE, KlibMetadataVersion.INSTANCE,
/* containerSource = */ null, /* containerSource = */ containerSource,
components, components,
"scope for $this" "scope for $this"
) { loadClassNames() } ) { loadClassNames() }
@@ -14,6 +14,7 @@ import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameSafe
import org.jetbrains.kotlin.resolve.descriptorUtil.getAllSuperClassifiers import org.jetbrains.kotlin.resolve.descriptorUtil.getAllSuperClassifiers
import org.jetbrains.kotlin.resolve.scopes.MemberScope import org.jetbrains.kotlin.resolve.scopes.MemberScope
import org.jetbrains.kotlin.resolve.scopes.MemberScopeImpl import org.jetbrains.kotlin.resolve.scopes.MemberScopeImpl
import org.jetbrains.kotlin.serialization.deserialization.DeserializationConfiguration
import org.jetbrains.kotlin.storage.StorageManager import org.jetbrains.kotlin.storage.StorageManager
import org.jetbrains.kotlin.utils.Printer import org.jetbrains.kotlin.utils.Printer
@@ -25,22 +26,38 @@ open class KlibMetadataDeserializedPackageFragmentsFactoryImpl : KlibMetadataDes
packageFragmentNames: List<String>, packageFragmentNames: List<String>,
moduleDescriptor: ModuleDescriptor, moduleDescriptor: ModuleDescriptor,
packageAccessedHandler: PackageAccessHandler?, packageAccessedHandler: PackageAccessHandler?,
storageManager: StorageManager storageManager: StorageManager,
) = packageFragmentNames.flatMap { configuration: DeserializationConfiguration
val fqName = FqName(it) ): List<KlibMetadataDeserializedPackageFragment> {
val parts = library.packageMetadataParts(fqName.asString()) val libraryHeader = (packageAccessedHandler ?: SimplePackageAccessHandler).loadModuleHeader(library)
val isBuiltInModule = moduleDescriptor.builtIns.builtInsModule === moduleDescriptor
parts.map { partName -> return packageFragmentNames.flatMap {
if (isBuiltInModule) val fqName = FqName(it)
BuiltInKlibMetadataDeserializedPackageFragment( val containerSource = KlibDeserializedContainerSource(libraryHeader, configuration, fqName)
fqName, val parts = library.packageMetadataParts(fqName.asString())
library, val isBuiltInModule = moduleDescriptor.builtIns.builtInsModule === moduleDescriptor
packageAccessedHandler, parts.map { partName ->
storageManager, if (isBuiltInModule)
moduleDescriptor, BuiltInKlibMetadataDeserializedPackageFragment(
partName fqName,
) else library,
KlibMetadataDeserializedPackageFragment(fqName, library, packageAccessedHandler, storageManager, moduleDescriptor, partName) packageAccessedHandler,
storageManager,
moduleDescriptor,
partName,
containerSource
)
else
KlibMetadataDeserializedPackageFragment(
fqName,
library,
packageAccessedHandler,
storageManager,
moduleDescriptor,
partName,
containerSource
)
}
} }
} }
@@ -106,7 +106,7 @@ class KlibMetadataModuleDescriptorFactoryImpl(
): PackageFragmentProvider { ): PackageFragmentProvider {
val deserializedPackageFragments = packageFragmentsFactory.createDeserializedPackageFragments( val deserializedPackageFragments = packageFragmentsFactory.createDeserializedPackageFragments(
library, packageFragmentNames, moduleDescriptor, packageAccessHandler, storageManager library, packageFragmentNames, moduleDescriptor, packageAccessHandler, storageManager, configuration
) )
// TODO: this is native specific. Move to a child class. // TODO: this is native specific. Move to a child class.