diff --git a/src/ast/call.rs b/src/ast/call.rs index adbbf68..6a9d13e 100644 --- a/src/ast/call.rs +++ b/src/ast/call.rs @@ -48,6 +48,35 @@ impl HasSpan for Call { } impl Call { + pub fn arg(base: Box, arg: Box, span: Span) -> Self { + Self::Arg { + expr: base, + s0: Space::empty(span), + s1: Space::empty(span), + arg, + s2: Space::empty(span), + span, + } + } + + pub fn no_arg(base: Box, span: Span) -> Self { + Self::NoArg { + expr: base, + s0: Space::empty(span), + s1: Space::empty(span), + span, + } + } + + pub fn constr(base: Box, constr: TableConstr, span: Span) -> Self { + Self::Constr { + expr: base, + s0: Space::empty(span), + constr, + span, + } + } + pub fn expr(self) -> Expr { Expr::Call(self) } diff --git a/src/desugar/call.rs b/src/desugar/call.rs index b5155d1..361bbf5 100644 --- a/src/desugar/call.rs +++ b/src/desugar/call.rs @@ -1,4 +1,4 @@ -use crate::ast::{BoundedSeparated, Call, Expr, Ident, Lit, Space, TableLitElem}; +use crate::ast::{BoundedSeparated, Call, Expr, Ident, Lit, TableLitElem}; // TODO Add span for just the parentheses to ast, or limit span to parentheses @@ -22,32 +22,23 @@ impl Call { (new, true) } - Self::NoArg { expr, s0, s1, span } => { - let new = Self::Arg { - expr, - s0, - s1, - arg: Lit::Nil(span).expr().boxed(), - s2: Space::empty(span), - span, - }; + Self::NoArg { + expr, + s0: _, + s1: _, + span, + } => { + let new = Self::arg(expr, Lit::Nil(span).expr().boxed(), span); (new.expr(), true) } Self::Constr { expr, - s0, + s0: _, constr, span, } => { - let new = Self::Arg { - expr, - s0, - s1: Space::empty(span), - arg: constr.expr().boxed(), - s2: Space::empty(span), - span, - }; + let new = Self::arg(expr, constr.expr().boxed(), span); (new.expr(), true) } } diff --git a/src/desugar/field.rs b/src/desugar/field.rs index caf1cdc..1c8f948 100644 --- a/src/desugar/field.rs +++ b/src/desugar/field.rs @@ -16,12 +16,11 @@ impl Field { .then(TableConstrElem::positional(expr)) .then(TableConstrElem::positional(index)) .table_constr(); - let new = Call::Constr { - expr: Lit::Builtin(Builtin::Get, span).expr().boxed(), - s0: Space::empty(span), + let new = Call::constr( + Lit::Builtin(Builtin::Get, span).expr().boxed(), constr, span, - }; + ); (new.expr(), true) } @@ -41,12 +40,11 @@ impl Field { .then(TableConstrElem::positional(index)) .then(TableConstrElem::positional(value)) .table_constr(); - let new = Call::Constr { - expr: Lit::Builtin(Builtin::Set, span).expr().boxed(), - s0: Space::empty(span), + let new = Call::constr( + Lit::Builtin(Builtin::Set, span).expr().boxed(), constr, span, - }; + ); (new.expr(), true) } diff --git a/src/desugar/func_def.rs b/src/desugar/func_def.rs index 5ac4eb2..93bdb04 100644 --- a/src/desugar/func_def.rs +++ b/src/desugar/func_def.rs @@ -15,26 +15,17 @@ impl FuncDef { } => { let quote = BoundedSeparated::new(span) .then(TableLitElem::named(Ident::new("quote", span), body, span)) - .table_lit() - .lit() - .expr() - .boxed(); - let scope = Call::NoArg { - expr: Lit::Builtin(Builtin::Scope, span).expr().boxed(), - s0: Space::empty(span), - s1: Space::empty(span), - span, - }; + .table_lit(); + let scope = Call::no_arg(Lit::Builtin(Builtin::Scope, span).expr().boxed(), span); let new = BoundedSeparated::new(span) - .then(TableConstrElem::positional(quote)) + .then(TableConstrElem::positional(Box::new(quote.lit().expr()))) .then(TableConstrElem::named( Ident::new("scope", span), scope.expr().boxed(), span, )) - .table_constr() - .expr(); - (new, true) + .table_constr(); + (new.expr(), true) } Self::AnonArg { @@ -48,12 +39,7 @@ impl FuncDef { } => { // `function s0 ( s1 arg s2 ) s3 body` // -> `function ( ) '{ local arg = 'arg(), body }` - let arg_call = Call::NoArg { - expr: Lit::Builtin(Builtin::Arg, span).expr().boxed(), - s0: Space::empty(span), - s1: Space::empty(span), - span, - }; + let arg_call = Call::no_arg(Lit::Builtin(Builtin::Arg, span).expr().boxed(), span); let arg_assign = Var::AssignIdent { local: Some(Space::empty(span)), name: arg, diff --git a/src/desugar/table_destr.rs b/src/desugar/table_destr.rs index 5981dfa..2216977 100644 --- a/src/desugar/table_destr.rs +++ b/src/desugar/table_destr.rs @@ -1,6 +1,6 @@ use crate::ast::{ - BoundedSeparated, Call, Expr, Ident, Lit, Space, StringLit, TableConstr, TableConstrElem, - TableDestr, TableLitElem, TablePattern, TablePatternElem, + BoundedSeparated, Call, Expr, Ident, Lit, StringLit, TableConstr, TableConstrElem, TableDestr, + TableLitElem, TablePattern, TablePatternElem, }; use crate::builtin::Builtin; @@ -53,12 +53,11 @@ impl TableDestr { )); } - let new = Call::Constr { - expr: Lit::Builtin(Builtin::Destructure, span).expr().boxed(), - s0: Space::empty(span), - constr: constr.table_constr(), + let new = Call::constr( + Lit::Builtin(Builtin::Destructure, span).expr().boxed(), + constr.table_constr(), span, - }; + ); (new.expr(), true) } } diff --git a/src/desugar/var.rs b/src/desugar/var.rs index 053e5d1..fc1b221 100644 --- a/src/desugar/var.rs +++ b/src/desugar/var.rs @@ -13,14 +13,7 @@ impl Var { s1, span, } => { - // `[ s0 index s1 ]` - // -> `'scope()[ s0 index s1 ]` - let scope = Call::NoArg { - expr: Lit::Builtin(Builtin::Scope, span).expr().boxed(), - s0: Space::empty(span), - s1: Space::empty(span), - span, - }; + let scope = Call::no_arg(Lit::Builtin(Builtin::Scope, span).expr().boxed(), span); let new = Field::Access { expr: scope.expr().boxed(), s0: Space::empty(span), @@ -42,14 +35,7 @@ impl Var { value, span, } => { - // `[ s0 index s1 ] s2 = s3 value` - // -> `'scope()[ s0 index s1 ] s2 = s3 value` - let scope = Call::NoArg { - expr: Lit::Builtin(Builtin::Scope, span).expr().boxed(), - s0: Space::empty(span), - s1: Space::empty(span), - span, - }; + let scope = Call::no_arg(Lit::Builtin(Builtin::Scope, span).expr().boxed(), span); let new = Field::Assign { expr: scope.expr().boxed(), s0: Space::empty(span), @@ -74,23 +60,17 @@ impl Var { value, span, } => { - let scope = Call::NoArg { - expr: Lit::Builtin(Builtin::Scope, span).expr().boxed(), - s0: Space::empty(span), - s1: Space::empty(span), - span, - }; + let scope = Call::no_arg(Lit::Builtin(Builtin::Scope, span).expr().boxed(), span); let constr = BoundedSeparated::new(span) .then(TableConstrElem::positional(scope.expr().boxed())) .then(TableConstrElem::positional(index)) .then(TableConstrElem::positional(value)) .table_constr(); - let new = Call::Constr { - expr: Lit::Builtin(Builtin::SetRaw, span).expr().boxed(), - s0: Space::empty(span), + let new = Call::constr( + Lit::Builtin(Builtin::SetRaw, span).expr().boxed(), constr, span, - }; + ); (new.expr(), true) }