Browse Source

Add explicit access-level modifier support for imports in code generator (#2010)

## Motivation
This is a follow-up of https://github.com/grpc/grpc-swift/pull/2003.
As of 5.9, Swift supports access-level modifiers on imports. In an
upcoming Swift 6.x release, the default modifier will become `internal`.

## Modifications
This PR adds explicit access-level modifiers to the generated code and a
few other modules that use this generated code.

## Result
Explicit access level imports present in more places.
Gustavo Cairo 1 year ago
parent
commit
5dc10b7b8a

+ 10 - 4
Sources/GRPCProtobufCodeGen/ProtobufCodeGenParser.swift

@@ -19,6 +19,7 @@ internal import SwiftProtobuf
 internal import SwiftProtobufPluginLibrary
 
 internal import struct GRPCCodeGen.CodeGenerationRequest
+internal import struct GRPCCodeGen.SourceGenerator
 
 /// Parses a ``FileDescriptor`` object into a ``CodeGenerationRequest`` object.
 internal struct ProtobufCodeGenParser {
@@ -26,11 +27,13 @@ internal struct ProtobufCodeGenParser {
   let namer: SwiftProtobufNamer
   let extraModuleImports: [String]
   let protoToModuleMappings: ProtoFileToModuleMappings
+  let accessLevel: SourceGenerator.Configuration.AccessLevel
 
   internal init(
     input: FileDescriptor,
     protoFileModuleMappings: ProtoFileToModuleMappings,
-    extraModuleImports: [String]
+    extraModuleImports: [String],
+    accessLevel: SourceGenerator.Configuration.AccessLevel
   ) {
     self.input = input
     self.extraModuleImports = extraModuleImports
@@ -39,6 +42,7 @@ internal struct ProtobufCodeGenParser {
       currentFile: input,
       protoFileToModuleMappings: protoFileModuleMappings
     )
+    self.accessLevel = accessLevel
   }
 
   internal func parse() throws -> CodeGenerationRequest {
@@ -86,18 +90,20 @@ internal struct ProtobufCodeGenParser {
 
 extension ProtobufCodeGenParser {
   fileprivate var codeDependencies: [CodeGenerationRequest.Dependency] {
-    var codeDependencies: [CodeGenerationRequest.Dependency] = [.init(module: "GRPCProtobuf")]
+    var codeDependencies: [CodeGenerationRequest.Dependency] = [
+      .init(module: "GRPCProtobuf", accessLevel: .internal)
+    ]
     // Adding as dependencies the modules containing generated code or types for
     // '.proto' files imported in the '.proto' file we are parsing.
     codeDependencies.append(
       contentsOf: (self.protoToModuleMappings.neededModules(forFile: self.input) ?? []).map {
-        CodeGenerationRequest.Dependency(module: $0)
+        CodeGenerationRequest.Dependency(module: $0, accessLevel: self.accessLevel)
       }
     )
     // Adding extra imports passed in as an option to the plugin.
     codeDependencies.append(
       contentsOf: self.extraModuleImports.sorted().map {
-        CodeGenerationRequest.Dependency(module: $0)
+        CodeGenerationRequest.Dependency(module: $0, accessLevel: self.accessLevel)
       }
     )
     return codeDependencies

+ 2 - 1
Sources/GRPCProtobufCodeGen/ProtobufCodeGenerator.swift

@@ -34,7 +34,8 @@ public struct ProtobufCodeGenerator {
     let parser = ProtobufCodeGenParser(
       input: fileDescriptor,
       protoFileModuleMappings: protoFileModuleMappings,
-      extraModuleImports: extraModuleImports
+      extraModuleImports: extraModuleImports,
+      accessLevel: self.configuration.accessLevel
     )
     let sourceGenerator = SourceGenerator(configuration: self.configuration)
 

+ 6 - 3
Tests/GRPCProtobufCodeGenTests/ProtobufCodeGenParserTests.swift

@@ -55,7 +55,8 @@ final class ProtobufCodeGenParserTests: XCTestCase {
     let parsedCodeGenRequest = try ProtobufCodeGenParser(
       input: fileDescriptor,
       protoFileModuleMappings: ProtoFileToModuleMappings(moduleMappingsProto: moduleMappings),
-      extraModuleImports: ["ExtraModule"]
+      extraModuleImports: ["ExtraModule"],
+      accessLevel: .internal
     ).parse()
 
     self.testCommonHelloworldParsedRequestFields(for: parsedCodeGenRequest)
@@ -136,7 +137,8 @@ final class ProtobufCodeGenParserTests: XCTestCase {
     let parsedCodeGenRequest = try ProtobufCodeGenParser(
       input: fileDescriptor,
       protoFileModuleMappings: ProtoFileToModuleMappings(moduleMappingsProto: moduleMappings),
-      extraModuleImports: ["ExtraModule"]
+      extraModuleImports: ["ExtraModule"],
+      accessLevel: .internal
     ).parse()
 
     self.testCommonHelloworldParsedRequestFields(for: parsedCodeGenRequest)
@@ -217,7 +219,8 @@ final class ProtobufCodeGenParserTests: XCTestCase {
     let parsedCodeGenRequest = try ProtobufCodeGenParser(
       input: fileDescriptor,
       protoFileModuleMappings: ProtoFileToModuleMappings(moduleMappingsProto: moduleMappings),
-      extraModuleImports: ["ExtraModule"]
+      extraModuleImports: ["ExtraModule"],
+      accessLevel: .internal
     ).parse()
 
     self.testCommonHelloworldParsedRequestFields(for: parsedCodeGenRequest)

+ 12 - 12
Tests/GRPCProtobufCodeGenTests/ProtobufCodeGeneratorTests.swift

@@ -54,10 +54,10 @@ final class ProtobufCodeGeneratorTests: XCTestCase {
         // For information on using the generated types, please see the documentation:
         //   https://github.com/grpc/grpc-swift
 
-        import GRPCCore
-        import GRPCProtobuf
-        import DifferentModule
-        import ExtraModule
+        internal import GRPCCore
+        internal import GRPCProtobuf
+        internal import DifferentModule
+        internal import ExtraModule
 
         internal enum Hello_World_Greeter {
             internal static let descriptor = ServiceDescriptor.hello_world_Greeter
@@ -204,10 +204,10 @@ final class ProtobufCodeGeneratorTests: XCTestCase {
         // For information on using the generated types, please see the documentation:
         //   https://github.com/grpc/grpc-swift
 
-        import GRPCCore
-        import GRPCProtobuf
-        import DifferentModule
-        import ExtraModule
+        public import GRPCCore
+        internal import GRPCProtobuf
+        public import DifferentModule
+        public import ExtraModule
 
         public enum Helloworld_Greeter {
           public static let descriptor = ServiceDescriptor.helloworld_Greeter
@@ -307,10 +307,10 @@ final class ProtobufCodeGeneratorTests: XCTestCase {
         // For information on using the generated types, please see the documentation:
         //   https://github.com/grpc/grpc-swift
 
-        import GRPCCore
-        import GRPCProtobuf
-        import DifferentModule
-        import ExtraModule
+        package import GRPCCore
+        internal import GRPCProtobuf
+        package import DifferentModule
+        package import ExtraModule
 
         package enum Greeter {
           package static let descriptor = ServiceDescriptor.Greeter