Fix type table serialization in DescriptorSerializer

Always serialize type table (and version requirement table) after
everything else, to prevent bugs like KT-51446 where inline class
underlying type was added to the type table after it has already been
serialized.

 #KT-51446 Fixed
This commit is contained in:
Alexander Udalov
2022-02-22 21:58:19 +01:00
parent c53d91bae1
commit b443848ea0
11 changed files with 78 additions and 54 deletions
@@ -171,11 +171,6 @@ class DescriptorSerializer private constructor(
builder.companionObjectName = getSimpleNameIndex(companionObjectDescriptor.name)
}
val typeTableProto = typeTable.serialize()
if (typeTableProto != null) {
builder.typeTable = typeTableProto
}
val representation = classDescriptor.inlineClassRepresentation
if (representation != null) {
builder.inlineClassUnderlyingPropertyName = getSimpleNameIndex(representation.underlyingPropertyName)
@@ -214,10 +209,8 @@ class DescriptorSerializer private constructor(
)
}
val versionRequirementTableProto = versionRequirementTable.serialize()
if (versionRequirementTableProto != null) {
builder.versionRequirementTable = versionRequirementTableProto
}
typeTable.serialize()?.let { builder.typeTable = it }
versionRequirementTable.serialize()?.let { builder.versionRequirementTable = it }
return builder
}
@@ -423,11 +416,12 @@ class DescriptorSerializer private constructor(
builder.addValueParameter(local.valueParameter(valueParameterDescriptor))
}
contractSerializer.serializeContractOfFunctionIfAny(descriptor, builder, this)
extension.serializeFunction(descriptor, builder, versionRequirementTable, local)
if (serializeTypeTableToFunction) {
val typeTableProto = typeTable.serialize()
if (typeTableProto != null) {
builder.typeTable = typeTableProto
}
typeTable.serialize()?.let { builder.typeTable = it }
}
versionRequirementTable?.run {
@@ -450,10 +444,6 @@ class DescriptorSerializer private constructor(
}
}
contractSerializer.serializeContractOfFunctionIfAny(descriptor, builder, this)
extension.serializeFunction(descriptor, builder, versionRequirementTable, local)
return builder
}
@@ -771,18 +761,11 @@ class DescriptorSerializer private constructor(
}
}
val typeTableProto = typeTable.serialize()
if (typeTableProto != null) {
builder.typeTable = typeTableProto
}
val versionRequirementTableProto = versionRequirementTable?.serialize()
if (versionRequirementTableProto != null) {
builder.versionRequirementTable = versionRequirementTableProto
}
extension.serializePackage(packageFqName, builder)
typeTable.serialize()?.let { builder.typeTable = it }
versionRequirementTable?.serialize()?.let { builder.versionRequirementTable = it }
return builder
}