@@ -1567,7 +1567,7 @@ where
1567
1567
}
1568
1568
alternative_patterns. push ( self . parse_patterns ( PatternPosition :: CaseClause ) ?) ;
1569
1569
}
1570
- let guard = self . parse_case_clause_guard ( false ) ?;
1570
+ let guard = self . parse_case_clause_guard ( ) ?;
1571
1571
let ( arr_s, arr_e) = self
1572
1572
. expect_one ( & Token :: RArrow )
1573
1573
. map_err ( |e| self . add_multi_line_clause_hint ( e) ) ?;
@@ -1615,65 +1615,65 @@ where
1615
1615
// if a
1616
1616
// if a < b
1617
1617
// if a < b || b < c
1618
- fn parse_case_clause_guard (
1619
- & mut self ,
1620
- nested : bool ,
1621
- ) -> Result < Option < UntypedClauseGuard > , ParseError > {
1622
- if self . maybe_one ( & Token :: If ) . is_some ( ) || nested {
1623
- let mut opstack = vec ! [ ] ;
1624
- let mut estack = vec ! [ ] ;
1625
- let mut last_op_start = 0 ;
1626
- let mut last_op_end = 0 ;
1627
- loop {
1628
- match self . parse_case_clause_guard_unit ( ) ? {
1629
- Some ( unit) => estack. push ( unit) ,
1630
- _ => {
1631
- if estack. is_empty ( ) {
1632
- return Ok ( None ) ;
1633
- } else {
1634
- return parse_error (
1635
- ParseErrorType :: OpNakedRight ,
1636
- SrcSpan {
1637
- start : last_op_start,
1638
- end : last_op_end,
1639
- } ,
1640
- ) ;
1641
- }
1642
- }
1643
- }
1618
+ fn parse_case_clause_guard ( & mut self ) -> Result < Option < UntypedClauseGuard > , ParseError > {
1619
+ if self . maybe_one ( & Token :: If ) . is_some ( ) {
1620
+ self . parse_clause_guard_inner ( )
1621
+ } else {
1622
+ Ok ( None )
1623
+ }
1624
+ }
1644
1625
1645
- if let Some ( ( op_s , t , op_e ) ) = self . tok0 . take ( ) {
1646
- match t . guard_precedence ( ) {
1647
- Some ( p ) => {
1648
- // Is Op
1649
- self . advance ( ) ;
1650
- last_op_start = op_s ;
1651
- last_op_end = op_e ;
1652
- let _ = handle_op (
1653
- Some ( ( ( op_s , t , op_e ) , p ) ) ,
1654
- & mut opstack ,
1655
- & mut estack ,
1656
- & do_reduce_clause_guard ,
1657
- ) ;
1658
- }
1659
- _ => {
1660
- // Is not Op
1661
- self . tok0 = Some ( ( op_s , t , op_e ) ) ;
1662
- break ;
1663
- }
1626
+ fn parse_clause_guard_inner ( & mut self ) -> Result < Option < UntypedClauseGuard > , ParseError > {
1627
+ let mut opstack = vec ! [ ] ;
1628
+ let mut estack = vec ! [ ] ;
1629
+ let mut last_op_start = 0 ;
1630
+ let mut last_op_end = 0 ;
1631
+ loop {
1632
+ match self . parse_case_clause_guard_unit ( ) ? {
1633
+ Some ( unit ) => estack . push ( unit ) ,
1634
+ _ => {
1635
+ if estack . is_empty ( ) {
1636
+ return Ok ( None ) ;
1637
+ } else {
1638
+ return parse_error (
1639
+ ParseErrorType :: OpNakedRight ,
1640
+ SrcSpan {
1641
+ start : last_op_start ,
1642
+ end : last_op_end ,
1643
+ } ,
1644
+ ) ;
1664
1645
}
1665
1646
}
1666
1647
}
1667
1648
1668
- Ok ( handle_op (
1669
- None ,
1649
+ let Some ( ( op_s, t, op_e) ) = self . tok0 . take ( ) else {
1650
+ break ;
1651
+ } ;
1652
+
1653
+ let Some ( precedence) = t. guard_precedence ( ) else {
1654
+ // Is not Op
1655
+ self . tok0 = Some ( ( op_s, t, op_e) ) ;
1656
+ break ;
1657
+ } ;
1658
+
1659
+ // Is Op
1660
+ self . advance ( ) ;
1661
+ last_op_start = op_s;
1662
+ last_op_end = op_e;
1663
+ let _ = handle_op (
1664
+ Some ( ( ( op_s, t, op_e) , precedence) ) ,
1670
1665
& mut opstack,
1671
1666
& mut estack,
1672
1667
& do_reduce_clause_guard,
1673
- ) )
1674
- } else {
1675
- Ok ( None )
1668
+ ) ;
1676
1669
}
1670
+
1671
+ Ok ( handle_op (
1672
+ None ,
1673
+ & mut opstack,
1674
+ & mut estack,
1675
+ & do_reduce_clause_guard,
1676
+ ) )
1677
1677
}
1678
1678
1679
1679
/// Checks if we have an unexpected left parenthesis and returns appropriate
@@ -1808,13 +1808,15 @@ where
1808
1808
}
1809
1809
}
1810
1810
}
1811
+
1811
1812
Some ( ( _, Token :: LeftBrace , _) ) => {
1812
1813
// Nested guard expression
1813
1814
self . advance ( ) ;
1814
- let guard = self . parse_case_clause_guard ( true ) ;
1815
+ let guard = self . parse_clause_guard_inner ( ) ;
1815
1816
let _ = self . expect_one ( & Token :: RightBrace ) ?;
1816
1817
guard
1817
1818
}
1819
+
1818
1820
t0 => {
1819
1821
self . tok0 = t0;
1820
1822
match self . parse_const_value ( ) ? {
@@ -3583,7 +3585,7 @@ where
3583
3585
// Parse Helpers
3584
3586
//
3585
3587
3586
- // Expect a particular token, advances the token stream
3588
+ /// Expect a particular token, advances the token stream
3587
3589
fn expect_one ( & mut self , wanted : & Token ) -> Result < ( u32 , u32 ) , ParseError > {
3588
3590
match self . maybe_one ( wanted) {
3589
3591
Some ( ( start, end) ) => Ok ( ( start, end) ) ,
0 commit comments