diff --git a/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/diagnostic/SerializationPluginDeclarationChecker.kt b/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/diagnostic/SerializationPluginDeclarationChecker.kt index efc859d2624a7..c58b349b9b35b 100644 --- a/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/diagnostic/SerializationPluginDeclarationChecker.kt +++ b/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/diagnostic/SerializationPluginDeclarationChecker.kt @@ -82,7 +82,7 @@ open class SerializationPluginDeclarationChecker : DeclarationChecker { private fun ClassDescriptor.isSerializableEnumWithMissingSerializer(): Boolean { if (kind != ClassKind.ENUM_CLASS) return false - if (hasSerializableAnnotationWithoutArgs) return false + if (annotations.hasAnnotation(SerializationAnnotations.serializableAnnotationFqName)) return false if (annotations.hasAnySerialAnnotation) return true return enumEntries().any { (it.annotations.hasAnySerialAnnotation) } } diff --git a/plugins/kotlin-serialization/kotlin-serialization-compiler/testData/diagnostics/SerializableEnums.kt b/plugins/kotlin-serialization/kotlin-serialization-compiler/testData/diagnostics/SerializableEnums.kt index a6f237f39cd98..cf258131569a5 100644 --- a/plugins/kotlin-serialization/kotlin-serialization-compiler/testData/diagnostics/SerializableEnums.kt +++ b/plugins/kotlin-serialization/kotlin-serialization-compiler/testData/diagnostics/SerializableEnums.kt @@ -10,4 +10,13 @@ enum class SimpleEnum { A, B } enum class MarkedInfoEnum { @SerialId(10) A, B} @Serializable -enum class ExplicitlyMarkedEnum { @SerialId(10) A, B} \ No newline at end of file +enum class ExplicitlyMarkedEnum { @SerialId(10) A, B} + +@Serializable(EnumSerializer::class) +enum class ExplicitlyMarkedEnumCustom { @SerialId(10) A, B} + +object EnumSerializer: KSerializer { + override val descriptor = TODO() + override fun serialize(encoder: Encoder, obj: ExplicitlyMarkedEnumCustom) = TODO() + override fun deserialize(decoder: Decoder): ExplicitlyMarkedEnumCustom = TODO() +} \ No newline at end of file diff --git a/plugins/kotlin-serialization/kotlin-serialization-compiler/testData/diagnostics/SerializableEnums.txt b/plugins/kotlin-serialization/kotlin-serialization-compiler/testData/diagnostics/SerializableEnums.txt index 53e7210286a0b..e164717aa11b7 100644 --- a/plugins/kotlin-serialization/kotlin-serialization-compiler/testData/diagnostics/SerializableEnums.txt +++ b/plugins/kotlin-serialization/kotlin-serialization-compiler/testData/diagnostics/SerializableEnums.txt @@ -1,5 +1,16 @@ package +public object EnumSerializer : kotlinx.serialization.KSerializer { + private constructor EnumSerializer() + public open override /*1*/ val descriptor: kotlin.Nothing + public open override /*1*/ fun deserialize(/*0*/ decoder: kotlinx.serialization.Decoder): ExplicitlyMarkedEnumCustom + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun patch(/*0*/ decoder: kotlinx.serialization.Decoder, /*1*/ old: ExplicitlyMarkedEnumCustom): ExplicitlyMarkedEnumCustom + public open override /*1*/ fun serialize(/*0*/ encoder: kotlinx.serialization.Encoder, /*1*/ obj: ExplicitlyMarkedEnumCustom): kotlin.Nothing + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + @kotlinx.serialization.Serializable public final enum class ExplicitlyMarkedEnum : kotlin.Enum { @kotlinx.serialization.SerialId(id = 10) enum entry A @@ -41,6 +52,27 @@ package public final /*synthesized*/ fun values(): kotlin.Array } +@kotlinx.serialization.Serializable(with = EnumSerializer::class) public final enum class ExplicitlyMarkedEnumCustom : kotlin.Enum { + @kotlinx.serialization.SerialId(id = 10) enum entry A + + enum entry B + + private constructor ExplicitlyMarkedEnumCustom() + public final override /*1*/ /*fake_override*/ val name: kotlin.String + public final override /*1*/ /*fake_override*/ val ordinal: kotlin.Int + protected final override /*1*/ /*fake_override*/ fun clone(): kotlin.Any + public final override /*1*/ /*fake_override*/ fun compareTo(/*0*/ other: ExplicitlyMarkedEnumCustom): kotlin.Int + public final override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + protected/*protected and package*/ final override /*1*/ /*fake_override*/ /*isHiddenForResolutionEverywhereBesideSupercalls*/ fun finalize(): kotlin.Unit + public final override /*1*/ /*fake_override*/ /*isHiddenForResolutionEverywhereBesideSupercalls*/ fun getDeclaringClass(): java.lang.Class! + public final override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + + // Static members + public final /*synthesized*/ fun valueOf(/*0*/ value: kotlin.String): ExplicitlyMarkedEnumCustom + public final /*synthesized*/ fun values(): kotlin.Array +} + public final enum class MarkedInfoEnum : kotlin.Enum { @kotlinx.serialization.SerialId(id = 10) enum entry A