diff options
| author | Laurenz <laurmaedje@gmail.com> | 2021-07-08 18:56:52 +0200 |
|---|---|---|
| committer | Laurenz <laurmaedje@gmail.com> | 2021-07-08 18:56:52 +0200 |
| commit | c5635d8a3f45865619d66bc9e296da7d9e9efa5a (patch) | |
| tree | 3dcfa1db01f0c129ebfd1ac66a255290b612d033 /src/parse | |
| parent | 859275b17b14f7e558710cbdf27ace33ca591c66 (diff) | |
Handle missing arguments to with expr
Diffstat (limited to 'src/parse')
| -rw-r--r-- | src/parse/mod.rs | 27 |
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; |
