Simplify creating Call

This commit is contained in:
Joscha 2022-11-22 16:55:27 +01:00
parent 78d08968eb
commit 009be99aaa
6 changed files with 63 additions and 80 deletions

View file

@ -48,6 +48,35 @@ impl HasSpan for Call {
} }
impl Call { impl Call {
pub fn arg(base: Box<Expr>, arg: Box<Expr>, 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<Expr>, span: Span) -> Self {
Self::NoArg {
expr: base,
s0: Space::empty(span),
s1: Space::empty(span),
span,
}
}
pub fn constr(base: Box<Expr>, constr: TableConstr, span: Span) -> Self {
Self::Constr {
expr: base,
s0: Space::empty(span),
constr,
span,
}
}
pub fn expr(self) -> Expr { pub fn expr(self) -> Expr {
Expr::Call(self) Expr::Call(self)
} }

View file

@ -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 // TODO Add span for just the parentheses to ast, or limit span to parentheses
@ -22,32 +22,23 @@ impl Call {
(new, true) (new, true)
} }
Self::NoArg { expr, s0, s1, span } => { Self::NoArg {
let new = Self::Arg {
expr, expr,
s0, s0: _,
s1, s1: _,
arg: Lit::Nil(span).expr().boxed(),
s2: Space::empty(span),
span, span,
}; } => {
let new = Self::arg(expr, Lit::Nil(span).expr().boxed(), span);
(new.expr(), true) (new.expr(), true)
} }
Self::Constr { Self::Constr {
expr, expr,
s0, s0: _,
constr, constr,
span, span,
} => { } => {
let new = Self::Arg { let new = Self::arg(expr, constr.expr().boxed(), span);
expr,
s0,
s1: Space::empty(span),
arg: constr.expr().boxed(),
s2: Space::empty(span),
span,
};
(new.expr(), true) (new.expr(), true)
} }
} }

View file

@ -16,12 +16,11 @@ impl Field {
.then(TableConstrElem::positional(expr)) .then(TableConstrElem::positional(expr))
.then(TableConstrElem::positional(index)) .then(TableConstrElem::positional(index))
.table_constr(); .table_constr();
let new = Call::Constr { let new = Call::constr(
expr: Lit::Builtin(Builtin::Get, span).expr().boxed(), Lit::Builtin(Builtin::Get, span).expr().boxed(),
s0: Space::empty(span),
constr, constr,
span, span,
}; );
(new.expr(), true) (new.expr(), true)
} }
@ -41,12 +40,11 @@ impl Field {
.then(TableConstrElem::positional(index)) .then(TableConstrElem::positional(index))
.then(TableConstrElem::positional(value)) .then(TableConstrElem::positional(value))
.table_constr(); .table_constr();
let new = Call::Constr { let new = Call::constr(
expr: Lit::Builtin(Builtin::Set, span).expr().boxed(), Lit::Builtin(Builtin::Set, span).expr().boxed(),
s0: Space::empty(span),
constr, constr,
span, span,
}; );
(new.expr(), true) (new.expr(), true)
} }

View file

@ -15,26 +15,17 @@ impl FuncDef {
} => { } => {
let quote = BoundedSeparated::new(span) let quote = BoundedSeparated::new(span)
.then(TableLitElem::named(Ident::new("quote", span), body, span)) .then(TableLitElem::named(Ident::new("quote", span), body, span))
.table_lit() .table_lit();
.lit() let scope = Call::no_arg(Lit::Builtin(Builtin::Scope, span).expr().boxed(), span);
.expr()
.boxed();
let scope = Call::NoArg {
expr: Lit::Builtin(Builtin::Scope, span).expr().boxed(),
s0: Space::empty(span),
s1: Space::empty(span),
span,
};
let new = BoundedSeparated::new(span) let new = BoundedSeparated::new(span)
.then(TableConstrElem::positional(quote)) .then(TableConstrElem::positional(Box::new(quote.lit().expr())))
.then(TableConstrElem::named( .then(TableConstrElem::named(
Ident::new("scope", span), Ident::new("scope", span),
scope.expr().boxed(), scope.expr().boxed(),
span, span,
)) ))
.table_constr() .table_constr();
.expr(); (new.expr(), true)
(new, true)
} }
Self::AnonArg { Self::AnonArg {
@ -48,12 +39,7 @@ impl FuncDef {
} => { } => {
// `function s0 ( s1 arg s2 ) s3 body` // `function s0 ( s1 arg s2 ) s3 body`
// -> `function ( ) '{ local arg = 'arg(), body }` // -> `function ( ) '{ local arg = 'arg(), body }`
let arg_call = Call::NoArg { let arg_call = Call::no_arg(Lit::Builtin(Builtin::Arg, span).expr().boxed(), span);
expr: Lit::Builtin(Builtin::Arg, span).expr().boxed(),
s0: Space::empty(span),
s1: Space::empty(span),
span,
};
let arg_assign = Var::AssignIdent { let arg_assign = Var::AssignIdent {
local: Some(Space::empty(span)), local: Some(Space::empty(span)),
name: arg, name: arg,

View file

@ -1,6 +1,6 @@
use crate::ast::{ use crate::ast::{
BoundedSeparated, Call, Expr, Ident, Lit, Space, StringLit, TableConstr, TableConstrElem, BoundedSeparated, Call, Expr, Ident, Lit, StringLit, TableConstr, TableConstrElem, TableDestr,
TableDestr, TableLitElem, TablePattern, TablePatternElem, TableLitElem, TablePattern, TablePatternElem,
}; };
use crate::builtin::Builtin; use crate::builtin::Builtin;
@ -53,12 +53,11 @@ impl TableDestr {
)); ));
} }
let new = Call::Constr { let new = Call::constr(
expr: Lit::Builtin(Builtin::Destructure, span).expr().boxed(), Lit::Builtin(Builtin::Destructure, span).expr().boxed(),
s0: Space::empty(span), constr.table_constr(),
constr: constr.table_constr(),
span, span,
}; );
(new.expr(), true) (new.expr(), true)
} }
} }

View file

@ -13,14 +13,7 @@ impl Var {
s1, s1,
span, span,
} => { } => {
// `[ s0 index s1 ]` let scope = Call::no_arg(Lit::Builtin(Builtin::Scope, span).expr().boxed(), span);
// -> `'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 new = Field::Access { let new = Field::Access {
expr: scope.expr().boxed(), expr: scope.expr().boxed(),
s0: Space::empty(span), s0: Space::empty(span),
@ -42,14 +35,7 @@ impl Var {
value, value,
span, span,
} => { } => {
// `[ s0 index s1 ] s2 = s3 value` let scope = Call::no_arg(Lit::Builtin(Builtin::Scope, span).expr().boxed(), span);
// -> `'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 new = Field::Assign { let new = Field::Assign {
expr: scope.expr().boxed(), expr: scope.expr().boxed(),
s0: Space::empty(span), s0: Space::empty(span),
@ -74,23 +60,17 @@ impl Var {
value, value,
span, span,
} => { } => {
let scope = Call::NoArg { let scope = Call::no_arg(Lit::Builtin(Builtin::Scope, span).expr().boxed(), span);
expr: Lit::Builtin(Builtin::Scope, span).expr().boxed(),
s0: Space::empty(span),
s1: Space::empty(span),
span,
};
let constr = BoundedSeparated::new(span) let constr = BoundedSeparated::new(span)
.then(TableConstrElem::positional(scope.expr().boxed())) .then(TableConstrElem::positional(scope.expr().boxed()))
.then(TableConstrElem::positional(index)) .then(TableConstrElem::positional(index))
.then(TableConstrElem::positional(value)) .then(TableConstrElem::positional(value))
.table_constr(); .table_constr();
let new = Call::Constr { let new = Call::constr(
expr: Lit::Builtin(Builtin::SetRaw, span).expr().boxed(), Lit::Builtin(Builtin::SetRaw, span).expr().boxed(),
s0: Space::empty(span),
constr, constr,
span, span,
}; );
(new.expr(), true) (new.expr(), true)
} }