diff options
author | Alexander Kornienko <alexfh@google.com> | 2017-04-11 09:55:00 +0000 |
---|---|---|
committer | Alexander Kornienko <alexfh@google.com> | 2017-04-11 09:55:00 +0000 |
commit | d4fa2e634876672a680a300442ed917761a8c3ff (patch) | |
tree | 7f4503b025bc11c7af8ebd4d3097fe07420945e4 /clang/lib/Format/FormatTokenLexer.cpp | |
parent | 4fc5f3c02e57136c7c4055bd2f83a56bb79d37e5 (diff) | |
download | bcm5719-llvm-d4fa2e634876672a680a300442ed917761a8c3ff.tar.gz bcm5719-llvm-d4fa2e634876672a680a300442ed917761a8c3ff.zip |
[clang-format] Handle NSString literals by merging tokens.
Summary:
This fixes a few outstanding bugs:
* incorrect breaking of NSString literals containing double-width characters;
* inconsistent formatting of ObjC dictionary literals containing NSString
literals;
* AlwaysBreakBeforeMultilineStrings ignoring implicitly-concatenated NSString
literals.
Reviewers: djasper
Reviewed By: djasper
Subscribers: klimek, cfe-commits
Differential Revision: https://reviews.llvm.org/D31706
llvm-svn: 299927
Diffstat (limited to 'clang/lib/Format/FormatTokenLexer.cpp')
-rw-r--r-- | clang/lib/Format/FormatTokenLexer.cpp | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/clang/lib/Format/FormatTokenLexer.cpp b/clang/lib/Format/FormatTokenLexer.cpp index 91c9af005a2..9415dbe9ab3 100644 --- a/clang/lib/Format/FormatTokenLexer.cpp +++ b/clang/lib/Format/FormatTokenLexer.cpp @@ -64,6 +64,8 @@ void FormatTokenLexer::tryMergePreviousTokens() { return; if (tryMergeLessLess()) return; + if (tryMergeNSStringLiteral()) + return; if (Style.Language == FormatStyle::LK_JavaScript) { static const tok::TokenKind JSIdentity[] = {tok::equalequal, tok::equal}; @@ -84,6 +86,22 @@ void FormatTokenLexer::tryMergePreviousTokens() { } } +bool FormatTokenLexer::tryMergeNSStringLiteral() { + if (Tokens.size() < 2) + return false; + auto &At = *(Tokens.end() - 2); + auto &String = *(Tokens.end() - 1); + if (!At->is(tok::at) || !String->is(tok::string_literal)) + return false; + At->Tok.setKind(tok::string_literal); + At->TokenText = StringRef(At->TokenText.begin(), + String->TokenText.end() - At->TokenText.begin()); + At->ColumnWidth += String->ColumnWidth; + At->Type = TT_ObjCStringLiteral; + Tokens.erase(Tokens.end() - 1); + return true; +} + bool FormatTokenLexer::tryMergeLessLess() { // Merge X,less,less,Y into X,lessless,Y unless X or Y is less. if (Tokens.size() < 3) |