[clang] cdbe296 - [clang-format] Fix lambda formatting in conditional
Björn Schäpers via cfe-commits
cfe-commits at lists.llvm.org
Thu Nov 3 05:09:18 PDT 2022
Author: Björn Schäpers
Date: 2022-11-03T13:08:14+01:00
New Revision: cdbe296853b1b3fc6415236f05770360e23f0d39
URL: https://github.com/llvm/llvm-project/commit/cdbe296853b1b3fc6415236f05770360e23f0d39
DIFF: https://github.com/llvm/llvm-project/commit/cdbe296853b1b3fc6415236f05770360e23f0d39.diff
LOG: [clang-format] Fix lambda formatting in conditional
Without the patch UnwrappedLineFormatter::analyzeSolutionSpace just ran
out of possible formattings and would put everything just on one line.
The problem was that the the line break was forbidden, but putting the
conditional colon on the same line is also forbidden.
Differential Revision: https://reviews.llvm.org/D135918
Added:
Modified:
clang/lib/Format/ContinuationIndenter.cpp
clang/unittests/Format/FormatTest.cpp
Removed:
################################################################################
diff --git a/clang/lib/Format/ContinuationIndenter.cpp b/clang/lib/Format/ContinuationIndenter.cpp
index f1b5d184963ce..3fa3e6bcbb569 100644
--- a/clang/lib/Format/ContinuationIndenter.cpp
+++ b/clang/lib/Format/ContinuationIndenter.cpp
@@ -331,6 +331,15 @@ bool ContinuationIndenter::canBreak(const LineState &State) {
if (Previous.is(tok::l_square) && Previous.is(TT_ObjCMethodExpr))
return false;
+ if (Current.is(TT_ConditionalExpr) && Previous.is(tok::r_paren) &&
+ Previous.MatchingParen && Previous.MatchingParen->Previous &&
+ Previous.MatchingParen->Previous->MatchingParen &&
+ Previous.MatchingParen->Previous->MatchingParen->is(TT_LambdaLBrace)) {
+ // We have a lambda within a conditional expression, allow breaking here.
+ assert(Previous.MatchingParen->Previous->is(tok::r_brace));
+ return true;
+ }
+
return !CurrentState.NoLineBreak;
}
diff --git a/clang/unittests/Format/FormatTest.cpp b/clang/unittests/Format/FormatTest.cpp
index 82e91b3222715..acf172ea98d9d 100644
--- a/clang/unittests/Format/FormatTest.cpp
+++ b/clang/unittests/Format/FormatTest.cpp
@@ -25549,6 +25549,54 @@ TEST_F(FormatTest, ShortTemplatedArgumentLists) {
verifyFormat("template <int N> struct Foo<char[N]> {};", Style);
}
+TEST_F(FormatTest, MultilineLambdaInConditional) {
+ auto Style = getLLVMStyleWithColumns(70);
+ verifyFormat("auto aLengthyIdentifier = oneExpressionSoThatWeBreak ? []() {\n"
+ " ;\n"
+ " return 5;\n"
+ "}()\n"
+ " : 2;",
+ Style);
+ verifyFormat(
+ "auto aLengthyIdentifier = oneExpressionSoThatWeBreak ? 2 : []() {\n"
+ " ;\n"
+ " return 5;\n"
+ "}();",
+ Style);
+
+ Style = getLLVMStyleWithColumns(60);
+ verifyFormat("auto aLengthyIdentifier = oneExpressionSoThatWeBreak\n"
+ " ? []() {\n"
+ " ;\n"
+ " return 5;\n"
+ " }()\n"
+ " : 2;",
+ Style);
+ verifyFormat("auto aLengthyIdentifier =\n"
+ " oneExpressionSoThatWeBreak ? 2 : []() {\n"
+ " ;\n"
+ " return 5;\n"
+ " }();",
+ Style);
+
+ Style = getLLVMStyleWithColumns(40);
+ verifyFormat("auto aLengthyIdentifier =\n"
+ " oneExpressionSoThatWeBreak ? []() {\n"
+ " ;\n"
+ " return 5;\n"
+ " }()\n"
+ " : 2;",
+ Style);
+ verifyFormat("auto aLengthyIdentifier =\n"
+ " oneExpressionSoThatWeBreak\n"
+ " ? 2\n"
+ " : []() {\n"
+ " ;\n"
+ " return 5;\n"
+ " };",
+ Style);
+}
+
TEST_F(FormatTest, AlignAfterOpenBracketBlockIndent) {
auto Style = getLLVMStyle();
More information about the cfe-commits
mailing list