protobuf 2.2.5-java

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (256) hide show
  1. data/.gitignore +17 -0
  2. data/.travis.yml +9 -0
  3. data/.yardopts +5 -0
  4. data/Gemfile +3 -0
  5. data/README.md +316 -0
  6. data/Rakefile +29 -0
  7. data/UPGRADING.md +60 -0
  8. data/bin/rpc_server +5 -0
  9. data/bin/rprotoc +62 -0
  10. data/examples/addressbook.pb.rb +55 -0
  11. data/examples/addressbook.proto +24 -0
  12. data/examples/reading_a_message.rb +32 -0
  13. data/examples/writing_a_message.rb +46 -0
  14. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/code_generator.h +142 -0
  15. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/command_line_interface.h +318 -0
  16. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/cpp/cpp_enum.h +99 -0
  17. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/cpp/cpp_enum_field.h +103 -0
  18. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/cpp/cpp_extension.h +85 -0
  19. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/cpp/cpp_field.h +167 -0
  20. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/cpp/cpp_file.h +98 -0
  21. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/cpp/cpp_generator.h +72 -0
  22. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/cpp/cpp_helpers.h +159 -0
  23. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/cpp/cpp_message.h +170 -0
  24. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/cpp/cpp_message_field.h +102 -0
  25. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/cpp/cpp_primitive_field.h +103 -0
  26. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/cpp/cpp_service.h +118 -0
  27. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/cpp/cpp_string_field.h +104 -0
  28. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/cpp/cpp_test_bad_identifiers.pb.h +2721 -0
  29. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/importer.h +303 -0
  30. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/java/java_enum.h +84 -0
  31. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/java/java_enum_field.h +121 -0
  32. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/java/java_extension.h +77 -0
  33. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/java/java_field.h +108 -0
  34. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/java/java_file.h +101 -0
  35. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/java/java_generator.h +72 -0
  36. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/java/java_helpers.h +213 -0
  37. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/java/java_message.h +109 -0
  38. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/java/java_message_field.h +134 -0
  39. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/java/java_primitive_field.h +121 -0
  40. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/java/java_service.h +113 -0
  41. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/java/java_string_field.h +120 -0
  42. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/mock_code_generator.h +113 -0
  43. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/package_info.h +64 -0
  44. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/parser.h +434 -0
  45. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/plugin.h +73 -0
  46. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/plugin.pb.h +790 -0
  47. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/python/python_generator.h +156 -0
  48. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/subprocess.h +108 -0
  49. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/zip_writer.h +93 -0
  50. data/ext/protobuf-2.4.1/src/google/protobuf/descriptor.h +1367 -0
  51. data/ext/protobuf-2.4.1/src/google/protobuf/descriptor.pb.h +5223 -0
  52. data/ext/protobuf-2.4.1/src/google/protobuf/descriptor_database.h +366 -0
  53. data/ext/protobuf-2.4.1/src/google/protobuf/dynamic_message.h +136 -0
  54. data/ext/protobuf-2.4.1/src/google/protobuf/extension_set.h +904 -0
  55. data/ext/protobuf-2.4.1/src/google/protobuf/generated_message_reflection.h +424 -0
  56. data/ext/protobuf-2.4.1/src/google/protobuf/generated_message_util.h +82 -0
  57. data/ext/protobuf-2.4.1/src/google/protobuf/io/coded_stream.h +1102 -0
  58. data/ext/protobuf-2.4.1/src/google/protobuf/io/coded_stream_inl.h +64 -0
  59. data/ext/protobuf-2.4.1/src/google/protobuf/io/gzip_stream.h +207 -0
  60. data/ext/protobuf-2.4.1/src/google/protobuf/io/package_info.h +54 -0
  61. data/ext/protobuf-2.4.1/src/google/protobuf/io/printer.h +136 -0
  62. data/ext/protobuf-2.4.1/src/google/protobuf/io/tokenizer.h +313 -0
  63. data/ext/protobuf-2.4.1/src/google/protobuf/io/zero_copy_stream.h +238 -0
  64. data/ext/protobuf-2.4.1/src/google/protobuf/io/zero_copy_stream_impl.h +357 -0
  65. data/ext/protobuf-2.4.1/src/google/protobuf/io/zero_copy_stream_impl_lite.h +340 -0
  66. data/ext/protobuf-2.4.1/src/google/protobuf/message.h +692 -0
  67. data/ext/protobuf-2.4.1/src/google/protobuf/message_lite.h +239 -0
  68. data/ext/protobuf-2.4.1/src/google/protobuf/package_info.h +64 -0
  69. data/ext/protobuf-2.4.1/src/google/protobuf/reflection_ops.h +80 -0
  70. data/ext/protobuf-2.4.1/src/google/protobuf/repeated_field.h +1295 -0
  71. data/ext/protobuf-2.4.1/src/google/protobuf/service.h +291 -0
  72. data/ext/protobuf-2.4.1/src/google/protobuf/stubs/common.h +1211 -0
  73. data/ext/protobuf-2.4.1/src/google/protobuf/stubs/hash.h +220 -0
  74. data/ext/protobuf-2.4.1/src/google/protobuf/stubs/map-util.h +119 -0
  75. data/ext/protobuf-2.4.1/src/google/protobuf/stubs/once.h +123 -0
  76. data/ext/protobuf-2.4.1/src/google/protobuf/stubs/stl_util-inl.h +121 -0
  77. data/ext/protobuf-2.4.1/src/google/protobuf/stubs/strutil.h +457 -0
  78. data/ext/protobuf-2.4.1/src/google/protobuf/stubs/substitute.h +170 -0
  79. data/ext/protobuf-2.4.1/src/google/protobuf/test_util.h +174 -0
  80. data/ext/protobuf-2.4.1/src/google/protobuf/test_util_lite.h +101 -0
  81. data/ext/protobuf-2.4.1/src/google/protobuf/testing/file.h +83 -0
  82. data/ext/protobuf-2.4.1/src/google/protobuf/testing/googletest.h +98 -0
  83. data/ext/protobuf-2.4.1/src/google/protobuf/text_format.h +285 -0
  84. data/ext/protobuf-2.4.1/src/google/protobuf/unittest.pb.h +11915 -0
  85. data/ext/protobuf-2.4.1/src/google/protobuf/unittest_custom_options.pb.h +2895 -0
  86. data/ext/protobuf-2.4.1/src/google/protobuf/unittest_embed_optimize_for.pb.h +211 -0
  87. data/ext/protobuf-2.4.1/src/google/protobuf/unittest_empty.pb.h +56 -0
  88. data/ext/protobuf-2.4.1/src/google/protobuf/unittest_import.pb.h +188 -0
  89. data/ext/protobuf-2.4.1/src/google/protobuf/unittest_import_lite.pb.h +151 -0
  90. data/ext/protobuf-2.4.1/src/google/protobuf/unittest_lite.pb.h +4752 -0
  91. data/ext/protobuf-2.4.1/src/google/protobuf/unittest_lite_imports_nonlite.pb.h +150 -0
  92. data/ext/protobuf-2.4.1/src/google/protobuf/unittest_mset.pb.h +816 -0
  93. data/ext/protobuf-2.4.1/src/google/protobuf/unittest_no_generic_services.pb.h +197 -0
  94. data/ext/protobuf-2.4.1/src/google/protobuf/unittest_optimize_for.pb.h +403 -0
  95. data/ext/protobuf-2.4.1/src/google/protobuf/unknown_field_set.h +268 -0
  96. data/ext/protobuf-2.4.1/src/google/protobuf/wire_format.h +304 -0
  97. data/ext/protobuf-2.4.1/src/google/protobuf/wire_format_lite.h +620 -0
  98. data/ext/protobuf-2.4.1/src/google/protobuf/wire_format_lite_inl.h +774 -0
  99. data/ext/ruby_generator/Makefile +10 -0
  100. data/ext/ruby_generator/RubyGenerator.cpp +450 -0
  101. data/ext/ruby_generator/RubyGenerator.h +199 -0
  102. data/ext/ruby_generator/extconf.rb +36 -0
  103. data/ext/ruby_generator/protoc-ruby +0 -0
  104. data/lib/protobuf/cli.rb +188 -0
  105. data/lib/protobuf/enum.rb +58 -0
  106. data/lib/protobuf/enum_value.rb +59 -0
  107. data/lib/protobuf/evented.rb +22 -0
  108. data/lib/protobuf/exceptions.rb +11 -0
  109. data/lib/protobuf/ext/eventmachine.rb +14 -0
  110. data/lib/protobuf/field/base_field.rb +240 -0
  111. data/lib/protobuf/field/bool_field.rb +36 -0
  112. data/lib/protobuf/field/bytes_field.rb +38 -0
  113. data/lib/protobuf/field/double_field.rb +19 -0
  114. data/lib/protobuf/field/enum_field.rb +50 -0
  115. data/lib/protobuf/field/extension_fields.rb +32 -0
  116. data/lib/protobuf/field/field_array.rb +65 -0
  117. data/lib/protobuf/field/fixed32_field.rb +19 -0
  118. data/lib/protobuf/field/fixed64_field.rb +22 -0
  119. data/lib/protobuf/field/float_field.rb +31 -0
  120. data/lib/protobuf/field/int32_field.rb +12 -0
  121. data/lib/protobuf/field/int64_field.rb +12 -0
  122. data/lib/protobuf/field/integer_field.rb +19 -0
  123. data/lib/protobuf/field/message_field.rb +53 -0
  124. data/lib/protobuf/field/sfixed32_field.rb +21 -0
  125. data/lib/protobuf/field/sfixed64_field.rb +24 -0
  126. data/lib/protobuf/field/signed_integer_field.rb +23 -0
  127. data/lib/protobuf/field/sint32_field.rb +12 -0
  128. data/lib/protobuf/field/sint64_field.rb +12 -0
  129. data/lib/protobuf/field/string_field.rb +14 -0
  130. data/lib/protobuf/field/uint32_field.rb +12 -0
  131. data/lib/protobuf/field/uint64_field.rb +12 -0
  132. data/lib/protobuf/field/varint_field.rb +61 -0
  133. data/lib/protobuf/field.rb +57 -0
  134. data/lib/protobuf/logger.rb +86 -0
  135. data/lib/protobuf/message/decoder.rb +83 -0
  136. data/lib/protobuf/message/encoder.rb +48 -0
  137. data/lib/protobuf/message/extend.rb +8 -0
  138. data/lib/protobuf/message/message.rb +1 -0
  139. data/lib/protobuf/message.rb +320 -0
  140. data/lib/protobuf/rpc/buffer.rb +79 -0
  141. data/lib/protobuf/rpc/client.rb +166 -0
  142. data/lib/protobuf/rpc/connector.rb +19 -0
  143. data/lib/protobuf/rpc/connectors/base.rb +38 -0
  144. data/lib/protobuf/rpc/connectors/common.rb +156 -0
  145. data/lib/protobuf/rpc/connectors/em_client.rb +84 -0
  146. data/lib/protobuf/rpc/connectors/eventmachine.rb +87 -0
  147. data/lib/protobuf/rpc/connectors/socket.rb +73 -0
  148. data/lib/protobuf/rpc/connectors/zmq.rb +69 -0
  149. data/lib/protobuf/rpc/error/client_error.rb +31 -0
  150. data/lib/protobuf/rpc/error/server_error.rb +43 -0
  151. data/lib/protobuf/rpc/error.rb +25 -0
  152. data/lib/protobuf/rpc/rpc.pb.rb +118 -0
  153. data/lib/protobuf/rpc/server.rb +89 -0
  154. data/lib/protobuf/rpc/servers/evented/server.rb +41 -0
  155. data/lib/protobuf/rpc/servers/evented_runner.rb +21 -0
  156. data/lib/protobuf/rpc/servers/socket/server.rb +111 -0
  157. data/lib/protobuf/rpc/servers/socket/worker.rb +66 -0
  158. data/lib/protobuf/rpc/servers/socket_runner.rb +27 -0
  159. data/lib/protobuf/rpc/servers/zmq/broker.rb +87 -0
  160. data/lib/protobuf/rpc/servers/zmq/server.rb +50 -0
  161. data/lib/protobuf/rpc/servers/zmq/util.rb +27 -0
  162. data/lib/protobuf/rpc/servers/zmq/worker.rb +60 -0
  163. data/lib/protobuf/rpc/servers/zmq_runner.rb +25 -0
  164. data/lib/protobuf/rpc/service.rb +173 -0
  165. data/lib/protobuf/rpc/service_dispatcher.rb +130 -0
  166. data/lib/protobuf/rpc/service_filters.rb +267 -0
  167. data/lib/protobuf/rpc/stat.rb +83 -0
  168. data/lib/protobuf/socket.rb +22 -0
  169. data/lib/protobuf/version.rb +4 -0
  170. data/lib/protobuf/wire_type.rb +10 -0
  171. data/lib/protobuf/zmq.rb +21 -0
  172. data/lib/protobuf.rb +86 -0
  173. data/proto/rpc.pb.rb +48 -0
  174. data/proto/rpc.proto +73 -0
  175. data/protobuf.gemspec +44 -0
  176. data/spec/benchmark/tasks.rb +179 -0
  177. data/spec/functional/embedded_service_spec.rb +7 -0
  178. data/spec/functional/evented_server_spec.rb +64 -0
  179. data/spec/functional/socket_server_spec.rb +58 -0
  180. data/spec/functional/zmq_server_spec.rb +58 -0
  181. data/spec/lib/protobuf/cli_spec.rb +212 -0
  182. data/spec/lib/protobuf/enum_spec.rb +98 -0
  183. data/spec/lib/protobuf/enum_value_spec.rb +15 -0
  184. data/spec/lib/protobuf/logger_spec.rb +131 -0
  185. data/spec/lib/protobuf/message/encoder_spec.rb +19 -0
  186. data/spec/lib/protobuf/message_spec.rb +209 -0
  187. data/spec/lib/protobuf/rpc/client_spec.rb +158 -0
  188. data/spec/lib/protobuf/rpc/connector_spec.rb +32 -0
  189. data/spec/lib/protobuf/rpc/connectors/base_spec.rb +50 -0
  190. data/spec/lib/protobuf/rpc/connectors/common_spec.rb +128 -0
  191. data/spec/lib/protobuf/rpc/connectors/socket_spec.rb +36 -0
  192. data/spec/lib/protobuf/rpc/connectors/zmq_spec.rb +22 -0
  193. data/spec/lib/protobuf/rpc/servers/evented_server_spec.rb +18 -0
  194. data/spec/lib/protobuf/rpc/servers/socket_server_spec.rb +43 -0
  195. data/spec/lib/protobuf/rpc/servers/zmq/broker_spec.rb +35 -0
  196. data/spec/lib/protobuf/rpc/servers/zmq/server_spec.rb +41 -0
  197. data/spec/lib/protobuf/rpc/servers/zmq/util_spec.rb +45 -0
  198. data/spec/lib/protobuf/rpc/servers/zmq/worker_spec.rb +44 -0
  199. data/spec/lib/protobuf/rpc/service_dispatcher_spec.rb +116 -0
  200. data/spec/lib/protobuf/rpc/service_filters_spec.rb +451 -0
  201. data/spec/lib/protobuf/rpc/service_spec.rb +165 -0
  202. data/spec/lib/protobuf_spec.rb +62 -0
  203. data/spec/spec_helper.rb +51 -0
  204. data/spec/support/all.rb +6 -0
  205. data/spec/support/server.rb +101 -0
  206. data/spec/support/test/enum.pb.rb +34 -0
  207. data/spec/support/test/enum.proto +12 -0
  208. data/spec/support/test/resource.pb.rb +58 -0
  209. data/spec/support/test/resource.proto +31 -0
  210. data/spec/support/test/resource_service.rb +14 -0
  211. data/spec/support/test_app_file.rb +2 -0
  212. data/spec/support/tolerance_matcher.rb +40 -0
  213. data/test/data/data.bin +3 -0
  214. data/test/data/data_source.py +14 -0
  215. data/test/data/types.bin +0 -0
  216. data/test/data/types_source.py +22 -0
  217. data/test/data/unk.png +0 -0
  218. data/test/proto/addressbook.pb.rb +66 -0
  219. data/test/proto/addressbook.proto +33 -0
  220. data/test/proto/addressbook_base.pb.rb +58 -0
  221. data/test/proto/addressbook_base.proto +26 -0
  222. data/test/proto/addressbook_ext.pb.rb +20 -0
  223. data/test/proto/addressbook_ext.proto +6 -0
  224. data/test/proto/collision.pb.rb +17 -0
  225. data/test/proto/collision.proto +5 -0
  226. data/test/proto/ext_collision.pb.rb +24 -0
  227. data/test/proto/ext_collision.proto +8 -0
  228. data/test/proto/ext_range.pb.rb +22 -0
  229. data/test/proto/ext_range.proto +7 -0
  230. data/test/proto/float_default.proto +10 -0
  231. data/test/proto/lowercase.pb.rb +30 -0
  232. data/test/proto/lowercase.proto +9 -0
  233. data/test/proto/merge.pb.rb +39 -0
  234. data/test/proto/merge.proto +15 -0
  235. data/test/proto/nested.pb.rb +30 -0
  236. data/test/proto/nested.proto +9 -0
  237. data/test/proto/optional_field.pb.rb +35 -0
  238. data/test/proto/optional_field.proto +12 -0
  239. data/test/proto/packed.pb.rb +22 -0
  240. data/test/proto/packed.proto +6 -0
  241. data/test/proto/rpc.proto +6 -0
  242. data/test/proto/types.pb.rb +84 -0
  243. data/test/proto/types.proto +37 -0
  244. data/test/test_addressbook.rb +56 -0
  245. data/test/test_enum_value.rb +41 -0
  246. data/test/test_extension.rb +36 -0
  247. data/test/test_lowercase.rb +11 -0
  248. data/test/test_message.rb +128 -0
  249. data/test/test_optional_field.rb +103 -0
  250. data/test/test_packed_field.rb +40 -0
  251. data/test/test_parse.rb +15 -0
  252. data/test/test_repeated_types.rb +132 -0
  253. data/test/test_serialize.rb +61 -0
  254. data/test/test_standard_message.rb +96 -0
  255. data/test/test_types.rb +226 -0
  256. metadata +461 -0
