Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/parser/src/grammar/items/use_item.rs')
-rw-r--r--crates/parser/src/grammar/items/use_item.rs28
1 files changed, 18 insertions, 10 deletions
diff --git a/crates/parser/src/grammar/items/use_item.rs b/crates/parser/src/grammar/items/use_item.rs
index 69880b7946..f689c06b31 100644
--- a/crates/parser/src/grammar/items/use_item.rs
+++ b/crates/parser/src/grammar/items/use_item.rs
@@ -11,7 +11,7 @@ pub(super) fn use_(p: &mut Parser<'_>, m: Marker) {
// test use_tree
// use outer::tree::{inner::tree};
-fn use_tree(p: &mut Parser<'_>, top_level: bool) {
+fn use_tree(p: &mut Parser<'_>, top_level: bool) -> bool {
let m = p.start();
match p.current() {
// test use_tree_star
@@ -70,24 +70,32 @@ fn use_tree(p: &mut Parser<'_>, top_level: bool) {
// main balanced `{}`
p.err_and_bump(msg);
}
- return;
+ return false;
}
}
m.complete(p, USE_TREE);
+ true
}
+pub(super) const USE_TREE_LIST_RECOVERY_SET: TokenSet =
+ TokenSet::new(&[T![;], T![,], T![.], T![ident]]).union(ITEM_RECOVERY_SET);
+
+pub(super) const USE_TREE_LIST_FIRST_SET: TokenSet = TokenSet::new(&[T!['{'], T![ident]]);
+
// test use_tree_list
// use {a, b, c};
pub(crate) fn use_tree_list(p: &mut Parser<'_>) {
assert!(p.at(T!['{']));
let m = p.start();
- p.bump(T!['{']);
- while !p.at(EOF) && !p.at(T!['}']) {
- use_tree(p, false);
- if !p.at(T!['}']) {
- p.expect(T![,]);
- }
- }
- p.expect(T!['}']);
+
+ // test_err use_tree_list_err_recovery
+ // use {a;
+ // use b;
+ // struct T;
+ // fn test() {}
+ delimited(p, T!['{'], T!['}'], T![,], USE_TREE_LIST_FIRST_SET, |p: &mut Parser<'_>| {
+ use_tree(p, false) || p.at_ts(USE_TREE_LIST_RECOVERY_SET)
+ });
+
m.complete(p, USE_TREE_LIST);
}