diff options
Diffstat (limited to 'clang/lib/Format/FormatTokenLexer.cpp')
-rw-r--r-- | clang/lib/Format/FormatTokenLexer.cpp | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/clang/lib/Format/FormatTokenLexer.cpp b/clang/lib/Format/FormatTokenLexer.cpp index 5c4e1f8..a4c94ac 100644 --- a/clang/lib/Format/FormatTokenLexer.cpp +++ b/clang/lib/Format/FormatTokenLexer.cpp @@ -128,6 +128,12 @@ void FormatTokenLexer::tryMergePreviousTokens() { if (Style.isCpp() && tryTransformTryUsageForC()) return; + if ((Style.Language == FormatStyle::LK_Cpp || + Style.Language == FormatStyle::LK_ObjC) && + tryMergeUserDefinedLiteral()) { + return; + } + if (Style.isJavaScript() || Style.isCSharp()) { static const tok::TokenKind NullishCoalescingOperator[] = {tok::question, tok::question}; @@ -559,6 +565,29 @@ bool FormatTokenLexer::tryMergeGreaterGreater() { return true; } +bool FormatTokenLexer::tryMergeUserDefinedLiteral() { + if (Tokens.size() < 2) + return false; + + auto *First = Tokens.end() - 2; + auto &Suffix = First[1]; + if (Suffix->hasWhitespaceBefore() || Suffix->TokenText != "$") + return false; + + auto &Literal = First[0]; + if (!Literal->Tok.isLiteral()) + return false; + + auto &Text = Literal->TokenText; + if (!Text.ends_with("_")) + return false; + + Text = StringRef(Text.data(), Text.size() + 1); + ++Literal->ColumnWidth; + Tokens.erase(&Suffix); + return true; +} + bool FormatTokenLexer::tryMergeTokens(ArrayRef<tok::TokenKind> Kinds, TokenType NewType) { if (Tokens.size() < Kinds.size()) |