blob: 08b155548beb90ed850bd92e882a8896a7f29577 [file] [log] [blame]
temporal40ee5512008-07-10 02:12:20 +00001// Protocol Buffers - Google's data interchange format
kenton@google.com24bf56f2008-09-24 20:31:01 +00002// Copyright 2008 Google Inc. All rights reserved.
Feng Xiaoe4288622014-10-01 16:26:23 -07003// https://developers.google.com/protocol-buffers/
temporal40ee5512008-07-10 02:12:20 +00004//
kenton@google.com24bf56f2008-09-24 20:31:01 +00005// Redistribution and use in source and binary forms, with or without
6// modification, are permitted provided that the following conditions are
7// met:
temporal40ee5512008-07-10 02:12:20 +00008//
kenton@google.com24bf56f2008-09-24 20:31:01 +00009// * Redistributions of source code must retain the above copyright
10// notice, this list of conditions and the following disclaimer.
11// * Redistributions in binary form must reproduce the above
12// copyright notice, this list of conditions and the following disclaimer
13// in the documentation and/or other materials provided with the
14// distribution.
15// * Neither the name of Google Inc. nor the names of its
16// contributors may be used to endorse or promote products derived from
17// this software without specific prior written permission.
temporal40ee5512008-07-10 02:12:20 +000018//
kenton@google.com24bf56f2008-09-24 20:31:01 +000019// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
temporal40ee5512008-07-10 02:12:20 +000030
31// Author: kenton@google.com (Kenton Varda)
32// Based on original Protocol Buffers design by
33// Sanjay Ghemawat, Jeff Dean, and others.
34//
35// The messages in this file describe the definitions found in .proto files.
36// A valid .proto file can be translated directly to a FileDescriptorProto
37// without any other information (e.g. without reading its imports).
38
39
Feng Xiao6ef984a2014-11-10 17:34:54 -080040syntax = "proto2";
temporal40ee5512008-07-10 02:12:20 +000041
42package google.protobuf;
Tamir Duberstein66463d72015-06-11 15:11:56 -040043option go_package = "descriptor";
temporal40ee5512008-07-10 02:12:20 +000044option java_package = "com.google.protobuf";
45option java_outer_classname = "DescriptorProtos";
Jon Skeet75a18a32015-09-01 15:29:15 +010046option csharp_namespace = "Google.Protobuf.Reflection";
Thomas Van Lenten30650d82015-05-01 08:57:16 -040047option objc_class_prefix = "GPB";
temporal40ee5512008-07-10 02:12:20 +000048
49// descriptor.proto must be optimized for speed because reflection-based
50// algorithms don't work during bootstrapping.
51option optimize_for = SPEED;
52
temporal779f61c2008-08-13 03:15:00 +000053// The protocol compiler can output a FileDescriptorSet containing the .proto
54// files it parses.
55message FileDescriptorSet {
56 repeated FileDescriptorProto file = 1;
57}
58
temporal40ee5512008-07-10 02:12:20 +000059// Describes a complete .proto file.
60message FileDescriptorProto {
61 optional string name = 1; // file name, relative to root of source tree
62 optional string package = 2; // e.g. "foo", "foo.bar", etc.
63
64 // Names of files imported by this file.
65 repeated string dependency = 3;
xiaofeng@google.comb55a20f2012-09-22 02:40:50 +000066 // Indexes of the public imported files in the dependency list above.
67 repeated int32 public_dependency = 10;
68 // Indexes of the weak imported files in the dependency list.
69 // For Google-internal migration only. Do not use.
70 repeated int32 weak_dependency = 11;
temporal40ee5512008-07-10 02:12:20 +000071
72 // All top-level definitions in this file.
73 repeated DescriptorProto message_type = 4;
74 repeated EnumDescriptorProto enum_type = 5;
75 repeated ServiceDescriptorProto service = 6;
76 repeated FieldDescriptorProto extension = 7;
77
78 optional FileOptions options = 8;
liujisi@google.com33165fe2010-11-02 13:14:58 +000079
80 // This field contains optional information about the original source code.
Feng Xiao6ef984a2014-11-10 17:34:54 -080081 // You may safely remove this entire field without harming runtime
liujisi@google.com33165fe2010-11-02 13:14:58 +000082 // functionality of the descriptors -- the information is needed only by
83 // development tools.
84 optional SourceCodeInfo source_code_info = 9;
Feng Xiao6ef984a2014-11-10 17:34:54 -080085
86 // The syntax of the proto file.
87 // The supported values are "proto2" and "proto3".
88 optional string syntax = 12;
temporal40ee5512008-07-10 02:12:20 +000089}
90
91// Describes a message type.
92message DescriptorProto {
93 optional string name = 1;
94
95 repeated FieldDescriptorProto field = 2;
96 repeated FieldDescriptorProto extension = 6;
97
98 repeated DescriptorProto nested_type = 3;
99 repeated EnumDescriptorProto enum_type = 4;
100
101 message ExtensionRange {
102 optional int32 start = 1;
103 optional int32 end = 2;
104 }
105 repeated ExtensionRange extension_range = 5;
106
jieluo@google.com4de8f552014-07-18 00:47:59 +0000107 repeated OneofDescriptorProto oneof_decl = 8;
108
temporal40ee5512008-07-10 02:12:20 +0000109 optional MessageOptions options = 7;
Bo Yang5db21732015-05-21 14:28:59 -0700110
111 // Range of reserved tag numbers. Reserved tag numbers may not be used by
112 // fields or extension ranges in the same message. Reserved ranges may
113 // not overlap.
114 message ReservedRange {
115 optional int32 start = 1; // Inclusive.
116 optional int32 end = 2; // Exclusive.
117 }
118 repeated ReservedRange reserved_range = 9;
119 // Reserved field names, which may not be used by fields in the same message.
120 // A given name may only be reserved once.
121 repeated string reserved_name = 10;
temporal40ee5512008-07-10 02:12:20 +0000122}
123
124// Describes a field within a message.
125message FieldDescriptorProto {
126 enum Type {
127 // 0 is reserved for errors.
128 // Order is weird for historical reasons.
129 TYPE_DOUBLE = 1;
130 TYPE_FLOAT = 2;
xiaofeng@google.comb55a20f2012-09-22 02:40:50 +0000131 // Not ZigZag encoded. Negative numbers take 10 bytes. Use TYPE_SINT64 if
132 // negative values are likely.
133 TYPE_INT64 = 3;
temporal40ee5512008-07-10 02:12:20 +0000134 TYPE_UINT64 = 4;
xiaofeng@google.comb55a20f2012-09-22 02:40:50 +0000135 // Not ZigZag encoded. Negative numbers take 10 bytes. Use TYPE_SINT32 if
136 // negative values are likely.
137 TYPE_INT32 = 5;
temporal40ee5512008-07-10 02:12:20 +0000138 TYPE_FIXED64 = 6;
139 TYPE_FIXED32 = 7;
140 TYPE_BOOL = 8;
141 TYPE_STRING = 9;
142 TYPE_GROUP = 10; // Tag-delimited aggregate.
143 TYPE_MESSAGE = 11; // Length-delimited aggregate.
144
145 // New in version 2.
146 TYPE_BYTES = 12;
147 TYPE_UINT32 = 13;
148 TYPE_ENUM = 14;
149 TYPE_SFIXED32 = 15;
150 TYPE_SFIXED64 = 16;
151 TYPE_SINT32 = 17; // Uses ZigZag encoding.
152 TYPE_SINT64 = 18; // Uses ZigZag encoding.
153 };
154
155 enum Label {
156 // 0 is reserved for errors
157 LABEL_OPTIONAL = 1;
158 LABEL_REQUIRED = 2;
159 LABEL_REPEATED = 3;
160 // TODO(sanjay): Should we add LABEL_MAP?
161 };
162
163 optional string name = 1;
164 optional int32 number = 3;
165 optional Label label = 4;
166
167 // If type_name is set, this need not be set. If both this and type_name
jieluo@google.com4de8f552014-07-18 00:47:59 +0000168 // are set, this must be one of TYPE_ENUM, TYPE_MESSAGE or TYPE_GROUP.
temporal40ee5512008-07-10 02:12:20 +0000169 optional Type type = 5;
170
171 // For message and enum types, this is the name of the type. If the name
172 // starts with a '.', it is fully-qualified. Otherwise, C++-like scoping
173 // rules are used to find the type (i.e. first the nested types within this
174 // message are searched, then within the parent, on up to the root
175 // namespace).
176 optional string type_name = 6;
177
178 // For extensions, this is the name of the type being extended. It is
179 // resolved in the same manner as type_name.
180 optional string extendee = 2;
181
182 // For numeric types, contains the original text representation of the value.
183 // For booleans, "true" or "false".
184 // For strings, contains the default text contents (not escaped in any way).
185 // For bytes, contains the C escaped value. All bytes >= 128 are escaped.
186 // TODO(kenton): Base-64 encode?
187 optional string default_value = 7;
188
jieluo@google.com4de8f552014-07-18 00:47:59 +0000189 // If set, gives the index of a oneof in the containing type's oneof_decl
Jisi Liu885b6122015-02-28 14:51:22 -0800190 // list. This field is a member of that oneof.
jieluo@google.com4de8f552014-07-18 00:47:59 +0000191 optional int32 oneof_index = 9;
192
Jisi Liu46e8ff62015-10-05 11:59:43 -0700193 // JSON name of this field. The value is set by protocol compiler. If the
194 // user has set a "json_name" option on this field, that option's value
195 // will be used. Otherwise, it's deduced from the field's name by converting
196 // it to camelCase.
197 optional string json_name = 10;
198
temporal40ee5512008-07-10 02:12:20 +0000199 optional FieldOptions options = 8;
200}
201
jieluo@google.com4de8f552014-07-18 00:47:59 +0000202// Describes a oneof.
203message OneofDescriptorProto {
204 optional string name = 1;
205}
206
temporal40ee5512008-07-10 02:12:20 +0000207// Describes an enum type.
208message EnumDescriptorProto {
209 optional string name = 1;
210
211 repeated EnumValueDescriptorProto value = 2;
212
213 optional EnumOptions options = 3;
214}
215
216// Describes a value within an enum.
217message EnumValueDescriptorProto {
218 optional string name = 1;
219 optional int32 number = 2;
220
221 optional EnumValueOptions options = 3;
222}
223
224// Describes a service.
225message ServiceDescriptorProto {
226 optional string name = 1;
227 repeated MethodDescriptorProto method = 2;
228
229 optional ServiceOptions options = 3;
230}
231
232// Describes a method of a service.
233message MethodDescriptorProto {
234 optional string name = 1;
235
236 // Input and output type names. These are resolved in the same way as
237 // FieldDescriptorProto.type_name, but must refer to a message type.
238 optional string input_type = 2;
239 optional string output_type = 3;
240
241 optional MethodOptions options = 4;
Feng Xiao99aa0f92014-11-20 16:18:53 -0800242
243 // Identifies if client streams multiple client messages
244 optional bool client_streaming = 5 [default=false];
245 // Identifies if server streams multiple server messages
246 optional bool server_streaming = 6 [default=false];
temporal40ee5512008-07-10 02:12:20 +0000247}
248
xiaofeng@google.comb55a20f2012-09-22 02:40:50 +0000249
temporal40ee5512008-07-10 02:12:20 +0000250// ===================================================================
251// Options
252
253// Each of the definitions above may have "options" attached. These are
254// just annotations which may cause code to be generated slightly differently
255// or may contain hints for code that manipulates protocol messages.
kenton@google.com24bf56f2008-09-24 20:31:01 +0000256//
257// Clients may define custom options as extensions of the *Options messages.
258// These extensions may not yet be known at parsing time, so the parser cannot
259// store the values in them. Instead it stores them in a field in the *Options
260// message called uninterpreted_option. This field must have the same name
261// across all *Options messages. We then use this field to populate the
262// extensions when we build a descriptor, at which point all protos have been
263// parsed and so all extensions are known.
264//
265// Extension numbers for custom options may be chosen as follows:
266// * For options which will only be used within a single application or
267// organization, or for experimental options, use field numbers 50000
268// through 99999. It is up to you to ensure that you do not use the
269// same number for multiple options.
270// * For options which will be published and used publicly by multiple
liujisi@google.com7a6de002011-05-25 06:25:24 +0000271// independent entities, e-mail protobuf-global-extension-registry@google.com
272// to reserve extension numbers. Simply provide your project name (e.g.
Bo Yang5db21732015-05-21 14:28:59 -0700273// Objective-C plugin) and your project website (if available) -- there's no
274// need to explain how you intend to use them. Usually you only need one
275// extension number. You can declare multiple options with only one extension
276// number by putting them in a sub-message. See the Custom Options section of
277// the docs for examples:
Feng Xiaoe4288622014-10-01 16:26:23 -0700278// https://developers.google.com/protocol-buffers/docs/proto#options
liujisi@google.com7a6de002011-05-25 06:25:24 +0000279// If this turns out to be popular, a web service will be set up
kenton@google.com24bf56f2008-09-24 20:31:01 +0000280// to automatically assign option numbers.
temporal40ee5512008-07-10 02:12:20 +0000281
temporal40ee5512008-07-10 02:12:20 +0000282
283message FileOptions {
284
285 // Sets the Java package where classes generated from this .proto will be
286 // placed. By default, the proto package is used, but this is often
287 // inappropriate because proto packages do not normally start with backwards
288 // domain names.
289 optional string java_package = 1;
290
291
292 // If set, all the classes from the .proto file are wrapped in a single
293 // outer class with the given name. This applies to both Proto1
294 // (equivalent to the old "--one_java_file" option) and Proto2 (where
295 // a .proto always translates to a single class, but you may want to
296 // explicitly choose the class name).
297 optional string java_outer_classname = 8;
298
299 // If set true, then the Java code generator will generate a separate .java
300 // file for each top-level message, enum, and service defined in the .proto
301 // file. Thus, these types will *not* be nested inside the outer class
302 // named by java_outer_classname. However, the outer class will still be
303 // generated to contain the file's getDescriptor() method as well as any
304 // top-level extensions defined in the file.
305 optional bool java_multiple_files = 10 [default=false];
306
liujisi@google.com33165fe2010-11-02 13:14:58 +0000307 // If set true, then the Java code generator will generate equals() and
jieluo@google.com4de8f552014-07-18 00:47:59 +0000308 // hashCode() methods for all messages defined in the .proto file.
Feng Xiaoeee38b02015-08-22 18:25:48 -0700309 // This increases generated code size, potentially substantially for large
310 // protos, which may harm a memory-constrained application.
311 // - In the full runtime this is a speed optimization, as the
jieluo@google.com4de8f552014-07-18 00:47:59 +0000312 // AbstractMessage base class includes reflection-based implementations of
313 // these methods.
Feng Xiaoeee38b02015-08-22 18:25:48 -0700314 // - In the lite runtime, setting this option changes the semantics of
jieluo@google.com4de8f552014-07-18 00:47:59 +0000315 // equals() and hashCode() to more closely match those of the full runtime;
316 // the generated methods compute their results based on field values rather
317 // than object identity. (Implementations should not assume that hashcodes
318 // will be consistent across runtimes or versions of the protocol compiler.)
liujisi@google.com33165fe2010-11-02 13:14:58 +0000319 optional bool java_generate_equals_and_hash = 20 [default=false];
320
jieluo@google.com4de8f552014-07-18 00:47:59 +0000321 // If set true, then the Java2 code generator will generate code that
322 // throws an exception whenever an attempt is made to assign a non-UTF-8
323 // byte sequence to a string field.
324 // Message reflection will do the same.
325 // However, an extension field still accepts non-UTF-8 byte sequences.
326 // This option has no effect on when used with the lite runtime.
327 optional bool java_string_check_utf8 = 27 [default=false];
328
329
temporal40ee5512008-07-10 02:12:20 +0000330 // Generated classes can be optimized for speed or code size.
331 enum OptimizeMode {
kenton@google.com80b1d622009-07-29 01:13:20 +0000332 SPEED = 1; // Generate complete code for parsing, serialization,
333 // etc.
334 CODE_SIZE = 2; // Use ReflectionOps to implement these methods.
335 LITE_RUNTIME = 3; // Generate code using MessageLite and the lite runtime.
temporal40ee5512008-07-10 02:12:20 +0000336 }
kenton@google.comd37d46d2009-04-25 02:53:47 +0000337 optional OptimizeMode optimize_for = 9 [default=SPEED];
kenton@google.com24bf56f2008-09-24 20:31:01 +0000338
xiaofeng@google.comb55a20f2012-09-22 02:40:50 +0000339 // Sets the Go package where structs generated from this .proto will be
Feng Xiao6ef984a2014-11-10 17:34:54 -0800340 // placed. If omitted, the Go package will be derived from the following:
341 // - The basename of the package import path, if provided.
342 // - Otherwise, the package statement in the .proto file, if present.
343 // - Otherwise, the basename of the .proto file, without extension.
xiaofeng@google.comb55a20f2012-09-22 02:40:50 +0000344 optional string go_package = 11;
kenton@google.com26bd9ee2008-11-21 00:06:27 +0000345
kenton@google.com2d6daa72009-01-22 01:27:00 +0000346
kenton@google.comfccb1462009-12-18 02:11:36 +0000347
348 // Should generic services be generated in each language? "Generic" services
349 // are not specific to any particular RPC system. They are generated by the
350 // main code generators in each language (without additional plugins).
351 // Generic services were the only kind of service generation supported by
Feng Xiao6ef984a2014-11-10 17:34:54 -0800352 // early versions of google.protobuf.
kenton@google.comfccb1462009-12-18 02:11:36 +0000353 //
354 // Generic services are now considered deprecated in favor of using plugins
liujisi@google.com33165fe2010-11-02 13:14:58 +0000355 // that generate code specific to your particular RPC system. Therefore,
356 // these default to false. Old code which depends on generic services should
357 // explicitly set them to true.
358 optional bool cc_generic_services = 16 [default=false];
359 optional bool java_generic_services = 17 [default=false];
360 optional bool py_generic_services = 18 [default=false];
kenton@google.comfccb1462009-12-18 02:11:36 +0000361
jieluo@google.com4de8f552014-07-18 00:47:59 +0000362 // Is this file deprecated?
363 // Depending on the target platform, this can emit Deprecated annotations
364 // for everything in the file, or it will be completely ignored; in the very
365 // least, this is a formalization for deprecating files.
366 optional bool deprecated = 23 [default=false];
367
Feng Xiaof157a562014-11-14 11:50:31 -0800368 // Enables the use of arenas for the proto messages in this file. This applies
369 // only to generated classes for C++.
370 optional bool cc_enable_arenas = 31 [default=false];
371
372
Jisi Liu885b6122015-02-28 14:51:22 -0800373 // Sets the objective c class prefix which is prepended to all objective c
374 // generated classes from this .proto. There is no default.
375 optional string objc_class_prefix = 36;
376
Jan Tattermusch685ae362015-03-16 19:07:16 -0700377 // Namespace for generated classes; defaults to the package.
378 optional string csharp_namespace = 37;
379
kenton@google.com24bf56f2008-09-24 20:31:01 +0000380 // The parser stores options it doesn't recognize here. See above.
381 repeated UninterpretedOption uninterpreted_option = 999;
382
383 // Clients can define custom options in extensions of this message. See above.
384 extensions 1000 to max;
Jisi Liu3b3c8ab2016-03-30 11:39:59 -0700385
386 reserved 38;
temporal40ee5512008-07-10 02:12:20 +0000387}
388
389message MessageOptions {
390 // Set true to use the old proto1 MessageSet wire format for extensions.
391 // This is provided for backwards-compatibility with the MessageSet wire
392 // format. You should not use this for any other reason: It's less
393 // efficient, has fewer features, and is more complicated.
394 //
395 // The message must be defined exactly as follows:
396 // message Foo {
397 // option message_set_wire_format = true;
398 // extensions 4 to max;
399 // }
400 // Note that the message cannot have any defined fields; MessageSets only
401 // have extensions.
402 //
403 // All extensions of your type must be singular messages; e.g. they cannot
404 // be int32s, enums, or repeated messages.
405 //
406 // Because this is an option, the above two restrictions are not enforced by
407 // the protocol compiler.
408 optional bool message_set_wire_format = 1 [default=false];
kenton@google.com24bf56f2008-09-24 20:31:01 +0000409
kenton@google.com80b1d622009-07-29 01:13:20 +0000410 // Disables the generation of the standard "descriptor()" accessor, which can
411 // conflict with a field of the same name. This is meant to make migration
412 // from proto1 easier; new code should avoid fields named "descriptor".
413 optional bool no_standard_descriptor_accessor = 2 [default=false];
414
jieluo@google.com4de8f552014-07-18 00:47:59 +0000415 // Is this message deprecated?
416 // Depending on the target platform, this can emit Deprecated annotations
417 // for the message, or it will be completely ignored; in the very least,
418 // this is a formalization for deprecating messages.
419 optional bool deprecated = 3 [default=false];
420
Feng Xiao6ef984a2014-11-10 17:34:54 -0800421 // Whether the message is an automatically generated map entry type for the
422 // maps field.
423 //
424 // For maps fields:
425 // map<KeyType, ValueType> map_field = 1;
426 // The parsed descriptor looks like:
427 // message MapFieldEntry {
428 // option map_entry = true;
429 // optional KeyType key = 1;
430 // optional ValueType value = 2;
431 // }
432 // repeated MapFieldEntry map_field = 1;
433 //
434 // Implementations may choose not to generate the map_entry=true message, but
435 // use a native map in the target language to hold the keys and values.
436 // The reflection APIs in such implementions still need to work as
437 // if the field is a repeated message field.
438 //
439 // NOTE: Do not set the option in .proto files. Always use the maps syntax
440 // instead. The option should only be implicitly set by the proto compiler
441 // parser.
442 optional bool map_entry = 7;
443
kenton@google.com24bf56f2008-09-24 20:31:01 +0000444 // The parser stores options it doesn't recognize here. See above.
445 repeated UninterpretedOption uninterpreted_option = 999;
446
447 // Clients can define custom options in extensions of this message. See above.
448 extensions 1000 to max;
temporal40ee5512008-07-10 02:12:20 +0000449}
450
451message FieldOptions {
452 // The ctype option instructs the C++ code generator to use a different
453 // representation of the field than it normally would. See the specific
454 // options below. This option is not yet implemented in the open source
455 // release -- sorry, we'll try to include it in a future version!
kenton@google.comfccb1462009-12-18 02:11:36 +0000456 optional CType ctype = 1 [default = STRING];
temporal40ee5512008-07-10 02:12:20 +0000457 enum CType {
kenton@google.comfccb1462009-12-18 02:11:36 +0000458 // Default mode.
459 STRING = 0;
460
temporal40ee5512008-07-10 02:12:20 +0000461 CORD = 1;
462
463 STRING_PIECE = 2;
464 }
kenton@google.com2d6daa72009-01-22 01:27:00 +0000465 // The packed option can be enabled for repeated primitive fields to enable
466 // a more efficient representation on the wire. Rather than repeatedly
467 // writing the tag and type for each element, the entire array is encoded as
Bo Yang5db21732015-05-21 14:28:59 -0700468 // a single length-delimited blob. In proto3, only explicit setting it to
469 // false will avoid using packed encoding.
kenton@google.com2d6daa72009-01-22 01:27:00 +0000470 optional bool packed = 2;
temporal40ee5512008-07-10 02:12:20 +0000471
kenton@google.comfccb1462009-12-18 02:11:36 +0000472
Bo Yang5db21732015-05-21 14:28:59 -0700473 // The jstype option determines the JavaScript type used for values of the
474 // field. The option is permitted only for 64 bit integral and fixed types
475 // (int64, uint64, sint64, fixed64, sfixed64). By default these types are
476 // represented as JavaScript strings. This avoids loss of precision that can
477 // happen when a large value is converted to a floating point JavaScript
478 // numbers. Specifying JS_NUMBER for the jstype causes the generated
479 // JavaScript code to use the JavaScript "number" type instead of strings.
480 // This option is an enum to permit additional types to be added,
481 // e.g. goog.math.Integer.
482 optional JSType jstype = 6 [default = JS_NORMAL];
483 enum JSType {
484 // Use the default type.
485 JS_NORMAL = 0;
486
487 // Use JavaScript strings.
488 JS_STRING = 1;
489
490 // Use JavaScript numbers.
491 JS_NUMBER = 2;
492 }
xiaofeng@google.comb55a20f2012-09-22 02:40:50 +0000493
494 // Should this field be parsed lazily? Lazy applies only to message-type
495 // fields. It means that when the outer message is initially parsed, the
496 // inner message's contents will not be parsed but instead stored in encoded
497 // form. The inner message will actually be parsed when it is first accessed.
498 //
499 // This is only a hint. Implementations are free to choose whether to use
500 // eager or lazy parsing regardless of the value of this option. However,
501 // setting this option true suggests that the protocol author believes that
502 // using lazy parsing on this field is worth the additional bookkeeping
503 // overhead typically needed to implement it.
504 //
505 // This option does not affect the public interface of any generated code;
506 // all method signatures remain the same. Furthermore, thread-safety of the
507 // interface is not affected by this option; const methods remain safe to
508 // call from multiple threads concurrently, while non-const methods continue
509 // to require exclusive access.
510 //
511 //
512 // Note that implementations may choose not to check required fields within
513 // a lazy sub-message. That is, calling IsInitialized() on the outher message
514 // may return true even if the inner message has missing required fields.
515 // This is necessary because otherwise the inner message would have to be
516 // parsed in order to perform the check, defeating the purpose of lazy
517 // parsing. An implementation which chooses not to check required fields
518 // must be consistent about it. That is, for any particular sub-message, the
519 // implementation must either *always* check its required fields, or *never*
520 // check its required fields, regardless of whether or not the message has
521 // been parsed.
522 optional bool lazy = 5 [default=false];
523
kenton@google.comd37d46d2009-04-25 02:53:47 +0000524 // Is this field deprecated?
525 // Depending on the target platform, this can emit Deprecated annotations
526 // for accessors, or it will be completely ignored; in the very least, this
527 // is a formalization for deprecating fields.
528 optional bool deprecated = 3 [default=false];
529
xiaofeng@google.comb55a20f2012-09-22 02:40:50 +0000530 // For Google-internal migration only. Do not use.
531 optional bool weak = 10 [default=false];
532
Feng Xiaoeee38b02015-08-22 18:25:48 -0700533
kenton@google.com24bf56f2008-09-24 20:31:01 +0000534 // The parser stores options it doesn't recognize here. See above.
535 repeated UninterpretedOption uninterpreted_option = 999;
536
537 // Clients can define custom options in extensions of this message. See above.
538 extensions 1000 to max;
temporal40ee5512008-07-10 02:12:20 +0000539}
540
541message EnumOptions {
kenton@google.comd37d46d2009-04-25 02:53:47 +0000542
jieluo@google.com4de8f552014-07-18 00:47:59 +0000543 // Set this option to true to allow mapping different tag names to the same
xiaofeng@google.comb55a20f2012-09-22 02:40:50 +0000544 // value.
jieluo@google.com4de8f552014-07-18 00:47:59 +0000545 optional bool allow_alias = 2;
546
547 // Is this enum deprecated?
548 // Depending on the target platform, this can emit Deprecated annotations
549 // for the enum, or it will be completely ignored; in the very least, this
550 // is a formalization for deprecating enums.
551 optional bool deprecated = 3 [default=false];
xiaofeng@google.comb55a20f2012-09-22 02:40:50 +0000552
kenton@google.com24bf56f2008-09-24 20:31:01 +0000553 // The parser stores options it doesn't recognize here. See above.
554 repeated UninterpretedOption uninterpreted_option = 999;
555
556 // Clients can define custom options in extensions of this message. See above.
557 extensions 1000 to max;
temporal40ee5512008-07-10 02:12:20 +0000558}
559
560message EnumValueOptions {
jieluo@google.com4de8f552014-07-18 00:47:59 +0000561 // Is this enum value deprecated?
562 // Depending on the target platform, this can emit Deprecated annotations
563 // for the enum value, or it will be completely ignored; in the very least,
564 // this is a formalization for deprecating enum values.
565 optional bool deprecated = 1 [default=false];
566
kenton@google.com24bf56f2008-09-24 20:31:01 +0000567 // The parser stores options it doesn't recognize here. See above.
568 repeated UninterpretedOption uninterpreted_option = 999;
569
570 // Clients can define custom options in extensions of this message. See above.
571 extensions 1000 to max;
temporal40ee5512008-07-10 02:12:20 +0000572}
573
574message ServiceOptions {
575
576 // Note: Field numbers 1 through 32 are reserved for Google's internal RPC
577 // framework. We apologize for hoarding these numbers to ourselves, but
578 // we were already using them long before we decided to release Protocol
579 // Buffers.
kenton@google.com24bf56f2008-09-24 20:31:01 +0000580
jieluo@google.com4de8f552014-07-18 00:47:59 +0000581 // Is this service deprecated?
582 // Depending on the target platform, this can emit Deprecated annotations
583 // for the service, or it will be completely ignored; in the very least,
584 // this is a formalization for deprecating services.
585 optional bool deprecated = 33 [default=false];
586
kenton@google.com24bf56f2008-09-24 20:31:01 +0000587 // The parser stores options it doesn't recognize here. See above.
588 repeated UninterpretedOption uninterpreted_option = 999;
589
590 // Clients can define custom options in extensions of this message. See above.
591 extensions 1000 to max;
temporal40ee5512008-07-10 02:12:20 +0000592}
593
594message MethodOptions {
595
596 // Note: Field numbers 1 through 32 are reserved for Google's internal RPC
597 // framework. We apologize for hoarding these numbers to ourselves, but
598 // we were already using them long before we decided to release Protocol
599 // Buffers.
kenton@google.com24bf56f2008-09-24 20:31:01 +0000600
jieluo@google.com4de8f552014-07-18 00:47:59 +0000601 // Is this method deprecated?
602 // Depending on the target platform, this can emit Deprecated annotations
603 // for the method, or it will be completely ignored; in the very least,
604 // this is a formalization for deprecating methods.
605 optional bool deprecated = 33 [default=false];
606
kenton@google.com24bf56f2008-09-24 20:31:01 +0000607 // The parser stores options it doesn't recognize here. See above.
608 repeated UninterpretedOption uninterpreted_option = 999;
609
610 // Clients can define custom options in extensions of this message. See above.
611 extensions 1000 to max;
612}
613
xiaofeng@google.comb55a20f2012-09-22 02:40:50 +0000614
kenton@google.com24bf56f2008-09-24 20:31:01 +0000615// A message representing a option the parser does not recognize. This only
616// appears in options protos created by the compiler::Parser class.
617// DescriptorPool resolves these when building Descriptor objects. Therefore,
618// options protos in descriptor objects (e.g. returned by Descriptor::options(),
619// or produced by Descriptor::CopyTo()) will never have UninterpretedOptions
620// in them.
621message UninterpretedOption {
622 // The name of the uninterpreted option. Each string represents a segment in
623 // a dot-separated name. is_extension is true iff a segment represents an
624 // extension (denoted with parentheses in options specs in .proto files).
625 // E.g.,{ ["foo", false], ["bar.baz", true], ["qux", false] } represents
626 // "foo.(bar.baz).qux".
627 message NamePart {
628 required string name_part = 1;
629 required bool is_extension = 2;
630 }
631 repeated NamePart name = 2;
632
633 // The value of the uninterpreted option, in whatever type the tokenizer
634 // identified it as during parsing. Exactly one of these should be set.
635 optional string identifier_value = 3;
636 optional uint64 positive_int_value = 4;
637 optional int64 negative_int_value = 5;
638 optional double double_value = 6;
639 optional bytes string_value = 7;
liujisi@google.com33165fe2010-11-02 13:14:58 +0000640 optional string aggregate_value = 8;
641}
642
643// ===================================================================
644// Optional source code info
645
646// Encapsulates information about the original source file from which a
647// FileDescriptorProto was generated.
648message SourceCodeInfo {
649 // A Location identifies a piece of source code in a .proto file which
650 // corresponds to a particular definition. This information is intended
651 // to be useful to IDEs, code indexers, documentation generators, and similar
652 // tools.
653 //
654 // For example, say we have a file like:
655 // message Foo {
656 // optional string foo = 1;
657 // }
658 // Let's look at just the field definition:
659 // optional string foo = 1;
660 // ^ ^^ ^^ ^ ^^^
661 // a bc de f ghi
662 // We have the following locations:
663 // span path represents
664 // [a,i) [ 4, 0, 2, 0 ] The whole field definition.
665 // [a,b) [ 4, 0, 2, 0, 4 ] The label (optional).
666 // [c,d) [ 4, 0, 2, 0, 5 ] The type (string).
667 // [e,f) [ 4, 0, 2, 0, 1 ] The name (foo).
668 // [g,h) [ 4, 0, 2, 0, 3 ] The number (1).
669 //
670 // Notes:
671 // - A location may refer to a repeated field itself (i.e. not to any
672 // particular index within it). This is used whenever a set of elements are
673 // logically enclosed in a single code segment. For example, an entire
674 // extend block (possibly containing multiple extension definitions) will
675 // have an outer location whose path refers to the "extensions" repeated
676 // field without an index.
677 // - Multiple locations may have the same path. This happens when a single
678 // logical declaration is spread out across multiple places. The most
679 // obvious example is the "extend" block again -- there may be multiple
680 // extend blocks in the same scope, each of which will have the same path.
681 // - A location's span is not always a subset of its parent's span. For
682 // example, the "extendee" of an extension declaration appears at the
683 // beginning of the "extend" block and is shared by all extensions within
684 // the block.
685 // - Just because a location's span is a subset of some other location's span
686 // does not mean that it is a descendent. For example, a "group" defines
687 // both a type and a field in a single declaration. Thus, the locations
688 // corresponding to the type and field and their components will overlap.
689 // - Code which tries to interpret locations should probably be designed to
690 // ignore those that it doesn't understand, as more types of locations could
691 // be recorded in the future.
692 repeated Location location = 1;
693 message Location {
694 // Identifies which part of the FileDescriptorProto was defined at this
695 // location.
696 //
697 // Each element is a field number or an index. They form a path from
698 // the root FileDescriptorProto to the place where the definition. For
699 // example, this path:
700 // [ 4, 3, 2, 7, 1 ]
701 // refers to:
702 // file.message_type(3) // 4, 3
703 // .field(7) // 2, 7
704 // .name() // 1
705 // This is because FileDescriptorProto.message_type has field number 4:
706 // repeated DescriptorProto message_type = 4;
707 // and DescriptorProto.field has field number 2:
708 // repeated FieldDescriptorProto field = 2;
709 // and FieldDescriptorProto.name has field number 1:
710 // optional string name = 1;
711 //
712 // Thus, the above path gives the location of a field name. If we removed
713 // the last element:
714 // [ 4, 3, 2, 7 ]
715 // this path refers to the whole field declaration (from the beginning
716 // of the label to the terminating semicolon).
717 repeated int32 path = 1 [packed=true];
718
719 // Always has exactly three or four elements: start line, start column,
720 // end line (optional, otherwise assumed same as start line), end column.
721 // These are packed into a single field for efficiency. Note that line
722 // and column numbers are zero-based -- typically you will want to add
723 // 1 to each before displaying to a user.
724 repeated int32 span = 2 [packed=true];
725
xiaofeng@google.comb55a20f2012-09-22 02:40:50 +0000726 // If this SourceCodeInfo represents a complete declaration, these are any
727 // comments appearing before and after the declaration which appear to be
728 // attached to the declaration.
729 //
730 // A series of line comments appearing on consecutive lines, with no other
731 // tokens appearing on those lines, will be treated as a single comment.
732 //
Jisi Liu885b6122015-02-28 14:51:22 -0800733 // leading_detached_comments will keep paragraphs of comments that appear
734 // before (but not connected to) the current element. Each paragraph,
735 // separated by empty lines, will be one comment element in the repeated
736 // field.
737 //
xiaofeng@google.comb55a20f2012-09-22 02:40:50 +0000738 // Only the comment content is provided; comment markers (e.g. //) are
739 // stripped out. For block comments, leading whitespace and an asterisk
740 // will be stripped from the beginning of each line other than the first.
741 // Newlines are included in the output.
742 //
743 // Examples:
744 //
745 // optional int32 foo = 1; // Comment attached to foo.
746 // // Comment attached to bar.
747 // optional int32 bar = 2;
748 //
749 // optional string baz = 3;
750 // // Comment attached to baz.
751 // // Another line attached to baz.
752 //
753 // // Comment attached to qux.
754 // //
755 // // Another line attached to qux.
756 // optional double qux = 4;
757 //
Jisi Liu885b6122015-02-28 14:51:22 -0800758 // // Detached comment for corge. This is not leading or trailing comments
759 // // to qux or corge because there are blank lines separating it from
760 // // both.
761 //
762 // // Detached comment for corge paragraph 2.
763 //
xiaofeng@google.comb55a20f2012-09-22 02:40:50 +0000764 // optional string corge = 5;
765 // /* Block comment attached
766 // * to corge. Leading asterisks
767 // * will be removed. */
768 // /* Block comment attached to
769 // * grault. */
770 // optional int32 grault = 6;
Jisi Liu885b6122015-02-28 14:51:22 -0800771 //
772 // // ignored detached comments.
xiaofeng@google.comb55a20f2012-09-22 02:40:50 +0000773 optional string leading_comments = 3;
774 optional string trailing_comments = 4;
Jisi Liu885b6122015-02-28 14:51:22 -0800775 repeated string leading_detached_comments = 6;
liujisi@google.com33165fe2010-11-02 13:14:58 +0000776 }
temporal40ee5512008-07-10 02:12:20 +0000777}
Jisi Liu5221dcb2016-01-29 13:51:05 -0800778
779// Describes the relationship between generated code and its original source
780// file. A GeneratedCodeInfo message is associated with only one generated
781// source file, but may contain references to different source .proto files.
782message GeneratedCodeInfo {
783 // An Annotation connects some span of text in generated code to an element
784 // of its generating .proto file.
785 repeated Annotation annotation = 1;
786 message Annotation {
787 // Identifies the element in the original source .proto file. This field
788 // is formatted the same as SourceCodeInfo.Location.path.
789 repeated int32 path = 1 [packed=true];
790
791 // Identifies the filesystem path to the original source .proto.
792 optional string source_file = 2;
793
794 // Identifies the starting offset in bytes in the generated code
795 // that relates to the identified object.
796 optional int32 begin = 3;
797
798 // Identifies the ending offset in bytes in the generated code that
799 // relates to the identified offset. The end offset should be one past
800 // the last relevant byte (so the length of the text = end - begin).
801 optional int32 end = 4;
802 }
803}