summaryrefslogtreecommitdiff
path: root/src/syntax
diff options
context:
space:
mode:
Diffstat (limited to 'src/syntax')
-rw-r--r--src/syntax/expr.rs28
-rw-r--r--src/syntax/visit.rs2
2 files changed, 24 insertions, 6 deletions
diff --git a/src/syntax/expr.rs b/src/syntax/expr.rs
index 9292d5b6..5b751280 100644
--- a/src/syntax/expr.rs
+++ b/src/syntax/expr.rs
@@ -408,13 +408,15 @@ pub struct CallArgs {
pub items: Vec<CallArg>,
}
-/// An argument to a function call: `12` or `draw: false`.
+/// An argument to a function call.
#[derive(Debug, Clone, PartialEq)]
pub enum CallArg {
- /// A positional argument.
+ /// A positional argument: `12`.
Pos(Expr),
- /// A named argument.
+ /// A named argument: `draw: false`.
Named(Named),
+ /// A spreaded argument: `..things`.
+ Spread(Expr),
}
impl CallArg {
@@ -423,6 +425,7 @@ impl CallArg {
match self {
Self::Pos(expr) => expr.span(),
Self::Named(named) => named.span(),
+ Self::Spread(expr) => expr.span(),
}
}
}
@@ -442,13 +445,26 @@ pub struct ClosureExpr {
pub body: Rc<Expr>,
}
-/// An parameter to a closure: `x` or `draw: false`.
+/// An parameter to a closure.
#[derive(Debug, Clone, PartialEq)]
pub enum ClosureParam {
- /// A positional parameter.
+ /// A positional parameter: `x`.
Pos(Ident),
- /// A named parameter with a default value.
+ /// A named parameter with a default value: `draw: false`.
Named(Named),
+ /// A parameter sink: `..args`.
+ Sink(Ident),
+}
+
+impl ClosureParam {
+ /// The source code location.
+ pub fn span(&self) -> Span {
+ match self {
+ Self::Pos(ident) => ident.span,
+ Self::Named(named) => named.span(),
+ Self::Sink(ident) => ident.span,
+ }
+ }
}
/// A with expression: `f with (x, y: 1)`.
diff --git a/src/syntax/visit.rs b/src/syntax/visit.rs
index bc9359b3..e39d1f23 100644
--- a/src/syntax/visit.rs
+++ b/src/syntax/visit.rs
@@ -202,6 +202,7 @@ impl_visitors! {
match arg {
CallArg::Pos(expr) => v.visit_expr(expr),
CallArg::Named(named) => v.visit_expr(r!(named.expr)),
+ CallArg::Spread(expr) => v.visit_expr(expr),
}
}
@@ -219,6 +220,7 @@ impl_visitors! {
v.visit_binding(r!(named.name));
v.visit_expr(r!(named.expr));
}
+ ClosureParam::Sink(binding) => v.visit_binding(binding),
}
}