@@ -54,17 +54,7 @@ extension ASTGenVisitor {
5454 }
5555
5656 // '@' 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 ( _: ) )
6858
6959 func genStatic( node: DeclModifierSyntax , spelling: BridgedStaticSpelling ) {
7060 // TODO: Diagnose duplicated attrs.
@@ -93,91 +83,107 @@ extension ASTGenVisitor {
9383 staticLoc: staticLoc
9484 )
9585 }
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+ }
9699}
97100
98101// MARK: - Decl attributes
99102extension 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+
101110 if let identTy = node. attributeName. as ( IdentifierTypeSyntax . self) {
102111 let attrName = identTy. name. rawText
103112 let attrKind = BridgedDeclAttrKind ( from: attrName. bridged)
104113 switch attrKind {
105114 case . alignment:
106- return self . generateAlignmentAttr ( attribute: node) ? . asDeclAttribute
115+ return handle ( self . generateAlignmentAttr ( attribute: node) ? . asDeclAttribute)
107116 case . allowFeatureSuppression:
108- return self . generateAllowFeatureSuppressionAttr ( attribute: node, attrName: attrName) ? . asDeclAttribute
117+ return handle ( self . generateAllowFeatureSuppressionAttr ( attribute: node, attrName: attrName) ? . asDeclAttribute)
109118 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) }
112120 case . backDeployed:
113121 fatalError ( " unimplemented " )
114122 case . cDecl:
115- return self . generateCDeclAttr ( attribute: node) ? . asDeclAttribute
123+ return handle ( self . generateCDeclAttr ( attribute: node) ? . asDeclAttribute)
116124 case . derivative:
117125 fatalError ( " unimplemented " )
118126 case . differentiable:
119127 fatalError ( " unimplemented " )
120128 case . dynamicReplacement:
121- return self . generateDynamicReplacementAttr ( attribute: node) ? . asDeclAttribute
129+ return handle ( self . generateDynamicReplacementAttr ( attribute: node) ? . asDeclAttribute)
122130 case . documentation:
123- return self . generateDocumentationAttr ( attribute: node) ? . asDeclAttribute
131+ return handle ( self . generateDocumentationAttr ( attribute: node) ? . asDeclAttribute)
124132 case . effects:
125- return self . generateEffectsAttr ( attribute: node) ? . asDeclAttribute
133+ return handle ( self . generateEffectsAttr ( attribute: node) ? . asDeclAttribute)
126134 case . exclusivity:
127- return self . generateExclusivityAttr ( attribute: node) ? . asDeclAttribute
135+ return handle ( self . generateExclusivityAttr ( attribute: node) ? . asDeclAttribute)
128136 case . expose:
129- return self . generateExposeAttr ( attribute: node) ? . asDeclAttribute
137+ return handle ( self . generateExposeAttr ( attribute: node) ? . asDeclAttribute)
130138 case . extern:
131- return self . generateExternAttr ( attribute: node) ? . asDeclAttribute
139+ return handle ( self . generateExternAttr ( attribute: node) ? . asDeclAttribute)
132140 case . implements:
133- return self . generateImplementsAttr ( attribute: node) ? . asDeclAttribute
141+ return handle ( self . generateImplementsAttr ( attribute: node) ? . asDeclAttribute)
134142 case . inline:
135- return self . generateInlineAttr ( attribute: node) ? . asDeclAttribute
143+ return handle ( self . generateInlineAttr ( attribute: node) ? . asDeclAttribute)
136144 case . lifetime:
137145 fatalError ( " unimplemented " )
138146 case . macroRole:
139- return self . generateMacroRoleAttr ( attribute: node, attrName: attrName) ? . asDeclAttribute
147+ return handle ( self . generateMacroRoleAttr ( attribute: node, attrName: attrName) ? . asDeclAttribute)
140148 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)
144150 case . objC:
145- return self . generateObjCAttr ( attribute: node) ? . asDeclAttribute
151+ return handle ( self . generateObjCAttr ( attribute: node) ? . asDeclAttribute)
146152 case . objCImplementation:
147- return self . generateObjCImplementationAttr ( attribute: node) ? . asDeclAttribute
153+ return handle ( self . generateObjCImplementationAttr ( attribute: node) ? . asDeclAttribute)
148154 case . objCRuntimeName:
149- return self . generateObjCRuntimeNameAttr ( attribute: node) ? . asDeclAttribute
155+ return handle ( self . generateObjCRuntimeNameAttr ( attribute: node) ? . asDeclAttribute)
150156 case . optimize:
151- return self . generateOptimizeAttr ( attribute: node) ? . asDeclAttribute
157+ return handle ( self . generateOptimizeAttr ( attribute: node) ? . asDeclAttribute)
152158 case . originallyDefinedIn:
153159 // FIXME: handle multiple results.
154- return self . generateOriginallyDefinedInAttr ( attribute: node) . first? . asDeclAttribute
160+ return handle ( self . generateOriginallyDefinedInAttr ( attribute: node) . first? . asDeclAttribute)
155161 case . privateImport:
156- return self . generatePrivateImportAttr ( attribute: node) ? . asDeclAttribute
162+ return handle ( self . generatePrivateImportAttr ( attribute: node) ? . asDeclAttribute)
157163 case . projectedValueProperty:
158- return self . generateProjectedValuePropertyAttr ( attribute: node) ? . asDeclAttribute
164+ return handle ( self . generateProjectedValuePropertyAttr ( attribute: node) ? . asDeclAttribute)
159165 case . rawLayout:
160166 fatalError ( " unimplemented " )
161167 case . section:
162- return self . generateSectionAttr ( attribute: node) ? . asDeclAttribute
168+ return handle ( self . generateSectionAttr ( attribute: node) ? . asDeclAttribute)
163169 case . semantics:
164- return self . generateSemanticsAttr ( attribute: node) ? . asDeclAttribute
170+ return handle ( self . generateSemanticsAttr ( attribute: node) ? . asDeclAttribute)
165171 case . silGenName:
166- return self . generateSILGenNameAttr ( attribute: node) ? . asDeclAttribute
172+ return handle ( self . generateSILGenNameAttr ( attribute: node) ? . asDeclAttribute)
167173 case . specialize:
168- return self . generateSpecializeAttr ( attribute: node) ? . asDeclAttribute
174+ return handle ( self . generateSpecializeAttr ( attribute: node) ? . asDeclAttribute)
169175 case . spiAccessControl:
170- return self . generateSPIAccessControlAttr ( attribute: node) ? . asDeclAttribute
176+ return handle ( self . generateSPIAccessControlAttr ( attribute: node) ? . asDeclAttribute)
171177 case . storageRestrictions:
172- return self . generateStorageRestrictionAttr ( attribute: node) ? . asDeclAttribute
178+ return handle ( self . generateStorageRestrictionAttr ( attribute: node) ? . asDeclAttribute)
173179 case . swiftNativeObjCRuntimeBase:
174- return self . generateSwiftNativeObjCRuntimeBaseAttr ( attribute: node) ? . asDeclAttribute
180+ return handle ( self . generateSwiftNativeObjCRuntimeBaseAttr ( attribute: node) ? . asDeclAttribute)
175181 case . transpose:
176182 fatalError ( " unimplemented " )
177183 case . typeEraser:
178184 fatalError ( " unimplemented " )
179185 case . unavailableFromAsync:
180- return self . generateUnavailableFromAsyncAttr ( attribute: node) ? . asDeclAttribute
186+ return handle ( self . generateUnavailableFromAsyncAttr ( attribute: node) ? . asDeclAttribute)
181187
182188 // Simple attributes.
183189 case . alwaysEmitConformanceMetadata,
@@ -258,15 +264,18 @@ extension ASTGenVisitor {
258264 . warnUnqualifiedAccess,
259265 . weakLinked:
260266
261- return self . generateSimpleDeclAttr ( attribute: node, kind: attrKind)
267+ return handle ( self . generateSimpleDeclAttr ( attribute: node, kind: attrKind) )
262268
263269 // Modifers.
264270 case . accessControl:
265271 // TODO: Diagnose and generateAccessControl().
266272 fatalError ( " unimplemented " )
273+ case . nonisolated:
274+ // TODO: Diagnose.
275+ return handle ( self . generateNonisolatedAttr ( attribute: node) ? . asDeclAttribute)
267276 case . referenceOwnership:
268277 // TODO: Diagnose.
269- return self . generateReferenceOwnershipAttr ( attribute: node, attrName: attrName) ? . asDeclAttribute
278+ return handle ( self . generateReferenceOwnershipAttr ( attribute: node, attrName: attrName) ? . asDeclAttribute)
270279 case . async ,
271280 . consuming,
272281 . borrowing,
@@ -290,7 +299,7 @@ extension ASTGenVisitor {
290299 . compileTimeConst:
291300
292301 // 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) )
294303
295304 // 'RejectByParser', these attribute kind should not be parsed as built-in attributes.
296305 case . rawDocComment,
@@ -305,15 +314,15 @@ extension ASTGenVisitor {
305314 . rethrows,
306315 . reasync:
307316 // TODO: Diagnose or fallback to custom attributes?
308- return nil
317+ return
309318
310319 case . none:
311320 // Fall back to CustomAttr.
312321 break
313322 }
314323 }
315324
316- return self . generateCustomAttr ( attribute: node) ? . asDeclAttribute
325+ return handle ( self . generateCustomAttr ( attribute: node) ? . asDeclAttribute)
317326 }
318327
319328 /// E.g.:
0 commit comments