@@ -593,10 +593,59 @@ extension Parser {
593593 )
594594 }
595595 }
596+
597+ mutating func parseSimpleString( ) -> RawSimpleStringLiteralExprSyntax {
598+ let openDelimiter = self . consume ( if: . rawStringDelimiter)
599+ let ( unexpectedBeforeOpenQuote, openQuote) = self . expect ( anyIn: SimpleStringLiteralExprSyntax . OpenQuoteOptions. self, default: . stringQuote)
600+
601+ /// Parse segments.
602+ var segments : [ RawStringSegmentSyntax ] = [ ]
603+ var loopProgress = LoopProgressCondition ( )
604+ while loopProgress. evaluate ( self . currentToken) {
605+ // If we encounter a token with leading trivia, we're no longer in the
606+ // string literal.
607+ guard currentToken. leadingTriviaText. isEmpty else { break }
608+
609+ if let stringSegment = self . consume ( if: . stringSegment, TokenSpec ( . identifier, remapping: . stringSegment) ) {
610+ segments. append ( RawStringSegmentSyntax ( content: stringSegment, arena: self . arena) )
611+ } else {
612+ break
613+ }
614+ }
615+
616+ let ( unexpectedBetweenSegmentAndCloseQuote, closeQuote) = self . expect (
617+ anyIn: SimpleStringLiteralExprSyntax . CloseQuoteOptions. self,
618+ default: openQuote. closeTokenKind
619+ )
620+ let closeDelimiter = self . consume ( if: . rawStringDelimiter)
621+
622+ return RawSimpleStringLiteralExprSyntax (
623+ RawUnexpectedNodesSyntax ( combining: unexpectedBeforeOpenQuote, openDelimiter, arena: self . arena) ,
624+ openQuote: openQuote,
625+ segments: RawSimpleStringLiteralSegmentsSyntax ( elements: segments, arena: self . arena) ,
626+ unexpectedBetweenSegmentAndCloseQuote,
627+ closeQuote: closeQuote,
628+ RawUnexpectedNodesSyntax ( [ closeDelimiter] , arena: self . arena) ,
629+ arena: self . arena
630+ )
631+ }
596632}
597633
598634// MARK: - Utilities
599635
636+ fileprivate extension RawTokenSyntax {
637+ var closeTokenKind : SimpleStringLiteralExprSyntax . CloseQuoteOptions {
638+ switch self {
639+ case . multilineStringQuote:
640+ return . multilineStringQuote
641+ case . stringQuote:
642+ return . stringQuote
643+ default :
644+ fatalError ( " Unsupported type " )
645+ }
646+ }
647+ }
648+
600649fileprivate extension SyntaxText {
601650 private func hasSuffix( _ other: String ) -> Bool {
602651 var other = other
0 commit comments