diff options
author | bors[bot] <26634292+bors[bot]@users.noreply.github.com> | 2019-10-03 16:03:29 +0100 |
---|---|---|
committer | GitHub <[email protected]> | 2019-10-03 16:03:29 +0100 |
commit | 7d1bb35fb179b7e55ceb9c5354d9d74bffb8ca63 (patch) | |
tree | 9a6b2a477a371499f7a9012b26bf639acd801cb6 /crates/ra_parser/src/grammar/expressions/atom.rs | |
parent | e1c367595139f109fb6f53811bed7d67a384793e (diff) | |
parent | 9638adaa40d22adcf9b4002d95a13977c0f1436f (diff) |
Merge #1950
1950: Fix parsing of block expressions in "forbid_structs" contexts. r=kjeremy a=goffrie
Forbidding block expressions entirely is too strict; instead, we should only
forbid them in contexts where we are parsing an optional RHS (i.e. the RHS of a
range expression).
Fixes #1773.
Co-authored-by: Geoffry Song <[email protected]>
Diffstat (limited to 'crates/ra_parser/src/grammar/expressions/atom.rs')
-rw-r--r-- | crates/ra_parser/src/grammar/expressions/atom.rs | 10 |
1 files changed, 5 insertions, 5 deletions
diff --git a/crates/ra_parser/src/grammar/expressions/atom.rs b/crates/ra_parser/src/grammar/expressions/atom.rs index a52bdb3ea..7454005c4 100644 --- a/crates/ra_parser/src/grammar/expressions/atom.rs +++ b/crates/ra_parser/src/grammar/expressions/atom.rs | |||
@@ -121,11 +121,7 @@ pub(super) fn atom_expr(p: &mut Parser, r: Restrictions) -> Option<(CompletedMar | |||
121 | // break; | 121 | // break; |
122 | // } | 122 | // } |
123 | // } | 123 | // } |
124 | if r.forbid_structs { | 124 | block_expr(p, None) |
125 | return None; | ||
126 | } else { | ||
127 | block_expr(p, None) | ||
128 | } | ||
129 | } | 125 | } |
130 | T![return] => return_expr(p), | 126 | T![return] => return_expr(p), |
131 | T![continue] => continue_expr(p), | 127 | T![continue] => continue_expr(p), |
@@ -261,6 +257,7 @@ fn lambda_expr(p: &mut Parser) -> CompletedMarker { | |||
261 | // if true {} else {}; | 257 | // if true {} else {}; |
262 | // if true {} else if false {} else {}; | 258 | // if true {} else if false {} else {}; |
263 | // if S {}; | 259 | // if S {}; |
260 | // if { true } { } else { }; | ||
264 | // } | 261 | // } |
265 | fn if_expr(p: &mut Parser) -> CompletedMarker { | 262 | fn if_expr(p: &mut Parser) -> CompletedMarker { |
266 | assert!(p.at(T![if])); | 263 | assert!(p.at(T![if])); |
@@ -309,6 +306,7 @@ fn loop_expr(p: &mut Parser, m: Option<Marker>) -> CompletedMarker { | |||
309 | // fn foo() { | 306 | // fn foo() { |
310 | // while true {}; | 307 | // while true {}; |
311 | // while let Some(x) = it.next() {}; | 308 | // while let Some(x) = it.next() {}; |
309 | // while { true } {}; | ||
312 | // } | 310 | // } |
313 | fn while_expr(p: &mut Parser, m: Option<Marker>) -> CompletedMarker { | 311 | fn while_expr(p: &mut Parser, m: Option<Marker>) -> CompletedMarker { |
314 | assert!(p.at(T![while])); | 312 | assert!(p.at(T![while])); |
@@ -356,6 +354,8 @@ fn cond(p: &mut Parser) { | |||
356 | // fn foo() { | 354 | // fn foo() { |
357 | // match () { }; | 355 | // match () { }; |
358 | // match S {}; | 356 | // match S {}; |
357 | // match { } { _ => () }; | ||
358 | // match { S {} } {}; | ||
359 | // } | 359 | // } |
360 | fn match_expr(p: &mut Parser) -> CompletedMarker { | 360 | fn match_expr(p: &mut Parser) -> CompletedMarker { |
361 | assert!(p.at(T![match])); | 361 | assert!(p.at(T![match])); |