Skip to content

Commit f8e8fa5

Browse files
committed
Check for delimiter before lookahead in advanceIfMultilineStringDelimiter
Avoid doing an unnecessary lookahead if we're not even at a multiline delimiter. This also fixes an issue where we'd scan ahead on the next line for `#"\n`, although this was benign in practice since the delimiter check would have previously then failed afterwards.
1 parent df0831a commit f8e8fa5

File tree

1 file changed

+12
-9
lines changed

1 file changed

+12
-9
lines changed

Sources/SwiftParser/Lexer/Cursor.swift

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -814,11 +814,19 @@ extension Lexer.Cursor {
814814
openingRawStringDelimiters: Int?
815815
) -> Bool {
816816
precondition(self.previous == #"""#)
817+
818+
var delimEnd = self
819+
guard delimEnd.advance(matching: #"""#),
820+
case let delimLast = delimEnd,
821+
delimEnd.advance(matching: #"""#)
822+
else {
823+
return false
824+
}
825+
817826
// Test for single-line string literals that resemble multiline delimiter.
818-
var sameLineCloseCheck = self
819-
_ = sameLineCloseCheck.advance()
820827
if let openingRawStringDelimiters, openingRawStringDelimiters != 0 {
821828
// Scan if the current line contains `"` followed by `openingRawStringDelimiters` `#` characters
829+
var sameLineCloseCheck = delimLast
822830
while sameLineCloseCheck.is(notAt: "\r", "\n") {
823831
if sameLineCloseCheck.advance(matching: #"""#) {
824832
if sameLineCloseCheck.advanceIfStringDelimiter(delimiterLength: openingRawStringDelimiters) {
@@ -831,13 +839,8 @@ extension Lexer.Cursor {
831839
}
832840
}
833841

834-
var tmp = self
835-
if tmp.advance(matching: #"""#) && tmp.advance(matching: #"""#) {
836-
self = tmp
837-
return true
838-
}
839-
840-
return false
842+
self = delimEnd
843+
return true
841844
}
842845

843846
/// Read a single UTF-8 scalar, which may span multiple bytes.

0 commit comments

Comments
 (0)