@@ -907,7 +907,9 @@ extension Parser {
907
907
at: openDelimiter != nil ? . leadingRaw : . leading,
908
908
text: text
909
909
) ?? RawTokenSyntax ( missing: . stringQuote, arena: arena)
910
- text = text. dropFirst ( openQuote. tokenText. count)
910
+ if !openQuote. isMissing {
911
+ text = text. dropFirst ( openQuote. tokenText. count)
912
+ }
911
913
912
914
/// Parse segments.
913
915
let ( segments, closeStart) = self . parseStringLiteralSegments (
@@ -917,16 +919,31 @@ extension Parser {
917
919
/// Parse close quote.
918
920
let closeQuote = self . parseStringLiteralQuote (
919
921
at: openDelimiter != nil ? . trailingRaw : . trailing,
920
- text: text [ closeStart ... ]
922
+ text: text
921
923
) ?? RawTokenSyntax ( missing: openQuote. tokenKind, arena: arena)
922
- text = text. dropFirst ( closeQuote. byteLength)
923
-
924
+ if !closeQuote. isMissing {
925
+ text = text. dropFirst ( closeQuote. tokenText. count)
926
+ }
924
927
/// Parse closing raw string delimiter if exist.
925
- let closeDelimiter = self . parseStringLiteralDelimiter ( at: . trailing, text: text)
928
+ let closeDelimiter : RawTokenSyntax ?
929
+ if let delimiter = self . parseStringLiteralDelimiter (
930
+ at: . trailing,
931
+ text: text
932
+ ) {
933
+ closeDelimiter = delimiter
934
+ } else if let openDelimiter = openDelimiter {
935
+ closeDelimiter = RawTokenSyntax (
936
+ missing: . rawStringDelimiter,
937
+ text: openDelimiter. tokenText,
938
+ arena: arena
939
+ )
940
+ } else {
941
+ closeDelimiter = nil
942
+ }
926
943
assert ( ( openDelimiter == nil ) == ( closeDelimiter == nil ) ,
927
944
" existence of open/close delimiter should match " )
928
- if let closeDelimiter = closeDelimiter {
929
- text = text. dropFirst ( closeDelimiter. tokenText . count )
945
+ if let closeDelimiter = closeDelimiter, !closeDelimiter . isMissing {
946
+ text = text. dropFirst ( closeDelimiter. byteLength )
930
947
}
931
948
932
949
assert ( text. isEmpty,
@@ -1060,7 +1077,10 @@ extension Parser {
1060
1077
// position == .leadingRaw implies that we saw a `#` before the quote.
1061
1078
// A multiline string literal must always start its contents on a new line.
1062
1079
// Thus we are parsing somethign like #"""#, which is not a multiline string literal but a raw literal containing a single quote.
1063
- if position == . leadingRaw && text [ index] == UInt8 ( ascii: " # " ) {
1080
+ if position == . leadingRaw,
1081
+ index < text. endIndex,
1082
+ text [ index] == UInt8 ( ascii: " # " )
1083
+ {
1064
1084
quoteCount = 1
1065
1085
index = text. index ( text. startIndex, offsetBy: quoteCount)
1066
1086
}
0 commit comments