From 8b0bb430e7eccf4df6f8576b0ad480c323ee73a3 Mon Sep 17 00:00:00 2001 From: Leonid Startsev Date: Tue, 4 Aug 2020 19:55:19 +0300 Subject: [PATCH] Fix multiple serialization plugin problems Do not use fallback serializer if it is the same (fixes https://github.com/Kotlin/kotlinx.serialization/issues/957). Use correct number of serializable KClasses when creating sealed class serializer (fixes https://github.com/Kotlin/kotlinx.serialization/issues/925). --- .../kotlinx/serialization/compiler/backend/common/TypeUtil.kt | 4 +++- .../serialization/compiler/backend/jvm/JVMCodegenUtil.kt | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/common/TypeUtil.kt b/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/common/TypeUtil.kt index 032e637a2f3..eab539e54a3 100644 --- a/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/common/TypeUtil.kt +++ b/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/common/TypeUtil.kt @@ -87,7 +87,9 @@ fun AbstractSerialGenerator.allSealedSerializableSubclassesFor( } val serializableSubtypes = recursiveSealed(klass).map { it.toSimpleType() } - return serializableSubtypes to serializableSubtypes.mapNotNull { findTypeSerializerOrContextUnchecked(module, it) } + return serializableSubtypes.mapNotNull { subtype -> + findTypeSerializerOrContextUnchecked(module, subtype)?.let { Pair(subtype, it) } + }.unzip() } fun KotlinType.serialName(): String { diff --git a/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/jvm/JVMCodegenUtil.kt b/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/jvm/JVMCodegenUtil.kt index efa1203120a..f89009a67df 100644 --- a/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/jvm/JVMCodegenUtil.kt +++ b/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/jvm/JVMCodegenUtil.kt @@ -294,7 +294,7 @@ internal fun AbstractSerialGenerator.stackValueSerializerInstance(codegen: Class if (serializer.classId == contextSerializerId && serializer.constructors.any { it.valueParameters.size == 3 }) { // append new additional arguments val fallbackDefaultSerializer = findTypeSerializer(module, kType) - if (fallbackDefaultSerializer != null) { + if (fallbackDefaultSerializer != null && fallbackDefaultSerializer != serializer) { instantiate(kType to fallbackDefaultSerializer, writeSignature = false) } else { aconst(null)