Elevate precedence of explicitly marked backtrace

This commit is contained in:
David Tolnay 2019-10-12 15:16:03 -07:00
parent 18f2337ffc
commit 2c9bcc5347
No known key found for this signature in database
GPG Key ID: F9BA143B95FF6D82
2 changed files with 19 additions and 14 deletions

View File

@ -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! {
(Some(backtrace), _) => {
let backtrace = &backtrace.member;
quote! {
#ty::#ident {#backtrace: backtrace, ..} => std::option::Option::Some(backtrace),
},
}
}
(None, _) => quote! {
#ty::#ident {..} => std::option::Option::None,
},

View File

@ -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