diff options
Diffstat (limited to 'src/parser')
-rw-r--r-- | src/parser/grammar/items/mod.rs | 80 | ||||
-rw-r--r-- | src/parser/grammar/type_params.rs | 5 | ||||
-rw-r--r-- | src/parser/grammar/types.rs | 11 |
3 files changed, 67 insertions, 29 deletions
diff --git a/src/parser/grammar/items/mod.rs b/src/parser/grammar/items/mod.rs index b73628ec0..ffe86fa97 100644 --- a/src/parser/grammar/items/mod.rs +++ b/src/parser/grammar/items/mod.rs | |||
@@ -150,7 +150,14 @@ fn item(p: &mut Parser) { | |||
150 | } | 150 | } |
151 | } | 151 | } |
152 | } | 152 | } |
153 | 153 | FN_KW => { | |
154 | fn_item(p); | ||
155 | FN_ITEM | ||
156 | } | ||
157 | TYPE_KW => { | ||
158 | type_item(p); | ||
159 | TYPE_ITEM | ||
160 | } | ||
154 | MOD_KW => { | 161 | MOD_KW => { |
155 | mod_item(p); | 162 | mod_item(p); |
156 | MOD_ITEM | 163 | MOD_ITEM |
@@ -163,10 +170,6 @@ fn item(p: &mut Parser) { | |||
163 | structs::enum_item(p); | 170 | structs::enum_item(p); |
164 | ENUM_ITEM | 171 | ENUM_ITEM |
165 | } | 172 | } |
166 | FN_KW => { | ||
167 | fn_item(p); | ||
168 | FN_ITEM | ||
169 | } | ||
170 | L_CURLY => { | 173 | L_CURLY => { |
171 | item.abandon(p); | 174 | item.abandon(p); |
172 | error_block(p, "expected item"); | 175 | error_block(p, "expected item"); |
@@ -203,29 +206,6 @@ fn extern_block(p: &mut Parser) { | |||
203 | p.expect(R_CURLY); | 206 | p.expect(R_CURLY); |
204 | } | 207 | } |
205 | 208 | ||
206 | fn mod_item(p: &mut Parser) { | ||
207 | assert!(p.at(MOD_KW)); | ||
208 | p.bump(); | ||
209 | |||
210 | if p.expect(IDENT) && !p.eat(SEMI) { | ||
211 | if p.expect(L_CURLY) { | ||
212 | mod_contents(p, true); | ||
213 | p.expect(R_CURLY); | ||
214 | } | ||
215 | } | ||
216 | } | ||
217 | |||
218 | fn abi(p: &mut Parser) { | ||
219 | assert!(p.at(EXTERN_KW)); | ||
220 | let abi = p.start(); | ||
221 | p.bump(); | ||
222 | match p.current() { | ||
223 | STRING | RAW_STRING => p.bump(), | ||
224 | _ => (), | ||
225 | } | ||
226 | abi.complete(p, ABI); | ||
227 | } | ||
228 | |||
229 | fn fn_item(p: &mut Parser) { | 209 | fn fn_item(p: &mut Parser) { |
230 | assert!(p.at(FN_KW)); | 210 | assert!(p.at(FN_KW)); |
231 | p.bump(); | 211 | p.bump(); |
@@ -248,3 +228,47 @@ fn fn_item(p: &mut Parser) { | |||
248 | p.expect(R_PAREN); | 228 | p.expect(R_PAREN); |
249 | } | 229 | } |
250 | } | 230 | } |
231 | |||
232 | // test type_item | ||
233 | // type Foo = Bar; | ||
234 | fn type_item(p: &mut Parser) { | ||
235 | assert!(p.at(TYPE_KW)); | ||
236 | p.bump(); | ||
237 | |||
238 | p.expect(IDENT); | ||
239 | |||
240 | // test type_item_type_params | ||
241 | // type Result<T> = (); | ||
242 | type_params::list(p); | ||
243 | |||
244 | // test type_item_where_clause | ||
245 | // type Foo where Foo: Copy = (); | ||
246 | type_params::where_clause(p); | ||
247 | |||
248 | p.expect(EQ); | ||
249 | types::type_ref(p); | ||
250 | p.expect(SEMI); | ||
251 | } | ||
252 | |||
253 | fn mod_item(p: &mut Parser) { | ||
254 | assert!(p.at(MOD_KW)); | ||
255 | p.bump(); | ||
256 | |||
257 | if p.expect(IDENT) && !p.eat(SEMI) { | ||
258 | if p.expect(L_CURLY) { | ||
259 | mod_contents(p, true); | ||
260 | p.expect(R_CURLY); | ||
261 | } | ||
262 | } | ||
263 | } | ||
264 | |||
265 | fn abi(p: &mut Parser) { | ||
266 | assert!(p.at(EXTERN_KW)); | ||
267 | let abi = p.start(); | ||
268 | p.bump(); | ||
269 | match p.current() { | ||
270 | STRING | RAW_STRING => p.bump(), | ||
271 | _ => (), | ||
272 | } | ||
273 | abi.complete(p, ABI); | ||
274 | } | ||
diff --git a/src/parser/grammar/type_params.rs b/src/parser/grammar/type_params.rs index 12c9a5362..8f62a471c 100644 --- a/src/parser/grammar/type_params.rs +++ b/src/parser/grammar/type_params.rs | |||
@@ -70,6 +70,11 @@ pub(super) fn list(p: &mut Parser) { | |||
70 | 70 | ||
71 | pub(super) fn where_clause(p: &mut Parser) { | 71 | pub(super) fn where_clause(p: &mut Parser) { |
72 | if p.at(WHERE_KW) { | 72 | if p.at(WHERE_KW) { |
73 | let m = p.start(); | ||
73 | p.bump(); | 74 | p.bump(); |
75 | p.expect(IDENT); | ||
76 | p.expect(COLON); | ||
77 | p.expect(IDENT); | ||
78 | m.complete(p, WHERE_CLAUSE); | ||
74 | } | 79 | } |
75 | } | 80 | } |
diff --git a/src/parser/grammar/types.rs b/src/parser/grammar/types.rs index 1a3d44a0a..c798edd08 100644 --- a/src/parser/grammar/types.rs +++ b/src/parser/grammar/types.rs | |||
@@ -1,5 +1,14 @@ | |||
1 | use super::*; | 1 | use super::*; |
2 | 2 | ||
3 | pub(super) fn type_ref(p: &mut Parser) { | 3 | pub(super) fn type_ref(p: &mut Parser) { |
4 | p.expect(IDENT); | 4 | match p.current() { |
5 | IDENT => p.bump(), | ||
6 | L_PAREN => { | ||
7 | p.bump(); | ||
8 | p.expect(R_PAREN); | ||
9 | } | ||
10 | _ => { | ||
11 | p.error("expected type"); | ||
12 | } | ||
13 | } | ||
5 | } | 14 | } |