OLD | NEW |
(Empty) | |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. |
| 4 |
| 5 #include "proto_zero_generator.h" |
| 6 |
| 7 #include <memory> |
| 8 #include <string> |
| 9 |
| 10 #include "third_party/protobuf/src/google/protobuf/descriptor.h" |
| 11 #include "third_party/protobuf/src/google/protobuf/io/printer.h" |
| 12 #include "third_party/protobuf/src/google/protobuf/io/zero_copy_stream.h" |
| 13 #include "third_party/protobuf/src/google/protobuf/stubs/strutil.h" |
| 14 |
| 15 namespace tracing { |
| 16 namespace proto { |
| 17 |
| 18 using google::protobuf::FileDescriptor; |
| 19 using google::protobuf::StripSuffixString; |
| 20 using google::protobuf::compiler::GeneratorContext; |
| 21 using google::protobuf::io::Printer; |
| 22 using google::protobuf::io::ZeroCopyOutputStream; |
| 23 |
| 24 namespace { |
| 25 |
| 26 class GeneratorJob { |
| 27 public: |
| 28 GeneratorJob(const FileDescriptor *file, |
| 29 Printer* stub_h_printer, |
| 30 Printer* stub_cc_printer) |
| 31 : file_(file), |
| 32 stub_h_(stub_h_printer), |
| 33 stub_cc_(stub_cc_printer) {} |
| 34 |
| 35 bool GenerateStubs() { |
| 36 stub_h_->Print( |
| 37 "// Autogenerated. DO NOT EDIT.\n" |
| 38 "// Generated by: //components/tracing/proto_zero_plugin.\n\n" |
| 39 "// Package: $package$\n", |
| 40 "package", file_->package()); |
| 41 stub_cc_->Print( |
| 42 "// Autogenerated. DO NOT EDIT.\n" |
| 43 "// Generated by: //components/tracing/proto_zero_plugin.\n\n" |
| 44 "// This file intentionally left blank.\n"); |
| 45 // TODO(kraynov) Implement in the next CL (crbug.com/608721). |
| 46 return true; |
| 47 } |
| 48 |
| 49 // If generator fails to produce stubs for a particular proto definitions |
| 50 // it finishes with undefined output and writes the first error occured. |
| 51 const std::string& GetFirstError() const { |
| 52 return error_; |
| 53 } |
| 54 |
| 55 private: |
| 56 // Only the first error will be recorded. |
| 57 void Abort(const std::string& reason) { |
| 58 if (error_.empty()) { |
| 59 error_ = reason; |
| 60 } |
| 61 } |
| 62 |
| 63 const FileDescriptor* const file_; |
| 64 Printer* const stub_h_; |
| 65 Printer* const stub_cc_; |
| 66 std::string error_; |
| 67 }; |
| 68 |
| 69 } // namespace |
| 70 |
| 71 ProtoZeroGenerator::ProtoZeroGenerator() { |
| 72 } |
| 73 |
| 74 ProtoZeroGenerator::~ProtoZeroGenerator() { |
| 75 } |
| 76 |
| 77 bool ProtoZeroGenerator::Generate(const FileDescriptor* file, |
| 78 const std::string& options, |
| 79 GeneratorContext* context, |
| 80 std::string* error) const { |
| 81 |
| 82 const std::string proto_stubs_name = |
| 83 StripSuffixString(file->name(), ".proto") + ".pbzero"; |
| 84 |
| 85 const std::unique_ptr<ZeroCopyOutputStream> stub_h_file_stream( |
| 86 context->Open(proto_stubs_name + ".h")); |
| 87 const std::unique_ptr<ZeroCopyOutputStream> stub_cc_file_stream( |
| 88 context->Open(proto_stubs_name + ".cc")); |
| 89 |
| 90 // Variables are delimited by $. |
| 91 Printer stub_h_printer(stub_h_file_stream.get(), '$'); |
| 92 Printer stub_cc_printer(stub_cc_file_stream.get(), '$'); |
| 93 |
| 94 GeneratorJob job(file, &stub_h_printer, &stub_cc_printer); |
| 95 if (!job.GenerateStubs()) { |
| 96 *error = job.GetFirstError(); |
| 97 return false; |
| 98 } |
| 99 return true; |
| 100 } |
| 101 |
| 102 } // namespace proto |
| 103 } // namespace tracing |
OLD | NEW |