Skip to content

Commit 7acebe0

Browse files
committed
Only generate SwiftProtobuf import for well-known types
Motivation: In (grpc#16) an import for SwiftProtobuf was added to account for well-known types. However, if no well-known types are used then warnings are emitted when the access level is included on the import. Modifications: - Only generate the SwiftProtobuf import for well-known types Result: Fewer warnings
1 parent 39c40fa commit 7acebe0

File tree

6 files changed

+59
-4
lines changed

6 files changed

+59
-4
lines changed

Sources/GRPCProtobufCodeGen/ProtobufCodeGenParser.swift

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,8 +97,22 @@ extension ProtobufCodeGenParser {
9797
) -> [Dependency] {
9898
var codeDependencies: [Dependency] = [
9999
Dependency(module: "GRPCProtobuf", accessLevel: .internal),
100-
Dependency(module: "SwiftProtobuf", accessLevel: self.accessLevel),
101100
]
101+
102+
// If any services in the file depend on well-known Protobuf types then also import
103+
// SwiftProtobuf. Importing SwiftProtobuf unconditionally results in warnings in the generated
104+
// code if access-levels are used on imports and no well-known types are used.
105+
let usesAnyWellKnownTypesInServices = file.services.contains { service in
106+
service.methods.contains { method in
107+
let inputIsWellKnown = method.inputType.wellKnownType != nil
108+
let outputIsWellKnown = method.outputType.wellKnownType != nil
109+
return inputIsWellKnown || outputIsWellKnown
110+
}
111+
}
112+
if usesAnyWellKnownTypesInServices {
113+
codeDependencies.append(Dependency(module: "SwiftProtobuf", accessLevel: self.accessLevel))
114+
}
115+
102116
// Adding as dependencies the modules containing generated code or types for
103117
// '.proto' files imported in the '.proto' file we are parsing.
104118
codeDependencies.append(
6.09 KB
Binary file not shown.

Tests/GRPCProtobufCodeGenTests/ProtobufCodeGenParserTests.swift

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,6 @@ struct ProtobufCodeGenParserTests {
6262
func dependencies() {
6363
let expected: [GRPCCodeGen.Dependency] = [
6464
.init(module: "GRPCProtobuf", accessLevel: .internal), // Always an internal import
65-
.init(module: "SwiftProtobuf", accessLevel: .internal),
6665
]
6766
#expect(self.codeGen.dependencies == expected)
6867
}
@@ -175,7 +174,6 @@ struct ProtobufCodeGenParserTests {
175174
func dependencies() {
176175
let expected: [GRPCCodeGen.Dependency] = [
177176
.init(module: "GRPCProtobuf", accessLevel: .internal), // Always an internal import
178-
.init(module: "SwiftProtobuf", accessLevel: .internal),
179177
]
180178
#expect(self.codeGen.dependencies == expected)
181179
}
@@ -237,4 +235,26 @@ struct ProtobufCodeGenParserTests {
237235
#expect(self.service.namespace.base == "")
238236
}
239237
}
238+
239+
@Suite("Service using 'well-known types' (wkt-service.proto)")
240+
struct WKTService: UsesDescriptorSet {
241+
static let descriptorSetName = "wkt-service"
242+
static let fileDescriptorName = "wkt-service"
243+
244+
let codeGen: CodeGenerationRequest
245+
246+
init() throws {
247+
let descriptor = try #require(try Self.fileDescriptor)
248+
self.codeGen = try parseDescriptor(descriptor)
249+
}
250+
251+
@Test("Dependencies")
252+
func dependencies() {
253+
let expected: [Dependency] = [
254+
Dependency(module: "GRPCProtobuf", accessLevel: .internal),
255+
Dependency(module: "SwiftProtobuf", accessLevel: .internal),
256+
]
257+
#expect(self.codeGen.dependencies == expected)
258+
}
259+
}
240260
}

Tests/GRPCProtobufCodeGenTests/ProtobufCodeGeneratorTests.swift

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,6 @@ struct ProtobufCodeGeneratorTests: UsesDescriptorSet {
6767
6868
import GRPCCore
6969
import GRPCProtobuf
70-
import SwiftProtobuf
7170
7271
// MARK: - test.TestService
7372

dev/protos/generate.sh

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,9 +59,21 @@ function generate_bar_service_descriptor_set {
5959
--include_imports
6060
}
6161

62+
function generate_wkt_service_descriptor_set {
63+
local proto proto_path output
64+
proto="$here/local/wkt-service.proto"
65+
proto_path="$(dirname "$proto")"
66+
output="$root/Tests/GRPCProtobufCodeGenTests/Generated/wkt-service.pb"
67+
68+
invoke_protoc --descriptor_set_out="$output" "$proto" -I "$proto_path" \
69+
--include_source_info \
70+
--include_imports
71+
}
72+
6273
#------------------------------------------------------------------------------
6374

6475
# Descriptor sets
6576
generate_test_service_descriptor_set
6677
generate_foo_service_descriptor_set
6778
generate_bar_service_descriptor_set
79+
generate_wkt_service_descriptor_set

dev/protos/local/wkt-service.proto

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
// Leading trivia.
2+
syntax = "proto3";
3+
4+
package test;
5+
6+
import "google/protobuf/any.proto";
7+
8+
service WKTService {
9+
rpc Method (google.protobuf.Any) returns (google.protobuf.Any) {}
10+
}

0 commit comments

Comments
 (0)