From 7ba5ae7b20f0b08b504c2b9e8b96b0094ef39485 Mon Sep 17 00:00:00 2001 From: TheSola10 Date: Sun, 9 Feb 2025 10:02:47 +0100 Subject: [PATCH 1/4] Add function support to nameof keyword (#673) --- src/modules/builtin/nameof.rs | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/modules/builtin/nameof.rs b/src/modules/builtin/nameof.rs index 019b79b83..73a7980c1 100644 --- a/src/modules/builtin/nameof.rs +++ b/src/modules/builtin/nameof.rs @@ -37,10 +37,19 @@ impl SyntaxModule for Nameof { Ok(()) } None => { - let tok = meta.get_current_token(); - error!(meta, tok, format!("Variable '{name}' not found")) + match meta.get_fun_declaration(&name) { + Some(fun_decl) => { + self.name = format!("{}__{}_v0", &fun_decl.name, fun_decl.id); + Ok(()) + } + None => { + let tok = meta.get_current_token(); + error!(meta, tok, format!("Variable or function '{name}' not found")) + } + } } } + } } From a7c594d6d0d13297af0f94995ffadd03ed392457 Mon Sep 17 00:00:00 2001 From: TheSola10 Date: Mon, 24 Feb 2025 11:29:04 +0100 Subject: [PATCH 2/4] Apply @hdwalters suggestion --- src/modules/builtin/nameof.rs | 34 +++++++++++++--------------------- 1 file changed, 13 insertions(+), 21 deletions(-) diff --git a/src/modules/builtin/nameof.rs b/src/modules/builtin/nameof.rs index 73a7980c1..f272cd30d 100644 --- a/src/modules/builtin/nameof.rs +++ b/src/modules/builtin/nameof.rs @@ -28,28 +28,20 @@ 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 => { - match meta.get_fun_declaration(&name) { - Some(fun_decl) => { - self.name = format!("{}__{}_v0", &fun_decl.name, fun_decl.id); - Ok(()) - } - None => { - let tok = meta.get_current_token(); - error!(meta, tok, format!("Variable or function '{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); + Ok(()) + } else { + let tok = meta.get_current_token(); + error!(meta, tok, format!("Variable or function '{name}' not found")) } - } } From d9acb8aa6a49ae77041fccc61c93e60f5aa429a6 Mon Sep 17 00:00:00 2001 From: TheSola10 Date: Mon, 24 Feb 2025 11:51:12 +0100 Subject: [PATCH 3/4] Ensure nameof causes function to compile --- src/modules/builtin/nameof.rs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/modules/builtin/nameof.rs b/src/modules/builtin/nameof.rs index f272cd30d..0fbb71a17 100644 --- a/src/modules/builtin/nameof.rs +++ b/src/modules/builtin/nameof.rs @@ -3,6 +3,7 @@ use crate::modules::types::{Type, Typed}; use crate::modules::variable::variable_name_extensions; use crate::translate::module::TranslateModule; use crate::utils::{ParserMetadata, TranslateMetadata}; +use crate::modules::function::invocation_utils::handle_function_parameters; use heraclitus_compiler::prelude::*; #[derive(Debug, Clone)] @@ -37,6 +38,10 @@ impl SyntaxModule for Nameof { 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_decl2 = fun_decl.clone(); + let _ = handle_function_parameters(meta, fun_decl2.id, fun_decl2.clone(), &fun_decl2.arg_types, &[], None); Ok(()) } else { let tok = meta.get_current_token(); From fe63bde0ee3c046e772a121ac730bd3e88b501da Mon Sep 17 00:00:00 2001 From: Daniele Scasciafratte Date: Wed, 16 Apr 2025 12:43:57 +0200 Subject: [PATCH 4/4] review --- src/modules/builtin/nameof.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/modules/builtin/nameof.rs b/src/modules/builtin/nameof.rs index 0fbb71a17..c868fcc3f 100644 --- a/src/modules/builtin/nameof.rs +++ b/src/modules/builtin/nameof.rs @@ -1,9 +1,9 @@ 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; use crate::utils::{ParserMetadata, TranslateMetadata}; -use crate::modules::function::invocation_utils::handle_function_parameters; use heraclitus_compiler::prelude::*; #[derive(Debug, Clone)] @@ -40,8 +40,8 @@ impl SyntaxModule for Nameof { self.name = format!("{}__{}_v0", fun_decl.name, fun_decl.id); // Create an empty call to ensure referenced function gets built - let fun_decl2 = fun_decl.clone(); - let _ = handle_function_parameters(meta, fun_decl2.id, fun_decl2.clone(), &fun_decl2.arg_types, &[], None); + 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();