From fe718fea39e4c45c0858946671aa8b88f11ddfa2 Mon Sep 17 00:00:00 2001 From: Stephen Chung Date: Fri, 18 Sep 2020 13:59:38 +0800 Subject: [PATCH] Remove Position parameter from plugin call function. --- codegen/src/function.rs | 214 +++++++++++++++++++++-------------- codegen/src/test/function.rs | 12 +- codegen/src/test/module.rs | 38 +++---- src/fn_call.rs | 4 +- src/plugin.rs | 5 +- 5 files changed, 157 insertions(+), 116 deletions(-) diff --git a/codegen/src/function.rs b/codegen/src/function.rs index 75812dbd..aa059013 100644 --- a/codegen/src/function.rs +++ b/codegen/src/function.rs @@ -84,71 +84,91 @@ impl ExportedParams for ExportedFnParams { let mut skip = false; let mut special = FnSpecialAccess::None; for attr in attrs { - let crate::attrs::AttrItem { key, value, span: item_span } = attr; + let crate::attrs::AttrItem { + key, + value, + span: item_span, + } = attr; match (key.to_string().as_ref(), value) { ("get", None) | ("set", None) | ("name", None) => { return Err(syn::Error::new(key.span(), "requires value")) - }, + } ("name", Some(s)) if &s.value() == FN_IDX_GET => { - return Err(syn::Error::new(item_span, - "use attribute 'index_get' instead")) - }, + return Err(syn::Error::new( + item_span, + "use attribute 'index_get' instead", + )) + } ("name", Some(s)) if &s.value() == FN_IDX_SET => { - return Err(syn::Error::new(item_span, - "use attribute 'index_set' instead")) - }, + return Err(syn::Error::new( + item_span, + "use attribute 'index_set' instead", + )) + } ("name", Some(s)) if s.value().starts_with("get$") => { - return Err(syn::Error::new(item_span, - format!("use attribute 'getter = \"{}\"' instead", - &s.value()["get$".len()..]))) - }, + return Err(syn::Error::new( + item_span, + format!( + "use attribute 'getter = \"{}\"' instead", + &s.value()["get$".len()..] + ), + )) + } ("name", Some(s)) if s.value().starts_with("set$") => { - return Err(syn::Error::new(item_span, - format!("use attribute 'setter = \"{}\"' instead", - &s.value()["set$".len()..]))) - }, + return Err(syn::Error::new( + item_span, + format!( + "use attribute 'setter = \"{}\"' instead", + &s.value()["set$".len()..] + ), + )) + } ("name", Some(s)) if s.value().contains('$') => { - return Err(syn::Error::new(s.span(), - "Rhai function names may not contain dollar sign")) - }, + return Err(syn::Error::new( + s.span(), + "Rhai function names may not contain dollar sign", + )) + } ("name", Some(s)) if s.value().contains('.') => { - return Err(syn::Error::new(s.span(), - "Rhai function names may not contain dot")) - }, - ("name", Some(s)) => { - name.push(s.value()) - }, - ("set", Some(s)) => special = match special { - FnSpecialAccess::None => - FnSpecialAccess::Property(Property::Set(syn::Ident::new(&s.value(), - s.span()))), - _ => { - return Err(syn::Error::new(item_span.span(), "conflicting setter")) + return Err(syn::Error::new( + s.span(), + "Rhai function names may not contain dot", + )) + } + ("name", Some(s)) => name.push(s.value()), + ("set", Some(s)) => { + special = match special { + FnSpecialAccess::None => FnSpecialAccess::Property(Property::Set( + syn::Ident::new(&s.value(), s.span()), + )), + _ => return Err(syn::Error::new(item_span.span(), "conflicting setter")), } - }, - ("get", Some(s)) => special = match special { - FnSpecialAccess::None => - FnSpecialAccess::Property(Property::Get(syn::Ident::new(&s.value(), - s.span()))), - _ => { - return Err(syn::Error::new(item_span.span(), "conflicting getter")) + } + ("get", Some(s)) => { + special = match special { + FnSpecialAccess::None => FnSpecialAccess::Property(Property::Get( + syn::Ident::new(&s.value(), s.span()), + )), + _ => return Err(syn::Error::new(item_span.span(), "conflicting getter")), } - }, - ("index_get", None) => special = match special { - FnSpecialAccess::None => - FnSpecialAccess::Index(Index::Get), - _ => { - return Err(syn::Error::new(item_span.span(), "conflicting index_get")) + } + ("index_get", None) => { + special = match special { + FnSpecialAccess::None => FnSpecialAccess::Index(Index::Get), + _ => { + return Err(syn::Error::new(item_span.span(), "conflicting index_get")) + } } - }, + } - ("index_set", None) => special = match special { - FnSpecialAccess::None => - FnSpecialAccess::Index(Index::Set), - _ => { - return Err(syn::Error::new(item_span.span(), "conflicting index_set")) + ("index_set", None) => { + special = match special { + FnSpecialAccess::None => FnSpecialAccess::Index(Index::Set), + _ => { + return Err(syn::Error::new(item_span.span(), "conflicting index_set")) + } } - }, + } ("return_raw", None) => return_raw = true, ("index_get", Some(s)) | ("index_set", Some(s)) | ("return_raw", Some(s)) => { return Err(syn::Error::new(s.span(), "extraneous value")) @@ -327,26 +347,40 @@ impl ExportedFn { } pub(crate) fn exported_names(&self) -> Vec { - let mut literals = self.params.name.as_ref() - .map(|v| v.iter() - .map(|s| syn::LitStr::new(s, proc_macro2::Span::call_site())).collect()) + let mut literals = self + .params + .name + .as_ref() + .map(|v| { + v.iter() + .map(|s| syn::LitStr::new(s, proc_macro2::Span::call_site())) + .collect() + }) .unwrap_or_else(|| Vec::new()); match self.params.special { - FnSpecialAccess::None => {}, - FnSpecialAccess::Property(Property::Get(ref g)) => - literals.push(syn::LitStr::new(&format!("get${}", g.to_string()), g.span())), - FnSpecialAccess::Property(Property::Set(ref s)) => - literals.push(syn::LitStr::new(&format!("set${}", s.to_string()), s.span())), - FnSpecialAccess::Index(Index::Get) => - literals.push(syn::LitStr::new(FN_IDX_GET, proc_macro2::Span::call_site())), - FnSpecialAccess::Index(Index::Set) => - literals.push(syn::LitStr::new(FN_IDX_SET, proc_macro2::Span::call_site())), + FnSpecialAccess::None => {} + FnSpecialAccess::Property(Property::Get(ref g)) => literals.push(syn::LitStr::new( + &format!("get${}", g.to_string()), + g.span(), + )), + FnSpecialAccess::Property(Property::Set(ref s)) => literals.push(syn::LitStr::new( + &format!("set${}", s.to_string()), + s.span(), + )), + FnSpecialAccess::Index(Index::Get) => { + literals.push(syn::LitStr::new(FN_IDX_GET, proc_macro2::Span::call_site())) + } + FnSpecialAccess::Index(Index::Set) => { + literals.push(syn::LitStr::new(FN_IDX_SET, proc_macro2::Span::call_site())) + } } if literals.is_empty() { - literals.push(syn::LitStr::new(&self.signature.ident.to_string(), - self.signature.ident.span())); + literals.push(syn::LitStr::new( + &self.signature.ident.to_string(), + self.signature.ident.span(), + )); } literals @@ -394,53 +428,61 @@ impl ExportedFn { match params.special { // 2a. Property getters must take only the subject as an argument. - FnSpecialAccess::Property(Property::Get(_)) if self.arg_count() != 1 => + FnSpecialAccess::Property(Property::Get(_)) if self.arg_count() != 1 => { return Err(syn::Error::new( self.signature.span(), "property getter requires exactly 1 argument", - )), + )) + } // 2b. Property getters must return a value. - FnSpecialAccess::Property(Property::Get(_)) if self.return_type().is_none() => + FnSpecialAccess::Property(Property::Get(_)) if self.return_type().is_none() => { return Err(syn::Error::new( self.signature.span(), - "property getter must return a value" - )), + "property getter must return a value", + )) + } // 3a. Property setters must take the subject and a new value as arguments. - FnSpecialAccess::Property(Property::Set(_)) if self.arg_count() != 2 => + FnSpecialAccess::Property(Property::Set(_)) if self.arg_count() != 2 => { return Err(syn::Error::new( self.signature.span(), "property setter requires exactly 2 arguments", - )), + )) + } // 3b. Property setters must return nothing. - FnSpecialAccess::Property(Property::Set(_)) if self.return_type().is_some() => + FnSpecialAccess::Property(Property::Set(_)) if self.return_type().is_some() => { return Err(syn::Error::new( self.signature.span(), - "property setter must return no value" - )), + "property setter must return no value", + )) + } // 4a. Index getters must take the subject and the accessed "index" as arguments. - FnSpecialAccess::Index(Index::Get) if self.arg_count() != 2 => + FnSpecialAccess::Index(Index::Get) if self.arg_count() != 2 => { return Err(syn::Error::new( self.signature.span(), "index getter requires exactly 2 arguments", - )), + )) + } // 4b. Index getters must return a value. - FnSpecialAccess::Index(Index::Get) if self.return_type().is_none() => + FnSpecialAccess::Index(Index::Get) if self.return_type().is_none() => { return Err(syn::Error::new( self.signature.span(), - "index getter must return a value" - )), + "index getter must return a value", + )) + } // 5a. Index setters must take the subject, "index", and new value as arguments. - FnSpecialAccess::Index(Index::Set) if self.arg_count() != 3 => + FnSpecialAccess::Index(Index::Set) if self.arg_count() != 3 => { return Err(syn::Error::new( self.signature.span(), "index setter requires exactly 3 arguments", - )), + )) + } // 5b. Index setters must return nothing. - FnSpecialAccess::Index(Index::Set) if self.return_type().is_some() => + FnSpecialAccess::Index(Index::Set) if self.return_type().is_some() => { return Err(syn::Error::new( self.signature.span(), - "index setter must return no value" - )), + "index setter must return no value", + )) + } _ => {} } @@ -685,7 +727,7 @@ impl ExportedFn { quote! { impl PluginFunction for #type_name { fn call(&self, - args: &mut [&mut Dynamic], pos: Position + args: &mut [&mut Dynamic] ) -> Result> { debug_assert_eq!(args.len(), #arg_count, "wrong arg count: {} != {}", diff --git a/codegen/src/test/function.rs b/codegen/src/test/function.rs index 31797438..61c1f942 100644 --- a/codegen/src/test/function.rs +++ b/codegen/src/test/function.rs @@ -279,7 +279,7 @@ mod generate_tests { struct Token(); impl PluginFunction for Token { fn call(&self, - args: &mut [&mut Dynamic], pos: Position + args: &mut [&mut Dynamic] ) -> Result> { debug_assert_eq!(args.len(), 0usize, "wrong arg count: {} != {}", args.len(), 0usize); @@ -323,7 +323,7 @@ mod generate_tests { struct Token(); impl PluginFunction for Token { fn call(&self, - args: &mut [&mut Dynamic], pos: Position + args: &mut [&mut Dynamic] ) -> Result> { debug_assert_eq!(args.len(), 1usize, "wrong arg count: {} != {}", args.len(), 1usize); @@ -364,7 +364,7 @@ mod generate_tests { let expected_tokens = quote! { impl PluginFunction for MyType { fn call(&self, - args: &mut [&mut Dynamic], pos: Position + args: &mut [&mut Dynamic] ) -> Result> { debug_assert_eq!(args.len(), 1usize, "wrong arg count: {} != {}", args.len(), 1usize); @@ -398,7 +398,7 @@ mod generate_tests { struct Token(); impl PluginFunction for Token { fn call(&self, - args: &mut [&mut Dynamic], pos: Position + args: &mut [&mut Dynamic] ) -> Result> { debug_assert_eq!(args.len(), 2usize, "wrong arg count: {} != {}", args.len(), 2usize); @@ -445,7 +445,7 @@ mod generate_tests { struct Token(); impl PluginFunction for Token { fn call(&self, - args: &mut [&mut Dynamic], pos: Position + args: &mut [&mut Dynamic] ) -> Result> { debug_assert_eq!(args.len(), 2usize, "wrong arg count: {} != {}", args.len(), 2usize); @@ -493,7 +493,7 @@ mod generate_tests { struct Token(); impl PluginFunction for Token { fn call(&self, - args: &mut [&mut Dynamic], pos: Position + args: &mut [&mut Dynamic] ) -> Result> { debug_assert_eq!(args.len(), 1usize, "wrong arg count: {} != {}", args.len(), 1usize); diff --git a/codegen/src/test/module.rs b/codegen/src/test/module.rs index 4d71f296..59e58ce7 100644 --- a/codegen/src/test/module.rs +++ b/codegen/src/test/module.rs @@ -307,7 +307,7 @@ mod generate_tests { struct get_mystic_number_token(); impl PluginFunction for get_mystic_number_token { fn call(&self, - args: &mut [&mut Dynamic], pos: Position + args: &mut [&mut Dynamic] ) -> Result> { debug_assert_eq!(args.len(), 0usize, "wrong arg count: {} != {}", args.len(), 0usize); @@ -369,7 +369,7 @@ mod generate_tests { struct add_one_to_token(); impl PluginFunction for add_one_to_token { fn call(&self, - args: &mut [&mut Dynamic], pos: Position + args: &mut [&mut Dynamic] ) -> Result> { debug_assert_eq!(args.len(), 1usize, "wrong arg count: {} != {}", args.len(), 1usize); @@ -446,7 +446,7 @@ mod generate_tests { struct add_one_to_token(); impl PluginFunction for add_one_to_token { fn call(&self, - args: &mut [&mut Dynamic], pos: Position + args: &mut [&mut Dynamic] ) -> Result> { debug_assert_eq!(args.len(), 1usize, "wrong arg count: {} != {}", args.len(), 1usize); @@ -474,7 +474,7 @@ mod generate_tests { struct add_n_to_token(); impl PluginFunction for add_n_to_token { fn call(&self, - args: &mut [&mut Dynamic], pos: Position + args: &mut [&mut Dynamic] ) -> Result> { debug_assert_eq!(args.len(), 2usize, "wrong arg count: {} != {}", args.len(), 2usize); @@ -540,7 +540,7 @@ mod generate_tests { struct add_together_token(); impl PluginFunction for add_together_token { fn call(&self, - args: &mut [&mut Dynamic], pos: Position + args: &mut [&mut Dynamic] ) -> Result> { debug_assert_eq!(args.len(), 2usize, "wrong arg count: {} != {}", args.len(), 2usize); @@ -613,7 +613,7 @@ mod generate_tests { struct add_together_token(); impl PluginFunction for add_together_token { fn call(&self, - args: &mut [&mut Dynamic], pos: Position + args: &mut [&mut Dynamic] ) -> Result> { debug_assert_eq!(args.len(), 2usize, "wrong arg count: {} != {}", args.len(), 2usize); @@ -855,7 +855,7 @@ mod generate_tests { struct get_mystic_number_token(); impl PluginFunction for get_mystic_number_token { fn call(&self, - args: &mut [&mut Dynamic], pos: Position + args: &mut [&mut Dynamic] ) -> Result> { debug_assert_eq!(args.len(), 0usize, "wrong arg count: {} != {}", args.len(), 0usize); @@ -948,7 +948,7 @@ mod generate_tests { struct print_out_to_token(); impl PluginFunction for print_out_to_token { fn call(&self, - args: &mut [&mut Dynamic], pos: Position + args: &mut [&mut Dynamic] ) -> Result> { debug_assert_eq!(args.len(), 1usize, "wrong arg count: {} != {}", args.len(), 1usize); @@ -1012,7 +1012,7 @@ mod generate_tests { struct increment_token(); impl PluginFunction for increment_token { fn call(&self, - args: &mut [&mut Dynamic], pos: Position + args: &mut [&mut Dynamic] ) -> Result> { debug_assert_eq!(args.len(), 1usize, "wrong arg count: {} != {}", args.len(), 1usize); @@ -1079,7 +1079,7 @@ mod generate_tests { struct increment_token(); impl PluginFunction for increment_token { fn call(&self, - args: &mut [&mut Dynamic], pos: Position + args: &mut [&mut Dynamic] ) -> Result> { debug_assert_eq!(args.len(), 1usize, "wrong arg count: {} != {}", args.len(), 1usize); @@ -1166,7 +1166,7 @@ mod generate_tests { struct increment_token(); impl PluginFunction for increment_token { fn call(&self, - args: &mut [&mut Dynamic], pos: Position + args: &mut [&mut Dynamic] ) -> Result> { debug_assert_eq!(args.len(), 1usize, "wrong arg count: {} != {}", args.len(), 1usize); @@ -1251,7 +1251,7 @@ mod generate_tests { struct int_foo_token(); impl PluginFunction for int_foo_token { fn call(&self, - args: &mut [&mut Dynamic], pos: Position + args: &mut [&mut Dynamic] ) -> Result> { debug_assert_eq!(args.len(), 1usize, "wrong arg count: {} != {}", args.len(), 1usize); @@ -1317,7 +1317,7 @@ mod generate_tests { struct int_foo_token(); impl PluginFunction for int_foo_token { fn call(&self, - args: &mut [&mut Dynamic], pos: Position + args: &mut [&mut Dynamic] ) -> Result> { debug_assert_eq!(args.len(), 1usize, "wrong arg count: {} != {}", args.len(), 1usize); @@ -1383,7 +1383,7 @@ mod generate_tests { struct int_foo_token(); impl PluginFunction for int_foo_token { fn call(&self, - args: &mut [&mut Dynamic], pos: Position + args: &mut [&mut Dynamic] ) -> Result> { debug_assert_eq!(args.len(), 2usize, "wrong arg count: {} != {}", args.len(), 2usize); @@ -1454,7 +1454,7 @@ mod generate_tests { struct int_foo_token(); impl PluginFunction for int_foo_token { fn call(&self, - args: &mut [&mut Dynamic], pos: Position + args: &mut [&mut Dynamic] ) -> Result> { debug_assert_eq!(args.len(), 2usize, "wrong arg count: {} != {}", args.len(), 2usize); @@ -1521,7 +1521,7 @@ mod generate_tests { struct get_by_index_token(); impl PluginFunction for get_by_index_token { fn call(&self, - args: &mut [&mut Dynamic], pos: Position + args: &mut [&mut Dynamic] ) -> Result> { debug_assert_eq!(args.len(), 2usize, "wrong arg count: {} != {}", args.len(), 2usize); @@ -1593,7 +1593,7 @@ mod generate_tests { struct get_by_index_token(); impl PluginFunction for get_by_index_token { fn call(&self, - args: &mut [&mut Dynamic], pos: Position + args: &mut [&mut Dynamic] ) -> Result> { debug_assert_eq!(args.len(), 2usize, "wrong arg count: {} != {}", args.len(), 2usize); @@ -1662,7 +1662,7 @@ mod generate_tests { struct set_by_index_token(); impl PluginFunction for set_by_index_token { fn call(&self, - args: &mut [&mut Dynamic], pos: Position + args: &mut [&mut Dynamic] ) -> Result> { debug_assert_eq!(args.len(), 3usize, "wrong arg count: {} != {}", args.len(), 3usize); @@ -1738,7 +1738,7 @@ mod generate_tests { struct set_by_index_token(); impl PluginFunction for set_by_index_token { fn call(&self, - args: &mut [&mut Dynamic], pos: Position + args: &mut [&mut Dynamic] ) -> Result> { debug_assert_eq!(args.len(), 3usize, "wrong arg count: {} != {}", args.len(), 3usize); diff --git a/src/fn_call.rs b/src/fn_call.rs index 3728d4e8..c40d352f 100644 --- a/src/fn_call.rs +++ b/src/fn_call.rs @@ -232,7 +232,7 @@ impl Engine { // Run external function let result = if func.is_plugin_fn() { - func.get_plugin_fn().call(args, Position::none()) + func.get_plugin_fn().call(args) } else { func.get_native_fn()(self, lib, args) }; @@ -1099,7 +1099,7 @@ impl Engine { self.call_script_fn(scope, mods, state, lib, &mut None, name, func, args, level) } - Some(f) if f.is_plugin_fn() => f.get_plugin_fn().call(args.as_mut(), Position::none()), + Some(f) if f.is_plugin_fn() => f.get_plugin_fn().call(args.as_mut()), Some(f) if f.is_native() => { if !f.is_method() { // Clone first argument diff --git a/src/plugin.rs b/src/plugin.rs index ef4a6590..e6e4e956 100644 --- a/src/plugin.rs +++ b/src/plugin.rs @@ -3,7 +3,7 @@ pub use crate::{ fn_native::CallableFunction, stdlib::any::TypeId, stdlib::boxed::Box, stdlib::format, stdlib::mem, stdlib::string::ToString, stdlib::vec as new_vec, stdlib::vec::Vec, Dynamic, - Engine, EvalAltResult, FnAccess, ImmutableString, Module, Position, RegisterResultFn, + Engine, EvalAltResult, FnAccess, ImmutableString, Module, RegisterResultFn, }; #[cfg(not(features = "no_module"))] @@ -34,8 +34,7 @@ pub trait PluginFunction { fn is_method_call(&self) -> bool; fn is_varadic(&self) -> bool; - fn call(&self, args: &mut [&mut Dynamic], pos: Position) - -> Result>; + fn call(&self, args: &mut [&mut Dynamic]) -> Result>; fn clone_boxed(&self) -> Box;