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