diff --git a/src/lib.rs b/src/lib.rs index 8ebea050..1dae5104 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -135,7 +135,7 @@ pub use token::{get_next_token, parse_string_literal, InputStream, Token, Tokeni #[cfg(feature = "internals")] #[deprecated(note = "this type is volatile and may change")] -pub use parser::{Expr, ReturnType, Stmt}; +pub use parser::{Expr, ReturnType, ScriptFnDef, Stmt}; #[cfg(feature = "internals")] #[deprecated(note = "this type is volatile and may change")] diff --git a/src/module.rs b/src/module.rs index caf3cb39..48a897e2 100644 --- a/src/module.rs +++ b/src/module.rs @@ -3,7 +3,7 @@ use crate::any::{Dynamic, Variant}; use crate::calc_fn_hash; use crate::engine::{make_getter, make_setter, Engine, FN_IDX_GET, FN_IDX_SET}; -use crate::fn_native::{CallableFunction, FnCallArgs, IteratorFn, SendSync}; +use crate::fn_native::{CallableFunction, FnCallArgs, IteratorFn, SendSync, Shared}; use crate::parser::{ FnAccess, FnAccess::{Private, Public}, @@ -65,9 +65,26 @@ impl fmt::Debug for Module { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { write!( f, - "", - self.variables, - self.functions.len(), + "Module(\n vars: {}\n functions: {}\n)", + self.variables + .keys() + .map(|s| s.as_str()) + .collect::>() + .join(", "), + self.iter_fn() + .map(|(name, access, _, f)| match f { + CallableFunction::Script(s) => s.to_string(), + _ => format!( + "{}{}()", + match access { + FnAccess::Public => "", + FnAccess::Private => "private ", + }, + name + ), + }) + .collect::>() + .join(", "), ) } } @@ -837,6 +854,15 @@ impl Module { self.functions.values() } + /// Get an iterator over all script-defined functions in the module. + pub fn iter_script_fn<'a>(&'a self) -> impl Iterator> + 'a { + self.functions + .values() + .map(|(_, _, _, f)| f) + .filter(|f| f.is_script()) + .map(|f| f.get_shared_fn_def()) + } + /// Create a new `Module` by evaluating an `AST`. /// /// # Examples diff --git a/src/parser.rs b/src/parser.rs index 9a318849..e19c92c0 100644 --- a/src/parser.rs +++ b/src/parser.rs @@ -15,7 +15,7 @@ use crate::stdlib::{ boxed::Box, char, collections::HashMap, - format, + fmt, format, iter::empty, mem, num::NonZeroUsize, @@ -202,6 +202,25 @@ pub struct ScriptFnDef { pub pos: Position, } +impl fmt::Display for ScriptFnDef { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!( + f, + "{}{}({})", + match self.access { + FnAccess::Public => "", + FnAccess::Private => "private ", + }, + self.name, + self.params + .iter() + .map(|s| s.as_str()) + .collect::>() + .join(",") + ) + } +} + /// `return`/`throw` statement. #[derive(Debug, Eq, PartialEq, Hash, Clone, Copy)] pub enum ReturnType { diff --git a/src/token.rs b/src/token.rs index 8fcb99a9..5cdc1771 100644 --- a/src/token.rs +++ b/src/token.rs @@ -620,7 +620,7 @@ fn scan_comment( } /// Get the next token. -fn get_next_token( +pub fn get_next_token( stream: &mut impl InputStream, state: &mut TokenizeState, pos: &mut Position,