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