Improve diagnostics for non-clonable return types

This commit is contained in:
J Henry Waugh
2020-08-27 22:49:56 -05:00
parent 525ffe6f5a
commit 8de095fa36
4 changed files with 74 additions and 4 deletions

View File

@@ -314,15 +314,17 @@ impl ExportedFn {
})
.collect();
let return_span = self.return_type().map(|r| r.span())
.unwrap_or_else(|| proc_macro2::Span::call_site());
if !self.params.return_raw {
quote! {
quote_spanned! { return_span=>
type EvalBox = Box<EvalAltResult>;
pub #dynamic_signature {
Ok(Dynamic::from(super::#name(#(#arguments),*)))
}
}
} else {
quote_spanned! { self.return_type().unwrap().span()=>
quote_spanned! { return_span=>
type EvalBox = Box<EvalAltResult>;
pub #dynamic_signature {
super::#name(#(#arguments),*)
@@ -484,12 +486,14 @@ impl ExportedFn {
// Handle "raw returns", aka cases where the result is a dynamic or an error.
//
// This allows skipping the Dynamic::from wrap.
let return_span = self.return_type().map(|r| r.span())
.unwrap_or_else(|| proc_macro2::Span::call_site());
let return_expr = if !self.params.return_raw {
quote! {
quote_spanned! { return_span=>
Ok(Dynamic::from(#sig_name(#(#unpack_exprs),*)))
}
} else {
quote_spanned! { self.return_type().unwrap().span()=>
quote_spanned! { return_span=>
#sig_name(#(#unpack_exprs),*)
}
};