@@ -1472,15 +1472,13 @@ impl<'a> Parser<'a> {
1472
1472
}
1473
1473
}
1474
1474
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).
1476
1476
fn parse_for_expr (
1477
1477
& mut self ,
1478
1478
opt_label : Option < Label > ,
1479
- span_lo : Span ,
1479
+ lo : Span ,
1480
1480
mut attrs : AttrVec ,
1481
1481
) -> PResult < ' a , P < Expr > > {
1482
- // Parse: `for <src_pat> in <src_expr> <src_loop_block>`
1483
-
1484
1482
// Record whether we are about to parse `for (`.
1485
1483
// This is used below for recovery in case of `for ( $stuff ) $block`
1486
1484
// in which case we will suggest `for $stuff $block`.
@@ -1491,65 +1489,64 @@ impl<'a> Parser<'a> {
1491
1489
1492
1490
let pat = self . parse_top_pat ( GateOr :: Yes ) ?;
1493
1491
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 ( ) ;
1504
1493
}
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 ) ;
1507
1495
let expr = self . parse_expr_res ( Restrictions :: NO_STRUCT_LITERAL , None ) ?;
1508
1496
1509
1497
let pat = self . recover_parens_around_for_head ( pat, & expr, begin_paren) ;
1510
1498
1511
1499
let ( iattrs, loop_block) = self . parse_inner_attrs_and_block ( ) ?;
1512
1500
attrs. extend ( iattrs) ;
1513
1501
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 ( ) ;
1516
1517
}
1517
1518
1518
1519
/// Parses a `while` or `while let` expression (`while` token already eaten).
1519
1520
fn parse_while_expr (
1520
1521
& mut self ,
1521
1522
opt_label : Option < Label > ,
1522
- span_lo : Span ,
1523
+ lo : Span ,
1523
1524
mut attrs : AttrVec ,
1524
1525
) -> PResult < ' a , P < Expr > > {
1525
1526
let cond = self . parse_cond_expr ( ) ?;
1526
1527
let ( iattrs, body) = self . parse_inner_attrs_and_block ( ) ?;
1527
1528
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) )
1530
1530
}
1531
1531
1532
1532
/// Parses `loop { ... }` (`loop` token already eaten).
1533
1533
fn parse_loop_expr (
1534
1534
& mut self ,
1535
1535
opt_label : Option < Label > ,
1536
- span_lo : Span ,
1536
+ lo : Span ,
1537
1537
mut attrs : AttrVec ,
1538
1538
) -> PResult < ' a , P < Expr > > {
1539
1539
let ( iattrs, body) = self . parse_inner_attrs_and_block ( ) ?;
1540
1540
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) )
1543
1542
}
1544
1543
1545
1544
fn eat_label ( & mut self ) -> Option < Label > {
1546
- if let Some ( ident ) = self . token . lifetime ( ) {
1545
+ self . token . lifetime ( ) . map ( |ident| {
1547
1546
let span = self . token . span ;
1548
1547
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
+ } )
1553
1550
}
1554
1551
1555
1552
/// Parses a `match ... { ... }` expression (`match` token already eaten).
0 commit comments