aboutsummaryrefslogtreecommitdiff
path: root/clang/lib/Format/FormatTokenLexer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'clang/lib/Format/FormatTokenLexer.cpp')
-rw-r--r--clang/lib/Format/FormatTokenLexer.cpp29
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())