From ee9d9d7b32c058d75aaa6bc5dd5b70051bf82b8e Mon Sep 17 00:00:00 2001 From: Leonid Startsev Date: Wed, 30 Nov 2022 18:46:47 +0100 Subject: [PATCH] Do not pre-generate writeSelf function for non-JVM platforms MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit write$Self in K1 is created only on JVM, so we need this check to avoid creating IR function without original descriptor — it will lead to various bugs in JS and Native, such as superclass properties missing from output when super.writeSelf is not found in descriptor. Fixes #KT-55180 --- .../serialization/compiler/backend/ir/IrPreGenerator.kt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/plugins/kotlinx-serialization/kotlinx-serialization.backend/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/IrPreGenerator.kt b/plugins/kotlinx-serialization/kotlinx-serialization.backend/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/IrPreGenerator.kt index 0e7a72e0c20..5e37c9a6699 100644 --- a/plugins/kotlinx-serialization/kotlinx-serialization.backend/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/IrPreGenerator.kt +++ b/plugins/kotlinx-serialization/kotlinx-serialization.backend/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/IrPreGenerator.kt @@ -15,6 +15,7 @@ import org.jetbrains.kotlin.ir.declarations.IrClass import org.jetbrains.kotlin.ir.types.* import org.jetbrains.kotlin.ir.util.companionObject import org.jetbrains.kotlin.name.Name +import org.jetbrains.kotlin.platform.jvm.isJvm import org.jetbrains.kotlinx.serialization.compiler.extensions.SerializationPluginContext import org.jetbrains.kotlinx.serialization.compiler.resolve.SerialEntityNames import org.jetbrains.kotlinx.serialization.compiler.resolve.bitMaskSlotCount @@ -38,6 +39,8 @@ class IrPreGenerator( } private fun preGenerateWriteSelfMethodIfNeeded() { + // write$Self in K1 is created only on JVM (see SerializationResolveExtension) + if (!compilerContext.platform.isJvm()) return if (!irClass.isInternalSerializable) return val serializerDescriptor = irClass.classSerializer(compilerContext)?.owner ?: return if (!irClass.shouldHaveSpecificSyntheticMethods {