@@ -7,6 +7,7 @@ use intern::{
77 Symbol ,
88 sym:: { self } ,
99} ;
10+ use itertools:: Itertools ;
1011use mbe:: { DelimiterKind , expect_fragment} ;
1112use span:: { Edition , FileId , Span } ;
1213use stdx:: format_to;
@@ -681,11 +682,19 @@ fn relative_file(
681682}
682683
683684fn 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 {
689698 TtElement :: Leaf ( tt:: Leaf :: Literal ( tt:: Literal {
690699 symbol : text,
691700 span,
@@ -698,35 +707,11 @@ fn parse_string(tt: &tt::TopSubtree) -> Result<(Symbol, Span), ExpandError> {
698707 kind : tt:: LitKind :: StrRaw ( _) ,
699708 suffix : _,
700709 } ) ) => 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- }
726710 TtElement :: Leaf ( l) => Err ( * l. span ( ) ) ,
727711 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" ) )
730715}
731716
732717fn include_expand (
0 commit comments