From 54a8602aefbd75e09fa5371f28f3eeb529b6d9f2 Mon Sep 17 00:00:00 2001 From: Daniel Jasper Date: Fri, 15 Feb 2013 11:07:25 +0000 Subject: [PATCH] Prevent only breaking before "?" in conditional expressions. This is almost always more readable. Before: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaa : aaaaaaaaaaaaaaaaaaaaaaaaaaa; After: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaa : aaaaaaaaaaaaaaaaaaaaaaaaaaa; llvm-svn: 175262 --- clang/lib/Format/Format.cpp | 13 ++++++++++++- clang/unittests/Format/FormatTest.cpp | 17 +++++++++++++---- 2 files changed, 25 insertions(+), 5 deletions(-) diff --git a/clang/lib/Format/Format.cpp b/clang/lib/Format/Format.cpp index 92c138a..4b63aa9 100644 --- a/clang/lib/Format/Format.cpp +++ b/clang/lib/Format/Format.cpp @@ -290,7 +290,8 @@ private: : Indent(Indent), LastSpace(LastSpace), FirstLessLess(0), BreakBeforeClosingBrace(false), QuestionColumn(0), AvoidBinPacking(AvoidBinPacking), BreakBeforeParameter(false), - HasMultiParameterLine(HasMultiParameterLine), ColonPos(0) { + HasMultiParameterLine(HasMultiParameterLine), ColonPos(0), + BreakBeforeThirdOperand(false) { } /// \brief The position to which a specific parenthesis level needs to be @@ -333,6 +334,9 @@ private: /// \brief The position of the colon in an ObjC method declaration/call. unsigned ColonPos; + + /// \brief Break before third operand in ternary expression. + bool BreakBeforeThirdOperand; bool operator<(const ParenState &Other) const { if (Indent != Other.Indent) @@ -353,6 +357,8 @@ private: return HasMultiParameterLine; if (ColonPos != Other.ColonPos) return ColonPos < Other.ColonPos; + if (BreakBeforeThirdOperand != Other.BreakBeforeThirdOperand) + return BreakBeforeThirdOperand; return false; } }; @@ -465,6 +471,8 @@ private: State.Column = State.Stack.back().Indent; } + if (Current.is(tok::question)) + State.Stack.back().BreakBeforeThirdOperand = true; if (Previous.is(tok::comma) && !State.Stack.back().AvoidBinPacking) State.Stack.back().BreakBeforeParameter = false; @@ -794,6 +802,9 @@ private: (State.NextToken->Parent->ClosesTemplateDeclaration && State.ParenLevel == 0))) return true; + if (State.NextToken->is(tok::colon) && + State.Stack.back().BreakBeforeThirdOperand) + return true; return false; } diff --git a/clang/unittests/Format/FormatTest.cpp b/clang/unittests/Format/FormatTest.cpp index 9dab260..8c45325 100644 --- a/clang/unittests/Format/FormatTest.cpp +++ b/clang/unittests/Format/FormatTest.cpp @@ -1323,11 +1323,20 @@ TEST_F(FormatTest, BreaksConditionalExpressions) { " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" " aaaaaaaaaaaaaaaaaaaaaaaaaaa);"); + + verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" + " ? aaaaaaaaaaaaaaaaaaaaaaaaaaa\n" + " : aaaaaaaaaaaaaaaaaaaaaaaaaaa;"); + + // FIXME: The trailing third parameter here is kind of hidden. Prefer putting + // it on the next line. verifyFormat( - "unsigned Indent = formatFirstToken(\n" - " TheLine.First, IndentForLevel[TheLine.Level] >= 0\n" - " ? IndentForLevel[TheLine.Level] : TheLine * 2,\n" - " TheLine.InPPDirective, PreviousEndOfLineColumn);"); + "unsigned Indent =\n" + " format(TheLine.First, IndentForLevel[TheLine.Level] >= 0\n" + " ? IndentForLevel[TheLine.Level]\n" + " : TheLine * 2, TheLine.InPPDirective,\n" + " PreviousEndOfLineColumn);", getLLVMStyleWithColumns(70)); + } TEST_F(FormatTest, DeclarationsOfMultipleVariables) { -- 2.7.4