@@ -1543,15 +1543,16 @@ impl<'a> Parser<'a> {
1543
1543
&& ( matches ! ( self . token. kind, token:: CloseDelim ( _) | token:: Comma )
1544
1544
|| self . token . is_op ( ) )
1545
1545
{
1546
- let lit = self . recover_unclosed_char ( label_. ident , |self_| {
1547
- self_. sess . create_err ( UnexpectedTokenAfterLabel {
1548
- span : self_. token . span ,
1549
- remove_label : None ,
1550
- enclose_in_block : None ,
1551
- } )
1552
- } ) ;
1546
+ let ( lit, _) =
1547
+ self . recover_unclosed_char ( label_. ident , Parser :: mk_token_lit_char, |self_| {
1548
+ self_. sess . create_err ( UnexpectedTokenAfterLabel {
1549
+ span : self_. token . span ,
1550
+ remove_label : None ,
1551
+ enclose_in_block : None ,
1552
+ } )
1553
+ } ) ;
1553
1554
consume_colon = false ;
1554
- Ok ( self . mk_expr ( lo, ExprKind :: Lit ( lit. as_token_lit ( ) ) ) )
1555
+ Ok ( self . mk_expr ( lo, ExprKind :: Lit ( lit) ) )
1555
1556
} else if !ate_colon
1556
1557
&& ( self . check_noexpect ( & TokenKind :: Comma ) || self . check_noexpect ( & TokenKind :: Gt ) )
1557
1558
{
@@ -1626,12 +1627,13 @@ impl<'a> Parser<'a> {
1626
1627
Ok ( expr)
1627
1628
}
1628
1629
1629
- /// Emit an error when a char is parsed as a lifetime because of a missing quote
1630
- pub ( super ) fn recover_unclosed_char (
1630
+ /// Emit an error when a char is parsed as a lifetime because of a missing quote.
1631
+ pub ( super ) fn recover_unclosed_char < L > (
1631
1632
& self ,
1632
1633
lifetime : Ident ,
1634
+ mk_lit_char : impl FnOnce ( Symbol , Span ) -> L ,
1633
1635
err : impl FnOnce ( & Self ) -> DiagnosticBuilder < ' a , ErrorGuaranteed > ,
1634
- ) -> ast :: MetaItemLit {
1636
+ ) -> L {
1635
1637
if let Some ( mut diag) =
1636
1638
self . sess . span_diagnostic . steal_diagnostic ( lifetime. span , StashKey :: LifetimeIsChar )
1637
1639
{
@@ -1653,12 +1655,7 @@ impl<'a> Parser<'a> {
1653
1655
. emit ( ) ;
1654
1656
}
1655
1657
let name = lifetime. without_first_quote ( ) . name ;
1656
- ast:: MetaItemLit {
1657
- symbol : name,
1658
- suffix : None ,
1659
- kind : ast:: LitKind :: Char ( name. as_str ( ) . chars ( ) . next ( ) . unwrap_or ( '_' ) ) ,
1660
- span : lifetime. span ,
1661
- }
1658
+ mk_lit_char ( name, lifetime. span )
1662
1659
}
1663
1660
1664
1661
/// Recover on the syntax `do catch { ... }` suggesting `try { ... }` instead.
@@ -1785,7 +1782,23 @@ impl<'a> Parser<'a> {
1785
1782
}
1786
1783
}
1787
1784
1788
- fn handle_missing_lit ( & mut self ) -> PResult < ' a , MetaItemLit > {
1785
+ pub ( crate ) fn mk_token_lit_char ( name : Symbol , span : Span ) -> ( token:: Lit , Span ) {
1786
+ ( token:: Lit { symbol : name, suffix : None , kind : token:: Char } , span)
1787
+ }
1788
+
1789
+ fn mk_meta_item_lit_char ( name : Symbol , span : Span ) -> MetaItemLit {
1790
+ ast:: MetaItemLit {
1791
+ symbol : name,
1792
+ suffix : None ,
1793
+ kind : ast:: LitKind :: Char ( name. as_str ( ) . chars ( ) . next ( ) . unwrap_or ( '_' ) ) ,
1794
+ span,
1795
+ }
1796
+ }
1797
+
1798
+ fn handle_missing_lit < L > (
1799
+ & mut self ,
1800
+ mk_lit_char : impl FnOnce ( Symbol , Span ) -> L ,
1801
+ ) -> PResult < ' a , L > {
1789
1802
if let token:: Interpolated ( inner) = & self . token . kind {
1790
1803
let expr = match inner. as_ref ( ) {
1791
1804
token:: NtExpr ( expr) => Some ( expr) ,
@@ -1809,7 +1822,7 @@ impl<'a> Parser<'a> {
1809
1822
// On an error path, eagerly consider a lifetime to be an unclosed character lit
1810
1823
if self . token . is_lifetime ( ) {
1811
1824
let lt = self . expect_lifetime ( ) ;
1812
- Ok ( self . recover_unclosed_char ( lt. ident , err) )
1825
+ Ok ( self . recover_unclosed_char ( lt. ident , mk_lit_char , err) )
1813
1826
} else {
1814
1827
Err ( err ( self ) )
1815
1828
}
@@ -1818,11 +1831,13 @@ impl<'a> Parser<'a> {
1818
1831
pub ( super ) fn parse_token_lit ( & mut self ) -> PResult < ' a , ( token:: Lit , Span ) > {
1819
1832
self . parse_opt_token_lit ( )
1820
1833
. ok_or ( ( ) )
1821
- . or_else ( |( ) | self . handle_missing_lit ( ) . map ( |lit| ( lit . as_token_lit ( ) , lit . span ) ) )
1834
+ . or_else ( |( ) | self . handle_missing_lit ( Parser :: mk_token_lit_char ) )
1822
1835
}
1823
1836
1824
1837
pub ( super ) fn parse_meta_item_lit ( & mut self ) -> PResult < ' a , MetaItemLit > {
1825
- self . parse_opt_meta_item_lit ( ) . ok_or ( ( ) ) . or_else ( |( ) | self . handle_missing_lit ( ) )
1838
+ self . parse_opt_meta_item_lit ( )
1839
+ . ok_or ( ( ) )
1840
+ . or_else ( |( ) | self . handle_missing_lit ( Parser :: mk_meta_item_lit_char) )
1826
1841
}
1827
1842
1828
1843
fn recover_after_dot ( & mut self ) -> Option < Token > {
0 commit comments