From 8369477346f82db8cdcb14bf29903a09d5507a52 Mon Sep 17 00:00:00 2001 From: Jeff Date: Fri, 22 Dec 2023 16:12:41 -0500 Subject: [PATCH] Fix function context error --- src/abstract_tree/function_call.rs | 2 +- src/abstract_tree/value_node.rs | 6 +++--- src/value/function.rs | 14 +++----------- src/value/map.rs | 8 ++++++++ 4 files changed, 15 insertions(+), 15 deletions(-) diff --git a/src/abstract_tree/function_call.rs b/src/abstract_tree/function_call.rs index a77dc20..e6c0d8e 100644 --- a/src/abstract_tree/function_call.rs +++ b/src/abstract_tree/function_call.rs @@ -117,7 +117,7 @@ impl AbstractTree for FunctionCall { arguments.push(value); } - value.as_function()?.call(&arguments, source) + value.as_function()?.call(&arguments, source, context) } fn expected_type(&self, context: &Map) -> Result { diff --git a/src/abstract_tree/value_node.rs b/src/abstract_tree/value_node.rs index fb2177e..ffaa92e 100644 --- a/src/abstract_tree/value_node.rs +++ b/src/abstract_tree/value_node.rs @@ -50,12 +50,12 @@ impl AbstractTree for ValueNode { } } - let function_context_types = Map::clone_from(context)?; + let function_context = Map::clone_from(context)?; for (parameter_name, parameter_type) in parameters.iter().zip(parameter_types.iter()) { - function_context_types.set( + function_context.set( parameter_name.inner().clone(), Value::Option(None), Some(parameter_type.clone()), @@ -67,7 +67,7 @@ impl AbstractTree for ValueNode { TypeDefinition::from_syntax_node(source, return_type_node, context)?; let body_node = child.child(child_count - 1).unwrap(); - let body = Block::from_syntax_node(source, body_node, &function_context_types)?; + let body = Block::from_syntax_node(source, body_node, &function_context)?; let r#type = Type::Function { parameter_types, diff --git a/src/value/function.rs b/src/value/function.rs index facfe1d..a1f5192 100644 --- a/src/value/function.rs +++ b/src/value/function.rs @@ -4,7 +4,7 @@ use serde::{Deserialize, Serialize}; use crate::{AbstractTree, Block, Error, Identifier, Map, Result, Type, Value}; -#[derive(Debug, Clone, Serialize, Deserialize, Eq, PartialOrd, Ord)] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, PartialOrd, Ord)] pub struct Function { parameters: Vec, body: Block, @@ -47,7 +47,7 @@ impl Function { } } - pub fn call(&self, arguments: &[Value], source: &str) -> Result { + pub fn call(&self, arguments: &[Value], source: &str, outer_context: &Map) -> Result { if self.parameters.len() != arguments.len() { return Err(Error::ExpectedFunctionArgumentAmount { source: "unknown".to_string(), @@ -56,7 +56,7 @@ impl Function { }); } - let context = Map::new(); + let context = Map::clone_from(outer_context)?; let parameter_argument_pairs = self.parameters.iter().zip(arguments.iter()); for (identifier, value) in parameter_argument_pairs { @@ -71,14 +71,6 @@ impl Function { } } -impl PartialEq for Function { - fn eq(&self, other: &Self) -> bool { - self.r#type.eq(&other.r#type) - && self.parameters.eq(&other.parameters) - && self.body.eq(&other.body) - } -} - impl Display for Function { fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { write!( diff --git a/src/value/map.rs b/src/value/map.rs index 7a51a07..f1ea8a3 100644 --- a/src/value/map.rs +++ b/src/value/map.rs @@ -56,6 +56,14 @@ impl Map { Ok(previous) } + pub fn unset_all(&self) -> Result<()> { + for (_key, (value, r#_type)) in self.variables.write()?.iter_mut() { + *value = Value::Option(None); + } + + Ok(()) + } + pub fn clear(&self) -> Result<()> { self.variables.write()?.clear();