diff --git a/src/desugar.rs b/src/desugar.rs index 3847c62..4fe06c6 100644 --- a/src/desugar.rs +++ b/src/desugar.rs @@ -1 +1,2 @@ +mod basic; mod program; diff --git a/src/desugar/basic.rs b/src/desugar/basic.rs new file mode 100644 index 0000000..ba2fde0 --- /dev/null +++ b/src/desugar/basic.rs @@ -0,0 +1,36 @@ +use crate::ast::Separated; + +impl Separated { + pub fn desugar_elem(self, desugar_elem: impl Fn(E) -> (E, bool)) -> (Self, bool) { + match self { + Self::Empty(span) => (Self::Empty(span), false), + + Self::NonEmpty { + first_elem, + last_elems, + trailing, + span, + } => { + let (new_first_elem, mut desugared) = desugar_elem(first_elem); + let mut new_last_elems = vec![]; + for (separator, elem) in last_elems { + if desugared { + new_last_elems.push((separator, elem)); + } else { + let (elem, elem_desugared) = desugar_elem(elem); + desugared = desugared || elem_desugared; + new_last_elems.push((separator, elem)); + } + } + + let new = Self::NonEmpty { + first_elem: new_first_elem, + last_elems: new_last_elems, + trailing, + span, + }; + (new, desugared) + } + } + } +} diff --git a/src/desugar/program.rs b/src/desugar/program.rs index d97a6e0..a1ef50e 100644 --- a/src/desugar/program.rs +++ b/src/desugar/program.rs @@ -16,7 +16,7 @@ impl Program { s2, span, } => { - let (elems, desugared) = (elems, false); // TODO Implement + let (elems, desugared) = elems.desugar_elem(|e| (e, false)); // TODO Implement if desugared { let new = Self::Module { s0,