Remove extra Loc from AST in SpaceBefore/After

This commit is contained in:
Richard Feldman 2019-09-18 05:00:48 -04:00
parent 4a196915b0
commit 9f5a359051
3 changed files with 31 additions and 18 deletions

View file

@ -1,4 +1,5 @@
use bumpalo::collections::vec::Vec; use bumpalo::collections::vec::Vec;
use bumpalo::Bump;
use operator::Operator; use operator::Operator;
use region::{Loc, Region}; use region::{Loc, Region};
use std::fmt::{self, Display, Formatter}; use std::fmt::{self, Display, Formatter};
@ -69,8 +70,8 @@ pub enum Expr<'a> {
// Blank Space (e.g. comments, spaces, newlines) before or after an expression. // Blank Space (e.g. comments, spaces, newlines) before or after an expression.
// We preserve this for the formatter; canonicalization ignores it. // We preserve this for the formatter; canonicalization ignores it.
SpaceBefore(&'a [Space<'a>], &'a Loc<Expr<'a>>), SpaceBefore(&'a [Space<'a>], &'a Expr<'a>),
SpaceAfter(&'a Loc<Expr<'a>>, &'a [Space<'a>]), SpaceAfter(&'a Expr<'a>, &'a [Space<'a>]),
// Problems // Problems
MalformedIdent(&'a str), MalformedIdent(&'a str),
@ -197,12 +198,26 @@ impl<'a> Expr<'a> {
} }
} }
pub fn with_spaces_before(spaces: &'a [Space<'a>], loc_expr: &'a Loc<Expr<'a>>) -> Self { pub fn with_spaces_before(
Expr::SpaceBefore(spaces, loc_expr) arena: &'a Bump,
spaces: &'a [Space<'a>],
loc_expr: Loc<Expr<'a>>,
) -> Loc<Self> {
let region = loc_expr.region;
let value = Expr::SpaceBefore(spaces, arena.alloc(loc_expr.value));
Loc { region, value }
} }
pub fn with_spaces_after(loc_expr: &'a Loc<Expr<'a>>, spaces: &'a [Space<'a>]) -> Self { pub fn with_spaces_after(
Expr::SpaceAfter(loc_expr, spaces) arena: &'a Bump,
loc_expr: Loc<Expr<'a>>,
spaces: &'a [Space<'a>],
) -> Loc<Self> {
let region = loc_expr.region;
let value = Expr::SpaceAfter(arena.alloc(loc_expr.value), spaces);
Loc { region, value }
} }
} }

View file

@ -27,8 +27,8 @@ where
loc_expr loc_expr
} else { } else {
Located { Located {
region: loc_expr.region.clone(), region: loc_expr.region,
value: Expr::SpaceBefore(space_list, arena.alloc(loc_expr)), value: Expr::SpaceBefore(space_list, arena.alloc(loc_expr.value)),
} }
} }
}, },
@ -49,8 +49,8 @@ where
loc_expr loc_expr
} else { } else {
Located { Located {
region: loc_expr.region.clone(), region: loc_expr.region,
value: Expr::SpaceBefore(space_list, arena.alloc(loc_expr)), value: Expr::SpaceBefore(space_list, arena.alloc(loc_expr.value)),
} }
} }
}, },
@ -71,8 +71,8 @@ where
loc_expr loc_expr
} else { } else {
Located { Located {
region: loc_expr.region.clone(), region: loc_expr.region,
value: Expr::SpaceAfter(arena.alloc(loc_expr), space_list), value: Expr::SpaceAfter(arena.alloc(loc_expr.value), space_list),
} }
} }
}, },
@ -93,8 +93,8 @@ where
loc_expr loc_expr
} else { } else {
Located { Located {
region: loc_expr.region.clone(), region: loc_expr.region,
value: Expr::SpaceAfter(arena.alloc(loc_expr), space_list), value: Expr::SpaceAfter(arena.alloc(loc_expr.value), space_list),
} }
} }
}, },

View file

@ -56,17 +56,15 @@ fn parse_expr<'a>(min_indent: u16, arena: &'a Bump, state: State<'a>) -> ParseRe
), ),
|arena, (loc_expr1, opt_operator)| match opt_operator { |arena, (loc_expr1, opt_operator)| match opt_operator {
Some(((spaces_before_op, (loc_op, spaces_after_op)), loc_expr2)) => { Some(((spaces_before_op, (loc_op, spaces_after_op)), loc_expr2)) => {
let region1 = loc_expr1.region.clone();
let region2 = loc_expr2.region.clone();
let loc_expr1 = if spaces_before_op.is_empty() { let loc_expr1 = if spaces_before_op.is_empty() {
loc_expr1 loc_expr1
} else { } else {
Expr::with_spaces_after(arena.alloc(loc_expr1), spaces_before_op).loc(region1) Expr::with_spaces_after(arena, loc_expr1, spaces_before_op)
}; };
let loc_expr2 = if spaces_after_op.is_empty() { let loc_expr2 = if spaces_after_op.is_empty() {
loc_expr2 loc_expr2
} else { } else {
Expr::with_spaces_after(arena.alloc(loc_expr2), spaces_after_op).loc(region2) Expr::with_spaces_after(arena, loc_expr2, spaces_after_op)
}; };
let tuple = arena.alloc((loc_expr1, loc_op, loc_expr2)); let tuple = arena.alloc((loc_expr1, loc_op, loc_expr2));