]> granicus.if.org Git - clang/commitdiff
Improve handling of comments in static initializers.
authorDaniel Jasper <djasper@google.com>
Thu, 17 Jan 2013 12:53:34 +0000 (12:53 +0000)
committerDaniel Jasper <djasper@google.com>
Thu, 17 Jan 2013 12:53:34 +0000 (12:53 +0000)
Also adding more tests.

We can now keep the formatting of something like:

static SomeType type = { aaaaaaaaaaaaaaaaaaaa, /* comment */
                         aaaaaaaaaaaaaaaaaaaa /* comment */,
                         /* comment */ aaaaaaaaaaaaaaaaaaaa,
                         aaaaaaaaaaaaaaaaaaaa, // comment
                         aaaaaaaaaaaaaaaaaaaa };

Note that the comment in the first line is handled like a trailing line comment
as that is likely what the user intended.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@172711 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Format/Format.cpp
unittests/Format/FormatTest.cpp

index b839c686af23beb59ba7e70afa146dbfbf541319..108ae7a73621f4781d544c25797534d878583e40 100644 (file)
@@ -98,6 +98,13 @@ public:
 
   std::vector<AnnotatedToken> Children;
   AnnotatedToken *Parent;
+
+  const AnnotatedToken *getPreviousNoneComment() const {
+    AnnotatedToken *Tok = Parent;
+    while (Tok != NULL && Tok->is(tok::comment))
+      Tok = Tok->Parent;
+    return Tok;
+  }
 };
 
 class AnnotatedLine {
@@ -489,7 +496,8 @@ private:
       if (Previous.is(tok::l_paren) || Previous.is(tok::l_brace) ||
           State.NextToken->Parent->Type == TT_TemplateOpener)
         State.Stack[ParenLevel].Indent = State.Column + Spaces;
-      if (Previous.is(tok::comma) && Current.Type != TT_LineComment)
+      if (Current.getPreviousNoneComment()->is(tok::comma) &&
+          Current.isNot(tok::comment))
         State.Stack[ParenLevel].HasMultiParameterLine = true;
 
 
@@ -648,7 +656,7 @@ private:
         State.LineContainsContinuedForLoopSection)
       return UINT_MAX;
     if (!NewLine && State.NextToken->Parent->is(tok::comma) &&
-        State.NextToken->Type != TT_LineComment &&
+        State.NextToken->isNot(tok::comment) &&
         State.Stack.back().BreakAfterComma)
       return UINT_MAX;
     // Trying to insert a parameter on a new line if there are already more than
@@ -1033,7 +1041,8 @@ public:
     } else {
       if (Current.Type == TT_LineComment) {
         Current.MustBreakBefore = Current.FormatTok.NewlinesBefore > 0;
-      } else if (Current.Parent->Type == TT_LineComment ||
+      } else if ((Current.Parent->is(tok::comment) &&
+                  Current.FormatTok.NewlinesBefore > 0) ||
                  (Current.is(tok::string_literal) &&
                   Current.Parent->is(tok::string_literal))) {
         Current.MustBreakBefore = true;
@@ -1376,7 +1385,7 @@ private:
     if (Left.is(tok::equal) && Line.Type == LT_VirtualFunctionDecl)
       return false;
 
-    if (Right.is(tok::comment))
+    if (Right.Type == TT_LineComment)
       // We rely on MustBreakBefore being set correctly here as we should not
       // change the "binding" behavior of a comment.
       return false;
index bd0fcbcf2cca5c4f4badb0d5c4758053182258f9..190eabab38f98b07d1282db9fe1bffffc146204c 100644 (file)
@@ -359,6 +359,44 @@ TEST_F(FormatTest, UnderstandsSingleLineComments) {
 
 TEST_F(FormatTest, UnderstandsMultiLineComments) {
   verifyFormat("f(/*test=*/ true);");
+  EXPECT_EQ(
+      "f(aaaaaaaaaaaaaaaaaaaaaaaaa, /* Trailing comment for aa... */\n"
+      "  bbbbbbbbbbbbbbbbbbbbbbbbb);",
+      format("f(aaaaaaaaaaaaaaaaaaaaaaaaa ,  /* Trailing comment for aa... */\n"
+             "  bbbbbbbbbbbbbbbbbbbbbbbbb);"));
+  EXPECT_EQ(
+      "f(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
+      "  /* Leading comment for bb... */ bbbbbbbbbbbbbbbbbbbbbbbbb);",
+      format("f(aaaaaaaaaaaaaaaaaaaaaaaaa    ,   \n"
+             "/* Leading comment for bb... */   bbbbbbbbbbbbbbbbbbbbbbbbb);"));
+}
+
+TEST_F(FormatTest, CommentsInStaticInitializers) {
+  EXPECT_EQ(
+      "static SomeType type = { aaaaaaaaaaaaaaaaaaaa, /* comment */\n"
+      "                         aaaaaaaaaaaaaaaaaaaa /* comment */,\n"
+      "                         /* comment */ aaaaaaaaaaaaaaaaaaaa,\n"
+      "                         aaaaaaaaaaaaaaaaaaaa, // comment\n"
+      "                         aaaaaaaaaaaaaaaaaaaa };",
+      format("static SomeType type = { aaaaaaaaaaaaaaaaaaaa  ,  /* comment */\n"
+             "                   aaaaaaaaaaaaaaaaaaaa   /* comment */ ,\n"
+             "                     /* comment */   aaaaaaaaaaaaaaaaaaaa ,\n"
+             "              aaaaaaaaaaaaaaaaaaaa ,   // comment\n"
+             "                  aaaaaaaaaaaaaaaaaaaa };"));
+  verifyFormat("static SomeType type = { aaaaaaaaaaa, // comment for aa...\n"
+               "                         bbbbbbbbbbb, ccccccccccc };");
+  verifyFormat("static SomeType type = { aaaaaaaaaaa,\n"
+               "                         // comment for bb....\n"
+               "                         bbbbbbbbbbb, ccccccccccc };");
+  verifyGoogleFormat(
+      "static SomeType type = { aaaaaaaaaaa,  // comment for aa...\n"
+      "                         bbbbbbbbbbb,\n"
+      "                         ccccccccccc };");
+  verifyGoogleFormat("static SomeType type = { aaaaaaaaaaa,\n"
+                     "                         // comment for bb....\n"
+                     "                         bbbbbbbbbbb,\n"
+                     "                         ccccccccccc };");
+
 }
 
 //===----------------------------------------------------------------------===//