Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1)

Side by Side Diff: third_party/protobuf/src/google/protobuf/compiler/python/python_generator.cc

Issue 2590803003: Revert "third_party/protobuf: Update to HEAD (83d681ee2c)" (Closed)
Patch Set: Created 3 years, 12 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Protocol Buffers - Google's data interchange format 1 // Protocol Buffers - Google's data interchange format
2 // Copyright 2008 Google Inc. All rights reserved. 2 // Copyright 2008 Google Inc. All rights reserved.
3 // https://developers.google.com/protocol-buffers/ 3 // https://developers.google.com/protocol-buffers/
4 // 4 //
5 // Redistribution and use in source and binary forms, with or without 5 // Redistribution and use in source and binary forms, with or without
6 // modification, are permitted provided that the following conditions are 6 // modification, are permitted provided that the following conditions are
7 // met: 7 // met:
8 // 8 //
9 // * Redistributions of source code must retain the above copyright 9 // * Redistributions of source code must retain the above copyright
10 // notice, this list of conditions and the following disclaimer. 10 // notice, this list of conditions and the following disclaimer.
(...skipping 26 matching lines...) Expand all
37 // In other words, our job is basically to output a Python equivalent 37 // In other words, our job is basically to output a Python equivalent
38 // of the C++ *Descriptor objects, and fix up all circular references 38 // of the C++ *Descriptor objects, and fix up all circular references
39 // within these objects. 39 // within these objects.
40 // 40 //
41 // Note that the runtime performance of protocol message classes created in 41 // Note that the runtime performance of protocol message classes created in
42 // this way is expected to be lousy. The plan is to create an alternate 42 // this way is expected to be lousy. The plan is to create an alternate
43 // generator that outputs a Python/C extension module that lets 43 // generator that outputs a Python/C extension module that lets
44 // performance-minded Python code leverage the fast C++ implementation 44 // performance-minded Python code leverage the fast C++ implementation
45 // directly. 45 // directly.
46 46
47 #include <algorithm>
48 #include <google/protobuf/stubs/hash.h> 47 #include <google/protobuf/stubs/hash.h>
49 #include <limits> 48 #include <limits>
50 #include <map> 49 #include <map>
51 #include <memory> 50 #include <memory>
52 #ifndef _SHARED_PTR_H 51 #ifndef _SHARED_PTR_H
53 #include <google/protobuf/stubs/shared_ptr.h> 52 #include <google/protobuf/stubs/shared_ptr.h>
54 #endif 53 #endif
55 #include <string> 54 #include <string>
56 #include <utility> 55 #include <utility>
57 #include <vector> 56 #include <vector>
(...skipping 23 matching lines...) Expand all
81 string StripProto(const string& filename) { 80 string StripProto(const string& filename) {
82 const char* suffix = HasSuffixString(filename, ".protodevel") 81 const char* suffix = HasSuffixString(filename, ".protodevel")
83 ? ".protodevel" : ".proto"; 82 ? ".protodevel" : ".proto";
84 return StripSuffixString(filename, suffix); 83 return StripSuffixString(filename, suffix);
85 } 84 }
86 85
87 86
88 // Returns the Python module name expected for a given .proto filename. 87 // Returns the Python module name expected for a given .proto filename.
89 string ModuleName(const string& filename) { 88 string ModuleName(const string& filename) {
90 string basename = StripProto(filename); 89 string basename = StripProto(filename);
91 ReplaceCharacters(&basename, "-", '_'); 90 StripString(&basename, "-", '_');
92 ReplaceCharacters(&basename, "/", '.'); 91 StripString(&basename, "/", '.');
93 return basename + "_pb2"; 92 return basename + "_pb2";
94 } 93 }
95 94
96 95
97 // Returns the alias we assign to the module of the given .proto filename 96 // Returns the alias we assign to the module of the given .proto filename
98 // when importing. See testPackageInitializationImport in 97 // when importing. See testPackageInitializationImport in
99 // google/protobuf/python/reflection_test.py 98 // google/protobuf/python/reflection_test.py
100 // to see why we need the alias. 99 // to see why we need the alias.
101 string ModuleAlias(const string& filename) { 100 string ModuleAlias(const string& filename) {
102 string module_name = ModuleName(filename); 101 string module_name = ModuleName(filename);
103 // We can't have dots in the module name, so we replace each with _dot_. 102 // We can't have dots in the module name, so we replace each with _dot_.
104 // But that could lead to a collision between a.b and a_dot_b, so we also 103 // But that could lead to a collision between a.b and a_dot_b, so we also
105 // duplicate each underscore. 104 // duplicate each underscore.
106 GlobalReplaceSubstring("_", "__", &module_name); 105 GlobalReplaceSubstring("_", "__", &module_name);
107 GlobalReplaceSubstring(".", "_dot_", &module_name); 106 GlobalReplaceSubstring(".", "_dot_", &module_name);
108 return module_name; 107 return module_name;
109 } 108 }
110 109
111 // Keywords reserved by the Python language.
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",
118 };
119 const char* const* kKeywordsEnd =
120 kKeywords + (sizeof(kKeywords) / sizeof(kKeywords[0]));
121 110
122 bool ContainsPythonKeyword(const string& module_name) { 111 // Returns an import statement of form "from X.Y.Z import T" for the given
123 std::vector<string> tokens = Split(module_name, "."); 112 // .proto filename.
124 for (int i = 0; i < tokens.size(); ++i) { 113 string ModuleImportStatement(const string& filename) {
125 if (std::find(kKeywords, kKeywordsEnd, tokens[i]) != kKeywordsEnd) { 114 string module_name = ModuleName(filename);
126 return true; 115 int last_dot_pos = module_name.rfind('.');
127 } 116 if (last_dot_pos == string::npos) {
117 // NOTE(petya): this is not tested as it would require a protocol buffer
118 // outside of any package, and I don't think that is easily achievable.
119 return "import " + module_name;
120 } else {
121 return "from " + module_name.substr(0, last_dot_pos) + " import " +
122 module_name.substr(last_dot_pos + 1);
128 } 123 }
129 return false;
130 } 124 }
131 125
132 126
133 // Returns the name of all containing types for descriptor, 127 // Returns the name of all containing types for descriptor,
134 // in order from outermost to innermost, followed by descriptor's 128 // in order from outermost to innermost, followed by descriptor's
135 // own name. Each name is separated by |separator|. 129 // own name. Each name is separated by |separator|.
136 template <typename DescriptorT> 130 template <typename DescriptorT>
137 string NamePrefixedWithNestedTypes(const DescriptorT& descriptor, 131 string NamePrefixedWithNestedTypes(const DescriptorT& descriptor,
138 const string& separator) { 132 const string& separator) {
139 string name = descriptor.name(); 133 string name = descriptor.name();
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after
223 case FieldDescriptor::CPPTYPE_INT32: 217 case FieldDescriptor::CPPTYPE_INT32:
224 return SimpleItoa(field.default_value_int32()); 218 return SimpleItoa(field.default_value_int32());
225 case FieldDescriptor::CPPTYPE_UINT32: 219 case FieldDescriptor::CPPTYPE_UINT32:
226 return SimpleItoa(field.default_value_uint32()); 220 return SimpleItoa(field.default_value_uint32());
227 case FieldDescriptor::CPPTYPE_INT64: 221 case FieldDescriptor::CPPTYPE_INT64:
228 return SimpleItoa(field.default_value_int64()); 222 return SimpleItoa(field.default_value_int64());
229 case FieldDescriptor::CPPTYPE_UINT64: 223 case FieldDescriptor::CPPTYPE_UINT64:
230 return SimpleItoa(field.default_value_uint64()); 224 return SimpleItoa(field.default_value_uint64());
231 case FieldDescriptor::CPPTYPE_DOUBLE: { 225 case FieldDescriptor::CPPTYPE_DOUBLE: {
232 double value = field.default_value_double(); 226 double value = field.default_value_double();
233 if (value == std::numeric_limits<double>::infinity()) { 227 if (value == numeric_limits<double>::infinity()) {
234 // Python pre-2.6 on Windows does not parse "inf" correctly. However, 228 // Python pre-2.6 on Windows does not parse "inf" correctly. However,
235 // a numeric literal that is too big for a double will become infinity. 229 // a numeric literal that is too big for a double will become infinity.
236 return "1e10000"; 230 return "1e10000";
237 } else if (value == -std::numeric_limits<double>::infinity()) { 231 } else if (value == -numeric_limits<double>::infinity()) {
238 // See above. 232 // See above.
239 return "-1e10000"; 233 return "-1e10000";
240 } else if (value != value) { 234 } else if (value != value) {
241 // infinity * 0 = nan 235 // infinity * 0 = nan
242 return "(1e10000 * 0)"; 236 return "(1e10000 * 0)";
243 } else { 237 } else {
244 return "float(" + SimpleDtoa(value) + ")"; 238 return "float(" + SimpleDtoa(value) + ")";
245 } 239 }
246 } 240 }
247 case FieldDescriptor::CPPTYPE_FLOAT: { 241 case FieldDescriptor::CPPTYPE_FLOAT: {
248 float value = field.default_value_float(); 242 float value = field.default_value_float();
249 if (value == std::numeric_limits<float>::infinity()) { 243 if (value == numeric_limits<float>::infinity()) {
250 // Python pre-2.6 on Windows does not parse "inf" correctly. However, 244 // Python pre-2.6 on Windows does not parse "inf" correctly. However,
251 // a numeric literal that is too big for a double will become infinity. 245 // a numeric literal that is too big for a double will become infinity.
252 return "1e10000"; 246 return "1e10000";
253 } else if (value == -std::numeric_limits<float>::infinity()) { 247 } else if (value == -numeric_limits<float>::infinity()) {
254 // See above. 248 // See above.
255 return "-1e10000"; 249 return "-1e10000";
256 } else if (value != value) { 250 } else if (value != value) {
257 // infinity - infinity = nan 251 // infinity - infinity = nan
258 return "(1e10000 * 0)"; 252 return "(1e10000 * 0)";
259 } else { 253 } else {
260 return "float(" + SimpleFtoa(value) + ")"; 254 return "float(" + SimpleFtoa(value) + ")";
261 } 255 }
262 } 256 }
263 case FieldDescriptor::CPPTYPE_BOOL: 257 case FieldDescriptor::CPPTYPE_BOOL:
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
313 // thread-safety constraints of the CodeGenerator interface aren't clear so 307 // thread-safety constraints of the CodeGenerator interface aren't clear so
314 // just be as conservative as possible. It's easier to relax this later if 308 // just be as conservative as possible. It's easier to relax this later if
315 // we need to, but I doubt it will be an issue. 309 // we need to, but I doubt it will be an issue.
316 // TODO(kenton): The proper thing to do would be to allocate any state on 310 // TODO(kenton): The proper thing to do would be to allocate any state on
317 // the stack and use that, so that the Generator class itself does not need 311 // the stack and use that, so that the Generator class itself does not need
318 // to have any mutable members. Then it is implicitly thread-safe. 312 // to have any mutable members. Then it is implicitly thread-safe.
319 MutexLock lock(&mutex_); 313 MutexLock lock(&mutex_);
320 file_ = file; 314 file_ = file;
321 string module_name = ModuleName(file->name()); 315 string module_name = ModuleName(file->name());
322 string filename = module_name; 316 string filename = module_name;
323 ReplaceCharacters(&filename, ".", '/'); 317 StripString(&filename, ".", '/');
324 filename += ".py"; 318 filename += ".py";
325 319
326 FileDescriptorProto fdp; 320 FileDescriptorProto fdp;
327 file_->CopyTo(&fdp); 321 file_->CopyTo(&fdp);
328 fdp.SerializeToString(&file_descriptor_serialized_); 322 fdp.SerializeToString(&file_descriptor_serialized_);
329 323
330 324
331 google::protobuf::scoped_ptr<io::ZeroCopyOutputStream> output(context->Open(fi lename)); 325 google::protobuf::scoped_ptr<io::ZeroCopyOutputStream> output(context->Open(fi lename));
332 GOOGLE_CHECK(output.get()); 326 GOOGLE_CHECK(output.get());
333 io::Printer printer(output.get(), '$'); 327 io::Printer printer(output.get(), '$');
(...skipping 24 matching lines...) Expand all
358 printer.Print( 352 printer.Print(
359 "# @@protoc_insertion_point(module_scope)\n"); 353 "# @@protoc_insertion_point(module_scope)\n");
360 354
361 return !printer.failed(); 355 return !printer.failed();
362 } 356 }
363 357
364 // Prints Python imports for all modules imported by |file|. 358 // Prints Python imports for all modules imported by |file|.
365 void Generator::PrintImports() const { 359 void Generator::PrintImports() const {
366 for (int i = 0; i < file_->dependency_count(); ++i) { 360 for (int i = 0; i < file_->dependency_count(); ++i) {
367 const string& filename = file_->dependency(i)->name(); 361 const string& filename = file_->dependency(i)->name();
368 362 string import_statement = ModuleImportStatement(filename);
369 string module_name = ModuleName(filename);
370 string module_alias = ModuleAlias(filename); 363 string module_alias = ModuleAlias(filename);
371 if (ContainsPythonKeyword(module_name)) { 364 printer_->Print("$statement$ as $alias$\n", "statement",
372 // If the module path contains a Python keyword, we have to quote the 365 import_statement, "alias", module_alias);
373 // module name and import it using importlib. Otherwise the usual kind of
374 // import statement would result in a syntax error from the presence of
375 // the keyword.
376 printer_->Print("import importlib\n");
377 printer_->Print("$alias$ = importlib.import_module('$name$')\n", "alias",
378 module_alias, "name", module_name);
379 } else {
380 int last_dot_pos = module_name.rfind('.');
381 string import_statement;
382 if (last_dot_pos == string::npos) {
383 // NOTE(petya): this is not tested as it would require a protocol buffer
384 // outside of any package, and I don't think that is easily achievable.
385 import_statement = "import " + module_name;
386 } else {
387 import_statement = "from " + module_name.substr(0, last_dot_pos) +
388 " import " + module_name.substr(last_dot_pos + 1);
389 }
390 printer_->Print("$statement$ as $alias$\n", "statement", import_statement,
391 "alias", module_alias);
392 }
393
394 CopyPublicDependenciesAliases(module_alias, file_->dependency(i)); 366 CopyPublicDependenciesAliases(module_alias, file_->dependency(i));
395 } 367 }
396 printer_->Print("\n"); 368 printer_->Print("\n");
397 369
398 // Print public imports. 370 // Print public imports.
399 for (int i = 0; i < file_->public_dependency_count(); ++i) { 371 for (int i = 0; i < file_->public_dependency_count(); ++i) {
400 string module_name = ModuleName(file_->public_dependency(i)->name()); 372 string module_name = ModuleName(file_->public_dependency(i)->name());
401 printer_->Print("from $module$ import *\n", "module", module_name); 373 printer_->Print("from $module$ import *\n", "module", module_name);
402 } 374 }
403 printer_->Print("\n"); 375 printer_->Print("\n");
404 } 376 }
405 377
406 // Prints the single file descriptor for this file. 378 // Prints the single file descriptor for this file.
407 void Generator::PrintFileDescriptor() const { 379 void Generator::PrintFileDescriptor() const {
408 std::map<string, string> m; 380 map<string, string> m;
409 m["descriptor_name"] = kDescriptorKey; 381 m["descriptor_name"] = kDescriptorKey;
410 m["name"] = file_->name(); 382 m["name"] = file_->name();
411 m["package"] = file_->package(); 383 m["package"] = file_->package();
412 m["syntax"] = StringifySyntax(file_->syntax()); 384 m["syntax"] = StringifySyntax(file_->syntax());
413 const char file_descriptor_template[] = 385 const char file_descriptor_template[] =
414 "$descriptor_name$ = _descriptor.FileDescriptor(\n" 386 "$descriptor_name$ = _descriptor.FileDescriptor(\n"
415 " name='$name$',\n" 387 " name='$name$',\n"
416 " package='$package$',\n" 388 " package='$package$',\n"
417 " syntax='$syntax$',\n"; 389 " syntax='$syntax$',\n";
418 printer_->Print(m, file_descriptor_template); 390 printer_->Print(m, file_descriptor_template);
419 printer_->Indent(); 391 printer_->Indent();
420 printer_->Print( 392 printer_->Print(
421 //##!PY25 "serialized_pb=b'$value$'\n", 393 //##!PY25 "serialized_pb=b'$value$'\n",
422 "serialized_pb=_b('$value$')\n", //##PY25 394 "serialized_pb=_b('$value$')\n", //##PY25
423 "value", strings::CHexEscape(file_descriptor_serialized_)); 395 "value", strings::CHexEscape(file_descriptor_serialized_));
424 if (file_->dependency_count() != 0) { 396 if (file_->dependency_count() != 0) {
425 printer_->Print(",\ndependencies=["); 397 printer_->Print(",\ndependencies=[");
426 for (int i = 0; i < file_->dependency_count(); ++i) { 398 for (int i = 0; i < file_->dependency_count(); ++i) {
427 string module_alias = ModuleAlias(file_->dependency(i)->name()); 399 string module_alias = ModuleAlias(file_->dependency(i)->name());
428 printer_->Print("$module_alias$.DESCRIPTOR,", "module_alias", 400 printer_->Print("$module_alias$.DESCRIPTOR,", "module_alias",
429 module_alias); 401 module_alias);
430 } 402 }
431 printer_->Print("]"); 403 printer_->Print("]");
432 } 404 }
433 if (file_->public_dependency_count() > 0) {
434 printer_->Print(",\npublic_dependencies=[");
435 for (int i = 0; i < file_->public_dependency_count(); ++i) {
436 string module_alias = ModuleAlias(file_->public_dependency(i)->name());
437 printer_->Print("$module_alias$.DESCRIPTOR,", "module_alias",
438 module_alias);
439 }
440 printer_->Print("]");
441 }
442 405
443 // TODO(falk): Also print options and fix the message_type, enum_type, 406 // TODO(falk): Also print options and fix the message_type, enum_type,
444 // service and extension later in the generation. 407 // service and extension later in the generation.
445 408
446 printer_->Outdent(); 409 printer_->Outdent();
447 printer_->Print(")\n"); 410 printer_->Print(")\n");
448 printer_->Print("_sym_db.RegisterFileDescriptor($name$)\n", "name", 411 printer_->Print("_sym_db.RegisterFileDescriptor($name$)\n", "name",
449 kDescriptorKey); 412 kDescriptorKey);
450 printer_->Print("\n"); 413 printer_->Print("\n");
451 } 414 }
452 415
453 // Prints descriptors and module-level constants for all top-level 416 // Prints descriptors and module-level constants for all top-level
454 // enums defined in |file|. 417 // enums defined in |file|.
455 void Generator::PrintTopLevelEnums() const { 418 void Generator::PrintTopLevelEnums() const {
456 std::vector<std::pair<string, int> > top_level_enum_values; 419 vector<pair<string, int> > top_level_enum_values;
457 for (int i = 0; i < file_->enum_type_count(); ++i) { 420 for (int i = 0; i < file_->enum_type_count(); ++i) {
458 const EnumDescriptor& enum_descriptor = *file_->enum_type(i); 421 const EnumDescriptor& enum_descriptor = *file_->enum_type(i);
459 PrintEnum(enum_descriptor); 422 PrintEnum(enum_descriptor);
460 printer_->Print("$name$ = " 423 printer_->Print("$name$ = "
461 "enum_type_wrapper.EnumTypeWrapper($descriptor_name$)", 424 "enum_type_wrapper.EnumTypeWrapper($descriptor_name$)",
462 "name", enum_descriptor.name(), 425 "name", enum_descriptor.name(),
463 "descriptor_name", 426 "descriptor_name",
464 ModuleLevelDescriptorName(enum_descriptor)); 427 ModuleLevelDescriptorName(enum_descriptor));
465 printer_->Print("\n"); 428 printer_->Print("\n");
466 429
(...skipping 16 matching lines...) Expand all
483 void Generator::PrintAllNestedEnumsInFile() const { 446 void Generator::PrintAllNestedEnumsInFile() const {
484 for (int i = 0; i < file_->message_type_count(); ++i) { 447 for (int i = 0; i < file_->message_type_count(); ++i) {
485 PrintNestedEnums(*file_->message_type(i)); 448 PrintNestedEnums(*file_->message_type(i));
486 } 449 }
487 } 450 }
488 451
489 // Prints a Python statement assigning the appropriate module-level 452 // Prints a Python statement assigning the appropriate module-level
490 // enum name to a Python EnumDescriptor object equivalent to 453 // enum name to a Python EnumDescriptor object equivalent to
491 // enum_descriptor. 454 // enum_descriptor.
492 void Generator::PrintEnum(const EnumDescriptor& enum_descriptor) const { 455 void Generator::PrintEnum(const EnumDescriptor& enum_descriptor) const {
493 std::map<string, string> m; 456 map<string, string> m;
494 string module_level_descriptor_name = 457 string module_level_descriptor_name =
495 ModuleLevelDescriptorName(enum_descriptor); 458 ModuleLevelDescriptorName(enum_descriptor);
496 m["descriptor_name"] = module_level_descriptor_name; 459 m["descriptor_name"] = module_level_descriptor_name;
497 m["name"] = enum_descriptor.name(); 460 m["name"] = enum_descriptor.name();
498 m["full_name"] = enum_descriptor.full_name(); 461 m["full_name"] = enum_descriptor.full_name();
499 m["file"] = kDescriptorKey; 462 m["file"] = kDescriptorKey;
500 const char enum_descriptor_template[] = 463 const char enum_descriptor_template[] =
501 "$descriptor_name$ = _descriptor.EnumDescriptor(\n" 464 "$descriptor_name$ = _descriptor.EnumDescriptor(\n"
502 " name='$name$',\n" 465 " name='$name$',\n"
503 " full_name='$full_name$',\n" 466 " full_name='$full_name$',\n"
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
577 const ServiceDescriptor& descriptor) const { 540 const ServiceDescriptor& descriptor) const {
578 printer_->Print("\n"); 541 printer_->Print("\n");
579 string service_name = ModuleLevelServiceDescriptorName(descriptor); 542 string service_name = ModuleLevelServiceDescriptorName(descriptor);
580 string options_string; 543 string options_string;
581 descriptor.options().SerializeToString(&options_string); 544 descriptor.options().SerializeToString(&options_string);
582 545
583 printer_->Print( 546 printer_->Print(
584 "$service_name$ = _descriptor.ServiceDescriptor(\n", 547 "$service_name$ = _descriptor.ServiceDescriptor(\n",
585 "service_name", service_name); 548 "service_name", service_name);
586 printer_->Indent(); 549 printer_->Indent();
587 std::map<string, string> m; 550 map<string, string> m;
588 m["name"] = descriptor.name(); 551 m["name"] = descriptor.name();
589 m["full_name"] = descriptor.full_name(); 552 m["full_name"] = descriptor.full_name();
590 m["file"] = kDescriptorKey; 553 m["file"] = kDescriptorKey;
591 m["index"] = SimpleItoa(descriptor.index()); 554 m["index"] = SimpleItoa(descriptor.index());
592 m["options_value"] = OptionsValue("ServiceOptions", options_string); 555 m["options_value"] = OptionsValue("ServiceOptions", options_string);
593 const char required_function_arguments[] = 556 const char required_function_arguments[] =
594 "name='$name$',\n" 557 "name='$name$',\n"
595 "full_name='$full_name$',\n" 558 "full_name='$full_name$',\n"
596 "file=$file$,\n" 559 "file=$file$,\n"
597 "index=$index$,\n" 560 "index=$index$,\n"
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
673 // 636 //
674 // Mutually recursive with PrintNestedDescriptors(). 637 // Mutually recursive with PrintNestedDescriptors().
675 void Generator::PrintDescriptor(const Descriptor& message_descriptor) const { 638 void Generator::PrintDescriptor(const Descriptor& message_descriptor) const {
676 PrintNestedDescriptors(message_descriptor); 639 PrintNestedDescriptors(message_descriptor);
677 640
678 printer_->Print("\n"); 641 printer_->Print("\n");
679 printer_->Print("$descriptor_name$ = _descriptor.Descriptor(\n", 642 printer_->Print("$descriptor_name$ = _descriptor.Descriptor(\n",
680 "descriptor_name", 643 "descriptor_name",
681 ModuleLevelDescriptorName(message_descriptor)); 644 ModuleLevelDescriptorName(message_descriptor));
682 printer_->Indent(); 645 printer_->Indent();
683 std::map<string, string> m; 646 map<string, string> m;
684 m["name"] = message_descriptor.name(); 647 m["name"] = message_descriptor.name();
685 m["full_name"] = message_descriptor.full_name(); 648 m["full_name"] = message_descriptor.full_name();
686 m["file"] = kDescriptorKey; 649 m["file"] = kDescriptorKey;
687 const char required_function_arguments[] = 650 const char required_function_arguments[] =
688 "name='$name$',\n" 651 "name='$name$',\n"
689 "full_name='$full_name$',\n" 652 "full_name='$full_name$',\n"
690 "filename=None,\n" 653 "filename=None,\n"
691 "file=$file$,\n" 654 "file=$file$,\n"
692 "containing_type=None,\n"; 655 "containing_type=None,\n";
693 printer_->Print(m, required_function_arguments); 656 printer_->Print(m, required_function_arguments);
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
733 message_descriptor.extension_range(i); 696 message_descriptor.extension_range(i);
734 printer_->Print("($start$, $end$), ", 697 printer_->Print("($start$, $end$), ",
735 "start", SimpleItoa(range->start), 698 "start", SimpleItoa(range->start),
736 "end", SimpleItoa(range->end)); 699 "end", SimpleItoa(range->end));
737 } 700 }
738 printer_->Print("],\n"); 701 printer_->Print("],\n");
739 printer_->Print("oneofs=[\n"); 702 printer_->Print("oneofs=[\n");
740 printer_->Indent(); 703 printer_->Indent();
741 for (int i = 0; i < message_descriptor.oneof_decl_count(); ++i) { 704 for (int i = 0; i < message_descriptor.oneof_decl_count(); ++i) {
742 const OneofDescriptor* desc = message_descriptor.oneof_decl(i); 705 const OneofDescriptor* desc = message_descriptor.oneof_decl(i);
743 std::map<string, string> m; 706 map<string, string> m;
744 m["name"] = desc->name(); 707 m["name"] = desc->name();
745 m["full_name"] = desc->full_name(); 708 m["full_name"] = desc->full_name();
746 m["index"] = SimpleItoa(desc->index()); 709 m["index"] = SimpleItoa(desc->index());
747 string options_string =
748 OptionsValue("OneofOptions", desc->options().SerializeAsString());
749 if (options_string == "None") {
750 m["options"] = "";
751 } else {
752 m["options"] = ", options=" + options_string;
753 }
754 printer_->Print( 710 printer_->Print(
755 m, 711 m,
756 "_descriptor.OneofDescriptor(\n" 712 "_descriptor.OneofDescriptor(\n"
757 " name='$name$', full_name='$full_name$',\n" 713 " name='$name$', full_name='$full_name$',\n"
758 " index=$index$, containing_type=None, fields=[]$options$),\n"); 714 " index=$index$, containing_type=None, fields=[]),\n");
759 } 715 }
760 printer_->Outdent(); 716 printer_->Outdent();
761 printer_->Print("],\n"); 717 printer_->Print("],\n");
762 // Serialization of proto 718 // Serialization of proto
763 DescriptorProto edp; 719 DescriptorProto edp;
764 PrintSerializedPbInterval(message_descriptor, edp); 720 PrintSerializedPbInterval(message_descriptor, edp);
765 721
766 printer_->Outdent(); 722 printer_->Outdent();
767 printer_->Print(")\n"); 723 printer_->Print(")\n");
768 } 724 }
769 725
770 // Prints Python Descriptor objects for all nested types contained in 726 // Prints Python Descriptor objects for all nested types contained in
771 // message_descriptor. 727 // message_descriptor.
772 // 728 //
773 // Mutually recursive with PrintDescriptor(). 729 // Mutually recursive with PrintDescriptor().
774 void Generator::PrintNestedDescriptors( 730 void Generator::PrintNestedDescriptors(
775 const Descriptor& containing_descriptor) const { 731 const Descriptor& containing_descriptor) const {
776 for (int i = 0; i < containing_descriptor.nested_type_count(); ++i) { 732 for (int i = 0; i < containing_descriptor.nested_type_count(); ++i) {
777 PrintDescriptor(*containing_descriptor.nested_type(i)); 733 PrintDescriptor(*containing_descriptor.nested_type(i));
778 } 734 }
779 } 735 }
780 736
781 // Prints all messages in |file|. 737 // Prints all messages in |file|.
782 void Generator::PrintMessages() const { 738 void Generator::PrintMessages() const {
783 for (int i = 0; i < file_->message_type_count(); ++i) { 739 for (int i = 0; i < file_->message_type_count(); ++i) {
784 std::vector<string> to_register; 740 vector<string> to_register;
785 PrintMessage(*file_->message_type(i), "", &to_register); 741 PrintMessage(*file_->message_type(i), "", &to_register);
786 for (int j = 0; j < to_register.size(); ++j) { 742 for (int j = 0; j < to_register.size(); ++j) {
787 printer_->Print("_sym_db.RegisterMessage($name$)\n", "name", 743 printer_->Print("_sym_db.RegisterMessage($name$)\n", "name",
788 to_register[j]); 744 to_register[j]);
789 } 745 }
790 printer_->Print("\n"); 746 printer_->Print("\n");
791 } 747 }
792 } 748 }
793 749
794 // Prints a Python class for the given message descriptor. We defer to the 750 // Prints a Python class for the given message descriptor. We defer to the
795 // metaclass to do almost all of the work of actually creating a useful class. 751 // metaclass to do almost all of the work of actually creating a useful class.
796 // The purpose of this function and its many helper functions above is merely 752 // The purpose of this function and its many helper functions above is merely
797 // to output a Python version of the descriptors, which the metaclass in 753 // to output a Python version of the descriptors, which the metaclass in
798 // reflection.py will use to construct the meat of the class itself. 754 // reflection.py will use to construct the meat of the class itself.
799 // 755 //
800 // Mutually recursive with PrintNestedMessages(). 756 // Mutually recursive with PrintNestedMessages().
801 // Collect nested message names to_register for the symbol_database. 757 // Collect nested message names to_register for the symbol_database.
802 void Generator::PrintMessage(const Descriptor& message_descriptor, 758 void Generator::PrintMessage(const Descriptor& message_descriptor,
803 const string& prefix, 759 const string& prefix,
804 std::vector<string>* to_register) const { 760 vector<string>* to_register) const {
805 string qualified_name(prefix + message_descriptor.name()); 761 string qualified_name(prefix + message_descriptor.name());
806 to_register->push_back(qualified_name); 762 to_register->push_back(qualified_name);
807 printer_->Print( 763 printer_->Print(
808 "$name$ = _reflection.GeneratedProtocolMessageType('$name$', " 764 "$name$ = _reflection.GeneratedProtocolMessageType('$name$', "
809 "(_message.Message,), dict(\n", 765 "(_message.Message,), dict(\n",
810 "name", message_descriptor.name()); 766 "name", message_descriptor.name());
811 printer_->Indent(); 767 printer_->Indent();
812 768
813 PrintNestedMessages(message_descriptor, qualified_name + ".", to_register); 769 PrintNestedMessages(message_descriptor, qualified_name + ".", to_register);
814 std::map<string, string> m; 770 map<string, string> m;
815 m["descriptor_key"] = kDescriptorKey; 771 m["descriptor_key"] = kDescriptorKey;
816 m["descriptor_name"] = ModuleLevelDescriptorName(message_descriptor); 772 m["descriptor_name"] = ModuleLevelDescriptorName(message_descriptor);
817 printer_->Print(m, "$descriptor_key$ = $descriptor_name$,\n"); 773 printer_->Print(m, "$descriptor_key$ = $descriptor_name$,\n");
818 printer_->Print("__module__ = '$module_name$'\n", 774 printer_->Print("__module__ = '$module_name$'\n",
819 "module_name", ModuleName(file_->name())); 775 "module_name", ModuleName(file_->name()));
820 printer_->Print("# @@protoc_insertion_point(class_scope:$full_name$)\n", 776 printer_->Print("# @@protoc_insertion_point(class_scope:$full_name$)\n",
821 "full_name", message_descriptor.full_name()); 777 "full_name", message_descriptor.full_name());
822 printer_->Print("))\n"); 778 printer_->Print("))\n");
823 printer_->Outdent(); 779 printer_->Outdent();
824 } 780 }
825 781
826 // Prints all nested messages within |containing_descriptor|. 782 // Prints all nested messages within |containing_descriptor|.
827 // Mutually recursive with PrintMessage(). 783 // Mutually recursive with PrintMessage().
828 void Generator::PrintNestedMessages(const Descriptor& containing_descriptor, 784 void Generator::PrintNestedMessages(const Descriptor& containing_descriptor,
829 const string& prefix, 785 const string& prefix,
830 std::vector<string>* to_register) const { 786 vector<string>* to_register) const {
831 for (int i = 0; i < containing_descriptor.nested_type_count(); ++i) { 787 for (int i = 0; i < containing_descriptor.nested_type_count(); ++i) {
832 printer_->Print("\n"); 788 printer_->Print("\n");
833 PrintMessage(*containing_descriptor.nested_type(i), prefix, to_register); 789 PrintMessage(*containing_descriptor.nested_type(i), prefix, to_register);
834 printer_->Print(",\n"); 790 printer_->Print(",\n");
835 } 791 }
836 } 792 }
837 793
838 // Recursively fixes foreign fields in all nested types in |descriptor|, then 794 // Recursively fixes foreign fields in all nested types in |descriptor|, then
839 // sets the message_type and enum_type of all message and enum fields to point 795 // sets the message_type and enum_type of all message and enum fields to point
840 // to their respective descriptors. 796 // to their respective descriptors.
(...skipping 12 matching lines...) Expand all
853 const FieldDescriptor& field_descriptor = *descriptor.field(i); 809 const FieldDescriptor& field_descriptor = *descriptor.field(i);
854 FixForeignFieldsInField(&descriptor, field_descriptor, "fields_by_name"); 810 FixForeignFieldsInField(&descriptor, field_descriptor, "fields_by_name");
855 } 811 }
856 812
857 FixContainingTypeInDescriptor(descriptor, containing_descriptor); 813 FixContainingTypeInDescriptor(descriptor, containing_descriptor);
858 for (int i = 0; i < descriptor.enum_type_count(); ++i) { 814 for (int i = 0; i < descriptor.enum_type_count(); ++i) {
859 const EnumDescriptor& enum_descriptor = *descriptor.enum_type(i); 815 const EnumDescriptor& enum_descriptor = *descriptor.enum_type(i);
860 FixContainingTypeInDescriptor(enum_descriptor, &descriptor); 816 FixContainingTypeInDescriptor(enum_descriptor, &descriptor);
861 } 817 }
862 for (int i = 0; i < descriptor.oneof_decl_count(); ++i) { 818 for (int i = 0; i < descriptor.oneof_decl_count(); ++i) {
863 std::map<string, string> m; 819 map<string, string> m;
864 const OneofDescriptor* oneof = descriptor.oneof_decl(i); 820 const OneofDescriptor* oneof = descriptor.oneof_decl(i);
865 m["descriptor_name"] = ModuleLevelDescriptorName(descriptor); 821 m["descriptor_name"] = ModuleLevelDescriptorName(descriptor);
866 m["oneof_name"] = oneof->name(); 822 m["oneof_name"] = oneof->name();
867 for (int j = 0; j < oneof->field_count(); ++j) { 823 for (int j = 0; j < oneof->field_count(); ++j) {
868 m["field_name"] = oneof->field(j)->name(); 824 m["field_name"] = oneof->field(j)->name();
869 printer_->Print( 825 printer_->Print(
870 m, 826 m,
871 "$descriptor_name$.oneofs_by_name['$oneof_name$'].fields.append(\n" 827 "$descriptor_name$.oneofs_by_name['$oneof_name$'].fields.append(\n"
872 " $descriptor_name$.fields_by_name['$field_name$'])\n"); 828 " $descriptor_name$.fields_by_name['$field_name$'])\n");
873 printer_->Print( 829 printer_->Print(
874 m, 830 m,
875 "$descriptor_name$.fields_by_name['$field_name$'].containing_oneof = " 831 "$descriptor_name$.fields_by_name['$field_name$'].containing_oneof = "
876 "$descriptor_name$.oneofs_by_name['$oneof_name$']\n"); 832 "$descriptor_name$.oneofs_by_name['$oneof_name$']\n");
877 } 833 }
878 } 834 }
879 } 835 }
880 836
881 void Generator::AddMessageToFileDescriptor(const Descriptor& descriptor) const { 837 void Generator::AddMessageToFileDescriptor(const Descriptor& descriptor) const {
882 std::map<string, string> m; 838 map<string, string> m;
883 m["descriptor_name"] = kDescriptorKey; 839 m["descriptor_name"] = kDescriptorKey;
884 m["message_name"] = descriptor.name(); 840 m["message_name"] = descriptor.name();
885 m["message_descriptor_name"] = ModuleLevelDescriptorName(descriptor); 841 m["message_descriptor_name"] = ModuleLevelDescriptorName(descriptor);
886 const char file_descriptor_template[] = 842 const char file_descriptor_template[] =
887 "$descriptor_name$.message_types_by_name['$message_name$'] = " 843 "$descriptor_name$.message_types_by_name['$message_name$'] = "
888 "$message_descriptor_name$\n"; 844 "$message_descriptor_name$\n";
889 printer_->Print(m, file_descriptor_template); 845 printer_->Print(m, file_descriptor_template);
890 } 846 }
891 847
892 void Generator::AddEnumToFileDescriptor( 848 void Generator::AddEnumToFileDescriptor(
893 const EnumDescriptor& descriptor) const { 849 const EnumDescriptor& descriptor) const {
894 std::map<string, string> m; 850 map<string, string> m;
895 m["descriptor_name"] = kDescriptorKey; 851 m["descriptor_name"] = kDescriptorKey;
896 m["enum_name"] = descriptor.name(); 852 m["enum_name"] = descriptor.name();
897 m["enum_descriptor_name"] = ModuleLevelDescriptorName(descriptor); 853 m["enum_descriptor_name"] = ModuleLevelDescriptorName(descriptor);
898 const char file_descriptor_template[] = 854 const char file_descriptor_template[] =
899 "$descriptor_name$.enum_types_by_name['$enum_name$'] = " 855 "$descriptor_name$.enum_types_by_name['$enum_name$'] = "
900 "$enum_descriptor_name$\n"; 856 "$enum_descriptor_name$\n";
901 printer_->Print(m, file_descriptor_template); 857 printer_->Print(m, file_descriptor_template);
902 } 858 }
903 859
904 void Generator::AddExtensionToFileDescriptor( 860 void Generator::AddExtensionToFileDescriptor(
905 const FieldDescriptor& descriptor) const { 861 const FieldDescriptor& descriptor) const {
906 std::map<string, string> m; 862 map<string, string> m;
907 m["descriptor_name"] = kDescriptorKey; 863 m["descriptor_name"] = kDescriptorKey;
908 m["field_name"] = descriptor.name(); 864 m["field_name"] = descriptor.name();
909 const char file_descriptor_template[] = 865 const char file_descriptor_template[] =
910 "$descriptor_name$.extensions_by_name['$field_name$'] = " 866 "$descriptor_name$.extensions_by_name['$field_name$'] = "
911 "$field_name$\n"; 867 "$field_name$\n";
912 printer_->Print(m, file_descriptor_template); 868 printer_->Print(m, file_descriptor_template);
913 } 869 }
914 870
915 // Sets any necessary message_type and enum_type attributes 871 // Sets any necessary message_type and enum_type attributes
916 // for the Python version of |field|. 872 // for the Python version of |field|.
917 // 873 //
918 // containing_type may be NULL, in which case this is a module-level field. 874 // containing_type may be NULL, in which case this is a module-level field.
919 // 875 //
920 // python_dict_name is the name of the Python dict where we should 876 // python_dict_name is the name of the Python dict where we should
921 // look the field up in the containing type. (e.g., fields_by_name 877 // look the field up in the containing type. (e.g., fields_by_name
922 // or extensions_by_name). We ignore python_dict_name if containing_type 878 // or extensions_by_name). We ignore python_dict_name if containing_type
923 // is NULL. 879 // is NULL.
924 void Generator::FixForeignFieldsInField(const Descriptor* containing_type, 880 void Generator::FixForeignFieldsInField(const Descriptor* containing_type,
925 const FieldDescriptor& field, 881 const FieldDescriptor& field,
926 const string& python_dict_name) const { 882 const string& python_dict_name) const {
927 const string field_referencing_expression = FieldReferencingExpression( 883 const string field_referencing_expression = FieldReferencingExpression(
928 containing_type, field, python_dict_name); 884 containing_type, field, python_dict_name);
929 std::map<string, string> m; 885 map<string, string> m;
930 m["field_ref"] = field_referencing_expression; 886 m["field_ref"] = field_referencing_expression;
931 const Descriptor* foreign_message_type = field.message_type(); 887 const Descriptor* foreign_message_type = field.message_type();
932 if (foreign_message_type) { 888 if (foreign_message_type) {
933 m["foreign_type"] = ModuleLevelDescriptorName(*foreign_message_type); 889 m["foreign_type"] = ModuleLevelDescriptorName(*foreign_message_type);
934 printer_->Print(m, "$field_ref$.message_type = $foreign_type$\n"); 890 printer_->Print(m, "$field_ref$.message_type = $foreign_type$\n");
935 } 891 }
936 const EnumDescriptor* enum_type = field.enum_type(); 892 const EnumDescriptor* enum_type = field.enum_type();
937 if (enum_type) { 893 if (enum_type) {
938 m["enum_type"] = ModuleLevelDescriptorName(*enum_type); 894 m["enum_type"] = ModuleLevelDescriptorName(*enum_type);
939 printer_->Print(m, "$field_ref$.enum_type = $enum_type$\n"); 895 printer_->Print(m, "$field_ref$.enum_type = $enum_type$\n");
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
1018 } 974 }
1019 975
1020 void Generator::FixForeignFieldsInExtension( 976 void Generator::FixForeignFieldsInExtension(
1021 const FieldDescriptor& extension_field) const { 977 const FieldDescriptor& extension_field) const {
1022 GOOGLE_CHECK(extension_field.is_extension()); 978 GOOGLE_CHECK(extension_field.is_extension());
1023 // extension_scope() will be NULL for top-level extensions, which is 979 // extension_scope() will be NULL for top-level extensions, which is
1024 // exactly what FixForeignFieldsInField() wants. 980 // exactly what FixForeignFieldsInField() wants.
1025 FixForeignFieldsInField(extension_field.extension_scope(), extension_field, 981 FixForeignFieldsInField(extension_field.extension_scope(), extension_field,
1026 "extensions_by_name"); 982 "extensions_by_name");
1027 983
1028 std::map<string, string> m; 984 map<string, string> m;
1029 // Confusingly, for FieldDescriptors that happen to be extensions, 985 // Confusingly, for FieldDescriptors that happen to be extensions,
1030 // containing_type() means "extended type." 986 // containing_type() means "extended type."
1031 // On the other hand, extension_scope() will give us what we normally 987 // On the other hand, extension_scope() will give us what we normally
1032 // mean by containing_type(). 988 // mean by containing_type().
1033 m["extended_message_class"] = ModuleLevelMessageName( 989 m["extended_message_class"] = ModuleLevelMessageName(
1034 *extension_field.containing_type()); 990 *extension_field.containing_type());
1035 m["field"] = FieldReferencingExpression(extension_field.extension_scope(), 991 m["field"] = FieldReferencingExpression(extension_field.extension_scope(),
1036 extension_field, 992 extension_field,
1037 "extensions_by_name"); 993 "extensions_by_name");
1038 printer_->Print(m, "$extended_message_class$.RegisterExtension($field$)\n"); 994 printer_->Print(m, "$extended_message_class$.RegisterExtension($field$)\n");
(...skipping 12 matching lines...) Expand all
1051 } 1007 }
1052 1008
1053 // Returns a Python expression that instantiates a Python EnumValueDescriptor 1009 // Returns a Python expression that instantiates a Python EnumValueDescriptor
1054 // object for the given C++ descriptor. 1010 // object for the given C++ descriptor.
1055 void Generator::PrintEnumValueDescriptor( 1011 void Generator::PrintEnumValueDescriptor(
1056 const EnumValueDescriptor& descriptor) const { 1012 const EnumValueDescriptor& descriptor) const {
1057 // TODO(robinson): Fix up EnumValueDescriptor "type" fields. 1013 // TODO(robinson): Fix up EnumValueDescriptor "type" fields.
1058 // More circular references. ::sigh:: 1014 // More circular references. ::sigh::
1059 string options_string; 1015 string options_string;
1060 descriptor.options().SerializeToString(&options_string); 1016 descriptor.options().SerializeToString(&options_string);
1061 std::map<string, string> m; 1017 map<string, string> m;
1062 m["name"] = descriptor.name(); 1018 m["name"] = descriptor.name();
1063 m["index"] = SimpleItoa(descriptor.index()); 1019 m["index"] = SimpleItoa(descriptor.index());
1064 m["number"] = SimpleItoa(descriptor.number()); 1020 m["number"] = SimpleItoa(descriptor.number());
1065 m["options"] = OptionsValue("EnumValueOptions", options_string); 1021 m["options"] = OptionsValue("EnumValueOptions", options_string);
1066 printer_->Print( 1022 printer_->Print(
1067 m, 1023 m,
1068 "_descriptor.EnumValueDescriptor(\n" 1024 "_descriptor.EnumValueDescriptor(\n"
1069 " name='$name$', index=$index$, number=$number$,\n" 1025 " name='$name$', index=$index$, number=$number$,\n"
1070 " options=$options$,\n" 1026 " options=$options$,\n"
1071 " type=None)"); 1027 " type=None)");
(...skipping 12 matching lines...) Expand all
1084 return "_descriptor._ParseOptions(" + full_class_name + "(), _b('" //##PY25 1040 return "_descriptor._ParseOptions(" + full_class_name + "(), _b('" //##PY25
1085 + CEscape(serialized_options)+ "'))"; //##PY25 1041 + CEscape(serialized_options)+ "'))"; //##PY25
1086 } 1042 }
1087 } 1043 }
1088 1044
1089 // Prints an expression for a Python FieldDescriptor for |field|. 1045 // Prints an expression for a Python FieldDescriptor for |field|.
1090 void Generator::PrintFieldDescriptor( 1046 void Generator::PrintFieldDescriptor(
1091 const FieldDescriptor& field, bool is_extension) const { 1047 const FieldDescriptor& field, bool is_extension) const {
1092 string options_string; 1048 string options_string;
1093 field.options().SerializeToString(&options_string); 1049 field.options().SerializeToString(&options_string);
1094 std::map<string, string> m; 1050 map<string, string> m;
1095 m["name"] = field.name(); 1051 m["name"] = field.name();
1096 m["full_name"] = field.full_name(); 1052 m["full_name"] = field.full_name();
1097 m["index"] = SimpleItoa(field.index()); 1053 m["index"] = SimpleItoa(field.index());
1098 m["number"] = SimpleItoa(field.number()); 1054 m["number"] = SimpleItoa(field.number());
1099 m["type"] = SimpleItoa(field.type()); 1055 m["type"] = SimpleItoa(field.type());
1100 m["cpp_type"] = SimpleItoa(field.cpp_type()); 1056 m["cpp_type"] = SimpleItoa(field.cpp_type());
1101 m["label"] = SimpleItoa(field.label()); 1057 m["label"] = SimpleItoa(field.label());
1102 m["has_default_value"] = field.has_default_value() ? "True" : "False"; 1058 m["has_default_value"] = field.has_default_value() ? "True" : "False";
1103 m["default_value"] = StringifyDefaultValue(field); 1059 m["default_value"] = StringifyDefaultValue(field);
1104 m["is_extension"] = is_extension ? "True" : "False"; 1060 m["is_extension"] = is_extension ? "True" : "False";
1105 m["options"] = OptionsValue("FieldOptions", options_string); 1061 m["options"] = OptionsValue("FieldOptions", options_string);
1106 m["json_name"] = field.has_json_name() ?
1107 ", json_name='" + field.json_name() + "'": "";
1108 // We always set message_type and enum_type to None at this point, and then 1062 // We always set message_type and enum_type to None at this point, and then
1109 // these fields in correctly after all referenced descriptors have been 1063 // these fields in correctly after all referenced descriptors have been
1110 // defined and/or imported (see FixForeignFieldsInDescriptors()). 1064 // defined and/or imported (see FixForeignFieldsInDescriptors()).
1111 const char field_descriptor_decl[] = 1065 const char field_descriptor_decl[] =
1112 "_descriptor.FieldDescriptor(\n" 1066 "_descriptor.FieldDescriptor(\n"
1113 " name='$name$', full_name='$full_name$', index=$index$,\n" 1067 " name='$name$', full_name='$full_name$', index=$index$,\n"
1114 " number=$number$, type=$type$, cpp_type=$cpp_type$, label=$label$,\n" 1068 " number=$number$, type=$type$, cpp_type=$cpp_type$, label=$label$,\n"
1115 " has_default_value=$has_default_value$, default_value=$default_value$,\n" 1069 " has_default_value=$has_default_value$, default_value=$default_value$,\n"
1116 " message_type=None, enum_type=None, containing_type=None,\n" 1070 " message_type=None, enum_type=None, containing_type=None,\n"
1117 " is_extension=$is_extension$, extension_scope=None,\n" 1071 " is_extension=$is_extension$, extension_scope=None,\n"
1118 " options=$options$$json_name$)"; 1072 " options=$options$)";
1119 printer_->Print(m, field_descriptor_decl); 1073 printer_->Print(m, field_descriptor_decl);
1120 } 1074 }
1121 1075
1122 // Helper for Print{Fields,Extensions}InDescriptor(). 1076 // Helper for Print{Fields,Extensions}InDescriptor().
1123 void Generator::PrintFieldDescriptorsInDescriptor( 1077 void Generator::PrintFieldDescriptorsInDescriptor(
1124 const Descriptor& message_descriptor, 1078 const Descriptor& message_descriptor,
1125 bool is_extension, 1079 bool is_extension,
1126 const string& list_variable_name, 1080 const string& list_variable_name,
1127 int (Descriptor::*CountFn)() const, 1081 int (Descriptor::*CountFn)() const,
1128 const FieldDescriptor* (Descriptor::*GetterFn)(int) const) const { 1082 const FieldDescriptor* (Descriptor::*GetterFn)(int) const) const {
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after
1274 const FieldDescriptor& field = *file_->extension(i); 1228 const FieldDescriptor& field = *file_->extension(i);
1275 FixOptionsForField(field); 1229 FixOptionsForField(field);
1276 } 1230 }
1277 // Prints expressions that set the options for all messages, nested enums, 1231 // Prints expressions that set the options for all messages, nested enums,
1278 // nested extensions and message fields. 1232 // nested extensions and message fields.
1279 for (int i = 0; i < file_->message_type_count(); ++i) { 1233 for (int i = 0; i < file_->message_type_count(); ++i) {
1280 FixOptionsForMessage(*file_->message_type(i)); 1234 FixOptionsForMessage(*file_->message_type(i));
1281 } 1235 }
1282 } 1236 }
1283 1237
1284 void Generator::FixOptionsForOneof(const OneofDescriptor& oneof) const {
1285 string oneof_options = OptionsValue(
1286 "OneofOptions", oneof.options().SerializeAsString());
1287 if (oneof_options != "None") {
1288 string oneof_name = strings::Substitute(
1289 "$0.$1['$2']",
1290 ModuleLevelDescriptorName(*oneof.containing_type()),
1291 "oneofs_by_name", oneof.name());
1292 PrintDescriptorOptionsFixingCode(oneof_name, oneof_options, printer_);
1293 }
1294 }
1295
1296 // Prints expressions that set the options for an enum descriptor and its 1238 // Prints expressions that set the options for an enum descriptor and its
1297 // value descriptors. 1239 // value descriptors.
1298 void Generator::FixOptionsForEnum(const EnumDescriptor& enum_descriptor) const { 1240 void Generator::FixOptionsForEnum(const EnumDescriptor& enum_descriptor) const {
1299 string descriptor_name = ModuleLevelDescriptorName(enum_descriptor); 1241 string descriptor_name = ModuleLevelDescriptorName(enum_descriptor);
1300 string enum_options = OptionsValue( 1242 string enum_options = OptionsValue(
1301 "EnumOptions", enum_descriptor.options().SerializeAsString()); 1243 "EnumOptions", enum_descriptor.options().SerializeAsString());
1302 if (enum_options != "None") { 1244 if (enum_options != "None") {
1303 PrintDescriptorOptionsFixingCode(descriptor_name, enum_options, printer_); 1245 PrintDescriptorOptionsFixingCode(descriptor_name, enum_options, printer_);
1304 } 1246 }
1305 for (int i = 0; i < enum_descriptor.value_count(); ++i) { 1247 for (int i = 0; i < enum_descriptor.value_count(); ++i) {
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
1339 } 1281 }
1340 } 1282 }
1341 1283
1342 // Prints expressions that set the options for a message and all its inner 1284 // Prints expressions that set the options for a message and all its inner
1343 // types (nested messages, nested enums, extensions, fields). 1285 // types (nested messages, nested enums, extensions, fields).
1344 void Generator::FixOptionsForMessage(const Descriptor& descriptor) const { 1286 void Generator::FixOptionsForMessage(const Descriptor& descriptor) const {
1345 // Nested messages. 1287 // Nested messages.
1346 for (int i = 0; i < descriptor.nested_type_count(); ++i) { 1288 for (int i = 0; i < descriptor.nested_type_count(); ++i) {
1347 FixOptionsForMessage(*descriptor.nested_type(i)); 1289 FixOptionsForMessage(*descriptor.nested_type(i));
1348 } 1290 }
1349 // Oneofs.
1350 for (int i = 0; i < descriptor.oneof_decl_count(); ++i) {
1351 FixOptionsForOneof(*descriptor.oneof_decl(i));
1352 }
1353 // Enums. 1291 // Enums.
1354 for (int i = 0; i < descriptor.enum_type_count(); ++i) { 1292 for (int i = 0; i < descriptor.enum_type_count(); ++i) {
1355 FixOptionsForEnum(*descriptor.enum_type(i)); 1293 FixOptionsForEnum(*descriptor.enum_type(i));
1356 } 1294 }
1357 // Fields. 1295 // Fields.
1358 for (int i = 0; i < descriptor.field_count(); ++i) { 1296 for (int i = 0; i < descriptor.field_count(); ++i) {
1359 const FieldDescriptor& field = *descriptor.field(i); 1297 const FieldDescriptor& field = *descriptor.field(i);
1360 FixOptionsForField(field); 1298 FixOptionsForField(field);
1361 } 1299 }
1362 // Extensions. 1300 // Extensions.
(...skipping 21 matching lines...) Expand all
1384 printer_->Print("$alias$ = $copy_from$.$alias$\n", "alias", module_alias, 1322 printer_->Print("$alias$ = $copy_from$.$alias$\n", "alias", module_alias,
1385 "copy_from", copy_from); 1323 "copy_from", copy_from);
1386 CopyPublicDependenciesAliases(copy_from, file->public_dependency(i)); 1324 CopyPublicDependenciesAliases(copy_from, file->public_dependency(i));
1387 } 1325 }
1388 } 1326 }
1389 1327
1390 } // namespace python 1328 } // namespace python
1391 } // namespace compiler 1329 } // namespace compiler
1392 } // namespace protobuf 1330 } // namespace protobuf
1393 } // namespace google 1331 } // namespace google
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698