Skip to content

Commit

Permalink
Make check for bundled protos more resilient
Browse files Browse the repository at this point in the history
Motivation:

The fix in #17 relies on `SwiftProtobufPluginLibrary`'s `WellKnownType`
type including all protos bundled by `SwiftProtobuf`, this turns out not
to be true so in some case (like using the "Empty" proto) an import was
missing.

Modifications:

- Use the "isBundleProto" API which better suits our needs
- Update test to use type which would fail test before fix

Result:

Better code gen
  • Loading branch information
glbrntt committed Dec 11, 2024
1 parent a2834ea commit 696031b
Showing 1 changed file with 9 additions and 13 deletions.
22 changes: 9 additions & 13 deletions Sources/GRPCProtobufCodeGen/ProtobufCodeGenParser.swift
Original file line number Diff line number Diff line change
Expand Up @@ -92,24 +92,20 @@ package struct ProtobufCodeGenParser {
}

extension ProtobufCodeGenParser {
fileprivate func codeDependencies(
file: FileDescriptor
) -> [Dependency] {
fileprivate func codeDependencies(file: FileDescriptor) -> [Dependency] {
var codeDependencies: [Dependency] = [
Dependency(module: "GRPCProtobuf", accessLevel: .internal)
]

// If any services in the file depend on well-known Protobuf types then also import
// SwiftProtobuf. Importing SwiftProtobuf unconditionally results in warnings in the generated
// code if access-levels are used on imports and no well-known types are used.
let usesAnyWellKnownTypesInServices = file.services.contains { service in
service.methods.contains { method in
let inputIsWellKnown = method.inputType.wellKnownType != nil
let outputIsWellKnown = method.outputType.wellKnownType != nil
return inputIsWellKnown || outputIsWellKnown
}
// If there's a dependency on a bundled proto then add the SwiftProtobuf import.
//
// Importing SwiftProtobuf unconditionally results in warnings in the generated
// code if access-levels are used on imports and no bundled protos are used.
let dependsOnBundledProto = file.dependencies.contains { descriptor in
SwiftProtobufInfo.isBundledProto(file: descriptor)
}
if usesAnyWellKnownTypesInServices {

if dependsOnBundledProto {
codeDependencies.append(Dependency(module: "SwiftProtobuf", accessLevel: self.accessLevel))
}

Expand Down

0 comments on commit 696031b

Please sign in to comment.