Simplify creating Call
This commit is contained in:
parent
78d08968eb
commit
009be99aaa
6 changed files with 63 additions and 80 deletions
|
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue