Index: third_party/protobuf/python/google/protobuf/descriptor_pool.py |
diff --git a/third_party/protobuf/python/google/protobuf/descriptor_pool.py b/third_party/protobuf/python/google/protobuf/descriptor_pool.py |
index fc3a7f4404442e46921ba50bca834237605e77c1..20a33701720ee1ed4102a5b8d9906e792f9915cf 100644 |
--- a/third_party/protobuf/python/google/protobuf/descriptor_pool.py |
+++ b/third_party/protobuf/python/google/protobuf/descriptor_pool.py |
@@ -57,14 +57,12 @@ directly instead of this class. |
__author__ = 'matthewtoia@google.com (Matt Toia)' |
-import collections |
- |
from google.protobuf import descriptor |
from google.protobuf import descriptor_database |
from google.protobuf import text_encoding |
-_USE_C_DESCRIPTORS = descriptor._USE_C_DESCRIPTORS # pylint: disable=protected-access |
+_USE_C_DESCRIPTORS = descriptor._USE_C_DESCRIPTORS |
def _NormalizeFullyQualifiedName(name): |
@@ -82,22 +80,6 @@ def _NormalizeFullyQualifiedName(name): |
return name.lstrip('.') |
-def _OptionsOrNone(descriptor_proto): |
- """Returns the value of the field `options`, or None if it is not set.""" |
- if descriptor_proto.HasField('options'): |
- return descriptor_proto.options |
- else: |
- return None |
- |
- |
-def _IsMessageSetExtension(field): |
- return (field.is_extension and |
- field.containing_type.has_options and |
- field.containing_type.GetOptions().message_set_wire_format and |
- field.type == descriptor.FieldDescriptor.TYPE_MESSAGE and |
- field.label == descriptor.FieldDescriptor.LABEL_OPTIONAL) |
- |
- |
class DescriptorPool(object): |
"""A collection of protobufs dynamically constructed by descriptor protos.""" |
@@ -125,12 +107,6 @@ class DescriptorPool(object): |
self._descriptors = {} |
self._enum_descriptors = {} |
self._file_descriptors = {} |
- self._toplevel_extensions = {} |
- # We store extensions in two two-level mappings: The first key is the |
- # descriptor of the message being extended, the second key is the extension |
- # full name or its tag number. |
- self._extensions_by_name = collections.defaultdict(dict) |
- self._extensions_by_number = collections.defaultdict(dict) |
def Add(self, file_desc_proto): |
"""Adds the FileDescriptorProto and its types to this pool. |
@@ -186,48 +162,6 @@ class DescriptorPool(object): |
self._enum_descriptors[enum_desc.full_name] = enum_desc |
self.AddFileDescriptor(enum_desc.file) |
- def AddExtensionDescriptor(self, extension): |
- """Adds a FieldDescriptor describing an extension to the pool. |
- |
- Args: |
- extension: A FieldDescriptor. |
- |
- Raises: |
- AssertionError: when another extension with the same number extends the |
- same message. |
- TypeError: when the specified extension is not a |
- descriptor.FieldDescriptor. |
- """ |
- if not (isinstance(extension, descriptor.FieldDescriptor) and |
- extension.is_extension): |
- raise TypeError('Expected an extension descriptor.') |
- |
- if extension.extension_scope is None: |
- self._toplevel_extensions[extension.full_name] = extension |
- |
- try: |
- existing_desc = self._extensions_by_number[ |
- extension.containing_type][extension.number] |
- except KeyError: |
- pass |
- else: |
- if extension is not existing_desc: |
- raise AssertionError( |
- 'Extensions "%s" and "%s" both try to extend message type "%s" ' |
- 'with field number %d.' % |
- (extension.full_name, existing_desc.full_name, |
- extension.containing_type.full_name, extension.number)) |
- |
- self._extensions_by_number[extension.containing_type][ |
- extension.number] = extension |
- self._extensions_by_name[extension.containing_type][ |
- extension.full_name] = extension |
- |
- # Also register MessageSet extensions with the type name. |
- if _IsMessageSetExtension(extension): |
- self._extensions_by_name[extension.containing_type][ |
- extension.message_type.full_name] = extension |
- |
def AddFileDescriptor(self, file_desc): |
"""Adds a FileDescriptor to the pool, non-recursively. |
@@ -360,14 +294,6 @@ class DescriptorPool(object): |
A FieldDescriptor, describing the named extension. |
""" |
full_name = _NormalizeFullyQualifiedName(full_name) |
- try: |
- # The proto compiler does not give any link between the FileDescriptor |
- # and top-level extensions unless the FileDescriptorProto is added to |
- # the DescriptorDatabase, but this can impact memory usage. |
- # So we registered these extensions by name explicitly. |
- return self._toplevel_extensions[full_name] |
- except KeyError: |
- pass |
message_name, _, extension_name = full_name.rpartition('.') |
try: |
# Most extensions are nested inside a message. |
@@ -377,39 +303,6 @@ class DescriptorPool(object): |
scope = self.FindFileContainingSymbol(full_name) |
return scope.extensions_by_name[extension_name] |
- def FindExtensionByNumber(self, message_descriptor, number): |
- """Gets the extension of the specified message with the specified number. |
- |
- Extensions have to be registered to this pool by calling |
- AddExtensionDescriptor. |
- |
- Args: |
- message_descriptor: descriptor of the extended message. |
- number: integer, number of the extension field. |
- |
- Returns: |
- A FieldDescriptor describing the extension. |
- |
- Raise: |
- KeyError: when no extension with the given number is known for the |
- specified message. |
- """ |
- return self._extensions_by_number[message_descriptor][number] |
- |
- def FindAllExtensions(self, message_descriptor): |
- """Gets all the known extension of a given message. |
- |
- Extensions have to be registered to this pool by calling |
- AddExtensionDescriptor. |
- |
- Args: |
- message_descriptor: descriptor of the extended message. |
- |
- Returns: |
- A list of FieldDescriptor describing the extensions. |
- """ |
- return list(self._extensions_by_number[message_descriptor].values()) |
- |
def _ConvertFileProtoToFileDescriptor(self, file_proto): |
"""Creates a FileDescriptor from a proto or returns a cached copy. |
@@ -433,61 +326,73 @@ class DescriptorPool(object): |
name=file_proto.name, |
package=file_proto.package, |
syntax=file_proto.syntax, |
- options=_OptionsOrNone(file_proto), |
+ options=file_proto.options, |
serialized_pb=file_proto.SerializeToString(), |
dependencies=direct_deps, |
public_dependencies=public_deps) |
- scope = {} |
- |
- # This loop extracts all the message and enum types from all the |
- # dependencies of the file_proto. This is necessary to create the |
- # scope of available message types when defining the passed in |
- # file proto. |
- for dependency in built_deps: |
- scope.update(self._ExtractSymbols( |
- dependency.message_types_by_name.values())) |
- scope.update((_PrefixWithDot(enum.full_name), enum) |
- for enum in dependency.enum_types_by_name.values()) |
- |
- for message_type in file_proto.message_type: |
- message_desc = self._ConvertMessageDescriptor( |
- message_type, file_proto.package, file_descriptor, scope, |
- file_proto.syntax) |
- file_descriptor.message_types_by_name[message_desc.name] = ( |
- message_desc) |
- |
- for enum_type in file_proto.enum_type: |
- file_descriptor.enum_types_by_name[enum_type.name] = ( |
- self._ConvertEnumDescriptor(enum_type, file_proto.package, |
- file_descriptor, None, scope)) |
- |
- for index, extension_proto in enumerate(file_proto.extension): |
- extension_desc = self._MakeFieldDescriptor( |
- extension_proto, file_proto.package, index, is_extension=True) |
- extension_desc.containing_type = self._GetTypeFromScope( |
- file_descriptor.package, extension_proto.extendee, scope) |
- self._SetFieldType(extension_proto, extension_desc, |
- file_descriptor.package, scope) |
- file_descriptor.extensions_by_name[extension_desc.name] = ( |
- extension_desc) |
- |
- for desc_proto in file_proto.message_type: |
- self._SetAllFieldTypes(file_proto.package, desc_proto, scope) |
- |
- if file_proto.package: |
- desc_proto_prefix = _PrefixWithDot(file_proto.package) |
+ if _USE_C_DESCRIPTORS: |
+ # When using C++ descriptors, all objects defined in the file were added |
+ # to the C++ database when the FileDescriptor was built above. |
+ # Just add them to this descriptor pool. |
+ def _AddMessageDescriptor(message_desc): |
+ self._descriptors[message_desc.full_name] = message_desc |
+ for nested in message_desc.nested_types: |
+ _AddMessageDescriptor(nested) |
+ for enum_type in message_desc.enum_types: |
+ _AddEnumDescriptor(enum_type) |
+ def _AddEnumDescriptor(enum_desc): |
+ self._enum_descriptors[enum_desc.full_name] = enum_desc |
+ for message_type in file_descriptor.message_types_by_name.values(): |
+ _AddMessageDescriptor(message_type) |
+ for enum_type in file_descriptor.enum_types_by_name.values(): |
+ _AddEnumDescriptor(enum_type) |
else: |
- desc_proto_prefix = '' |
- |
- for desc_proto in file_proto.message_type: |
- desc = self._GetTypeFromScope( |
- desc_proto_prefix, desc_proto.name, scope) |
- file_descriptor.message_types_by_name[desc_proto.name] = desc |
+ scope = {} |
+ |
+ # This loop extracts all the message and enum types from all the |
+ # dependencies of the file_proto. This is necessary to create the |
+ # scope of available message types when defining the passed in |
+ # file proto. |
+ for dependency in built_deps: |
+ scope.update(self._ExtractSymbols( |
+ dependency.message_types_by_name.values())) |
+ scope.update((_PrefixWithDot(enum.full_name), enum) |
+ for enum in dependency.enum_types_by_name.values()) |
+ |
+ for message_type in file_proto.message_type: |
+ message_desc = self._ConvertMessageDescriptor( |
+ message_type, file_proto.package, file_descriptor, scope, |
+ file_proto.syntax) |
+ file_descriptor.message_types_by_name[message_desc.name] = ( |
+ message_desc) |
+ |
+ for enum_type in file_proto.enum_type: |
+ file_descriptor.enum_types_by_name[enum_type.name] = ( |
+ self._ConvertEnumDescriptor(enum_type, file_proto.package, |
+ file_descriptor, None, scope)) |
+ |
+ for index, extension_proto in enumerate(file_proto.extension): |
+ extension_desc = self._MakeFieldDescriptor( |
+ extension_proto, file_proto.package, index, is_extension=True) |
+ extension_desc.containing_type = self._GetTypeFromScope( |
+ file_descriptor.package, extension_proto.extendee, scope) |
+ self._SetFieldType(extension_proto, extension_desc, |
+ file_descriptor.package, scope) |
+ file_descriptor.extensions_by_name[extension_desc.name] = ( |
+ extension_desc) |
+ |
+ for desc_proto in file_proto.message_type: |
+ self._SetAllFieldTypes(file_proto.package, desc_proto, scope) |
+ |
+ if file_proto.package: |
+ desc_proto_prefix = _PrefixWithDot(file_proto.package) |
+ else: |
+ desc_proto_prefix = '' |
- for index, service_proto in enumerate(file_proto.service): |
- file_descriptor.services_by_name[service_proto.name] = ( |
- self._MakeServiceDescriptor(service_proto, index, scope, |
- file_proto.package, file_descriptor)) |
+ for desc_proto in file_proto.message_type: |
+ desc = self._GetTypeFromScope( |
+ desc_proto_prefix, desc_proto.name, scope) |
+ file_descriptor.message_types_by_name[desc_proto.name] = desc |
self.Add(file_proto) |
self._file_descriptors[file_proto.name] = file_descriptor |
@@ -503,7 +408,6 @@ class DescriptorPool(object): |
package: The package the proto should be located in. |
file_desc: The file containing this message. |
scope: Dict mapping short and full symbols to message and enum types. |
- syntax: string indicating syntax of the file ("proto2" or "proto3") |
Returns: |
The added descriptor. |
@@ -537,7 +441,7 @@ class DescriptorPool(object): |
for index, extension in enumerate(desc_proto.extension)] |
oneofs = [ |
descriptor.OneofDescriptor(desc.name, '.'.join((desc_name, desc.name)), |
- index, None, [], desc.options) |
+ index, None, []) |
for index, desc in enumerate(desc_proto.oneof_decl)] |
extension_ranges = [(r.start, r.end) for r in desc_proto.extension_range] |
if extension_ranges: |
@@ -554,7 +458,7 @@ class DescriptorPool(object): |
nested_types=nested, |
enum_types=enums, |
extensions=extensions, |
- options=_OptionsOrNone(desc_proto), |
+ options=desc_proto.options, |
is_extendable=is_extendable, |
extension_ranges=extension_ranges, |
file=file_desc, |
@@ -608,7 +512,7 @@ class DescriptorPool(object): |
file=file_desc, |
values=values, |
containing_type=containing_type, |
- options=_OptionsOrNone(enum_proto)) |
+ options=enum_proto.options) |
scope['.%s' % enum_name] = desc |
self._enum_descriptors[enum_name] = desc |
return desc |
@@ -653,7 +557,7 @@ class DescriptorPool(object): |
default_value=None, |
is_extension=is_extension, |
extension_scope=None, |
- options=_OptionsOrNone(field_proto)) |
+ options=field_proto.options) |
def _SetAllFieldTypes(self, package, desc_proto, scope): |
"""Sets all the descriptor's fields's types. |
@@ -772,67 +676,9 @@ class DescriptorPool(object): |
name=value_proto.name, |
index=index, |
number=value_proto.number, |
- options=_OptionsOrNone(value_proto), |
+ options=value_proto.options, |
type=None) |
- def _MakeServiceDescriptor(self, service_proto, service_index, scope, |
- package, file_desc): |
- """Make a protobuf ServiceDescriptor given a ServiceDescriptorProto. |
- |
- Args: |
- service_proto: The descriptor_pb2.ServiceDescriptorProto protobuf message. |
- service_index: The index of the service in the File. |
- scope: Dict mapping short and full symbols to message and enum types. |
- package: Optional package name for the new message EnumDescriptor. |
- file_desc: The file containing the service descriptor. |
- |
- Returns: |
- The added descriptor. |
- """ |
- |
- if package: |
- service_name = '.'.join((package, service_proto.name)) |
- else: |
- service_name = service_proto.name |
- |
- methods = [self._MakeMethodDescriptor(method_proto, service_name, package, |
- scope, index) |
- for index, method_proto in enumerate(service_proto.method)] |
- desc = descriptor.ServiceDescriptor(name=service_proto.name, |
- full_name=service_name, |
- index=service_index, |
- methods=methods, |
- options=_OptionsOrNone(service_proto), |
- file=file_desc) |
- return desc |
- |
- def _MakeMethodDescriptor(self, method_proto, service_name, package, scope, |
- index): |
- """Creates a method descriptor from a MethodDescriptorProto. |
- |
- Args: |
- method_proto: The proto describing the method. |
- service_name: The name of the containing service. |
- package: Optional package name to look up for types. |
- scope: Scope containing available types. |
- index: Index of the method in the service. |
- |
- Returns: |
- An initialized MethodDescriptor object. |
- """ |
- full_name = '.'.join((service_name, method_proto.name)) |
- input_type = self._GetTypeFromScope( |
- package, method_proto.input_type, scope) |
- output_type = self._GetTypeFromScope( |
- package, method_proto.output_type, scope) |
- return descriptor.MethodDescriptor(name=method_proto.name, |
- full_name=full_name, |
- index=index, |
- containing_service=None, |
- input_type=input_type, |
- output_type=output_type, |
- options=_OptionsOrNone(method_proto)) |
- |
def _ExtractSymbols(self, descriptors): |
"""Pulls out all the symbols from descriptor protos. |