From de25f189fe7a94b1c3e1a0d9e68e2f2b3b03f749 Mon Sep 17 00:00:00 2001 From: yang-g Date: Wed, 27 Mar 2019 17:12:50 -0700 Subject: [PATCH 1/3] Add options to support alternative extension for include files --- src/compiler/cpp_generator.cc | 38 +++++++++++++++++++++++++++------ src/compiler/cpp_generator.h | 4 ++++ src/compiler/cpp_plugin.cc | 10 +++++++++ src/compiler/protobuf_plugin.h | 9 ++++++++ src/compiler/schema_interface.h | 1 + 5 files changed, 56 insertions(+), 6 deletions(-) diff --git a/src/compiler/cpp_generator.cc b/src/compiler/cpp_generator.cc index 96e9ab8dcfb..96f5518e460 100644 --- a/src/compiler/cpp_generator.cc +++ b/src/compiler/cpp_generator.cc @@ -84,7 +84,7 @@ void PrintIncludes(grpc_generator::Printer* printer, } grpc::string GetHeaderPrologue(grpc_generator::File* file, - const Parameters& /*params*/) { + const Parameters& params) { grpc::string output; { // Scope the output stream so it closes and finalizes output to the string. @@ -94,7 +94,9 @@ grpc::string GetHeaderPrologue(grpc_generator::File* file, vars["filename"] = file->filename(); vars["filename_identifier"] = FilenameIdentifier(file->filename()); vars["filename_base"] = file->filename_without_ext(); - vars["message_header_ext"] = kCppGeneratorMessageHeaderExt; + vars["message_header_ext"] = params.message_header_extension.empty() + ? kCppGeneratorMessageHeaderExt + : params.message_header_extension; printer->Print(vars, "// Generated by the gRPC C++ plugin.\n"); printer->Print(vars, @@ -1556,7 +1558,7 @@ grpc::string GetHeaderEpilogue(grpc_generator::File* file, } grpc::string GetSourcePrologue(grpc_generator::File* file, - const Parameters& /*params*/) { + const Parameters& params) { grpc::string output; { // Scope the output stream so it closes and finalizes output to the string. @@ -1565,7 +1567,9 @@ grpc::string GetSourcePrologue(grpc_generator::File* file, vars["filename"] = file->filename(); vars["filename_base"] = file->filename_without_ext(); - vars["message_header_ext"] = kCppGeneratorMessageHeaderExt; + vars["message_header_ext"] = params.message_header_extension.empty() + ? kCppGeneratorMessageHeaderExt + : params.message_header_extension; vars["service_header_ext"] = kCppGeneratorServiceHeaderExt; printer->Print(vars, "// Generated by the gRPC C++ plugin.\n"); @@ -1580,6 +1584,13 @@ grpc::string GetSourcePrologue(grpc_generator::File* file, return output; } +// Convert from "a/b/c.proto" to "#include \"a/b/c$message_header_ext$\"\n" +grpc::string ImportInludeFromProtoName(const grpc::string& proto_name) { + return grpc::string("#include \"") + + proto_name.substr(0, proto_name.size() - 6) + + grpc::string("$message_header_ext$\"\n"); +} + grpc::string GetSourceIncludes(grpc_generator::File* file, const Parameters& params) { grpc::string output; @@ -1587,6 +1598,19 @@ grpc::string GetSourceIncludes(grpc_generator::File* file, // Scope the output stream so it closes and finalizes output to the string. auto printer = file->CreatePrinter(&output); std::map vars; + vars["message_header_ext"] = params.message_header_extension.empty() + ? kCppGeneratorMessageHeaderExt + : params.message_header_extension; + + if (params.include_import_headers) { + const std::vector import_names = file->GetImportNames(); + for (const auto& import_name : import_names) { + const grpc::string include_name = + ImportInludeFromProtoName(import_name); + printer->Print(vars, include_name.c_str()); + } + printer->PrintRaw("\n"); + } static const char* headers_strs[] = { "functional", @@ -2046,7 +2070,7 @@ grpc::string GetSourceEpilogue(grpc_generator::File* file, // TODO(mmukhi): Make sure we need parameters or not. grpc::string GetMockPrologue(grpc_generator::File* file, - const Parameters& /*params*/) { + const Parameters& params) { grpc::string output; { // Scope the output stream so it closes and finalizes output to the string. @@ -2055,7 +2079,9 @@ grpc::string GetMockPrologue(grpc_generator::File* file, vars["filename"] = file->filename(); vars["filename_base"] = file->filename_without_ext(); - vars["message_header_ext"] = kCppGeneratorMessageHeaderExt; + vars["message_header_ext"] = params.message_header_extension.empty() + ? kCppGeneratorMessageHeaderExt + : params.message_header_extension; vars["service_header_ext"] = kCppGeneratorServiceHeaderExt; printer->Print(vars, "// Generated by the gRPC C++ plugin.\n"); diff --git a/src/compiler/cpp_generator.h b/src/compiler/cpp_generator.h index d88ef75c987..c1d64e61d7b 100644 --- a/src/compiler/cpp_generator.h +++ b/src/compiler/cpp_generator.h @@ -56,6 +56,10 @@ struct Parameters { grpc::string gmock_search_path; // *EXPERIMENTAL* Additional include files in grpc.pb.h std::vector additional_header_includes; + // By default, use "pb.h" + grpc::string message_header_extension; + // Whether to include headers corresponding to imports in source file. + bool include_import_headers; }; // Return the prologue of the generated header file. diff --git a/src/compiler/cpp_plugin.cc b/src/compiler/cpp_plugin.cc index c8ab78863bf..3c09b6feb24 100644 --- a/src/compiler/cpp_plugin.cc +++ b/src/compiler/cpp_plugin.cc @@ -48,6 +48,7 @@ class CppGrpcGenerator : public grpc::protobuf::compiler::CodeGenerator { grpc_cpp_generator::Parameters generator_parameters; generator_parameters.use_system_headers = true; generator_parameters.generate_mock_code = false; + generator_parameters.include_import_headers = false; ProtoBufFile pbfile(file); @@ -83,6 +84,15 @@ class CppGrpcGenerator : public grpc::protobuf::compiler::CodeGenerator { } else if (param[0] == "additional_header_includes") { generator_parameters.additional_header_includes = grpc_generator::tokenize(param[1], ":"); + } else if (param[0] == "message_header_extension") { + generator_parameters.message_header_extension = param[1]; + } else if (param[0] == "include_import_headers") { + if (param[1] == "true") { + generator_parameters.include_import_headers = true; + } else if (param[1] != "false") { + *error = grpc::string("Invalid parameter: ") + *parameter_string; + return false; + } } else { *error = grpc::string("Unknown parameter: ") + *parameter_string; return false; diff --git a/src/compiler/protobuf_plugin.h b/src/compiler/protobuf_plugin.h index a3e448aa89d..a20e263e542 100644 --- a/src/compiler/protobuf_plugin.h +++ b/src/compiler/protobuf_plugin.h @@ -189,6 +189,15 @@ class ProtoBufFile : public grpc_generator::File { return grpc_python_generator::get_all_comments(file_); } + vector GetImportNames() const { + vector proto_names; + for (int i = 0; i < file_->dependency_count(); ++i) { + const auto& dep = *file_->dependency(i); + proto_names.push_back(dep.name()); + } + return proto_names; + } + private: const grpc::protobuf::FileDescriptor* file_; }; diff --git a/src/compiler/schema_interface.h b/src/compiler/schema_interface.h index c000478e681..cac131b1190 100644 --- a/src/compiler/schema_interface.h +++ b/src/compiler/schema_interface.h @@ -101,6 +101,7 @@ struct File : public CommentHolder { virtual grpc::string package() const = 0; virtual std::vector package_parts() const = 0; virtual grpc::string additional_headers() const = 0; + virtual std::vector GetImportNames() const { return {}; } virtual int service_count() const = 0; virtual std::unique_ptr service(int i) const = 0; From b650110b3546696e0fdb532d2afe20de54517a7c Mon Sep 17 00:00:00 2001 From: yang-g Date: Thu, 28 Mar 2019 15:45:15 -0700 Subject: [PATCH 2/3] Add headers for mock header as well. --- src/compiler/cpp_generator.cc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/compiler/cpp_generator.cc b/src/compiler/cpp_generator.cc index 96f5518e460..d32f2662dc5 100644 --- a/src/compiler/cpp_generator.cc +++ b/src/compiler/cpp_generator.cc @@ -2091,6 +2091,15 @@ grpc::string GetMockPrologue(grpc_generator::File* file, printer->Print(vars, "#include \"$filename_base$$message_header_ext$\"\n"); printer->Print(vars, "#include \"$filename_base$$service_header_ext$\"\n"); + if (params.include_import_headers) { + const std::vector import_names = file->GetImportNames(); + for (const auto& import_name : import_names) { + const grpc::string include_name = + ImportInludeFromProtoName(import_name); + printer->Print(vars, include_name.c_str()); + } + printer->PrintRaw("\n"); + } printer->Print(vars, file->additional_headers().c_str()); printer->Print(vars, "\n"); } From 1da6fad8431d41ffab33adc3cec6428e3746a455 Mon Sep 17 00:00:00 2001 From: yang-g Date: Tue, 2 Apr 2019 10:41:53 -0700 Subject: [PATCH 3/3] Move import headers to header from source --- src/compiler/cpp_generator.cc | 42 +++++++++++++++++------------------ 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/src/compiler/cpp_generator.cc b/src/compiler/cpp_generator.cc index d32f2662dc5..1bb9c509bb5 100644 --- a/src/compiler/cpp_generator.cc +++ b/src/compiler/cpp_generator.cc @@ -117,6 +117,13 @@ grpc::string GetHeaderPrologue(grpc_generator::File* file, return output; } +// Convert from "a/b/c.proto" to "#include \"a/b/c$message_header_ext$\"\n" +grpc::string ImportInludeFromProtoName(const grpc::string& proto_name) { + return grpc::string("#include \"") + + proto_name.substr(0, proto_name.size() - 6) + + grpc::string("$message_header_ext$\"\n"); +} + grpc::string GetHeaderIncludes(grpc_generator::File* file, const Parameters& params) { grpc::string output; @@ -154,6 +161,20 @@ grpc::string GetHeaderIncludes(grpc_generator::File* file, printer->Print(vars, "class ServerContext;\n"); printer->Print(vars, "} // namespace grpc\n\n"); + vars["message_header_ext"] = params.message_header_extension.empty() + ? kCppGeneratorMessageHeaderExt + : params.message_header_extension; + + if (params.include_import_headers) { + const std::vector import_names = file->GetImportNames(); + for (const auto& import_name : import_names) { + const grpc::string include_name = + ImportInludeFromProtoName(import_name); + printer->Print(vars, include_name.c_str()); + } + printer->PrintRaw("\n"); + } + if (!file->package().empty()) { std::vector parts = file->package_parts(); @@ -1584,13 +1605,6 @@ grpc::string GetSourcePrologue(grpc_generator::File* file, return output; } -// Convert from "a/b/c.proto" to "#include \"a/b/c$message_header_ext$\"\n" -grpc::string ImportInludeFromProtoName(const grpc::string& proto_name) { - return grpc::string("#include \"") + - proto_name.substr(0, proto_name.size() - 6) + - grpc::string("$message_header_ext$\"\n"); -} - grpc::string GetSourceIncludes(grpc_generator::File* file, const Parameters& params) { grpc::string output; @@ -1598,20 +1612,6 @@ grpc::string GetSourceIncludes(grpc_generator::File* file, // Scope the output stream so it closes and finalizes output to the string. auto printer = file->CreatePrinter(&output); std::map vars; - vars["message_header_ext"] = params.message_header_extension.empty() - ? kCppGeneratorMessageHeaderExt - : params.message_header_extension; - - if (params.include_import_headers) { - const std::vector import_names = file->GetImportNames(); - for (const auto& import_name : import_names) { - const grpc::string include_name = - ImportInludeFromProtoName(import_name); - printer->Print(vars, include_name.c_str()); - } - printer->PrintRaw("\n"); - } - static const char* headers_strs[] = { "functional", "grpcpp/impl/codegen/async_stream.h",