Skip to content

Commit 55f61d0

Browse files
committed
[ASTGen] Handle multiple attributes
`@available` and some attributes emits multiple AST attributes from a single syntactic attribute. Prepare for them.
1 parent c1fa7db commit 55f61d0

File tree

3 files changed

+47
-41
lines changed

3 files changed

+47
-41
lines changed

lib/ASTGen/Sources/ASTGen/DeclAttrs.swift

Lines changed: 45 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -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
9999
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+
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.:

lib/ASTGen/Sources/ASTGen/Decls.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -389,7 +389,7 @@ extension ASTGenVisitor {
389389
return .underlying(attribute)
390390
}
391391
} body: { node in
392-
if let attr = self.generateDeclAttribute(attribute: node) {
392+
self.generateDeclAttribute(attribute: node) { attr in
393393
attrs.add(attr)
394394
}
395395
}

lib/ASTGen/Sources/ASTGen/Exprs.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -232,7 +232,7 @@ extension ASTGenVisitor {
232232
return .underlying(attribute)
233233
}
234234
} body: { node in
235-
if let attr = self.generateDeclAttribute(attribute: node) {
235+
self.generateDeclAttribute(attribute: node) { attr in
236236
result.attributes.add(attr)
237237
}
238238
}

0 commit comments

Comments
 (0)