From 767c39d974075b6e8b7d9d3e00e5b01a4350e026 Mon Sep 17 00:00:00 2001 From: Stephen Chung Date: Mon, 17 Aug 2020 23:35:04 +0800 Subject: [PATCH] Simplify rhai_fn attribute. --- codegen/src/function.rs | 38 +++++++++++++++++++------------------- codegen/src/rhai_module.rs | 32 +++++--------------------------- 2 files changed, 24 insertions(+), 46 deletions(-) diff --git a/codegen/src/function.rs b/codegen/src/function.rs index 36f914d0..4e5bf139 100644 --- a/codegen/src/function.rs +++ b/codegen/src/function.rs @@ -13,15 +13,9 @@ use std::collections::HashMap; use quote::{quote, quote_spanned}; use syn::{parse::Parse, parse::ParseStream, parse::Parser, spanned::Spanned}; -use super::rhai_module::get_register_name; - #[derive(Debug, Default)] pub(crate) struct ExportedFnParams { pub name: Option, - pub get: Option, - pub set: Option, - pub index_get: bool, - pub index_set: bool, pub return_raw: bool, pub skip: bool, } @@ -34,6 +28,16 @@ impl ExportedFnParams { } } +pub const FN_IDX_GET: &str = "index$get$"; +pub const FN_IDX_SET: &str = "index$set$"; + +pub fn make_getter(id: &str) -> String { + format!("get${}", id) +} +pub fn make_setter(id: &str) -> String { + format!("set${}", id) +} + impl Parse for ExportedFnParams { fn parse(args: ParseStream) -> syn::Result { if args.is_empty() { @@ -82,22 +86,18 @@ impl Parse for ExportedFnParams { } let mut name = None; - let mut get = None; - let mut set = None; - let mut index_get = false; - let mut index_set = false; let mut return_raw = false; let mut skip = false; for (ident, value) in attrs.drain() { match (ident.to_string().as_ref(), value) { ("name", Some(s)) => name = Some(s.value()), - ("get", Some(s)) => get = Some(s.value()), - ("set", Some(s)) => set = Some(s.value()), + ("get", Some(s)) => name = Some(make_getter(&s.value())), + ("set", Some(s)) => name = Some(make_setter(&s.value())), ("get", None) | ("set", None) | ("name", None) => { return Err(syn::Error::new(ident.span(), "requires value")) } - ("index_get", None) => index_get = true, - ("index_set", None) => index_get = true, + ("index_get", None) => name = Some(FN_IDX_GET.to_string()), + ("index_set", None) => name = Some(FN_IDX_SET.to_string()), ("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")) @@ -115,10 +115,6 @@ impl Parse for ExportedFnParams { Ok(ExportedFnParams { name, - get, - set, - index_get, - index_set, return_raw, skip, ..Default::default() @@ -373,7 +369,11 @@ impl ExportedFn { pub fn generate_impl(&self, on_type_name: &str) -> proc_macro2::TokenStream { let sig_name = self.name().clone(); - let name = get_register_name(self); + let name = self + .params + .name + .clone() + .unwrap_or_else(|| self.name().to_string()); let arg_count = self.arg_count(); let is_method_call = self.mutable_receiver(); diff --git a/codegen/src/rhai_module.rs b/codegen/src/rhai_module.rs index 22c22056..dea8a421 100644 --- a/codegen/src/rhai_module.rs +++ b/codegen/src/rhai_module.rs @@ -4,32 +4,6 @@ use crate::function::ExportedFn; pub(crate) type ExportedConst = (String, syn::Expr); -pub(crate) fn get_register_name(function: &ExportedFn) -> String { - pub const FN_IDX_GET: &str = "index$get$"; - pub const FN_IDX_SET: &str = "index$set$"; - - pub fn make_getter(id: &str) -> String { - format!("get${}", id) - } - pub fn make_setter(id: &str) -> String { - format!("set${}", id) - } - - if let Some(ref name) = function.params.name { - name.clone() - } else if let Some(ref name) = function.params.get { - make_getter(name).clone() - } else if let Some(ref name) = function.params.set { - make_setter(name).clone() - } else if function.params.index_get { - FN_IDX_GET.to_string() - } else if function.params.index_set { - FN_IDX_SET.to_string() - } else { - function.name().to_string() - } -} - pub(crate) fn generate_body( fns: &Vec, consts: &Vec, @@ -55,7 +29,11 @@ pub(crate) fn generate_body( &format!("{}_token", function.name().to_string()), function.name().span(), ); - let reg_name = get_register_name(function); + let reg_name = function + .params + .name + .clone() + .unwrap_or_else(|| function.name().to_string()); let fn_literal = syn::LitStr::new(®_name, proc_macro2::Span::call_site()); let fn_input_types: Vec = function .arg_list()