about summary refs log tree commit diff
diff options
context:
space:
mode:
authorYoung-Flash <dongyang@apache.org>2024-01-11 19:50:35 +0800
committerYoung-Flash <dongyang@apache.org>2024-01-11 19:50:35 +0800
commite6dd522761ded0e73ff2dfeed2ef598fcb508819 (patch)
treeda380715b6cb6436294c7503c18d6c2d7a109add
parent34df29620aee42179bdfec13cc221460241f27d4 (diff)
downloadrust-e6dd522761ded0e73ff2dfeed2ef598fcb508819.tar.gz
rust-e6dd522761ded0e73ff2dfeed2ef598fcb508819.zip
fix: add err recovery for use_tree_list parsing
-rw-r--r--crates/parser/src/grammar/items/use_item.rs21
1 files changed, 11 insertions, 10 deletions
diff --git a/crates/parser/src/grammar/items/use_item.rs b/crates/parser/src/grammar/items/use_item.rs
index 69880b7946b..e34bf9668c1 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,25 @@ 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]]);
+
 // 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!['}']);
+
+    delimited(p, T!['{'], T!['}'], T![,], USE_TREE_LIST_RECOVERY_SET, |p: &mut Parser<'_>| {
+        use_tree(p, false) || p.at_ts(USE_TREE_LIST_RECOVERY_SET)
+    });
+
     m.complete(p, USE_TREE_LIST);
 }