From 5c8dd1969f640e82f439e190eef1c50ab9b1c8d2 Mon Sep 17 00:00:00 2001 From: Joscha Date: Mon, 21 Nov 2022 13:27:07 +0100 Subject: [PATCH] Desugar function calls with argument --- src/ast/basic.rs | 9 +++++++ src/desugar/call.rs | 66 +++++++++++++++++++++++++++++++++++++-------- 2 files changed, 64 insertions(+), 11 deletions(-) diff --git a/src/ast/basic.rs b/src/ast/basic.rs index 49d867f..e78a9bf 100644 --- a/src/ast/basic.rs +++ b/src/ast/basic.rs @@ -45,6 +45,15 @@ pub struct Ident { pub span: Span, } +impl Ident { + pub fn new(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) diff --git a/src/desugar/call.rs b/src/desugar/call.rs index b78c77f..52cd41f 100644 --- a/src/desugar/call.rs +++ b/src/desugar/call.rs @@ -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 new = Expr::Call(Self::Arg { - expr, - s0, - s1, - arg, - s2, + let (expr, desugared) = expr.desugar(); + if desugared { + let new = Expr::Call(Self::Arg { + expr: Box::new(expr), + s0, + s1, + arg, + s2, + span, + }); + 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, - }); - (new, false) // TODO Implement + }; + 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 } => {