diff --git a/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/resolve/KSerializationUtil.kt b/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/resolve/KSerializationUtil.kt index 1079d76cc02..a525b4c020c 100644 --- a/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/resolve/KSerializationUtil.kt +++ b/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/resolve/KSerializationUtil.kt @@ -34,6 +34,12 @@ import org.jetbrains.kotlin.types.typeUtil.supertypes import org.jetbrains.kotlinx.serialization.compiler.resolve.SerialEntityNames.KSERIALIZER_CLASS import org.jetbrains.kotlinx.serialization.compiler.resolve.SerializationPackages.packageFqName +fun isAllowedToHaveAutoGeneratedSerializerMethods(classDescriptor: ClassDescriptor): Boolean { + // it is either GeneratedSerializer implementation + // or user implementation which does not have type parameters (to be able to correctly initialize descriptor) + return classDescriptor.typeConstructor.supertypes.any(::isGeneratedKSerializer) || + (classDescriptor.typeConstructor.supertypes.any(::isKSerializer) && classDescriptor.declaredTypeParameters.isEmpty()) +} fun isKSerializer(type: KotlinType?): Boolean = type != null && KotlinBuiltIns.isConstructedFromGivenClass(type, SerialEntityNames.KSERIALIZER_NAME_FQ) diff --git a/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/resolve/KSerializerDescriptorResolver.kt b/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/resolve/KSerializerDescriptorResolver.kt index bb60f6d1f5f..caa0816bb72 100644 --- a/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/resolve/KSerializerDescriptorResolver.kt +++ b/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/resolve/KSerializerDescriptorResolver.kt @@ -136,6 +136,9 @@ object KSerializerDescriptorResolver { name: Name, result: MutableSet ) { + // Do not auto-generate anything for user serializers + if (!isAllowedToHaveAutoGeneratedSerializerMethods(thisDescriptor)) return + val classDescriptor = getSerializableClassDescriptorBySerializer(thisDescriptor) ?: return if (name == SerialEntityNames.SERIAL_DESC_FIELD_NAME && result.none(thisDescriptor::checkSerializableClassPropertyResult) && fromSupertypes.none { thisDescriptor.checkSerializableClassPropertyResult(it) && it.modality == Modality.FINAL } @@ -168,6 +171,9 @@ object KSerializerDescriptorResolver { name: Name, result: MutableCollection ) { + // Do not auto-generate anything for user serializers + if (!isAllowedToHaveAutoGeneratedSerializerMethods(thisDescriptor)) return + val classDescriptor = getSerializableClassDescriptorBySerializer(thisDescriptor) ?: return fun shouldAddSerializerFunction(checkParameters: (FunctionDescriptor) -> Boolean): Boolean {