Skip to main content

wherror_impl/
expand.rs

1use crate::ast::{Enum, Field, Input, Struct};
2use crate::attr::Trait;
3use crate::fallback;
4use crate::generics::InferredBounds;
5use crate::private;
6use crate::unraw::MemberUnraw;
7use proc_macro2::{Ident, Span, TokenStream};
8use quote::{format_ident, quote, quote_spanned, ToTokens};
9use std::collections::BTreeSet as Set;
10use syn::{DeriveInput, GenericArgument, PathArguments, Result, Token, Type};
11
12pub fn derive(input: &DeriveInput) -> TokenStream {
13    match try_expand(input) {
14        Ok(expanded) => expanded,
15        // If there are invalid attributes in the input, expand to an Error impl
16        // anyway to minimize spurious secondary errors in other code that uses
17        // this type as an Error.
18        Err(error) => fallback::expand(input, error),
19    }
20}
21
22fn try_expand(input: &DeriveInput) -> Result<TokenStream> {
23    let input = Input::from_syn(input)?;
24    input.validate()?;
25    Ok(match input {
26        Input::Struct(input) => impl_struct(input),
27        Input::Enum(input) => impl_enum(input),
28    })
29}
30
31fn impl_struct(input: Struct) -> TokenStream {
32    let ty = call_site_ident(&input.ident);
33    let (impl_generics, ty_generics, where_clause) = input.generics.split_for_impl();
34    let mut error_inferred_bounds = InferredBounds::new();
35
36    let source_body = if let Some(transparent_attr) = &input.attrs.transparent {
37        let only_field = &input.fields[0];
38        if only_field.contains_generic {
39            error_inferred_bounds.insert(only_field.ty, {
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "wherror");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::ToTokens::to_tokens(&private, &mut _s);
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "Error");
    _s
}quote!(::wherror::#private::Error));
40        }
41        let member = &only_field.member;
42        Some({
    let _span: ::quote::__private::Span =
        ::quote::__private::get_span(transparent_attr.span).__into_span();
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::__private::push_colon2_spanned(&mut _s, _span);
    ::quote::__private::push_ident_spanned(&mut _s, _span, "wherror");
    ::quote::__private::push_colon2_spanned(&mut _s, _span);
    ::quote::ToTokens::to_tokens(&private, &mut _s);
    ::quote::__private::push_colon2_spanned(&mut _s, _span);
    ::quote::__private::push_ident_spanned(&mut _s, _span, "Error");
    ::quote::__private::push_colon2_spanned(&mut _s, _span);
    ::quote::__private::push_ident_spanned(&mut _s, _span, "source");
    ::quote::__private::push_group_spanned(&mut _s, _span,
        ::quote::__private::Delimiter::Parenthesis,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::push_ident_spanned(&mut _s, _span, "self");
            ::quote::__private::push_dot_spanned(&mut _s, _span);
            ::quote::ToTokens::to_tokens(&member, &mut _s);
            ::quote::__private::push_dot_spanned(&mut _s, _span);
            ::quote::__private::push_ident_spanned(&mut _s, _span,
                "as_dyn_error");
            ::quote::__private::push_group_spanned(&mut _s, _span,
                ::quote::__private::Delimiter::Parenthesis,
                { ::quote::__private::TokenStream::new() });
            _s
        });
    _s
}quote_spanned! {transparent_attr.span=>
43            ::wherror::#private::Error::source(self.#member.as_dyn_error())
44        })
45    } else if let Some(source_field) = input.source_field() {
46        let source = &source_field.member;
47        if source_field.contains_generic {
48            let ty = unoptional_type(source_field.ty);
49            error_inferred_bounds.insert(ty, {
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "wherror");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::ToTokens::to_tokens(&private, &mut _s);
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "Error");
    ::quote::__private::push_add(&mut _s);
    ::quote::__private::push_lifetime(&mut _s, "\'static");
    _s
}quote!(::wherror::#private::Error + 'static));
50        }
51        let asref = if type_is_option(source_field.ty) {
52            Some({
    let _span: ::quote::__private::Span =
        ::quote::__private::get_span(source.span()).__into_span();
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::__private::push_dot_spanned(&mut _s, _span);
    ::quote::__private::push_ident_spanned(&mut _s, _span, "as_ref");
    ::quote::__private::push_group_spanned(&mut _s, _span,
        ::quote::__private::Delimiter::Parenthesis,
        { ::quote::__private::TokenStream::new() });
    ::quote::__private::push_question_spanned(&mut _s, _span);
    _s
}quote_spanned!(source.span()=> .as_ref()?))
53        } else {
54            None
55        };
56        let dyn_error = {
    let _span: ::quote::__private::Span =
        ::quote::__private::get_span(source_field.source_span()).__into_span();
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::__private::push_ident_spanned(&mut _s, _span, "self");
    ::quote::__private::push_dot_spanned(&mut _s, _span);
    ::quote::ToTokens::to_tokens(&source, &mut _s);
    ::quote::ToTokens::to_tokens(&asref, &mut _s);
    ::quote::__private::push_dot_spanned(&mut _s, _span);
    ::quote::__private::push_ident_spanned(&mut _s, _span, "as_dyn_error");
    ::quote::__private::push_group_spanned(&mut _s, _span,
        ::quote::__private::Delimiter::Parenthesis,
        { ::quote::__private::TokenStream::new() });
    _s
}quote_spanned! {source_field.source_span()=>
57            self.#source #asref.as_dyn_error()
58        };
59        Some({
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "core");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "option");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "Option");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "Some");
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Parenthesis,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::ToTokens::to_tokens(&dyn_error, &mut _s);
            _s
        });
    _s
}quote! {
60            ::core::option::Option::Some(#dyn_error)
61        })
62    } else {
63        None
64    };
65    let source_method = source_body.map(|body| {
66        {
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::__private::push_ident(&mut _s, "fn");
    ::quote::__private::push_ident(&mut _s, "source");
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Parenthesis,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::push_and(&mut _s);
            ::quote::__private::push_ident(&mut _s, "self");
            _s
        });
    ::quote::__private::push_rarrow(&mut _s);
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "core");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "option");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "Option");
    ::quote::__private::push_lt(&mut _s);
    ::quote::__private::push_and(&mut _s);
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Parenthesis,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::push_ident(&mut _s, "dyn");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "wherror");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::ToTokens::to_tokens(&private, &mut _s);
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "Error");
            ::quote::__private::push_add(&mut _s);
            ::quote::__private::push_lifetime(&mut _s, "\'static");
            _s
        });
    ::quote::__private::push_gt(&mut _s);
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Brace,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::push_ident(&mut _s, "use");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "wherror");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::ToTokens::to_tokens(&private, &mut _s);
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "AsDynError");
            ::quote::__private::push_ident(&mut _s, "as");
            ::quote::__private::push_underscore(&mut _s);
            ::quote::__private::push_semi(&mut _s);
            ::quote::ToTokens::to_tokens(&body, &mut _s);
            _s
        });
    _s
}quote! {
67            fn source(&self) -> ::core::option::Option<&(dyn ::wherror::#private::Error + 'static)> {
68                use ::wherror::#private::AsDynError as _;
69                #body
70            }
71        }
72    });
73
74    let provide_method = input.backtrace_field().map(|backtrace_field| {
75        let request = {
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::__private::push_ident(&mut _s, "request");
    _s
}quote!(request);
76        let backtrace = &backtrace_field.member;
77        let body = if let Some(source_field) = input.source_field() {
78            let source = &source_field.member;
79            let source_provide = if type_is_option(source_field.ty) {
80                {
    let _span: ::quote::__private::Span =
        ::quote::__private::get_span(source.span()).__into_span();
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::__private::push_ident_spanned(&mut _s, _span, "if");
    ::quote::__private::push_ident_spanned(&mut _s, _span, "let");
    ::quote::__private::push_colon2_spanned(&mut _s, _span);
    ::quote::__private::push_ident_spanned(&mut _s, _span, "core");
    ::quote::__private::push_colon2_spanned(&mut _s, _span);
    ::quote::__private::push_ident_spanned(&mut _s, _span, "option");
    ::quote::__private::push_colon2_spanned(&mut _s, _span);
    ::quote::__private::push_ident_spanned(&mut _s, _span, "Option");
    ::quote::__private::push_colon2_spanned(&mut _s, _span);
    ::quote::__private::push_ident_spanned(&mut _s, _span, "Some");
    ::quote::__private::push_group_spanned(&mut _s, _span,
        ::quote::__private::Delimiter::Parenthesis,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::push_ident_spanned(&mut _s, _span, "source");
            _s
        });
    ::quote::__private::push_eq_spanned(&mut _s, _span);
    ::quote::__private::push_and_spanned(&mut _s, _span);
    ::quote::__private::push_ident_spanned(&mut _s, _span, "self");
    ::quote::__private::push_dot_spanned(&mut _s, _span);
    ::quote::ToTokens::to_tokens(&source, &mut _s);
    ::quote::__private::push_group_spanned(&mut _s, _span,
        ::quote::__private::Delimiter::Brace,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::push_ident_spanned(&mut _s, _span, "source");
            ::quote::__private::push_dot_spanned(&mut _s, _span);
            ::quote::__private::push_ident_spanned(&mut _s, _span,
                "thiserror_provide");
            ::quote::__private::push_group_spanned(&mut _s, _span,
                ::quote::__private::Delimiter::Parenthesis,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::ToTokens::to_tokens(&request, &mut _s);
                    _s
                });
            ::quote::__private::push_semi_spanned(&mut _s, _span);
            _s
        });
    _s
}quote_spanned! {source.span()=>
81                    if let ::core::option::Option::Some(source) = &self.#source {
82                        source.thiserror_provide(#request);
83                    }
84                }
85            } else {
86                {
    let _span: ::quote::__private::Span =
        ::quote::__private::get_span(source.span()).__into_span();
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::__private::push_ident_spanned(&mut _s, _span, "self");
    ::quote::__private::push_dot_spanned(&mut _s, _span);
    ::quote::ToTokens::to_tokens(&source, &mut _s);
    ::quote::__private::push_dot_spanned(&mut _s, _span);
    ::quote::__private::push_ident_spanned(&mut _s, _span,
        "thiserror_provide");
    ::quote::__private::push_group_spanned(&mut _s, _span,
        ::quote::__private::Delimiter::Parenthesis,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::ToTokens::to_tokens(&request, &mut _s);
            _s
        });
    ::quote::__private::push_semi_spanned(&mut _s, _span);
    _s
}quote_spanned! {source.span()=>
87                    self.#source.thiserror_provide(#request);
88                }
89            };
90            let self_provide = if source == backtrace {
91                None
92            } else if type_is_option(backtrace_field.ty) {
93                Some({
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::__private::push_ident(&mut _s, "if");
    ::quote::__private::push_ident(&mut _s, "let");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "core");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "option");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "Option");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "Some");
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Parenthesis,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::push_ident(&mut _s, "backtrace");
            _s
        });
    ::quote::__private::push_eq(&mut _s);
    ::quote::__private::push_and(&mut _s);
    ::quote::__private::push_ident(&mut _s, "self");
    ::quote::__private::push_dot(&mut _s);
    ::quote::ToTokens::to_tokens(&backtrace, &mut _s);
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Brace,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::ToTokens::to_tokens(&request, &mut _s);
            ::quote::__private::push_dot(&mut _s);
            ::quote::__private::push_ident(&mut _s, "provide_ref");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_lt(&mut _s);
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "wherror");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::ToTokens::to_tokens(&private, &mut _s);
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "Backtrace");
            ::quote::__private::push_gt(&mut _s);
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Parenthesis,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::__private::push_ident(&mut _s, "backtrace");
                    _s
                });
            ::quote::__private::push_semi(&mut _s);
            _s
        });
    _s
}quote! {
94                    if let ::core::option::Option::Some(backtrace) = &self.#backtrace {
95                        #request.provide_ref::<::wherror::#private::Backtrace>(backtrace);
96                    }
97                })
98            } else {
99                Some({
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::ToTokens::to_tokens(&request, &mut _s);
    ::quote::__private::push_dot(&mut _s);
    ::quote::__private::push_ident(&mut _s, "provide_ref");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_lt(&mut _s);
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "wherror");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::ToTokens::to_tokens(&private, &mut _s);
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "Backtrace");
    ::quote::__private::push_gt(&mut _s);
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Parenthesis,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::push_and(&mut _s);
            ::quote::__private::push_ident(&mut _s, "self");
            ::quote::__private::push_dot(&mut _s);
            ::quote::ToTokens::to_tokens(&backtrace, &mut _s);
            _s
        });
    ::quote::__private::push_semi(&mut _s);
    _s
}quote! {
100                    #request.provide_ref::<::wherror::#private::Backtrace>(&self.#backtrace);
101                })
102            };
103            {
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::__private::push_ident(&mut _s, "use");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "wherror");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::ToTokens::to_tokens(&private, &mut _s);
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "ThiserrorProvide");
    ::quote::__private::push_ident(&mut _s, "as");
    ::quote::__private::push_underscore(&mut _s);
    ::quote::__private::push_semi(&mut _s);
    ::quote::ToTokens::to_tokens(&source_provide, &mut _s);
    ::quote::ToTokens::to_tokens(&self_provide, &mut _s);
    _s
}quote! {
104                use ::wherror::#private::ThiserrorProvide as _;
105                #source_provide
106                #self_provide
107            }
108        } else if type_is_option(backtrace_field.ty) {
109            {
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::__private::push_ident(&mut _s, "if");
    ::quote::__private::push_ident(&mut _s, "let");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "core");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "option");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "Option");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "Some");
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Parenthesis,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::push_ident(&mut _s, "backtrace");
            _s
        });
    ::quote::__private::push_eq(&mut _s);
    ::quote::__private::push_and(&mut _s);
    ::quote::__private::push_ident(&mut _s, "self");
    ::quote::__private::push_dot(&mut _s);
    ::quote::ToTokens::to_tokens(&backtrace, &mut _s);
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Brace,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::ToTokens::to_tokens(&request, &mut _s);
            ::quote::__private::push_dot(&mut _s);
            ::quote::__private::push_ident(&mut _s, "provide_ref");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_lt(&mut _s);
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "wherror");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::ToTokens::to_tokens(&private, &mut _s);
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "Backtrace");
            ::quote::__private::push_gt(&mut _s);
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Parenthesis,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::__private::push_ident(&mut _s, "backtrace");
                    _s
                });
            ::quote::__private::push_semi(&mut _s);
            _s
        });
    _s
}quote! {
110                if let ::core::option::Option::Some(backtrace) = &self.#backtrace {
111                    #request.provide_ref::<::wherror::#private::Backtrace>(backtrace);
112                }
113            }
114        } else {
115            {
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::ToTokens::to_tokens(&request, &mut _s);
    ::quote::__private::push_dot(&mut _s);
    ::quote::__private::push_ident(&mut _s, "provide_ref");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_lt(&mut _s);
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "wherror");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::ToTokens::to_tokens(&private, &mut _s);
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "Backtrace");
    ::quote::__private::push_gt(&mut _s);
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Parenthesis,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::push_and(&mut _s);
            ::quote::__private::push_ident(&mut _s, "self");
            ::quote::__private::push_dot(&mut _s);
            ::quote::ToTokens::to_tokens(&backtrace, &mut _s);
            _s
        });
    ::quote::__private::push_semi(&mut _s);
    _s
}quote! {
116                #request.provide_ref::<::wherror::#private::Backtrace>(&self.#backtrace);
117            }
118        };
119        {
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::__private::push_ident(&mut _s, "fn");
    ::quote::__private::push_ident(&mut _s, "provide");
    ::quote::__private::push_lt(&mut _s);
    ::quote::__private::push_lifetime(&mut _s, "\'_request");
    ::quote::__private::push_gt(&mut _s);
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Parenthesis,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::push_and(&mut _s);
            ::quote::__private::push_lifetime(&mut _s, "\'_request");
            ::quote::__private::push_ident(&mut _s, "self");
            ::quote::__private::push_comma(&mut _s);
            ::quote::ToTokens::to_tokens(&request, &mut _s);
            ::quote::__private::push_colon(&mut _s);
            ::quote::__private::push_and(&mut _s);
            ::quote::__private::push_ident(&mut _s, "mut");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "core");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "error");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "Request");
            ::quote::__private::push_lt(&mut _s);
            ::quote::__private::push_lifetime(&mut _s, "\'_request");
            ::quote::__private::push_gt(&mut _s);
            _s
        });
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Brace,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::ToTokens::to_tokens(&body, &mut _s);
            _s
        });
    _s
}quote! {
120            fn provide<'_request>(&'_request self, #request: &mut ::core::error::Request<'_request>) {
121                #body
122            }
123        }
124    });
125
126    let mut display_implied_bounds = Set::new();
127    let display_body = if input.attrs.transparent.is_some() {
128        let only_field = &input.fields[0].member;
129        display_implied_bounds.insert((0, Trait::Display));
130        Some({
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "core");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "fmt");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "Display");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "fmt");
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Parenthesis,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::push_and(&mut _s);
            ::quote::__private::push_ident(&mut _s, "self");
            ::quote::__private::push_dot(&mut _s);
            ::quote::ToTokens::to_tokens(&only_field, &mut _s);
            ::quote::__private::push_comma(&mut _s);
            ::quote::__private::push_ident(&mut _s, "__formatter");
            _s
        });
    _s
}quote! {
131            ::core::fmt::Display::fmt(&self.#only_field, __formatter)
132        })
133    } else if let Some(display) = &input.attrs.display {
134        display_implied_bounds.clone_from(&display.implied_bounds);
135        let use_as_display = use_as_display(display.has_bonus_display);
136        let pat = fields_pat(&input.fields);
137        Some({
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::ToTokens::to_tokens(&use_as_display, &mut _s);
    ::quote::__private::push_pound(&mut _s);
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Bracket,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::push_ident(&mut _s, "allow");
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Parenthesis,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::__private::push_ident(&mut _s, "unused_variables");
                    ::quote::__private::push_comma(&mut _s);
                    ::quote::__private::push_ident(&mut _s, "deprecated");
                    _s
                });
            _s
        });
    ::quote::__private::push_ident(&mut _s, "let");
    ::quote::__private::push_ident(&mut _s, "Self");
    ::quote::ToTokens::to_tokens(&pat, &mut _s);
    ::quote::__private::push_eq(&mut _s);
    ::quote::__private::push_ident(&mut _s, "self");
    ::quote::__private::push_semi(&mut _s);
    ::quote::ToTokens::to_tokens(&display, &mut _s);
    _s
}quote! {
138            #use_as_display
139            #[allow(unused_variables, deprecated)]
140            let Self #pat = self;
141            #display
142        })
143    } else if let Some(debug_attr) = &input.attrs.debug {
144        // Fall back to Debug representation when #[error(debug)] is specified
145        Some({
    let _span: ::quote::__private::Span =
        ::quote::__private::get_span(debug_attr.span).__into_span();
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::__private::push_colon2_spanned(&mut _s, _span);
    ::quote::__private::push_ident_spanned(&mut _s, _span, "core");
    ::quote::__private::push_colon2_spanned(&mut _s, _span);
    ::quote::__private::push_ident_spanned(&mut _s, _span, "fmt");
    ::quote::__private::push_colon2_spanned(&mut _s, _span);
    ::quote::__private::push_ident_spanned(&mut _s, _span, "Debug");
    ::quote::__private::push_colon2_spanned(&mut _s, _span);
    ::quote::__private::push_ident_spanned(&mut _s, _span, "fmt");
    ::quote::__private::push_group_spanned(&mut _s, _span,
        ::quote::__private::Delimiter::Parenthesis,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::push_ident_spanned(&mut _s, _span, "self");
            ::quote::__private::push_comma_spanned(&mut _s, _span);
            ::quote::__private::push_ident_spanned(&mut _s, _span,
                "__formatter");
            _s
        });
    _s
}quote_spanned! {debug_attr.span=>
146            ::core::fmt::Debug::fmt(self, __formatter)
147        })
148    } else {
149        None
150    };
151    let display_impl = display_body.map(|body| {
152        let mut display_inferred_bounds = InferredBounds::new();
153        for (field, bound) in display_implied_bounds {
154            let field = &input.fields[field];
155            if field.contains_generic {
156                display_inferred_bounds.insert(field.ty, bound);
157            }
158        }
159        let display_where_clause = display_inferred_bounds.augment_where_clause(input.generics);
160        {
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::__private::push_pound(&mut _s);
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Bracket,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::push_ident(&mut _s, "allow");
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Parenthesis,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::__private::push_ident(&mut _s,
                        "unused_qualifications");
                    _s
                });
            _s
        });
    ::quote::__private::push_pound(&mut _s);
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Bracket,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::push_ident(&mut _s, "automatically_derived");
            _s
        });
    ::quote::__private::push_ident(&mut _s, "impl");
    ::quote::ToTokens::to_tokens(&impl_generics, &mut _s);
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "core");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "fmt");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "Display");
    ::quote::__private::push_ident(&mut _s, "for");
    ::quote::ToTokens::to_tokens(&ty, &mut _s);
    ::quote::ToTokens::to_tokens(&ty_generics, &mut _s);
    ::quote::ToTokens::to_tokens(&display_where_clause, &mut _s);
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Brace,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::push_pound(&mut _s);
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Bracket,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::__private::push_ident(&mut _s, "allow");
                    ::quote::__private::push_group(&mut _s,
                        ::quote::__private::Delimiter::Parenthesis,
                        {
                            let mut _s = ::quote::__private::TokenStream::new();
                            ::quote::__private::push_ident(&mut _s, "clippy");
                            ::quote::__private::push_colon2(&mut _s);
                            ::quote::__private::push_ident(&mut _s,
                                "used_underscore_binding");
                            _s
                        });
                    _s
                });
            ::quote::__private::push_ident(&mut _s, "fn");
            ::quote::__private::push_ident(&mut _s, "fmt");
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Parenthesis,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::__private::push_and(&mut _s);
                    ::quote::__private::push_ident(&mut _s, "self");
                    ::quote::__private::push_comma(&mut _s);
                    ::quote::__private::push_ident(&mut _s, "__formatter");
                    ::quote::__private::push_colon(&mut _s);
                    ::quote::__private::push_and(&mut _s);
                    ::quote::__private::push_ident(&mut _s, "mut");
                    ::quote::__private::push_colon2(&mut _s);
                    ::quote::__private::push_ident(&mut _s, "core");
                    ::quote::__private::push_colon2(&mut _s);
                    ::quote::__private::push_ident(&mut _s, "fmt");
                    ::quote::__private::push_colon2(&mut _s);
                    ::quote::__private::push_ident(&mut _s, "Formatter");
                    _s
                });
            ::quote::__private::push_rarrow(&mut _s);
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "core");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "fmt");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "Result");
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Brace,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::ToTokens::to_tokens(&body, &mut _s);
                    _s
                });
            _s
        });
    _s
}quote! {
161            #[allow(unused_qualifications)]
162            #[automatically_derived]
163            impl #impl_generics ::core::fmt::Display for #ty #ty_generics #display_where_clause {
164                #[allow(clippy::used_underscore_binding)]
165                fn fmt(&self, __formatter: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
166                    #body
167                }
168            }
169        }
170    });
171
172    let from_impl = input.from_field().map(|from_field| {
173        let span = from_field.attrs.from.unwrap().span;
174        let backtrace_field = input.distinct_backtrace_field();
175        let from = unoptional_type(from_field.ty);
176        let track_caller = input.location_field().map(|_| {
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::__private::push_pound(&mut _s);
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Bracket,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::push_ident(&mut _s, "track_caller");
            _s
        });
    _s
}quote!(#[track_caller]));
177        let source_var = Ident::new("source", span);
178        let body = from_initializer(
179            from_field,
180            backtrace_field,
181            &source_var,
182            input.location_field(),
183        );
184
185        // Check if the field type (after unwrapping Option) is Box<T>
186        let field_type = type_parameter_of_option(from_field.ty).unwrap_or(from_field.ty);
187        let box_implementations = type_parameter_of_box(field_type).map(|inner_type| {
188            // Generate From<T> implementation that boxes the value
189            let inner_source_var = Ident::new("source", span);
190            let boxed_body = from_initializer_for_box(
191                from_field,
192                backtrace_field,
193                &inner_source_var,
194                input.location_field(),
195            );
196            let inner_from_function = {
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::ToTokens::to_tokens(&track_caller, &mut _s);
    ::quote::__private::push_ident(&mut _s, "fn");
    ::quote::__private::push_ident(&mut _s, "from");
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Parenthesis,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::ToTokens::to_tokens(&inner_source_var, &mut _s);
            ::quote::__private::push_colon(&mut _s);
            ::quote::ToTokens::to_tokens(&inner_type, &mut _s);
            _s
        });
    ::quote::__private::push_rarrow(&mut _s);
    ::quote::__private::push_ident(&mut _s, "Self");
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Brace,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::ToTokens::to_tokens(&ty, &mut _s);
            ::quote::ToTokens::to_tokens(&boxed_body, &mut _s);
            _s
        });
    _s
}quote! {
197                #track_caller
198                fn from(#inner_source_var: #inner_type) -> Self {
199                    #ty #boxed_body
200                }
201            };
202            let inner_from_impl = {
    let _span: ::quote::__private::Span =
        ::quote::__private::get_span(span).__into_span();
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::__private::push_pound_spanned(&mut _s, _span);
    ::quote::__private::push_group_spanned(&mut _s, _span,
        ::quote::__private::Delimiter::Bracket,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::push_ident_spanned(&mut _s, _span,
                "automatically_derived");
            _s
        });
    ::quote::__private::push_ident_spanned(&mut _s, _span, "impl");
    ::quote::ToTokens::to_tokens(&impl_generics, &mut _s);
    ::quote::__private::push_colon2_spanned(&mut _s, _span);
    ::quote::__private::push_ident_spanned(&mut _s, _span, "core");
    ::quote::__private::push_colon2_spanned(&mut _s, _span);
    ::quote::__private::push_ident_spanned(&mut _s, _span, "convert");
    ::quote::__private::push_colon2_spanned(&mut _s, _span);
    ::quote::__private::push_ident_spanned(&mut _s, _span, "From");
    ::quote::__private::push_lt_spanned(&mut _s, _span);
    ::quote::ToTokens::to_tokens(&inner_type, &mut _s);
    ::quote::__private::push_gt_spanned(&mut _s, _span);
    ::quote::__private::push_ident_spanned(&mut _s, _span, "for");
    ::quote::ToTokens::to_tokens(&ty, &mut _s);
    ::quote::ToTokens::to_tokens(&ty_generics, &mut _s);
    ::quote::ToTokens::to_tokens(&where_clause, &mut _s);
    ::quote::__private::push_group_spanned(&mut _s, _span,
        ::quote::__private::Delimiter::Brace,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::ToTokens::to_tokens(&inner_from_function, &mut _s);
            _s
        });
    _s
}quote_spanned! {span=>
203                #[automatically_derived]
204                impl #impl_generics ::core::convert::From<#inner_type> for #ty #ty_generics #where_clause {
205                    #inner_from_function
206                }
207            };
208            {
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::__private::push_pound(&mut _s);
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Bracket,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::push_ident(&mut _s, "allow");
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Parenthesis,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::__private::push_ident(&mut _s, "deprecated");
                    ::quote::__private::push_comma(&mut _s);
                    ::quote::__private::push_ident(&mut _s,
                        "unused_qualifications");
                    ::quote::__private::push_comma(&mut _s);
                    ::quote::__private::push_ident(&mut _s, "clippy");
                    ::quote::__private::push_colon2(&mut _s);
                    ::quote::__private::push_ident(&mut _s,
                        "elidable_lifetime_names");
                    ::quote::__private::push_comma(&mut _s);
                    ::quote::__private::push_ident(&mut _s, "clippy");
                    ::quote::__private::push_colon2(&mut _s);
                    ::quote::__private::push_ident(&mut _s,
                        "needless_lifetimes");
                    ::quote::__private::push_comma(&mut _s);
                    ::quote::__private::push_ident(&mut _s, "clippy");
                    ::quote::__private::push_colon2(&mut _s);
                    ::quote::__private::push_ident(&mut _s,
                        "redundant_field_names");
                    ::quote::__private::push_comma(&mut _s);
                    _s
                });
            _s
        });
    ::quote::ToTokens::to_tokens(&inner_from_impl, &mut _s);
    _s
}quote! {
209                #[allow(
210                    deprecated,
211                    unused_qualifications,
212                    clippy::elidable_lifetime_names,
213                    clippy::needless_lifetimes,
214                    clippy::redundant_field_names,
215                )]
216                #inner_from_impl
217            }
218        });
219
220        let from_function = {
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::__private::push_pound(&mut _s);
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Bracket,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::push_ident(&mut _s, "allow");
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Parenthesis,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::__private::push_ident(&mut _s, "clippy");
                    ::quote::__private::push_colon2(&mut _s);
                    ::quote::__private::push_ident(&mut _s,
                        "redundant_field_names");
                    _s
                });
            _s
        });
    ::quote::ToTokens::to_tokens(&track_caller, &mut _s);
    ::quote::__private::push_ident(&mut _s, "fn");
    ::quote::__private::push_ident(&mut _s, "from");
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Parenthesis,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::ToTokens::to_tokens(&source_var, &mut _s);
            ::quote::__private::push_colon(&mut _s);
            ::quote::ToTokens::to_tokens(&from, &mut _s);
            _s
        });
    ::quote::__private::push_rarrow(&mut _s);
    ::quote::__private::push_ident(&mut _s, "Self");
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Brace,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::ToTokens::to_tokens(&ty, &mut _s);
            ::quote::ToTokens::to_tokens(&body, &mut _s);
            _s
        });
    _s
}quote! {
221            #[allow(clippy::redundant_field_names)]
222            #track_caller
223            fn from(#source_var: #from) -> Self {
224                #ty #body
225            }
226        };
227        let from_impl = {
    let _span: ::quote::__private::Span =
        ::quote::__private::get_span(span).__into_span();
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::__private::push_pound_spanned(&mut _s, _span);
    ::quote::__private::push_group_spanned(&mut _s, _span,
        ::quote::__private::Delimiter::Bracket,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::push_ident_spanned(&mut _s, _span,
                "automatically_derived");
            _s
        });
    ::quote::__private::push_ident_spanned(&mut _s, _span, "impl");
    ::quote::ToTokens::to_tokens(&impl_generics, &mut _s);
    ::quote::__private::push_colon2_spanned(&mut _s, _span);
    ::quote::__private::push_ident_spanned(&mut _s, _span, "core");
    ::quote::__private::push_colon2_spanned(&mut _s, _span);
    ::quote::__private::push_ident_spanned(&mut _s, _span, "convert");
    ::quote::__private::push_colon2_spanned(&mut _s, _span);
    ::quote::__private::push_ident_spanned(&mut _s, _span, "From");
    ::quote::__private::push_lt_spanned(&mut _s, _span);
    ::quote::ToTokens::to_tokens(&from, &mut _s);
    ::quote::__private::push_gt_spanned(&mut _s, _span);
    ::quote::__private::push_ident_spanned(&mut _s, _span, "for");
    ::quote::ToTokens::to_tokens(&ty, &mut _s);
    ::quote::ToTokens::to_tokens(&ty_generics, &mut _s);
    ::quote::ToTokens::to_tokens(&where_clause, &mut _s);
    ::quote::__private::push_group_spanned(&mut _s, _span,
        ::quote::__private::Delimiter::Brace,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::ToTokens::to_tokens(&from_function, &mut _s);
            _s
        });
    _s
}quote_spanned! {span=>
228            #[automatically_derived]
229            impl #impl_generics ::core::convert::From<#from> for #ty #ty_generics #where_clause {
230                #from_function
231            }
232        };
233        let lint_allows = if input.generics.lifetimes().next().is_some() {
234            Some({
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::__private::push_ident(&mut _s, "clippy");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "elidable_lifetime_names");
    ::quote::__private::push_comma(&mut _s);
    ::quote::__private::push_ident(&mut _s, "clippy");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "needless_lifetimes");
    ::quote::__private::push_comma(&mut _s);
    _s
}quote! {
235                clippy::elidable_lifetime_names,
236                clippy::needless_lifetimes,
237            })
238        } else {
239            None
240        };
241        Some({
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::__private::push_pound(&mut _s);
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Bracket,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::push_ident(&mut _s, "allow");
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Parenthesis,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::__private::push_ident(&mut _s, "deprecated");
                    ::quote::__private::push_comma(&mut _s);
                    ::quote::__private::push_ident(&mut _s,
                        "unused_qualifications");
                    ::quote::__private::push_comma(&mut _s);
                    ::quote::ToTokens::to_tokens(&lint_allows, &mut _s);
                    _s
                });
            _s
        });
    ::quote::ToTokens::to_tokens(&from_impl, &mut _s);
    ::quote::ToTokens::to_tokens(&box_implementations, &mut _s);
    _s
}quote! {
242            #[allow(
243                deprecated,
244                unused_qualifications,
245                #lint_allows
246            )]
247            #from_impl
248            #box_implementations
249        })
250    });
251
252    let location_impl = input.location_field().map(|location_field| {
253        let location = &location_field.member;
254        let body = if type_is_option(location_field.ty) {
255            {
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::__private::push_ident(&mut _s, "self");
    ::quote::__private::push_dot(&mut _s);
    ::quote::ToTokens::to_tokens(&location, &mut _s);
    _s
}quote! {
256                self.#location
257            }
258        } else {
259            {
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::__private::push_ident(&mut _s, "Some");
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Parenthesis,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::push_ident(&mut _s, "self");
            ::quote::__private::push_dot(&mut _s);
            ::quote::ToTokens::to_tokens(&location, &mut _s);
            _s
        });
    _s
}quote! {
260                Some(self.#location)
261            }
262        };
263        {
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::__private::push_pound(&mut _s);
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Bracket,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::push_ident(&mut _s, "allow");
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Parenthesis,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::__private::push_ident(&mut _s,
                        "unused_qualifications");
                    _s
                });
            _s
        });
    ::quote::__private::push_pound(&mut _s);
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Bracket,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::push_ident(&mut _s, "automatically_derived");
            _s
        });
    ::quote::__private::push_ident(&mut _s, "impl");
    ::quote::ToTokens::to_tokens(&impl_generics, &mut _s);
    ::quote::ToTokens::to_tokens(&ty, &mut _s);
    ::quote::ToTokens::to_tokens(&ty_generics, &mut _s);
    ::quote::ToTokens::to_tokens(&where_clause, &mut _s);
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Brace,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::push_ident(&mut _s, "pub");
            ::quote::__private::push_ident(&mut _s, "fn");
            ::quote::__private::push_ident(&mut _s, "location");
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Parenthesis,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::__private::push_and(&mut _s);
                    ::quote::__private::push_ident(&mut _s, "self");
                    _s
                });
            ::quote::__private::push_rarrow(&mut _s);
            ::quote::__private::push_ident(&mut _s, "Option");
            ::quote::__private::push_lt(&mut _s);
            ::quote::__private::push_and(&mut _s);
            ::quote::__private::push_lifetime(&mut _s, "\'static");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "core");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "panic");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "Location");
            ::quote::__private::push_lt(&mut _s);
            ::quote::__private::push_lifetime(&mut _s, "\'static");
            ::quote::__private::push_shr(&mut _s);
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Brace,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::ToTokens::to_tokens(&body, &mut _s);
                    _s
                });
            _s
        });
    _s
}quote! {
264            #[allow(unused_qualifications)]
265            #[automatically_derived]
266            impl #impl_generics #ty #ty_generics #where_clause {
267                pub fn location(&self) -> Option<&'static ::core::panic::Location<'static>> {
268                    #body
269                }
270            }
271        }
272    });
273
274    if input.generics.type_params().next().is_some() {
275        let self_token = <::syn::token::SelfTypeToken![Self]>::default();
276        error_inferred_bounds.insert(self_token, Trait::Debug);
277        error_inferred_bounds.insert(self_token, Trait::Display);
278    }
279    let error_where_clause = error_inferred_bounds.augment_where_clause(input.generics);
280
281    {
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::__private::push_pound(&mut _s);
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Bracket,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::push_ident(&mut _s, "allow");
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Parenthesis,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::__private::push_ident(&mut _s,
                        "unused_qualifications");
                    _s
                });
            _s
        });
    ::quote::__private::push_pound(&mut _s);
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Bracket,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::push_ident(&mut _s, "automatically_derived");
            _s
        });
    ::quote::__private::push_ident(&mut _s, "impl");
    ::quote::ToTokens::to_tokens(&impl_generics, &mut _s);
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "wherror");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::ToTokens::to_tokens(&private, &mut _s);
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "Error");
    ::quote::__private::push_ident(&mut _s, "for");
    ::quote::ToTokens::to_tokens(&ty, &mut _s);
    ::quote::ToTokens::to_tokens(&ty_generics, &mut _s);
    ::quote::ToTokens::to_tokens(&error_where_clause, &mut _s);
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Brace,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::ToTokens::to_tokens(&source_method, &mut _s);
            ::quote::ToTokens::to_tokens(&provide_method, &mut _s);
            _s
        });
    ::quote::ToTokens::to_tokens(&display_impl, &mut _s);
    ::quote::ToTokens::to_tokens(&from_impl, &mut _s);
    ::quote::ToTokens::to_tokens(&location_impl, &mut _s);
    _s
}quote! {
282        #[allow(unused_qualifications)]
283        #[automatically_derived]
284        impl #impl_generics ::wherror::#private::Error for #ty #ty_generics #error_where_clause {
285            #source_method
286            #provide_method
287        }
288        #display_impl
289        #from_impl
290        #location_impl
291    }
292}
293
294fn impl_enum(input: Enum) -> TokenStream {
295    let ty = call_site_ident(&input.ident);
296    let (impl_generics, ty_generics, where_clause) = input.generics.split_for_impl();
297    let mut error_inferred_bounds = InferredBounds::new();
298
299    let source_method = if input.has_source() {
300        let arms = input.variants.iter().map(|variant| {
301            let ident = &variant.ident;
302            if let Some(transparent_attr) = &variant.attrs.transparent {
303                let only_field = &variant.fields[0];
304                if only_field.contains_generic {
305                    error_inferred_bounds.insert(only_field.ty, {
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "wherror");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::ToTokens::to_tokens(&private, &mut _s);
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "Error");
    _s
}quote!(::wherror::#private::Error));
306                }
307                let member = &only_field.member;
308                let source = {
    let _span: ::quote::__private::Span =
        ::quote::__private::get_span(transparent_attr.span).__into_span();
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::__private::push_colon2_spanned(&mut _s, _span);
    ::quote::__private::push_ident_spanned(&mut _s, _span, "wherror");
    ::quote::__private::push_colon2_spanned(&mut _s, _span);
    ::quote::ToTokens::to_tokens(&private, &mut _s);
    ::quote::__private::push_colon2_spanned(&mut _s, _span);
    ::quote::__private::push_ident_spanned(&mut _s, _span, "Error");
    ::quote::__private::push_colon2_spanned(&mut _s, _span);
    ::quote::__private::push_ident_spanned(&mut _s, _span, "source");
    ::quote::__private::push_group_spanned(&mut _s, _span,
        ::quote::__private::Delimiter::Parenthesis,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::push_ident_spanned(&mut _s, _span,
                "transparent");
            ::quote::__private::push_dot_spanned(&mut _s, _span);
            ::quote::__private::push_ident_spanned(&mut _s, _span,
                "as_dyn_error");
            ::quote::__private::push_group_spanned(&mut _s, _span,
                ::quote::__private::Delimiter::Parenthesis,
                { ::quote::__private::TokenStream::new() });
            _s
        });
    _s
}quote_spanned! {transparent_attr.span=>
309                    ::wherror::#private::Error::source(transparent.as_dyn_error())
310                };
311                {
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::ToTokens::to_tokens(&ty, &mut _s);
    ::quote::__private::push_colon2(&mut _s);
    ::quote::ToTokens::to_tokens(&ident, &mut _s);
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Brace,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::ToTokens::to_tokens(&member, &mut _s);
            ::quote::__private::push_colon(&mut _s);
            ::quote::__private::push_ident(&mut _s, "transparent");
            _s
        });
    ::quote::__private::push_fat_arrow(&mut _s);
    ::quote::ToTokens::to_tokens(&source, &mut _s);
    ::quote::__private::push_comma(&mut _s);
    _s
}quote! {
312                    #ty::#ident {#member: transparent} => #source,
313                }
314            } else if let Some(source_field) = variant.source_field() {
315                let source = &source_field.member;
316                if source_field.contains_generic {
317                    let ty = unoptional_type(source_field.ty);
318                    error_inferred_bounds.insert(ty, {
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "wherror");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::ToTokens::to_tokens(&private, &mut _s);
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "Error");
    ::quote::__private::push_add(&mut _s);
    ::quote::__private::push_lifetime(&mut _s, "\'static");
    _s
}quote!(::wherror::#private::Error + 'static));
319                }
320                let asref = if type_is_option(source_field.ty) {
321                    Some({
    let _span: ::quote::__private::Span =
        ::quote::__private::get_span(source.span()).__into_span();
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::__private::push_dot_spanned(&mut _s, _span);
    ::quote::__private::push_ident_spanned(&mut _s, _span, "as_ref");
    ::quote::__private::push_group_spanned(&mut _s, _span,
        ::quote::__private::Delimiter::Parenthesis,
        { ::quote::__private::TokenStream::new() });
    ::quote::__private::push_question_spanned(&mut _s, _span);
    _s
}quote_spanned!(source.span()=> .as_ref()?))
322                } else {
323                    None
324                };
325                let varsource = {
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::__private::push_ident(&mut _s, "source");
    _s
}quote!(source);
326                let dyn_error = {
    let _span: ::quote::__private::Span =
        ::quote::__private::get_span(source_field.source_span()).__into_span();
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::ToTokens::to_tokens(&varsource, &mut _s);
    ::quote::ToTokens::to_tokens(&asref, &mut _s);
    ::quote::__private::push_dot_spanned(&mut _s, _span);
    ::quote::__private::push_ident_spanned(&mut _s, _span, "as_dyn_error");
    ::quote::__private::push_group_spanned(&mut _s, _span,
        ::quote::__private::Delimiter::Parenthesis,
        { ::quote::__private::TokenStream::new() });
    _s
}quote_spanned! {source_field.source_span()=>
327                    #varsource #asref.as_dyn_error()
328                };
329                {
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::ToTokens::to_tokens(&ty, &mut _s);
    ::quote::__private::push_colon2(&mut _s);
    ::quote::ToTokens::to_tokens(&ident, &mut _s);
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Brace,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::ToTokens::to_tokens(&source, &mut _s);
            ::quote::__private::push_colon(&mut _s);
            ::quote::ToTokens::to_tokens(&varsource, &mut _s);
            ::quote::__private::push_comma(&mut _s);
            ::quote::__private::push_dot2(&mut _s);
            _s
        });
    ::quote::__private::push_fat_arrow(&mut _s);
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "core");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "option");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "Option");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "Some");
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Parenthesis,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::ToTokens::to_tokens(&dyn_error, &mut _s);
            _s
        });
    ::quote::__private::push_comma(&mut _s);
    _s
}quote! {
330                    #ty::#ident {#source: #varsource, ..} => ::core::option::Option::Some(#dyn_error),
331                }
332            } else {
333                {
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::ToTokens::to_tokens(&ty, &mut _s);
    ::quote::__private::push_colon2(&mut _s);
    ::quote::ToTokens::to_tokens(&ident, &mut _s);
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Brace,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::push_dot2(&mut _s);
            _s
        });
    ::quote::__private::push_fat_arrow(&mut _s);
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "core");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "option");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "Option");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "None");
    ::quote::__private::push_comma(&mut _s);
    _s
}quote! {
334                    #ty::#ident {..} => ::core::option::Option::None,
335                }
336            }
337        });
338        Some({
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::__private::push_ident(&mut _s, "fn");
    ::quote::__private::push_ident(&mut _s, "source");
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Parenthesis,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::push_and(&mut _s);
            ::quote::__private::push_ident(&mut _s, "self");
            _s
        });
    ::quote::__private::push_rarrow(&mut _s);
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "core");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "option");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "Option");
    ::quote::__private::push_lt(&mut _s);
    ::quote::__private::push_and(&mut _s);
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Parenthesis,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::push_ident(&mut _s, "dyn");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "wherror");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::ToTokens::to_tokens(&private, &mut _s);
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "Error");
            ::quote::__private::push_add(&mut _s);
            ::quote::__private::push_lifetime(&mut _s, "\'static");
            _s
        });
    ::quote::__private::push_gt(&mut _s);
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Brace,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::push_ident(&mut _s, "use");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "wherror");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::ToTokens::to_tokens(&private, &mut _s);
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "AsDynError");
            ::quote::__private::push_ident(&mut _s, "as");
            ::quote::__private::push_underscore(&mut _s);
            ::quote::__private::push_semi(&mut _s);
            ::quote::__private::push_pound(&mut _s);
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Bracket,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::__private::push_ident(&mut _s, "allow");
                    ::quote::__private::push_group(&mut _s,
                        ::quote::__private::Delimiter::Parenthesis,
                        {
                            let mut _s = ::quote::__private::TokenStream::new();
                            ::quote::__private::push_ident(&mut _s, "deprecated");
                            _s
                        });
                    _s
                });
            ::quote::__private::push_ident(&mut _s, "match");
            ::quote::__private::push_ident(&mut _s, "self");
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Brace,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    {
                        use ::quote::__private::ext::*;
                        let has_iter = ::quote::__private::HasIterator::<false>;
                        #[allow(unused_mut)]
                        let (mut arms, i) = arms.quote_into_iter();
                        let has_iter = has_iter | i;
                        <_ as
                                ::quote::__private::CheckHasIterator<true>>::check(has_iter);
                        while true {
                            let arms =
                                match arms.next() {
                                    Some(_x) => ::quote::__private::RepInterp(_x),
                                    None => break,
                                };
                            ::quote::ToTokens::to_tokens(&arms, &mut _s);
                        }
                    }
                    _s
                });
            _s
        });
    _s
}quote! {
339            fn source(&self) -> ::core::option::Option<&(dyn ::wherror::#private::Error + 'static)> {
340                use ::wherror::#private::AsDynError as _;
341                #[allow(deprecated)]
342                match self {
343                    #(#arms)*
344                }
345            }
346        })
347    } else {
348        None
349    };
350
351    let provide_method = if input.has_backtrace() {
352        let request = {
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::__private::push_ident(&mut _s, "request");
    _s
}quote!(request);
353        let arms = input.variants.iter().map(|variant| {
354            let ident = &variant.ident;
355            match (variant.backtrace_field(), variant.source_field()) {
356                (Some(backtrace_field), Some(source_field))
357                    if backtrace_field.attrs.backtrace.is_none() =>
358                {
359                    let backtrace = &backtrace_field.member;
360                    let source = &source_field.member;
361                    let varsource = {
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::__private::push_ident(&mut _s, "source");
    _s
}quote!(source);
362                    let source_provide = if type_is_option(source_field.ty) {
363                        {
    let _span: ::quote::__private::Span =
        ::quote::__private::get_span(source.span()).__into_span();
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::__private::push_ident_spanned(&mut _s, _span, "if");
    ::quote::__private::push_ident_spanned(&mut _s, _span, "let");
    ::quote::__private::push_colon2_spanned(&mut _s, _span);
    ::quote::__private::push_ident_spanned(&mut _s, _span, "core");
    ::quote::__private::push_colon2_spanned(&mut _s, _span);
    ::quote::__private::push_ident_spanned(&mut _s, _span, "option");
    ::quote::__private::push_colon2_spanned(&mut _s, _span);
    ::quote::__private::push_ident_spanned(&mut _s, _span, "Option");
    ::quote::__private::push_colon2_spanned(&mut _s, _span);
    ::quote::__private::push_ident_spanned(&mut _s, _span, "Some");
    ::quote::__private::push_group_spanned(&mut _s, _span,
        ::quote::__private::Delimiter::Parenthesis,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::push_ident_spanned(&mut _s, _span, "source");
            _s
        });
    ::quote::__private::push_eq_spanned(&mut _s, _span);
    ::quote::ToTokens::to_tokens(&varsource, &mut _s);
    ::quote::__private::push_group_spanned(&mut _s, _span,
        ::quote::__private::Delimiter::Brace,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::push_ident_spanned(&mut _s, _span, "source");
            ::quote::__private::push_dot_spanned(&mut _s, _span);
            ::quote::__private::push_ident_spanned(&mut _s, _span,
                "thiserror_provide");
            ::quote::__private::push_group_spanned(&mut _s, _span,
                ::quote::__private::Delimiter::Parenthesis,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::ToTokens::to_tokens(&request, &mut _s);
                    _s
                });
            ::quote::__private::push_semi_spanned(&mut _s, _span);
            _s
        });
    _s
}quote_spanned! {source.span()=>
364                            if let ::core::option::Option::Some(source) = #varsource {
365                                source.thiserror_provide(#request);
366                            }
367                        }
368                    } else {
369                        {
    let _span: ::quote::__private::Span =
        ::quote::__private::get_span(source.span()).__into_span();
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::ToTokens::to_tokens(&varsource, &mut _s);
    ::quote::__private::push_dot_spanned(&mut _s, _span);
    ::quote::__private::push_ident_spanned(&mut _s, _span,
        "thiserror_provide");
    ::quote::__private::push_group_spanned(&mut _s, _span,
        ::quote::__private::Delimiter::Parenthesis,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::ToTokens::to_tokens(&request, &mut _s);
            _s
        });
    ::quote::__private::push_semi_spanned(&mut _s, _span);
    _s
}quote_spanned! {source.span()=>
370                            #varsource.thiserror_provide(#request);
371                        }
372                    };
373                    let self_provide = if type_is_option(backtrace_field.ty) {
374                        {
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::__private::push_ident(&mut _s, "if");
    ::quote::__private::push_ident(&mut _s, "let");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "core");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "option");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "Option");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "Some");
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Parenthesis,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::push_ident(&mut _s, "backtrace");
            _s
        });
    ::quote::__private::push_eq(&mut _s);
    ::quote::__private::push_ident(&mut _s, "backtrace");
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Brace,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::ToTokens::to_tokens(&request, &mut _s);
            ::quote::__private::push_dot(&mut _s);
            ::quote::__private::push_ident(&mut _s, "provide_ref");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_lt(&mut _s);
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "wherror");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::ToTokens::to_tokens(&private, &mut _s);
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "Backtrace");
            ::quote::__private::push_gt(&mut _s);
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Parenthesis,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::__private::push_ident(&mut _s, "backtrace");
                    _s
                });
            ::quote::__private::push_semi(&mut _s);
            _s
        });
    _s
}quote! {
375                            if let ::core::option::Option::Some(backtrace) = backtrace {
376                                #request.provide_ref::<::wherror::#private::Backtrace>(backtrace);
377                            }
378                        }
379                    } else {
380                        {
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::ToTokens::to_tokens(&request, &mut _s);
    ::quote::__private::push_dot(&mut _s);
    ::quote::__private::push_ident(&mut _s, "provide_ref");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_lt(&mut _s);
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "wherror");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::ToTokens::to_tokens(&private, &mut _s);
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "Backtrace");
    ::quote::__private::push_gt(&mut _s);
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Parenthesis,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::push_ident(&mut _s, "backtrace");
            _s
        });
    ::quote::__private::push_semi(&mut _s);
    _s
}quote! {
381                            #request.provide_ref::<::wherror::#private::Backtrace>(backtrace);
382                        }
383                    };
384                    {
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::ToTokens::to_tokens(&ty, &mut _s);
    ::quote::__private::push_colon2(&mut _s);
    ::quote::ToTokens::to_tokens(&ident, &mut _s);
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Brace,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::ToTokens::to_tokens(&backtrace, &mut _s);
            ::quote::__private::push_colon(&mut _s);
            ::quote::__private::push_ident(&mut _s, "backtrace");
            ::quote::__private::push_comma(&mut _s);
            ::quote::ToTokens::to_tokens(&source, &mut _s);
            ::quote::__private::push_colon(&mut _s);
            ::quote::ToTokens::to_tokens(&varsource, &mut _s);
            ::quote::__private::push_comma(&mut _s);
            ::quote::__private::push_dot2(&mut _s);
            _s
        });
    ::quote::__private::push_fat_arrow(&mut _s);
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Brace,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::push_ident(&mut _s, "use");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "wherror");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::ToTokens::to_tokens(&private, &mut _s);
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "ThiserrorProvide");
            ::quote::__private::push_ident(&mut _s, "as");
            ::quote::__private::push_underscore(&mut _s);
            ::quote::__private::push_semi(&mut _s);
            ::quote::ToTokens::to_tokens(&source_provide, &mut _s);
            ::quote::ToTokens::to_tokens(&self_provide, &mut _s);
            _s
        });
    _s
}quote! {
385                        #ty::#ident {
386                            #backtrace: backtrace,
387                            #source: #varsource,
388                            ..
389                        } => {
390                            use ::wherror::#private::ThiserrorProvide as _;
391                            #source_provide
392                            #self_provide
393                        }
394                    }
395                }
396                (Some(backtrace_field), Some(source_field))
397                    if backtrace_field.member == source_field.member =>
398                {
399                    let backtrace = &backtrace_field.member;
400                    let varsource = {
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::__private::push_ident(&mut _s, "source");
    _s
}quote!(source);
401                    let source_provide = if type_is_option(source_field.ty) {
402                        {
    let _span: ::quote::__private::Span =
        ::quote::__private::get_span(backtrace.span()).__into_span();
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::__private::push_ident_spanned(&mut _s, _span, "if");
    ::quote::__private::push_ident_spanned(&mut _s, _span, "let");
    ::quote::__private::push_colon2_spanned(&mut _s, _span);
    ::quote::__private::push_ident_spanned(&mut _s, _span, "core");
    ::quote::__private::push_colon2_spanned(&mut _s, _span);
    ::quote::__private::push_ident_spanned(&mut _s, _span, "option");
    ::quote::__private::push_colon2_spanned(&mut _s, _span);
    ::quote::__private::push_ident_spanned(&mut _s, _span, "Option");
    ::quote::__private::push_colon2_spanned(&mut _s, _span);
    ::quote::__private::push_ident_spanned(&mut _s, _span, "Some");
    ::quote::__private::push_group_spanned(&mut _s, _span,
        ::quote::__private::Delimiter::Parenthesis,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::push_ident_spanned(&mut _s, _span, "source");
            _s
        });
    ::quote::__private::push_eq_spanned(&mut _s, _span);
    ::quote::ToTokens::to_tokens(&varsource, &mut _s);
    ::quote::__private::push_group_spanned(&mut _s, _span,
        ::quote::__private::Delimiter::Brace,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::push_ident_spanned(&mut _s, _span, "source");
            ::quote::__private::push_dot_spanned(&mut _s, _span);
            ::quote::__private::push_ident_spanned(&mut _s, _span,
                "thiserror_provide");
            ::quote::__private::push_group_spanned(&mut _s, _span,
                ::quote::__private::Delimiter::Parenthesis,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::ToTokens::to_tokens(&request, &mut _s);
                    _s
                });
            ::quote::__private::push_semi_spanned(&mut _s, _span);
            _s
        });
    _s
}quote_spanned! {backtrace.span()=>
403                            if let ::core::option::Option::Some(source) = #varsource {
404                                source.thiserror_provide(#request);
405                            }
406                        }
407                    } else {
408                        {
    let _span: ::quote::__private::Span =
        ::quote::__private::get_span(backtrace.span()).__into_span();
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::ToTokens::to_tokens(&varsource, &mut _s);
    ::quote::__private::push_dot_spanned(&mut _s, _span);
    ::quote::__private::push_ident_spanned(&mut _s, _span,
        "thiserror_provide");
    ::quote::__private::push_group_spanned(&mut _s, _span,
        ::quote::__private::Delimiter::Parenthesis,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::ToTokens::to_tokens(&request, &mut _s);
            _s
        });
    ::quote::__private::push_semi_spanned(&mut _s, _span);
    _s
}quote_spanned! {backtrace.span()=>
409                            #varsource.thiserror_provide(#request);
410                        }
411                    };
412                    {
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::ToTokens::to_tokens(&ty, &mut _s);
    ::quote::__private::push_colon2(&mut _s);
    ::quote::ToTokens::to_tokens(&ident, &mut _s);
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Brace,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::ToTokens::to_tokens(&backtrace, &mut _s);
            ::quote::__private::push_colon(&mut _s);
            ::quote::ToTokens::to_tokens(&varsource, &mut _s);
            ::quote::__private::push_comma(&mut _s);
            ::quote::__private::push_dot2(&mut _s);
            _s
        });
    ::quote::__private::push_fat_arrow(&mut _s);
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Brace,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::push_ident(&mut _s, "use");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "wherror");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::ToTokens::to_tokens(&private, &mut _s);
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "ThiserrorProvide");
            ::quote::__private::push_ident(&mut _s, "as");
            ::quote::__private::push_underscore(&mut _s);
            ::quote::__private::push_semi(&mut _s);
            ::quote::ToTokens::to_tokens(&source_provide, &mut _s);
            _s
        });
    _s
}quote! {
413                        #ty::#ident {#backtrace: #varsource, ..} => {
414                            use ::wherror::#private::ThiserrorProvide as _;
415                            #source_provide
416                        }
417                    }
418                }
419                (Some(backtrace_field), _) => {
420                    let backtrace = &backtrace_field.member;
421                    let body = if type_is_option(backtrace_field.ty) {
422                        {
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::__private::push_ident(&mut _s, "if");
    ::quote::__private::push_ident(&mut _s, "let");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "core");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "option");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "Option");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "Some");
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Parenthesis,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::push_ident(&mut _s, "backtrace");
            _s
        });
    ::quote::__private::push_eq(&mut _s);
    ::quote::__private::push_ident(&mut _s, "backtrace");
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Brace,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::ToTokens::to_tokens(&request, &mut _s);
            ::quote::__private::push_dot(&mut _s);
            ::quote::__private::push_ident(&mut _s, "provide_ref");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_lt(&mut _s);
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "wherror");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::ToTokens::to_tokens(&private, &mut _s);
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "Backtrace");
            ::quote::__private::push_gt(&mut _s);
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Parenthesis,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::__private::push_ident(&mut _s, "backtrace");
                    _s
                });
            ::quote::__private::push_semi(&mut _s);
            _s
        });
    _s
}quote! {
423                            if let ::core::option::Option::Some(backtrace) = backtrace {
424                                #request.provide_ref::<::wherror::#private::Backtrace>(backtrace);
425                            }
426                        }
427                    } else {
428                        {
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::ToTokens::to_tokens(&request, &mut _s);
    ::quote::__private::push_dot(&mut _s);
    ::quote::__private::push_ident(&mut _s, "provide_ref");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_lt(&mut _s);
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "wherror");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::ToTokens::to_tokens(&private, &mut _s);
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "Backtrace");
    ::quote::__private::push_gt(&mut _s);
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Parenthesis,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::push_ident(&mut _s, "backtrace");
            _s
        });
    ::quote::__private::push_semi(&mut _s);
    _s
}quote! {
429                            #request.provide_ref::<::wherror::#private::Backtrace>(backtrace);
430                        }
431                    };
432                    {
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::ToTokens::to_tokens(&ty, &mut _s);
    ::quote::__private::push_colon2(&mut _s);
    ::quote::ToTokens::to_tokens(&ident, &mut _s);
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Brace,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::ToTokens::to_tokens(&backtrace, &mut _s);
            ::quote::__private::push_colon(&mut _s);
            ::quote::__private::push_ident(&mut _s, "backtrace");
            ::quote::__private::push_comma(&mut _s);
            ::quote::__private::push_dot2(&mut _s);
            _s
        });
    ::quote::__private::push_fat_arrow(&mut _s);
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Brace,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::ToTokens::to_tokens(&body, &mut _s);
            _s
        });
    _s
}quote! {
433                        #ty::#ident {#backtrace: backtrace, ..} => {
434                            #body
435                        }
436                    }
437                }
438                (None, _) => {
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::ToTokens::to_tokens(&ty, &mut _s);
    ::quote::__private::push_colon2(&mut _s);
    ::quote::ToTokens::to_tokens(&ident, &mut _s);
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Brace,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::push_dot2(&mut _s);
            _s
        });
    ::quote::__private::push_fat_arrow(&mut _s);
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Brace,
        ::quote::__private::TokenStream::new());
    _s
}quote! {
439                    #ty::#ident {..} => {}
440                },
441            }
442        });
443        Some({
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::__private::push_ident(&mut _s, "fn");
    ::quote::__private::push_ident(&mut _s, "provide");
    ::quote::__private::push_lt(&mut _s);
    ::quote::__private::push_lifetime(&mut _s, "\'_request");
    ::quote::__private::push_gt(&mut _s);
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Parenthesis,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::push_and(&mut _s);
            ::quote::__private::push_lifetime(&mut _s, "\'_request");
            ::quote::__private::push_ident(&mut _s, "self");
            ::quote::__private::push_comma(&mut _s);
            ::quote::ToTokens::to_tokens(&request, &mut _s);
            ::quote::__private::push_colon(&mut _s);
            ::quote::__private::push_and(&mut _s);
            ::quote::__private::push_ident(&mut _s, "mut");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "core");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "error");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "Request");
            ::quote::__private::push_lt(&mut _s);
            ::quote::__private::push_lifetime(&mut _s, "\'_request");
            ::quote::__private::push_gt(&mut _s);
            _s
        });
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Brace,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::push_pound(&mut _s);
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Bracket,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::__private::push_ident(&mut _s, "allow");
                    ::quote::__private::push_group(&mut _s,
                        ::quote::__private::Delimiter::Parenthesis,
                        {
                            let mut _s = ::quote::__private::TokenStream::new();
                            ::quote::__private::push_ident(&mut _s, "deprecated");
                            _s
                        });
                    _s
                });
            ::quote::__private::push_ident(&mut _s, "match");
            ::quote::__private::push_ident(&mut _s, "self");
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Brace,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    {
                        use ::quote::__private::ext::*;
                        let has_iter = ::quote::__private::HasIterator::<false>;
                        #[allow(unused_mut)]
                        let (mut arms, i) = arms.quote_into_iter();
                        let has_iter = has_iter | i;
                        <_ as
                                ::quote::__private::CheckHasIterator<true>>::check(has_iter);
                        while true {
                            let arms =
                                match arms.next() {
                                    Some(_x) => ::quote::__private::RepInterp(_x),
                                    None => break,
                                };
                            ::quote::ToTokens::to_tokens(&arms, &mut _s);
                        }
                    }
                    _s
                });
            _s
        });
    _s
}quote! {
444            fn provide<'_request>(&'_request self, #request: &mut ::core::error::Request<'_request>) {
445                #[allow(deprecated)]
446                match self {
447                    #(#arms)*
448                }
449            }
450        })
451    } else {
452        None
453    };
454
455    let display_impl = if input.has_display() {
456        let mut display_inferred_bounds = InferredBounds::new();
457        let has_bonus_display = input.variants.iter().any(|v| {
458            v.attrs
459                .display
460                .as_ref()
461                .is_some_and(|display| display.has_bonus_display)
462        });
463        let use_as_display = use_as_display(has_bonus_display);
464        let void_deref = if input.variants.is_empty() {
465            Some({
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::__private::push_star(&mut _s);
    _s
}quote!(*))
466        } else {
467            None
468        };
469        let arms = input.variants.iter().map(|variant| {
470            let mut display_implied_bounds = Set::new();
471            let display = if let Some(display) = &variant.attrs.display {
472                display_implied_bounds.clone_from(&display.implied_bounds);
473                display.to_token_stream()
474            } else if let Some(fmt) = &variant.attrs.fmt {
475                let fmt_path = &fmt.path;
476                let vars = variant.fields.iter().map(|field| match &field.member {
477                    MemberUnraw::Named(ident) => ident.to_local(),
478                    MemberUnraw::Unnamed(index) => match ::quote::__private::IdentFragmentAdapter(&index) {
    arg =>
        ::quote::__private::mk_ident(&::alloc::__export::must_use({
                        ::alloc::fmt::format(format_args!("_{0}", arg))
                    }), ::quote::__private::Option::None.or(arg.span())),
}format_ident!("_{}", index),
479                });
480                {
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::ToTokens::to_tokens(&fmt_path, &mut _s);
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Parenthesis,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            {
                use ::quote::__private::ext::*;
                let has_iter = ::quote::__private::HasIterator::<false>;
                #[allow(unused_mut)]
                let (mut vars, i) = vars.quote_into_iter();
                let has_iter = has_iter | i;
                <_ as
                        ::quote::__private::CheckHasIterator<true>>::check(has_iter);
                while true {
                    let vars =
                        match vars.next() {
                            Some(_x) => ::quote::__private::RepInterp(_x),
                            None => break,
                        };
                    ::quote::ToTokens::to_tokens(&vars, &mut _s);
                    ::quote::__private::push_comma(&mut _s);
                }
            }
            ::quote::__private::push_ident(&mut _s, "__formatter");
            _s
        });
    _s
}quote!(#fmt_path(#(#vars,)* __formatter))
481            } else if let Some(_transparent_attr) = &variant.attrs.transparent {
482                // Transparent: forward to the single field's Display implementation
483                let only_field = match &variant.fields[0].member {
484                    MemberUnraw::Named(ident) => ident.to_local(),
485                    MemberUnraw::Unnamed(index) => match ::quote::__private::IdentFragmentAdapter(&index) {
    arg =>
        ::quote::__private::mk_ident(&::alloc::__export::must_use({
                        ::alloc::fmt::format(format_args!("_{0}", arg))
                    }), ::quote::__private::Option::None.or(arg.span())),
}format_ident!("_{}", index),
486                };
487                display_implied_bounds.insert((0, Trait::Display));
488                {
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "core");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "fmt");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "Display");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "fmt");
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Parenthesis,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::ToTokens::to_tokens(&only_field, &mut _s);
            ::quote::__private::push_comma(&mut _s);
            ::quote::__private::push_ident(&mut _s, "__formatter");
            _s
        });
    _s
}quote!(::core::fmt::Display::fmt(#only_field, __formatter))
489            } else if let Some(debug_attr) = &variant.attrs.debug {
490                // Variant-level #[error(debug)]: debug the variant fields directly
491                let ident = &variant.ident;
492                let debug_span = debug_attr.span;
493                if variant.fields.is_empty() {
494                    // Unit variant: just display the variant name
495                    let variant_name = ident.to_string();
496                    {
    let _span: ::quote::__private::Span =
        ::quote::__private::get_span(debug_span).__into_span();
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::__private::push_colon2_spanned(&mut _s, _span);
    ::quote::__private::push_ident_spanned(&mut _s, _span, "core");
    ::quote::__private::push_colon2_spanned(&mut _s, _span);
    ::quote::__private::push_ident_spanned(&mut _s, _span, "write");
    ::quote::__private::push_bang_spanned(&mut _s, _span);
    ::quote::__private::push_group_spanned(&mut _s, _span,
        ::quote::__private::Delimiter::Parenthesis,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::push_ident_spanned(&mut _s, _span,
                "__formatter");
            ::quote::__private::push_comma_spanned(&mut _s, _span);
            ::quote::__private::parse_spanned(&mut _s, _span, "\"{}\"");
            ::quote::__private::push_comma_spanned(&mut _s, _span);
            ::quote::ToTokens::to_tokens(&variant_name, &mut _s);
            _s
        });
    _s
}quote_spanned! {debug_span=>
497                        ::core::write!(__formatter, "{}", #variant_name)
498                    }
499                } else if variant.fields.len() == 1 && #[allow(non_exhaustive_omitted_patterns)] match variant.fields[0].member {
    MemberUnraw::Unnamed(_) => true,
    _ => false,
}matches!(variant.fields[0].member, MemberUnraw::Unnamed(_)) {
500                    // Tuple variant with single field: Format as Variant(field)
501                    let mut field_var = ::quote::__private::mk_ident(&::alloc::__export::must_use({
                ::alloc::fmt::format(format_args!("_0"))
            }), ::quote::__private::Option::None)format_ident!("_0");
502                    field_var.set_span(debug_span);
503                    {
    let _span: ::quote::__private::Span =
        ::quote::__private::get_span(debug_span).__into_span();
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::__private::push_colon2_spanned(&mut _s, _span);
    ::quote::__private::push_ident_spanned(&mut _s, _span, "core");
    ::quote::__private::push_colon2_spanned(&mut _s, _span);
    ::quote::__private::push_ident_spanned(&mut _s, _span, "write");
    ::quote::__private::push_bang_spanned(&mut _s, _span);
    ::quote::__private::push_group_spanned(&mut _s, _span,
        ::quote::__private::Delimiter::Parenthesis,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::push_ident_spanned(&mut _s, _span,
                "__formatter");
            ::quote::__private::push_comma_spanned(&mut _s, _span);
            ::quote::__private::parse_spanned(&mut _s, _span, "\"{}({:?})\"");
            ::quote::__private::push_comma_spanned(&mut _s, _span);
            ::quote::__private::push_ident_spanned(&mut _s, _span,
                "stringify");
            ::quote::__private::push_bang_spanned(&mut _s, _span);
            ::quote::__private::push_group_spanned(&mut _s, _span,
                ::quote::__private::Delimiter::Parenthesis,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::ToTokens::to_tokens(&ident, &mut _s);
                    _s
                });
            ::quote::__private::push_comma_spanned(&mut _s, _span);
            ::quote::ToTokens::to_tokens(&field_var, &mut _s);
            _s
        });
    _s
}quote_spanned! {debug_span=>
504                        ::core::write!(__formatter, "{}({:?})", stringify!(#ident), #field_var)
505                    }
506                } else if variant.fields.iter().all(|f| #[allow(non_exhaustive_omitted_patterns)] match f.member {
    MemberUnraw::Unnamed(_) => true,
    _ => false,
}matches!(f.member, MemberUnraw::Unnamed(_))) {
507                    // Tuple variant with multiple fields: Format as Variant(field1, field2, ...)
508                    let field_vars: Vec<_> = variant.fields.iter().enumerate().map(|(i, _)| {
509                        let var = match ::quote::__private::IdentFragmentAdapter(&i) {
    arg =>
        ::quote::__private::mk_ident(&::alloc::__export::must_use({
                        ::alloc::fmt::format(format_args!("_{0}", arg))
                    }), ::quote::__private::Option::None.or(arg.span())),
}format_ident!("_{}", i);
510                        {
    let _span: ::quote::__private::Span =
        ::quote::__private::get_span(debug_span).__into_span();
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::ToTokens::to_tokens(&var, &mut _s);
    _s
}quote_spanned! {debug_span=> #var}
511                    }).collect();
512                    {
    let _span: ::quote::__private::Span =
        ::quote::__private::get_span(debug_span).__into_span();
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::__private::push_colon2_spanned(&mut _s, _span);
    ::quote::__private::push_ident_spanned(&mut _s, _span, "core");
    ::quote::__private::push_colon2_spanned(&mut _s, _span);
    ::quote::__private::push_ident_spanned(&mut _s, _span, "write");
    ::quote::__private::push_bang_spanned(&mut _s, _span);
    ::quote::__private::push_group_spanned(&mut _s, _span,
        ::quote::__private::Delimiter::Parenthesis,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::push_ident_spanned(&mut _s, _span,
                "__formatter");
            ::quote::__private::push_comma_spanned(&mut _s, _span);
            ::quote::__private::parse_spanned(&mut _s, _span, "\"{}({:?})\"");
            ::quote::__private::push_comma_spanned(&mut _s, _span);
            ::quote::__private::push_ident_spanned(&mut _s, _span,
                "stringify");
            ::quote::__private::push_bang_spanned(&mut _s, _span);
            ::quote::__private::push_group_spanned(&mut _s, _span,
                ::quote::__private::Delimiter::Parenthesis,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::ToTokens::to_tokens(&ident, &mut _s);
                    _s
                });
            ::quote::__private::push_comma_spanned(&mut _s, _span);
            ::quote::__private::push_group_spanned(&mut _s, _span,
                ::quote::__private::Delimiter::Parenthesis,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    {
                        use ::quote::__private::ext::*;
                        let has_iter = ::quote::__private::HasIterator::<false>;
                        #[allow(unused_mut)]
                        let (mut field_vars, i) = field_vars.quote_into_iter();
                        let has_iter = has_iter | i;
                        <_ as
                                ::quote::__private::CheckHasIterator<true>>::check(has_iter);
                        while true {
                            let field_vars =
                                match field_vars.next() {
                                    Some(_x) => ::quote::__private::RepInterp(_x),
                                    None => break,
                                };
                            ::quote::ToTokens::to_tokens(&field_vars, &mut _s);
                            ::quote::__private::push_comma_spanned(&mut _s, _span);
                        }
                    }
                    _s
                });
            _s
        });
    _s
}quote_spanned! {debug_span=>
513                        ::core::write!(__formatter, "{}({:?})", stringify!(#ident), (#(#field_vars,)*))
514                    }
515                } else {
516                    // Struct variant: generate proper debug formatting showing all field values
517                    let field_writes: Vec<_> = variant.fields.iter().enumerate().map(|(i, field)| {
518                        let comma = if i < variant.fields.len() - 1 {
519                            {
    let _span: ::quote::__private::Span =
        ::quote::__private::get_span(debug_span).__into_span();
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::__private::push_colon2_spanned(&mut _s, _span);
    ::quote::__private::push_ident_spanned(&mut _s, _span, "core");
    ::quote::__private::push_colon2_spanned(&mut _s, _span);
    ::quote::__private::push_ident_spanned(&mut _s, _span, "write");
    ::quote::__private::push_bang_spanned(&mut _s, _span);
    ::quote::__private::push_group_spanned(&mut _s, _span,
        ::quote::__private::Delimiter::Parenthesis,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::push_ident_spanned(&mut _s, _span,
                "__formatter");
            ::quote::__private::push_comma_spanned(&mut _s, _span);
            ::quote::__private::parse_spanned(&mut _s, _span, "\", \"");
            _s
        });
    ::quote::__private::push_question_spanned(&mut _s, _span);
    ::quote::__private::push_semi_spanned(&mut _s, _span);
    _s
}quote_spanned! {debug_span=> ::core::write!(__formatter, ", ")?; }
520                        } else {
521                            {
    let _span: ::quote::__private::Span =
        ::quote::__private::get_span(debug_span).__into_span();
    ::quote::__private::TokenStream::new()
}quote_spanned! {debug_span=> }
522                        };
523                        match &field.member {
524                            MemberUnraw::Named(ident) => {
525                                let field_name = ident.to_string();
526                                let var = ident.to_local();
527                                {
    let _span: ::quote::__private::Span =
        ::quote::__private::get_span(debug_span).__into_span();
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::__private::push_colon2_spanned(&mut _s, _span);
    ::quote::__private::push_ident_spanned(&mut _s, _span, "core");
    ::quote::__private::push_colon2_spanned(&mut _s, _span);
    ::quote::__private::push_ident_spanned(&mut _s, _span, "write");
    ::quote::__private::push_bang_spanned(&mut _s, _span);
    ::quote::__private::push_group_spanned(&mut _s, _span,
        ::quote::__private::Delimiter::Parenthesis,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::push_ident_spanned(&mut _s, _span,
                "__formatter");
            ::quote::__private::push_comma_spanned(&mut _s, _span);
            ::quote::__private::parse_spanned(&mut _s, _span, "\"{}: {:?}\"");
            ::quote::__private::push_comma_spanned(&mut _s, _span);
            ::quote::ToTokens::to_tokens(&field_name, &mut _s);
            ::quote::__private::push_comma_spanned(&mut _s, _span);
            ::quote::ToTokens::to_tokens(&var, &mut _s);
            _s
        });
    ::quote::__private::push_question_spanned(&mut _s, _span);
    ::quote::__private::push_semi_spanned(&mut _s, _span);
    ::quote::ToTokens::to_tokens(&comma, &mut _s);
    _s
}quote_spanned! {debug_span=>
528                                    ::core::write!(__formatter, "{}: {:?}", #field_name, #var)?;
529                                    #comma
530                                }
531                            }
532                            MemberUnraw::Unnamed(index) => {
533                                let var = match ::quote::__private::IdentFragmentAdapter(&index) {
    arg =>
        ::quote::__private::mk_ident(&::alloc::__export::must_use({
                        ::alloc::fmt::format(format_args!("_{0}", arg))
                    }), ::quote::__private::Option::None.or(arg.span())),
}format_ident!("_{}", index);
534                                {
    let _span: ::quote::__private::Span =
        ::quote::__private::get_span(debug_span).__into_span();
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::__private::push_colon2_spanned(&mut _s, _span);
    ::quote::__private::push_ident_spanned(&mut _s, _span, "core");
    ::quote::__private::push_colon2_spanned(&mut _s, _span);
    ::quote::__private::push_ident_spanned(&mut _s, _span, "write");
    ::quote::__private::push_bang_spanned(&mut _s, _span);
    ::quote::__private::push_group_spanned(&mut _s, _span,
        ::quote::__private::Delimiter::Parenthesis,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::push_ident_spanned(&mut _s, _span,
                "__formatter");
            ::quote::__private::push_comma_spanned(&mut _s, _span);
            ::quote::__private::parse_spanned(&mut _s, _span, "\"{:?}\"");
            ::quote::__private::push_comma_spanned(&mut _s, _span);
            ::quote::ToTokens::to_tokens(&var, &mut _s);
            _s
        });
    ::quote::__private::push_question_spanned(&mut _s, _span);
    ::quote::__private::push_semi_spanned(&mut _s, _span);
    ::quote::ToTokens::to_tokens(&comma, &mut _s);
    _s
}quote_spanned! {debug_span=>
535                                    ::core::write!(__formatter, "{:?}", #var)?;
536                                    #comma
537                                }
538                            }
539                        }
540                    }).collect();
541
542                    {
    let _span: ::quote::__private::Span =
        ::quote::__private::get_span(debug_span).__into_span();
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::__private::push_group_spanned(&mut _s, _span,
        ::quote::__private::Delimiter::Brace,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::push_colon2_spanned(&mut _s, _span);
            ::quote::__private::push_ident_spanned(&mut _s, _span, "core");
            ::quote::__private::push_colon2_spanned(&mut _s, _span);
            ::quote::__private::push_ident_spanned(&mut _s, _span, "write");
            ::quote::__private::push_bang_spanned(&mut _s, _span);
            ::quote::__private::push_group_spanned(&mut _s, _span,
                ::quote::__private::Delimiter::Parenthesis,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::__private::push_ident_spanned(&mut _s, _span,
                        "__formatter");
                    ::quote::__private::push_comma_spanned(&mut _s, _span);
                    ::quote::__private::parse_spanned(&mut _s, _span,
                        "\"{} {{ \"");
                    ::quote::__private::push_comma_spanned(&mut _s, _span);
                    ::quote::__private::push_ident_spanned(&mut _s, _span,
                        "stringify");
                    ::quote::__private::push_bang_spanned(&mut _s, _span);
                    ::quote::__private::push_group_spanned(&mut _s, _span,
                        ::quote::__private::Delimiter::Parenthesis,
                        {
                            let mut _s = ::quote::__private::TokenStream::new();
                            ::quote::ToTokens::to_tokens(&ident, &mut _s);
                            _s
                        });
                    _s
                });
            ::quote::__private::push_question_spanned(&mut _s, _span);
            ::quote::__private::push_semi_spanned(&mut _s, _span);
            {
                use ::quote::__private::ext::*;
                let has_iter = ::quote::__private::HasIterator::<false>;
                #[allow(unused_mut)]
                let (mut field_writes, i) = field_writes.quote_into_iter();
                let has_iter = has_iter | i;
                <_ as
                        ::quote::__private::CheckHasIterator<true>>::check(has_iter);
                while true {
                    let field_writes =
                        match field_writes.next() {
                            Some(_x) => ::quote::__private::RepInterp(_x),
                            None => break,
                        };
                    ::quote::ToTokens::to_tokens(&field_writes, &mut _s);
                }
            }
            ::quote::__private::push_colon2_spanned(&mut _s, _span);
            ::quote::__private::push_ident_spanned(&mut _s, _span, "core");
            ::quote::__private::push_colon2_spanned(&mut _s, _span);
            ::quote::__private::push_ident_spanned(&mut _s, _span, "write");
            ::quote::__private::push_bang_spanned(&mut _s, _span);
            ::quote::__private::push_group_spanned(&mut _s, _span,
                ::quote::__private::Delimiter::Parenthesis,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::__private::push_ident_spanned(&mut _s, _span,
                        "__formatter");
                    ::quote::__private::push_comma_spanned(&mut _s, _span);
                    ::quote::__private::parse_spanned(&mut _s, _span,
                        "\" }}\"");
                    _s
                });
            _s
        });
    _s
}quote_spanned! {debug_span=>
543                        {
544                            ::core::write!(__formatter, "{} {{ ", stringify!(#ident))?;
545                            #(#field_writes)*
546                            ::core::write!(__formatter, " }}")
547                        }
548                    }
549                }
550            } else if let Some(debug_attr) = &input.attrs.debug {
551                // Top-level #[error(debug)]: fall back to Debug representation of the variant
552                // This implements the feature request from issue #172
553                let ident = &variant.ident;
554                if variant.fields.is_empty() {
555                    // Unit variant: just display the variant name
556                    let variant_name = ident.to_string();
557                    {
    let _span: ::quote::__private::Span =
        ::quote::__private::get_span(debug_attr.span).__into_span();
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::__private::push_colon2_spanned(&mut _s, _span);
    ::quote::__private::push_ident_spanned(&mut _s, _span, "core");
    ::quote::__private::push_colon2_spanned(&mut _s, _span);
    ::quote::__private::push_ident_spanned(&mut _s, _span, "write");
    ::quote::__private::push_bang_spanned(&mut _s, _span);
    ::quote::__private::push_group_spanned(&mut _s, _span,
        ::quote::__private::Delimiter::Parenthesis,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::push_ident_spanned(&mut _s, _span,
                "__formatter");
            ::quote::__private::push_comma_spanned(&mut _s, _span);
            ::quote::__private::parse_spanned(&mut _s, _span, "\"{}\"");
            ::quote::__private::push_comma_spanned(&mut _s, _span);
            ::quote::ToTokens::to_tokens(&variant_name, &mut _s);
            _s
        });
    _s
}quote_spanned! {debug_attr.span=>
558                        ::core::write!(__formatter, "{}", #variant_name)
559                    }
560                } else if variant.fields.len() == 1 && #[allow(non_exhaustive_omitted_patterns)] match variant.fields[0].member {
    MemberUnraw::Unnamed(_) => true,
    _ => false,
}matches!(variant.fields[0].member, MemberUnraw::Unnamed(_)) {
561                    // Tuple variant with single field: Format as Variant(field)
562                    let mut field_var = ::quote::__private::mk_ident(&::alloc::__export::must_use({
                ::alloc::fmt::format(format_args!("_0"))
            }), ::quote::__private::Option::None)format_ident!("_0");
563                    field_var.set_span(debug_attr.span);
564                    {
    let _span: ::quote::__private::Span =
        ::quote::__private::get_span(debug_attr.span).__into_span();
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::__private::push_colon2_spanned(&mut _s, _span);
    ::quote::__private::push_ident_spanned(&mut _s, _span, "core");
    ::quote::__private::push_colon2_spanned(&mut _s, _span);
    ::quote::__private::push_ident_spanned(&mut _s, _span, "write");
    ::quote::__private::push_bang_spanned(&mut _s, _span);
    ::quote::__private::push_group_spanned(&mut _s, _span,
        ::quote::__private::Delimiter::Parenthesis,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::push_ident_spanned(&mut _s, _span,
                "__formatter");
            ::quote::__private::push_comma_spanned(&mut _s, _span);
            ::quote::__private::parse_spanned(&mut _s, _span, "\"{}({:?})\"");
            ::quote::__private::push_comma_spanned(&mut _s, _span);
            ::quote::__private::push_ident_spanned(&mut _s, _span,
                "stringify");
            ::quote::__private::push_bang_spanned(&mut _s, _span);
            ::quote::__private::push_group_spanned(&mut _s, _span,
                ::quote::__private::Delimiter::Parenthesis,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::ToTokens::to_tokens(&ident, &mut _s);
                    _s
                });
            ::quote::__private::push_comma_spanned(&mut _s, _span);
            ::quote::ToTokens::to_tokens(&field_var, &mut _s);
            _s
        });
    _s
}quote_spanned! {debug_attr.span=>
565                        ::core::write!(__formatter, "{}({:?})", stringify!(#ident), #field_var)
566                    }
567                } else if variant.fields.iter().all(|f| #[allow(non_exhaustive_omitted_patterns)] match f.member {
    MemberUnraw::Unnamed(_) => true,
    _ => false,
}matches!(f.member, MemberUnraw::Unnamed(_))) {
568                    // Tuple variant with multiple fields: Format as Variant(field1, field2, ...)
569                    let field_vars: Vec<_> = variant.fields.iter().enumerate().map(|(i, _)| {
570                        let mut var = match ::quote::__private::IdentFragmentAdapter(&i) {
    arg =>
        ::quote::__private::mk_ident(&::alloc::__export::must_use({
                        ::alloc::fmt::format(format_args!("_{0}", arg))
                    }), ::quote::__private::Option::None.or(arg.span())),
}format_ident!("_{}", i);
571                        var.set_span(debug_attr.span);
572                        var
573                    }).collect();
574                    {
    let _span: ::quote::__private::Span =
        ::quote::__private::get_span(debug_attr.span).__into_span();
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::__private::push_colon2_spanned(&mut _s, _span);
    ::quote::__private::push_ident_spanned(&mut _s, _span, "core");
    ::quote::__private::push_colon2_spanned(&mut _s, _span);
    ::quote::__private::push_ident_spanned(&mut _s, _span, "write");
    ::quote::__private::push_bang_spanned(&mut _s, _span);
    ::quote::__private::push_group_spanned(&mut _s, _span,
        ::quote::__private::Delimiter::Parenthesis,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::push_ident_spanned(&mut _s, _span,
                "__formatter");
            ::quote::__private::push_comma_spanned(&mut _s, _span);
            ::quote::__private::parse_spanned(&mut _s, _span, "\"{}({:?})\"");
            ::quote::__private::push_comma_spanned(&mut _s, _span);
            ::quote::__private::push_ident_spanned(&mut _s, _span,
                "stringify");
            ::quote::__private::push_bang_spanned(&mut _s, _span);
            ::quote::__private::push_group_spanned(&mut _s, _span,
                ::quote::__private::Delimiter::Parenthesis,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::ToTokens::to_tokens(&ident, &mut _s);
                    _s
                });
            ::quote::__private::push_comma_spanned(&mut _s, _span);
            ::quote::__private::push_group_spanned(&mut _s, _span,
                ::quote::__private::Delimiter::Parenthesis,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    {
                        use ::quote::__private::ext::*;
                        let has_iter = ::quote::__private::HasIterator::<false>;
                        #[allow(unused_mut)]
                        let (mut field_vars, i) = field_vars.quote_into_iter();
                        let has_iter = has_iter | i;
                        <_ as
                                ::quote::__private::CheckHasIterator<true>>::check(has_iter);
                        while true {
                            let field_vars =
                                match field_vars.next() {
                                    Some(_x) => ::quote::__private::RepInterp(_x),
                                    None => break,
                                };
                            ::quote::ToTokens::to_tokens(&field_vars, &mut _s);
                            ::quote::__private::push_comma_spanned(&mut _s, _span);
                        }
                    }
                    _s
                });
            _s
        });
    _s
}quote_spanned! {debug_attr.span=>
575                        ::core::write!(__formatter, "{}({:?})", stringify!(#ident), (#(#field_vars,)*))
576                    }
577                } else {
578                    // Struct variant: generate proper debug formatting showing all field values
579                    let field_writes: Vec<_> = variant.fields.iter().enumerate().map(|(i, field)| {
580                        let comma = if i < variant.fields.len() - 1 {
581                            {
    let _span: ::quote::__private::Span =
        ::quote::__private::get_span(debug_attr.span).__into_span();
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::__private::push_colon2_spanned(&mut _s, _span);
    ::quote::__private::push_ident_spanned(&mut _s, _span, "core");
    ::quote::__private::push_colon2_spanned(&mut _s, _span);
    ::quote::__private::push_ident_spanned(&mut _s, _span, "write");
    ::quote::__private::push_bang_spanned(&mut _s, _span);
    ::quote::__private::push_group_spanned(&mut _s, _span,
        ::quote::__private::Delimiter::Parenthesis,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::push_ident_spanned(&mut _s, _span,
                "__formatter");
            ::quote::__private::push_comma_spanned(&mut _s, _span);
            ::quote::__private::parse_spanned(&mut _s, _span, "\", \"");
            _s
        });
    ::quote::__private::push_question_spanned(&mut _s, _span);
    ::quote::__private::push_semi_spanned(&mut _s, _span);
    _s
}quote_spanned! {debug_attr.span=> ::core::write!(__formatter, ", ")?; }
582                        } else {
583                            {
    let _span: ::quote::__private::Span =
        ::quote::__private::get_span(debug_attr.span).__into_span();
    ::quote::__private::TokenStream::new()
}quote_spanned! {debug_attr.span=> }
584                        };
585                        match &field.member {
586                            MemberUnraw::Named(ident) => {
587                                let field_name = ident.to_string();
588                                let var = ident.to_local();
589                                {
    let _span: ::quote::__private::Span =
        ::quote::__private::get_span(debug_attr.span).__into_span();
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::__private::push_colon2_spanned(&mut _s, _span);
    ::quote::__private::push_ident_spanned(&mut _s, _span, "core");
    ::quote::__private::push_colon2_spanned(&mut _s, _span);
    ::quote::__private::push_ident_spanned(&mut _s, _span, "write");
    ::quote::__private::push_bang_spanned(&mut _s, _span);
    ::quote::__private::push_group_spanned(&mut _s, _span,
        ::quote::__private::Delimiter::Parenthesis,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::push_ident_spanned(&mut _s, _span,
                "__formatter");
            ::quote::__private::push_comma_spanned(&mut _s, _span);
            ::quote::__private::parse_spanned(&mut _s, _span, "\"{}: {:?}\"");
            ::quote::__private::push_comma_spanned(&mut _s, _span);
            ::quote::ToTokens::to_tokens(&field_name, &mut _s);
            ::quote::__private::push_comma_spanned(&mut _s, _span);
            ::quote::ToTokens::to_tokens(&var, &mut _s);
            _s
        });
    ::quote::__private::push_question_spanned(&mut _s, _span);
    ::quote::__private::push_semi_spanned(&mut _s, _span);
    ::quote::ToTokens::to_tokens(&comma, &mut _s);
    _s
}quote_spanned! {debug_attr.span=>
590                                    ::core::write!(__formatter, "{}: {:?}", #field_name, #var)?;
591                                    #comma
592                                }
593                            }
594                            MemberUnraw::Unnamed(index) => {
595                                let var = match ::quote::__private::IdentFragmentAdapter(&index) {
    arg =>
        ::quote::__private::mk_ident(&::alloc::__export::must_use({
                        ::alloc::fmt::format(format_args!("_{0}", arg))
                    }), ::quote::__private::Option::None.or(arg.span())),
}format_ident!("_{}", index);
596                                {
    let _span: ::quote::__private::Span =
        ::quote::__private::get_span(debug_attr.span).__into_span();
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::__private::push_colon2_spanned(&mut _s, _span);
    ::quote::__private::push_ident_spanned(&mut _s, _span, "core");
    ::quote::__private::push_colon2_spanned(&mut _s, _span);
    ::quote::__private::push_ident_spanned(&mut _s, _span, "write");
    ::quote::__private::push_bang_spanned(&mut _s, _span);
    ::quote::__private::push_group_spanned(&mut _s, _span,
        ::quote::__private::Delimiter::Parenthesis,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::push_ident_spanned(&mut _s, _span,
                "__formatter");
            ::quote::__private::push_comma_spanned(&mut _s, _span);
            ::quote::__private::parse_spanned(&mut _s, _span, "\"{:?}\"");
            ::quote::__private::push_comma_spanned(&mut _s, _span);
            ::quote::ToTokens::to_tokens(&var, &mut _s);
            _s
        });
    ::quote::__private::push_question_spanned(&mut _s, _span);
    ::quote::__private::push_semi_spanned(&mut _s, _span);
    ::quote::ToTokens::to_tokens(&comma, &mut _s);
    _s
}quote_spanned! {debug_attr.span=>
597                                    ::core::write!(__formatter, "{:?}", #var)?;
598                                    #comma
599                                }
600                            }
601                        }
602                    }).collect();
603
604                    {
    let _span: ::quote::__private::Span =
        ::quote::__private::get_span(debug_attr.span).__into_span();
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::__private::push_group_spanned(&mut _s, _span,
        ::quote::__private::Delimiter::Brace,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::push_colon2_spanned(&mut _s, _span);
            ::quote::__private::push_ident_spanned(&mut _s, _span, "core");
            ::quote::__private::push_colon2_spanned(&mut _s, _span);
            ::quote::__private::push_ident_spanned(&mut _s, _span, "write");
            ::quote::__private::push_bang_spanned(&mut _s, _span);
            ::quote::__private::push_group_spanned(&mut _s, _span,
                ::quote::__private::Delimiter::Parenthesis,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::__private::push_ident_spanned(&mut _s, _span,
                        "__formatter");
                    ::quote::__private::push_comma_spanned(&mut _s, _span);
                    ::quote::__private::parse_spanned(&mut _s, _span,
                        "\"{} {{ \"");
                    ::quote::__private::push_comma_spanned(&mut _s, _span);
                    ::quote::__private::push_ident_spanned(&mut _s, _span,
                        "stringify");
                    ::quote::__private::push_bang_spanned(&mut _s, _span);
                    ::quote::__private::push_group_spanned(&mut _s, _span,
                        ::quote::__private::Delimiter::Parenthesis,
                        {
                            let mut _s = ::quote::__private::TokenStream::new();
                            ::quote::ToTokens::to_tokens(&ident, &mut _s);
                            _s
                        });
                    _s
                });
            ::quote::__private::push_question_spanned(&mut _s, _span);
            ::quote::__private::push_semi_spanned(&mut _s, _span);
            {
                use ::quote::__private::ext::*;
                let has_iter = ::quote::__private::HasIterator::<false>;
                #[allow(unused_mut)]
                let (mut field_writes, i) = field_writes.quote_into_iter();
                let has_iter = has_iter | i;
                <_ as
                        ::quote::__private::CheckHasIterator<true>>::check(has_iter);
                while true {
                    let field_writes =
                        match field_writes.next() {
                            Some(_x) => ::quote::__private::RepInterp(_x),
                            None => break,
                        };
                    ::quote::ToTokens::to_tokens(&field_writes, &mut _s);
                }
            }
            ::quote::__private::push_colon2_spanned(&mut _s, _span);
            ::quote::__private::push_ident_spanned(&mut _s, _span, "core");
            ::quote::__private::push_colon2_spanned(&mut _s, _span);
            ::quote::__private::push_ident_spanned(&mut _s, _span, "write");
            ::quote::__private::push_bang_spanned(&mut _s, _span);
            ::quote::__private::push_group_spanned(&mut _s, _span,
                ::quote::__private::Delimiter::Parenthesis,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::__private::push_ident_spanned(&mut _s, _span,
                        "__formatter");
                    ::quote::__private::push_comma_spanned(&mut _s, _span);
                    ::quote::__private::parse_spanned(&mut _s, _span,
                        "\" }}\"");
                    _s
                });
            _s
        });
    _s
}quote_spanned! {debug_attr.span=>
605                        {
606                            ::core::write!(__formatter, "{} {{ ", stringify!(#ident))?;
607                            #(#field_writes)*
608                            ::core::write!(__formatter, " }}")
609                        }
610                    }
611                }
612            } else {
613                // This should be caught by validation - no display attribute and no fallback
614                {
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::__private::push_ident(&mut _s, "unreachable");
    ::quote::__private::push_bang(&mut _s);
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Parenthesis,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::parse(&mut _s,
                "\"missing display attribute should have been caught by validation\"");
            _s
        });
    _s
}quote!(unreachable!("missing display attribute should have been caught by validation"))
615            };
616            for (field, bound) in display_implied_bounds {
617                let field = &variant.fields[field];
618                if field.contains_generic {
619                    display_inferred_bounds.insert(field.ty, bound);
620                }
621            }
622            let ident = &variant.ident;
623            let pat = fields_pat(&variant.fields);
624            {
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::ToTokens::to_tokens(&ty, &mut _s);
    ::quote::__private::push_colon2(&mut _s);
    ::quote::ToTokens::to_tokens(&ident, &mut _s);
    ::quote::ToTokens::to_tokens(&pat, &mut _s);
    ::quote::__private::push_fat_arrow(&mut _s);
    ::quote::ToTokens::to_tokens(&display, &mut _s);
    _s
}quote! {
625                #ty::#ident #pat => #display
626            }
627        });
628        let arms = arms.collect::<Vec<_>>();
629        let display_where_clause = display_inferred_bounds.augment_where_clause(input.generics);
630        Some({
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::__private::push_pound(&mut _s);
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Bracket,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::push_ident(&mut _s, "allow");
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Parenthesis,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::__private::push_ident(&mut _s,
                        "unused_qualifications");
                    _s
                });
            _s
        });
    ::quote::__private::push_pound(&mut _s);
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Bracket,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::push_ident(&mut _s, "automatically_derived");
            _s
        });
    ::quote::__private::push_ident(&mut _s, "impl");
    ::quote::ToTokens::to_tokens(&impl_generics, &mut _s);
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "core");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "fmt");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "Display");
    ::quote::__private::push_ident(&mut _s, "for");
    ::quote::ToTokens::to_tokens(&ty, &mut _s);
    ::quote::ToTokens::to_tokens(&ty_generics, &mut _s);
    ::quote::ToTokens::to_tokens(&display_where_clause, &mut _s);
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Brace,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::push_ident(&mut _s, "fn");
            ::quote::__private::push_ident(&mut _s, "fmt");
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Parenthesis,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::__private::push_and(&mut _s);
                    ::quote::__private::push_ident(&mut _s, "self");
                    ::quote::__private::push_comma(&mut _s);
                    ::quote::__private::push_ident(&mut _s, "__formatter");
                    ::quote::__private::push_colon(&mut _s);
                    ::quote::__private::push_and(&mut _s);
                    ::quote::__private::push_ident(&mut _s, "mut");
                    ::quote::__private::push_colon2(&mut _s);
                    ::quote::__private::push_ident(&mut _s, "core");
                    ::quote::__private::push_colon2(&mut _s);
                    ::quote::__private::push_ident(&mut _s, "fmt");
                    ::quote::__private::push_colon2(&mut _s);
                    ::quote::__private::push_ident(&mut _s, "Formatter");
                    _s
                });
            ::quote::__private::push_rarrow(&mut _s);
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "core");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "fmt");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "Result");
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Brace,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::ToTokens::to_tokens(&use_as_display, &mut _s);
                    ::quote::__private::push_pound(&mut _s);
                    ::quote::__private::push_group(&mut _s,
                        ::quote::__private::Delimiter::Bracket,
                        {
                            let mut _s = ::quote::__private::TokenStream::new();
                            ::quote::__private::push_ident(&mut _s, "allow");
                            ::quote::__private::push_group(&mut _s,
                                ::quote::__private::Delimiter::Parenthesis,
                                {
                                    let mut _s = ::quote::__private::TokenStream::new();
                                    ::quote::__private::push_ident(&mut _s, "unused_variables");
                                    ::quote::__private::push_comma(&mut _s);
                                    ::quote::__private::push_ident(&mut _s, "deprecated");
                                    ::quote::__private::push_comma(&mut _s);
                                    ::quote::__private::push_ident(&mut _s, "clippy");
                                    ::quote::__private::push_colon2(&mut _s);
                                    ::quote::__private::push_ident(&mut _s,
                                        "used_underscore_binding");
                                    _s
                                });
                            _s
                        });
                    ::quote::__private::push_ident(&mut _s, "match");
                    ::quote::ToTokens::to_tokens(&void_deref, &mut _s);
                    ::quote::__private::push_ident(&mut _s, "self");
                    ::quote::__private::push_group(&mut _s,
                        ::quote::__private::Delimiter::Brace,
                        {
                            let mut _s = ::quote::__private::TokenStream::new();
                            {
                                use ::quote::__private::ext::*;
                                let has_iter = ::quote::__private::HasIterator::<false>;
                                #[allow(unused_mut)]
                                let (mut arms, i) = arms.quote_into_iter();
                                let has_iter = has_iter | i;
                                <_ as
                                        ::quote::__private::CheckHasIterator<true>>::check(has_iter);
                                while true {
                                    let arms =
                                        match arms.next() {
                                            Some(_x) => ::quote::__private::RepInterp(_x),
                                            None => break,
                                        };
                                    ::quote::ToTokens::to_tokens(&arms, &mut _s);
                                    ::quote::__private::push_comma(&mut _s);
                                }
                            }
                            _s
                        });
                    _s
                });
            _s
        });
    _s
}quote! {
631            #[allow(unused_qualifications)]
632            #[automatically_derived]
633            impl #impl_generics ::core::fmt::Display for #ty #ty_generics #display_where_clause {
634                fn fmt(&self, __formatter: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
635                    #use_as_display
636                    #[allow(unused_variables, deprecated, clippy::used_underscore_binding)]
637                    match #void_deref self {
638                        #(#arms,)*
639                    }
640                }
641            }
642        })
643    } else {
644        None
645    };
646
647    let from_impls = input.variants.iter().filter_map(|variant| {
648        let from_field = variant.from_field()?;
649        let span = from_field.attrs.from.unwrap().span;
650        let backtrace_field = variant.distinct_backtrace_field();
651        let location_field = variant.location_field();
652        let variant_ident = &variant.ident;
653        let from = unoptional_type(from_field.ty);
654        let source_var = Ident::new("source", span);
655        let body = from_initializer(from_field, backtrace_field, &source_var, location_field);
656        let track_caller = location_field.map(|_| {
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::__private::push_pound(&mut _s);
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Bracket,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::push_ident(&mut _s, "track_caller");
            _s
        });
    _s
}quote!(#[track_caller]));
657
658        let mut implementations = Vec::new();
659
660        // Main From implementation (always generated)
661        let from_function = {
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::__private::push_pound(&mut _s);
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Bracket,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::push_ident(&mut _s, "allow");
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Parenthesis,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::__private::push_ident(&mut _s, "clippy");
                    ::quote::__private::push_colon2(&mut _s);
                    ::quote::__private::push_ident(&mut _s,
                        "redundant_field_names");
                    _s
                });
            _s
        });
    ::quote::ToTokens::to_tokens(&track_caller, &mut _s);
    ::quote::__private::push_ident(&mut _s, "fn");
    ::quote::__private::push_ident(&mut _s, "from");
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Parenthesis,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::ToTokens::to_tokens(&source_var, &mut _s);
            ::quote::__private::push_colon(&mut _s);
            ::quote::ToTokens::to_tokens(&from, &mut _s);
            _s
        });
    ::quote::__private::push_rarrow(&mut _s);
    ::quote::__private::push_ident(&mut _s, "Self");
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Brace,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::ToTokens::to_tokens(&ty, &mut _s);
            ::quote::__private::push_colon2(&mut _s);
            ::quote::ToTokens::to_tokens(&variant_ident, &mut _s);
            ::quote::ToTokens::to_tokens(&body, &mut _s);
            _s
        });
    _s
}quote! {
662            #[allow(clippy::redundant_field_names)]
663            #track_caller
664            fn from(#source_var: #from) -> Self {
665                #ty::#variant_ident #body
666            }
667        };
668        let from_impl = {
    let _span: ::quote::__private::Span =
        ::quote::__private::get_span(span).__into_span();
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::__private::push_pound_spanned(&mut _s, _span);
    ::quote::__private::push_group_spanned(&mut _s, _span,
        ::quote::__private::Delimiter::Bracket,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::push_ident_spanned(&mut _s, _span,
                "automatically_derived");
            _s
        });
    ::quote::__private::push_ident_spanned(&mut _s, _span, "impl");
    ::quote::ToTokens::to_tokens(&impl_generics, &mut _s);
    ::quote::__private::push_colon2_spanned(&mut _s, _span);
    ::quote::__private::push_ident_spanned(&mut _s, _span, "core");
    ::quote::__private::push_colon2_spanned(&mut _s, _span);
    ::quote::__private::push_ident_spanned(&mut _s, _span, "convert");
    ::quote::__private::push_colon2_spanned(&mut _s, _span);
    ::quote::__private::push_ident_spanned(&mut _s, _span, "From");
    ::quote::__private::push_lt_spanned(&mut _s, _span);
    ::quote::ToTokens::to_tokens(&from, &mut _s);
    ::quote::__private::push_gt_spanned(&mut _s, _span);
    ::quote::__private::push_ident_spanned(&mut _s, _span, "for");
    ::quote::ToTokens::to_tokens(&ty, &mut _s);
    ::quote::ToTokens::to_tokens(&ty_generics, &mut _s);
    ::quote::ToTokens::to_tokens(&where_clause, &mut _s);
    ::quote::__private::push_group_spanned(&mut _s, _span,
        ::quote::__private::Delimiter::Brace,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::ToTokens::to_tokens(&from_function, &mut _s);
            _s
        });
    _s
}quote_spanned! {span=>
669            #[automatically_derived]
670            impl #impl_generics ::core::convert::From<#from> for #ty #ty_generics #where_clause {
671                #from_function
672            }
673        };
674        let lint_allows = if input.generics.lifetimes().next().is_some() {
675            Some({
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::__private::push_ident(&mut _s, "clippy");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "elidable_lifetime_names");
    ::quote::__private::push_comma(&mut _s);
    ::quote::__private::push_ident(&mut _s, "clippy");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "needless_lifetimes");
    ::quote::__private::push_comma(&mut _s);
    _s
}quote! {
676                clippy::elidable_lifetime_names,
677                clippy::needless_lifetimes,
678            })
679        } else {
680            None
681        };
682        implementations.push({
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::__private::push_pound(&mut _s);
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Bracket,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::push_ident(&mut _s, "allow");
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Parenthesis,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::__private::push_ident(&mut _s, "deprecated");
                    ::quote::__private::push_comma(&mut _s);
                    ::quote::__private::push_ident(&mut _s,
                        "unused_qualifications");
                    ::quote::__private::push_comma(&mut _s);
                    ::quote::ToTokens::to_tokens(&lint_allows, &mut _s);
                    _s
                });
            _s
        });
    ::quote::ToTokens::to_tokens(&from_impl, &mut _s);
    _s
}quote! {
683            #[allow(
684                deprecated,
685                unused_qualifications,
686                #lint_allows
687            )]
688            #from_impl
689        });
690
691        // Check if the field type (after unwrapping Option) is Box<T>
692        let field_type = type_parameter_of_option(from_field.ty).unwrap_or(from_field.ty);
693        if let Some(inner_type) = type_parameter_of_box(field_type) {
694            // Generate additional From<T> implementation that boxes the value
695            let inner_source_var = Ident::new("source", span);
696            let boxed_body = from_initializer_for_box(
697                from_field,
698                backtrace_field,
699                &inner_source_var,
700                location_field,
701            );
702            let inner_from_function = {
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::ToTokens::to_tokens(&track_caller, &mut _s);
    ::quote::__private::push_ident(&mut _s, "fn");
    ::quote::__private::push_ident(&mut _s, "from");
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Parenthesis,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::ToTokens::to_tokens(&inner_source_var, &mut _s);
            ::quote::__private::push_colon(&mut _s);
            ::quote::ToTokens::to_tokens(&inner_type, &mut _s);
            _s
        });
    ::quote::__private::push_rarrow(&mut _s);
    ::quote::__private::push_ident(&mut _s, "Self");
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Brace,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::ToTokens::to_tokens(&ty, &mut _s);
            ::quote::__private::push_colon2(&mut _s);
            ::quote::ToTokens::to_tokens(&variant_ident, &mut _s);
            ::quote::ToTokens::to_tokens(&boxed_body, &mut _s);
            _s
        });
    _s
}quote! {
703                #track_caller
704                fn from(#inner_source_var: #inner_type) -> Self {
705                    #ty::#variant_ident #boxed_body
706                }
707            };
708            let inner_from_impl = {
    let _span: ::quote::__private::Span =
        ::quote::__private::get_span(span).__into_span();
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::__private::push_pound_spanned(&mut _s, _span);
    ::quote::__private::push_group_spanned(&mut _s, _span,
        ::quote::__private::Delimiter::Bracket,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::push_ident_spanned(&mut _s, _span,
                "automatically_derived");
            _s
        });
    ::quote::__private::push_ident_spanned(&mut _s, _span, "impl");
    ::quote::ToTokens::to_tokens(&impl_generics, &mut _s);
    ::quote::__private::push_colon2_spanned(&mut _s, _span);
    ::quote::__private::push_ident_spanned(&mut _s, _span, "core");
    ::quote::__private::push_colon2_spanned(&mut _s, _span);
    ::quote::__private::push_ident_spanned(&mut _s, _span, "convert");
    ::quote::__private::push_colon2_spanned(&mut _s, _span);
    ::quote::__private::push_ident_spanned(&mut _s, _span, "From");
    ::quote::__private::push_lt_spanned(&mut _s, _span);
    ::quote::ToTokens::to_tokens(&inner_type, &mut _s);
    ::quote::__private::push_gt_spanned(&mut _s, _span);
    ::quote::__private::push_ident_spanned(&mut _s, _span, "for");
    ::quote::ToTokens::to_tokens(&ty, &mut _s);
    ::quote::ToTokens::to_tokens(&ty_generics, &mut _s);
    ::quote::ToTokens::to_tokens(&where_clause, &mut _s);
    ::quote::__private::push_group_spanned(&mut _s, _span,
        ::quote::__private::Delimiter::Brace,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::ToTokens::to_tokens(&inner_from_function, &mut _s);
            _s
        });
    _s
}quote_spanned! {span=>
709                #[automatically_derived]
710                impl #impl_generics ::core::convert::From<#inner_type> for #ty #ty_generics #where_clause {
711                    #inner_from_function
712                }
713            };
714            implementations.push({
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::__private::push_pound(&mut _s);
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Bracket,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::push_ident(&mut _s, "allow");
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Parenthesis,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::__private::push_ident(&mut _s, "deprecated");
                    ::quote::__private::push_comma(&mut _s);
                    ::quote::__private::push_ident(&mut _s,
                        "unused_qualifications");
                    ::quote::__private::push_comma(&mut _s);
                    ::quote::__private::push_ident(&mut _s, "clippy");
                    ::quote::__private::push_colon2(&mut _s);
                    ::quote::__private::push_ident(&mut _s,
                        "elidable_lifetime_names");
                    ::quote::__private::push_comma(&mut _s);
                    ::quote::__private::push_ident(&mut _s, "clippy");
                    ::quote::__private::push_colon2(&mut _s);
                    ::quote::__private::push_ident(&mut _s,
                        "needless_lifetimes");
                    ::quote::__private::push_comma(&mut _s);
                    ::quote::__private::push_ident(&mut _s, "clippy");
                    ::quote::__private::push_colon2(&mut _s);
                    ::quote::__private::push_ident(&mut _s,
                        "redundant_field_names");
                    ::quote::__private::push_comma(&mut _s);
                    _s
                });
            _s
        });
    ::quote::ToTokens::to_tokens(&inner_from_impl, &mut _s);
    _s
}quote! {
715                #[allow(
716                    deprecated,
717                    unused_qualifications,
718                    clippy::elidable_lifetime_names,
719                    clippy::needless_lifetimes,
720                    clippy::redundant_field_names,
721                )]
722                #inner_from_impl
723            });
724        }
725
726        Some(implementations)
727    }).flatten();
728
729    let location_impl = if input.has_location() {
730        let arms = input.variants.iter().map(|variant| {
731            let ident = &variant.ident;
732            if let Some(location_field) = variant.location_field() {
733                let location = &location_field.member;
734                let var_location = {
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::__private::push_ident(&mut _s, "location");
    _s
}quote!(location);
735                let body = if type_is_option(location_field.ty) {
736                    {
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::ToTokens::to_tokens(&var_location, &mut _s);
    _s
}quote! {
737                        #var_location
738                    }
739                } else {
740                    {
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::__private::push_ident(&mut _s, "Some");
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Parenthesis,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::ToTokens::to_tokens(&var_location, &mut _s);
            _s
        });
    _s
}quote! {
741                        Some(#var_location)
742                    }
743                };
744                {
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::ToTokens::to_tokens(&ty, &mut _s);
    ::quote::__private::push_colon2(&mut _s);
    ::quote::ToTokens::to_tokens(&ident, &mut _s);
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Brace,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::ToTokens::to_tokens(&location, &mut _s);
            ::quote::__private::push_colon(&mut _s);
            ::quote::ToTokens::to_tokens(&var_location, &mut _s);
            ::quote::__private::push_comma(&mut _s);
            ::quote::__private::push_dot2(&mut _s);
            _s
        });
    ::quote::__private::push_fat_arrow(&mut _s);
    ::quote::ToTokens::to_tokens(&body, &mut _s);
    ::quote::__private::push_comma(&mut _s);
    _s
}quote! {
745                    #ty::#ident {#location: #var_location, ..} => #body,
746                }
747            } else {
748                {
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::ToTokens::to_tokens(&ty, &mut _s);
    ::quote::__private::push_colon2(&mut _s);
    ::quote::ToTokens::to_tokens(&ident, &mut _s);
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Brace,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::push_dot2(&mut _s);
            _s
        });
    ::quote::__private::push_fat_arrow(&mut _s);
    ::quote::__private::push_ident(&mut _s, "None");
    ::quote::__private::push_comma(&mut _s);
    _s
}quote! {
749                    #ty::#ident {..} => None,
750                }
751            }
752        });
753        Some({
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::__private::push_pound(&mut _s);
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Bracket,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::push_ident(&mut _s, "allow");
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Parenthesis,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::__private::push_ident(&mut _s,
                        "unused_qualifications");
                    _s
                });
            _s
        });
    ::quote::__private::push_pound(&mut _s);
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Bracket,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::push_ident(&mut _s, "automatically_derived");
            _s
        });
    ::quote::__private::push_ident(&mut _s, "impl");
    ::quote::ToTokens::to_tokens(&impl_generics, &mut _s);
    ::quote::ToTokens::to_tokens(&ty, &mut _s);
    ::quote::ToTokens::to_tokens(&ty_generics, &mut _s);
    ::quote::ToTokens::to_tokens(&where_clause, &mut _s);
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Brace,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::push_ident(&mut _s, "pub");
            ::quote::__private::push_ident(&mut _s, "fn");
            ::quote::__private::push_ident(&mut _s, "location");
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Parenthesis,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::__private::push_and(&mut _s);
                    ::quote::__private::push_ident(&mut _s, "self");
                    _s
                });
            ::quote::__private::push_rarrow(&mut _s);
            ::quote::__private::push_ident(&mut _s, "Option");
            ::quote::__private::push_lt(&mut _s);
            ::quote::__private::push_and(&mut _s);
            ::quote::__private::push_lifetime(&mut _s, "\'static");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "core");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "panic");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "Location");
            ::quote::__private::push_lt(&mut _s);
            ::quote::__private::push_lifetime(&mut _s, "\'static");
            ::quote::__private::push_shr(&mut _s);
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Brace,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::__private::push_pound(&mut _s);
                    ::quote::__private::push_group(&mut _s,
                        ::quote::__private::Delimiter::Bracket,
                        {
                            let mut _s = ::quote::__private::TokenStream::new();
                            ::quote::__private::push_ident(&mut _s, "allow");
                            ::quote::__private::push_group(&mut _s,
                                ::quote::__private::Delimiter::Parenthesis,
                                {
                                    let mut _s = ::quote::__private::TokenStream::new();
                                    ::quote::__private::push_ident(&mut _s, "deprecated");
                                    _s
                                });
                            _s
                        });
                    ::quote::__private::push_ident(&mut _s, "match");
                    ::quote::__private::push_ident(&mut _s, "self");
                    ::quote::__private::push_group(&mut _s,
                        ::quote::__private::Delimiter::Brace,
                        {
                            let mut _s = ::quote::__private::TokenStream::new();
                            {
                                use ::quote::__private::ext::*;
                                let has_iter = ::quote::__private::HasIterator::<false>;
                                #[allow(unused_mut)]
                                let (mut arms, i) = arms.quote_into_iter();
                                let has_iter = has_iter | i;
                                <_ as
                                        ::quote::__private::CheckHasIterator<true>>::check(has_iter);
                                while true {
                                    let arms =
                                        match arms.next() {
                                            Some(_x) => ::quote::__private::RepInterp(_x),
                                            None => break,
                                        };
                                    ::quote::ToTokens::to_tokens(&arms, &mut _s);
                                }
                            }
                            _s
                        });
                    _s
                });
            _s
        });
    _s
}quote! {
754            #[allow(unused_qualifications)]
755            #[automatically_derived]
756            impl #impl_generics #ty #ty_generics #where_clause {
757                pub fn location(&self) -> Option<&'static ::core::panic::Location<'static>> {
758                    #[allow(deprecated)]
759                    match self {
760                        #(#arms)*
761                    }
762                }
763            }
764        })
765    } else {
766        None
767    };
768
769    if input.generics.type_params().next().is_some() {
770        let self_token = <::syn::token::SelfTypeToken![Self]>::default();
771        error_inferred_bounds.insert(self_token, Trait::Debug);
772        error_inferred_bounds.insert(self_token, Trait::Display);
773    }
774    let error_where_clause = error_inferred_bounds.augment_where_clause(input.generics);
775
776    {
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::__private::push_pound(&mut _s);
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Bracket,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::push_ident(&mut _s, "allow");
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Parenthesis,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::__private::push_ident(&mut _s,
                        "unused_qualifications");
                    _s
                });
            _s
        });
    ::quote::__private::push_pound(&mut _s);
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Bracket,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::push_ident(&mut _s, "automatically_derived");
            _s
        });
    ::quote::__private::push_ident(&mut _s, "impl");
    ::quote::ToTokens::to_tokens(&impl_generics, &mut _s);
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "wherror");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::ToTokens::to_tokens(&private, &mut _s);
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "Error");
    ::quote::__private::push_ident(&mut _s, "for");
    ::quote::ToTokens::to_tokens(&ty, &mut _s);
    ::quote::ToTokens::to_tokens(&ty_generics, &mut _s);
    ::quote::ToTokens::to_tokens(&error_where_clause, &mut _s);
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Brace,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::ToTokens::to_tokens(&source_method, &mut _s);
            ::quote::ToTokens::to_tokens(&provide_method, &mut _s);
            _s
        });
    ::quote::ToTokens::to_tokens(&display_impl, &mut _s);
    {
        use ::quote::__private::ext::*;
        let has_iter = ::quote::__private::HasIterator::<false>;
        #[allow(unused_mut)]
        let (mut from_impls, i) = from_impls.quote_into_iter();
        let has_iter = has_iter | i;
        <_ as ::quote::__private::CheckHasIterator<true>>::check(has_iter);
        while true {
            let from_impls =
                match from_impls.next() {
                    Some(_x) => ::quote::__private::RepInterp(_x),
                    None => break,
                };
            ::quote::ToTokens::to_tokens(&from_impls, &mut _s);
        }
    }
    ::quote::ToTokens::to_tokens(&location_impl, &mut _s);
    _s
}quote! {
777        #[allow(unused_qualifications)]
778        #[automatically_derived]
779        impl #impl_generics ::wherror::#private::Error for #ty #ty_generics #error_where_clause {
780            #source_method
781            #provide_method
782        }
783        #display_impl
784        #(#from_impls)*
785        #location_impl
786    }
787}
788
789// Create an ident with which we can expand `impl Trait for #ident {}` on a
790// deprecated type without triggering deprecation warning on the generated impl.
791pub(crate) fn call_site_ident(ident: &Ident) -> Ident {
792    let mut ident = ident.clone();
793    ident.set_span(ident.span().resolved_at(Span::call_site()));
794    ident
795}
796
797fn fields_pat(fields: &[Field]) -> TokenStream {
798    let mut members = fields.iter().map(|field| &field.member).peekable();
799    match members.peek() {
800        Some(MemberUnraw::Named(_)) => {
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Brace,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            {
                use ::quote::__private::ext::*;
                let mut _first = true;
                let has_iter = ::quote::__private::HasIterator::<false>;
                #[allow(unused_mut)]
                let (mut members, i) = members.quote_into_iter();
                let has_iter = has_iter | i;
                <_ as
                        ::quote::__private::CheckHasIterator<true>>::check(has_iter);
                while true {
                    let members =
                        match members.next() {
                            Some(_x) => ::quote::__private::RepInterp(_x),
                            None => break,
                        };
                    if !_first { ::quote::__private::push_comma(&mut _s); }
                    _first = false;
                    ::quote::ToTokens::to_tokens(&members, &mut _s);
                }
            }
            _s
        });
    _s
}quote!({ #(#members),* }),
801        Some(MemberUnraw::Unnamed(_)) => {
802            let vars = members.map(|member| match member {
803                MemberUnraw::Unnamed(index) => match ::quote::__private::IdentFragmentAdapter(&index) {
    arg =>
        ::quote::__private::mk_ident(&::alloc::__export::must_use({
                        ::alloc::fmt::format(format_args!("_{0}", arg))
                    }), ::quote::__private::Option::None.or(arg.span())),
}format_ident!("_{}", index),
804                MemberUnraw::Named(_) => ::core::panicking::panic("internal error: entered unreachable code")unreachable!(),
805            });
806            {
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Parenthesis,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            {
                use ::quote::__private::ext::*;
                let mut _first = true;
                let has_iter = ::quote::__private::HasIterator::<false>;
                #[allow(unused_mut)]
                let (mut vars, i) = vars.quote_into_iter();
                let has_iter = has_iter | i;
                <_ as
                        ::quote::__private::CheckHasIterator<true>>::check(has_iter);
                while true {
                    let vars =
                        match vars.next() {
                            Some(_x) => ::quote::__private::RepInterp(_x),
                            None => break,
                        };
                    if !_first { ::quote::__private::push_comma(&mut _s); }
                    _first = false;
                    ::quote::ToTokens::to_tokens(&vars, &mut _s);
                }
            }
            _s
        });
    _s
}quote!((#(#vars),*))
807        }
808        None => {
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Brace,
        ::quote::__private::TokenStream::new());
    _s
}quote!({}),
809    }
810}
811
812fn use_as_display(needs_as_display: bool) -> Option<TokenStream> {
813    if needs_as_display {
814        Some({
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::__private::push_ident(&mut _s, "use");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "wherror");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::ToTokens::to_tokens(&private, &mut _s);
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "AsDisplay");
    ::quote::__private::push_ident(&mut _s, "as");
    ::quote::__private::push_underscore(&mut _s);
    ::quote::__private::push_semi(&mut _s);
    _s
}quote! {
815            use ::wherror::#private::AsDisplay as _;
816        })
817    } else {
818        None
819    }
820}
821
822fn from_initializer(
823    from_field: &Field,
824    backtrace_field: Option<&Field>,
825    source_var: &Ident,
826    location_field: Option<&Field>,
827) -> TokenStream {
828    let from_member = &from_field.member;
829    let some_source = if type_is_option(from_field.ty) {
830        {
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "core");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "option");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "Option");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "Some");
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Parenthesis,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::ToTokens::to_tokens(&source_var, &mut _s);
            _s
        });
    _s
}quote!(::core::option::Option::Some(#source_var))
831    } else {
832        {
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::ToTokens::to_tokens(&source_var, &mut _s);
    _s
}quote!(#source_var)
833    };
834    let backtrace = backtrace_field.map(|backtrace_field| {
835        let backtrace_member = &backtrace_field.member;
836        if type_is_option(backtrace_field.ty) {
837            {
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::ToTokens::to_tokens(&backtrace_member, &mut _s);
    ::quote::__private::push_colon(&mut _s);
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "core");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "option");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "Option");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "Some");
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Parenthesis,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "wherror");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::ToTokens::to_tokens(&private, &mut _s);
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "Backtrace");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "capture");
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Parenthesis,
                ::quote::__private::TokenStream::new());
            _s
        });
    ::quote::__private::push_comma(&mut _s);
    _s
}quote! {
838                #backtrace_member: ::core::option::Option::Some(::wherror::#private::Backtrace::capture()),
839            }
840        } else {
841            {
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::ToTokens::to_tokens(&backtrace_member, &mut _s);
    ::quote::__private::push_colon(&mut _s);
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "core");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "convert");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "From");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "from");
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Parenthesis,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "wherror");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::ToTokens::to_tokens(&private, &mut _s);
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "Backtrace");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "capture");
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Parenthesis,
                ::quote::__private::TokenStream::new());
            _s
        });
    ::quote::__private::push_comma(&mut _s);
    _s
}quote! {
842                #backtrace_member: ::core::convert::From::from(::wherror::#private::Backtrace::capture()),
843            }
844        }
845    });
846    let location = location_field.map(|location_field| {
847        let location_member = &location_field.member;
848
849        if type_is_option(location_field.ty) {
850            {
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::ToTokens::to_tokens(&location_member, &mut _s);
    ::quote::__private::push_colon(&mut _s);
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "core");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "option");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "Option");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "Some");
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Parenthesis,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "core");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "panic");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "Location");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "caller");
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Parenthesis,
                ::quote::__private::TokenStream::new());
            _s
        });
    ::quote::__private::push_comma(&mut _s);
    _s
}quote! {
851                #location_member: ::core::option::Option::Some(::core::panic::Location::caller()),
852            }
853        } else {
854            {
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::ToTokens::to_tokens(&location_member, &mut _s);
    ::quote::__private::push_colon(&mut _s);
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "core");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "convert");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "From");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "from");
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Parenthesis,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "core");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "panic");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "Location");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "caller");
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Parenthesis,
                ::quote::__private::TokenStream::new());
            _s
        });
    ::quote::__private::push_comma(&mut _s);
    _s
}quote! {
855                #location_member: ::core::convert::From::from(::core::panic::Location::caller()),
856            }
857        }
858    });
859    {
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Brace,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::ToTokens::to_tokens(&from_member, &mut _s);
            ::quote::__private::push_colon(&mut _s);
            ::quote::ToTokens::to_tokens(&some_source, &mut _s);
            ::quote::__private::push_comma(&mut _s);
            ::quote::ToTokens::to_tokens(&backtrace, &mut _s);
            ::quote::ToTokens::to_tokens(&location, &mut _s);
            _s
        });
    _s
}quote!({
860        #from_member: #some_source,
861        #backtrace
862        #location
863    })
864}
865
866fn from_initializer_for_box(
867    from_field: &Field,
868    backtrace_field: Option<&Field>,
869    source_var: &Ident,
870    location_field: Option<&Field>,
871) -> TokenStream {
872    let from_member = &from_field.member;
873    // For Box<T> fields, we need to Box::new the source when receiving T
874    let some_source = if type_is_option(from_field.ty) {
875        {
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "core");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "option");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "Option");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "Some");
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Parenthesis,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "std");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "boxed");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "Box");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "new");
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Parenthesis,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::ToTokens::to_tokens(&source_var, &mut _s);
                    _s
                });
            _s
        });
    _s
}quote!(::core::option::Option::Some(::std::boxed::Box::new(#source_var)))
876    } else {
877        {
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "std");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "boxed");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "Box");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "new");
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Parenthesis,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::ToTokens::to_tokens(&source_var, &mut _s);
            _s
        });
    _s
}quote!(::std::boxed::Box::new(#source_var))
878    };
879    let backtrace = backtrace_field.map(|backtrace_field| {
880        let backtrace_member = &backtrace_field.member;
881        if type_is_option(backtrace_field.ty) {
882            {
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::ToTokens::to_tokens(&backtrace_member, &mut _s);
    ::quote::__private::push_colon(&mut _s);
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "core");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "option");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "Option");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "Some");
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Parenthesis,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "wherror");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::ToTokens::to_tokens(&private, &mut _s);
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "Backtrace");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "capture");
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Parenthesis,
                ::quote::__private::TokenStream::new());
            _s
        });
    ::quote::__private::push_comma(&mut _s);
    _s
}quote! {
883                #backtrace_member: ::core::option::Option::Some(::wherror::#private::Backtrace::capture()),
884            }
885        } else {
886            {
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::ToTokens::to_tokens(&backtrace_member, &mut _s);
    ::quote::__private::push_colon(&mut _s);
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "core");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "convert");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "From");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "from");
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Parenthesis,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "wherror");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::ToTokens::to_tokens(&private, &mut _s);
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "Backtrace");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "capture");
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Parenthesis,
                ::quote::__private::TokenStream::new());
            _s
        });
    ::quote::__private::push_comma(&mut _s);
    _s
}quote! {
887                #backtrace_member: ::core::convert::From::from(::wherror::#private::Backtrace::capture()),
888            }
889        }
890    });
891    let location = location_field.map(|location_field| {
892        let location_member = &location_field.member;
893
894        if type_is_option(location_field.ty) {
895            {
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::ToTokens::to_tokens(&location_member, &mut _s);
    ::quote::__private::push_colon(&mut _s);
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "core");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "option");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "Option");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "Some");
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Parenthesis,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "core");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "panic");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "Location");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "caller");
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Parenthesis,
                ::quote::__private::TokenStream::new());
            _s
        });
    ::quote::__private::push_comma(&mut _s);
    _s
}quote! {
896                #location_member: ::core::option::Option::Some(::core::panic::Location::caller()),
897            }
898        } else {
899            {
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::ToTokens::to_tokens(&location_member, &mut _s);
    ::quote::__private::push_colon(&mut _s);
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "core");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "convert");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "From");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "from");
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Parenthesis,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "core");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "panic");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "Location");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "caller");
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Parenthesis,
                ::quote::__private::TokenStream::new());
            _s
        });
    ::quote::__private::push_comma(&mut _s);
    _s
}quote! {
900                #location_member: ::core::convert::From::from(::core::panic::Location::caller()),
901            }
902        }
903    });
904    {
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Brace,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::ToTokens::to_tokens(&from_member, &mut _s);
            ::quote::__private::push_colon(&mut _s);
            ::quote::ToTokens::to_tokens(&some_source, &mut _s);
            ::quote::__private::push_comma(&mut _s);
            ::quote::ToTokens::to_tokens(&backtrace, &mut _s);
            ::quote::ToTokens::to_tokens(&location, &mut _s);
            _s
        });
    _s
}quote!({
905        #from_member: #some_source,
906        #backtrace
907        #location
908    })
909}
910
911fn type_is_option(ty: &Type) -> bool {
912    type_parameter_of_option(ty).is_some()
913}
914
915fn unoptional_type(ty: &Type) -> TokenStream {
916    let unoptional = type_parameter_of_option(ty).unwrap_or(ty);
917    {
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::ToTokens::to_tokens(&unoptional, &mut _s);
    _s
}quote!(#unoptional)
918}
919
920fn type_parameter_of_option(ty: &Type) -> Option<&Type> {
921    let path = match ty {
922        Type::Path(ty) => &ty.path,
923        _ => return None,
924    };
925
926    let last = path.segments.last().unwrap();
927    if last.ident != "Option" {
928        return None;
929    }
930
931    let bracketed = match &last.arguments {
932        PathArguments::AngleBracketed(bracketed) => bracketed,
933        _ => return None,
934    };
935
936    if bracketed.args.len() != 1 {
937        return None;
938    }
939
940    match &bracketed.args[0] {
941        GenericArgument::Type(arg) => Some(arg),
942        _ => None,
943    }
944}
945
946fn type_parameter_of_box(ty: &Type) -> Option<&Type> {
947    let path = match ty {
948        Type::Path(ty) => &ty.path,
949        _ => return None,
950    };
951
952    let last = path.segments.last().unwrap();
953    if last.ident != "Box" {
954        return None;
955    }
956
957    let bracketed = match &last.arguments {
958        PathArguments::AngleBracketed(bracketed) => bracketed,
959        _ => return None,
960    };
961
962    if bracketed.args.len() != 1 {
963        return None;
964    }
965
966    match &bracketed.args[0] {
967        GenericArgument::Type(arg) => Some(arg),
968        _ => None,
969    }
970}