<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Wed, Apr 16, 2014 at 2:26 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: Wed Apr 16 07:26:54 2014<br>
New Revision: 206384<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=206384&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=206384&view=rev</a><br>
Log:<br>
clang-format: Add special case to reduce indentaiton in streams.<br>
<br>
This is similar to how we treat assignments and seems to be generally<br>
desirable.<br>
<br>
Before:<br>
  llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(<br>
                      aaaaaaaaaaaaaaaaaaaaaaaaaaaa,<br>
                      aaaaaaaaaaaaaaaaaaaaaaaaaaaa);<br>
<br>
After:<br>
  llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(<br>
      aaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaa);<br>
<br>
Modified:<br>
    cfe/trunk/lib/Format/ContinuationIndenter.cpp<br>
    cfe/trunk/lib/Format/FormatToken.h<br>
    cfe/trunk/lib/Format/TokenAnnotator.cpp<br>
    cfe/trunk/unittests/Format/FormatTest.cpp<br>
<br>
Modified: cfe/trunk/lib/Format/ContinuationIndenter.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Format/ContinuationIndenter.cpp?rev=206384&r1=206383&r2=206384&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Format/ContinuationIndenter.cpp?rev=206384&r1=206383&r2=206384&view=diff</a><br>

==============================================================================<br>
--- cfe/trunk/lib/Format/ContinuationIndenter.cpp (original)<br>
+++ cfe/trunk/lib/Format/ContinuationIndenter.cpp Wed Apr 16 07:26:54 2014<br>
@@ -301,7 +301,9 @@ void ContinuationIndenter::addTokenOnCur<br>
   else if ((Previous.Type == TT_BinaryOperator ||<br>
             Previous.Type == TT_ConditionalExpr ||<br>
             Previous.Type == TT_CtorInitializerColon) &&<br>
-           (Previous.getPrecedence() != prec::Assignment ||<br>
+           ((Previous.getPrecedence() != prec::Assignment &&<br>
+             (Previous.isNot(tok::lessless) || Previous.OperatorIndex != 0 ||<br>
+              !Previous.LastOperator)) ||<br></blockquote><div><br></div><div>(optional) I think this would be significantly easier to understand for me if it was pulled out into a bool variable, something like:</div><div>
bool PreviousIsSingleLessLess = Previous.is(tok::lessless) && Previuos.OperatorIndex == 0 && Previous.LastOperator;</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

             Current.StartsBinaryExpression))<br>
     // Always indent relative to the RHS of the expression unless this is a<br>
     // simple assignment without binary expression on the RHS. Also indent<br>
@@ -573,7 +575,7 @@ unsigned ContinuationIndenter::moveState<br>
         std::min(State.LowestLevelOnLine, State.ParenLevel);<br>
   if (Current.isMemberAccess())<br>
     State.Stack.back().StartOfFunctionCall =<br>
-        Current.LastInChainOfCalls ? 0 : State.Column + Current.ColumnWidth;<br>
+        Current.LastOperator ? 0 : State.Column + Current.ColumnWidth;<br>
   if (Current.Type == TT_ObjCSelectorName)<br>
     State.Stack.back().ObjCSelectorNameFound = true;<br>
   if (Current.Type == TT_LambdaLSquare)<br>
<br>
Modified: cfe/trunk/lib/Format/FormatToken.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Format/FormatToken.h?rev=206384&r1=206383&r2=206384&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Format/FormatToken.h?rev=206384&r1=206383&r2=206384&view=diff</a><br>

==============================================================================<br>
--- cfe/trunk/lib/Format/FormatToken.h (original)<br>
+++ cfe/trunk/lib/Format/FormatToken.h Wed Apr 16 07:26:54 2014<br>
@@ -106,8 +106,9 @@ struct FormatToken {<br>
         UnbreakableTailLength(0), BindingStrength(0), NestingLevel(0),<br>
         SplitPenalty(0), LongestObjCSelectorName(0), FakeRParens(0),<br>
         StartsBinaryExpression(false), EndsBinaryExpression(false),<br>
-        LastInChainOfCalls(false), PartOfMultiVariableDeclStmt(false),<br>
-        IsForEachMacro(false), MatchingParen(NULL), Previous(NULL), Next(NULL),<br>
+        OperatorIndex(0), LastOperator(false),<br>
+        PartOfMultiVariableDeclStmt(false), IsForEachMacro(false),<br>
+        MatchingParen(NULL), Previous(NULL), Next(NULL),<br>
         Decision(FD_Unformatted), Finalized(false) {}<br>
<br>
   /// \brief The \c Token.<br>
@@ -242,8 +243,13 @@ struct FormatToken {<br>
   /// \brief \c true if this token ends a binary expression.<br>
   bool EndsBinaryExpression;<br>
<br>
-  /// \brief Is this the last "." or "->" in a builder-type call?<br>
-  bool LastInChainOfCalls;<br>
+  /// \brief Is this is an operator (or "."/"->") in a sequence of operators<br>
+  /// with the same precedence, contains the 0-based operator index.<br>
+  unsigned OperatorIndex;<br>
+<br>
+  /// \brief Is this the last operator (or "."/"->") in a sequence of operators<br>
+  /// with the same precedence?<br>
+  bool LastOperator;<br>
<br>
   /// \brief Is this token part of a \c DeclStmt defining multiple variables?<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=206384&r1=206383&r2=206384&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Format/TokenAnnotator.cpp?rev=206384&r1=206383&r2=206384&view=diff</a><br>

==============================================================================<br>
--- cfe/trunk/lib/Format/TokenAnnotator.cpp (original)<br>
+++ cfe/trunk/lib/Format/TokenAnnotator.cpp Wed Apr 16 07:26:54 2014<br>
@@ -978,6 +978,7 @@ public:<br>
<br>
     FormatToken *Start = Current;<br>
     FormatToken *LatestOperator = NULL;<br>
+    unsigned OperatorIndex = 0;<br>
<br>
     while (Current) {<br>
       // Consume operators with higher precedence.<br>
@@ -997,8 +998,8 @@ public:<br>
       if (Current == NULL || Current->closesScope() ||<br>
           (CurrentPrecedence != -1 && CurrentPrecedence < Precedence)) {<br>
         if (LatestOperator) {<br>
+          LatestOperator->LastOperator = true;<br>
           if (Precedence == PrecedenceArrowAndPeriod) {<br>
-            LatestOperator->LastInChainOfCalls = true;<br>
             // Call expressions don't have a binary operator precedence.<br>
             addFakeParenthesis(Start, prec::Unknown);<br>
           } else {<br>
@@ -1017,8 +1018,11 @@ public:<br>
         next();<br>
       } else {<br>
         // Operator found.<br>
-        if (CurrentPrecedence == Precedence)<br>
+        if (CurrentPrecedence == Precedence) {<br>
           LatestOperator = Current;<br>
+          Current->OperatorIndex = OperatorIndex;<br>
+          ++OperatorIndex;<br>
+        }<br>
<br>
         next();<br>
       }<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=206384&r1=206383&r2=206384&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/Format/FormatTest.cpp?rev=206384&r1=206383&r2=206384&view=diff</a><br>

==============================================================================<br>
--- cfe/trunk/unittests/Format/FormatTest.cpp (original)<br>
+++ cfe/trunk/unittests/Format/FormatTest.cpp Wed Apr 16 07:26:54 2014<br>
@@ -3983,6 +3983,18 @@ TEST_F(FormatTest, AlignsPipes) {<br>
       "aaaaaaaa << (aaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"<br>
       "                                 << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"<br>
       "         << aaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");<br>
+  verifyFormat(<br>
+      "llvm::errs() << \"a: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"<br>
+      "                             aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"<br>
+      "                             aaaaaaaaaaaaaaaaaaaaaaaaaaaa);");<br>
+  verifyFormat(<br>
+      "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"<br>
+      "                    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"<br>
+      "                    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"<br>
+      "             << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");<br>
+  verifyFormat(<br>
+      "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"<br>
+      "    aaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaa);");<br>
<br>
   verifyFormat("return out << \"somepacket = {\\n\"\n"<br>
                "           << \" aaaaaa = \" << pkt.aaaaaa << \"\\n\"\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></div>