Switch TableLit and Program to BoundedSeparated
This commit is contained in:
parent
a1867fdc4e
commit
e3fa3500d4
18 changed files with 146 additions and 129 deletions
|
|
@ -1,4 +1,4 @@
|
|||
use crate::ast::Separated;
|
||||
use crate::ast::{BoundedSeparated, Separated};
|
||||
|
||||
impl<E, S1, S2> Separated<E, S1, S2> {
|
||||
pub fn desugar_elem(self, desugar_elem: impl Fn(E) -> (E, bool)) -> (Self, bool) {
|
||||
|
|
@ -34,3 +34,26 @@ impl<E, S1, S2> Separated<E, S1, S2> {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl<E> BoundedSeparated<E> {
|
||||
pub fn desugar(self, desugar_elem: impl Fn(E) -> (E, bool)) -> (Self, bool) {
|
||||
let mut desugared = false;
|
||||
let mut elems = vec![];
|
||||
for (s0, elem, s1) in self.elems {
|
||||
if desugared {
|
||||
elems.push((s0, elem, s1));
|
||||
} else {
|
||||
let (elem, elem_desugared) = desugar_elem(elem);
|
||||
desugared = desugared || elem_desugared;
|
||||
elems.push((s0, elem, s1));
|
||||
}
|
||||
}
|
||||
|
||||
let new = Self {
|
||||
elems,
|
||||
trailing: self.trailing,
|
||||
span: self.span,
|
||||
};
|
||||
(new, desugared)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
use crate::ast::{Call, Expr, Ident, Lit, Separated, Space, TableLit, TableLitElem};
|
||||
use crate::ast::{BoundedSeparated, Call, Expr, Ident, Lit, Space, TableLit, TableLitElem};
|
||||
|
||||
// TODO Add span for just the parentheses to ast, or limit span to parentheses
|
||||
|
||||
|
|
@ -29,18 +29,15 @@ impl Call {
|
|||
value: arg,
|
||||
span,
|
||||
};
|
||||
let elems = Separated::NonEmpty {
|
||||
first_elem: call,
|
||||
last_elems: vec![((Space::empty(span), Space::empty(span)), arg)],
|
||||
let elems = vec![
|
||||
(s0, call, Space::empty(span)),
|
||||
(Space::empty(span), arg, s2),
|
||||
];
|
||||
let new = Expr::Lit(Lit::Table(TableLit(BoundedSeparated {
|
||||
elems,
|
||||
trailing: None,
|
||||
span,
|
||||
};
|
||||
let new = Expr::Lit(Lit::Table(TableLit {
|
||||
s0,
|
||||
elems,
|
||||
s1: s2,
|
||||
span,
|
||||
}));
|
||||
})));
|
||||
(new, true)
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -31,21 +31,8 @@ impl TableLitElem {
|
|||
|
||||
impl TableLit {
|
||||
pub fn desugar(self) -> (Self, bool) {
|
||||
let Self {
|
||||
s0,
|
||||
elems,
|
||||
s1,
|
||||
span,
|
||||
} = self;
|
||||
|
||||
let (elems, desugared) = elems.desugar_elem(|e| e.desugar());
|
||||
let new = Self {
|
||||
s0,
|
||||
elems,
|
||||
s1,
|
||||
span,
|
||||
};
|
||||
(new, desugared)
|
||||
let (elems, desugared) = self.0.desugar(|e| e.desugar());
|
||||
(Self(elems), desugared)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -9,24 +9,12 @@ impl Program {
|
|||
(new, desugared)
|
||||
}
|
||||
|
||||
Self::Module {
|
||||
s0,
|
||||
s1,
|
||||
elems,
|
||||
s2,
|
||||
span,
|
||||
} => {
|
||||
// `s0 module s1 elems s2`
|
||||
// -> `s0 '{ s1 elems s2 } empty`
|
||||
let table = TableLit {
|
||||
s0: s1,
|
||||
elems,
|
||||
s1: s2,
|
||||
span,
|
||||
};
|
||||
Self::Module { s0, elems, span } => {
|
||||
// `s0 module elems`
|
||||
// -> `s0 table`
|
||||
let new = Self::Expr {
|
||||
s0,
|
||||
expr: Expr::Lit(Lit::Table(table)),
|
||||
expr: Expr::Lit(Lit::Table(TableLit(elems))),
|
||||
s1: Space::empty(span),
|
||||
span,
|
||||
};
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue