Index: docs/ClangFormatStyleOptions.rst
===================================================================
--- docs/ClangFormatStyleOptions.rst
+++ docs/ClangFormatStyleOptions.rst
@@ -724,6 +724,12 @@
**SpacesInSquareBrackets** (``bool``)
If ``true``, spaces will be inserted after ``[`` and before ``]``.
+**SpacesAroundConditions** (``bool``)
+ If ``true``, spaces will be inserted around if/for/while conditions.
+
+**SpacesAfterNot** (``bool``)
+ If ``true``, spaces will be inserted after ``!``.
+
**Standard** (``LanguageStandard``)
Format compatible with this standard, e.g. use ``A >``
instead of ``A>`` for ``LS_Cpp03``.
Index: include/clang/Format/Format.h
===================================================================
--- include/clang/Format/Format.h
+++ include/clang/Format/Format.h
@@ -600,6 +600,12 @@
/// \brief If ``true``, spaces will be inserted after ``[`` and before ``]``.
bool SpacesInSquareBrackets;
+ /// \brief If ``true``, spaces will be inserted around if/for/while conditions.
+ bool SpacesAroundConditions;
+
+ /// \brief If ``true``, spaces will be inserted after ``!``.
+ bool SpacesAfterNot;
+
/// \brief Supported language standards.
enum LanguageStandard {
/// Use C++03-compatible syntax.
@@ -711,6 +717,8 @@
SpacesInCStyleCastParentheses == R.SpacesInCStyleCastParentheses &&
SpacesInParentheses == R.SpacesInParentheses &&
SpacesInSquareBrackets == R.SpacesInSquareBrackets &&
+ SpacesAfterNot == R.SpacesAfterNot &&
+ SpacesAroundConditions == R.SpacesAroundConditions &&
Standard == R.Standard && TabWidth == R.TabWidth &&
UseTab == R.UseTab;
}
Index: lib/Format/Format.cpp
===================================================================
--- lib/Format/Format.cpp
+++ lib/Format/Format.cpp
@@ -352,6 +352,10 @@
Style.SpacesInCStyleCastParentheses);
IO.mapOptional("SpacesInParentheses", Style.SpacesInParentheses);
IO.mapOptional("SpacesInSquareBrackets", Style.SpacesInSquareBrackets);
+ IO.mapOptional("SpacesAfterNot",
+ Style.SpacesAfterNot);
+ IO.mapOptional("SpacesAroundConditions",
+ Style.SpacesAroundConditions);
IO.mapOptional("Standard", Style.Standard);
IO.mapOptional("TabWidth", Style.TabWidth);
IO.mapOptional("UseTab", Style.UseTab);
@@ -557,6 +561,8 @@
LLVMStyle.SpaceBeforeParens = FormatStyle::SBPO_ControlStatements;
LLVMStyle.SpaceBeforeAssignmentOperators = true;
LLVMStyle.SpacesInAngles = false;
+ LLVMStyle.SpacesAfterNot = false;
+ LLVMStyle.SpacesAroundConditions = false;
LLVMStyle.PenaltyBreakComment = 300;
LLVMStyle.PenaltyBreakFirstLessLess = 120;
Index: lib/Format/TokenAnnotator.cpp
===================================================================
--- lib/Format/TokenAnnotator.cpp
+++ lib/Format/TokenAnnotator.cpp
@@ -1984,6 +1984,16 @@
return Right.is(tok::hash);
if (Left.is(tok::l_paren) && Right.is(tok::r_paren))
return Style.SpaceInEmptyParentheses;
+ if (Style.SpacesAroundConditions) {
+ if (Left.is(tok::l_paren) && Left.Previous &&
+ Left.Previous->isOneOf(tok::kw_if, tok::pp_elif, tok::kw_for, tok::kw_while,
+ tok::kw_switch, TT_ForEachMacro))
+ return true;
+ if (Right.is(tok::r_paren) && Right.MatchingParen && Right.MatchingParen->Previous &&
+ Right.MatchingParen->Previous->isOneOf(tok::kw_if, tok::pp_elif, tok::kw_for, tok::kw_while,
+ tok::kw_switch, TT_ForEachMacro))
+ return true;
+ }
if (Left.is(tok::l_paren) || Right.is(tok::r_paren))
return (Right.is(TT_CastRParen) ||
(Left.MatchingParen && Left.MatchingParen->is(TT_CastRParen)))
@@ -2219,6 +2229,8 @@
return Style.SpacesInContainerLiterals;
return true;
}
+ if (Style.SpacesAfterNot && Left.is(tok::exclaim))
+ return true;
if (Left.is(TT_UnaryOperator))
return Right.is(TT_BinaryOperator);
@@ -2237,7 +2249,7 @@
if (!Style.SpaceBeforeAssignmentOperators &&
Right.getPrecedence() == prec::Assignment)
return false;
- if (Right.is(tok::coloncolon) && !Left.isOneOf(tok::l_brace, tok::comment))
+ if (Right.is(tok::coloncolon) && !Left.isOneOf(tok::l_brace, tok::comment, tok::l_paren))
return (Left.is(TT_TemplateOpener) &&
Style.Standard == FormatStyle::LS_Cpp03) ||
!(Left.isOneOf(tok::identifier, tok::l_paren, tok::r_paren,
Index: unittests/Format/FormatTest.cpp
===================================================================
--- unittests/Format/FormatTest.cpp
+++ unittests/Format/FormatTest.cpp
@@ -10194,6 +10194,8 @@
CHECK_PARSE_BOOL(SpaceAfterCStyleCast);
CHECK_PARSE_BOOL(SpaceAfterTemplateKeyword);
CHECK_PARSE_BOOL(SpaceBeforeAssignmentOperators);
+ CHECK_PARSE_BOOL(SpacesAfterNot);
+ CHECK_PARSE_BOOL(SpacesAroundConditions);
CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterClass);
CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterControlStatement);
@@ -11500,6 +11502,24 @@
verifyFormat("include \"a.td\"\ninclude \"b.td\"", Style);
}
+TEST_F(FormatTest, SpacesAfterNot) {
+ FormatStyle Spaces = getLLVMStyle();
+ Spaces.SpacesAfterNot = true;
+ verifyFormat("if (! a)\n return;", Spaces);
+ verifyFormat("while (! (x || y))\n return;", Spaces);
+ verifyFormat("do {\n} while (! foo);", Spaces);
+}
+
+TEST_F(FormatTest, SpacesAroundConditions) {
+ FormatStyle Spaces = getLLVMStyle();
+ Spaces.SpacesAroundConditions = true;
+ verifyFormat("if ( !a )\n return;", Spaces);
+ verifyFormat("if ( a )\n return;", Spaces);
+ verifyFormat("while ( a )\n return;", Spaces);
+ verifyFormat("while ( (a && b) )\n return;", Spaces);
+ verifyFormat("do {\n} while ( 1 != 0 );", Spaces);
+}
+
// Since this test case uses UNIX-style file path. We disable it for MS
// compiler.
#if !defined(_MSC_VER) && !defined(__MINGW32__)