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
31fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Author: kenton@google.com (Kenton Varda)
32fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//  Based on original Protocol Buffers design by
33fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//  Sanjay Ghemawat, Jeff Dean, and others.
34fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
35fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// This file contains classes which describe a type of protocol message.
36fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// You can use a message's descriptor to learn at runtime what fields
37fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// it contains and what the types of those fields are.  The Message
38fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// interface also allows you to dynamically access and modify individual
39fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// fields by passing the FieldDescriptor of the field you are interested
40fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// in.
41fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
42fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Most users will not care about descriptors, because they will write
43fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// code specific to certain protocol types and will simply use the classes
44fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// generated by the protocol compiler directly.  Advanced users who want
45fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// to operate on arbitrary types (not known at compile time) may want to
46fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// read descriptors in order to learn about the contents of a message.
47fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// A very small number of users will want to construct their own
48fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Descriptors, either because they are implementing Message manually or
49fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// because they are writing something like the protocol compiler.
50fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
51fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// For an example of how you might use descriptors, see the code example
52fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// at the top of message.h.
53fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
54fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#ifndef GOOGLE_PROTOBUF_DESCRIPTOR_H__
55fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define GOOGLE_PROTOBUF_DESCRIPTOR_H__
56fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
57b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#include <memory>
58b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#ifndef _SHARED_PTR_H
59b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#include <google/protobuf/stubs/shared_ptr.h>
60b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#endif
61a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson#include <set>
62fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <string>
63fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <vector>
64fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/stubs/common.h>
65b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#include <google/protobuf/stubs/scoped_ptr.h>
66fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
67b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// TYPE_BOOL is defined in the MacOS's ConditionalMacros.h.
68b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#ifdef TYPE_BOOL
69b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#undef TYPE_BOOL
70b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#endif  // TYPE_BOOL
71fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
72fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace google {
73fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace protobuf {
74fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
75fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Defined in this file.
76fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass Descriptor;
77fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass FieldDescriptor;
78a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonclass OneofDescriptor;
79fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass EnumDescriptor;
80fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass EnumValueDescriptor;
81fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass ServiceDescriptor;
82fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass MethodDescriptor;
83fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass FileDescriptor;
84fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass DescriptorDatabase;
85fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass DescriptorPool;
86fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
87fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Defined in descriptor.proto
88fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass DescriptorProto;
89fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass FieldDescriptorProto;
90a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonclass OneofDescriptorProto;
91fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass EnumDescriptorProto;
92fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass EnumValueDescriptorProto;
93fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass ServiceDescriptorProto;
94fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass MethodDescriptorProto;
95fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass FileDescriptorProto;
96fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass MessageOptions;
97fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass FieldOptions;
98fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass EnumOptions;
99fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass EnumValueOptions;
100fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass ServiceOptions;
101fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass MethodOptions;
102fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass FileOptions;
103fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass UninterpretedOption;
104a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonclass SourceCodeInfo;
105fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
106fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Defined in message.h
107fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass Message;
108fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
109fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Defined in descriptor.cc
110fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass DescriptorBuilder;
111fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass FileDescriptorTables;
112fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
113fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Defined in unknown_field_set.h.
114fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass UnknownField;
115fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
116b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// Defined in generated_message_reflection.h.
117b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammernamespace internal {
118b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerclass GeneratedMessageReflection;
119b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer}  // namespace internal
120b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
121b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// Defined in command_line_interface.cc
122b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammernamespace compiler {
123b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerclass CommandLineInterface;
124b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer}  // namespace compiler
125b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
126b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammernamespace descriptor_unittest {
127b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerclass DescriptorTest;
128b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer}  // namespace descriptor_unittest
129b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
130b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// Defined in printer.h
131b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammernamespace io {
132b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerclass Printer;
133b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer}  // namespace io
134b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
135a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// NB, all indices are zero-based.
136a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonstruct SourceLocation {
137a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  int start_line;
138a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  int end_line;
139a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  int start_column;
140a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  int end_column;
141a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
142a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // Doc comments found at the source location.
143b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // See the comments in SourceCodeInfo.Location (descriptor.proto) for details.
144a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  string leading_comments;
145a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  string trailing_comments;
146b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  vector<string> leading_detached_comments;
147b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer};
148b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
149b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// Options when generating machine-parsable output from a descriptor with
150b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// DebugString().
151b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerstruct DebugStringOptions {
152b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // include original user comments as recorded in SourceLocation entries. N.B.
153b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // that this must be |false| by default: several other pieces of code (for
154b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // example, the C++ code generation for fields in the proto compiler) rely on
155b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // DebugString() output being unobstructed by user comments.
156b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  bool include_comments;
157b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // If true, elide the braced body in the debug string.
158b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  bool elide_group_body;
159b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  bool elide_oneof_body;
160b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
161b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  DebugStringOptions()
162b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      : include_comments(false),
163b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        elide_group_body(false),
164b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        elide_oneof_body(false) {}
165a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson};
166a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
167fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Describes a type of protocol message, or a particular group within a
168fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// message.  To obtain the Descriptor for a given message object, call
169fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Message::GetDescriptor().  Generated message classes also have a
170fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// static method called descriptor() which returns the type's descriptor.
171fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Use DescriptorPool to construct your own descriptors.
172fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass LIBPROTOBUF_EXPORT Descriptor {
173fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public:
174fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // The name of the message type, not including its scope.
175fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const string& name() const;
176fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
177fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // The fully-qualified name of the message type, scope delimited by
178fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // periods.  For example, message type "Foo" which is declared in package
179fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // "bar" has full name "bar.Foo".  If a type "Baz" is nested within
180fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Foo, Baz's full_name is "bar.Foo.Baz".  To get only the part that
181fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // comes after the last '.', use name().
182fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const string& full_name() const;
183fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
184fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Index of this descriptor within the file or containing type's message
185fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // type array.
186fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  int index() const;
187fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
188fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // The .proto file in which this message type was defined.  Never NULL.
189fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const FileDescriptor* file() const;
190fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
191fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // If this Descriptor describes a nested type, this returns the type
192fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // in which it is nested.  Otherwise, returns NULL.
193fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const Descriptor* containing_type() const;
194fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
195fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Get options for this message type.  These are specified in the .proto file
196fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // by placing lines like "option foo = 1234;" in the message definition.
197fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Allowed options are defined by MessageOptions in
198fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // google/protobuf/descriptor.proto, and any available extensions of that
199fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // message.
200fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const MessageOptions& options() const;
201fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
202fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Write the contents of this Descriptor into the given DescriptorProto.
203fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // The target DescriptorProto must be clear before calling this; if it
204fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // isn't, the result may be garbage.
205fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  void CopyTo(DescriptorProto* proto) const;
206fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
207fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Write the contents of this decriptor in a human-readable form. Output
208fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // will be suitable for re-parsing.
209fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  string DebugString() const;
210fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
211b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // Similar to DebugString(), but additionally takes options (e.g.,
212b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // include original user comments in output).
213b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  string DebugStringWithOptions(const DebugStringOptions& options) const;
214b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
215a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // Returns true if this is a placeholder for an unknown type. This will
216a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // only be the case if this descriptor comes from a DescriptorPool
217a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // with AllowUnknownDependencies() set.
218a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  bool is_placeholder() const;
219a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
220fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Field stuff -----------------------------------------------------
221fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
222fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // The number of fields in this message type.
223fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  int field_count() const;
224fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Gets a field by index, where 0 <= index < field_count().
225fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // These are returned in the order they were defined in the .proto file.
226fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const FieldDescriptor* field(int index) const;
227fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
228fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Looks up a field by declared tag number.  Returns NULL if no such field
229fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // exists.
230fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const FieldDescriptor* FindFieldByNumber(int number) const;
231fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Looks up a field by name.  Returns NULL if no such field exists.
232fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const FieldDescriptor* FindFieldByName(const string& name) const;
233fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
234fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Looks up a field by lowercased name (as returned by lowercase_name()).
235fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // This lookup may be ambiguous if multiple field names differ only by case,
236fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // in which case the field returned is chosen arbitrarily from the matches.
237fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const FieldDescriptor* FindFieldByLowercaseName(
238fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const string& lowercase_name) const;
239fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
240fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Looks up a field by camel-case name (as returned by camelcase_name()).
241fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // This lookup may be ambiguous if multiple field names differ in a way that
242fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // leads them to have identical camel-case names, in which case the field
243fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // returned is chosen arbitrarily from the matches.
244fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const FieldDescriptor* FindFieldByCamelcaseName(
245fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const string& camelcase_name) const;
246fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
247a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // The number of oneofs in this message type.
248a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  int oneof_decl_count() const;
249a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // Get a oneof by index, where 0 <= index < oneof_decl_count().
250a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // These are returned in the order they were defined in the .proto file.
251a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  const OneofDescriptor* oneof_decl(int index) const;
252a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
253a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // Looks up a oneof by name.  Returns NULL if no such oneof exists.
254a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  const OneofDescriptor* FindOneofByName(const string& name) const;
255a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
256fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Nested type stuff -----------------------------------------------
257fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
258fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // The number of nested types in this message type.
259fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  int nested_type_count() const;
260fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Gets a nested type by index, where 0 <= index < nested_type_count().
261fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // These are returned in the order they were defined in the .proto file.
262fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const Descriptor* nested_type(int index) const;
263fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
264fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Looks up a nested type by name.  Returns NULL if no such nested type
265fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // exists.
266fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const Descriptor* FindNestedTypeByName(const string& name) const;
267fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
268fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Enum stuff ------------------------------------------------------
269fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
270fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // The number of enum types in this message type.
271fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  int enum_type_count() const;
272fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Gets an enum type by index, where 0 <= index < enum_type_count().
273fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // These are returned in the order they were defined in the .proto file.
274fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const EnumDescriptor* enum_type(int index) const;
275fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
276fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Looks up an enum type by name.  Returns NULL if no such enum type exists.
277fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const EnumDescriptor* FindEnumTypeByName(const string& name) const;
278fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
279fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Looks up an enum value by name, among all enum types in this message.
280fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Returns NULL if no such value exists.
281fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const EnumValueDescriptor* FindEnumValueByName(const string& name) const;
282fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
283fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Extensions ------------------------------------------------------
284fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
285fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // A range of field numbers which are designated for third-party
286fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // extensions.
287fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  struct ExtensionRange {
288fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    int start;  // inclusive
289fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    int end;    // exclusive
290fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  };
291fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
292fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // The number of extension ranges in this message type.
293fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  int extension_range_count() const;
294fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Gets an extension range by index, where 0 <= index <
295fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // extension_range_count(). These are returned in the order they were defined
296fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // in the .proto file.
297fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const ExtensionRange* extension_range(int index) const;
298fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
299fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Returns true if the number is in one of the extension ranges.
300fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  bool IsExtensionNumber(int number) const;
301fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
302a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // Returns NULL if no extension range contains the given number.
303a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  const ExtensionRange* FindExtensionRangeContainingNumber(int number) const;
304a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
305fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // The number of extensions -- extending *other* messages -- that were
306fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // defined nested within this message type's scope.
307fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  int extension_count() const;
308fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Get an extension by index, where 0 <= index < extension_count().
309fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // These are returned in the order they were defined in the .proto file.
310fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const FieldDescriptor* extension(int index) const;
311fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
312fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Looks up a named extension (which extends some *other* message type)
313fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // defined within this message type's scope.
314fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const FieldDescriptor* FindExtensionByName(const string& name) const;
315fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
316fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Similar to FindFieldByLowercaseName(), but finds extensions defined within
317fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // this message type's scope.
318fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const FieldDescriptor* FindExtensionByLowercaseName(const string& name) const;
319fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
320fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Similar to FindFieldByCamelcaseName(), but finds extensions defined within
321fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // this message type's scope.
322fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const FieldDescriptor* FindExtensionByCamelcaseName(const string& name) const;
323fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
324b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // Reserved fields -------------------------------------------------
325b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
326b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // A range of reserved field numbers.
327b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  struct ReservedRange {
328b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    int start;  // inclusive
329b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    int end;    // exclusive
330b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  };
331b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
332b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // The number of reserved ranges in this message type.
333b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  int reserved_range_count() const;
334b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // Gets an reserved range by index, where 0 <= index <
335b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // reserved_range_count(). These are returned in the order they were defined
336b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // in the .proto file.
337b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  const ReservedRange* reserved_range(int index) const;
338b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
339b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // Returns true if the number is in one of the reserved ranges.
340b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  bool IsReservedNumber(int number) const;
341b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
342b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // Returns NULL if no reserved range contains the given number.
343b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  const ReservedRange* FindReservedRangeContainingNumber(int number) const;
344b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
345b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // The number of reserved field names in this message type.
346b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  int reserved_name_count() const;
347b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
348b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // Gets a reserved name by index, where 0 <= index < reserved_name_count().
349b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  const string& reserved_name(int index) const;
350b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
351b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // Returns true if the field name is reserved.
352b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  bool IsReservedName(const string& name) const;
353b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
354a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // Source Location ---------------------------------------------------
355a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
356a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // Updates |*out_location| to the source location of the complete
357a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // extent of this message declaration.  Returns false and leaves
358a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // |*out_location| unchanged iff location information was not available.
359a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  bool GetSourceLocation(SourceLocation* out_location) const;
360a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
361fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private:
362fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  typedef MessageOptions OptionsType;
363fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
364b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // Allows tests to test CopyTo(proto, true).
365b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  friend class ::google::protobuf::descriptor_unittest::DescriptorTest;
366b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
367b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // Allows access to GetLocationPath for annotations.
368b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  friend class ::google::protobuf::io::Printer;
369b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
370b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // Fill the json_name field of FieldDescriptorProto.
371b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  void CopyJsonNameTo(DescriptorProto* proto) const;
372b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
373fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Internal version of DebugString; controls the level of indenting for
374b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // correct depth. Takes |options| to control debug-string options, and
375b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // |include_opening_clause| to indicate whether the "message ... " part of the
376b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // clause has already been generated (this varies depending on context).
377b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  void DebugString(int depth, string *contents,
378b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer                   const DebugStringOptions& options,
379b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer                   bool include_opening_clause) const;
380fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
381a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // Walks up the descriptor tree to generate the source location path
382a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // to this descriptor from the file root.
383a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  void GetLocationPath(std::vector<int>* output) const;
384a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
385fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const string* name_;
386fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const string* full_name_;
387fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const FileDescriptor* file_;
388fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const Descriptor* containing_type_;
389fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const MessageOptions* options_;
390fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
391fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // True if this is a placeholder for an unknown type.
392fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  bool is_placeholder_;
393fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // True if this is a placeholder and the type name wasn't fully-qualified.
394fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  bool is_unqualified_placeholder_;
395fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
396fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  int field_count_;
397fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  FieldDescriptor* fields_;
398a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  int oneof_decl_count_;
399a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  OneofDescriptor* oneof_decls_;
400fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  int nested_type_count_;
401fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  Descriptor* nested_types_;
402fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  int enum_type_count_;
403fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  EnumDescriptor* enum_types_;
404fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  int extension_range_count_;
405fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ExtensionRange* extension_ranges_;
406fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  int extension_count_;
407fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  FieldDescriptor* extensions_;
408b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  int reserved_range_count_;
409b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  ReservedRange* reserved_ranges_;
410b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  int reserved_name_count_;
411b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  const string** reserved_names_;
412fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // IMPORTANT:  If you add a new field, make sure to search for all instances
413fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // of Allocate<Descriptor>() and AllocateArray<Descriptor>() in descriptor.cc
414fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // and update them to initialize the field.
415fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
416fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Must be constructed using DescriptorPool.
417fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  Descriptor() {}
418fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  friend class DescriptorBuilder;
419fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  friend class EnumDescriptor;
420fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  friend class FieldDescriptor;
421a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  friend class OneofDescriptor;
422fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  friend class MethodDescriptor;
423fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  friend class FileDescriptor;
424fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(Descriptor);
425fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville};
426fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
427fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Describes a single field of a message.  To get the descriptor for a given
428fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// field, first get the Descriptor for the message in which it is defined,
429fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// then call Descriptor::FindFieldByName().  To get a FieldDescriptor for
430fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// an extension, do one of the following:
431fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// - Get the Descriptor or FileDescriptor for its containing scope, then
432fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//   call Descriptor::FindExtensionByName() or
433fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//   FileDescriptor::FindExtensionByName().
434fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// - Given a DescriptorPool, call DescriptorPool::FindExtensionByNumber().
435fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// - Given a Reflection for a message object, call
436fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//   Reflection::FindKnownExtensionByName() or
437fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//   Reflection::FindKnownExtensionByNumber().
438fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Use DescriptorPool to construct your own descriptors.
439fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass LIBPROTOBUF_EXPORT FieldDescriptor {
440fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public:
441fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Identifies a field type.  0 is reserved for errors.  The order is weird
442fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // for historical reasons.  Types 12 and up are new in proto2.
443fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  enum Type {
444fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    TYPE_DOUBLE         = 1,   // double, exactly eight bytes on the wire.
445fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    TYPE_FLOAT          = 2,   // float, exactly four bytes on the wire.
446fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    TYPE_INT64          = 3,   // int64, varint on the wire.  Negative numbers
447fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                               // take 10 bytes.  Use TYPE_SINT64 if negative
448fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                               // values are likely.
449fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    TYPE_UINT64         = 4,   // uint64, varint on the wire.
450fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    TYPE_INT32          = 5,   // int32, varint on the wire.  Negative numbers
451fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                               // take 10 bytes.  Use TYPE_SINT32 if negative
452fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                               // values are likely.
453fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    TYPE_FIXED64        = 6,   // uint64, exactly eight bytes on the wire.
454fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    TYPE_FIXED32        = 7,   // uint32, exactly four bytes on the wire.
455fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    TYPE_BOOL           = 8,   // bool, varint on the wire.
456fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    TYPE_STRING         = 9,   // UTF-8 text.
457fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    TYPE_GROUP          = 10,  // Tag-delimited message.  Deprecated.
458fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    TYPE_MESSAGE        = 11,  // Length-delimited message.
459fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
460fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    TYPE_BYTES          = 12,  // Arbitrary byte array.
461fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    TYPE_UINT32         = 13,  // uint32, varint on the wire
462fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    TYPE_ENUM           = 14,  // Enum, varint on the wire
463fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    TYPE_SFIXED32       = 15,  // int32, exactly four bytes on the wire
464fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    TYPE_SFIXED64       = 16,  // int64, exactly eight bytes on the wire
465fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    TYPE_SINT32         = 17,  // int32, ZigZag-encoded varint on the wire
466fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    TYPE_SINT64         = 18,  // int64, ZigZag-encoded varint on the wire
467fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
468fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    MAX_TYPE            = 18,  // Constant useful for defining lookup tables
469fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                               // indexed by Type.
470fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  };
471fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
472fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Specifies the C++ data type used to represent the field.  There is a
473fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // fixed mapping from Type to CppType where each Type maps to exactly one
474fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // CppType.  0 is reserved for errors.
475fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  enum CppType {
476fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    CPPTYPE_INT32       = 1,     // TYPE_INT32, TYPE_SINT32, TYPE_SFIXED32
477fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    CPPTYPE_INT64       = 2,     // TYPE_INT64, TYPE_SINT64, TYPE_SFIXED64
478fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    CPPTYPE_UINT32      = 3,     // TYPE_UINT32, TYPE_FIXED32
479fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    CPPTYPE_UINT64      = 4,     // TYPE_UINT64, TYPE_FIXED64
480fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    CPPTYPE_DOUBLE      = 5,     // TYPE_DOUBLE
481fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    CPPTYPE_FLOAT       = 6,     // TYPE_FLOAT
482fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    CPPTYPE_BOOL        = 7,     // TYPE_BOOL
483fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    CPPTYPE_ENUM        = 8,     // TYPE_ENUM
484fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    CPPTYPE_STRING      = 9,     // TYPE_STRING, TYPE_BYTES
485fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    CPPTYPE_MESSAGE     = 10,    // TYPE_MESSAGE, TYPE_GROUP
486fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
487fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    MAX_CPPTYPE         = 10,    // Constant useful for defining lookup tables
488fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                 // indexed by CppType.
489fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  };
490fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
491fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Identifies whether the field is optional, required, or repeated.  0 is
492fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // reserved for errors.
493fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  enum Label {
494fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    LABEL_OPTIONAL      = 1,    // optional
495fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    LABEL_REQUIRED      = 2,    // required
496fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    LABEL_REPEATED      = 3,    // repeated
497fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
498fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    MAX_LABEL           = 3,    // Constant useful for defining lookup tables
499fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                // indexed by Label.
500fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  };
501fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
502fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Valid field numbers are positive integers up to kMaxNumber.
503fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  static const int kMaxNumber = (1 << 29) - 1;
504fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
505fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // First field number reserved for the protocol buffer library implementation.
506fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Users may not declare fields that use reserved numbers.
507fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  static const int kFirstReservedNumber = 19000;
508fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Last field number reserved for the protocol buffer library implementation.
509fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Users may not declare fields that use reserved numbers.
510fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  static const int kLastReservedNumber  = 19999;
511fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
512fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const string& name() const;        // Name of this field within the message.
513fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const string& full_name() const;   // Fully-qualified name of the field.
514b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  const string& json_name() const;   // JSON name of this field.
515fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const FileDescriptor* file() const;// File in which this field was defined.
516fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  bool is_extension() const;         // Is this an extension field?
517fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  int number() const;                // Declared tag number.
518fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
519fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Same as name() except converted to lower-case.  This (and especially the
520fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // FindFieldByLowercaseName() method) can be useful when parsing formats
521fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // which prefer to use lowercase naming style.  (Although, technically
522fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // field names should be lowercased anyway according to the protobuf style
523fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // guide, so this only makes a difference when dealing with old .proto files
524fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // which do not follow the guide.)
525fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const string& lowercase_name() const;
526fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
527fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Same as name() except converted to camel-case.  In this conversion, any
528fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // time an underscore appears in the name, it is removed and the next
529fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // letter is capitalized.  Furthermore, the first letter of the name is
530fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // lower-cased.  Examples:
531fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  //   FooBar -> fooBar
532fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  //   foo_bar -> fooBar
533fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  //   fooBar -> fooBar
534fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // This (and especially the FindFieldByCamelcaseName() method) can be useful
535fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // when parsing formats which prefer to use camel-case naming style.
536fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const string& camelcase_name() const;
537fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
538a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  Type type() const;                  // Declared type of this field.
539a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  const char* type_name() const;      // Name of the declared type.
540a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  CppType cpp_type() const;           // C++ type of this field.
541a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  const char* cpp_type_name() const;  // Name of the C++ type.
542a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  Label label() const;                // optional/required/repeated
543fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
544fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  bool is_required() const;      // shorthand for label() == LABEL_REQUIRED
545fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  bool is_optional() const;      // shorthand for label() == LABEL_OPTIONAL
546fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  bool is_repeated() const;      // shorthand for label() == LABEL_REPEATED
547d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  bool is_packable() const;      // shorthand for is_repeated() &&
548d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville                                 //               IsTypePackable(type())
549a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  bool is_packed() const;        // shorthand for is_packable() &&
550a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                                 //               options().packed()
551b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  bool is_map() const;           // shorthand for type() == TYPE_MESSAGE &&
552b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer                                 // message_type()->options().map_entry()
553fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
554fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Index of this field within the message's field array, or the file or
555fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // extension scope's extensions array.
556fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  int index() const;
557fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
558fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Does this field have an explicitly-declared default value?
559fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  bool has_default_value() const;
560fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
561fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Get the field default value if cpp_type() == CPPTYPE_INT32.  If no
562fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // explicit default was defined, the default is 0.
563fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  int32 default_value_int32() const;
564fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Get the field default value if cpp_type() == CPPTYPE_INT64.  If no
565fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // explicit default was defined, the default is 0.
566fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  int64 default_value_int64() const;
567fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Get the field default value if cpp_type() == CPPTYPE_UINT32.  If no
568fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // explicit default was defined, the default is 0.
569fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  uint32 default_value_uint32() const;
570fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Get the field default value if cpp_type() == CPPTYPE_UINT64.  If no
571fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // explicit default was defined, the default is 0.
572fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  uint64 default_value_uint64() const;
573fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Get the field default value if cpp_type() == CPPTYPE_FLOAT.  If no
574fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // explicit default was defined, the default is 0.0.
575fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  float default_value_float() const;
576fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Get the field default value if cpp_type() == CPPTYPE_DOUBLE.  If no
577fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // explicit default was defined, the default is 0.0.
578fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  double default_value_double() const;
579fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Get the field default value if cpp_type() == CPPTYPE_BOOL.  If no
580fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // explicit default was defined, the default is false.
581fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  bool default_value_bool() const;
582fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Get the field default value if cpp_type() == CPPTYPE_ENUM.  If no
583fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // explicit default was defined, the default is the first value defined
584fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // in the enum type (all enum types are required to have at least one value).
585fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // This never returns NULL.
586fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const EnumValueDescriptor* default_value_enum() const;
587fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Get the field default value if cpp_type() == CPPTYPE_STRING.  If no
588fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // explicit default was defined, the default is the empty string.
589fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const string& default_value_string() const;
590fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
591fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // The Descriptor for the message of which this is a field.  For extensions,
592fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // this is the extended type.  Never NULL.
593fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const Descriptor* containing_type() const;
594fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
595a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // If the field is a member of a oneof, this is the one, otherwise this is
596a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // NULL.
597a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  const OneofDescriptor* containing_oneof() const;
598a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
599a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // If the field is a member of a oneof, returns the index in that oneof.
600a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  int index_in_oneof() const;
601a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
602fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // An extension may be declared within the scope of another message.  If this
603fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // field is an extension (is_extension() is true), then extension_scope()
604fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // returns that message, or NULL if the extension was declared at global
605fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // scope.  If this is not an extension, extension_scope() is undefined (may
606fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // assert-fail).
607fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const Descriptor* extension_scope() const;
608fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
609fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // If type is TYPE_MESSAGE or TYPE_GROUP, returns a descriptor for the
610a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // message or the group type.  Otherwise, returns null.
611fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const Descriptor* message_type() const;
612fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // If type is TYPE_ENUM, returns a descriptor for the enum.  Otherwise,
613a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // returns null.
614fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const EnumDescriptor* enum_type() const;
615fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
616fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Get the FieldOptions for this field.  This includes things listed in
617fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // square brackets after the field definition.  E.g., the field:
618fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  //   optional string text = 1 [ctype=CORD];
619fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // has the "ctype" option set.  Allowed options are defined by FieldOptions
620fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // in google/protobuf/descriptor.proto, and any available extensions of that
621fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // message.
622fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const FieldOptions& options() const;
623fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
624fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // See Descriptor::CopyTo().
625fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  void CopyTo(FieldDescriptorProto* proto) const;
626fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
627fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // See Descriptor::DebugString().
628fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  string DebugString() const;
629fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
630b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // See Descriptor::DebugStringWithOptions().
631b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  string DebugStringWithOptions(const DebugStringOptions& options) const;
632b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
633fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Helper method to get the CppType for a particular Type.
634fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  static CppType TypeToCppType(Type type);
635fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
636a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // Helper method to get the name of a Type.
637a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  static const char* TypeName(Type type);
638a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
639a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // Helper method to get the name of a CppType.
640a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  static const char* CppTypeName(CppType cpp_type);
641a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
642d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  // Return true iff [packed = true] is valid for fields of this type.
643d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  static inline bool IsTypePackable(Type field_type);
644d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
645a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // Source Location ---------------------------------------------------
646a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
647a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // Updates |*out_location| to the source location of the complete
648a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // extent of this field declaration.  Returns false and leaves
649a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // |*out_location| unchanged iff location information was not available.
650a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  bool GetSourceLocation(SourceLocation* out_location) const;
651a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
652fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private:
653fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  typedef FieldOptions OptionsType;
654fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
655b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // Allows access to GetLocationPath for annotations.
656b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  friend class ::google::protobuf::io::Printer;
657b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
658b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // Fill the json_name field of FieldDescriptorProto.
659b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  void CopyJsonNameTo(FieldDescriptorProto* proto) const;
660b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
661fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // See Descriptor::DebugString().
662a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  enum PrintLabelFlag { PRINT_LABEL, OMIT_LABEL };
663a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  void DebugString(int depth, PrintLabelFlag print_label_flag,
664b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer                   string* contents, const DebugStringOptions& options) const;
665fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
666fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // formats the default value appropriately and returns it as a string.
667fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Must have a default value to call this. If quote_string_type is true, then
668fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // types of CPPTYPE_STRING whill be surrounded by quotes and CEscaped.
669fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  string DefaultValueAsString(bool quote_string_type) const;
670fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
671b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // Helper function that returns the field type name for DebugString.
672b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  string FieldTypeNameDebugString() const;
673b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
674a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // Walks up the descriptor tree to generate the source location path
675a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // to this descriptor from the file root.
676a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  void GetLocationPath(std::vector<int>* output) const;
677a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
678fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const string* name_;
679fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const string* full_name_;
680fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const string* lowercase_name_;
681fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const string* camelcase_name_;
682b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // Whether the user has specified the json_name field option in the .proto
683b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // file.
684b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  bool has_json_name_;
685b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // If has_json_name_ is true, it's the value specified by the user.
686b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // Otherwise, it has the same value as lowercase_name_.
687b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  const string* json_name_;
688fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const FileDescriptor* file_;
689fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  int number_;
690fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  Type type_;
691fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  Label label_;
692fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  bool is_extension_;
693a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  int index_in_oneof_;
694fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const Descriptor* containing_type_;
695a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  const OneofDescriptor* containing_oneof_;
696fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const Descriptor* extension_scope_;
697fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const Descriptor* message_type_;
698fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const EnumDescriptor* enum_type_;
699fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const FieldOptions* options_;
700fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // IMPORTANT:  If you add a new field, make sure to search for all instances
701fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // of Allocate<FieldDescriptor>() and AllocateArray<FieldDescriptor>() in
702fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // descriptor.cc and update them to initialize the field.
703fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
704fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  bool has_default_value_;
705fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  union {
706fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    int32  default_value_int32_;
707fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    int64  default_value_int64_;
708fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    uint32 default_value_uint32_;
709fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    uint64 default_value_uint64_;
710fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    float  default_value_float_;
711fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    double default_value_double_;
712fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    bool   default_value_bool_;
713fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
714fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const EnumValueDescriptor* default_value_enum_;
715fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const string* default_value_string_;
716fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  };
717fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
718fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  static const CppType kTypeToCppTypeMap[MAX_TYPE + 1];
719fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
720fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  static const char * const kTypeToName[MAX_TYPE + 1];
721fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
722a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  static const char * const kCppTypeToName[MAX_CPPTYPE + 1];
723a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
724fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  static const char * const kLabelToName[MAX_LABEL + 1];
725fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
726fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Must be constructed using DescriptorPool.
727fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  FieldDescriptor() {}
728fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  friend class DescriptorBuilder;
729fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  friend class FileDescriptor;
730fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  friend class Descriptor;
731a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  friend class OneofDescriptor;
732fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(FieldDescriptor);
733fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville};
734fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
735a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// Describes a oneof defined in a message type.
736a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonclass LIBPROTOBUF_EXPORT OneofDescriptor {
737a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson public:
738a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  const string& name() const;       // Name of this oneof.
739a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  const string& full_name() const;  // Fully-qualified name of the oneof.
740a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
741a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // Index of this oneof within the message's oneof array.
742a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  int index() const;
743a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
744a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // The Descriptor for the message containing this oneof.
745a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  const Descriptor* containing_type() const;
746a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
747a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // The number of (non-extension) fields which are members of this oneof.
748a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  int field_count() const;
749a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // Get a member of this oneof, in the order in which they were declared in the
750a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // .proto file.  Does not include extensions.
751a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  const FieldDescriptor* field(int index) const;
752a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
753a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // See Descriptor::CopyTo().
754a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  void CopyTo(OneofDescriptorProto* proto) const;
755a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
756a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // See Descriptor::DebugString().
757a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  string DebugString() const;
758a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
759b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // See Descriptor::DebugStringWithOptions().
760b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  string DebugStringWithOptions(const DebugStringOptions& options) const;
761b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
762a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // Source Location ---------------------------------------------------
763a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
764a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // Updates |*out_location| to the source location of the complete
765a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // extent of this oneof declaration.  Returns false and leaves
766a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // |*out_location| unchanged iff location information was not available.
767a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  bool GetSourceLocation(SourceLocation* out_location) const;
768a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
769a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson private:
770b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // Allows access to GetLocationPath for annotations.
771b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  friend class ::google::protobuf::io::Printer;
772b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
773a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // See Descriptor::DebugString().
774b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  void DebugString(int depth, string* contents,
775b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer                   const DebugStringOptions& options) const;
776a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
777a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // Walks up the descriptor tree to generate the source location path
778a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // to this descriptor from the file root.
779a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  void GetLocationPath(std::vector<int>* output) const;
780a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
781a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  const string* name_;
782a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  const string* full_name_;
783a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  const Descriptor* containing_type_;
784a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  bool is_extendable_;
785a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  int field_count_;
786a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  const FieldDescriptor** fields_;
787a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // IMPORTANT:  If you add a new field, make sure to search for all instances
788a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // of Allocate<OneofDescriptor>() and AllocateArray<OneofDescriptor>()
789a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // in descriptor.cc and update them to initialize the field.
790a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
791a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // Must be constructed using DescriptorPool.
792a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  OneofDescriptor() {}
793a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  friend class DescriptorBuilder;
794a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  friend class Descriptor;
795a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(OneofDescriptor);
796a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson};
797a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
798fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Describes an enum type defined in a .proto file.  To get the EnumDescriptor
799fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// for a generated enum type, call TypeName_descriptor().  Use DescriptorPool
800fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// to construct your own descriptors.
801fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass LIBPROTOBUF_EXPORT EnumDescriptor {
802fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public:
803fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // The name of this enum type in the containing scope.
804fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const string& name() const;
805fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
806fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // The fully-qualified name of the enum type, scope delimited by periods.
807fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const string& full_name() const;
808fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
809fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Index of this enum within the file or containing message's enum array.
810fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  int index() const;
811fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
812fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // The .proto file in which this enum type was defined.  Never NULL.
813fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const FileDescriptor* file() const;
814fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
815fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // The number of values for this EnumDescriptor.  Guaranteed to be greater
816fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // than zero.
817fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  int value_count() const;
818fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Gets a value by index, where 0 <= index < value_count().
819fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // These are returned in the order they were defined in the .proto file.
820fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const EnumValueDescriptor* value(int index) const;
821fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
822fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Looks up a value by name.  Returns NULL if no such value exists.
823fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const EnumValueDescriptor* FindValueByName(const string& name) const;
824fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Looks up a value by number.  Returns NULL if no such value exists.  If
825fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // multiple values have this number, the first one defined is returned.
826fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const EnumValueDescriptor* FindValueByNumber(int number) const;
827fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
828fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // If this enum type is nested in a message type, this is that message type.
829fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Otherwise, NULL.
830fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const Descriptor* containing_type() const;
831fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
832fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Get options for this enum type.  These are specified in the .proto file by
833fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // placing lines like "option foo = 1234;" in the enum definition.  Allowed
834fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // options are defined by EnumOptions in google/protobuf/descriptor.proto,
835fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // and any available extensions of that message.
836fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const EnumOptions& options() const;
837fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
838fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // See Descriptor::CopyTo().
839fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  void CopyTo(EnumDescriptorProto* proto) const;
840fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
841fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // See Descriptor::DebugString().
842fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  string DebugString() const;
843fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
844b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // See Descriptor::DebugStringWithOptions().
845b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  string DebugStringWithOptions(const DebugStringOptions& options) const;
846b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
847b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
848a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // Returns true if this is a placeholder for an unknown enum. This will
849a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // only be the case if this descriptor comes from a DescriptorPool
850a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // with AllowUnknownDependencies() set.
851a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  bool is_placeholder() const;
852a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
853a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // Source Location ---------------------------------------------------
854a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
855a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // Updates |*out_location| to the source location of the complete
856a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // extent of this enum declaration.  Returns false and leaves
857a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // |*out_location| unchanged iff location information was not available.
858a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  bool GetSourceLocation(SourceLocation* out_location) const;
859a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
860fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private:
861fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  typedef EnumOptions OptionsType;
862fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
863b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // Allows access to GetLocationPath for annotations.
864b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  friend class ::google::protobuf::io::Printer;
865b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
866b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // Looks up a value by number.  If the value does not exist, dynamically
867b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // creates a new EnumValueDescriptor for that value, assuming that it was
868b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // unknown. If a new descriptor is created, this is done in a thread-safe way,
869b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // and future calls will return the same value descriptor pointer.
870b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  //
871b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // This is private but is used by GeneratedMessageReflection (which is
872b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // friended below) to return a valid EnumValueDescriptor from GetEnum() when
873b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // this feature is enabled.
874b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  const EnumValueDescriptor*
875b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      FindValueByNumberCreatingIfUnknown(int number) const;
876b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
877b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
878fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // See Descriptor::DebugString().
879b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  void DebugString(int depth, string *contents,
880b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer                   const DebugStringOptions& options) const;
881fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
882a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // Walks up the descriptor tree to generate the source location path
883a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // to this descriptor from the file root.
884a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  void GetLocationPath(std::vector<int>* output) const;
885a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
886fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const string* name_;
887fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const string* full_name_;
888fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const FileDescriptor* file_;
889fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const Descriptor* containing_type_;
890fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const EnumOptions* options_;
891fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
892fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // True if this is a placeholder for an unknown type.
893fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  bool is_placeholder_;
894fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // True if this is a placeholder and the type name wasn't fully-qualified.
895fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  bool is_unqualified_placeholder_;
896fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
897fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  int value_count_;
898fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  EnumValueDescriptor* values_;
899fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // IMPORTANT:  If you add a new field, make sure to search for all instances
900fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // of Allocate<EnumDescriptor>() and AllocateArray<EnumDescriptor>() in
901fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // descriptor.cc and update them to initialize the field.
902fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
903fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Must be constructed using DescriptorPool.
904fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  EnumDescriptor() {}
905fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  friend class DescriptorBuilder;
906fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  friend class Descriptor;
907fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  friend class FieldDescriptor;
908fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  friend class EnumValueDescriptor;
909fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  friend class FileDescriptor;
910b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  friend class internal::GeneratedMessageReflection;
911fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(EnumDescriptor);
912fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville};
913fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
914fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Describes an individual enum constant of a particular type.  To get the
915fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// EnumValueDescriptor for a given enum value, first get the EnumDescriptor
916fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// for its type, then use EnumDescriptor::FindValueByName() or
917fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// EnumDescriptor::FindValueByNumber().  Use DescriptorPool to construct
918fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// your own descriptors.
919fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass LIBPROTOBUF_EXPORT EnumValueDescriptor {
920fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public:
921fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const string& name() const;  // Name of this enum constant.
922fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  int index() const;           // Index within the enums's Descriptor.
923fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  int number() const;          // Numeric value of this enum constant.
924fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
925fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // The full_name of an enum value is a sibling symbol of the enum type.
926fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // e.g. the full name of FieldDescriptorProto::TYPE_INT32 is actually
927fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // "google.protobuf.FieldDescriptorProto.TYPE_INT32", NOT
928fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // "google.protobuf.FieldDescriptorProto.Type.TYPE_INT32".  This is to conform
929fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // with C++ scoping rules for enums.
930fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const string& full_name() const;
931fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
932fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // The type of this value.  Never NULL.
933fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const EnumDescriptor* type() const;
934fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
935fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Get options for this enum value.  These are specified in the .proto file
936fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // by adding text like "[foo = 1234]" after an enum value definition.
937fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Allowed options are defined by EnumValueOptions in
938fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // google/protobuf/descriptor.proto, and any available extensions of that
939fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // message.
940fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const EnumValueOptions& options() const;
941fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
942fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // See Descriptor::CopyTo().
943fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  void CopyTo(EnumValueDescriptorProto* proto) const;
944fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
945fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // See Descriptor::DebugString().
946fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  string DebugString() const;
947fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
948b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // See Descriptor::DebugStringWithOptions().
949b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  string DebugStringWithOptions(const DebugStringOptions& options) const;
950b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
951b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
952a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // Source Location ---------------------------------------------------
953a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
954a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // Updates |*out_location| to the source location of the complete
955a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // extent of this enum value declaration.  Returns false and leaves
956a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // |*out_location| unchanged iff location information was not available.
957a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  bool GetSourceLocation(SourceLocation* out_location) const;
958a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
959fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private:
960fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  typedef EnumValueOptions OptionsType;
961fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
962b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // Allows access to GetLocationPath for annotations.
963b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  friend class ::google::protobuf::io::Printer;
964b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
965fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // See Descriptor::DebugString().
966b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  void DebugString(int depth, string *contents,
967b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer                   const DebugStringOptions& options) const;
968fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
969a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // Walks up the descriptor tree to generate the source location path
970a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // to this descriptor from the file root.
971a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  void GetLocationPath(std::vector<int>* output) const;
972a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
973fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const string* name_;
974fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const string* full_name_;
975fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  int number_;
976fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const EnumDescriptor* type_;
977fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const EnumValueOptions* options_;
978fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // IMPORTANT:  If you add a new field, make sure to search for all instances
979fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // of Allocate<EnumValueDescriptor>() and AllocateArray<EnumValueDescriptor>()
980fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // in descriptor.cc and update them to initialize the field.
981fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
982fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Must be constructed using DescriptorPool.
983fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  EnumValueDescriptor() {}
984fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  friend class DescriptorBuilder;
985fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  friend class EnumDescriptor;
986b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  friend class FileDescriptorTables;
987fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(EnumValueDescriptor);
988fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville};
989fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
990fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Describes an RPC service.  To get the ServiceDescriptor for a service,
991fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// call Service::GetDescriptor().  Generated service classes also have a
992fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// static method called descriptor() which returns the type's
993fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// ServiceDescriptor.  Use DescriptorPool to construct your own descriptors.
994fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass LIBPROTOBUF_EXPORT ServiceDescriptor {
995fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public:
996fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // The name of the service, not including its containing scope.
997fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const string& name() const;
998fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // The fully-qualified name of the service, scope delimited by periods.
999fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const string& full_name() const;
1000fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Index of this service within the file's services array.
1001fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  int index() const;
1002fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1003fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // The .proto file in which this service was defined.  Never NULL.
1004fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const FileDescriptor* file() const;
1005fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1006fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Get options for this service type.  These are specified in the .proto file
1007fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // by placing lines like "option foo = 1234;" in the service definition.
1008fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Allowed options are defined by ServiceOptions in
1009fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // google/protobuf/descriptor.proto, and any available extensions of that
1010fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // message.
1011fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const ServiceOptions& options() const;
1012fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1013fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // The number of methods this service defines.
1014fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  int method_count() const;
1015fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Gets a MethodDescriptor by index, where 0 <= index < method_count().
1016fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // These are returned in the order they were defined in the .proto file.
1017fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const MethodDescriptor* method(int index) const;
1018fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1019fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Look up a MethodDescriptor by name.
1020fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const MethodDescriptor* FindMethodByName(const string& name) const;
1021fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // See Descriptor::CopyTo().
1022fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  void CopyTo(ServiceDescriptorProto* proto) const;
1023fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1024fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // See Descriptor::DebugString().
1025fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  string DebugString() const;
1026fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1027b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // See Descriptor::DebugStringWithOptions().
1028b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  string DebugStringWithOptions(const DebugStringOptions& options) const;
1029b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
1030b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
1031a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // Source Location ---------------------------------------------------
1032a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
1033a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // Updates |*out_location| to the source location of the complete
1034a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // extent of this service declaration.  Returns false and leaves
1035a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // |*out_location| unchanged iff location information was not available.
1036a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  bool GetSourceLocation(SourceLocation* out_location) const;
1037a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
1038fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private:
1039fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  typedef ServiceOptions OptionsType;
1040fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1041b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // Allows access to GetLocationPath for annotations.
1042b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  friend class ::google::protobuf::io::Printer;
1043b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
1044fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // See Descriptor::DebugString().
1045b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  void DebugString(string *contents, const DebugStringOptions& options) const;
1046fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1047a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // Walks up the descriptor tree to generate the source location path
1048a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // to this descriptor from the file root.
1049a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  void GetLocationPath(std::vector<int>* output) const;
1050a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
1051fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const string* name_;
1052fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const string* full_name_;
1053fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const FileDescriptor* file_;
1054fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const ServiceOptions* options_;
1055fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  int method_count_;
1056fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  MethodDescriptor* methods_;
1057fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // IMPORTANT:  If you add a new field, make sure to search for all instances
1058fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // of Allocate<ServiceDescriptor>() and AllocateArray<ServiceDescriptor>() in
1059fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // descriptor.cc and update them to initialize the field.
1060fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1061fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Must be constructed using DescriptorPool.
1062fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ServiceDescriptor() {}
1063fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  friend class DescriptorBuilder;
1064fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  friend class FileDescriptor;
1065fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  friend class MethodDescriptor;
1066fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ServiceDescriptor);
1067fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville};
1068fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1069fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Describes an individual service method.  To obtain a MethodDescriptor given
1070fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// a service, first get its ServiceDescriptor, then call
1071fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// ServiceDescriptor::FindMethodByName().  Use DescriptorPool to construct your
1072fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// own descriptors.
1073fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass LIBPROTOBUF_EXPORT MethodDescriptor {
1074fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public:
1075fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Name of this method, not including containing scope.
1076fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const string& name() const;
1077fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // The fully-qualified name of the method, scope delimited by periods.
1078fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const string& full_name() const;
1079fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Index within the service's Descriptor.
1080fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  int index() const;
1081fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1082fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Gets the service to which this method belongs.  Never NULL.
1083fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const ServiceDescriptor* service() const;
1084fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1085fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Gets the type of protocol message which this method accepts as input.
1086fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const Descriptor* input_type() const;
1087fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Gets the type of protocol message which this message produces as output.
1088fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const Descriptor* output_type() const;
1089fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1090b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // Gets whether the client streams multiple requests.
1091b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  bool client_streaming() const;
1092b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // Gets whether the server streams multiple responses.
1093b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  bool server_streaming() const;
1094b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
1095fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Get options for this method.  These are specified in the .proto file by
1096fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // placing lines like "option foo = 1234;" in curly-braces after a method
1097fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // declaration.  Allowed options are defined by MethodOptions in
1098fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // google/protobuf/descriptor.proto, and any available extensions of that
1099fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // message.
1100fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const MethodOptions& options() const;
1101fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1102fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // See Descriptor::CopyTo().
1103fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  void CopyTo(MethodDescriptorProto* proto) const;
1104fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1105fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // See Descriptor::DebugString().
1106fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  string DebugString() const;
1107fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1108b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // See Descriptor::DebugStringWithOptions().
1109b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  string DebugStringWithOptions(const DebugStringOptions& options) const;
1110b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
1111b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
1112a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // Source Location ---------------------------------------------------
1113a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
1114a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // Updates |*out_location| to the source location of the complete
1115a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // extent of this method declaration.  Returns false and leaves
1116a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // |*out_location| unchanged iff location information was not available.
1117a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  bool GetSourceLocation(SourceLocation* out_location) const;
1118a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
1119fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private:
1120fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  typedef MethodOptions OptionsType;
1121fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1122b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // Allows access to GetLocationPath for annotations.
1123b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  friend class ::google::protobuf::io::Printer;
1124b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
1125fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // See Descriptor::DebugString().
1126b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  void DebugString(int depth, string *contents,
1127b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer                   const DebugStringOptions& options) const;
1128fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1129a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // Walks up the descriptor tree to generate the source location path
1130a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // to this descriptor from the file root.
1131a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  void GetLocationPath(std::vector<int>* output) const;
1132a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
1133fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const string* name_;
1134fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const string* full_name_;
1135fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const ServiceDescriptor* service_;
1136fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const Descriptor* input_type_;
1137fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const Descriptor* output_type_;
1138fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const MethodOptions* options_;
1139b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  bool client_streaming_;
1140b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  bool server_streaming_;
1141fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // IMPORTANT:  If you add a new field, make sure to search for all instances
1142fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // of Allocate<MethodDescriptor>() and AllocateArray<MethodDescriptor>() in
1143fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // descriptor.cc and update them to initialize the field.
1144fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1145fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Must be constructed using DescriptorPool.
1146fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  MethodDescriptor() {}
1147fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  friend class DescriptorBuilder;
1148fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  friend class ServiceDescriptor;
1149fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(MethodDescriptor);
1150fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville};
1151fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1152a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
1153fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Describes a whole .proto file.  To get the FileDescriptor for a compiled-in
1154fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// file, get the descriptor for something defined in that file and call
1155fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// descriptor->file().  Use DescriptorPool to construct your own descriptors.
1156fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass LIBPROTOBUF_EXPORT FileDescriptor {
1157fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public:
1158fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // The filename, relative to the source tree.
1159fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // e.g. "google/protobuf/descriptor.proto"
1160fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const string& name() const;
1161fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1162fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // The package, e.g. "google.protobuf.compiler".
1163fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const string& package() const;
1164fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1165fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // The DescriptorPool in which this FileDescriptor and all its contents were
1166fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // allocated.  Never NULL.
1167fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const DescriptorPool* pool() const;
1168fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1169fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // The number of files imported by this one.
1170fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  int dependency_count() const;
1171fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Gets an imported file by index, where 0 <= index < dependency_count().
1172fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // These are returned in the order they were defined in the .proto file.
1173fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const FileDescriptor* dependency(int index) const;
1174fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1175a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // The number of files public imported by this one.
1176a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // The public dependency list is a subset of the dependency list.
1177a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  int public_dependency_count() const;
1178a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // Gets a public imported file by index, where 0 <= index <
1179a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // public_dependency_count().
1180a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // These are returned in the order they were defined in the .proto file.
1181a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  const FileDescriptor* public_dependency(int index) const;
1182a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
1183a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // The number of files that are imported for weak fields.
1184a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // The weak dependency list is a subset of the dependency list.
1185a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  int weak_dependency_count() const;
1186a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // Gets a weak imported file by index, where 0 <= index <
1187a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // weak_dependency_count().
1188a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // These are returned in the order they were defined in the .proto file.
1189a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  const FileDescriptor* weak_dependency(int index) const;
1190a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
1191fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Number of top-level message types defined in this file.  (This does not
1192fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // include nested types.)
1193fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  int message_type_count() const;
1194fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Gets a top-level message type, where 0 <= index < message_type_count().
1195fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // These are returned in the order they were defined in the .proto file.
1196fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const Descriptor* message_type(int index) const;
1197fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1198fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Number of top-level enum types defined in this file.  (This does not
1199fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // include nested types.)
1200fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  int enum_type_count() const;
1201fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Gets a top-level enum type, where 0 <= index < enum_type_count().
1202fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // These are returned in the order they were defined in the .proto file.
1203fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const EnumDescriptor* enum_type(int index) const;
1204fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1205fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Number of services defined in this file.
1206fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  int service_count() const;
1207fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Gets a service, where 0 <= index < service_count().
1208fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // These are returned in the order they were defined in the .proto file.
1209fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const ServiceDescriptor* service(int index) const;
1210fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1211fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Number of extensions defined at file scope.  (This does not include
1212fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // extensions nested within message types.)
1213fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  int extension_count() const;
1214fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Gets an extension's descriptor, where 0 <= index < extension_count().
1215fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // These are returned in the order they were defined in the .proto file.
1216fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const FieldDescriptor* extension(int index) const;
1217fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1218fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Get options for this file.  These are specified in the .proto file by
1219fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // placing lines like "option foo = 1234;" at the top level, outside of any
1220fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // other definitions.  Allowed options are defined by FileOptions in
1221fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // google/protobuf/descriptor.proto, and any available extensions of that
1222fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // message.
1223fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const FileOptions& options() const;
1224fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1225b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // Syntax of this file.
1226b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  enum Syntax {
1227b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    SYNTAX_UNKNOWN = 0,
1228b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    SYNTAX_PROTO2  = 2,
1229b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    SYNTAX_PROTO3  = 3,
1230b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  };
1231b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  Syntax syntax() const;
1232b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  static const char* SyntaxName(Syntax syntax);
1233b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
1234fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Find a top-level message type by name.  Returns NULL if not found.
1235fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const Descriptor* FindMessageTypeByName(const string& name) const;
1236fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Find a top-level enum type by name.  Returns NULL if not found.
1237fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const EnumDescriptor* FindEnumTypeByName(const string& name) const;
1238fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Find an enum value defined in any top-level enum by name.  Returns NULL if
1239fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // not found.
1240fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const EnumValueDescriptor* FindEnumValueByName(const string& name) const;
1241fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Find a service definition by name.  Returns NULL if not found.
1242fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const ServiceDescriptor* FindServiceByName(const string& name) const;
1243fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Find a top-level extension definition by name.  Returns NULL if not found.
1244fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const FieldDescriptor* FindExtensionByName(const string& name) const;
1245fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Similar to FindExtensionByName(), but searches by lowercased-name.  See
1246fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Descriptor::FindFieldByLowercaseName().
1247fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const FieldDescriptor* FindExtensionByLowercaseName(const string& name) const;
1248fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Similar to FindExtensionByName(), but searches by camelcased-name.  See
1249fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Descriptor::FindFieldByCamelcaseName().
1250fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const FieldDescriptor* FindExtensionByCamelcaseName(const string& name) const;
1251fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1252fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // See Descriptor::CopyTo().
1253a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // Notes:
1254a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // - This method does NOT copy source code information since it is relatively
1255a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  //   large and rarely needed.  See CopySourceCodeInfoTo() below.
1256fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  void CopyTo(FileDescriptorProto* proto) const;
1257a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // Write the source code information of this FileDescriptor into the given
1258a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // FileDescriptorProto.  See CopyTo() above.
1259a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  void CopySourceCodeInfoTo(FileDescriptorProto* proto) const;
1260b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // Fill the json_name field of FieldDescriptorProto for all fields. Can only
1261b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // be called after CopyTo().
1262b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  void CopyJsonNameTo(FileDescriptorProto* proto) const;
1263fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1264fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // See Descriptor::DebugString().
1265fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  string DebugString() const;
1266fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1267b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // See Descriptor::DebugStringWithOptions().
1268b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  string DebugStringWithOptions(const DebugStringOptions& options) const;
1269b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
1270a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // Returns true if this is a placeholder for an unknown file. This will
1271a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // only be the case if this descriptor comes from a DescriptorPool
1272a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // with AllowUnknownDependencies() set.
1273a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  bool is_placeholder() const;
1274a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
1275b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // Updates |*out_location| to the source location of the complete extent of
1276b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // this file declaration (namely, the empty path).
1277b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  bool GetSourceLocation(SourceLocation* out_location) const;
1278a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
1279a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // Updates |*out_location| to the source location of the complete
1280a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // extent of the declaration or declaration-part denoted by |path|.
1281a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // Returns false and leaves |*out_location| unchanged iff location
1282a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // information was not available.  (See SourceCodeInfo for
1283a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // description of path encoding.)
1284a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  bool GetSourceLocation(const std::vector<int>& path,
1285a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                         SourceLocation* out_location) const;
1286a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
1287b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer private:
1288fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  typedef FileOptions OptionsType;
1289fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1290fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const string* name_;
1291fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const string* package_;
1292fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const DescriptorPool* pool_;
1293fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  int dependency_count_;
1294fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const FileDescriptor** dependencies_;
1295a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  int public_dependency_count_;
1296a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  int* public_dependencies_;
1297a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  int weak_dependency_count_;
1298a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  int* weak_dependencies_;
1299fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  int message_type_count_;
1300fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  Descriptor* message_types_;
1301fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  int enum_type_count_;
1302fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  EnumDescriptor* enum_types_;
1303fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  int service_count_;
1304fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ServiceDescriptor* services_;
1305fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  int extension_count_;
1306b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  Syntax syntax_;
1307a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  bool is_placeholder_;
1308fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  FieldDescriptor* extensions_;
1309fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const FileOptions* options_;
1310fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1311fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const FileDescriptorTables* tables_;
1312a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  const SourceCodeInfo* source_code_info_;
1313fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // IMPORTANT:  If you add a new field, make sure to search for all instances
1314fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // of Allocate<FileDescriptor>() and AllocateArray<FileDescriptor>() in
1315fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // descriptor.cc and update them to initialize the field.
1316fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1317fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  FileDescriptor() {}
1318fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  friend class DescriptorBuilder;
1319fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  friend class Descriptor;
1320fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  friend class FieldDescriptor;
1321a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  friend class OneofDescriptor;
1322fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  friend class EnumDescriptor;
1323a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  friend class EnumValueDescriptor;
1324a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  friend class MethodDescriptor;
1325fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  friend class ServiceDescriptor;
1326fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(FileDescriptor);
1327fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville};
1328fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1329fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// ===================================================================
1330fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1331fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Used to construct descriptors.
1332fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
1333fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Normally you won't want to build your own descriptors.  Message classes
1334fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// constructed by the protocol compiler will provide them for you.  However,
1335fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// if you are implementing Message on your own, or if you are writing a
1336fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// program which can operate on totally arbitrary types and needs to load
1337fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// them from some sort of database, you might need to.
1338fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
1339fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Since Descriptors are composed of a whole lot of cross-linked bits of
1340fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// data that would be a pain to put together manually, the
1341fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// DescriptorPool class is provided to make the process easier.  It can
1342fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// take a FileDescriptorProto (defined in descriptor.proto), validate it,
1343fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// and convert it to a set of nicely cross-linked Descriptors.
1344fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
1345fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// DescriptorPool also helps with memory management.  Descriptors are
1346fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// composed of many objects containing static data and pointers to each
1347fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// other.  In all likelihood, when it comes time to delete this data,
1348fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// you'll want to delete it all at once.  In fact, it is not uncommon to
1349fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// have a whole pool of descriptors all cross-linked with each other which
1350fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// you wish to delete all at once.  This class represents such a pool, and
1351fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// handles the memory management for you.
1352fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
1353fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// You can also search for descriptors within a DescriptorPool by name, and
1354fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// extensions by number.
1355fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass LIBPROTOBUF_EXPORT DescriptorPool {
1356fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public:
1357fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Create a normal, empty DescriptorPool.
1358fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  DescriptorPool();
1359fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1360fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Constructs a DescriptorPool that, when it can't find something among the
1361fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // descriptors already in the pool, looks for it in the given
1362fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // DescriptorDatabase.
1363fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Notes:
1364fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // - If a DescriptorPool is constructed this way, its BuildFile*() methods
1365fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  //   must not be called (they will assert-fail).  The only way to populate
1366fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  //   the pool with descriptors is to call the Find*By*() methods.
1367fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // - The Find*By*() methods may block the calling thread if the
1368fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  //   DescriptorDatabase blocks.  This in turn means that parsing messages
1369fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  //   may block if they need to look up extensions.
1370fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // - The Find*By*() methods will use mutexes for thread-safety, thus making
1371fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  //   them slower even when they don't have to fall back to the database.
1372fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  //   In fact, even the Find*By*() methods of descriptor objects owned by
1373fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  //   this pool will be slower, since they will have to obtain locks too.
1374fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // - An ErrorCollector may optionally be given to collect validation errors
1375fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  //   in files loaded from the database.  If not given, errors will be printed
1376fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  //   to GOOGLE_LOG(ERROR).  Remember that files are built on-demand, so this
1377fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  //   ErrorCollector may be called from any thread that calls one of the
1378fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  //   Find*By*() methods.
1379a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // - The DescriptorDatabase must not be mutated during the lifetime of
1380a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  //   the DescriptorPool. Even if the client takes care to avoid data races,
1381a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  //   changes to the content of the DescriptorDatabase may not be reflected
1382a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  //   in subsequent lookups in the DescriptorPool.
1383fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  class ErrorCollector;
1384fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  explicit DescriptorPool(DescriptorDatabase* fallback_database,
1385fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                          ErrorCollector* error_collector = NULL);
1386fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1387fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ~DescriptorPool();
1388fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1389fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Get a pointer to the generated pool.  Generated protocol message classes
1390fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // which are compiled into the binary will allocate their descriptors in
1391fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // this pool.  Do not add your own descriptors to this pool.
1392fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  static const DescriptorPool* generated_pool();
1393fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1394b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
1395fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Find a FileDescriptor in the pool by file name.  Returns NULL if not
1396fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // found.
1397fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const FileDescriptor* FindFileByName(const string& name) const;
1398fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1399fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Find the FileDescriptor in the pool which defines the given symbol.
1400fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // If any of the Find*ByName() methods below would succeed, then this is
1401fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // equivalent to calling that method and calling the result's file() method.
1402fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Otherwise this returns NULL.
1403fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const FileDescriptor* FindFileContainingSymbol(
1404fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const string& symbol_name) const;
1405fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1406fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Looking up descriptors ------------------------------------------
1407fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // These find descriptors by fully-qualified name.  These will find both
1408fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // top-level descriptors and nested descriptors.  They return NULL if not
1409fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // found.
1410fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1411fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const Descriptor* FindMessageTypeByName(const string& name) const;
1412fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const FieldDescriptor* FindFieldByName(const string& name) const;
1413fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const FieldDescriptor* FindExtensionByName(const string& name) const;
1414a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  const OneofDescriptor* FindOneofByName(const string& name) const;
1415fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const EnumDescriptor* FindEnumTypeByName(const string& name) const;
1416fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const EnumValueDescriptor* FindEnumValueByName(const string& name) const;
1417fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const ServiceDescriptor* FindServiceByName(const string& name) const;
1418fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const MethodDescriptor* FindMethodByName(const string& name) const;
1419fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1420fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Finds an extension of the given type by number.  The extendee must be
1421fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // a member of this DescriptorPool or one of its underlays.
1422fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const FieldDescriptor* FindExtensionByNumber(const Descriptor* extendee,
1423fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                               int number) const;
1424fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1425fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Finds extensions of extendee. The extensions will be appended to
1426fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // out in an undefined order. Only extensions defined directly in
1427fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // this DescriptorPool or one of its underlays are guaranteed to be
1428fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // found: extensions defined in the fallback database might not be found
1429fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // depending on the database implementation.
1430fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  void FindAllExtensions(const Descriptor* extendee,
1431a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                         std::vector<const FieldDescriptor*>* out) const;
1432fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1433fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Building descriptors --------------------------------------------
1434fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1435fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // When converting a FileDescriptorProto to a FileDescriptor, various
1436fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // errors might be detected in the input.  The caller may handle these
1437fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // programmatically by implementing an ErrorCollector.
1438fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  class LIBPROTOBUF_EXPORT ErrorCollector {
1439fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville   public:
1440fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    inline ErrorCollector() {}
1441fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    virtual ~ErrorCollector();
1442fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1443fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // These constants specify what exact part of the construct is broken.
1444fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // This is useful e.g. for mapping the error back to an exact location
1445fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // in a .proto file.
1446fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    enum ErrorLocation {
1447fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      NAME,              // the symbol name, or the package name for files
1448fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      NUMBER,            // field or extension range number
1449fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      TYPE,              // field type
1450fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      EXTENDEE,          // field extendee
1451fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      DEFAULT_VALUE,     // field default value
1452fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      INPUT_TYPE,        // method input type
1453fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      OUTPUT_TYPE,       // method output type
1454fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      OPTION_NAME,       // name in assignment
1455fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      OPTION_VALUE,      // value in option assignment
1456fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      OTHER              // some other problem
1457fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    };
1458fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1459a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    // Reports an error in the FileDescriptorProto. Use this function if the
1460b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    // problem occurred should interrupt building the FileDescriptorProto.
1461fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    virtual void AddError(
1462fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const string& filename,      // File name in which the error occurred.
1463fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const string& element_name,  // Full name of the erroneous element.
1464fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const Message* descriptor,   // Descriptor of the erroneous element.
1465fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      ErrorLocation location,      // One of the location constants, above.
1466fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const string& message        // Human-readable error message.
1467fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      ) = 0;
1468fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1469a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    // Reports a warning in the FileDescriptorProto. Use this function if the
1470b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    // problem occurred should NOT interrupt building the FileDescriptorProto.
1471a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    virtual void AddWarning(
14724a0078628003c824f839fa22ae0ce9f133c8aa98Austin Schuh      const string& /*filename*/,      // File name in which the error occurred.
14734a0078628003c824f839fa22ae0ce9f133c8aa98Austin Schuh      const string& /*element_name*/,  // Full name of the erroneous element.
14744a0078628003c824f839fa22ae0ce9f133c8aa98Austin Schuh      const Message* /*descriptor*/,   // Descriptor of the erroneous element.
14754a0078628003c824f839fa22ae0ce9f133c8aa98Austin Schuh      ErrorLocation /*location*/,      // One of the location constants, above.
14764a0078628003c824f839fa22ae0ce9f133c8aa98Austin Schuh      const string& /*message*/        // Human-readable error message.
1477a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      ) {}
1478a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
1479fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville   private:
1480fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ErrorCollector);
1481fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  };
1482fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1483fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Convert the FileDescriptorProto to real descriptors and place them in
1484fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // this DescriptorPool.  All dependencies of the file must already be in
1485fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // the pool.  Returns the resulting FileDescriptor, or NULL if there were
1486fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // problems with the input (e.g. the message was invalid, or dependencies
1487fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // were missing).  Details about the errors are written to GOOGLE_LOG(ERROR).
1488fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const FileDescriptor* BuildFile(const FileDescriptorProto& proto);
1489fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1490fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Same as BuildFile() except errors are sent to the given ErrorCollector.
1491fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const FileDescriptor* BuildFileCollectingErrors(
1492fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const FileDescriptorProto& proto,
1493fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    ErrorCollector* error_collector);
1494fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1495fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // By default, it is an error if a FileDescriptorProto contains references
1496fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // to types or other files that are not found in the DescriptorPool (or its
1497fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // backing DescriptorDatabase, if any).  If you call
1498fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // AllowUnknownDependencies(), however, then unknown types and files
1499a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // will be replaced by placeholder descriptors (which can be identified by
1500a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // the is_placeholder() method).  This can allow you to
1501fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // perform some useful operations with a .proto file even if you do not
1502fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // have access to other .proto files on which it depends.  However, some
1503fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // heuristics must be used to fill in the gaps in information, and these
1504fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // can lead to descriptors which are inaccurate.  For example, the
1505fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // DescriptorPool may be forced to guess whether an unknown type is a message
1506fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // or an enum, as well as what package it resides in.  Furthermore,
1507fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // placeholder types will not be discoverable via FindMessageTypeByName()
1508fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // and similar methods, which could confuse some descriptor-based algorithms.
1509a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // Generally, the results of this option should be handled with extreme care.
1510fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  void AllowUnknownDependencies() { allow_unknown_ = true; }
1511fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1512a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // By default, weak imports are allowed to be missing, in which case we will
1513a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // use a placeholder for the dependency and convert the field to be an Empty
1514a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // message field. If you call EnforceWeakDependencies(true), however, the
1515a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // DescriptorPool will report a import not found error.
1516a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  void EnforceWeakDependencies(bool enforce) { enforce_weak_ = enforce; }
1517a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
1518fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Internal stuff --------------------------------------------------
1519fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // These methods MUST NOT be called from outside the proto2 library.
1520fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // These methods may contain hidden pitfalls and may be removed in a
1521fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // future library version.
1522fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1523fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Create a DescriptorPool which is overlaid on top of some other pool.
1524fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // If you search for a descriptor in the overlay and it is not found, the
1525fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // underlay will be searched as a backup.  If the underlay has its own
1526fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // underlay, that will be searched next, and so on.  This also means that
1527fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // files built in the overlay will be cross-linked with the underlay's
1528fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // descriptors if necessary.  The underlay remains property of the caller;
1529fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // it must remain valid for the lifetime of the newly-constructed pool.
1530fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  //
1531fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Example:  Say you want to parse a .proto file at runtime in order to use
1532fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // its type with a DynamicMessage.  Say this .proto file has dependencies,
1533fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // but you know that all the dependencies will be things that are already
1534fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // compiled into the binary.  For ease of use, you'd like to load the types
1535fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // right out of generated_pool() rather than have to parse redundant copies
1536fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // of all these .protos and runtime.  But, you don't want to add the parsed
1537fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // types directly into generated_pool(): this is not allowed, and would be
1538fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // bad design anyway.  So, instead, you could use generated_pool() as an
1539fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // underlay for a new DescriptorPool in which you add only the new file.
1540d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  //
1541d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  // WARNING:  Use of underlays can lead to many subtle gotchas.  Instead,
1542d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  //   try to formulate what you want to do in terms of DescriptorDatabases.
1543fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  explicit DescriptorPool(const DescriptorPool* underlay);
1544fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1545fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Called by generated classes at init time to add their descriptors to
1546fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // generated_pool.  Do NOT call this in your own code!  filename must be a
1547fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // permanent string (e.g. a string literal).
1548fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  static void InternalAddGeneratedFile(
1549fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const void* encoded_file_descriptor, int size);
1550fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1551fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1552fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // For internal use only:  Gets a non-const pointer to the generated pool.
1553fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // This is called at static-initialization time only, so thread-safety is
1554fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // not a concern.  If both an underlay and a fallback database are present,
1555a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // the underlay takes precedence.
1556fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  static DescriptorPool* internal_generated_pool();
1557fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1558fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // For internal use only:  Changes the behavior of BuildFile() such that it
1559fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // allows the file to make reference to message types declared in other files
1560fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // which it did not officially declare as dependencies.
1561fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  void InternalDontEnforceDependencies();
1562fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1563fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // For internal use only.
1564fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  void internal_set_underlay(const DescriptorPool* underlay) {
1565fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    underlay_ = underlay;
1566fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
1567fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1568fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // For internal (unit test) use only:  Returns true if a FileDescriptor has
1569fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // been constructed for the given file, false otherwise.  Useful for testing
1570fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // lazy descriptor initialization behavior.
1571fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  bool InternalIsFileLoaded(const string& filename) const;
1572fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1573a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
1574a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // Add a file to unused_import_track_files_. DescriptorBuilder will log
1575a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // warnings for those files if there is any unused import.
1576a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  void AddUnusedImportTrackFile(const string& file_name);
1577a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  void ClearUnusedImportTrackFiles();
1578a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
1579fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private:
1580fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  friend class Descriptor;
1581fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  friend class FieldDescriptor;
1582fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  friend class EnumDescriptor;
1583fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  friend class ServiceDescriptor;
1584fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  friend class FileDescriptor;
1585fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  friend class DescriptorBuilder;
1586b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  friend class FileDescriptorTables;
1587fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1588a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // Return true if the given name is a sub-symbol of any non-package
1589a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // descriptor that already exists in the descriptor pool.  (The full
1590a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // definition of such types is already known.)
1591a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  bool IsSubSymbolOfBuiltType(const string& name) const;
1592a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
1593fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Tries to find something in the fallback database and link in the
1594fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // corresponding proto file.  Returns true if successful, in which case
1595fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // the caller should search for the thing again.  These are declared
1596fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // const because they are called by (semantically) const methods.
1597fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  bool TryFindFileInFallbackDatabase(const string& name) const;
1598fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  bool TryFindSymbolInFallbackDatabase(const string& name) const;
1599fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  bool TryFindExtensionInFallbackDatabase(const Descriptor* containing_type,
1600fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                          int field_number) const;
1601fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1602fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Like BuildFile() but called internally when the file has been loaded from
1603fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // fallback_database_.  Declared const because it is called by (semantically)
1604fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // const methods.
1605fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const FileDescriptor* BuildFileFromDatabase(
1606fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const FileDescriptorProto& proto) const;
1607fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1608fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // If fallback_database_ is NULL, this is NULL.  Otherwise, this is a mutex
1609fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // which must be locked while accessing tables_.
1610fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  Mutex* mutex_;
1611fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1612fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // See constructor.
1613fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  DescriptorDatabase* fallback_database_;
1614fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ErrorCollector* default_error_collector_;
1615fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const DescriptorPool* underlay_;
1616fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1617fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // This class contains a lot of hash maps with complicated types that
1618fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // we'd like to keep out of the header.
1619fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  class Tables;
1620b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  google::protobuf::scoped_ptr<Tables> tables_;
1621fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1622fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  bool enforce_dependencies_;
1623fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  bool allow_unknown_;
1624a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  bool enforce_weak_;
1625a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  std::set<string> unused_import_track_files_;
1626fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1627fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(DescriptorPool);
1628fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville};
1629fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1630fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// inline methods ====================================================
1631fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1632fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// These macros makes this repetitive code more readable.
1633fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define PROTOBUF_DEFINE_ACCESSOR(CLASS, FIELD, TYPE) \
1634fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  inline TYPE CLASS::FIELD() const { return FIELD##_; }
1635fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1636fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Strings fields are stored as pointers but returned as const references.
1637fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define PROTOBUF_DEFINE_STRING_ACCESSOR(CLASS, FIELD) \
1638fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  inline const string& CLASS::FIELD() const { return *FIELD##_; }
1639fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1640fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Arrays take an index parameter, obviously.
1641fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define PROTOBUF_DEFINE_ARRAY_ACCESSOR(CLASS, FIELD, TYPE) \
1642fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  inline TYPE CLASS::FIELD(int index) const { return FIELD##s_ + index; }
1643fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1644fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define PROTOBUF_DEFINE_OPTIONS_ACCESSOR(CLASS, TYPE) \
1645fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  inline const TYPE& CLASS::options() const { return *options_; }
1646fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1647fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_STRING_ACCESSOR(Descriptor, name)
1648fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_STRING_ACCESSOR(Descriptor, full_name)
1649fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_ACCESSOR(Descriptor, file, const FileDescriptor*)
1650fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_ACCESSOR(Descriptor, containing_type, const Descriptor*)
1651fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1652fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_ACCESSOR(Descriptor, field_count, int)
1653a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonPROTOBUF_DEFINE_ACCESSOR(Descriptor, oneof_decl_count, int)
1654fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_ACCESSOR(Descriptor, nested_type_count, int)
1655fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_ACCESSOR(Descriptor, enum_type_count, int)
1656fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1657fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_ARRAY_ACCESSOR(Descriptor, field, const FieldDescriptor*)
1658a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonPROTOBUF_DEFINE_ARRAY_ACCESSOR(Descriptor, oneof_decl, const OneofDescriptor*)
1659fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_ARRAY_ACCESSOR(Descriptor, nested_type, const Descriptor*)
1660fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_ARRAY_ACCESSOR(Descriptor, enum_type, const EnumDescriptor*)
1661fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1662fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_ACCESSOR(Descriptor, extension_range_count, int)
1663fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_ACCESSOR(Descriptor, extension_count, int)
1664fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_ARRAY_ACCESSOR(Descriptor, extension_range,
1665fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                               const Descriptor::ExtensionRange*)
1666fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_ARRAY_ACCESSOR(Descriptor, extension,
1667fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                               const FieldDescriptor*)
1668b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
1669b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerPROTOBUF_DEFINE_ACCESSOR(Descriptor, reserved_range_count, int)
1670b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerPROTOBUF_DEFINE_ARRAY_ACCESSOR(Descriptor, reserved_range,
1671b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer                               const Descriptor::ReservedRange*)
1672b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerPROTOBUF_DEFINE_ACCESSOR(Descriptor, reserved_name_count, int)
1673b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
1674b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerPROTOBUF_DEFINE_OPTIONS_ACCESSOR(Descriptor, MessageOptions)
1675a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonPROTOBUF_DEFINE_ACCESSOR(Descriptor, is_placeholder, bool)
1676fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1677fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_STRING_ACCESSOR(FieldDescriptor, name)
1678fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_STRING_ACCESSOR(FieldDescriptor, full_name)
1679b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerPROTOBUF_DEFINE_STRING_ACCESSOR(FieldDescriptor, json_name)
1680fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_STRING_ACCESSOR(FieldDescriptor, lowercase_name)
1681fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_STRING_ACCESSOR(FieldDescriptor, camelcase_name)
1682fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, file, const FileDescriptor*)
1683fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, number, int)
1684fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, is_extension, bool)
1685fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, type, FieldDescriptor::Type)
1686fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, label, FieldDescriptor::Label)
1687fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, containing_type, const Descriptor*)
1688a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonPROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, containing_oneof,
1689a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                         const OneofDescriptor*)
1690a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonPROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, index_in_oneof, int)
1691fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, extension_scope, const Descriptor*)
1692fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, message_type, const Descriptor*)
1693fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, enum_type, const EnumDescriptor*)
1694a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonPROTOBUF_DEFINE_OPTIONS_ACCESSOR(FieldDescriptor, FieldOptions)
1695fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, has_default_value, bool)
1696fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, default_value_int32 , int32 )
1697fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, default_value_int64 , int64 )
1698fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, default_value_uint32, uint32)
1699fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, default_value_uint64, uint64)
1700fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, default_value_float , float )
1701fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, default_value_double, double)
1702fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, default_value_bool  , bool  )
1703fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, default_value_enum,
1704fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                         const EnumValueDescriptor*)
1705fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_STRING_ACCESSOR(FieldDescriptor, default_value_string)
1706fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1707a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonPROTOBUF_DEFINE_STRING_ACCESSOR(OneofDescriptor, name)
1708a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonPROTOBUF_DEFINE_STRING_ACCESSOR(OneofDescriptor, full_name)
1709a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonPROTOBUF_DEFINE_ACCESSOR(OneofDescriptor, containing_type, const Descriptor*)
1710a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonPROTOBUF_DEFINE_ACCESSOR(OneofDescriptor, field_count, int)
1711a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
1712fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_STRING_ACCESSOR(EnumDescriptor, name)
1713fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_STRING_ACCESSOR(EnumDescriptor, full_name)
1714fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_ACCESSOR(EnumDescriptor, file, const FileDescriptor*)
1715fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_ACCESSOR(EnumDescriptor, containing_type, const Descriptor*)
1716fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_ACCESSOR(EnumDescriptor, value_count, int)
1717fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_ARRAY_ACCESSOR(EnumDescriptor, value,
1718fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                               const EnumValueDescriptor*)
1719b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerPROTOBUF_DEFINE_OPTIONS_ACCESSOR(EnumDescriptor, EnumOptions)
1720a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonPROTOBUF_DEFINE_ACCESSOR(EnumDescriptor, is_placeholder, bool)
1721fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1722fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_STRING_ACCESSOR(EnumValueDescriptor, name)
1723fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_STRING_ACCESSOR(EnumValueDescriptor, full_name)
1724fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_ACCESSOR(EnumValueDescriptor, number, int)
1725fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_ACCESSOR(EnumValueDescriptor, type, const EnumDescriptor*)
1726a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonPROTOBUF_DEFINE_OPTIONS_ACCESSOR(EnumValueDescriptor, EnumValueOptions)
1727fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1728fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_STRING_ACCESSOR(ServiceDescriptor, name)
1729fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_STRING_ACCESSOR(ServiceDescriptor, full_name)
1730fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_ACCESSOR(ServiceDescriptor, file, const FileDescriptor*)
1731fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_ACCESSOR(ServiceDescriptor, method_count, int)
1732fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_ARRAY_ACCESSOR(ServiceDescriptor, method,
1733fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                               const MethodDescriptor*)
1734b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerPROTOBUF_DEFINE_OPTIONS_ACCESSOR(ServiceDescriptor, ServiceOptions)
1735fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1736fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_STRING_ACCESSOR(MethodDescriptor, name)
1737fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_STRING_ACCESSOR(MethodDescriptor, full_name)
1738fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_ACCESSOR(MethodDescriptor, service, const ServiceDescriptor*)
1739fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_ACCESSOR(MethodDescriptor, input_type, const Descriptor*)
1740fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_ACCESSOR(MethodDescriptor, output_type, const Descriptor*)
1741b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerPROTOBUF_DEFINE_OPTIONS_ACCESSOR(MethodDescriptor, MethodOptions)
1742b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerPROTOBUF_DEFINE_ACCESSOR(MethodDescriptor, client_streaming, bool)
1743b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerPROTOBUF_DEFINE_ACCESSOR(MethodDescriptor, server_streaming, bool)
1744b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
1745fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_STRING_ACCESSOR(FileDescriptor, name)
1746fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_STRING_ACCESSOR(FileDescriptor, package)
1747fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_ACCESSOR(FileDescriptor, pool, const DescriptorPool*)
1748fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_ACCESSOR(FileDescriptor, dependency_count, int)
1749a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonPROTOBUF_DEFINE_ACCESSOR(FileDescriptor, public_dependency_count, int)
1750a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonPROTOBUF_DEFINE_ACCESSOR(FileDescriptor, weak_dependency_count, int)
1751fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_ACCESSOR(FileDescriptor, message_type_count, int)
1752fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_ACCESSOR(FileDescriptor, enum_type_count, int)
1753fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_ACCESSOR(FileDescriptor, service_count, int)
1754fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_ACCESSOR(FileDescriptor, extension_count, int)
1755b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerPROTOBUF_DEFINE_OPTIONS_ACCESSOR(FileDescriptor, FileOptions)
1756a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonPROTOBUF_DEFINE_ACCESSOR(FileDescriptor, is_placeholder, bool)
1757fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1758fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_ARRAY_ACCESSOR(FileDescriptor, message_type, const Descriptor*)
1759fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_ARRAY_ACCESSOR(FileDescriptor, enum_type, const EnumDescriptor*)
1760fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_ARRAY_ACCESSOR(FileDescriptor, service,
1761fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                               const ServiceDescriptor*)
1762fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_ARRAY_ACCESSOR(FileDescriptor, extension,
1763fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                               const FieldDescriptor*)
1764fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1765fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#undef PROTOBUF_DEFINE_ACCESSOR
1766fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#undef PROTOBUF_DEFINE_STRING_ACCESSOR
1767fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#undef PROTOBUF_DEFINE_ARRAY_ACCESSOR
1768fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1769fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// A few accessors differ from the macros...
1770fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1771a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsoninline bool Descriptor::IsExtensionNumber(int number) const {
1772a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  return FindExtensionRangeContainingNumber(number) != NULL;
1773a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}
1774a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
1775b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerinline bool Descriptor::IsReservedNumber(int number) const {
1776b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  return FindReservedRangeContainingNumber(number) != NULL;
1777b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer}
1778b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
1779b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerinline bool Descriptor::IsReservedName(const string& name) const {
1780b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  for (int i = 0; i < reserved_name_count(); i++) {
1781b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    if (name == reserved_name(i)) {
1782b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      return true;
1783b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    }
1784b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  }
1785b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  return false;
1786b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer}
1787b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
1788b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// Can't use PROTOBUF_DEFINE_ARRAY_ACCESSOR because reserved_names_ is actually
1789b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// an array of pointers rather than the usual array of objects.
1790b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerinline const string& Descriptor::reserved_name(int index) const {
1791b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  return *reserved_names_[index];
1792b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer}
1793b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
1794fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline bool FieldDescriptor::is_required() const {
1795fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return label() == LABEL_REQUIRED;
1796fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
1797fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1798fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline bool FieldDescriptor::is_optional() const {
1799fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return label() == LABEL_OPTIONAL;
1800fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
1801fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1802fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline bool FieldDescriptor::is_repeated() const {
1803fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return label() == LABEL_REPEATED;
1804fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
1805fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1806d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Savilleinline bool FieldDescriptor::is_packable() const {
1807d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  return is_repeated() && IsTypePackable(type());
1808d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville}
1809d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
1810fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// To save space, index() is computed by looking at the descriptor's position
1811fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// in the parent's array of children.
1812fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline int FieldDescriptor::index() const {
1813fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  if (!is_extension_) {
1814afb4b72037e3f13db208590fc782c4bc8e27f862Jeff Davidson    return static_cast<int>(this - containing_type_->fields_);
1815fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  } else if (extension_scope_ != NULL) {
1816afb4b72037e3f13db208590fc782c4bc8e27f862Jeff Davidson    return static_cast<int>(this - extension_scope_->extensions_);
1817fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  } else {
1818afb4b72037e3f13db208590fc782c4bc8e27f862Jeff Davidson    return static_cast<int>(this - file_->extensions_);
1819fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
1820fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
1821fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1822fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline int Descriptor::index() const {
1823fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  if (containing_type_ == NULL) {
1824afb4b72037e3f13db208590fc782c4bc8e27f862Jeff Davidson    return static_cast<int>(this - file_->message_types_);
1825fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  } else {
1826afb4b72037e3f13db208590fc782c4bc8e27f862Jeff Davidson    return static_cast<int>(this - containing_type_->nested_types_);
1827fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
1828fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
1829fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1830a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsoninline int OneofDescriptor::index() const {
1831afb4b72037e3f13db208590fc782c4bc8e27f862Jeff Davidson  return static_cast<int>(this - containing_type_->oneof_decls_);
1832a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}
1833a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
1834fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline int EnumDescriptor::index() const {
1835fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  if (containing_type_ == NULL) {
1836afb4b72037e3f13db208590fc782c4bc8e27f862Jeff Davidson    return static_cast<int>(this - file_->enum_types_);
1837fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  } else {
1838afb4b72037e3f13db208590fc782c4bc8e27f862Jeff Davidson    return static_cast<int>(this - containing_type_->enum_types_);
1839fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
1840fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
1841fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1842fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline int EnumValueDescriptor::index() const {
1843afb4b72037e3f13db208590fc782c4bc8e27f862Jeff Davidson  return static_cast<int>(this - type_->values_);
1844fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
1845fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1846fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline int ServiceDescriptor::index() const {
1847afb4b72037e3f13db208590fc782c4bc8e27f862Jeff Davidson  return static_cast<int>(this - file_->services_);
1848fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
1849fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1850fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline int MethodDescriptor::index() const {
1851afb4b72037e3f13db208590fc782c4bc8e27f862Jeff Davidson  return static_cast<int>(this - service_->methods_);
1852fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
1853fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1854a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsoninline const char* FieldDescriptor::type_name() const {
1855a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  return kTypeToName[type_];
1856a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}
1857a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
1858fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline FieldDescriptor::CppType FieldDescriptor::cpp_type() const {
1859fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return kTypeToCppTypeMap[type_];
1860fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
1861fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1862a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsoninline const char* FieldDescriptor::cpp_type_name() const {
1863a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  return kCppTypeToName[kTypeToCppTypeMap[type_]];
1864a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}
1865a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
1866fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline FieldDescriptor::CppType FieldDescriptor::TypeToCppType(Type type) {
1867fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return kTypeToCppTypeMap[type];
1868fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
1869fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1870a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsoninline const char* FieldDescriptor::TypeName(Type type) {
1871a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  return kTypeToName[type];
1872a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}
1873a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
1874a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsoninline const char* FieldDescriptor::CppTypeName(CppType cpp_type) {
1875a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  return kCppTypeToName[cpp_type];
1876a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}
1877a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
1878d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Savilleinline bool FieldDescriptor::IsTypePackable(Type field_type) {
1879d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  return (field_type != FieldDescriptor::TYPE_STRING &&
1880d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville          field_type != FieldDescriptor::TYPE_GROUP &&
1881d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville          field_type != FieldDescriptor::TYPE_MESSAGE &&
1882d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville          field_type != FieldDescriptor::TYPE_BYTES);
1883d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville}
1884d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
1885fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline const FileDescriptor* FileDescriptor::dependency(int index) const {
1886fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return dependencies_[index];
1887fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
1888fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1889a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsoninline const FileDescriptor* FileDescriptor::public_dependency(
1890a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    int index) const {
1891a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  return dependencies_[public_dependencies_[index]];
1892a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}
1893a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
1894a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsoninline const FileDescriptor* FileDescriptor::weak_dependency(
1895a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    int index) const {
1896a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  return dependencies_[weak_dependencies_[index]];
1897a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}
1898a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
1899b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerinline FileDescriptor::Syntax FileDescriptor::syntax() const {
1900b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  return syntax_;
1901b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer}
1902b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
1903a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// Can't use PROTOBUF_DEFINE_ARRAY_ACCESSOR because fields_ is actually an array
1904a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// of pointers rather than the usual array of objects.
1905a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsoninline const FieldDescriptor* OneofDescriptor::field(int index) const {
1906a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  return fields_[index];
1907a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}
1908a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
1909fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}  // namespace protobuf
1910fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1911fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}  // namespace google
1912fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#endif  // GOOGLE_PROTOBUF_DESCRIPTOR_H__
1913