Skip to content

Commit daa008e

Browse files
[ProtobufCodeGen] Use the generated input and output type names (#1792)
Motivation: protoc-gen-swift generates message type names that are different from the ones in the file descriptors. The CodeGenerationRequest object should contain the generated names for the ProtobufCodeGen. Modifications: - the parser uses a SwiftProtobufNamer to get the generated type names and adds them in the CodeGenerationRequest objects - propagated the change and modified tests accordingly Result: The input and output type names will be the generated ones and the generated code will compile. --------- Co-authored-by: George Barnett <[email protected]>
1 parent 0a7f75f commit daa008e

File tree

5 files changed

+66
-30
lines changed

5 files changed

+66
-30
lines changed

Sources/GRPCProtobufCodeGen/ProtobufCodeGenParser.swift

Lines changed: 34 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,19 @@ import struct GRPCCodeGen.CodeGenerationRequest
2222

2323
/// Parses a ``FileDescriptor`` object into a ``CodeGenerationRequest`` object.
2424
internal struct ProtobufCodeGenParser {
25-
internal init() {}
26-
internal func parse(input: FileDescriptor) throws -> CodeGenerationRequest {
27-
var header = input.header
25+
let input: FileDescriptor
26+
let namer: SwiftProtobufNamer
27+
28+
internal init(input: FileDescriptor, protoFileModuleMappings: ProtoFileToModuleMappings) {
29+
self.input = input
30+
self.namer = SwiftProtobufNamer(
31+
currentFile: input,
32+
protoFileToModuleMappings: protoFileModuleMappings
33+
)
34+
}
35+
36+
internal func parse() throws -> CodeGenerationRequest {
37+
var header = self.input.header
2838
// Ensuring there is a blank line after the header.
2939
if !header.isEmpty && !header.hasSuffix("\n\n") {
3040
header.append("\n")
@@ -34,13 +44,13 @@ internal struct ProtobufCodeGenParser {
3444
// swift-format-ignore-file
3545
//
3646
// Generated by the gRPC Swift generator plugin for the protocol buffer compiler.
37-
// Source: \(input.name)
47+
// Source: \(self.input.name)
3848
//
3949
// For information on using the generated types, please see the documentation:
4050
// https://github.com/grpc/grpc-swift
4151
4252
"""
43-
var dependencies = input.dependencies.map {
53+
var dependencies = self.input.dependencies.map {
4454
CodeGenerationRequest.Dependency(module: $0.name)
4555
}
4656
dependencies.append(CodeGenerationRequest.Dependency(module: "GRPCProtobuf"))
@@ -50,12 +60,16 @@ internal struct ProtobufCodeGenParser {
5060
let lookupDeserializer: (String) -> String = { messageType in
5161
"ProtobufDeserializer<\(messageType)>()"
5262
}
53-
let services = input.services.map {
54-
CodeGenerationRequest.ServiceDescriptor(descriptor: $0, package: input.package)
63+
let services = self.input.services.map {
64+
CodeGenerationRequest.ServiceDescriptor(
65+
descriptor: $0,
66+
package: input.package,
67+
protobufNamer: self.namer
68+
)
5569
}
5670

5771
return CodeGenerationRequest(
58-
fileName: input.name,
72+
fileName: self.input.name,
5973
leadingTrivia: header + leadingTrivia,
6074
dependencies: dependencies,
6175
services: services,
@@ -66,9 +80,16 @@ internal struct ProtobufCodeGenParser {
6680
}
6781

6882
extension CodeGenerationRequest.ServiceDescriptor {
69-
fileprivate init(descriptor: ServiceDescriptor, package: String) {
83+
fileprivate init(
84+
descriptor: ServiceDescriptor,
85+
package: String,
86+
protobufNamer: SwiftProtobufNamer
87+
) {
7088
let methods = descriptor.methods.map {
71-
CodeGenerationRequest.ServiceDescriptor.MethodDescriptor(descriptor: $0)
89+
CodeGenerationRequest.ServiceDescriptor.MethodDescriptor(
90+
descriptor: $0,
91+
protobufNamer: protobufNamer
92+
)
7293
}
7394
let name = CodeGenerationRequest.Name(
7495
base: descriptor.name,
@@ -86,7 +107,7 @@ extension CodeGenerationRequest.ServiceDescriptor {
86107
}
87108

88109
extension CodeGenerationRequest.ServiceDescriptor.MethodDescriptor {
89-
fileprivate init(descriptor: MethodDescriptor) {
110+
fileprivate init(descriptor: MethodDescriptor, protobufNamer: SwiftProtobufNamer) {
90111
let name = CodeGenerationRequest.Name(
91112
base: descriptor.name,
92113
generatedUpperCase: NamingUtils.toUpperCamelCase(descriptor.name),
@@ -98,8 +119,8 @@ extension CodeGenerationRequest.ServiceDescriptor.MethodDescriptor {
98119
name: name,
99120
isInputStreaming: descriptor.clientStreaming,
100121
isOutputStreaming: descriptor.serverStreaming,
101-
inputType: descriptor.inputType.name,
102-
outputType: descriptor.outputType.name
122+
inputType: protobufNamer.fullName(message: descriptor.inputType),
123+
outputType: protobufNamer.fullName(message: descriptor.outputType)
103124
)
104125
}
105126
}

Sources/GRPCProtobufCodeGen/ProtobufCodeGenerator.swift

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,15 +20,23 @@ import SwiftProtobufPluginLibrary
2020
public struct ProtobufCodeGenerator {
2121
internal var configuration: SourceGenerator.Configuration
2222

23-
public init(configuration: SourceGenerator.Configuration) {
23+
public init(
24+
configuration: SourceGenerator.Configuration
25+
) {
2426
self.configuration = configuration
2527
}
2628

27-
public func generateCode(from fileDescriptor: FileDescriptor) throws -> String {
28-
let parser = ProtobufCodeGenParser()
29+
public func generateCode(
30+
from fileDescriptor: FileDescriptor,
31+
protoFileModuleMappings: ProtoFileToModuleMappings
32+
) throws -> String {
33+
let parser = ProtobufCodeGenParser(
34+
input: fileDescriptor,
35+
protoFileModuleMappings: protoFileModuleMappings
36+
)
2937
let sourceGenerator = SourceGenerator(configuration: self.configuration)
3038

31-
let codeGenerationRequest = try parser.parse(input: fileDescriptor)
39+
let codeGenerationRequest = try parser.parse()
3240
let sourceFile = try sourceGenerator.generate(codeGenerationRequest)
3341
return sourceFile.contents
3442
}

Sources/protoc-gen-grpc-swift/main.swift

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,10 @@ func main(args: [String]) throws {
172172
let grpcGenerator = ProtobufCodeGenerator(
173173
configuration: SourceGenerator.Configuration(options: options)
174174
)
175-
grpcFile.content = try grpcGenerator.generateCode(from: fileDescriptor)
175+
grpcFile.content = try grpcGenerator.generateCode(
176+
from: fileDescriptor,
177+
protoFileModuleMappings: options.protoToModuleMappings
178+
)
176179
} else {
177180
let grpcGenerator = Generator(fileDescriptor, options: options)
178181
grpcFile.content = grpcGenerator.code

Tests/GRPCProtobufCodeGenTests/ProtobufCodeGenParserTests.swift

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,7 @@ final class ProtobufCodeGenParserTests: XCTestCase {
3131
"""
3232
)
3333
}
34-
let parsedCodeGenRequest = try ProtobufCodeGenParser().parse(
35-
input: fileDescriptor
36-
)
34+
let parsedCodeGenRequest = try ProtobufCodeGenParser(input: fileDescriptor, protoFileModuleMappings: ProtoFileToModuleMappings()).parse()
3735
XCTAssertEqual(parsedCodeGenRequest.fileName, "helloworld.proto")
3836
XCTAssertEqual(
3937
parsedCodeGenRequest.leadingTrivia,
@@ -75,8 +73,8 @@ final class ProtobufCodeGenParserTests: XCTestCase {
7573
),
7674
isInputStreaming: false,
7775
isOutputStreaming: false,
78-
inputType: "HelloRequest",
79-
outputType: "HelloReply"
76+
inputType: "Helloworld_HelloRequest",
77+
outputType: "Helloworld_HelloReply"
8078
)
8179
guard let method = parsedCodeGenRequest.services.first?.methods.first else { return XCTFail() }
8280
XCTAssertEqual(method, expectedMethod)

Tests/GRPCProtobufCodeGenTests/ProtobufCodeGeneratorTests.swift

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -60,8 +60,8 @@ final class ProtobufCodeGeneratorTests: XCTestCase {
6060
internal enum Greeter {
6161
internal enum Method {
6262
internal enum SayHello {
63-
internal typealias Input = HelloRequest
64-
internal typealias Output = HelloReply
63+
internal typealias Input = Helloworld_HelloRequest
64+
internal typealias Output = Helloworld_HelloReply
6565
internal static let descriptor = MethodDescriptor(
6666
service: "helloworld.Greeter",
6767
method: "SayHello"
@@ -165,8 +165,8 @@ final class ProtobufCodeGeneratorTests: XCTestCase {
165165
public enum Greeter {
166166
public enum Method {
167167
public enum SayHello {
168-
public typealias Input = HelloRequest
169-
public typealias Output = HelloReply
168+
public typealias Input = Helloworld_HelloRequest
169+
public typealias Output = Helloworld_HelloReply
170170
public static let descriptor = MethodDescriptor(
171171
service: "helloworld.Greeter",
172172
method: "SayHello"
@@ -254,8 +254,8 @@ final class ProtobufCodeGeneratorTests: XCTestCase {
254254
package enum Greeter {
255255
package enum Method {
256256
package enum SayHello {
257-
package typealias Input = HelloRequest
258-
package typealias Output = HelloReply
257+
package typealias Input = Helloworld_HelloRequest
258+
package typealias Output = Helloworld_HelloReply
259259
package static let descriptor = MethodDescriptor(
260260
service: "helloworld.Greeter",
261261
method: "SayHello"
@@ -384,7 +384,13 @@ final class ProtobufCodeGeneratorTests: XCTestCase {
384384
)
385385
}
386386
let generator = ProtobufCodeGenerator(configuration: configs)
387-
try XCTAssertEqualWithDiff(try generator.generateCode(from: fileDescriptor), expectedCode)
387+
try XCTAssertEqualWithDiff(
388+
try generator.generateCode(
389+
from: fileDescriptor,
390+
protoFileModuleMappings: ProtoFileToModuleMappings()
391+
),
392+
expectedCode
393+
)
388394
}
389395
}
390396

0 commit comments

Comments
 (0)