Desugar function calls with argument

This commit is contained in:
Joscha 2022-11-21 13:27:07 +01:00
parent 7bfaebc05f
commit 5c8dd1969f
2 changed files with 64 additions and 11 deletions

View file

@ -45,6 +45,15 @@ pub struct Ident {
pub span: Span,
}
impl Ident {
pub fn new<S: ToString>(name: S, span: Span) -> Self {
Self {
name: name.to_string(),
span,
}
}
}
impl fmt::Debug for Ident {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "i#{}", self.name)

View file

@ -1,8 +1,8 @@
use chumsky::Span;
use crate::ast::{Call, Expr, Lit, Space};
use crate::ast::{Call, Expr, Ident, Lit, Separated, Space, TableLit, TableLitElem};
use crate::span::HasSpan;
// TODO Add span for just the parentheses to ast, or limit span to parentheses
impl Call {
pub fn desugar(self) -> (Expr, bool) {
match self {
@ -14,15 +14,59 @@ impl Call {
s2,
span,
} => {
let (expr, desugared) = expr.desugar();
if desugared {
let new = Expr::Call(Self::Arg {
expr,
expr: Box::new(expr),
s0,
s1,
arg,
s2,
span,
});
(new, false) // TODO Implement
return (new, true);
}
let (arg, desugared) = arg.desugar();
if desugared {
let new = Expr::Call(Self::Arg {
expr: Box::new(expr),
s0,
s1,
arg: Box::new(arg),
s2,
span,
});
return (new, true);
}
let call = TableLitElem::Named {
name: Ident::new("call", span),
s0: Space::empty(span),
s1: Space::empty(span),
value: Box::new(expr),
span,
};
let arg = TableLitElem::Named {
name: Ident::new("arg", span),
s0: Space::empty(span),
s1: Space::empty(span),
value: Box::new(arg),
span,
};
let elems = Separated::NonEmpty {
first_elem: call,
last_elems: vec![((Space::empty(span), Space::empty(span)), arg)],
trailing: None,
span,
};
let new = Expr::Lit(Lit::Table(TableLit {
s0: Space::empty(span),
elems,
s1: Space::empty(span),
span,
}));
(new, true)
}
Self::NoArg { expr, s0, s1, span } => {