Elevate precedence of explicitly marked backtrace
This commit is contained in:
parent
18f2337ffc
commit
2c9bcc5347
|
@ -28,7 +28,8 @@ fn impl_struct(input: Struct) -> TokenStream {
|
|||
}
|
||||
});
|
||||
|
||||
let backtrace_method = input.backtrace_member().map(|backtrace| {
|
||||
let backtrace_method = input.backtrace_field().map(|backtrace| {
|
||||
let backtrace = &backtrace.member;
|
||||
let body = if let Some(source) = input.source_member() {
|
||||
let dyn_error = quote_spanned!(source.span()=> self.#source.as_dyn_error());
|
||||
quote!({
|
||||
|
@ -103,8 +104,9 @@ fn impl_enum(input: Enum) -> TokenStream {
|
|||
let backtrace_method = if input.has_backtrace() {
|
||||
let arms = input.variants.iter().map(|variant| {
|
||||
let ident = &variant.ident;
|
||||
match (variant.backtrace_member(), variant.source_member()) {
|
||||
(Some(backtrace), Some(source)) => {
|
||||
match (variant.backtrace_field(), variant.source_member()) {
|
||||
(Some(backtrace), Some(source)) if backtrace.attrs.backtrace.is_none() => {
|
||||
let backtrace = &backtrace.member;
|
||||
let dyn_error = quote_spanned!(source.span()=> source.as_dyn_error());
|
||||
quote! {
|
||||
#ty::#ident {
|
||||
|
@ -117,9 +119,12 @@ fn impl_enum(input: Enum) -> TokenStream {
|
|||
}),
|
||||
}
|
||||
}
|
||||
(Some(backtrace), None) => quote! {
|
||||
#ty::#ident {#backtrace: backtrace, ..} => std::option::Option::Some(backtrace),
|
||||
},
|
||||
(Some(backtrace), _) => {
|
||||
let backtrace = &backtrace.member;
|
||||
quote! {
|
||||
#ty::#ident {#backtrace: backtrace, ..} => std::option::Option::Some(backtrace),
|
||||
}
|
||||
}
|
||||
(None, _) => quote! {
|
||||
#ty::#ident {..} => std::option::Option::None,
|
||||
},
|
||||
|
|
|
@ -6,8 +6,8 @@ impl Struct<'_> {
|
|||
source_member(&self.fields)
|
||||
}
|
||||
|
||||
pub(crate) fn backtrace_member(&self) -> Option<&Member> {
|
||||
backtrace_member(&self.fields)
|
||||
pub(crate) fn backtrace_field(&self) -> Option<&Field> {
|
||||
backtrace_field(&self.fields)
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -21,7 +21,7 @@ impl Enum<'_> {
|
|||
pub(crate) fn has_backtrace(&self) -> bool {
|
||||
self.variants
|
||||
.iter()
|
||||
.any(|variant| variant.backtrace_member().is_some())
|
||||
.any(|variant| variant.backtrace_field().is_some())
|
||||
}
|
||||
|
||||
pub(crate) fn has_display(&self) -> bool {
|
||||
|
@ -38,8 +38,8 @@ impl Variant<'_> {
|
|||
source_member(&self.fields)
|
||||
}
|
||||
|
||||
pub(crate) fn backtrace_member(&self) -> Option<&Member> {
|
||||
backtrace_member(&self.fields)
|
||||
pub(crate) fn backtrace_field(&self) -> Option<&Field> {
|
||||
backtrace_field(&self.fields)
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -58,15 +58,15 @@ fn source_member<'a>(fields: &'a [Field]) -> Option<&'a Member> {
|
|||
None
|
||||
}
|
||||
|
||||
fn backtrace_member<'a>(fields: &'a [Field]) -> Option<&'a Member> {
|
||||
fn backtrace_field<'a, 'b>(fields: &'a [Field<'b>]) -> Option<&'a Field<'b>> {
|
||||
for field in fields {
|
||||
if field.attrs.backtrace.is_some() {
|
||||
return Some(&field.member);
|
||||
return Some(&field);
|
||||
}
|
||||
}
|
||||
for field in fields {
|
||||
if type_is_backtrace(field.ty) {
|
||||
return Some(&field.member);
|
||||
return Some(&field);
|
||||
}
|
||||
}
|
||||
None
|
||||
|
|
Loading…
Reference in New Issue