Skip to content

Commit

Permalink
clang-format: Option to control spacing in template argument lists.
Browse files Browse the repository at this point in the history
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.

llvm-svn: 193614
  • Loading branch information
djasper committed Oct 29, 2013
1 parent f34ac3e commit dd978ae
Show file tree
Hide file tree
Showing 4 changed files with 39 additions and 3 deletions.
8 changes: 6 additions & 2 deletions clang/include/clang/Format/Format.h
Expand Up @@ -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;

Expand Down Expand Up @@ -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 ==
Expand Down
3 changes: 3 additions & 0 deletions clang/lib/Format/Format.cpp
Expand Up @@ -158,6 +158,7 @@ template <> struct MappingTraits<clang::format::FormatStyle> {
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);
Expand Down Expand Up @@ -218,6 +219,7 @@ FormatStyle getLLVMStyle() {
LLVMStyle.SpaceAfterControlStatementKeyword = true;
LLVMStyle.SpaceBeforeAssignmentOperators = true;
LLVMStyle.ContinuationIndentWidth = 4;
LLVMStyle.SpacesInAngles = false;

setDefaultPenalties(LLVMStyle);
LLVMStyle.PenaltyReturnTypeOnItsOwnLine = 60;
Expand Down Expand Up @@ -263,6 +265,7 @@ FormatStyle getGoogleStyle() {
GoogleStyle.SpaceAfterControlStatementKeyword = true;
GoogleStyle.SpaceBeforeAssignmentOperators = true;
GoogleStyle.ContinuationIndentWidth = 4;
GoogleStyle.SpacesInAngles = false;

setDefaultPenalties(GoogleStyle);
GoogleStyle.PenaltyReturnTypeOnItsOwnLine = 200;
Expand Down
5 changes: 4 additions & 1 deletion clang/lib/Format/TokenAnnotator.cpp
Expand Up @@ -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) &&
Expand Down Expand Up @@ -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))
Expand Down
26 changes: 26 additions & 0 deletions clang/unittests/Format/FormatTest.cpp
Expand Up @@ -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);
Expand Down Expand Up @@ -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<A<int> >();", Spaces);

Spaces.Standard = FormatStyle::LS_Cpp11;
Spaces.SpacesInAngles = true;
verifyFormat("A< A< int > >();", Spaces);

Spaces.SpacesInAngles = false;
verifyFormat("A<A<int>>();", Spaces);
}

} // end namespace tooling
} // end namespace clang

0 comments on commit dd978ae

Please sign in to comment.