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 20a33701720ee1ed4102a5b8d9906e792f9915cf..5f43ee5f210e69652d41a6c884858020df2c8903 100644 |
--- a/third_party/protobuf/python/google/protobuf/descriptor_pool.py |
+++ b/third_party/protobuf/python/google/protobuf/descriptor_pool.py |
@@ -62,7 +62,7 @@ from google.protobuf import descriptor_database |
from google.protobuf import text_encoding |
-_USE_C_DESCRIPTORS = descriptor._USE_C_DESCRIPTORS |
+_USE_C_DESCRIPTORS = descriptor._USE_C_DESCRIPTORS # pylint: disable=protected-access |
def _NormalizeFullyQualifiedName(name): |
@@ -80,6 +80,14 @@ 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 |
+ |
+ |
class DescriptorPool(object): |
"""A collection of protobufs dynamically constructed by descriptor protos.""" |
@@ -326,73 +334,61 @@ class DescriptorPool(object): |
name=file_proto.name, |
package=file_proto.package, |
syntax=file_proto.syntax, |
- options=file_proto.options, |
+ options=_OptionsOrNone(file_proto), |
serialized_pb=file_proto.SerializeToString(), |
dependencies=direct_deps, |
public_dependencies=public_deps) |
- 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) |
+ 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: |
- 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 = '' |
+ 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 |
- 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 |
+ 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)) |
self.Add(file_proto) |
self._file_descriptors[file_proto.name] = file_descriptor |
@@ -408,6 +404,7 @@ 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. |
@@ -441,7 +438,7 @@ class DescriptorPool(object): |
for index, extension in enumerate(desc_proto.extension)] |
oneofs = [ |
descriptor.OneofDescriptor(desc.name, '.'.join((desc_name, desc.name)), |
- index, None, []) |
+ index, None, [], desc.options) |
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: |
@@ -458,7 +455,7 @@ class DescriptorPool(object): |
nested_types=nested, |
enum_types=enums, |
extensions=extensions, |
- options=desc_proto.options, |
+ options=_OptionsOrNone(desc_proto), |
is_extendable=is_extendable, |
extension_ranges=extension_ranges, |
file=file_desc, |
@@ -512,7 +509,7 @@ class DescriptorPool(object): |
file=file_desc, |
values=values, |
containing_type=containing_type, |
- options=enum_proto.options) |
+ options=_OptionsOrNone(enum_proto)) |
scope['.%s' % enum_name] = desc |
self._enum_descriptors[enum_name] = desc |
return desc |
@@ -557,7 +554,7 @@ class DescriptorPool(object): |
default_value=None, |
is_extension=is_extension, |
extension_scope=None, |
- options=field_proto.options) |
+ options=_OptionsOrNone(field_proto)) |
def _SetAllFieldTypes(self, package, desc_proto, scope): |
"""Sets all the descriptor's fields's types. |
@@ -676,9 +673,67 @@ class DescriptorPool(object): |
name=value_proto.name, |
index=index, |
number=value_proto.number, |
- options=value_proto.options, |
+ options=_OptionsOrNone(value_proto), |
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. |