@@ -0,0 +1,434 @@
1
+ // Protocol Buffers - Google's data interchange format
2
+ // Copyright 2008 Google Inc. All rights reserved.
3
+ // http://code.google.com/p/protobuf/
4
+ //
5
+ // Redistribution and use in source and binary forms, with or without
6
+ // modification, are permitted provided that the following conditions are
7
+ // met:
8
+ //
9
+ // * 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.
18
+ //
19
+ // 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.
30
+
31
+ // Author: kenton@google.com (Kenton Varda)
32
+ // Based on original Protocol Buffers design by
33
+ // Sanjay Ghemawat, Jeff Dean, and others.
34
+ //
35
+ // Implements parsing of .proto files to FileDescriptorProtos.
36
+
37
+ #ifndef GOOGLE_PROTOBUF_COMPILER_PARSER_H__
38
+ #define GOOGLE_PROTOBUF_COMPILER_PARSER_H__
39
+
40
+ #include <map>
41
+ #include <string>
42
+ #include <utility>
43
+ #include <google/protobuf/stubs/common.h>
44
+ #include <google/protobuf/descriptor.h>
45
+ #include <google/protobuf/descriptor.pb.h>
46
+ #include <google/protobuf/repeated_field.h>
47
+ #include <google/protobuf/io/tokenizer.h>
48
+
49
+ namespace google {
50
+ namespace protobuf { class Message; }
51
+
52
+ namespace protobuf {
53
+ namespace compiler {
54
+
55
+ // Defined in this file.
56
+ class Parser;
57
+ class SourceLocationTable;
58
+
59
+ // Implements parsing of protocol definitions (such as .proto files).
60
+ //
61
+ // Note that most users will be more interested in the Importer class.
62
+ // Parser is a lower-level class which simply converts a single .proto file
63
+ // to a FileDescriptorProto. It does not resolve import directives or perform
64
+ // many other kinds of validation needed to construct a complete
65
+ // FileDescriptor.
66
+ class LIBPROTOBUF_EXPORT Parser {
67
+ public:
68
+ Parser();
69
+ ~Parser();
70
+
71
+ // Parse the entire input and construct a FileDescriptorProto representing
72
+ // it. Returns true if no errors occurred, false otherwise.
73
+ bool Parse(io::Tokenizer* input, FileDescriptorProto* file);
74
+
75
+ // Optional fetaures:
76
+
77
+ // DEPRECATED: New code should use the SourceCodeInfo embedded in the
78
+ // FileDescriptorProto.
79
+ //
80
+ // Requests that locations of certain definitions be recorded to the given
81
+ // SourceLocationTable while parsing. This can be used to look up exact line
82
+ // and column numbers for errors reported by DescriptorPool during validation.
83
+ // Set to NULL (the default) to discard source location information.
84
+ void RecordSourceLocationsTo(SourceLocationTable* location_table) {
85
+ source_location_table_ = location_table;
86
+ }
87
+
88
+ // Requests that errors be recorded to the given ErrorCollector while
89
+ // parsing. Set to NULL (the default) to discard error messages.
90
+ void RecordErrorsTo(io::ErrorCollector* error_collector) {
91
+ error_collector_ = error_collector;
92
+ }
93
+
94
+ // Returns the identifier used in the "syntax = " declaration, if one was
95
+ // seen during the last call to Parse(), or the empty string otherwise.
96
+ const string& GetSyntaxIdentifier() { return syntax_identifier_; }
97
+
98
+ // If set true, input files will be required to begin with a syntax
99
+ // identifier. Otherwise, files may omit this. If a syntax identifier
100
+ // is provided, it must be 'syntax = "proto2";' and must appear at the
101
+ // top of this file regardless of whether or not it was required.
102
+ void SetRequireSyntaxIdentifier(bool value) {
103
+ require_syntax_identifier_ = value;
104
+ }
105
+
106
+ // Call SetStopAfterSyntaxIdentifier(true) to tell the parser to stop
107
+ // parsing as soon as it has seen the syntax identifier, or lack thereof.
108
+ // This is useful for quickly identifying the syntax of the file without
109
+ // parsing the whole thing. If this is enabled, no error will be recorded
110
+ // if the syntax identifier is something other than "proto2" (since
111
+ // presumably the caller intends to deal with that), but other kinds of
112
+ // errors (e.g. parse errors) will still be reported. When this is enabled,
113
+ // you may pass a NULL FileDescriptorProto to Parse().
114
+ void SetStopAfterSyntaxIdentifier(bool value) {
115
+ stop_after_syntax_identifier_ = value;
116
+ }
117
+
118
+ private:
119
+ // =================================================================
120
+ // Error recovery helpers
121
+
122
+ // Consume the rest of the current statement. This consumes tokens
123
+ // until it sees one of:
124
+ // ';' Consumes the token and returns.
125
+ // '{' Consumes the brace then calls SkipRestOfBlock().
126
+ // '}' Returns without consuming.
127
+ // EOF Returns (can't consume).
128
+ // The Parser often calls SkipStatement() after encountering a syntax
129
+ // error. This allows it to go on parsing the following lines, allowing
130
+ // it to report more than just one error in the file.
131
+ void SkipStatement();
132
+
133
+ // Consume the rest of the current block, including nested blocks,
134
+ // ending after the closing '}' is encountered and consumed, or at EOF.
135
+ void SkipRestOfBlock();
136
+
137
+ // -----------------------------------------------------------------
138
+ // Single-token consuming helpers
139
+ //
140
+ // These make parsing code more readable.
141
+
142
+ // True if the current token is TYPE_END.
143
+ inline bool AtEnd();
144
+
145
+ // True if the next token matches the given text.
146
+ inline bool LookingAt(const char* text);
147
+ // True if the next token is of the given type.
148
+ inline bool LookingAtType(io::Tokenizer::TokenType token_type);
149
+
150
+ // If the next token exactly matches the text given, consume it and return
151
+ // true. Otherwise, return false without logging an error.
152
+ bool TryConsume(const char* text);
153
+
154
+ // These attempt to read some kind of token from the input. If successful,
155
+ // they return true. Otherwise they return false and add the given error
156
+ // to the error list.
157
+
158
+ // Consume a token with the exact text given.
159
+ bool Consume(const char* text, const char* error);
160
+ // Same as above, but automatically generates the error "Expected \"text\".",
161
+ // where "text" is the expected token text.
162
+ bool Consume(const char* text);
163
+ // Consume a token of type IDENTIFIER and store its text in "output".
164
+ bool ConsumeIdentifier(string* output, const char* error);
165
+ // Consume an integer and store its value in "output".
166
+ bool ConsumeInteger(int* output, const char* error);
167
+ // Consume a 64-bit integer and store its value in "output". If the value
168
+ // is greater than max_value, an error will be reported.
169
+ bool ConsumeInteger64(uint64 max_value, uint64* output, const char* error);
170
+ // Consume a number and store its value in "output". This will accept
171
+ // tokens of either INTEGER or FLOAT type.
172
+ bool ConsumeNumber(double* output, const char* error);
173
+ // Consume a string literal and store its (unescaped) value in "output".
174
+ bool ConsumeString(string* output, const char* error);
175
+
176
+ // -----------------------------------------------------------------
177
+ // Error logging helpers
178
+
179
+ // Invokes error_collector_->AddError(), if error_collector_ is not NULL.
180
+ void AddError(int line, int column, const string& error);
181
+
182
+ // Invokes error_collector_->AddError() with the line and column number
183
+ // of the current token.
184
+ void AddError(const string& error);
185
+
186
+ // Records a location in the SourceCodeInfo.location table (see
187
+ // descriptor.proto). We use RAII to ensure that the start and end locations
188
+ // are recorded -- the constructor records the start location and the
189
+ // destructor records the end location. Since the parser is
190
+ // recursive-descent, this works out beautifully.
191
+ class LIBPROTOBUF_EXPORT LocationRecorder {
192
+ public:
193
+ // Construct the file's "root" location.
194
+ LocationRecorder(Parser* parser);
195
+
196
+ // Construct a location that represents a declaration nested within the
197
+ // given parent. E.g. a field's location is nested within the location
198
+ // for a message type. The parent's path will be copied, so you should
199
+ // call AddPath() only to add the path components leading from the parent
200
+ // to the child (as opposed to leading from the root to the child).
201
+ LocationRecorder(const LocationRecorder& parent);
202
+
203
+ // Convenience constructors that call AddPath() one or two times.
204
+ LocationRecorder(const LocationRecorder& parent, int path1);
205
+ LocationRecorder(const LocationRecorder& parent, int path1, int path2);
206
+
207
+ ~LocationRecorder();
208
+
209
+ // Add a path component. See SourceCodeInfo.Location.path in
210
+ // descriptor.proto.
211
+ void AddPath(int path_component);
212
+
213
+ // By default the location is considered to start at the current token at
214
+ // the time the LocationRecorder is created. StartAt() sets the start
215
+ // location to the given token instead.
216
+ void StartAt(const io::Tokenizer::Token& token);
217
+
218
+ // By default the location is considered to end at the previous token at
219
+ // the time the LocationRecorder is destroyed. EndAt() sets the end
220
+ // location to the given token instead.
221
+ void EndAt(const io::Tokenizer::Token& token);
222
+
223
+ // Records the start point of this location to the SourceLocationTable that
224
+ // was passed to RecordSourceLocationsTo(), if any. SourceLocationTable
225
+ // is an older way of keeping track of source locations which is still
226
+ // used in some places.
227
+ void RecordLegacyLocation(const Message* descriptor,
228
+ DescriptorPool::ErrorCollector::ErrorLocation location);
229
+
230
+ private:
231
+ Parser* parser_;
232
+ SourceCodeInfo::Location* location_;
233
+
234
+ void Init(const LocationRecorder& parent);
235
+ };
236
+
237
+ // =================================================================
238
+ // Parsers for various language constructs
239
+
240
+ // Parses the "syntax = \"proto2\";" line at the top of the file. Returns
241
+ // false if it failed to parse or if the syntax identifier was not
242
+ // recognized.
243
+ bool ParseSyntaxIdentifier();
244
+
245
+ // These methods parse various individual bits of code. They return
246
+ // false if they completely fail to parse the construct. In this case,
247
+ // it is probably necessary to skip the rest of the statement to recover.
248
+ // However, if these methods return true, it does NOT mean that there
249
+ // were no errors; only that there were no *syntax* errors. For instance,
250
+ // if a service method is defined using proper syntax but uses a primitive
251
+ // type as its input or output, ParseMethodField() still returns true
252
+ // and only reports the error by calling AddError(). In practice, this
253
+ // makes logic much simpler for the caller.
254
+
255
+ // Parse a top-level message, enum, service, etc.
256
+ bool ParseTopLevelStatement(FileDescriptorProto* file,
257
+ const LocationRecorder& root_location);
258
+
259
+ // Parse various language high-level language construrcts.
260
+ bool ParseMessageDefinition(DescriptorProto* message,
261
+ const LocationRecorder& message_location);
262
+ bool ParseEnumDefinition(EnumDescriptorProto* enum_type,
263
+ const LocationRecorder& enum_location);
264
+ bool ParseServiceDefinition(ServiceDescriptorProto* service,
265
+ const LocationRecorder& service_location);
266
+ bool ParsePackage(FileDescriptorProto* file,
267
+ const LocationRecorder& root_location);
268
+ bool ParseImport(string* import_filename,
269
+ const LocationRecorder& root_location,
270
+ int index);
271
+ bool ParseOption(Message* options,
272
+ const LocationRecorder& options_location);
273
+
274
+ // These methods parse the contents of a message, enum, or service type and
275
+ // add them to the given object. They consume the entire block including
276
+ // the beginning and ending brace.
277
+ bool ParseMessageBlock(DescriptorProto* message,
278
+ const LocationRecorder& message_location);
279
+ bool ParseEnumBlock(EnumDescriptorProto* enum_type,
280
+ const LocationRecorder& enum_location);
281
+ bool ParseServiceBlock(ServiceDescriptorProto* service,
282
+ const LocationRecorder& service_location);
283
+
284
+ // Parse one statement within a message, enum, or service block, inclunding
285
+ // final semicolon.
286
+ bool ParseMessageStatement(DescriptorProto* message,
287
+ const LocationRecorder& message_location);
288
+ bool ParseEnumStatement(EnumDescriptorProto* message,
289
+ const LocationRecorder& enum_location);
290
+ bool ParseServiceStatement(ServiceDescriptorProto* message,
291
+ const LocationRecorder& service_location);
292
+
293
+ // Parse a field of a message. If the field is a group, its type will be
294
+ // added to "messages".
295
+ //
296
+ // parent_location and location_field_number_for_nested_type are needed when
297
+ // parsing groups -- we need to generate a nested message type within the
298
+ // parent and record its location accordingly. Since the parent could be
299
+ // either a FileDescriptorProto or a DescriptorProto, we must pass in the
300
+ // correct field number to use.
301
+ bool ParseMessageField(FieldDescriptorProto* field,
302
+ RepeatedPtrField<DescriptorProto>* messages,
303
+ const LocationRecorder& parent_location,
304
+ int location_field_number_for_nested_type,
305
+ const LocationRecorder& field_location);
306
+
307
+ // Parse an "extensions" declaration.
308
+ bool ParseExtensions(DescriptorProto* message,
309
+ const LocationRecorder& extensions_location);
310
+
311
+ // Parse an "extend" declaration. (See also comments for
312
+ // ParseMessageField().)
313
+ bool ParseExtend(RepeatedPtrField<FieldDescriptorProto>* extensions,
314
+ RepeatedPtrField<DescriptorProto>* messages,
315
+ const LocationRecorder& parent_location,
316
+ int location_field_number_for_nested_type,
317
+ const LocationRecorder& extend_location);
318
+
319
+ // Parse a single enum value within an enum block.
320
+ bool ParseEnumConstant(EnumValueDescriptorProto* enum_value,
321
+ const LocationRecorder& enum_value_location);
322
+
323
+ // Parse enum constant options, i.e. the list in square brackets at the end
324
+ // of the enum constant value definition.
325
+ bool ParseEnumConstantOptions(EnumValueDescriptorProto* value,
326
+ const LocationRecorder& enum_value_location);
327
+
328
+ // Parse a single method within a service definition.
329
+ bool ParseServiceMethod(MethodDescriptorProto* method,
330
+ const LocationRecorder& method_location);
331
+
332
+ // Parse "required", "optional", or "repeated" and fill in "label"
333
+ // with the value.
334
+ bool ParseLabel(FieldDescriptorProto::Label* label);
335
+
336
+ // Parse a type name and fill in "type" (if it is a primitive) or
337
+ // "type_name" (if it is not) with the type parsed.
338
+ bool ParseType(FieldDescriptorProto::Type* type,
339
+ string* type_name);
340
+ // Parse a user-defined type and fill in "type_name" with the name.
341
+ // If a primitive type is named, it is treated as an error.
342
+ bool ParseUserDefinedType(string* type_name);
343
+
344
+ // Parses field options, i.e. the stuff in square brackets at the end
345
+ // of a field definition. Also parses default value.
346
+ bool ParseFieldOptions(FieldDescriptorProto* field,
347
+ const LocationRecorder& field_location);
348
+
349
+ // Parse the "default" option. This needs special handling because its
350
+ // type is the field's type.
351
+ bool ParseDefaultAssignment(FieldDescriptorProto* field,
352
+ const LocationRecorder& field_location);
353
+
354
+ // Parse a single option name/value pair, e.g. "ctype = CORD". The name
355
+ // identifies a field of the given Message, and the value of that field
356
+ // is set to the parsed value.
357
+ bool ParseOptionAssignment(Message* options,
358
+ const LocationRecorder& options_location);
359
+
360
+ // Parses a single part of a multipart option name. A multipart name consists
361
+ // of names separated by dots. Each name is either an identifier or a series
362
+ // of identifiers separated by dots and enclosed in parentheses. E.g.,
363
+ // "foo.(bar.baz).qux".
364
+ bool ParseOptionNamePart(UninterpretedOption* uninterpreted_option,
365
+ const LocationRecorder& part_location);
366
+
367
+ // Parses a string surrounded by balanced braces. Strips off the outer
368
+ // braces and stores the enclosed string in *value.
369
+ // E.g.,
370
+ // { foo } *value gets 'foo'
371
+ // { foo { bar: box } } *value gets 'foo { bar: box }'
372
+ // {} *value gets ''
373
+ //
374
+ // REQUIRES: LookingAt("{")
375
+ // When finished successfully, we are looking at the first token past
376
+ // the ending brace.
377
+ bool ParseUninterpretedBlock(string* value);
378
+
379
+ // =================================================================
380
+
381
+ io::Tokenizer* input_;
382
+ io::ErrorCollector* error_collector_;
383
+ SourceCodeInfo* source_code_info_;
384
+ SourceLocationTable* source_location_table_; // legacy
385
+ bool had_errors_;
386
+ bool require_syntax_identifier_;
387
+ bool stop_after_syntax_identifier_;
388
+ string syntax_identifier_;
389
+
390
+ GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(Parser);
391
+ };
392
+
393
+ // A table mapping (descriptor, ErrorLocation) pairs -- as reported by
394
+ // DescriptorPool when validating descriptors -- to line and column numbers
395
+ // within the original source code.
396
+ //
397
+ // This is semi-obsolete: FileDescriptorProto.source_code_info now contains
398
+ // far more complete information about source locations. However, as of this
399
+ // writing you still need to use SourceLocationTable when integrating with
400
+ // DescriptorPool.
401
+ class LIBPROTOBUF_EXPORT SourceLocationTable {
402
+ public:
403
+ SourceLocationTable();
404
+ ~SourceLocationTable();
405
+
406
+ // Finds the precise location of the given error and fills in *line and
407
+ // *column with the line and column numbers. If not found, sets *line to
408
+ // -1 and *column to 0 (since line = -1 is used to mean "error has no exact
409
+ // location" in the ErrorCollector interface). Returns true if found, false
410
+ // otherwise.
411
+ bool Find(const Message* descriptor,
412
+ DescriptorPool::ErrorCollector::ErrorLocation location,
413
+ int* line, int* column) const;
414
+
415
+ // Adds a location to the table.
416
+ void Add(const Message* descriptor,
417
+ DescriptorPool::ErrorCollector::ErrorLocation location,
418
+ int line, int column);
419
+
420
+ // Clears the contents of the table.
421
+ void Clear();
422
+
423
+ private:
424
+ typedef map<
425
+ pair<const Message*, DescriptorPool::ErrorCollector::ErrorLocation>,
426
+ pair<int, int> > LocationMap;
427
+ LocationMap location_map_;
428
+ };
429
+
430
+ } // namespace compiler
431
+ } // namespace protobuf
432
+
433
+ } // namespace google
434
+ #endif // GOOGLE_PROTOBUF_COMPILER_PARSER_H__
@@ -0,0 +1,73 @@
1
+ // Protocol Buffers - Google's data interchange format
2
+ // Copyright 2008 Google Inc. All rights reserved.
3
+ // http://code.google.com/p/protobuf/
4
+ //
5
+ // Redistribution and use in source and binary forms, with or without
6
+ // modification, are permitted provided that the following conditions are
7
+ // met:
8
+ //
9
+ // * 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.
18
+ //
19
+ // 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.
30
+
31
+ // Author: kenton@google.com (Kenton Varda)
32
+ //
33
+ // Front-end for protoc code generator plugins written in C++.
34
+ //
35
+ // To implement a protoc plugin in C++, simply write an implementation of
36
+ // CodeGenerator, then create a main() function like:
37
+ // int main(int argc, char* argv[]) {
38
+ // MyCodeGenerator generator;
39
+ // return google::protobuf::compiler::PluginMain(argc, argv, &generator);
40
+ // }
41
+ // You must link your plugin against libprotobuf and libprotoc.
42
+ //
43
+ // To get protoc to use the plugin, do one of the following:
44
+ // * Place the plugin binary somewhere in the PATH and give it the name
45
+ // "protoc-gen-NAME" (replacing "NAME" with the name of your plugin). If you
46
+ // then invoke protoc with the parameter --NAME_out=OUT_DIR (again, replace
47
+ // "NAME" with your plugin's name), protoc will invoke your plugin to generate
48
+ // the output, which will be placed in OUT_DIR.
49
+ // * Place the plugin binary anywhere, with any name, and pass the --plugin
50
+ // parameter to protoc to direct it to your plugin like so:
51
+ // protoc --plugin=protoc-gen-NAME=path/to/mybinary --NAME_out=OUT_DIR
52
+ // On Windows, make sure to include the .exe suffix:
53
+ // protoc --plugin=protoc-gen-NAME=path/to/mybinary.exe --NAME_out=OUT_DIR
54
+
55
+ #ifndef GOOGLE_PROTOBUF_COMPILER_PLUGIN_H__
56
+ #define GOOGLE_PROTOBUF_COMPILER_PLUGIN_H__
57
+
58
+ #include <google/protobuf/stubs/common.h>
59
+
60
+ namespace google {
61
+ namespace protobuf {
62
+ namespace compiler {
63
+
64
+ class CodeGenerator; // code_generator.h
65
+
66
+ // Implements main() for a protoc plugin exposing the given code generator.
67
+ int PluginMain(int argc, char* argv[], const CodeGenerator* generator);
68
+
69
+ } // namespace compiler
70
+ } // namespace protobuf
71
+
72
+ } // namespace google
73
+ #endif // GOOGLE_PROTOBUF_COMPILER_PLUGIN_H__