From 52c1aeba35959361f0d9ea47e978f163a66ebf66 Mon Sep 17 00:00:00 2001 From: Joscha Date: Mon, 21 Nov 2022 12:05:24 +0100 Subject: [PATCH] Desugar literals --- src/desugar.rs | 1 + src/desugar/expr.rs | 8 +++++-- src/desugar/lit.rs | 54 ++++++++++++++++++++++++++++++++++++++++++ src/desugar/program.rs | 2 +- 4 files changed, 62 insertions(+), 3 deletions(-) create mode 100644 src/desugar/lit.rs diff --git a/src/desugar.rs b/src/desugar.rs index f29ec0e..4a900f3 100644 --- a/src/desugar.rs +++ b/src/desugar.rs @@ -1,3 +1,4 @@ mod basic; mod expr; +mod lit; mod program; diff --git a/src/desugar/expr.rs b/src/desugar/expr.rs index 7390148..1ee7e06 100644 --- a/src/desugar/expr.rs +++ b/src/desugar/expr.rs @@ -3,10 +3,14 @@ use crate::ast::Expr; impl Expr { pub fn desugar(self) -> (Self, bool) { match self { - Self::Lit(lit) => (Self::Lit(lit), false), // TODO Implement + Self::Lit(lit) => { + let (lit, desugared) = lit.desugar(); + (Self::Lit(lit), desugared) + } + Self::Call(call) => (Self::Call(call), false), // TODO Implement Self::Field(field) => (Self::Field(field), false), // TODO Implement - Self::Var(var) => (Self::Var(var), false), // TODO Implement + Self::Var(var) => (Self::Var(var), false), // TODO Implement Self::TableConstr(constr) => (Self::TableConstr(constr), false), // TODO Implement Self::TableDestr(destr) => (Self::TableDestr(destr), false), // TODO Implement Self::FuncDef(def) => (Self::FuncDef(def), false), // TODO Implement diff --git a/src/desugar/lit.rs b/src/desugar/lit.rs new file mode 100644 index 0000000..56c9e0f --- /dev/null +++ b/src/desugar/lit.rs @@ -0,0 +1,54 @@ +use crate::ast::{Lit, TableLit, TableLitElem}; + +impl TableLitElem { + pub fn desugar(self) -> (Self, bool) { + match self { + Self::Positional(expr) => { + let (expr, desugared) = expr.desugar(); + (Self::Positional(Box::new(expr)), desugared) + } + Self::Named { + name, + s0, + s1, + value, + span, + } => { + let (value, desugared) = value.desugar(); + let new = Self::Named { + name, + s0, + s1, + value: Box::new(value), + span, + }; + (new, desugared) + } + } + } +} + +impl TableLit { + pub fn desugar(self) -> (Self, bool) { + let (elems, desugared) = self.elems.desugar_elem(|e| e.desugar()); + let new = Self { + s0: self.s0, + elems, + s1: self.s1, + span: self.span, + }; + (new, desugared) + } +} + +impl Lit { + pub fn desugar(self) -> (Self, bool) { + match self { + Self::Table(table) => { + let (table, desugared) = table.desugar(); + (Self::Table(table), desugared) + } + lit => (lit, false), + } + } +} diff --git a/src/desugar/program.rs b/src/desugar/program.rs index 17f9d79..6598fed 100644 --- a/src/desugar/program.rs +++ b/src/desugar/program.rs @@ -16,7 +16,7 @@ impl Program { s2, span, } => { - let (elems, desugared) = elems.desugar_elem(|e| (e, false)); // TODO Implement + let (elems, desugared) = elems.desugar_elem(|e| e.desugar()); if desugared { let new = Self::Module { s0,