From b0a2764aa108322b313ae7877e7b8920e673617c Mon Sep 17 00:00:00 2001 From: Daniel Jasper Date: Wed, 16 Apr 2014 12:26:54 +0000 Subject: [PATCH] clang-format: Add special case to reduce indentaiton in streams. This is similar to how we treat assignments and seems to be generally desirable. Before: llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa( aaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaa); After: llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa( aaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaa); git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@206384 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Format/ContinuationIndenter.cpp | 6 ++++-- lib/Format/FormatToken.h | 14 ++++++++++---- lib/Format/TokenAnnotator.cpp | 8 ++++++-- unittests/Format/FormatTest.cpp | 12 ++++++++++++ 4 files changed, 32 insertions(+), 8 deletions(-) diff --git a/lib/Format/ContinuationIndenter.cpp b/lib/Format/ContinuationIndenter.cpp index 9311ca481c..52ee47987f 100644 --- a/lib/Format/ContinuationIndenter.cpp +++ b/lib/Format/ContinuationIndenter.cpp @@ -301,7 +301,9 @@ void ContinuationIndenter::addTokenOnCurrentLine(LineState &State, bool DryRun, else if ((Previous.Type == TT_BinaryOperator || Previous.Type == TT_ConditionalExpr || Previous.Type == TT_CtorInitializerColon) && - (Previous.getPrecedence() != prec::Assignment || + ((Previous.getPrecedence() != prec::Assignment && + (Previous.isNot(tok::lessless) || Previous.OperatorIndex != 0 || + !Previous.LastOperator)) || Current.StartsBinaryExpression)) // Always indent relative to the RHS of the expression unless this is a // simple assignment without binary expression on the RHS. Also indent @@ -573,7 +575,7 @@ unsigned ContinuationIndenter::moveStateToNextToken(LineState &State, std::min(State.LowestLevelOnLine, State.ParenLevel); if (Current.isMemberAccess()) State.Stack.back().StartOfFunctionCall = - Current.LastInChainOfCalls ? 0 : State.Column + Current.ColumnWidth; + Current.LastOperator ? 0 : State.Column + Current.ColumnWidth; if (Current.Type == TT_ObjCSelectorName) State.Stack.back().ObjCSelectorNameFound = true; if (Current.Type == TT_LambdaLSquare) diff --git a/lib/Format/FormatToken.h b/lib/Format/FormatToken.h index 249eecc0ba..749dfcb3e4 100644 --- a/lib/Format/FormatToken.h +++ b/lib/Format/FormatToken.h @@ -106,8 +106,9 @@ struct FormatToken { UnbreakableTailLength(0), BindingStrength(0), NestingLevel(0), SplitPenalty(0), LongestObjCSelectorName(0), FakeRParens(0), StartsBinaryExpression(false), EndsBinaryExpression(false), - LastInChainOfCalls(false), PartOfMultiVariableDeclStmt(false), - IsForEachMacro(false), MatchingParen(NULL), Previous(NULL), Next(NULL), + OperatorIndex(0), LastOperator(false), + PartOfMultiVariableDeclStmt(false), IsForEachMacro(false), + MatchingParen(NULL), Previous(NULL), Next(NULL), Decision(FD_Unformatted), Finalized(false) {} /// \brief The \c Token. @@ -242,8 +243,13 @@ struct FormatToken { /// \brief \c true if this token ends a binary expression. bool EndsBinaryExpression; - /// \brief Is this the last "." or "->" in a builder-type call? - bool LastInChainOfCalls; + /// \brief Is this is an operator (or "."/"->") in a sequence of operators + /// with the same precedence, contains the 0-based operator index. + unsigned OperatorIndex; + + /// \brief Is this the last operator (or "."/"->") in a sequence of operators + /// with the same precedence? + bool LastOperator; /// \brief Is this token part of a \c DeclStmt defining multiple variables? /// diff --git a/lib/Format/TokenAnnotator.cpp b/lib/Format/TokenAnnotator.cpp index 98323fcc57..1aa64b450d 100644 --- a/lib/Format/TokenAnnotator.cpp +++ b/lib/Format/TokenAnnotator.cpp @@ -978,6 +978,7 @@ public: FormatToken *Start = Current; FormatToken *LatestOperator = NULL; + unsigned OperatorIndex = 0; while (Current) { // Consume operators with higher precedence. @@ -997,8 +998,8 @@ public: if (Current == NULL || Current->closesScope() || (CurrentPrecedence != -1 && CurrentPrecedence < Precedence)) { if (LatestOperator) { + LatestOperator->LastOperator = true; if (Precedence == PrecedenceArrowAndPeriod) { - LatestOperator->LastInChainOfCalls = true; // Call expressions don't have a binary operator precedence. addFakeParenthesis(Start, prec::Unknown); } else { @@ -1017,8 +1018,11 @@ public: next(); } else { // Operator found. - if (CurrentPrecedence == Precedence) + if (CurrentPrecedence == Precedence) { LatestOperator = Current; + Current->OperatorIndex = OperatorIndex; + ++OperatorIndex; + } next(); } diff --git a/unittests/Format/FormatTest.cpp b/unittests/Format/FormatTest.cpp index f1442e03b6..ee9afe40c9 100644 --- a/unittests/Format/FormatTest.cpp +++ b/unittests/Format/FormatTest.cpp @@ -3983,6 +3983,18 @@ TEST_F(FormatTest, AlignsPipes) { "aaaaaaaa << (aaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); + verifyFormat( + "llvm::errs() << \"a: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" + " aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" + " aaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); + verifyFormat( + "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" + " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" + " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" + " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;"); + verifyFormat( + "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" + " aaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); verifyFormat("return out << \"somepacket = {\\n\"\n" " << \" aaaaaa = \" << pkt.aaaaaa << \"\\n\"\n" -- 2.40.0