summaryrefslogtreecommitdiff
path: root/src/parse/mod.rs
diff options
context:
space:
mode:
authorLaurenz <laurmaedje@gmail.com>2021-07-08 18:56:52 +0200
committerLaurenz <laurmaedje@gmail.com>2021-07-08 18:56:52 +0200
commitc5635d8a3f45865619d66bc9e296da7d9e9efa5a (patch)
tree3dcfa1db01f0c129ebfd1ac66a255290b612d033 /src/parse/mod.rs
parent859275b17b14f7e558710cbdf27ace33ca591c66 (diff)
Handle missing arguments to with expr
Diffstat (limited to 'src/parse/mod.rs')
-rw-r--r--src/parse/mod.rs27
1 files changed, 16 insertions, 11 deletions
diff --git a/src/parse/mod.rs b/src/parse/mod.rs
index 793c4139..bdecc31f 100644
--- a/src/parse/mod.rs
+++ b/src/parse/mod.rs
@@ -256,7 +256,7 @@ fn expr_with(p: &mut Parser, atomic: bool, min_prec: usize) -> Option<Expr> {
}
if p.eat_if(Token::With) {
- lhs = with_expr(p, lhs);
+ lhs = with_expr(p, lhs)?;
}
if atomic {
@@ -574,16 +574,21 @@ fn args(p: &mut Parser) -> CallArgs {
}
/// Parse a with expression.
-fn with_expr(p: &mut Parser, callee: Expr) -> Expr {
- p.start_group(Group::Paren, TokenMode::Code);
- let args = args(p);
- p.end_group();
+fn with_expr(p: &mut Parser, callee: Expr) -> Option<Expr> {
+ if p.peek() == Some(Token::LeftParen) {
+ p.start_group(Group::Paren, TokenMode::Code);
+ let args = args(p);
+ p.end_group();
- Expr::With(WithExpr {
- span: p.span(callee.span().start),
- callee: Box::new(callee),
- args,
- })
+ Some(Expr::With(WithExpr {
+ span: p.span(callee.span().start),
+ callee: Box::new(callee),
+ args,
+ }))
+ } else {
+ p.expected("argument list");
+ None
+ }
}
/// Parse a let expression.
@@ -596,7 +601,7 @@ fn let_expr(p: &mut Parser) -> Option<Expr> {
let mut init = None;
if p.eat_if(Token::With) {
- init = Some(with_expr(p, Expr::Ident(binding.clone())));
+ init = with_expr(p, Expr::Ident(binding.clone()));
} else {
// If a parenthesis follows, this is a function definition.
let mut params = None;