@@ -54,17 +54,7 @@ extension ASTGenVisitor {
54
54
}
55
55
56
56
// '@' attributes.
57
- // FIXME: Factor out this and share it with 'generate(accessorDecl:)'.
58
- visitIfConfigElements ( node. attributes, of: AttributeSyntax . self) { element in
59
- switch element {
60
- case . ifConfigDecl( let ifConfigDecl) :
61
- return . ifConfigDecl( ifConfigDecl)
62
- case . attribute( let attribute) :
63
- return . underlying( attribute)
64
- }
65
- } body: { attribute in
66
- addAttribute ( self . generateDeclAttribute ( attribute: attribute) )
67
- }
57
+ self . generateDeclAttributes ( attributeList: node. attributes, handler: addAttribute ( _: ) )
68
58
69
59
func genStatic( node: DeclModifierSyntax , spelling: BridgedStaticSpelling ) {
70
60
// TODO: Diagnose duplicated attrs.
@@ -93,91 +83,107 @@ extension ASTGenVisitor {
93
83
staticLoc: staticLoc
94
84
)
95
85
}
86
+
87
+ func generateDeclAttributes( attributeList node: AttributeListSyntax , handler: ( BridgedDeclAttribute ) -> Void ) {
88
+ visitIfConfigElements ( node, of: AttributeSyntax . self) { element in
89
+ switch element {
90
+ case . ifConfigDecl( let ifConfigDecl) :
91
+ return . ifConfigDecl( ifConfigDecl)
92
+ case . attribute( let attribute) :
93
+ return . underlying( attribute)
94
+ }
95
+ } body: { attribute in
96
+ self . generateDeclAttribute ( attribute: attribute, handler: handler)
97
+ }
98
+ }
96
99
}
97
100
98
101
// MARK: - Decl attributes
99
102
extension ASTGenVisitor {
100
- func generateDeclAttribute( attribute node: AttributeSyntax ) -> BridgedDeclAttribute ? {
103
+ func generateDeclAttribute( attribute node: AttributeSyntax , handler: ( BridgedDeclAttribute ) -> Void ) {
104
+ func handle( _ attr: BridgedDeclAttribute ? ) {
105
+ if let attr {
106
+ handler ( attr)
107
+ }
108
+ }
109
+
101
110
if let identTy = node. attributeName. as ( IdentifierTypeSyntax . self) {
102
111
let attrName = identTy. name. rawText
103
112
let attrKind = BridgedDeclAttrKind ( from: attrName. bridged)
104
113
switch attrKind {
105
114
case . alignment:
106
- return self . generateAlignmentAttr ( attribute: node) ? . asDeclAttribute
115
+ return handle ( self . generateAlignmentAttr ( attribute: node) ? . asDeclAttribute)
107
116
case . allowFeatureSuppression:
108
- return self . generateAllowFeatureSuppressionAttr ( attribute: node, attrName: attrName) ? . asDeclAttribute
117
+ return handle ( self . generateAllowFeatureSuppressionAttr ( attribute: node, attrName: attrName) ? . asDeclAttribute)
109
118
case . available:
110
- // FIXME: handle multiple results.
111
- return self . generateAvailableAttr ( attribute: node) . first? . asDeclAttribute
119
+ return self . generateAvailableAttr ( attribute: node) . forEach { handle ( $0. asDeclAttribute) }
112
120
case . backDeployed:
113
121
fatalError ( " unimplemented " )
114
122
case . cDecl:
115
- return self . generateCDeclAttr ( attribute: node) ? . asDeclAttribute
123
+ return handle ( self . generateCDeclAttr ( attribute: node) ? . asDeclAttribute)
116
124
case . derivative:
117
125
fatalError ( " unimplemented " )
118
126
case . differentiable:
119
127
fatalError ( " unimplemented " )
120
128
case . dynamicReplacement:
121
- return self . generateDynamicReplacementAttr ( attribute: node) ? . asDeclAttribute
129
+ return handle ( self . generateDynamicReplacementAttr ( attribute: node) ? . asDeclAttribute)
122
130
case . documentation:
123
- return self . generateDocumentationAttr ( attribute: node) ? . asDeclAttribute
131
+ return handle ( self . generateDocumentationAttr ( attribute: node) ? . asDeclAttribute)
124
132
case . effects:
125
- return self . generateEffectsAttr ( attribute: node) ? . asDeclAttribute
133
+ return handle ( self . generateEffectsAttr ( attribute: node) ? . asDeclAttribute)
126
134
case . exclusivity:
127
- return self . generateExclusivityAttr ( attribute: node) ? . asDeclAttribute
135
+ return handle ( self . generateExclusivityAttr ( attribute: node) ? . asDeclAttribute)
128
136
case . expose:
129
- return self . generateExposeAttr ( attribute: node) ? . asDeclAttribute
137
+ return handle ( self . generateExposeAttr ( attribute: node) ? . asDeclAttribute)
130
138
case . extern:
131
- return self . generateExternAttr ( attribute: node) ? . asDeclAttribute
139
+ return handle ( self . generateExternAttr ( attribute: node) ? . asDeclAttribute)
132
140
case . implements:
133
- return self . generateImplementsAttr ( attribute: node) ? . asDeclAttribute
141
+ return handle ( self . generateImplementsAttr ( attribute: node) ? . asDeclAttribute)
134
142
case . inline:
135
- return self . generateInlineAttr ( attribute: node) ? . asDeclAttribute
143
+ return handle ( self . generateInlineAttr ( attribute: node) ? . asDeclAttribute)
136
144
case . lifetime:
137
145
fatalError ( " unimplemented " )
138
146
case . macroRole:
139
- return self . generateMacroRoleAttr ( attribute: node, attrName: attrName) ? . asDeclAttribute
147
+ return handle ( self . generateMacroRoleAttr ( attribute: node, attrName: attrName) ? . asDeclAttribute)
140
148
case . nonSendable:
141
- return self . generateNonSendableAttr ( attribute: node) ? . asDeclAttribute
142
- case . nonisolated:
143
- return self . generateNonisolatedAttr ( attribute: node) ? . asDeclAttribute
149
+ return handle ( self . generateNonSendableAttr ( attribute: node) ? . asDeclAttribute)
144
150
case . objC:
145
- return self . generateObjCAttr ( attribute: node) ? . asDeclAttribute
151
+ return handle ( self . generateObjCAttr ( attribute: node) ? . asDeclAttribute)
146
152
case . objCImplementation:
147
- return self . generateObjCImplementationAttr ( attribute: node) ? . asDeclAttribute
153
+ return handle ( self . generateObjCImplementationAttr ( attribute: node) ? . asDeclAttribute)
148
154
case . objCRuntimeName:
149
- return self . generateObjCRuntimeNameAttr ( attribute: node) ? . asDeclAttribute
155
+ return handle ( self . generateObjCRuntimeNameAttr ( attribute: node) ? . asDeclAttribute)
150
156
case . optimize:
151
- return self . generateOptimizeAttr ( attribute: node) ? . asDeclAttribute
157
+ return handle ( self . generateOptimizeAttr ( attribute: node) ? . asDeclAttribute)
152
158
case . originallyDefinedIn:
153
159
// FIXME: handle multiple results.
154
- return self . generateOriginallyDefinedInAttr ( attribute: node) . first? . asDeclAttribute
160
+ return handle ( self . generateOriginallyDefinedInAttr ( attribute: node) . first? . asDeclAttribute)
155
161
case . privateImport:
156
- return self . generatePrivateImportAttr ( attribute: node) ? . asDeclAttribute
162
+ return handle ( self . generatePrivateImportAttr ( attribute: node) ? . asDeclAttribute)
157
163
case . projectedValueProperty:
158
- return self . generateProjectedValuePropertyAttr ( attribute: node) ? . asDeclAttribute
164
+ return handle ( self . generateProjectedValuePropertyAttr ( attribute: node) ? . asDeclAttribute)
159
165
case . rawLayout:
160
166
fatalError ( " unimplemented " )
161
167
case . section:
162
- return self . generateSectionAttr ( attribute: node) ? . asDeclAttribute
168
+ return handle ( self . generateSectionAttr ( attribute: node) ? . asDeclAttribute)
163
169
case . semantics:
164
- return self . generateSemanticsAttr ( attribute: node) ? . asDeclAttribute
170
+ return handle ( self . generateSemanticsAttr ( attribute: node) ? . asDeclAttribute)
165
171
case . silGenName:
166
- return self . generateSILGenNameAttr ( attribute: node) ? . asDeclAttribute
172
+ return handle ( self . generateSILGenNameAttr ( attribute: node) ? . asDeclAttribute)
167
173
case . specialize:
168
- return self . generateSpecializeAttr ( attribute: node) ? . asDeclAttribute
174
+ return handle ( self . generateSpecializeAttr ( attribute: node) ? . asDeclAttribute)
169
175
case . spiAccessControl:
170
- return self . generateSPIAccessControlAttr ( attribute: node) ? . asDeclAttribute
176
+ return handle ( self . generateSPIAccessControlAttr ( attribute: node) ? . asDeclAttribute)
171
177
case . storageRestrictions:
172
- return self . generateStorageRestrictionAttr ( attribute: node) ? . asDeclAttribute
178
+ return handle ( self . generateStorageRestrictionAttr ( attribute: node) ? . asDeclAttribute)
173
179
case . swiftNativeObjCRuntimeBase:
174
- return self . generateSwiftNativeObjCRuntimeBaseAttr ( attribute: node) ? . asDeclAttribute
180
+ return handle ( self . generateSwiftNativeObjCRuntimeBaseAttr ( attribute: node) ? . asDeclAttribute)
175
181
case . transpose:
176
182
fatalError ( " unimplemented " )
177
183
case . typeEraser:
178
184
fatalError ( " unimplemented " )
179
185
case . unavailableFromAsync:
180
- return self . generateUnavailableFromAsyncAttr ( attribute: node) ? . asDeclAttribute
186
+ return handle ( self . generateUnavailableFromAsyncAttr ( attribute: node) ? . asDeclAttribute)
181
187
182
188
// Simple attributes.
183
189
case . alwaysEmitConformanceMetadata,
@@ -258,15 +264,18 @@ extension ASTGenVisitor {
258
264
. warnUnqualifiedAccess,
259
265
. weakLinked:
260
266
261
- return self . generateSimpleDeclAttr ( attribute: node, kind: attrKind)
267
+ return handle ( self . generateSimpleDeclAttr ( attribute: node, kind: attrKind) )
262
268
263
269
// Modifers.
264
270
case . accessControl:
265
271
// TODO: Diagnose and generateAccessControl().
266
272
fatalError ( " unimplemented " )
273
+ case . nonisolated:
274
+ // TODO: Diagnose.
275
+ return handle ( self . generateNonisolatedAttr ( attribute: node) ? . asDeclAttribute)
267
276
case . referenceOwnership:
268
277
// TODO: Diagnose.
269
- return self . generateReferenceOwnershipAttr ( attribute: node, attrName: attrName) ? . asDeclAttribute
278
+ return handle ( self . generateReferenceOwnershipAttr ( attribute: node, attrName: attrName) ? . asDeclAttribute)
270
279
case . async ,
271
280
. consuming,
272
281
. borrowing,
@@ -290,7 +299,7 @@ extension ASTGenVisitor {
290
299
. compileTimeConst:
291
300
292
301
// generateSimpleDeclAttr will diagnose and fix-it to change it to modifiers.
293
- return self . generateSimpleDeclAttr ( attribute: node, kind: attrKind)
302
+ return handle ( self . generateSimpleDeclAttr ( attribute: node, kind: attrKind) )
294
303
295
304
// 'RejectByParser', these attribute kind should not be parsed as built-in attributes.
296
305
case . rawDocComment,
@@ -305,15 +314,15 @@ extension ASTGenVisitor {
305
314
. rethrows,
306
315
. reasync:
307
316
// TODO: Diagnose or fallback to custom attributes?
308
- return nil
317
+ return
309
318
310
319
case . none:
311
320
// Fall back to CustomAttr.
312
321
break
313
322
}
314
323
}
315
324
316
- return self . generateCustomAttr ( attribute: node) ? . asDeclAttribute
325
+ return handle ( self . generateCustomAttr ( attribute: node) ? . asDeclAttribute)
317
326
}
318
327
319
328
/// E.g.:
0 commit comments