@@ -7,6 +7,7 @@ use intern::{
7
7
Symbol ,
8
8
sym:: { self } ,
9
9
} ;
10
+ use itertools:: Itertools ;
10
11
use mbe:: { DelimiterKind , expect_fragment} ;
11
12
use span:: { Edition , FileId , Span } ;
12
13
use stdx:: format_to;
@@ -681,11 +682,19 @@ fn relative_file(
681
682
}
682
683
683
684
fn parse_string ( tt : & tt:: TopSubtree ) -> Result < ( Symbol , Span ) , ExpandError > {
684
- let delimiter = tt. top_subtree ( ) . delimiter ;
685
- tt. iter ( )
686
- . next ( )
687
- . ok_or ( delimiter. open . cover ( delimiter. close ) )
688
- . and_then ( |tt| match tt {
685
+ let mut tt = TtElement :: Subtree ( tt. top_subtree ( ) , tt. iter ( ) ) ;
686
+ ( || {
687
+ // FIXME: We wrap expression fragments in parentheses which can break this expectation
688
+ // here
689
+ // Remove this once we handle none delims correctly
690
+ while let TtElement :: Subtree ( sub, tt_iter) = & mut tt
691
+ && let DelimiterKind :: Parenthesis | DelimiterKind :: Invisible = sub. delimiter . kind
692
+ {
693
+ tt =
694
+ tt_iter. exactly_one ( ) . map_err ( |_| sub. delimiter . open . cover ( sub. delimiter . close ) ) ?;
695
+ }
696
+
697
+ match tt {
689
698
TtElement :: Leaf ( tt:: Leaf :: Literal ( tt:: Literal {
690
699
symbol : text,
691
700
span,
@@ -698,35 +707,11 @@ fn parse_string(tt: &tt::TopSubtree) -> Result<(Symbol, Span), ExpandError> {
698
707
kind : tt:: LitKind :: StrRaw ( _) ,
699
708
suffix : _,
700
709
} ) ) => Ok ( ( text. clone ( ) , * span) ) ,
701
- // FIXME: We wrap expression fragments in parentheses which can break this expectation
702
- // here
703
- // Remove this once we handle none delims correctly
704
- TtElement :: Subtree ( tt, mut tt_iter)
705
- if tt. delimiter . kind == DelimiterKind :: Parenthesis =>
706
- {
707
- tt_iter
708
- . next ( )
709
- . and_then ( |tt| match tt {
710
- TtElement :: Leaf ( tt:: Leaf :: Literal ( tt:: Literal {
711
- symbol : text,
712
- span,
713
- kind : tt:: LitKind :: Str ,
714
- suffix : _,
715
- } ) ) => Some ( ( unescape_symbol ( text) , * span) ) ,
716
- TtElement :: Leaf ( tt:: Leaf :: Literal ( tt:: Literal {
717
- symbol : text,
718
- span,
719
- kind : tt:: LitKind :: StrRaw ( _) ,
720
- suffix : _,
721
- } ) ) => Some ( ( text. clone ( ) , * span) ) ,
722
- _ => None ,
723
- } )
724
- . ok_or ( delimiter. open . cover ( delimiter. close ) )
725
- }
726
710
TtElement :: Leaf ( l) => Err ( * l. span ( ) ) ,
727
711
TtElement :: Subtree ( tt, _) => Err ( tt. delimiter . open . cover ( tt. delimiter . close ) ) ,
728
- } )
729
- . map_err ( |span| ExpandError :: other ( span, "expected string literal" ) )
712
+ }
713
+ } ) ( )
714
+ . map_err ( |span| ExpandError :: other ( span, "expected string literal" ) )
730
715
}
731
716
732
717
fn include_expand (
0 commit comments