Skip to content

Commit d9f7d14

Browse files
authored
Merge pull request #15818 from davezarzycki/nfc_metaprogram_contextual_decl_keywords
[Parsing] NFC: metaprogram contextual decl keywords into Attr.def
2 parents 3717512 + 7174d14 commit d9f7d14

File tree

5 files changed

+131
-105
lines changed

5 files changed

+131
-105
lines changed

include/swift/AST/Attr.def

Lines changed: 70 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,30 @@
1818
#define DECL_ATTR(SPELLING, CLASS, OPTIONS, CODE)
1919
#endif
2020

21+
#ifndef CONTEXTUAL_DECL_ATTR
22+
#define CONTEXTUAL_DECL_ATTR(SPELLING, CLASS, OPTIONS, CODE) \
23+
DECL_ATTR(SPELLING, CLASS, OPTIONS, CODE)
24+
#endif
25+
2126
#ifndef SIMPLE_DECL_ATTR
22-
#define SIMPLE_DECL_ATTR(X, CLASS, OPTIONS, CODE) DECL_ATTR(X, CLASS, OPTIONS, CODE)
27+
#define SIMPLE_DECL_ATTR(X, CLASS, OPTIONS, CODE) \
28+
DECL_ATTR(X, CLASS, OPTIONS, CODE)
29+
#endif
30+
31+
#ifndef CONTEXTUAL_SIMPLE_DECL_ATTR
32+
#define CONTEXTUAL_SIMPLE_DECL_ATTR(X, CLASS, OPTIONS, CODE) \
33+
SIMPLE_DECL_ATTR(X, CLASS, OPTIONS, CODE)
2334
#endif
2435

2536
#ifndef DECL_ATTR_ALIAS
2637
#define DECL_ATTR_ALIAS(SPELLING, CLASS)
2738
#endif
2839

40+
#ifndef CONTEXTUAL_DECL_ATTR_ALIAS
41+
#define CONTEXTUAL_DECL_ATTR_ALIAS(SPELLING, CLASS) \
42+
DECL_ATTR_ALIAS(SPELLING, CLASS)
43+
#endif
44+
2945
#ifndef TYPE_ATTR
3046
#define TYPE_ATTR(X)
3147
#endif
@@ -92,18 +108,21 @@ DECL_ATTR(available, Available,
92108
OnConstructor | OnDestructor | OnTypeAlias | OnSubscript |
93109
OnEnumElement | OnExtension | AllowMultipleAttributes | LongAttribute, 1)
94110

95-
SIMPLE_DECL_ATTR(final, Final,
96-
OnClass | OnFunc | OnVar | OnSubscript|DeclModifier, 2)
111+
CONTEXTUAL_SIMPLE_DECL_ATTR(final, Final, DeclModifier |
112+
OnClass | OnFunc | OnVar | OnSubscript,
113+
2)
97114

98115
DECL_ATTR(objc, ObjC,
99116
OnFunc | OnClass | OnProtocol | OnExtension | OnVar | OnSubscript |
100117
OnConstructor | OnDestructor | OnEnum | OnEnumElement, 3)
101118

102-
SIMPLE_DECL_ATTR(required, Required,
103-
OnConstructor|DeclModifier, 4)
119+
CONTEXTUAL_SIMPLE_DECL_ATTR(required, Required, DeclModifier |
120+
OnConstructor,
121+
4)
104122

105-
SIMPLE_DECL_ATTR(optional, Optional,
106-
OnConstructor|OnFunc|OnVar|OnSubscript|DeclModifier, 5)
123+
CONTEXTUAL_SIMPLE_DECL_ATTR(optional, Optional, DeclModifier |
124+
OnConstructor | OnFunc | OnVar | OnSubscript,
125+
5)
107126

108127
/// NOTE: 6 is unused
109128

