[llvm-branch-commits] [clang] 47877c9 - [clang-format] Add SpaceBeforeCaseColon option
Björn Schäpers via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Wed Dec 23 13:12:46 PST 2020
Author: Björn Schäpers
Date: 2020-12-23T22:07:14+01:00
New Revision: 47877c9079c27f19a954b660201ea47717c82fec
URL: https://github.com/llvm/llvm-project/commit/47877c9079c27f19a954b660201ea47717c82fec
DIFF: https://github.com/llvm/llvm-project/commit/47877c9079c27f19a954b660201ea47717c82fec.diff
LOG: [clang-format] Add SpaceBeforeCaseColon option
With which you can add a space before the colon of a case or default
statement.
Differential Revision: https://reviews.llvm.org/D93240
Added:
Modified:
clang/docs/ClangFormatStyleOptions.rst
clang/docs/ReleaseNotes.rst
clang/include/clang/Format/Format.h
clang/lib/Format/Format.cpp
clang/lib/Format/TokenAnnotator.cpp
clang/unittests/Format/FormatTest.cpp
Removed:
################################################################################
diff --git a/clang/docs/ClangFormatStyleOptions.rst b/clang/docs/ClangFormatStyleOptions.rst
index 32942648378b..c58bb1af7ae6 100644
--- a/clang/docs/ClangFormatStyleOptions.rst
+++ b/clang/docs/ClangFormatStyleOptions.rst
@@ -2839,6 +2839,16 @@ the configuration (without a prefix: ``Auto``).
int a = 5; vs. int a= 5;
a += 42; a+= 42;
+**SpaceBeforeCaseColon** (``bool``)
+ If ``false``, spaces will be removed before case colon.
+
+ .. code-block:: c++
+
+ true: false
+ switch (x) { vs. switch (x) {
+ case 1 : break; case 1: break;
+ } }
+
**SpaceBeforeCpp11BracedList** (``bool``)
If ``true``, a space will be inserted before a C++11 braced list
used to initialize an object (after the preceding identifier or type).
diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index dd4de2d2015f..76d4b6bb5acd 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -293,6 +293,9 @@ clang-format
- Option ``IndentPragmas`` has been added to allow #pragma to indented with the current scope level. This is especially useful when using #pragma to mark OpenMP sections of code.
+- Option ``SpaceBeforeCaseColon`` has been added to add a space before the
+ colon in a case or default statement.
+
libclang
--------
diff --git a/clang/include/clang/Format/Format.h b/clang/include/clang/Format/Format.h
index 9b8309213261..c6a9818a8940 100644
--- a/clang/include/clang/Format/Format.h
+++ b/clang/include/clang/Format/Format.h
@@ -2438,6 +2438,15 @@ struct FormatStyle {
/// \endcode
bool SpaceBeforeAssignmentOperators;
+ /// If ``false``, spaces will be removed before case colon.
+ /// \code
+ /// true: false
+ /// switch (x) { vs. switch (x) {
+ /// case 1 : break; case 1: break;
+ /// } }
+ /// \endcode
+ bool SpaceBeforeCaseColon;
+
/// If ``true``, a space will be inserted before a C++11 braced list
/// used to initialize an object (after the preceding identifier or type).
/// \code
@@ -2820,6 +2829,7 @@ struct FormatStyle {
SpaceAfterLogicalNot == R.SpaceAfterLogicalNot &&
SpaceAfterTemplateKeyword == R.SpaceAfterTemplateKeyword &&
SpaceBeforeAssignmentOperators == R.SpaceBeforeAssignmentOperators &&
+ SpaceBeforeCaseColon == R.SpaceBeforeCaseColon &&
SpaceBeforeCpp11BracedList == R.SpaceBeforeCpp11BracedList &&
SpaceBeforeCtorInitializerColon ==
R.SpaceBeforeCtorInitializerColon &&
diff --git a/clang/lib/Format/Format.cpp b/clang/lib/Format/Format.cpp
index 55abc12c61c4..54424ae190e2 100644
--- a/clang/lib/Format/Format.cpp
+++ b/clang/lib/Format/Format.cpp
@@ -608,6 +608,7 @@ template <> struct MappingTraits<FormatStyle> {
Style.SpaceAfterTemplateKeyword);
IO.mapOptional("SpaceBeforeAssignmentOperators",
Style.SpaceBeforeAssignmentOperators);
+ IO.mapOptional("SpaceBeforeCaseColon", Style.SpaceBeforeCaseColon);
IO.mapOptional("SpaceBeforeCpp11BracedList",
Style.SpaceBeforeCpp11BracedList);
IO.mapOptional("SpaceBeforeCtorInitializerColon",
@@ -958,6 +959,7 @@ FormatStyle getLLVMStyle(FormatStyle::LanguageKind Language) {
LLVMStyle.SpaceAfterLogicalNot = false;
LLVMStyle.SpaceAfterTemplateKeyword = true;
LLVMStyle.SpaceAroundPointerQualifiers = FormatStyle::SAPQ_Default;
+ LLVMStyle.SpaceBeforeCaseColon = false;
LLVMStyle.SpaceBeforeCtorInitializerColon = true;
LLVMStyle.SpaceBeforeInheritanceColon = true;
LLVMStyle.SpaceBeforeParens = FormatStyle::SBPO_ControlStatements;
diff --git a/clang/lib/Format/TokenAnnotator.cpp b/clang/lib/Format/TokenAnnotator.cpp
index a0cb86cfcebf..1588f7d08184 100755
--- a/clang/lib/Format/TokenAnnotator.cpp
+++ b/clang/lib/Format/TokenAnnotator.cpp
@@ -896,7 +896,8 @@ class AnnotatingParser {
} else if (CurrentToken && CurrentToken->is(tok::numeric_constant)) {
Tok->setType(TT_BitFieldColon);
} else if (Contexts.size() == 1 &&
- !Line.First->isOneOf(tok::kw_enum, tok::kw_case)) {
+ !Line.First->isOneOf(tok::kw_enum, tok::kw_case,
+ tok::kw_default)) {
FormatToken *Prev = Tok->getPreviousNonComment();
if (Prev->isOneOf(tok::r_paren, tok::kw_noexcept))
Tok->setType(TT_CtorInitializerColon);
@@ -3347,8 +3348,9 @@ bool TokenAnnotator::spaceRequiredBefore(const AnnotatedLine &Line,
return Style.BitFieldColonSpacing == FormatStyle::BFCS_Both ||
Style.BitFieldColonSpacing == FormatStyle::BFCS_After;
if (Right.is(tok::colon)) {
- if (Line.First->isOneOf(tok::kw_case, tok::kw_default) ||
- !Right.getNextNonComment() || Right.getNextNonComment()->is(tok::semi))
+ if (Line.First->isOneOf(tok::kw_default, tok::kw_case))
+ return Style.SpaceBeforeCaseColon;
+ if (!Right.getNextNonComment() || Right.getNextNonComment()->is(tok::semi))
return false;
if (Right.is(TT_ObjCMethodExpr))
return false;
diff --git a/clang/unittests/Format/FormatTest.cpp b/clang/unittests/Format/FormatTest.cpp
index ee757c14eafb..b6d9e67273ac 100644
--- a/clang/unittests/Format/FormatTest.cpp
+++ b/clang/unittests/Format/FormatTest.cpp
@@ -12091,6 +12091,17 @@ TEST_F(FormatTest, ConfigurableSpaceBeforeColon) {
"case 1:\n"
"default:\n"
"}");
+ verifyFormat("switch (allBraces) {\n"
+ "case 1: {\n"
+ " break;\n"
+ "}\n"
+ "case 2: {\n"
+ " [[fallthrough]];\n"
+ "}\n"
+ "default: {\n"
+ " break;\n"
+ "}\n"
+ "}");
FormatStyle CtorInitializerStyle = getLLVMStyleWithColumns(30);
CtorInitializerStyle.SpaceBeforeCtorInitializerColon = false;
@@ -12108,6 +12119,18 @@ TEST_F(FormatTest, ConfigurableSpaceBeforeColon) {
"default:\n"
"}",
CtorInitializerStyle);
+ verifyFormat("switch (allBraces) {\n"
+ "case 1: {\n"
+ " break;\n"
+ "}\n"
+ "case 2: {\n"
+ " [[fallthrough]];\n"
+ "}\n"
+ "default: {\n"
+ " break;\n"
+ "}\n"
+ "}",
+ CtorInitializerStyle);
CtorInitializerStyle.BreakConstructorInitializers =
FormatStyle::BCIS_AfterColon;
verifyFormat("Fooooooooooo::Fooooooooooo():\n"
@@ -12148,6 +12171,18 @@ TEST_F(FormatTest, ConfigurableSpaceBeforeColon) {
"default:\n"
"}",
InheritanceStyle);
+ verifyFormat("switch (allBraces) {\n"
+ "case 1: {\n"
+ " break;\n"
+ "}\n"
+ "case 2: {\n"
+ " [[fallthrough]];\n"
+ "}\n"
+ "default: {\n"
+ " break;\n"
+ "}\n"
+ "}",
+ InheritanceStyle);
InheritanceStyle.BreakInheritanceList = FormatStyle::BILS_AfterColon;
verifyFormat("class Foooooooooooooooooooooo:\n"
" public aaaaaaaaaaaaaaaaaa,\n"
@@ -12188,8 +12223,45 @@ TEST_F(FormatTest, ConfigurableSpaceBeforeColon) {
"default:\n"
"}",
ForLoopStyle);
+ verifyFormat("switch (allBraces) {\n"
+ "case 1: {\n"
+ " break;\n"
+ "}\n"
+ "case 2: {\n"
+ " [[fallthrough]];\n"
+ "}\n"
+ "default: {\n"
+ " break;\n"
+ "}\n"
+ "}",
+ ForLoopStyle);
+
+ FormatStyle CaseStyle = getLLVMStyle();
+ CaseStyle.SpaceBeforeCaseColon = true;
+ verifyFormat("class Foo : public Bar {};", CaseStyle);
+ verifyFormat("Foo::Foo() : foo(1) {}", CaseStyle);
+ verifyFormat("for (auto a : b) {\n}", CaseStyle);
+ verifyFormat("int x = a ? b : c;", CaseStyle);
+ verifyFormat("switch (x) {\n"
+ "case 1 :\n"
+ "default :\n"
+ "}",
+ CaseStyle);
+ verifyFormat("switch (allBraces) {\n"
+ "case 1 : {\n"
+ " break;\n"
+ "}\n"
+ "case 2 : {\n"
+ " [[fallthrough]];\n"
+ "}\n"
+ "default : {\n"
+ " break;\n"
+ "}\n"
+ "}",
+ CaseStyle);
FormatStyle NoSpaceStyle = getLLVMStyle();
+ EXPECT_EQ(NoSpaceStyle.SpaceBeforeCaseColon, false);
NoSpaceStyle.SpaceBeforeCtorInitializerColon = false;
NoSpaceStyle.SpaceBeforeInheritanceColon = false;
NoSpaceStyle.SpaceBeforeRangeBasedForLoopColon = false;
@@ -12207,6 +12279,54 @@ TEST_F(FormatTest, ConfigurableSpaceBeforeColon) {
"default:\n"
"}",
NoSpaceStyle);
+ verifyFormat("switch (allBraces) {\n"
+ "case 1: {\n"
+ " break;\n"
+ "}\n"
+ "case 2: {\n"
+ " [[fallthrough]];\n"
+ "}\n"
+ "default: {\n"
+ " break;\n"
+ "}\n"
+ "}",
+ NoSpaceStyle);
+
+ FormatStyle InvertedSpaceStyle = getLLVMStyle();
+ InvertedSpaceStyle.SpaceBeforeCaseColon = true;
+ InvertedSpaceStyle.SpaceBeforeCtorInitializerColon = false;
+ InvertedSpaceStyle.SpaceBeforeInheritanceColon = false;
+ InvertedSpaceStyle.SpaceBeforeRangeBasedForLoopColon = false;
+ verifyFormat("class Foo: public Bar {};", InvertedSpaceStyle);
+ verifyFormat("Foo::Foo(): foo(1) {}", InvertedSpaceStyle);
+ verifyFormat("for (auto a: b) {\n}", InvertedSpaceStyle);
+ verifyFormat("int x = a ? b : c;", InvertedSpaceStyle);
+ verifyFormat("{\n"
+ "label3:\n"
+ " int x = 0;\n"
+ "}",
+ InvertedSpaceStyle);
+ verifyFormat("switch (x) {\n"
+ "case 1 :\n"
+ "case 2 : {\n"
+ " break;\n"
+ "}\n"
+ "default :\n"
+ " break;\n"
+ "}",
+ InvertedSpaceStyle);
+ verifyFormat("switch (allBraces) {\n"
+ "case 1 : {\n"
+ " break;\n"
+ "}\n"
+ "case 2 : {\n"
+ " [[fallthrough]];\n"
+ "}\n"
+ "default : {\n"
+ " break;\n"
+ "}\n"
+ "}",
+ InvertedSpaceStyle);
}
TEST_F(FormatTest, ConfigurableSpaceAroundPointerQualifiers) {
@@ -14184,6 +14304,7 @@ TEST_F(FormatTest, ParsesConfigurationBools) {
CHECK_PARSE_BOOL(SpaceAfterTemplateKeyword);
CHECK_PARSE_BOOL(SpaceAfterLogicalNot);
CHECK_PARSE_BOOL(SpaceBeforeAssignmentOperators);
+ CHECK_PARSE_BOOL(SpaceBeforeCaseColon);
CHECK_PARSE_BOOL(SpaceBeforeCpp11BracedList);
CHECK_PARSE_BOOL(SpaceBeforeCtorInitializerColon);
CHECK_PARSE_BOOL(SpaceBeforeInheritanceColon);
More information about the llvm-branch-commits
mailing list