From 4e0f73cddbebdeae1cf96b9d63ec7af37396a665 Mon Sep 17 00:00:00 2001
From: Jan Tattermusch <jtattermusch@google.com>
Date: Mon, 25 Apr 2016 16:11:03 -0700
Subject: [PATCH] add internal_access option for C# codegen

---
 src/compiler/csharp_generator.cc | 15 +++++++++++----
 src/compiler/csharp_generator.h  |  3 ++-
 src/compiler/csharp_plugin.cc    |  6 +++++-
 3 files changed, 18 insertions(+), 6 deletions(-)

diff --git a/src/compiler/csharp_generator.cc b/src/compiler/csharp_generator.cc
index 5744d7c96a..0d1404341d 100644
--- a/src/compiler/csharp_generator.cc
+++ b/src/compiler/csharp_generator.cc
@@ -123,6 +123,10 @@ std::string GetMethodRequestParamMaybe(const MethodDescriptor *method,
   return GetClassName(method->input_type()) + " request, ";
 }
 
+std::string GetAccessLevel(bool internal_access) {
+  return internal_access ? "internal" : "public";
+}
+
 std::string GetMethodReturnTypeClient(const MethodDescriptor *method) {
   switch (GetMethodType(method)) {
     case METHODTYPE_NO_STREAMING:
@@ -528,8 +532,10 @@ void GenerateNewStubMethods(Printer* out, const ServiceDescriptor *service) {
 }
 
 void GenerateService(Printer* out, const ServiceDescriptor *service,
-                     bool generate_client, bool generate_server) {
-  out->Print("public static class $classname$\n", "classname",
+                     bool generate_client, bool generate_server,
+                     bool internal_access) {
+  out->Print("$access_level$ static class $classname$\n", "access_level",
+             GetAccessLevel(internal_access), "classname",
              GetServiceClassName(service));
   out->Print("{\n");
   out->Indent();
@@ -567,7 +573,7 @@ void GenerateService(Printer* out, const ServiceDescriptor *service,
 }  // anonymous namespace
 
 grpc::string GetServices(const FileDescriptor *file, bool generate_client,
-                         bool generate_server) {
+                         bool generate_server, bool internal_access) {
   grpc::string output;
   {
     // Scope the output stream so it closes and finalizes output to the string.
@@ -595,7 +601,8 @@ grpc::string GetServices(const FileDescriptor *file, bool generate_client,
     out.Print("namespace $namespace$ {\n", "namespace", GetFileNamespace(file));
     out.Indent();
     for (int i = 0; i < file->service_count(); i++) {
-      GenerateService(&out, file->service(i), generate_client, generate_server);
+      GenerateService(&out, file->service(i), generate_client, generate_server,
+                      internal_access);
     }
     out.Outdent();
     out.Print("}\n");
diff --git a/src/compiler/csharp_generator.h b/src/compiler/csharp_generator.h
index 79c2e57266..f0585af4fd 100644
--- a/src/compiler/csharp_generator.h
+++ b/src/compiler/csharp_generator.h
@@ -41,7 +41,8 @@
 namespace grpc_csharp_generator {
 
 grpc::string GetServices(const grpc::protobuf::FileDescriptor *file,
-                         bool generate_client, bool generate_server);
+                         bool generate_client, bool generate_server,
+                         bool internal_access);
 
 }  // namespace grpc_csharp_generator
 
diff --git a/src/compiler/csharp_plugin.cc b/src/compiler/csharp_plugin.cc
index fd1ec99e2b..5350e73f10 100644
--- a/src/compiler/csharp_plugin.cc
+++ b/src/compiler/csharp_plugin.cc
@@ -53,11 +53,14 @@ class CSharpGrpcGenerator : public grpc::protobuf::compiler::CodeGenerator {
 
     bool generate_client = true;
     bool generate_server = true;
+    bool internal_access = false;
     for (size_t i = 0; i < options.size(); i++) {
       if (options[i].first == "no_client") {
         generate_client = false;
       } else if (options[i].first == "no_server") {
         generate_server = false;
+      } else if (options[i].first == "internal_access") {
+        internal_access = true;
       } else {
         *error = "Unknown generator option: " + options[i].first;
         return false;
@@ -66,7 +69,8 @@ class CSharpGrpcGenerator : public grpc::protobuf::compiler::CodeGenerator {
 
     grpc::string code = grpc_csharp_generator::GetServices(file,
                                                            generate_client,
-                                                           generate_server);
+                                                           generate_server,
+                                                           internal_access);
     if (code.size() == 0) {
       return true;  // don't generate a file if there are no services
     }
-- 
GitLab