@@ -63,7 +63,7 @@ extension ASTGenVisitor {
6363 return . underlying( attribute)
6464 }
6565 } body: { attribute in
66- addAttribute ( self . generateDeclAttribute ( attribute: attribute) )
66+ self . generateDeclAttribute ( attribute: attribute, handler : addAttribute ( _ : ) )
6767 }
6868
6969 func genStatic( node: DeclModifierSyntax , spelling: BridgedStaticSpelling ) {
@@ -97,87 +97,90 @@ extension ASTGenVisitor {
9797
9898// MARK: - Decl attributes
9999extension 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+
101107 if let identTy = node. attributeName. as ( IdentifierTypeSyntax . self) {
102108 let attrName = identTy. name. rawText
103109 let attrKind = BridgedDeclAttrKind ( from: attrName. bridged)
104110 switch attrKind {
105111 case . alignment:
106- return self . generateAlignmentAttr ( attribute: node) ? . asDeclAttribute
112+ return handle ( self . generateAlignmentAttr ( attribute: node) ? . asDeclAttribute)
107113 case . allowFeatureSuppression:
108- return self . generateAllowFeatureSuppressionAttr ( attribute: node, attrName: attrName) ? . asDeclAttribute
114+ return handle ( self . generateAllowFeatureSuppressionAttr ( attribute: node, attrName: attrName) ? . asDeclAttribute)
109115 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) }
112117 case . backDeployed:
113118 fatalError ( " unimplemented " )
114119 case . cDecl:
115- return self . generateCDeclAttr ( attribute: node) ? . asDeclAttribute
120+ return handle ( self . generateCDeclAttr ( attribute: node) ? . asDeclAttribute)
116121 case . derivative:
117122 fatalError ( " unimplemented " )
118123 case . differentiable:
119124 fatalError ( " unimplemented " )
120125 case . dynamicReplacement:
121- return self . generateDynamicReplacementAttr ( attribute: node) ? . asDeclAttribute
126+ return handle ( self . generateDynamicReplacementAttr ( attribute: node) ? . asDeclAttribute)
122127 case . documentation:
123- return self . generateDocumentationAttr ( attribute: node) ? . asDeclAttribute
128+ return handle ( self . generateDocumentationAttr ( attribute: node) ? . asDeclAttribute)
124129 case . effects:
125- return self . generateEffectsAttr ( attribute: node) ? . asDeclAttribute
130+ return handle ( self . generateEffectsAttr ( attribute: node) ? . asDeclAttribute)
126131 case . exclusivity:
127- return self . generateExclusivityAttr ( attribute: node) ? . asDeclAttribute
132+ return handle ( self . generateExclusivityAttr ( attribute: node) ? . asDeclAttribute)
128133 case . expose:
129- return self . generateExposeAttr ( attribute: node) ? . asDeclAttribute
134+ return handle ( self . generateExposeAttr ( attribute: node) ? . asDeclAttribute)
130135 case . extern:
131- return self . generateExternAttr ( attribute: node) ? . asDeclAttribute
136+ return handle ( self . generateExternAttr ( attribute: node) ? . asDeclAttribute)
132137 case . implements:
133- return self . generateImplementsAttr ( attribute: node) ? . asDeclAttribute
138+ return handle ( self . generateImplementsAttr ( attribute: node) ? . asDeclAttribute)
134139 case . inline:
135- return self . generateInlineAttr ( attribute: node) ? . asDeclAttribute
140+ return handle ( self . generateInlineAttr ( attribute: node) ? . asDeclAttribute)
136141 case . lifetime:
137142 fatalError ( " unimplemented " )
138143 case . macroRole:
139- return self . generateMacroRoleAttr ( attribute: node, attrName: attrName) ? . asDeclAttribute
144+ return handle ( self . generateMacroRoleAttr ( attribute: node, attrName: attrName) ? . asDeclAttribute)
140145 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)
144147 case . objC:
145- return self . generateObjCAttr ( attribute: node) ? . asDeclAttribute
148+ return handle ( self . generateObjCAttr ( attribute: node) ? . asDeclAttribute)
146149 case . objCImplementation:
147- return self . generateObjCImplementationAttr ( attribute: node) ? . asDeclAttribute
150+ return handle ( self . generateObjCImplementationAttr ( attribute: node) ? . asDeclAttribute)
148151 case . objCRuntimeName:
149- return self . generateObjCRuntimeNameAttr ( attribute: node) ? . asDeclAttribute
152+ return handle ( self . generateObjCRuntimeNameAttr ( attribute: node) ? . asDeclAttribute)
150153 case . optimize:
151- return self . generateOptimizeAttr ( attribute: node) ? . asDeclAttribute
154+ return handle ( self . generateOptimizeAttr ( attribute: node) ? . asDeclAttribute)
152155 case . originallyDefinedIn:
153156 // FIXME: handle multiple results.
154- return self . generateOriginallyDefinedInAttr ( attribute: node) . first? . asDeclAttribute
157+ return handle ( self . generateOriginallyDefinedInAttr ( attribute: node) . first? . asDeclAttribute)
155158 case . privateImport:
156- return self . generatePrivateImportAttr ( attribute: node) ? . asDeclAttribute
159+ return handle ( self . generatePrivateImportAttr ( attribute: node) ? . asDeclAttribute)
157160 case . projectedValueProperty:
158- return self . generateProjectedValuePropertyAttr ( attribute: node) ? . asDeclAttribute
161+ return handle ( self . generateProjectedValuePropertyAttr ( attribute: node) ? . asDeclAttribute)
159162 case . rawLayout:
160163 fatalError ( " unimplemented " )
161164 case . section:
162- return self . generateSectionAttr ( attribute: node) ? . asDeclAttribute
165+ return handle ( self . generateSectionAttr ( attribute: node) ? . asDeclAttribute)
163166 case . semantics:
164- return self . generateSemanticsAttr ( attribute: node) ? . asDeclAttribute
167+ return handle ( self . generateSemanticsAttr ( attribute: node) ? . asDeclAttribute)
165168 case . silGenName:
166- return self . generateSILGenNameAttr ( attribute: node) ? . asDeclAttribute
169+ return handle ( self . generateSILGenNameAttr ( attribute: node) ? . asDeclAttribute)
167170 case . specialize:
168- return self . generateSpecializeAttr ( attribute: node) ? . asDeclAttribute
171+ return handle ( self . generateSpecializeAttr ( attribute: node) ? . asDeclAttribute)
169172 case . spiAccessControl:
170- return self . generateSPIAccessControlAttr ( attribute: node) ? . asDeclAttribute
173+ return handle ( self . generateSPIAccessControlAttr ( attribute: node) ? . asDeclAttribute)
171174 case . storageRestrictions:
172- return self . generateStorageRestrictionAttr ( attribute: node) ? . asDeclAttribute
175+ return handle ( self . generateStorageRestrictionAttr ( attribute: node) ? . asDeclAttribute)
173176 case . swiftNativeObjCRuntimeBase:
174- return self . generateSwiftNativeObjCRuntimeBaseAttr ( attribute: node) ? . asDeclAttribute
177+ return handle ( self . generateSwiftNativeObjCRuntimeBaseAttr ( attribute: node) ? . asDeclAttribute)
175178 case . transpose:
176179 fatalError ( " unimplemented " )
177180 case . typeEraser:
178181 fatalError ( " unimplemented " )
179182 case . unavailableFromAsync:
180- return self . generateUnavailableFromAsyncAttr ( attribute: node) ? . asDeclAttribute
183+ return handle ( self . generateUnavailableFromAsyncAttr ( attribute: node) ? . asDeclAttribute)
181184
182185 // Simple attributes.
183186 case . alwaysEmitConformanceMetadata,
@@ -258,15 +261,18 @@ extension ASTGenVisitor {
258261 . warnUnqualifiedAccess,
259262 . weakLinked:
260263
261- return self . generateSimpleDeclAttr ( attribute: node, kind: attrKind)
264+ return handle ( self . generateSimpleDeclAttr ( attribute: node, kind: attrKind) )
262265
263266 // Modifers.
264267 case . accessControl:
265268 // TODO: Diagnose and generateAccessControl().
266269 fatalError ( " unimplemented " )
270+ case . nonisolated:
271+ // TODO: Diagnose.
272+ return handle ( self . generateNonisolatedAttr ( attribute: node) ? . asDeclAttribute)
267273 case . referenceOwnership:
268274 // TODO: Diagnose.
269- return self . generateReferenceOwnershipAttr ( attribute: node, attrName: attrName) ? . asDeclAttribute
275+ return handle ( self . generateReferenceOwnershipAttr ( attribute: node, attrName: attrName) ? . asDeclAttribute)
270276 case . async ,
271277 . consuming,
272278 . borrowing,
@@ -290,7 +296,7 @@ extension ASTGenVisitor {
290296 . compileTimeConst:
291297
292298 // 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) )
294300
295301 // 'RejectByParser', these attribute kind should not be parsed as built-in attributes.
296302 case . rawDocComment,
@@ -305,15 +311,15 @@ extension ASTGenVisitor {
305311 . rethrows,
306312 . reasync:
307313 // TODO: Diagnose or fallback to custom attributes?
308- return nil
314+ return
309315
310316 case . none:
311317 // Fall back to CustomAttr.
312318 break
313319 }
314320 }
315321
316- return self . generateCustomAttr ( attribute: node) ? . asDeclAttribute
322+ return handle ( self . generateCustomAttr ( attribute: node) ? . asDeclAttribute)
317323 }
318324
319325 /// E.g.:
0 commit comments