Skip to content

Commit 562def1

Browse files
committed
handle lambdas
1 parent ae05954 commit 562def1

File tree

2 files changed

+27
-6
lines changed

2 files changed

+27
-6
lines changed

clang/lib/Format/ContinuationIndenter.cpp

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -813,6 +813,20 @@ void ContinuationIndenter::addTokenOnCurrentLine(LineState &State, bool DryRun,
813813
Tok.Previous->Previous->Previous &&
814814
Tok.Previous->Previous->Previous->is(TT_FunctionDeclarationName)));
815815
};
816+
const auto IsLambdaParameterList = [](const FormatToken *Left) {
817+
// adapted from TokenAnnotator.cpp:isLambdaParameterList()
818+
// Skip <...> if present.
819+
if (Left->Previous && Left->Previous->is(tok::greater) &&
820+
Left->Previous->MatchingParen &&
821+
Left->Previous->MatchingParen->is(TT_TemplateOpener)) {
822+
Left = Left->Previous->MatchingParen;
823+
}
824+
825+
// Check for `[...]`.
826+
return Left->Previous && Left->Previous->is(tok::r_square) &&
827+
Left->Previous->MatchingParen &&
828+
Left->Previous->MatchingParen->is(TT_LambdaLSquare);
829+
};
816830
const auto IsFunctionCallParen = [&](const FormatToken &Tok) {
817831
return Tok.is(tok::l_paren) && Tok.ParameterCount > 0 && Tok.Previous &&
818832
Tok.Previous->is(tok::identifier);
@@ -828,18 +842,18 @@ void ContinuationIndenter::addTokenOnCurrentLine(LineState &State, bool DryRun,
828842
}
829843
return false;
830844
};
845+
// Identifies simple (no expression) one-argument function calls.
831846
const auto IsNotSimpleFunction = [&](const FormatToken &Tok) {
832847
const auto *Previous = Tok.Previous;
833848
const auto *Next = Tok.Next;
834849
if (Tok.FakeLParens.size() > 0 && Tok.FakeLParens.back() > prec::Unknown)
835850
return true;
836851
if (Previous &&
837-
(IsFunctionDeclParen(*Previous) || IsFunctionCallParen(*Previous))) {
838-
if (!IsOpeningBracket(Tok) && Next && !Next->isMemberAccess() &&
839-
!IsInTemplateString(Tok) && !IsFunctionDeclParen(*Next) &&
840-
!IsFunctionCallParen(*Next)) {
841-
return true;
842-
}
852+
(IsFunctionDeclParen(*Previous) || IsFunctionCallParen(*Previous) ||
853+
IsLambdaParameterList(Previous))) {
854+
return !IsOpeningBracket(Tok) && Next && !Next->isMemberAccess() &&
855+
!IsInTemplateString(Tok) && !IsFunctionDeclParen(*Next) &&
856+
!IsFunctionCallParen(*Next);
843857
}
844858
return false;
845859
};

clang/unittests/Format/FormatTest.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9356,6 +9356,13 @@ TEST_F(FormatTest, AlignsAfterOpenBracket) {
93569356
" \"a aaaaaaa aaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaa aaaaaaaaaaaaa\"\n"
93579357
");",
93589358
Style);
9359+
verifyFormat(
9360+
"auto lambda =\n"
9361+
" [&b](\n"
9362+
" auto "
9363+
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
9364+
" ) {};",
9365+
Style);
93599366
}
93609367

93619368
TEST_F(FormatTest, ParenthesesAndOperandAlignment) {

0 commit comments

Comments
 (0)