Skip to content

Commit 21cae1c

Browse files
committed
Generalize raw string closing delimiter parsing logic
Generalize in preparation for its use by regex literals.
1 parent 3ea29ea commit 21cae1c

File tree

1 file changed

+11
-7
lines changed

1 file changed

+11
-7
lines changed

Sources/SwiftParser/StringLiterals.swift

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -426,16 +426,20 @@ extension Parser {
426426
// MARK: - Parse string literals
427427

428428
extension Parser {
429-
/// Consumes a raw string delimiter that has the same number of `#` as `openDelimiter`.
430-
private mutating func parseStringDelimiter(openDelimiter: RawTokenSyntax?) -> (unexpectedBeforeCheckedDelimiter: RawUnexpectedNodesSyntax?, checkedDelimiter: RawTokenSyntax?) {
429+
/// Consumes a raw string or extended regex delimiter that has the same
430+
/// number of `#` as `openDelimiter`.
431+
mutating func parsePoundDelimiter(
432+
_ kind: RawTokenKind,
433+
matching openDelimiter: RawTokenSyntax?
434+
) -> (unexpectedBeforeCheckedDelimiter: RawUnexpectedNodesSyntax?, checkedDelimiter: RawTokenSyntax?) {
431435
// Check for leadingTriviaText == "" so we don't consume the leading raw
432436
// string delimiter of an upcoming string literal, e.g. in
433437
// ```
434438
// "normal literal"
435439
// #"raw literal"#
436440
// ```
437441
let delimiter: RawTokenSyntax?
438-
if self.at(.rawStringDelimiter) && self.currentToken.leadingTriviaText == "" {
442+
if self.at(TokenSpec(kind)) && self.currentToken.leadingTriviaText == "" {
439443
delimiter = self.consumeAnyToken()
440444
} else {
441445
delimiter = nil
@@ -445,14 +449,14 @@ extension Parser {
445449
case (nil, nil):
446450
return (nil, nil)
447451
case (let open?, nil):
448-
return (nil, missingToken(.rawStringDelimiter, text: open.tokenText))
452+
return (nil, missingToken(kind, text: open.tokenText))
449453
case (nil, .some):
450454
return (RawUnexpectedNodesSyntax([delimiter], arena: self.arena), nil)
451455
case (let open?, let close?):
452456
if open.tokenText == close.tokenText {
453457
return (nil, close)
454458
} else {
455-
return (RawUnexpectedNodesSyntax([delimiter], arena: self.arena), missingToken(.rawStringDelimiter, text: open.tokenText))
459+
return (RawUnexpectedNodesSyntax([delimiter], arena: self.arena), missingToken(kind, text: open.tokenText))
456460
}
457461
}
458462
}
@@ -482,7 +486,7 @@ extension Parser {
482486
if let stringSegment = self.consume(if: .stringSegment) {
483487
segments.append(.stringSegment(RawStringSegmentSyntax(content: stringSegment, arena: self.arena)))
484488
} else if let backslash = self.consume(if: .backslash) {
485-
let (unexpectedBeforeDelimiter, delimiter) = self.parseStringDelimiter(openDelimiter: openDelimiter)
489+
let (unexpectedBeforeDelimiter, delimiter) = self.parsePoundDelimiter(.rawStringDelimiter, matching: openDelimiter)
486490
let leftParen = self.expectWithoutRecoveryOrLeadingTrivia(.leftParen)
487491
let expressions = RawTupleExprElementListSyntax(elements: self.parseArgumentListElements(pattern: .none), arena: self.arena)
488492

@@ -546,7 +550,7 @@ extension Parser {
546550
closeQuote = self.expectWithoutRecoveryOrLeadingTrivia(TokenSpec(openQuote.tokenKind))
547551
}
548552

549-
let (unexpectedBeforeCloseDelimiter, closeDelimiter) = self.parseStringDelimiter(openDelimiter: openDelimiter)
553+
let (unexpectedBeforeCloseDelimiter, closeDelimiter) = self.parsePoundDelimiter(.rawStringDelimiter, matching: openDelimiter)
550554

551555
if openQuote.tokenKind == .multilineStringQuote, !openQuote.isMissing, !closeQuote.isMissing {
552556
let postProcessed = postProcessMultilineStringLiteral(rawStringDelimitersToken: openDelimiter, openQuote: openQuote, segments: segments, closeQuote: closeQuote)

0 commit comments

Comments
 (0)