Skip to content

Commit fd33cca

Browse files
committed
[clang-format] Fix AlignConsecutiveAssignments breaking lambda formatting.
Fixes llvm#52772. This patch fixes the formatting of the code: ``` auto aaaaaaaaaaaaaaaaaaaaa = {}; auto b = g([] { return; }); ``` which should be left as is, but before this patch was formatted to: ``` auto aaaaaaaaaaaaaaaaaaaaa = {}; auto b = g([] { return; }); ``` Reviewed By: MyDeveloperDay, HazardyKnusperkeks Differential Revision: https://reviews.llvm.org/D115972
1 parent 4d38d76 commit fd33cca

File tree

2 files changed

+55
-2
lines changed

2 files changed

+55
-2
lines changed

clang/lib/Format/WhitespaceManager.cpp

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -344,6 +344,10 @@ AlignTokenSequence(const FormatStyle &Style, unsigned Start, unsigned End,
344344
if (Changes[ScopeStart - 1].Tok->is(TT_FunctionDeclarationName))
345345
return true;
346346

347+
// Lambda.
348+
if (Changes[ScopeStart - 1].Tok->is(TT_LambdaLBrace))
349+
return false;
350+
347351
// Continued function declaration
348352
if (ScopeStart > Start + 1 &&
349353
Changes[ScopeStart - 2].Tok->is(TT_FunctionDeclarationName))
@@ -352,8 +356,13 @@ AlignTokenSequence(const FormatStyle &Style, unsigned Start, unsigned End,
352356
// Continued function call
353357
if (ScopeStart > Start + 1 &&
354358
Changes[ScopeStart - 2].Tok->is(tok::identifier) &&
355-
Changes[ScopeStart - 1].Tok->is(tok::l_paren))
359+
Changes[ScopeStart - 1].Tok->is(tok::l_paren) &&
360+
Changes[ScopeStart].Tok->isNot(TT_LambdaLSquare)) {
361+
if (Changes[i].Tok->MatchingParen &&
362+
Changes[i].Tok->MatchingParen->is(TT_LambdaLBrace))
363+
return false;
356364
return Style.BinPackArguments;
365+
}
357366

358367
// Ternary operator
359368
if (Changes[i].Tok->is(TT_ConditionalExpr))
@@ -372,8 +381,15 @@ AlignTokenSequence(const FormatStyle &Style, unsigned Start, unsigned End,
372381
if (ScopeStart > Start + 1 &&
373382
Changes[ScopeStart - 2].Tok->isNot(tok::identifier) &&
374383
Changes[ScopeStart - 1].Tok->is(tok::l_brace) &&
375-
Changes[i].Tok->isNot(tok::r_brace))
384+
Changes[i].Tok->isNot(tok::r_brace)) {
385+
for (unsigned OuterScopeStart : llvm::reverse(ScopeStack)) {
386+
// Lambda.
387+
if (OuterScopeStart > Start &&
388+
Changes[OuterScopeStart - 1].Tok->is(TT_LambdaLBrace))
389+
return false;
390+
}
376391
return true;
392+
}
377393

378394
return false;
379395
};

clang/unittests/Format/FormatTest.cpp

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16571,6 +16571,43 @@ TEST_F(FormatTest, AlignConsecutiveAssignments) {
1657116571
"int yy = 1; ///specificlennospace\n"
1657216572
"int zzz = 2;\n",
1657316573
Alignment));
16574+
16575+
verifyFormat("auto aaaaaaaaaaaaaaaaaaaaa = {};\n"
16576+
"auto b = [] {\n"
16577+
" f();\n"
16578+
" return;\n"
16579+
"};",
16580+
Alignment);
16581+
verifyFormat("auto aaaaaaaaaaaaaaaaaaaaa = {};\n"
16582+
"auto b = g([] {\n"
16583+
" f();\n"
16584+
" return;\n"
16585+
"});",
16586+
Alignment);
16587+
verifyFormat("auto aaaaaaaaaaaaaaaaaaaaa = {};\n"
16588+
"auto b = g(param, [] {\n"
16589+
" f();\n"
16590+
" return;\n"
16591+
"});",
16592+
Alignment);
16593+
verifyFormat("auto aaaaaaaaaaaaaaaaaaaaa = {};\n"
16594+
"auto b = [] {\n"
16595+
" if (condition) {\n"
16596+
" return;\n"
16597+
" }\n"
16598+
"};",
16599+
Alignment);
16600+
16601+
verifyFormat("auto b = f(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
16602+
" ccc ? aaaaa : bbbbb,\n"
16603+
" dddddddddddddddddddddddddd);",
16604+
Alignment);
16605+
// FIXME: https://llvm.org/PR53497
16606+
// verifyFormat("auto aaaaaaaaaaaa = f();\n"
16607+
// "auto b = f(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
16608+
// " ccc ? aaaaa : bbbbb,\n"
16609+
// " dddddddddddddddddddddddddd);",
16610+
// Alignment);
1657416611
}
1657516612

1657616613
TEST_F(FormatTest, AlignConsecutiveBitFields) {

0 commit comments

Comments
 (0)