[K2] Add version requirement for definitely non-null types to metadata.

This commit is contained in:
Mads Ager
2023-03-15 13:49:22 +01:00
committed by Mikhail Glukhikh
parent 1f3b8142a8
commit 73191ff9bc
2 changed files with 30 additions and 18 deletions
@@ -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<FirFile>,
@@ -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<ProtoBuf.TypeAlias.Builder?>(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)
}
}
@@ -58,12 +58,7 @@ class DescriptorSerializer private constructor(
) {
private val contractSerializer = ContractSerializer()
private var metDefinitelyNotNullTypeStack: MutableList<Boolean> = 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 <T> 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)