[cfe-commits] r172076 - in /cfe/trunk: lib/Format/Format.cpp unittests/Format/FormatTest.cpp

Manuel Klimek klimek at google.com
Thu Jan 10 07:58:26 PST 2013


Author: klimek
Date: Thu Jan 10 09:58:26 2013
New Revision: 172076

URL: http://llvm.org/viewvc/llvm-project?rev=172076&view=rev
Log:
Fixes layout of right braces.

We now decide whether a newline should go before the closing brace
depending on whether a newline was inserted after the opening brace.

For example, we now insert a newline before '};' in:
static SomeClass WithALoooooooooooooooooooongName = {
  100000000, \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"
};
... while not inserting a newline here:
static SomeClass = { a, b, c, d, e, f, g, h, i, j,
                     looooooooooooooooooooooooooooooooooongname,
                     looooooooooooooooooooooooooooooong };

Also fixes the formating of (column limit 25):
int x = {
  avariable,
  b(alongervariable)
};

Modified:
    cfe/trunk/lib/Format/Format.cpp
    cfe/trunk/unittests/Format/FormatTest.cpp

Modified: cfe/trunk/lib/Format/Format.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Format/Format.cpp?rev=172076&r1=172075&r2=172076&view=diff
==============================================================================
--- cfe/trunk/lib/Format/Format.cpp (original)
+++ cfe/trunk/lib/Format/Format.cpp Thu Jan 10 09:58:26 2013
@@ -154,6 +154,7 @@
     State.Indent.push_back(Indent + 4);
     State.LastSpace.push_back(Indent);
     State.FirstLessLess.push_back(0);
+    State.BreakBeforeClosingBrace.push_back(false);
     State.ForLoopVariablePos = 0;
     State.LineContainsContinuedForLoopSection = false;
     State.StartOfLineLevel = 1;
@@ -223,6 +224,13 @@
     /// on a level.
     std::vector<unsigned> FirstLessLess;
 
+    /// \brief Whether a newline needs to be inserted before the block's closing
+    /// brace.
+    ///
+    /// We only want to insert a newline before the closing brace if there also
+    /// was a newline after the beginning left brace.
+    std::vector<bool> BreakBeforeClosingBrace;
+
     /// \brief The column of the first variable in a for-loop declaration.
     ///
     /// Used to align the second variable if necessary.
@@ -262,6 +270,8 @@
       if (Other.LineContainsContinuedForLoopSection !=
           LineContainsContinuedForLoopSection)
         return LineContainsContinuedForLoopSection;
+      if (Other.BreakBeforeClosingBrace != BreakBeforeClosingBrace)
+        return Other.BreakBeforeClosingBrace > BreakBeforeClosingBrace;
       return false;
     }
   };
@@ -346,7 +356,7 @@
       if (Previous.is(tok::l_paren) ||
           Previous.is(tok::l_brace) ||
           State.NextToken->Parent->Type == TT_TemplateOpener)
-        State.Indent[ParenLevel] = State.Column;
+        State.Indent[ParenLevel] = State.Column + Spaces;
 
       // Top-level spaces that are not part of assignments are exempt as that
       // mostly leads to better results.
@@ -356,6 +366,9 @@
         State.LastSpace[ParenLevel] = State.Column;
     }
     moveStateToNextToken(State);
+    if (Newline && Previous.is(tok::l_brace)) {
+      State.BreakBeforeClosingBrace.back() = true;
+    }
   }
 
   /// \brief Mark the next token as consumed in \p State and modify its stacks
@@ -383,6 +396,7 @@
       }
       State.LastSpace.push_back(State.LastSpace.back());
       State.FirstLessLess.push_back(0);
+      State.BreakBeforeClosingBrace.push_back(false);
     }
 
     // If we encounter a closing ), ], } or >, we can remove a level from our
@@ -393,6 +407,7 @@
       State.Indent.pop_back();
       State.LastSpace.pop_back();
       State.FirstLessLess.pop_back();
+      State.BreakBeforeClosingBrace.pop_back();
     }
 
     if (State.NextToken->Children.empty())
@@ -460,6 +475,9 @@
       return UINT_MAX;
     if (NewLine && !State.NextToken->CanBreakBefore)
       return UINT_MAX;
+    if (!NewLine && State.NextToken->is(tok::r_brace) &&
+        State.BreakBeforeClosingBrace.back())
+      return UINT_MAX;
     if (!NewLine && State.NextToken->Parent->is(tok::semi) &&
         State.LineContainsContinuedForLoopSection)
       return UINT_MAX;
@@ -485,7 +503,6 @@
     if (StopAt <= CurrentPenalty)
       return UINT_MAX;
     StopAt -= CurrentPenalty;
-
     StateMap::iterator I = Memory.find(State);
     if (I != Memory.end()) {
       // If this state has already been examined, we can safely return the
@@ -1129,7 +1146,7 @@
            Right.is(tok::arrow) || Right.is(tok::period) ||
            Right.is(tok::colon) || Left.is(tok::semi) ||
            Left.is(tok::l_brace) || Left.is(tok::question) ||
-           Left.Type == TT_ConditionalExpr ||
+           Right.is(tok::r_brace) || Left.Type == TT_ConditionalExpr ||
            (Left.is(tok::l_paren) && !Right.is(tok::r_paren));
   }
 

Modified: cfe/trunk/unittests/Format/FormatTest.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/Format/FormatTest.cpp?rev=172076&r1=172075&r2=172076&view=diff
==============================================================================
--- cfe/trunk/unittests/Format/FormatTest.cpp (original)
+++ cfe/trunk/unittests/Format/FormatTest.cpp Thu Jan 10 09:58:26 2013
@@ -430,7 +430,13 @@
   // FIXME: Format like enums if the static initializer does not fit on a line.
   verifyFormat(
       "static SomeClass WithALoooooooooooooooooooongName = {\n"
-      "  100000000, \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" };");
+      "  100000000, \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"\n"
+      "};");
+
+  verifyFormat(
+      "static SomeClass = { a, b, c, d, e, f, g, h, i, j,\n"
+      "                     looooooooooooooooooooooooooooooooooongname,\n"
+      "                     looooooooooooooooooooooooooooooong };");
 }
 
 TEST_F(FormatTest, FormatsSmallMacroDefinitionsInSingleLine) {
@@ -1121,7 +1127,8 @@
   verifyFormat(
       "int x = {\n"
       "  avariable,\n"
-      "  b(alongervariable) };", getLLVMStyleWithColumns(25));
+      "  b(alongervariable)\n"
+      "};", getLLVMStyleWithColumns(25));
 }
 
 TEST_F(FormatTest, LayoutTokensFollowingBlockInParentheses) {





More information about the cfe-commits mailing list