Skip to content

Commit 208c7ae

Browse files
committed
[Distributed] Make sure we copy @available and spi for resolvable extensions
Relates to rdar://162800185
1 parent 454160b commit 208c7ae

File tree

3 files changed

+22
-4
lines changed

3 files changed

+22
-4
lines changed

lib/Macros/Sources/SwiftMacros/DistributedResolvableMacro.swift

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,12 @@ public struct DistributedResolvableMacro: ExtensionMacro, PeerMacro {
2626

2727
extension DistributedResolvableMacro {
2828

29+
static let attributesToCopy: [String] = [
30+
"available",
31+
"_spi",
32+
"_spi_available",
33+
]
34+
2935
/// Introduce the `extension MyDistributedActor` which contains default
3036
/// implementations of the protocol's requirements.
3137
public static func expansion(
@@ -46,7 +52,9 @@ extension DistributedResolvableMacro {
4652
}
4753

4854
let attributes = proto.attributes.filter { attr in
49-
attr.as(AttributeSyntax.self)?.attributeName.trimmed.description == "_spi"
55+
Self.attributesToCopy.contains(
56+
attr.as(AttributeSyntax.self)?.attributeName.trimmed.description ?? ""
57+
)
5058
}
5159
let accessModifiers = proto.accessControlModifiers
5260

@@ -67,7 +75,7 @@ extension DistributedResolvableMacro {
6775

6876
let extensionDecl: DeclSyntax =
6977
"""
70-
\(raw: attributes.map({$0.description}).joined(separator: "\n"))
78+
\(attributes)
7179
extension \(proto.name.trimmed) where Self: Distributed._DistributedActorStub {
7280
\(raw: requirementStubs)
7381
}
@@ -160,7 +168,7 @@ extension DistributedResolvableMacro {
160168
guard let ident = attr.attributeName.as(IdentifierTypeSyntax.self) else {
161169
return false
162170
}
163-
return ident.name.text == "_spi"
171+
return Self.attributesToCopy.contains(ident.name.text)
164172
}
165173
let accessModifiers = proto.accessControlModifiers
166174

test/Distributed/Macros/distributed_macro_expansion_DistributedProtocol_availability.swift

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import Distributed
1313

1414
@Resolvable
15+
@available(iOS 666, macOS 777, tvOS 888, visionOS 999, *)
1516
public protocol Greeter: DistributedActor where ActorSystem: DistributedActorSystem<any Codable> {
1617
@available(iOS 6666, macOS 7777, tvOS 8888, visionOS 9999, *)
1718
distributed func greet(name: String) -> String
@@ -22,12 +23,14 @@ public protocol Greeter: DistributedActor where ActorSystem: DistributedActorSys
2223

2324
// @Resolvable ->
2425

26+
// CHECK: @available(iOS 666, macOS 777, tvOS 888, visionOS 999, *)
2527
// CHECK: public distributed actor $Greeter<ActorSystem>: Greeter,
2628
// CHECK: Distributed._DistributedActorStub
2729
// CHECK: where ActorSystem: DistributedActorSystem<any Codable>
2830
// CHECK: {
2931
// CHECK: }
3032

33+
// CHECK: @available(iOS 666, macOS 777, tvOS 888, visionOS 999, *)
3134
// CHECK: extension Greeter where Self: Distributed._DistributedActorStub {
3235
// CHECK: @available(iOS 6666, macOS 7777, tvOS 8888, visionOS 9999, *)
3336
// CHECK: public

test/Distributed/Macros/distributed_macro_expansion_DistributedProtocol_spi.swift

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,27 +8,31 @@
88
// RUN: %empty-directory(%t-scratch)
99

1010
// RUN: %target-swift-frontend-emit-module -emit-module-path %t/FakeDistributedActorSystems.swiftmodule -module-name FakeDistributedActorSystems -target %target-swift-6.0-abi-triple %S/../Inputs/FakeDistributedActorSystems.swift
11-
// RUN: %target-swift-frontend -typecheck -verify -target %target-swift-6.0-abi-triple -plugin-path %swift-plugin-dir -parse-as-library -I %t -dump-macro-expansions %s -dump-macro-expansions 2>&1 | %FileCheck %s --dump-input=always
11+
// RUN: %target-swift-frontend -Onone -typecheck -verify -target %target-swift-6.0-abi-triple -plugin-path %swift-plugin-dir -parse-as-library -I %t -dump-macro-expansions %s -dump-macro-expansions 2>&1 | %FileCheck %s --dump-input=always
12+
// RUN: %target-swift-frontend -O -typecheck -verify -target %target-swift-6.0-abi-triple -plugin-path %swift-plugin-dir -parse-as-library -I %t -dump-macro-expansions %s -dump-macro-expansions 2>&1 | %FileCheck %s --dump-input=always
1213

1314
import Distributed
1415
import FakeDistributedActorSystems
1516

1617
@Resolvable
1718
@_spi(CoolFeatures)
19+
@available(SwiftStdlib 6.0, *)
1820
public protocol Greeter: DistributedActor where ActorSystem: DistributedActorSystem<any Codable> {
1921
distributed func greet(name: String) -> String
2022
}
2123

2224
// @Resolvable ->
2325

2426
// CHECK: @_spi(CoolFeatures)
27+
// CHECK: @available(SwiftStdlib 6.0, *)
2528
// CHECK: distributed actor $Greeter<ActorSystem>: Greeter,
2629
// CHECK-NEXT: Distributed._DistributedActorStub
2730
// CHECK-NEXT: where ActorSystem: DistributedActorSystem<any Codable>
2831
// CHECK-NEXT: {
2932
// CHECK: }
3033

3134
// CHECK: @_spi(CoolFeatures)
35+
// CHECK: @available(SwiftStdlib 6.0, *)
3236
// CHECK: extension Greeter where Self: Distributed._DistributedActorStub {
3337
// CHECK: distributed func greet(name: String) -> String {
3438
// CHECK-NEXT: if #available(macOS 15.0, iOS 18.0, watchOS 11.0, tvOS 18.0, visionOS 2.0, *) {
@@ -41,20 +45,23 @@ public protocol Greeter: DistributedActor where ActorSystem: DistributedActorSys
4145

4246
@_spi(DistributedSPIForTesting)
4347
@Resolvable
48+
@available(SwiftStdlib 6.0, *)
4449
public protocol GreeterWithSPISystem: DistributedActor where ActorSystem == FakeActorSystemWithSPI {
4550
distributed func greet(name: String) -> String
4651
}
4752

4853
// @Resolvable ->
4954

5055
// CHECK: @_spi(DistributedSPIForTesting)
56+
// CHECK: @available(SwiftStdlib 6.0, *)
5157
// CHECK: public distributed actor $GreeterWithSPISystem: GreeterWithSPISystem,
5258
// CHECK-NEXT: Distributed._DistributedActorStub
5359
// CHECK-NEXT: {
5460
// CHECK: public typealias ActorSystem = FakeActorSystemWithSPI
5561
// CHECK-NEXT: }
5662

5763
// CHECK: @_spi(DistributedSPIForTesting)
64+
// CHECK: @available(SwiftStdlib 6.0, *)
5865
// CHECK: extension GreeterWithSPISystem where Self: Distributed._DistributedActorStub {
5966
// CHECK: public distributed func greet(name: String) -> String {
6067
// CHECK-NEXT: if #available(macOS 15.0, iOS 18.0, watchOS 11.0, tvOS 18.0, visionOS 2.0, *) {

0 commit comments

Comments
 (0)