https://github.com/rmarker updated https://github.com/llvm/llvm-project/pull/141576
>From a727440759fc1b6219ad5e20ad89cc48acc6279b Mon Sep 17 00:00:00 2001 From: rmarker <rmar...@outlook.com> Date: Tue, 27 May 2025 19:54:00 +0930 Subject: [PATCH 1/2] [clang-format] Stop moving lambda to new line only to indent it more. Hanging indents are minimised for lambdas by pushing them onto a new line. However, it could still do this even if it would cause even more hanging indents than it otherwise would. The handling has been expanded to check for this case and avoid moving the lambda to a new line. --- clang/lib/Format/ContinuationIndenter.cpp | 25 +++++++++++++++++++---- clang/unittests/Format/FormatTest.cpp | 14 +++++++++++++ 2 files changed, 35 insertions(+), 4 deletions(-) diff --git a/clang/lib/Format/ContinuationIndenter.cpp b/clang/lib/Format/ContinuationIndenter.cpp index 4e4e48f90a89f..c6c21c4a5ffcd 100644 --- a/clang/lib/Format/ContinuationIndenter.cpp +++ b/clang/lib/Format/ContinuationIndenter.cpp @@ -325,13 +325,30 @@ bool ContinuationIndenter::canBreak(const LineState &State) { if (Current.isMemberAccess() && CurrentState.ContainsUnwrappedBuilder) return false; - // Don't create a 'hanging' indent if there are multiple blocks in a single - // statement and we are aligning lambda blocks to their signatures. - if (Previous.is(tok::l_brace) && State.Stack.size() > 1 && + // Force a lambda onto a new line so that we don't create a 'hanging' indent + // if there are multiple blocks in a single statement and we are aligning + // lambda blocks to their signatures. + if (Previous.is(tok::l_brace) && State.Stack.size() > 2 && State.Stack[State.Stack.size() - 2].NestedBlockInlined && State.Stack[State.Stack.size() - 2].HasMultipleNestedBlocks && Style.LambdaBodyIndentation == FormatStyle::LBI_Signature) { - return false; + if (!Style.isCpp()) + return false; + + // Make sure to push lambdas to a new line when they are an argument with + // other arguments preceding them. + if (State.Stack[State.Stack.size() - 2].StartOfFunctionCall > 0) + return false; + + // Only force a new line if it is not just going to create a worse hanging + // indent. Otherwise, based on the ContinuationIndentWidth, we could end up + // more indented than we would've been. To avoid odd looking breaks, make + // sure we save at least IndentWidth. + if (State.Stack[State.Stack.size() - 3].Indent + + Style.ContinuationIndentWidth + Style.IndentWidth < + State.Stack[State.Stack.size() - 2].Indent) { + return false; + } } // Don't break after very short return types (e.g. "void") as that is often diff --git a/clang/unittests/Format/FormatTest.cpp b/clang/unittests/Format/FormatTest.cpp index c0633ba3c29b3..e55d82ca82c8b 100644 --- a/clang/unittests/Format/FormatTest.cpp +++ b/clang/unittests/Format/FormatTest.cpp @@ -23814,6 +23814,20 @@ TEST_F(FormatTest, FormatsLambdas) { "}", LLVMWithBeforeLambdaBody); + // Make sure we don't put the lambda on a new line when it would be indented + // more than where it would be otherwise. + verifyFormat("if ([]()\n" + " {\n" + " return true;\n" + " }()) {\n" + "}", + LLVMWithBeforeLambdaBody); + verifyFormat("fun([]()\n" + " {\n" + " return 17;\n" + " });", + LLVMWithBeforeLambdaBody); + LLVMWithBeforeLambdaBody.AllowShortLambdasOnASingleLine = FormatStyle::ShortLambdaStyle::SLS_Empty; verifyFormat("FctWithOneNestedLambdaInline_SLS_Empty(\n" >From 2624412e1082d402416ca1f245330b1e77251feb Mon Sep 17 00:00:00 2001 From: rmarker <rmar...@outlook.com> Date: Wed, 28 May 2025 12:10:53 +0930 Subject: [PATCH 2/2] Remove comment. --- clang/unittests/Format/FormatTest.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/clang/unittests/Format/FormatTest.cpp b/clang/unittests/Format/FormatTest.cpp index e55d82ca82c8b..7f7ae55a92d31 100644 --- a/clang/unittests/Format/FormatTest.cpp +++ b/clang/unittests/Format/FormatTest.cpp @@ -23813,9 +23813,6 @@ TEST_F(FormatTest, FormatsLambdas) { " }};\n" "}", LLVMWithBeforeLambdaBody); - - // Make sure we don't put the lambda on a new line when it would be indented - // more than where it would be otherwise. verifyFormat("if ([]()\n" " {\n" " return true;\n" _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits