@@ -595,10 +595,80 @@ extension Parser {
595595 )
596596 }
597597 }
598+
599+ mutating func parseSimpleString( ) -> RawSimpleStringLiteralExprSyntax {
600+ let openDelimiter = self . consume ( if: . rawStringDelimiter)
601+ let ( unexpectedBeforeOpenQuote, openQuote) = self . expect ( anyIn: SimpleStringLiteralExprSyntax . OpenQuoteOptions. self, default: . stringQuote)
602+
603+ /// Parse segments.
604+ var segments : [ RawStringSegmentSyntax ] = [ ]
605+ var loopProgress = LoopProgressCondition ( )
606+ while loopProgress. evaluate ( self . currentToken) {
607+ // If we encounter a token with leading trivia, we're no longer in the
608+ // string literal.
609+ guard currentToken. leadingTriviaText. isEmpty else { break }
610+
611+ if let stringSegment = self . consume ( if: . stringSegment, TokenSpec ( . identifier, remapping: . stringSegment) ) {
612+ var unexpectedAfterContent : RawUnexpectedNodesSyntax ?
613+
614+ if let backslash = self . consume ( if: . backslash) {
615+ var tokens : [ RawTokenSyntax ] = [ backslash]
616+
617+ var interpolationLoopProgress = LoopProgressCondition ( )
618+ while interpolationLoopProgress. evaluate ( self . currentToken) {
619+ if let rightParen = self . consume ( if: TokenSpec . rightParen) {
620+ tokens += [ rightParen]
621+ break
622+ } else {
623+ tokens += [ self . consumeAnyToken ( ) ]
624+ }
625+ }
626+
627+ unexpectedAfterContent = RawUnexpectedNodesSyntax (
628+ tokens,
629+ arena: self . arena
630+ )
631+ }
632+
633+ segments. append ( RawStringSegmentSyntax ( content: stringSegment, unexpectedAfterContent, arena: self . arena) )
634+ } else {
635+ break
636+ }
637+ }
638+
639+ let ( unexpectedBetweenSegmentAndCloseQuote, closeQuote) = self . expect (
640+ anyIn: SimpleStringLiteralExprSyntax . CloseQuoteOptions. self,
641+ default: openQuote. closeTokenKind
642+ )
643+ let closeDelimiter = self . consume ( if: . rawStringDelimiter)
644+
645+ return RawSimpleStringLiteralExprSyntax (
646+ RawUnexpectedNodesSyntax ( combining: unexpectedBeforeOpenQuote, openDelimiter, arena: self . arena) ,
647+ openQuote: openQuote,
648+ segments: RawSimpleStringLiteralSegmentsSyntax ( elements: segments, arena: self . arena) ,
649+ unexpectedBetweenSegmentAndCloseQuote,
650+ closeQuote: closeQuote,
651+ RawUnexpectedNodesSyntax ( [ closeDelimiter] , arena: self . arena) ,
652+ arena: self . arena
653+ )
654+ }
598655}
599656
600657// MARK: - Utilities
601658
659+ fileprivate extension RawTokenSyntax {
660+ var closeTokenKind : SimpleStringLiteralExprSyntax . CloseQuoteOptions {
661+ switch self {
662+ case . multilineStringQuote:
663+ return . multilineStringQuote
664+ case . stringQuote:
665+ return . stringQuote
666+ default :
667+ fatalError ( " Unsupported type " )
668+ }
669+ }
670+ }
671+
602672fileprivate extension SyntaxText {
603673 private func hasSuffix( _ other: String ) -> Bool {
604674 var other = other
0 commit comments