sortable-macro: fixup handle_error

Error cases need to include the original code in order for
the compiler to properly show the problematic code pointed
to by the Spans used in the compile_error!() output macro.

Signed-off-by: Wolfgang Bumiller <w.bumiller@proxmox.com>
This commit is contained in:
Wolfgang Bumiller 2019-11-26 14:20:29 +01:00
parent 7799deb095
commit a988327bd4

View File

@ -24,12 +24,15 @@ macro_rules! format_err {
// ($span:expr, $($msg:tt)*) => { return Err(format_err!($span, $($msg)*).into()) }; // ($span:expr, $($msg:tt)*) => { return Err(format_err!($span, $($msg)*).into()) };
//} //}
fn handle_error(data: Result<TokenStream, Error>) -> TokenStream { fn handle_error(mut item: TokenStream, data: Result<TokenStream, Error>) -> TokenStream {
match data { match data {
Ok(output) => output, Ok(output) => output,
Err(err) => match err.downcast::<syn::Error>() { Err(err) => match err.downcast::<syn::Error>() {
Ok(err) => err.to_compile_error(), Ok(err) => {
Err(err) => panic!("error in sorted_struct macro: {}", err), item.extend(err.to_compile_error());
item
}
Err(err) => panic!("error in sortable macro: {}", err),
}, },
} }
} }
@ -37,7 +40,8 @@ fn handle_error(data: Result<TokenStream, Error>) -> TokenStream {
/// Enable the `sorted!` expression-position macro in a statement. /// Enable the `sorted!` expression-position macro in a statement.
#[proc_macro_attribute] #[proc_macro_attribute]
pub fn sortable(_attr: TokenStream_1, item: TokenStream_1) -> TokenStream_1 { pub fn sortable(_attr: TokenStream_1, item: TokenStream_1) -> TokenStream_1 {
handle_error(sortable_do(item.into())).into() let item: TokenStream = item.into();
handle_error(item.clone(), sortable_do(item)).into()
} }
struct SortedData; struct SortedData;
@ -53,7 +57,7 @@ impl VisitMut for SortedData {
}); });
let tokens = mem::replace(&mut i.mac.tokens, TokenStream::new()); let tokens = mem::replace(&mut i.mac.tokens, TokenStream::new());
i.mac.tokens = handle_error(sort_data(tokens)); i.mac.tokens = handle_error(tokens.clone(), sort_data(tokens));
} }
// and recurse: // and recurse:
self.visit_macro_mut(&mut i.mac) self.visit_macro_mut(&mut i.mac)