Desugar literals

This commit is contained in:
Joscha 2022-11-21 12:05:24 +01:00
parent 8278442d3f
commit 52c1aeba35
4 changed files with 62 additions and 3 deletions

View file

@ -1,3 +1,4 @@
mod basic; mod basic;
mod expr; mod expr;
mod lit;
mod program; mod program;

View file

@ -3,10 +3,14 @@ use crate::ast::Expr;
impl Expr { impl Expr {
pub fn desugar(self) -> (Self, bool) { pub fn desugar(self) -> (Self, bool) {
match self { 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::Call(call) => (Self::Call(call), false), // TODO Implement
Self::Field(field) => (Self::Field(field), 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::TableConstr(constr) => (Self::TableConstr(constr), false), // TODO Implement
Self::TableDestr(destr) => (Self::TableDestr(destr), false), // TODO Implement Self::TableDestr(destr) => (Self::TableDestr(destr), false), // TODO Implement
Self::FuncDef(def) => (Self::FuncDef(def), false), // TODO Implement Self::FuncDef(def) => (Self::FuncDef(def), false), // TODO Implement

54
src/desugar/lit.rs Normal file
View file

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

View file

@ -16,7 +16,7 @@ impl Program {
s2, s2,
span, span,
} => { } => {
let (elems, desugared) = elems.desugar_elem(|e| (e, false)); // TODO Implement let (elems, desugared) = elems.desugar_elem(|e| e.desugar());
if desugared { if desugared {
let new = Self::Module { let new = Self::Module {
s0, s0,