|  | @@ -70,6 +70,10 @@ namespace grpc_python_generator {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  namespace {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +typedef vector<const Descriptor*> DescriptorVector;
 | 
	
		
			
				|  |  | +typedef map<grpc::string, grpc::string> StringMap;
 | 
	
		
			
				|  |  | +typedef vector<grpc::string> StringVector;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  // Provides RAII indentation handling. Use as:
 | 
	
		
			
				|  |  |  // {
 | 
	
		
			
				|  |  |  //   IndentScope raii_my_indent_var_name_here(my_py_printer);
 | 
	
	
		
			
				|  | @@ -168,7 +172,7 @@ PrivateGenerator::PrivateGenerator(const GeneratorConfiguration& config,
 | 
	
		
			
				|  |  |  bool PrivateGenerator::GetModuleAndMessagePath(const Descriptor* type,
 | 
	
		
			
				|  |  |                                                 grpc::string* out) {
 | 
	
		
			
				|  |  |    const Descriptor* path_elem_type = type;
 | 
	
		
			
				|  |  | -  vector<const Descriptor*> message_path;
 | 
	
		
			
				|  |  | +  DescriptorVector message_path;
 | 
	
		
			
				|  |  |    do {
 | 
	
		
			
				|  |  |      message_path.push_back(path_elem_type);
 | 
	
		
			
				|  |  |      path_elem_type = path_elem_type->containing_type();
 | 
	
	
		
			
				|  | @@ -187,7 +191,8 @@ bool PrivateGenerator::GetModuleAndMessagePath(const Descriptor* type,
 | 
	
		
			
				|  |  |      module = "";
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |    grpc::string message_type;
 | 
	
		
			
				|  |  | -  for (auto path_iter = message_path.rbegin(); path_iter != message_path.rend();
 | 
	
		
			
				|  |  | +  for (DescriptorVector::reverse_iterator path_iter = message_path.rbegin();
 | 
	
		
			
				|  |  | +       path_iter != message_path.rend();
 | 
	
		
			
				|  |  |         ++path_iter) {
 | 
	
		
			
				|  |  |      message_type += (*path_iter)->name() + ".";
 | 
	
		
			
				|  |  |    }
 | 
	
	
		
			
				|  | @@ -199,7 +204,7 @@ bool PrivateGenerator::GetModuleAndMessagePath(const Descriptor* type,
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  template <typename DescriptorType>
 | 
	
		
			
				|  |  |  void PrivateGenerator::PrintAllComments(const DescriptorType* descriptor) {
 | 
	
		
			
				|  |  | -  vector<grpc::string> comments;
 | 
	
		
			
				|  |  | +  StringVector comments;
 | 
	
		
			
				|  |  |    grpc_generator::GetComment(descriptor, grpc_generator::COMMENTTYPE_LEADING_DETACHED,
 | 
	
		
			
				|  |  |                               &comments);
 | 
	
		
			
				|  |  |    grpc_generator::GetComment(descriptor, grpc_generator::COMMENTTYPE_LEADING,
 | 
	
	
		
			
				|  | @@ -210,7 +215,7 @@ void PrivateGenerator::PrintAllComments(const DescriptorType* descriptor) {
 | 
	
		
			
				|  |  |      return;
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |    out->Print("\"\"\"");
 | 
	
		
			
				|  |  | -  for (auto it = comments.begin(); it != comments.end(); ++it) {
 | 
	
		
			
				|  |  | +  for (StringVector::iterator it = comments.begin(); it != comments.end(); ++it) {
 | 
	
		
			
				|  |  |      size_t start_pos = it->find_first_not_of(' ');
 | 
	
		
			
				|  |  |      if (start_pos != grpc::string::npos) {
 | 
	
		
			
				|  |  |        out->Print(it->c_str() + start_pos);
 | 
	
	
		
			
				|  | @@ -235,14 +240,14 @@ bool PrivateGenerator::PrintBetaServicer(const ServiceDescriptor* service) {
 | 
	
		
			
				|  |  |          "grpcio>=0.15.0.\"\"\"\n");
 | 
	
		
			
				|  |  |      PrintAllComments(service);
 | 
	
		
			
				|  |  |      for (int i = 0; i < service->method_count(); ++i) {
 | 
	
		
			
				|  |  | -      auto meth = service->method(i);
 | 
	
		
			
				|  |  | +      const MethodDescriptor *method = service->method(i);
 | 
	
		
			
				|  |  |        grpc::string arg_name =
 | 
	
		
			
				|  |  | -          meth->client_streaming() ? "request_iterator" : "request";
 | 
	
		
			
				|  |  | +          method->client_streaming() ? "request_iterator" : "request";
 | 
	
		
			
				|  |  |        out->Print("def $Method$(self, $ArgName$, context):\n", "Method",
 | 
	
		
			
				|  |  | -                 meth->name(), "ArgName", arg_name);
 | 
	
		
			
				|  |  | +                 method->name(), "ArgName", arg_name);
 | 
	
		
			
				|  |  |        {
 | 
	
		
			
				|  |  |          IndentScope raii_method_indent(out);
 | 
	
		
			
				|  |  | -        PrintAllComments(meth);
 | 
	
		
			
				|  |  | +        PrintAllComments(method);
 | 
	
		
			
				|  |  |          out->Print("context.code(beta_interfaces.StatusCode.UNIMPLEMENTED)\n");
 | 
	
		
			
				|  |  |        }
 | 
	
		
			
				|  |  |      }
 | 
	
	
		
			
				|  | @@ -264,22 +269,22 @@ bool PrivateGenerator::PrintBetaStub(const ServiceDescriptor* service) {
 | 
	
		
			
				|  |  |          "grpcio>=0.15.0.\"\"\"\n");
 | 
	
		
			
				|  |  |      PrintAllComments(service);
 | 
	
		
			
				|  |  |      for (int i = 0; i < service->method_count(); ++i) {
 | 
	
		
			
				|  |  | -      const MethodDescriptor* meth = service->method(i);
 | 
	
		
			
				|  |  | +      const MethodDescriptor* method = service->method(i);
 | 
	
		
			
				|  |  |        grpc::string arg_name =
 | 
	
		
			
				|  |  | -          meth->client_streaming() ? "request_iterator" : "request";
 | 
	
		
			
				|  |  | -      auto methdict;
 | 
	
		
			
				|  |  | -      methdict["Method"] = meth->name();
 | 
	
		
			
				|  |  | -      methdict["ArgName"] = arg_name;
 | 
	
		
			
				|  |  | -      out->Print(methdict,
 | 
	
		
			
				|  |  | +          method->client_streaming() ? "request_iterator" : "request";
 | 
	
		
			
				|  |  | +      StringMap method_dict;
 | 
	
		
			
				|  |  | +      method_dict["Method"] = method->name();
 | 
	
		
			
				|  |  | +      method_dict["ArgName"] = arg_name;
 | 
	
		
			
				|  |  | +      out->Print(method_dict,
 | 
	
		
			
				|  |  |                   "def $Method$(self, $ArgName$, timeout, metadata=None, "
 | 
	
		
			
				|  |  |                   "with_call=False, protocol_options=None):\n");
 | 
	
		
			
				|  |  |        {
 | 
	
		
			
				|  |  |          IndentScope raii_method_indent(out);
 | 
	
		
			
				|  |  | -        PrintAllComments(meth);
 | 
	
		
			
				|  |  | +        PrintAllComments(method);
 | 
	
		
			
				|  |  |          out->Print("raise NotImplementedError()\n");
 | 
	
		
			
				|  |  |        }
 | 
	
		
			
				|  |  | -      if (!meth->server_streaming()) {
 | 
	
		
			
				|  |  | -        out->Print(methdict, "$Method$.future = None\n");
 | 
	
		
			
				|  |  | +      if (!method->server_streaming()) {
 | 
	
		
			
				|  |  | +        out->Print(method_dict, "$Method$.future = None\n");
 | 
	
		
			
				|  |  |        }
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |    }
 | 
	
	
		
			
				|  | @@ -302,9 +307,9 @@ bool PrivateGenerator::PrintBetaServerFactory(
 | 
	
		
			
				|  |  |          "file not marked beta) for all further purposes. This function was\n"
 | 
	
		
			
				|  |  |          "generated only to ease transition from grpcio<0.15.0 to grpcio>=0.15.0"
 | 
	
		
			
				|  |  |          "\"\"\"\n");
 | 
	
		
			
				|  |  | -    map<grpc::string, grpc::string> method_implementation_constructors;
 | 
	
		
			
				|  |  | -    map<grpc::string, grpc::string> input_message_modules_and_classes;
 | 
	
		
			
				|  |  | -    map<grpc::string, grpc::string> output_message_modules_and_classes;
 | 
	
		
			
				|  |  | +    StringMap method_implementation_constructors;
 | 
	
		
			
				|  |  | +    StringMap input_message_modules_and_classes;
 | 
	
		
			
				|  |  | +    StringMap output_message_modules_and_classes;
 | 
	
		
			
				|  |  |      for (int i = 0; i < service->method_count(); ++i) {
 | 
	
		
			
				|  |  |        const MethodDescriptor* method = service->method(i);
 | 
	
		
			
				|  |  |        const grpc::string method_implementation_constructor =
 | 
	
	
		
			
				|  | @@ -329,7 +334,7 @@ bool PrivateGenerator::PrintBetaServerFactory(
 | 
	
		
			
				|  |  |            make_pair(method->name(), output_message_module_and_class));
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |      out->Print("request_deserializers = {\n");
 | 
	
		
			
				|  |  | -    for (auto name_and_input_module_class_pair =
 | 
	
		
			
				|  |  | +    for (StringMap::iterator name_and_input_module_class_pair =
 | 
	
		
			
				|  |  |               input_message_modules_and_classes.begin();
 | 
	
		
			
				|  |  |           name_and_input_module_class_pair !=
 | 
	
		
			
				|  |  |           input_message_modules_and_classes.end();
 | 
	
	
		
			
				|  | @@ -344,7 +349,7 @@ bool PrivateGenerator::PrintBetaServerFactory(
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |      out->Print("}\n");
 | 
	
		
			
				|  |  |      out->Print("response_serializers = {\n");
 | 
	
		
			
				|  |  | -    for (auto name_and_output_module_class_pair =
 | 
	
		
			
				|  |  | +    for (StringMap::iterator name_and_output_module_class_pair =
 | 
	
		
			
				|  |  |               output_message_modules_and_classes.begin();
 | 
	
		
			
				|  |  |           name_and_output_module_class_pair !=
 | 
	
		
			
				|  |  |           output_message_modules_and_classes.end();
 | 
	
	
		
			
				|  | @@ -360,7 +365,7 @@ bool PrivateGenerator::PrintBetaServerFactory(
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |      out->Print("}\n");
 | 
	
		
			
				|  |  |      out->Print("method_implementations = {\n");
 | 
	
		
			
				|  |  | -    for (auto name_and_implementation_constructor =
 | 
	
		
			
				|  |  | +    for (StringMap::iterator name_and_implementation_constructor =
 | 
	
		
			
				|  |  |               method_implementation_constructors.begin();
 | 
	
		
			
				|  |  |           name_and_implementation_constructor !=
 | 
	
		
			
				|  |  |           method_implementation_constructors.end();
 | 
	
	
		
			
				|  | @@ -393,7 +398,7 @@ bool PrivateGenerator::PrintBetaServerFactory(
 | 
	
		
			
				|  |  |  bool PrivateGenerator::PrintBetaStubFactory(
 | 
	
		
			
				|  |  |      const grpc::string& package_qualified_service_name,
 | 
	
		
			
				|  |  |      const ServiceDescriptor* service) {
 | 
	
		
			
				|  |  | -  map<grpc::string, grpc::string> dict;
 | 
	
		
			
				|  |  | +  StringMap dict;
 | 
	
		
			
				|  |  |    dict["Service"] = service->name();
 | 
	
		
			
				|  |  |    out->Print("\n\n");
 | 
	
		
			
				|  |  |    out->Print(dict,
 | 
	
	
		
			
				|  | @@ -407,9 +412,9 @@ bool PrivateGenerator::PrintBetaStubFactory(
 | 
	
		
			
				|  |  |          "file not marked beta) for all further purposes. This function was\n"
 | 
	
		
			
				|  |  |          "generated only to ease transition from grpcio<0.15.0 to grpcio>=0.15.0"
 | 
	
		
			
				|  |  |          "\"\"\"\n");
 | 
	
		
			
				|  |  | -    map<grpc::string, grpc::string> method_cardinalities;
 | 
	
		
			
				|  |  | -    map<grpc::string, grpc::string> input_message_modules_and_classes;
 | 
	
		
			
				|  |  | -    map<grpc::string, grpc::string> output_message_modules_and_classes;
 | 
	
		
			
				|  |  | +    StringMap method_cardinalities;
 | 
	
		
			
				|  |  | +    StringMap input_message_modules_and_classes;
 | 
	
		
			
				|  |  | +    StringMap output_message_modules_and_classes;
 | 
	
		
			
				|  |  |      for (int i = 0; i < service->method_count(); ++i) {
 | 
	
		
			
				|  |  |        const MethodDescriptor* method = service->method(i);
 | 
	
		
			
				|  |  |        const grpc::string method_cardinality =
 | 
	
	
		
			
				|  | @@ -433,7 +438,7 @@ bool PrivateGenerator::PrintBetaStubFactory(
 | 
	
		
			
				|  |  |            make_pair(method->name(), output_message_module_and_class));
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |      out->Print("request_serializers = {\n");
 | 
	
		
			
				|  |  | -    for (auto name_and_input_module_class_pair =
 | 
	
		
			
				|  |  | +    for (StringMap::iterator name_and_input_module_class_pair =
 | 
	
		
			
				|  |  |               input_message_modules_and_classes.begin();
 | 
	
		
			
				|  |  |           name_and_input_module_class_pair !=
 | 
	
		
			
				|  |  |           input_message_modules_and_classes.end();
 | 
	
	
		
			
				|  | @@ -448,7 +453,7 @@ bool PrivateGenerator::PrintBetaStubFactory(
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |      out->Print("}\n");
 | 
	
		
			
				|  |  |      out->Print("response_deserializers = {\n");
 | 
	
		
			
				|  |  | -    for (auto name_and_output_module_class_pair =
 | 
	
		
			
				|  |  | +    for (StringMap::iterator name_and_output_module_class_pair =
 | 
	
		
			
				|  |  |               output_message_modules_and_classes.begin();
 | 
	
		
			
				|  |  |           name_and_output_module_class_pair !=
 | 
	
		
			
				|  |  |           output_message_modules_and_classes.end();
 | 
	
	
		
			
				|  | @@ -464,7 +469,7 @@ bool PrivateGenerator::PrintBetaStubFactory(
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |      out->Print("}\n");
 | 
	
		
			
				|  |  |      out->Print("cardinalities = {\n");
 | 
	
		
			
				|  |  | -    for (auto name_and_cardinality = method_cardinalities.begin();
 | 
	
		
			
				|  |  | +    for (StringMap::iterator name_and_cardinality = method_cardinalities.begin();
 | 
	
		
			
				|  |  |           name_and_cardinality != method_cardinalities.end();
 | 
	
		
			
				|  |  |           name_and_cardinality++) {
 | 
	
		
			
				|  |  |        IndentScope raii_descriptions_indent(out);
 | 
	
	
		
			
				|  | @@ -508,8 +513,8 @@ bool PrivateGenerator::PrintStub(const grpc::string& package_qualified_service_n
 | 
	
		
			
				|  |  |        }
 | 
	
		
			
				|  |  |        out->Print("\"\"\"\n");
 | 
	
		
			
				|  |  |        for (int i = 0; i < service->method_count(); ++i) {
 | 
	
		
			
				|  |  | -        auto method = service->method(i);
 | 
	
		
			
				|  |  | -        auto multi_callable_constructor =
 | 
	
		
			
				|  |  | +        const MethodDescriptor *method = service->method(i);
 | 
	
		
			
				|  |  | +        grpc::string multi_callable_constructor =
 | 
	
		
			
				|  |  |              grpc::string(method->client_streaming() ? "stream" : "unary") +
 | 
	
		
			
				|  |  |              "_" + grpc::string(method->server_streaming() ? "stream" : "unary");
 | 
	
		
			
				|  |  |          grpc::string request_module_and_class;
 | 
	
	
		
			
				|  | @@ -552,7 +557,7 @@ bool PrivateGenerator::PrintServicer(const ServiceDescriptor* service) {
 | 
	
		
			
				|  |  |      IndentScope raii_class_indent(out);
 | 
	
		
			
				|  |  |      PrintAllComments(service);
 | 
	
		
			
				|  |  |      for (int i = 0; i < service->method_count(); ++i) {
 | 
	
		
			
				|  |  | -      auto method = service->method(i);
 | 
	
		
			
				|  |  | +      const MethodDescriptor *method = service->method(i);
 | 
	
		
			
				|  |  |        grpc::string arg_name =
 | 
	
		
			
				|  |  |            method->client_streaming() ? "request_iterator" : "request";
 | 
	
		
			
				|  |  |        out->Print("\n");
 | 
	
	
		
			
				|  | @@ -583,8 +588,8 @@ bool PrivateGenerator::PrintAddServicerToServer(
 | 
	
		
			
				|  |  |        IndentScope raii_dict_first_indent(out);
 | 
	
		
			
				|  |  |        IndentScope raii_dict_second_indent(out);
 | 
	
		
			
				|  |  |        for (int i = 0; i < service->method_count(); ++i) {
 | 
	
		
			
				|  |  | -        auto method = service->method(i);
 | 
	
		
			
				|  |  | -        auto method_handler_constructor =
 | 
	
		
			
				|  |  | +        const MethodDescriptor *method = service->method(i);
 | 
	
		
			
				|  |  | +        grpc::string method_handler_constructor =
 | 
	
		
			
				|  |  |              grpc::string(method->client_streaming() ? "stream" : "unary") +
 | 
	
		
			
				|  |  |              "_" +
 | 
	
		
			
				|  |  |              grpc::string(method->server_streaming() ? "stream" : "unary") +
 | 
	
	
		
			
				|  | @@ -649,7 +654,7 @@ bool PrivateGenerator::PrintPreamble() {
 | 
	
		
			
				|  |  |      for (int i = 0; i < file->service_count(); ++i) {
 | 
	
		
			
				|  |  |        const ServiceDescriptor *service = file->service(i);
 | 
	
		
			
				|  |  |        for (int j = 0; j < service->method_count(); ++j) {
 | 
	
		
			
				|  |  | -        auto method = service->method(j);
 | 
	
		
			
				|  |  | +        const MethodDescriptor *method = service->method(j);
 | 
	
		
			
				|  |  |          const Descriptor *types[2] = {method->input_type(), method->output_type()};
 | 
	
		
			
				|  |  |          for (int k = 0; k < 2; ++k) {
 | 
	
		
			
				|  |  |            const Descriptor *type = types[k];
 |