From b253a3a47ebdf6162d627c18c0a0510c74fc2ccd Mon Sep 17 00:00:00 2001 From: Dmitriy Novozhilov Date: Wed, 12 Apr 2023 13:37:07 +0300 Subject: [PATCH] [FIR] Don't lose non-serializable properties during metadata deserialization ^KT-57941 Fixed --- .../kotlin/fir/deserialization/ClassDeserialization.kt | 9 +++++++-- .../jetbrains/kotlin/gradle/K2KotlinxSerializationIT.kt | 2 +- .../app/src/main/kotlin/Main.kt | 6 ++++++ .../lib/src/main/kotlin/Base.kt | 8 ++++++++ 4 files changed, 22 insertions(+), 3 deletions(-) diff --git a/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/deserialization/ClassDeserialization.kt b/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/deserialization/ClassDeserialization.kt index 0cc4ead43ab..8f9820026c2 100644 --- a/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/deserialization/ClassDeserialization.kt +++ b/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/deserialization/ClassDeserialization.kt @@ -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 } } } diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/K2KotlinxSerializationIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/K2KotlinxSerializationIT.kt index fef6aa624b8..d157acb65cc 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/K2KotlinxSerializationIT.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/K2KotlinxSerializationIT.kt @@ -23,7 +23,7 @@ class K2KotlinxSerializationIT : KGPBaseTest() { } } - @DisplayName("Compile code with kotlinx.serialization with K2 against K1") + @DisplayName("Compile code with kotlinx.serialization with K2 against K1. KT-57941") @GradleTest fun `test kotlinx serialization K2 against K1`() { project("kotlinxSerializationK2AgainstK1", gradleVersion) { diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlinxSerializationK2AgainstK1/app/src/main/kotlin/Main.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlinxSerializationK2AgainstK1/app/src/main/kotlin/Main.kt index 9f654f55359..1a1d30a7514 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlinxSerializationK2AgainstK1/app/src/main/kotlin/Main.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlinxSerializationK2AgainstK1/app/src/main/kotlin/Main.kt @@ -19,6 +19,12 @@ class Derived(val d: Long = 1000000000000) : Base(2, "world", listOf("b", "c")) } } +fun processAbstractBase(abstractBase: AbstractBase) { + println(abstractBase.x) + println(abstractBase.y) + println(abstractBase.nonSerializableProp) +} + fun main() { val expected = Derived(12) val result = Json.encodeToString(Derived.serializer(), expected) diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlinxSerializationK2AgainstK1/lib/src/main/kotlin/Base.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlinxSerializationK2AgainstK1/lib/src/main/kotlin/Base.kt index 60cf1324e55..b4e20782ffe 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlinxSerializationK2AgainstK1/lib/src/main/kotlin/Base.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlinxSerializationK2AgainstK1/lib/src/main/kotlin/Base.kt @@ -12,3 +12,11 @@ open class Base( val b: String = "hello", val a: List = listOf("a") ) + +@Serializable +abstract class AbstractBase( + val x: Int = 1, + val y: Int = 2 +) { + abstract val nonSerializableProp: String +}