r366831 - clang-format: Fix namespace end comments for namespaces with attributes and macros.

Nico Weber via cfe-commits cfe-commits at lists.llvm.org
Tue Jul 23 10:49:45 PDT 2019


Author: nico
Date: Tue Jul 23 10:49:45 2019
New Revision: 366831

URL: http://llvm.org/viewvc/llvm-project?rev=366831&view=rev
Log:
clang-format: Fix namespace end comments for namespaces with attributes and macros.

Fixes PR39247.

While here, also make C++20 `namespace A::inline B::inline C` nested
inline namespaced definitions work.

Before:
    #define DEPRECATE_WOOF [[deprecated("meow")]]

    namespace DEPRECATE_WOOF woof {
    void f() {}
    } // namespace DEPRECATE_WOOFwoof

    namespace [[deprecated("meow")]] woof {
      void f() {}
    } // namespace [[deprecated("meow")]]woof

    namespace woof::inline bark {
      void f() {}
    } // namespace woof::inlinebark

Now:
    #define DEPRECATE_WOOF [[deprecated("meow")]]

    namespace DEPRECATE_WOOF woof {
    void f() {}
    } // namespace woof

    namespace [[deprecated("meow")]] woof {
    void f() {}
    } // namespace woof

    namespace woof::inline bark {
    void f() {}
    } // namespace woof::inline bark

(In addition to the fixed namespace end comments, also note the correct
indent of the namespace contents.)

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

Modified:
    cfe/trunk/lib/Format/NamespaceEndCommentsFixer.cpp
    cfe/trunk/lib/Format/UnwrappedLineParser.cpp
    cfe/trunk/unittests/Format/FormatTest.cpp
    cfe/trunk/unittests/Format/NamespaceEndCommentsFixerTest.cpp

Modified: cfe/trunk/lib/Format/NamespaceEndCommentsFixer.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Format/NamespaceEndCommentsFixer.cpp?rev=366831&r1=366830&r2=366831&view=diff
==============================================================================
--- cfe/trunk/lib/Format/NamespaceEndCommentsFixer.cpp (original)
+++ cfe/trunk/lib/Format/NamespaceEndCommentsFixer.cpp Tue Jul 23 10:49:45 2019
@@ -36,7 +36,7 @@ std::string computeName(const FormatToke
   const FormatToken *Tok = NamespaceTok->getNextNonComment();
   if (NamespaceTok->is(TT_NamespaceMacro)) {
     // Collects all the non-comment tokens between opening parenthesis
-    // and closing parenthesis or comma
+    // and closing parenthesis or comma.
     assert(Tok && Tok->is(tok::l_paren) && "expected an opening parenthesis");
     Tok = Tok->getNextNonComment();
     while (Tok && !Tok->isOneOf(tok::r_paren, tok::comma)) {
@@ -44,9 +44,21 @@ std::string computeName(const FormatToke
       Tok = Tok->getNextNonComment();
     }
   } else {
-    // Collects all the non-comment tokens between 'namespace' and '{'.
+    // For `namespace [[foo]] A::B::inline C {` or
+    // `namespace MACRO1 MACRO2 A::B::inline C {`, returns "A::B::inline C".
+    // Peek for the first '::' (or '{') and then return all tokens from one
+    // token before that up until the '{'.
+    const FormatToken *FirstNSTok = Tok;
+    while (Tok && !Tok->is(tok::l_brace) && !Tok->is(tok::coloncolon)) {
+      FirstNSTok = Tok;
+      Tok = Tok->getNextNonComment();
+    }
+
+    Tok = FirstNSTok;
     while (Tok && !Tok->is(tok::l_brace)) {
       name += Tok->TokenText;
+      if (Tok->is(tok::kw_inline))
+        name += " ";
       Tok = Tok->getNextNonComment();
     }
   }

Modified: cfe/trunk/lib/Format/UnwrappedLineParser.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Format/UnwrappedLineParser.cpp?rev=366831&r1=366830&r2=366831&view=diff
==============================================================================
--- cfe/trunk/lib/Format/UnwrappedLineParser.cpp (original)
+++ cfe/trunk/lib/Format/UnwrappedLineParser.cpp Tue Jul 23 10:49:45 2019
@@ -1873,8 +1873,13 @@ void UnwrappedLineParser::parseNamespace
   if (InitialToken.is(TT_NamespaceMacro)) {
     parseParens();
   } else {
-    while (FormatTok->isOneOf(tok::identifier, tok::coloncolon))
-      nextToken();
+    while (FormatTok->isOneOf(tok::identifier, tok::coloncolon, tok::kw_inline,
+                              tok::l_square)) {
+      if (FormatTok->is(tok::l_square))
+        parseSquare();
+      else
+        nextToken();
+    }
   }
   if (FormatTok->Tok.is(tok::l_brace)) {
     if (ShouldBreakBeforeBrace(Style, InitialToken))

Modified: cfe/trunk/unittests/Format/FormatTest.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/Format/FormatTest.cpp?rev=366831&r1=366830&r2=366831&view=diff
==============================================================================
--- cfe/trunk/unittests/Format/FormatTest.cpp (original)
+++ cfe/trunk/unittests/Format/FormatTest.cpp Tue Jul 23 10:49:45 2019
@@ -1782,6 +1782,21 @@ TEST_F(FormatTest, FormatsNamespaces) {
                "void f() { f(); }\n"
                "}",
                LLVMWithNoNamespaceFix);
+  verifyFormat("namespace N::inline D {\n"
+               "class A {};\n"
+               "void f() { f(); }\n"
+               "}",
+               LLVMWithNoNamespaceFix);
+  verifyFormat("namespace N::inline D::E {\n"
+               "class A {};\n"
+               "void f() { f(); }\n"
+               "}",
+               LLVMWithNoNamespaceFix);
+  verifyFormat("namespace [[deprecated(\"foo[bar\")]] some_namespace {\n"
+               "class A {};\n"
+               "void f() { f(); }\n"
+               "}",
+               LLVMWithNoNamespaceFix);
   verifyFormat("/* something */ namespace some_namespace {\n"
                "class A {};\n"
                "void f() { f(); }\n"

Modified: cfe/trunk/unittests/Format/NamespaceEndCommentsFixerTest.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/Format/NamespaceEndCommentsFixerTest.cpp?rev=366831&r1=366830&r2=366831&view=diff
==============================================================================
--- cfe/trunk/unittests/Format/NamespaceEndCommentsFixerTest.cpp (original)
+++ cfe/trunk/unittests/Format/NamespaceEndCommentsFixerTest.cpp Tue Jul 23 10:49:45 2019
@@ -77,6 +77,44 @@ TEST_F(NamespaceEndCommentsFixerTest, Ad
                                     "int i;\n"
                                     "int j;\n"
                                     "}"));
+
+  EXPECT_EQ("namespace [[deprecated(\"foo\")]] A::B {\n"
+            "int i;\n"
+            "int j;\n"
+            "}// namespace A::B",
+            fixNamespaceEndComments("namespace [[deprecated(\"foo\")]] A::B {\n"
+                                    "int i;\n"
+                                    "int j;\n"
+                                    "}"));
+
+  EXPECT_EQ("namespace [[deprecated(\"foo\")]] A::inline B::inline C {\n"
+            "int i;\n"
+            "int j;\n"
+            "}// namespace A::inline B::inline C",
+            fixNamespaceEndComments(
+                "namespace [[deprecated(\"foo\")]] A::inline B::inline C {\n"
+                "int i;\n"
+                "int j;\n"
+                "}"));
+
+  EXPECT_EQ("namespace DEPRECATED A::B {\n"
+            "int i;\n"
+            "int j;\n"
+            "}// namespace A::B",
+            fixNamespaceEndComments("namespace DEPRECATED A::B {\n"
+                                    "int i;\n"
+                                    "int j;\n"
+                                    "}"));
+
+  EXPECT_EQ("inline namespace [[deprecated]] A {\n"
+            "int i;\n"
+            "int j;\n"
+            "}// namespace A",
+            fixNamespaceEndComments("inline namespace [[deprecated]] A {\n"
+                                    "int i;\n"
+                                    "int j;\n"
+                                    "}"));
+
   EXPECT_EQ("namespace ::A {\n"
             "int i;\n"
             "int j;\n"
@@ -410,7 +448,8 @@ TEST_F(NamespaceEndCommentsFixerTest, Do
                                     /*Ranges=*/{1, tooling::Range(16, 3)}));
 }
 
-TEST_F(NamespaceEndCommentsFixerTest, DoesNotAddCommentAfterRBraceInPPDirective) {
+TEST_F(NamespaceEndCommentsFixerTest,
+       DoesNotAddCommentAfterRBraceInPPDirective) {
   EXPECT_EQ("#define SAD \\\n"
             "namespace A { \\\n"
             "int i; \\\n"




More information about the cfe-commits mailing list