Skip to content

Commit 3ed5ba7

Browse files
committed
extract parse_labeled_expr
1 parent 5f0f86b commit 3ed5ba7

File tree

1 file changed

+29
-25
lines changed

1 file changed

+29
-25
lines changed

src/librustc_parse/parser/expr.rs

Lines changed: 29 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -867,35 +867,13 @@ impl<'a> Parser<'a> {
867867
return self.parse_if_expr(attrs);
868868
}
869869
if self.eat_keyword(kw::For) {
870-
let lo = self.prev_span;
871-
return self.parse_for_expr(None, lo, attrs);
870+
return self.parse_for_expr(None, self.prev_span, attrs);
872871
}
873872
if self.eat_keyword(kw::While) {
874-
let lo = self.prev_span;
875-
return self.parse_while_expr(None, lo, attrs);
873+
return self.parse_while_expr(None, self.prev_span, attrs);
876874
}
877875
if let Some(label) = self.eat_label() {
878-
let lo = label.ident.span;
879-
self.expect(&token::Colon)?;
880-
if self.eat_keyword(kw::While) {
881-
return self.parse_while_expr(Some(label), lo, attrs)
882-
}
883-
if self.eat_keyword(kw::For) {
884-
return self.parse_for_expr(Some(label), lo, attrs)
885-
}
886-
if self.eat_keyword(kw::Loop) {
887-
return self.parse_loop_expr(Some(label), lo, attrs)
888-
}
889-
if self.token == token::OpenDelim(token::Brace) {
890-
return self.parse_block_expr(Some(label),
891-
lo,
892-
BlockCheckMode::Default,
893-
attrs);
894-
}
895-
let msg = "expected `while`, `for`, `loop` or `{` after a label";
896-
let mut err = self.fatal(msg);
897-
err.span_label(self.token.span, msg);
898-
return Err(err);
876+
return self.parse_labeled_expr(label, attrs);
899877
}
900878
if self.eat_keyword(kw::Loop) {
901879
let lo = self.prev_span;
@@ -1097,6 +1075,32 @@ impl<'a> Parser<'a> {
10971075
self.maybe_recover_from_bad_qpath(expr, true)
10981076
}
10991077

1078+
fn parse_labeled_expr(
1079+
&mut self,
1080+
label: Label,
1081+
attrs: ThinVec<Attribute>,
1082+
) -> PResult<'a, P<Expr>> {
1083+
let lo = label.ident.span;
1084+
self.expect(&token::Colon)?;
1085+
if self.eat_keyword(kw::While) {
1086+
return self.parse_while_expr(Some(label), lo, attrs)
1087+
}
1088+
if self.eat_keyword(kw::For) {
1089+
return self.parse_for_expr(Some(label), lo, attrs)
1090+
}
1091+
if self.eat_keyword(kw::Loop) {
1092+
return self.parse_loop_expr(Some(label), lo, attrs)
1093+
}
1094+
if self.token == token::OpenDelim(token::Brace) {
1095+
return self.parse_block_expr(Some(label), lo, BlockCheckMode::Default, attrs);
1096+
}
1097+
1098+
let msg = "expected `while`, `for`, `loop` or `{` after a label";
1099+
let mut err = self.fatal(msg);
1100+
err.span_label(self.token.span, msg);
1101+
return Err(err);
1102+
}
1103+
11001104
/// Returns a string literal if the next token is a string literal.
11011105
/// In case of error returns `Some(lit)` if the next token is a literal with a wrong kind,
11021106
/// and returns `None` if the next token is not literal at all.

0 commit comments

Comments
 (0)