Skip to content

[Distributed] Add ModuleInterface test with generic distributed actor #72180

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 4 commits into from
Mar 9, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 10 additions & 1 deletion lib/AST/DistributedDecl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -309,7 +309,16 @@ Type swift::getAssociatedTypeOfDistributedSystemOfActor(
auto subs = SubstitutionMap::getProtocolSubstitutions(
actorProtocol, actorType->getDeclaredInterfaceType(), actorConformance);

return memberTy.subst(subs)->getReducedType(sig);
memberTy = memberTy.subst(subs);

// If substitution is still not fully resolved, let's see if we can
// find a concrete replacement in the generic signature.
if (memberTy->hasTypeParameter() && sig) {
if (auto concreteTy = sig->getConcreteType(memberTy))
return concreteTy;
}

return memberTy;
}

/******************************************************************************/
Expand Down
67 changes: 63 additions & 4 deletions test/ModuleInterface/distributed-actor.swift
Original file line number Diff line number Diff line change
@@ -1,23 +1,43 @@
// RUN: %empty-directory(%t)
// RUN: %target-swift-emit-module-interface(%t/Library.swiftinterface) %s -module-name Library
// RUN: %target-swift-typecheck-module-from-interface(%t/Library.swiftinterface) -module-name Library
// RUN: split-file %s %t

// RUN: %target-swift-frontend -emit-module -module-name Library \
// RUN: -swift-version 5 -enable-library-evolution \
// RUN: -o %t/Library.swiftmodule \
// RUN: -emit-module-interface-path %t/Library.swiftinterface \
// RUN: %t/Library.swift

/// Verify the interface
// RUN: %FileCheck %s < %t/Library.swiftinterface

/// Verify that we can build from the Library.swiftmodule
// RUN: %target-swift-frontend -typecheck -module-name Client \
// RUN: -swift-version 5 \
// RUN: %t/Client.swift -I%t

/// Verify what we can build from a swiftinterface, when swiftmodule was deleted
// RUN: rm %t/Library.swiftmodule
// RUN: %target-swift-frontend -typecheck -module-name Client \
// RUN: -swift-version 5 \
// RUN: %t/Client.swift -I%t

// REQUIRES: distributed

//--- Library.swift

import Distributed

// CHECK-NOT: #if compiler(>=5.3) && $Actors
// CHECK: @available(macOS 13.0, iOS 16.0, watchOS 9.0, tvOS 16.0, *)
// CHECK-NEXT: distributed public actor DA {
@available(SwiftStdlib 5.7, *)
public distributed actor DA {
// CHECK: @_compilerInitialized nonisolated final public let id: Distributed.LocalTestingActorID
// CHECK: @_compilerInitialized nonisolated final public let id: Distributed.LocalTestingDistributedActorSystem.ActorID
// CHECK: nonisolated final public let actorSystem: Library.DA.ActorSystem
// CHECK: public typealias ActorSystem = Distributed.LocalTestingDistributedActorSystem
public typealias ActorSystem = LocalTestingDistributedActorSystem

// CHECK: public static func resolve(id: Distributed.LocalTestingActorID, using system: Library.DA.ActorSystem) throws -> Library.DA
// CHECK: public static func resolve(id: Distributed.LocalTestingDistributedActorSystem.ActorID, using system: Library.DA.ActorSystem) throws -> Library.DA
// CHECK: public typealias ID = Distributed.LocalTestingDistributedActorSystem.ActorID
// CHECK: public typealias SerializationRequirement = any Swift.Decodable & Swift.Encodable
// CHECK: {{@objc deinit|deinit}}
Expand All @@ -31,6 +51,27 @@ public distributed actor DA {
// CHECK-NEXT: }
}

// CHECK-NOT: #if compiler(>=5.3) && $Actors
// CHECK: @available(macOS 9999, iOS 9999, watchOS 9999, tvOS 9999, *)
// CHECK-NEXT: distributed public actor DAG<ActorSystem> where ActorSystem : Distributed.DistributedActorSystem, ActorSystem.SerializationRequirement == any Swift.Decodable & Swift.Encodable {
@available(SwiftStdlib 6.0, *)
public distributed actor DAG<ActorSystem> where ActorSystem: DistributedActorSystem<any Codable> {
// CHECK: @_compilerInitialized nonisolated final public let id: ActorSystem.ActorID
// CHECK: nonisolated final public let actorSystem: ActorSystem

// CHECK: public static func resolve(id: ActorSystem.ActorID, using system: ActorSystem) throws -> Library.DAG<ActorSystem>
// CHECK: public typealias ID = ActorSystem.ActorID
// CHECK: public typealias SerializationRequirement = any Swift.Decodable & Swift.Encodable
// CHECK: {{@objc deinit|deinit}}
// CHECK: nonisolated public var hashValue: Swift.Int {
// CHECK: get
// CHECK: }
// CHECK: public init(actorSystem system: ActorSystem)
// CHECK: @available(iOS 9999, tvOS 9999, watchOS 9999, macOS 9999, *)
// CHECK: @_semantics("defaultActor") nonisolated final public var unownedExecutor: _Concurrency.UnownedSerialExecutor {
// CHECK: get
// CHECK: }
}

// CHECK-NOT: #if compiler(>=5.3) && $Actors
// CHECK: @available(macOS 13.0, iOS 16.0, watchOS 9.0, tvOS 16.0, *)
Expand All @@ -41,3 +82,21 @@ public distributed actor DA {
// CHECK-NOT: #if compiler(>=5.3) && $Actors
// CHECK: @available(macOS 13.0, iOS 16.0, watchOS 9.0, tvOS 16.0, *)
// CHECK-NEXT:extension Library.DA : Swift.Decodable {}

// CHECK-NOT: #if compiler(>=5.3) && $Actors
// CHECK: @available(macOS 9999, iOS 9999, watchOS 9999, tvOS 9999, *)
// CHECK-NEXT: extension Library.DAG : Distributed.DistributedActor {}

//--- Client.swift

import Distributed
import Library

@available(SwiftStdlib 6.0, *)
func main() {
let da: DA? = nil
_ = da

let dag: DAG<LocalTestingDistributedActorSystem>? = nil
_ = dag
}