[clang-format] Support namespaces ending in semicolon

Summary:
This patch adds support for namespaces ending in semicolon to the namespace comment fixer.
source:
```
namespace A {
  int i;
  int j;
};
```
clang-format before:
```
namespace A {
  int i;
  int j;
} // namespace A;
```
clang-format after:
```
namespace A {
  int i;
  int j;
}; // namespace A
```

Reviewers: djasper

Reviewed By: djasper

Subscribers: cfe-commits, klimek

Differential Revision: https://reviews.llvm.org/D30688

llvm-svn: 297140
diff --git a/clang/unittests/Format/NamespaceEndCommentsFixerTest.cpp b/clang/unittests/Format/NamespaceEndCommentsFixerTest.cpp
index f0e67b3..48ecdb0 100644
--- a/clang/unittests/Format/NamespaceEndCommentsFixerTest.cpp
+++ b/clang/unittests/Format/NamespaceEndCommentsFixerTest.cpp
@@ -184,6 +184,34 @@
                                     "}\n"
                                     "}\n"
                                     "}"));
+
+  // Adds an end comment after a semicolon.
+  EXPECT_EQ("namespace {\n"
+            "  int i;\n"
+            "  int j;\n"
+            "};// namespace",
+            fixNamespaceEndComments("namespace {\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 {\n"
+            "  int i;\n"
+            "  int j;\n"
+            "};// namespace A\n"
+            "// unrelated",
+            fixNamespaceEndComments("namespace A {\n"
+                                    "  int i;\n"
+                                    "  int j;\n"
+                                    "};\n"
+                                    "// unrelated"));
 }
 
 TEST_F(NamespaceEndCommentsFixerTest, AddsNewlineIfNeeded) {
@@ -220,6 +248,24 @@
                                     "  int j;\n"
                                     "  int k;\n"
                                     "}"));
+  EXPECT_EQ("namespace {\n"
+            "  int i;\n"
+            "  int j;\n"
+            "};// namespace\n"
+            "int k;",
+            fixNamespaceEndComments("namespace {\n"
+                                    "  int i;\n"
+                                    "  int j;\n"
+                                    "};int k;"));
+  EXPECT_EQ("namespace {\n"
+            "  int i;\n"
+            "  int j;\n"
+            "};// namespace\n"
+            ";",
+            fixNamespaceEndComments("namespace {\n"
+                                    "  int i;\n"
+                                    "  int j;\n"
+                                    "};;"));
 }
 
 TEST_F(NamespaceEndCommentsFixerTest, DoesNotAddEndCommentForShortNamespace) {
@@ -227,6 +273,8 @@
   EXPECT_EQ("namespace A {}", fixNamespaceEndComments("namespace A {}"));
   EXPECT_EQ("namespace A { a }",
             fixNamespaceEndComments("namespace A { a }"));
+  EXPECT_EQ("namespace A { a };",
+            fixNamespaceEndComments("namespace A { a };"));
 }
 
 TEST_F(NamespaceEndCommentsFixerTest, DoesNotAddCommentAfterUnaffectedRBrace) {
@@ -238,6 +286,14 @@
                                     "}",
                                     // The range (16, 3) spans the 'int' above.
                                     /*Ranges=*/{1, tooling::Range(16, 3)}));
+  EXPECT_EQ("namespace A {\n"
+            "  int i;\n"
+            "};",
+            fixNamespaceEndComments("namespace A {\n"
+                                    "  int i;\n"
+                                    "};",
+                                    // The range (16, 3) spans the 'int' above.
+                                    /*Ranges=*/{1, tooling::Range(16, 3)}));
 }
 
 TEST_F(NamespaceEndCommentsFixerTest, DoesNotAddCommentAfterRBraceInPPDirective) {
@@ -276,6 +332,18 @@
             fixNamespaceEndComments("namespace A::B {\n"
                                     "  int i;\n"
                                     "} // end namespace A::B"));
+  EXPECT_EQ("namespace A {\n"
+            "  int i;\n"
+            "}; // end namespace A",
+            fixNamespaceEndComments("namespace A {\n"
+                                    "  int i;\n"
+                                    "}; // end namespace A"));
+  EXPECT_EQ("namespace {\n"
+            "  int i;\n"
+            "}; /* unnamed namespace */",
+            fixNamespaceEndComments("namespace {\n"
+                                    "  int i;\n"
+                                    "}; /* unnamed namespace */"));
 }
 
 TEST_F(NamespaceEndCommentsFixerTest, UpdatesInvalidEndLineComment) {
@@ -309,10 +377,17 @@
             fixNamespaceEndComments("namespace A {\n"
                                     "  int i;\n"
                                     "} // banamespace A"));
-
+  EXPECT_EQ("namespace A {\n"
+            "  int i;\n"
+            "}; // namespace A",
+            fixNamespaceEndComments("namespace A {\n"
+                                    "  int i;\n"
+                                    "}; // banamespace A"));
   // Updates invalid line comments even for short namespaces.
   EXPECT_EQ("namespace A {} // namespace A",
             fixNamespaceEndComments("namespace A {} // namespace"));
+  EXPECT_EQ("namespace A {}; // namespace A",
+            fixNamespaceEndComments("namespace A {}; // namespace"));
 }
 
 TEST_F(NamespaceEndCommentsFixerTest, UpdatesInvalidEndBlockComment) {
@@ -346,8 +421,16 @@
             fixNamespaceEndComments("namespace A {\n"
                                     "  int i;\n"
                                     "} /* banamespace A */"));
+  EXPECT_EQ("namespace A {\n"
+            "  int i;\n"
+            "}; // namespace A",
+            fixNamespaceEndComments("namespace A {\n"
+                                    "  int i;\n"
+                                    "}; /* banamespace A */"));
   EXPECT_EQ("namespace A {} // namespace A",
             fixNamespaceEndComments("namespace A {} /**/"));
+  EXPECT_EQ("namespace A {}; // namespace A",
+            fixNamespaceEndComments("namespace A {}; /**/"));
 }
 
 TEST_F(NamespaceEndCommentsFixerTest,