r196783 - clang-format: Be more conservative about braced list column layout.

Daniel Jasper djasper at google.com
Mon Dec 9 06:40:19 PST 2013


Author: djasper
Date: Mon Dec  9 08:40:19 2013
New Revision: 196783

URL: http://llvm.org/viewvc/llvm-project?rev=196783&view=rev
Log:
clang-format: Be more conservative about braced list column layout.

Specifically disable it for nested braced lists as it commonly can look
really weird. Eventually, we'll want to become smarter and format some of
the nested lists better.

Before:
  SomeStruct my_struct_array = {
    { aaaaaa,     aaaaaaaa,   aaaaaaaaaa, aaaaaaaaa, aaaaaaaaa,
      aaaaaaaaaa, aaaaaaaaaa, aaaaaaa,    aaa },
    { aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaa },
    { aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaa,
      aaaaaaaaaaaa,      a,                 aaaaaaaaaa,
      aaaaaaaaa,         aaa },
  };

After:
  SomeStruct my_struct_array = {
    { aaaaaa, aaaaaaaa, aaaaaaaaaa, aaaaaaaaa, aaaaaaaaa, aaaaaaaaaa,
      aaaaaaaaaaaa, aaaaaaa, aaa },
    { aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaa },
    { aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaa,
      aaaaaaaaaaaa, a, aaaaaaaaaa, aaaaaaaaa, aaa },
  };

Modified:
    cfe/trunk/lib/Format/FormatToken.cpp
    cfe/trunk/lib/Format/FormatToken.h
    cfe/trunk/lib/Format/TokenAnnotator.cpp
    cfe/trunk/unittests/Format/FormatTest.cpp

Modified: cfe/trunk/lib/Format/FormatToken.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Format/FormatToken.cpp?rev=196783&r1=196782&r2=196783&view=diff
==============================================================================
--- cfe/trunk/lib/Format/FormatToken.cpp (original)
+++ cfe/trunk/lib/Format/FormatToken.cpp Mon Dec  9 08:40:19 2013
@@ -92,7 +92,8 @@ static unsigned CodePointsBetween(const
 
 void CommaSeparatedList::precomputeFormattingInfos(const FormatToken *Token) {
   // FIXME: At some point we might want to do this for other lists, too.
-  if (!Token->MatchingParen || Token->isNot(tok::l_brace))
+  if (!Token->MatchingParen || Token->isNot(tok::l_brace) ||
+      Token->NestingLevel != 0)
     return;
 
   FormatToken *ItemBegin = Token->Next;

Modified: cfe/trunk/lib/Format/FormatToken.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Format/FormatToken.h?rev=196783&r1=196782&r2=196783&view=diff
==============================================================================
--- cfe/trunk/lib/Format/FormatToken.h (original)
+++ cfe/trunk/lib/Format/FormatToken.h Mon Dec  9 08:40:19 2013
@@ -97,8 +97,8 @@ struct FormatToken {
         BlockKind(BK_Unknown), Type(TT_Unknown), SpacesRequiredBefore(0),
         CanBreakBefore(false), ClosesTemplateDeclaration(false),
         ParameterCount(0), PackingKind(PPK_Inconclusive), TotalLength(0),
-        UnbreakableTailLength(0), BindingStrength(0), SplitPenalty(0),
-        LongestObjCSelectorName(0), FakeRParens(0),
+        UnbreakableTailLength(0), BindingStrength(0), NestingLevel(0),
+        SplitPenalty(0), LongestObjCSelectorName(0), FakeRParens(0),
         StartsBinaryExpression(false), EndsBinaryExpression(false),
         LastInChainOfCalls(false), PartOfMultiVariableDeclStmt(false),
         MatchingParen(NULL), Previous(NULL), Next(NULL),
@@ -207,6 +207,10 @@ struct FormatToken {
   /// operator precedence, parenthesis nesting, etc.
   unsigned BindingStrength;
 
+  /// \brief The nesting level of this token, i.e. the number of surrounding (),
+  /// [], {} or <>.
+  unsigned NestingLevel;
+
   /// \brief Penalty for inserting a line break before this token.
   unsigned SplitPenalty;
 

Modified: cfe/trunk/lib/Format/TokenAnnotator.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Format/TokenAnnotator.cpp?rev=196783&r1=196782&r2=196783&view=diff
==============================================================================
--- cfe/trunk/lib/Format/TokenAnnotator.cpp (original)
+++ cfe/trunk/lib/Format/TokenAnnotator.cpp Mon Dec  9 08:40:19 2013
@@ -529,6 +529,7 @@ private:
     if (CurrentToken != NULL) {
       determineTokenType(*CurrentToken);
       CurrentToken->BindingStrength = Contexts.back().BindingStrength;
+      CurrentToken->NestingLevel = Contexts.size() - 1;
     }
 
     if (CurrentToken != NULL)
@@ -1141,8 +1142,7 @@ unsigned TokenAnnotator::splitPenalty(co
       return 3;
     if (Left.Type == TT_StartOfName)
       return 20;
-    if (InFunctionDecl && Right.BindingStrength == 1)
-      // FIXME: Clean up hack of using BindingStrength to find top-level names.
+    if (InFunctionDecl && Right.NestingLevel == 0)
       return Style.PenaltyReturnTypeOnItsOwnLine;
     return 200;
   }
@@ -1396,9 +1396,8 @@ bool TokenAnnotator::mustBreakBefore(con
     return true;
   } else if (Right.Previous->ClosesTemplateDeclaration &&
              Right.Previous->MatchingParen &&
-             Right.Previous->MatchingParen->BindingStrength == 1 &&
+             Right.Previous->MatchingParen->NestingLevel == 0 &&
              Style.AlwaysBreakTemplateDeclarations) {
-    // FIXME: Fix horrible hack of using BindingStrength to find top-level <>.
     return true;
   } else if (Right.Type == TT_CtorInitializerComma &&
              Style.BreakConstructorInitializersBeforeComma &&

Modified: cfe/trunk/unittests/Format/FormatTest.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/Format/FormatTest.cpp?rev=196783&r1=196782&r2=196783&view=diff
==============================================================================
--- cfe/trunk/unittests/Format/FormatTest.cpp (original)
+++ cfe/trunk/unittests/Format/FormatTest.cpp Mon Dec  9 08:40:19 2013
@@ -4854,6 +4854,17 @@ TEST_F(FormatTest, FormatsBracedListsInC
                "         { aaaaaaaaaaaaaaaaaaaaa },\n"
                "         { aaaaaaaaaaaaaaaaa } };",
                getLLVMStyleWithColumns(60));
+
+  // No column layout for nested lists.
+  // FIXME: For some nested lists, we can do better.
+  verifyFormat(
+      "SomeStruct my_struct_array = {\n"
+      "  { aaaaaa, aaaaaaaa, aaaaaaaaaa, aaaaaaaaa, aaaaaaaaa, aaaaaaaaaa,\n"
+      "    aaaaaaaaaaaaa, aaaaaaa, aaa },\n"
+      "  { aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaa },\n"
+      "  { aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaa,\n"
+      "    aaaaaaaaaaaa, a, aaaaaaaaaa, aaaaaaaaa, aaa },\n"
+      "};");
 }
 
 TEST_F(FormatTest, PullTrivialFunctionDefinitionsIntoSingleLine) {





More information about the cfe-commits mailing list