Skip to content

Commit c0c178f

Browse files
authored
Merge pull request swiftlang#78019 from rintaro/astgen-declattr-multiple
[ASTGen] Handle multiple attributes
2 parents c041994 + 7fd97c9 commit c0c178f

File tree

3 files changed

+62
-71
lines changed

3 files changed

+62
-71
lines changed

lib/ASTGen/Sources/ASTGen/DeclAttrs.swift

Lines changed: 58 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -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
99102
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+
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.:

lib/ASTGen/Sources/ASTGen/Decls.swift

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -381,17 +381,8 @@ extension ASTGenVisitor {
381381
var attrs = BridgedDeclAttributes()
382382

383383
// '@' attributes.
384-
visitIfConfigElements(node.attributes, of: AttributeSyntax.self) { element in
385-
switch element {
386-
case .ifConfigDecl(let ifConfigDecl):
387-
return .ifConfigDecl(ifConfigDecl)
388-
case .attribute(let attribute):
389-
return .underlying(attribute)
390-
}
391-
} body: { node in
392-
if let attr = self.generateDeclAttribute(attribute: node) {
393-
attrs.add(attr)
394-
}
384+
self.generateDeclAttributes(attributeList: node.attributes) { attr in
385+
attrs.add(attr)
395386
}
396387

397388
// The modifier

lib/ASTGen/Sources/ASTGen/Exprs.swift

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -224,17 +224,8 @@ extension ASTGenVisitor {
224224
var result = GeneratedClosureSignature()
225225

226226
// Attributes.
227-
visitIfConfigElements(node.attributes, of: AttributeSyntax.self) { element in
228-
switch element {
229-
case .ifConfigDecl(let ifConfigDecl):
230-
return .ifConfigDecl(ifConfigDecl)
231-
case .attribute(let attribute):
232-
return .underlying(attribute)
233-
}
234-
} body: { node in
235-
if let attr = self.generateDeclAttribute(attribute: node) {
236-
result.attributes.add(attr)
237-
}
227+
self.generateDeclAttributes(attributeList: node.attributes) { attr in
228+
result.attributes.add(attr)
238229
}
239230

240231
if let node = node.capture {

0 commit comments

Comments
 (0)