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 {