From a20ce0610276a21acf8f54f8bafa34560019f8c8 Mon Sep 17 00:00:00 2001 From: Leonid Startsev Date: Thu, 22 Sep 2022 18:29:06 +0200 Subject: [PATCH] Support @Serializable(ContextualSerializer) on class It was fixed some time ago (https://github.com/Kotlin/kotlinx.serialization/issues/957) but for some reason only for old backend. Fixes https://github.com/Kotlin/kotlinx.serialization/issues/1776 --- .../compiler/backend/ir/BaseIrGenerator.kt | 1 + .../testData/boxIr/contextualByDefault.kt | 16 ++++++++++++++++ .../SerializationFirBlackBoxTestGenerated.java | 6 ++++++ .../runners/SerializationIrBoxTestGenerated.java | 6 ++++++ 4 files changed, 29 insertions(+) create mode 100644 plugins/kotlinx-serialization/testData/boxIr/contextualByDefault.kt diff --git a/plugins/kotlinx-serialization/kotlinx-serialization.backend/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/BaseIrGenerator.kt b/plugins/kotlinx-serialization/kotlinx-serialization.backend/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/BaseIrGenerator.kt index dc7259913ec..d4c5b47bb67 100644 --- a/plugins/kotlinx-serialization/kotlinx-serialization.backend/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/BaseIrGenerator.kt +++ b/plugins/kotlinx-serialization/kotlinx-serialization.backend/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/BaseIrGenerator.kt @@ -403,6 +403,7 @@ abstract class BaseIrGenerator(private val currentClass: IrClass, final override // new signature of context serializer args = args + mutableListOf().apply { val fallbackDefaultSerializer = findTypeSerializer(pluginContext, kType) + .takeIf { it?.owner?.classId != contextSerializerId } add(instantiate(fallbackDefaultSerializer, kType) ?: irNull()) add( createArrayOfExpression( diff --git a/plugins/kotlinx-serialization/testData/boxIr/contextualByDefault.kt b/plugins/kotlinx-serialization/testData/boxIr/contextualByDefault.kt new file mode 100644 index 00000000000..e9412fefe38 --- /dev/null +++ b/plugins/kotlinx-serialization/testData/boxIr/contextualByDefault.kt @@ -0,0 +1,16 @@ +// TARGET_BACKEND: JVM_IR + +// WITH_STDLIB + +import kotlinx.serialization.* + +@Serializable(with = ContextualSerializer::class) +class Ref( + val id: String, +) + +fun box(): String { + val kind = Ref.serializer().descriptor.kind.toString() + if (kind != "CONTEXTUAL") return kind + return "OK" +} \ No newline at end of file diff --git a/plugins/kotlinx-serialization/tests-gen/org/jetbrains/kotlinx/serialization/runners/SerializationFirBlackBoxTestGenerated.java b/plugins/kotlinx-serialization/tests-gen/org/jetbrains/kotlinx/serialization/runners/SerializationFirBlackBoxTestGenerated.java index 22483070c47..fe56f076125 100644 --- a/plugins/kotlinx-serialization/tests-gen/org/jetbrains/kotlinx/serialization/runners/SerializationFirBlackBoxTestGenerated.java +++ b/plugins/kotlinx-serialization/tests-gen/org/jetbrains/kotlinx/serialization/runners/SerializationFirBlackBoxTestGenerated.java @@ -39,6 +39,12 @@ public class SerializationFirBlackBoxTestGenerated extends AbstractSerialization runTest("plugins/kotlinx-serialization/testData/boxIr/classSerializerAsObject.kt"); } + @Test + @TestMetadata("contextualByDefault.kt") + public void testContextualByDefault() throws Exception { + runTest("plugins/kotlinx-serialization/testData/boxIr/contextualByDefault.kt"); + } + @Test @TestMetadata("enumsAreCached.kt") public void testEnumsAreCached() throws Exception { diff --git a/plugins/kotlinx-serialization/tests-gen/org/jetbrains/kotlinx/serialization/runners/SerializationIrBoxTestGenerated.java b/plugins/kotlinx-serialization/tests-gen/org/jetbrains/kotlinx/serialization/runners/SerializationIrBoxTestGenerated.java index b054f5e735a..2425cdec948 100644 --- a/plugins/kotlinx-serialization/tests-gen/org/jetbrains/kotlinx/serialization/runners/SerializationIrBoxTestGenerated.java +++ b/plugins/kotlinx-serialization/tests-gen/org/jetbrains/kotlinx/serialization/runners/SerializationIrBoxTestGenerated.java @@ -37,6 +37,12 @@ public class SerializationIrBoxTestGenerated extends AbstractSerializationIrBoxT runTest("plugins/kotlinx-serialization/testData/boxIr/classSerializerAsObject.kt"); } + @Test + @TestMetadata("contextualByDefault.kt") + public void testContextualByDefault() throws Exception { + runTest("plugins/kotlinx-serialization/testData/boxIr/contextualByDefault.kt"); + } + @Test @TestMetadata("enumsAreCached.kt") public void testEnumsAreCached() throws Exception {