[clang] c41b3b0 - [clang-format] Adjust braced list detection
Owen Pan via cfe-commits
cfe-commits at lists.llvm.org
Sun Dec 5 22:40:09 PST 2021
Author: Tan S. B
Date: 2021-12-05T22:39:29-08:00
New Revision: c41b3b0fa0f4f70aad8deaf48bcd42a04385066c
URL: https://github.com/llvm/llvm-project/commit/c41b3b0fa0f4f70aad8deaf48bcd42a04385066c
DIFF: https://github.com/llvm/llvm-project/commit/c41b3b0fa0f4f70aad8deaf48bcd42a04385066c.diff
LOG: [clang-format] Adjust braced list detection
This avoids mishandling nested compound statements that are followed by another compound statement.
Fixes https://llvm.org/PR38314 and https://llvm.org/PR48305.
Differential Revision: https://reviews.llvm.org/D114583
Added:
Modified:
clang/lib/Format/UnwrappedLineParser.cpp
clang/unittests/Format/FormatTest.cpp
Removed:
################################################################################
diff --git a/clang/lib/Format/UnwrappedLineParser.cpp b/clang/lib/Format/UnwrappedLineParser.cpp
index 5b9fe267aae6..2f27bf912fa2 100644
--- a/clang/lib/Format/UnwrappedLineParser.cpp
+++ b/clang/lib/Format/UnwrappedLineParser.cpp
@@ -578,17 +578,14 @@ void UnwrappedLineParser::calculateBraceTypes(bool ExpectClassBody) {
// BlockKind later if we parse a braced list (where all blocks
// inside are by default braced lists), or when we explicitly detect
// blocks (for example while parsing lambdas).
- // FIXME: Some of these do not apply to JS, e.g. "} {" can never be a
- // braced list in JS.
ProbablyBracedList =
(Style.Language == FormatStyle::LK_JavaScript &&
NextTok->isOneOf(Keywords.kw_of, Keywords.kw_in,
Keywords.kw_as)) ||
(Style.isCpp() && NextTok->is(tok::l_paren)) ||
NextTok->isOneOf(tok::comma, tok::period, tok::colon,
- tok::r_paren, tok::r_square, tok::l_brace,
- tok::ellipsis) ||
- (NextTok->is(tok::identifier) &&
+ tok::r_paren, tok::r_square, tok::ellipsis) ||
+ (NextTok->isOneOf(tok::l_brace, tok::identifier) &&
!PrevTok->isOneOf(tok::semi, tok::r_brace, tok::l_brace)) ||
(NextTok->is(tok::semi) &&
(!ExpectClassBody || LBraceStack.size() != 1)) ||
@@ -2856,7 +2853,7 @@ void UnwrappedLineParser::parseRecord(bool ParseAsExpr) {
// class Foo implements {bar: number} { }
nextToken();
if (FormatTok->is(tok::l_brace)) {
- tryToParseBracedList();
+ parseBracedList();
continue;
}
}
diff --git a/clang/unittests/Format/FormatTest.cpp b/clang/unittests/Format/FormatTest.cpp
index bda5f7019416..cbd051f3a5e8 100644
--- a/clang/unittests/Format/FormatTest.cpp
+++ b/clang/unittests/Format/FormatTest.cpp
@@ -11773,6 +11773,27 @@ TEST_F(FormatTest, FormatsBracedListsInColumnLayout) {
" f(v);\n"
"}");
+ verifyFormat("void foo() {\n"
+ " { // asdf\n"
+ " { int a; }\n"
+ " }\n"
+ " {\n"
+ " { int b; }\n"
+ " }\n"
+ "}");
+ verifyFormat("namespace n {\n"
+ "void foo() {\n"
+ " {\n"
+ " {\n"
+ " statement();\n"
+ " if (false) {\n"
+ " }\n"
+ " }\n"
+ " }\n"
+ " {}\n"
+ "}\n"
+ "} // namespace n");
+
// Long lists should be formatted in columns even if they are nested.
verifyFormat(
"vector<int> x = function({1, 22, 333, 4444, 55555, 666666, 7777777,\n"
More information about the cfe-commits
mailing list