wanders created this revision. wanders added reviewers: MyDeveloperDay, klimek. wanders added a project: clang-format. Herald added a project: clang.
This new option allows controlling if there should be spaces around the ':' in a bitfield declaration. Decides if it should be the existing (and therefore default with the new option) behavior: unsigned bitfield : 5; // SpaceAroundBitFieldColon = true or: unsigned bitfield:5; // SpaceAroundBitFieldColon = false ---- A bit unsure about naming of the option. Should there be separate Before/After? I guess some might find `uint x :1` and `uint x: 1` useful. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D84090 Files: clang/include/clang/Format/Format.h clang/lib/Format/Format.cpp clang/lib/Format/TokenAnnotator.cpp clang/unittests/Format/FormatTest.cpp Index: clang/unittests/Format/FormatTest.cpp =================================================================== --- clang/unittests/Format/FormatTest.cpp +++ clang/unittests/Format/FormatTest.cpp @@ -2165,6 +2165,13 @@ " uchar : 8;\n" " uchar other;\n" "};"); + FormatStyle LLVMWithNoSpaceAroundBitfields = getLLVMStyle(); + LLVMWithNoSpaceAroundBitfields.SpaceAroundBitFieldColon = false; + verifyFormat("struct Bitfields {\n" + " unsigned sClass:8;\n" + " unsigned ValueKind:2;\n" + " uchar other;\n" + "};", LLVMWithNoSpaceAroundBitfields); } TEST_F(FormatTest, FormatsNamespaces) { @@ -12156,6 +12163,11 @@ "int oneTwoThree : 23 = 0;", Alignment); + Alignment.SpaceAroundBitFieldColon = false; + verifyFormat("int const a :5;\n" + "int oneTwoThree:23;", + Alignment); + // Known limitations: ':' is only recognized as a bitfield colon when // followed by a number. /* Index: clang/lib/Format/TokenAnnotator.cpp =================================================================== --- clang/lib/Format/TokenAnnotator.cpp +++ clang/lib/Format/TokenAnnotator.cpp @@ -3251,6 +3251,8 @@ if (Right.is(TT_RangeBasedForLoopColon) && !Style.SpaceBeforeRangeBasedForLoopColon) return false; + if (Left.is(TT_BitFieldColon)) + return Style.SpaceAroundBitFieldColon; if (Right.is(tok::colon)) { if (Line.First->isOneOf(tok::kw_case, tok::kw_default) || !Right.getNextNonComment() || Right.getNextNonComment()->is(tok::semi)) @@ -3267,6 +3269,8 @@ return false; if (Right.is(TT_CSharpNamedArgumentColon)) return false; + if (Right.is(TT_BitFieldColon)) + return Style.SpaceAroundBitFieldColon; return true; } if (Left.is(TT_UnaryOperator)) { Index: clang/lib/Format/Format.cpp =================================================================== --- clang/lib/Format/Format.cpp +++ clang/lib/Format/Format.cpp @@ -593,6 +593,8 @@ IO.mapOptional("SpacesInSquareBrackets", Style.SpacesInSquareBrackets); IO.mapOptional("SpaceBeforeSquareBrackets", Style.SpaceBeforeSquareBrackets); + IO.mapOptional("SpaceAroundBitFieldColon", + Style.SpaceAroundBitFieldColon); IO.mapOptional("Standard", Style.Standard); IO.mapOptional("StatementMacros", Style.StatementMacros); IO.mapOptional("TabWidth", Style.TabWidth); @@ -918,6 +920,7 @@ LLVMStyle.SpaceBeforeAssignmentOperators = true; LLVMStyle.SpaceBeforeCpp11BracedList = false; LLVMStyle.SpaceBeforeSquareBrackets = false; + LLVMStyle.SpaceAroundBitFieldColon = true; LLVMStyle.SpacesInAngles = false; LLVMStyle.SpacesInConditionalStatement = false; Index: clang/include/clang/Format/Format.h =================================================================== --- clang/include/clang/Format/Format.h +++ clang/include/clang/Format/Format.h @@ -2228,6 +2228,13 @@ /// \endcode bool SpaceBeforeSquareBrackets; + /// If ``false``, space will be removed around ``:`` in bitfield declarations. + /// \code + /// true: false: + /// unsigned bf : 3; vs. unsigned bf:3; + /// \endcode + bool SpaceAroundBitFieldColon; + /// Supported language standards for parsing and formatting C++ constructs. /// \code /// Latest: vector<set<int>> @@ -2404,6 +2411,7 @@ SpacesInParentheses == R.SpacesInParentheses && SpacesInSquareBrackets == R.SpacesInSquareBrackets && SpaceBeforeSquareBrackets == R.SpaceBeforeSquareBrackets && + SpaceAroundBitFieldColon == R.SpaceAroundBitFieldColon && Standard == R.Standard && TabWidth == R.TabWidth && StatementMacros == R.StatementMacros && UseTab == R.UseTab && UseCRLF == R.UseCRLF && TypenameMacros == R.TypenameMacros;
Index: clang/unittests/Format/FormatTest.cpp =================================================================== --- clang/unittests/Format/FormatTest.cpp +++ clang/unittests/Format/FormatTest.cpp @@ -2165,6 +2165,13 @@ " uchar : 8;\n" " uchar other;\n" "};"); + FormatStyle LLVMWithNoSpaceAroundBitfields = getLLVMStyle(); + LLVMWithNoSpaceAroundBitfields.SpaceAroundBitFieldColon = false; + verifyFormat("struct Bitfields {\n" + " unsigned sClass:8;\n" + " unsigned ValueKind:2;\n" + " uchar other;\n" + "};", LLVMWithNoSpaceAroundBitfields); } TEST_F(FormatTest, FormatsNamespaces) { @@ -12156,6 +12163,11 @@ "int oneTwoThree : 23 = 0;", Alignment); + Alignment.SpaceAroundBitFieldColon = false; + verifyFormat("int const a :5;\n" + "int oneTwoThree:23;", + Alignment); + // Known limitations: ':' is only recognized as a bitfield colon when // followed by a number. /* Index: clang/lib/Format/TokenAnnotator.cpp =================================================================== --- clang/lib/Format/TokenAnnotator.cpp +++ clang/lib/Format/TokenAnnotator.cpp @@ -3251,6 +3251,8 @@ if (Right.is(TT_RangeBasedForLoopColon) && !Style.SpaceBeforeRangeBasedForLoopColon) return false; + if (Left.is(TT_BitFieldColon)) + return Style.SpaceAroundBitFieldColon; if (Right.is(tok::colon)) { if (Line.First->isOneOf(tok::kw_case, tok::kw_default) || !Right.getNextNonComment() || Right.getNextNonComment()->is(tok::semi)) @@ -3267,6 +3269,8 @@ return false; if (Right.is(TT_CSharpNamedArgumentColon)) return false; + if (Right.is(TT_BitFieldColon)) + return Style.SpaceAroundBitFieldColon; return true; } if (Left.is(TT_UnaryOperator)) { Index: clang/lib/Format/Format.cpp =================================================================== --- clang/lib/Format/Format.cpp +++ clang/lib/Format/Format.cpp @@ -593,6 +593,8 @@ IO.mapOptional("SpacesInSquareBrackets", Style.SpacesInSquareBrackets); IO.mapOptional("SpaceBeforeSquareBrackets", Style.SpaceBeforeSquareBrackets); + IO.mapOptional("SpaceAroundBitFieldColon", + Style.SpaceAroundBitFieldColon); IO.mapOptional("Standard", Style.Standard); IO.mapOptional("StatementMacros", Style.StatementMacros); IO.mapOptional("TabWidth", Style.TabWidth); @@ -918,6 +920,7 @@ LLVMStyle.SpaceBeforeAssignmentOperators = true; LLVMStyle.SpaceBeforeCpp11BracedList = false; LLVMStyle.SpaceBeforeSquareBrackets = false; + LLVMStyle.SpaceAroundBitFieldColon = true; LLVMStyle.SpacesInAngles = false; LLVMStyle.SpacesInConditionalStatement = false; Index: clang/include/clang/Format/Format.h =================================================================== --- clang/include/clang/Format/Format.h +++ clang/include/clang/Format/Format.h @@ -2228,6 +2228,13 @@ /// \endcode bool SpaceBeforeSquareBrackets; + /// If ``false``, space will be removed around ``:`` in bitfield declarations. + /// \code + /// true: false: + /// unsigned bf : 3; vs. unsigned bf:3; + /// \endcode + bool SpaceAroundBitFieldColon; + /// Supported language standards for parsing and formatting C++ constructs. /// \code /// Latest: vector<set<int>> @@ -2404,6 +2411,7 @@ SpacesInParentheses == R.SpacesInParentheses && SpacesInSquareBrackets == R.SpacesInSquareBrackets && SpaceBeforeSquareBrackets == R.SpaceBeforeSquareBrackets && + SpaceAroundBitFieldColon == R.SpaceAroundBitFieldColon && Standard == R.Standard && TabWidth == R.TabWidth && StatementMacros == R.StatementMacros && UseTab == R.UseTab && UseCRLF == R.UseCRLF && TypenameMacros == R.TypenameMacros;
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits