Browse Source

Make check for bundled protos more resilient (#21)

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
George Barnett 1 year ago
parent
commit
405d74cfa7
1 changed files with 9 additions and 13 deletions
  1. 9 13
      Sources/GRPCProtobufCodeGen/ProtobufCodeGenParser.swift

+ 9 - 13
Sources/GRPCProtobufCodeGen/ProtobufCodeGenParser.swift

@@ -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))
     }