tada/src/desugar/program.rs
Joscha b84d5ae0c8 Create new objects with existing span
I've decided that attempting to create smaller spans is more difficult
and will also lead to worse error messages later on. It makes more sense
to just tag every newly created syntax tree element with the span of the
element it comes from.
2022-11-21 13:36:21 +01:00

46 lines
1.3 KiB
Rust

use crate::ast::{Expr, Lit, Program, Space, TableLit};
impl Program {
pub fn desugar(self) -> (Self, bool) {
match self {
Self::Expr { s0, expr, s1, span } => {
let (expr, desugared) = expr.desugar();
(Self::Expr { s0, expr, s1, span }, desugared)
}
Self::Module {
s0,
s1,
elems,
s2,
span,
} => {
let (elems, desugared) = elems.desugar_elem(|e| e.desugar());
if desugared {
let new = Self::Module {
s0,
s1,
elems,
s2,
span,
};
return (new, true);
}
let table = TableLit {
s0: s1,
elems,
s1: Space::empty(span),
span,
};
let new = Self::Expr {
s0,
expr: Expr::Lit(Lit::Table(table)),
s1: s2,
span,
};
(new, true)
}
}
}
}