From 3da4f02ffa31fd6dc0b61550debb40f254a050b0 Mon Sep 17 00:00:00 2001 From: JT Date: Mon, 9 Aug 2021 19:53:06 +1200 Subject: [PATCH] aliases --- src/eval.rs | 3 ++- src/parser.rs | 26 +++++++++++++++++++++----- src/parser_state.rs | 5 ++++- src/tests.rs | 5 +++++ 4 files changed, 32 insertions(+), 7 deletions(-) diff --git a/src/eval.rs b/src/eval.rs index 20c2b71f..9876dffe 100644 --- a/src/eval.rs +++ b/src/eval.rs @@ -111,13 +111,14 @@ pub struct State<'a> { pub parser_state: &'a ParserState, } +#[derive(Debug)] pub struct StackFrame { pub vars: HashMap, pub env_vars: HashMap, pub parent: Option, } -#[derive(Clone)] +#[derive(Clone, Debug)] pub struct Stack(Rc>); impl Default for Stack { diff --git a/src/parser.rs b/src/parser.rs index e8786248..ffbd1a88 100644 --- a/src/parser.rs +++ b/src/parser.rs @@ -2256,14 +2256,30 @@ impl<'a> ParserWorkingSet<'a> { pub fn parse_alias(&mut self, spans: &[Span]) -> (Statement, Option) { let name = self.get_span_contents(spans[0]); - if name == b"alias" && spans.len() >= 4 { - let alias_name = self.get_span_contents(spans[1]).to_vec(); - let _equals = self.get_span_contents(spans[2]); + if name == b"alias" { + if let Some(decl_id) = self.find_decl(b"alias") { + let (call, call_span, _) = self.parse_internal_call(spans[0], &spans[1..], decl_id); - let replacement = spans[3..].to_vec(); + if spans.len() >= 4 { + let alias_name = self.get_span_contents(spans[1]).to_vec(); + let _equals = self.get_span_contents(spans[2]); - self.add_alias(alias_name, replacement); + let replacement = spans[3..].to_vec(); + + self.add_alias(alias_name, replacement); + } + + return ( + Statement::Expression(Expression { + expr: Expr::Call(call), + span: call_span, + ty: Type::Unknown, + }), + None, + ); + } } + ( Statement::Expression(Expression { expr: Expr::Garbage, diff --git a/src/parser_state.rs b/src/parser_state.rs index db5d721e..1b487461 100644 --- a/src/parser_state.rs +++ b/src/parser_state.rs @@ -9,7 +9,7 @@ pub struct ParserState { vars: Vec, decls: Vec, blocks: Vec, - scope: Vec, // REMOVE + scope: Vec, } #[derive(Clone, Debug, PartialEq, Eq)] @@ -83,6 +83,9 @@ impl ParserState { for item in first.vars.into_iter() { last.vars.insert(item.0, item.1); } + for item in first.aliases.into_iter() { + last.aliases.insert(item.0, item.1); + } } } diff --git a/src/tests.rs b/src/tests.rs index 9e130394..2397be86 100644 --- a/src/tests.rs +++ b/src/tests.rs @@ -138,3 +138,8 @@ fn floating_add() -> TestResult { fn subcommand() -> TestResult { run_test("def foo [] {}; def \"foo bar\" [] {3}; foo bar", "3") } + +#[test] +fn alias_1() -> TestResult { + run_test("def foo [$x] { $x + 10 }; alias f = foo; f 100", "110") +}