From 8f4bd7a20f89d9065bebadd270e6bc7822257d37 Mon Sep 17 00:00:00 2001 From: Daniel Jasper Date: Wed, 23 Jan 2013 10:08:28 +0000 Subject: [PATCH] Add option to allow putting all parameters onto the next line. This only affects styles where BinPackParameters is false. With AllowAllParametersOnNextLine: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa( aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaa, aaaaaaaaaaa); Without it: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaa, aaaaaaaaaaa); git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@173246 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/clang/Format/Format.h | 4 ++++ lib/Format/Format.cpp | 35 ++++++++++++++++----------------- unittests/Format/FormatTest.cpp | 19 +++++++++++++++--- 3 files changed, 37 insertions(+), 21 deletions(-) diff --git a/include/clang/Format/Format.h b/include/clang/Format/Format.h index ba6a3d9e5f..78523ea36e 100644 --- a/include/clang/Format/Format.h +++ b/include/clang/Format/Format.h @@ -61,6 +61,10 @@ struct FormatStyle { /// will either all be on the same line or will have one line each. bool BinPackParameters; + /// \brief Allow putting all parameters of a function declaration/call onto + /// the next line without calling this bin-packing. + bool AllowAllParametersOnNextLine; + /// \brief If the constructor initializers don't fit on a line, put each /// initializer on its own line. bool ConstructorInitializerAllOnOneLineOrOnePerLine; diff --git a/lib/Format/Format.cpp b/lib/Format/Format.cpp index 391528a031..bdcf5b67fe 100644 --- a/lib/Format/Format.cpp +++ b/lib/Format/Format.cpp @@ -159,6 +159,7 @@ FormatStyle getLLVMStyle() { LLVMStyle.IndentCaseLabels = false; LLVMStyle.SpacesBeforeTrailingComments = 1; LLVMStyle.BinPackParameters = true; + LLVMStyle.AllowAllParametersOnNextLine = true; LLVMStyle.ConstructorInitializerAllOnOneLineOrOnePerLine = false; LLVMStyle.AllowShortIfStatementsOnASingleLine = false; LLVMStyle.ObjCSpaceBeforeProtocolList = true; @@ -175,6 +176,7 @@ FormatStyle getGoogleStyle() { GoogleStyle.IndentCaseLabels = true; GoogleStyle.SpacesBeforeTrailingComments = 2; GoogleStyle.BinPackParameters = false; + GoogleStyle.AllowAllParametersOnNextLine = true; GoogleStyle.ConstructorInitializerAllOnOneLineOrOnePerLine = true; GoogleStyle.AllowShortIfStatementsOnASingleLine = false; GoogleStyle.ObjCSpaceBeforeProtocolList = false; @@ -183,7 +185,7 @@ FormatStyle getGoogleStyle() { FormatStyle getChromiumStyle() { FormatStyle ChromiumStyle = getGoogleStyle(); - ChromiumStyle.AllowShortIfStatementsOnASingleLine = false; + ChromiumStyle.AllowAllParametersOnNextLine = false; return ChromiumStyle; } @@ -607,12 +609,20 @@ private: if (Newline && Previous.is(tok::l_brace)) State.Stack.back().BreakBeforeClosingBrace = true; - // If we are breaking after '(', '{', '<' or ',', we need to break after - // future commas as well to avoid bin packing. - if (!Style.BinPackParameters && Newline && - (Previous.is(tok::comma) || Previous.is(tok::l_paren) || - Previous.is(tok::l_brace) || Previous.Type == TT_TemplateOpener)) - State.Stack.back().BreakAfterComma = true; + if (!Style.BinPackParameters && Newline) { + // If we are breaking after '(', '{', '<', this is not bin packing unless + // AllowAllParametersOnNextLine is false. + if ((Previous.isNot(tok::l_paren) && Previous.isNot(tok::l_brace) && + Previous.Type != TT_TemplateOpener) || + !Style.AllowAllParametersOnNextLine) + State.Stack.back().BreakAfterComma = true; + + // Any break on this level means that the parent level has been broken + // and we need to avoid bin packing there. + for (unsigned i = 0, e = State.Stack.size() - 1; i != e; ++i) { + State.Stack[i].BreakAfterComma = true; + } + } moveStateToNextToken(State); } @@ -642,17 +652,6 @@ private: } State.Stack.push_back( ParenState(NewIndent, State.Stack.back().LastSpace)); - - // If the entire set of parameters will not fit on the current line, we - // will need to break after commas on this level to avoid bin-packing. - if (!Style.BinPackParameters && Current.MatchingParen != NULL && - !Current.Children.empty()) { - if (getColumnLimit() < State.Column + Current.FormatTok.TokenLength + - Current.MatchingParen->TotalLength - - Current.Children[0].TotalLength) { - State.Stack.back().BreakAfterComma = true; - } - } } // If we encounter a closing ), ], } or >, we can remove a level from our diff --git a/unittests/Format/FormatTest.cpp b/unittests/Format/FormatTest.cpp index 7daf7aac6c..c1c1696d9e 100644 --- a/unittests/Format/FormatTest.cpp +++ b/unittests/Format/FormatTest.cpp @@ -964,9 +964,15 @@ TEST_F(FormatTest, FormatsOneParameterPerLineIfNecessary) { " aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));"); verifyGoogleFormat( - "aaaaaaaaaaaaaaa(aaaaaaaaa,\n" - " aaaaaaaaa,\n" - " aaaaaaaaaaaaaaaaaaaaaaa).aaaaaaaaaaaaaaaaaa();"); + "aaaaaaaaaaaaaaa(\n" + " aaaaaaaaa, aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa).aaaaaaaaaaaaaaaaaa();"); + verifyGoogleFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" + " aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaa);"); + + verifyGoogleFormat( + "aaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa,\n" + " aaaaaaaaaaaa,\n" + " aaaaaaaaaaaa);"); verifyGoogleFormat( "somefunction(someotherFunction(ddddddddddddddddddddddddddddddddddd,\n" " ddddddddddddddddddddddddddddd),\n" @@ -979,6 +985,13 @@ TEST_F(FormatTest, FormatsOneParameterPerLineIfNecessary) { verifyGoogleFormat("a(\"a\"\n" " \"a\",\n" " a);"); + + FormatStyle Style = getGoogleStyle(); + Style.AllowAllParametersOnNextLine = false; + verifyFormat("aaaaaaaaaaaaaaa(aaaaaaaaa,\n" + " aaaaaaaaa,\n" + " aaaaaaaaaaaaaaaaaaaaa).aaaaaaaaaaaaaaaaaa();", + Style); } TEST_F(FormatTest, FormatsBuilderPattern) { -- 2.40.0