Skip to content

Commit 4e9f2bc

Browse files
hnakamura5hnakamura5
authored andcommitted
[clang-format] TableGen keywords support.
Add TableGen keywords to the additional keyword list of the formatter.
1 parent bc98c31 commit 4e9f2bc

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
@@ -1202,6 +1202,21 @@ struct AdditionalKeywords {
12021202
kw_verilogHashHash = &IdentTable.get("##");
12031203
kw_apostrophe = &IdentTable.get("\'");
12041204

1205+
// TableGen keywords
1206+
kw_bit = &IdentTable.get("bit");
1207+
kw_bits = &IdentTable.get("bits");
1208+
kw_code = &IdentTable.get("code");
1209+
kw_dag = &IdentTable.get("dag");
1210+
kw_def = &IdentTable.get("def");
1211+
kw_defm = &IdentTable.get("defm");
1212+
kw_defset = &IdentTable.get("defset");
1213+
kw_defvar = &IdentTable.get("defvar");
1214+
kw_dump = &IdentTable.get("dump");
1215+
kw_include = &IdentTable.get("include");
1216+
kw_list = &IdentTable.get("list");
1217+
kw_multiclass = &IdentTable.get("multiclass");
1218+
kw_then = &IdentTable.get("then");
1219+
12051220
// Keep this at the end of the constructor to make sure everything here
12061221
// is
12071222
// already initialized.
@@ -1294,6 +1309,27 @@ struct AdditionalKeywords {
12941309
kw_wildcard, kw_wire,
12951310
kw_with, kw_wor,
12961311
kw_verilogHash, kw_verilogHashHash});
1312+
1313+
TableGenExtraKeywords = std::unordered_set<IdentifierInfo *>({
1314+
kw_assert,
1315+
kw_bit,
1316+
kw_bits,
1317+
kw_code,
1318+
kw_dag,
1319+
kw_def,
1320+
kw_defm,
1321+
kw_defset,
1322+
kw_defvar,
1323+
kw_dump,
1324+
kw_foreach,
1325+
kw_in,
1326+
kw_include,
1327+
kw_let,
1328+
kw_list,
1329+
kw_multiclass,
1330+
kw_string,
1331+
kw_then,
1332+
});
12971333
}
12981334

12991335
// Context sensitive keywords.
@@ -1539,6 +1575,21 @@ struct AdditionalKeywords {
15391575
// Symbols in Verilog that don't exist in C++.
15401576
IdentifierInfo *kw_apostrophe;
15411577

1578+
// TableGen keywords
1579+
IdentifierInfo *kw_bit;
1580+
IdentifierInfo *kw_bits;
1581+
IdentifierInfo *kw_code;
1582+
IdentifierInfo *kw_dag;
1583+
IdentifierInfo *kw_def;
1584+
IdentifierInfo *kw_defm;
1585+
IdentifierInfo *kw_defset;
1586+
IdentifierInfo *kw_defvar;
1587+
IdentifierInfo *kw_dump;
1588+
IdentifierInfo *kw_include;
1589+
IdentifierInfo *kw_list;
1590+
IdentifierInfo *kw_multiclass;
1591+
IdentifierInfo *kw_then;
1592+
15421593
/// Returns \c true if \p Tok is a keyword or an identifier.
15431594
bool isWordLike(const FormatToken &Tok) const {
15441595
// getIdentifierinfo returns non-null for keywords as well as identifiers.
@@ -1811,6 +1862,27 @@ struct AdditionalKeywords {
18111862
}
18121863
}
18131864

1865+
bool isTableGenDefinition(const FormatToken &Tok) const {
1866+
return Tok.isOneOf(kw_def, kw_defm, kw_defset, kw_defvar, kw_multiclass,
1867+
kw_let, tok::kw_class);
1868+
}
1869+
1870+
bool isTableGenKeyword(const FormatToken &Tok) const {
1871+
switch (Tok.Tok.getKind()) {
1872+
case tok::kw_class:
1873+
case tok::kw_else:
1874+
case tok::kw_false:
1875+
case tok::kw_if:
1876+
case tok::kw_int:
1877+
case tok::kw_true:
1878+
return true;
1879+
default:
1880+
return Tok.is(tok::identifier) &&
1881+
TableGenExtraKeywords.find(Tok.Tok.getIdentifierInfo()) !=
1882+
TableGenExtraKeywords.end();
1883+
}
1884+
}
1885+
18141886
private:
18151887
/// The JavaScript keywords beyond the C++ keyword set.
18161888
std::unordered_set<IdentifierInfo *> JsExtraKeywords;
@@ -1820,6 +1892,9 @@ struct AdditionalKeywords {
18201892

18211893
/// The Verilog keywords beyond the C++ keyword set.
18221894
std::unordered_set<IdentifierInfo *> VerilogExtraKeywords;
1895+
1896+
/// The TableGen keywords beyond the C++ keyword set.
1897+
std::unordered_set<IdentifierInfo *> TableGenExtraKeywords;
18231898
};
18241899

18251900
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)