Skip to content

Commit d70fbad

Browse files
authored
Simplify generated code (#2131)
Motivation: A number of things have changed since the generated code was initially designed, which means it can be simplified and improved. Modifications: - As services are namespaced within a namespace-service enum (rather than within a service enum in a namespace enum), they no longer need to be grouped by namespace. - As deployment targets must be set in the package manifest, the generated code no longer needs to be annotated with availability guards so these have been removed. Result: Simpler code generation, better generated code.
1 parent 8bc2a25 commit d70fbad

14 files changed

+75
-171
lines changed

Sources/GRPCCodeGen/Internal/Renderer/TextBasedRenderer.swift

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1134,8 +1134,9 @@ struct TextBasedRenderer: RendererProtocol {
11341134
/// Renders the specified code block.
11351135
func renderCodeBlock(_ description: CodeBlock) {
11361136
if let comment = description.comment { renderComment(comment) }
1137-
let item = description.item
1138-
renderCodeBlockItem(item)
1137+
if let item = description.item {
1138+
renderCodeBlockItem(item)
1139+
}
11391140
}
11401141

11411142
/// Renders the specified code blocks.

Sources/GRPCCodeGen/Internal/StructuredSwift+Server.swift

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -97,16 +97,13 @@ extension ExtensionDescription {
9797
return ExtensionDescription(
9898
onType: extensionName,
9999
declarations: [
100-
.guarded(
101-
.grpc,
102-
.function(
103-
.registerMethods(
104-
accessLevel: accessLevel,
105-
serviceNamespace: serviceNamespace,
106-
methods: methods,
107-
serializer: serializer,
108-
deserializer: deserializer
109-
)
100+
.function(
101+
.registerMethods(
102+
accessLevel: accessLevel,
103+
serviceNamespace: serviceNamespace,
104+
methods: methods,
105+
serializer: serializer,
106+
deserializer: deserializer
110107
)
111108
)
112109
]

Sources/GRPCCodeGen/Internal/StructuredSwift+ServiceMetadata.swift

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -288,13 +288,10 @@ extension EnumDescription {
288288
typealiasNames.append("Client")
289289
}
290290
let typealiases: [Declaration] = typealiasNames.map { alias in
291-
.guarded(
292-
.grpc,
293-
.typealias(
294-
accessModifier: accessModifier,
295-
name: alias,
296-
existingType: .member(name + "_" + alias)
297-
)
291+
.typealias(
292+
accessModifier: accessModifier,
293+
name: alias,
294+
existingType: .member(name + "_" + alias)
298295
)
299296
}
300297
description.members.append(contentsOf: typealiases)

Sources/GRPCCodeGen/Internal/StructuredSwift+Types.swift

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -14,18 +14,6 @@
1414
* limitations under the License.
1515
*/
1616

17-
extension AvailabilityDescription {
18-
package static let grpc = AvailabilityDescription(
19-
osVersions: [
20-
OSVersion(os: .macOS, version: "15.0"),
21-
OSVersion(os: .iOS, version: "18.0"),
22-
OSVersion(os: .watchOS, version: "11.0"),
23-
OSVersion(os: .tvOS, version: "18.0"),
24-
OSVersion(os: .visionOS, version: "2.0"),
25-
]
26-
)
27-
}
28-
2917
extension ExistingTypeDescription {
3018
fileprivate static func grpcCore(_ typeName: String) -> Self {
3119
return .member(["GRPCCore", typeName])

Sources/GRPCCodeGen/Internal/StructuredSwiftRepresentation.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1207,7 +1207,7 @@ struct CodeBlock: Equatable, Codable, Sendable {
12071207
var comment: Comment?
12081208

12091209
/// The code block item that appears below the comment.
1210-
var item: CodeBlockItem
1210+
var item: CodeBlockItem?
12111211
}
12121212

12131213
/// A description of a Swift file.

Sources/GRPCCodeGen/Internal/Translator/ClientCodeTranslator.swift

Lines changed: 4 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -79,22 +79,6 @@ struct ClientCodeTranslator {
7979
init() {}
8080

8181
func translate(
82-
accessModifier: AccessModifier,
83-
services: [ServiceDescriptor],
84-
serializer: (String) -> String,
85-
deserializer: (String) -> String
86-
) -> [CodeBlock] {
87-
services.flatMap { service in
88-
self.translate(
89-
accessModifier: accessModifier,
90-
service: service,
91-
serializer: serializer,
92-
deserializer: deserializer
93-
)
94-
}
95-
}
96-
97-
private func translate(
9882
accessModifier: AccessModifier,
9983
service: ServiceDescriptor,
10084
serializer: (String) -> String,
@@ -114,7 +98,7 @@ struct ClientCodeTranslator {
11498
blocks.append(
11599
CodeBlock(
116100
comment: .preFormatted(service.documentation),
117-
item: .declaration(.guarded(.grpc, .protocol(clientProtocol)))
101+
item: .declaration(.protocol(clientProtocol))
118102
)
119103
)
120104

@@ -126,7 +110,7 @@ struct ClientCodeTranslator {
126110
deserializer: deserializer
127111
)
128112
blocks.append(
129-
CodeBlock(item: .declaration(.guarded(.grpc, .extension(extensionWithDefaults))))
113+
CodeBlock(item: .declaration(.extension(extensionWithDefaults)))
130114
)
131115

132116
let extensionWithExplodedAPI: ExtensionDescription = .explodedClientMethods(
@@ -135,7 +119,7 @@ struct ClientCodeTranslator {
135119
methods: service.methods
136120
)
137121
blocks.append(
138-
CodeBlock(item: .declaration(.guarded(.grpc, .extension(extensionWithExplodedAPI))))
122+
CodeBlock(item: .declaration(.extension(extensionWithExplodedAPI)))
139123
)
140124

141125
let clientStruct: StructDescription = .client(
@@ -148,7 +132,7 @@ struct ClientCodeTranslator {
148132
blocks.append(
149133
CodeBlock(
150134
comment: .preFormatted(service.documentation),
151-
item: .declaration(.guarded(.grpc, .struct(clientStruct)))
135+
item: .declaration(.struct(clientStruct))
152136
)
153137
)
154138

Sources/GRPCCodeGen/Internal/Translator/IDLToStructuredSwiftTranslator.swift

Lines changed: 38 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -28,34 +28,50 @@ struct IDLToStructuredSwiftTranslator: Translator {
2828
try self.validateInput(codeGenerationRequest)
2929
let accessModifier = AccessModifier(accessLevel)
3030

31+
var codeBlocks: [CodeBlock] = []
3132
let metadataTranslator = MetadataTranslator()
32-
var codeBlocks = metadataTranslator.translate(
33-
accessModifier: accessModifier,
34-
services: codeGenerationRequest.services,
35-
client: client,
36-
server: server
37-
)
33+
let serverTranslator = ServerCodeTranslator()
34+
let clientTranslator = ClientCodeTranslator()
3835

39-
if server {
40-
let translator = ServerCodeTranslator()
41-
let blocks = translator.translate(
42-
accessModifier: accessModifier,
43-
services: codeGenerationRequest.services,
44-
serializer: codeGenerationRequest.lookupSerializer,
45-
deserializer: codeGenerationRequest.lookupDeserializer
36+
for service in codeGenerationRequest.services {
37+
codeBlocks.append(
38+
CodeBlock(comment: .mark("\(service.fullyQualifiedName)", sectionBreak: true))
4639
)
47-
codeBlocks.append(contentsOf: blocks)
48-
}
4940

50-
if client {
51-
let translator = ClientCodeTranslator()
52-
let blocks = translator.translate(
41+
let metadata = metadataTranslator.translate(
5342
accessModifier: accessModifier,
54-
services: codeGenerationRequest.services,
55-
serializer: codeGenerationRequest.lookupSerializer,
56-
deserializer: codeGenerationRequest.lookupDeserializer
43+
service: service,
44+
client: client,
45+
server: server
5746
)
58-
codeBlocks.append(contentsOf: blocks)
47+
codeBlocks.append(contentsOf: metadata)
48+
49+
if server {
50+
codeBlocks.append(
51+
CodeBlock(comment: .mark("\(service.fullyQualifiedName) (server)", sectionBreak: false))
52+
)
53+
54+
let blocks = serverTranslator.translate(
55+
accessModifier: accessModifier,
56+
service: service,
57+
serializer: codeGenerationRequest.lookupSerializer,
58+
deserializer: codeGenerationRequest.lookupDeserializer
59+
)
60+
codeBlocks.append(contentsOf: blocks)
61+
}
62+
63+
if client {
64+
codeBlocks.append(
65+
CodeBlock(comment: .mark("\(service.fullyQualifiedName) (client)", sectionBreak: false))
66+
)
67+
let blocks = clientTranslator.translate(
68+
accessModifier: accessModifier,
69+
service: service,
70+
serializer: codeGenerationRequest.lookupSerializer,
71+
deserializer: codeGenerationRequest.lookupDeserializer
72+
)
73+
codeBlocks.append(contentsOf: blocks)
74+
}
5975
}
6076

6177
let fileDescription = FileDescription(

Sources/GRPCCodeGen/Internal/Translator/MetadataTranslator.swift

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -18,22 +18,6 @@ struct MetadataTranslator {
1818
init() {}
1919

2020
func translate(
21-
accessModifier: AccessModifier,
22-
services: [ServiceDescriptor],
23-
client: Bool,
24-
server: Bool
25-
) -> [CodeBlock] {
26-
return services.flatMap { service in
27-
self.translate(
28-
accessModifier: accessModifier,
29-
service: service,
30-
client: client,
31-
server: server
32-
)
33-
}
34-
}
35-
36-
private func translate(
3721
accessModifier: AccessModifier,
3822
service: ServiceDescriptor,
3923
client: Bool,

Sources/GRPCCodeGen/Internal/Translator/ServerCodeTranslator.swift

Lines changed: 4 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -61,22 +61,6 @@ struct ServerCodeTranslator {
6161
init() {}
6262

6363
func translate(
64-
accessModifier: AccessModifier,
65-
services: [ServiceDescriptor],
66-
serializer: (String) -> String,
67-
deserializer: (String) -> String
68-
) -> [CodeBlock] {
69-
return services.flatMap { service in
70-
self.translate(
71-
accessModifier: accessModifier,
72-
service: service,
73-
serializer: serializer,
74-
deserializer: deserializer
75-
)
76-
}
77-
}
78-
79-
private func translate(
8064
accessModifier: AccessModifier,
8165
service: ServiceDescriptor,
8266
serializer: (String) -> String,
@@ -106,7 +90,7 @@ struct ServerCodeTranslator {
10690
blocks.append(
10791
CodeBlock(
10892
comment: .preFormatted(service.documentation),
109-
item: .declaration(.guarded(.grpc, .protocol(streamingServiceProtocol)))
93+
item: .declaration(.protocol(streamingServiceProtocol))
11094
)
11195
)
11296

@@ -122,7 +106,7 @@ struct ServerCodeTranslator {
122106
blocks.append(
123107
CodeBlock(
124108
comment: .doc("Conformance to `GRPCCore.RegistrableRPCService`."),
125-
item: .declaration(.guarded(.grpc, .extension(registerExtension)))
109+
item: .declaration(.extension(registerExtension))
126110
)
127111
)
128112

@@ -136,7 +120,7 @@ struct ServerCodeTranslator {
136120
blocks.append(
137121
CodeBlock(
138122
comment: .preFormatted(service.documentation),
139-
item: .declaration(.guarded(.grpc, .protocol(serviceProtocol)))
123+
item: .declaration(.protocol(serviceProtocol))
140124
)
141125
)
142126

@@ -150,7 +134,7 @@ struct ServerCodeTranslator {
150134
blocks.append(
151135
CodeBlock(
152136
comment: .doc("Partial conformance to `\(streamingServiceProtocolName)`."),
153-
item: .declaration(.guarded(.grpc, .extension(streamingServiceDefaultImplExtension)))
137+
item: .declaration(.extension(streamingServiceDefaultImplExtension))
154138
)
155139
)
156140

Tests/GRPCCodeGenTests/Internal/StructuredSwift+MetadataTests.swift

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -21,18 +21,6 @@ import Testing
2121
extension StructuedSwiftTests {
2222
@Suite("Metadata")
2323
struct Metadata {
24-
@Test("@available(...)")
25-
func grpcAvailability() async throws {
26-
let availability: AvailabilityDescription = .grpc
27-
let structDecl = StructDescription(name: "Ignored")
28-
let expected = """
29-
@available(macOS 15.0, iOS 18.0, watchOS 11.0, tvOS 18.0, visionOS 2.0, *)
30-
struct Ignored {}
31-
"""
32-
33-
#expect(render(.guarded(availability, .struct(structDecl))) == expected)
34-
}
35-
3624
@Test("typealias Input = <Name>", arguments: AccessModifier.allCases)
3725
func methodInputTypealias(access: AccessModifier) {
3826
let decl: TypealiasDescription = .methodInput(accessModifier: access, name: "Foo")
@@ -263,9 +251,7 @@ extension StructuedSwiftTests {
263251

264252
if config.server {
265253
expected += """
266-
@available(macOS 15.0, iOS 18.0, watchOS 11.0, tvOS 18.0, visionOS 2.0, *)
267254
\(access) typealias StreamingServiceProtocol = Foo_StreamingServiceProtocol
268-
@available(macOS 15.0, iOS 18.0, watchOS 11.0, tvOS 18.0, visionOS 2.0, *)
269255
\(access) typealias ServiceProtocol = Foo_ServiceProtocol
270256
"""
271257
}
@@ -276,9 +262,7 @@ extension StructuedSwiftTests {
276262
}
277263

278264
expected += """
279-
@available(macOS 15.0, iOS 18.0, watchOS 11.0, tvOS 18.0, visionOS 2.0, *)
280265
\(access) typealias ClientProtocol = Foo_ClientProtocol
281-
@available(macOS 15.0, iOS 18.0, watchOS 11.0, tvOS 18.0, visionOS 2.0, *)
282266
\(access) typealias Client = Foo_Client
283267
"""
284268
}

0 commit comments

Comments
 (0)