From d8ee5c1c8709c5fc060a48b598112f6eadb35d96 Mon Sep 17 00:00:00 2001 From: Daniel Jasper Date: Tue, 29 Oct 2013 14:52:02 +0000 Subject: [PATCH] clang-format: Option to control spacing in template argument lists. Same as SpacesInParentheses, this option allows adding a space inside the '<' and '>' of a template parameter list. Patch by Christopher Olsen. This fixes llvm.org/PR17301. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@193614 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/clang/Format/Format.h | 8 ++++++-- lib/Format/Format.cpp | 3 +++ lib/Format/TokenAnnotator.cpp | 5 ++++- unittests/Format/FormatTest.cpp | 26 ++++++++++++++++++++++++++ 4 files changed, 39 insertions(+), 3 deletions(-) diff --git a/include/clang/Format/Format.h b/include/clang/Format/Format.h index fda37ad2b4..ff6ed83353 100644 --- a/include/clang/Format/Format.h +++ b/include/clang/Format/Format.h @@ -221,10 +221,13 @@ struct FormatStyle { /// are not also definitions after the type. bool IndentFunctionDeclarationAfterType; - /// \brief If \c true, spaces will be inserted after every '(' and before - /// every ')'. + /// \brief If \c true, spaces will be inserted after '(' and before ')'. bool SpacesInParentheses; + /// \brief If \c true, spaces will be inserted after '<' and before '>' in + /// template argument lists + bool SpacesInAngles; + /// \brief If \c false, spaces may be inserted into '()'. bool SpaceInEmptyParentheses; @@ -284,6 +287,7 @@ struct FormatStyle { Cpp11BracedListStyle == R.Cpp11BracedListStyle && Standard == R.Standard && TabWidth == R.TabWidth && UseTab == R.UseTab && SpacesInParentheses == R.SpacesInParentheses && + SpacesInAngles == R.SpacesInAngles && SpaceInEmptyParentheses == R.SpaceInEmptyParentheses && SpacesInCStyleCastParentheses == R.SpacesInCStyleCastParentheses && SpaceAfterControlStatementKeyword == diff --git a/lib/Format/Format.cpp b/lib/Format/Format.cpp index 54d0b1f5e2..c75684b3b5 100644 --- a/lib/Format/Format.cpp +++ b/lib/Format/Format.cpp @@ -158,6 +158,7 @@ template <> struct MappingTraits { IO.mapOptional("IndentFunctionDeclarationAfterType", Style.IndentFunctionDeclarationAfterType); IO.mapOptional("SpacesInParentheses", Style.SpacesInParentheses); + IO.mapOptional("SpacesInAngles", Style.SpacesInAngles); IO.mapOptional("SpaceInEmptyParentheses", Style.SpaceInEmptyParentheses); IO.mapOptional("SpacesInCStyleCastParentheses", Style.SpacesInCStyleCastParentheses); @@ -218,6 +219,7 @@ FormatStyle getLLVMStyle() { LLVMStyle.SpaceAfterControlStatementKeyword = true; LLVMStyle.SpaceBeforeAssignmentOperators = true; LLVMStyle.ContinuationIndentWidth = 4; + LLVMStyle.SpacesInAngles = false; setDefaultPenalties(LLVMStyle); LLVMStyle.PenaltyReturnTypeOnItsOwnLine = 60; @@ -263,6 +265,7 @@ FormatStyle getGoogleStyle() { GoogleStyle.SpaceAfterControlStatementKeyword = true; GoogleStyle.SpaceBeforeAssignmentOperators = true; GoogleStyle.ContinuationIndentWidth = 4; + GoogleStyle.SpacesInAngles = false; setDefaultPenalties(GoogleStyle); GoogleStyle.PenaltyReturnTypeOnItsOwnLine = 200; diff --git a/lib/Format/TokenAnnotator.cpp b/lib/Format/TokenAnnotator.cpp index eeecdceb84..799e4c11a5 100644 --- a/lib/Format/TokenAnnotator.cpp +++ b/lib/Format/TokenAnnotator.cpp @@ -1221,6 +1221,9 @@ bool TokenAnnotator::spaceRequiredBetween(const AnnotatedLine &Line, (Left.MatchingParen && Left.MatchingParen->Type == TT_CastRParen)) ? Style.SpacesInCStyleCastParentheses : Style.SpacesInParentheses; + if (Style.SpacesInAngles && + ((Left.Type == TT_TemplateOpener) != (Right.Type == TT_TemplateCloser))) + return true; if (Right.isOneOf(tok::semi, tok::comma)) return false; if (Right.is(tok::less) && @@ -1350,7 +1353,7 @@ bool TokenAnnotator::spaceRequiredBefore(const AnnotatedLine &Line, if (Tok.Previous->is(tok::greater) && Tok.is(tok::greater)) { return Tok.Type == TT_TemplateCloser && Tok.Previous->Type == TT_TemplateCloser && - Style.Standard != FormatStyle::LS_Cpp11; + (Style.Standard != FormatStyle::LS_Cpp11 || Style.SpacesInAngles); } if (Tok.isOneOf(tok::arrowstar, tok::periodstar) || Tok.Previous->isOneOf(tok::arrowstar, tok::periodstar)) diff --git a/unittests/Format/FormatTest.cpp b/unittests/Format/FormatTest.cpp index 83035f72bc..991763cdf7 100644 --- a/unittests/Format/FormatTest.cpp +++ b/unittests/Format/FormatTest.cpp @@ -6592,6 +6592,7 @@ TEST_F(FormatTest, ParsesConfiguration) { CHECK_PARSE_BOOL(Cpp11BracedListStyle); CHECK_PARSE_BOOL(IndentFunctionDeclarationAfterType); CHECK_PARSE_BOOL(SpacesInParentheses); + CHECK_PARSE_BOOL(SpacesInAngles); CHECK_PARSE_BOOL(SpaceInEmptyParentheses); CHECK_PARSE_BOOL(SpacesInCStyleCastParentheses); CHECK_PARSE_BOOL(SpaceAfterControlStatementKeyword); @@ -7010,5 +7011,30 @@ TEST_F(FormatTest, ConfigurableContinuationIndentWidth) { format("int i = longFunction(arg);", SixIndent)); } +TEST_F(FormatTest, SpacesInAngles) { + FormatStyle Spaces = getLLVMStyle(); + Spaces.SpacesInAngles = true; + + verifyFormat("static_cast< int >(arg);", Spaces); + verifyFormat("template < typename T0, typename T1 > void f() {}", Spaces); + verifyFormat("f< int, float >();", Spaces); + verifyFormat("template <> g() {}", Spaces); + verifyFormat("template < std::vector< int > > f() {}", Spaces); + + Spaces.Standard = FormatStyle::LS_Cpp03; + Spaces.SpacesInAngles = true; + verifyFormat("A< A< int > >();", Spaces); + + Spaces.SpacesInAngles = false; + verifyFormat("A >();", Spaces); + + Spaces.Standard = FormatStyle::LS_Cpp11; + Spaces.SpacesInAngles = true; + verifyFormat("A< A< int > >();", Spaces); + + Spaces.SpacesInAngles = false; + verifyFormat("A>();", Spaces); +} + } // end namespace tooling } // end namespace clang -- 2.40.0