[PATCH] D144296: [clang-format] Rewrite how indent is reduced for compacted namespaces
Emilia Dreamer via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Tue Feb 21 17:07:45 PST 2023
rymiel updated this revision to Diff 499328.
rymiel marked 7 inline comments as done.
rymiel added a comment.
Apply suggestions and add extra test
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D144296/new/
https://reviews.llvm.org/D144296
Files:
clang/lib/Format/UnwrappedLineFormatter.cpp
clang/unittests/Format/FormatTest.cpp
Index: clang/unittests/Format/FormatTest.cpp
===================================================================
--- clang/unittests/Format/FormatTest.cpp
+++ clang/unittests/Format/FormatTest.cpp
@@ -4431,6 +4431,46 @@
"int k; }} // namespace out::mid",
Style));
+ verifyFormat("namespace A { namespace B { namespace C {\n"
+ " int i;\n"
+ "}}} // namespace A::B::C\n"
+ "int main() {\n"
+ " if (true)\n"
+ " return 0;\n"
+ "}",
+ "namespace A { namespace B {\n"
+ "namespace C {\n"
+ " int i;\n"
+ "}} // namespace B::C\n"
+ "} // namespace A\n"
+ "int main() {\n"
+ " if (true)\n"
+ " return 0;\n"
+ "}",
+ Style);
+
+ verifyFormat("namespace A { namespace B { namespace C {\n"
+ "#ifdef FOO\n"
+ " int i;\n"
+ "#endif\n"
+ "}}} // namespace A::B::C\n"
+ "int main() {\n"
+ " if (true)\n"
+ " return 0;\n"
+ "}",
+ "namespace A { namespace B {\n"
+ "namespace C {\n"
+ "#ifdef FOO\n"
+ " int i;\n"
+ "#endif\n"
+ "}} // namespace B::C\n"
+ "} // namespace A\n"
+ "int main() {\n"
+ " if (true)\n"
+ " return 0;\n"
+ "}",
+ Style);
+
Style.NamespaceIndentation = FormatStyle::NI_Inner;
EXPECT_EQ("namespace out { namespace in {\n"
" int i;\n"
Index: clang/lib/Format/UnwrappedLineFormatter.cpp
===================================================================
--- clang/lib/Format/UnwrappedLineFormatter.cpp
+++ clang/lib/Format/UnwrappedLineFormatter.cpp
@@ -366,20 +366,27 @@
// instead of TheLine->First.
if (Style.CompactNamespaces) {
- if (auto nsToken = TheLine->First->getNamespaceToken()) {
- int i = 0;
- unsigned closingLine = TheLine->MatchingClosingBlockLineIndex - 1;
- for (; I + 1 + i != E &&
- nsToken->TokenText == getNamespaceTokenText(I[i + 1]) &&
- closingLine == I[i + 1]->MatchingClosingBlockLineIndex &&
- I[i + 1]->Last->TotalLength < Limit;
- i++, --closingLine) {
- // No extra indent for compacted namespaces.
- IndentTracker.skipLine(*I[i + 1]);
+ if (const auto *NSToken = TheLine->First->getNamespaceToken()) {
+ int J = 1;
+ assert(TheLine->MatchingClosingBlockLineIndex > 0);
+ for (auto ClosingLineIndex = TheLine->MatchingClosingBlockLineIndex - 1;
+ I + J != E && NSToken->TokenText == getNamespaceTokenText(I[J]) &&
+ ClosingLineIndex == I[J]->MatchingClosingBlockLineIndex &&
+ I[J]->Last->TotalLength < Limit;
+ ++J, --ClosingLineIndex) {
+ Limit -= I[J]->Last->TotalLength;
- Limit -= I[i + 1]->Last->TotalLength;
+ // Reduce indent level for bodies of namespaces which were compacted,
+ // but only if their content was indented in the first place.
+ auto *ClosingLine = AnnotatedLines.begin() + ClosingLineIndex + 1;
+ auto OutdentBy = I[J]->Level - TheLine->Level;
+ for (auto *CompactedLine = I + J; CompactedLine <= ClosingLine;
+ ++CompactedLine) {
+ if (!(*CompactedLine)->InPPDirective)
+ (*CompactedLine)->Level -= OutdentBy;
+ }
}
- return i;
+ return J - 1;
}
if (auto nsToken = getMatchingNamespaceToken(TheLine, AnnotatedLines)) {
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D144296.499328.patch
Type: text/x-patch
Size: 3810 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20230222/023618b8/attachment-0001.bin>
More information about the cfe-commits
mailing list