diff options
author | Owen Pan <owenpiano@gmail.com> | 2024-06-19 17:49:35 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-06-19 17:49:35 -0700 |
commit | fa00e8bb6a14d39e273f85a77308923ad28329f0 (patch) | |
tree | 87f68d0a1621142b8645a865638557d61068cc36 | |
parent | 34313eb1f0c2f5c6b5303b26d6babdad985e16e9 (diff) | |
download | llvm-fa00e8bb6a14d39e273f85a77308923ad28329f0.zip llvm-fa00e8bb6a14d39e273f85a77308923ad28329f0.tar.gz llvm-fa00e8bb6a14d39e273f85a77308923ad28329f0.tar.bz2 |
[clang-format] Correctly annotate l_brace after TypenameMacro (#96026)
Closes #95418.
-rw-r--r-- | clang/lib/Format/UnwrappedLineParser.cpp | 12 | ||||
-rw-r--r-- | clang/unittests/Format/FormatTest.cpp | 3 | ||||
-rw-r--r-- | clang/unittests/Format/TokenAnnotatorTest.cpp | 12 |
3 files changed, 24 insertions, 3 deletions
diff --git a/clang/lib/Format/UnwrappedLineParser.cpp b/clang/lib/Format/UnwrappedLineParser.cpp index ce877ac..d406a53 100644 --- a/clang/lib/Format/UnwrappedLineParser.cpp +++ b/clang/lib/Format/UnwrappedLineParser.cpp @@ -1910,7 +1910,8 @@ void UnwrappedLineParser::parseStructuralElement( } else if (Style.BraceWrapping.AfterFunction) { addUnwrappedLine(); } - FormatTok->setFinalizedType(TT_FunctionLBrace); + if (!Previous || Previous->isNot(TT_TypeDeclarationParen)) + FormatTok->setFinalizedType(TT_FunctionLBrace); parseBlock(); IsDecltypeAutoFunction = false; addUnwrappedLine(); @@ -2545,10 +2546,10 @@ bool UnwrappedLineParser::parseParens(TokenType AmpAmpTokenType) { if (Style.Language == FormatStyle::LK_Java && FormatTok->is(tok::l_brace)) parseChildBlock(); break; - case tok::r_paren: + case tok::r_paren: { + const auto *Prev = LeftParen->Previous; if (!MightBeStmtExpr && !MightBeFoldExpr && !Line->InMacroBody && Style.RemoveParentheses > FormatStyle::RPS_Leave) { - const auto *Prev = LeftParen->Previous; const auto *Next = Tokens->peekNextToken(); const bool DoubleParens = Prev && Prev->is(tok::l_paren) && Next && Next->is(tok::r_paren); @@ -2570,8 +2571,13 @@ bool UnwrappedLineParser::parseParens(TokenType AmpAmpTokenType) { FormatTok->Optional = true; } } + if (Prev && Prev->is(TT_TypenameMacro)) { + LeftParen->setFinalizedType(TT_TypeDeclarationParen); + FormatTok->setFinalizedType(TT_TypeDeclarationParen); + } nextToken(); return SeenEqual; + } case tok::r_brace: // A "}" inside parenthesis is an error if there wasn't a matching "{". return SeenEqual; diff --git a/clang/unittests/Format/FormatTest.cpp b/clang/unittests/Format/FormatTest.cpp index fc63afc..db1decb 100644 --- a/clang/unittests/Format/FormatTest.cpp +++ b/clang/unittests/Format/FormatTest.cpp @@ -27007,6 +27007,9 @@ TEST_F(FormatTest, RemoveSemicolon) { "; int bar;", Style); #endif + + Style.TypenameMacros.push_back("STRUCT"); + verifyFormat("STRUCT(T, B) { int i; };", Style); } TEST_F(FormatTest, BreakAfterAttributes) { diff --git a/clang/unittests/Format/TokenAnnotatorTest.cpp b/clang/unittests/Format/TokenAnnotatorTest.cpp index 3735316..0dc5064 100644 --- a/clang/unittests/Format/TokenAnnotatorTest.cpp +++ b/clang/unittests/Format/TokenAnnotatorTest.cpp @@ -3180,6 +3180,18 @@ TEST_F(TokenAnnotatorTest, FunctionTryBlock) { EXPECT_TOKEN(Tokens[36], tok::l_brace, TT_FunctionLBrace); } +TEST_F(TokenAnnotatorTest, TypenameMacro) { + auto Style = getLLVMStyle(); + Style.TypenameMacros.push_back("STRUCT"); + + auto Tokens = annotate("STRUCT(T, B) { int i; };", Style); + ASSERT_EQ(Tokens.size(), 13u); + EXPECT_TOKEN(Tokens[0], tok::identifier, TT_TypenameMacro); + EXPECT_TOKEN(Tokens[1], tok::l_paren, TT_TypeDeclarationParen); + EXPECT_TOKEN(Tokens[5], tok::r_paren, TT_TypeDeclarationParen); + EXPECT_TOKEN(Tokens[6], tok::l_brace, TT_Unknown); +} + } // namespace } // namespace format } // namespace clang |