summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDaniel Jasper <djasper@google.com>2013-08-20 12:36:34 +0000
committerDaniel Jasper <djasper@google.com>2013-08-20 12:36:34 +0000
commitb55acad91c37bf70455e8ff1803fc1a0b10ad859 (patch)
tree912a08541ed2848242bf8c1e937a7106f603c882
parent5e5e5a92b46d710c85d1f751154b45b80fb37aa3 (diff)
downloadbcm5719-llvm-b55acad91c37bf70455e8ff1803fc1a0b10ad859.tar.gz
bcm5719-llvm-b55acad91c37bf70455e8ff1803fc1a0b10ad859.zip
clang-format: Additional options for spaces around parentheses.
This patch adds four new options to control: - Spaces after control keyworks (if(..) vs if (..)) - Spaces in empty parentheses (f( ) vs f()) - Spaces in c-style casts (( int )1.0 vs (int)1.0) - Spaces in other parentheses (f(a) vs f( a )) Patch by Joe Hermaszewski. Thank you for working on this! llvm-svn: 188793
-rw-r--r--clang/include/clang/Format/Format.h22
-rw-r--r--clang/lib/Format/Format.cpp15
-rw-r--r--clang/lib/Format/TokenAnnotator.cpp19
-rw-r--r--clang/unittests/Format/FormatTest.cpp86
4 files changed, 135 insertions, 7 deletions
diff --git a/clang/include/clang/Format/Format.h b/clang/include/clang/Format/Format.h
index d6062e5c6af..658977c3237 100644
--- a/clang/include/clang/Format/Format.h
+++ b/clang/include/clang/Format/Format.h
@@ -194,6 +194,20 @@ struct FormatStyle {
/// are not also definitions after the type.
bool IndentFunctionDeclarationAfterType;
+ /// \brief If \c true, spaces will be inserted after every '(' and before
+ /// every ')'.
+ bool SpacesInParentheses;
+
+ /// \brief If \c false, spaces may be inserted into '()'.
+ bool SpaceInEmptyParentheses;
+
+ /// \brief If \c false, spaces may be inserted into C style casts.
+ bool SpacesInCStyleCastParentheses;
+
+ /// \brief If \c true, spaces will be inserted between 'for'/'if'/'while'/...
+ /// and '('.
+ bool SpaceAfterControlStatementKeyword;
+
bool operator==(const FormatStyle &R) const {
return AccessModifierOffset == R.AccessModifierOffset &&
ConstructorInitializerIndentWidth ==
@@ -231,7 +245,13 @@ struct FormatStyle {
Cpp11BracedListStyle == R.Cpp11BracedListStyle &&
Standard == R.Standard && UseTab == R.UseTab &&
IndentFunctionDeclarationAfterType ==
- R.IndentFunctionDeclarationAfterType;
+ R.IndentFunctionDeclarationAfterType &&
+ SpacesInParentheses == R.SpacesInParentheses &&
+ SpaceInEmptyParentheses == R.SpaceInEmptyParentheses &&
+ SpacesInCStyleCastParentheses ==
+ R.SpacesInCStyleCastParentheses &&
+ SpaceAfterControlStatementKeyword ==
+ R.SpaceAfterControlStatementKeyword;
}
};
diff --git a/clang/lib/Format/Format.cpp b/clang/lib/Format/Format.cpp
index 20a2af50121..c4a5e88de77 100644
--- a/clang/lib/Format/Format.cpp
+++ b/clang/lib/Format/Format.cpp
@@ -137,6 +137,13 @@ template <> struct MappingTraits<clang::format::FormatStyle> {
IO.mapOptional("BreakBeforeBraces", Style.BreakBeforeBraces);
IO.mapOptional("IndentFunctionDeclarationAfterType",
Style.IndentFunctionDeclarationAfterType);
+ IO.mapOptional("SpacesInParentheses", Style.SpacesInParentheses);
+ IO.mapOptional("SpaceInEmptyParentheses",
+ Style.SpaceInEmptyParentheses);
+ IO.mapOptional("SpacesInCStyleCastParentheses",
+ Style.SpacesInCStyleCastParentheses);
+ IO.mapOptional("SpaceAfterControlStatementKeyword",
+ Style.SpaceAfterControlStatementKeyword);
}
};
}
@@ -182,6 +189,10 @@ FormatStyle getLLVMStyle() {
LLVMStyle.SpacesBeforeTrailingComments = 1;
LLVMStyle.Standard = FormatStyle::LS_Cpp03;
LLVMStyle.UseTab = false;
+ LLVMStyle.SpacesInParentheses = false;
+ LLVMStyle.SpaceInEmptyParentheses = false;
+ LLVMStyle.SpacesInCStyleCastParentheses = false;
+ LLVMStyle.SpaceAfterControlStatementKeyword = true;
setDefaultPenalties(LLVMStyle);
LLVMStyle.PenaltyReturnTypeOnItsOwnLine = 60;
@@ -219,6 +230,10 @@ FormatStyle getGoogleStyle() {
GoogleStyle.SpacesBeforeTrailingComments = 2;
GoogleStyle.Standard = FormatStyle::LS_Auto;
GoogleStyle.UseTab = false;
+ GoogleStyle.SpacesInParentheses = false;
+ GoogleStyle.SpaceInEmptyParentheses = false;
+ GoogleStyle.SpacesInCStyleCastParentheses = false;
+ GoogleStyle.SpaceAfterControlStatementKeyword = true;
setDefaultPenalties(GoogleStyle);
GoogleStyle.PenaltyReturnTypeOnItsOwnLine = 200;
diff --git a/clang/lib/Format/TokenAnnotator.cpp b/clang/lib/Format/TokenAnnotator.cpp
index ad6f41005cf..ee3ca67d27c 100644
--- a/clang/lib/Format/TokenAnnotator.cpp
+++ b/clang/lib/Format/TokenAnnotator.cpp
@@ -1120,7 +1120,14 @@ bool TokenAnnotator::spaceRequiredBetween(const AnnotatedLine &Line,
return Left.is(tok::hash);
if (Left.isOneOf(tok::hashhash, tok::hash))
return Right.is(tok::hash);
- if (Right.isOneOf(tok::r_paren, tok::semi, tok::comma))
+ if (Left.is(tok::l_paren) && Right.is(tok::r_paren))
+ return Style.SpaceInEmptyParentheses;
+ if (Left.is(tok::l_paren) || Right.is(tok::r_paren))
+ return Right.Type == TT_CastRParen ||
+ (Left.MatchingParen && Left.MatchingParen->Type == TT_CastRParen)
+ ? Style.SpacesInCStyleCastParentheses
+ : Style.SpacesInParentheses;
+ if (Right.isOneOf(tok::semi, tok::comma))
return false;
if (Right.is(tok::less) &&
(Left.is(tok::kw_template) ||
@@ -1168,17 +1175,17 @@ bool TokenAnnotator::spaceRequiredBetween(const AnnotatedLine &Line,
return Left.Type != TT_ObjCMethodExpr;
if (Right.is(tok::colon))
return Right.Type != TT_ObjCMethodExpr && !Left.is(tok::question);
- if (Left.is(tok::l_paren))
- return false;
if (Right.is(tok::l_paren)) {
if (Left.is(tok::r_paren) && Left.MatchingParen &&
Left.MatchingParen->Previous &&
Left.MatchingParen->Previous->is(tok::kw___attribute))
return true;
return Line.Type == LT_ObjCDecl ||
- Left.isOneOf(tok::kw_if, tok::kw_for, tok::kw_while, tok::kw_switch,
- tok::kw_return, tok::kw_catch, tok::kw_new,
- tok::kw_delete, tok::semi);
+ Left.isOneOf(tok::kw_return, tok::kw_new,
+ tok::kw_delete, tok::semi) ||
+ (Style.SpaceAfterControlStatementKeyword &&
+ Left.isOneOf(tok::kw_if, tok::kw_for, tok::kw_while, tok::kw_switch,
+ tok::kw_catch));
}
if (Left.is(tok::at) && Right.Tok.getObjCKeywordID() != tok::objc_not_keyword)
return false;
diff --git a/clang/unittests/Format/FormatTest.cpp b/clang/unittests/Format/FormatTest.cpp
index e9384c46440..5ebae5f6b27 100644
--- a/clang/unittests/Format/FormatTest.cpp
+++ b/clang/unittests/Format/FormatTest.cpp
@@ -5424,6 +5424,88 @@ TEST_F(FormatTest, ConfigurableUseOfTab) {
"}"));
}
+TEST_F(FormatTest, ConfigurableSpaceAfterControlStatementKeyword) {
+ FormatStyle NoSpace = getLLVMStyle();
+ NoSpace.SpaceAfterControlStatementKeyword = false;
+
+ verifyFormat("while(true)\n"
+ " continue;", NoSpace);
+ verifyFormat("for(;;)\n"
+ " continue;", NoSpace);
+ verifyFormat("if(true)\n"
+ " f();\n"
+ "else if(true)\n"
+ " f();", NoSpace);
+ verifyFormat("do {\n"
+ " do_something();\n"
+ "} while(something());", NoSpace);
+ verifyFormat("switch(x) {\n"
+ "default:\n"
+ " break;\n"
+ "}", NoSpace);
+}
+
+TEST_F(FormatTest, ConfigurableSpacesInParentheses) {
+ FormatStyle Spaces = getLLVMStyle();
+
+ Spaces.SpacesInParentheses = true;
+ verifyFormat("call( x, y, z );", Spaces);
+ verifyFormat("while ( (bool)1 )\n"
+ " continue;", Spaces);
+ verifyFormat("for ( ;; )\n"
+ " continue;", Spaces);
+ verifyFormat("if ( true )\n"
+ " f();\n"
+ "else if ( true )\n"
+ " f();", Spaces);
+ verifyFormat("do {\n"
+ " do_something( (int)i );\n"
+ "} while ( something() );", Spaces);
+ verifyFormat("switch ( x ) {\n"
+ "default:\n"
+ " break;\n"
+ "}", Spaces);
+
+ Spaces.SpacesInParentheses = false;
+ Spaces.SpacesInCStyleCastParentheses = true;
+ verifyFormat("Type *A = ( Type * )P;", Spaces);
+ verifyFormat("Type *A = ( vector<Type *, int *> )P;", Spaces);
+ verifyFormat("x = ( int32 )y;", Spaces);
+ verifyFormat("int a = ( int )(2.0f);", Spaces);
+ verifyFormat("#define AA(X) sizeof((( X * )NULL)->a)", Spaces);
+ verifyFormat("my_int a = ( my_int )sizeof(int);", Spaces);
+ verifyFormat("#define x (( int )-1)", Spaces);
+
+ Spaces.SpacesInParentheses = false;
+ Spaces.SpaceInEmptyParentheses = true;
+ verifyFormat("call(x, y, z);", Spaces);
+ verifyFormat("call( )", Spaces);
+
+ // Run the first set of tests again with
+ // Spaces.SpacesInParentheses = false,
+ // Spaces.SpaceInEmptyParentheses = true and
+ // Spaces.SpacesInCStyleCastParentheses = true
+ Spaces.SpacesInParentheses = false,
+ Spaces.SpaceInEmptyParentheses = true;
+ Spaces.SpacesInCStyleCastParentheses = true;
+ verifyFormat("call(x, y, z);", Spaces);
+ verifyFormat("while (( bool )1)\n"
+ " continue;", Spaces);
+ verifyFormat("for (;;)\n"
+ " continue;", Spaces);
+ verifyFormat("if (true)\n"
+ " f( );\n"
+ "else if (true)\n"
+ " f( );", Spaces);
+ verifyFormat("do {\n"
+ " do_something(( int )i);\n"
+ "} while (something( ));", Spaces);
+ verifyFormat("switch (x) {\n"
+ "default:\n"
+ " break;\n"
+ "}", Spaces);
+}
+
TEST_F(FormatTest, LinuxBraceBreaking) {
FormatStyle BreakBeforeBrace = getLLVMStyle();
BreakBeforeBrace.BreakBeforeBraces = FormatStyle::BS_Linux;
@@ -5661,6 +5743,10 @@ TEST_F(FormatTest, ParsesConfiguration) {
CHECK_PARSE_BOOL(Cpp11BracedListStyle);
CHECK_PARSE_BOOL(UseTab);
CHECK_PARSE_BOOL(IndentFunctionDeclarationAfterType);
+ CHECK_PARSE_BOOL(SpacesInParentheses);
+ CHECK_PARSE_BOOL(SpaceInEmptyParentheses);
+ CHECK_PARSE_BOOL(SpacesInCStyleCastParentheses);
+ CHECK_PARSE_BOOL(SpaceAfterControlStatementKeyword);
CHECK_PARSE("AccessModifierOffset: -1234", AccessModifierOffset, -1234);
CHECK_PARSE("ConstructorInitializerIndentWidth: 1234",
OpenPOWER on IntegriCloud