From 73191ff9bc7a9d0e6e935277bcf4cddb35a94e3d Mon Sep 17 00:00:00 2001 From: Mads Ager Date: Wed, 15 Mar 2023 13:49:22 +0100 Subject: [PATCH] [K2] Add version requirement for definitely non-null types to metadata. --- .../fir/serialization/FirElementSerializer.kt | 28 ++++++++++++++++++- .../serialization/DescriptorSerializer.kt | 20 ++----------- 2 files changed, 30 insertions(+), 18 deletions(-) diff --git a/compiler/fir/fir-serialization/src/org/jetbrains/kotlin/fir/serialization/FirElementSerializer.kt b/compiler/fir/fir-serialization/src/org/jetbrains/kotlin/fir/serialization/FirElementSerializer.kt index 61eb2711916..f0a5b3630b9 100644 --- a/compiler/fir/fir-serialization/src/org/jetbrains/kotlin/fir/serialization/FirElementSerializer.kt +++ b/compiler/fir/fir-serialization/src/org/jetbrains/kotlin/fir/serialization/FirElementSerializer.kt @@ -68,6 +68,8 @@ class FirElementSerializer private constructor( private val contractSerializer = FirContractSerializer() private val providedDeclarationsService = session.providedDeclarationsForMetadataService + private var metDefinitelyNotNullType: Boolean = false + fun packagePartProto( packageFqName: FqName, files: List, @@ -247,6 +249,12 @@ class FirElementSerializer private constructor( writeVersionRequirementForInlineClasses(klass, builder, versionRequirementTable) + if (metDefinitelyNotNullType) { + builder.addVersionRequirement( + writeLanguageVersionRequirement(LanguageFeature.DefinitelyNonNullableTypes, versionRequirementTable) + ) + } + typeTable.serialize()?.let { builder.typeTable = it } versionRequirementTable.serialize()?.let { builder.versionRequirementTable = it } @@ -412,6 +420,10 @@ class FirElementSerializer private constructor( if (property.hasInlineClassTypesInSignature()) { builder.addVersionRequirement(writeVersionRequirement(LanguageFeature.InlineClasses)) } + + if (local.metDefinitelyNotNullType) { + builder.addVersionRequirement(writeVersionRequirement(LanguageFeature.DefinitelyNonNullableTypes)) + } } extension.serializeProperty(property, builder, versionRequirementTable, local) @@ -507,6 +519,10 @@ class FirElementSerializer private constructor( if (function.hasInlineClassTypesInSignature()) { builder.addVersionRequirement(writeVersionRequirement(LanguageFeature.InlineClasses)) } + + if (local.metDefinitelyNotNullType) { + builder.addVersionRequirement(writeVersionRequirement(LanguageFeature.DefinitelyNonNullableTypes)) + } } return builder @@ -521,7 +537,7 @@ class FirElementSerializer private constructor( } } - private fun typeAliasProto(typeAlias: FirTypeAlias): ProtoBuf.TypeAlias.Builder? = whileAnalysing(session, typeAlias) { + private fun typeAliasProto(typeAlias: FirTypeAlias): ProtoBuf.TypeAlias.Builder? = whileAnalysing(session, typeAlias) { val builder = ProtoBuf.TypeAlias.newBuilder() val local = createChildSerializer(typeAlias) @@ -555,6 +571,11 @@ class FirElementSerializer private constructor( versionRequirementTable?.run { builder.addAllVersionRequirement(serializeVersionRequirements(typeAlias)) + if (local.metDefinitelyNotNullType) { + builder.addVersionRequirement( + writeLanguageVersionRequirement(LanguageFeature.DefinitelyNonNullableTypes, versionRequirementTable) + ) + } } extension.serializeTypeAlias(typeAlias, builder) @@ -598,6 +619,10 @@ class FirElementSerializer private constructor( if (constructor.hasInlineClassTypesInSignature()) { builder.addVersionRequirement(writeVersionRequirement(LanguageFeature.InlineClasses)) } + + if (local.metDefinitelyNotNullType) { + builder.addVersionRequirement(writeVersionRequirement(LanguageFeature.DefinitelyNonNullableTypes)) + } } extension.serializeConstructor(constructor, builder, local) @@ -769,6 +794,7 @@ class FirElementSerializer private constructor( } if (isDefinitelyNotNullType) { + metDefinitelyNotNullType = true builder.flags = Flags.getTypeFlags(false, isDefinitelyNotNullType) } } diff --git a/compiler/serialization/src/org/jetbrains/kotlin/serialization/DescriptorSerializer.kt b/compiler/serialization/src/org/jetbrains/kotlin/serialization/DescriptorSerializer.kt index e8005b601f3..0833ec96752 100644 --- a/compiler/serialization/src/org/jetbrains/kotlin/serialization/DescriptorSerializer.kt +++ b/compiler/serialization/src/org/jetbrains/kotlin/serialization/DescriptorSerializer.kt @@ -58,12 +58,7 @@ class DescriptorSerializer private constructor( ) { private val contractSerializer = ContractSerializer() - private var metDefinitelyNotNullTypeStack: MutableList = mutableListOf(false) - private var metDefinitelyNotNullType: Boolean - get() = metDefinitelyNotNullTypeStack.last() - set(value) { - metDefinitelyNotNullTypeStack[metDefinitelyNotNullTypeStack.lastIndex] = value - } + private var metDefinitelyNotNullType: Boolean = false private fun createChildSerializer(descriptor: DeclarationDescriptor): DescriptorSerializer = DescriptorSerializer( @@ -78,16 +73,7 @@ class DescriptorSerializer private constructor( private fun useTypeTable(): Boolean = extension.shouldUseTypeTable() - private inline fun withNewMetDefinitelyNotNullType(block: () -> T): T { - metDefinitelyNotNullTypeStack.add(false) - return try { - block() - } finally { - metDefinitelyNotNullTypeStack.removeAt(metDefinitelyNotNullTypeStack.lastIndex) - } - } - - fun classProto(classDescriptor: ClassDescriptor): ProtoBuf.Class.Builder = withNewMetDefinitelyNotNullType { + fun classProto(classDescriptor: ClassDescriptor): ProtoBuf.Class.Builder { val builder = ProtoBuf.Class.newBuilder() val hasEnumEntries = classDescriptor.kind == ClassKind.ENUM_CLASS && @@ -507,7 +493,7 @@ class DescriptorSerializer private constructor( ) } - private fun typeAliasProto(descriptor: TypeAliasDescriptor): ProtoBuf.TypeAlias.Builder? = withNewMetDefinitelyNotNullType { + private fun typeAliasProto(descriptor: TypeAliasDescriptor): ProtoBuf.TypeAlias.Builder? { val builder = ProtoBuf.TypeAlias.newBuilder() val local = createChildSerializer(descriptor)