Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/parser/src/grammar.rs')
-rw-r--r--crates/parser/src/grammar.rs15
1 files changed, 15 insertions, 0 deletions
diff --git a/crates/parser/src/grammar.rs b/crates/parser/src/grammar.rs
index 53fda3ae4f..34715628f1 100644
--- a/crates/parser/src/grammar.rs
+++ b/crates/parser/src/grammar.rs
@@ -393,11 +393,26 @@ fn delimited(
bra: SyntaxKind,
ket: SyntaxKind,
delim: SyntaxKind,
+ unexpected_delim_message: impl Fn() -> String,
first_set: TokenSet,
mut parser: impl FnMut(&mut Parser<'_>) -> bool,
) {
p.bump(bra);
while !p.at(ket) && !p.at(EOF) {
+ if p.at(delim) {
+ // Recover if an argument is missing and only got a delimiter,
+ // e.g. `(a, , b)`.
+
+ // Wrap the erroneous delimiter in an error node so that fixup logic gets rid of it.
+ // FIXME: Ideally this should be handled in fixup in a structured way, but our list
+ // nodes currently have no concept of a missing node between two delimiters.
+ // So doing it this way is easier.
+ let m = p.start();
+ p.error(unexpected_delim_message());
+ p.bump(delim);
+ m.complete(p, ERROR);
+ continue;
+ }
if !parser(p) {
break;
}