[clang] [clang-format] Correctly annotate braces in macro definitions (PR #123279)
Owen Pan via cfe-commits
cfe-commits at lists.llvm.org
Fri Jan 17 10:14:04 PST 2025
https://github.com/owenca updated https://github.com/llvm/llvm-project/pull/123279
>From 04b03d24d661dc8e8503269b7ddf55140e88de20 Mon Sep 17 00:00:00 2001
From: Owen Pan <owenpiano at gmail.com>
Date: Thu, 16 Jan 2025 19:45:33 -0800
Subject: [PATCH 1/2] [clang-format] Correctly annotate braces in macro
definitions
Fixes #123179.
---
clang/lib/Format/UnwrappedLineParser.cpp | 6 +++---
clang/unittests/Format/FormatTest.cpp | 11 -----------
clang/unittests/Format/TokenAnnotatorTest.cpp | 19 ++++++++++++++++---
3 files changed, 19 insertions(+), 17 deletions(-)
diff --git a/clang/lib/Format/UnwrappedLineParser.cpp b/clang/lib/Format/UnwrappedLineParser.cpp
index 317717241c17cd..ed74d9d396a492 100644
--- a/clang/lib/Format/UnwrappedLineParser.cpp
+++ b/clang/lib/Format/UnwrappedLineParser.cpp
@@ -503,14 +503,14 @@ void UnwrappedLineParser::calculateBraceTypes(bool ExpectClassBody) {
auto *NextTok = Tokens->getNextNonComment();
if (!Line->InMacroBody && !Style.isTableGen()) {
- // Skip PPDirective lines and comments.
+ // Skip PPDirective (except #define) lines and comments.
while (NextTok->is(tok::hash)) {
NextTok = Tokens->getNextToken();
- if (NextTok->is(tok::pp_not_keyword))
+ if (NextTok->is(tok::pp_not_keyword) || NextTok->is(tok::pp_define))
break;
do {
NextTok = Tokens->getNextToken();
- } while (!NextTok->HasUnescapedNewline && NextTok->isNot(tok::eof));
+ } while (NextTok->NewlinesBefore == 0 && NextTok->isNot(tok::eof));
while (NextTok->is(tok::comment))
NextTok = Tokens->getNextToken();
diff --git a/clang/unittests/Format/FormatTest.cpp b/clang/unittests/Format/FormatTest.cpp
index 4d48bcacddead8..d3c97319abb947 100644
--- a/clang/unittests/Format/FormatTest.cpp
+++ b/clang/unittests/Format/FormatTest.cpp
@@ -5732,23 +5732,12 @@ TEST_F(FormatTest, HashInMacroDefinition) {
verifyFormat("#define A void # ## #", getLLVMStyleWithColumns(22));
-#if 0
- // FIXME: The correct format is:
verifyFormat("{\n"
" {\n"
"#define GEN_ID(_x) char *_x{#_x}\n"
" GEN_ID(one);\n"
" }\n"
"}");
-#endif
- verifyFormat("{\n"
- " {\n"
- "#define GEN_ID(_x) \\\n"
- " char *_x { #_x }\n"
- " GEN_ID(one);\n"
- " }\n"
- "}",
- getGoogleStyle());
}
TEST_F(FormatTest, RespectWhitespaceInMacroDefinitions) {
diff --git a/clang/unittests/Format/TokenAnnotatorTest.cpp b/clang/unittests/Format/TokenAnnotatorTest.cpp
index 0383780c2d84a2..91deac665c58a0 100644
--- a/clang/unittests/Format/TokenAnnotatorTest.cpp
+++ b/clang/unittests/Format/TokenAnnotatorTest.cpp
@@ -3379,14 +3379,27 @@ TEST_F(TokenAnnotatorTest, BraceKind) {
EXPECT_BRACE_KIND(Tokens[0], BK_Block);
EXPECT_TOKEN(Tokens[1], tok::l_brace, TT_BlockLBrace);
EXPECT_BRACE_KIND(Tokens[1], BK_Block);
-#if 0
- // FIXME:
EXPECT_BRACE_KIND(Tokens[11], BK_BracedInit);
EXPECT_BRACE_KIND(Tokens[14], BK_BracedInit);
-#endif
EXPECT_BRACE_KIND(Tokens[20], BK_Block);
EXPECT_BRACE_KIND(Tokens[21], BK_Block);
+ Tokens = annotate("{\n"
+ "#define FOO \\\n"
+ " { \\\n"
+ " case bar: { \\\n"
+ " break; \\\n"
+ " } \\\n"
+ " }\n"
+ "}");
+ ASSERT_EQ(Tokens.size(), 15u) << Tokens;
+ EXPECT_TOKEN(Tokens[4], tok::l_brace, TT_BlockLBrace);
+ EXPECT_BRACE_KIND(Tokens[4], BK_Block);
+ EXPECT_TOKEN(Tokens[7], tok::colon, TT_CaseLabelColon);
+ EXPECT_BRACE_KIND(Tokens[8], BK_Block);
+ EXPECT_BRACE_KIND(Tokens[11], BK_Block);
+ EXPECT_BRACE_KIND(Tokens[12], BK_Block);
+
Tokens = annotate("a = class extends goog.a {};",
getGoogleStyle(FormatStyle::LK_JavaScript));
ASSERT_EQ(Tokens.size(), 11u) << Tokens;
>From b0e7f80259e7ecdbf4d8ec926d0ac3f7d1c1b680 Mon Sep 17 00:00:00 2001
From: Owen Pan <owenpiano at gmail.com>
Date: Fri, 17 Jan 2025 10:13:32 -0800
Subject: [PATCH 2/2] NFC: minor cleanup
---
clang/lib/Format/UnwrappedLineParser.cpp | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/clang/lib/Format/UnwrappedLineParser.cpp b/clang/lib/Format/UnwrappedLineParser.cpp
index ed74d9d396a492..198c05fd9dcd8d 100644
--- a/clang/lib/Format/UnwrappedLineParser.cpp
+++ b/clang/lib/Format/UnwrappedLineParser.cpp
@@ -503,10 +503,10 @@ void UnwrappedLineParser::calculateBraceTypes(bool ExpectClassBody) {
auto *NextTok = Tokens->getNextNonComment();
if (!Line->InMacroBody && !Style.isTableGen()) {
- // Skip PPDirective (except #define) lines and comments.
+ // Skip PPDirective lines (except macro definitions) and comments.
while (NextTok->is(tok::hash)) {
NextTok = Tokens->getNextToken();
- if (NextTok->is(tok::pp_not_keyword) || NextTok->is(tok::pp_define))
+ if (NextTok->isOneOf(tok::pp_not_keyword, tok::pp_define))
break;
do {
NextTok = Tokens->getNextToken();
More information about the cfe-commits
mailing list