-
Notifications
You must be signed in to change notification settings - Fork 15.1k
[clang-format] Propagate LeadingEmptyLinesAffected when joining lines
#146761
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
|
@llvm/pr-subscribers-clang-format Author: Eric Li (tJener) ChangesBefore this commit, when We change llvm-project/clang/lib/Format/AffectedRangeManager.cpp Lines 111 to 130 in a63f572
Fixes #138942. Full diff: https://github.com/llvm/llvm-project/pull/146761.diff 2 Files Affected:
diff --git a/clang/lib/Format/UnwrappedLineFormatter.cpp b/clang/lib/Format/UnwrappedLineFormatter.cpp
index f2ed027b2c047..d22bfc61ed736 100644
--- a/clang/lib/Format/UnwrappedLineFormatter.cpp
+++ b/clang/lib/Format/UnwrappedLineFormatter.cpp
@@ -988,6 +988,8 @@ class LineJoiner {
assert(!B.First->Previous);
if (B.Affected)
A.Affected = true;
+ else if (B.LeadingEmptyLinesAffected && 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..3500b7d47e99d 100644
--- a/clang/unittests/Format/FormatTestSelective.cpp
+++ b/clang/unittests/Format/FormatTestSelective.cpp
@@ -41,6 +41,8 @@ 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() {}\n", format("void f() {\n \n}\n", 11, 0));
}
TEST_F(FormatTestSelective, FormatsCorrectRegionForLeadingWhitespace) {
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Please wait a few days, or until another approval.
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 llvm#138942.
|
LLVM Buildbot has detected a new failure on builder Full details are available at: https://lab.llvm.org/buildbot/#/builders/169/builds/12866 Here is the relevant piece of the build log for the reference |
|
LLVM Buildbot has detected a new failure on builder Full details are available at: https://lab.llvm.org/buildbot/#/builders/94/builds/8621 Here is the relevant piece of the build log for the reference |
Before this commit, when
LineJoinerjoins a line with affected leading whitespace, it would drop the knowledge of this entirely. However, when theAffectedRangeManageris computing the affected lines, the leading empty whitespace lines are potentially considered for non-first tokens in theAnnotatedLine. This causes a discrepancy in behavior when anAnnotatedLineis put together from joining multiple lines versus when it is not.We change
LineJoiner::jointo followAffectedRangeManager's logic, considering the leading whitespace when determiningAffectedfor a token if the previous token did not have children.llvm-project/clang/lib/Format/AffectedRangeManager.cpp
Lines 111 to 130 in a63f572
Fixes #138942.