[clang] [clang-format] Finalize children after formatting them (PR #73753)
Owen Pan via cfe-commits
cfe-commits at lists.llvm.org
Tue Nov 28 22:44:53 PST 2023
https://github.com/owenca created https://github.com/llvm/llvm-project/pull/73753
This would also fix the overlapping replacements below: $ clang-format
a(
#else
#endif
) = []() {
)}
The new replacement overlaps with an existing replacement. New replacement: <stdin>: 38:+7:"
"
Existing replacement: <stdin>: 38:+7:" "
Fixed #73487.
>From cdeae878936bf32bad612e6a0157280f0f4b9474 Mon Sep 17 00:00:00 2001
From: Owen Pan <owenpiano at gmail.com>
Date: Tue, 28 Nov 2023 22:31:05 -0800
Subject: [PATCH] [clang-format] Finalize children after formatting them
This would also fix the overlapping replacements below:
$ clang-format
a(
#else
#endif
) = []() {
)}
The new replacement overlaps with an existing replacement.
New replacement: <stdin>: 38:+7:"
"
Existing replacement: <stdin>: 38:+7:" "
Fixed #73487.
---
clang/lib/Format/UnwrappedLineFormatter.cpp | 20 ++++++++++----------
clang/unittests/Format/FormatTest.cpp | 7 +++++++
2 files changed, 17 insertions(+), 10 deletions(-)
diff --git a/clang/lib/Format/UnwrappedLineFormatter.cpp b/clang/lib/Format/UnwrappedLineFormatter.cpp
index 280485d9a90d1bf..40730cd53529ed3 100644
--- a/clang/lib/Format/UnwrappedLineFormatter.cpp
+++ b/clang/lib/Format/UnwrappedLineFormatter.cpp
@@ -939,6 +939,12 @@ class LineJoiner {
};
static void markFinalized(FormatToken *Tok) {
+ if (Tok->is(tok::hash) && !Tok->Previous && Tok->Next &&
+ Tok->Next->isOneOf(tok::pp_if, tok::pp_ifdef, tok::pp_ifndef,
+ tok::pp_elif, tok::pp_elifdef, tok::pp_elifndef,
+ tok::pp_else, tok::pp_endif)) {
+ Tok = Tok->Next;
+ }
for (; Tok; Tok = Tok->Next) {
if (Tok->MacroCtx && Tok->MacroCtx->Role == MR_ExpandedArg) {
// In the first pass we format all macro arguments in the expanded token
@@ -1060,6 +1066,8 @@ class LineFormatter {
}
Penalty +=
formatLine(*Child, State.Column + 1, /*FirstStartColumn=*/0, DryRun);
+ if (!DryRun)
+ markFinalized(Child->First);
State.Column += 1 + Child->Last->TotalLength;
return true;
@@ -1429,16 +1437,8 @@ unsigned UnwrappedLineFormatter::format(
NextLine = Joiner.getNextMergedLine(DryRun, IndentTracker);
RangeMinLevel = UINT_MAX;
}
- if (!DryRun) {
- auto *Tok = TheLine.First;
- if (Tok->is(tok::hash) && !Tok->Previous && Tok->Next &&
- Tok->Next->isOneOf(tok::pp_if, tok::pp_ifdef, tok::pp_ifndef,
- tok::pp_elif, tok::pp_elifdef, tok::pp_elifndef,
- tok::pp_else, tok::pp_endif)) {
- Tok = Tok->Next;
- }
- markFinalized(Tok);
- }
+ if (!DryRun)
+ markFinalized(TheLine.First);
}
PenaltyCache[CacheKey] = Penalty;
return Penalty;
diff --git a/clang/unittests/Format/FormatTest.cpp b/clang/unittests/Format/FormatTest.cpp
index 420afe5992f2a0b..8782cb7c49cad33 100644
--- a/clang/unittests/Format/FormatTest.cpp
+++ b/clang/unittests/Format/FormatTest.cpp
@@ -6361,6 +6361,13 @@ TEST_F(FormatTest, FormatAlignInsidePreprocessorElseBlock) {
" int quux = 4;\n"
"}",
Style);
+ verifyFormat("auto foo = [] { return; };\n"
+ "#if FOO\n"
+ "#else\n"
+ "count = bar;\n"
+ "mbid = bid;\n"
+ "#endif",
+ Style);
// Test with a mix of #if and #else blocks.
verifyFormat("void f1() {\n"
More information about the cfe-commits
mailing list