Skip to content

Commit

Permalink
[clang-format] Extend AllowShortBlocksOnASingleLine for else blocks
Browse files Browse the repository at this point in the history
Extend AllowShortBlocksOnASingleLine for else blocks. See https://bugs.llvm.org/show_bug.cgi?id=49722

Reviewed By: HazardyKnusperkeks, owenpan, MyDeveloperDay

Differential Revision: https://reviews.llvm.org/D114320
  • Loading branch information
Jesses Gott authored and mydeveloperday committed Nov 25, 2021
1 parent a712b66 commit 813d486
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 10 deletions.
21 changes: 11 additions & 10 deletions clang/lib/Format/UnwrappedLineFormatter.cpp
Expand Up @@ -320,9 +320,9 @@ class LineJoiner {
}
// Try to merge a control statement block with left brace wrapped
if (I[1]->First->is(tok::l_brace) &&
(TheLine->First->isOneOf(tok::kw_if, tok::kw_while, tok::kw_for,
tok::kw_switch, tok::kw_try, tok::kw_do,
TT_ForEachMacro) ||
(TheLine->First->isOneOf(tok::kw_if, tok::kw_else, tok::kw_while,
tok::kw_for, tok::kw_switch, tok::kw_try,
tok::kw_do, TT_ForEachMacro) ||
(TheLine->First->is(tok::r_brace) && TheLine->First->Next &&
TheLine->First->Next->isOneOf(tok::kw_else, tok::kw_catch))) &&
Style.BraceWrapping.AfterControlStatement ==
Expand All @@ -335,7 +335,7 @@ class LineJoiner {
? 1
: 0;
} else if (I[1]->First->is(tok::l_brace) &&
TheLine->First->isOneOf(tok::kw_if, tok::kw_while,
TheLine->First->isOneOf(tok::kw_if, tok::kw_else, tok::kw_while,
tok::kw_for)) {
return (Style.BraceWrapping.AfterControlStatement ==
FormatStyle::BWACS_Always)
Expand Down Expand Up @@ -569,7 +569,7 @@ class LineJoiner {

// Check that the current line allows merging. This depends on whether we
// are in a control flow statements as well as several style flags.
if (Line.First->isOneOf(tok::kw_else, tok::kw_case) ||
if (Line.First->is(tok::kw_case) ||
(Line.First->Next && Line.First->Next->is(tok::kw_else)))
return 0;
// default: in switch statement
Expand All @@ -578,20 +578,21 @@ class LineJoiner {
if (Tok && Tok->is(tok::colon))
return 0;
}
if (Line.First->isOneOf(tok::kw_if, tok::kw_while, tok::kw_do, tok::kw_try,
tok::kw___try, tok::kw_catch, tok::kw___finally,
tok::kw_for, tok::r_brace, Keywords.kw___except)) {
if (Line.First->isOneOf(tok::kw_if, tok::kw_else, tok::kw_while, tok::kw_do,
tok::kw_try, tok::kw___try, tok::kw_catch,
tok::kw___finally, tok::kw_for, tok::r_brace,
Keywords.kw___except)) {
if (Style.AllowShortBlocksOnASingleLine == FormatStyle::SBS_Never)
return 0;
// Don't merge when we can't except the case when
// the control statement block is empty
if (!Style.AllowShortIfStatementsOnASingleLine &&
Line.startsWith(tok::kw_if) &&
Line.First->isOneOf(tok::kw_if, tok::kw_else) &&
!Style.BraceWrapping.AfterControlStatement &&
!I[1]->First->is(tok::r_brace))
return 0;
if (!Style.AllowShortIfStatementsOnASingleLine &&
Line.startsWith(tok::kw_if) &&
Line.First->isOneOf(tok::kw_if, tok::kw_else) &&
Style.BraceWrapping.AfterControlStatement ==
FormatStyle::BWACS_Always &&
I + 2 != E && !I[2]->First->is(tok::r_brace))
Expand Down
21 changes: 21 additions & 0 deletions clang/unittests/Format/FormatTest.cpp
Expand Up @@ -5407,6 +5407,27 @@ TEST_F(FormatTest, PutEmptyBlocksIntoOneLine) {
EXPECT_EQ("void f() { }", format("void f() {}", Style));
Style.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Empty;
EXPECT_EQ("while (true) { }", format("while (true) {}", Style));
Style.BreakBeforeBraces = FormatStyle::BS_Custom;
Style.BraceWrapping.BeforeElse = false;
Style.BraceWrapping.AfterControlStatement = FormatStyle::BWACS_Always;
verifyFormat("if (a)\n"
"{\n"
"} else if (b)\n"
"{\n"
"} else\n"
"{ }",
Style);
Style.BraceWrapping.AfterControlStatement = FormatStyle::BWACS_Never;
verifyFormat("if (a) {\n"
"} else if (b) {\n"
"} else {\n"
"}",
Style);
Style.BraceWrapping.BeforeElse = true;
verifyFormat("if (a) { }\n"
"else if (b) { }\n"
"else { }",
Style);
}

TEST_F(FormatTest, FormatBeginBlockEndMacros) {
Expand Down

0 comments on commit 813d486

Please sign in to comment.