diff options
author | Paul Hoad <mydeveloperday@gmail.com> | 2019-10-03 18:42:31 +0000 |
---|---|---|
committer | Paul Hoad <mydeveloperday@gmail.com> | 2019-10-03 18:42:31 +0000 |
commit | fb13e65acf0b7de3dd0b60b6312df07fdf9da652 (patch) | |
tree | 6bfbebcf5443350cdcd0025670e553efaa2b5092 /clang/unittests/Format/FormatTest.cpp | |
parent | b2b43c8576c9b88b65049b4ee4b03afa1fae2308 (diff) | |
download | bcm5719-llvm-fb13e65acf0b7de3dd0b60b6312df07fdf9da652.tar.gz bcm5719-llvm-fb13e65acf0b7de3dd0b60b6312df07fdf9da652.zip |
[clang-format] Add ability to wrap braces after multi-line control statements
Summary:
Change the BraceWrappingFlags' AfterControlStatement from a bool to an enum with three values:
* "Never": This is the default, and does not do any brace wrapping after control statements.
* "MultiLine": This only wraps braces after multi-line control statements (this really only happens when a ColumnLimit is specified).
* "Always": This always wraps braces after control statements.
The first and last options are backwards-compatible with "false" and "true", respectively.
The new "MultiLine" option is useful for when a wrapped control statement's indentation matches the subsequent block's indentation. It makes it easier to see at a glance where the control statement ends and where the block's code begins. For example:
```
if (
foo
&& bar )
{
baz();
}
```
vs.
```
if (
foo
&& bar ) {
baz();
}
```
Short control statements (1 line) do not wrap the brace to the next line, e.g.
```
if (foo) {
bar();
} else {
baz();
}
```
Reviewers: sammccall, owenpan, reuk, MyDeveloperDay, klimek
Reviewed By: MyDeveloperDay
Subscribers: MyDeveloperDay, cfe-commits
Patch By: mitchell-stellar
Tags: #clang-format, #clang, #clang-tools-extra
Differential Revision: https://reviews.llvm.org/D68296
llvm-svn: 373647
Diffstat (limited to 'clang/unittests/Format/FormatTest.cpp')
-rw-r--r-- | clang/unittests/Format/FormatTest.cpp | 154 |
1 files changed, 149 insertions, 5 deletions
diff --git a/clang/unittests/Format/FormatTest.cpp b/clang/unittests/Format/FormatTest.cpp index d7759bc6df3..e982c8b2ab0 100644 --- a/clang/unittests/Format/FormatTest.cpp +++ b/clang/unittests/Format/FormatTest.cpp @@ -644,7 +644,8 @@ TEST_F(FormatTest, FormatShortBracedStatements) { AllowSimpleBracedStatements.AllowShortIfStatementsOnASingleLine = FormatStyle::SIS_WithoutElse; AllowSimpleBracedStatements.AllowShortLoopsOnASingleLine = true; - AllowSimpleBracedStatements.BraceWrapping.AfterControlStatement = true; + AllowSimpleBracedStatements.BraceWrapping.AfterControlStatement = + FormatStyle::BWACS_Always; verifyFormat("if (true) {}", AllowSimpleBracedStatements); verifyFormat("if constexpr (true) {}", AllowSimpleBracedStatements); @@ -1168,7 +1169,7 @@ TEST_F(FormatTest, FormatsSwitchStatement) { Style.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Never; Style.BreakBeforeBraces = FormatStyle::BS_Custom; Style.BraceWrapping.AfterCaseLabel = true; - Style.BraceWrapping.AfterControlStatement = true; + Style.BraceWrapping.AfterControlStatement = FormatStyle::BWACS_Always; EXPECT_EQ("switch (n)\n" "{\n" " case 0:\n" @@ -1370,7 +1371,7 @@ TEST_F(FormatTest, ShortCaseLabels) { Style.AllowShortCaseLabelsOnASingleLine = true; Style.BreakBeforeBraces = FormatStyle::BS_Custom; Style.BraceWrapping.AfterCaseLabel = true; - Style.BraceWrapping.AfterControlStatement = true; + Style.BraceWrapping.AfterControlStatement = FormatStyle::BWACS_Always; EXPECT_EQ("switch (n)\n" "{\n" " case 0:\n" @@ -1441,6 +1442,131 @@ TEST_F(FormatTest, FormatsLabels) { "}"); } +TEST_F(FormatTest, MultiLineControlStatements) { + FormatStyle Style = getLLVMStyle(); + Style.BreakBeforeBraces = FormatStyle::BraceBreakingStyle::BS_Custom; + Style.BraceWrapping.AfterControlStatement = FormatStyle::BWACS_MultiLine; + Style.ColumnLimit = 20; + // Short lines should keep opening brace on same line. + EXPECT_EQ("if (foo) {\n" + " bar();\n" + "}", + format("if(foo){bar();}", Style)); + EXPECT_EQ("if (foo) {\n" + " bar();\n" + "} else {\n" + " baz();\n" + "}", + format("if(foo){bar();}else{baz();}", Style)); + EXPECT_EQ("if (foo && bar) {\n" + " baz();\n" + "}", + format("if(foo&&bar){baz();}", Style)); + EXPECT_EQ("if (foo) {\n" + " bar();\n" + "} else if (baz) {\n" + " quux();\n" + "}", + format("if(foo){bar();}else if(baz){quux();}", Style)); + EXPECT_EQ( + "if (foo) {\n" + " bar();\n" + "} else if (baz) {\n" + " quux();\n" + "} else {\n" + " foobar();\n" + "}", + format("if(foo){bar();}else if(baz){quux();}else{foobar();}", Style)); + EXPECT_EQ("for (;;) {\n" + " foo();\n" + "}", + format("for(;;){foo();}")); + EXPECT_EQ("while (1) {\n" + " foo();\n" + "}", + format("while(1){foo();}", Style)); + EXPECT_EQ("switch (foo) {\n" + "case bar:\n" + " return;\n" + "}", + format("switch(foo){case bar:return;}", Style)); + EXPECT_EQ("try {\n" + " foo();\n" + "} catch (...) {\n" + " bar();\n" + "}", + format("try{foo();}catch(...){bar();}", Style)); + EXPECT_EQ("do {\n" + " foo();\n" + "} while (bar &&\n" + " baz);", + format("do{foo();}while(bar&&baz);", Style)); + // Long lines should put opening brace on new line. + EXPECT_EQ("if (foo && bar &&\n" + " baz)\n" + "{\n" + " quux();\n" + "}", + format("if(foo&&bar&&baz){quux();}", Style)); + EXPECT_EQ("if (foo && bar &&\n" + " baz)\n" + "{\n" + " quux();\n" + "}", + format("if (foo && bar &&\n" + " baz) {\n" + " quux();\n" + "}", + Style)); + EXPECT_EQ("if (foo) {\n" + " bar();\n" + "} else if (baz ||\n" + " quux)\n" + "{\n" + " foobar();\n" + "}", + format("if(foo){bar();}else if(baz||quux){foobar();}", Style)); + EXPECT_EQ( + "if (foo) {\n" + " bar();\n" + "} else if (baz ||\n" + " quux)\n" + "{\n" + " foobar();\n" + "} else {\n" + " barbaz();\n" + "}", + format("if(foo){bar();}else if(baz||quux){foobar();}else{barbaz();}", + Style)); + EXPECT_EQ("for (int i = 0;\n" + " i < 10; ++i)\n" + "{\n" + " foo();\n" + "}", + format("for(int i=0;i<10;++i){foo();}", Style)); + EXPECT_EQ("while (foo || bar ||\n" + " baz)\n" + "{\n" + " quux();\n" + "}", + format("while(foo||bar||baz){quux();}", Style)); + EXPECT_EQ("switch (\n" + " foo = barbaz)\n" + "{\n" + "case quux:\n" + " return;\n" + "}", + format("switch(foo=barbaz){case quux:return;}", Style)); + EXPECT_EQ("try {\n" + " foo();\n" + "} catch (\n" + " Exception &bar)\n" + "{\n" + " baz();\n" + "}", + format("try{foo();}catch(Exception&bar){baz();}", Style)); +} + //===----------------------------------------------------------------------===// // Tests for classes, namespaces, etc. //===----------------------------------------------------------------------===// @@ -2940,7 +3066,7 @@ TEST_F(FormatTest, MacroCallsWithoutTrailingSemicolon) { "};")); FormatStyle Style = getLLVMStyle(); Style.BreakBeforeBraces = FormatStyle::BS_Custom; - Style.BraceWrapping.AfterControlStatement = true; + Style.BraceWrapping.AfterControlStatement = FormatStyle::BWACS_Always; Style.BraceWrapping.AfterFunction = true; EXPECT_EQ("void f()\n" "try\n" @@ -12261,7 +12387,6 @@ TEST_F(FormatTest, ParsesConfigurationBools) { CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterCaseLabel); CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterClass); - CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterControlStatement); CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterEnum); CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterFunction); CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterNamespace); @@ -12469,6 +12594,25 @@ TEST_F(FormatTest, ParsesConfiguration) { CHECK_PARSE("BreakBeforeBraces: Custom", BreakBeforeBraces, FormatStyle::BS_Custom); + Style.BraceWrapping.AfterControlStatement = FormatStyle::BWACS_Never; + CHECK_PARSE("BraceWrapping:\n" + " AfterControlStatement: MultiLine", + BraceWrapping.AfterControlStatement, + FormatStyle::BWACS_MultiLine); + CHECK_PARSE("BraceWrapping:\n" + " AfterControlStatement: Always", + BraceWrapping.AfterControlStatement, FormatStyle::BWACS_Always); + CHECK_PARSE("BraceWrapping:\n" + " AfterControlStatement: Never", + BraceWrapping.AfterControlStatement, FormatStyle::BWACS_Never); + // For backward compatibility: + CHECK_PARSE("BraceWrapping:\n" + " AfterControlStatement: true", + BraceWrapping.AfterControlStatement, FormatStyle::BWACS_Always); + CHECK_PARSE("BraceWrapping:\n" + " AfterControlStatement: false", + BraceWrapping.AfterControlStatement, FormatStyle::BWACS_Never); + Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All; CHECK_PARSE("AlwaysBreakAfterReturnType: None", AlwaysBreakAfterReturnType, FormatStyle::RTBS_None); |