Skip to content

Commit a5759b7

Browse files
committed
[Lexer] Improve fix-it to remove "too long" delimiter in string literal
Fix-it to remove extra '#'s at once.
1 parent aaa4110 commit a5759b7

File tree

2 files changed

+16
-12
lines changed

2 files changed

+16
-12
lines changed

lib/Parse/Lexer.cpp

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1277,16 +1277,20 @@ static bool delimiterMatches(unsigned CustomDelimiterLen, const char *&BytesPtr,
12771277
if (!CustomDelimiterLen)
12781278
return true;
12791279
const char *TmpPtr = BytesPtr;
1280-
while (CustomDelimiterLen--)
1281-
if (!diagnoseZeroWidthMatchAndAdvance('#', TmpPtr, Diags))
1282-
return false;
1283-
BytesPtr = TmpPtr;
1284-
if (*BytesPtr == '#' && Diags)
1285-
Diags->diagnose(Lexer::getSourceLoc(BytesPtr), IsClosing ?
1286-
diag::lex_invalid_closing_delimiter :
1287-
diag::lex_invalid_escape_delimiter)
1288-
.fixItRemoveChars(Lexer::getSourceLoc(BytesPtr),
1289-
Lexer::getSourceLoc(BytesPtr + 1));
1280+
while (diagnoseZeroWidthMatchAndAdvance('#', TmpPtr, Diags)) {}
1281+
1282+
if (TmpPtr - BytesPtr < CustomDelimiterLen)
1283+
return false;
1284+
1285+
BytesPtr += CustomDelimiterLen;
1286+
1287+
if (Diags && TmpPtr > BytesPtr) {
1288+
Diag<> message = IsClosing ? diag::lex_invalid_closing_delimiter
1289+
: diag::lex_invalid_escape_delimiter;
1290+
Diags->diagnose(Lexer::getSourceLoc(BytesPtr), message)
1291+
.fixItRemoveChars(Lexer::getSourceLoc(BytesPtr),
1292+
Lexer::getSourceLoc(TmpPtr));
1293+
}
12901294
return true;
12911295
}
12921296

test/Parse/raw_string_errors.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ let _ = #"\##("invalid")"#
1212
let _ = ####"invalid"###
1313
// expected-error@-1{{unterminated string literal}}
1414
15-
let _ = ###"invalid"####
16-
// expected-error@-1{{too many '#' characters in closing delimiter}}
15+
let _ = ###"invalid"######
16+
// expected-error@-1{{too many '#' characters in closing delimiter}}{{24-27=}}
1717
// expected-error@-2{{consecutive statements on a line must be separated by ';'}}
1818
// expected-error@-3{{expected expression}}

0 commit comments

Comments
 (0)