mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
Implement SE-0200 (extended escaping in string literals)
Supports string literals like #"foo"\n"bar"#.
This commit is contained in:
committed by
Brent Royal-Gordon
parent
5e2b705f6d
commit
4da8cbe655
@@ -216,8 +216,9 @@ static void getStringPartTokens(const Token &Tok, const LangOptions &LangOpts,
|
||||
const SourceManager &SM,
|
||||
int BufID, std::vector<Token> &Toks) {
|
||||
assert(Tok.is(tok::string_literal));
|
||||
bool IsMultiline = Tok.IsMultilineString();
|
||||
unsigned QuoteLen = IsMultiline ? 3 : 1;
|
||||
bool IsMultiline = Tok.isMultilineString();
|
||||
unsigned CustomDelimiterLen = Tok.getCustomDelimiterLen();
|
||||
unsigned QuoteLen = (IsMultiline ? 3 : 1) + CustomDelimiterLen;
|
||||
SmallVector<Lexer::StringSegment, 4> Segments;
|
||||
Lexer::getStringLiteralSegments(Tok, Segments, /*Diags=*/nullptr);
|
||||
for (unsigned i = 0, e = Segments.size(); i != e; ++i) {
|
||||
@@ -239,7 +240,8 @@ static void getStringPartTokens(const Token &Tok, const LangOptions &LangOpts,
|
||||
|
||||
StringRef Text = SM.extractText({ Loc, Len });
|
||||
Token NewTok;
|
||||
NewTok.setToken(tok::string_literal, Text, IsMultiline);
|
||||
NewTok.setToken(tok::string_literal, Text,
|
||||
IsMultiline, CustomDelimiterLen);
|
||||
Toks.push_back(NewTok);
|
||||
|
||||
} else {
|
||||
@@ -372,7 +374,7 @@ class TokenRecorder: public ConsumeTokenReceiver {
|
||||
}
|
||||
|
||||
void relexComment(CharSourceRange CommentRange,
|
||||
llvm::SmallVectorImpl<Token> &Scracth) {
|
||||
llvm::SmallVectorImpl<Token> &Scratch) {
|
||||
Lexer L(Ctx.LangOpts, Ctx.SourceMgr, BufferID, nullptr, /*InSILMode=*/false,
|
||||
HashbangMode::Disallowed,
|
||||
CommentRetentionMode::ReturnAsTokens,
|
||||
@@ -385,7 +387,7 @@ class TokenRecorder: public ConsumeTokenReceiver {
|
||||
if (Result.is(tok::eof))
|
||||
break;
|
||||
assert(Result.is(tok::comment));
|
||||
Scracth.push_back(Result);
|
||||
Scratch.push_back(Result);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user