Chromium Code Reviews| Index: components/tracing/proto_zero_plugin/proto_zero_generator.cc |
| diff --git a/components/tracing/proto_zero_plugin/proto_zero_generator.cc b/components/tracing/proto_zero_plugin/proto_zero_generator.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..ce0eda9961a9eec042579f66431cb57209d36893 |
| --- /dev/null |
| +++ b/components/tracing/proto_zero_plugin/proto_zero_generator.cc |
| @@ -0,0 +1,103 @@ |
| +// Copyright 2016 The Chromium Authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +#include "proto_zero_generator.h" |
| + |
| +#include <memory> |
| +#include <string> |
| + |
| +#include "third_party/protobuf/src/google/protobuf/descriptor.h" |
| +#include "third_party/protobuf/src/google/protobuf/io/printer.h" |
| +#include "third_party/protobuf/src/google/protobuf/io/zero_copy_stream.h" |
| +#include "third_party/protobuf/src/google/protobuf/stubs/strutil.h" |
| + |
| +namespace tracing { |
| +namespace proto { |
| + |
| +using google::protobuf::FileDescriptor; |
| +using google::protobuf::StripSuffixString; |
| +using google::protobuf::compiler::GeneratorContext; |
| +using google::protobuf::io::Printer; |
| +using google::protobuf::io::ZeroCopyOutputStream; |
| + |
| +namespace { |
| + |
| +class GeneratorJob { |
| + public: |
| + GeneratorJob(const FileDescriptor *file, |
| + Printer* stub_h_printer, |
| + Printer* stub_cc_printer) |
| + : file_(file), |
| + stub_h_(stub_h_printer), |
| + stub_cc_(stub_cc_printer) {} |
| + |
| + bool GenerateStubs() { |
| + stub_h_->Print( |
| + "// Autogenerated. DO NOT EDIT.\n" |
| + "// Generated by: //components/tracing/proto_zero_plugin.\n\n" |
| + "// Package: $package$\n", |
| + "package", file_->package()); |
| + stub_cc_->Print( |
| + "// Autogenerated. DO NOT EDIT.\n" |
| + "// Generated by: //components/tracing/proto_zero_plugin.\n\n" |
| + "// This file intentionally left blank.\n"); |
| + // TODO(kraynov) Implement in the next CL (crbug.com/608721). |
| + return true; |
| + } |
| + |
| + // If generator fails to produce stubs for a particular proto definitions |
| + // it finishes with undefined output and writes the first error occured. |
| + const std::string& GetFirstError() const { |
| + return error_; |
| + } |
| + |
| + private: |
| + // Only the first error will be recorded. |
| + void Abort(const std::string& reason) { |
| + if (error_.empty()) { |
| + error_ = reason; |
| + } |
| + } |
| + |
| + const FileDescriptor* const file_; |
| + Printer* const stub_h_; |
| + Printer* const stub_cc_; |
| + std::string error_; |
| +}; |
| + |
| +} |
|
Primiano Tucci (use gerrit)
2016/07/13 16:52:32
nit: add " // namespace" comment
|
| + |
| +ProtoZeroGenerator::ProtoZeroGenerator() { |
| +} |
| + |
| +ProtoZeroGenerator::~ProtoZeroGenerator() { |
| +} |
| + |
| +bool ProtoZeroGenerator::Generate(const FileDescriptor* file, |
| + const std::string& options, |
| + GeneratorContext* context, |
| + std::string* error) const { |
| + |
| + const std::string proto_stubs_name = |
| + StripSuffixString(file->name(), ".proto") + ".zeropb"; |
| + |
| + const std::unique_ptr<ZeroCopyOutputStream> stub_h_file_stream( |
| + context->Open(proto_stubs_name + ".h")); |
| + const std::unique_ptr<ZeroCopyOutputStream> stub_cc_file_stream( |
| + context->Open(proto_stubs_name + ".cc")); |
| + |
| + // Variables are delimited by $. |
| + Printer stub_h_printer(stub_h_file_stream.get(), '$'); |
| + Printer stub_cc_printer(stub_cc_file_stream.get(), '$'); |
| + |
| + GeneratorJob job(file, &stub_h_printer, &stub_cc_printer); |
| + if (!job.GenerateStubs()) { |
| + *error = job.GetFirstError(); |
| + return false; |
| + } |
| + return true; |
| +} |
| + |
| +} // namespace proto |
| +} // namespace tracing |