diff --git a/Sources/GRPCCodeGen/Internal/StructuredSwift+ServiceMetadata.swift b/Sources/GRPCCodeGen/Internal/StructuredSwift+ServiceMetadata.swift index 8ed3cc88..7b8804fb 100644 --- a/Sources/GRPCCodeGen/Internal/StructuredSwift+ServiceMetadata.swift +++ b/Sources/GRPCCodeGen/Internal/StructuredSwift+ServiceMetadata.swift @@ -188,7 +188,7 @@ extension VariableDescription { @available(gRPCSwift 2.0, *) extension EnumDescription { /// ``` - /// enum { + /// enum : Sendable { /// typealias Input = /// typealias Output = /// static let descriptor = GRPCCore.MethodDescriptor( @@ -209,6 +209,7 @@ extension EnumDescription { return EnumDescription( accessModifier: accessModifier, name: name, + conformances: ["Sendable"], members: [ .commentable( .doc("Request type for \"\(literalMethod)\"."), @@ -235,7 +236,7 @@ extension EnumDescription { /// ``` /// enum Method { - /// enum { + /// enum : Sendable { /// typealias Input = /// typealias Output = /// static let descriptor = GRPCCore.MethodDescriptor( @@ -256,7 +257,11 @@ extension EnumDescription { methods: [MethodDescriptor], namer: Namer = Namer() ) -> EnumDescription { - var description = EnumDescription(accessModifier: accessModifier, name: "Method") + var description = EnumDescription( + accessModifier: accessModifier, + name: "Method", + conformances: ["Sendable"] + ) // Add a namespace for each method. let methodNamespaces: [Declaration] = methods.map { method in @@ -294,9 +299,9 @@ extension EnumDescription { } /// ``` - /// enum { + /// enum : Sendable { /// static let descriptor = GRPCCore.ServiceDescriptor. - /// enum Method { + /// enum Method: Sendable { /// ... /// } /// } @@ -308,7 +313,11 @@ extension EnumDescription { methods: [MethodDescriptor], namer: Namer = Namer() ) -> EnumDescription { - var description = EnumDescription(accessModifier: accessModifier, name: name) + var description = EnumDescription( + accessModifier: accessModifier, + name: name, + conformances: ["Sendable"] + ) // static let descriptor = GRPCCore.ServiceDescriptor(fullyQualifiedService: "...") let descriptor = VariableDescription.serviceDescriptor( @@ -344,7 +353,7 @@ extension EnumDescription { @available(gRPCSwift 2.0, *) extension [CodeBlock] { /// ``` - /// enum { + /// enum : Sendable { /// ... /// } /// diff --git a/Tests/GRPCCodeGenTests/Internal/StructuredSwift+MetadataTests.swift b/Tests/GRPCCodeGenTests/Internal/StructuredSwift+MetadataTests.swift index 1f297e66..f5636244 100644 --- a/Tests/GRPCCodeGenTests/Internal/StructuredSwift+MetadataTests.swift +++ b/Tests/GRPCCodeGenTests/Internal/StructuredSwift+MetadataTests.swift @@ -114,7 +114,7 @@ extension StructuredSwiftTests { #expect(render(.variable(decl)) == expected) } - @Test("enum { ... }", arguments: AccessModifier.allCases) + @Test("enum : Sendable { ... }", arguments: AccessModifier.allCases) @available(gRPCSwift 2.0, *) func methodNamespaceEnum(access: AccessModifier) { let decl: EnumDescription = .methodNamespace( @@ -127,7 +127,7 @@ extension StructuredSwiftTests { ) let expected = """ - \(access) enum Foo { + \(access) enum Foo: Sendable { /// Request type for "Foo". \(access) typealias Input = FooInput /// Response type for "Foo". @@ -142,7 +142,7 @@ extension StructuredSwiftTests { #expect(render(.enum(decl)) == expected) } - @Test("enum Method { ... }", arguments: AccessModifier.allCases) + @Test("enum Method: Sendable { ... }", arguments: AccessModifier.allCases) @available(gRPCSwift 2.0, *) func methodsNamespaceEnum(access: AccessModifier) { let decl: EnumDescription = .methodsNamespace( @@ -161,9 +161,9 @@ extension StructuredSwiftTests { ) let expected = """ - \(access) enum Method { + \(access) enum Method: Sendable { /// Namespace for "Foo" metadata. - \(access) enum Foo { + \(access) enum Foo: Sendable { /// Request type for "Foo". \(access) typealias Input = FooInput /// Response type for "Foo". @@ -183,7 +183,7 @@ extension StructuredSwiftTests { #expect(render(.enum(decl)) == expected) } - @Test("enum Method { ... } (no methods)", arguments: AccessModifier.allCases) + @Test("enum Method: Sendable { ... } (no methods)", arguments: AccessModifier.allCases) @available(gRPCSwift 2.0, *) func methodsNamespaceEnumNoMethods(access: AccessModifier) { let decl: EnumDescription = .methodsNamespace( @@ -193,7 +193,7 @@ extension StructuredSwiftTests { ) let expected = """ - \(access) enum Method { + \(access) enum Method: Sendable { /// Descriptors for all methods in the "bar.Bar" service. \(access) static let descriptors: [GRPCCore.MethodDescriptor] = [] } @@ -201,7 +201,7 @@ extension StructuredSwiftTests { #expect(render(.enum(decl)) == expected) } - @Test("enum { ... }", arguments: AccessModifier.allCases) + @Test("enum : Sendable { ... }", arguments: AccessModifier.allCases) @available(gRPCSwift 2.0, *) func serviceNamespaceEnum(access: AccessModifier) { let decl: EnumDescription = .serviceNamespace( @@ -221,13 +221,13 @@ extension StructuredSwiftTests { ) let expected = """ - \(access) enum Foo { + \(access) enum Foo: Sendable { /// Service descriptor for the "Foo" service. \(access) static let descriptor = GRPCCore.ServiceDescriptor(fullyQualifiedService: "Foo") /// Namespace for method metadata. - \(access) enum Method { + \(access) enum Method: Sendable { /// Namespace for "Bar" metadata. - \(access) enum Bar { + \(access) enum Bar: Sendable { /// Request type for "Bar". \(access) typealias Input = BarInput /// Response type for "Bar". @@ -248,7 +248,7 @@ extension StructuredSwiftTests { #expect(render(.enum(decl)) == expected) } - @Test("enum { ... } (no methods)", arguments: AccessModifier.allCases) + @Test("enum : Sendable { ... } (no methods)", arguments: AccessModifier.allCases) @available(gRPCSwift 2.0, *) func serviceNamespaceEnumNoMethods(access: AccessModifier) { let decl: EnumDescription = .serviceNamespace( @@ -259,11 +259,11 @@ extension StructuredSwiftTests { ) let expected = """ - \(access) enum Foo { + \(access) enum Foo: Sendable { /// Service descriptor for the "Foo" service. \(access) static let descriptor = GRPCCore.ServiceDescriptor(fullyQualifiedService: "Foo") /// Namespace for method metadata. - \(access) enum Method { + \(access) enum Method: Sendable { /// Descriptors for all methods in the "Foo" service. \(access) static let descriptors: [GRPCCore.MethodDescriptor] = [] } diff --git a/Tests/GRPCCodeGenTests/Internal/Translator/IDLToStructuredSwiftTranslatorSnippetBasedTests.swift b/Tests/GRPCCodeGenTests/Internal/Translator/IDLToStructuredSwiftTranslatorSnippetBasedTests.swift index 33f4b0d8..4e179aed 100644 --- a/Tests/GRPCCodeGenTests/Internal/Translator/IDLToStructuredSwiftTranslatorSnippetBasedTests.swift +++ b/Tests/GRPCCodeGenTests/Internal/Translator/IDLToStructuredSwiftTranslatorSnippetBasedTests.swift @@ -58,11 +58,11 @@ final class IDLToStructuredSwiftTranslatorSnippetBasedTests: XCTestCase { /// Namespace containing generated types for the "namespaceA.ServiceA" service. @available(macOS 15.0, iOS 18.0, watchOS 11.0, tvOS 18.0, visionOS 2.0, *) - public enum NamespaceA_ServiceA { + public enum NamespaceA_ServiceA: Sendable { /// Service descriptor for the "namespaceA.ServiceA" service. public static let descriptor = GRPCCore.ServiceDescriptor(fullyQualifiedService: "namespaceA.ServiceA") /// Namespace for method metadata. - public enum Method { + public enum Method: Sendable { /// Descriptors for all methods in the "namespaceA.ServiceA" service. public static let descriptors: [GRPCCore.MethodDescriptor] = [] } diff --git a/Tests/GRPCCodeGenTests/Internal/Translator/TypealiasTranslatorSnippetBasedTests.swift b/Tests/GRPCCodeGenTests/Internal/Translator/TypealiasTranslatorSnippetBasedTests.swift index 59250a2e..e6db0f3a 100644 --- a/Tests/GRPCCodeGenTests/Internal/Translator/TypealiasTranslatorSnippetBasedTests.swift +++ b/Tests/GRPCCodeGenTests/Internal/Translator/TypealiasTranslatorSnippetBasedTests.swift @@ -44,13 +44,13 @@ struct TypealiasTranslatorSnippetBasedTests { let expectedSwift = """ /// Namespace containing generated types for the "namespaceA.ServiceA" service. @available(macOS 15.0, iOS 18.0, watchOS 11.0, tvOS 18.0, visionOS 2.0, *) - public enum NamespaceA_ServiceA { + public enum NamespaceA_ServiceA: Sendable { /// Service descriptor for the "namespaceA.ServiceA" service. public static let descriptor = GRPCCore.ServiceDescriptor(fullyQualifiedService: "namespaceA.ServiceA") /// Namespace for method metadata. - public enum Method { + public enum Method: Sendable { /// Namespace for "MethodA" metadata. - public enum MethodA { + public enum MethodA: Sendable { /// Request type for "MethodA". public typealias Input = NamespaceA_ServiceARequest /// Response type for "MethodA".