mirror of
https://github.com/rust-lang/rust-analyzer.git
synced 2025-11-01 20:31:59 +00:00
Fix Return Type Syntax to include .. (i.e. method(..) and not method()) as specified in the RFC
This commit is contained in:
parent
7106cd3be5
commit
21e6058ab7
12 changed files with 183 additions and 16 deletions
|
|
@ -102,13 +102,18 @@ fn generic_arg(p: &mut Parser<'_>) -> bool {
|
|||
IDENT if p.nth_at(1, T!['(']) => {
|
||||
let m = p.start();
|
||||
name_ref(p);
|
||||
params::param_list_fn_trait(p);
|
||||
if p.at(T![:]) && !p.at(T![::]) {
|
||||
// test associated_return_type_bounds
|
||||
// fn foo<T: Foo<foo(): Send, bar(i32): Send, baz(i32, i32): Send>>() {}
|
||||
if p.nth_at(1, T![..]) {
|
||||
let rtn = p.start();
|
||||
p.bump(T!['(']);
|
||||
p.bump(T![..]);
|
||||
p.expect(T![')']);
|
||||
rtn.complete(p, RETURN_TYPE_SYNTAX);
|
||||
// test return_type_syntax_assoc_type_bound
|
||||
// fn foo<T: Trait<method(..): Send>>() {}
|
||||
generic_params::bounds(p);
|
||||
m.complete(p, ASSOC_TYPE_ARG);
|
||||
} else {
|
||||
params::param_list_fn_trait(p);
|
||||
// test bare_dyn_types_with_paren_as_generic_args
|
||||
// type A = S<Fn(i32)>;
|
||||
// type A = S<Fn(i32) + Send>;
|
||||
|
|
|
|||
|
|
@ -119,8 +119,7 @@ fn lifetime_bounds(p: &mut Parser<'_>) {
|
|||
// test type_param_bounds
|
||||
// struct S<T: 'a + ?Sized + (Copy) + ~const Drop>;
|
||||
pub(super) fn bounds(p: &mut Parser<'_>) {
|
||||
assert!(p.at(T![:]));
|
||||
p.bump(T![:]);
|
||||
p.expect(T![:]);
|
||||
bounds_without_colon(p);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -140,11 +140,24 @@ fn opt_path_type_args(p: &mut Parser<'_>, mode: Mode) {
|
|||
if p.at(T![::]) && p.nth_at(2, T!['(']) {
|
||||
p.bump(T![::]);
|
||||
}
|
||||
// test path_fn_trait_args
|
||||
// type F = Box<Fn(i32) -> ()>;
|
||||
if p.at(T!['(']) {
|
||||
params::param_list_fn_trait(p);
|
||||
opt_ret_type(p);
|
||||
if p.nth_at(1, T![..]) {
|
||||
// test return_type_syntax_in_path
|
||||
// fn foo<T>()
|
||||
// where
|
||||
// T::method(..): Send,
|
||||
// {}
|
||||
let rtn = p.start();
|
||||
p.bump(T!['(']);
|
||||
p.bump(T![..]);
|
||||
p.expect(T![')']);
|
||||
rtn.complete(p, RETURN_TYPE_SYNTAX);
|
||||
} else {
|
||||
// test path_fn_trait_args
|
||||
// type F = Box<Fn(i32) -> ()>;
|
||||
params::param_list_fn_trait(p);
|
||||
opt_ret_type(p);
|
||||
}
|
||||
} else {
|
||||
generic_args::opt_generic_arg_list(p, false);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -253,6 +253,7 @@ pub enum SyntaxKind {
|
|||
RENAME,
|
||||
REST_PAT,
|
||||
RETURN_EXPR,
|
||||
RETURN_TYPE_SYNTAX,
|
||||
RET_TYPE,
|
||||
SELF_PARAM,
|
||||
SLICE_PAT,
|
||||
|
|
|
|||
|
|
@ -37,10 +37,6 @@ mod ok {
|
|||
#[test]
|
||||
fn assoc_type_eq() { run_and_expect_no_errors("test_data/parser/inline/ok/assoc_type_eq.rs"); }
|
||||
#[test]
|
||||
fn associated_return_type_bounds() {
|
||||
run_and_expect_no_errors("test_data/parser/inline/ok/associated_return_type_bounds.rs");
|
||||
}
|
||||
#[test]
|
||||
fn associated_type_bounds() {
|
||||
run_and_expect_no_errors("test_data/parser/inline/ok/associated_type_bounds.rs");
|
||||
}
|
||||
|
|
@ -519,6 +515,16 @@ mod ok {
|
|||
#[test]
|
||||
fn return_expr() { run_and_expect_no_errors("test_data/parser/inline/ok/return_expr.rs"); }
|
||||
#[test]
|
||||
fn return_type_syntax_assoc_type_bound() {
|
||||
run_and_expect_no_errors(
|
||||
"test_data/parser/inline/ok/return_type_syntax_assoc_type_bound.rs",
|
||||
);
|
||||
}
|
||||
#[test]
|
||||
fn return_type_syntax_in_path() {
|
||||
run_and_expect_no_errors("test_data/parser/inline/ok/return_type_syntax_in_path.rs");
|
||||
}
|
||||
#[test]
|
||||
fn self_param() { run_and_expect_no_errors("test_data/parser/inline/ok/self_param.rs"); }
|
||||
#[test]
|
||||
fn self_param_outer_attr() {
|
||||
|
|
|
|||
|
|
@ -1 +0,0 @@
|
|||
fn foo<T: Foo<foo(): Send, bar(i32): Send, baz(i32, i32): Send>>() {}
|
||||
|
|
@ -0,0 +1,49 @@
|
|||
SOURCE_FILE
|
||||
FN
|
||||
FN_KW "fn"
|
||||
WHITESPACE " "
|
||||
NAME
|
||||
IDENT "foo"
|
||||
GENERIC_PARAM_LIST
|
||||
L_ANGLE "<"
|
||||
TYPE_PARAM
|
||||
NAME
|
||||
IDENT "T"
|
||||
COLON ":"
|
||||
WHITESPACE " "
|
||||
TYPE_BOUND_LIST
|
||||
TYPE_BOUND
|
||||
PATH_TYPE
|
||||
PATH
|
||||
PATH_SEGMENT
|
||||
NAME_REF
|
||||
IDENT "Trait"
|
||||
GENERIC_ARG_LIST
|
||||
L_ANGLE "<"
|
||||
ASSOC_TYPE_ARG
|
||||
NAME_REF
|
||||
IDENT "method"
|
||||
RETURN_TYPE_SYNTAX
|
||||
L_PAREN "("
|
||||
DOT2 ".."
|
||||
R_PAREN ")"
|
||||
COLON ":"
|
||||
WHITESPACE " "
|
||||
TYPE_BOUND_LIST
|
||||
TYPE_BOUND
|
||||
PATH_TYPE
|
||||
PATH
|
||||
PATH_SEGMENT
|
||||
NAME_REF
|
||||
IDENT "Send"
|
||||
R_ANGLE ">"
|
||||
R_ANGLE ">"
|
||||
PARAM_LIST
|
||||
L_PAREN "("
|
||||
R_PAREN ")"
|
||||
WHITESPACE " "
|
||||
BLOCK_EXPR
|
||||
STMT_LIST
|
||||
L_CURLY "{"
|
||||
R_CURLY "}"
|
||||
WHITESPACE "\n"
|
||||
|
|
@ -0,0 +1 @@
|
|||
fn foo<T: Trait<method(..): Send>>() {}
|
||||
|
|
@ -0,0 +1,50 @@
|
|||
SOURCE_FILE
|
||||
FN
|
||||
FN_KW "fn"
|
||||
WHITESPACE " "
|
||||
NAME
|
||||
IDENT "foo"
|
||||
GENERIC_PARAM_LIST
|
||||
L_ANGLE "<"
|
||||
TYPE_PARAM
|
||||
NAME
|
||||
IDENT "T"
|
||||
R_ANGLE ">"
|
||||
PARAM_LIST
|
||||
L_PAREN "("
|
||||
R_PAREN ")"
|
||||
WHITESPACE "\n"
|
||||
WHERE_CLAUSE
|
||||
WHERE_KW "where"
|
||||
WHITESPACE "\n "
|
||||
WHERE_PRED
|
||||
PATH_TYPE
|
||||
PATH
|
||||
PATH
|
||||
PATH_SEGMENT
|
||||
NAME_REF
|
||||
IDENT "T"
|
||||
COLON2 "::"
|
||||
PATH_SEGMENT
|
||||
NAME_REF
|
||||
IDENT "method"
|
||||
RETURN_TYPE_SYNTAX
|
||||
L_PAREN "("
|
||||
DOT2 ".."
|
||||
R_PAREN ")"
|
||||
COLON ":"
|
||||
WHITESPACE " "
|
||||
TYPE_BOUND_LIST
|
||||
TYPE_BOUND
|
||||
PATH_TYPE
|
||||
PATH
|
||||
PATH_SEGMENT
|
||||
NAME_REF
|
||||
IDENT "Send"
|
||||
COMMA ","
|
||||
WHITESPACE "\n"
|
||||
BLOCK_EXPR
|
||||
STMT_LIST
|
||||
L_CURLY "{"
|
||||
R_CURLY "}"
|
||||
WHITESPACE "\n"
|
||||
|
|
@ -0,0 +1,4 @@
|
|||
fn foo<T>()
|
||||
where
|
||||
T::method(..): Send,
|
||||
{}
|
||||
Loading…
Add table
Add a link
Reference in a new issue