Skip to content

Commit e6dd522

Browse files
committed
fix: add err recovery for use_tree_list parsing
1 parent 34df296 commit e6dd522

File tree

1 file changed

+11
-10
lines changed

1 file changed

+11
-10
lines changed

crates/parser/src/grammar/items/use_item.rs

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ pub(super) fn use_(p: &mut Parser<'_>, m: Marker) {
1111

1212
// test use_tree
1313
// use outer::tree::{inner::tree};
14-
fn use_tree(p: &mut Parser<'_>, top_level: bool) {
14+
fn use_tree(p: &mut Parser<'_>, top_level: bool) -> bool {
1515
let m = p.start();
1616
match p.current() {
1717
// test use_tree_star
@@ -70,24 +70,25 @@ fn use_tree(p: &mut Parser<'_>, top_level: bool) {
7070
// main balanced `{}`
7171
p.err_and_bump(msg);
7272
}
73-
return;
73+
return false;
7474
}
7575
}
7676
m.complete(p, USE_TREE);
77+
true
7778
}
7879

80+
pub(super) const USE_TREE_LIST_RECOVERY_SET: TokenSet =
81+
TokenSet::new(&[T![;], T![,], T![.], T![ident]]);
82+
7983
// test use_tree_list
8084
// use {a, b, c};
8185
pub(crate) fn use_tree_list(p: &mut Parser<'_>) {
8286
assert!(p.at(T!['{']));
8387
let m = p.start();
84-
p.bump(T!['{']);
85-
while !p.at(EOF) && !p.at(T!['}']) {
86-
use_tree(p, false);
87-
if !p.at(T!['}']) {
88-
p.expect(T![,]);
89-
}
90-
}
91-
p.expect(T!['}']);
88+
89+
delimited(p, T!['{'], T!['}'], T![,], USE_TREE_LIST_RECOVERY_SET, |p: &mut Parser<'_>| {
90+
use_tree(p, false) || p.at_ts(USE_TREE_LIST_RECOVERY_SET)
91+
});
92+
9293
m.complete(p, USE_TREE_LIST);
9394
}

0 commit comments

Comments
 (0)