From d063db3ce0631c84041c24024d04c134339dc38a Mon Sep 17 00:00:00 2001 From: "Sergey.Shanshin" Date: Wed, 18 Jan 2023 15:47:26 +0000 Subject: [PATCH] Fixed missing fallback serializer in contextual serializer Fixes Kotlin/kotlinx.serialization#2158 Merge-request: KT-MR-8338 Merged-by: Sergey Shanshin --- .../compiler/backend/ir/BaseIrGenerator.kt | 8 +++++++ .../testData/boxIr/contextualFallback.kt | 22 +++++++++++++++++++ ...SerializationFirBlackBoxTestGenerated.java | 6 +++++ .../SerializationIrBoxTestGenerated.java | 6 +++++ 4 files changed, 42 insertions(+) create mode 100644 plugins/kotlinx-serialization/testData/boxIr/contextualFallback.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 a253c3d5e7f..5b6b49c9cbc 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 @@ -467,6 +467,14 @@ abstract class BaseIrGenerator(private val currentClass: IrClass, final override typeArgs = listOf(kType) } contextSerializerId -> { + // don't create an instance if the serializer is being created for the cache + if (genericIndex == null && kType.genericIndex != null) { + // if context serializer parametrized by generic type (kType.genericIndex != null) + // and generic types are not allowed (always genericIndex == null for cache) + // then serializer can't be cached + return null + } + args = listOf(classReference(kType.classOrUpperBound()!!)) typeArgs = listOf(kType) diff --git a/plugins/kotlinx-serialization/testData/boxIr/contextualFallback.kt b/plugins/kotlinx-serialization/testData/boxIr/contextualFallback.kt new file mode 100644 index 00000000000..8046d91b68c --- /dev/null +++ b/plugins/kotlinx-serialization/testData/boxIr/contextualFallback.kt @@ -0,0 +1,22 @@ +// TARGET_BACKEND: JVM_IR + +// WITH_STDLIB + +import kotlinx.serialization.* +import kotlinx.serialization.json.* +import kotlinx.serialization.encoding.* + +@Serializable +data class Holder( + val ok: Boolean, + @Contextual + val result: T? +) + +fun box(): String { + val serializer = serializer>>() + val instance = Holder(true, listOf("a", "b")) + val encoded = Json.encodeToString(serializer, instance) + if (encoded != """{"ok":true,"result":["a","b"]}""") return encoded + return "OK" +} 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 325ab38cb1e..e8be4b91a2e 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 @@ -51,6 +51,12 @@ public class SerializationFirBlackBoxTestGenerated extends AbstractSerialization runTest("plugins/kotlinx-serialization/testData/boxIr/contextualByDefault.kt"); } + @Test + @TestMetadata("contextualFallback.kt") + public void testContextualFallback() throws Exception { + runTest("plugins/kotlinx-serialization/testData/boxIr/contextualFallback.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 ac76e285de4..bce8b071d53 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 @@ -49,6 +49,12 @@ public class SerializationIrBoxTestGenerated extends AbstractSerializationIrBoxT runTest("plugins/kotlinx-serialization/testData/boxIr/contextualByDefault.kt"); } + @Test + @TestMetadata("contextualFallback.kt") + public void testContextualFallback() throws Exception { + runTest("plugins/kotlinx-serialization/testData/boxIr/contextualFallback.kt"); + } + @Test @TestMetadata("enumsAreCached.kt") public void testEnumsAreCached() throws Exception {