Merge #11954
11954: Parse `for<'a>` closure syntax r=Veykril a=Veykril Fixes https://github.com/rust-analyzer/rust-analyzer/issues/11716 Co-authored-by: Lukas Wirth <lukastw97@gmail.com>
This commit is contained in:
commit
7720f163ae
@ -71,16 +71,8 @@ pub(super) fn atom_expr(p: &mut Parser, r: Restrictions) -> Option<(CompletedMar
|
|||||||
let done = match p.current() {
|
let done = match p.current() {
|
||||||
T!['('] => tuple_expr(p),
|
T!['('] => tuple_expr(p),
|
||||||
T!['['] => array_expr(p),
|
T!['['] => array_expr(p),
|
||||||
T![|] => closure_expr(p),
|
|
||||||
T![static] | T![async] | T![move] if la == T![|] => closure_expr(p),
|
|
||||||
T![static] | T![async] if la == T![move] && p.nth(2) == T![|] => closure_expr(p),
|
|
||||||
T![static] if la == T![async] && p.nth(2) == T![|] => closure_expr(p),
|
|
||||||
T![static] if la == T![async] && p.nth(2) == T![move] && p.nth(3) == T![|] => {
|
|
||||||
closure_expr(p)
|
|
||||||
}
|
|
||||||
T![if] => if_expr(p),
|
T![if] => if_expr(p),
|
||||||
T![let] => let_expr(p),
|
T![let] => let_expr(p),
|
||||||
|
|
||||||
T![_] => {
|
T![_] => {
|
||||||
// test destructuring_assignment_wildcard_pat
|
// test destructuring_assignment_wildcard_pat
|
||||||
// fn foo() {
|
// fn foo() {
|
||||||
@ -91,12 +83,16 @@ pub(super) fn atom_expr(p: &mut Parser, r: Restrictions) -> Option<(CompletedMar
|
|||||||
p.bump(T![_]);
|
p.bump(T![_]);
|
||||||
m.complete(p, UNDERSCORE_EXPR)
|
m.complete(p, UNDERSCORE_EXPR)
|
||||||
}
|
}
|
||||||
|
|
||||||
T![loop] => loop_expr(p, None),
|
T![loop] => loop_expr(p, None),
|
||||||
T![box] => box_expr(p, None),
|
T![box] => box_expr(p, None),
|
||||||
T![for] => for_expr(p, None),
|
|
||||||
T![while] => while_expr(p, None),
|
T![while] => while_expr(p, None),
|
||||||
T![try] => try_block_expr(p, None),
|
T![try] => try_block_expr(p, None),
|
||||||
|
T![match] => match_expr(p),
|
||||||
|
T![return] => return_expr(p),
|
||||||
|
T![yield] => yield_expr(p),
|
||||||
|
T![continue] => continue_expr(p),
|
||||||
|
T![break] => break_expr(p, r),
|
||||||
|
|
||||||
LIFETIME_IDENT if la == T![:] => {
|
LIFETIME_IDENT if la == T![:] => {
|
||||||
let m = p.start();
|
let m = p.start();
|
||||||
label(p);
|
label(p);
|
||||||
@ -121,30 +117,24 @@ pub(super) fn atom_expr(p: &mut Parser, r: Restrictions) -> Option<(CompletedMar
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
T![async] if la == T!['{'] || (la == T![move] && p.nth(2) == T!['{']) => {
|
// test effect_blocks
|
||||||
|
// fn f() { unsafe { } }
|
||||||
|
// fn f() { const { } }
|
||||||
|
// fn f() { async { } }
|
||||||
|
// fn f() { async move { } }
|
||||||
|
T![const] | T![unsafe] | T![async] if la == T!['{'] => {
|
||||||
|
let m = p.start();
|
||||||
|
p.bump_any();
|
||||||
|
stmt_list(p);
|
||||||
|
m.complete(p, BLOCK_EXPR)
|
||||||
|
}
|
||||||
|
T![async] if la == T![move] && p.nth(2) == T!['{'] => {
|
||||||
let m = p.start();
|
let m = p.start();
|
||||||
p.bump(T![async]);
|
p.bump(T![async]);
|
||||||
p.eat(T![move]);
|
p.eat(T![move]);
|
||||||
stmt_list(p);
|
stmt_list(p);
|
||||||
m.complete(p, BLOCK_EXPR)
|
m.complete(p, BLOCK_EXPR)
|
||||||
}
|
}
|
||||||
T![match] => match_expr(p),
|
|
||||||
// test unsafe_block
|
|
||||||
// fn f() { unsafe { } }
|
|
||||||
T![unsafe] if la == T!['{'] => {
|
|
||||||
let m = p.start();
|
|
||||||
p.bump(T![unsafe]);
|
|
||||||
stmt_list(p);
|
|
||||||
m.complete(p, BLOCK_EXPR)
|
|
||||||
}
|
|
||||||
// test const_block
|
|
||||||
// fn f() { const { } }
|
|
||||||
T![const] if la == T!['{'] => {
|
|
||||||
let m = p.start();
|
|
||||||
p.bump(T![const]);
|
|
||||||
stmt_list(p);
|
|
||||||
m.complete(p, BLOCK_EXPR)
|
|
||||||
}
|
|
||||||
T!['{'] => {
|
T!['{'] => {
|
||||||
// test for_range_from
|
// test for_range_from
|
||||||
// fn foo() {
|
// fn foo() {
|
||||||
@ -156,10 +146,11 @@ pub(super) fn atom_expr(p: &mut Parser, r: Restrictions) -> Option<(CompletedMar
|
|||||||
stmt_list(p);
|
stmt_list(p);
|
||||||
m.complete(p, BLOCK_EXPR)
|
m.complete(p, BLOCK_EXPR)
|
||||||
}
|
}
|
||||||
T![return] => return_expr(p),
|
|
||||||
T![yield] => yield_expr(p),
|
T![static] | T![async] | T![move] | T![|] => closure_expr(p),
|
||||||
T![continue] => continue_expr(p),
|
T![for] if la == T![<] => closure_expr(p),
|
||||||
T![break] => break_expr(p, r),
|
T![for] => for_expr(p, None),
|
||||||
|
|
||||||
_ => {
|
_ => {
|
||||||
p.err_recover("expected expression", EXPR_RECOVERY_SET);
|
p.err_recover("expected expression", EXPR_RECOVERY_SET);
|
||||||
return None;
|
return None;
|
||||||
@ -254,25 +245,30 @@ fn array_expr(p: &mut Parser) -> CompletedMarker {
|
|||||||
// static move || {};
|
// static move || {};
|
||||||
// static async || {};
|
// static async || {};
|
||||||
// static async move || {};
|
// static async move || {};
|
||||||
|
// for<'a> || {};
|
||||||
|
// for<'a> move || {};
|
||||||
// }
|
// }
|
||||||
fn closure_expr(p: &mut Parser) -> CompletedMarker {
|
fn closure_expr(p: &mut Parser) -> CompletedMarker {
|
||||||
assert!(
|
assert!(match p.current() {
|
||||||
p.at(T![|])
|
T![static] | T![async] | T![move] | T![|] => true,
|
||||||
|| (p.at(T![move]) && p.nth(1) == T![|])
|
T![for] => p.nth(1) == T![<],
|
||||||
|| (p.at(T![async]) && p.nth(1) == T![|])
|
_ => false,
|
||||||
|| (p.at(T![async]) && p.nth(1) == T![move] && p.nth(2) == T![|])
|
});
|
||||||
|| (p.at(T![static]) && p.nth(1) == T![|])
|
|
||||||
|| (p.at(T![static]) && p.nth(1) == T![move] && p.nth(2) == T![|])
|
|
||||||
|| (p.at(T![static]) && p.nth(1) == T![async] && p.nth(2) == T![|])
|
|
||||||
|| (p.at(T![static])
|
|
||||||
&& p.nth(1) == T![async]
|
|
||||||
&& p.nth(2) == T![move]
|
|
||||||
&& p.nth(3) == T![|])
|
|
||||||
);
|
|
||||||
let m = p.start();
|
let m = p.start();
|
||||||
|
|
||||||
|
if p.at(T![for]) {
|
||||||
|
types::for_binder(p);
|
||||||
|
}
|
||||||
|
|
||||||
p.eat(T![static]);
|
p.eat(T![static]);
|
||||||
p.eat(T![async]);
|
p.eat(T![async]);
|
||||||
p.eat(T![move]);
|
p.eat(T![move]);
|
||||||
|
|
||||||
|
if !p.at(T![|]) {
|
||||||
|
p.error("expected `|`");
|
||||||
|
return m.complete(p, CLOSURE_EXPR);
|
||||||
|
}
|
||||||
params::param_list_closure(p);
|
params::param_list_closure(p);
|
||||||
if opt_ret_type(p) {
|
if opt_ret_type(p) {
|
||||||
// test lambda_ret_block
|
// test lambda_ret_block
|
||||||
|
@ -182,45 +182,44 @@ SOURCE_FILE
|
|||||||
WHITESPACE " "
|
WHITESPACE " "
|
||||||
TUPLE_EXPR
|
TUPLE_EXPR
|
||||||
L_PAREN "("
|
L_PAREN "("
|
||||||
FOR_EXPR
|
CLOSURE_EXPR
|
||||||
FOR_KW "for"
|
FOR_KW "for"
|
||||||
PATH_PAT
|
GENERIC_PARAM_LIST
|
||||||
PATH
|
L_ANGLE "<"
|
||||||
PATH_SEGMENT
|
LIFETIME_PARAM
|
||||||
L_ANGLE "<"
|
LIFETIME
|
||||||
ERROR
|
LIFETIME_IDENT "'a"
|
||||||
LIFETIME_IDENT "'a"
|
R_ANGLE ">"
|
||||||
R_ANGLE ">"
|
WHITESPACE " "
|
||||||
WHITESPACE " "
|
BIN_EXPR
|
||||||
BIN_EXPR
|
BIN_EXPR
|
||||||
BIN_EXPR
|
BIN_EXPR
|
||||||
BIN_EXPR
|
BIN_EXPR
|
||||||
BIN_EXPR
|
|
||||||
PATH_EXPR
|
|
||||||
PATH
|
|
||||||
PATH_SEGMENT
|
|
||||||
NAME_REF
|
|
||||||
IDENT "Trait"
|
|
||||||
L_ANGLE "<"
|
|
||||||
ERROR
|
|
||||||
LIFETIME_IDENT "'a"
|
|
||||||
R_ANGLE ">"
|
|
||||||
ERROR
|
|
||||||
R_PAREN ")"
|
|
||||||
WHITESPACE " "
|
|
||||||
PLUS "+"
|
|
||||||
WHITESPACE " "
|
|
||||||
PAREN_EXPR
|
|
||||||
L_PAREN "("
|
|
||||||
PATH_EXPR
|
PATH_EXPR
|
||||||
PATH
|
PATH
|
||||||
PATH_SEGMENT
|
PATH_SEGMENT
|
||||||
NAME_REF
|
NAME_REF
|
||||||
IDENT "Copy"
|
IDENT "Trait"
|
||||||
|
L_ANGLE "<"
|
||||||
|
ERROR
|
||||||
|
LIFETIME_IDENT "'a"
|
||||||
|
R_ANGLE ">"
|
||||||
|
ERROR
|
||||||
R_PAREN ")"
|
R_PAREN ")"
|
||||||
R_ANGLE ">"
|
WHITESPACE " "
|
||||||
ERROR
|
PLUS "+"
|
||||||
SEMICOLON ";"
|
WHITESPACE " "
|
||||||
|
PAREN_EXPR
|
||||||
|
L_PAREN "("
|
||||||
|
PATH_EXPR
|
||||||
|
PATH
|
||||||
|
PATH_SEGMENT
|
||||||
|
NAME_REF
|
||||||
|
IDENT "Copy"
|
||||||
|
R_PAREN ")"
|
||||||
|
R_ANGLE ">"
|
||||||
|
ERROR
|
||||||
|
SEMICOLON ";"
|
||||||
WHITESPACE "\n "
|
WHITESPACE "\n "
|
||||||
LET_EXPR
|
LET_EXPR
|
||||||
LET_KW "let"
|
LET_KW "let"
|
||||||
@ -240,49 +239,48 @@ SOURCE_FILE
|
|||||||
L_ANGLE "<"
|
L_ANGLE "<"
|
||||||
TUPLE_EXPR
|
TUPLE_EXPR
|
||||||
L_PAREN "("
|
L_PAREN "("
|
||||||
FOR_EXPR
|
CLOSURE_EXPR
|
||||||
FOR_KW "for"
|
FOR_KW "for"
|
||||||
PATH_PAT
|
GENERIC_PARAM_LIST
|
||||||
PATH
|
L_ANGLE "<"
|
||||||
PATH_SEGMENT
|
LIFETIME_PARAM
|
||||||
L_ANGLE "<"
|
LIFETIME
|
||||||
ERROR
|
LIFETIME_IDENT "'a"
|
||||||
LIFETIME_IDENT "'a"
|
R_ANGLE ">"
|
||||||
R_ANGLE ">"
|
WHITESPACE " "
|
||||||
WHITESPACE " "
|
BIN_EXPR
|
||||||
BIN_EXPR
|
BIN_EXPR
|
||||||
BIN_EXPR
|
BIN_EXPR
|
||||||
BIN_EXPR
|
BIN_EXPR
|
||||||
BIN_EXPR
|
|
||||||
PATH_EXPR
|
|
||||||
PATH
|
|
||||||
PATH_SEGMENT
|
|
||||||
NAME_REF
|
|
||||||
IDENT "Trait"
|
|
||||||
L_ANGLE "<"
|
|
||||||
ERROR
|
|
||||||
LIFETIME_IDENT "'a"
|
|
||||||
R_ANGLE ">"
|
|
||||||
ERROR
|
|
||||||
R_PAREN ")"
|
|
||||||
WHITESPACE " "
|
|
||||||
PLUS "+"
|
|
||||||
WHITESPACE " "
|
|
||||||
PAREN_EXPR
|
|
||||||
L_PAREN "("
|
|
||||||
PATH_EXPR
|
PATH_EXPR
|
||||||
PATH
|
PATH
|
||||||
PATH_SEGMENT
|
PATH_SEGMENT
|
||||||
NAME_REF
|
NAME_REF
|
||||||
IDENT "Copy"
|
IDENT "Trait"
|
||||||
|
L_ANGLE "<"
|
||||||
|
ERROR
|
||||||
|
LIFETIME_IDENT "'a"
|
||||||
|
R_ANGLE ">"
|
||||||
|
ERROR
|
||||||
R_PAREN ")"
|
R_PAREN ")"
|
||||||
WHITESPACE " "
|
WHITESPACE " "
|
||||||
PLUS "+"
|
PLUS "+"
|
||||||
WHITESPACE " "
|
WHITESPACE " "
|
||||||
PAREN_EXPR
|
PAREN_EXPR
|
||||||
L_PAREN "("
|
L_PAREN "("
|
||||||
ERROR
|
PATH_EXPR
|
||||||
QUESTION "?"
|
PATH
|
||||||
|
PATH_SEGMENT
|
||||||
|
NAME_REF
|
||||||
|
IDENT "Copy"
|
||||||
|
R_PAREN ")"
|
||||||
|
WHITESPACE " "
|
||||||
|
PLUS "+"
|
||||||
|
WHITESPACE " "
|
||||||
|
PAREN_EXPR
|
||||||
|
L_PAREN "("
|
||||||
|
ERROR
|
||||||
|
QUESTION "?"
|
||||||
PATH_EXPR
|
PATH_EXPR
|
||||||
PATH
|
PATH
|
||||||
PATH_SEGMENT
|
PATH_SEGMENT
|
||||||
@ -307,23 +305,21 @@ error 141: expected SEMICOLON
|
|||||||
error 146: expected SEMICOLON
|
error 146: expected SEMICOLON
|
||||||
error 146: expected expression
|
error 146: expected expression
|
||||||
error 148: expected expression
|
error 148: expected expression
|
||||||
error 155: expected type
|
error 158: expected `|`
|
||||||
error 158: expected IN_KW
|
error 158: expected COMMA
|
||||||
error 165: expected expression
|
error 165: expected expression
|
||||||
error 168: expected expression
|
error 168: expected expression
|
||||||
error 179: expected expression
|
error 179: expected expression
|
||||||
error 180: expected a block
|
|
||||||
error 180: expected COMMA
|
error 180: expected COMMA
|
||||||
error 190: expected EQ
|
error 190: expected EQ
|
||||||
error 190: expected expression
|
error 190: expected expression
|
||||||
error 191: expected COMMA
|
error 191: expected COMMA
|
||||||
error 201: expected type
|
error 204: expected `|`
|
||||||
error 204: expected IN_KW
|
error 204: expected COMMA
|
||||||
error 211: expected expression
|
error 211: expected expression
|
||||||
error 214: expected expression
|
error 214: expected expression
|
||||||
error 228: expected expression
|
error 228: expected expression
|
||||||
error 229: expected R_PAREN
|
error 229: expected R_PAREN
|
||||||
error 229: expected a block
|
|
||||||
error 229: expected COMMA
|
error 229: expected COMMA
|
||||||
error 236: expected expression
|
error 236: expected expression
|
||||||
error 237: expected COMMA
|
error 237: expected COMMA
|
||||||
|
@ -199,6 +199,48 @@ SOURCE_FILE
|
|||||||
L_CURLY "{"
|
L_CURLY "{"
|
||||||
R_CURLY "}"
|
R_CURLY "}"
|
||||||
SEMICOLON ";"
|
SEMICOLON ";"
|
||||||
|
WHITESPACE "\n "
|
||||||
|
EXPR_STMT
|
||||||
|
CLOSURE_EXPR
|
||||||
|
FOR_KW "for"
|
||||||
|
GENERIC_PARAM_LIST
|
||||||
|
L_ANGLE "<"
|
||||||
|
LIFETIME_PARAM
|
||||||
|
LIFETIME
|
||||||
|
LIFETIME_IDENT "'a"
|
||||||
|
R_ANGLE ">"
|
||||||
|
WHITESPACE " "
|
||||||
|
PARAM_LIST
|
||||||
|
PIPE "|"
|
||||||
|
PIPE "|"
|
||||||
|
WHITESPACE " "
|
||||||
|
BLOCK_EXPR
|
||||||
|
STMT_LIST
|
||||||
|
L_CURLY "{"
|
||||||
|
R_CURLY "}"
|
||||||
|
SEMICOLON ";"
|
||||||
|
WHITESPACE "\n "
|
||||||
|
EXPR_STMT
|
||||||
|
CLOSURE_EXPR
|
||||||
|
FOR_KW "for"
|
||||||
|
GENERIC_PARAM_LIST
|
||||||
|
L_ANGLE "<"
|
||||||
|
LIFETIME_PARAM
|
||||||
|
LIFETIME
|
||||||
|
LIFETIME_IDENT "'a"
|
||||||
|
R_ANGLE ">"
|
||||||
|
WHITESPACE " "
|
||||||
|
MOVE_KW "move"
|
||||||
|
WHITESPACE " "
|
||||||
|
PARAM_LIST
|
||||||
|
PIPE "|"
|
||||||
|
PIPE "|"
|
||||||
|
WHITESPACE " "
|
||||||
|
BLOCK_EXPR
|
||||||
|
STMT_LIST
|
||||||
|
L_CURLY "{"
|
||||||
|
R_CURLY "}"
|
||||||
|
SEMICOLON ";"
|
||||||
WHITESPACE "\n"
|
WHITESPACE "\n"
|
||||||
R_CURLY "}"
|
R_CURLY "}"
|
||||||
WHITESPACE "\n"
|
WHITESPACE "\n"
|
||||||
|
@ -10,4 +10,6 @@ fn foo() {
|
|||||||
static move || {};
|
static move || {};
|
||||||
static async || {};
|
static async || {};
|
||||||
static async move || {};
|
static async move || {};
|
||||||
|
for<'a> || {};
|
||||||
|
for<'a> move || {};
|
||||||
}
|
}
|
||||||
|
@ -1,24 +0,0 @@
|
|||||||
SOURCE_FILE
|
|
||||||
FN
|
|
||||||
FN_KW "fn"
|
|
||||||
WHITESPACE " "
|
|
||||||
NAME
|
|
||||||
IDENT "f"
|
|
||||||
PARAM_LIST
|
|
||||||
L_PAREN "("
|
|
||||||
R_PAREN ")"
|
|
||||||
WHITESPACE " "
|
|
||||||
BLOCK_EXPR
|
|
||||||
STMT_LIST
|
|
||||||
L_CURLY "{"
|
|
||||||
WHITESPACE " "
|
|
||||||
BLOCK_EXPR
|
|
||||||
CONST_KW "const"
|
|
||||||
WHITESPACE " "
|
|
||||||
STMT_LIST
|
|
||||||
L_CURLY "{"
|
|
||||||
WHITESPACE " "
|
|
||||||
R_CURLY "}"
|
|
||||||
WHITESPACE " "
|
|
||||||
R_CURLY "}"
|
|
||||||
WHITESPACE "\n"
|
|
@ -1 +0,0 @@
|
|||||||
fn f() { const { } }
|
|
@ -1,24 +0,0 @@
|
|||||||
SOURCE_FILE
|
|
||||||
FN
|
|
||||||
FN_KW "fn"
|
|
||||||
WHITESPACE " "
|
|
||||||
NAME
|
|
||||||
IDENT "f"
|
|
||||||
PARAM_LIST
|
|
||||||
L_PAREN "("
|
|
||||||
R_PAREN ")"
|
|
||||||
WHITESPACE " "
|
|
||||||
BLOCK_EXPR
|
|
||||||
STMT_LIST
|
|
||||||
L_CURLY "{"
|
|
||||||
WHITESPACE " "
|
|
||||||
BLOCK_EXPR
|
|
||||||
UNSAFE_KW "unsafe"
|
|
||||||
WHITESPACE " "
|
|
||||||
STMT_LIST
|
|
||||||
L_CURLY "{"
|
|
||||||
WHITESPACE " "
|
|
||||||
R_CURLY "}"
|
|
||||||
WHITESPACE " "
|
|
||||||
R_CURLY "}"
|
|
||||||
WHITESPACE "\n"
|
|
@ -1 +0,0 @@
|
|||||||
fn f() { unsafe { } }
|
|
@ -0,0 +1,95 @@
|
|||||||
|
SOURCE_FILE
|
||||||
|
FN
|
||||||
|
FN_KW "fn"
|
||||||
|
WHITESPACE " "
|
||||||
|
NAME
|
||||||
|
IDENT "f"
|
||||||
|
PARAM_LIST
|
||||||
|
L_PAREN "("
|
||||||
|
R_PAREN ")"
|
||||||
|
WHITESPACE " "
|
||||||
|
BLOCK_EXPR
|
||||||
|
STMT_LIST
|
||||||
|
L_CURLY "{"
|
||||||
|
WHITESPACE " "
|
||||||
|
BLOCK_EXPR
|
||||||
|
UNSAFE_KW "unsafe"
|
||||||
|
WHITESPACE " "
|
||||||
|
STMT_LIST
|
||||||
|
L_CURLY "{"
|
||||||
|
WHITESPACE " "
|
||||||
|
R_CURLY "}"
|
||||||
|
WHITESPACE " "
|
||||||
|
R_CURLY "}"
|
||||||
|
WHITESPACE "\n"
|
||||||
|
FN
|
||||||
|
FN_KW "fn"
|
||||||
|
WHITESPACE " "
|
||||||
|
NAME
|
||||||
|
IDENT "f"
|
||||||
|
PARAM_LIST
|
||||||
|
L_PAREN "("
|
||||||
|
R_PAREN ")"
|
||||||
|
WHITESPACE " "
|
||||||
|
BLOCK_EXPR
|
||||||
|
STMT_LIST
|
||||||
|
L_CURLY "{"
|
||||||
|
WHITESPACE " "
|
||||||
|
BLOCK_EXPR
|
||||||
|
CONST_KW "const"
|
||||||
|
WHITESPACE " "
|
||||||
|
STMT_LIST
|
||||||
|
L_CURLY "{"
|
||||||
|
WHITESPACE " "
|
||||||
|
R_CURLY "}"
|
||||||
|
WHITESPACE " "
|
||||||
|
R_CURLY "}"
|
||||||
|
WHITESPACE "\n"
|
||||||
|
FN
|
||||||
|
FN_KW "fn"
|
||||||
|
WHITESPACE " "
|
||||||
|
NAME
|
||||||
|
IDENT "f"
|
||||||
|
PARAM_LIST
|
||||||
|
L_PAREN "("
|
||||||
|
R_PAREN ")"
|
||||||
|
WHITESPACE " "
|
||||||
|
BLOCK_EXPR
|
||||||
|
STMT_LIST
|
||||||
|
L_CURLY "{"
|
||||||
|
WHITESPACE " "
|
||||||
|
BLOCK_EXPR
|
||||||
|
ASYNC_KW "async"
|
||||||
|
WHITESPACE " "
|
||||||
|
STMT_LIST
|
||||||
|
L_CURLY "{"
|
||||||
|
WHITESPACE " "
|
||||||
|
R_CURLY "}"
|
||||||
|
WHITESPACE " "
|
||||||
|
R_CURLY "}"
|
||||||
|
WHITESPACE "\n"
|
||||||
|
FN
|
||||||
|
FN_KW "fn"
|
||||||
|
WHITESPACE " "
|
||||||
|
NAME
|
||||||
|
IDENT "f"
|
||||||
|
PARAM_LIST
|
||||||
|
L_PAREN "("
|
||||||
|
R_PAREN ")"
|
||||||
|
WHITESPACE " "
|
||||||
|
BLOCK_EXPR
|
||||||
|
STMT_LIST
|
||||||
|
L_CURLY "{"
|
||||||
|
WHITESPACE " "
|
||||||
|
BLOCK_EXPR
|
||||||
|
ASYNC_KW "async"
|
||||||
|
WHITESPACE " "
|
||||||
|
MOVE_KW "move"
|
||||||
|
WHITESPACE " "
|
||||||
|
STMT_LIST
|
||||||
|
L_CURLY "{"
|
||||||
|
WHITESPACE " "
|
||||||
|
R_CURLY "}"
|
||||||
|
WHITESPACE " "
|
||||||
|
R_CURLY "}"
|
||||||
|
WHITESPACE "\n"
|
@ -0,0 +1,4 @@
|
|||||||
|
fn f() { unsafe { } }
|
||||||
|
fn f() { const { } }
|
||||||
|
fn f() { async { } }
|
||||||
|
fn f() { async move { } }
|
@ -449,7 +449,7 @@ FieldExpr =
|
|||||||
Attr* Expr '.' NameRef
|
Attr* Expr '.' NameRef
|
||||||
|
|
||||||
ClosureExpr =
|
ClosureExpr =
|
||||||
Attr* 'static'? 'async'? 'move'? ParamList RetType?
|
Attr* ('for' GenericParamList)? 'static'? 'async'? 'move'? ParamList RetType?
|
||||||
body:Expr
|
body:Expr
|
||||||
|
|
||||||
IfExpr =
|
IfExpr =
|
||||||
|
@ -837,6 +837,8 @@ pub struct ClosureExpr {
|
|||||||
}
|
}
|
||||||
impl ast::HasAttrs for ClosureExpr {}
|
impl ast::HasAttrs for ClosureExpr {}
|
||||||
impl ClosureExpr {
|
impl ClosureExpr {
|
||||||
|
pub fn for_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![for]) }
|
||||||
|
pub fn generic_param_list(&self) -> Option<GenericParamList> { support::child(&self.syntax) }
|
||||||
pub fn static_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![static]) }
|
pub fn static_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![static]) }
|
||||||
pub fn async_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![async]) }
|
pub fn async_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![async]) }
|
||||||
pub fn move_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![move]) }
|
pub fn move_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![move]) }
|
||||||
|
Loading…
x
Reference in New Issue
Block a user