[clang] 878ce21 - [clang-format] Propagate `LeadingEmptyLinesAffected` when joining lines (#146761)
via cfe-commits
cfe-commits at lists.llvm.org
Sat Jul 5 14:07:02 PDT 2025
Author: Eric Li
Date: 2025-07-05T17:06:59-04:00
New Revision: 878ce210e30f8ebcb4b73d834f91229a403e2376
URL: https://github.com/llvm/llvm-project/commit/878ce210e30f8ebcb4b73d834f91229a403e2376
DIFF: https://github.com/llvm/llvm-project/commit/878ce210e30f8ebcb4b73d834f91229a403e2376.diff
LOG: [clang-format] Propagate `LeadingEmptyLinesAffected` when joining lines (#146761)
Before this commit, when `LineJoiner` joins a line with affected leading
whitespace, it would drop the knowledge of this entirely. However, when
the `AffectedRangeManager` is computing the affected lines, the leading
empty whitespace lines are potentially considered for non-first tokens
in the `AnnotatedLine`. This causes a discrepancy in behavior when an
`AnnotatedLine` is put together from joining multiple lines versus when
it is not.
We change `LineJoiner::join` to follow `AffectedRangeManager`'s logic,
considering the leading whitespace when determining `Affected` for a
token.
https://github.com/llvm/llvm-project/blob/a63f57262898588b576d66e5fd79c0aa64b35f2d/clang/lib/Format/AffectedRangeManager.cpp#L111-L130
Fixes #138942.
Added:
Modified:
clang/lib/Format/UnwrappedLineFormatter.cpp
clang/unittests/Format/FormatTestSelective.cpp
Removed:
################################################################################
diff --git a/clang/lib/Format/UnwrappedLineFormatter.cpp b/clang/lib/Format/UnwrappedLineFormatter.cpp
index f2ed027b2c047..ac8c0c8fd0ec0 100644
--- a/clang/lib/Format/UnwrappedLineFormatter.cpp
+++ b/clang/lib/Format/UnwrappedLineFormatter.cpp
@@ -986,8 +986,10 @@ class LineJoiner {
void join(AnnotatedLine &A, const AnnotatedLine &B) {
assert(!A.Last->Next);
assert(!B.First->Previous);
- if (B.Affected)
+ if (B.Affected || B.LeadingEmptyLinesAffected) {
+ assert(B.Affected || A.Last->Children.empty());
A.Affected = true;
+ }
A.Last->Next = B.First;
B.First->Previous = A.Last;
B.First->CanBreakBefore = true;
diff --git a/clang/unittests/Format/FormatTestSelective.cpp b/clang/unittests/Format/FormatTestSelective.cpp
index 624684c7a079b..0b7ac21fd33d3 100644
--- a/clang/unittests/Format/FormatTestSelective.cpp
+++ b/clang/unittests/Format/FormatTestSelective.cpp
@@ -41,6 +41,11 @@ TEST_F(FormatTestSelective, RemovesTrailingWhitespaceOfFormattedLine) {
EXPECT_EQ("int a;", format("int a; ", 0, 0));
EXPECT_EQ("int a;\n", format("int a; \n \n \n ", 0, 0));
EXPECT_EQ("int a;\nint b; ", format("int a; \nint b; ", 0, 0));
+
+ EXPECT_EQ("void f() {}", format("void f() {\n"
+ " \n"
+ "}",
+ 11, 0));
}
TEST_F(FormatTestSelective, FormatsCorrectRegionForLeadingWhitespace) {
More information about the cfe-commits
mailing list