Skip to content

Commit 7262dcc

Browse files
committed
refactor loop parsing a bit
1 parent de2e443 commit 7262dcc

File tree

2 files changed

+28
-31
lines changed

2 files changed

+28
-31
lines changed

src/librustc_parse/parser/expr.rs

Lines changed: 26 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1472,15 +1472,13 @@ impl<'a> Parser<'a> {
14721472
}
14731473
}
14741474

1475-
/// Parses a `for ... in` expression (`for` token already eaten).
1475+
/// Parses `for <src_pat> in <src_expr> <src_loop_block>` (`for` token already eaten).
14761476
fn parse_for_expr(
14771477
&mut self,
14781478
opt_label: Option<Label>,
1479-
span_lo: Span,
1479+
lo: Span,
14801480
mut attrs: AttrVec,
14811481
) -> PResult<'a, P<Expr>> {
1482-
// Parse: `for <src_pat> in <src_expr> <src_loop_block>`
1483-
14841482
// Record whether we are about to parse `for (`.
14851483
// This is used below for recovery in case of `for ( $stuff ) $block`
14861484
// in which case we will suggest `for $stuff $block`.
@@ -1491,65 +1489,64 @@ impl<'a> Parser<'a> {
14911489

14921490
let pat = self.parse_top_pat(GateOr::Yes)?;
14931491
if !self.eat_keyword(kw::In) {
1494-
let in_span = self.prev_span.between(self.token.span);
1495-
self.struct_span_err(in_span, "missing `in` in `for` loop")
1496-
.span_suggestion_short(
1497-
in_span,
1498-
"try adding `in` here",
1499-
" in ".into(),
1500-
// has been misleading, at least in the past (closed Issue #48492)
1501-
Applicability::MaybeIncorrect,
1502-
)
1503-
.emit();
1492+
self.error_missing_in_for_loop();
15041493
}
1505-
let in_span = self.prev_span;
1506-
self.check_for_for_in_in_typo(in_span);
1494+
self.check_for_for_in_in_typo(self.prev_span);
15071495
let expr = self.parse_expr_res(Restrictions::NO_STRUCT_LITERAL, None)?;
15081496

15091497
let pat = self.recover_parens_around_for_head(pat, &expr, begin_paren);
15101498

15111499
let (iattrs, loop_block) = self.parse_inner_attrs_and_block()?;
15121500
attrs.extend(iattrs);
15131501

1514-
let hi = self.prev_span;
1515-
Ok(self.mk_expr(span_lo.to(hi), ExprKind::ForLoop(pat, expr, loop_block, opt_label), attrs))
1502+
let kind = ExprKind::ForLoop(pat, expr, loop_block, opt_label);
1503+
Ok(self.mk_expr(lo.to(self.prev_span), kind, attrs))
1504+
}
1505+
1506+
fn error_missing_in_for_loop(&self) {
1507+
let in_span = self.prev_span.between(self.token.span);
1508+
self.struct_span_err(in_span, "missing `in` in `for` loop")
1509+
.span_suggestion_short(
1510+
in_span,
1511+
"try adding `in` here",
1512+
" in ".into(),
1513+
// Has been misleading, at least in the past (closed Issue #48492).
1514+
Applicability::MaybeIncorrect,
1515+
)
1516+
.emit();
15161517
}
15171518

15181519
/// Parses a `while` or `while let` expression (`while` token already eaten).
15191520
fn parse_while_expr(
15201521
&mut self,
15211522
opt_label: Option<Label>,
1522-
span_lo: Span,
1523+
lo: Span,
15231524
mut attrs: AttrVec,
15241525
) -> PResult<'a, P<Expr>> {
15251526
let cond = self.parse_cond_expr()?;
15261527
let (iattrs, body) = self.parse_inner_attrs_and_block()?;
15271528
attrs.extend(iattrs);
1528-
let span = span_lo.to(body.span);
1529-
Ok(self.mk_expr(span, ExprKind::While(cond, body, opt_label), attrs))
1529+
Ok(self.mk_expr(lo.to(self.prev_span), ExprKind::While(cond, body, opt_label), attrs))
15301530
}
15311531

15321532
/// Parses `loop { ... }` (`loop` token already eaten).
15331533
fn parse_loop_expr(
15341534
&mut self,
15351535
opt_label: Option<Label>,
1536-
span_lo: Span,
1536+
lo: Span,
15371537
mut attrs: AttrVec,
15381538
) -> PResult<'a, P<Expr>> {
15391539
let (iattrs, body) = self.parse_inner_attrs_and_block()?;
15401540
attrs.extend(iattrs);
1541-
let span = span_lo.to(body.span);
1542-
Ok(self.mk_expr(span, ExprKind::Loop(body, opt_label), attrs))
1541+
Ok(self.mk_expr(lo.to(self.prev_span), ExprKind::Loop(body, opt_label), attrs))
15431542
}
15441543

15451544
fn eat_label(&mut self) -> Option<Label> {
1546-
if let Some(ident) = self.token.lifetime() {
1545+
self.token.lifetime().map(|ident| {
15471546
let span = self.token.span;
15481547
self.bump();
1549-
Some(Label { ident: Ident::new(ident.name, span) })
1550-
} else {
1551-
None
1552-
}
1548+
Label { ident: Ident::new(ident.name, span) }
1549+
})
15531550
}
15541551

15551552
/// Parses a `match ... { ... }` expression (`match` token already eaten).

src/test/ui/while-let.stderr

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ warning: irrefutable while-let pattern
22
--> $DIR/while-let.rs:7:13
33
|
44
LL | while let $p = $e $b
5-
| ^^^^^
5+
| ^^^^^^^^^^^^^^^^^^^^
66
...
77
LL | / foo!(_a, 1, {
88
LL | | println!("irrefutable pattern");
@@ -15,7 +15,7 @@ warning: irrefutable while-let pattern
1515
--> $DIR/while-let.rs:7:13
1616
|
1717
LL | while let $p = $e $b
18-
| ^^^^^
18+
| ^^^^^^^^^^^^^^^^^^^^
1919
...
2020
LL | / bar!(_a, 1, {
2121
LL | | println!("irrefutable pattern");

0 commit comments

Comments
 (0)