Raise error if pure misuse.
This commit is contained in:
parent
823ecef1f1
commit
37fe14ba16
@ -98,8 +98,8 @@ pub fn print_type(ty: &syn::Type) -> String {
|
|||||||
#[derive(Debug, Default)]
|
#[derive(Debug, Default)]
|
||||||
pub struct ExportedFnParams {
|
pub struct ExportedFnParams {
|
||||||
pub name: Vec<String>,
|
pub name: Vec<String>,
|
||||||
pub return_raw: bool,
|
pub return_raw: Option<proc_macro2::Span>,
|
||||||
pub pure: bool,
|
pub pure: Option<proc_macro2::Span>,
|
||||||
pub skip: bool,
|
pub skip: bool,
|
||||||
pub special: FnSpecialAccess,
|
pub special: FnSpecialAccess,
|
||||||
pub namespace: FnNamespaceAccess,
|
pub namespace: FnNamespaceAccess,
|
||||||
@ -137,8 +137,8 @@ impl ExportedParams for ExportedFnParams {
|
|||||||
items: attrs,
|
items: attrs,
|
||||||
} = info;
|
} = info;
|
||||||
let mut name = Vec::new();
|
let mut name = Vec::new();
|
||||||
let mut return_raw = false;
|
let mut return_raw = None;
|
||||||
let mut pure = false;
|
let mut pure = None;
|
||||||
let mut skip = false;
|
let mut skip = false;
|
||||||
let mut namespace = FnNamespaceAccess::Unset;
|
let mut namespace = FnNamespaceAccess::Unset;
|
||||||
let mut special = FnSpecialAccess::None;
|
let mut special = FnSpecialAccess::None;
|
||||||
@ -194,8 +194,8 @@ impl ExportedParams for ExportedFnParams {
|
|||||||
return Err(syn::Error::new(s.span(), "extraneous value"))
|
return Err(syn::Error::new(s.span(), "extraneous value"))
|
||||||
}
|
}
|
||||||
|
|
||||||
("pure", None) => pure = true,
|
("pure", None) => pure = Some(item_span),
|
||||||
("return_raw", None) => return_raw = true,
|
("return_raw", None) => return_raw = Some(item_span),
|
||||||
("skip", None) => skip = true,
|
("skip", None) => skip = true,
|
||||||
("global", None) => match namespace {
|
("global", None) => match namespace {
|
||||||
FnNamespaceAccess::Unset => namespace = FnNamespaceAccess::Global,
|
FnNamespaceAccess::Unset => namespace = FnNamespaceAccess::Global,
|
||||||
@ -507,18 +507,18 @@ impl ExportedFn {
|
|||||||
//
|
//
|
||||||
// 1a. Do not allow non-returning raw functions.
|
// 1a. Do not allow non-returning raw functions.
|
||||||
//
|
//
|
||||||
if params.return_raw && self.return_type().is_none() {
|
if params.return_raw.is_some() && self.return_type().is_none() {
|
||||||
return Err(syn::Error::new(
|
return Err(syn::Error::new(
|
||||||
self.signature.span(),
|
params.return_raw.unwrap(),
|
||||||
"functions marked with 'return_raw' must return Result<Dynamic, Box<EvalAltResult>>",
|
"functions marked with 'return_raw' must return Result<Dynamic, Box<EvalAltResult>>",
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
// 1b. Do not allow non-method pure functions.
|
// 1b. Do not allow non-method pure functions.
|
||||||
//
|
//
|
||||||
if params.pure && !self.mutable_receiver() {
|
if params.pure.is_some() && !self.mutable_receiver() {
|
||||||
return Err(syn::Error::new(
|
return Err(syn::Error::new(
|
||||||
self.signature.span(),
|
params.pure.unwrap(),
|
||||||
"functions marked with 'pure' must have a &mut first parameter",
|
"functions marked with 'pure' must have a &mut first parameter",
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
@ -643,7 +643,7 @@ impl ExportedFn {
|
|||||||
.return_type()
|
.return_type()
|
||||||
.map(|r| r.span())
|
.map(|r| r.span())
|
||||||
.unwrap_or_else(|| proc_macro2::Span::call_site());
|
.unwrap_or_else(|| proc_macro2::Span::call_site());
|
||||||
if self.params.return_raw {
|
if self.params.return_raw.is_some() {
|
||||||
quote_spanned! { return_span =>
|
quote_spanned! { return_span =>
|
||||||
pub #dynamic_signature {
|
pub #dynamic_signature {
|
||||||
#name(#(#arguments),*)
|
#name(#(#arguments),*)
|
||||||
@ -758,7 +758,7 @@ impl ExportedFn {
|
|||||||
})
|
})
|
||||||
.unwrap(),
|
.unwrap(),
|
||||||
);
|
);
|
||||||
if !self.params().pure {
|
if !self.params().pure.is_some() {
|
||||||
let arg_lit_str =
|
let arg_lit_str =
|
||||||
syn::LitStr::new(&pat.to_token_stream().to_string(), pat.span());
|
syn::LitStr::new(&pat.to_token_stream().to_string(), pat.span());
|
||||||
unpack_statements.push(
|
unpack_statements.push(
|
||||||
@ -879,7 +879,7 @@ impl ExportedFn {
|
|||||||
.return_type()
|
.return_type()
|
||||||
.map(|r| r.span())
|
.map(|r| r.span())
|
||||||
.unwrap_or_else(|| proc_macro2::Span::call_site());
|
.unwrap_or_else(|| proc_macro2::Span::call_site());
|
||||||
let return_expr = if !self.params.return_raw {
|
let return_expr = if !self.params.return_raw.is_some() {
|
||||||
if self.return_dynamic {
|
if self.return_dynamic {
|
||||||
quote_spanned! { return_span =>
|
quote_spanned! { return_span =>
|
||||||
Ok(#sig_name(#(#unpack_exprs),*))
|
Ok(#sig_name(#(#unpack_exprs),*))
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
error: functions marked with 'return_raw' must return Result<Dynamic, Box<EvalAltResult>>
|
error: functions marked with 'return_raw' must return Result<Dynamic, Box<EvalAltResult>>
|
||||||
--> $DIR/export_fn_raw_noreturn.rs:10:5
|
--> $DIR/export_fn_raw_noreturn.rs:9:13
|
||||||
|
|
|
|
||||||
10 | pub fn test_fn(input: &mut Point) {
|
9 | #[export_fn(return_raw)]
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^
|
||||||
|
|
||||||
error[E0425]: cannot find function `test_fn` in this scope
|
error[E0425]: cannot find function `test_fn` in this scope
|
||||||
--> $DIR/export_fn_raw_noreturn.rs:19:5
|
--> $DIR/export_fn_raw_noreturn.rs:19:5
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
error: functions marked with 'return_raw' must return Result<Dynamic, Box<EvalAltResult>>
|
error: functions marked with 'return_raw' must return Result<Dynamic, Box<EvalAltResult>>
|
||||||
--> $DIR/export_mod_raw_noreturn.rs:12:5
|
--> $DIR/export_mod_raw_noreturn.rs:11:11
|
||||||
|
|
|
|
||||||
12 | pub fn test_fn(input: &mut Point) {
|
11 | #[rhai_fn(return_raw)]
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^
|
||||||
|
|
||||||
error[E0433]: failed to resolve: use of undeclared crate or module `test_mod`
|
error[E0433]: failed to resolve: use of undeclared crate or module `test_mod`
|
||||||
--> $DIR/export_mod_raw_noreturn.rs:22:5
|
--> $DIR/export_mod_raw_noreturn.rs:22:5
|
||||||
|
Loading…
Reference in New Issue
Block a user