[FIR] Don't lose non-serializable properties during metadata deserialization

^KT-57941 Fixed
This commit is contained in:
Dmitriy Novozhilov
2023-04-12 13:37:07 +03:00
committed by Space Team
parent 37bbf447a3
commit b253a3a47e
4 changed files with 22 additions and 3 deletions
@@ -327,10 +327,15 @@ private fun ProtoBuf.ClassOrBuilder.propertiesInOrder(context: FirDeserializatio
if (versionRequirements.any { it.version.major >= 2 }) return properties
val order = getExtension(SerializationPluginMetadataExtensions.propertiesNamesInProgramOrder)
.takeIf { it.isNotEmpty() }
?.toSet()
?: return properties
val propertiesByName = properties.groupBy { it.name }
return order.flatMap { propertiesByName[it] ?: emptyList() }.also {
assert(it.size == properties.size)
val orderedProperties = order.flatMap { propertiesByName[it] ?: emptyList() }
// non-serializable properties are not saved in SerializationPluginMetadataExtensions, so we need to pick up them if any
return if (orderedProperties.size == properties.size) {
orderedProperties
} else {
orderedProperties + properties.filter { it.name !in order }
}
}