Auto merge of #16349 - Young-Flash:use_error_recovery, r=Veykril

fix: add error recovery for use_tree_list parsing

This PR adds error recovery for USE_TREE_LIST parsing, avoid the wrong USE_TREE_LIST making the rest parsing incorrectly.

before

![before](c6643690-f25c-4ad9-93d9-e661ba5b1dc3)

after

![after](30a58c40-2711-48d2-b2e5-fb208fc8636c)

close https://github.com/rust-lang/rust-analyzer/issues/16227
This commit is contained in:
bors 2024-01-18 09:52:37 +00:00
commit 1ab8c7fd27
5 changed files with 112 additions and 38 deletions

View file

@ -20,32 +20,21 @@ SOURCE_FILE
PATH_SEGMENT
NAME_REF
IDENT "Error"
ERROR
SEMICOLON ";"
WHITESPACE "\n"
ERROR
USE_KW "use"
WHITESPACE " "
USE_TREE
PATH
PATH
PATH_SEGMENT
NAME_REF
IDENT "std"
COLON2 "::"
PATH_SEGMENT
NAME_REF
IDENT "io"
ERROR
SEMICOLON ";"
SEMICOLON ";"
WHITESPACE "\n"
error 22: expected COMMA
error 22: expected one of `*`, `::`, `{`, `self`, `super` or an identifier
error 23: expected COMMA
error 24: expected one of `*`, `::`, `{`, `self`, `super` or an identifier
error 27: expected COMMA
error 35: expected COMMA
error 35: expected one of `*`, `::`, `{`, `self`, `super` or an identifier
error 36: expected COMMA
error 36: expected R_CURLY
error 36: expected SEMICOLON
USE
USE_KW "use"
WHITESPACE " "
USE_TREE
PATH
PATH
PATH_SEGMENT
NAME_REF
IDENT "std"
COLON2 "::"
PATH_SEGMENT
NAME_REF
IDENT "io"
SEMICOLON ";"
WHITESPACE "\n"
error 22: expected R_CURLY

View file

@ -0,0 +1,46 @@
SOURCE_FILE
USE
USE_KW "use"
WHITESPACE " "
USE_TREE
USE_TREE_LIST
L_CURLY "{"
USE_TREE
PATH
PATH_SEGMENT
NAME_REF
IDENT "a"
SEMICOLON ";"
WHITESPACE "\n"
USE
USE_KW "use"
WHITESPACE " "
USE_TREE
PATH
PATH_SEGMENT
NAME_REF
IDENT "b"
SEMICOLON ";"
WHITESPACE "\n"
STRUCT
STRUCT_KW "struct"
WHITESPACE " "
NAME
IDENT "T"
SEMICOLON ";"
WHITESPACE "\n"
FN
FN_KW "fn"
WHITESPACE " "
NAME
IDENT "test"
PARAM_LIST
L_PAREN "("
R_PAREN ")"
WHITESPACE " "
BLOCK_EXPR
STMT_LIST
L_CURLY "{"
R_CURLY "}"
WHITESPACE "\n"
error 6: expected R_CURLY

View file

@ -0,0 +1,4 @@
use {a;
use b;
struct T;
fn test() {}