Skip to content

Commit 3e2bbfe

Browse files
authored
[Gardening] Cleanup TokenKinds.def (#10034)
* [Parse] Refactored internal structure of Tokens.def and documented usage. Added a level of structure to the macro definitions to allow Swift keywords to be cleanly accessed separately from SIL and Swift keywords together. Documented structure and usage. * [Parse] Made use of new guarantees and abstractions in Tokens.def Used guarantees about undefining macros after import and new SWIFT_KEYWORD abstraction to simplify usage of the Token.def imports. * Gardening
1 parent 28c470d commit 3e2bbfe

File tree

3 files changed

+77
-41
lines changed

3 files changed

+77
-41
lines changed

include/swift/Syntax/TokenKinds.def

Lines changed: 73 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -9,59 +9,95 @@
99
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
1010
//
1111
//===----------------------------------------------------------------------===//
12-
//
13-
// This file defines macros used for macro-metaprogramming lexer tokens.
14-
//
12+
///
13+
/// This file defines x-macros used for metaprogramming with lexer tokens.
14+
///
15+
/// KEYWORD(kw)
16+
/// SWIFT_KEYWORD(kw)
17+
/// DECL_KEYWORD(kw)
18+
/// STMT_KEYWORD(kw)
19+
/// EXPR_KEYWORD(kw)
20+
/// PAT_KEYWORD(kw)
21+
/// SIL_KEYWORD(kw)
22+
/// POUND_KEYWORD(kw)
23+
/// POUND_OBJECT_LITERAL(kw, desc, proto)
24+
/// POUND_OLD_OBJECT_LITERAL(kw, new_kw, old_arg, new_arg)
25+
/// POUND_CONFIG(kw)
26+
/// PUNCTUATOR(name, str)
27+
///
1528
//===----------------------------------------------------------------------===//
1629

1730
/// KEYWORD(kw)
18-
/// Expands for every Swift keyword, such as 'if', 'else', etc.
31+
/// Expands by default for every Swift keyword and every SIL keyword, such as
32+
/// 'if', 'else', 'sil_global', etc. If you only want to use Swift keywords
33+
/// see SWIFT_KEYWORD.
1934
#ifndef KEYWORD
2035
#define KEYWORD(kw)
2136
#endif
2237

38+
/// SWIFT_KEYWORD(kw)
39+
/// Expands for every Swift keyword.
40+
#ifndef SWIFT_KEYWORD
41+
#define SWIFT_KEYWORD(kw) KEYWORD(kw)
42+
#endif
43+
2344
/// DECL_KEYWORD(kw)
2445
/// Expands for every Swift keyword that can be used in a declaration.
2546
#ifndef DECL_KEYWORD
26-
#define DECL_KEYWORD(kw) KEYWORD(kw)
47+
#define DECL_KEYWORD(kw) SWIFT_KEYWORD(kw)
2748
#endif
2849

2950
/// STMT_KEYWORD(kw)
3051
/// Expands for every Swift keyword used in statement grammar.
3152
#ifndef STMT_KEYWORD
32-
#define STMT_KEYWORD(kw) KEYWORD(kw)
53+
#define STMT_KEYWORD(kw) SWIFT_KEYWORD(kw)
54+
#endif
55+
56+
/// EXPR_KEYWORD(kw)
57+
/// Expands for every Swift keyword used in an expression, such as 'true',
58+
/// 'false', and 'as'
59+
#ifndef EXPR_KEYWORD
60+
#define EXPR_KEYWORD(kw) SWIFT_KEYWORD(kw)
61+
#endif
62+
63+
/// PAT_KEYWORD(kw)
64+
/// Expands for every Swift keyword used in a pattern, which is currently
65+
/// limited to '_'
66+
#ifndef PAT_KEYWORD
67+
#define PAT_KEYWORD(kw) SWIFT_KEYWORD(kw)
68+
#endif
69+
70+
/// SIL_KEYWORD(kw)
71+
/// Expands for every SIL keyword. These are only keywords when parsing SIL.
72+
#ifndef SIL_KEYWORD
73+
#define SIL_KEYWORD(kw) KEYWORD(kw)
3374
#endif
3475

3576
/// POUND_KEYWORD(kw)
36-
/// Every keyword in the #foo namespace.
77+
/// Every keyword prefixed with a '#'.
3778
#ifndef POUND_KEYWORD
3879
#define POUND_KEYWORD(kw)
3980
#endif
4081

4182
/// POUND_OBJECT_LITERAL(kw, desc, proto)
42-
/// Every keyword in the #foo namespace representing an object literal.
83+
/// Every keyword prefixed with a '#' representing an object literal.
4384
#ifndef POUND_OBJECT_LITERAL
4485
#define POUND_OBJECT_LITERAL(kw, desc, proto) POUND_KEYWORD(kw)
4586
#endif
4687

4788
/// POUND_OLD_OBJECT_LITERAL(kw, new_kw, old_arg, new_arg)
48-
/// Every keyword in the #foo namespace representing an object literal.
89+
/// Every keyword prefixed with a '#' representing the obsoleted form of an
90+
/// object literal.
4991
#ifndef POUND_OLD_OBJECT_LITERAL
5092
#define POUND_OLD_OBJECT_LITERAL(kw, new_kw, old_arg, new_arg) POUND_KEYWORD(kw)
5193
#endif
5294

5395
/// POUND_CONFIG(kw)
54-
/// Every keyword in the #foo namespace representing a configuration.
96+
/// Every keyword prefixed with a '#' representing a configuration.
5597
#ifndef POUND_CONFIG
5698
#define POUND_CONFIG(kw) POUND_KEYWORD(kw)
5799
#endif
58100

59-
/// SIL_KEYWORD(kw)
60-
/// Expands for every SIL keyword. These are only keywords when parsing SIL.
61-
#ifndef SIL_KEYWORD
62-
#define SIL_KEYWORD(kw) KEYWORD(kw)
63-
#endif
64-
65101
/// PUNCTUATOR(name, str)
66102
/// Expands for every Swift punctuator.
67103
/// \param name The symbolic name of the punctuator, such as
@@ -128,27 +164,27 @@ STMT_KEYWORD(where)
128164
STMT_KEYWORD(catch)
129165

130166
// Expression keywords.
131-
KEYWORD(as)
132-
KEYWORD(Any)
133-
KEYWORD(false)
134-
KEYWORD(is)
135-
KEYWORD(nil)
136-
KEYWORD(rethrows)
137-
KEYWORD(super)
138-
KEYWORD(self)
139-
KEYWORD(Self)
140-
KEYWORD(throw)
141-
KEYWORD(true)
142-
KEYWORD(try)
143-
KEYWORD(throws)
167+
EXPR_KEYWORD(as)
168+
EXPR_KEYWORD(Any)
169+
EXPR_KEYWORD(false)
170+
EXPR_KEYWORD(is)
171+
EXPR_KEYWORD(nil)
172+
EXPR_KEYWORD(rethrows)
173+
EXPR_KEYWORD(super)
174+
EXPR_KEYWORD(self)
175+
EXPR_KEYWORD(Self)
176+
EXPR_KEYWORD(throw)
177+
EXPR_KEYWORD(true)
178+
EXPR_KEYWORD(try)
179+
EXPR_KEYWORD(throws)
144180
KEYWORD(__FILE__)
145181
KEYWORD(__LINE__)
146182
KEYWORD(__COLUMN__)
147183
KEYWORD(__FUNCTION__)
148184
KEYWORD(__DSO_HANDLE__)
149185

150186
// Pattern keywords.
151-
KEYWORD(_)
187+
PAT_KEYWORD(_)
152188

153189
// Punctuators.
154190
PUNCTUATOR(l_paren, "(")
@@ -189,7 +225,7 @@ PUNCTUATOR(sil_exclamation, "!") // Only in SIL mode.
189225
PUNCTUATOR(l_square_lit, "[#")
190226
PUNCTUATOR(r_square_lit, "#]")
191227

192-
// Keywords in the # namespace. "if" becomes "tok::pound_if".
228+
// Keywords prefixed with a '#'. "if" becomes "tok::pound_if".
193229
POUND_KEYWORD(if)
194230
POUND_KEYWORD(else)
195231
POUND_KEYWORD(elseif)
@@ -199,12 +235,11 @@ POUND_KEYWORD(line)
199235
POUND_KEYWORD(sourceLocation)
200236
POUND_KEYWORD(selector)
201237

202-
// Keywords in the # namespace that are build configurations.
238+
// Keywords prefixed with a '#' that are build configurations.
203239
POUND_CONFIG(available)
204240

205241

206-
// Declaratively define object literals, including their
207-
// corresponding protocols.
242+
// Object literals and their corresponding protocols.
208243
POUND_OBJECT_LITERAL(fileLiteral, "file reference", ExpressibleByFileReferenceLiteral)
209244
POUND_OBJECT_LITERAL(imageLiteral, "image", ExpressibleByImageLiteral)
210245
POUND_OBJECT_LITERAL(colorLiteral, "color", ExpressibleByColorLiteral)
@@ -220,11 +255,14 @@ POUND_KEYWORD(dsohandle)
220255

221256

222257
#undef KEYWORD
258+
#undef SWIFT_KEYWORD
223259
#undef DECL_KEYWORD
224260
#undef STMT_KEYWORD
261+
#undef EXPR_KEYWORD
262+
#undef PAT_KEYWORD
225263
#undef SIL_KEYWORD
226-
#undef PUNCTUATOR
227264
#undef POUND_KEYWORD
228265
#undef POUND_OBJECT_LITERAL
229266
#undef POUND_OLD_OBJECT_LITERAL
230267
#undef POUND_CONFIG
268+
#undef PUNCTUATOR

lib/Parse/Lexer.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -650,7 +650,6 @@ void Lexer::lexHash() {
650650

651651
// Map the character sequence onto
652652
tok Kind = llvm::StringSwitch<tok>(StringRef(CurPtr, tmpPtr-CurPtr))
653-
#define KEYWORD(kw)
654653
#define POUND_KEYWORD(id) \
655654
.Case(#id, tok::pound_##id)
656655
#include "swift/Syntax/TokenKinds.def"

tools/SourceKit/lib/SwiftLang/SwiftCompletion.cpp

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -590,11 +590,10 @@ getCodeCompletionLiteralKindForUID(UIdent uid) {
590590

591591
static CodeCompletionKeywordKind
592592
getCodeCompletionKeywordKindForUID(UIdent uid) {
593-
#define SIL_KEYWORD(kw)
594-
#define KEYWORD(kw) \
595-
static UIdent Keyword##kw##UID("source.lang.swift.keyword." #kw); \
596-
if (uid == Keyword##kw##UID) { \
597-
return CodeCompletionKeywordKind::kw_##kw; \
593+
#define SWIFT_KEYWORD(kw) \
594+
static UIdent Keyword##kw##UID("source.lang.swift.keyword." #kw); \
595+
if (uid == Keyword##kw##UID) { \
596+
return CodeCompletionKeywordKind::kw_##kw; \
598597
}
599598
#include "swift/Syntax/TokenKinds.def"
600599

0 commit comments

Comments
 (0)