Protocol Buffers - Google's data interchange format (grpc依赖)
https://developers.google.com/protocol-buffers/
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
103 lines
3.2 KiB
103 lines
3.2 KiB
#include "google/protobuf/compiler/code_generator.h" |
|
#include "google/protobuf/io/zero_copy_stream.h" |
|
#include "google/protobuf/io/printer.h" |
|
#include "google/protobuf/descriptor.h" |
|
#include "google/protobuf/descriptor.pb.h" |
|
#include "schema_proto2_to_proto3_util.h" |
|
|
|
#include "google/protobuf/compiler/plugin.h" |
|
|
|
using google::protobuf::FileDescriptorProto; |
|
using google::protobuf::FileDescriptor; |
|
using google::protobuf::DescriptorPool; |
|
using google::protobuf::io::Printer; |
|
using google::protobuf::util::SchemaGroupStripper; |
|
using google::protobuf::util::SchemaAddZeroEnumValue; |
|
|
|
namespace google { |
|
namespace protobuf { |
|
namespace compiler { |
|
|
|
namespace { |
|
|
|
string StripProto(string filename) { |
|
if (filename.substr(filename.size() - 11) == ".protodevel") { |
|
// .protodevel |
|
return filename.substr(0, filename.size() - 11); |
|
} else { |
|
// .proto |
|
return filename.substr(0, filename.size() - 6); |
|
} |
|
} |
|
|
|
DescriptorPool new_pool_; |
|
|
|
} // namespace |
|
|
|
class GoGoProtoGenerator : public CodeGenerator { |
|
public: |
|
virtual bool GenerateAll(const std::vector<const FileDescriptor*>& files, |
|
const string& parameter, |
|
GeneratorContext* context, |
|
string* error) const { |
|
for (int i = 0; i < files.size(); i++) { |
|
for (auto file : files) { |
|
bool can_generate = |
|
(new_pool_.FindFileByName(file->name()) == nullptr); |
|
for (int j = 0; j < file->dependency_count(); j++) { |
|
can_generate &= (new_pool_.FindFileByName( |
|
file->dependency(j)->name()) != nullptr); |
|
} |
|
for (int j = 0; j < file->public_dependency_count(); j++) { |
|
can_generate &= (new_pool_.FindFileByName( |
|
file->public_dependency(j)->name()) != nullptr); |
|
} |
|
for (int j = 0; j < file->weak_dependency_count(); j++) { |
|
can_generate &= (new_pool_.FindFileByName( |
|
file->weak_dependency(j)->name()) != nullptr); |
|
} |
|
if (can_generate) { |
|
Generate(file, parameter, context, error); |
|
break; |
|
} |
|
} |
|
} |
|
|
|
return true; |
|
} |
|
|
|
virtual bool Generate(const FileDescriptor* file, |
|
const string& parameter, |
|
GeneratorContext* context, |
|
string* error) const { |
|
FileDescriptorProto new_file; |
|
file->CopyTo(&new_file); |
|
SchemaGroupStripper::StripFile(file, &new_file); |
|
|
|
SchemaAddZeroEnumValue enum_scrubber; |
|
enum_scrubber.ScrubFile(&new_file); |
|
|
|
string filename = file->name(); |
|
string basename = StripProto(filename); |
|
|
|
std::vector<std::pair<string,string>> option_pairs; |
|
ParseGeneratorParameter(parameter, &option_pairs); |
|
|
|
std::unique_ptr<google::protobuf::io::ZeroCopyOutputStream> output( |
|
context->Open(basename + ".proto")); |
|
string content = new_pool_.BuildFile(new_file)->DebugString(); |
|
Printer printer(output.get(), '$'); |
|
printer.WriteRaw(content.c_str(), content.size()); |
|
|
|
return true; |
|
} |
|
}; |
|
|
|
} // namespace compiler |
|
} // namespace protobuf |
|
} // namespace google |
|
|
|
int main(int argc, char* argv[]) { |
|
google::protobuf::compiler::GoGoProtoGenerator generator; |
|
return google::protobuf::compiler::PluginMain(argc, argv, &generator); |
|
}
|
|
|