lunasorcery created this revision. lunasorcery added reviewers: djasper, klimek. lunasorcery added a project: clang-format. lunasorcery requested review of this revision. Herald added a project: clang. Herald added a subscriber: cfe-commits.
Previously, with AllowShortEnumsOnASingleLine disabled, enums that would have otherwise fit on a single line would always put the opening brace on its own line. This patch ensures that these enums will only put the brace on its own line if the existing attachment rules indicate that it should. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D99840 Files: clang/include/clang/Format/Format.h clang/lib/Format/UnwrappedLineParser.cpp clang/unittests/Format/FormatTest.cpp clang/unittests/Format/FormatTestCSharp.cpp Index: clang/unittests/Format/FormatTestCSharp.cpp =================================================================== --- clang/unittests/Format/FormatTestCSharp.cpp +++ clang/unittests/Format/FormatTestCSharp.cpp @@ -343,8 +343,7 @@ } TEST_F(FormatTestCSharp, CSharpKeyWordEscaping) { - verifyFormat("public enum var\n" - "{\n" + verifyFormat("public enum var {\n" " none,\n" " @string,\n" " bool,\n" Index: clang/unittests/Format/FormatTest.cpp =================================================================== --- clang/unittests/Format/FormatTest.cpp +++ clang/unittests/Format/FormatTest.cpp @@ -1344,6 +1344,14 @@ Style.AllowShortEnumsOnASingleLine = true; verifyFormat("enum { A, B, C } ShortEnum1, ShortEnum2;", Style); Style.AllowShortEnumsOnASingleLine = false; + verifyFormat("enum {\n" + " A,\n" + " B,\n" + " C\n" + "} ShortEnum1, ShortEnum2;", + Style); + Style.BreakBeforeBraces = FormatStyle::BS_Custom; + Style.BraceWrapping.AfterEnum = true; verifyFormat("enum\n" "{\n" " A,\n" @@ -19454,8 +19462,7 @@ Style); // Enumerations are not records and should be unaffected. Style.AllowShortEnumsOnASingleLine = false; - verifyFormat("enum class E\n" - "{\n" + verifyFormat("enum class E {\n" " A,\n" " B\n" "};\n", Index: clang/lib/Format/UnwrappedLineParser.cpp =================================================================== --- clang/lib/Format/UnwrappedLineParser.cpp +++ clang/lib/Format/UnwrappedLineParser.cpp @@ -2455,6 +2455,8 @@ if (FormatTok->Tok.is(tok::kw_enum)) nextToken(); + const FormatToken &InitialToken = *FormatTok; + // In TypeScript, "enum" can also be used as property name, e.g. in interface // declarations. An "enum" keyword followed by a colon would be a syntax // error and thus assume it is just an identifier. @@ -2501,7 +2503,8 @@ return true; } - if (!Style.AllowShortEnumsOnASingleLine) + if (!Style.AllowShortEnumsOnASingleLine && + ShouldBreakBeforeBrace(Style, InitialToken)) addUnwrappedLine(); // Parse enum body. nextToken(); Index: clang/include/clang/Format/Format.h =================================================================== --- clang/include/clang/Format/Format.h +++ clang/include/clang/Format/Format.h @@ -515,8 +515,7 @@ /// enum { A, B } myEnum; /// /// false: - /// enum - /// { + /// enum { /// A, /// B /// } myEnum;
Index: clang/unittests/Format/FormatTestCSharp.cpp =================================================================== --- clang/unittests/Format/FormatTestCSharp.cpp +++ clang/unittests/Format/FormatTestCSharp.cpp @@ -343,8 +343,7 @@ } TEST_F(FormatTestCSharp, CSharpKeyWordEscaping) { - verifyFormat("public enum var\n" - "{\n" + verifyFormat("public enum var {\n" " none,\n" " @string,\n" " bool,\n" Index: clang/unittests/Format/FormatTest.cpp =================================================================== --- clang/unittests/Format/FormatTest.cpp +++ clang/unittests/Format/FormatTest.cpp @@ -1344,6 +1344,14 @@ Style.AllowShortEnumsOnASingleLine = true; verifyFormat("enum { A, B, C } ShortEnum1, ShortEnum2;", Style); Style.AllowShortEnumsOnASingleLine = false; + verifyFormat("enum {\n" + " A,\n" + " B,\n" + " C\n" + "} ShortEnum1, ShortEnum2;", + Style); + Style.BreakBeforeBraces = FormatStyle::BS_Custom; + Style.BraceWrapping.AfterEnum = true; verifyFormat("enum\n" "{\n" " A,\n" @@ -19454,8 +19462,7 @@ Style); // Enumerations are not records and should be unaffected. Style.AllowShortEnumsOnASingleLine = false; - verifyFormat("enum class E\n" - "{\n" + verifyFormat("enum class E {\n" " A,\n" " B\n" "};\n", Index: clang/lib/Format/UnwrappedLineParser.cpp =================================================================== --- clang/lib/Format/UnwrappedLineParser.cpp +++ clang/lib/Format/UnwrappedLineParser.cpp @@ -2455,6 +2455,8 @@ if (FormatTok->Tok.is(tok::kw_enum)) nextToken(); + const FormatToken &InitialToken = *FormatTok; + // In TypeScript, "enum" can also be used as property name, e.g. in interface // declarations. An "enum" keyword followed by a colon would be a syntax // error and thus assume it is just an identifier. @@ -2501,7 +2503,8 @@ return true; } - if (!Style.AllowShortEnumsOnASingleLine) + if (!Style.AllowShortEnumsOnASingleLine && + ShouldBreakBeforeBrace(Style, InitialToken)) addUnwrappedLine(); // Parse enum body. nextToken(); Index: clang/include/clang/Format/Format.h =================================================================== --- clang/include/clang/Format/Format.h +++ clang/include/clang/Format/Format.h @@ -515,8 +515,7 @@ /// enum { A, B } myEnum; /// /// false: - /// enum - /// { + /// enum { /// A, /// B /// } myEnum;
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits