From: Reuben Thomas Date: Mon, 8 Apr 2019 12:54:48 +0000 (+0000) Subject: [clang-format] Optionally insert a space after unary ! operator X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=9a63380260860b657b72f07c4f0e61e382ab934a;p=clang [clang-format] Optionally insert a space after unary ! operator git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@357908 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/docs/ClangFormatStyleOptions.rst b/docs/ClangFormatStyleOptions.rst index 0614af3634..dc517e44e9 100644 --- a/docs/ClangFormatStyleOptions.rst +++ b/docs/ClangFormatStyleOptions.rst @@ -1952,6 +1952,13 @@ the configuration (without a prefix: ``Auto``). true: false: (int) i; vs. (int)i; +**SpaceAfterLogicalNot** (``bool``) + If ``true``, a space is inserted after the logical not operator (``!``). + .. code-block:: c++ + + true: false: + ! someExpression(); vs. !someExpression(); + **SpaceAfterTemplateKeyword** (``bool``) If ``true``, a space will be inserted after the 'template' keyword. diff --git a/include/clang/Format/Format.h b/include/clang/Format/Format.h index f5f93dd8b3..ac12dcb542 100644 --- a/include/clang/Format/Format.h +++ b/include/clang/Format/Format.h @@ -1628,6 +1628,13 @@ struct FormatStyle { /// \endcode bool SpaceAfterCStyleCast; + /// If ``true``, a space is inserted after the logical not operator (``!``). + /// \code + /// true: false: + /// ! someExpression(); vs. !someExpression(); + /// \endcode + bool SpaceAfterLogicalNot; + /// If \c true, a space will be inserted after the 'template' keyword. /// \code /// true: false: @@ -1911,6 +1918,7 @@ struct FormatStyle { PointerAlignment == R.PointerAlignment && RawStringFormats == R.RawStringFormats && SpaceAfterCStyleCast == R.SpaceAfterCStyleCast && + SpaceAfterLogicalNot == R.SpaceAfterLogicalNot && SpaceAfterTemplateKeyword == R.SpaceAfterTemplateKeyword && SpaceBeforeAssignmentOperators == R.SpaceBeforeAssignmentOperators && SpaceBeforeCpp11BracedList == R.SpaceBeforeCpp11BracedList && diff --git a/lib/Format/Format.cpp b/lib/Format/Format.cpp index e2326423a7..2d8596a42a 100644 --- a/lib/Format/Format.cpp +++ b/lib/Format/Format.cpp @@ -478,6 +478,7 @@ template <> struct MappingTraits { IO.mapOptional("SortIncludes", Style.SortIncludes); IO.mapOptional("SortUsingDeclarations", Style.SortUsingDeclarations); IO.mapOptional("SpaceAfterCStyleCast", Style.SpaceAfterCStyleCast); + IO.mapOptional("SpaceAfterLogicalNot", Style.SpaceAfterLogicalNot); IO.mapOptional("SpaceAfterTemplateKeyword", Style.SpaceAfterTemplateKeyword); IO.mapOptional("SpaceBeforeAssignmentOperators", @@ -730,6 +731,7 @@ FormatStyle getLLVMStyle(FormatStyle::LanguageKind Language) { LLVMStyle.SpacesInContainerLiterals = true; LLVMStyle.SpacesInCStyleCastParentheses = false; LLVMStyle.SpaceAfterCStyleCast = false; + LLVMStyle.SpaceAfterLogicalNot = false; LLVMStyle.SpaceAfterTemplateKeyword = true; LLVMStyle.SpaceBeforeCtorInitializerColon = true; LLVMStyle.SpaceBeforeInheritanceColon = true; diff --git a/lib/Format/TokenAnnotator.cpp b/lib/Format/TokenAnnotator.cpp index 8f64e3cf98..032be722b2 100644 --- a/lib/Format/TokenAnnotator.cpp +++ b/lib/Format/TokenAnnotator.cpp @@ -2832,7 +2832,8 @@ bool TokenAnnotator::spaceRequiredBefore(const AnnotatedLine &Line, return true; } if (Left.is(TT_UnaryOperator)) - return Right.is(TT_BinaryOperator); + return (Style.SpaceAfterLogicalNot && Left.is(tok::exclaim)) || + Right.is(TT_BinaryOperator); // If the next token is a binary operator or a selector name, we have // incorrectly classified the parenthesis as a cast. FIXME: Detect correctly. diff --git a/unittests/Format/FormatTest.cpp b/unittests/Format/FormatTest.cpp index 3256ea54ab..1839172047 100644 --- a/unittests/Format/FormatTest.cpp +++ b/unittests/Format/FormatTest.cpp @@ -9719,6 +9719,17 @@ TEST_F(FormatTest, ConfigurableSpaceBeforeParens) { verifyFormat("auto lambda = []() { return 0; };", SomeSpace); } +TEST_F(FormatTest, SpaceAfterLogicalNot) { + FormatStyle Spaces = getLLVMStyle(); + Spaces.SpaceAfterLogicalNot = true; + + verifyFormat("bool x = ! y", Spaces); + verifyFormat("if (! isFailure())", Spaces); + verifyFormat("if (! (a && b))", Spaces); + verifyFormat("\"Error!\"", Spaces); + verifyFormat("! ! x", Spaces); +} + TEST_F(FormatTest, ConfigurableSpacesInParentheses) { FormatStyle Spaces = getLLVMStyle(); @@ -11511,6 +11522,12 @@ TEST_F(FormatTest, ParsesConfiguration) { CHECK_PARSE("SpaceAfterControlStatementKeyword: true", SpaceBeforeParens, FormatStyle::SBPO_ControlStatements); + Style.SpaceAfterLogicalNot = false; + CHECK_PARSE("SpaceAfterLogicalNot: true", SpaceAfterLogicalNot, + true); + CHECK_PARSE("SpaceAfterLogicalNot: false", SpaceAfterLogicalNot, + false); + Style.ColumnLimit = 123; FormatStyle BaseStyle = getLLVMStyle(); CHECK_PARSE("BasedOnStyle: LLVM", ColumnLimit, BaseStyle.ColumnLimit);