https://github.com/gautamnsankar updated https://github.com/llvm/llvm-project/pull/206406
>From b395b95fa0ed665b025d2a435780f852755df49f Mon Sep 17 00:00:00 2001 From: Gautam Neelakantan Sankar <[email protected]> Date: Mon, 29 Jun 2026 15:08:44 +0900 Subject: [PATCH] [clang-format] Respect definition separators when MaxEmptyLinesToKeep: 0 --- clang/lib/Format/DefinitionBlockSeparator.cpp | 7 ++++- clang/lib/Format/Format.cpp | 12 ++++---- .../Format/DefinitionBlockSeparatorTest.cpp | 29 +++++++++++++++++++ 3 files changed, 41 insertions(+), 7 deletions(-) diff --git a/clang/lib/Format/DefinitionBlockSeparator.cpp b/clang/lib/Format/DefinitionBlockSeparator.cpp index 6b52b1fc0deff..58d75ebc181fd 100644 --- a/clang/lib/Format/DefinitionBlockSeparator.cpp +++ b/clang/lib/Format/DefinitionBlockSeparator.cpp @@ -66,8 +66,13 @@ void DefinitionBlockSeparator::separateBlocks( }; unsigned NewlineCount = (Style.SeparateDefinitionBlocks == FormatStyle::SDS_Always ? 1 : 0) + 1; + + FormatStyle SeparatorStyle = Style; + SeparatorStyle.MaxEmptyLinesToKeep = + std::max(SeparatorStyle.MaxEmptyLinesToKeep, NewlineCount - 1); + WhitespaceManager Whitespaces( - Env.getSourceManager(), Style, + Env.getSourceManager(), SeparatorStyle, Style.LineEnding > FormatStyle::LE_CRLF ? WhitespaceManager::inputUsesCRLF( Env.getSourceManager().getBufferData(Env.getFileID()), diff --git a/clang/lib/Format/Format.cpp b/clang/lib/Format/Format.cpp index ecfe5d2ce60d0..1deaff31c0ca2 100644 --- a/clang/lib/Format/Format.cpp +++ b/clang/lib/Format/Format.cpp @@ -4330,12 +4330,6 @@ reformat(const FormatStyle &Style, StringRef Code, } } - if (Style.SeparateDefinitionBlocks != FormatStyle::SDS_Leave) { - Passes.emplace_back([&](const Environment &Env) { - return DefinitionBlockSeparator(Env, Expanded).process(); - }); - } - if (Style.Language == FormatStyle::LK_ObjC && !Style.ObjCPropertyAttributeOrder.empty()) { Passes.emplace_back([&](const Environment &Env) { @@ -4354,6 +4348,12 @@ reformat(const FormatStyle &Style, StringRef Code, return Formatter(Env, Expanded, Status).process(); }); + if (Style.SeparateDefinitionBlocks != FormatStyle::SDS_Leave) { + Passes.emplace_back([&](const Environment &Env) { + return DefinitionBlockSeparator(Env, Expanded).process(); + }); + } + if (Style.isJavaScript() && Style.InsertTrailingCommas == FormatStyle::TCS_Wrapped) { Passes.emplace_back([&](const Environment &Env) { diff --git a/clang/unittests/Format/DefinitionBlockSeparatorTest.cpp b/clang/unittests/Format/DefinitionBlockSeparatorTest.cpp index 5e4c574d68dbb..d18ab4e5f7965 100644 --- a/clang/unittests/Format/DefinitionBlockSeparatorTest.cpp +++ b/clang/unittests/Format/DefinitionBlockSeparatorTest.cpp @@ -391,6 +391,35 @@ TEST_F(DefinitionBlockSeparatorTest, Always) { Style, Prefix + Infix + Postfix); } +TEST_F(DefinitionBlockSeparatorTest, AlwaysMaxEmptyLinesZeroAllman) { + FormatStyle Style = getLLVMStyle(); + Style.BreakBeforeBraces = FormatStyle::BS_Allman; + Style.MaxEmptyLinesToKeep = 0; + Style.SeparateDefinitionBlocks = FormatStyle::SDS_Always; + Style.AllowShortFunctionsOnASingleLine = FormatStyle::ShortFunctionStyle(); + + verifyFormat("int my_function(int a)\n" + "\n" + "{\n" + " return a;\n" + "}\n" + "int other_function(int a)\n" + "\n" + "{\n" + " return a;\n" + "}", + Style, + "int my_function(int a)\n" + "{\n" + " return a;\n" + "}\n" + "\n" + "int other_function(int a)\n" + "{\n" + " return a;\n" + "}"); +} + TEST_F(DefinitionBlockSeparatorTest, Never) { FormatStyle Style = getLLVMStyle(); Style.SeparateDefinitionBlocks = FormatStyle::SDS_Never; _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
