Skip to content

Commit 0cc3157

Browse files
authored
[clang-format] TableGen keywords support. (llvm#77477)
Add TableGen keywords to the additional keyword list of the formatter. This pull request is the splited part from llvm#76059 .
1 parent 2bb511e commit 0cc3157

File tree

5 files changed

+103
-0
lines changed

5 files changed

+103
-0
lines changed

clang/include/clang/Format/Format.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3055,6 +3055,7 @@ struct FormatStyle {
30553055
bool isProto() const {
30563056
return Language == LK_Proto || Language == LK_TextProto;
30573057
}
3058+
bool isTableGen() const { return Language == LK_TableGen; }
30583059

30593060
/// Language, this format style is targeted at.
30603061
/// \version 3.5

clang/lib/Format/FormatToken.h

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1211,6 +1211,21 @@ struct AdditionalKeywords {
12111211
kw_verilogHashHash = &IdentTable.get("##");
12121212
kw_apostrophe = &IdentTable.get("\'");
12131213

1214+
// TableGen keywords
1215+
kw_bit = &IdentTable.get("bit");
1216+
kw_bits = &IdentTable.get("bits");
1217+
kw_code = &IdentTable.get("code");
1218+
kw_dag = &IdentTable.get("dag");
1219+
kw_def = &IdentTable.get("def");
1220+
kw_defm = &IdentTable.get("defm");
1221+
kw_defset = &IdentTable.get("defset");
1222+
kw_defvar = &IdentTable.get("defvar");
1223+
kw_dump = &IdentTable.get("dump");
1224+
kw_include = &IdentTable.get("include");
1225+
kw_list = &IdentTable.get("list");
1226+
kw_multiclass = &IdentTable.get("multiclass");
1227+
kw_then = &IdentTable.get("then");
1228+
12141229
// Keep this at the end of the constructor to make sure everything here
12151230
// is
12161231
// already initialized.
@@ -1303,6 +1318,27 @@ struct AdditionalKeywords {
13031318
kw_wildcard, kw_wire,
13041319
kw_with, kw_wor,
13051320
kw_verilogHash, kw_verilogHashHash});
1321+
1322+
TableGenExtraKeywords = std::unordered_set<IdentifierInfo *>({
1323+
kw_assert,
1324+
kw_bit,
1325+
kw_bits,
1326+
kw_code,
1327+
kw_dag,
1328+
kw_def,
1329+
kw_defm,
1330+
kw_defset,
1331+
kw_defvar,
1332+
kw_dump,
1333+
kw_foreach,
1334+
kw_in,
1335+
kw_include,
1336+
kw_let,
1337+
kw_list,
1338+
kw_multiclass,
1339+
kw_string,
1340+
kw_then,
1341+
});
13061342
}
13071343

13081344
// Context sensitive keywords.
@@ -1548,6 +1584,21 @@ struct AdditionalKeywords {
15481584
// Symbols in Verilog that don't exist in C++.
15491585
IdentifierInfo *kw_apostrophe;
15501586

1587+
// TableGen keywords
1588+
IdentifierInfo *kw_bit;
1589+
IdentifierInfo *kw_bits;
1590+
IdentifierInfo *kw_code;
1591+
IdentifierInfo *kw_dag;
1592+
IdentifierInfo *kw_def;
1593+
IdentifierInfo *kw_defm;
1594+
IdentifierInfo *kw_defset;
1595+
IdentifierInfo *kw_defvar;
1596+
IdentifierInfo *kw_dump;
1597+
IdentifierInfo *kw_include;
1598+
IdentifierInfo *kw_list;
1599+
IdentifierInfo *kw_multiclass;
1600+
IdentifierInfo *kw_then;
1601+
15511602
/// Returns \c true if \p Tok is a keyword or an identifier.
15521603
bool isWordLike(const FormatToken &Tok) const {
15531604
// getIdentifierinfo returns non-null for keywords as well as identifiers.
@@ -1820,6 +1871,27 @@ struct AdditionalKeywords {
18201871
}
18211872
}
18221873

1874+
bool isTableGenDefinition(const FormatToken &Tok) const {
1875+
return Tok.isOneOf(kw_def, kw_defm, kw_defset, kw_defvar, kw_multiclass,
1876+
kw_let, tok::kw_class);
1877+
}
1878+
1879+
bool isTableGenKeyword(const FormatToken &Tok) const {
1880+
switch (Tok.Tok.getKind()) {
1881+
case tok::kw_class:
1882+
case tok::kw_else:
1883+
case tok::kw_false:
1884+
case tok::kw_if:
1885+
case tok::kw_int:
1886+
case tok::kw_true:
1887+
return true;
1888+
default:
1889+
return Tok.is(tok::identifier) &&
1890+
TableGenExtraKeywords.find(Tok.Tok.getIdentifierInfo()) !=
1891+
TableGenExtraKeywords.end();
1892+
}
1893+
}
1894+
18231895
private:
18241896
/// The JavaScript keywords beyond the C++ keyword set.
18251897
std::unordered_set<IdentifierInfo *> JsExtraKeywords;
@@ -1829,6 +1901,9 @@ struct AdditionalKeywords {
18291901

18301902
/// The Verilog keywords beyond the C++ keyword set.
18311903
std::unordered_set<IdentifierInfo *> VerilogExtraKeywords;
1904+
1905+
/// The TableGen keywords beyond the C++ keyword set.
1906+
std::unordered_set<IdentifierInfo *> TableGenExtraKeywords;
18321907
};
18331908

18341909
inline bool isLineComment(const FormatToken &FormatTok) {

clang/lib/Format/FormatTokenLexer.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1182,6 +1182,9 @@ FormatToken *FormatTokenLexer::getNextToken() {
11821182
tok::kw_operator)) {
11831183
FormatTok->Tok.setKind(tok::identifier);
11841184
FormatTok->Tok.setIdentifierInfo(nullptr);
1185+
} else if (Style.isTableGen() && !Keywords.isTableGenKeyword(*FormatTok)) {
1186+
FormatTok->Tok.setKind(tok::identifier);
1187+
FormatTok->Tok.setIdentifierInfo(nullptr);
11851188
}
11861189
} else if (FormatTok->is(tok::greatergreater)) {
11871190
FormatTok->Tok.setKind(tok::greater);

clang/lib/Format/TokenAnnotator.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2234,6 +2234,12 @@ class AnnotatingParser {
22342234
if (PreviousNotConst->ClosesRequiresClause)
22352235
return false;
22362236

2237+
if (Style.isTableGen()) {
2238+
// keywords such as let and def* defines names.
2239+
if (Keywords.isTableGenDefinition(*PreviousNotConst))
2240+
return true;
2241+
}
2242+
22372243
bool IsPPKeyword = PreviousNotConst->is(tok::identifier) &&
22382244
PreviousNotConst->Previous &&
22392245
PreviousNotConst->Previous->is(tok::hash);

clang/unittests/Format/TokenAnnotatorTest.cpp

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2172,6 +2172,24 @@ TEST_F(TokenAnnotatorTest, UnderstandsVerilogOperators) {
21722172
EXPECT_TOKEN(Tokens[4], tok::string_literal, TT_Unknown);
21732173
}
21742174

2175+
TEST_F(TokenAnnotatorTest, UnderstandTableGenTokens) {
2176+
auto Style = getLLVMStyle(FormatStyle::LK_TableGen);
2177+
ASSERT_TRUE(Style.isTableGen());
2178+
2179+
TestLexer Lexer(Allocator, Buffers, Style);
2180+
AdditionalKeywords Keywords(Lexer.IdentTable);
2181+
auto Annotate = [&Lexer, &Style](llvm::StringRef Code) {
2182+
return Lexer.annotate(Code);
2183+
};
2184+
2185+
// Additional keywords representation test.
2186+
auto Tokens = Annotate("def foo : Bar<1>;");
2187+
ASSERT_TRUE(Keywords.isTableGenKeyword(*Tokens[0]));
2188+
ASSERT_TRUE(Keywords.isTableGenDefinition(*Tokens[0]));
2189+
ASSERT_TRUE(Tokens[0]->is(Keywords.kw_def));
2190+
ASSERT_TRUE(Tokens[1]->is(TT_StartOfName));
2191+
}
2192+
21752193
TEST_F(TokenAnnotatorTest, UnderstandConstructors) {
21762194
auto Tokens = annotate("Class::Class() : BaseClass(), Member() {}");
21772195

0 commit comments

Comments
 (0)