Desugar function calls without args

This commit is contained in:
Joscha 2022-11-21 12:35:53 +01:00
parent 52c1aeba35
commit a3d6efcaec
3 changed files with 71 additions and 2 deletions

View file

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

67
src/desugar/call.rs Normal file
View file

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

View file

@ -8,9 +8,10 @@ impl Expr {
(Self::Lit(lit), desugared) (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::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