<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>