From 7e024be839687470bd1343f70f08ec1e703eb9ec Mon Sep 17 00:00:00 2001
From: chedeti <chedeti@google.com>
Date: Fri, 5 Aug 2016 11:15:37 -0700
Subject: [PATCH] fix multilevel inheritence codegen

---
 tools/grift/grpc_plugins_generator.patch | 75 ++++++++++++++----------
 1 file changed, 43 insertions(+), 32 deletions(-)

diff --git a/tools/grift/grpc_plugins_generator.patch b/tools/grift/grpc_plugins_generator.patch
index a1d4cecde0..de82a01f62 100644
--- a/tools/grift/grpc_plugins_generator.patch
+++ b/tools/grift/grpc_plugins_generator.patch
@@ -59,21 +59,21 @@ index 6fd15d2..7de1fad 100755
 2.8.0.rc3.226.g39d4020
 
 
-From e724d3abf096278615085bd58217321e32b43fd8 Mon Sep 17 00:00:00 2001
+From 387e4300bc9d98176a92a7c010621443a538e7f2 Mon Sep 17 00:00:00 2001
 From: chedeti <chedeti@google.com>
 Date: Sun, 31 Jul 2016 16:16:40 -0700
 Subject: [PATCH 2/3] grpc cpp plugins generator with example
 
 ---
- compiler/cpp/src/generate/t_cpp_generator.cc | 478 +++++++++++++++++++++++----
+ compiler/cpp/src/generate/t_cpp_generator.cc | 489 +++++++++++++++++++++++----
  tutorial/cpp/CMakeLists.txt                  |  53 ---
  tutorial/cpp/CppClient.cpp                   |  80 -----
  tutorial/cpp/CppServer.cpp                   | 181 ----------
- tutorial/cpp/GriftClient.cpp                 |  93 ++++++
- tutorial/cpp/GriftServer.cpp                 |  93 ++++++
+ tutorial/cpp/GriftClient.cpp                 |  93 +++++
+ tutorial/cpp/GriftServer.cpp                 |  93 +++++
  tutorial/cpp/Makefile.am                     |  66 ++--
  tutorial/cpp/test.thrift                     |  13 +
- 8 files changed, 641 insertions(+), 416 deletions(-)
+ 8 files changed, 652 insertions(+), 416 deletions(-)
  delete mode 100644 tutorial/cpp/CMakeLists.txt
  delete mode 100644 tutorial/cpp/CppClient.cpp
  delete mode 100644 tutorial/cpp/CppServer.cpp
@@ -82,7 +82,7 @@ Subject: [PATCH 2/3] grpc cpp plugins generator with example
  create mode 100644 tutorial/cpp/test.thrift
 
 diff --git a/compiler/cpp/src/generate/t_cpp_generator.cc b/compiler/cpp/src/generate/t_cpp_generator.cc
-index 6c04899..4e00129 100644
+index 6c04899..1557241 100644
 --- a/compiler/cpp/src/generate/t_cpp_generator.cc
 +++ b/compiler/cpp/src/generate/t_cpp_generator.cc
 @@ -162,6 +162,8 @@ public:
@@ -328,7 +328,7 @@ index 6c04899..4e00129 100644
                     << endl;
  
      f_service_tcc_ << "#ifndef " << svcname << "_TCC" << endl << "#define " << svcname << "_TCC"
-@@ -1663,19 +1704,66 @@ void t_cpp_generator::generate_service(t_service* tservice) {
+@@ -1663,19 +1704,69 @@ void t_cpp_generator::generate_service(t_service* tservice) {
      }
    }
  
@@ -361,15 +361,18 @@ index 6c04899..4e00129 100644
 +      indent() << "\"/" << ns << "." << service_name_ << "/" << (*f_iter)->get_name() << "\"," << endl;
 +  }
 +
