[clang] [clang-format] Support of TableGen statements in unwrapped line parser (PR #78846)
Hirofumi Nakamura via cfe-commits
cfe-commits at lists.llvm.org
Sat Jan 20 05:45:02 PST 2024
https://github.com/hnakamura5 created https://github.com/llvm/llvm-project/pull/78846
Make TableGen's statements to be parsed considering their structure.
- Removed label
- Avoid class from being parsed as c++'s class
- Support if statement of the form `if <cond> then { ... }`
- Support defset statement of the form `defset <type> <name> {}`
>From fbf7e0f624fb7a4ef05970ee1241cf68f3f5f783 Mon Sep 17 00:00:00 2001
From: hnakamura5 <k.nakamura.hirofumi at gmail.com>
Date: Sat, 20 Jan 2024 22:37:25 +0900
Subject: [PATCH] [clang-format] Support of TableGen statements in unwrapped
line parser
---
clang/lib/Format/UnwrappedLineParser.cpp | 27 ++++++++++++++++++-
clang/unittests/Format/TokenAnnotatorTest.cpp | 12 +++++++++
2 files changed, 38 insertions(+), 1 deletion(-)
diff --git a/clang/lib/Format/UnwrappedLineParser.cpp b/clang/lib/Format/UnwrappedLineParser.cpp
index c08ce86449b6ea6..a81c8e2971e2af9 100644
--- a/clang/lib/Format/UnwrappedLineParser.cpp
+++ b/clang/lib/Format/UnwrappedLineParser.cpp
@@ -1661,7 +1661,8 @@ void UnwrappedLineParser::parseStructuralElement(
// In Verilog labels can be any expression, so we don't do them here.
// JS doesn't have macros, and within classes colons indicate fields, not
// labels.
- if (!Style.isJavaScript() && !Style.isVerilog() &&
+ // TableGen doesn't have labels.
+ if (!Style.isJavaScript() && !Style.isVerilog() && !Style.isTableGen() &&
Tokens->peekNextToken()->is(tok::colon) && !Line->MustBeDeclaration) {
nextToken();
Line->Tokens.begin()->Tok->MustBreakBefore = true;
@@ -1790,6 +1791,12 @@ void UnwrappedLineParser::parseStructuralElement(
addUnwrappedLine();
return;
}
+ if (Style.isTableGen()) {
+ // Do nothing special. In this case the l_brace becomes FunctionLBrace.
+ // This is same as def and so on.
+ nextToken();
+ break;
+ }
[[fallthrough]];
case tok::kw_struct:
case tok::kw_union:
@@ -2028,6 +2035,16 @@ void UnwrappedLineParser::parseStructuralElement(
// initialisers are indented the same way.
if (Style.isCSharp())
FormatTok->setBlockKind(BK_BracedInit);
+ // TableGen's defset statement has syntax of the form,
+ // `defset <type> <name> = { <statement>... }`
+ if (Style.isTableGen() &&
+ Line->Tokens.begin()->Tok->is(Keywords.kw_defset)) {
+ FormatTok->setFinalizedType(TT_FunctionLBrace);
+ parseBlock(/*MustBeDeclaration=*/false, /*AddLevels=*/1u,
+ /*MunchSemi=*/false);
+ addUnwrappedLine();
+ break;
+ }
nextToken();
parseBracedList();
} else if (Style.Language == FormatStyle::LK_Proto &&
@@ -2743,6 +2760,14 @@ FormatToken *UnwrappedLineParser::parseIfThenElse(IfStmtKind *IfKind,
}
}
+ // TableGen's if statement has the form of `if <cond> then { ... }`.
+ if (Style.isTableGen()) {
+ while (!eof() && !(FormatTok->is(Keywords.kw_then))) {
+ // Simply skip until then. This range only contains a value.
+ nextToken();
+ }
+ }
+
// Handle `if !consteval`.
if (FormatTok->is(tok::exclaim))
nextToken();
diff --git a/clang/unittests/Format/TokenAnnotatorTest.cpp b/clang/unittests/Format/TokenAnnotatorTest.cpp
index 64b2abac5cce531..6c065817892b543 100644
--- a/clang/unittests/Format/TokenAnnotatorTest.cpp
+++ b/clang/unittests/Format/TokenAnnotatorTest.cpp
@@ -2232,6 +2232,18 @@ TEST_F(TokenAnnotatorTest, UnderstandTableGenTokens) {
EXPECT_TOKEN(Tokens[0], tok::identifier, TT_Unknown);
Tokens = Annotate("01234Vector");
EXPECT_TOKEN(Tokens[0], tok::identifier, TT_Unknown);
+
+ // Structured statements.
+ Tokens = Annotate("class Foo {}");
+ EXPECT_TOKEN(Tokens[2], tok::l_brace, TT_FunctionLBrace);
+ Tokens = Annotate("def Def: Foo {}");
+ EXPECT_TOKEN(Tokens[2], tok::colon, TT_InheritanceColon);
+ EXPECT_TOKEN(Tokens[4], tok::l_brace, TT_FunctionLBrace);
+ Tokens = Annotate("if cond then {} else {}");
+ EXPECT_TOKEN(Tokens[3], tok::l_brace, TT_ControlStatementLBrace);
+ EXPECT_TOKEN(Tokens[6], tok::l_brace, TT_ElseLBrace);
+ Tokens = Annotate("defset Foo Def2 = {}");
+ EXPECT_TOKEN(Tokens[4], tok::l_brace, TT_FunctionLBrace);
}
TEST_F(TokenAnnotatorTest, UnderstandConstructors) {
More information about the cfe-commits
mailing list