1fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# Protocol Buffers - Google's data interchange format
2fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# Copyright 2008 Google Inc.  All rights reserved.
3afb4b72037e3f13db208590fc782c4bc8e27f862Jeff Davidson# https://developers.google.com/protocol-buffers/
4fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#
5fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# Redistribution and use in source and binary forms, with or without
6fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# modification, are permitted provided that the following conditions are
7fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# met:
8fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#
9fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#     * Redistributions of source code must retain the above copyright
10fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# notice, this list of conditions and the following disclaimer.
11fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#     * Redistributions in binary form must reproduce the above
12fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# copyright notice, this list of conditions and the following disclaimer
13fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# in the documentation and/or other materials provided with the
14fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# distribution.
15fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#     * Neither the name of Google Inc. nor the names of its
16fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# contributors may be used to endorse or promote products derived from
17fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# this software without specific prior written permission.
18fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#
19fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
31a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson# Needs to stay compatible with Python 2.5 due to GAE.
32fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#
33a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson# Copyright 2007 Google Inc. All Rights Reserved.
34fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
35fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville"""Descriptors essentially contain exactly the information found in a .proto
36fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillefile, in types that make this information accessible in Python.
37fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville"""
38fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
39fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville__author__ = 'robinson@google.com (Will Robinson)'
40fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
41a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonfrom google.protobuf.internal import api_implementation
42a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
43a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
44a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonif api_implementation.Type() == 'cpp':
45a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  # Used by MakeDescriptor in cpp mode
46a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  import os
47a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  import uuid
48a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
49a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  if api_implementation.Version() == 2:
50a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    from google.protobuf.pyext import _message
51a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  else:
52a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    from google.protobuf.internal import cpp_message
53a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
54d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
55d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Savilleclass Error(Exception):
56d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  """Base error for this module."""
57d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
58d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
59a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonclass TypeTransformationError(Error):
60a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  """Error transforming between python proto type and corresponding C++ type."""
61a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
62a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
63fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass DescriptorBase(object):
64fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
65fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  """Descriptors base class.
66fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
67fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  This class is the base of all descriptor classes. It provides common options
68fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  related functionaility.
69d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
70d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  Attributes:
71d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    has_options:  True if the descriptor has non-default options.  Usually it
72d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville        is not necessary to read this -- just call GetOptions() which will
73d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville        happily return the default instance.  However, it's sometimes useful
74d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville        for efficiency, and also useful inside the protobuf implementation to
75d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville        avoid some bootstrapping issues.
76fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  """
77fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
78fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def __init__(self, options, options_class_name):
79fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    """Initialize the descriptor given its options message and the name of the
80fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    class of the options message. The name of the class is required in case
81fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    the options message is None and has to be created.
82fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    """
83fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self._options = options
84fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self._options_class_name = options_class_name
85fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
86d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    # Does this descriptor have non-default options?
87d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    self.has_options = options is not None
88d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
89a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  def _SetOptions(self, options, options_class_name):
90a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    """Sets the descriptor's options
91a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
92a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    This function is used in generated proto2 files to update descriptor
93a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    options. It must not be used outside proto2.
94a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    """
95a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    self._options = options
96a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    self._options_class_name = options_class_name
97a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
98a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    # Does this descriptor have non-default options?
99a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    self.has_options = options is not None
100a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
101fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def GetOptions(self):
102fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    """Retrieves descriptor options.
103fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
104fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    This method returns the options set or creates the default options for the
105fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    descriptor.
106fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    """
107fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    if self._options:
108fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      return self._options
109fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    from google.protobuf import descriptor_pb2
110fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    try:
111fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      options_class = getattr(descriptor_pb2, self._options_class_name)
112fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    except AttributeError:
113fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      raise RuntimeError('Unknown options class name %s!' %
114fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                         (self._options_class_name))
115fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self._options = options_class()
116fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return self._options
117fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
118fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
119d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Savilleclass _NestedDescriptorBase(DescriptorBase):
120d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  """Common class for descriptors that can be nested."""
121d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
122d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  def __init__(self, options, options_class_name, name, full_name,
123d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville               file, containing_type, serialized_start=None,
124d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville               serialized_end=None):
125d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    """Constructor.
126d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
127d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    Args:
128d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville      options: Protocol message options or None
129d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville        to use default message options.
130d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville      options_class_name: (str) The class name of the above options.
131d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
132d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville      name: (str) Name of this protocol message type.
133d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville      full_name: (str) Fully-qualified name of this protocol message type,
134d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville        which will include protocol "package" name and the name of any
135d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville        enclosing types.
136d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville      file: (FileDescriptor) Reference to file info.
137d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville      containing_type: if provided, this is a nested descriptor, with this
138d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville        descriptor as parent, otherwise None.
139d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville      serialized_start: The start index (inclusive) in block in the
140d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville        file.serialized_pb that describes this descriptor.
141d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville      serialized_end: The end index (exclusive) in block in the
142d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville        file.serialized_pb that describes this descriptor.
143d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    """
144d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    super(_NestedDescriptorBase, self).__init__(
145d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville        options, options_class_name)
146d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
147d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    self.name = name
148d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    # TODO(falk): Add function to calculate full_name instead of having it in
149d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    #             memory?
150d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    self.full_name = full_name
151d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    self.file = file
152d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    self.containing_type = containing_type
153d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
154d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    self._serialized_start = serialized_start
155d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    self._serialized_end = serialized_end
156d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
157d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  def GetTopLevelContainingType(self):
158d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    """Returns the root if this is a nested type, or itself if its the root."""
159d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    desc = self
160d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    while desc.containing_type is not None:
161d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville      desc = desc.containing_type
162d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    return desc
163d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
164d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  def CopyToProto(self, proto):
165d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    """Copies this to the matching proto in descriptor_pb2.
166d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
167d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    Args:
168d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville      proto: An empty proto instance from descriptor_pb2.
169d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
170d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    Raises:
171d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville      Error: If self couldnt be serialized, due to to few constructor arguments.
172d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    """
173d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    if (self.file is not None and
174d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville        self._serialized_start is not None and
175d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville        self._serialized_end is not None):
176d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville      proto.ParseFromString(self.file.serialized_pb[
177d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville          self._serialized_start:self._serialized_end])
178d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    else:
179d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville      raise Error('Descriptor does not contain serialization.')
180d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
181d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
182d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Savilleclass Descriptor(_NestedDescriptorBase):
183fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
184fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  """Descriptor for a protocol message type.
185fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
186fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  A Descriptor instance has the following attributes:
187fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
188fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    name: (str) Name of this protocol message type.
189fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    full_name: (str) Fully-qualified name of this protocol message type,
190fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      which will include protocol "package" name and the name of any
191fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      enclosing types.
192fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
193fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    containing_type: (Descriptor) Reference to the descriptor of the
194d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville      type containing us, or None if this is top-level.
195fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
196fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    fields: (list of FieldDescriptors) Field descriptors for all
197fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      fields in this type.
198fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    fields_by_number: (dict int -> FieldDescriptor) Same FieldDescriptor
199fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      objects as in |fields|, but indexed by "number" attribute in each
200fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      FieldDescriptor.
201fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    fields_by_name: (dict str -> FieldDescriptor) Same FieldDescriptor
202fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      objects as in |fields|, but indexed by "name" attribute in each
203fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      FieldDescriptor.
204fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
205fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    nested_types: (list of Descriptors) Descriptor references
206fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      for all protocol message types nested within this one.
207fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    nested_types_by_name: (dict str -> Descriptor) Same Descriptor
208fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      objects as in |nested_types|, but indexed by "name" attribute
209fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      in each Descriptor.
210fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
211fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    enum_types: (list of EnumDescriptors) EnumDescriptor references
212fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      for all enums contained within this type.
213fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    enum_types_by_name: (dict str ->EnumDescriptor) Same EnumDescriptor
214fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      objects as in |enum_types|, but indexed by "name" attribute
215fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      in each EnumDescriptor.
216fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    enum_values_by_name: (dict str -> EnumValueDescriptor) Dict mapping
217fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      from enum value name to EnumValueDescriptor for that value.
218fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
219fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    extensions: (list of FieldDescriptor) All extensions defined directly
220fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      within this message type (NOT within a nested type).
221fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    extensions_by_name: (dict, string -> FieldDescriptor) Same FieldDescriptor
222fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      objects as |extensions|, but indexed by "name" attribute of each
223fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      FieldDescriptor.
224fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
225d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    is_extendable:  Does this type define any extension ranges?
226d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
227fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    options: (descriptor_pb2.MessageOptions) Protocol message options or None
228fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      to use default message options.
229d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
230a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    oneofs: (list of OneofDescriptor) The list of descriptors for oneof fields
231a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      in this message.
232a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    oneofs_by_name: (dict str -> OneofDescriptor) Same objects as in |oneofs|,
233a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      but indexed by "name" attribute.
234a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
235d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    file: (FileDescriptor) Reference to file descriptor.
236fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  """
237fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
238a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  # NOTE(tmarek): The file argument redefining a builtin is nothing we can
239a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  # fix right now since we don't know how many clients already rely on the
240a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  # name of the argument.
241d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  def __init__(self, name, full_name, filename, containing_type, fields,
242d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville               nested_types, enum_types, extensions, options=None,
243a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson               is_extendable=True, extension_ranges=None, oneofs=None,
244a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson               file=None, serialized_start=None, serialized_end=None):  # pylint:disable=redefined-builtin
245fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    """Arguments to __init__() are as described in the description
246fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    of Descriptor fields above.
247d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
248d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    Note that filename is an obsolete argument, that is not used anymore.
249d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    Please use file.name to access this as an attribute.
250fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    """
251d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    super(Descriptor, self).__init__(
252d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville        options, 'MessageOptions', name, full_name, file,
253d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville        containing_type, serialized_start=serialized_start,
254a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        serialized_end=serialized_end)
255fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
256fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # We have fields in addition to fields_by_name and fields_by_number,
257fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # so that:
258fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    #   1. Clients can index fields by "order in which they're listed."
259fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    #   2. Clients can easily iterate over all fields with the terse
260fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    #      syntax: for f in descriptor.fields: ...
261fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.fields = fields
262fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    for field in self.fields:
263fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      field.containing_type = self
264fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.fields_by_number = dict((f.number, f) for f in fields)
265fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.fields_by_name = dict((f.name, f) for f in fields)
266fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
267fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.nested_types = nested_types
268a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    for nested_type in nested_types:
269a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      nested_type.containing_type = self
270fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.nested_types_by_name = dict((t.name, t) for t in nested_types)
271fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
272fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.enum_types = enum_types
273fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    for enum_type in self.enum_types:
274fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      enum_type.containing_type = self
275fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.enum_types_by_name = dict((t.name, t) for t in enum_types)
276fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.enum_values_by_name = dict(
277fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        (v.name, v) for t in enum_types for v in t.values)
278fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
279fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.extensions = extensions
280fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    for extension in self.extensions:
281fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      extension.extension_scope = self
282fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.extensions_by_name = dict((f.name, f) for f in extensions)
283d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    self.is_extendable = is_extendable
284d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    self.extension_ranges = extension_ranges
285a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    self.oneofs = oneofs if oneofs is not None else []
286a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    self.oneofs_by_name = dict((o.name, o) for o in self.oneofs)
287a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    for oneof in self.oneofs:
288a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      oneof.containing_type = self
289d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
290a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  def EnumValueName(self, enum, value):
291a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    """Returns the string name of an enum value.
292a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
293a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    This is just a small helper method to simplify a common operation.
294a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
295a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    Args:
296a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      enum: string name of the Enum.
297a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      value: int, value of the enum.
298a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
299a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    Returns:
300a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      string name of the enum value.
301a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
302a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    Raises:
303a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      KeyError if either the Enum doesn't exist or the value is not a valid
304a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        value for the enum.
305a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    """
306a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    return self.enum_types_by_name[enum].values_by_number[value].name
307d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
308d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  def CopyToProto(self, proto):
309d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    """Copies this to a descriptor_pb2.DescriptorProto.
310d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
311d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    Args:
312d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville      proto: An empty descriptor_pb2.DescriptorProto.
313d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    """
314d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    # This function is overriden to give a better doc comment.
315d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    super(Descriptor, self).CopyToProto(proto)
316fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
317fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
318fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# TODO(robinson): We should have aggressive checking here,
319fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# for example:
320fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#   * If you specify a repeated field, you should not be allowed
321fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#     to specify a default value.
322fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#   * [Other examples here as needed].
323fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#
324fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# TODO(robinson): for this and other *Descriptor classes, we
325fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# might also want to lock things down aggressively (e.g.,
326fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# prevent clients from setting the attributes).  Having
327fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# stronger invariants here in general will reduce the number
328fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# of runtime checks we must do in reflection.py...
329fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass FieldDescriptor(DescriptorBase):
330fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
331fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  """Descriptor for a single field in a .proto file.
332fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
333a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  A FieldDescriptor instance has the following attributes:
334fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
335fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    name: (str) Name of this field, exactly as it appears in .proto.
336fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    full_name: (str) Name of this field, including containing scope.  This is
337fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      particularly relevant for extensions.
338fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    index: (int) Dense, 0-indexed index giving the order that this
339fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      field textually appears within its message in the .proto file.
340fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    number: (int) Tag number declared for this field in the .proto file.
341fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
342fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    type: (One of the TYPE_* constants below) Declared type.
343fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    cpp_type: (One of the CPPTYPE_* constants below) C++ type used to
344fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      represent this field.
345fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
346fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    label: (One of the LABEL_* constants below) Tells whether this
347fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      field is optional, required, or repeated.
348d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    has_default_value: (bool) True if this field has a default value defined,
349d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville      otherwise false.
350fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    default_value: (Varies) Default value of this field.  Only
351fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      meaningful for non-repeated scalar fields.  Repeated fields
352fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      should always set this to [], and non-repeated composite
353fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      fields should always set this to None.
354fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
355fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    containing_type: (Descriptor) Descriptor of the protocol message
356fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      type that contains this field.  Set by the Descriptor constructor
357fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      if we're passed into one.
358fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      Somewhat confusingly, for extension fields, this is the
359fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      descriptor of the EXTENDED message, not the descriptor
360fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      of the message containing this field.  (See is_extension and
361fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      extension_scope below).
362fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    message_type: (Descriptor) If a composite field, a descriptor
363fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      of the message type contained in this field.  Otherwise, this is None.
364fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    enum_type: (EnumDescriptor) If this field contains an enum, a
365fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      descriptor of that enum.  Otherwise, this is None.
366fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
367fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    is_extension: True iff this describes an extension field.
368fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    extension_scope: (Descriptor) Only meaningful if is_extension is True.
369fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      Gives the message that immediately contains this extension field.
370fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      Will be None iff we're a top-level (file-level) extension field.
371fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
372fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    options: (descriptor_pb2.FieldOptions) Protocol message field options or
373fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      None to use default field options.
374a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
375a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    containing_oneof: (OneofDescriptor) If the field is a member of a oneof
376a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      union, contains its descriptor. Otherwise, None.
377fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  """
378fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
379fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  # Must be consistent with C++ FieldDescriptor::Type enum in
380fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  # descriptor.h.
381fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  #
382fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  # TODO(robinson): Find a way to eliminate this repetition.
383fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  TYPE_DOUBLE         = 1
384fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  TYPE_FLOAT          = 2
385fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  TYPE_INT64          = 3
386fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  TYPE_UINT64         = 4
387fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  TYPE_INT32          = 5
388fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  TYPE_FIXED64        = 6
389fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  TYPE_FIXED32        = 7
390fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  TYPE_BOOL           = 8
391fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  TYPE_STRING         = 9
392fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  TYPE_GROUP          = 10
393fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  TYPE_MESSAGE        = 11
394fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  TYPE_BYTES          = 12
395fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  TYPE_UINT32         = 13
396fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  TYPE_ENUM           = 14
397fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  TYPE_SFIXED32       = 15
398fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  TYPE_SFIXED64       = 16
399fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  TYPE_SINT32         = 17
400fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  TYPE_SINT64         = 18
401fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  MAX_TYPE            = 18
402fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
403fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  # Must be consistent with C++ FieldDescriptor::CppType enum in
404fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  # descriptor.h.
405fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  #
406fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  # TODO(robinson): Find a way to eliminate this repetition.
407fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  CPPTYPE_INT32       = 1
408fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  CPPTYPE_INT64       = 2
409fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  CPPTYPE_UINT32      = 3
410fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  CPPTYPE_UINT64      = 4
411fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  CPPTYPE_DOUBLE      = 5
412fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  CPPTYPE_FLOAT       = 6
413fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  CPPTYPE_BOOL        = 7
414fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  CPPTYPE_ENUM        = 8
415fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  CPPTYPE_STRING      = 9
416fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  CPPTYPE_MESSAGE     = 10
417fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  MAX_CPPTYPE         = 10
418fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
419a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  _PYTHON_TO_CPP_PROTO_TYPE_MAP = {
420a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      TYPE_DOUBLE: CPPTYPE_DOUBLE,
421a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      TYPE_FLOAT: CPPTYPE_FLOAT,
422a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      TYPE_ENUM: CPPTYPE_ENUM,
423a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      TYPE_INT64: CPPTYPE_INT64,
424a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      TYPE_SINT64: CPPTYPE_INT64,
425a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      TYPE_SFIXED64: CPPTYPE_INT64,
426a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      TYPE_UINT64: CPPTYPE_UINT64,
427a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      TYPE_FIXED64: CPPTYPE_UINT64,
428a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      TYPE_INT32: CPPTYPE_INT32,
429a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      TYPE_SFIXED32: CPPTYPE_INT32,
430a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      TYPE_SINT32: CPPTYPE_INT32,
431a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      TYPE_UINT32: CPPTYPE_UINT32,
432a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      TYPE_FIXED32: CPPTYPE_UINT32,
433a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      TYPE_BYTES: CPPTYPE_STRING,
434a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      TYPE_STRING: CPPTYPE_STRING,
435a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      TYPE_BOOL: CPPTYPE_BOOL,
436a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      TYPE_MESSAGE: CPPTYPE_MESSAGE,
437a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      TYPE_GROUP: CPPTYPE_MESSAGE
438a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      }
439a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
440fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  # Must be consistent with C++ FieldDescriptor::Label enum in
441fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  # descriptor.h.
442fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  #
443fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  # TODO(robinson): Find a way to eliminate this repetition.
444fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  LABEL_OPTIONAL      = 1
445fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  LABEL_REQUIRED      = 2
446fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  LABEL_REPEATED      = 3
447fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  MAX_LABEL           = 3
448fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
449a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  # Must be consistent with C++ constants kMaxNumber, kFirstReservedNumber,
450a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  # and kLastReservedNumber in descriptor.h
451a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  MAX_FIELD_NUMBER = (1 << 29) - 1
452a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  FIRST_RESERVED_FIELD_NUMBER = 19000
453a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  LAST_RESERVED_FIELD_NUMBER = 19999
454a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
455fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def __init__(self, name, full_name, index, number, type, cpp_type, label,
456fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville               default_value, message_type, enum_type, containing_type,
457d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville               is_extension, extension_scope, options=None,
458a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson               has_default_value=True, containing_oneof=None):
459fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    """The arguments are as described in the description of FieldDescriptor
460fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    attributes above.
461fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
462fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    Note that containing_type may be None, and may be set later if necessary
463fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    (to deal with circular references between message types, for example).
464fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    Likewise for extension_scope.
465fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    """
466fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    super(FieldDescriptor, self).__init__(options, 'FieldOptions')
467fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.name = name
468fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.full_name = full_name
469fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.index = index
470fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.number = number
471fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.type = type
472fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.cpp_type = cpp_type
473fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.label = label
474d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    self.has_default_value = has_default_value
475fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.default_value = default_value
476fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.containing_type = containing_type
477fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.message_type = message_type
478fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.enum_type = enum_type
479fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.is_extension = is_extension
480fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.extension_scope = extension_scope
481a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    self.containing_oneof = containing_oneof
482a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    if api_implementation.Type() == 'cpp':
483a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      if is_extension:
484a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        if api_implementation.Version() == 2:
485a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson          # pylint: disable=protected-access
486a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson          self._cdescriptor = (
487a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson              _message.Message._GetExtensionDescriptor(full_name))
488a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson          # pylint: enable=protected-access
489a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        else:
490a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson          self._cdescriptor = cpp_message.GetExtensionDescriptor(full_name)
491a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      else:
492a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        if api_implementation.Version() == 2:
493a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson          # pylint: disable=protected-access
494a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson          self._cdescriptor = _message.Message._GetFieldDescriptor(full_name)
495a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson          # pylint: enable=protected-access
496a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        else:
497a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson          self._cdescriptor = cpp_message.GetFieldDescriptor(full_name)
498a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    else:
499a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      self._cdescriptor = None
500a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
501a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  @staticmethod
502a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  def ProtoTypeToCppProtoType(proto_type):
503a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    """Converts from a Python proto type to a C++ Proto Type.
504a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
505a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    The Python ProtocolBuffer classes specify both the 'Python' datatype and the
506a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    'C++' datatype - and they're not the same. This helper method should
507a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    translate from one to another.
508a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
509a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    Args:
510a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      proto_type: the Python proto type (descriptor.FieldDescriptor.TYPE_*)
511a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    Returns:
512a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      descriptor.FieldDescriptor.CPPTYPE_*, the C++ type.
513a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    Raises:
514a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      TypeTransformationError: when the Python proto type isn't known.
515a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    """
516a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    try:
517a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      return FieldDescriptor._PYTHON_TO_CPP_PROTO_TYPE_MAP[proto_type]
518a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    except KeyError:
519a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      raise TypeTransformationError('Unknown proto_type: %s' % proto_type)
520fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
521fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
522d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Savilleclass EnumDescriptor(_NestedDescriptorBase):
523fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
524fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  """Descriptor for an enum defined in a .proto file.
525fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
526fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  An EnumDescriptor instance has the following attributes:
527fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
528fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    name: (str) Name of the enum type.
529fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    full_name: (str) Full name of the type, including package name
530fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      and any enclosing type(s).
531fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
532fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    values: (list of EnumValueDescriptors) List of the values
533fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      in this enum.
534fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    values_by_name: (dict str -> EnumValueDescriptor) Same as |values|,
535fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      but indexed by the "name" field of each EnumValueDescriptor.
536fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    values_by_number: (dict int -> EnumValueDescriptor) Same as |values|,
537fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      but indexed by the "number" field of each EnumValueDescriptor.
538fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    containing_type: (Descriptor) Descriptor of the immediate containing
539fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      type of this enum, or None if this is an enum defined at the
540fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      top level in a .proto file.  Set by Descriptor's constructor
541fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      if we're passed into one.
542d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    file: (FileDescriptor) Reference to file descriptor.
543fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    options: (descriptor_pb2.EnumOptions) Enum options message or
544fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      None to use default enum options.
545fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  """
546fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
547fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def __init__(self, name, full_name, filename, values,
548d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville               containing_type=None, options=None, file=None,
549d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville               serialized_start=None, serialized_end=None):
550d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    """Arguments are as described in the attribute description above.
551d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
552d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    Note that filename is an obsolete argument, that is not used anymore.
553d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    Please use file.name to access this as an attribute.
554d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    """
555d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    super(EnumDescriptor, self).__init__(
556d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville        options, 'EnumOptions', name, full_name, file,
557d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville        containing_type, serialized_start=serialized_start,
558a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        serialized_end=serialized_end)
559d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
560fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.values = values
561fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    for value in self.values:
562fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      value.type = self
563fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.values_by_name = dict((v.name, v) for v in values)
564fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.values_by_number = dict((v.number, v) for v in values)
565d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
566d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  def CopyToProto(self, proto):
567d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    """Copies this to a descriptor_pb2.EnumDescriptorProto.
568d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
569d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    Args:
570d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville      proto: An empty descriptor_pb2.EnumDescriptorProto.
571d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    """
572d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    # This function is overriden to give a better doc comment.
573d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    super(EnumDescriptor, self).CopyToProto(proto)
574fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
575fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
576fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass EnumValueDescriptor(DescriptorBase):
577fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
578fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  """Descriptor for a single value within an enum.
579fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
580fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    name: (str) Name of this value.
581fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    index: (int) Dense, 0-indexed index giving the order that this
582fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      value appears textually within its enum in the .proto file.
583fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    number: (int) Actual number assigned to this enum value.
584fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    type: (EnumDescriptor) EnumDescriptor to which this value
585fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      belongs.  Set by EnumDescriptor's constructor if we're
586fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      passed into one.
587fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    options: (descriptor_pb2.EnumValueOptions) Enum value options message or
588fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      None to use default enum value options options.
589fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  """
590fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
591fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def __init__(self, name, index, number, type=None, options=None):
592fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    """Arguments are as described in the attribute description above."""
593fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    super(EnumValueDescriptor, self).__init__(options, 'EnumValueOptions')
594fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.name = name
595fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.index = index
596fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.number = number
597fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.type = type
598fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
599fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
600a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonclass OneofDescriptor(object):
601a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  """Descriptor for a oneof field.
602a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
603a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    name: (str) Name of the oneof field.
604a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    full_name: (str) Full name of the oneof field, including package name.
605a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    index: (int) 0-based index giving the order of the oneof field inside
606a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      its containing type.
607a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    containing_type: (Descriptor) Descriptor of the protocol message
608a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      type that contains this field.  Set by the Descriptor constructor
609a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      if we're passed into one.
610a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    fields: (list of FieldDescriptor) The list of field descriptors this
611a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      oneof can contain.
612a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  """
613a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
614a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  def __init__(self, name, full_name, index, containing_type, fields):
615a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    """Arguments are as described in the attribute description above."""
616a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    self.name = name
617a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    self.full_name = full_name
618a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    self.index = index
619a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    self.containing_type = containing_type
620a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    self.fields = fields
621a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
622a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
623d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Savilleclass ServiceDescriptor(_NestedDescriptorBase):
624fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
625fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  """Descriptor for a service.
626fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
627fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    name: (str) Name of the service.
628fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    full_name: (str) Full name of the service, including package name.
629fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    index: (int) 0-indexed index giving the order that this services
630fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      definition appears withing the .proto file.
631fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    methods: (list of MethodDescriptor) List of methods provided by this
632fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      service.
633fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    options: (descriptor_pb2.ServiceOptions) Service options message or
634fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      None to use default service options.
635d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    file: (FileDescriptor) Reference to file info.
636fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  """
637fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
638d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  def __init__(self, name, full_name, index, methods, options=None, file=None,
639d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville               serialized_start=None, serialized_end=None):
640d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    super(ServiceDescriptor, self).__init__(
641d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville        options, 'ServiceOptions', name, full_name, file,
642d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville        None, serialized_start=serialized_start,
643d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville        serialized_end=serialized_end)
644fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.index = index
645fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.methods = methods
646fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # Set the containing service for each method in this service.
647fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    for method in self.methods:
648fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      method.containing_service = self
649fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
650fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def FindMethodByName(self, name):
651fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    """Searches for the specified method, and returns its descriptor."""
652fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    for method in self.methods:
653fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      if name == method.name:
654fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        return method
655fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return None
656fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
657d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  def CopyToProto(self, proto):
658d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    """Copies this to a descriptor_pb2.ServiceDescriptorProto.
659d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
660d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    Args:
661d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville      proto: An empty descriptor_pb2.ServiceDescriptorProto.
662d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    """
663d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    # This function is overriden to give a better doc comment.
664d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    super(ServiceDescriptor, self).CopyToProto(proto)
665d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
666fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
667fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass MethodDescriptor(DescriptorBase):
668fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
669fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  """Descriptor for a method in a service.
670fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
671fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  name: (str) Name of the method within the service.
672fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  full_name: (str) Full name of method.
673fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  index: (int) 0-indexed index of the method inside the service.
674fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  containing_service: (ServiceDescriptor) The service that contains this
675fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    method.
676fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  input_type: The descriptor of the message that this method accepts.
677fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  output_type: The descriptor of the message that this method returns.
678fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  options: (descriptor_pb2.MethodOptions) Method options message or
679fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    None to use default method options.
680fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  """
681fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
682fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def __init__(self, name, full_name, index, containing_service,
683fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville               input_type, output_type, options=None):
684fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    """The arguments are as described in the description of MethodDescriptor
685fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    attributes above.
686fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
687fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    Note that containing_service may be None, and may be set later if necessary.
688fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    """
689fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    super(MethodDescriptor, self).__init__(options, 'MethodOptions')
690fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.name = name
691fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.full_name = full_name
692fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.index = index
693fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.containing_service = containing_service
694fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.input_type = input_type
695fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.output_type = output_type
696fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
697fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
698d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Savilleclass FileDescriptor(DescriptorBase):
699d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  """Descriptor for a file. Mimics the descriptor_pb2.FileDescriptorProto.
700d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
701a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  Note that enum_types_by_name, extensions_by_name, and dependencies
702a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  fields are only set by the message_factory module, and not by the
703a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  generated proto code.
704a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
705d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  name: name of file, relative to root of source tree.
706d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  package: name of the package
707d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  serialized_pb: (str) Byte string of serialized
708d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    descriptor_pb2.FileDescriptorProto.
709a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  dependencies: List of other FileDescriptors this FileDescriptor depends on.
710a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  message_types_by_name: Dict of message names of their descriptors.
711a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  enum_types_by_name: Dict of enum names and their descriptors.
712a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  extensions_by_name: Dict of extension names and their descriptors.
713d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  """
714d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
715a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  def __init__(self, name, package, options=None, serialized_pb=None,
716a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson               dependencies=None):
717d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    """Constructor."""
718d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    super(FileDescriptor, self).__init__(options, 'FileOptions')
719d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
720a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    self.message_types_by_name = {}
721d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    self.name = name
722d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    self.package = package
723d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    self.serialized_pb = serialized_pb
724d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
725a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    self.enum_types_by_name = {}
726a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    self.extensions_by_name = {}
727a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    self.dependencies = (dependencies or [])
728a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
729a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    if (api_implementation.Type() == 'cpp' and
730a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        self.serialized_pb is not None):
731a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      if api_implementation.Version() == 2:
732a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        # pylint: disable=protected-access
733a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        _message.Message._BuildFile(self.serialized_pb)
734a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        # pylint: enable=protected-access
735a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      else:
736a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        cpp_message.BuildFile(self.serialized_pb)
737a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
738d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  def CopyToProto(self, proto):
739d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    """Copies this to a descriptor_pb2.FileDescriptorProto.
740d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
741d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    Args:
742d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville      proto: An empty descriptor_pb2.FileDescriptorProto.
743d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    """
744d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    proto.ParseFromString(self.serialized_pb)
745d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
746d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
747fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilledef _ParseOptions(message, string):
748fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  """Parses serialized options.
749fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
750fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  This helper function is used to parse serialized options in generated
751fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  proto2 files. It must not be used outside proto2.
752fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  """
753fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  message.ParseFromString(string)
754d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  return message
755a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
756a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
757a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsondef MakeDescriptor(desc_proto, package='', build_file_if_cpp=True):
758a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  """Make a protobuf Descriptor given a DescriptorProto protobuf.
759a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
760a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  Handles nested descriptors. Note that this is limited to the scope of defining
761a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  a message inside of another message. Composite fields can currently only be
762a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  resolved if the message is defined in the same scope as the field.
763a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
764a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  Args:
765a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    desc_proto: The descriptor_pb2.DescriptorProto protobuf message.
766a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    package: Optional package name for the new message Descriptor (string).
767a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    build_file_if_cpp: Update the C++ descriptor pool if api matches.
768a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                       Set to False on recursion, so no duplicates are created.
769a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  Returns:
770a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    A Descriptor for protobuf messages.
771a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  """
772a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  if api_implementation.Type() == 'cpp' and build_file_if_cpp:
773a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    # The C++ implementation requires all descriptors to be backed by the same
774a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    # definition in the C++ descriptor pool. To do this, we build a
775a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    # FileDescriptorProto with the same definition as this descriptor and build
776a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    # it into the pool.
777a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    from google.protobuf import descriptor_pb2
778a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    file_descriptor_proto = descriptor_pb2.FileDescriptorProto()
779a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    file_descriptor_proto.message_type.add().MergeFrom(desc_proto)
780a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
781a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    # Generate a random name for this proto file to prevent conflicts with
782a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    # any imported ones. We need to specify a file name so BuildFile accepts
783a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    # our FileDescriptorProto, but it is not important what that file name
784a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    # is actually set to.
785a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    proto_name = str(uuid.uuid4())
786a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
787a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    if package:
788a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      file_descriptor_proto.name = os.path.join(package.replace('.', '/'),
789a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                                                proto_name + '.proto')
790a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      file_descriptor_proto.package = package
791a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    else:
792a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      file_descriptor_proto.name = proto_name + '.proto'
793a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
794a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    if api_implementation.Version() == 2:
795a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      # pylint: disable=protected-access
796a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      _message.Message._BuildFile(file_descriptor_proto.SerializeToString())
797a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      # pylint: enable=protected-access
798a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    else:
799a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      cpp_message.BuildFile(file_descriptor_proto.SerializeToString())
800a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
801a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  full_message_name = [desc_proto.name]
802a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  if package: full_message_name.insert(0, package)
803a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
804a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  # Create Descriptors for enum types
805a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  enum_types = {}
806a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  for enum_proto in desc_proto.enum_type:
807a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    full_name = '.'.join(full_message_name + [enum_proto.name])
808a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    enum_desc = EnumDescriptor(
809a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      enum_proto.name, full_name, None, [
810a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson          EnumValueDescriptor(enum_val.name, ii, enum_val.number)
811a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson          for ii, enum_val in enumerate(enum_proto.value)])
812a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    enum_types[full_name] = enum_desc
813a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
814a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  # Create Descriptors for nested types
815a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  nested_types = {}
816a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  for nested_proto in desc_proto.nested_type:
817a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    full_name = '.'.join(full_message_name + [nested_proto.name])
818a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    # Nested types are just those defined inside of the message, not all types
819a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    # used by fields in the message, so no loops are possible here.
820a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    nested_desc = MakeDescriptor(nested_proto,
821a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                                 package='.'.join(full_message_name),
822a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                                 build_file_if_cpp=False)
823a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    nested_types[full_name] = nested_desc
824a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
825a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  fields = []
826a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  for field_proto in desc_proto.field:
827a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    full_name = '.'.join(full_message_name + [field_proto.name])
828a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    enum_desc = None
829a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    nested_desc = None
830a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    if field_proto.HasField('type_name'):
831a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      type_name = field_proto.type_name
832a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      full_type_name = '.'.join(full_message_name +
833a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                                [type_name[type_name.rfind('.')+1:]])
834a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      if full_type_name in nested_types:
835a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        nested_desc = nested_types[full_type_name]
836a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      elif full_type_name in enum_types:
837a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        enum_desc = enum_types[full_type_name]
838a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      # Else type_name references a non-local type, which isn't implemented
839a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    field = FieldDescriptor(
840a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        field_proto.name, full_name, field_proto.number - 1,
841a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        field_proto.number, field_proto.type,
842a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        FieldDescriptor.ProtoTypeToCppProtoType(field_proto.type),
843a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        field_proto.label, None, nested_desc, enum_desc, None, False, None,
844a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        has_default_value=False)
845a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    fields.append(field)
846a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
847a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  desc_name = '.'.join(full_message_name)
848a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  return Descriptor(desc_proto.name, desc_name, None, None, fields,
849a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                    nested_types.values(), enum_types.values(), [])
850