diff --git a/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/common/SerializableCodegen.kt b/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/common/SerializableCodegen.kt index 827d63b367d..a49ba347772 100644 --- a/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/common/SerializableCodegen.kt +++ b/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/common/SerializableCodegen.kt @@ -22,6 +22,8 @@ import org.jetbrains.kotlin.descriptors.FunctionDescriptor import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlinx.serialization.compiler.resolve.KSerializerDescriptorResolver import org.jetbrains.kotlinx.serialization.compiler.resolve.SerializableProperties +import org.jetbrains.kotlinx.serialization.compiler.resolve.classSerializer +import org.jetbrains.kotlinx.serialization.compiler.resolve.toClassDescriptor abstract class SerializableCodegen( protected val serializableDescriptor: ClassDescriptor, @@ -35,13 +37,19 @@ abstract class SerializableCodegen( } private fun generateSyntheticInternalConstructor() { - val constrDesc = KSerializerDescriptorResolver.createLoadConstructorDescriptor(serializableDescriptor, bindingContext) - generateInternalConstructor(constrDesc) + val serializerDescriptor = serializableDescriptor.classSerializer?.toClassDescriptor ?: return + if (SerializerCodegen.getSyntheticLoadMember(serializerDescriptor) != null) { + val constrDesc = KSerializerDescriptorResolver.createLoadConstructorDescriptor(serializableDescriptor, bindingContext) + generateInternalConstructor(constrDesc) + } } private fun generateSyntheticMethods() { - val func = KSerializerDescriptorResolver.createWriteSelfFunctionDescriptor(serializableDescriptor) - generateWriteSelfMethod(func) + val serializerDescriptor = serializableDescriptor.classSerializer?.toClassDescriptor ?: return + if (SerializerCodegen.getSyntheticSaveMember(serializerDescriptor) != null) { + val func = KSerializerDescriptorResolver.createWriteSelfFunctionDescriptor(serializableDescriptor) + generateWriteSelfMethod(func) + } } protected abstract fun generateInternalConstructor(constructorDescriptor: ClassConstructorDescriptor) diff --git a/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/common/SerializerCodegen.kt b/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/common/SerializerCodegen.kt index c9316de3bac..96dee484593 100644 --- a/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/common/SerializerCodegen.kt +++ b/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/common/SerializerCodegen.kt @@ -110,22 +110,14 @@ abstract class SerializerCodegen( } private fun generateSaveIfNeeded(): Boolean { - val function = getMemberToGenerate( - serializerDescriptor, SerialEntityNames.SAVE, - serializerDescriptor::checkSaveMethodResult, serializerDescriptor::checkSaveMethodParameters - ) - ?: return false + val function = getSyntheticSaveMember(serializerDescriptor) ?: return false checkSerializability() generateSave(function) return true } private fun generateLoadIfNeeded(): Boolean { - val function = getMemberToGenerate( - serializerDescriptor, SerialEntityNames.LOAD, - serializerDescriptor::checkLoadMethodResult, serializerDescriptor::checkLoadMethodParameters - ) - ?: return false + val function = getSyntheticLoadMember(serializerDescriptor) ?: return false checkSerializability() generateLoad(function) return true @@ -160,4 +152,16 @@ abstract class SerializerCodegen( protected fun ClassDescriptor.getFuncDesc(funcName: String): Sequence = unsubstitutedMemberScope.getDescriptorsFiltered { it == Name.identifier(funcName) }.asSequence().filterIsInstance() + + companion object { + fun getSyntheticLoadMember(serializerDescriptor: ClassDescriptor): FunctionDescriptor? = getMemberToGenerate( + serializerDescriptor, SerialEntityNames.LOAD, + serializerDescriptor::checkLoadMethodResult, serializerDescriptor::checkLoadMethodParameters + ) + + fun getSyntheticSaveMember(serializerDescriptor: ClassDescriptor): FunctionDescriptor? = getMemberToGenerate( + serializerDescriptor, SerialEntityNames.SAVE, + serializerDescriptor::checkSaveMethodResult, serializerDescriptor::checkSaveMethodParameters + ) + } }