<div dir="ltr">s/laster/latest/</div><div class="gmail_extra"><br><br><div class="gmail_quote">On Fri, Mar 1, 2013 at 5:48 PM, Daniel Jasper <span dir="ltr"><<a href="mailto:djasper@google.com" target="_blank">djasper@google.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: djasper<br>
Date: Fri Mar  1 10:48:32 2013<br>
New Revision: 176352<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=176352&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=176352&view=rev</a><br>
Log:<br>
Normal indent for last element of builder-type call.<br>
<br>
In builder type call, we indent to the laster function calls.<br>
However, for the last element of such a call, we don't need to do<br>
so, as that normally just wastes space and does not increase<br>
readability.<br>
<br>
Before:<br>
aaaaaa->aaaaaa->aaaaaa( // break<br>
                  aaaaaa);<br>
aaaaaaaaaaaaaaaaaaaaa->aaaaaaaaaaaaaaaaaaaaaa<br>
    ->aaaaaaaaaaaaaaaaaaaaaaaaaa(<br>
        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);<br>
<br>
After:<br>
aaaaaa->aaaaaa->aaaaaa( // break<br>
    aaaaaa);<br>
aaaaaaaaaaaaaaaaaaaaa->aaaaaaaaaaaaaaaaaaaaaa->aaaaaaaaaaaaaaaaaaaaaaaaaa(<br>
    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);<br>
<br>
Modified:<br>
    cfe/trunk/lib/Format/Format.cpp<br>
    cfe/trunk/lib/Format/TokenAnnotator.cpp<br>
    cfe/trunk/lib/Format/TokenAnnotator.h<br>
    cfe/trunk/unittests/Format/FormatTest.cpp<br>
<br>
Modified: cfe/trunk/lib/Format/Format.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Format/Format.cpp?rev=176352&r1=176351&r2=176352&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Format/Format.cpp?rev=176352&r1=176351&r2=176352&view=diff</a><br>

==============================================================================<br>
--- cfe/trunk/lib/Format/Format.cpp (original)<br>
+++ cfe/trunk/lib/Format/Format.cpp Fri Mar  1 10:48:32 2013<br>
@@ -339,7 +339,8 @@ private:<br>
         : Indent(Indent), LastSpace(LastSpace), FirstLessLess(0),<br>
           BreakBeforeClosingBrace(false), QuestionColumn(0),<br>
           AvoidBinPacking(AvoidBinPacking), BreakBeforeParameter(false),<br>
-          HasMultiParameterLine(HasMultiParameterLine), ColonPos(0) {}<br>
+          HasMultiParameterLine(HasMultiParameterLine), ColonPos(0),<br>
+          StartOfFunctionCall(0) {}<br>
<br>
     /// \brief The position to which a specific parenthesis level needs to be<br>
     /// indented.<br>
@@ -382,6 +383,9 @@ private:<br>
     /// \brief The position of the colon in an ObjC method declaration/call.<br>
     unsigned ColonPos;<br>
<br>
+    /// \brief The start of the most recent function in a builder-type call.<br>
+    unsigned StartOfFunctionCall;<br>
+<br>
     bool operator<(const ParenState &Other) const {<br>
       if (Indent != Other.Indent)<br>
         return Indent < Other.Indent;<br>
@@ -401,6 +405,8 @@ private:<br>
         return HasMultiParameterLine;<br>
       if (ColonPos != Other.ColonPos)<br>
         return ColonPos < Other.ColonPos;<br>
+      if (StartOfFunctionCall != Other.StartOfFunctionCall)<br>
+        return StartOfFunctionCall < Other.StartOfFunctionCall;<br>
       return false;<br>
     }<br>
   };<br>
@@ -622,9 +628,6 @@ private:<br>
         // If this function has multiple parameters, indent nested calls from<br>
         // the start of the first parameter.<br>
         State.Stack.back().LastSpace = State.Column;<br>
-      else if ((Current.is(tok::period) || Current.is(tok::arrow)) &&<br>
-               Line.Type == LT_BuilderTypeCall && State.ParenLevel == 0)<br>
-        State.Stack.back().LastSpace = State.Column;<br>
     }<br>
<br>
     return moveStateToNextToken(State, DryRun);<br>
@@ -642,6 +645,10 @@ private:<br>
       State.Stack.back().FirstLessLess = State.Column;<br>
     if (Current.is(tok::question))<br>
       State.Stack.back().QuestionColumn = State.Column;<br>
+    if ((Current.is(tok::period) || Current.is(tok::arrow)) &&<br>
+        Line.Type == LT_BuilderTypeCall && State.ParenLevel == 0)<br>
+      State.Stack.back().StartOfFunctionCall =<br>
+          Current.LastInChainOfCalls ? 0 : State.Column;<br>
     if (Current.Type == TT_CtorInitializerColon) {<br>
       if (Style.ConstructorInitializerAllOnOneLineOrOnePerLine)<br>
         State.Stack.back().AvoidBinPacking = true;<br>
@@ -667,7 +674,8 @@ private:<br>
         NewIndent = 2 + State.Stack.back().LastSpace;<br>
         AvoidBinPacking = false;<br>
       } else {<br>
-        NewIndent = 4 + State.Stack.back().LastSpace;<br>
+        NewIndent = 4 + std::max(State.Stack.back().LastSpace,<br>
+                                 State.Stack.back().StartOfFunctionCall);<br>
         AvoidBinPacking =<br>
             !Style.BinPackParameters || State.Stack.back().AvoidBinPacking;<br>
       }<br>
