| Index: third_party/protobuf/src/google/protobuf/compiler/plugin.cc
|
| diff --git a/third_party/protobuf/src/google/protobuf/compiler/plugin.cc b/third_party/protobuf/src/google/protobuf/compiler/plugin.cc
|
| index 2bebf1f3ad8b8e4e7f0909a1f8bad6c47b5e2fe4..2ff50f61f47a8dde1796dbd6f1d7372ba1775b85 100644
|
| --- a/third_party/protobuf/src/google/protobuf/compiler/plugin.cc
|
| +++ b/third_party/protobuf/src/google/protobuf/compiler/plugin.cc
|
| @@ -93,31 +93,15 @@ class GeneratorResponseContext : public GeneratorContext {
|
| const vector<const FileDescriptor*>& parsed_files_;
|
| };
|
|
|
| -int PluginMain(int argc, char* argv[], const CodeGenerator* generator) {
|
| -
|
| - if (argc > 1) {
|
| - std::cerr << argv[0] << ": Unknown option: " << argv[1] << std::endl;
|
| - return 1;
|
| - }
|
| -
|
| -#ifdef _WIN32
|
| - _setmode(STDIN_FILENO, _O_BINARY);
|
| - _setmode(STDOUT_FILENO, _O_BINARY);
|
| -#endif
|
| -
|
| - CodeGeneratorRequest request;
|
| - if (!request.ParseFromFileDescriptor(STDIN_FILENO)) {
|
| - std::cerr << argv[0] << ": protoc sent unparseable request to plugin."
|
| - << std::endl;
|
| - return 1;
|
| - }
|
| -
|
| +bool GenerateCode(const CodeGeneratorRequest& request,
|
| + const CodeGenerator& generator, CodeGeneratorResponse* response,
|
| + string* error_msg) {
|
| DescriptorPool pool;
|
| for (int i = 0; i < request.proto_file_size(); i++) {
|
| const FileDescriptor* file = pool.BuildFile(request.proto_file(i));
|
| if (file == NULL) {
|
| // BuildFile() already wrote an error message.
|
| - return 1;
|
| + return false;
|
| }
|
| }
|
|
|
| @@ -125,19 +109,18 @@ int PluginMain(int argc, char* argv[], const CodeGenerator* generator) {
|
| for (int i = 0; i < request.file_to_generate_size(); i++) {
|
| parsed_files.push_back(pool.FindFileByName(request.file_to_generate(i)));
|
| if (parsed_files.back() == NULL) {
|
| - std::cerr << argv[0] << ": protoc asked plugin to generate a file but "
|
| - "did not provide a descriptor for the file: "
|
| - << request.file_to_generate(i) << std::endl;
|
| - return 1;
|
| + *error_msg = "protoc asked plugin to generate a file but "
|
| + "did not provide a descriptor for the file: " +
|
| + request.file_to_generate(i);
|
| + return false;
|
| }
|
| }
|
|
|
| - CodeGeneratorResponse response;
|
| - GeneratorResponseContext context(&response, parsed_files);
|
| + GeneratorResponseContext context(response, parsed_files);
|
|
|
| - if (generator->HasGenerateAll()) {
|
| + if (generator.HasGenerateAll()) {
|
| string error;
|
| - bool succeeded = generator->GenerateAll(
|
| + bool succeeded = generator.GenerateAll(
|
| parsed_files, request.parameter(), &context, &error);
|
|
|
| if (!succeeded && error.empty()) {
|
| @@ -145,14 +128,14 @@ int PluginMain(int argc, char* argv[], const CodeGenerator* generator) {
|
| "description.";
|
| }
|
| if (!error.empty()) {
|
| - response.set_error(error);
|
| + response->set_error(error);
|
| }
|
| } else {
|
| for (int i = 0; i < parsed_files.size(); i++) {
|
| const FileDescriptor* file = parsed_files[i];
|
|
|
| string error;
|
| - bool succeeded = generator->Generate(
|
| + bool succeeded = generator.Generate(
|
| file, request.parameter(), &context, &error);
|
|
|
| if (!succeeded && error.empty()) {
|
| @@ -160,14 +143,46 @@ int PluginMain(int argc, char* argv[], const CodeGenerator* generator) {
|
| "description.";
|
| }
|
| if (!error.empty()) {
|
| - response.set_error(file->name() + ": " + error);
|
| + response->set_error(file->name() + ": " + error);
|
| break;
|
| }
|
| }
|
| }
|
|
|
| - if (!response.SerializeToFileDescriptor(STDOUT_FILENO)) {
|
| - std::cerr << argv[0] << ": Error writing to stdout." << std::endl;
|
| + return true;
|
| +}
|
| +
|
| +int PluginMain(int argc, char* argv[], const CodeGenerator* generator) {
|
| +
|
| + if (argc > 1) {
|
| + std::cerr << argv[0] << ": Unknown option: " << argv[1] << std::endl;
|
| + return 1;
|
| + }
|
| +
|
| +#ifdef _WIN32
|
| + _setmode(STDIN_FILENO, _O_BINARY);
|
| + _setmode(STDOUT_FILENO, _O_BINARY);
|
| +#endif
|
| +
|
| + CodeGeneratorRequest request;
|
| + if (!request.ParseFromFileDescriptor(STDIN_FILENO)) {
|
| + std::cerr << argv[0] << ": protoc sent unparseable request to plugin."
|
| + << std::endl;
|
| + return 1;
|
| + }
|
| +
|
| + string error_msg;
|
| + CodeGeneratorResponse response;
|
| +
|
| + if (GenerateCode(request, *generator, &response, &error_msg)) {
|
| + if (!response.SerializeToFileDescriptor(STDOUT_FILENO)) {
|
| + std::cerr << argv[0] << ": Error writing to stdout." << std::endl;
|
| + return 1;
|
| + }
|
| + } else {
|
| + if (!error_msg.empty()) {
|
| + std::cerr << argv[0] << ": " << error_msg << std::endl;
|
| + }
|
| return 1;
|
| }
|
|
|
|
|