[clang] [clang-format] Respect definition separators when MaxEmptyLinesToKeep: 0 (PR #206406)
via cfe-commits
cfe-commits at lists.llvm.org
Sun Aug 2 17:18:55 PDT 2026
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 <gautam.neelakantan.sankar at gmail.com>
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;
More information about the cfe-commits
mailing list