From 13b7db79b04e34e9cf67a9708d566fd72dd6bc06 Mon Sep 17 00:00:00 2001 From: Joscha Date: Mon, 21 Nov 2022 11:35:58 +0100 Subject: [PATCH] Desugar separated elements --- src/desugar.rs | 1 + src/desugar/basic.rs | 36 ++++++++++++++++++++++++++++++++++++ src/desugar/program.rs | 2 +- 3 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 src/desugar/basic.rs 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,