Refactor boolean IR ABI stability flag to enum
Introduce an enum DeserializedContainerAbiStability with two values. This is needed in order to support another reason for ABI instability in a subsequent commit, namely "unstable because compiled by FIR". #KT-43592
This commit is contained in:
+8
-1
@@ -17,9 +17,16 @@ interface DeserializedContainerSource : SourceElement {
|
||||
|
||||
// True iff this container was compiled by the new IR backend, this compiler is not using the IR backend right now,
|
||||
// and no additional flags to override this behavior were specified.
|
||||
val isInvisibleIrDependency: Boolean
|
||||
val abiStability: DeserializedContainerAbiStability
|
||||
|
||||
// This string should only be used in error messages
|
||||
val presentableString: String
|
||||
}
|
||||
|
||||
enum class DeserializedContainerAbiStability {
|
||||
// Either the container is stable, or this compiler is configured to ignore ABI stability of dependencies.
|
||||
STABLE,
|
||||
|
||||
// The container is unstable because it is compiled with unstable JVM IR backend, and this compiler is _not_ configured to ignore that.
|
||||
IR_UNSTABLE,
|
||||
}
|
||||
|
||||
+9
-4
@@ -26,6 +26,7 @@ import org.jetbrains.kotlin.resolve.scopes.MemberScope
|
||||
import org.jetbrains.kotlin.serialization.deserialization.ClassData
|
||||
import org.jetbrains.kotlin.serialization.deserialization.DeserializationComponents
|
||||
import org.jetbrains.kotlin.serialization.deserialization.IncompatibleVersionErrorData
|
||||
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedContainerAbiStability
|
||||
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedPackageMemberScope
|
||||
import javax.inject.Inject
|
||||
|
||||
@@ -53,7 +54,7 @@ class DeserializedDescriptorResolver {
|
||||
JvmProtoBufUtil.readClassDataFrom(data, strings)
|
||||
} ?: return null
|
||||
val source = KotlinJvmBinarySourceElement(
|
||||
kotlinClass, kotlinClass.incompatibility, kotlinClass.isPreReleaseInvisible, kotlinClass.isInvisibleJvmIrDependency
|
||||
kotlinClass, kotlinClass.incompatibility, kotlinClass.isPreReleaseInvisible, kotlinClass.abiStability
|
||||
)
|
||||
return ClassData(nameResolver, classProto, kotlinClass.classHeader.metadataVersion, source)
|
||||
}
|
||||
@@ -66,7 +67,7 @@ class DeserializedDescriptorResolver {
|
||||
} ?: return null
|
||||
val source = JvmPackagePartSource(
|
||||
kotlinClass, packageProto, nameResolver, kotlinClass.incompatibility, kotlinClass.isPreReleaseInvisible,
|
||||
kotlinClass.isInvisibleJvmIrDependency
|
||||
kotlinClass.abiStability
|
||||
)
|
||||
return DeserializedPackageMemberScope(
|
||||
descriptor, packageProto, nameResolver, kotlinClass.classHeader.metadataVersion, source, components
|
||||
@@ -97,8 +98,12 @@ class DeserializedDescriptorResolver {
|
||||
get() = !components.configuration.skipPrereleaseCheck &&
|
||||
classHeader.isPreRelease && classHeader.metadataVersion == KOTLIN_1_3_M1_METADATA_VERSION
|
||||
|
||||
private val KotlinJvmBinaryClass.isInvisibleJvmIrDependency: Boolean
|
||||
get() = !components.configuration.allowUnstableDependencies && classHeader.isUnstableJvmIrBinary
|
||||
private val KotlinJvmBinaryClass.abiStability: DeserializedContainerAbiStability
|
||||
get() = when {
|
||||
components.configuration.allowUnstableDependencies -> DeserializedContainerAbiStability.STABLE
|
||||
classHeader.isUnstableJvmIrBinary -> DeserializedContainerAbiStability.IR_UNSTABLE
|
||||
else -> DeserializedContainerAbiStability.STABLE
|
||||
}
|
||||
|
||||
private fun readData(kotlinClass: KotlinJvmBinaryClass, expectedKinds: Set<KotlinClassHeader.Kind>): Array<String>? {
|
||||
val header = kotlinClass.classHeader
|
||||
|
||||
+4
-3
@@ -16,6 +16,7 @@ import org.jetbrains.kotlin.name.ClassId
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
import org.jetbrains.kotlin.resolve.jvm.JvmClassName
|
||||
import org.jetbrains.kotlin.serialization.deserialization.IncompatibleVersionErrorData
|
||||
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedContainerAbiStability
|
||||
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedContainerSource
|
||||
|
||||
class JvmPackagePartSource(
|
||||
@@ -25,7 +26,7 @@ class JvmPackagePartSource(
|
||||
nameResolver: NameResolver,
|
||||
override val incompatibility: IncompatibleVersionErrorData<JvmMetadataVersion>? = null,
|
||||
override val isPreReleaseInvisible: Boolean = false,
|
||||
override val isInvisibleIrDependency: Boolean = false,
|
||||
override val abiStability: DeserializedContainerAbiStability = DeserializedContainerAbiStability.STABLE,
|
||||
val knownJvmBinaryClass: KotlinJvmBinaryClass? = null
|
||||
) : DeserializedContainerSource {
|
||||
constructor(
|
||||
@@ -34,7 +35,7 @@ class JvmPackagePartSource(
|
||||
nameResolver: NameResolver,
|
||||
incompatibility: IncompatibleVersionErrorData<JvmMetadataVersion>? = null,
|
||||
isPreReleaseInvisible: Boolean = false,
|
||||
isInvisibleIrDependency: Boolean = false
|
||||
abiStability: DeserializedContainerAbiStability = DeserializedContainerAbiStability.STABLE,
|
||||
) : this(
|
||||
JvmClassName.byClassId(kotlinClass.classId),
|
||||
kotlinClass.classHeader.multifileClassName?.let {
|
||||
@@ -44,7 +45,7 @@ class JvmPackagePartSource(
|
||||
nameResolver,
|
||||
incompatibility,
|
||||
isPreReleaseInvisible,
|
||||
isInvisibleIrDependency,
|
||||
abiStability,
|
||||
kotlinClass
|
||||
)
|
||||
|
||||
|
||||
+2
-1
@@ -19,13 +19,14 @@ package org.jetbrains.kotlin.load.kotlin
|
||||
import org.jetbrains.kotlin.descriptors.SourceFile
|
||||
import org.jetbrains.kotlin.metadata.jvm.deserialization.JvmMetadataVersion
|
||||
import org.jetbrains.kotlin.serialization.deserialization.IncompatibleVersionErrorData
|
||||
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedContainerAbiStability
|
||||
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedContainerSource
|
||||
|
||||
class KotlinJvmBinarySourceElement(
|
||||
val binaryClass: KotlinJvmBinaryClass,
|
||||
override val incompatibility: IncompatibleVersionErrorData<JvmMetadataVersion>? = null,
|
||||
override val isPreReleaseInvisible: Boolean = false,
|
||||
override val isInvisibleIrDependency: Boolean = false
|
||||
override val abiStability: DeserializedContainerAbiStability = DeserializedContainerAbiStability.STABLE,
|
||||
) : DeserializedContainerSource {
|
||||
override val presentableString: String
|
||||
get() = "Class '${binaryClass.classId.asSingleFqName().asString()}'"
|
||||
|
||||
Reference in New Issue
Block a user