From aa1700f3e7703024748f063a2b24da4a73faffb5 Mon Sep 17 00:00:00 2001 From: "Sergey.Shanshin" Date: Tue, 25 Jan 2022 19:04:55 +0300 Subject: [PATCH] Fixed serialization with custom serializer for parametrized sealed class #KT-50764 Fixed #KT-50718 Fixed Fixes Kotlin/kotlinx.serialization#1705 --- .../serialization/compiler/backend/ir/GeneratorHelpers.kt | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/GeneratorHelpers.kt b/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/GeneratorHelpers.kt index e175e9b1361..97c4ad2ef53 100644 --- a/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/GeneratorHelpers.kt +++ b/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/GeneratorHelpers.kt @@ -1135,9 +1135,10 @@ interface IrBuilderExtension { } ?: return null val adjustedArgs: List = - if (baseClass.descriptor.isSealed() || baseClass.descriptor.modality == Modality.ABSTRACT) { + // if typeArgs.size == args.size then the serializer is custom - we need to use the actual serializers from the arguments + if ((typeArgs.size != args.size) && (baseClass.descriptor.isSealed() || baseClass.descriptor.modality == Modality.ABSTRACT)) { val serializer = findStandardKotlinTypeSerializer(baseClass.module, context.irBuiltIns.unitType.toKotlinType())!! - // workaround for sealed and classes - the `serializer` function expects non-null serializers, but does not use them, so serializers of any type can be passed + // workaround for sealed and abstract classes - the `serializer` function expects non-null serializers, but does not use them, so serializers of any type can be passed List(baseClass.typeParameters.size) { irGetObject(serializer) } } else { args