From: Daniel Jasper Date: Wed, 13 Feb 2013 20:33:44 +0000 (+0000) Subject: Allow breaking after the return type in function declarations. X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=b9caeacd0213ebbde79d096534b46603106e94b4;p=platform%2Fupstream%2Fllvm.git Allow breaking after the return type in function declarations. This has so far been disabled for Google style, but should be done before breaking at nested name specifiers or in template parameters. Before (in Google style): template aaaaaaaa::aaaaa::aaaaaa aaaaaaaaaaaaaaaaaaaaaaaa< T>::aaaaaaa() {} After: template aaaaaaaa::aaaaa::aaaaaa aaaaaaaaaaaaaaaaaaaaaaaa::aaaaaaa() {} llvm-svn: 175074 --- diff --git a/clang/include/clang/Format/Format.h b/clang/include/clang/Format/Format.h index 75b809b..d6cc114 100644 --- a/clang/include/clang/Format/Format.h +++ b/clang/include/clang/Format/Format.h @@ -77,8 +77,9 @@ struct FormatStyle { /// the next line even if \c BinPackParameters is \c false. bool AllowAllParametersOfDeclarationOnNextLine; - /// \brief Allow putting the return type of a function onto its own line. - bool AllowReturnTypeOnItsOwnLine; + /// \brief Penalty for putting the return type of a function onto its own + /// line. + unsigned PenaltyReturnTypeOnItsOwnLine; /// \brief If the constructor initializers don't fit on a line, put each /// initializer on its own line. diff --git a/clang/lib/Format/Format.cpp b/clang/lib/Format/Format.cpp index d8c02e2..8c2128e 100644 --- a/clang/lib/Format/Format.cpp +++ b/clang/lib/Format/Format.cpp @@ -43,11 +43,11 @@ FormatStyle getLLVMStyle() { LLVMStyle.SpacesBeforeTrailingComments = 1; LLVMStyle.BinPackParameters = true; LLVMStyle.AllowAllParametersOfDeclarationOnNextLine = true; - LLVMStyle.AllowReturnTypeOnItsOwnLine = true; LLVMStyle.ConstructorInitializerAllOnOneLineOrOnePerLine = false; LLVMStyle.AllowShortIfStatementsOnASingleLine = false; LLVMStyle.ObjCSpaceBeforeProtocolList = true; LLVMStyle.PenaltyExcessCharacter = 1000000; + LLVMStyle.PenaltyReturnTypeOnItsOwnLine = 5; return LLVMStyle; } @@ -63,11 +63,11 @@ FormatStyle getGoogleStyle() { GoogleStyle.SpacesBeforeTrailingComments = 2; GoogleStyle.BinPackParameters = false; GoogleStyle.AllowAllParametersOfDeclarationOnNextLine = true; - GoogleStyle.AllowReturnTypeOnItsOwnLine = false; GoogleStyle.ConstructorInitializerAllOnOneLineOrOnePerLine = true; GoogleStyle.AllowShortIfStatementsOnASingleLine = false; GoogleStyle.ObjCSpaceBeforeProtocolList = false; GoogleStyle.PenaltyExcessCharacter = 1000000; + GoogleStyle.PenaltyReturnTypeOnItsOwnLine = 100; return GoogleStyle; } @@ -717,9 +717,10 @@ private: reconstructPath(State, Current->Previous); DEBUG({ if (Current->NewLine) { - llvm::errs() << "Penalty for splitting before " - << Current->State.NextToken->FormatTok.Tok.getName() - << ": " << Current->State.NextToken->SplitPenalty << "\n"; + llvm::errs() + << "Penalty for splitting before " + << Current->Previous->State.NextToken->FormatTok.Tok.getName() + << ": " << Current->Previous->State.NextToken->SplitPenalty << "\n"; } }); addTokenToState(Current->NewLine, false, State); diff --git a/clang/lib/Format/TokenAnnotator.cpp b/clang/lib/Format/TokenAnnotator.cpp index d2e19af..4c36536 100644 --- a/clang/lib/Format/TokenAnnotator.cpp +++ b/clang/lib/Format/TokenAnnotator.cpp @@ -847,6 +847,8 @@ unsigned TokenAnnotator::splitPenalty(const AnnotatedLine &Line, const AnnotatedToken &Left = *Tok.Parent; const AnnotatedToken &Right = Tok; + if (Right.Type == TT_StartOfName) + return Style.PenaltyReturnTypeOnItsOwnLine; if (Left.is(tok::l_brace) && Right.isNot(tok::l_brace)) return 50; if (Left.is(tok::equal) && Right.is(tok::l_brace)) @@ -1026,7 +1028,7 @@ bool TokenAnnotator::spaceRequiredBefore(const AnnotatedLine &Line, bool TokenAnnotator::canBreakBefore(const AnnotatedLine &Line, const AnnotatedToken &Right) { const AnnotatedToken &Left = *Right.Parent; - if (Right.Type == TT_StartOfName && Style.AllowReturnTypeOnItsOwnLine) + if (Right.Type == TT_StartOfName) return true; if (Right.is(tok::colon) && Right.Type == TT_ObjCMethodExpr) return false; diff --git a/clang/unittests/Format/FormatTest.cpp b/clang/unittests/Format/FormatTest.cpp index 8fb4b2a..f72aad7 100644 --- a/clang/unittests/Format/FormatTest.cpp +++ b/clang/unittests/Format/FormatTest.cpp @@ -1763,6 +1763,14 @@ TEST_F(FormatTest, BreaksFunctionDeclarations) { verifyGoogleFormat( "TypeSpecDecl* TypeSpecDecl::Create(\n" " ASTContext& C, DeclContext* DC, SourceLocation L) {\n}"); + verifyGoogleFormat( + "some_namespace::LongReturnType\n" + "long_namespace::SomeVeryLongClass::SomeVeryLongFunction(\n" + " int first_long_parameter, int second_parameter) {\n}"); + + verifyGoogleFormat("template \n" + "aaaaaaaa::aaaaa::aaaaaa\n" + "aaaaaaaaaaaaaaaaaaaaaaaa::aaaaaaa() {\n}"); } TEST_F(FormatTest, LineStartsWithSpecialCharacter) {