Switch TableLit and Program to BoundedSeparated

This commit is contained in:
Joscha 2022-11-21 23:37:36 +01:00
parent a1867fdc4e
commit e3fa3500d4
18 changed files with 146 additions and 129 deletions

View file

@ -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)
}
}

View file

@ -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)
}

View file

@ -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)
}
}

View file

@ -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,
};