From e095cb3235abb16c805cf4e3419d8bce078a6230 Mon Sep 17 00:00:00 2001 From: Jeremy Wall Date: Fri, 1 Mar 2019 16:52:08 -0600 Subject: [PATCH] REFACTOR: AST changes to support optional defaults. --- src/ast/mod.rs | 2 +- src/ast/walk.rs | 9 ++++++++- src/build/mod.rs | 3 ++- src/build/test.rs | 4 ++-- src/parse/mod.rs | 6 +++--- 5 files changed, 16 insertions(+), 8 deletions(-) diff --git a/src/ast/mod.rs b/src/ast/mod.rs index c884d53..761dd5e 100644 --- a/src/ast/mod.rs +++ b/src/ast/mod.rs @@ -303,7 +303,7 @@ pub struct CallDef { #[derive(PartialEq, Debug, Clone)] pub struct SelectDef { pub val: Box, - pub default: Box, + pub default: Option>, pub tuple: FieldList, pub pos: Position, } diff --git a/src/ast/walk.rs b/src/ast/walk.rs index f5f33e5..1910d8d 100644 --- a/src/ast/walk.rs +++ b/src/ast/walk.rs @@ -109,7 +109,14 @@ impl<'a> AstWalker<'a> { } } Expression::Select(ref mut def) => { - self.walk_expression(def.default.as_mut()); + match def.default { + Some(ref mut e) => { + self.walk_expression(e.as_mut()); + } + None => { + // noop; + } + }; self.walk_expression(def.val.as_mut()); self.walk_fieldset(&mut def.tuple); } diff --git a/src/build/mod.rs b/src/build/mod.rs index 3e8431c..9b50bb4 100644 --- a/src/build/mod.rs +++ b/src/build/mod.rs @@ -1290,7 +1290,8 @@ impl<'a> FileBuilder<'a> { fn eval_select(&self, def: &SelectDef, scope: &Scope) -> Result, Box> { let target = &def.val; - let def_expr = &def.default; + // FIXME(jwall): Handle the no default case in here. + let def_expr = def.default.as_ref().unwrap(); let fields = &def.tuple; // First resolve the target expression. let v = self.eval_expr(target, scope)?; diff --git a/src/build/test.rs b/src/build/test.rs index 6442bef..0be293a 100644 --- a/src/build/test.rs +++ b/src/build/test.rs @@ -187,10 +187,10 @@ fn test_select_expr_not_a_string() { "foo".to_string(), Position::new(1, 1, 1) )))), - default: Box::new(Expression::Simple(Value::Int(value_node!( + default: Some(Box::new(Expression::Simple(Value::Int(value_node!( 1, Position::new(1, 1, 1) - )))), + ))))), tuple: vec![ ( make_tok!("bar", Position::new(1, 1, 1)), diff --git a/src/parse/mod.rs b/src/parse/mod.rs index b1445de..c77f3d1 100644 --- a/src/parse/mod.rs +++ b/src/parse/mod.rs @@ -441,13 +441,13 @@ fn func_expression(input: SliceIter) -> Result, Expressi fn tuple_to_select<'a>( input: SliceIter<'a, Token>, e1: Expression, - e2: Expression, + e2: Option, val: Value, ) -> ConvertResult<'a, Expression> { match val { Value::Tuple(v) => Ok(Expression::Select(SelectDef { val: Box::new(e1), - default: Box::new(e2), + default: e2.map(|e| Box::new(e)), tuple: v.val, pos: (&input).into(), })), @@ -479,7 +479,7 @@ fn select_expression(input: SliceIter) -> Result, Expres Result::Fail(e) => Result::Fail(e), Result::Incomplete(offset) => Result::Incomplete(offset), Result::Complete(rest, (val, default, map)) => { - match tuple_to_select(input.clone(), val, default, map) { + match tuple_to_select(input.clone(), val, Some(default), map) { Ok(expr) => Result::Complete(rest, expr), Err(e) => Result::Fail(Error::caused_by( "Invalid Select Expression",