[clang] 61571e9 - [clang-format] Handle function try block with ctor-initializer (#95878)
via cfe-commits
cfe-commits at lists.llvm.org
Tue Jun 18 18:56:36 PDT 2024
Author: Owen Pan
Date: 2024-06-18T18:56:33-07:00
New Revision: 61571e9046fa6f12661e443123635053186794a1
URL: https://github.com/llvm/llvm-project/commit/61571e9046fa6f12661e443123635053186794a1
DIFF: https://github.com/llvm/llvm-project/commit/61571e9046fa6f12661e443123635053186794a1.diff
LOG: [clang-format] Handle function try block with ctor-initializer (#95878)
Fixes #58987.
Fixes #95679.
Added:
Modified:
clang/lib/Format/UnwrappedLineParser.cpp
clang/unittests/Format/TokenAnnotatorTest.cpp
Removed:
################################################################################
diff --git a/clang/lib/Format/UnwrappedLineParser.cpp b/clang/lib/Format/UnwrappedLineParser.cpp
index df5bb757a99ec..ce877ac2bb9ef 100644
--- a/clang/lib/Format/UnwrappedLineParser.cpp
+++ b/clang/lib/Format/UnwrappedLineParser.cpp
@@ -2955,9 +2955,15 @@ void UnwrappedLineParser::parseTryCatch() {
assert(FormatTok->isOneOf(tok::kw_try, tok::kw___try) && "'try' expected");
nextToken();
bool NeedsUnwrappedLine = false;
+ bool HasCtorInitializer = false;
if (FormatTok->is(tok::colon)) {
+ auto *Colon = FormatTok;
// We are in a function try block, what comes is an initializer list.
nextToken();
+ if (FormatTok->is(tok::identifier)) {
+ HasCtorInitializer = true;
+ Colon->setFinalizedType(TT_CtorInitializerColon);
+ }
// In case identifiers were removed by clang-tidy, what might follow is
// multiple commas in sequence - before the first identifier.
@@ -2966,14 +2972,11 @@ void UnwrappedLineParser::parseTryCatch() {
while (FormatTok->is(tok::identifier)) {
nextToken();
- if (FormatTok->is(tok::l_paren))
+ if (FormatTok->is(tok::l_paren)) {
parseParens();
- if (FormatTok->Previous && FormatTok->Previous->is(tok::identifier) &&
- FormatTok->is(tok::l_brace)) {
- do {
- nextToken();
- } while (FormatTok->isNot(tok::r_brace));
+ } else if (FormatTok->is(tok::l_brace)) {
nextToken();
+ parseBracedList();
}
// In case identifiers were removed by clang-tidy, what might follow is
@@ -2989,6 +2992,8 @@ void UnwrappedLineParser::parseTryCatch() {
keepAncestorBraces();
if (FormatTok->is(tok::l_brace)) {
+ if (HasCtorInitializer)
+ FormatTok->setFinalizedType(TT_FunctionLBrace);
CompoundStatementIndenter Indenter(this, Style, Line->Level);
parseBlock();
if (Style.BraceWrapping.BeforeCatch)
diff --git a/clang/unittests/Format/TokenAnnotatorTest.cpp b/clang/unittests/Format/TokenAnnotatorTest.cpp
index 3e9638d9f3c56..3735316dc3478 100644
--- a/clang/unittests/Format/TokenAnnotatorTest.cpp
+++ b/clang/unittests/Format/TokenAnnotatorTest.cpp
@@ -3164,6 +3164,22 @@ TEST_F(TokenAnnotatorTest, CppAltOperatorKeywords) {
EXPECT_TOKEN(Tokens[1], tok::identifier, TT_StartOfName);
}
+TEST_F(TokenAnnotatorTest, FunctionTryBlock) {
+ auto Tokens =
+ annotate("Foo::Foo(int x, int y) try\n"
+ " : foo{[] -> std::string { return {}; }(), x}, bar{y} {\n"
+ "} catch (...) {\n"
+ "}");
+ ASSERT_EQ(Tokens.size(), 45u);
+ EXPECT_TOKEN(Tokens[2], tok::identifier, TT_CtorDtorDeclName);
+ EXPECT_TOKEN(Tokens[11], tok::colon, TT_CtorInitializerColon);
+ EXPECT_TOKEN(Tokens[14], tok::l_square, TT_LambdaLSquare);
+ EXPECT_TOKEN(Tokens[16], tok::arrow, TT_TrailingReturnArrow);
+ EXPECT_TOKEN(Tokens[20], tok::l_brace, TT_LambdaLBrace);
+ EXPECT_TOKEN(Tokens[31], tok::comma, TT_CtorInitializerComma);
+ EXPECT_TOKEN(Tokens[36], tok::l_brace, TT_FunctionLBrace);
+}
+
} // namespace
} // namespace format
} // namespace clang
More information about the cfe-commits
mailing list