Improve diagonstics on return_raw return mismatches

This commit is contained in:
J Henry Waugh
2020-08-23 17:22:29 -05:00
parent 7c273e0aac
commit 3fd3da6bfc
6 changed files with 104 additions and 9 deletions

View File

@@ -2,6 +2,8 @@
#[cfg(no_std)]
use core::mem;
#[cfg(not(no_std))]
use std::mem;
#[cfg(no_std)]
use alloc::format;
@@ -291,12 +293,21 @@ impl ExportedFn {
}
}
pub fn generate_with_params(
mut self,
mut params: ExportedFnParams,
) -> proc_macro2::TokenStream {
pub fn set_params(
&mut self, mut params: ExportedFnParams,
) -> syn::Result<()> {
// Do not allow non-returning raw functions.
//
// This is caught now to avoid issues with diagnostics later.
if params.return_raw && mem::discriminant(&self.signature.output) ==
mem::discriminant(&syn::ReturnType::Default) {
return Err(syn::Error::new(self.signature.span(),
"return_raw functions must return Result<T>"));
}
self.params = params;
self.generate()
Ok(())
}
pub fn generate(self) -> proc_macro2::TokenStream {
@@ -353,7 +364,7 @@ impl ExportedFn {
}
}
} else {
quote! {
quote_spanned! { self.return_type().unwrap().span()=>
type EvalBox = Box<EvalAltResult>;
pub #dynamic_signature {
super::#name(#(#arguments),*)
@@ -520,7 +531,7 @@ impl ExportedFn {
Ok(Dynamic::from(#sig_name(#(#unpack_exprs),*)))
}
} else {
quote! {
quote_spanned! { self.return_type().unwrap().span()=>
#sig_name(#(#unpack_exprs),*)
}
};