]> granicus.if.org Git - clang/commitdiff
Slightly modify the formatting rules for braced lists.
authorDaniel Jasper <djasper@google.com>
Fri, 17 May 2013 09:35:01 +0000 (09:35 +0000)
committerDaniel Jasper <djasper@google.com>
Fri, 17 May 2013 09:35:01 +0000 (09:35 +0000)
Basically, the new rule is: The opening "{" always has to be on the
same line as the first element if the braced list is nested
(e.g. in another braced list or in a function).

The solution that clang-format produces almost always adheres to this
rule anyway and this makes clang-format significantly faster for larger
lists. Added a test cases for the only exception I could find
(which doesn't seem to be very important at first sight).

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

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

index 6966aabd69667431efed244189e6071b1e4f02ae..3dd0002abb53f1c42c2b3a617d74d125409c9f5a 100644 (file)
@@ -977,10 +977,18 @@ private:
 
   /// \brief Returns \c true, if a line break after \p State is allowed.
   bool canBreak(const LineState &State) {
-    if (!State.NextToken->CanBreakBefore &&
-        !(State.NextToken->is(tok::r_brace) &&
+    const AnnotatedToken &Current = *State.NextToken;
+    const AnnotatedToken &Previous = *Current.Parent;
+    if (!Current.CanBreakBefore &&
+        !(Current.is(tok::r_brace) &&
           State.Stack.back().BreakBeforeClosingBrace))
       return false;
+    // The opening "{" of a braced list has to be on the same line as the first
+    // element if it is nested in another braced init list or function call.
+    if (!Current.MustBreakBefore && Previous.is(tok::l_brace) &&
+        Previous.Parent &&
+        Previous.Parent->isOneOf(tok::l_brace, tok::l_paren, tok::comma))
+      return false;
     return !State.Stack.back().NoLineBreak;
   }
 
index 841ac552a5523241ca1343c8df43d5e58422b040..e143603f28c3c80d4d0674738f8d7a6039cbc526 100644 (file)
@@ -1192,6 +1192,18 @@ TEST_F(FormatTest, StaticInitializers) {
       "static SomeClass = { a, b, c, d, e, f, g, h, i, j,\n"
       "                     looooooooooooooooooooooooooooooooooongname,\n"
       "                     looooooooooooooooooooooooooooooong };");
+  // Here, everything other than the "}" would fit on a line.
+  verifyFormat("static int LooooooooooooooooooooooooongVariable[1] = {\n"
+               "  100000000000000000000000\n"
+               "};");
+
+  // FIXME: This would fit into the column limit if we'd fit "{ {" on the first
+  // line. However, the formatting looks a bit off and this probably doesn't
+  // happen often in practice.
+  verifyFormat("static int Variable[1] = {\n"
+               "  { 1000000000000000000000000000000000000 }\n"
+               "};",
+               getLLVMStyleWithColumns(40));
 }
 
 TEST_F(FormatTest, NestedStaticInitializers) {