diff --git a/src/desugar.rs b/src/desugar.rs index 4a900f3..f99da41 100644 --- a/src/desugar.rs +++ b/src/desugar.rs @@ -1,4 +1,5 @@ mod basic; +mod call; mod expr; mod lit; mod program; diff --git a/src/desugar/call.rs b/src/desugar/call.rs new file mode 100644 index 0000000..7dff8a8 --- /dev/null +++ b/src/desugar/call.rs @@ -0,0 +1,67 @@ +use crate::ast::{Call, Expr, Lit, Space}; +use crate::span::HasSpan; + +impl Call { + pub fn desugar(self) -> (Expr, bool) { + match self { + Self::Arg { + expr, + s0, + s1, + arg, + s2, + span, + } => { + let new = Expr::Call(Self::Arg { + expr, + s0, + s1, + arg, + s2, + span, + }); + (new, false) // TODO Implement + } + + Self::NoArg { expr, s0, s1, span } => { + let (expr, desugared) = expr.desugar(); + if desugared { + let new = Expr::Call(Self::NoArg { + expr: Box::new(expr), + s0, + s1, + span, + }); + return (new, true); + } + + let arg_span = s1.span().at_start(); + let arg = Expr::Lit(Lit::Nil(arg_span)); + let new = Expr::Call(Self::Arg { + expr: Box::new(expr), + s0, + s1, + arg: Box::new(arg), + s2: Space::empty(arg_span.at_end()), + span, + }); + (new, true) + } + + Self::Constr { + expr, + s0, + constr, + span, + } => { + let new = Expr::Call(Self::Constr { + expr, + s0, + constr, + span, + }); + (new, false) // TODO Implement + } + } + } +} diff --git a/src/desugar/expr.rs b/src/desugar/expr.rs index 1ee7e06..5877228 100644 --- a/src/desugar/expr.rs +++ b/src/desugar/expr.rs @@ -8,9 +8,10 @@ impl Expr { (Self::Lit(lit), desugared) } - Self::Call(call) => (Self::Call(call), false), // TODO Implement + Self::Call(call) => call.desugar(), + 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