Optional patterns in fn types

This commit is contained in:
Aleksey Kladov 2018-08-08 18:34:26 +03:00
parent de7b1887ae
commit 8f21afacfc
7 changed files with 151 additions and 11 deletions

View File

@ -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);
}

View File

@ -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)

View File

@ -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);

View File

@ -0,0 +1 @@
type F = Box<Fn(a: i32, &b: &i32, &mut c: &i32, ())>;

View File

@ -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)

View File

@ -0,0 +1 @@
fn foo<F: FnMut(&mut Foo<'a>)>(){}

View 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)