// WITH_STDLIB // // NOTE: THIS FILE IS AUTO-GENERATED by the TestMatrixIntegration.kt, DO NOT EDIT! // @file:UseSerializers(EnumWithUseSerializer::class, NestedEnumWithUseSerializer::class, ) @file:UseContextualSerialization(EnumWithUseContextual::class, Container.NestedEnumWithUseContextual::class, ) import kotlinx.serialization.* import kotlinx.serialization.descriptors.* import kotlinx.serialization.json.* import kotlinx.serialization.encoding.* import kotlinx.serialization.modules.* import kotlin.reflect.typeOf enum class EnumWithDef { A, B, } @Serializable enum class Enum { A, B, } @Serializable(EnumWithCustomSerializer::class) enum class EnumWithCustom { A, B, } @Serializable(EnumWithCustomClSerializer::class) enum class EnumWithCustomCl { A, B, } enum class EnumWithContextual { A, B, } enum class EnumWithUseContextual { A, B, } enum class EnumWithUse { A, B, } @Serializable @Extra("Enum1") enum class Enum1 { @Extra("A") A, @Extra("B") B, } class Container { enum class NestedEnumWithDef { A, B, } @Serializable enum class NestedEnum { A, B, } @Serializable(NestedEnumWithCustomSerializer::class) enum class NestedEnumWithCustom { A, B, } @Serializable(NestedEnumWithCustomClSerializer::class) enum class NestedEnumWithCustomCl { A, B, } enum class NestedEnumWithContextual { A, B, } enum class NestedEnumWithUseContextual { A, B, } enum class NestedEnumWithUse { A, B, } } class Outer { } object EnumWithCustomSerializer: ToDoSerializer("custom|EnumWithCustom") object NestedEnumWithCustomSerializer: ToDoSerializer("custom|Container.NestedEnumWithCustom") class EnumWithCustomClSerializer: ToDoSerializer("custom|EnumWithCustomCl") class NestedEnumWithCustomClSerializer: ToDoSerializer("custom|Container.NestedEnumWithCustomCl") object EnumWithContextualSerializer: ToDoSerializer("contextual|EnumWithContextual") object NestedEnumWithContextualSerializer: ToDoSerializer("contextual|Container.NestedEnumWithContextual") object EnumWithUseContextualSerializer: ToDoSerializer("contextual|EnumWithUseContextual") object NestedEnumWithUseContextualSerializer: ToDoSerializer("contextual|Container.NestedEnumWithUseContextual") class EnumWithUseSerializer: ToDoSerializer("useSerializer|EnumWithUse") class NestedEnumWithUseSerializer: ToDoSerializer("useSerializer|Container.NestedEnumWithUse") @kotlinx.serialization.SerialInfo @Target(AnnotationTarget.CLASS, AnnotationTarget.PROPERTY) annotation class Extra(val value: String) fun box(): String { val module = SerializersModule { contextual(EnumWithContextualSerializer) contextual(NestedEnumWithContextualSerializer) contextual(EnumWithUseContextualSerializer) contextual(NestedEnumWithUseContextualSerializer) } serializer().checkElements("A", "B") serializer().checkElements("A", "B") serializer().checkElements("A", "B") serializer().checkElements("A", "B") serializer().checkElements("A", "B") serializer().checkElements("A", "B") serializer().checkElements("A", "B") serializer().checkElements("A", "B") serializer().checkElements("A", "B") serializer().checkElements("A", "B") serializer().checkElements("A", "B") serializer().checkElements("A", "B") serializer().checkElements("A", "B") serializer().checkElements("A", "B") serializer().checkElements("A", "B") // Call serializer factory function in companion Enum.serializer().checkSerialName("Enum")?.let { return it } Container.NestedEnum.serializer().checkSerialName("Container.NestedEnum")?.let { return it } EnumWithCustom.serializer().checkSerialName("custom|EnumWithCustom")?.let { return it } Container.NestedEnumWithCustom.serializer().checkSerialName("custom|Container.NestedEnumWithCustom")?.let { return it } EnumWithCustomCl.serializer().checkSerialName("custom|EnumWithCustomCl")?.let { return it } Container.NestedEnumWithCustomCl.serializer().checkSerialName("custom|Container.NestedEnumWithCustomCl")?.let { return it } Enum1.serializer().checkSerialName("Enum1")?.let { return it } // Serializer lookup by generic parameter serializer().checkSerialName("EnumWithDef")?.let { return it } serializer().checkSerialName("Container.NestedEnumWithDef")?.let { return it } serializer().checkSerialName("Enum")?.let { return it } serializer().checkSerialName("Container.NestedEnum")?.let { return it } serializer().checkSerialName("custom|EnumWithCustom")?.let { return it } serializer().checkSerialName("custom|Container.NestedEnumWithCustom")?.let { return it } serializer().checkSerialName("custom|EnumWithCustomCl")?.let { return it } serializer().checkSerialName("custom|Container.NestedEnumWithCustomCl")?.let { return it } // generated serializer used in lookup for the empty module in case of specifying of @file:UseContextualSerialization or @UseSerializers serializer().checkSerialName("EnumWithUseContextual")?.let { return it } // generated serializer used in lookup for the empty module in case of specifying of @file:UseContextualSerialization or @UseSerializers serializer().checkSerialName("Container.NestedEnumWithUseContextual")?.let { return it } // generated serializer used in lookup for the empty module in case of specifying of @file:UseContextualSerialization or @UseSerializers serializer().checkSerialName("EnumWithUse")?.let { return it } // generated serializer used in lookup for the empty module in case of specifying of @file:UseContextualSerialization or @UseSerializers serializer().checkSerialName("Container.NestedEnumWithUse")?.let { return it } serializer().checkSerialName("Enum1")?.let { return it } // Serializer lookup by typeOf function serializer(typeOf()).checkSerialName("EnumWithDef")?.let { return it } serializer(typeOf()).checkSerialName("Container.NestedEnumWithDef")?.let { return it } serializer(typeOf()).checkSerialName("Enum")?.let { return it } serializer(typeOf()).checkSerialName("Container.NestedEnum")?.let { return it } serializer(typeOf()).checkSerialName("custom|EnumWithCustom")?.let { return it } serializer(typeOf()).checkSerialName("custom|Container.NestedEnumWithCustom")?.let { return it } serializer(typeOf()).checkSerialName("custom|EnumWithCustomCl")?.let { return it } serializer(typeOf()).checkSerialName("custom|Container.NestedEnumWithCustomCl")?.let { return it } // generated serializer used in lookup for the empty module in case of specifying of @file:UseContextualSerialization or @UseSerializers serializer(typeOf()).checkSerialName("EnumWithUseContextual")?.let { return it } // generated serializer used in lookup for the empty module in case of specifying of @file:UseContextualSerialization or @UseSerializers serializer(typeOf()).checkSerialName("Container.NestedEnumWithUseContextual")?.let { return it } // generated serializer used in lookup for the empty module in case of specifying of @file:UseContextualSerialization or @UseSerializers serializer(typeOf()).checkSerialName("EnumWithUse")?.let { return it } // generated serializer used in lookup for the empty module in case of specifying of @file:UseContextualSerialization or @UseSerializers serializer(typeOf()).checkSerialName("Container.NestedEnumWithUse")?.let { return it } serializer(typeOf()).checkSerialName("Enum1")?.let { return it } // Serializer lookup by generic parameter in custom module module.serializer().checkSerialName("EnumWithDef")?.let { return it } module.serializer().checkSerialName("Container.NestedEnumWithDef")?.let { return it } module.serializer().checkSerialName("Enum")?.let { return it } module.serializer().checkSerialName("Container.NestedEnum")?.let { return it } module.serializer().checkSerialName("custom|EnumWithCustom")?.let { return it } module.serializer().checkSerialName("custom|Container.NestedEnumWithCustom")?.let { return it } module.serializer().checkSerialName("custom|EnumWithCustomCl")?.let { return it } module.serializer().checkSerialName("custom|Container.NestedEnumWithCustomCl")?.let { return it } // !!! for some reason, the generated serializer is still lookup for the custom module in case of specifying of @file:UseContextualSerialization or @UseSerializers module.serializer().checkSerialName("EnumWithUseContextual")?.let { return it } // !!! for some reason, the generated serializer is still lookup for the custom module in case of specifying of @file:UseContextualSerialization or @UseSerializers module.serializer().checkSerialName("Container.NestedEnumWithUseContextual")?.let { return it } // !!! for some reason, the generated serializer is still lookup for the custom module in case of specifying of @file:UseContextualSerialization or @UseSerializers module.serializer().checkSerialName("EnumWithUse")?.let { return it } // !!! for some reason, the generated serializer is still lookup for the custom module in case of specifying of @file:UseContextualSerialization or @UseSerializers module.serializer().checkSerialName("Container.NestedEnumWithUse")?.let { return it } module.serializer().checkSerialName("Enum1")?.let { return it } // Serializer lookup by typeOf function in custom module module.serializer(typeOf()).checkSerialName("EnumWithDef")?.let { return it } module.serializer(typeOf()).checkSerialName("Container.NestedEnumWithDef")?.let { return it } module.serializer(typeOf()).checkSerialName("Enum")?.let { return it } module.serializer(typeOf()).checkSerialName("Container.NestedEnum")?.let { return it } module.serializer(typeOf()).checkSerialName("custom|EnumWithCustom")?.let { return it } module.serializer(typeOf()).checkSerialName("custom|Container.NestedEnumWithCustom")?.let { return it } module.serializer(typeOf()).checkSerialName("custom|EnumWithCustomCl")?.let { return it } module.serializer(typeOf()).checkSerialName("custom|Container.NestedEnumWithCustomCl")?.let { return it } // !!! for some reason, the generated serializer is still lookup for the custom module in case of specifying of @file:UseContextualSerialization or @UseSerializers module.serializer(typeOf()).checkSerialName("EnumWithUseContextual")?.let { return it } // !!! for some reason, the generated serializer is still lookup for the custom module in case of specifying of @file:UseContextualSerialization or @UseSerializers module.serializer(typeOf()).checkSerialName("Container.NestedEnumWithUseContextual")?.let { return it } // !!! for some reason, the generated serializer is still lookup for the custom module in case of specifying of @file:UseContextualSerialization or @UseSerializers module.serializer(typeOf()).checkSerialName("EnumWithUse")?.let { return it } // !!! for some reason, the generated serializer is still lookup for the custom module in case of specifying of @file:UseContextualSerialization or @UseSerializers module.serializer(typeOf()).checkSerialName("Container.NestedEnumWithUse")?.let { return it } module.serializer(typeOf()).checkSerialName("Enum1")?.let { return it } // Annotation on type should have value same as a class name serializer().checkAnnotation("Enum1") // Annotation on enum entries should have value same as a entry names serializer().checkElementAnnotations("A", "B") return "OK" } fun KSerializer<*>.checkSerialName(name: String): String? = if (descriptor.serialName != name) "Wrong serial name: Expected '$name' actual '${descriptor.serialName}'" else null fun KSerializer<*>.checkAnnotation(value: String): String? = descriptor.annotations.filterIsInstance().single().value.let { if (it != value) it else null } fun KSerializer<*>.checkElementAnnotations(vararg values: String): String? = (0 ..< descriptor.elementsCount).map { descriptor.getElementAnnotations(it).filterIsInstance().single().value}.let { if (it != values.toList()) it.toString() else null } fun KSerializer<*>.checkElements(vararg values: String): String? = (0 ..< descriptor.elementsCount).map { descriptor.getElementName(it) }.let { if (it != values.toList()) it.toString() else null } abstract class ToDoSerializer(descriptorName: String): KSerializer { override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor(descriptorName, PrimitiveKind.STRING) override fun deserialize(decoder: Decoder): T = TODO() override fun serialize(encoder: Encoder, value: T) = TODO() }