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 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 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 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 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 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 let ident = &variant.ident;
492 let debug_span = debug_attr.span;
493 if variant.fields.is_empty() {
494 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 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 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 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 let ident = &variant.ident;
554 if variant.fields.is_empty() {
555 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 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 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 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 {
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 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 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 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
789pub(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 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}