]> git.lizzy.rs Git - rust.git/commitdiff
extract parse_break_expr
authorMazdak Farrokhzad <twingoow@gmail.com>
Tue, 3 Dec 2019 14:06:34 +0000 (15:06 +0100)
committerMazdak Farrokhzad <twingoow@gmail.com>
Fri, 20 Dec 2019 21:41:29 +0000 (22:41 +0100)
src/librustc_parse/parser/expr.rs

index 9bc89a6f240b8147cb4abfa9766c193b920312aa..1d3c35c6466abcd94cacf8aaac0ed24843f33535 100644 (file)
@@ -907,16 +907,7 @@ macro_rules! parse_lit {
                 if self.eat_keyword(kw::Return) {
                     return self.parse_return_expr(attrs);
                 } else if self.eat_keyword(kw::Break) {
-                    let label = self.eat_label();
-                    let e = if self.token.can_begin_expr()
-                               && !(self.token == token::OpenDelim(token::Brace)
-                                    && self.restrictions.contains(
-                                           Restrictions::NO_STRUCT_LITERAL)) {
-                        Some(self.parse_expr()?)
-                    } else {
-                        None
-                    };
-                    (self.prev_span, ExprKind::Break(label, e))
+                    return self.parse_break_expr(attrs);
                 } else if self.eat_keyword(kw::Yield) {
                     return self.parse_yield_expr(attrs);
                 } else if self.eat_keyword(kw::Let) {
@@ -1109,6 +1100,21 @@ fn parse_return_expr(&mut self, attrs: ThinVec<Attribute>) -> PResult<'a, P<Expr
         self.maybe_recover_from_bad_qpath(expr, true)
     }
 
+    /// Parse `"('label ":")? break expr?`.
+    fn parse_break_expr(&mut self, attrs: ThinVec<Attribute>) -> PResult<'a, P<Expr>> {
+        let lo = self.prev_span;
+        let label = self.eat_label();
+        let kind = if self.token != token::OpenDelim(token::Brace)
+            || !self.restrictions.contains(Restrictions::NO_STRUCT_LITERAL)
+        {
+            self.parse_expr_opt()?
+        } else {
+            None
+        };
+        let expr = self.mk_expr(lo.to(self.prev_span), ExprKind::Break(label, kind), attrs);
+        self.maybe_recover_from_bad_qpath(expr, true)
+    }
+
     /// Parse `"yield" expr?`.
     fn parse_yield_expr(&mut self, attrs: ThinVec<Attribute>) -> PResult<'a, P<Expr>> {
         let lo = self.prev_span;