1
1
//! FIXME: write short doc here
2
2
3
+ // general TODO: `cargo xtask codegen && cargo test`
4
+
3
5
use super :: * ;
4
6
5
7
// test param_list
6
8
// fn a() {}
7
9
// fn b(x: i32) {}
8
10
// fn c(x: i32, ) {}
9
11
// fn d(x: i32, y: ()) {}
10
- pub ( super ) fn param_list ( p : & mut Parser ) {
11
- list_ ( p, Flavor :: Normal )
12
+ pub ( super ) fn param_list_fn ( p : & mut Parser ) {
13
+ list_ ( p, Flavor :: Function )
12
14
}
13
15
14
16
// test param_list_opt_patterns
15
17
// fn foo<F: FnMut(&mut Foo<'a>)>(){}
16
- pub ( super ) fn param_list_opt_patterns ( p : & mut Parser ) {
17
- list_ ( p, Flavor :: OptionalPattern )
18
+ pub ( super ) fn param_list_impl_fn ( p : & mut Parser ) {
19
+ list_ ( p, Flavor :: ImplFn )
18
20
}
19
21
20
- pub ( super ) fn param_list_opt_types ( p : & mut Parser ) {
21
- list_ ( p, Flavor :: OptionalType )
22
+ pub ( super ) fn param_list_fn_ptr ( p : & mut Parser ) {
23
+ list_ ( p, Flavor :: FnPointer )
22
24
}
23
25
24
- #[ derive( Clone , Copy , Eq , PartialEq ) ]
25
- enum Flavor {
26
- OptionalType ,
27
- OptionalPattern ,
28
- Normal ,
26
+ pub ( super ) fn param_list_closure ( p : & mut Parser ) {
27
+ list_ ( p, Flavor :: Closure )
29
28
}
30
29
31
- impl Flavor {
32
- fn type_required ( self ) -> bool {
33
- match self {
34
- Flavor :: OptionalType => false ,
35
- _ => true ,
36
- }
37
- }
30
+ #[ derive( Debug , Clone , Copy ) ]
31
+ enum Flavor {
32
+ Function , // Includes trait fn params; omitted param idents are not supported
33
+ ImplFn ,
34
+ FnPointer ,
35
+ Closure
38
36
}
39
37
40
38
fn list_ ( p : & mut Parser , flavor : Flavor ) {
41
- let ( bra, ket) = if flavor. type_required ( ) { ( T ! [ '(' ] , T ! [ ')' ] ) } else { ( T ! [ |] , T ! [ |] ) } ;
42
- assert ! ( p. at( bra) ) ;
39
+ use Flavor :: * ;
40
+
41
+ let ( bra, ket) = match flavor {
42
+ Closure => ( T ! [ |] , T ! [ |] ) ,
43
+ Function | ImplFn | FnPointer => ( T ! [ '(' ] , T ! [ ')' ] )
44
+ } ;
45
+
43
46
let m = p. start ( ) ;
44
47
p. bump ( bra) ;
45
- if flavor. type_required ( ) {
48
+
49
+ if let Function = flavor {
46
50
// test self_param_outer_attr
47
51
// fn f(#[must_use] self) {}
48
52
attributes:: outer_attributes ( p) ;
49
53
opt_self_param ( p) ;
50
54
}
55
+
51
56
while !p. at ( EOF ) && !p. at ( ket) {
52
57
// test param_outer_arg
53
58
// fn f(#[attr1] pat: Type) {}
54
59
attributes:: outer_attributes ( p) ;
55
60
56
- if flavor. type_required ( ) && p. at ( T ! [ ...] ) {
57
- break ;
61
+ if let Function | FnPointer = flavor {
62
+ if p. at ( T ! [ ...] ) {
63
+ break ;
64
+ }
58
65
}
59
66
60
67
if !p. at_ts ( VALUE_PARAMETER_FIRST ) {
@@ -68,7 +75,7 @@ fn list_(p: &mut Parser, flavor: Flavor) {
68
75
}
69
76
// test param_list_vararg
70
77
// extern "C" { fn printf(format: *const i8, ...) -> i32; }
71
- if flavor. type_required ( ) {
78
+ if let Function | FnPointer = flavor {
72
79
p. eat ( T ! [ ...] ) ;
73
80
}
74
81
p. expect ( ket) ;
@@ -77,39 +84,31 @@ fn list_(p: &mut Parser, flavor: Flavor) {
77
84
78
85
const VALUE_PARAMETER_FIRST : TokenSet = patterns:: PATTERN_FIRST . union ( types:: TYPE_FIRST ) ;
79
86
87
+ // TODO tests
80
88
fn value_parameter ( p : & mut Parser , flavor : Flavor ) {
81
89
let m = p. start ( ) ;
82
90
match flavor {
83
- Flavor :: OptionalType | Flavor :: Normal => {
91
+ Flavor :: Function => {
84
92
patterns:: pattern ( p) ;
85
- if p. at ( T ! [ : ] ) && !p. at ( T ! [ :: ] ) || flavor. type_required ( ) {
86
- types:: ascription ( p)
87
- }
93
+ types:: ascription ( p) ;
94
+ }
95
+ Flavor :: ImplFn => {
96
+ types:: type_ ( p) ;
88
97
}
89
- // test value_parameters_no_patterns
90
- // type F = Box<Fn(a: i32, &b: &i32, &mut c: &i32, ())>;
91
- Flavor :: OptionalPattern => {
92
- let la0 = p. current ( ) ;
93
- let la1 = p. nth ( 1 ) ;
94
- let la2 = p. nth ( 2 ) ;
95
- let la3 = p. nth ( 3 ) ;
96
-
97
- // test trait_fn_placeholder_parameter
98
- // trait Foo {
99
- // fn bar(_: u64, mut x: i32);
100
- // }
101
- if ( la0 == IDENT || la0 == T ! [ _] ) && la1 == T ! [ : ] && !p. nth_at ( 1 , T ! [ :: ] )
102
- || la0 == T ! [ mut ] && la1 == IDENT && la2 == T ! [ : ]
103
- || la0 == T ! [ & ]
104
- && ( la1 == IDENT && la2 == T ! [ : ] && !p. nth_at ( 2 , T ! [ :: ] )
105
- || la1 == T ! [ mut ] && la2 == IDENT && la3 == T ! [ : ] && !p. nth_at ( 3 , T ! [ :: ] ) )
106
- {
98
+ Flavor :: FnPointer => {
99
+ if p. at ( IDENT ) {
107
100
patterns:: pattern ( p) ;
108
101
types:: ascription ( p) ;
109
102
} else {
110
103
types:: type_ ( p) ;
111
104
}
112
105
}
106
+ Flavor :: Closure => {
107
+ patterns:: pattern ( p) ;
108
+ if p. at ( T ! [ : ] ) && !p. at ( T ! [ :: ] ) {
109
+ types:: ascription ( p) ;
110
+ }
111
+ }
113
112
}
114
113
m. complete ( p, PARAM ) ;
115
114
}
0 commit comments