@@ -131,7 +150,9 @@ SIMPLE_DECL_ATTR(IBOutlet, IBOutlet,
131150

132151
SIMPLE_DECL_ATTR(NSManaged, NSManaged, OnVar | OnFunc, 15)
133152

134-
SIMPLE_DECL_ATTR(lazy, Lazy, OnVar|DeclModifier, 16)
153+
CONTEXTUAL_SIMPLE_DECL_ATTR(lazy, Lazy, DeclModifier |
154+
OnVar,
155+
16)
135156

136157
SIMPLE_DECL_ATTR(LLDBDebuggerFunction, LLDBDebuggerFunction, OnFunc |
137158
UserInaccessible, 17)
@@ -148,12 +169,21 @@ DECL_ATTR(_semantics, Semantics,
148169
OnFunc | OnConstructor | OnDestructor | OnSubscript |
149170
AllowMultipleAttributes | UserInaccessible, 21)
150171

151-
SIMPLE_DECL_ATTR(dynamic, Dynamic,
152-
OnFunc | OnVar | OnSubscript | OnConstructor | DeclModifier, 22)
172+
CONTEXTUAL_SIMPLE_DECL_ATTR(dynamic, Dynamic, DeclModifier |
173+
OnFunc | OnVar | OnSubscript | OnConstructor,
174+
22)
153175

154-
SIMPLE_DECL_ATTR(infix , Infix , OnFunc | OnOperator | DeclModifier, 23)
155-
SIMPLE_DECL_ATTR(prefix , Prefix , OnFunc | OnOperator | DeclModifier, 24)
156-
SIMPLE_DECL_ATTR(postfix, Postfix, OnFunc | OnOperator | DeclModifier, 25)
176+
CONTEXTUAL_SIMPLE_DECL_ATTR(infix, Infix, DeclModifier |
177+
OnFunc | OnOperator,
178+
23)
179+
180+
CONTEXTUAL_SIMPLE_DECL_ATTR(prefix, Prefix, DeclModifier |
181+
OnFunc | OnOperator,
182+
24)
183+
184+
CONTEXTUAL_SIMPLE_DECL_ATTR(postfix, Postfix, DeclModifier |
185+
OnFunc | OnOperator,
186+
25)
157187

158188
SIMPLE_DECL_ATTR(_transparent, Transparent,
159189
OnFunc|OnConstructor|OnVar|UserInaccessible, 26)
@@ -176,22 +206,24 @@ DECL_ATTR(_specialize, Specialize,
176206

177207
SIMPLE_DECL_ATTR(objcMembers, ObjCMembers, OnClass, 34)
178208

179-
// Non-serialized attributes.
209+
CONTEXTUAL_SIMPLE_DECL_ATTR(__consuming, Consuming, DeclModifier |
210+
OnFunc |
211+
NotSerialized, 40)
212+
213+
CONTEXTUAL_SIMPLE_DECL_ATTR(mutating, Mutating, DeclModifier |
214+
OnFunc |
215+
NotSerialized, 41)
180216

181-
SIMPLE_DECL_ATTR(__consuming, Consuming, OnFunc | DeclModifier | NotSerialized,
182-
/* Not serialized */ 40)
183-
SIMPLE_DECL_ATTR(mutating, Mutating, OnFunc | DeclModifier | NotSerialized,
184-
/* Not serialized */ 41)
185-
SIMPLE_DECL_ATTR(nonmutating, NonMutating, OnFunc | DeclModifier | NotSerialized,
186-
/* Not serialized */ 42)
217+
CONTEXTUAL_SIMPLE_DECL_ATTR(nonmutating, NonMutating, DeclModifier |
218+
OnFunc |
219+
NotSerialized, 42)
187220

188-
SIMPLE_DECL_ATTR(convenience, Convenience,
189-
OnConstructor|DeclModifier|NotSerialized, 43)
221+
CONTEXTUAL_SIMPLE_DECL_ATTR(convenience, Convenience,
222+
OnConstructor | DeclModifier | NotSerialized, 43)
190223

191-
SIMPLE_DECL_ATTR(override, Override,
192-
OnFunc | OnVar | OnSubscript | OnConstructor | DeclModifier |
193-
NotSerialized,
194-
/* Not serialized */44)
224+
CONTEXTUAL_SIMPLE_DECL_ATTR(override, Override, DeclModifier |
225+
OnFunc | OnVar | OnSubscript | OnConstructor |
226+
NotSerialized, 44)
195227

196228
SIMPLE_DECL_ATTR(sil_stored, SILStored, OnVar | NotSerialized | SILOnly,
197229
/* Not serialized */45)
@@ -204,7 +236,7 @@ DECL_ATTR(private, AccessControl,
204236
DECL_ATTR_ALIAS(fileprivate, AccessControl)
205237
DECL_ATTR_ALIAS(internal, AccessControl)
206238
DECL_ATTR_ALIAS(public, AccessControl)
207-
239+
CONTEXTUAL_DECL_ATTR_ALIAS(open, AccessControl)
208240

209241
DECL_ATTR(__setter_access, SetterAccess,
210242
OnVar | OnSubscript | DeclModifier | NotSerialized | RejectByParser,
@@ -214,9 +246,11 @@ DECL_ATTR(__raw_doc_comment, RawDocComment, OnAnyDecl |
214246
NotSerialized | RejectByParser, /* Not serialized */48)
215247

216248
// Also handles unowned and unowned(weak).
217-
DECL_ATTR(weak, ReferenceOwnership, OnVar | OnParam | DeclModifier | NotSerialized,
218-
/* Not serialized */49)
219-
DECL_ATTR_ALIAS(unowned, ReferenceOwnership)
249+
CONTEXTUAL_DECL_ATTR(weak, ReferenceOwnership, DeclModifier |
250+
OnVar | OnParam |
251+
NotSerialized, 49)
252+
253+
CONTEXTUAL_DECL_ATTR_ALIAS(unowned, ReferenceOwnership)
220254

221255
DECL_ATTR(effects, Effects, OnFunc | OnConstructor | OnDestructor |
222256
UserInaccessible, 50)
@@ -246,9 +280,9 @@ SIMPLE_DECL_ATTR(rethrows, Rethrows,
246280
DECL_ATTR(_swift_native_objc_runtime_base, SwiftNativeObjCRuntimeBase,
247281
OnClass | UserInaccessible, 59)
248282

249-
SIMPLE_DECL_ATTR(indirect, Indirect,
250-
OnEnum | OnEnumElement | DeclModifier,
251-
60)
283+
CONTEXTUAL_SIMPLE_DECL_ATTR(indirect, Indirect, DeclModifier |
284+
OnEnum | OnEnumElement,
285+
60)
252286

253287
SIMPLE_DECL_ATTR(warn_unqualified_access, WarnUnqualifiedAccess,
254288
OnFunc /*| OnVar*/ | LongAttribute, 61)
@@ -316,5 +350,8 @@ SIMPLE_DECL_ATTR(_frozen, Frozen, OnEnum | UserInaccessible, 76)
316350

317351
#undef TYPE_ATTR
318352
#undef DECL_ATTR_ALIAS
353+
#undef CONTEXTUAL_DECL_ATTR_ALIAS
319354
#undef SIMPLE_DECL_ATTR
355+
#undef CONTEXTUAL_SIMPLE_DECL_ATTR
320356
#undef DECL_ATTR
357+
#undef CONTEXTUAL_DECL_ATTR

include/swift/Parse/Token.h

Lines changed: 18 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
#include "swift/Syntax/TokenKinds.h"
2323
#include "swift/Config.h"
2424
#include "llvm/ADT/StringRef.h"
25+
#include "llvm/ADT/StringSwitch.h"
2526

2627
namespace swift {
2728

@@ -38,17 +39,17 @@ class Token {
3839
/// \brief Whether this token is the first token on the line.
3940
unsigned AtStartOfLine : 1;
4041

41-
/// \brief The length of the comment that precedes the token.
42-
///
43-
/// Hopefully 128 Mib is enough.
44-
unsigned CommentLength : 27;
45-
4642
/// \brief Whether this token is an escaped `identifier` token.
4743
unsigned EscapedIdentifier : 1;
4844

4945
/// Modifiers for string literals
5046
unsigned MultilineString : 1;
5147

48+
// Padding bits == 32 - sizeof(Kind) * 8 - 3;
49+
50+
/// \brief The length of the comment that precedes the token.
51+
unsigned CommentLength;
52+
5253
/// Text - The actual string covered by the token in the source buffer.
5354
StringRef Text;
5455

@@ -59,15 +60,12 @@ class Token {
5960
}
6061

6162
public:
62-
Token() : Kind(tok::NUM_TOKENS), AtStartOfLine(false), CommentLength(0),
63-
EscapedIdentifier(false) {}
64-
65-
Token(tok Kind, StringRef Text, unsigned CommentLength)
66-
: Kind(Kind), AtStartOfLine(false), CommentLength(CommentLength),
67-
EscapedIdentifier(false), MultilineString(false),
63+
Token(tok Kind, StringRef Text, unsigned CommentLength = 0)
64+
: Kind(Kind), AtStartOfLine(false), EscapedIdentifier(false),
65+
MultilineString(false), CommentLength(CommentLength),
6866
Text(Text) {}
6967

70-
Token(tok Kind, StringRef Text): Token(Kind, Text, 0) {};
68+
Token() : Token(tok::NUM_TOKENS, {}, 0) {}
7169

7270
tok getKind() const { return Kind; }
7371
void setKind(tok K) { Kind = K; }
@@ -139,34 +137,14 @@ class Token {
139137
if (isNot(tok::identifier) || isEscapedIdentifier() || Text.empty())
140138
return false;
141139

142-
switch (Text[0]) {
143-
case 'c':
144-
return Text == "convenience";
145-
case 'd':
146-
return Text == "dynamic";
147-
case 'f':
148-
return Text == "final";
149-
case 'i':
150-
return Text == "indirect" || Text == "infix";
151-
case 'l':
152-
return Text == "lazy";
153-
case 'm':
154-
return Text == "mutating";
155-
case 'n':
156-
return Text == "nonmutating";
157-
case 'o':
158-
return Text == "open" || Text == "override" || Text == "optional";
159-
case 'p':
160-
return Text == "prefix" || Text == "postfix";
161-
case 'r':
162-
return Text == "required";
163-
case 'u':
164-
return Text == "unowned";
165-
case 'w':
166-
return Text == "weak";
167-
default:
168-
return false;
169-
}
140+
return llvm::StringSwitch<bool>(Text)
141+
#define CONTEXTUAL_CASE(KW) .Case(#KW, true)
142+
#define CONTEXTUAL_DECL_ATTR(KW, ...) CONTEXTUAL_CASE(KW)
143+
#define CONTEXTUAL_DECL_ATTR_ALIAS(KW, ...) CONTEXTUAL_CASE(KW)
144+
#define CONTEXTUAL_SIMPLE_DECL_ATTR(KW, ...) CONTEXTUAL_CASE(KW)
145+
#include "swift/AST/Attr.def"
146+
#undef CONTEXTUAL_CASE
147+
.Default(false);
170148
}
171149

172150
bool isContextualPunctuator(StringRef ContextPunc) const {

lib/IDE/CodeCompletion.cpp

Lines changed: 8 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -4852,20 +4852,14 @@ static void addDeclKeywords(CodeCompletionResultSink &Sink) {
48524852
auto AddCSKeyword = [&](StringRef Name) {
48534853
AddKeyword(Name, CodeCompletionKeywordKind::None);
48544854
};
4855-
AddCSKeyword("weak");
4856-
AddCSKeyword("unowned");
4857-
AddCSKeyword("optional");
4858-
AddCSKeyword("required");
4859-
AddCSKeyword("lazy");
4860-
AddCSKeyword("final");
4861-
AddCSKeyword("dynamic");
4862-
AddCSKeyword("prefix");
4863-
AddCSKeyword("postfix");
4864-
AddCSKeyword("infix");
4865-
AddCSKeyword("override");
4866-
AddCSKeyword("mutating");
4867-
AddCSKeyword("nonmutating");
4868-
AddCSKeyword("convenience");
4855+
4856+
#define CONTEXTUAL_CASE(KW) AddCSKeyword(#KW);
4857+
#define CONTEXTUAL_DECL_ATTR(KW, ...) CONTEXTUAL_CASE(KW)
4858+
#define CONTEXTUAL_DECL_ATTR_ALIAS(KW, ...) CONTEXTUAL_CASE(KW)
4859+
#define CONTEXTUAL_SIMPLE_DECL_ATTR(KW, ...) CONTEXTUAL_CASE(KW)
4860+
#include <swift/AST/Attr.def>
4861+
#undef CONTEXTUAL_CASE
4862+
48694863
}
48704864

48714865
static void addStmtKeywords(CodeCompletionResultSink &Sink, bool MaybeFuncBody) {

lib/Parse/ParseDecl.cpp

Lines changed: 8 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1962,24 +1962,14 @@ bool Parser::parseDeclModifierList(DeclAttributes &Attributes,
19621962
break;
19631963

19641964
DeclAttrKind Kind = llvm::StringSwitch<DeclAttrKind>(Tok.getText())
1965-
.Case("open", DAK_AccessControl)
1966-
.Case("weak", DAK_ReferenceOwnership)
1967-
.Case("unowned", DAK_ReferenceOwnership)
1968-
.Case("optional", DAK_Optional)
1969-
.Case("required", DAK_Required)
1970-
.Case("lazy", DAK_Lazy)
1971-
.Case("final", DAK_Final)
1972-
.Case("dynamic", DAK_Dynamic)
1973-
.Case("prefix", DAK_Prefix)
1974-
.Case("postfix", DAK_Postfix)
1975-
.Case("indirect", DAK_Indirect)
1976-
.Case("infix", DAK_Infix)
1977-
.Case("override", DAK_Override)
1978-
.Case("mutating", DAK_Mutating)
1979-
.Case("nonmutating", DAK_NonMutating)
1980-
.Case("__consuming", DAK_Consuming)
1981-
.Case("convenience", DAK_Convenience)
1982-
.Default(DAK_Count);
1965+
#define CONTEXTUAL_CASE(KW, CLASS) .Case(#KW, DAK_##CLASS)
1966+
#define CONTEXTUAL_DECL_ATTR(KW, CLASS, ...) CONTEXTUAL_CASE(KW, CLASS)
1967+
#define CONTEXTUAL_DECL_ATTR_ALIAS(KW, CLASS) CONTEXTUAL_CASE(KW, CLASS)
1968+
#define CONTEXTUAL_SIMPLE_DECL_ATTR(KW, CLASS, ...) CONTEXTUAL_CASE(KW, CLASS)
1969+
#include <swift/AST/Attr.def>
1970+
#undef CONTEXTUAL_CASE
1971+
.Default(DAK_Count);
1972+
19831973
if (Kind == DAK_Count)
19841974
break;
19851975

test/SourceKit/CodeComplete/complete_override.swift.response

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,14 @@
11
{
22
key.results: [
3+
{
4+
key.kind: source.lang.swift.keyword,
5+
key.name: "__consuming",
6+
key.sourcetext: "__consuming",
7+
key.description: "__consuming",
8+
key.typename: "",
9+
key.context: source.codecompletion.context.none,
10+
key.num_bytes_to_erase: 0
11+
},
312
{
413
key.kind: source.lang.swift.keyword,
514
key.name: "associatedtype",
@@ -110,6 +119,15 @@
110119
key.context: source.codecompletion.context.none,
111120
key.num_bytes_to_erase: 0
112121
},
122+
{
123+
key.kind: source.lang.swift.keyword,
124+
key.name: "indirect",
125+
key.sourcetext: "indirect",
126+
key.description: "indirect",
127+
key.typename: "",
128+
key.context: source.codecompletion.context.none,
129+
key.num_bytes_to_erase: 0
130+
},
113131
{
114132
key.kind: source.lang.swift.keyword,
115133
key.name: "infix",
@@ -193,6 +211,15 @@
193211
key.context: source.codecompletion.context.none,
194212
key.num_bytes_to_erase: 0
195213
},
214+
{
215+
key.kind: source.lang.swift.keyword,
216+
key.name: "open",
217+
key.sourcetext: "open",
218+
key.description: "open",
219+
key.typename: "",
220+
key.context: source.codecompletion.context.none,
221+
key.num_bytes_to_erase: 0
222+
},
196223
{
197224
key.kind: source.lang.swift.keyword,
198225
key.name: "operator",

0 commit comments

Comments
 (0)