From a043cedf0aa6c22437ee9b898da99b5d80db7c09 Mon Sep 17 00:00:00 2001 From: Roman Kashitsyn Date: Mon, 11 Aug 2014 12:18:01 +0000 Subject: [PATCH] Fixes bug 20587 - Add K&R break before braces style Summary: http://llvm.org/bugs/show_bug.cgi?id=20587 Added K&R style. It could be enabled by the following option: ``` BreakBeforeBraces: KernighanRitchie ``` This style is like `Attach`, but break *only* before function declarations. As I can see, no additional logic required to support this style, any style different from other styles automagically satisfies K&R. Reviewers: djasper Reviewed By: djasper Subscribers: cfe-commits, klimek Differential Revision: http://reviews.llvm.org/D4837 llvm-svn: 215354 --- clang/lib/Format/UnwrappedLineParser.cpp | 24 ++++-- clang/unittests/Format/FormatTest.cpp | 98 +++++++++++++++--------- 2 files changed, 80 insertions(+), 42 deletions(-) diff --git a/clang/lib/Format/UnwrappedLineParser.cpp b/clang/lib/Format/UnwrappedLineParser.cpp index 9f355c930ea7..7e55e04c7f78 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 a171066fa371..5e7f397ae87a 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"