mirror of
https://github.com/rust-lang/rust-analyzer.git
synced 2025-11-03 05:13:35 +00:00
Merge pull request #20417 from npmccallum/syntax
parser: fix parsing of trait bound polarity and for-binders
This commit is contained in:
commit
29cb5d4375
6 changed files with 73 additions and 19 deletions
|
|
@ -182,12 +182,6 @@ fn type_bound(p: &mut Parser<'_>) -> bool {
|
||||||
);
|
);
|
||||||
m.complete(p, USE_BOUND_GENERIC_ARGS);
|
m.complete(p, USE_BOUND_GENERIC_ARGS);
|
||||||
}
|
}
|
||||||
T![?] if p.nth_at(1, T![for]) => {
|
|
||||||
// test question_for_type_trait_bound
|
|
||||||
// fn f<T>() where T: ?for<> Sized {}
|
|
||||||
p.bump_any();
|
|
||||||
types::for_type(p, false)
|
|
||||||
}
|
|
||||||
_ => {
|
_ => {
|
||||||
if path_type_bound(p).is_err() {
|
if path_type_bound(p).is_err() {
|
||||||
m.abandon(p);
|
m.abandon(p);
|
||||||
|
|
@ -219,8 +213,13 @@ fn path_type_bound(p: &mut Parser<'_>) -> Result<(), ()> {
|
||||||
// test async_trait_bound
|
// test async_trait_bound
|
||||||
// fn async_foo(_: impl async Fn(&i32)) {}
|
// fn async_foo(_: impl async Fn(&i32)) {}
|
||||||
p.eat(T![async]);
|
p.eat(T![async]);
|
||||||
|
// test question_for_type_trait_bound
|
||||||
|
// fn f<T>() where T: for<> ?Sized {}
|
||||||
p.eat(T![?]);
|
p.eat(T![?]);
|
||||||
|
|
||||||
|
// test_err invalid_question_for_type_trait_bound
|
||||||
|
// fn f<T>() where T: ?for<> Sized {}
|
||||||
|
|
||||||
if paths::is_use_path_start(p) {
|
if paths::is_use_path_start(p) {
|
||||||
types::path_type_bounds(p, false);
|
types::path_type_bounds(p, false);
|
||||||
// test_err type_bounds_macro_call_recovery
|
// test_err type_bounds_macro_call_recovery
|
||||||
|
|
|
||||||
|
|
@ -796,6 +796,12 @@ mod err {
|
||||||
#[test]
|
#[test]
|
||||||
fn impl_type() { run_and_expect_errors("test_data/parser/inline/err/impl_type.rs"); }
|
fn impl_type() { run_and_expect_errors("test_data/parser/inline/err/impl_type.rs"); }
|
||||||
#[test]
|
#[test]
|
||||||
|
fn invalid_question_for_type_trait_bound() {
|
||||||
|
run_and_expect_errors(
|
||||||
|
"test_data/parser/inline/err/invalid_question_for_type_trait_bound.rs",
|
||||||
|
);
|
||||||
|
}
|
||||||
|
#[test]
|
||||||
fn let_else_right_curly_brace() {
|
fn let_else_right_curly_brace() {
|
||||||
run_and_expect_errors("test_data/parser/inline/err/let_else_right_curly_brace.rs");
|
run_and_expect_errors("test_data/parser/inline/err/let_else_right_curly_brace.rs");
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,49 @@
|
||||||
|
SOURCE_FILE
|
||||||
|
FN
|
||||||
|
FN_KW "fn"
|
||||||
|
WHITESPACE " "
|
||||||
|
NAME
|
||||||
|
IDENT "f"
|
||||||
|
GENERIC_PARAM_LIST
|
||||||
|
L_ANGLE "<"
|
||||||
|
TYPE_PARAM
|
||||||
|
NAME
|
||||||
|
IDENT "T"
|
||||||
|
R_ANGLE ">"
|
||||||
|
PARAM_LIST
|
||||||
|
L_PAREN "("
|
||||||
|
R_PAREN ")"
|
||||||
|
WHITESPACE " "
|
||||||
|
WHERE_CLAUSE
|
||||||
|
WHERE_KW "where"
|
||||||
|
WHITESPACE " "
|
||||||
|
WHERE_PRED
|
||||||
|
PATH_TYPE
|
||||||
|
PATH
|
||||||
|
PATH_SEGMENT
|
||||||
|
NAME_REF
|
||||||
|
IDENT "T"
|
||||||
|
COLON ":"
|
||||||
|
WHITESPACE " "
|
||||||
|
TYPE_BOUND_LIST
|
||||||
|
QUESTION "?"
|
||||||
|
WHERE_PRED
|
||||||
|
FOR_BINDER
|
||||||
|
FOR_KW "for"
|
||||||
|
GENERIC_PARAM_LIST
|
||||||
|
L_ANGLE "<"
|
||||||
|
R_ANGLE ">"
|
||||||
|
WHITESPACE " "
|
||||||
|
PATH_TYPE
|
||||||
|
PATH
|
||||||
|
PATH_SEGMENT
|
||||||
|
NAME_REF
|
||||||
|
IDENT "Sized"
|
||||||
|
WHITESPACE " "
|
||||||
|
BLOCK_EXPR
|
||||||
|
STMT_LIST
|
||||||
|
L_CURLY "{"
|
||||||
|
R_CURLY "}"
|
||||||
|
WHITESPACE "\n"
|
||||||
|
error 20: expected comma
|
||||||
|
error 31: expected colon
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
fn f<T>() where T: ?for<> Sized {}
|
||||||
|
|
@ -27,19 +27,18 @@ SOURCE_FILE
|
||||||
WHITESPACE " "
|
WHITESPACE " "
|
||||||
TYPE_BOUND_LIST
|
TYPE_BOUND_LIST
|
||||||
TYPE_BOUND
|
TYPE_BOUND
|
||||||
|
FOR_BINDER
|
||||||
|
FOR_KW "for"
|
||||||
|
GENERIC_PARAM_LIST
|
||||||
|
L_ANGLE "<"
|
||||||
|
R_ANGLE ">"
|
||||||
|
WHITESPACE " "
|
||||||
QUESTION "?"
|
QUESTION "?"
|
||||||
FOR_TYPE
|
PATH_TYPE
|
||||||
FOR_BINDER
|
PATH
|
||||||
FOR_KW "for"
|
PATH_SEGMENT
|
||||||
GENERIC_PARAM_LIST
|
NAME_REF
|
||||||
L_ANGLE "<"
|
IDENT "Sized"
|
||||||
R_ANGLE ">"
|
|
||||||
WHITESPACE " "
|
|
||||||
PATH_TYPE
|
|
||||||
PATH
|
|
||||||
PATH_SEGMENT
|
|
||||||
NAME_REF
|
|
||||||
IDENT "Sized"
|
|
||||||
WHITESPACE " "
|
WHITESPACE " "
|
||||||
BLOCK_EXPR
|
BLOCK_EXPR
|
||||||
STMT_LIST
|
STMT_LIST
|
||||||
|
|
|
||||||
|
|
@ -1 +1 @@
|
||||||
fn f<T>() where T: ?for<> Sized {}
|
fn f<T>() where T: for<> ?Sized {}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue