Go to the documentation of this file.
85 StrEndsWith(filename,
".protodevel") ?
".protodevel" :
".proto";
94 return basename +
"_pb2";
112 const char*
const kKeywords[] = {
113 "False",
"None",
"True",
"and",
"as",
"assert",
"break",
114 "class",
"continue",
"def",
"del",
"elif",
"else",
"except",
115 "finally",
"for",
"from",
"global",
"if",
"import",
"in",
116 "is",
"lambda",
"nonlocal",
"not",
"or",
"pass",
"raise",
117 "return",
"try",
"while",
"with",
"yield",
"print",
119 const char*
const* kKeywordsEnd =
120 kKeywords + (
sizeof(kKeywords) /
sizeof(kKeywords[0]));
122 bool ContainsPythonKeyword(
const std::string& module_name) {
123 std::vector<std::string> tokens =
Split(module_name,
".");
124 for (
int i = 0;
i < tokens.size(); ++
i) {
125 if (std::find(kKeywords, kKeywordsEnd, tokens[
i]) != kKeywordsEnd) {
132 inline bool IsPythonKeyword(
const string&
name) {
133 return (std::find(kKeywords, kKeywordsEnd,
name) != kKeywordsEnd);
137 if (IsPythonKeyword(
name)) {
138 return "globals()['" +
name +
"']";
146 template <
typename DescriptorT>
151 if (parent !=
nullptr) {
153 if (separator ==
"." && IsPythonKeyword(
name)) {
154 return "getattr(" +
prefix +
", '" +
name +
"')";
159 if (separator ==
".") {
169 const char kDescriptorKey[] =
"DESCRIPTOR";
187 "# -*- coding: utf-8 -*-\n"
188 "# Generated by the protocol buffer compiler. DO NOT EDIT!\n"
189 "# source: $filename$\n"
190 "\nimport sys\n_b=sys.version_info[0]<3 and (lambda x:x) or (lambda "
191 "x:x.encode('latin1'))"
193 "filename", file->
name());
194 if (HasTopLevelEnums(file)) {
196 "from google.protobuf.internal import enum_type_wrapper\n");
199 "from google.protobuf import descriptor as _descriptor\n"
200 "from google.protobuf import message as _message\n"
201 "from google.protobuf import reflection as _reflection\n"
202 "from google.protobuf import symbol_database as "
203 "_symbol_database\n");
206 "from google.protobuf import service as _service\n"
207 "from google.protobuf import service_reflection\n");
211 "# @@protoc_insertion_point(imports)\n\n"
212 "_sym_db = _symbol_database.Default()\n");
213 printer->
Print(
"\n\n");
227 if (
field.is_repeated()) {
231 switch (
field.cpp_type()) {
242 if (
value == std::numeric_limits<double>::infinity()) {
246 }
else if (
value == -std::numeric_limits<double>::infinity()) {
251 return "(1e10000 * 0)";
258 if (
value == std::numeric_limits<float>::infinity()) {
262 }
else if (
value == -std::numeric_limits<float>::infinity()) {
267 return "(1e10000 * 0)";
273 return field.default_value_bool() ?
"True" :
"False";
275 return StrCat(
field.default_value_enum()->number());
282 return "_b(\"" +
CEscape(
field.default_value_string()) +
284 "\").decode('utf-8')");
302 GOOGLE_LOG(
FATAL) <<
"Unsupported syntax; this generator only supports proto2 "
303 "and proto3 syntax.";
337 std::unique_ptr<io::ZeroCopyOutputStream>
output(context->
Open(filename));
366 printer.
Print(
"# @@protoc_insertion_point(module_scope)\n");
379 if (ContainsPythonKeyword(module_name)) {
385 printer_->
Print(
"$alias$ = importlib.import_module('$name$')\n",
"alias",
386 module_alias,
"name", module_name);
388 int last_dot_pos = module_name.rfind(
'.');
390 if (last_dot_pos == std::string::npos) {
393 import_statement =
"import " + module_name;
395 import_statement =
"from " + module_name.substr(0, last_dot_pos) +
396 " import " + module_name.substr(last_dot_pos + 1);
398 printer_->
Print(
"$statement$ as $alias$\n",
"statement", import_statement,
399 "alias", module_alias);
409 printer_->
Print(
"from $module$ import *\n",
"module", module_name);
416 std::map<std::string, std::string>
m;
417 m[
"descriptor_name"] = kDescriptorKey;
422 const char file_descriptor_template[] =
423 "$descriptor_name$ = _descriptor.FileDescriptor(\n"
425 " package='$package$',\n"
426 " syntax='$syntax$',\n"
427 " serialized_options=$options$,\n";
432 "serialized_pb=_b('$value$')\n",
438 printer_->
Print(
"$module_alias$.DESCRIPTOR,",
"module_alias",
448 printer_->
Print(
"$module_alias$.DESCRIPTOR,",
"module_alias",
465 std::vector<std::pair<std::string, int> > top_level_enum_values;
471 "enum_type_wrapper.EnumTypeWrapper($descriptor_name$)",
478 top_level_enum_values.push_back(
479 std::make_pair(value_descriptor.
name(), value_descriptor.
number()));
483 for (
int i = 0;
i < top_level_enum_values.size(); ++
i) {
486 StrCat(top_level_enum_values[
i].second));
502 std::map<std::string, std::string>
m;
505 m[
"descriptor_name"] = module_level_descriptor_name;
508 m[
"file"] = kDescriptorKey;
509 const char enum_descriptor_template[] =
510 "$descriptor_name$ = _descriptor.EnumDescriptor(\n"
512 " full_name='$full_name$',\n"
528 printer_->
Print(
"serialized_options=$options_value$,\n",
"options_value",
534 printer_->
Print(
"_sym_db.RegisterEnumDescriptor($name$)\n",
"name",
535 module_level_descriptor_name);
552 const bool is_extension =
true;
557 printer_->
Print(
"$constant_name$ = $number$\n",
"constant_name",
558 constant_name,
"number",
597 descriptor.options().SerializeToString(&options_string);
599 printer_->
Print(
"$service_name$ = _descriptor.ServiceDescriptor(\n",
600 "service_name", service_name);
602 std::map<std::string, std::string>
m;
605 m[
"file"] = kDescriptorKey;
608 const char required_function_arguments[] =
610 "full_name='$full_name$',\n"
613 "serialized_options=$options_value$,\n";
628 m[
"serialized_options"] =
CEscape(options_string);
636 "full_name='$full_name$',\n"
638 "containing_service=None,\n"
639 "input_type=$input_type$,\n"
640 "output_type=$output_type$,\n"
641 "serialized_options=$options_value$,\n");
648 printer_->
Print(
"_sym_db.RegisterServiceDescriptor($name$)\n",
"name",
655 printer_->
Print(
"$descriptor_key$ = $descriptor_name$,\n",
"descriptor_key",
656 kDescriptorKey,
"descriptor_name",
659 printer_->
Print(
"__module__ = '$module_name$'\n",
"module_name", module_name);
665 "$class_name$ = service_reflection.GeneratedServiceType("
666 "'$class_name$', (_service.Service,), dict(\n",
677 "$class_name$_Stub = "
678 "service_reflection.GeneratedServiceStubType("
679 "'$class_name$_Stub', ($class_name$,), dict(\n",
695 printer_->
Print(
"$descriptor_name$ = _descriptor.Descriptor(\n",
699 std::map<std::string, std::string>
m;
700 m[
"name"] = message_descriptor.
name();
701 m[
"full_name"] = message_descriptor.
full_name();
702 m[
"file"] = kDescriptorKey;
703 const char required_function_arguments[] =
705 "full_name='$full_name$',\n"
708 "containing_type=None,\n";
734 message_descriptor.
options().SerializeToString(&options_string);
736 "serialized_options=$options_value$,\n"
737 "is_extendable=$extendable$,\n"
739 "options_value",
OptionsValue(options_string),
"extendable",
747 const Descriptor::ExtensionRange*
range =
757 std::map<std::string, std::string>
m;
758 m[
"name"] =
desc->name();
759 m[
"full_name"] =
desc->full_name();
763 if (options_string ==
"None") {
764 m[
"serialized_options"] =
"";
766 m[
"serialized_options"] =
", serialized_options=" + options_string;
769 "_descriptor.OneofDescriptor(\n"
770 " name='$name$', full_name='$full_name$',\n"
771 " index=$index$, containing_type=None, "
772 "fields=[]$serialized_options$),\n");
789 const Descriptor& containing_descriptor)
const {
798 std::vector<std::string> to_register;
800 for (
int j = 0; j < to_register.size(); ++j) {
818 std::vector<std::string>* to_register,
819 bool is_nested)
const {
822 if (IsPythonKeyword(message_descriptor.
name())) {
824 "getattr(" +
prefix +
", '" + message_descriptor.
name() +
"')";
826 qualified_name =
prefix +
"." + message_descriptor.
name();
829 "'$name$' : _reflection.GeneratedProtocolMessageType('$name$', "
830 "(_message.Message,), {\n",
831 "name", message_descriptor.
name());
835 "$qualified_name$ = _reflection.GeneratedProtocolMessageType('$name$', "
836 "(_message.Message,), {\n",
837 "qualified_name", qualified_name,
"name", message_descriptor.
name());
841 to_register->push_back(qualified_name);
844 std::map<std::string, std::string>
m;
845 m[
"descriptor_key"] = kDescriptorKey;
849 printer_->
Print(
"'__module__' : '$module_name$'\n",
"module_name",
851 printer_->
Print(
"# @@protoc_insertion_point(class_scope:$full_name$)\n",
852 "full_name", message_descriptor.
full_name());
861 std::vector<std::string>* to_register)
const {
879 const Descriptor* containing_descriptor)
const {
895 std::map<std::string, std::string>
m;
898 m[
"oneof_name"] = oneof->
name();
903 "$descriptor_name$.oneofs_by_name['$oneof_name$'].fields.append(\n"
904 " $descriptor_name$.fields_by_name['$field_name$'])\n");
907 "$descriptor_name$.fields_by_name['$field_name$'].containing_oneof = "
908 "$descriptor_name$.oneofs_by_name['$oneof_name$']\n");
914 std::map<std::string, std::string>
m;
915 m[
"descriptor_name"] = kDescriptorKey;
918 const char file_descriptor_template[] =
919 "$descriptor_name$.message_types_by_name['$message_name$'] = "
920 "$message_descriptor_name$\n";
926 std::map<std::string, std::string>
m;
927 m[
"descriptor_name"] = kDescriptorKey;
930 const char file_descriptor_template[] =
931 "$descriptor_name$.services_by_name['$service_name$'] = "
932 "$service_descriptor_name$\n";
938 std::map<std::string, std::string>
m;
939 m[
"descriptor_name"] = kDescriptorKey;
942 const char file_descriptor_template[] =
943 "$descriptor_name$.enum_types_by_name['$enum_name$'] = "
944 "$enum_descriptor_name$\n";
950 std::map<std::string, std::string>
m;
951 m[
"descriptor_name"] = kDescriptorKey;
954 const char file_descriptor_template[] =
955 "$descriptor_name$.extensions_by_name['$field_name$'] = "
974 std::map<std::string, std::string>
m;
975 m[
"field_ref"] = field_referencing_expression;
977 if (foreign_message_type) {
979 printer_->
Print(
m,
"$field_ref$.message_type = $foreign_type$\n");
1004 if (!containing_type) {
1009 python_dict_name,
field.name());
1013 template <
typename DescriptorT>
1016 const Descriptor* containing_descriptor)
const {
1017 if (containing_descriptor !=
NULL) {
1021 printer_->
Print(
"$nested_name$.containing_type = $parent_name$\n",
1022 "nested_name", nested_name,
"parent_name", parent_name);
1045 printer_->
Print(
"_sym_db.RegisterFileDescriptor($name$)\n",
"name",
1071 "extensions_by_name");
1073 std::map<std::string, std::string>
m;
1078 m[
"extended_message_class"] =
1081 extension_field.
extension_scope(), extension_field,
"extensions_by_name");
1082 printer_->
Print(
m,
"$extended_message_class$.RegisterExtension($field$)\n");
1104 descriptor.options().SerializeToString(&options_string);
1105 std::map<std::string, std::string>
m;
1111 "_descriptor.EnumValueDescriptor(\n"
1112 " name='$name$', index=$index$, number=$number$,\n"
1113 " serialized_options=$options$,\n"
1124 return "_b('" +
CEscape(serialized_options) +
"')";
1130 bool is_extension)
const {
1132 field.options().SerializeToString(&options_string);
1133 std::map<std::string, std::string>
m;
1134 m[
"name"] =
field.name();
1135 m[
"full_name"] =
field.full_name();
1141 m[
"has_default_value"] =
field.has_default_value() ?
"True" :
"False";
1142 m[
"default_value"] = StringifyDefaultValue(
field);
1143 m[
"is_extension"] = is_extension ?
"True" :
"False";
1146 field.has_json_name() ?
", json_name='" +
field.json_name() +
"'" :
"";
1150 const char field_descriptor_decl[] =
1151 "_descriptor.FieldDescriptor(\n"
1152 " name='$name$', full_name='$full_name$', index=$index$,\n"
1153 " number=$number$, type=$type$, cpp_type=$cpp_type$, label=$label$,\n"
1154 " has_default_value=$has_default_value$, "
1155 "default_value=$default_value$,\n"
1156 " message_type=None, enum_type=None, containing_type=None,\n"
1157 " is_extension=$is_extension$, extension_scope=None,\n"
1158 " serialized_options=$serialized_options$$json_name$, file=DESCRIPTOR)";
1164 const Descriptor& message_descriptor,
bool is_extension,
1169 for (
int i = 0;
i < (message_descriptor.*CountFn)(); ++
i) {
1180 const Descriptor& message_descriptor)
const {
1181 const bool is_extension =
false;
1190 const Descriptor& message_descriptor)
const {
1191 const bool is_extension =
true;
1198 return file_->
name() ==
"net/proto2/proto/descriptor.proto" ||
1199 file_->
name() ==
"google/protobuf/descriptor.proto";
1205 template <
typename DescriptorT>
1267 template <
typename DescriptorT,
typename DescriptorProtoT>
1269 DescriptorProtoT& proto)
const {
1272 proto.SerializeToString(&sp);
1277 "serialized_start=$serialized_start$,\n"
1278 "serialized_end=$serialized_end$,\n",
1289 printer->
Print(
"$descriptor$._options = None\n",
"descriptor",
descriptor);
1297 if (file_options !=
"None") {
1298 PrintDescriptorOptionsFixingCode(kDescriptorKey, file_options,
printer_);
1319 if (oneof_options !=
"None") {
1322 "oneofs_by_name", oneof.
name());
1333 if (enum_options !=
"None") {
1334 PrintDescriptorOptionsFixingCode(descriptor_name, enum_options,
printer_);
1340 if (value_options !=
"None") {
1341 PrintDescriptorOptionsFixingCode(
1342 StringPrintf(
"%s.values_by_name[\"%s\"]", descriptor_name.c_str(),
1343 value_descriptor.
name().c_str()),
1353 if (field_options !=
"None") {
1355 if (
field.is_extension()) {
1358 field_name =
field.name();
1361 "extensions_by_name");
1367 PrintDescriptorOptionsFixingCode(field_name, field_options,
printer_);
1399 if (message_options !=
"None") {
1401 PrintDescriptorOptionsFixingCode(descriptor_name, message_options,
1418 " $alias$ = $copy_from$.$alias$\n"
1419 "except AttributeError:\n"
1420 " $alias$ = $copy_from$.$module$\n",
1421 "alias", module_alias,
"module", module_name,
"copy_from", copy_from);
void FixAllDescriptorOptions() const
const std::string & full_name() const
void Print(const std::map< std::string, std::string > &variables, const char *text)
#define GOOGLE_CHECK_EQ(A, B)
GLuint const GLchar * name
void FixForeignFieldsInExtension(const FieldDescriptor &extension_field) const
const EnumValueOptions & options() const
const EnumDescriptor * enum_type(int index) const
void PrintEnum(const EnumDescriptor &enum_descriptor) const
void PrintServiceDescriptors() const
void PrintFileDescriptor() const
std::string file_descriptor_serialized_
string SimpleDtoa(double value)
std::string ModuleLevelDescriptorName(const DescriptorT &descriptor) const
void FixOptionsForMessage(const Descriptor &descriptor) const
void PrintTopLevelEnums() const
bool is_extension() const
void UpperString(string *s)
string StrCat(const AlphaNum &a, const AlphaNum &b)
std::string StripProto(const std::string &filename)
void PrintNestedDescriptors(const Descriptor &containing_descriptor) const
bool GeneratingDescriptorProto() const
bool py_generic_services() const
virtual io::ZeroCopyOutputStream * Open(const std::string &filename)=0
int nested_type_count() const
const Message * descriptor_proto
const Descriptor * containing_type() const
string CEscape(const string &src)
virtual bool Generate(const FileDescriptor *file, const std::string ¶meter, GeneratorContext *generator_context, std::string *error) const
void PrintFieldsInDescriptor(const Descriptor &message_descriptor) const
GLsizei const GLchar *const * string
StringPiece substr(size_type pos, size_type n=npos) const
zend_class_entry * enum_type
int GlobalReplaceSubstring(const string &substring, const string &replacement, string *s)
void ReplaceCharacters(string *s, const char *remove, char replacewith)
const std::string & name() const
void AddServiceToFileDescriptor(const ServiceDescriptor &descriptor) const
const FieldDescriptor * field(int index) const
void PrintServices() const
int enum_type_count() const
void PrintMessageDescriptors() const
std::string ModuleLevelServiceDescriptorName(const ServiceDescriptor &descriptor) const
const FileDescriptor * file_
const MessageOptions & options() const
const std::string & name() const
static size_t oneof_name(void *closure, const void *hd, const char *buf, size_t n, const upb_bufhandle *handle)
const std::string & package() const
const FieldDescriptor * field(int index) const
void PrintNestedEnums(const Descriptor &descriptor) const
void PrintTopLevelExtensions() const
const ServiceDescriptor * service(int index) const
const Descriptor * extension_scope() const
static const char prefix[]
const ExtensionRange * extension_range(int index) const
std::string ResolveKeyword(const string &name)
void PrintEnumValueDescriptor(const EnumValueDescriptor &descriptor) const
const OneofDescriptor * oneof_decl(int index) const
int public_dependency_count() const
void CopyPublicDependenciesAliases(const std::string ©_from, const FileDescriptor *file) const
void FixContainingTypeInDescriptor(const DescriptorT &descriptor, const Descriptor *containing_descriptor) const
void FixOptionsForOneof(const OneofDescriptor &oneof) const
int oneof_decl_count() const
#define GOOGLE_LOG(LEVEL)
int extension_count() const
const EnumDescriptor * enum_type(int index) const
void FixForeignFieldsInExtensions() const
void PrintFieldDescriptorsInDescriptor(const Descriptor &message_descriptor, bool is_extension, const std::string &list_variable_name, int(Descriptor::*CountFn)() const, const FieldDescriptor *(Descriptor::*GetterFn)(int) const) const
string Substitute(const char *format, const SubstituteArg &arg0, const SubstituteArg &arg1, const SubstituteArg &arg2, const SubstituteArg &arg3, const SubstituteArg &arg4, const SubstituteArg &arg5, const SubstituteArg &arg6, const SubstituteArg &arg7, const SubstituteArg &arg8, const SubstituteArg &arg9)
const FieldDescriptor * extension(int index) const
int extension_range_count() const
const FileOptions & options() const
const OneofOptions & options() const
std::string OptionsValue(const std::string &serialized_options) const
string StringPrintf(const char *format,...)
string SimpleFtoa(float value)
void FixForeignFieldsInField(const Descriptor *containing_type, const FieldDescriptor &field, const std::string &python_dict_name) const
const FieldDescriptor * field
void PrintServiceDescriptor(const ServiceDescriptor &descriptor) const
void CopyTo(FileDescriptorProto *proto) const
#define GOOGLE_CHECK(EXPRESSION)
void FixForeignFieldsInDescriptor(const Descriptor &descriptor, const Descriptor *containing_descriptor) const
void FixOptionsForEnum(const EnumDescriptor &descriptor) const
void PrintAllNestedEnumsInFile() const
void PrintSerializedPbInterval(const DescriptorT &descriptor, DescriptorProtoT &proto) const
const Descriptor * nested_type(int index) const
int enum_type_count() const
const std::string & name() const
void PrintMessages() const
const std::string & name() const
bool HasGenericServices(const FileDescriptor *file, const Options &options)
std::string ModuleLevelMessageName(const Descriptor &descriptor) const
const Descriptor * message_type(int index) const
void PrintDescriptorKeyAndModuleName(const ServiceDescriptor &descriptor) const
VALUE enum_descriptor(VALUE self)
const FileDescriptor * dependency(int index) const
void PrintExtensionsInDescriptor(const Descriptor &message_descriptor) const
void AddEnumToFileDescriptor(const EnumDescriptor &descriptor) const
void PrintServiceStub(const ServiceDescriptor &descriptor) const
const FieldDescriptor * extension(int index) const
int service_count() const
void AddMessageToFileDescriptor(const Descriptor &descriptor) const
const std::string & name() const
void AddExtensionToFileDescriptor(const FieldDescriptor &descriptor) const
const upb_json_parsermethod * m
#define GOOGLE_CHECK_GE(A, B)
const FileDescriptor * file() const
std::vector< string > Split(const string &full, const char *delim, bool skip_empty=true)
void FixForeignFieldsInNestedExtensions(const Descriptor &descriptor) const
void PrintServiceClass(const ServiceDescriptor &descriptor) const
const std::string & full_name() const
void FixOptionsForField(const FieldDescriptor &field) const
void PrintDescriptor(const Descriptor &message_descriptor) const
void FixForeignFieldsInDescriptors() const
string StringifySyntax(FileDescriptor::Syntax syntax)
GLsizei const GLfloat * value
void PrintNestedMessages(const Descriptor &containing_descriptor, const std::string &prefix, std::vector< std::string > *to_register) const
string StripSuffixString(const string &str, const string &suffix)
const upb_json_parsermethod const upb_symtab upb_sink * output
void PrintFieldDescriptor(const FieldDescriptor &field, bool is_extension) const
stringpiece_ssize_type size() const
string CHexEscape(const string &src)
std::string FieldReferencingExpression(const Descriptor *containing_type, const FieldDescriptor &field, const std::string &python_dict_name) const
const FileDescriptor * public_dependency(int index) const
int message_type_count() const
const Descriptor * containing_type() const
FileDescriptorProto * file_
void PrintImports() const
int extension_count() const
const Descriptor::ReservedRange const EnumValueDescriptor method
int dependency_count() const
void PrintMessage(const Descriptor &message_descriptor, const std::string &prefix, std::vector< std::string > *to_register, bool is_nested) const
libaditof
Author(s):
autogenerated on Wed May 21 2025 02:06:58