FIX: Grouped Expressions store their position properly now.

This commit is contained in:
Jeremy Wall 2019-03-26 20:44:35 -04:00
parent 561b277b24
commit df8834dddc
4 changed files with 9 additions and 9 deletions

View File

@ -639,8 +639,7 @@ pub enum Expression {
// Complex Expressions
Copy(CopyDef),
Range(RangeDef),
// TODO(jwall): This should really store it's position :-(
Grouped(Box<Expression>),
Grouped(Box<Expression>, Position),
Format(FormatDef),
Include(IncludeDef),
Import(ImportDef),
@ -662,7 +661,7 @@ impl Expression {
&Expression::Binary(ref def) => &def.pos,
&Expression::Copy(ref def) => &def.pos,
&Expression::Range(ref def) => &def.pos,
&Expression::Grouped(ref expr) => expr.pos(),
&Expression::Grouped(_, ref pos) => pos,
&Expression::Format(ref def) => &def.pos,
&Expression::Call(ref def) => &def.pos,
&Expression::Func(ref def) => &def.pos,
@ -695,7 +694,7 @@ impl fmt::Display for Expression {
&Expression::Range(_) => {
write!(w, "<Range>")?;
}
&Expression::Grouped(_) => {
&Expression::Grouped(_, _) => {
write!(w, "(<Expr>)")?;
}
&Expression::Format(_) => {

View File

@ -91,7 +91,7 @@ impl<'a> AstWalker<'a> {
self.walk_expression(def.left.as_mut());
self.walk_expression(def.right.as_mut());
}
Expression::Grouped(ref mut expr) => {
Expression::Grouped(ref mut expr, _) => {
self.walk_expression(expr);
}
Expression::Func(ref mut def) => self.walk_expression(def.fields.as_mut()),

View File

@ -1905,7 +1905,7 @@ impl<'a> FileBuilder<'a> {
&Expression::Binary(ref def) => self.eval_binary(def, scope),
&Expression::Copy(ref def) => self.eval_copy(def, scope),
&Expression::Range(ref def) => self.eval_range(def, scope),
&Expression::Grouped(ref expr) => self.eval_expr(expr, scope),
&Expression::Grouped(ref expr, _) => self.eval_expr(expr, scope),
&Expression::Format(ref def) => self.eval_format(def, scope),
&Expression::Call(ref def) => self.eval_call(def, scope),
&Expression::Func(ref def) => {

View File

@ -299,20 +299,21 @@ make_fn!(
)
);
fn expression_to_grouped_expression(e: Expression) -> Expression {
Expression::Grouped(Box::new(e))
fn expression_to_grouped_expression(e: Expression, pos: Position) -> Expression {
Expression::Grouped(Box::new(e), pos)
}
make_fn!(
grouped_expression<SliceIter<Token>, Expression>,
do_each!(
pos => pos,
_ => punct!("("),
expr => do_each!(
expr => trace_parse!(expression),
_ => must!(punct!(")")),
(expr)
),
(expression_to_grouped_expression(expr))
(expression_to_grouped_expression(expr, pos))
)
);