1use serde::de::{
2    DeserializeSeed, Deserializer, EnumAccess, Expected, IntoDeserializer, Unexpected,
3    VariantAccess, Visitor,
4};
5use serde::ser::{Serialize, Serializer};
6use serde::{forward_to_deserialize_any, Deserialize};
7use std::fmt::{self, Debug, Display};
8use std::marker::PhantomData;
9use std::str::FromStr;
10
11macro_rules! kind {
12    ($($kind:ident,)*) => {
13        #[derive(Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash)]
14        #[non_exhaustive]
15        pub enum Kind {
16            $(
17                $kind,
18            )*
19            #[allow(non_camel_case_types)]
20            null,
21        }
22
23        fn as_str(kind: &Kind) -> &'static str {
24            match kind {
25                $(
26                    Kind::$kind => stringify!($kind),
27                )*
28                Kind::null => "null",
29            }
30        }
31
32        fn from_str(kind: &str) -> Result<Kind, ParseKindError> {
33            match kind {
34                $(
35                    stringify!($kind) => Ok(Kind::$kind),
36                )*
37                _other => Err(ParseKindError { _private: () }),
38            }
39        }
40
41        static VARIANTS: &'static [&'static str] = &[
42            $(
43                stringify!($kind),
44            )*
45        ];
46    };
47}
48
49#[non_exhaustive]
pub enum Kind {
    AbiTagAttr,
    AccessSpecDecl,
    AliasAttr,
    AlignValueAttr,
    AlignedAttr,
    AllocAlignAttr,
    AllocSizeAttr,
    AlwaysInlineAttr,
    ArrayInitIndexExpr,
    ArrayInitLoopExpr,
    ArraySubscriptExpr,
    ArrayTypeTraitExpr,
    AsmLabelAttr,
    AtomicExpr,
    AtomicType,
    AttributedStmt,
    AttributedType,
    AutoType,
    AvailabilityAttr,
    AvailableOnlyInDefaultEvalMethodAttr,
    BinaryConditionalOperator,
    BinaryOperator,
    BindingDecl,
    BlockCommandComment,
    BlockPointerType,
    BreakStmt,
    BuiltinAttr,
    BuiltinBitCastExpr,
    BuiltinTemplateDecl,
    BuiltinType,
    CStyleCastExpr,
    CXX11NoReturnAttr,
    CXXBindTemporaryExpr,
    CXXBoolLiteralExpr,
    CXXCatchStmt,
    CXXConstCastExpr,
    CXXConstructExpr,
    CXXConstructorDecl,
    CXXConversionDecl,
    CXXCtorInitializer,
    CXXDeductionGuideDecl,
    CXXDefaultArgExpr,
    CXXDefaultInitExpr,
    CXXDeleteExpr,
    CXXDependentScopeMemberExpr,
    CXXDestructorDecl,
    CXXDynamicCastExpr,
    CXXFoldExpr,
    CXXForRangeStmt,
    CXXFunctionalCastExpr,
    CXXInheritedCtorInitExpr,
    CXXMemberCallExpr,
    CXXMethodDecl,
    CXXNewExpr,
    CXXNoexceptExpr,
    CXXNullPtrLiteralExpr,
    CXXOperatorCallExpr,
    CXXPseudoDestructorExpr,
    CXXRecordDecl,
    CXXReinterpretCastExpr,
    CXXRewrittenBinaryOperator,
    CXXScalarValueInitExpr,
    CXXStaticCastExpr,
    CXXTemporaryObjectExpr,
    CXXThisExpr,
    CXXThrowExpr,
    CXXTryStmt,
    CXXTypeidExpr,
    CXXUnresolvedConstructExpr,
    CallExpr,
    CallbackAttr,
    CaseStmt,
    CharacterLiteral,
    ClassScopeFunctionSpecializationDecl,
    ClassTemplateDecl,
    ClassTemplatePartialSpecializationDecl,
    ClassTemplateSpecializationDecl,
    ColdAttr,
    ComplexType,
    CompoundAssignOperator,
    CompoundLiteralExpr,
    CompoundRequirement,
    CompoundStmt,
    ConceptDecl,
    ConceptSpecializationExpr,
    ConditionalOperator,
    ConstAttr,
    ConstantArrayType,
    ConstantExpr,
    ConstructorUsingShadowDecl,
    ContinueStmt,
    ConvertVectorExpr,
    DLLImportAttr,
    DecayedType,
    Decl,
    DeclRefExpr,
    DeclStmt,
    DecltypeType,
    DecompositionDecl,
    DefaultStmt,
    DependentNameType,
    DependentScopeDeclRefExpr,
    DependentSizedArrayType,
    DependentTemplateSpecializationType,
    DeprecatedAttr,
    DesignatedInitExpr,
    DiagnoseIfAttr,
    DisableTailCallsAttr,
    DoStmt,
    ElaboratedType,
    EmptyDecl,
    EnableIfAttr,
    EnumConstantDecl,
    EnumDecl,
    EnumType,
    ExcludeFromExplicitInstantiationAttr,
    ExprWithCleanups,
    FallThroughAttr,
    FieldDecl,
    FileScopeAsmDecl,
    FinalAttr,
    FloatingLiteral,
    ForStmt,
    FormatArgAttr,
    FormatAttr,
    FriendDecl,
    FullComment,
    FunctionDecl,
    FunctionProtoType,
    FunctionTemplateDecl,
    GCCAsmStmt,
    GNUInlineAttr,
    GNUNullExpr,
    GotoStmt,
    HTMLEndTagComment,
    HTMLStartTagComment,
    IfStmt,
    ImplicitCastExpr,
    ImplicitConceptSpecializationDecl,
    ImplicitValueInitExpr,
    IncompleteArrayType,
    IndirectFieldDecl,
    IndirectGotoStmt,
    InitListExpr,
    InjectedClassNameType,
    InlineCommandComment,
    IntegerLiteral,
    InternalLinkageAttr,
    LValueReferenceType,
    LabelStmt,
    LambdaExpr,
    LifetimeBoundAttr,
    LikelyAttr,
    LinkageSpecDecl,
    MSAllocatorAttr,
    MSConstexprAttr,
    MSNoVTableAttr,
    MSVtorDispAttr,
    MaterializeTemporaryExpr,
    MaxFieldAlignmentAttr,
    MayAliasAttr,
    MemberExpr,
    MemberPointerType,
    MinVectorWidthAttr,
    ModeAttr,
    NamespaceAliasDecl,
    NamespaceDecl,
    NestedRequirement,
    NoAliasAttr,
    NoDebugAttr,
    NoEscapeAttr,
    NoInlineAttr,
    NoSanitizeAttr,
    NoThrowAttr,
    NoUniqueAddressAttr,
    NonNullAttr,
    NonTypeTemplateParmDecl,
    NullStmt,
    OffsetOfExpr,
    OpaqueValueExpr,
    OverrideAttr,
    OwnerAttr,
    PackExpansionExpr,
    PackExpansionType,
    PackedAttr,
    ParagraphComment,
    ParamCommandComment,
    ParenExpr,
    ParenListExpr,
    ParenType,
    ParmVarDecl,
    PointerAttr,
    PointerType,
    PragmaCommentDecl,
    PragmaDetectMismatchDecl,
    PredefinedExpr,
    PreferredNameAttr,
    PureAttr,
    QualType,
    RValueReferenceType,
    RecordDecl,
    RecordType,
    RecoveryExpr,
    RequiresExpr,
    RestrictAttr,
    ReturnStmt,
    ReturnsNonNullAttr,
    ReturnsTwiceAttr,
    SelectAnyAttr,
    ShuffleVectorExpr,
    SimpleRequirement,
    SizeOfPackExpr,
    SourceLocExpr,
    StandaloneDebugAttr,
    StaticAssertDecl,
    StmtExpr,
    StringLiteral,
    SubstNonTypeTemplateParmExpr,
    SubstTemplateTypeParmPackType,
    SubstTemplateTypeParmType,
    SwiftAttrAttr,
    SwitchStmt,
    TParamCommandComment,
    TargetAttr,
    TemplateArgument,
    TemplateSpecializationType,
    TemplateTemplateParmDecl,
    TemplateTypeParmDecl,
    TemplateTypeParmType,
    TextComment,
    TranslationUnitDecl,
    TypeAliasDecl,
    TypeAliasTemplateDecl,
    TypeNullableAttr,
    TypeOfExprType,
    TypeRequirement,
    TypeTraitExpr,
    TypeVisibilityAttr,
    TypedefDecl,
    TypedefType,
    UnaryExprOrTypeTraitExpr,
    UnaryOperator,
    UnaryTransformType,
    UnavailableAttr,
    UnlikelyAttr,
    UnresolvedLookupExpr,
    UnresolvedMemberExpr,
    UnresolvedUsingIfExistsDecl,
    UnresolvedUsingType,
    UnresolvedUsingTypenameDecl,
    UnresolvedUsingValueDecl,
    UnusedAttr,
    UserDefinedLiteral,
    UsingDecl,
    UsingDirectiveDecl,
    UsingEnumDecl,
    UsingIfExistsAttr,
    UsingShadowDecl,
    UsingType,
    VTablePointerAuthenticationAttr,
    VarDecl,
    VarTemplateDecl,
    VarTemplatePartialSpecializationDecl,
    VarTemplateSpecializationDecl,
    VectorType,
    VerbatimBlockComment,
    VerbatimBlockLineComment,
    VerbatimLineComment,
    VisibilityAttr,
    WarnUnusedResultAttr,
    WeakAttr,
    WeakImportAttr,
    WeakRefAttr,
    WhileStmt,
    #[allow(non_camel_case_types)]
    null,
}
#[automatically_derived]
impl ::core::marker::Copy for Kind { }
#[automatically_derived]
impl ::core::clone::Clone for Kind {
    #[inline]
    fn clone(&self) -> Kind { *self }
}
#[automatically_derived]
impl ::core::cmp::Eq for Kind {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_receiver_is_total_eq(&self) -> () {}
}
#[automatically_derived]
impl ::core::marker::StructuralPartialEq for Kind { }
#[automatically_derived]
impl ::core::cmp::PartialEq for Kind {
    #[inline]
    fn eq(&self, other: &Kind) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr
    }
}
#[automatically_derived]
impl ::core::cmp::Ord for Kind {
    #[inline]
    fn cmp(&self, other: &Kind) -> ::core::cmp::Ordering {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        ::core::cmp::Ord::cmp(&__self_discr, &__arg1_discr)
    }
}
#[automatically_derived]
impl ::core::cmp::PartialOrd for Kind {
    #[inline]
    fn partial_cmp(&self, other: &Kind)
        -> ::core::option::Option<::core::cmp::Ordering> {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        ::core::cmp::PartialOrd::partial_cmp(&__self_discr, &__arg1_discr)
    }
}
#[automatically_derived]
impl ::core::hash::Hash for Kind {
    #[inline]
    fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) -> () {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        ::core::hash::Hash::hash(&__self_discr, state)
    }
}
fn as_str(kind: &Kind) -> &'static str {
    match kind {
        Kind::AbiTagAttr => "AbiTagAttr",
        Kind::AccessSpecDecl => "AccessSpecDecl",
        Kind::AliasAttr => "AliasAttr",
        Kind::AlignValueAttr => "AlignValueAttr",
        Kind::AlignedAttr => "AlignedAttr",
        Kind::AllocAlignAttr => "AllocAlignAttr",
        Kind::AllocSizeAttr => "AllocSizeAttr",
        Kind::AlwaysInlineAttr => "AlwaysInlineAttr",
        Kind::ArrayInitIndexExpr => "ArrayInitIndexExpr",
        Kind::ArrayInitLoopExpr => "ArrayInitLoopExpr",
        Kind::ArraySubscriptExpr => "ArraySubscriptExpr",
        Kind::ArrayTypeTraitExpr => "ArrayTypeTraitExpr",
        Kind::AsmLabelAttr => "AsmLabelAttr",
        Kind::AtomicExpr => "AtomicExpr",
        Kind::AtomicType => "AtomicType",
        Kind::AttributedStmt => "AttributedStmt",
        Kind::AttributedType => "AttributedType",
        Kind::AutoType => "AutoType",
        Kind::AvailabilityAttr => "AvailabilityAttr",
        Kind::AvailableOnlyInDefaultEvalMethodAttr =>
            "AvailableOnlyInDefaultEvalMethodAttr",
        Kind::BinaryConditionalOperator => "BinaryConditionalOperator",
        Kind::BinaryOperator => "BinaryOperator",
        Kind::BindingDecl => "BindingDecl",
        Kind::BlockCommandComment => "BlockCommandComment",
        Kind::BlockPointerType => "BlockPointerType",
        Kind::BreakStmt => "BreakStmt",
        Kind::BuiltinAttr => "BuiltinAttr",
        Kind::BuiltinBitCastExpr => "BuiltinBitCastExpr",
        Kind::BuiltinTemplateDecl => "BuiltinTemplateDecl",
        Kind::BuiltinType => "BuiltinType",
        Kind::CStyleCastExpr => "CStyleCastExpr",
        Kind::CXX11NoReturnAttr => "CXX11NoReturnAttr",
        Kind::CXXBindTemporaryExpr => "CXXBindTemporaryExpr",
        Kind::CXXBoolLiteralExpr => "CXXBoolLiteralExpr",
        Kind::CXXCatchStmt => "CXXCatchStmt",
        Kind::CXXConstCastExpr => "CXXConstCastExpr",
        Kind::CXXConstructExpr => "CXXConstructExpr",
        Kind::CXXConstructorDecl => "CXXConstructorDecl",
        Kind::CXXConversionDecl => "CXXConversionDecl",
        Kind::CXXCtorInitializer => "CXXCtorInitializer",
        Kind::CXXDeductionGuideDecl => "CXXDeductionGuideDecl",
        Kind::CXXDefaultArgExpr => "CXXDefaultArgExpr",
        Kind::CXXDefaultInitExpr => "CXXDefaultInitExpr",
        Kind::CXXDeleteExpr => "CXXDeleteExpr",
        Kind::CXXDependentScopeMemberExpr => "CXXDependentScopeMemberExpr",
        Kind::CXXDestructorDecl => "CXXDestructorDecl",
        Kind::CXXDynamicCastExpr => "CXXDynamicCastExpr",
        Kind::CXXFoldExpr => "CXXFoldExpr",
        Kind::CXXForRangeStmt => "CXXForRangeStmt",
        Kind::CXXFunctionalCastExpr => "CXXFunctionalCastExpr",
        Kind::CXXInheritedCtorInitExpr => "CXXInheritedCtorInitExpr",
        Kind::CXXMemberCallExpr => "CXXMemberCallExpr",
        Kind::CXXMethodDecl => "CXXMethodDecl",
        Kind::CXXNewExpr => "CXXNewExpr",
        Kind::CXXNoexceptExpr => "CXXNoexceptExpr",
        Kind::CXXNullPtrLiteralExpr => "CXXNullPtrLiteralExpr",
        Kind::CXXOperatorCallExpr => "CXXOperatorCallExpr",
        Kind::CXXPseudoDestructorExpr => "CXXPseudoDestructorExpr",
        Kind::CXXRecordDecl => "CXXRecordDecl",
        Kind::CXXReinterpretCastExpr => "CXXReinterpretCastExpr",
        Kind::CXXRewrittenBinaryOperator => "CXXRewrittenBinaryOperator",
        Kind::CXXScalarValueInitExpr => "CXXScalarValueInitExpr",
        Kind::CXXStaticCastExpr => "CXXStaticCastExpr",
        Kind::CXXTemporaryObjectExpr => "CXXTemporaryObjectExpr",
        Kind::CXXThisExpr => "CXXThisExpr",
        Kind::CXXThrowExpr => "CXXThrowExpr",
        Kind::CXXTryStmt => "CXXTryStmt",
        Kind::CXXTypeidExpr => "CXXTypeidExpr",
        Kind::CXXUnresolvedConstructExpr => "CXXUnresolvedConstructExpr",
        Kind::CallExpr => "CallExpr",
        Kind::CallbackAttr => "CallbackAttr",
        Kind::CaseStmt => "CaseStmt",
        Kind::CharacterLiteral => "CharacterLiteral",
        Kind::ClassScopeFunctionSpecializationDecl =>
            "ClassScopeFunctionSpecializationDecl",
        Kind::ClassTemplateDecl => "ClassTemplateDecl",
        Kind::ClassTemplatePartialSpecializationDecl =>
            "ClassTemplatePartialSpecializationDecl",
        Kind::ClassTemplateSpecializationDecl =>
            "ClassTemplateSpecializationDecl",
        Kind::ColdAttr => "ColdAttr",
        Kind::ComplexType => "ComplexType",
        Kind::CompoundAssignOperator => "CompoundAssignOperator",
        Kind::CompoundLiteralExpr => "CompoundLiteralExpr",
        Kind::CompoundRequirement => "CompoundRequirement",
        Kind::CompoundStmt => "CompoundStmt",
        Kind::ConceptDecl => "ConceptDecl",
        Kind::ConceptSpecializationExpr => "ConceptSpecializationExpr",
        Kind::ConditionalOperator => "ConditionalOperator",
        Kind::ConstAttr => "ConstAttr",
        Kind::ConstantArrayType => "ConstantArrayType",
        Kind::ConstantExpr => "ConstantExpr",
        Kind::ConstructorUsingShadowDecl => "ConstructorUsingShadowDecl",
        Kind::ContinueStmt => "ContinueStmt",
        Kind::ConvertVectorExpr => "ConvertVectorExpr",
        Kind::DLLImportAttr => "DLLImportAttr",
        Kind::DecayedType => "DecayedType",
        Kind::Decl => "Decl",
        Kind::DeclRefExpr => "DeclRefExpr",
        Kind::DeclStmt => "DeclStmt",
        Kind::DecltypeType => "DecltypeType",
        Kind::DecompositionDecl => "DecompositionDecl",
        Kind::DefaultStmt => "DefaultStmt",
        Kind::DependentNameType => "DependentNameType",
        Kind::DependentScopeDeclRefExpr => "DependentScopeDeclRefExpr",
        Kind::DependentSizedArrayType => "DependentSizedArrayType",
        Kind::DependentTemplateSpecializationType =>
            "DependentTemplateSpecializationType",
        Kind::DeprecatedAttr => "DeprecatedAttr",
        Kind::DesignatedInitExpr => "DesignatedInitExpr",
        Kind::DiagnoseIfAttr => "DiagnoseIfAttr",
        Kind::DisableTailCallsAttr => "DisableTailCallsAttr",
        Kind::DoStmt => "DoStmt",
        Kind::ElaboratedType => "ElaboratedType",
        Kind::EmptyDecl => "EmptyDecl",
        Kind::EnableIfAttr => "EnableIfAttr",
        Kind::EnumConstantDecl => "EnumConstantDecl",
        Kind::EnumDecl => "EnumDecl",
        Kind::EnumType => "EnumType",
        Kind::ExcludeFromExplicitInstantiationAttr =>
            "ExcludeFromExplicitInstantiationAttr",
        Kind::ExprWithCleanups => "ExprWithCleanups",
        Kind::FallThroughAttr => "FallThroughAttr",
        Kind::FieldDecl => "FieldDecl",
        Kind::FileScopeAsmDecl => "FileScopeAsmDecl",
        Kind::FinalAttr => "FinalAttr",
        Kind::FloatingLiteral => "FloatingLiteral",
        Kind::ForStmt => "ForStmt",
        Kind::FormatArgAttr => "FormatArgAttr",
        Kind::FormatAttr => "FormatAttr",
        Kind::FriendDecl => "FriendDecl",
        Kind::FullComment => "FullComment",
        Kind::FunctionDecl => "FunctionDecl",
        Kind::FunctionProtoType => "FunctionProtoType",
        Kind::FunctionTemplateDecl => "FunctionTemplateDecl",
        Kind::GCCAsmStmt => "GCCAsmStmt",
        Kind::GNUInlineAttr => "GNUInlineAttr",
        Kind::GNUNullExpr => "GNUNullExpr",
        Kind::GotoStmt => "GotoStmt",
        Kind::HTMLEndTagComment => "HTMLEndTagComment",
        Kind::HTMLStartTagComment => "HTMLStartTagComment",
        Kind::IfStmt => "IfStmt",
        Kind::ImplicitCastExpr => "ImplicitCastExpr",
        Kind::ImplicitConceptSpecializationDecl =>
            "ImplicitConceptSpecializationDecl",
        Kind::ImplicitValueInitExpr => "ImplicitValueInitExpr",
        Kind::IncompleteArrayType => "IncompleteArrayType",
        Kind::IndirectFieldDecl => "IndirectFieldDecl",
        Kind::IndirectGotoStmt => "IndirectGotoStmt",
        Kind::InitListExpr => "InitListExpr",
        Kind::InjectedClassNameType => "InjectedClassNameType",
        Kind::InlineCommandComment => "InlineCommandComment",
        Kind::IntegerLiteral => "IntegerLiteral",
        Kind::InternalLinkageAttr => "InternalLinkageAttr",
        Kind::LValueReferenceType => "LValueReferenceType",
        Kind::LabelStmt => "LabelStmt",
        Kind::LambdaExpr => "LambdaExpr",
        Kind::LifetimeBoundAttr => "LifetimeBoundAttr",
        Kind::LikelyAttr => "LikelyAttr",
        Kind::LinkageSpecDecl => "LinkageSpecDecl",
        Kind::MSAllocatorAttr => "MSAllocatorAttr",
        Kind::MSConstexprAttr => "MSConstexprAttr",
        Kind::MSNoVTableAttr => "MSNoVTableAttr",
        Kind::MSVtorDispAttr => "MSVtorDispAttr",
        Kind::MaterializeTemporaryExpr => "MaterializeTemporaryExpr",
        Kind::MaxFieldAlignmentAttr => "MaxFieldAlignmentAttr",
        Kind::MayAliasAttr => "MayAliasAttr",
        Kind::MemberExpr => "MemberExpr",
        Kind::MemberPointerType => "MemberPointerType",
        Kind::MinVectorWidthAttr => "MinVectorWidthAttr",
        Kind::ModeAttr => "ModeAttr",
        Kind::NamespaceAliasDecl => "NamespaceAliasDecl",
        Kind::NamespaceDecl => "NamespaceDecl",
        Kind::NestedRequirement => "NestedRequirement",
        Kind::NoAliasAttr => "NoAliasAttr",
        Kind::NoDebugAttr => "NoDebugAttr",
        Kind::NoEscapeAttr => "NoEscapeAttr",
        Kind::NoInlineAttr => "NoInlineAttr",
        Kind::NoSanitizeAttr => "NoSanitizeAttr",
        Kind::NoThrowAttr => "NoThrowAttr",
        Kind::NoUniqueAddressAttr => "NoUniqueAddressAttr",
        Kind::NonNullAttr => "NonNullAttr",
        Kind::NonTypeTemplateParmDecl => "NonTypeTemplateParmDecl",
        Kind::NullStmt => "NullStmt",
        Kind::OffsetOfExpr => "OffsetOfExpr",
        Kind::OpaqueValueExpr => "OpaqueValueExpr",
        Kind::OverrideAttr => "OverrideAttr",
        Kind::OwnerAttr => "OwnerAttr",
        Kind::PackExpansionExpr => "PackExpansionExpr",
        Kind::PackExpansionType => "PackExpansionType",
        Kind::PackedAttr => "PackedAttr",
        Kind::ParagraphComment => "ParagraphComment",
        Kind::ParamCommandComment => "ParamCommandComment",
        Kind::ParenExpr => "ParenExpr",
        Kind::ParenListExpr => "ParenListExpr",
        Kind::ParenType => "ParenType",
        Kind::ParmVarDecl => "ParmVarDecl",
        Kind::PointerAttr => "PointerAttr",
        Kind::PointerType => "PointerType",
        Kind::PragmaCommentDecl => "PragmaCommentDecl",
        Kind::PragmaDetectMismatchDecl => "PragmaDetectMismatchDecl",
        Kind::PredefinedExpr => "PredefinedExpr",
        Kind::PreferredNameAttr => "PreferredNameAttr",
        Kind::PureAttr => "PureAttr",
        Kind::QualType => "QualType",
        Kind::RValueReferenceType => "RValueReferenceType",
        Kind::RecordDecl => "RecordDecl",
        Kind::RecordType => "RecordType",
        Kind::RecoveryExpr => "RecoveryExpr",
        Kind::RequiresExpr => "RequiresExpr",
        Kind::RestrictAttr => "RestrictAttr",
        Kind::ReturnStmt => "ReturnStmt",
        Kind::ReturnsNonNullAttr => "ReturnsNonNullAttr",
        Kind::ReturnsTwiceAttr => "ReturnsTwiceAttr",
        Kind::SelectAnyAttr => "SelectAnyAttr",
        Kind::ShuffleVectorExpr => "ShuffleVectorExpr",
        Kind::SimpleRequirement => "SimpleRequirement",
        Kind::SizeOfPackExpr => "SizeOfPackExpr",
        Kind::SourceLocExpr => "SourceLocExpr",
        Kind::StandaloneDebugAttr => "StandaloneDebugAttr",
        Kind::StaticAssertDecl => "StaticAssertDecl",
        Kind::StmtExpr => "StmtExpr",
        Kind::StringLiteral => "StringLiteral",
        Kind::SubstNonTypeTemplateParmExpr => "SubstNonTypeTemplateParmExpr",
        Kind::SubstTemplateTypeParmPackType =>
            "SubstTemplateTypeParmPackType",
        Kind::SubstTemplateTypeParmType => "SubstTemplateTypeParmType",
        Kind::SwiftAttrAttr => "SwiftAttrAttr",
        Kind::SwitchStmt => "SwitchStmt",
        Kind::TParamCommandComment => "TParamCommandComment",
        Kind::TargetAttr => "TargetAttr",
        Kind::TemplateArgument => "TemplateArgument",
        Kind::TemplateSpecializationType => "TemplateSpecializationType",
        Kind::TemplateTemplateParmDecl => "TemplateTemplateParmDecl",
        Kind::TemplateTypeParmDecl => "TemplateTypeParmDecl",
        Kind::TemplateTypeParmType => "TemplateTypeParmType",
        Kind::TextComment => "TextComment",
        Kind::TranslationUnitDecl => "TranslationUnitDecl",
        Kind::TypeAliasDecl => "TypeAliasDecl",
        Kind::TypeAliasTemplateDecl => "TypeAliasTemplateDecl",
        Kind::TypeNullableAttr => "TypeNullableAttr",
        Kind::TypeOfExprType => "TypeOfExprType",
        Kind::TypeRequirement => "TypeRequirement",
        Kind::TypeTraitExpr => "TypeTraitExpr",
        Kind::TypeVisibilityAttr => "TypeVisibilityAttr",
        Kind::TypedefDecl => "TypedefDecl",
        Kind::TypedefType => "TypedefType",
        Kind::UnaryExprOrTypeTraitExpr => "UnaryExprOrTypeTraitExpr",
        Kind::UnaryOperator => "UnaryOperator",
        Kind::UnaryTransformType => "UnaryTransformType",
        Kind::UnavailableAttr => "UnavailableAttr",
        Kind::UnlikelyAttr => "UnlikelyAttr",
        Kind::UnresolvedLookupExpr => "UnresolvedLookupExpr",
        Kind::UnresolvedMemberExpr => "UnresolvedMemberExpr",
        Kind::UnresolvedUsingIfExistsDecl => "UnresolvedUsingIfExistsDecl",
        Kind::UnresolvedUsingType => "UnresolvedUsingType",
        Kind::UnresolvedUsingTypenameDecl => "UnresolvedUsingTypenameDecl",
        Kind::UnresolvedUsingValueDecl => "UnresolvedUsingValueDecl",
        Kind::UnusedAttr => "UnusedAttr",
        Kind::UserDefinedLiteral => "UserDefinedLiteral",
        Kind::UsingDecl => "UsingDecl",
        Kind::UsingDirectiveDecl => "UsingDirectiveDecl",
        Kind::UsingEnumDecl => "UsingEnumDecl",
        Kind::UsingIfExistsAttr => "UsingIfExistsAttr",
        Kind::UsingShadowDecl => "UsingShadowDecl",
        Kind::UsingType => "UsingType",
        Kind::VTablePointerAuthenticationAttr =>
            "VTablePointerAuthenticationAttr",
        Kind::VarDecl => "VarDecl",
        Kind::VarTemplateDecl => "VarTemplateDecl",
        Kind::VarTemplatePartialSpecializationDecl =>
            "VarTemplatePartialSpecializationDecl",
        Kind::VarTemplateSpecializationDecl =>
            "VarTemplateSpecializationDecl",
        Kind::VectorType => "VectorType",
        Kind::VerbatimBlockComment => "VerbatimBlockComment",
        Kind::VerbatimBlockLineComment => "VerbatimBlockLineComment",
        Kind::VerbatimLineComment => "VerbatimLineComment",
        Kind::VisibilityAttr => "VisibilityAttr",
        Kind::WarnUnusedResultAttr => "WarnUnusedResultAttr",
        Kind::WeakAttr => "WeakAttr",
        Kind::WeakImportAttr => "WeakImportAttr",
        Kind::WeakRefAttr => "WeakRefAttr",
        Kind::WhileStmt => "WhileStmt",
        Kind::null => "null",
    }
}
fn from_str(kind: &str) -> Result<Kind, ParseKindError> {
    match kind {
        "AbiTagAttr" => Ok(Kind::AbiTagAttr),
        "AccessSpecDecl" => Ok(Kind::AccessSpecDecl),
        "AliasAttr" => Ok(Kind::AliasAttr),
        "AlignValueAttr" => Ok(Kind::AlignValueAttr),
        "AlignedAttr" => Ok(Kind::AlignedAttr),
        "AllocAlignAttr" => Ok(Kind::AllocAlignAttr),
        "AllocSizeAttr" => Ok(Kind::AllocSizeAttr),
        "AlwaysInlineAttr" => Ok(Kind::AlwaysInlineAttr),
        "ArrayInitIndexExpr" => Ok(Kind::ArrayInitIndexExpr),
        "ArrayInitLoopExpr" => Ok(Kind::ArrayInitLoopExpr),
        "ArraySubscriptExpr" => Ok(Kind::ArraySubscriptExpr),
        "ArrayTypeTraitExpr" => Ok(Kind::ArrayTypeTraitExpr),
        "AsmLabelAttr" => Ok(Kind::AsmLabelAttr),
        "AtomicExpr" => Ok(Kind::AtomicExpr),
        "AtomicType" => Ok(Kind::AtomicType),
        "AttributedStmt" => Ok(Kind::AttributedStmt),
        "AttributedType" => Ok(Kind::AttributedType),
        "AutoType" => Ok(Kind::AutoType),
        "AvailabilityAttr" => Ok(Kind::AvailabilityAttr),
        "AvailableOnlyInDefaultEvalMethodAttr" =>
            Ok(Kind::AvailableOnlyInDefaultEvalMethodAttr),
        "BinaryConditionalOperator" => Ok(Kind::BinaryConditionalOperator),
        "BinaryOperator" => Ok(Kind::BinaryOperator),
        "BindingDecl" => Ok(Kind::BindingDecl),
        "BlockCommandComment" => Ok(Kind::BlockCommandComment),
        "BlockPointerType" => Ok(Kind::BlockPointerType),
        "BreakStmt" => Ok(Kind::BreakStmt),
        "BuiltinAttr" => Ok(Kind::BuiltinAttr),
        "BuiltinBitCastExpr" => Ok(Kind::BuiltinBitCastExpr),
        "BuiltinTemplateDecl" => Ok(Kind::BuiltinTemplateDecl),
        "BuiltinType" => Ok(Kind::BuiltinType),
        "CStyleCastExpr" => Ok(Kind::CStyleCastExpr),
        "CXX11NoReturnAttr" => Ok(Kind::CXX11NoReturnAttr),
        "CXXBindTemporaryExpr" => Ok(Kind::CXXBindTemporaryExpr),
        "CXXBoolLiteralExpr" => Ok(Kind::CXXBoolLiteralExpr),
        "CXXCatchStmt" => Ok(Kind::CXXCatchStmt),
        "CXXConstCastExpr" => Ok(Kind::CXXConstCastExpr),
        "CXXConstructExpr" => Ok(Kind::CXXConstructExpr),
        "CXXConstructorDecl" => Ok(Kind::CXXConstructorDecl),
        "CXXConversionDecl" => Ok(Kind::CXXConversionDecl),
        "CXXCtorInitializer" => Ok(Kind::CXXCtorInitializer),
        "CXXDeductionGuideDecl" => Ok(Kind::CXXDeductionGuideDecl),
        "CXXDefaultArgExpr" => Ok(Kind::CXXDefaultArgExpr),
        "CXXDefaultInitExpr" => Ok(Kind::CXXDefaultInitExpr),
        "CXXDeleteExpr" => Ok(Kind::CXXDeleteExpr),
        "CXXDependentScopeMemberExpr" =>
            Ok(Kind::CXXDependentScopeMemberExpr),
        "CXXDestructorDecl" => Ok(Kind::CXXDestructorDecl),
        "CXXDynamicCastExpr" => Ok(Kind::CXXDynamicCastExpr),
        "CXXFoldExpr" => Ok(Kind::CXXFoldExpr),
        "CXXForRangeStmt" => Ok(Kind::CXXForRangeStmt),
        "CXXFunctionalCastExpr" => Ok(Kind::CXXFunctionalCastExpr),
        "CXXInheritedCtorInitExpr" => Ok(Kind::CXXInheritedCtorInitExpr),
        "CXXMemberCallExpr" => Ok(Kind::CXXMemberCallExpr),
        "CXXMethodDecl" => Ok(Kind::CXXMethodDecl),
        "CXXNewExpr" => Ok(Kind::CXXNewExpr),
        "CXXNoexceptExpr" => Ok(Kind::CXXNoexceptExpr),
        "CXXNullPtrLiteralExpr" => Ok(Kind::CXXNullPtrLiteralExpr),
        "CXXOperatorCallExpr" => Ok(Kind::CXXOperatorCallExpr),
        "CXXPseudoDestructorExpr" => Ok(Kind::CXXPseudoDestructorExpr),
        "CXXRecordDecl" => Ok(Kind::CXXRecordDecl),
        "CXXReinterpretCastExpr" => Ok(Kind::CXXReinterpretCastExpr),
        "CXXRewrittenBinaryOperator" => Ok(Kind::CXXRewrittenBinaryOperator),
        "CXXScalarValueInitExpr" => Ok(Kind::CXXScalarValueInitExpr),
        "CXXStaticCastExpr" => Ok(Kind::CXXStaticCastExpr),
        "CXXTemporaryObjectExpr" => Ok(Kind::CXXTemporaryObjectExpr),
        "CXXThisExpr" => Ok(Kind::CXXThisExpr),
        "CXXThrowExpr" => Ok(Kind::CXXThrowExpr),
        "CXXTryStmt" => Ok(Kind::CXXTryStmt),
        "CXXTypeidExpr" => Ok(Kind::CXXTypeidExpr),
        "CXXUnresolvedConstructExpr" => Ok(Kind::CXXUnresolvedConstructExpr),
        "CallExpr" => Ok(Kind::CallExpr),
        "CallbackAttr" => Ok(Kind::CallbackAttr),
        "CaseStmt" => Ok(Kind::CaseStmt),
        "CharacterLiteral" => Ok(Kind::CharacterLiteral),
        "ClassScopeFunctionSpecializationDecl" =>
            Ok(Kind::ClassScopeFunctionSpecializationDecl),
        "ClassTemplateDecl" => Ok(Kind::ClassTemplateDecl),
        "ClassTemplatePartialSpecializationDecl" =>
            Ok(Kind::ClassTemplatePartialSpecializationDecl),
        "ClassTemplateSpecializationDecl" =>
            Ok(Kind::ClassTemplateSpecializationDecl),
        "ColdAttr" => Ok(Kind::ColdAttr),
        "ComplexType" => Ok(Kind::ComplexType),
        "CompoundAssignOperator" => Ok(Kind::CompoundAssignOperator),
        "CompoundLiteralExpr" => Ok(Kind::CompoundLiteralExpr),
        "CompoundRequirement" => Ok(Kind::CompoundRequirement),
        "CompoundStmt" => Ok(Kind::CompoundStmt),
        "ConceptDecl" => Ok(Kind::ConceptDecl),
        "ConceptSpecializationExpr" => Ok(Kind::ConceptSpecializationExpr),
        "ConditionalOperator" => Ok(Kind::ConditionalOperator),
        "ConstAttr" => Ok(Kind::ConstAttr),
        "ConstantArrayType" => Ok(Kind::ConstantArrayType),
        "ConstantExpr" => Ok(Kind::ConstantExpr),
        "ConstructorUsingShadowDecl" => Ok(Kind::ConstructorUsingShadowDecl),
        "ContinueStmt" => Ok(Kind::ContinueStmt),
        "ConvertVectorExpr" => Ok(Kind::ConvertVectorExpr),
        "DLLImportAttr" => Ok(Kind::DLLImportAttr),
        "DecayedType" => Ok(Kind::DecayedType),
        "Decl" => Ok(Kind::Decl),
        "DeclRefExpr" => Ok(Kind::DeclRefExpr),
        "DeclStmt" => Ok(Kind::DeclStmt),
        "DecltypeType" => Ok(Kind::DecltypeType),
        "DecompositionDecl" => Ok(Kind::DecompositionDecl),
        "DefaultStmt" => Ok(Kind::DefaultStmt),
        "DependentNameType" => Ok(Kind::DependentNameType),
        "DependentScopeDeclRefExpr" => Ok(Kind::DependentScopeDeclRefExpr),
        "DependentSizedArrayType" => Ok(Kind::DependentSizedArrayType),
        "DependentTemplateSpecializationType" =>
            Ok(Kind::DependentTemplateSpecializationType),
        "DeprecatedAttr" => Ok(Kind::DeprecatedAttr),
        "DesignatedInitExpr" => Ok(Kind::DesignatedInitExpr),
        "DiagnoseIfAttr" => Ok(Kind::DiagnoseIfAttr),
        "DisableTailCallsAttr" => Ok(Kind::DisableTailCallsAttr),
        "DoStmt" => Ok(Kind::DoStmt),
        "ElaboratedType" => Ok(Kind::ElaboratedType),
        "EmptyDecl" => Ok(Kind::EmptyDecl),
        "EnableIfAttr" => Ok(Kind::EnableIfAttr),
        "EnumConstantDecl" => Ok(Kind::EnumConstantDecl),
        "EnumDecl" => Ok(Kind::EnumDecl),
        "EnumType" => Ok(Kind::EnumType),
        "ExcludeFromExplicitInstantiationAttr" =>
            Ok(Kind::ExcludeFromExplicitInstantiationAttr),
        "ExprWithCleanups" => Ok(Kind::ExprWithCleanups),
        "FallThroughAttr" => Ok(Kind::FallThroughAttr),
        "FieldDecl" => Ok(Kind::FieldDecl),
        "FileScopeAsmDecl" => Ok(Kind::FileScopeAsmDecl),
        "FinalAttr" => Ok(Kind::FinalAttr),
        "FloatingLiteral" => Ok(Kind::FloatingLiteral),
        "ForStmt" => Ok(Kind::ForStmt),
        "FormatArgAttr" => Ok(Kind::FormatArgAttr),
        "FormatAttr" => Ok(Kind::FormatAttr),
        "FriendDecl" => Ok(Kind::FriendDecl),
        "FullComment" => Ok(Kind::FullComment),
        "FunctionDecl" => Ok(Kind::FunctionDecl),
        "FunctionProtoType" => Ok(Kind::FunctionProtoType),
        "FunctionTemplateDecl" => Ok(Kind::FunctionTemplateDecl),
        "GCCAsmStmt" => Ok(Kind::GCCAsmStmt),
        "GNUInlineAttr" => Ok(Kind::GNUInlineAttr),
        "GNUNullExpr" => Ok(Kind::GNUNullExpr),
        "GotoStmt" => Ok(Kind::GotoStmt),
        "HTMLEndTagComment" => Ok(Kind::HTMLEndTagComment),
        "HTMLStartTagComment" => Ok(Kind::HTMLStartTagComment),
        "IfStmt" => Ok(Kind::IfStmt),
        "ImplicitCastExpr" => Ok(Kind::ImplicitCastExpr),
        "ImplicitConceptSpecializationDecl" =>
            Ok(Kind::ImplicitConceptSpecializationDecl),
        "ImplicitValueInitExpr" => Ok(Kind::ImplicitValueInitExpr),
        "IncompleteArrayType" => Ok(Kind::IncompleteArrayType),
        "IndirectFieldDecl" => Ok(Kind::IndirectFieldDecl),
        "IndirectGotoStmt" => Ok(Kind::IndirectGotoStmt),
        "InitListExpr" => Ok(Kind::InitListExpr),
        "InjectedClassNameType" => Ok(Kind::InjectedClassNameType),
        "InlineCommandComment" => Ok(Kind::InlineCommandComment),
        "IntegerLiteral" => Ok(Kind::IntegerLiteral),
        "InternalLinkageAttr" => Ok(Kind::InternalLinkageAttr),
        "LValueReferenceType" => Ok(Kind::LValueReferenceType),
        "LabelStmt" => Ok(Kind::LabelStmt),
        "LambdaExpr" => Ok(Kind::LambdaExpr),
        "LifetimeBoundAttr" => Ok(Kind::LifetimeBoundAttr),
        "LikelyAttr" => Ok(Kind::LikelyAttr),
        "LinkageSpecDecl" => Ok(Kind::LinkageSpecDecl),
        "MSAllocatorAttr" => Ok(Kind::MSAllocatorAttr),
        "MSConstexprAttr" => Ok(Kind::MSConstexprAttr),
        "MSNoVTableAttr" => Ok(Kind::MSNoVTableAttr),
        "MSVtorDispAttr" => Ok(Kind::MSVtorDispAttr),
        "MaterializeTemporaryExpr" => Ok(Kind::MaterializeTemporaryExpr),
        "MaxFieldAlignmentAttr" => Ok(Kind::MaxFieldAlignmentAttr),
        "MayAliasAttr" => Ok(Kind::MayAliasAttr),
        "MemberExpr" => Ok(Kind::MemberExpr),
        "MemberPointerType" => Ok(Kind::MemberPointerType),
        "MinVectorWidthAttr" => Ok(Kind::MinVectorWidthAttr),
        "ModeAttr" => Ok(Kind::ModeAttr),
        "NamespaceAliasDecl" => Ok(Kind::NamespaceAliasDecl),
        "NamespaceDecl" => Ok(Kind::NamespaceDecl),
        "NestedRequirement" => Ok(Kind::NestedRequirement),
        "NoAliasAttr" => Ok(Kind::NoAliasAttr),
        "NoDebugAttr" => Ok(Kind::NoDebugAttr),
        "NoEscapeAttr" => Ok(Kind::NoEscapeAttr),
        "NoInlineAttr" => Ok(Kind::NoInlineAttr),
        "NoSanitizeAttr" => Ok(Kind::NoSanitizeAttr),
        "NoThrowAttr" => Ok(Kind::NoThrowAttr),
        "NoUniqueAddressAttr" => Ok(Kind::NoUniqueAddressAttr),
        "NonNullAttr" => Ok(Kind::NonNullAttr),
        "NonTypeTemplateParmDecl" => Ok(Kind::NonTypeTemplateParmDecl),
        "NullStmt" => Ok(Kind::NullStmt),
        "OffsetOfExpr" => Ok(Kind::OffsetOfExpr),
        "OpaqueValueExpr" => Ok(Kind::OpaqueValueExpr),
        "OverrideAttr" => Ok(Kind::OverrideAttr),
        "OwnerAttr" => Ok(Kind::OwnerAttr),
        "PackExpansionExpr" => Ok(Kind::PackExpansionExpr),
        "PackExpansionType" => Ok(Kind::PackExpansionType),
        "PackedAttr" => Ok(Kind::PackedAttr),
        "ParagraphComment" => Ok(Kind::ParagraphComment),
        "ParamCommandComment" => Ok(Kind::ParamCommandComment),
        "ParenExpr" => Ok(Kind::ParenExpr),
        "ParenListExpr" => Ok(Kind::ParenListExpr),
        "ParenType" => Ok(Kind::ParenType),
        "ParmVarDecl" => Ok(Kind::ParmVarDecl),
        "PointerAttr" => Ok(Kind::PointerAttr),
        "PointerType" => Ok(Kind::PointerType),
        "PragmaCommentDecl" => Ok(Kind::PragmaCommentDecl),
        "PragmaDetectMismatchDecl" => Ok(Kind::PragmaDetectMismatchDecl),
        "PredefinedExpr" => Ok(Kind::PredefinedExpr),
        "PreferredNameAttr" => Ok(Kind::PreferredNameAttr),
        "PureAttr" => Ok(Kind::PureAttr),
        "QualType" => Ok(Kind::QualType),
        "RValueReferenceType" => Ok(Kind::RValueReferenceType),
        "RecordDecl" => Ok(Kind::RecordDecl),
        "RecordType" => Ok(Kind::RecordType),
        "RecoveryExpr" => Ok(Kind::RecoveryExpr),
        "RequiresExpr" => Ok(Kind::RequiresExpr),
        "RestrictAttr" => Ok(Kind::RestrictAttr),
        "ReturnStmt" => Ok(Kind::ReturnStmt),
        "ReturnsNonNullAttr" => Ok(Kind::ReturnsNonNullAttr),
        "ReturnsTwiceAttr" => Ok(Kind::ReturnsTwiceAttr),
        "SelectAnyAttr" => Ok(Kind::SelectAnyAttr),
        "ShuffleVectorExpr" => Ok(Kind::ShuffleVectorExpr),
        "SimpleRequirement" => Ok(Kind::SimpleRequirement),
        "SizeOfPackExpr" => Ok(Kind::SizeOfPackExpr),
        "SourceLocExpr" => Ok(Kind::SourceLocExpr),
        "StandaloneDebugAttr" => Ok(Kind::StandaloneDebugAttr),
        "StaticAssertDecl" => Ok(Kind::StaticAssertDecl),
        "StmtExpr" => Ok(Kind::StmtExpr),
        "StringLiteral" => Ok(Kind::StringLiteral),
        "SubstNonTypeTemplateParmExpr" =>
            Ok(Kind::SubstNonTypeTemplateParmExpr),
        "SubstTemplateTypeParmPackType" =>
            Ok(Kind::SubstTemplateTypeParmPackType),
        "SubstTemplateTypeParmType" => Ok(Kind::SubstTemplateTypeParmType),
        "SwiftAttrAttr" => Ok(Kind::SwiftAttrAttr),
        "SwitchStmt" => Ok(Kind::SwitchStmt),
        "TParamCommandComment" => Ok(Kind::TParamCommandComment),
        "TargetAttr" => Ok(Kind::TargetAttr),
        "TemplateArgument" => Ok(Kind::TemplateArgument),
        "TemplateSpecializationType" => Ok(Kind::TemplateSpecializationType),
        "TemplateTemplateParmDecl" => Ok(Kind::TemplateTemplateParmDecl),
        "TemplateTypeParmDecl" => Ok(Kind::TemplateTypeParmDecl),
        "TemplateTypeParmType" => Ok(Kind::TemplateTypeParmType),
        "TextComment" => Ok(Kind::TextComment),
        "TranslationUnitDecl" => Ok(Kind::TranslationUnitDecl),
        "TypeAliasDecl" => Ok(Kind::TypeAliasDecl),
        "TypeAliasTemplateDecl" => Ok(Kind::TypeAliasTemplateDecl),
        "TypeNullableAttr" => Ok(Kind::TypeNullableAttr),
        "TypeOfExprType" => Ok(Kind::TypeOfExprType),
        "TypeRequirement" => Ok(Kind::TypeRequirement),
        "TypeTraitExpr" => Ok(Kind::TypeTraitExpr),
        "TypeVisibilityAttr" => Ok(Kind::TypeVisibilityAttr),
        "TypedefDecl" => Ok(Kind::TypedefDecl),
        "TypedefType" => Ok(Kind::TypedefType),
        "UnaryExprOrTypeTraitExpr" => Ok(Kind::UnaryExprOrTypeTraitExpr),
        "UnaryOperator" => Ok(Kind::UnaryOperator),
        "UnaryTransformType" => Ok(Kind::UnaryTransformType),
        "UnavailableAttr" => Ok(Kind::UnavailableAttr),
        "UnlikelyAttr" => Ok(Kind::UnlikelyAttr),
        "UnresolvedLookupExpr" => Ok(Kind::UnresolvedLookupExpr),
        "UnresolvedMemberExpr" => Ok(Kind::UnresolvedMemberExpr),
        "UnresolvedUsingIfExistsDecl" =>
            Ok(Kind::UnresolvedUsingIfExistsDecl),
        "UnresolvedUsingType" => Ok(Kind::UnresolvedUsingType),
        "UnresolvedUsingTypenameDecl" =>
            Ok(Kind::UnresolvedUsingTypenameDecl),
        "UnresolvedUsingValueDecl" => Ok(Kind::UnresolvedUsingValueDecl),
        "UnusedAttr" => Ok(Kind::UnusedAttr),
        "UserDefinedLiteral" => Ok(Kind::UserDefinedLiteral),
        "UsingDecl" => Ok(Kind::UsingDecl),
        "UsingDirectiveDecl" => Ok(Kind::UsingDirectiveDecl),
        "UsingEnumDecl" => Ok(Kind::UsingEnumDecl),
        "UsingIfExistsAttr" => Ok(Kind::UsingIfExistsAttr),
        "UsingShadowDecl" => Ok(Kind::UsingShadowDecl),
        "UsingType" => Ok(Kind::UsingType),
        "VTablePointerAuthenticationAttr" =>
            Ok(Kind::VTablePointerAuthenticationAttr),
        "VarDecl" => Ok(Kind::VarDecl),
        "VarTemplateDecl" => Ok(Kind::VarTemplateDecl),
        "VarTemplatePartialSpecializationDecl" =>
            Ok(Kind::VarTemplatePartialSpecializationDecl),
        "VarTemplateSpecializationDecl" =>
            Ok(Kind::VarTemplateSpecializationDecl),
        "VectorType" => Ok(Kind::VectorType),
        "VerbatimBlockComment" => Ok(Kind::VerbatimBlockComment),
        "VerbatimBlockLineComment" => Ok(Kind::VerbatimBlockLineComment),
        "VerbatimLineComment" => Ok(Kind::VerbatimLineComment),
        "VisibilityAttr" => Ok(Kind::VisibilityAttr),
        "WarnUnusedResultAttr" => Ok(Kind::WarnUnusedResultAttr),
        "WeakAttr" => Ok(Kind::WeakAttr),
        "WeakImportAttr" => Ok(Kind::WeakImportAttr),
        "WeakRefAttr" => Ok(Kind::WeakRefAttr),
        "WhileStmt" => Ok(Kind::WhileStmt),
        _other => Err(ParseKindError { _private: () }),
    }
}
static VARIANTS: &'static [&'static str] =
    &["AbiTagAttr", "AccessSpecDecl", "AliasAttr", "AlignValueAttr",
                "AlignedAttr", "AllocAlignAttr", "AllocSizeAttr",
                "AlwaysInlineAttr", "ArrayInitIndexExpr", "ArrayInitLoopExpr",
                "ArraySubscriptExpr", "ArrayTypeTraitExpr", "AsmLabelAttr",
                "AtomicExpr", "AtomicType", "AttributedStmt",
                "AttributedType", "AutoType", "AvailabilityAttr",
                "AvailableOnlyInDefaultEvalMethodAttr",
                "BinaryConditionalOperator", "BinaryOperator", "BindingDecl",
                "BlockCommandComment", "BlockPointerType", "BreakStmt",
                "BuiltinAttr", "BuiltinBitCastExpr", "BuiltinTemplateDecl",
                "BuiltinType", "CStyleCastExpr", "CXX11NoReturnAttr",
                "CXXBindTemporaryExpr", "CXXBoolLiteralExpr", "CXXCatchStmt",
                "CXXConstCastExpr", "CXXConstructExpr", "CXXConstructorDecl",
                "CXXConversionDecl", "CXXCtorInitializer",
                "CXXDeductionGuideDecl", "CXXDefaultArgExpr",
                "CXXDefaultInitExpr", "CXXDeleteExpr",
                "CXXDependentScopeMemberExpr", "CXXDestructorDecl",
                "CXXDynamicCastExpr", "CXXFoldExpr", "CXXForRangeStmt",
                "CXXFunctionalCastExpr", "CXXInheritedCtorInitExpr",
                "CXXMemberCallExpr", "CXXMethodDecl", "CXXNewExpr",
                "CXXNoexceptExpr", "CXXNullPtrLiteralExpr",
                "CXXOperatorCallExpr", "CXXPseudoDestructorExpr",
                "CXXRecordDecl", "CXXReinterpretCastExpr",
                "CXXRewrittenBinaryOperator", "CXXScalarValueInitExpr",
                "CXXStaticCastExpr", "CXXTemporaryObjectExpr", "CXXThisExpr",
                "CXXThrowExpr", "CXXTryStmt", "CXXTypeidExpr",
                "CXXUnresolvedConstructExpr", "CallExpr", "CallbackAttr",
                "CaseStmt", "CharacterLiteral",
                "ClassScopeFunctionSpecializationDecl", "ClassTemplateDecl",
                "ClassTemplatePartialSpecializationDecl",
                "ClassTemplateSpecializationDecl", "ColdAttr", "ComplexType",
                "CompoundAssignOperator", "CompoundLiteralExpr",
                "CompoundRequirement", "CompoundStmt", "ConceptDecl",
                "ConceptSpecializationExpr", "ConditionalOperator",
                "ConstAttr", "ConstantArrayType", "ConstantExpr",
                "ConstructorUsingShadowDecl", "ContinueStmt",
                "ConvertVectorExpr", "DLLImportAttr", "DecayedType", "Decl",
                "DeclRefExpr", "DeclStmt", "DecltypeType",
                "DecompositionDecl", "DefaultStmt", "DependentNameType",
                "DependentScopeDeclRefExpr", "DependentSizedArrayType",
                "DependentTemplateSpecializationType", "DeprecatedAttr",
                "DesignatedInitExpr", "DiagnoseIfAttr",
                "DisableTailCallsAttr", "DoStmt", "ElaboratedType",
                "EmptyDecl", "EnableIfAttr", "EnumConstantDecl", "EnumDecl",
                "EnumType", "ExcludeFromExplicitInstantiationAttr",
                "ExprWithCleanups", "FallThroughAttr", "FieldDecl",
                "FileScopeAsmDecl", "FinalAttr", "FloatingLiteral", "ForStmt",
                "FormatArgAttr", "FormatAttr", "FriendDecl", "FullComment",
                "FunctionDecl", "FunctionProtoType", "FunctionTemplateDecl",
                "GCCAsmStmt", "GNUInlineAttr", "GNUNullExpr", "GotoStmt",
                "HTMLEndTagComment", "HTMLStartTagComment", "IfStmt",
                "ImplicitCastExpr", "ImplicitConceptSpecializationDecl",
                "ImplicitValueInitExpr", "IncompleteArrayType",
                "IndirectFieldDecl", "IndirectGotoStmt", "InitListExpr",
                "InjectedClassNameType", "InlineCommandComment",
                "IntegerLiteral", "InternalLinkageAttr",
                "LValueReferenceType", "LabelStmt", "LambdaExpr",
                "LifetimeBoundAttr", "LikelyAttr", "LinkageSpecDecl",
                "MSAllocatorAttr", "MSConstexprAttr", "MSNoVTableAttr",
                "MSVtorDispAttr", "MaterializeTemporaryExpr",
                "MaxFieldAlignmentAttr", "MayAliasAttr", "MemberExpr",
                "MemberPointerType", "MinVectorWidthAttr", "ModeAttr",
                "NamespaceAliasDecl", "NamespaceDecl", "NestedRequirement",
                "NoAliasAttr", "NoDebugAttr", "NoEscapeAttr", "NoInlineAttr",
                "NoSanitizeAttr", "NoThrowAttr", "NoUniqueAddressAttr",
                "NonNullAttr", "NonTypeTemplateParmDecl", "NullStmt",
                "OffsetOfExpr", "OpaqueValueExpr", "OverrideAttr",
                "OwnerAttr", "PackExpansionExpr", "PackExpansionType",
                "PackedAttr", "ParagraphComment", "ParamCommandComment",
                "ParenExpr", "ParenListExpr", "ParenType", "ParmVarDecl",
                "PointerAttr", "PointerType", "PragmaCommentDecl",
                "PragmaDetectMismatchDecl", "PredefinedExpr",
                "PreferredNameAttr", "PureAttr", "QualType",
                "RValueReferenceType", "RecordDecl", "RecordType",
                "RecoveryExpr", "RequiresExpr", "RestrictAttr", "ReturnStmt",
                "ReturnsNonNullAttr", "ReturnsTwiceAttr", "SelectAnyAttr",
                "ShuffleVectorExpr", "SimpleRequirement", "SizeOfPackExpr",
                "SourceLocExpr", "StandaloneDebugAttr", "StaticAssertDecl",
                "StmtExpr", "StringLiteral", "SubstNonTypeTemplateParmExpr",
                "SubstTemplateTypeParmPackType", "SubstTemplateTypeParmType",
                "SwiftAttrAttr", "SwitchStmt", "TParamCommandComment",
                "TargetAttr", "TemplateArgument",
                "TemplateSpecializationType", "TemplateTemplateParmDecl",
                "TemplateTypeParmDecl", "TemplateTypeParmType", "TextComment",
                "TranslationUnitDecl", "TypeAliasDecl",
                "TypeAliasTemplateDecl", "TypeNullableAttr", "TypeOfExprType",
                "TypeRequirement", "TypeTraitExpr", "TypeVisibilityAttr",
                "TypedefDecl", "TypedefType", "UnaryExprOrTypeTraitExpr",
                "UnaryOperator", "UnaryTransformType", "UnavailableAttr",
                "UnlikelyAttr", "UnresolvedLookupExpr",
                "UnresolvedMemberExpr", "UnresolvedUsingIfExistsDecl",
                "UnresolvedUsingType", "UnresolvedUsingTypenameDecl",
                "UnresolvedUsingValueDecl", "UnusedAttr",
                "UserDefinedLiteral", "UsingDecl", "UsingDirectiveDecl",
                "UsingEnumDecl", "UsingIfExistsAttr", "UsingShadowDecl",
                "UsingType", "VTablePointerAuthenticationAttr", "VarDecl",
                "VarTemplateDecl", "VarTemplatePartialSpecializationDecl",
                "VarTemplateSpecializationDecl", "VectorType",
                "VerbatimBlockComment", "VerbatimBlockLineComment",
                "VerbatimLineComment", "VisibilityAttr",
                "WarnUnusedResultAttr", "WeakAttr", "WeakImportAttr",
                "WeakRefAttr", "WhileStmt"];kind! {
50    AbiTagAttr,
51    AccessSpecDecl,
52    AliasAttr,
53    AlignValueAttr,
54    AlignedAttr,
55    AllocAlignAttr,
56    AllocSizeAttr,
57    AlwaysInlineAttr,
58    ArrayInitIndexExpr,
59    ArrayInitLoopExpr,
60    ArraySubscriptExpr,
61    ArrayTypeTraitExpr,
62    AsmLabelAttr,
63    AtomicExpr,
64    AtomicType,
65    AttributedStmt,
66    AttributedType,
67    AutoType,
68    AvailabilityAttr,
69    AvailableOnlyInDefaultEvalMethodAttr,
70    BinaryConditionalOperator,
71    BinaryOperator,
72    BindingDecl,
73    BlockCommandComment,
74    BlockPointerType,
75    BreakStmt,
76    BuiltinAttr,
77    BuiltinBitCastExpr,
78    BuiltinTemplateDecl,
79    BuiltinType,
80    CStyleCastExpr,
81    CXX11NoReturnAttr,
82    CXXBindTemporaryExpr,
83    CXXBoolLiteralExpr,
84    CXXCatchStmt,
85    CXXConstCastExpr,
86    CXXConstructExpr,
87    CXXConstructorDecl,
88    CXXConversionDecl,
89    CXXCtorInitializer,
90    CXXDeductionGuideDecl,
91    CXXDefaultArgExpr,
92    CXXDefaultInitExpr,
93    CXXDeleteExpr,
94    CXXDependentScopeMemberExpr,
95    CXXDestructorDecl,
96    CXXDynamicCastExpr,
97    CXXFoldExpr,
98    CXXForRangeStmt,
99    CXXFunctionalCastExpr,
100    CXXInheritedCtorInitExpr,
101    CXXMemberCallExpr,
102    CXXMethodDecl,
103    CXXNewExpr,
104    CXXNoexceptExpr,
105    CXXNullPtrLiteralExpr,
106    CXXOperatorCallExpr,
107    CXXPseudoDestructorExpr,
108    CXXRecordDecl,
109    CXXReinterpretCastExpr,
110    CXXRewrittenBinaryOperator,
111    CXXScalarValueInitExpr,
112    CXXStaticCastExpr,
113    CXXTemporaryObjectExpr,
114    CXXThisExpr,
115    CXXThrowExpr,
116    CXXTryStmt,
117    CXXTypeidExpr,
118    CXXUnresolvedConstructExpr,
119    CallExpr,
120    CallbackAttr,
121    CaseStmt,
122    CharacterLiteral,
123    ClassScopeFunctionSpecializationDecl,
124    ClassTemplateDecl,
125    ClassTemplatePartialSpecializationDecl,
126    ClassTemplateSpecializationDecl,
127    ColdAttr,
128    ComplexType,
129    CompoundAssignOperator,
130    CompoundLiteralExpr,
131    CompoundRequirement,
132    CompoundStmt,
133    ConceptDecl,
134    ConceptSpecializationExpr,
135    ConditionalOperator,
136    ConstAttr,
137    ConstantArrayType,
138    ConstantExpr,
139    ConstructorUsingShadowDecl,
140    ContinueStmt,
141    ConvertVectorExpr,
142    DLLImportAttr,
143    DecayedType,
144    Decl,
145    DeclRefExpr,
146    DeclStmt,
147    DecltypeType,
148    DecompositionDecl,
149    DefaultStmt,
150    DependentNameType,
151    DependentScopeDeclRefExpr,
152    DependentSizedArrayType,
153    DependentTemplateSpecializationType,
154    DeprecatedAttr,
155    DesignatedInitExpr,
156    DiagnoseIfAttr,
157    DisableTailCallsAttr,
158    DoStmt,
159    ElaboratedType,
160    EmptyDecl,
161    EnableIfAttr,
162    EnumConstantDecl,
163    EnumDecl,
164    EnumType,
165    ExcludeFromExplicitInstantiationAttr,
166    ExprWithCleanups,
167    FallThroughAttr,
168    FieldDecl,
169    FileScopeAsmDecl,
170    FinalAttr,
171    FloatingLiteral,
172    ForStmt,
173    FormatArgAttr,
174    FormatAttr,
175    FriendDecl,
176    FullComment,
177    FunctionDecl,
178    FunctionProtoType,
179    FunctionTemplateDecl,
180    GCCAsmStmt,
181    GNUInlineAttr,
182    GNUNullExpr,
183    GotoStmt,
184    HTMLEndTagComment,
185    HTMLStartTagComment,
186    IfStmt,
187    ImplicitCastExpr,
188    ImplicitConceptSpecializationDecl,
189    ImplicitValueInitExpr,
190    IncompleteArrayType,
191    IndirectFieldDecl,
192    IndirectGotoStmt,
193    InitListExpr,
194    InjectedClassNameType,
195    InlineCommandComment,
196    IntegerLiteral,
197    InternalLinkageAttr,
198    LValueReferenceType,
199    LabelStmt,
200    LambdaExpr,
201    LifetimeBoundAttr,
202    LikelyAttr,
203    LinkageSpecDecl,
204    MSAllocatorAttr,
205    MSConstexprAttr,
206    MSNoVTableAttr,
207    MSVtorDispAttr,
208    MaterializeTemporaryExpr,
209    MaxFieldAlignmentAttr,
210    MayAliasAttr,
211    MemberExpr,
212    MemberPointerType,
213    MinVectorWidthAttr,
214    ModeAttr,
215    NamespaceAliasDecl,
216    NamespaceDecl,
217    NestedRequirement,
218    NoAliasAttr,
219    NoDebugAttr,
220    NoEscapeAttr,
221    NoInlineAttr,
222    NoSanitizeAttr,
223    NoThrowAttr,
224    NoUniqueAddressAttr,
225    NonNullAttr,
226    NonTypeTemplateParmDecl,
227    NullStmt,
228    OffsetOfExpr,
229    OpaqueValueExpr,
230    OverrideAttr,
231    OwnerAttr,
232    PackExpansionExpr,
233    PackExpansionType,
234    PackedAttr,
235    ParagraphComment,
236    ParamCommandComment,
237    ParenExpr,
238    ParenListExpr,
239    ParenType,
240    ParmVarDecl,
241    PointerAttr,
242    PointerType,
243    PragmaCommentDecl,
244    PragmaDetectMismatchDecl,
245    PredefinedExpr,
246    PreferredNameAttr,
247    PureAttr,
248    QualType,
249    RValueReferenceType,
250    RecordDecl,
251    RecordType,
252    RecoveryExpr,
253    RequiresExpr,
254    RestrictAttr,
255    ReturnStmt,
256    ReturnsNonNullAttr,
257    ReturnsTwiceAttr,
258    SelectAnyAttr,
259    ShuffleVectorExpr,
260    SimpleRequirement,
261    SizeOfPackExpr,
262    SourceLocExpr,
263    StandaloneDebugAttr,
264    StaticAssertDecl,
265    StmtExpr,
266    StringLiteral,
267    SubstNonTypeTemplateParmExpr,
268    SubstTemplateTypeParmPackType,
269    SubstTemplateTypeParmType,
270    SwiftAttrAttr,
271    SwitchStmt,
272    TParamCommandComment,
273    TargetAttr,
274    TemplateArgument,
275    TemplateSpecializationType,
276    TemplateTemplateParmDecl,
277    TemplateTypeParmDecl,
278    TemplateTypeParmType,
279    TextComment,
280    TranslationUnitDecl,
281    TypeAliasDecl,
282    TypeAliasTemplateDecl,
283    TypeNullableAttr,
284    TypeOfExprType,
285    TypeRequirement,
286    TypeTraitExpr,
287    TypeVisibilityAttr,
288    TypedefDecl,
289    TypedefType,
290    UnaryExprOrTypeTraitExpr,
291    UnaryOperator,
292    UnaryTransformType,
293    UnavailableAttr,
294    UnlikelyAttr,
295    UnresolvedLookupExpr,
296    UnresolvedMemberExpr,
297    UnresolvedUsingIfExistsDecl,
298    UnresolvedUsingType,
299    UnresolvedUsingTypenameDecl,
300    UnresolvedUsingValueDecl,
301    UnusedAttr,
302    UserDefinedLiteral,
303    UsingDecl,
304    UsingDirectiveDecl,
305    UsingEnumDecl,
306    UsingIfExistsAttr,
307    UsingShadowDecl,
308    UsingType,
309    VTablePointerAuthenticationAttr,
310    VarDecl,
311    VarTemplateDecl,
312    VarTemplatePartialSpecializationDecl,
313    VarTemplateSpecializationDecl,
314    VectorType,
315    VerbatimBlockComment,
316    VerbatimBlockLineComment,
317    VerbatimLineComment,
318    VisibilityAttr,
319    WarnUnusedResultAttr,
320    WeakAttr,
321    WeakImportAttr,
322    WeakRefAttr,
323    WhileStmt,
324}
325
326impl Kind {
327    pub fn as_str(&self) -> &'static str {
328        as_str(self)
329    }
330}
331
332impl FromStr for Kind {
333    type Err = ParseKindError;
334
335    fn from_str(kind: &str) -> Result<Self, Self::Err> {
336        from_str(kind)
337    }
338}
339
340impl Default for Kind {
341    fn default() -> Self {
342        Kind::null
343    }
344}
345
346impl Display for Kind {
347    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
348        formatter.write_str(self.as_str())
349    }
350}
351
352impl Debug for Kind {
353    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
354        formatter.write_str(self.as_str())
355    }
356}
357
358impl PartialEq<Kind> for str {
359    fn eq(&self, kind: &Kind) -> bool {
360        self == kind.as_str()
361    }
362}
363
364impl PartialEq<Kind> for String {
365    fn eq(&self, kind: &Kind) -> bool {
366        self == kind.as_str()
367    }
368}
369
370impl<'de> Deserialize<'de> for Kind {
371    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
372    where
373        D: Deserializer<'de>,
374    {
375        deserializer.deserialize_str(KindVisitor)
376    }
377}
378
379struct KindVisitor;
380
381impl<'de> Visitor<'de> for KindVisitor {
382    type Value = Kind;
383
384    fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
385        formatter.write_str("enum Kind")
386    }
387
388    fn visit_str<E>(self, kind: &str) -> Result<Self::Value, E>
389    where
390        E: serde::de::Error,
391    {
392        match Kind::from_str(kind) {
393            Ok(kind) => Ok(kind),
394            Err(ParseKindError { .. }) => {
395                Err(serde::de::Error::unknown_variant(kind, self::VARIANTS))
396            }
397        }
398    }
399}
400
401impl Serialize for Kind {
402    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
403    where
404        S: Serializer,
405    {
406        if let Kind::null = self {
407            serializer.serialize_unit()
408        } else {
409            serializer.serialize_str(self.as_str())
410        }
411    }
412}
413
414pub struct ParseKindError {
415    _private: (),
416}
417
418impl Debug for ParseKindError {
419    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
420        formatter.debug_struct("ParseKindError").finish()
421    }
422}
423
424impl Display for ParseKindError {
425    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
426        formatter.write_str("unrecognized clang syntax tree node kind")
427    }
428}
429
430impl std::error::Error for ParseKindError {}
431
432pub(crate) enum AnyKind<'de> {
433    Kind(Kind),
434    Borrowed(&'de str),
435    Owned(Box<str>),
436}
437
438impl<'de> AnyKind<'de> {
439    pub(crate) fn as_str(&self) -> &str {
440        match self {
441            AnyKind::Kind(kind) => kind.as_str(),
442            AnyKind::Borrowed(kind) => kind,
443            AnyKind::Owned(kind) => kind,
444        }
445    }
446}
447
448impl<'de> Display for AnyKind<'de> {
449    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
450        formatter.write_str(self.as_str())
451    }
452}
453
454impl<'de> Deserialize<'de> for AnyKind<'de> {
455    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
456    where
457        D: Deserializer<'de>,
458    {
459        let marker = PhantomData;
460        let visitor = AnyKindVisitor { marker };
461        deserializer.deserialize_str(visitor)
462    }
463}
464
465struct AnyKindVisitor<'de> {
466    marker: PhantomData<fn() -> AnyKind<'de>>,
467}
468
469impl<'de> Visitor<'de> for AnyKindVisitor<'de> {
470    type Value = AnyKind<'de>;
471
472    fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
473        formatter.write_str("enum Kind")
474    }
475
476    fn visit_str<E>(self, kind: &str) -> Result<Self::Value, E>
477    where
478        E: serde::de::Error,
479    {
480        match Kind::deserialize(kind.into_deserializer()) {
481            Ok(kind) => Ok(AnyKind::Kind(kind)),
482            Err(UnknownVariant) => Ok(AnyKind::Owned(Box::from(kind))),
483        }
484    }
485
486    fn visit_borrowed_str<E>(self, kind: &'de str) -> Result<Self::Value, E>
487    where
488        E: serde::de::Error,
489    {
490        match Kind::deserialize(kind.into_deserializer()) {
491            Ok(kind) => Ok(AnyKind::Kind(kind)),
492            Err(UnknownVariant) => Ok(AnyKind::Borrowed(kind)),
493        }
494    }
495
496    fn visit_string<E>(self, kind: String) -> Result<Self::Value, E>
497    where
498        E: serde::de::Error,
499    {
500        match Kind::deserialize(kind.as_str().into_deserializer()) {
501            Ok(kind) => Ok(AnyKind::Kind(kind)),
502            Err(UnknownVariant) => Ok(AnyKind::Owned(kind.into_boxed_str())),
503        }
504    }
505}
506
507#[derive(#[automatically_derived]
impl ::core::fmt::Debug for UnknownVariant {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::write_str(f, "UnknownVariant")
    }
}Debug)]
508struct UnknownVariant;
509
510impl std::error::Error for UnknownVariant {}
511
512impl serde::de::Error for UnknownVariant {
513    fn custom<T: Display>(msg: T) -> Self {
514        let _ = msg;
515        ::core::panicking::panic("internal error: entered unreachable code")unreachable!()
516    }
517
518    fn invalid_type(unexp: Unexpected<'_>, exp: &dyn Expected) -> Self {
519        let _ = unexp;
520        let _ = exp;
521        ::core::panicking::panic("internal error: entered unreachable code")unreachable!()
522    }
523
524    fn invalid_value(unexp: Unexpected<'_>, exp: &dyn Expected) -> Self {
525        let _ = unexp;
526        let _ = exp;
527        ::core::panicking::panic("internal error: entered unreachable code")unreachable!()
528    }
529
530    fn invalid_length(len: usize, exp: &dyn Expected) -> Self {
531        let _ = len;
532        let _ = exp;
533        ::core::panicking::panic("internal error: entered unreachable code")unreachable!()
534    }
535
536    fn unknown_variant(variant: &str, expected: &'static [&'static str]) -> Self {
537        let _ = variant;
538        let _ = expected;
539        UnknownVariant
540    }
541
542    fn unknown_field(field: &str, expected: &'static [&'static str]) -> Self {
543        let _ = field;
544        let _ = expected;
545        ::core::panicking::panic("internal error: entered unreachable code")unreachable!()
546    }
547
548    fn missing_field(field: &'static str) -> Self {
549        let _ = field;
550        ::core::panicking::panic("internal error: entered unreachable code")unreachable!()
551    }
552
553    fn duplicate_field(field: &'static str) -> Self {
554        let _ = field;
555        ::core::panicking::panic("internal error: entered unreachable code")unreachable!()
556    }
557}
558
559impl Display for UnknownVariant {
560    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
561        formatter.write_str("unknown variant")
562    }
563}
564
565enum SometimesBorrowedStr<'a, 'de> {
566    Transient(&'a str),
567    Borrowed(&'de str),
568}
569
570pub(crate) struct SometimesBorrowedStrDeserializer<'a, 'de, E> {
571    value: SometimesBorrowedStr<'a, 'de>,
572    error: PhantomData<E>,
573}
574
575impl<'a, 'de, E> SometimesBorrowedStrDeserializer<'a, 'de, E> {
576    pub(crate) fn transient(value: &'a str) -> Self {
577        SometimesBorrowedStrDeserializer {
578            value: SometimesBorrowedStr::Transient(value),
579            error: PhantomData,
580        }
581    }
582
583    pub(crate) fn borrowed(value: &'de str) -> Self {
584        SometimesBorrowedStrDeserializer {
585            value: SometimesBorrowedStr::Borrowed(value),
586            error: PhantomData,
587        }
588    }
589}
590
591impl<'a, 'de, E> Deserializer<'de> for SometimesBorrowedStrDeserializer<'a, 'de, E>
592where
593    E: serde::de::Error,
594{
595    type Error = E;
596
597    fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
598    where
599        V: Visitor<'de>,
600    {
601        match self.value {
602            SometimesBorrowedStr::Transient(string) => visitor.visit_str(string),
603            SometimesBorrowedStr::Borrowed(string) => visitor.visit_borrowed_str(string),
604        }
605    }
606
607    fn deserialize_option<V>(self, visitor: V) -> Result<V::Value, Self::Error>
608    where
609        V: Visitor<'de>,
610    {
611        visitor.visit_some(self)
612    }
613
614    fn deserialize_enum<V>(
615        self,
616        name: &'static str,
617        variants: &'static [&'static str],
618        visitor: V,
619    ) -> Result<V::Value, Self::Error>
620    where
621        V: Visitor<'de>,
622    {
623        let _ = name;
624        let _ = variants;
625        visitor.visit_enum(self)
626    }
627
628    self
visitor
self.deserialize_any(visitor);forward_to_deserialize_any! {
629        bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string
630        bytes byte_buf unit unit_struct newtype_struct seq tuple tuple_struct
631        map struct identifier ignored_any
632    }
633}
634
635impl<'a, 'de, E> EnumAccess<'de> for SometimesBorrowedStrDeserializer<'a, 'de, E>
636where
637    E: serde::de::Error,
638{
639    type Error = E;
640    type Variant = UnitOnly<E>;
641
642    fn variant_seed<V>(self, seed: V) -> Result<(V::Value, Self::Variant), Self::Error>
643    where
644        V: DeserializeSeed<'de>,
645    {
646        let value = seed.deserialize(self)?;
647        let variant = UnitOnly {
648            marker: PhantomData,
649        };
650        Ok((value, variant))
651    }
652}
653
654pub(crate) struct UnitOnly<E> {
655    marker: PhantomData<E>,
656}
657
658impl<'de, E> VariantAccess<'de> for UnitOnly<E>
659where
660    E: serde::de::Error,
661{
662    type Error = E;
663
664    fn unit_variant(self) -> Result<(), Self::Error> {
665        Ok(())
666    }
667
668    fn newtype_variant_seed<T>(self, seed: T) -> Result<T::Value, Self::Error>
669    where
670        T: DeserializeSeed<'de>,
671    {
672        let _ = seed;
673        Err(E::invalid_type(Unexpected::UnitVariant, &"newtype variant"))
674    }
675
676    fn tuple_variant<V>(self, len: usize, visitor: V) -> Result<V::Value, Self::Error>
677    where
678        V: Visitor<'de>,
679    {
680        let _ = len;
681        let _ = visitor;
682        Err(E::invalid_type(Unexpected::UnitVariant, &"tuple variant"))
683    }
684
685    fn struct_variant<V>(
686        self,
687        fields: &'static [&'static str],
688        visitor: V,
689    ) -> Result<V::Value, Self::Error>
690    where
691        V: Visitor<'de>,
692    {
693        let _ = fields;
694        let _ = visitor;
695        Err(E::invalid_type(Unexpected::UnitVariant, &"struct variant"))
696    }
697}