@@ -595,10 +595,74 @@ 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, leftParen) = self . consume ( if: . backslash, followedBy: . leftParen) {
615+ var unexpectedTokens : [ RawSyntax ] = [ RawSyntax ( backslash) , RawSyntax ( leftParen) ]
616+
617+ let ( unexpectedBeforeRightParen, rightParen) = self . expect ( TokenSpec ( . rightParen, allowAtStartOfLine: false ) )
618+ unexpectedTokens += unexpectedBeforeRightParen? . elements ?? [ ]
619+ unexpectedTokens. append ( RawSyntax ( rightParen) )
620+
621+ unexpectedAfterContent = RawUnexpectedNodesSyntax (
622+ unexpectedTokens,
623+ arena: self . arena
624+ )
625+ }
626+
627+ segments. append ( RawStringSegmentSyntax ( content: stringSegment, unexpectedAfterContent, arena: self . arena) )
628+ } else {
629+ break
630+ }
631+ }
632+
633+ let ( unexpectedBetweenSegmentAndCloseQuote, closeQuote) = self . expect (
634+ anyIn: SimpleStringLiteralExprSyntax . CloseQuoteOptions. self,
635+ default: openQuote. closeTokenKind
636+ )
637+ let closeDelimiter = self . consume ( if: . rawStringDelimiter)
638+
639+ return RawSimpleStringLiteralExprSyntax (
640+ RawUnexpectedNodesSyntax ( combining: unexpectedBeforeOpenQuote, openDelimiter, arena: self . arena) ,
641+ openQuote: openQuote,
642+ segments: RawSimpleStringLiteralSegmentsSyntax ( elements: segments, arena: self . arena) ,
643+ unexpectedBetweenSegmentAndCloseQuote,
644+ closeQuote: closeQuote,
645+ RawUnexpectedNodesSyntax ( [ closeDelimiter] , arena: self . arena) ,
646+ arena: self . arena
647+ )
648+ }
598649}
599650
600651// MARK: - Utilities
601652
653+ fileprivate extension RawTokenSyntax {
654+ var closeTokenKind : SimpleStringLiteralExprSyntax . CloseQuoteOptions {
655+ switch self {
656+ case . multilineStringQuote:
657+ return . multilineStringQuote
658+ case . stringQuote:
659+ return . stringQuote
660+ default :
661+ return . stringQuote
662+ }
663+ }
664+ }
665+
602666fileprivate extension SyntaxText {
603667 private func hasSuffix( _ other: String ) -> Bool {
604668 var other = other
0 commit comments