<br>
Modified: cfe/trunk/lib/Format/TokenAnnotator.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Format/TokenAnnotator.cpp?rev=176352&r1=176351&r2=176352&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Format/TokenAnnotator.cpp?rev=176352&r1=176351&r2=176352&view=diff</a><br>

==============================================================================<br>
--- cfe/trunk/lib/Format/TokenAnnotator.cpp (original)<br>
+++ cfe/trunk/lib/Format/TokenAnnotator.cpp Fri Mar  1 10:48:32 2013<br>
@@ -464,6 +464,7 @@ private:<br>
 public:<br>
   LineType parseLine() {<br>
     int PeriodsAndArrows = 0;<br>
+    AnnotatedToken *LastPeriodOrArrow = NULL;<br>
     bool CanBeBuilderTypeStmt = true;<br>
     if (CurrentToken->is(tok::hash)) {<br>
       parsePreprocessorDirective();<br>
@@ -472,8 +473,10 @@ public:<br>
     while (CurrentToken != NULL) {<br>
       if (CurrentToken->is(tok::kw_virtual))<br>
         KeywordVirtualFound = true;<br>
-      if (CurrentToken->is(tok::period) || CurrentToken->is(tok::arrow))<br>
+      if (CurrentToken->is(tok::period) || CurrentToken->is(tok::arrow)) {<br>
         ++PeriodsAndArrows;<br>
+        LastPeriodOrArrow = CurrentToken;<br>
+      }<br>
       AnnotatedToken *TheToken = CurrentToken;<br>
       if (!consumeToken())<br>
         return LT_Invalid;<br>
@@ -485,8 +488,10 @@ public:<br>
       return LT_VirtualFunctionDecl;<br>
<br>
     // Assume a builder-type call if there are 2 or more "." and "->".<br>
-    if (PeriodsAndArrows >= 2 && CanBeBuilderTypeStmt)<br>
+    if (PeriodsAndArrows >= 2 && CanBeBuilderTypeStmt) {<br>
+      LastPeriodOrArrow->LastInChainOfCalls = true;<br>
       return LT_BuilderTypeCall;<br>
+    }<br>
<br>
     if (Line.First.Type == TT_ObjCMethodSpecifier) {<br>
       if (Contexts.back().FirstObjCSelectorName != NULL)<br>
@@ -934,7 +939,7 @@ unsigned TokenAnnotator::splitPenalty(co<br>
<br>
   if (Level != prec::Unknown)<br>
     return Level;<br>
-<br>
+<br>
   return 3;<br>
 }<br>
<br>
<br>
Modified: cfe/trunk/lib/Format/TokenAnnotator.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Format/TokenAnnotator.h?rev=176352&r1=176351&r2=176352&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Format/TokenAnnotator.h?rev=176352&r1=176351&r2=176352&view=diff</a><br>

==============================================================================<br>
--- cfe/trunk/lib/Format/TokenAnnotator.h (original)<br>
+++ cfe/trunk/lib/Format/TokenAnnotator.h Fri Mar  1 10:48:32 2013<br>
@@ -75,7 +75,7 @@ public:<br>
         ClosesTemplateDeclaration(false), MatchingParen(NULL),<br>
         ParameterCount(0), BindingStrength(0), SplitPenalty(0),<br>
         LongestObjCSelectorName(0), Parent(NULL), FakeLParens(0),<br>
-        FakeRParens(0) {<br>
+        FakeRParens(0), LastInChainOfCalls(false) {<br>
   }<br>
<br>
   bool is(tok::TokenKind Kind) const { return <a href="http://FormatTok.Tok.is" target="_blank">FormatTok.Tok.is</a>(Kind); }<br>
@@ -127,6 +127,9 @@ public:<br>
   /// \brief Insert this many fake ) after this token for correct indentation.<br>
   unsigned FakeRParens;<br>
<br>
+  /// \brief Is this the last "." or "->" in a builder-type call?<br>
+  bool LastInChainOfCalls;<br>
+<br>
   const AnnotatedToken *getPreviousNoneComment() const {<br>
     AnnotatedToken *Tok = Parent;<br>
     while (Tok != NULL && Tok->is(tok::comment))<br>
<br>
Modified: cfe/trunk/unittests/Format/FormatTest.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/Format/FormatTest.cpp?rev=176352&r1=176351&r2=176352&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/Format/FormatTest.cpp?rev=176352&r1=176351&r2=176352&view=diff</a><br>

==============================================================================<br>
--- cfe/trunk/unittests/Format/FormatTest.cpp (original)<br>
+++ cfe/trunk/unittests/Format/FormatTest.cpp Fri Mar  1 10:48:32 2013<br>
@@ -1331,7 +1331,7 @@ TEST_F(FormatTest, FormatsBuilderPattern<br>
       "    ->aaaaaaaa(aaaaaaaaaaaaaaa);");<br>
   verifyFormat(<br>
       "aaaaaaaaaaaaaaaaaaa()->aaaaaa(bbbbb)->aaaaaaaaaaaaaaaaaaa( // break\n"<br>
-      "                                        aaaaaaaaaaaaaa);");<br>
+      "    aaaaaaaaaaaaaa);");<br>
   verifyFormat(<br>
       "aaaaaaaaaaaaaaaaaaaaaaa *aaaaaaaaa = aaaaaa->aaaaaaaaaaaa()\n"<br>
       "    ->aaaaaaaaaaaaaaaa(\n"<br>
<br>
<br>
_______________________________________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@cs.uiuc.edu">cfe-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits</a><br>
</blockquote></div><br></div>