Skip to content

Commit

Permalink
Merge branch 'main' into build_plugin_integration_tests
Browse files Browse the repository at this point in the history
  • Loading branch information
rnro authored Jan 23, 2025
2 parents 63dc0bf + c991945 commit b8e1d21
Show file tree
Hide file tree
Showing 8 changed files with 60 additions and 76 deletions.
2 changes: 1 addition & 1 deletion Package.swift
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ let products: [Product] = [
let dependencies: [Package.Dependency] = [
.package(
url: "https://github.com/grpc/grpc-swift.git",
exact: "2.0.0-beta.3"
branch: "main"
),
.package(
url: "https://github.com/apple/swift-protobuf.git",
Expand Down
4 changes: 2 additions & 2 deletions Plugins/PluginsShared/PluginError.swift
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,8 @@ enum PluginError: Error {
extension PluginError: CustomStringConvertible {
var description: String {
switch self {
case .incompatibleTarget(let string):
"Build plugin applied to incompatible target."
case .incompatibleTarget(let target):
"Build plugin applied to incompatible target (\(target))."
case .noConfigFilesFound:
"No config files found. The build plugin relies on the existence of one or more '\(configFileName)' files in the target source."
}
Expand Down
70 changes: 33 additions & 37 deletions Sources/GRPCProtobufCodeGen/ProtobufCodeGenParser.swift
Original file line number Diff line number Diff line change
Expand Up @@ -18,11 +18,12 @@ internal import SwiftProtobuf
package import SwiftProtobufPluginLibrary

package import struct GRPCCodeGen.CodeGenerationRequest
package import struct GRPCCodeGen.CodeGenerator
package import struct GRPCCodeGen.Dependency
package import struct GRPCCodeGen.MethodDescriptor
package import struct GRPCCodeGen.Name
package import struct GRPCCodeGen.MethodName
package import struct GRPCCodeGen.ServiceDescriptor
package import struct GRPCCodeGen.SourceGenerator
package import struct GRPCCodeGen.ServiceName

#if canImport(FoundationEssentials)
internal import struct FoundationEssentials.IndexPath
Expand All @@ -34,12 +35,12 @@ internal import struct Foundation.IndexPath
package struct ProtobufCodeGenParser {
let extraModuleImports: [String]
let protoToModuleMappings: ProtoFileToModuleMappings
let accessLevel: SourceGenerator.Config.AccessLevel
let accessLevel: CodeGenerator.Config.AccessLevel

package init(
protoFileModuleMappings: ProtoFileToModuleMappings,
extraModuleImports: [String],
accessLevel: SourceGenerator.Config.AccessLevel
accessLevel: CodeGenerator.Config.AccessLevel
) {
self.extraModuleImports = extraModuleImports
self.protoToModuleMappings = protoFileModuleMappings
Expand Down Expand Up @@ -69,12 +70,6 @@ package struct ProtobufCodeGenParser {
// https://github.com/grpc/grpc-swift
"""
let lookupSerializer: (String) -> String = { messageType in
"GRPCProtobuf.ProtobufSerializer<\(messageType)>()"
}
let lookupDeserializer: (String) -> String = { messageType in
"GRPCProtobuf.ProtobufDeserializer<\(messageType)>()"
}

let services = descriptor.services.map {
GRPCCodeGen.ServiceDescriptor(
Expand All @@ -90,8 +85,12 @@ package struct ProtobufCodeGenParser {
leadingTrivia: header + leadingTrivia,
dependencies: self.codeDependencies(file: descriptor),
services: services,
lookupSerializer: lookupSerializer,
lookupDeserializer: lookupDeserializer
makeSerializerCodeSnippet: { messageType in
"GRPCProtobuf.ProtobufSerializer<\(messageType)>()"
},
makeDeserializerCodeSnippet: { messageType in
"GRPCProtobuf.ProtobufDeserializer<\(messageType)>()"
}
)
}
}
Expand Down Expand Up @@ -147,22 +146,17 @@ extension GRPCCodeGen.ServiceDescriptor {
protobufNamer: protobufNamer
)
}
let name = Name(
base: descriptor.name,

let typePrefix = protobufNamer.typePrefix(forFile: file)
let name = ServiceName(
identifyingName: descriptor.fullName,
// The service name from the '.proto' file is expected to be in upper camel case
generatedUpperCase: descriptor.name,
generatedLowerCase: CamelCaser.toLowerCamelCase(descriptor.name)
typeName: typePrefix + descriptor.name,
propertyName: protobufNamer.typePrefixProperty(file: file) + descriptor.name
)

// Packages that are based on the path of the '.proto' file usually
// contain dots. For example: "grpc.test".
let namespace = Name(
base: package,
generatedUpperCase: protobufNamer.formattedUpperCasePackage(file: file),
generatedLowerCase: protobufNamer.formattedLowerCasePackage(file: file)
)
let documentation = descriptor.protoSourceComments()
self.init(documentation: documentation, name: name, namespace: namespace, methods: methods)
self.init(documentation: documentation, name: name, methods: methods)
}
}

Expand All @@ -171,11 +165,11 @@ extension GRPCCodeGen.MethodDescriptor {
descriptor: SwiftProtobufPluginLibrary.MethodDescriptor,
protobufNamer: SwiftProtobufNamer
) {
let name = Name(
base: descriptor.name,
let name = MethodName(
identifyingName: descriptor.name,
// The method name from the '.proto' file is expected to be in upper camel case
generatedUpperCase: descriptor.name,
generatedLowerCase: CamelCaser.toLowerCamelCase(descriptor.name)
typeName: descriptor.name,
functionName: CamelCaser.toLowerCamelCase(descriptor.name)
)
let documentation = descriptor.protoSourceComments()
self.init(
Expand Down Expand Up @@ -208,17 +202,19 @@ extension FileDescriptor {
}

extension SwiftProtobufNamer {
internal func formattedUpperCasePackage(file: FileDescriptor) -> String {
let unformattedPackage = self.typePrefix(forFile: file)
return unformattedPackage.trimTrailingUnderscores()
}

internal func formattedLowerCasePackage(file: FileDescriptor) -> String {
let upperCasePackage = self.formattedUpperCasePackage(file: file)
let lowerCaseComponents = upperCasePackage.split(separator: "_").map { component in
internal func typePrefixProperty(file: FileDescriptor) -> String {
let typePrefix = self.typePrefix(forFile: file)
let lowercased = typePrefix.split(separator: "_").map { component in
NamingUtils.toLowerCamelCase(String(component))
}
return lowerCaseComponents.joined(separator: "_")

let joined = lowercased.joined(separator: "_")
if typePrefix.hasSuffix("_"), !joined.hasSuffix("_") {
// Add the trailing "_" if it was dropped.
return joined + "_"
} else {
return joined
}
}
}

Expand Down
8 changes: 4 additions & 4 deletions Sources/GRPCProtobufCodeGen/ProtobufCodeGenerator.swift
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,10 @@ package import GRPCCodeGen
package import SwiftProtobufPluginLibrary

package struct ProtobufCodeGenerator {
internal var config: SourceGenerator.Config
internal var config: GRPCCodeGen.CodeGenerator.Config

package init(
config: SourceGenerator.Config
config: GRPCCodeGen.CodeGenerator.Config
) {
self.config = config
}
Expand All @@ -36,10 +36,10 @@ package struct ProtobufCodeGenerator {
extraModuleImports: extraModuleImports,
accessLevel: self.config.accessLevel
)
let sourceGenerator = SourceGenerator(config: self.config)
let codeGenerator = GRPCCodeGen.CodeGenerator(config: self.config)

let codeGenerationRequest = try parser.parse(descriptor: fileDescriptor)
let sourceFile = try sourceGenerator.generate(codeGenerationRequest)
let sourceFile = try codeGenerator.generate(codeGenerationRequest)
return sourceFile.contents
}
}
8 changes: 4 additions & 4 deletions Sources/protoc-gen-grpc-swift/GenerateGRPC.swift
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ import Foundation
#endif

@main
final class GenerateGRPC: CodeGenerator {
final class GenerateGRPC: SwiftProtobufPluginLibrary.CodeGenerator {
var version: String? {
Version.versionString
}
Expand Down Expand Up @@ -96,7 +96,7 @@ final class GenerateGRPC: CodeGenerator {
fileNamingOption: options.fileNaming
)

let config = SourceGenerator.Config(options: options)
let config = CodeGenerator.Config(options: options)
let fileGenerator = ProtobufCodeGenerator(config: config)
let contents = try fileGenerator.generateCode(
fileDescriptor: descriptor,
Expand Down Expand Up @@ -182,9 +182,9 @@ private func splitPath(pathname: String) -> (dir: String, base: String, suffix:
return (dir: dir, base: base, suffix: suffix)
}

extension SourceGenerator.Config {
extension GRPCCodeGen.CodeGenerator.Config {
init(options: GeneratorOptions) {
let accessLevel: SourceGenerator.Config.AccessLevel
let accessLevel: GRPCCodeGen.CodeGenerator.Config.AccessLevel
switch options.visibility {
case .internal:
accessLevel = .internal
Expand Down
32 changes: 10 additions & 22 deletions Tests/GRPCProtobufCodeGenTests/ProtobufCodeGenParserTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -78,12 +78,7 @@ struct ProtobufCodeGenParserTests {

@Test("Name")
func name() {
#expect(self.service.name.base == "TestService")
}

@Test("Namespace")
func namespace() {
#expect(self.service.namespace.base == "test")
#expect(self.service.name.identifyingName == "test.TestService")
}

@Suite("Methods")
Expand Down Expand Up @@ -114,10 +109,10 @@ struct ProtobufCodeGenParserTests {

@Test("Name")
func name() {
#expect(self.unary.name.base == "Unary")
#expect(self.clientStreaming.name.base == "ClientStreaming")
#expect(self.serverStreaming.name.base == "ServerStreaming")
#expect(self.bidiStreaming.name.base == "BidirectionalStreaming")
#expect(self.unary.name.identifyingName == "Unary")
#expect(self.clientStreaming.name.identifyingName == "ClientStreaming")
#expect(self.serverStreaming.name.identifyingName == "ServerStreaming")
#expect(self.bidiStreaming.name.identifyingName == "BidirectionalStreaming")
}

@Test("Input")
Expand Down Expand Up @@ -181,31 +176,29 @@ struct ProtobufCodeGenParserTests {
@Test("Service1")
func service1() throws {
let service = self.codeGen.services[0]
#expect(service.name.base == "FooService1")
#expect(service.namespace.base == "foo")
#expect(service.name.identifyingName == "foo.FooService1")
#expect(service.methods.count == 1)
}

@Test("Service1.Method")
func service1Method() throws {
let method = self.codeGen.services[0].methods[0]
#expect(method.name.base == "Foo")
#expect(method.name.identifyingName == "Foo")
#expect(method.inputType == "Foo_FooInput")
#expect(method.outputType == "Foo_FooOutput")
}

@Test("Service2")
func service2() throws {
let service = self.codeGen.services[1]
#expect(service.name.base == "FooService2")
#expect(service.namespace.base == "foo")
#expect(service.name.identifyingName == "foo.FooService2")
#expect(service.methods.count == 1)
}

@Test("Service2.Method")
func service2Method() throws {
let method = self.codeGen.services[1].methods[0]
#expect(method.name.base == "Foo")
#expect(method.name.identifyingName == "Foo")
#expect(method.inputType == "Foo_FooInput")
#expect(method.outputType == "Foo_FooOutput")
}
Expand All @@ -227,12 +220,7 @@ struct ProtobufCodeGenParserTests {

@Test("Service name")
func serviceName() {
#expect(self.service.name.base == "BarService")
}

@Test("Service namespace")
func serviceNamespace() {
#expect(self.service.namespace.base == "")
#expect(self.service.name.identifyingName == "BarService")
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,10 +25,10 @@ struct ProtobufCodeGeneratorTests {
static let descriptorSetName = "test-service"
static let fileDescriptorName = "test-service"

@Test("Generate", arguments: [SourceGenerator.Config.AccessLevel.internal, .public, .package])
func generate(accessLevel: SourceGenerator.Config.AccessLevel) throws {
@Test("Generate", arguments: [CodeGenerator.Config.AccessLevel.internal])
func generate(accessLevel: GRPCCodeGen.CodeGenerator.Config.AccessLevel) throws {
let generator = ProtobufCodeGenerator(
config: SourceGenerator.Config(
config: CodeGenerator.Config(
accessLevel: accessLevel,
accessLevelOnImports: false,
client: true,
Expand Down Expand Up @@ -1072,7 +1072,7 @@ struct ProtobufCodeGeneratorTests {
@Test("Generate")
func generate() throws {
let generator = ProtobufCodeGenerator(
config: SourceGenerator.Config(
config: CodeGenerator.Config(
accessLevel: .public,
accessLevelOnImports: false,
client: true,
Expand Down
4 changes: 2 additions & 2 deletions Tests/GRPCProtobufCodeGenTests/Utilities.swift
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ import SwiftProtobufPluginLibrary
import Testing

import struct GRPCCodeGen.CodeGenerationRequest
import struct GRPCCodeGen.SourceGenerator
import struct GRPCCodeGen.CodeGenerator

protocol UsesDescriptorSet {
static var descriptorSetName: String { get }
Expand Down Expand Up @@ -71,7 +71,7 @@ private func loadDescriptorSet(
func parseDescriptor(
_ descriptor: FileDescriptor,
extraModuleImports: [String] = [],
accessLevel: SourceGenerator.Config.AccessLevel = .internal
accessLevel: CodeGenerator.Config.AccessLevel = .internal
) throws -> CodeGenerationRequest {
let parser = ProtobufCodeGenParser(
protoFileModuleMappings: .init(),
Expand Down

0 comments on commit b8e1d21

Please sign in to comment.