diff options
author | bors[bot] <bors[bot]@users.noreply.github.com> | 2019-02-21 10:46:17 +0000 |
---|---|---|
committer | bors[bot] <bors[bot]@users.noreply.github.com> | 2019-02-21 10:46:17 +0000 |
commit | d77b5857c2420666e84dcd433f254e000e2843aa (patch) | |
tree | 416e333019e349bf4ee369f2548d9e6f6a9c67e9 /crates/ra_syntax/src/parsing/grammar/params.rs | |
parent | 18b0c509f77a8e06141fee6668532cced1ebf5d8 (diff) | |
parent | 46179230a05331b1debd4dfa3bb197fa38d92347 (diff) |
Merge #867
867: This moves the parser to separate crate r=matklad a=matklad
That makes parser independent form both the token and the tree representation.
Co-authored-by: Aleksey Kladov <[email protected]>
Diffstat (limited to 'crates/ra_syntax/src/parsing/grammar/params.rs')
-rw-r--r-- | crates/ra_syntax/src/parsing/grammar/params.rs | 139 |
1 files changed, 0 insertions, 139 deletions
diff --git a/crates/ra_syntax/src/parsing/grammar/params.rs b/crates/ra_syntax/src/parsing/grammar/params.rs deleted file mode 100644 index 185386569..000000000 --- a/crates/ra_syntax/src/parsing/grammar/params.rs +++ /dev/null | |||
@@ -1,139 +0,0 @@ | |||
1 | use super::*; | ||
2 | |||
3 | // test param_list | ||
4 | // fn a() {} | ||
5 | // fn b(x: i32) {} | ||
6 | // fn c(x: i32, ) {} | ||
7 | // fn d(x: i32, y: ()) {} | ||
8 | pub(super) fn param_list(p: &mut Parser) { | ||
9 | list_(p, Flavor::Normal) | ||
10 | } | ||
11 | |||
12 | // test param_list_opt_patterns | ||
13 | // fn foo<F: FnMut(&mut Foo<'a>)>(){} | ||
14 | pub(super) fn param_list_opt_patterns(p: &mut Parser) { | ||
15 | list_(p, Flavor::OptionalPattern) | ||
16 | } | ||
17 | |||
18 | pub(super) fn param_list_opt_types(p: &mut Parser) { | ||
19 | list_(p, Flavor::OptionalType) | ||
20 | } | ||
21 | |||
22 | #[derive(Clone, Copy, Eq, PartialEq)] | ||
23 | enum Flavor { | ||
24 | OptionalType, | ||
25 | OptionalPattern, | ||
26 | Normal, | ||
27 | } | ||
28 | |||
29 | impl Flavor { | ||
30 | fn type_required(self) -> bool { | ||
31 | match self { | ||
32 | Flavor::OptionalType => false, | ||
33 | _ => true, | ||
34 | } | ||
35 | } | ||
36 | } | ||
37 | |||
38 | fn list_(p: &mut Parser, flavor: Flavor) { | ||
39 | let (bra, ket) = if flavor.type_required() { (L_PAREN, R_PAREN) } else { (PIPE, PIPE) }; | ||
40 | assert!(p.at(bra)); | ||
41 | let m = p.start(); | ||
42 | p.bump(); | ||
43 | if flavor.type_required() { | ||
44 | opt_self_param(p); | ||
45 | } | ||
46 | while !p.at(EOF) && !p.at(ket) { | ||
47 | if !p.at_ts(VALUE_PARAMETER_FIRST) { | ||
48 | p.error("expected value parameter"); | ||
49 | break; | ||
50 | } | ||
51 | value_parameter(p, flavor); | ||
52 | if !p.at(ket) { | ||
53 | p.expect(COMMA); | ||
54 | } | ||
55 | } | ||
56 | p.expect(ket); | ||
57 | m.complete(p, PARAM_LIST); | ||
58 | } | ||
59 | |||
60 | const VALUE_PARAMETER_FIRST: TokenSet = patterns::PATTERN_FIRST.union(types::TYPE_FIRST); | ||
61 | |||
62 | fn value_parameter(p: &mut Parser, flavor: Flavor) { | ||
63 | let m = p.start(); | ||
64 | match flavor { | ||
65 | Flavor::OptionalType | Flavor::Normal => { | ||
66 | patterns::pattern(p); | ||
67 | if p.at(COLON) || flavor.type_required() { | ||
68 | types::ascription(p) | ||
69 | } | ||
70 | } | ||
71 | // test value_parameters_no_patterns | ||
72 | // type F = Box<Fn(a: i32, &b: &i32, &mut c: &i32, ())>; | ||
73 | Flavor::OptionalPattern => { | ||
74 | let la0 = p.current(); | ||
75 | let la1 = p.nth(1); | ||
76 | let la2 = p.nth(2); | ||
77 | let la3 = p.nth(3); | ||
78 | |||
79 | // test trait_fn_placeholder_parameter | ||
80 | // trait Foo { | ||
81 | // fn bar(_: u64); | ||
82 | // } | ||
83 | if (la0 == IDENT || la0 == UNDERSCORE) && la1 == COLON | ||
84 | || la0 == AMP && la1 == IDENT && la2 == COLON | ||
85 | || la0 == AMP && la1 == MUT_KW && la2 == IDENT && la3 == COLON | ||
86 | { | ||
87 | patterns::pattern(p); | ||
88 | types::ascription(p); | ||
89 | } else { | ||
90 | types::type_(p); | ||
91 | } | ||
92 | } | ||
93 | } | ||
94 | m.complete(p, PARAM); | ||
95 | } | ||
96 | |||
97 | // test self_param | ||
98 | // impl S { | ||
99 | // fn a(self) {} | ||
100 | // fn b(&self,) {} | ||
101 | // fn c(&'a self,) {} | ||
102 | // fn d(&'a mut self, x: i32) {} | ||
103 | // fn e(mut self) {} | ||
104 | // } | ||
105 | fn opt_self_param(p: &mut Parser) { | ||
106 | let m; | ||
107 | if p.at(SELF_KW) || p.at(MUT_KW) && p.nth(1) == SELF_KW { | ||
108 | m = p.start(); | ||
109 | p.eat(MUT_KW); | ||
110 | p.eat(SELF_KW); | ||
111 | // test arb_self_types | ||
112 | // impl S { | ||
113 | // fn a(self: &Self) {} | ||
114 | // fn b(mut self: Box<Self>) {} | ||
115 | // } | ||
116 | if p.at(COLON) { | ||
117 | types::ascription(p); | ||
118 | } | ||
119 | } else { | ||
120 | let la1 = p.nth(1); | ||
121 | let la2 = p.nth(2); | ||
122 | let la3 = p.nth(3); | ||
123 | let n_toks = match (p.current(), la1, la2, la3) { | ||
124 | (AMP, SELF_KW, _, _) => 2, | ||
125 | (AMP, MUT_KW, SELF_KW, _) => 3, | ||
126 | (AMP, LIFETIME, SELF_KW, _) => 3, | ||
127 | (AMP, LIFETIME, MUT_KW, SELF_KW) => 4, | ||
128 | _ => return, | ||
129 | }; | ||
130 | m = p.start(); | ||
131 | for _ in 0..n_toks { | ||
132 | p.bump(); | ||
133 | } | ||
134 | } | ||
135 | m.complete(p, SELF_PARAM); | ||
136 | if !p.at(R_PAREN) { | ||
137 | p.expect(COMMA); | ||
138 | } | ||
139 | } | ||