-+  if (extends_service) {
-+    vector<t_function*> functions = extends_service->get_functions();
++
++  t_service* service_iter = extends_service;  
++  while (service_iter) {
++    vector<t_function*> functions = service_iter->get_functions();
 +    vector<t_function*>::iterator f_iter;
 +
 +    for ( f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
 +      f_service_ <<
-+      indent() << "\"/" << extends_service->get_program()->get_namespace("cpp") <<
-+      "." << extends_service->get_name() << "/" << (*f_iter)->get_name() << "\"," << endl;
++      indent() << "\"/" << service_iter->get_program()->get_namespace("cpp") <<
++      "." << service_iter->get_name() << "/" << (*f_iter)->get_name() << "\"," << endl;
 +    }
++    service_iter = service_iter->get_extends();
 +  }
 +
 +  indent_down();
@@ -403,7 +406,7 @@ index 6c04899..4e00129 100644
  
    // Generate all the cob components
    if (gen_cob_style_) {
-@@ -1688,10 +1776,14 @@ void t_cpp_generator::generate_service(t_service* tservice) {
+@@ -1688,10 +1779,14 @@ void t_cpp_generator::generate_service(t_service* tservice) {
      generate_service_async_skeleton(tservice);
    }
  
@@ -418,7 +421,7 @@ index 6c04899..4e00129 100644
    // Close the namespace
    f_service_ << ns_close_ << endl << endl;
    f_service_tcc_ << ns_close_ << endl << endl;
-@@ -1729,15 +1821,11 @@ void t_cpp_generator::generate_service_helpers(t_service* tservice) {
+@@ -1729,15 +1824,11 @@ void t_cpp_generator::generate_service_helpers(t_service* tservice) {
      string name_orig = ts->get_name();
  
      // TODO(dreiss): Why is this stuff not in generate_function_helpers?
@@ -436,7 +439,7 @@ index 6c04899..4e00129 100644
      ts->set_name(name_orig);
  
      generate_function_helpers(tservice, *f_iter);
-@@ -1745,13 +1833,210 @@ void t_cpp_generator::generate_service_helpers(t_service* tservice) {
+@@ -1745,13 +1836,218 @@ void t_cpp_generator::generate_service_helpers(t_service* tservice) {
  }
  
  /**
@@ -497,9 +500,10 @@ index 6c04899..4e00129 100644
 +    }
 +
 +    t_service* extends_service = tservice->get_extends();
-+    if (extends_service) {
++    t_service* service_iter = extends_service;
++    while (service_iter) {
 +      // generate inherited methods
-+      vector<t_function*> functions = extends_service->get_functions();
++      vector<t_function*> functions = service_iter->get_functions();
 +      vector<t_function*>::iterator f_iter;
 +      for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
 +        string function_name = (*f_iter)->get_name();
@@ -508,6 +512,7 @@ index 6c04899..4e00129 100644
 +          "(::grpc::ClientContext* context, const " << function_name <<
 +          "Req& request, " << function_name << "Resp* response) override;" << endl;
 +      }
++      service_iter = service_iter->get_extends();
 +    }
 +
 +    f_header_ <<
@@ -521,14 +526,16 @@ index 6c04899..4e00129 100644
 +        indent() << "const ::grpc::RpcMethod rpcmethod_" << (*f_iter)->get_name() << "_;" << endl;
 +    }
 +
-+    if (extends_service) {
++    service_iter = extends_service;
++    while (service_iter) {
 +      // generate inherited methods
-+      vector<t_function*> functions = extends_service->get_functions();
++      vector<t_function*> functions = service_iter->get_functions();
 +      vector<t_function*>::iterator f_iter;
 +      for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
 +        f_header_ <<
 +          indent() << "const ::grpc::RpcMethod rpcmethod_" << (*f_iter)->get_name() << "_;" << endl;
 +      }
++      service_iter = service_iter->get_extends();
 +    }
 +
 +    indent_down();
@@ -551,9 +558,10 @@ index 6c04899..4e00129 100644
 +        service_name_ << "_method_names[" << i << "], ::grpc::RpcMethod::NORMAL_RPC, channel)" << endl;
 +    }
 +
-+    if (extends_service) {
++    service_iter = extends_service;
++    while (service_iter) {
 +      // generate inherited methods
-+      vector<t_function*> functions = extends_service->get_functions();
++      vector<t_function*> functions = service_iter->get_functions();
 +      vector<t_function*>::iterator f_iter;
 +      for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter, ++i) {
 +        f_service_ <<
@@ -561,6 +569,7 @@ index 6c04899..4e00129 100644
 +        ", rpcmethod_" << (*f_iter)->get_name() << "_(" <<
 +        service_name_ << "_method_names[" << i << "], ::grpc::RpcMethod::NORMAL_RPC, channel)" << endl;
 +      }
++      service_iter = service_iter->get_extends();
 +    }
 +    f_service_ <<
 +    indent() << "{}" << endl;
@@ -609,8 +618,9 @@ index 6c04899..4e00129 100644
 +
 +    }
 +
-+    if (extends_service) {
-+      vector<t_function*> functions = extends_service->get_functions();
++    service_iter = extends_service;
++    while (service_iter) {
++      vector<t_function*> functions = service_iter->get_functions();
 +      vector<t_function*>::iterator f_iter;
 +      for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
 +        string function_name = (*f_iter)->get_name();
@@ -631,6 +641,7 @@ index 6c04899..4e00129 100644
 +        "}" << endl;
 +
 +      }
++      service_iter = service_iter->get_extends();
 +    }
 +
 +}
@@ -648,7 +659,7 @@ index 6c04899..4e00129 100644
    if (style == "CobCl") {
      // Forward declare the client.
      string client_name = service_name_ + "CobClient";
-@@ -1764,13 +2049,15 @@ void t_cpp_generator::generate_service_interface(t_service* tservice, string sty
+@@ -1764,13 +2060,15 @@ void t_cpp_generator::generate_service_interface(t_service* tservice, string sty
    }
  
    string extends = "";
@@ -666,7 +677,7 @@ index 6c04899..4e00129 100644
    }
  
    if (style == "CobCl" && gen_templates_) {
-@@ -1778,7 +2065,9 @@ void t_cpp_generator::generate_service_interface(t_service* tservice, string sty
+@@ -1778,7 +2076,9 @@ void t_cpp_generator::generate_service_interface(t_service* tservice, string sty
    }
    f_header_ << "class " << service_if_name << extends << " {" << endl << " public:" << endl;
    indent_up();
@@ -677,7 +688,7 @@ index 6c04899..4e00129 100644
  
    vector<t_function*> functions = tservice->get_functions();
    vector<t_function*>::iterator f_iter;
-@@ -1786,7 +2075,12 @@ void t_cpp_generator::generate_service_interface(t_service* tservice, string sty
+@@ -1786,7 +2086,12 @@ void t_cpp_generator::generate_service_interface(t_service* tservice, string sty
      if ((*f_iter)->has_doc())
        f_header_ << endl;
      generate_java_doc(f_header_, *f_iter);
@@ -691,7 +702,7 @@ index 6c04899..4e00129 100644
    }
    indent_down();
    f_header_ << "};" << endl << endl;
-@@ -1797,6 +2091,66 @@ void t_cpp_generator::generate_service_interface(t_service* tservice, string sty
+@@ -1797,6 +2102,66 @@ void t_cpp_generator::generate_service_interface(t_service* tservice, string sty
      f_header_ << "typedef " << service_if_name << "< ::apache::thrift::protocol::TProtocol> "
                << service_name_ << style << "If;" << endl << endl;
    }
@@ -758,7 +769,7 @@ index 6c04899..4e00129 100644
  }
  
  /**
-@@ -3095,7 +3449,7 @@ void t_cpp_generator::generate_function_helpers(t_service* tservice, t_function*
+@@ -3095,7 +3460,7 @@ void t_cpp_generator::generate_function_helpers(t_service* tservice, t_function*
  
    std::ofstream& out = (gen_templates_ ? f_service_tcc_ : f_service_);
  
@@ -767,7 +778,7 @@ index 6c04899..4e00129 100644
    t_field success(tfunction->get_returntype(), "success", 0);
    if (!tfunction->get_returntype()->is_void()) {
      result.append(&success);
-@@ -3109,17 +3463,9 @@ void t_cpp_generator::generate_function_helpers(t_service* tservice, t_function*
+@@ -3109,17 +3474,9 @@ void t_cpp_generator::generate_function_helpers(t_service* tservice, t_function*
    }
  
    generate_struct_declaration(f_header_, &result, false);
@@ -786,7 +797,7 @@ index 6c04899..4e00129 100644
  }
  
  /**
-@@ -3162,8 +3508,8 @@ void t_cpp_generator::generate_process_function(t_service* tservice,
+@@ -3162,8 +3519,8 @@ void t_cpp_generator::generate_process_function(t_service* tservice,
          << endl;
      scope_up(out);
  
@@ -797,7 +808,7 @@ index 6c04899..4e00129 100644
  
      if (tfunction->is_oneway() && !unnamed_oprot_seqid) {
        out << indent() << "(void) seqid;" << endl << indent() << "(void) oprot;" << endl;
-@@ -3320,7 +3666,7 @@ void t_cpp_generator::generate_process_function(t_service* tservice,
+@@ -3320,7 +3677,7 @@ void t_cpp_generator::generate_process_function(t_service* tservice,
        out << indent() << "(void) seqid;" << endl << indent() << "(void) oprot;" << endl;
      }
  
@@ -806,7 +817,7 @@ index 6c04899..4e00129 100644
          << indent() << "void* ctx = NULL;" << endl << indent()
          << "if (this->eventHandler_.get() != NULL) {" << endl << indent()
          << "  ctx = this->eventHandler_->getContext(" << service_func_name << ", NULL);" << endl
-@@ -3487,7 +3833,7 @@ void t_cpp_generator::generate_process_function(t_service* tservice,
+@@ -3487,7 +3844,7 @@ void t_cpp_generator::generate_process_function(t_service* tservice,
            << "this->eventHandler_.get(), ctx, " << service_func_name << ");" << endl << endl;
  
        // Throw the TDelayedException, and catch the result
@@ -1475,7 +1486,7 @@ index 0000000..de3c9a4
 2.8.0.rc3.226.g39d4020
 
 
-From f991f33dd6461eae197b6ad0e7088b571f2a7b22 Mon Sep 17 00:00:00 2001
+From 3e4d75a2e2c474ee7700e7c9acaf89fdb768bedc Mon Sep 17 00:00:00 2001
 From: chedeti <chedeti@google.com>
 Date: Sun, 31 Jul 2016 16:23:53 -0700
 Subject: [PATCH 3/3] grpc java plugins generator
-- 
GitLab