diff --git a/src/modules/builtin/nameof.rs b/src/modules/builtin/nameof.rs index 019b79b83..c868fcc3f 100644 --- a/src/modules/builtin/nameof.rs +++ b/src/modules/builtin/nameof.rs @@ -1,4 +1,5 @@ use crate::docs::module::DocumentationModule; +use crate::modules::function::invocation_utils::handle_function_parameters; use crate::modules::types::{Type, Typed}; use crate::modules::variable::variable_name_extensions; use crate::translate::module::TranslateModule; @@ -28,18 +29,23 @@ impl SyntaxModule for Nameof { fn parse(&mut self, meta: &mut ParserMetadata) -> SyntaxResult { token(meta, "nameof")?; let name = variable(meta, variable_name_extensions())?; - match meta.get_var(&name) { - Some(var_decl) => { - self.name.clone_from(&var_decl.name); - if let Some(id) = var_decl.global_id { - self.name = format!("__{id}_{}", self.name); - } - Ok(()) - } - None => { - let tok = meta.get_current_token(); - error!(meta, tok, format!("Variable '{name}' not found")) - } + if let Some(var_decl) = meta.get_var(&name) { + self.name = if let Some(id) = var_decl.global_id { + format!("__{id}_{}", var_decl.name) + } else { + var_decl.name.clone() + }; + Ok(()) + } else if let Some(fun_decl) = meta.get_fun_declaration(&name) { + self.name = format!("{}__{}_v0", fun_decl.name, fun_decl.id); + + // Create an empty call to ensure referenced function gets built + let fun_decl = fun_decl.clone(); + let _ = handle_function_parameters(meta, fun_decl.id, fun_decl.clone(), &fun_decl.arg_types, &[], None); + Ok(()) + } else { + let tok = meta.get_current_token(); + error!(meta, tok, format!("Variable or function '{name}' not found")) } } }