diff options
-rw-r--r-- | crates/ra_parser/src/grammar/items.rs | 2 | ||||
-rw-r--r-- | crates/ra_parser/src/grammar/params.rs | 35 | ||||
-rw-r--r-- | crates/ra_parser/src/grammar/paths.rs | 2 |
3 files changed, 18 insertions, 21 deletions
diff --git a/crates/ra_parser/src/grammar/items.rs b/crates/ra_parser/src/grammar/items.rs index b20d224e8..7263c4d69 100644 --- a/crates/ra_parser/src/grammar/items.rs +++ b/crates/ra_parser/src/grammar/items.rs | |||
@@ -311,7 +311,7 @@ fn fn_def(p: &mut Parser) { | |||
311 | type_params::opt_type_param_list(p); | 311 | type_params::opt_type_param_list(p); |
312 | 312 | ||
313 | if p.at(T!['(']) { | 313 | if p.at(T!['(']) { |
314 | params::param_list_fn(p); | 314 | params::param_list_fn_def(p); |
315 | } else { | 315 | } else { |
316 | p.error("expected function arguments"); | 316 | p.error("expected function arguments"); |
317 | } | 317 | } |
diff --git a/crates/ra_parser/src/grammar/params.rs b/crates/ra_parser/src/grammar/params.rs index d9fbc7c94..94edc7f35 100644 --- a/crates/ra_parser/src/grammar/params.rs +++ b/crates/ra_parser/src/grammar/params.rs | |||
@@ -7,14 +7,14 @@ use super::*; | |||
7 | // fn b(x: i32) {} | 7 | // fn b(x: i32) {} |
8 | // fn c(x: i32, ) {} | 8 | // fn c(x: i32, ) {} |
9 | // fn d(x: i32, y: ()) {} | 9 | // fn d(x: i32, y: ()) {} |
10 | pub(super) fn param_list_fn(p: &mut Parser) { | 10 | pub(super) fn param_list_fn_def(p: &mut Parser) { |
11 | list_(p, Flavor::Function) | 11 | list_(p, Flavor::FnDef) |
12 | } | 12 | } |
13 | 13 | ||
14 | // test param_list_opt_patterns | 14 | // test param_list_opt_patterns |
15 | // fn foo<F: FnMut(&mut Foo<'a>)>(){} | 15 | // fn foo<F: FnMut(&mut Foo<'a>)>(){} |
16 | pub(super) fn param_list_impl_fn(p: &mut Parser) { | 16 | pub(super) fn param_list_fn_trait(p: &mut Parser) { |
17 | list_(p, Flavor::ImplFn) | 17 | list_(p, Flavor::FnTrait) |
18 | } | 18 | } |
19 | 19 | ||
20 | pub(super) fn param_list_fn_ptr(p: &mut Parser) { | 20 | pub(super) fn param_list_fn_ptr(p: &mut Parser) { |
@@ -27,8 +27,8 @@ pub(super) fn param_list_closure(p: &mut Parser) { | |||
27 | 27 | ||
28 | #[derive(Debug, Clone, Copy)] | 28 | #[derive(Debug, Clone, Copy)] |
29 | enum Flavor { | 29 | enum Flavor { |
30 | Function, // Includes trait fn params; omitted param idents are not supported | 30 | FnDef, // Includes trait fn params; omitted param idents are not supported |
31 | ImplFn, | 31 | FnTrait, // Params for `Fn(...)`/`FnMut(...)`/`FnOnce(...)` annotations |
32 | FnPointer, | 32 | FnPointer, |
33 | Closure, | 33 | Closure, |
34 | } | 34 | } |
@@ -38,13 +38,13 @@ fn list_(p: &mut Parser, flavor: Flavor) { | |||
38 | 38 | ||
39 | let (bra, ket) = match flavor { | 39 | let (bra, ket) = match flavor { |
40 | Closure => (T![|], T![|]), | 40 | Closure => (T![|], T![|]), |
41 | Function | ImplFn | FnPointer => (T!['('], T![')']), | 41 | FnDef | FnTrait | FnPointer => (T!['('], T![')']), |
42 | }; | 42 | }; |
43 | 43 | ||
44 | let m = p.start(); | 44 | let m = p.start(); |
45 | p.bump(bra); | 45 | p.bump(bra); |
46 | 46 | ||
47 | if let Function = flavor { | 47 | if let FnDef = flavor { |
48 | // test self_param_outer_attr | 48 | // test self_param_outer_attr |
49 | // fn f(#[must_use] self) {} | 49 | // fn f(#[must_use] self) {} |
50 | attributes::outer_attributes(p); | 50 | attributes::outer_attributes(p); |
@@ -56,10 +56,11 @@ fn list_(p: &mut Parser, flavor: Flavor) { | |||
56 | // fn f(#[attr1] pat: Type) {} | 56 | // fn f(#[attr1] pat: Type) {} |
57 | attributes::outer_attributes(p); | 57 | attributes::outer_attributes(p); |
58 | 58 | ||
59 | if let Function | FnPointer = flavor { | 59 | // test param_list_vararg |
60 | if p.at(T![...]) { | 60 | // extern "C" { fn printf(format: *const i8, ...) -> i32; } |
61 | break; | 61 | match flavor { |
62 | } | 62 | FnDef | FnPointer if p.eat(T![...]) => break, |
63 | _ => (), | ||
63 | } | 64 | } |
64 | 65 | ||
65 | if !p.at_ts(VALUE_PARAMETER_FIRST) { | 66 | if !p.at_ts(VALUE_PARAMETER_FIRST) { |
@@ -71,11 +72,7 @@ fn list_(p: &mut Parser, flavor: Flavor) { | |||
71 | p.expect(T![,]); | 72 | p.expect(T![,]); |
72 | } | 73 | } |
73 | } | 74 | } |
74 | // test param_list_vararg | 75 | |
75 | // extern "C" { fn printf(format: *const i8, ...) -> i32; } | ||
76 | if let Function | FnPointer = flavor { | ||
77 | p.eat(T![...]); | ||
78 | } | ||
79 | p.expect(ket); | 76 | p.expect(ket); |
80 | m.complete(p, PARAM_LIST); | 77 | m.complete(p, PARAM_LIST); |
81 | } | 78 | } |
@@ -105,13 +102,13 @@ fn value_parameter(p: &mut Parser, flavor: Flavor) { | |||
105 | // fn f3(NewType(a): NewType) {} | 102 | // fn f3(NewType(a): NewType) {} |
106 | // fn f4(&&a: &&usize) {} | 103 | // fn f4(&&a: &&usize) {} |
107 | // } | 104 | // } |
108 | Flavor::Function => { | 105 | Flavor::FnDef => { |
109 | patterns::pattern(p); | 106 | patterns::pattern(p); |
110 | types::ascription(p); | 107 | types::ascription(p); |
111 | } | 108 | } |
112 | // test value_parameters_no_patterns | 109 | // test value_parameters_no_patterns |
113 | // type F = Box<Fn(i32, &i32, &i32, ())>; | 110 | // type F = Box<Fn(i32, &i32, &i32, ())>; |
114 | Flavor::ImplFn => { | 111 | Flavor::FnTrait => { |
115 | types::type_(p); | 112 | types::type_(p); |
116 | } | 113 | } |
117 | // test fn_pointer_param_ident_path | 114 | // test fn_pointer_param_ident_path |
diff --git a/crates/ra_parser/src/grammar/paths.rs b/crates/ra_parser/src/grammar/paths.rs index 186064320..f5bf3d7ce 100644 --- a/crates/ra_parser/src/grammar/paths.rs +++ b/crates/ra_parser/src/grammar/paths.rs | |||
@@ -99,7 +99,7 @@ fn opt_path_type_args(p: &mut Parser, mode: Mode) { | |||
99 | // test path_fn_trait_args | 99 | // test path_fn_trait_args |
100 | // type F = Box<Fn(i32) -> ()>; | 100 | // type F = Box<Fn(i32) -> ()>; |
101 | if p.at(T!['(']) { | 101 | if p.at(T!['(']) { |
102 | params::param_list_impl_fn(p); | 102 | params::param_list_fn_trait(p); |
103 | opt_fn_ret_type(p); | 103 | opt_fn_ret_type(p); |
104 | } else { | 104 | } else { |
105 | type_args::opt_type_arg_list(p, false) | 105 | type_args::opt_type_arg_list(p, false) |