[clang-format] Use number of unwrapped lines for short namespace
Summary:
This patch makes the namespace comment fixer use the number of unwrapped lines
that a namespace spans to detect it that namespace is short, thus not needing
end comments to be added.
This is needed to ensure clang-format is idempotent. Previously, a short namespace
was detected by the original source code lines. This has the effect of requiring two
runs for this example:
```
namespace { class A; }
```
after first run:
```
namespace {
class A;
}
```
after second run:
```
namespace {
class A;
} // namespace
```
Reviewers: djasper
Reviewed By: djasper
Subscribers: cfe-commits, klimek
Differential Revision: https://reviews.llvm.org/D30528
llvm-svn: 296736
diff --git a/clang/unittests/Format/NamespaceEndCommentsFixerTest.cpp b/clang/unittests/Format/NamespaceEndCommentsFixerTest.cpp
index c24894e..28212f8 100644
--- a/clang/unittests/Format/NamespaceEndCommentsFixerTest.cpp
+++ b/clang/unittests/Format/NamespaceEndCommentsFixerTest.cpp
@@ -47,87 +47,123 @@
TEST_F(NamespaceEndCommentsFixerTest, AddsEndComment) {
EXPECT_EQ("namespace {\n"
" int i;\n"
+ " int j;\n"
"}// namespace",
fixNamespaceEndComments("namespace {\n"
" int i;\n"
+ " int j;\n"
"}"));
EXPECT_EQ("namespace {\n"
" int i;\n"
+ " int j;\n"
"}// namespace\n",
fixNamespaceEndComments("namespace {\n"
" int i;\n"
+ " int j;\n"
"}\n"));
EXPECT_EQ("namespace A {\n"
" int i;\n"
+ " int j;\n"
"}// namespace A",
fixNamespaceEndComments("namespace A {\n"
" int i;\n"
+ " int j;\n"
"}"));
EXPECT_EQ("inline namespace A {\n"
" int i;\n"
+ " int j;\n"
"}// namespace A",
fixNamespaceEndComments("inline namespace A {\n"
" int i;\n"
+ " int j;\n"
"}"));
EXPECT_EQ("namespace ::A {\n"
" int i;\n"
+ " int j;\n"
"}// namespace ::A",
fixNamespaceEndComments("namespace ::A {\n"
" int i;\n"
+ " int j;\n"
"}"));
EXPECT_EQ("namespace ::A::B {\n"
" int i;\n"
+ " int j;\n"
"}// namespace ::A::B",
fixNamespaceEndComments("namespace ::A::B {\n"
" int i;\n"
+ " int j;\n"
"}"));
EXPECT_EQ("namespace /**/::/**/A/**/::/**/B/**/ {\n"
" int i;\n"
+ " int j;\n"
"}// namespace ::A::B",
fixNamespaceEndComments("namespace /**/::/**/A/**/::/**/B/**/ {\n"
" int i;\n"
+ " int j;\n"
"}"));
EXPECT_EQ("namespace A {\n"
"namespace B {\n"
" int i;\n"
+ "}\n"
+ "}// namespace A",
+ fixNamespaceEndComments("namespace A {\n"
+ "namespace B {\n"
+ " int i;\n"
+ "}\n"
+ "}"));
+ EXPECT_EQ("namespace A {\n"
+ "namespace B {\n"
+ " int i;\n"
+ " int j;\n"
"}// namespace B\n"
"}// namespace A",
fixNamespaceEndComments("namespace A {\n"
"namespace B {\n"
" int i;\n"
+ " int j;\n"
"}\n"
"}"));
EXPECT_EQ("namespace A {\n"
" int a;\n"
+ " int b;\n"
"}// namespace A\n"
"namespace B {\n"
" int b;\n"
+ " int a;\n"
"}// namespace B",
fixNamespaceEndComments("namespace A {\n"
" int a;\n"
+ " int b;\n"
"}\n"
"namespace B {\n"
" int b;\n"
+ " int a;\n"
"}"));
EXPECT_EQ("namespace A {\n"
" int a1;\n"
+ " int a2;\n"
"}// namespace A\n"
"namespace A {\n"
" int a2;\n"
+ " int a1;\n"
"}// namespace A",
fixNamespaceEndComments("namespace A {\n"
" int a1;\n"
+ " int a2;\n"
"}\n"
"namespace A {\n"
" int a2;\n"
+ " int a1;\n"
"}"));
EXPECT_EQ("namespace A {\n"
" int a;\n"
+ " int b;\n"
"}// namespace A\n"
"// comment about b\n"
"int b;",
fixNamespaceEndComments("namespace A {\n"
" int a;\n"
+ " int b;\n"
"}\n"
"// comment about b\n"
"int b;"));
@@ -136,7 +172,7 @@
"namespace B {\n"
"namespace C {\n"
"namespace D {\n"
- "}// namespace D\n"
+ "}\n"
"}// namespace C\n"
"}// namespace B\n"
"}// namespace A",
@@ -153,36 +189,44 @@
TEST_F(NamespaceEndCommentsFixerTest, AddsNewlineIfNeeded) {
EXPECT_EQ("namespace A {\n"
" int i;\n"
+ " int j;\n"
"}// namespace A\n"
- " int j;",
+ " int k;",
fixNamespaceEndComments("namespace A {\n"
" int i;\n"
- "} int j;"));
+ " int j;\n"
+ "} int k;"));
EXPECT_EQ("namespace {\n"
" int i;\n"
+ " int j;\n"
"}// namespace\n"
- " int j;",
+ " int k;",
fixNamespaceEndComments("namespace {\n"
" int i;\n"
- "} int j;"));
+ " int j;\n"
+ "} int k;"));
EXPECT_EQ("namespace A {\n"
" int i;\n"
+ " int j;\n"
"}// namespace A\n"
" namespace B {\n"
" int j;\n"
+ " int k;\n"
"}// namespace B",
fixNamespaceEndComments("namespace A {\n"
" int i;\n"
+ " int j;\n"
"} namespace B {\n"
" int j;\n"
+ " int k;\n"
"}"));
}
TEST_F(NamespaceEndCommentsFixerTest, DoesNotAddEndCommentForShortNamespace) {
EXPECT_EQ("namespace {}", fixNamespaceEndComments("namespace {}"));
EXPECT_EQ("namespace A {}", fixNamespaceEndComments("namespace A {}"));
- EXPECT_EQ("namespace A { int i; }",
- fixNamespaceEndComments("namespace A { int i; }"));
+ EXPECT_EQ("namespace A { a }",
+ fixNamespaceEndComments("namespace A { a }"));
}
TEST_F(NamespaceEndCommentsFixerTest, DoesNotAddCommentAfterUnaffectedRBrace) {