summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--clang/lib/Format/UnwrappedLineParser.cpp24
-rw-r--r--clang/unittests/Format/FormatTest.cpp98
2 files changed, 80 insertions, 42 deletions
diff --git a/clang/lib/Format/UnwrappedLineParser.cpp b/clang/lib/Format/UnwrappedLineParser.cpp
index 9f355c930ea..7e55e04c7f7 100644
--- a/clang/lib/Format/UnwrappedLineParser.cpp
+++ b/clang/lib/Format/UnwrappedLineParser.cpp
@@ -434,6 +434,19 @@ static bool IsGoogScope(const UnwrappedLine &Line) {
return I->Tok->is(tok::l_paren);
}
+static bool ShouldBreakBeforeBrace(const FormatStyle &Style,
+ const FormatToken &InitialToken) {
+ switch (Style.BreakBeforeBraces) {
+ case FormatStyle::BS_Linux:
+ return InitialToken.isOneOf(tok::kw_namespace, tok::kw_class);
+ case FormatStyle::BS_Allman:
+ case FormatStyle::BS_GNU:
+ return true;
+ default:
+ return false;
+ }
+}
+
void UnwrappedLineParser::parseChildBlock() {
FormatTok->BlockKind = BK_Block;
nextToken();
@@ -1167,13 +1180,13 @@ void UnwrappedLineParser::parseTryCatch() {
void UnwrappedLineParser::parseNamespace() {
assert(FormatTok->Tok.is(tok::kw_namespace) && "'namespace' expected");
+
+ const FormatToken &InitialToken = *FormatTok;
nextToken();
if (FormatTok->Tok.is(tok::identifier))
nextToken();
if (FormatTok->Tok.is(tok::l_brace)) {
- if (Style.BreakBeforeBraces == FormatStyle::BS_Linux ||
- Style.BreakBeforeBraces == FormatStyle::BS_Allman ||
- Style.BreakBeforeBraces == FormatStyle::BS_GNU)
+ if (ShouldBreakBeforeBrace(Style, InitialToken))
addUnwrappedLine();
bool AddLevel = Style.NamespaceIndentation == FormatStyle::NI_All ||
@@ -1327,6 +1340,7 @@ void UnwrappedLineParser::parseEnum() {
}
void UnwrappedLineParser::parseRecord() {
+ const FormatToken &InitialToken = *FormatTok;
nextToken();
if (FormatTok->isOneOf(tok::identifier, tok::coloncolon, tok::kw___attribute,
tok::kw___declspec, tok::kw_alignas)) {
@@ -1361,9 +1375,7 @@ void UnwrappedLineParser::parseRecord() {
}
}
if (FormatTok->Tok.is(tok::l_brace)) {
- if (Style.BreakBeforeBraces == FormatStyle::BS_Linux ||
- Style.BreakBeforeBraces == FormatStyle::BS_Allman ||
- Style.BreakBeforeBraces == FormatStyle::BS_GNU)
+ if (ShouldBreakBeforeBrace(Style, InitialToken))
addUnwrappedLine();
parseBlock(/*MustBeDeclaration=*/true, /*AddLevel=*/true,
diff --git a/clang/unittests/Format/FormatTest.cpp b/clang/unittests/Format/FormatTest.cpp
index a171066fa37..5e7f397ae87 100644
--- a/clang/unittests/Format/FormatTest.cpp
+++ b/clang/unittests/Format/FormatTest.cpp
@@ -7671,8 +7671,8 @@ TEST_F(FormatTest, ConfigurableSpaceBeforeAssignmentOperators) {
}
TEST_F(FormatTest, LinuxBraceBreaking) {
- FormatStyle BreakBeforeBrace = getLLVMStyle();
- BreakBeforeBrace.BreakBeforeBraces = FormatStyle::BS_Linux;
+ FormatStyle LinuxBraceStyle = getLLVMStyle();
+ LinuxBraceStyle.BreakBeforeBraces = FormatStyle::BS_Linux;
verifyFormat("namespace a\n"
"{\n"
"class A\n"
@@ -7685,14 +7685,33 @@ TEST_F(FormatTest, LinuxBraceBreaking) {
" }\n"
" }\n"
" void g() { return; }\n"
- "}\n"
- "}",
- BreakBeforeBrace);
+ "};\n"
+ "struct B {\n"
+ " int x;\n"
+ "};\n"
+ "}\n",
+ LinuxBraceStyle);
+ verifyFormat("enum X {\n"
+ " Y = 0,\n"
+ "}\n",
+ LinuxBraceStyle);
+ verifyFormat("struct S {\n"
+ " int Type;\n"
+ " union {\n"
+ " int x;\n"
+ " double y;\n"
+ " } Value;\n"
+ " class C\n"
+ " {\n"
+ " MyFavoriteType Value;\n"
+ " } Class;\n"
+ "}\n",
+ LinuxBraceStyle);
}
TEST_F(FormatTest, StroustrupBraceBreaking) {
- FormatStyle BreakBeforeBrace = getLLVMStyle();
- BreakBeforeBrace.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
+ FormatStyle StroustrupBraceStyle = getLLVMStyle();
+ StroustrupBraceStyle.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
verifyFormat("namespace a {\n"
"class A {\n"
" void f()\n"
@@ -7703,9 +7722,12 @@ TEST_F(FormatTest, StroustrupBraceBreaking) {
" }\n"
" }\n"
" void g() { return; }\n"
- "}\n"
- "}",
- BreakBeforeBrace);
+ "};\n"
+ "struct B {\n"
+ " int x;\n"
+ "};\n"
+ "}\n",
+ StroustrupBraceStyle);
verifyFormat("void foo()\n"
"{\n"
@@ -7716,7 +7738,7 @@ TEST_F(FormatTest, StroustrupBraceBreaking) {
" b();\n"
" }\n"
"}\n",
- BreakBeforeBrace);
+ StroustrupBraceStyle);
verifyFormat("#ifdef _DEBUG\n"
"int foo(int i = 0)\n"
@@ -7726,7 +7748,7 @@ TEST_F(FormatTest, StroustrupBraceBreaking) {
"{\n"
" return i;\n"
"}",
- BreakBeforeBrace);
+ StroustrupBraceStyle);
verifyFormat("void foo() {}\n"
"void bar()\n"
@@ -7738,7 +7760,7 @@ TEST_F(FormatTest, StroustrupBraceBreaking) {
"{\n"
"}\n"
"#endif",
- BreakBeforeBrace);
+ StroustrupBraceStyle);
verifyFormat("void foobar() { int i = 5; }\n"
"#ifdef _DEBUG\n"
@@ -7746,12 +7768,12 @@ TEST_F(FormatTest, StroustrupBraceBreaking) {
"#else\n"
"void bar() { foobar(); }\n"
"#endif",
- BreakBeforeBrace);
+ StroustrupBraceStyle);
}
TEST_F(FormatTest, AllmanBraceBreaking) {
- FormatStyle BreakBeforeBrace = getLLVMStyle();
- BreakBeforeBrace.BreakBeforeBraces = FormatStyle::BS_Allman;
+ FormatStyle AllmanBraceStyle = getLLVMStyle();
+ AllmanBraceStyle.BreakBeforeBraces = FormatStyle::BS_Allman;
verifyFormat("namespace a\n"
"{\n"
"class A\n"
@@ -7765,9 +7787,13 @@ TEST_F(FormatTest, AllmanBraceBreaking) {
" }\n"
" }\n"
" void g() { return; }\n"
- "}\n"
+ "};\n"
+ "struct B\n"
+ "{\n"
+ " int x;\n"
+ "};\n"
"}",
- BreakBeforeBrace);
+ AllmanBraceStyle);
verifyFormat("void f()\n"
"{\n"
@@ -7784,7 +7810,7 @@ TEST_F(FormatTest, AllmanBraceBreaking) {
" c();\n"
" }\n"
"}\n",
- BreakBeforeBrace);
+ AllmanBraceStyle);
verifyFormat("void f()\n"
"{\n"
@@ -7801,7 +7827,7 @@ TEST_F(FormatTest, AllmanBraceBreaking) {
" c();\n"
" } while (false)\n"
"}\n",
- BreakBeforeBrace);
+ AllmanBraceStyle);
verifyFormat("void f(int a)\n"
"{\n"
@@ -7821,18 +7847,18 @@ TEST_F(FormatTest, AllmanBraceBreaking) {
" break;\n"
" }\n"
"}\n",
- BreakBeforeBrace);
+ AllmanBraceStyle);
verifyFormat("enum X\n"
"{\n"
" Y = 0,\n"
"}\n",
- BreakBeforeBrace);
+ AllmanBraceStyle);
verifyFormat("enum X\n"
"{\n"
" Y = 0\n"
"}\n",
- BreakBeforeBrace);
+ AllmanBraceStyle);
verifyFormat("@interface BSApplicationController ()\n"
"{\n"
@@ -7840,7 +7866,7 @@ TEST_F(FormatTest, AllmanBraceBreaking) {
" id _extraIvar;\n"
"}\n"
"@end\n",
- BreakBeforeBrace);
+ AllmanBraceStyle);
verifyFormat("#ifdef _DEBUG\n"
"int foo(int i = 0)\n"
@@ -7850,7 +7876,7 @@ TEST_F(FormatTest, AllmanBraceBreaking) {
"{\n"
" return i;\n"
"}",
- BreakBeforeBrace);
+ AllmanBraceStyle);
verifyFormat("void foo() {}\n"
"void bar()\n"
@@ -7862,7 +7888,7 @@ TEST_F(FormatTest, AllmanBraceBreaking) {
"{\n"
"}\n"
"#endif",
- BreakBeforeBrace);
+ AllmanBraceStyle);
verifyFormat("void foobar() { int i = 5; }\n"
"#ifdef _DEBUG\n"
@@ -7870,37 +7896,37 @@ TEST_F(FormatTest, AllmanBraceBreaking) {
"#else\n"
"void bar() { foobar(); }\n"
"#endif",
- BreakBeforeBrace);
+ AllmanBraceStyle);
// This shouldn't affect ObjC blocks..
verifyFormat("[self doSomeThingWithACompletionHandler:^{\n"
" // ...\n"
" int i;\n"
"}];",
- BreakBeforeBrace);
+ AllmanBraceStyle);
verifyFormat("void (^block)(void) = ^{\n"
" // ...\n"
" int i;\n"
"};",
- BreakBeforeBrace);
+ AllmanBraceStyle);
// .. or dict literals.
verifyFormat("void f()\n"
"{\n"
" [object someMethod:@{ @\"a\" : @\"b\" }];\n"
"}",
- BreakBeforeBrace);
+ AllmanBraceStyle);
- BreakBeforeBrace.ColumnLimit = 19;
- verifyFormat("void f() { int i; }", BreakBeforeBrace);
- BreakBeforeBrace.ColumnLimit = 18;
+ AllmanBraceStyle.ColumnLimit = 19;
+ verifyFormat("void f() { int i; }", AllmanBraceStyle);
+ AllmanBraceStyle.ColumnLimit = 18;
verifyFormat("void f()\n"
"{\n"
" int i;\n"
"}",
- BreakBeforeBrace);
- BreakBeforeBrace.ColumnLimit = 80;
+ AllmanBraceStyle);
+ AllmanBraceStyle.ColumnLimit = 80;
- FormatStyle BreakBeforeBraceShortIfs = BreakBeforeBrace;
+ FormatStyle BreakBeforeBraceShortIfs = AllmanBraceStyle;
BreakBeforeBraceShortIfs.AllowShortIfStatementsOnASingleLine = true;
BreakBeforeBraceShortIfs.AllowShortLoopsOnASingleLine = true;
verifyFormat("void f(bool b)\n"
OpenPOWER on IntegriCloud