aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_parser/src/grammar/expressions
diff options
context:
space:
mode:
authorAleksey Kladov <[email protected]>2020-05-02 13:34:39 +0100
committerAleksey Kladov <[email protected]>2020-05-02 13:35:17 +0100
commit359d3be308cab2415218200f5799c5031213c250 (patch)
tree73f335deb44a8ef894deb7394445d6f1166e28a6 /crates/ra_parser/src/grammar/expressions
parentfb8fb65131c8d3e6335efd401e4e83287be49357 (diff)
Fix parsing of blocks without `{`
Diffstat (limited to 'crates/ra_parser/src/grammar/expressions')
-rw-r--r--crates/ra_parser/src/grammar/expressions/atom.rs41
1 files changed, 23 insertions, 18 deletions
diff --git a/crates/ra_parser/src/grammar/expressions/atom.rs b/crates/ra_parser/src/grammar/expressions/atom.rs
index efb424dae..706a2f796 100644
--- a/crates/ra_parser/src/grammar/expressions/atom.rs
+++ b/crates/ra_parser/src/grammar/expressions/atom.rs
@@ -132,7 +132,7 @@ pub(super) fn atom_expr(p: &mut Parser, r: Restrictions) -> Option<(CompletedMar
132 // break; 132 // break;
133 // } 133 // }
134 // } 134 // }
135 block_expr(p) 135 block_expr_unchecked(p)
136 } 136 }
137 T![return] => return_expr(p), 137 T![return] => return_expr(p),
138 T![continue] => continue_expr(p), 138 T![continue] => continue_expr(p),
@@ -240,13 +240,9 @@ fn lambda_expr(p: &mut Parser) -> CompletedMarker {
240 p.eat(T![move]); 240 p.eat(T![move]);
241 params::param_list_closure(p); 241 params::param_list_closure(p);
242 if opt_fn_ret_type(p) { 242 if opt_fn_ret_type(p) {
243 if p.at(T!['{']) { 243 // test lambda_ret_block
244 // test lambda_ret_block 244 // fn main() { || -> i32 { 92 }(); }
245 // fn main() { || -> i32 { 92 }(); } 245 block_expr(p);
246 block_expr(p);
247 } else {
248 p.error("expected `{`");
249 }
250 } else { 246 } else {
251 if p.at_ts(EXPR_FIRST) { 247 if p.at_ts(EXPR_FIRST) {
252 expr(p); 248 expr(p);
@@ -270,13 +266,13 @@ fn if_expr(p: &mut Parser) -> CompletedMarker {
270 let m = p.start(); 266 let m = p.start();
271 p.bump(T![if]); 267 p.bump(T![if]);
272 cond(p); 268 cond(p);
273 block(p); 269 block_expr(p);
274 if p.at(T![else]) { 270 if p.at(T![else]) {
275 p.bump(T![else]); 271 p.bump(T![else]);
276 if p.at(T![if]) { 272 if p.at(T![if]) {
277 if_expr(p); 273 if_expr(p);
278 } else { 274 } else {
279 block(p); 275 block_expr(p);
280 } 276 }
281 } 277 }
282 m.complete(p, IF_EXPR) 278 m.complete(p, IF_EXPR)
@@ -304,7 +300,7 @@ fn loop_expr(p: &mut Parser, m: Option<Marker>) -> CompletedMarker {
304 assert!(p.at(T![loop])); 300 assert!(p.at(T![loop]));
305 let m = m.unwrap_or_else(|| p.start()); 301 let m = m.unwrap_or_else(|| p.start());
306 p.bump(T![loop]); 302 p.bump(T![loop]);
307 block(p); 303 block_expr(p);
308 m.complete(p, LOOP_EXPR) 304 m.complete(p, LOOP_EXPR)
309} 305}
310 306
@@ -319,7 +315,7 @@ fn while_expr(p: &mut Parser, m: Option<Marker>) -> CompletedMarker {
319 let m = m.unwrap_or_else(|| p.start()); 315 let m = m.unwrap_or_else(|| p.start());
320 p.bump(T![while]); 316 p.bump(T![while]);
321 cond(p); 317 cond(p);
322 block(p); 318 block_expr(p);
323 m.complete(p, WHILE_EXPR) 319 m.complete(p, WHILE_EXPR)
324} 320}
325 321
@@ -334,7 +330,7 @@ fn for_expr(p: &mut Parser, m: Option<Marker>) -> CompletedMarker {
334 patterns::pattern(p); 330 patterns::pattern(p);
335 p.expect(T![in]); 331 p.expect(T![in]);
336 expr_no_struct(p); 332 expr_no_struct(p);
337 block(p); 333 block_expr(p);
338 m.complete(p, FOR_EXPR) 334 m.complete(p, FOR_EXPR)
339} 335}
340 336
@@ -467,11 +463,20 @@ fn match_guard(p: &mut Parser) -> CompletedMarker {
467 m.complete(p, MATCH_GUARD) 463 m.complete(p, MATCH_GUARD)
468} 464}
469 465
470// test block_expr 466// test block
471// fn foo() { 467// fn a() {}
472// {}; 468// fn b() { let _ = 1; }
473// } 469// fn c() { 1; 2; }
474pub(super) fn block_expr(p: &mut Parser) -> CompletedMarker { 470// fn d() { 1; 2 }
471pub(crate) fn block_expr(p: &mut Parser) {
472 if !p.at(T!['{']) {
473 p.error("expected a block");
474 return;
475 }
476 block_expr_unchecked(p);
477}
478
479fn block_expr_unchecked(p: &mut Parser) -> CompletedMarker {
475 assert!(p.at(T!['{'])); 480 assert!(p.at(T!['{']));
476 let m = p.start(); 481 let m = p.start();
477 p.bump(T!['{']); 482 p.bump(T!['{']);