From 76fc7ce0ad446d7552559d94ddcff92af836d0dc Mon Sep 17 00:00:00 2001 From: Leonid Startsev Date: Tue, 15 Nov 2022 19:24:13 +0100 Subject: [PATCH] Fix creating FirSerializableProperties for external classes. External classes do not have primary constructor, so we need to use 0 as value parameter count for them to be externally serializable when possible. --- .../FirSerializablePropertiesProvider.kt | 2 +- .../diagnostics/externalSerialierJava.kt | 21 +++++++++++++++++++ ...rializationFirDiagnosticTestGenerated.java | 6 ++++++ ...lizationPluginDiagnosticTestGenerated.java | 6 ++++++ 4 files changed, 34 insertions(+), 1 deletion(-) create mode 100644 plugins/kotlinx-serialization/testData/diagnostics/externalSerialierJava.kt diff --git a/plugins/kotlinx-serialization/kotlinx-serialization.k2/src/org/jetbrains/kotlinx/serialization/compiler/fir/services/FirSerializablePropertiesProvider.kt b/plugins/kotlinx-serialization/kotlinx-serialization.k2/src/org/jetbrains/kotlinx/serialization/compiler/fir/services/FirSerializablePropertiesProvider.kt index 1c91d2394e0..6d56497f067 100644 --- a/plugins/kotlinx-serialization/kotlinx-serialization.k2/src/org/jetbrains/kotlinx/serialization/compiler/fir/services/FirSerializablePropertiesProvider.kt +++ b/plugins/kotlinx-serialization/kotlinx-serialization.k2/src/org/jetbrains/kotlinx/serialization/compiler/fir/services/FirSerializablePropertiesProvider.kt @@ -89,7 +89,7 @@ class FirSerializablePropertiesProvider(session: FirSession) : FirExtensionSessi .let { restoreCorrectOrderFromClassProtoExtension(classSymbol, it) } val isExternallySerializable = classSymbol.isEnumClass || - primaryConstructorProperties.size == classSymbol.primaryConstructorSymbol()?.valueParameterSymbols?.size + primaryConstructorProperties.size == (classSymbol.primaryConstructorSymbol()?.valueParameterSymbols?.size ?: 0) val (serializableConstructorProperties, serializableStandaloneProperties) = serializableProperties.partition { it.propertySymbol in primaryConstructorProperties } return FirSerializableProperties( diff --git a/plugins/kotlinx-serialization/testData/diagnostics/externalSerialierJava.kt b/plugins/kotlinx-serialization/testData/diagnostics/externalSerialierJava.kt new file mode 100644 index 00000000000..d2c446461ae --- /dev/null +++ b/plugins/kotlinx-serialization/testData/diagnostics/externalSerialierJava.kt @@ -0,0 +1,21 @@ +// FIR_IDENTICAL +// WITH_STDLIB +// SKIP_TXT +import kotlinx.serialization.* +import kotlinx.serialization.descriptors.* +import kotlinx.serialization.encoding.* +import java.util.* + + +@Serializer(forClass = Date::class) +object DateSerializer : KSerializer { + override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor("java.util.Date", PrimitiveKind.STRING) + + override fun serialize(encoder: Encoder, value: Date) { + TODO() + } + + override fun deserialize(decoder: Decoder): Date { + TODO() + } +} diff --git a/plugins/kotlinx-serialization/tests-gen/org/jetbrains/kotlinx/serialization/runners/SerializationFirDiagnosticTestGenerated.java b/plugins/kotlinx-serialization/tests-gen/org/jetbrains/kotlinx/serialization/runners/SerializationFirDiagnosticTestGenerated.java index 9b04b20e661..78f145b5023 100644 --- a/plugins/kotlinx-serialization/tests-gen/org/jetbrains/kotlinx/serialization/runners/SerializationFirDiagnosticTestGenerated.java +++ b/plugins/kotlinx-serialization/tests-gen/org/jetbrains/kotlinx/serialization/runners/SerializationFirDiagnosticTestGenerated.java @@ -44,6 +44,12 @@ public class SerializationFirDiagnosticTestGenerated extends AbstractSerializati runTest("plugins/kotlinx-serialization/testData/diagnostics/EnumDuplicateSerialName.kt"); } + @Test + @TestMetadata("externalSerialierJava.kt") + public void testExternalSerialierJava() throws Exception { + runTest("plugins/kotlinx-serialization/testData/diagnostics/externalSerialierJava.kt"); + } + @Test @TestMetadata("ExternalSerializers.kt") public void testExternalSerializers() throws Exception { diff --git a/plugins/kotlinx-serialization/tests-gen/org/jetbrains/kotlinx/serialization/runners/SerializationPluginDiagnosticTestGenerated.java b/plugins/kotlinx-serialization/tests-gen/org/jetbrains/kotlinx/serialization/runners/SerializationPluginDiagnosticTestGenerated.java index 484f3376e09..414107b749a 100644 --- a/plugins/kotlinx-serialization/tests-gen/org/jetbrains/kotlinx/serialization/runners/SerializationPluginDiagnosticTestGenerated.java +++ b/plugins/kotlinx-serialization/tests-gen/org/jetbrains/kotlinx/serialization/runners/SerializationPluginDiagnosticTestGenerated.java @@ -42,6 +42,12 @@ public class SerializationPluginDiagnosticTestGenerated extends AbstractSerializ runTest("plugins/kotlinx-serialization/testData/diagnostics/EnumDuplicateSerialName.kt"); } + @Test + @TestMetadata("externalSerialierJava.kt") + public void testExternalSerialierJava() throws Exception { + runTest("plugins/kotlinx-serialization/testData/diagnostics/externalSerialierJava.kt"); + } + @Test @TestMetadata("ExternalSerializers.kt") public void testExternalSerializers() throws Exception {