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" _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits