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
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits