Skip to content

Commit 7add493

Browse files
committed
[ASTGen] Generate '@_spi_available' attribute
1 parent d300679 commit 7add493

File tree

5 files changed

+30
-15
lines changed

5 files changed

+30
-15
lines changed

include/swift/AST/ASTBridging.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -877,15 +877,16 @@ enum ENUM_EXTENSIBILITY_ATTR(closed) BridgedAvailableAttrKind {
877877

878878
SWIFT_NAME("BridgedAvailableAttr.createParsed(_:atLoc:range:domainIdentifier:"
879879
"domainLoc:kind:message:renamed:introduced:introducedRange:"
880-
"deprecated:deprecatedRange:obsoleted:obsoletedRange:)")
880+
"deprecated:deprecatedRange:obsoleted:obsoletedRange:isSPI:)")
881881
BridgedAvailableAttr BridgedAvailableAttr_createParsed(
882882
BridgedASTContext cContext, BridgedSourceLoc cAtLoc,
883883
BridgedSourceRange cRange, BridgedIdentifier cDomainIdentifier,
884884
BridgedSourceLoc cDomainLoc, BridgedAvailableAttrKind cKind,
885885
BridgedStringRef cMessage, BridgedStringRef cRenamed,
886886
BridgedVersionTuple cIntroduced, BridgedSourceRange cIntroducedRange,
887887
BridgedVersionTuple cDeprecated, BridgedSourceRange cDeprecatedRange,
888-
BridgedVersionTuple cObsoleted, BridgedSourceRange cObsoletedRange);
888+
BridgedVersionTuple cObsoleted, BridgedSourceRange cObsoletedRange,
889+
bool isSPI);
889890

890891
SWIFT_NAME("BridgedAvailableAttr.createUnavailableInEmbedded(_:atLoc:range:)")
891892
BridgedAvailableAttr

lib/AST/Bridging/DeclAttributeBridging.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,8 @@ BridgedAvailableAttr BridgedAvailableAttr_createParsed(
143143
BridgedStringRef cMessage, BridgedStringRef cRenamed,
144144
BridgedVersionTuple cIntroduced, BridgedSourceRange cIntroducedRange,
145145
BridgedVersionTuple cDeprecated, BridgedSourceRange cDeprecatedRange,
146-
BridgedVersionTuple cObsoleted, BridgedSourceRange cObsoletedRange) {
146+
BridgedVersionTuple cObsoleted, BridgedSourceRange cObsoletedRange,
147+
bool isSPI) {
147148

148149
return new (cContext.unbridged())
149150
AvailableAttr(cAtLoc.unbridged(), cRange.unbridged(),
@@ -153,7 +154,7 @@ BridgedAvailableAttr BridgedAvailableAttr_createParsed(
153154
cDeprecated.unbridged(), cDeprecatedRange.unbridged(),
154155
cObsoleted.unbridged(), cObsoletedRange.unbridged(),
155156
/*Implicit=*/false,
156-
/*IsSPI=*/false);
157+
/*IsSPI=*/isSPI);
157158
}
158159

159160
BridgedAvailableAttr

lib/ASTGen/Sources/ASTGen/Availability.swift

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,12 @@ extension ASTGenVisitor {
2323
func generateAvailableAttr(
2424
atLoc: BridgedSourceLoc,
2525
range: BridgedSourceRange,
26+
attrName: SyntaxText,
2627
args: AvailabilityArgumentListSyntax
2728
) -> [BridgedAvailableAttr] {
2829

30+
let isSPI = attrName == "_spi_available"
31+
2932
// Check if this is "shorthand" syntax.
3033
if let firstArg = args.first?.argument {
3134
// We need to check availability macros specified by '-define-availability'.
@@ -40,15 +43,14 @@ extension ASTGenVisitor {
4043
isShorthand = false
4144
}
4245
if isShorthand {
43-
return self.generateAvailableAttrShorthand(atLoc: atLoc, range: range, args: args)
46+
return self.generateAvailableAttrShorthand(atLoc: atLoc, range: range, args: args, isSPI: isSPI)
4447
}
4548
}
4649

4750
// E.g.
4851
// @available(macOS, introduced: 10.12, deprecated: 11.2)
4952
// @available(*, unavailable, message: "out of service")
50-
let attr = self.generateAvailableAttrExtended(atLoc: atLoc, range: range, args: args)
51-
53+
let attr = self.generateAvailableAttrExtended(atLoc: atLoc, range: range, args: args, isSPI: isSPI)
5254
if let attr {
5355
return [attr]
5456
} else {
@@ -66,7 +68,8 @@ extension ASTGenVisitor {
6668
func generateAvailableAttrShorthand(
6769
atLoc: BridgedSourceLoc,
6870
range: BridgedSourceRange,
69-
args: AvailabilityArgumentListSyntax
71+
args: AvailabilityArgumentListSyntax,
72+
isSPI: Bool
7073
) -> [BridgedAvailableAttr] {
7174
let specs = self.generateAvailabilitySpecList(args: args, context: .availableAttr)
7275

@@ -100,7 +103,8 @@ extension ASTGenVisitor {
100103
deprecated: BridgedVersionTuple(),
101104
deprecatedRange: BridgedSourceRange(),
102105
obsoleted: BridgedVersionTuple(),
103-
obsoletedRange: BridgedSourceRange()
106+
obsoletedRange: BridgedSourceRange(),
107+
isSPI: isSPI
104108
)
105109
attr.setIsGroupMember()
106110
if containsWildCard {
@@ -119,7 +123,8 @@ extension ASTGenVisitor {
119123
func generateAvailableAttrExtended(
120124
atLoc: BridgedSourceLoc,
121125
range: BridgedSourceRange,
122-
args: AvailabilityArgumentListSyntax
126+
args: AvailabilityArgumentListSyntax,
127+
isSPI: Bool
123128
) -> BridgedAvailableAttr? {
124129
var args = args[...]
125130

@@ -262,7 +267,8 @@ extension ASTGenVisitor {
262267
deprecated: deprecated?.version.bridged ?? BridgedVersionTuple(),
263268
deprecatedRange: deprecated?.range ?? BridgedSourceRange(),
264269
obsoleted: obsoleted?.version.bridged ?? BridgedVersionTuple(),
265-
obsoletedRange: obsoleted?.range ?? BridgedSourceRange()
270+
obsoletedRange: obsoleted?.range ?? BridgedSourceRange(),
271+
isSPI: isSPI
266272
)
267273
}
268274

lib/ASTGen/Sources/ASTGen/DeclAttrs.swift

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@ extension ASTGenVisitor {
126126
case .allowFeatureSuppression:
127127
return handle(self.generateAllowFeatureSuppressionAttr(attribute: node, attrName: attrName)?.asDeclAttribute)
128128
case .available:
129-
return self.generateAvailableAttr(attribute: node).forEach { handle($0.asDeclAttribute) }
129+
return self.generateAvailableAttr(attribute: node, attrName: attrName).forEach { handle($0.asDeclAttribute) }
130130
case .backDeployed:
131131
return self.generateBackDeployedAttr(attribute: node).forEach { handle($0.asDeclAttribute) }
132132
case .cDecl:
@@ -180,7 +180,7 @@ extension ASTGenVisitor {
180180
case .silGenName:
181181
return handle(self.generateSILGenNameAttr(attribute: node)?.asDeclAttribute)
182182
case .specialize:
183-
return handle(self.generateSpecializeAttr(attribute: node)?.asDeclAttribute)
183+
return handle(self.generateSpecializeAttr(attribute: node, attrName: attrName)?.asDeclAttribute)
184184
case .spiAccessControl:
185185
return handle(self.generateSPIAccessControlAttr(attribute: node)?.asDeclAttribute)
186186
case .storageRestrictions:
@@ -501,7 +501,7 @@ extension ASTGenVisitor {
501501
/// @available(macOS 10.12, iOS 13, *)
502502
/// @available(macOS, introduced: 10.12)
503503
/// ```
504-
func generateAvailableAttr(attribute node: AttributeSyntax) -> [BridgedAvailableAttr] {
504+
func generateAvailableAttr(attribute node: AttributeSyntax, attrName: SyntaxText) -> [BridgedAvailableAttr] {
505505
guard let args = node.arguments else {
506506
self.diagnose(.expectedArgumentsInAttribute(node))
507507
return []
@@ -514,6 +514,7 @@ extension ASTGenVisitor {
514514
return self.generateAvailableAttr(
515515
atLoc: self.generateSourceLoc(node.atSign),
516516
range: self.generateAttrSourceRange(node),
517+
attrName: attrName,
517518
args: args
518519
)
519520
}
@@ -1881,7 +1882,7 @@ extension ASTGenVisitor {
18811882
/// ```
18821883
/// @_specialize(exporeted: true, T == Int)
18831884
/// ```
1884-
func generateSpecializeAttr(attribute node: AttributeSyntax) -> BridgedSpecializeAttr? {
1885+
func generateSpecializeAttr(attribute node: AttributeSyntax, attrName: SyntaxText) -> BridgedSpecializeAttr? {
18851886
guard
18861887
var args = node.arguments?.as(SpecializeAttributeArgumentListSyntax.self)?[...]
18871888
else {
@@ -1912,6 +1913,7 @@ extension ASTGenVisitor {
19121913
start: arg.availabilityArguments.firstToken(viewMode: .all)!,
19131914
end: arg.semicolon
19141915
),
1916+
attrName: attrName,
19151917
args: arg.availabilityArguments
19161918
)
19171919
case .labeledSpecializeArgument(let arg):

test/ASTGen/availability.swift

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,3 +62,8 @@ func testPoundIf() {
6262
// pass
6363
}
6464
}
65+
66+
public class ClassWithMembers {
67+
@_spi_available(macOS 10.15, *)
68+
public func spiFunc() {}
69+
}

0 commit comments

Comments
 (0)