| 
					
				 | 
			
			
				@@ -31,6 +31,15 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 #include <unordered_set> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 #include <vector> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+using ::google::protobuf::FileDescriptor; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+using ::google::protobuf::compiler::CodeGenerator; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+using ::google::protobuf::compiler::DiskSourceTree; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+using ::google::protobuf::compiler::GeneratorContext; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+using ::google::protobuf::compiler::Importer; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+using ::google::protobuf::compiler::MultiFileErrorCollector; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+using ::google::protobuf::io::StringOutputStream; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+using ::google::protobuf::io::ZeroCopyOutputStream; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 namespace grpc_tools { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 int protoc_main(int argc, char* argv[]) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   google::protobuf::compiler::CommandLineInterface cli; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -52,31 +61,26 @@ int protoc_main(int argc, char* argv[]) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 namespace internal { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-class GeneratorContextImpl 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    : public ::google::protobuf::compiler::GeneratorContext { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+class GeneratorContextImpl : public GeneratorContext { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  public: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   GeneratorContextImpl( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      const std::vector<const ::google::protobuf::FileDescriptor*>& 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          parsed_files, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      const std::vector<const FileDescriptor*>& parsed_files, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       std::vector<std::pair<std::string, std::string>>* files_out) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       : files_(files_out), parsed_files_(parsed_files) {} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  ::google::protobuf::io::ZeroCopyOutputStream* Open( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      const std::string& filename) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  ZeroCopyOutputStream* Open(const std::string& filename) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     files_->emplace_back(filename, ""); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    return new ::google::protobuf::io::StringOutputStream( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        &(files_->back().second)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    return new StringOutputStream(&(files_->back().second)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   // NOTE(rbellevi): Equivalent to Open, since all files start out empty. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  ::google::protobuf::io::ZeroCopyOutputStream* OpenForAppend( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      const std::string& filename) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  ZeroCopyOutputStream* OpenForAppend(const std::string& filename) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     return Open(filename); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   // NOTE(rbellevi): Equivalent to Open, since all files start out empty. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  ::google::protobuf::io::ZeroCopyOutputStream* OpenForInsert( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      const std::string& filename, const std::string& insertion_point) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  ZeroCopyOutputStream* OpenForInsert(const std::string& filename, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                      const std::string& insertion_point) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     return Open(filename); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -87,11 +91,10 @@ class GeneratorContextImpl 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  private: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   std::vector<std::pair<std::string, std::string>>* files_; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  const std::vector<const ::google::protobuf::FileDescriptor*>& parsed_files_; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  const std::vector<const FileDescriptor*>& parsed_files_; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-class ErrorCollectorImpl 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    : public ::google::protobuf::compiler::MultiFileErrorCollector { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+class ErrorCollectorImpl : public MultiFileErrorCollector { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  public: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   ErrorCollectorImpl(std::vector<::grpc_tools::ProtocError>* errors, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                      std::vector<::grpc_tools::ProtocWarning>* warnings) 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -113,12 +116,11 @@ class ErrorCollectorImpl 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 static void calculate_transitive_closure( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    const ::google::protobuf::FileDescriptor* descriptor, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    std::vector<const ::google::protobuf::FileDescriptor*>* transitive_closure, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    const FileDescriptor* descriptor, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    std::vector<const FileDescriptor*>* transitive_closure, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     std::unordered_set<const ::google::protobuf::FileDescriptor*>* visited) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   for (int i = 0; i < descriptor->dependency_count(); ++i) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    const ::google::protobuf::FileDescriptor* dependency = 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        descriptor->dependency(i); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    const FileDescriptor* dependency = descriptor->dependency(i); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     if (visited->find(dependency) == visited->end()) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       calculate_transitive_closure(dependency, transitive_closure, visited); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -130,27 +132,24 @@ static void calculate_transitive_closure( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 }  // end namespace internal 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 static int generate_code( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    ::google::protobuf::compiler::CodeGenerator* code_generator, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    char* protobuf_path, const std::vector<std::string>* include_paths, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    CodeGenerator* code_generator, char* protobuf_path, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    const std::vector<std::string>* include_paths, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     std::vector<std::pair<std::string, std::string>>* files_out, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     std::vector<::grpc_tools::ProtocError>* errors, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     std::vector<::grpc_tools::ProtocWarning>* warnings) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   std::unique_ptr<internal::ErrorCollectorImpl> error_collector( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       new internal::ErrorCollectorImpl(errors, warnings)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  std::unique_ptr<::google::protobuf::compiler::DiskSourceTree> source_tree( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      new ::google::protobuf::compiler::DiskSourceTree()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  std::unique_ptr<DiskSourceTree> source_tree(new DiskSourceTree()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   for (const auto& include_path : *include_paths) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     source_tree->MapPath("", include_path); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  ::google::protobuf::compiler::Importer importer(source_tree.get(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                                  error_collector.get()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  const ::google::protobuf::FileDescriptor* parsed_file = 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      importer.Import(protobuf_path); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  Importer importer(source_tree.get(), error_collector.get()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  const FileDescriptor* parsed_file = importer.Import(protobuf_path); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   if (parsed_file == nullptr) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     return 1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  std::vector<const ::google::protobuf::FileDescriptor*> transitive_closure; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  std::unordered_set<const ::google::protobuf::FileDescriptor*> visited; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  std::vector<const FileDescriptor*> transitive_closure; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  std::unordered_set<const FileDescriptor*> visited; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   internal::calculate_transitive_closure(parsed_file, &transitive_closure, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                          &visited); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   internal::GeneratorContextImpl generator_context(transitive_closure, 
			 |