mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-25 16:24:46 +00:00
Optional patterns in fn types
This commit is contained in:
parent
de7b1887ae
commit
8f21afacfc
@ -33,12 +33,6 @@ impl Flavor {
|
||||
_ => true,
|
||||
}
|
||||
}
|
||||
fn pattern_required(self) -> bool {
|
||||
match self {
|
||||
Flavor::OptionalPattern => false,
|
||||
_ => true,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn list_(p: &mut Parser, flavor: Flavor) {
|
||||
@ -65,9 +59,29 @@ fn list_(p: &mut Parser, flavor: Flavor) {
|
||||
|
||||
fn value_parameter(p: &mut Parser, flavor: Flavor) {
|
||||
let m = p.start();
|
||||
patterns::pattern(p);
|
||||
if p.at(COLON) || flavor.type_required() {
|
||||
types::ascription(p)
|
||||
match flavor {
|
||||
Flavor::OptionalType | Flavor::Normal => {
|
||||
patterns::pattern(p);
|
||||
if p.at(COLON) || flavor.type_required() {
|
||||
types::ascription(p)
|
||||
}
|
||||
},
|
||||
// test value_parameters_no_patterns
|
||||
// type F = Box<Fn(a: i32, &b: &i32, &mut c: &i32, ())>;
|
||||
Flavor::OptionalPattern => {
|
||||
let la0 = p.current();
|
||||
let la1 = p.nth(1);
|
||||
let la2 = p.nth(2);
|
||||
let la3 = p.nth(3);
|
||||
if la0 == IDENT && la1 == COLON
|
||||
|| la0 == AMP && la1 == IDENT && la2 == COLON
|
||||
|| la0 == AMP && la1 == MUT_KW && la2 == IDENT && la3 == COLON {
|
||||
patterns::pattern(p);
|
||||
types::ascription(p);
|
||||
} else {
|
||||
types::type_(p);
|
||||
}
|
||||
},
|
||||
}
|
||||
m.complete(p, PARAM);
|
||||
}
|
||||
|
@ -75,7 +75,7 @@ fn path_generic_args(p: &mut Parser, mode: Mode) {
|
||||
// test path_fn_trait_args
|
||||
// type F = Box<Fn(x: i32) -> ()>;
|
||||
if p.at(L_PAREN) {
|
||||
params::param_list(p);
|
||||
params::param_list_opt_patterns(p);
|
||||
fn_ret_type(p);
|
||||
} else {
|
||||
type_args::type_arg_list(p, false)
|
||||
|
@ -166,7 +166,7 @@ fn fn_pointer_type(p: &mut Parser) {
|
||||
return;
|
||||
}
|
||||
|
||||
params::param_list(p);
|
||||
params::param_list_opt_patterns(p);
|
||||
// test fn_pointer_type_with_ret
|
||||
// type F = fn() -> ();
|
||||
fn_ret_type(p);
|
||||
|
@ -0,0 +1 @@
|
||||
type F = Box<Fn(a: i32, &b: &i32, &mut c: &i32, ())>;
|
@ -0,0 +1,81 @@
|
||||
FILE@[0; 54)
|
||||
TYPE_ITEM@[0; 53)
|
||||
TYPE_KW@[0; 4)
|
||||
WHITESPACE@[4; 5)
|
||||
NAME@[5; 6)
|
||||
IDENT@[5; 6) "F"
|
||||
WHITESPACE@[6; 7)
|
||||
EQ@[7; 8)
|
||||
WHITESPACE@[8; 9)
|
||||
PATH_TYPE@[9; 52)
|
||||
PATH@[9; 52)
|
||||
PATH_SEGMENT@[9; 52)
|
||||
NAME_REF@[9; 12)
|
||||
IDENT@[9; 12) "Box"
|
||||
TYPE_ARG_LIST@[12; 52)
|
||||
L_ANGLE@[12; 13)
|
||||
TYPE_ARG@[13; 51)
|
||||
PATH_TYPE@[13; 51)
|
||||
PATH@[13; 51)
|
||||
PATH_SEGMENT@[13; 51)
|
||||
NAME_REF@[13; 15)
|
||||
IDENT@[13; 15) "Fn"
|
||||
PARAM_LIST@[15; 51)
|
||||
L_PAREN@[15; 16)
|
||||
PARAM@[16; 22)
|
||||
BIND_PAT@[16; 17)
|
||||
NAME@[16; 17)
|
||||
IDENT@[16; 17) "a"
|
||||
COLON@[17; 18)
|
||||
WHITESPACE@[18; 19)
|
||||
PATH_TYPE@[19; 22)
|
||||
PATH@[19; 22)
|
||||
PATH_SEGMENT@[19; 22)
|
||||
NAME_REF@[19; 22)
|
||||
IDENT@[19; 22) "i32"
|
||||
COMMA@[22; 23)
|
||||
WHITESPACE@[23; 24)
|
||||
PARAM@[24; 32)
|
||||
REF_PAT@[24; 26)
|
||||
AMP@[24; 25)
|
||||
BIND_PAT@[25; 26)
|
||||
NAME@[25; 26)
|
||||
IDENT@[25; 26) "b"
|
||||
COLON@[26; 27)
|
||||
WHITESPACE@[27; 28)
|
||||
REFERENCE_TYPE@[28; 32)
|
||||
AMP@[28; 29)
|
||||
PATH_TYPE@[29; 32)
|
||||
PATH@[29; 32)
|
||||
PATH_SEGMENT@[29; 32)
|
||||
NAME_REF@[29; 32)
|
||||
IDENT@[29; 32) "i32"
|
||||
COMMA@[32; 33)
|
||||
WHITESPACE@[33; 34)
|
||||
PARAM@[34; 46)
|
||||
REF_PAT@[34; 40)
|
||||
AMP@[34; 35)
|
||||
MUT_KW@[35; 38)
|
||||
WHITESPACE@[38; 39)
|
||||
BIND_PAT@[39; 40)
|
||||
NAME@[39; 40)
|
||||
IDENT@[39; 40) "c"
|
||||
COLON@[40; 41)
|
||||
WHITESPACE@[41; 42)
|
||||
REFERENCE_TYPE@[42; 46)
|
||||
AMP@[42; 43)
|
||||
PATH_TYPE@[43; 46)
|
||||
PATH@[43; 46)
|
||||
PATH_SEGMENT@[43; 46)
|
||||
NAME_REF@[43; 46)
|
||||
IDENT@[43; 46) "i32"
|
||||
COMMA@[46; 47)
|
||||
WHITESPACE@[47; 48)
|
||||
PARAM@[48; 50)
|
||||
TUPLE_TYPE@[48; 50)
|
||||
L_PAREN@[48; 49)
|
||||
R_PAREN@[49; 50)
|
||||
R_PAREN@[50; 51)
|
||||
R_ANGLE@[51; 52)
|
||||
SEMI@[52; 53)
|
||||
WHITESPACE@[53; 54)
|
1
tests/data/parser/inline/0097_param_list_opt_patterns.rs
Normal file
1
tests/data/parser/inline/0097_param_list_opt_patterns.rs
Normal file
@ -0,0 +1 @@
|
||||
fn foo<F: FnMut(&mut Foo<'a>)>(){}
|
43
tests/data/parser/inline/0097_param_list_opt_patterns.txt
Normal file
43
tests/data/parser/inline/0097_param_list_opt_patterns.txt
Normal file
@ -0,0 +1,43 @@
|
||||
FILE@[0; 35)
|
||||
FN_ITEM@[0; 34)
|
||||
FN_KW@[0; 2)
|
||||
WHITESPACE@[2; 3)
|
||||
NAME@[3; 6)
|
||||
IDENT@[3; 6) "foo"
|
||||
TYPE_PARAM_LIST@[6; 30)
|
||||
L_ANGLE@[6; 7)
|
||||
TYPE_PARAM@[7; 29)
|
||||
NAME@[7; 8)
|
||||
IDENT@[7; 8) "F"
|
||||
COLON@[8; 9)
|
||||
WHITESPACE@[9; 10)
|
||||
PATH@[10; 29)
|
||||
PATH_SEGMENT@[10; 29)
|
||||
NAME_REF@[10; 15)
|
||||
IDENT@[10; 15) "FnMut"
|
||||
PARAM_LIST@[15; 29)
|
||||
L_PAREN@[15; 16)
|
||||
PARAM@[16; 28)
|
||||
REFERENCE_TYPE@[16; 28)
|
||||
AMP@[16; 17)
|
||||
MUT_KW@[17; 20)
|
||||
WHITESPACE@[20; 21)
|
||||
PATH_TYPE@[21; 28)
|
||||
PATH@[21; 28)
|
||||
PATH_SEGMENT@[21; 28)
|
||||
NAME_REF@[21; 24)
|
||||
IDENT@[21; 24) "Foo"
|
||||
TYPE_ARG_LIST@[24; 28)
|
||||
L_ANGLE@[24; 25)
|
||||
LIFETIME_ARG@[25; 27)
|
||||
LIFETIME@[25; 27) "'a"
|
||||
R_ANGLE@[27; 28)
|
||||
R_PAREN@[28; 29)
|
||||
R_ANGLE@[29; 30)
|
||||
PARAM_LIST@[30; 32)
|
||||
L_PAREN@[30; 31)
|
||||
R_PAREN@[31; 32)
|
||||
BLOCK_EXPR@[32; 34)
|
||||
L_CURLY@[32; 33)
|
||||
R_CURLY@[33; 34)
|
||||
WHITESPACE@[34; 35)
|
Loading…
Reference in New Issue
Block a user