diff options
Diffstat (limited to 'src/parser/event_parser/grammar/items.rs')
-rw-r--r-- | src/parser/event_parser/grammar/items.rs | 65 |
1 files changed, 34 insertions, 31 deletions
diff --git a/src/parser/event_parser/grammar/items.rs b/src/parser/event_parser/grammar/items.rs index f96f4cc9c..4514f0dab 100644 --- a/src/parser/event_parser/grammar/items.rs +++ b/src/parser/event_parser/grammar/items.rs | |||
@@ -7,7 +7,7 @@ pub(super) fn mod_contents(p: &mut Parser) { | |||
7 | } | 7 | } |
8 | } | 8 | } |
9 | 9 | ||
10 | fn item(p: &mut Parser){ | 10 | fn item(p: &mut Parser) { |
11 | let attrs_start = p.mark(); | 11 | let attrs_start = p.mark(); |
12 | attributes::outer_attributes(p); | 12 | attributes::outer_attributes(p); |
13 | visibility(p); | 13 | visibility(p); |
@@ -51,7 +51,7 @@ fn struct_item(p: &mut Parser) { | |||
51 | fn struct_inner(p: &mut Parser) { | 51 | fn struct_inner(p: &mut Parser) { |
52 | if !p.expect(IDENT) { | 52 | if !p.expect(IDENT) { |
53 | p.finish(); | 53 | p.finish(); |
54 | return | 54 | return; |
55 | } | 55 | } |
56 | generic_parameters(p); | 56 | generic_parameters(p); |
57 | match p.current() { | 57 | match p.current() { |
@@ -60,31 +60,31 @@ fn struct_item(p: &mut Parser) { | |||
60 | match p.current() { | 60 | match p.current() { |
61 | SEMI => { | 61 | SEMI => { |
62 | p.bump(); | 62 | p.bump(); |
63 | return | 63 | return; |
64 | } | 64 | } |
65 | L_CURLY => named_fields(p), | 65 | L_CURLY => named_fields(p), |
66 | _ => { //TODO: special case `(` error message | 66 | _ => { //TODO: special case `(` error message |
67 | p.error() | 67 | p.error() |
68 | .message("expected `;` or `{`") | 68 | .message("expected `;` or `{`") |
69 | .emit(); | 69 | .emit(); |
70 | return | 70 | return; |
71 | } | 71 | } |
72 | } | 72 | } |
73 | } | 73 | } |
74 | SEMI => { | 74 | SEMI => { |
75 | p.bump(); | 75 | p.bump(); |
76 | return | 76 | return; |
77 | } | 77 | } |
78 | L_CURLY => named_fields(p), | 78 | L_CURLY => named_fields(p), |
79 | L_PAREN => { | 79 | L_PAREN => { |
80 | tuple_fields(p); | 80 | tuple_fields(p); |
81 | p.expect(SEMI); | 81 | p.expect(SEMI); |
82 | }, | 82 | } |
83 | _ => { | 83 | _ => { |
84 | p.error() | 84 | p.error() |
85 | .message("expected `;`, `{`, or `(`") | 85 | .message("expected `;`, `{`, or `(`") |
86 | .emit(); | 86 | .emit(); |
87 | return | 87 | return; |
88 | } | 88 | } |
89 | } | 89 | } |
90 | } | 90 | } |
@@ -108,7 +108,7 @@ fn named_fields(p: &mut Parser) { | |||
108 | 108 | ||
109 | fn tuple_fields(p: &mut Parser) { | 109 | fn tuple_fields(p: &mut Parser) { |
110 | if !p.expect(L_PAREN) { | 110 | if !p.expect(L_PAREN) { |
111 | return | 111 | return; |
112 | } | 112 | } |
113 | comma_list(p, R_PAREN, |p| { | 113 | comma_list(p, R_PAREN, |p| { |
114 | tuple_field(p); | 114 | tuple_field(p); |
@@ -124,11 +124,9 @@ fn tuple_fields(p: &mut Parser) { | |||
124 | } | 124 | } |
125 | } | 125 | } |
126 | 126 | ||
127 | fn generic_parameters(_: &mut Parser) { | 127 | fn generic_parameters(_: &mut Parser) {} |
128 | } | ||
129 | 128 | ||
130 | fn where_clause(_: &mut Parser) { | 129 | fn where_clause(_: &mut Parser) {} |
131 | } | ||
132 | 130 | ||
133 | fn extern_crate_item(p: &mut Parser) { | 131 | fn extern_crate_item(p: &mut Parser) { |
134 | p.start(EXTERN_CRATE_ITEM); | 132 | p.start(EXTERN_CRATE_ITEM); |
@@ -168,24 +166,29 @@ fn use_item(p: &mut Parser) { | |||
168 | p.expect(SEMI); | 166 | p.expect(SEMI); |
169 | p.finish(); | 167 | p.finish(); |
170 | 168 | ||
171 | fn use_tree(p: &mut Parser) -> bool{ | 169 | fn use_tree(p: &mut Parser) -> bool { |
172 | if node_if(p, STAR, USE_TREE, |_| ()) { | 170 | let la = p.raw_lookahead(1); |
173 | return true | 171 | match (p.current(), la) { |
174 | } | 172 | (STAR, _) => { |
175 | if node_if(p, [COLONCOLON, STAR], USE_TREE, |_| ()) { | 173 | p.start(USE_TREE); |
176 | return true | 174 | p.bump(); |
177 | } | 175 | } |
178 | if [COLONCOLON, L_CURLY].is_ahead(p) || L_CURLY.is_ahead(p) { | 176 | (COLONCOLON, STAR) => { |
179 | node(p, USE_TREE, |p| { | 177 | p.start(USE_TREE); |
180 | p.eat(COLONCOLON); | 178 | p.bump(); |
179 | p.bump(); | ||
180 | } | ||
181 | (L_CURLY, _) | (COLONCOLON, L_CURLY) => { | ||
182 | p.start(USE_TREE); | ||
183 | if p.at(COLONCOLON) { | ||
184 | p.bump(); | ||
185 | } | ||
181 | p.curly_block(|p| { | 186 | p.curly_block(|p| { |
182 | comma_list(p, EOF, use_tree); | 187 | comma_list(p, EOF, use_tree); |
183 | }); | 188 | }); |
184 | }); | 189 | } |
185 | return true; | 190 | _ if paths::is_path_start(p) => { |
186 | } | 191 | p.start(USE_TREE); |
187 | if paths::is_path_start(p) { | ||
188 | node(p, USE_TREE, |p| { | ||
189 | paths::use_path(p); | 192 | paths::use_path(p); |
190 | match p.current() { | 193 | match p.current() { |
191 | AS_KW => { | 194 | AS_KW => { |
@@ -212,15 +215,15 @@ fn use_item(p: &mut Parser) { | |||
212 | } | 215 | } |
213 | _ => (), | 216 | _ => (), |
214 | } | 217 | } |
215 | }); | 218 | } |
216 | return true; | 219 | _ => return false, |
217 | } | 220 | } |
218 | false | 221 | p.finish(); |
222 | return true; | ||
219 | } | 223 | } |
220 | } | 224 | } |
221 | 225 | ||
222 | 226 | ||
223 | |||
224 | fn fn_item(p: &mut Parser) { | 227 | fn fn_item(p: &mut Parser) { |
225 | p.start(FN_ITEM); | 228 | p.start(FN_ITEM); |
226 | 229 | ||