protoc 2.6.1.1 → 2.6.1.2
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.
- checksums.yaml +4 -4
- data/ext/protoc/Makefile.in +10 -13
- data/ext/protoc/extconf.rb +0 -1
- data/ext/protoc/protobuf/CHANGES.txt +593 -0
- data/ext/protoc/protobuf/CONTRIBUTORS.txt +93 -0
- data/ext/protoc/protobuf/INSTALL.txt +237 -0
- data/ext/protoc/protobuf/LICENSE +33 -0
- data/ext/protoc/protobuf/Makefile.am +267 -0
- data/ext/protoc/protobuf/README.md +167 -0
- data/ext/protoc/protobuf/autogen.sh +41 -0
- data/ext/protoc/protobuf/benchmarks/ProtoBench.java +203 -0
- data/ext/protoc/protobuf/benchmarks/google_message1.dat +0 -0
- data/ext/protoc/protobuf/benchmarks/google_message2.dat +0 -0
- data/ext/protoc/protobuf/benchmarks/google_size.proto +136 -0
- data/ext/protoc/protobuf/benchmarks/google_speed.proto +136 -0
- data/ext/protoc/protobuf/benchmarks/readme.txt +50 -0
- data/ext/protoc/protobuf/configure.ac +159 -0
- data/ext/protoc/protobuf/editors/README.txt +5 -0
- data/ext/protoc/protobuf/editors/proto.vim +105 -0
- data/ext/protoc/protobuf/editors/protobuf-mode.el +220 -0
- data/ext/protoc/protobuf/examples/AddPerson.java +95 -0
- data/ext/protoc/protobuf/examples/ListPeople.java +50 -0
- data/ext/protoc/protobuf/examples/Makefile +58 -0
- data/ext/protoc/protobuf/examples/README.txt +29 -0
- data/ext/protoc/protobuf/examples/add_person.cc +95 -0
- data/ext/protoc/protobuf/examples/add_person.py +58 -0
- data/ext/protoc/protobuf/examples/addressbook.proto +30 -0
- data/ext/protoc/protobuf/examples/list_people.cc +68 -0
- data/ext/protoc/protobuf/examples/list_people.py +38 -0
- data/ext/protoc/protobuf/generate_descriptor_proto.sh +33 -0
- data/ext/protoc/protobuf/java/README.txt +96 -0
- data/ext/protoc/protobuf/java/pom.xml +217 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/AbstractMessage.java +466 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/AbstractMessageLite.java +355 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/AbstractParser.java +253 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/BlockingRpcChannel.java +51 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/BlockingService.java +64 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/BoundedByteString.java +163 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/ByteString.java +1022 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/CodedInputStream.java +1311 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/CodedOutputStream.java +1297 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/Descriptors.java +2238 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/DynamicMessage.java +622 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/Extension.java +96 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/ExtensionRegistry.java +392 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/ExtensionRegistryLite.java +185 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/FieldSet.java +907 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/GeneratedMessage.java +2213 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/GeneratedMessageLite.java +949 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/Internal.java +391 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/InvalidProtocolBufferException.java +122 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/LazyField.java +154 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/LazyFieldLite.java +176 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/LazyStringArrayList.java +367 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/LazyStringList.java +163 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/LiteralByteString.java +362 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/Message.java +244 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/MessageLite.java +320 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/MessageLiteOrBuilder.java +60 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/MessageOrBuilder.java +143 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/MessageReflection.java +931 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/Parser.java +261 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/ProtocolMessageEnum.java +58 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/ProtocolStringList.java +48 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/RepeatedFieldBuilder.java +696 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/RopeByteString.java +957 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/RpcCallback.java +47 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/RpcChannel.java +71 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/RpcController.java +118 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/RpcUtil.java +134 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/Service.java +117 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/ServiceException.java +52 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/SingleFieldBuilder.java +241 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/SmallSortedMap.java +618 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/TextFormat.java +1984 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/UninitializedMessageException.java +99 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/UnknownFieldSet.java +995 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/UnmodifiableLazyStringList.java +205 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/Utf8.java +349 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/WireFormat.java +163 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/AbstractMessageTest.java +527 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/BoundedByteStringTest.java +68 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/ByteStringTest.java +759 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/CheckUtf8Test.java +141 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/CodedInputStreamTest.java +769 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/CodedOutputStreamTest.java +401 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/DeprecatedFieldTest.java +80 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/DescriptorsTest.java +735 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/DynamicMessageTest.java +326 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/ForceFieldBuildersPreRun.java +48 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/GeneratedMessageTest.java +1515 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/IsValidUtf8Test.java +180 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/IsValidUtf8TestUtil.java +421 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/LazyFieldLiteTest.java +134 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/LazyFieldTest.java +121 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/LazyMessageLiteTest.java +319 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/LazyStringArrayListTest.java +174 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/LazyStringEndToEndTest.java +143 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/LiteEqualsAndHashTest.java +85 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/LiteTest.java +148 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/LiteralByteStringTest.java +396 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/MessageTest.java +353 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/NestedBuildersTest.java +185 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/ParserTest.java +381 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/RepeatedFieldBuilderTest.java +190 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/RopeByteStringSubstringTest.java +97 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/RopeByteStringTest.java +115 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/ServiceTest.java +320 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/SingleFieldBuilderTest.java +155 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/SmallSortedMapTest.java +420 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/TestBadIdentifiers.java +96 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/TestUtil.java +4124 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/TextFormatTest.java +994 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/UnknownFieldSetTest.java +653 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/UnmodifiableLazyStringListTest.java +227 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/WireFormatTest.java +606 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/lazy_fields_lite.proto +61 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/lite_equals_and_hash.proto +55 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/multiple_files_test.proto +77 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/nested_builders_test.proto +53 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/nested_extension.proto +46 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/nested_extension_lite.proto +48 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/non_nested_extension.proto +49 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/non_nested_extension_lite.proto +50 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/outer_class_name_test.proto +38 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/outer_class_name_test2.proto +42 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/outer_class_name_test3.proto +43 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/test_bad_identifiers.proto +157 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/test_check_utf8.proto +50 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/test_check_utf8_size.proto +51 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/test_custom_options.proto +43 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/test_extra_interfaces.proto +60 -0
- data/ext/protoc/protobuf/m4/ac_system_extensions.m4 +37 -0
- data/ext/protoc/protobuf/m4/acx_check_suncc.m4 +75 -0
- data/ext/protoc/protobuf/m4/acx_pthread.m4 +397 -0
- data/ext/protoc/protobuf/m4/stl_hash.m4 +72 -0
- data/ext/protoc/protobuf/more_tests/Makefile +41 -0
- data/ext/protoc/protobuf/post_process_dist.sh +60 -0
- data/ext/protoc/protobuf/protobuf-lite.pc.in +13 -0
- data/ext/protoc/protobuf/protobuf.pc.in +14 -0
- data/ext/protoc/protobuf/python/README.txt +105 -0
- data/ext/protoc/protobuf/python/ez_setup.py +284 -0
- data/ext/protoc/protobuf/python/google/__init__.py +1 -0
- data/ext/protoc/protobuf/python/google/protobuf/__init__.py +0 -0
- data/ext/protoc/protobuf/python/google/protobuf/descriptor.py +849 -0
- data/ext/protoc/protobuf/python/google/protobuf/descriptor_database.py +137 -0
- data/ext/protoc/protobuf/python/google/protobuf/descriptor_pool.py +643 -0
- data/ext/protoc/protobuf/python/google/protobuf/internal/__init__.py +0 -0
- data/ext/protoc/protobuf/python/google/protobuf/internal/api_implementation.cc +139 -0
- data/ext/protoc/protobuf/python/google/protobuf/internal/api_implementation.py +89 -0
- data/ext/protoc/protobuf/python/google/protobuf/internal/api_implementation_default_test.py +63 -0
- data/ext/protoc/protobuf/python/google/protobuf/internal/containers.py +269 -0
- data/ext/protoc/protobuf/python/google/protobuf/internal/cpp_message.py +663 -0
- data/ext/protoc/protobuf/python/google/protobuf/internal/decoder.py +831 -0
- data/ext/protoc/protobuf/python/google/protobuf/internal/descriptor_database_test.py +63 -0
- data/ext/protoc/protobuf/python/google/protobuf/internal/descriptor_pool_test.py +564 -0
- data/ext/protoc/protobuf/python/google/protobuf/internal/descriptor_pool_test1.proto +94 -0
- data/ext/protoc/protobuf/python/google/protobuf/internal/descriptor_pool_test2.proto +70 -0
- data/ext/protoc/protobuf/python/google/protobuf/internal/descriptor_python_test.py +54 -0
- data/ext/protoc/protobuf/python/google/protobuf/internal/descriptor_test.py +669 -0
- data/ext/protoc/protobuf/python/google/protobuf/internal/encoder.py +788 -0
- data/ext/protoc/protobuf/python/google/protobuf/internal/enum_type_wrapper.py +89 -0
- data/ext/protoc/protobuf/python/google/protobuf/internal/factory_test1.proto +57 -0
- data/ext/protoc/protobuf/python/google/protobuf/internal/factory_test2.proto +92 -0
- data/ext/protoc/protobuf/python/google/protobuf/internal/generator_test.py +343 -0
- data/ext/protoc/protobuf/python/google/protobuf/internal/message_factory_python_test.py +54 -0
- data/ext/protoc/protobuf/python/google/protobuf/internal/message_factory_test.py +131 -0
- data/ext/protoc/protobuf/python/google/protobuf/internal/message_listener.py +78 -0
- data/ext/protoc/protobuf/python/google/protobuf/internal/message_python_test.py +54 -0
- data/ext/protoc/protobuf/python/google/protobuf/internal/message_test.py +681 -0
- data/ext/protoc/protobuf/python/google/protobuf/internal/missing_enum_values.proto +50 -0
- data/ext/protoc/protobuf/python/google/protobuf/internal/more_extensions.proto +58 -0
- data/ext/protoc/protobuf/python/google/protobuf/internal/more_extensions_dynamic.proto +49 -0
- data/ext/protoc/protobuf/python/google/protobuf/internal/more_messages.proto +51 -0
- data/ext/protoc/protobuf/python/google/protobuf/internal/python_message.py +1251 -0
- data/ext/protoc/protobuf/python/google/protobuf/internal/reflection_test.py +2934 -0
- data/ext/protoc/protobuf/python/google/protobuf/internal/service_reflection_test.py +136 -0
- data/ext/protoc/protobuf/python/google/protobuf/internal/symbol_database_test.py +120 -0
- data/ext/protoc/protobuf/python/google/protobuf/internal/test_bad_identifiers.proto +52 -0
- data/ext/protoc/protobuf/python/google/protobuf/internal/test_util.py +662 -0
- data/ext/protoc/protobuf/python/google/protobuf/internal/text_encoding_test.py +68 -0
- data/ext/protoc/protobuf/python/google/protobuf/internal/text_format_test.py +743 -0
- data/ext/protoc/protobuf/python/google/protobuf/internal/type_checkers.py +328 -0
- data/ext/protoc/protobuf/python/google/protobuf/internal/unknown_fields_test.py +231 -0
- data/ext/protoc/protobuf/python/google/protobuf/internal/wire_format.py +268 -0
- data/ext/protoc/protobuf/python/google/protobuf/internal/wire_format_test.py +253 -0
- data/ext/protoc/protobuf/python/google/protobuf/message.py +284 -0
- data/ext/protoc/protobuf/python/google/protobuf/message_factory.py +155 -0
- data/ext/protoc/protobuf/python/google/protobuf/pyext/README +6 -0
- data/ext/protoc/protobuf/python/google/protobuf/pyext/__init__.py +0 -0
- data/ext/protoc/protobuf/python/google/protobuf/pyext/cpp_message.py +61 -0
- data/ext/protoc/protobuf/python/google/protobuf/pyext/descriptor.cc +357 -0
- data/ext/protoc/protobuf/python/google/protobuf/pyext/descriptor.h +96 -0
- data/ext/protoc/protobuf/python/google/protobuf/pyext/descriptor_cpp2_test.py +58 -0
- data/ext/protoc/protobuf/python/google/protobuf/pyext/extension_dict.cc +338 -0
- data/ext/protoc/protobuf/python/google/protobuf/pyext/extension_dict.h +123 -0
- data/ext/protoc/protobuf/python/google/protobuf/pyext/message.cc +2561 -0
- data/ext/protoc/protobuf/python/google/protobuf/pyext/message.h +305 -0
- data/ext/protoc/protobuf/python/google/protobuf/pyext/message_factory_cpp2_test.py +56 -0
- data/ext/protoc/protobuf/python/google/protobuf/pyext/proto2_api_test.proto +38 -0
- data/ext/protoc/protobuf/python/google/protobuf/pyext/python.proto +66 -0
- data/ext/protoc/protobuf/python/google/protobuf/pyext/python_protobuf.h +57 -0
- data/ext/protoc/protobuf/python/google/protobuf/pyext/reflection_cpp2_generated_test.py +94 -0
- data/ext/protoc/protobuf/python/google/protobuf/pyext/repeated_composite_container.cc +763 -0
- data/ext/protoc/protobuf/python/google/protobuf/pyext/repeated_composite_container.h +172 -0
- data/ext/protoc/protobuf/python/google/protobuf/pyext/repeated_scalar_container.cc +825 -0
- data/ext/protoc/protobuf/python/google/protobuf/pyext/repeated_scalar_container.h +112 -0
- data/ext/protoc/protobuf/python/google/protobuf/pyext/scoped_pyobject_ptr.h +95 -0
- data/ext/protoc/protobuf/python/google/protobuf/reflection.py +205 -0
- data/ext/protoc/protobuf/python/google/protobuf/service.py +226 -0
- data/ext/protoc/protobuf/python/google/protobuf/service_reflection.py +284 -0
- data/ext/protoc/protobuf/python/google/protobuf/symbol_database.py +185 -0
- data/ext/protoc/protobuf/python/google/protobuf/text_encoding.py +110 -0
- data/ext/protoc/protobuf/python/google/protobuf/text_format.py +873 -0
- data/ext/protoc/protobuf/python/mox.py +1401 -0
- data/ext/protoc/protobuf/python/setup.py +201 -0
- data/ext/protoc/protobuf/python/stubout.py +140 -0
- data/ext/protoc/protobuf/src/Makefile.am +418 -0
- data/ext/protoc/protobuf/src/google/protobuf/SEBS +240 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/code_generator.cc +84 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/code_generator.h +145 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/command_line_interface.cc +1603 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/command_line_interface.h +378 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/command_line_interface_unittest.cc +1654 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_bootstrap_unittest.cc +158 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_enum.cc +288 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_enum.h +103 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_enum_field.cc +431 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_enum_field.h +122 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_extension.cc +210 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_extension.h +86 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_field.cc +166 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_field.h +185 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_file.cc +665 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_file.h +99 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_generator.cc +125 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_generator.h +72 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_helpers.cc +494 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_helpers.h +206 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_message.cc +2645 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_message.h +175 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_message_field.cc +375 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_message_field.h +121 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_options.h +58 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_plugin_unittest.cc +123 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_primitive_field.cc +451 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_primitive_field.h +123 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_service.cc +334 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_service.h +118 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_string_field.cc +642 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_string_field.h +127 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_test_bad_identifiers.proto +132 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_unittest.cc +2074 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_unittest.h +51 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/importer.cc +480 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/importer.h +317 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/importer_unittest.cc +617 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_context.cc +195 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_context.h +95 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_doc_comment.cc +233 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_doc_comment.h +69 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_doc_comment_unittest.cc +67 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_enum.cc +333 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_enum.h +99 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_enum_field.cc +778 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_enum_field.h +158 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_extension.cc +207 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_extension.h +109 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_field.cc +213 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_field.h +162 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_file.cc +534 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_file.h +115 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_generator.cc +158 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_generator.h +72 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_generator_factory.cc +77 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_generator_factory.h +101 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_helpers.cc +737 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_helpers.h +322 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_lazy_message_field.cc +826 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_lazy_message_field.h +121 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_message.cc +1666 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_message.h +140 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_message_field.cc +1343 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_message_field.h +173 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_name_resolver.cc +266 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_name_resolver.h +124 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_plugin_unittest.cc +124 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_primitive_field.cc +877 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_primitive_field.h +160 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_service.cc +473 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_service.h +135 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_shared_code_generator.cc +201 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_shared_code_generator.h +90 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_string_field.cc +1056 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_string_field.h +160 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/main.cc +61 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/mock_code_generator.cc +240 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/mock_code_generator.h +117 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/package_info.h +64 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/parser.cc +1750 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/parser.h +522 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/parser_unittest.cc +2612 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/plugin.cc +163 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/plugin.h +72 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/plugin.pb.cc +1148 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/plugin.pb.h +897 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/plugin.proto +147 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/python/python_generator.cc +1262 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/python/python_generator.h +166 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/python/python_plugin_unittest.cc +118 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/subprocess.cc +463 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/subprocess.h +108 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/test_plugin.cc +51 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/zip_output_unittest.sh +91 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/zip_writer.cc +218 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/zip_writer.h +93 -0
- data/ext/protoc/protobuf/src/google/protobuf/descriptor.cc +5420 -0
- data/ext/protoc/protobuf/src/google/protobuf/descriptor.h +1691 -0
- data/ext/protoc/protobuf/src/google/protobuf/descriptor.pb.cc +9135 -0
- data/ext/protoc/protobuf/src/google/protobuf/descriptor.pb.h +6761 -0
- data/ext/protoc/protobuf/src/google/protobuf/descriptor.proto +687 -0
- data/ext/protoc/protobuf/src/google/protobuf/descriptor_database.cc +543 -0
- data/ext/protoc/protobuf/src/google/protobuf/descriptor_database.h +369 -0
- data/ext/protoc/protobuf/src/google/protobuf/descriptor_database_unittest.cc +748 -0
- data/ext/protoc/protobuf/src/google/protobuf/descriptor_pb2_test.py +54 -0
- data/ext/protoc/protobuf/src/google/protobuf/descriptor_unittest.cc +5501 -0
- data/ext/protoc/protobuf/src/google/protobuf/dynamic_message.cc +764 -0
- data/ext/protoc/protobuf/src/google/protobuf/dynamic_message.h +148 -0
- data/ext/protoc/protobuf/src/google/protobuf/dynamic_message_unittest.cc +230 -0
- data/ext/protoc/protobuf/src/google/protobuf/extension_set.cc +1663 -0
- data/ext/protoc/protobuf/src/google/protobuf/extension_set.h +1234 -0
- data/ext/protoc/protobuf/src/google/protobuf/extension_set_heavy.cc +734 -0
- data/ext/protoc/protobuf/src/google/protobuf/extension_set_unittest.cc +1095 -0
- data/ext/protoc/protobuf/src/google/protobuf/generated_enum_reflection.h +91 -0
- data/ext/protoc/protobuf/src/google/protobuf/generated_message_reflection.cc +1683 -0
- data/ext/protoc/protobuf/src/google/protobuf/generated_message_reflection.h +504 -0
- data/ext/protoc/protobuf/src/google/protobuf/generated_message_reflection_unittest.cc +795 -0
- data/ext/protoc/protobuf/src/google/protobuf/generated_message_util.cc +65 -0
- data/ext/protoc/protobuf/src/google/protobuf/generated_message_util.h +113 -0
- data/ext/protoc/protobuf/src/google/protobuf/io/coded_stream.cc +914 -0
- data/ext/protoc/protobuf/src/google/protobuf/io/coded_stream.h +1220 -0
- data/ext/protoc/protobuf/src/google/protobuf/io/coded_stream_inl.h +69 -0
- data/ext/protoc/protobuf/src/google/protobuf/io/coded_stream_unittest.cc +1378 -0
- data/ext/protoc/protobuf/src/google/protobuf/io/gzip_stream.cc +326 -0
- data/ext/protoc/protobuf/src/google/protobuf/io/gzip_stream.h +209 -0
- data/ext/protoc/protobuf/src/google/protobuf/io/gzip_stream_unittest.sh +44 -0
- data/ext/protoc/protobuf/src/google/protobuf/io/package_info.h +54 -0
- data/ext/protoc/protobuf/src/google/protobuf/io/printer.cc +198 -0
- data/ext/protoc/protobuf/src/google/protobuf/io/printer.h +136 -0
- data/ext/protoc/protobuf/src/google/protobuf/io/printer_unittest.cc +285 -0
- data/ext/protoc/protobuf/src/google/protobuf/io/strtod.cc +113 -0
- data/ext/protoc/protobuf/src/google/protobuf/io/strtod.h +50 -0
- data/ext/protoc/protobuf/src/google/protobuf/io/tokenizer.cc +1127 -0
- data/ext/protoc/protobuf/src/google/protobuf/io/tokenizer.h +402 -0
- data/ext/protoc/protobuf/src/google/protobuf/io/tokenizer_unittest.cc +999 -0
- data/ext/protoc/protobuf/src/google/protobuf/io/zero_copy_stream.cc +57 -0
- data/ext/protoc/protobuf/src/google/protobuf/io/zero_copy_stream.h +248 -0
- data/ext/protoc/protobuf/src/google/protobuf/io/zero_copy_stream_impl.cc +473 -0
- data/ext/protoc/protobuf/src/google/protobuf/io/zero_copy_stream_impl.h +358 -0
- data/ext/protoc/protobuf/src/google/protobuf/io/zero_copy_stream_impl_lite.cc +405 -0
- data/ext/protoc/protobuf/src/google/protobuf/io/zero_copy_stream_impl_lite.h +354 -0
- data/ext/protoc/protobuf/src/google/protobuf/io/zero_copy_stream_unittest.cc +965 -0
- data/ext/protoc/protobuf/src/google/protobuf/lite_unittest.cc +350 -0
- data/ext/protoc/protobuf/src/google/protobuf/message.cc +358 -0
- data/ext/protoc/protobuf/src/google/protobuf/message.h +866 -0
- data/ext/protoc/protobuf/src/google/protobuf/message_lite.cc +335 -0
- data/ext/protoc/protobuf/src/google/protobuf/message_lite.h +247 -0
- data/ext/protoc/protobuf/src/google/protobuf/message_unittest.cc +427 -0
- data/ext/protoc/protobuf/src/google/protobuf/package_info.h +64 -0
- data/ext/protoc/protobuf/src/google/protobuf/reflection_ops.cc +269 -0
- data/ext/protoc/protobuf/src/google/protobuf/reflection_ops.h +81 -0
- data/ext/protoc/protobuf/src/google/protobuf/reflection_ops_unittest.cc +475 -0
- data/ext/protoc/protobuf/src/google/protobuf/repeated_field.cc +87 -0
- data/ext/protoc/protobuf/src/google/protobuf/repeated_field.h +1603 -0
- data/ext/protoc/protobuf/src/google/protobuf/repeated_field_reflection_unittest.cc +195 -0
- data/ext/protoc/protobuf/src/google/protobuf/repeated_field_unittest.cc +1442 -0
- data/ext/protoc/protobuf/src/google/protobuf/service.cc +46 -0
- data/ext/protoc/protobuf/src/google/protobuf/service.h +291 -0
- data/ext/protoc/protobuf/src/google/protobuf/stubs/atomicops.h +227 -0
- data/ext/protoc/protobuf/src/google/protobuf/stubs/atomicops_internals_arm64_gcc.h +325 -0
- data/ext/protoc/protobuf/src/google/protobuf/stubs/atomicops_internals_arm_gcc.h +151 -0
- data/ext/protoc/protobuf/src/google/protobuf/stubs/atomicops_internals_arm_qnx.h +146 -0
- data/ext/protoc/protobuf/src/google/protobuf/stubs/atomicops_internals_atomicword_compat.h +122 -0
- data/ext/protoc/protobuf/src/google/protobuf/stubs/atomicops_internals_generic_gcc.h +137 -0
- data/ext/protoc/protobuf/src/google/protobuf/stubs/atomicops_internals_macosx.h +225 -0
- data/ext/protoc/protobuf/src/google/protobuf/stubs/atomicops_internals_mips_gcc.h +313 -0
- data/ext/protoc/protobuf/src/google/protobuf/stubs/atomicops_internals_pnacl.h +73 -0
- data/ext/protoc/protobuf/src/google/protobuf/stubs/atomicops_internals_solaris.h +188 -0
- data/ext/protoc/protobuf/src/google/protobuf/stubs/atomicops_internals_tsan.h +219 -0
- data/ext/protoc/protobuf/src/google/protobuf/stubs/atomicops_internals_x86_gcc.cc +137 -0
- data/ext/protoc/protobuf/src/google/protobuf/stubs/atomicops_internals_x86_gcc.h +293 -0
- data/ext/protoc/protobuf/src/google/protobuf/stubs/atomicops_internals_x86_msvc.cc +112 -0
- data/ext/protoc/protobuf/src/google/protobuf/stubs/atomicops_internals_x86_msvc.h +150 -0
- data/ext/protoc/protobuf/src/google/protobuf/stubs/common.cc +395 -0
- data/ext/protoc/protobuf/src/google/protobuf/stubs/common.h +1226 -0
- data/ext/protoc/protobuf/src/google/protobuf/stubs/common_unittest.cc +357 -0
- data/ext/protoc/protobuf/src/google/protobuf/stubs/hash.h +232 -0
- data/ext/protoc/protobuf/src/google/protobuf/stubs/map_util.h +771 -0
- data/ext/protoc/protobuf/src/google/protobuf/stubs/once.cc +99 -0
- data/ext/protoc/protobuf/src/google/protobuf/stubs/once.h +166 -0
- data/ext/protoc/protobuf/src/google/protobuf/stubs/once_unittest.cc +253 -0
- data/ext/protoc/protobuf/src/google/protobuf/stubs/platform_macros.h +103 -0
- data/ext/protoc/protobuf/src/google/protobuf/stubs/shared_ptr.h +470 -0
- data/ext/protoc/protobuf/src/google/protobuf/stubs/stl_util.h +121 -0
- data/ext/protoc/protobuf/src/google/protobuf/stubs/stringprintf.cc +175 -0
- data/ext/protoc/protobuf/src/google/protobuf/stubs/stringprintf.h +76 -0
- data/ext/protoc/protobuf/src/google/protobuf/stubs/stringprintf_unittest.cc +152 -0
- data/ext/protoc/protobuf/src/google/protobuf/stubs/structurally_valid.cc +536 -0
- data/ext/protoc/protobuf/src/google/protobuf/stubs/structurally_valid_unittest.cc +40 -0
- data/ext/protoc/protobuf/src/google/protobuf/stubs/strutil.cc +1279 -0
- data/ext/protoc/protobuf/src/google/protobuf/stubs/strutil.h +562 -0
- data/ext/protoc/protobuf/src/google/protobuf/stubs/strutil_unittest.cc +73 -0
- data/ext/protoc/protobuf/src/google/protobuf/stubs/substitute.cc +134 -0
- data/ext/protoc/protobuf/src/google/protobuf/stubs/substitute.h +170 -0
- data/ext/protoc/protobuf/src/google/protobuf/stubs/template_util.h +138 -0
- data/ext/protoc/protobuf/src/google/protobuf/stubs/template_util_unittest.cc +130 -0
- data/ext/protoc/protobuf/src/google/protobuf/stubs/type_traits.h +336 -0
- data/ext/protoc/protobuf/src/google/protobuf/stubs/type_traits_unittest.cc +628 -0
- data/ext/protoc/protobuf/src/google/protobuf/test_util.cc +3345 -0
- data/ext/protoc/protobuf/src/google/protobuf/test_util.h +215 -0
- data/ext/protoc/protobuf/src/google/protobuf/test_util_lite.cc +1585 -0
- data/ext/protoc/protobuf/src/google/protobuf/test_util_lite.h +101 -0
- data/ext/protoc/protobuf/src/google/protobuf/testdata/bad_utf8_string +1 -0
- data/ext/protoc/protobuf/src/google/protobuf/testdata/golden_message +0 -0
- data/ext/protoc/protobuf/src/google/protobuf/testdata/golden_message_oneof_implemented +0 -0
- data/ext/protoc/protobuf/src/google/protobuf/testdata/golden_packed_fields_message +0 -0
- data/ext/protoc/protobuf/src/google/protobuf/testdata/text_format_unittest_data.txt +134 -0
- data/ext/protoc/protobuf/src/google/protobuf/testdata/text_format_unittest_data_oneof_implemented.txt +129 -0
- data/ext/protoc/protobuf/src/google/protobuf/testdata/text_format_unittest_data_pointy.txt +134 -0
- data/ext/protoc/protobuf/src/google/protobuf/testdata/text_format_unittest_data_pointy_oneof.txt +129 -0
- data/ext/protoc/protobuf/src/google/protobuf/testdata/text_format_unittest_extensions_data.txt +134 -0
- data/ext/protoc/protobuf/src/google/protobuf/testdata/text_format_unittest_extensions_data_pointy.txt +134 -0
- data/ext/protoc/protobuf/src/google/protobuf/testing/file.cc +194 -0
- data/ext/protoc/protobuf/src/google/protobuf/testing/file.h +97 -0
- data/ext/protoc/protobuf/src/google/protobuf/testing/googletest.cc +255 -0
- data/ext/protoc/protobuf/src/google/protobuf/testing/googletest.h +102 -0
- data/ext/protoc/protobuf/src/google/protobuf/testing/zcgunzip.cc +73 -0
- data/ext/protoc/protobuf/src/google/protobuf/testing/zcgzip.cc +79 -0
- data/ext/protoc/protobuf/src/google/protobuf/text_format.cc +1746 -0
- data/ext/protoc/protobuf/src/google/protobuf/text_format.h +473 -0
- data/ext/protoc/protobuf/src/google/protobuf/text_format_unittest.cc +1479 -0
- data/ext/protoc/protobuf/src/google/protobuf/unittest.proto +861 -0
- data/ext/protoc/protobuf/src/google/protobuf/unittest_custom_options.proto +393 -0
- data/ext/protoc/protobuf/src/google/protobuf/unittest_embed_optimize_for.proto +50 -0
- data/ext/protoc/protobuf/src/google/protobuf/unittest_empty.proto +37 -0
- data/ext/protoc/protobuf/src/google/protobuf/unittest_enormous_descriptor.proto +1046 -0
- data/ext/protoc/protobuf/src/google/protobuf/unittest_import.proto +64 -0
- data/ext/protoc/protobuf/src/google/protobuf/unittest_import_lite.proto +51 -0
- data/ext/protoc/protobuf/src/google/protobuf/unittest_import_public.proto +40 -0
- data/ext/protoc/protobuf/src/google/protobuf/unittest_import_public_lite.proto +42 -0
- data/ext/protoc/protobuf/src/google/protobuf/unittest_lite.proto +384 -0
- data/ext/protoc/protobuf/src/google/protobuf/unittest_lite_imports_nonlite.proto +43 -0
- data/ext/protoc/protobuf/src/google/protobuf/unittest_mset.proto +83 -0
- data/ext/protoc/protobuf/src/google/protobuf/unittest_no_generic_services.proto +53 -0
- data/ext/protoc/protobuf/src/google/protobuf/unittest_optimize_for.proto +66 -0
- data/ext/protoc/protobuf/src/google/protobuf/unknown_field_set.cc +265 -0
- data/ext/protoc/protobuf/src/google/protobuf/unknown_field_set.h +318 -0
- data/ext/protoc/protobuf/src/google/protobuf/unknown_field_set_unittest.cc +599 -0
- data/ext/protoc/protobuf/src/google/protobuf/wire_format.cc +1101 -0
- data/ext/protoc/protobuf/src/google/protobuf/wire_format.h +336 -0
- data/ext/protoc/protobuf/src/google/protobuf/wire_format_lite.cc +471 -0
- data/ext/protoc/protobuf/src/google/protobuf/wire_format_lite.h +661 -0
- data/ext/protoc/protobuf/src/google/protobuf/wire_format_lite_inl.h +860 -0
- data/ext/protoc/protobuf/src/google/protobuf/wire_format_unittest.cc +1120 -0
- data/ext/protoc/protobuf/src/solaris/libstdc++.la +51 -0
- data/ext/protoc/protobuf/vsprojects/config.h +29 -0
- data/ext/protoc/protobuf/vsprojects/convert2008to2005.sh +20 -0
- data/ext/protoc/protobuf/vsprojects/extract_includes.bat +50 -0
- data/ext/protoc/protobuf/vsprojects/libprotobuf-lite.vcproj +302 -0
- data/ext/protoc/protobuf/vsprojects/libprotobuf.vcproj +470 -0
- data/ext/protoc/protobuf/vsprojects/libprotoc.vcproj +466 -0
- data/ext/protoc/protobuf/vsprojects/lite-test.vcproj +305 -0
- data/ext/protoc/protobuf/vsprojects/protobuf.sln +92 -0
- data/ext/protoc/protobuf/vsprojects/protoc.vcproj +192 -0
- data/ext/protoc/protobuf/vsprojects/readme.txt +114 -0
- data/ext/protoc/protobuf/vsprojects/test_plugin.vcproj +209 -0
- data/ext/protoc/protobuf/vsprojects/tests.vcproj +681 -0
- data/lib/protoc/version.rb +1 -1
- metadata +480 -3
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
// Protocol Buffers - Google's data interchange format
|
|
2
|
+
// Copyright 2008 Google Inc. All rights reserved.
|
|
3
|
+
// https://developers.google.com/protocol-buffers/
|
|
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
|
+
// WARNING: The plugin interface is currently EXPERIMENTAL and is subject to
|
|
34
|
+
// change.
|
|
35
|
+
//
|
|
36
|
+
// protoc (aka the Protocol Compiler) can be extended via plugins. A plugin is
|
|
37
|
+
// just a program that reads a CodeGeneratorRequest from stdin and writes a
|
|
38
|
+
// CodeGeneratorResponse to stdout.
|
|
39
|
+
//
|
|
40
|
+
// Plugins written using C++ can use google/protobuf/compiler/plugin.h instead
|
|
41
|
+
// of dealing with the raw protocol defined here.
|
|
42
|
+
//
|
|
43
|
+
// A plugin executable needs only to be placed somewhere in the path. The
|
|
44
|
+
// plugin should be named "protoc-gen-$NAME", and will then be used when the
|
|
45
|
+
// flag "--${NAME}_out" is passed to protoc.
|
|
46
|
+
|
|
47
|
+
package google.protobuf.compiler;
|
|
48
|
+
option java_package = "com.google.protobuf.compiler";
|
|
49
|
+
option java_outer_classname = "PluginProtos";
|
|
50
|
+
|
|
51
|
+
import "google/protobuf/descriptor.proto";
|
|
52
|
+
|
|
53
|
+
// An encoded CodeGeneratorRequest is written to the plugin's stdin.
|
|
54
|
+
message CodeGeneratorRequest {
|
|
55
|
+
// The .proto files that were explicitly listed on the command-line. The
|
|
56
|
+
// code generator should generate code only for these files. Each file's
|
|
57
|
+
// descriptor will be included in proto_file, below.
|
|
58
|
+
repeated string file_to_generate = 1;
|
|
59
|
+
|
|
60
|
+
// The generator parameter passed on the command-line.
|
|
61
|
+
optional string parameter = 2;
|
|
62
|
+
|
|
63
|
+
// FileDescriptorProtos for all files in files_to_generate and everything
|
|
64
|
+
// they import. The files will appear in topological order, so each file
|
|
65
|
+
// appears before any file that imports it.
|
|
66
|
+
//
|
|
67
|
+
// protoc guarantees that all proto_files will be written after
|
|
68
|
+
// the fields above, even though this is not technically guaranteed by the
|
|
69
|
+
// protobuf wire format. This theoretically could allow a plugin to stream
|
|
70
|
+
// in the FileDescriptorProtos and handle them one by one rather than read
|
|
71
|
+
// the entire set into memory at once. However, as of this writing, this
|
|
72
|
+
// is not similarly optimized on protoc's end -- it will store all fields in
|
|
73
|
+
// memory at once before sending them to the plugin.
|
|
74
|
+
repeated FileDescriptorProto proto_file = 15;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// The plugin writes an encoded CodeGeneratorResponse to stdout.
|
|
78
|
+
message CodeGeneratorResponse {
|
|
79
|
+
// Error message. If non-empty, code generation failed. The plugin process
|
|
80
|
+
// should exit with status code zero even if it reports an error in this way.
|
|
81
|
+
//
|
|
82
|
+
// This should be used to indicate errors in .proto files which prevent the
|
|
83
|
+
// code generator from generating correct code. Errors which indicate a
|
|
84
|
+
// problem in protoc itself -- such as the input CodeGeneratorRequest being
|
|
85
|
+
// unparseable -- should be reported by writing a message to stderr and
|
|
86
|
+
// exiting with a non-zero status code.
|
|
87
|
+
optional string error = 1;
|
|
88
|
+
|
|
89
|
+
// Represents a single generated file.
|
|
90
|
+
message File {
|
|
91
|
+
// The file name, relative to the output directory. The name must not
|
|
92
|
+
// contain "." or ".." components and must be relative, not be absolute (so,
|
|
93
|
+
// the file cannot lie outside the output directory). "/" must be used as
|
|
94
|
+
// the path separator, not "\".
|
|
95
|
+
//
|
|
96
|
+
// If the name is omitted, the content will be appended to the previous
|
|
97
|
+
// file. This allows the generator to break large files into small chunks,
|
|
98
|
+
// and allows the generated text to be streamed back to protoc so that large
|
|
99
|
+
// files need not reside completely in memory at one time. Note that as of
|
|
100
|
+
// this writing protoc does not optimize for this -- it will read the entire
|
|
101
|
+
// CodeGeneratorResponse before writing files to disk.
|
|
102
|
+
optional string name = 1;
|
|
103
|
+
|
|
104
|
+
// If non-empty, indicates that the named file should already exist, and the
|
|
105
|
+
// content here is to be inserted into that file at a defined insertion
|
|
106
|
+
// point. This feature allows a code generator to extend the output
|
|
107
|
+
// produced by another code generator. The original generator may provide
|
|
108
|
+
// insertion points by placing special annotations in the file that look
|
|
109
|
+
// like:
|
|
110
|
+
// @@protoc_insertion_point(NAME)
|
|
111
|
+
// The annotation can have arbitrary text before and after it on the line,
|
|
112
|
+
// which allows it to be placed in a comment. NAME should be replaced with
|
|
113
|
+
// an identifier naming the point -- this is what other generators will use
|
|
114
|
+
// as the insertion_point. Code inserted at this point will be placed
|
|
115
|
+
// immediately above the line containing the insertion point (thus multiple
|
|
116
|
+
// insertions to the same point will come out in the order they were added).
|
|
117
|
+
// The double-@ is intended to make it unlikely that the generated code
|
|
118
|
+
// could contain things that look like insertion points by accident.
|
|
119
|
+
//
|
|
120
|
+
// For example, the C++ code generator places the following line in the
|
|
121
|
+
// .pb.h files that it generates:
|
|
122
|
+
// // @@protoc_insertion_point(namespace_scope)
|
|
123
|
+
// This line appears within the scope of the file's package namespace, but
|
|
124
|
+
// outside of any particular class. Another plugin can then specify the
|
|
125
|
+
// insertion_point "namespace_scope" to generate additional classes or
|
|
126
|
+
// other declarations that should be placed in this scope.
|
|
127
|
+
//
|
|
128
|
+
// Note that if the line containing the insertion point begins with
|
|
129
|
+
// whitespace, the same whitespace will be added to every line of the
|
|
130
|
+
// inserted text. This is useful for languages like Python, where
|
|
131
|
+
// indentation matters. In these languages, the insertion point comment
|
|
132
|
+
// should be indented the same amount as any inserted code will need to be
|
|
133
|
+
// in order to work correctly in that context.
|
|
134
|
+
//
|
|
135
|
+
// The code generator that generates the initial file and the one which
|
|
136
|
+
// inserts into it must both run as part of a single invocation of protoc.
|
|
137
|
+
// Code generators are executed in the order in which they appear on the
|
|
138
|
+
// command line.
|
|
139
|
+
//
|
|
140
|
+
// If |insertion_point| is present, |name| must also be present.
|
|
141
|
+
optional string insertion_point = 2;
|
|
142
|
+
|
|
143
|
+
// The file contents.
|
|
144
|
+
optional string content = 15;
|
|
145
|
+
}
|
|
146
|
+
repeated File file = 15;
|
|
147
|
+
}
|
|
@@ -0,0 +1,1262 @@
|
|
|
1
|
+
// Protocol Buffers - Google's data interchange format
|
|
2
|
+
// Copyright 2008 Google Inc. All rights reserved.
|
|
3
|
+
// https://developers.google.com/protocol-buffers/
|
|
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
|
+
//#PY25 compatible generated code for GAE.
|
|
32
|
+
// Copyright 2007 Google Inc. All Rights Reserved.
|
|
33
|
+
// Author: robinson@google.com (Will Robinson)
|
|
34
|
+
//
|
|
35
|
+
// This module outputs pure-Python protocol message classes that will
|
|
36
|
+
// largely be constructed at runtime via the metaclass in reflection.py.
|
|
37
|
+
// In other words, our job is basically to output a Python equivalent
|
|
38
|
+
// of the C++ *Descriptor objects, and fix up all circular references
|
|
39
|
+
// within these objects.
|
|
40
|
+
//
|
|
41
|
+
// Note that the runtime performance of protocol message classes created in
|
|
42
|
+
// this way is expected to be lousy. The plan is to create an alternate
|
|
43
|
+
// generator that outputs a Python/C extension module that lets
|
|
44
|
+
// performance-minded Python code leverage the fast C++ implementation
|
|
45
|
+
// directly.
|
|
46
|
+
|
|
47
|
+
#include <limits>
|
|
48
|
+
#include <map>
|
|
49
|
+
#include <utility>
|
|
50
|
+
#include <memory>
|
|
51
|
+
#include <string>
|
|
52
|
+
#include <vector>
|
|
53
|
+
|
|
54
|
+
#include <google/protobuf/compiler/python/python_generator.h>
|
|
55
|
+
#include <google/protobuf/descriptor.pb.h>
|
|
56
|
+
|
|
57
|
+
#include <google/protobuf/stubs/common.h>
|
|
58
|
+
#include <google/protobuf/stubs/stringprintf.h>
|
|
59
|
+
#include <google/protobuf/io/printer.h>
|
|
60
|
+
#include <google/protobuf/descriptor.h>
|
|
61
|
+
#include <google/protobuf/io/zero_copy_stream.h>
|
|
62
|
+
#include <google/protobuf/stubs/strutil.h>
|
|
63
|
+
#include <google/protobuf/stubs/substitute.h>
|
|
64
|
+
|
|
65
|
+
namespace google {
|
|
66
|
+
namespace protobuf {
|
|
67
|
+
namespace compiler {
|
|
68
|
+
namespace python {
|
|
69
|
+
|
|
70
|
+
namespace {
|
|
71
|
+
|
|
72
|
+
// Returns a copy of |filename| with any trailing ".protodevel" or ".proto
|
|
73
|
+
// suffix stripped.
|
|
74
|
+
// TODO(robinson): Unify with copy in compiler/cpp/internal/helpers.cc.
|
|
75
|
+
string StripProto(const string& filename) {
|
|
76
|
+
const char* suffix = HasSuffixString(filename, ".protodevel")
|
|
77
|
+
? ".protodevel" : ".proto";
|
|
78
|
+
return StripSuffixString(filename, suffix);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
// Returns the Python module name expected for a given .proto filename.
|
|
83
|
+
string ModuleName(const string& filename) {
|
|
84
|
+
string basename = StripProto(filename);
|
|
85
|
+
StripString(&basename, "-", '_');
|
|
86
|
+
StripString(&basename, "/", '.');
|
|
87
|
+
return basename + "_pb2";
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
// Returns the name of all containing types for descriptor,
|
|
92
|
+
// in order from outermost to innermost, followed by descriptor's
|
|
93
|
+
// own name. Each name is separated by |separator|.
|
|
94
|
+
template <typename DescriptorT>
|
|
95
|
+
string NamePrefixedWithNestedTypes(const DescriptorT& descriptor,
|
|
96
|
+
const string& separator) {
|
|
97
|
+
string name = descriptor.name();
|
|
98
|
+
for (const Descriptor* current = descriptor.containing_type();
|
|
99
|
+
current != NULL; current = current->containing_type()) {
|
|
100
|
+
name = current->name() + separator + name;
|
|
101
|
+
}
|
|
102
|
+
return name;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
// Name of the class attribute where we store the Python
|
|
107
|
+
// descriptor.Descriptor instance for the generated class.
|
|
108
|
+
// Must stay consistent with the _DESCRIPTOR_KEY constant
|
|
109
|
+
// in proto2/public/reflection.py.
|
|
110
|
+
const char kDescriptorKey[] = "DESCRIPTOR";
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
// Does the file have top-level enums?
|
|
114
|
+
inline bool HasTopLevelEnums(const FileDescriptor *file) {
|
|
115
|
+
return file->enum_type_count() > 0;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
|
|
119
|
+
// Should we generate generic services for this file?
|
|
120
|
+
inline bool HasGenericServices(const FileDescriptor *file) {
|
|
121
|
+
return file->service_count() > 0 &&
|
|
122
|
+
file->options().py_generic_services();
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
// Prints the common boilerplate needed at the top of every .py
|
|
127
|
+
// file output by this generator.
|
|
128
|
+
void PrintTopBoilerplate(
|
|
129
|
+
io::Printer* printer, const FileDescriptor* file, bool descriptor_proto) {
|
|
130
|
+
// TODO(robinson): Allow parameterization of Python version?
|
|
131
|
+
printer->Print(
|
|
132
|
+
"# Generated by the protocol buffer compiler. DO NOT EDIT!\n"
|
|
133
|
+
"# source: $filename$\n"
|
|
134
|
+
"\nimport sys\n_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1'))" //##PY25
|
|
135
|
+
"\n",
|
|
136
|
+
"filename", file->name());
|
|
137
|
+
if (HasTopLevelEnums(file)) {
|
|
138
|
+
printer->Print(
|
|
139
|
+
"from google.protobuf.internal import enum_type_wrapper\n");
|
|
140
|
+
}
|
|
141
|
+
printer->Print(
|
|
142
|
+
"from google.protobuf import descriptor as _descriptor\n"
|
|
143
|
+
"from google.protobuf import message as _message\n"
|
|
144
|
+
"from google.protobuf import reflection as _reflection\n"
|
|
145
|
+
"from google.protobuf import symbol_database as "
|
|
146
|
+
"_symbol_database\n");
|
|
147
|
+
if (HasGenericServices(file)) {
|
|
148
|
+
printer->Print(
|
|
149
|
+
"from google.protobuf import service as _service\n"
|
|
150
|
+
"from google.protobuf import service_reflection\n");
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
// Avoid circular imports if this module is descriptor_pb2.
|
|
154
|
+
if (!descriptor_proto) {
|
|
155
|
+
printer->Print(
|
|
156
|
+
"from google.protobuf import descriptor_pb2\n");
|
|
157
|
+
}
|
|
158
|
+
printer->Print(
|
|
159
|
+
"# @@protoc_insertion_point(imports)\n\n"
|
|
160
|
+
"_sym_db = _symbol_database.Default()\n");
|
|
161
|
+
printer->Print("\n\n");
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
|
|
165
|
+
// Returns a Python literal giving the default value for a field.
|
|
166
|
+
// If the field specifies no explicit default value, we'll return
|
|
167
|
+
// the default default value for the field type (zero for numbers,
|
|
168
|
+
// empty string for strings, empty list for repeated fields, and
|
|
169
|
+
// None for non-repeated, composite fields).
|
|
170
|
+
//
|
|
171
|
+
// TODO(robinson): Unify with code from
|
|
172
|
+
// //compiler/cpp/internal/primitive_field.cc
|
|
173
|
+
// //compiler/cpp/internal/enum_field.cc
|
|
174
|
+
// //compiler/cpp/internal/string_field.cc
|
|
175
|
+
string StringifyDefaultValue(const FieldDescriptor& field) {
|
|
176
|
+
if (field.is_repeated()) {
|
|
177
|
+
return "[]";
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
switch (field.cpp_type()) {
|
|
181
|
+
case FieldDescriptor::CPPTYPE_INT32:
|
|
182
|
+
return SimpleItoa(field.default_value_int32());
|
|
183
|
+
case FieldDescriptor::CPPTYPE_UINT32:
|
|
184
|
+
return SimpleItoa(field.default_value_uint32());
|
|
185
|
+
case FieldDescriptor::CPPTYPE_INT64:
|
|
186
|
+
return SimpleItoa(field.default_value_int64());
|
|
187
|
+
case FieldDescriptor::CPPTYPE_UINT64:
|
|
188
|
+
return SimpleItoa(field.default_value_uint64());
|
|
189
|
+
case FieldDescriptor::CPPTYPE_DOUBLE: {
|
|
190
|
+
double value = field.default_value_double();
|
|
191
|
+
if (value == numeric_limits<double>::infinity()) {
|
|
192
|
+
// Python pre-2.6 on Windows does not parse "inf" correctly. However,
|
|
193
|
+
// a numeric literal that is too big for a double will become infinity.
|
|
194
|
+
return "1e10000";
|
|
195
|
+
} else if (value == -numeric_limits<double>::infinity()) {
|
|
196
|
+
// See above.
|
|
197
|
+
return "-1e10000";
|
|
198
|
+
} else if (value != value) {
|
|
199
|
+
// infinity * 0 = nan
|
|
200
|
+
return "(1e10000 * 0)";
|
|
201
|
+
} else {
|
|
202
|
+
return SimpleDtoa(value);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
case FieldDescriptor::CPPTYPE_FLOAT: {
|
|
206
|
+
float value = field.default_value_float();
|
|
207
|
+
if (value == numeric_limits<float>::infinity()) {
|
|
208
|
+
// Python pre-2.6 on Windows does not parse "inf" correctly. However,
|
|
209
|
+
// a numeric literal that is too big for a double will become infinity.
|
|
210
|
+
return "1e10000";
|
|
211
|
+
} else if (value == -numeric_limits<float>::infinity()) {
|
|
212
|
+
// See above.
|
|
213
|
+
return "-1e10000";
|
|
214
|
+
} else if (value != value) {
|
|
215
|
+
// infinity - infinity = nan
|
|
216
|
+
return "(1e10000 * 0)";
|
|
217
|
+
} else {
|
|
218
|
+
return SimpleFtoa(value);
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
case FieldDescriptor::CPPTYPE_BOOL:
|
|
222
|
+
return field.default_value_bool() ? "True" : "False";
|
|
223
|
+
case FieldDescriptor::CPPTYPE_ENUM:
|
|
224
|
+
return SimpleItoa(field.default_value_enum()->number());
|
|
225
|
+
case FieldDescriptor::CPPTYPE_STRING:
|
|
226
|
+
//##!PY25 return "b\"" + CEscape(field.default_value_string()) +
|
|
227
|
+
//##!PY25 (field.type() != FieldDescriptor::TYPE_STRING ? "\"" :
|
|
228
|
+
//##!PY25 "\".decode('utf-8')");
|
|
229
|
+
return "_b(\"" + CEscape(field.default_value_string()) + //##PY25
|
|
230
|
+
(field.type() != FieldDescriptor::TYPE_STRING ? "\")" : //##PY25
|
|
231
|
+
"\").decode('utf-8')"); //##PY25
|
|
232
|
+
case FieldDescriptor::CPPTYPE_MESSAGE:
|
|
233
|
+
return "None";
|
|
234
|
+
}
|
|
235
|
+
// (We could add a default case above but then we wouldn't get the nice
|
|
236
|
+
// compiler warning when a new type is added.)
|
|
237
|
+
GOOGLE_LOG(FATAL) << "Not reached.";
|
|
238
|
+
return "";
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
|
|
242
|
+
|
|
243
|
+
} // namespace
|
|
244
|
+
|
|
245
|
+
|
|
246
|
+
Generator::Generator() : file_(NULL) {
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
Generator::~Generator() {
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
bool Generator::Generate(const FileDescriptor* file,
|
|
253
|
+
const string& parameter,
|
|
254
|
+
GeneratorContext* context,
|
|
255
|
+
string* error) const {
|
|
256
|
+
|
|
257
|
+
// Completely serialize all Generate() calls on this instance. The
|
|
258
|
+
// thread-safety constraints of the CodeGenerator interface aren't clear so
|
|
259
|
+
// just be as conservative as possible. It's easier to relax this later if
|
|
260
|
+
// we need to, but I doubt it will be an issue.
|
|
261
|
+
// TODO(kenton): The proper thing to do would be to allocate any state on
|
|
262
|
+
// the stack and use that, so that the Generator class itself does not need
|
|
263
|
+
// to have any mutable members. Then it is implicitly thread-safe.
|
|
264
|
+
MutexLock lock(&mutex_);
|
|
265
|
+
file_ = file;
|
|
266
|
+
string module_name = ModuleName(file->name());
|
|
267
|
+
string filename = module_name;
|
|
268
|
+
StripString(&filename, ".", '/');
|
|
269
|
+
filename += ".py";
|
|
270
|
+
|
|
271
|
+
FileDescriptorProto fdp;
|
|
272
|
+
file_->CopyTo(&fdp);
|
|
273
|
+
fdp.SerializeToString(&file_descriptor_serialized_);
|
|
274
|
+
|
|
275
|
+
|
|
276
|
+
scoped_ptr<io::ZeroCopyOutputStream> output(context->Open(filename));
|
|
277
|
+
GOOGLE_CHECK(output.get());
|
|
278
|
+
io::Printer printer(output.get(), '$');
|
|
279
|
+
printer_ = &printer;
|
|
280
|
+
|
|
281
|
+
PrintTopBoilerplate(printer_, file_, GeneratingDescriptorProto());
|
|
282
|
+
PrintImports();
|
|
283
|
+
PrintFileDescriptor();
|
|
284
|
+
PrintTopLevelEnums();
|
|
285
|
+
PrintTopLevelExtensions();
|
|
286
|
+
PrintAllNestedEnumsInFile();
|
|
287
|
+
PrintMessageDescriptors();
|
|
288
|
+
FixForeignFieldsInDescriptors();
|
|
289
|
+
PrintMessages();
|
|
290
|
+
// We have to fix up the extensions after the message classes themselves,
|
|
291
|
+
// since they need to call static RegisterExtension() methods on these
|
|
292
|
+
// classes.
|
|
293
|
+
FixForeignFieldsInExtensions();
|
|
294
|
+
// Descriptor options may have custom extensions. These custom options
|
|
295
|
+
// can only be successfully parsed after we register corresponding
|
|
296
|
+
// extensions. Therefore we parse all options again here to recognize
|
|
297
|
+
// custom options that may be unknown when we define the descriptors.
|
|
298
|
+
FixAllDescriptorOptions();
|
|
299
|
+
if (HasGenericServices(file)) {
|
|
300
|
+
PrintServices();
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
printer.Print(
|
|
304
|
+
"# @@protoc_insertion_point(module_scope)\n");
|
|
305
|
+
|
|
306
|
+
return !printer.failed();
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
// Prints Python imports for all modules imported by |file|.
|
|
310
|
+
void Generator::PrintImports() const {
|
|
311
|
+
for (int i = 0; i < file_->dependency_count(); ++i) {
|
|
312
|
+
string module_name = ModuleName(file_->dependency(i)->name());
|
|
313
|
+
printer_->Print("import $module$\n", "module",
|
|
314
|
+
module_name);
|
|
315
|
+
}
|
|
316
|
+
printer_->Print("\n");
|
|
317
|
+
|
|
318
|
+
// Print public imports.
|
|
319
|
+
for (int i = 0; i < file_->public_dependency_count(); ++i) {
|
|
320
|
+
string module_name = ModuleName(file_->public_dependency(i)->name());
|
|
321
|
+
printer_->Print("from $module$ import *\n", "module", module_name);
|
|
322
|
+
}
|
|
323
|
+
printer_->Print("\n");
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
// Prints the single file descriptor for this file.
|
|
327
|
+
void Generator::PrintFileDescriptor() const {
|
|
328
|
+
map<string, string> m;
|
|
329
|
+
m["descriptor_name"] = kDescriptorKey;
|
|
330
|
+
m["name"] = file_->name();
|
|
331
|
+
m["package"] = file_->package();
|
|
332
|
+
const char file_descriptor_template[] =
|
|
333
|
+
"$descriptor_name$ = _descriptor.FileDescriptor(\n"
|
|
334
|
+
" name='$name$',\n"
|
|
335
|
+
" package='$package$',\n";
|
|
336
|
+
printer_->Print(m, file_descriptor_template);
|
|
337
|
+
printer_->Indent();
|
|
338
|
+
printer_->Print(
|
|
339
|
+
//##!PY25 "serialized_pb=b'$value$'\n",
|
|
340
|
+
"serialized_pb=_b('$value$')\n", //##PY25
|
|
341
|
+
"value", strings::CHexEscape(file_descriptor_serialized_));
|
|
342
|
+
if (file_->dependency_count() != 0) {
|
|
343
|
+
printer_->Print(",\ndependencies=[");
|
|
344
|
+
for (int i = 0; i < file_->dependency_count(); ++i) {
|
|
345
|
+
string module_name = ModuleName(file_->dependency(i)->name());
|
|
346
|
+
printer_->Print("$module_name$.DESCRIPTOR,", "module_name", module_name);
|
|
347
|
+
}
|
|
348
|
+
printer_->Print("]");
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
// TODO(falk): Also print options and fix the message_type, enum_type,
|
|
352
|
+
// service and extension later in the generation.
|
|
353
|
+
|
|
354
|
+
printer_->Outdent();
|
|
355
|
+
printer_->Print(")\n");
|
|
356
|
+
printer_->Print("_sym_db.RegisterFileDescriptor($name$)\n", "name",
|
|
357
|
+
kDescriptorKey);
|
|
358
|
+
printer_->Print("\n");
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
// Prints descriptors and module-level constants for all top-level
|
|
362
|
+
// enums defined in |file|.
|
|
363
|
+
void Generator::PrintTopLevelEnums() const {
|
|
364
|
+
vector<pair<string, int> > top_level_enum_values;
|
|
365
|
+
for (int i = 0; i < file_->enum_type_count(); ++i) {
|
|
366
|
+
const EnumDescriptor& enum_descriptor = *file_->enum_type(i);
|
|
367
|
+
PrintEnum(enum_descriptor);
|
|
368
|
+
printer_->Print("$name$ = "
|
|
369
|
+
"enum_type_wrapper.EnumTypeWrapper($descriptor_name$)",
|
|
370
|
+
"name", enum_descriptor.name(),
|
|
371
|
+
"descriptor_name",
|
|
372
|
+
ModuleLevelDescriptorName(enum_descriptor));
|
|
373
|
+
printer_->Print("\n");
|
|
374
|
+
|
|
375
|
+
for (int j = 0; j < enum_descriptor.value_count(); ++j) {
|
|
376
|
+
const EnumValueDescriptor& value_descriptor = *enum_descriptor.value(j);
|
|
377
|
+
top_level_enum_values.push_back(
|
|
378
|
+
make_pair(value_descriptor.name(), value_descriptor.number()));
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
for (int i = 0; i < top_level_enum_values.size(); ++i) {
|
|
383
|
+
printer_->Print("$name$ = $value$\n",
|
|
384
|
+
"name", top_level_enum_values[i].first,
|
|
385
|
+
"value", SimpleItoa(top_level_enum_values[i].second));
|
|
386
|
+
}
|
|
387
|
+
printer_->Print("\n");
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
// Prints all enums contained in all message types in |file|.
|
|
391
|
+
void Generator::PrintAllNestedEnumsInFile() const {
|
|
392
|
+
for (int i = 0; i < file_->message_type_count(); ++i) {
|
|
393
|
+
PrintNestedEnums(*file_->message_type(i));
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
|
|
397
|
+
// Prints a Python statement assigning the appropriate module-level
|
|
398
|
+
// enum name to a Python EnumDescriptor object equivalent to
|
|
399
|
+
// enum_descriptor.
|
|
400
|
+
void Generator::PrintEnum(const EnumDescriptor& enum_descriptor) const {
|
|
401
|
+
map<string, string> m;
|
|
402
|
+
string module_level_descriptor_name =
|
|
403
|
+
ModuleLevelDescriptorName(enum_descriptor);
|
|
404
|
+
m["descriptor_name"] = module_level_descriptor_name;
|
|
405
|
+
m["name"] = enum_descriptor.name();
|
|
406
|
+
m["full_name"] = enum_descriptor.full_name();
|
|
407
|
+
m["file"] = kDescriptorKey;
|
|
408
|
+
const char enum_descriptor_template[] =
|
|
409
|
+
"$descriptor_name$ = _descriptor.EnumDescriptor(\n"
|
|
410
|
+
" name='$name$',\n"
|
|
411
|
+
" full_name='$full_name$',\n"
|
|
412
|
+
" filename=None,\n"
|
|
413
|
+
" file=$file$,\n"
|
|
414
|
+
" values=[\n";
|
|
415
|
+
string options_string;
|
|
416
|
+
enum_descriptor.options().SerializeToString(&options_string);
|
|
417
|
+
printer_->Print(m, enum_descriptor_template);
|
|
418
|
+
printer_->Indent();
|
|
419
|
+
printer_->Indent();
|
|
420
|
+
for (int i = 0; i < enum_descriptor.value_count(); ++i) {
|
|
421
|
+
PrintEnumValueDescriptor(*enum_descriptor.value(i));
|
|
422
|
+
printer_->Print(",\n");
|
|
423
|
+
}
|
|
424
|
+
printer_->Outdent();
|
|
425
|
+
printer_->Print("],\n");
|
|
426
|
+
printer_->Print("containing_type=None,\n");
|
|
427
|
+
printer_->Print("options=$options_value$,\n",
|
|
428
|
+
"options_value",
|
|
429
|
+
OptionsValue("EnumOptions", options_string));
|
|
430
|
+
EnumDescriptorProto edp;
|
|
431
|
+
PrintSerializedPbInterval(enum_descriptor, edp);
|
|
432
|
+
printer_->Outdent();
|
|
433
|
+
printer_->Print(")\n");
|
|
434
|
+
printer_->Print("_sym_db.RegisterEnumDescriptor($name$)\n", "name",
|
|
435
|
+
module_level_descriptor_name);
|
|
436
|
+
printer_->Print("\n");
|
|
437
|
+
}
|
|
438
|
+
|
|
439
|
+
// Recursively prints enums in nested types within descriptor, then
|
|
440
|
+
// prints enums contained at the top level in descriptor.
|
|
441
|
+
void Generator::PrintNestedEnums(const Descriptor& descriptor) const {
|
|
442
|
+
for (int i = 0; i < descriptor.nested_type_count(); ++i) {
|
|
443
|
+
PrintNestedEnums(*descriptor.nested_type(i));
|
|
444
|
+
}
|
|
445
|
+
|
|
446
|
+
for (int i = 0; i < descriptor.enum_type_count(); ++i) {
|
|
447
|
+
PrintEnum(*descriptor.enum_type(i));
|
|
448
|
+
}
|
|
449
|
+
}
|
|
450
|
+
|
|
451
|
+
void Generator::PrintTopLevelExtensions() const {
|
|
452
|
+
const bool is_extension = true;
|
|
453
|
+
for (int i = 0; i < file_->extension_count(); ++i) {
|
|
454
|
+
const FieldDescriptor& extension_field = *file_->extension(i);
|
|
455
|
+
string constant_name = extension_field.name() + "_FIELD_NUMBER";
|
|
456
|
+
UpperString(&constant_name);
|
|
457
|
+
printer_->Print("$constant_name$ = $number$\n",
|
|
458
|
+
"constant_name", constant_name,
|
|
459
|
+
"number", SimpleItoa(extension_field.number()));
|
|
460
|
+
printer_->Print("$name$ = ", "name", extension_field.name());
|
|
461
|
+
PrintFieldDescriptor(extension_field, is_extension);
|
|
462
|
+
printer_->Print("\n");
|
|
463
|
+
}
|
|
464
|
+
printer_->Print("\n");
|
|
465
|
+
}
|
|
466
|
+
|
|
467
|
+
// Prints Python equivalents of all Descriptors in |file|.
|
|
468
|
+
void Generator::PrintMessageDescriptors() const {
|
|
469
|
+
for (int i = 0; i < file_->message_type_count(); ++i) {
|
|
470
|
+
PrintDescriptor(*file_->message_type(i));
|
|
471
|
+
printer_->Print("\n");
|
|
472
|
+
}
|
|
473
|
+
}
|
|
474
|
+
|
|
475
|
+
void Generator::PrintServices() const {
|
|
476
|
+
for (int i = 0; i < file_->service_count(); ++i) {
|
|
477
|
+
PrintServiceDescriptor(*file_->service(i));
|
|
478
|
+
PrintServiceClass(*file_->service(i));
|
|
479
|
+
PrintServiceStub(*file_->service(i));
|
|
480
|
+
printer_->Print("\n");
|
|
481
|
+
}
|
|
482
|
+
}
|
|
483
|
+
|
|
484
|
+
void Generator::PrintServiceDescriptor(
|
|
485
|
+
const ServiceDescriptor& descriptor) const {
|
|
486
|
+
printer_->Print("\n");
|
|
487
|
+
string service_name = ModuleLevelServiceDescriptorName(descriptor);
|
|
488
|
+
string options_string;
|
|
489
|
+
descriptor.options().SerializeToString(&options_string);
|
|
490
|
+
|
|
491
|
+
printer_->Print(
|
|
492
|
+
"$service_name$ = _descriptor.ServiceDescriptor(\n",
|
|
493
|
+
"service_name", service_name);
|
|
494
|
+
printer_->Indent();
|
|
495
|
+
map<string, string> m;
|
|
496
|
+
m["name"] = descriptor.name();
|
|
497
|
+
m["full_name"] = descriptor.full_name();
|
|
498
|
+
m["file"] = kDescriptorKey;
|
|
499
|
+
m["index"] = SimpleItoa(descriptor.index());
|
|
500
|
+
m["options_value"] = OptionsValue("ServiceOptions", options_string);
|
|
501
|
+
const char required_function_arguments[] =
|
|
502
|
+
"name='$name$',\n"
|
|
503
|
+
"full_name='$full_name$',\n"
|
|
504
|
+
"file=$file$,\n"
|
|
505
|
+
"index=$index$,\n"
|
|
506
|
+
"options=$options_value$,\n";
|
|
507
|
+
printer_->Print(m, required_function_arguments);
|
|
508
|
+
|
|
509
|
+
ServiceDescriptorProto sdp;
|
|
510
|
+
PrintSerializedPbInterval(descriptor, sdp);
|
|
511
|
+
|
|
512
|
+
printer_->Print("methods=[\n");
|
|
513
|
+
for (int i = 0; i < descriptor.method_count(); ++i) {
|
|
514
|
+
const MethodDescriptor* method = descriptor.method(i);
|
|
515
|
+
method->options().SerializeToString(&options_string);
|
|
516
|
+
|
|
517
|
+
m.clear();
|
|
518
|
+
m["name"] = method->name();
|
|
519
|
+
m["full_name"] = method->full_name();
|
|
520
|
+
m["index"] = SimpleItoa(method->index());
|
|
521
|
+
m["serialized_options"] = CEscape(options_string);
|
|
522
|
+
m["input_type"] = ModuleLevelDescriptorName(*(method->input_type()));
|
|
523
|
+
m["output_type"] = ModuleLevelDescriptorName(*(method->output_type()));
|
|
524
|
+
m["options_value"] = OptionsValue("MethodOptions", options_string);
|
|
525
|
+
printer_->Print("_descriptor.MethodDescriptor(\n");
|
|
526
|
+
printer_->Indent();
|
|
527
|
+
printer_->Print(
|
|
528
|
+
m,
|
|
529
|
+
"name='$name$',\n"
|
|
530
|
+
"full_name='$full_name$',\n"
|
|
531
|
+
"index=$index$,\n"
|
|
532
|
+
"containing_service=None,\n"
|
|
533
|
+
"input_type=$input_type$,\n"
|
|
534
|
+
"output_type=$output_type$,\n"
|
|
535
|
+
"options=$options_value$,\n");
|
|
536
|
+
printer_->Outdent();
|
|
537
|
+
printer_->Print("),\n");
|
|
538
|
+
}
|
|
539
|
+
|
|
540
|
+
printer_->Outdent();
|
|
541
|
+
printer_->Print("])\n\n");
|
|
542
|
+
}
|
|
543
|
+
|
|
544
|
+
void Generator::PrintServiceClass(const ServiceDescriptor& descriptor) const {
|
|
545
|
+
// Print the service.
|
|
546
|
+
printer_->Print("$class_name$ = service_reflection.GeneratedServiceType("
|
|
547
|
+
"'$class_name$', (_service.Service,), dict(\n",
|
|
548
|
+
"class_name", descriptor.name());
|
|
549
|
+
printer_->Indent();
|
|
550
|
+
printer_->Print(
|
|
551
|
+
"$descriptor_key$ = $descriptor_name$,\n",
|
|
552
|
+
"descriptor_key", kDescriptorKey,
|
|
553
|
+
"descriptor_name", ModuleLevelServiceDescriptorName(descriptor));
|
|
554
|
+
printer_->Print(
|
|
555
|
+
"__module__ = '$module_name$'\n",
|
|
556
|
+
"module_name", ModuleName(file_->name()));
|
|
557
|
+
printer_->Print("))\n\n");
|
|
558
|
+
printer_->Outdent();
|
|
559
|
+
}
|
|
560
|
+
|
|
561
|
+
void Generator::PrintServiceStub(const ServiceDescriptor& descriptor) const {
|
|
562
|
+
// Print the service stub.
|
|
563
|
+
printer_->Print("$class_name$_Stub = "
|
|
564
|
+
"service_reflection.GeneratedServiceStubType("
|
|
565
|
+
"'$class_name$_Stub', ($class_name$,), dict(\n",
|
|
566
|
+
"class_name", descriptor.name());
|
|
567
|
+
printer_->Indent();
|
|
568
|
+
printer_->Print(
|
|
569
|
+
"$descriptor_key$ = $descriptor_name$,\n",
|
|
570
|
+
"descriptor_key", kDescriptorKey,
|
|
571
|
+
"descriptor_name", ModuleLevelServiceDescriptorName(descriptor));
|
|
572
|
+
printer_->Print(
|
|
573
|
+
"__module__ = '$module_name$'\n",
|
|
574
|
+
"module_name", ModuleName(file_->name()));
|
|
575
|
+
printer_->Print("))\n\n");
|
|
576
|
+
printer_->Outdent();
|
|
577
|
+
}
|
|
578
|
+
|
|
579
|
+
// Prints statement assigning ModuleLevelDescriptorName(message_descriptor)
|
|
580
|
+
// to a Python Descriptor object for message_descriptor.
|
|
581
|
+
//
|
|
582
|
+
// Mutually recursive with PrintNestedDescriptors().
|
|
583
|
+
void Generator::PrintDescriptor(const Descriptor& message_descriptor) const {
|
|
584
|
+
PrintNestedDescriptors(message_descriptor);
|
|
585
|
+
|
|
586
|
+
printer_->Print("\n");
|
|
587
|
+
printer_->Print("$descriptor_name$ = _descriptor.Descriptor(\n",
|
|
588
|
+
"descriptor_name",
|
|
589
|
+
ModuleLevelDescriptorName(message_descriptor));
|
|
590
|
+
printer_->Indent();
|
|
591
|
+
map<string, string> m;
|
|
592
|
+
m["name"] = message_descriptor.name();
|
|
593
|
+
m["full_name"] = message_descriptor.full_name();
|
|
594
|
+
m["file"] = kDescriptorKey;
|
|
595
|
+
const char required_function_arguments[] =
|
|
596
|
+
"name='$name$',\n"
|
|
597
|
+
"full_name='$full_name$',\n"
|
|
598
|
+
"filename=None,\n"
|
|
599
|
+
"file=$file$,\n"
|
|
600
|
+
"containing_type=None,\n";
|
|
601
|
+
printer_->Print(m, required_function_arguments);
|
|
602
|
+
PrintFieldsInDescriptor(message_descriptor);
|
|
603
|
+
PrintExtensionsInDescriptor(message_descriptor);
|
|
604
|
+
|
|
605
|
+
// Nested types
|
|
606
|
+
printer_->Print("nested_types=[");
|
|
607
|
+
for (int i = 0; i < message_descriptor.nested_type_count(); ++i) {
|
|
608
|
+
const string nested_name = ModuleLevelDescriptorName(
|
|
609
|
+
*message_descriptor.nested_type(i));
|
|
610
|
+
printer_->Print("$name$, ", "name", nested_name);
|
|
611
|
+
}
|
|
612
|
+
printer_->Print("],\n");
|
|
613
|
+
|
|
614
|
+
// Enum types
|
|
615
|
+
printer_->Print("enum_types=[\n");
|
|
616
|
+
printer_->Indent();
|
|
617
|
+
for (int i = 0; i < message_descriptor.enum_type_count(); ++i) {
|
|
618
|
+
const string descriptor_name = ModuleLevelDescriptorName(
|
|
619
|
+
*message_descriptor.enum_type(i));
|
|
620
|
+
printer_->Print(descriptor_name.c_str());
|
|
621
|
+
printer_->Print(",\n");
|
|
622
|
+
}
|
|
623
|
+
printer_->Outdent();
|
|
624
|
+
printer_->Print("],\n");
|
|
625
|
+
string options_string;
|
|
626
|
+
message_descriptor.options().SerializeToString(&options_string);
|
|
627
|
+
printer_->Print(
|
|
628
|
+
"options=$options_value$,\n"
|
|
629
|
+
"is_extendable=$extendable$",
|
|
630
|
+
"options_value", OptionsValue("MessageOptions", options_string),
|
|
631
|
+
"extendable", message_descriptor.extension_range_count() > 0 ?
|
|
632
|
+
"True" : "False");
|
|
633
|
+
printer_->Print(",\n");
|
|
634
|
+
|
|
635
|
+
// Extension ranges
|
|
636
|
+
printer_->Print("extension_ranges=[");
|
|
637
|
+
for (int i = 0; i < message_descriptor.extension_range_count(); ++i) {
|
|
638
|
+
const Descriptor::ExtensionRange* range =
|
|
639
|
+
message_descriptor.extension_range(i);
|
|
640
|
+
printer_->Print("($start$, $end$), ",
|
|
641
|
+
"start", SimpleItoa(range->start),
|
|
642
|
+
"end", SimpleItoa(range->end));
|
|
643
|
+
}
|
|
644
|
+
printer_->Print("],\n");
|
|
645
|
+
printer_->Print("oneofs=[\n");
|
|
646
|
+
printer_->Indent();
|
|
647
|
+
for (int i = 0; i < message_descriptor.oneof_decl_count(); ++i) {
|
|
648
|
+
const OneofDescriptor* desc = message_descriptor.oneof_decl(i);
|
|
649
|
+
map<string, string> m;
|
|
650
|
+
m["name"] = desc->name();
|
|
651
|
+
m["full_name"] = desc->full_name();
|
|
652
|
+
m["index"] = SimpleItoa(desc->index());
|
|
653
|
+
printer_->Print(
|
|
654
|
+
m,
|
|
655
|
+
"_descriptor.OneofDescriptor(\n"
|
|
656
|
+
" name='$name$', full_name='$full_name$',\n"
|
|
657
|
+
" index=$index$, containing_type=None, fields=[]),\n");
|
|
658
|
+
}
|
|
659
|
+
printer_->Outdent();
|
|
660
|
+
printer_->Print("],\n");
|
|
661
|
+
// Serialization of proto
|
|
662
|
+
DescriptorProto edp;
|
|
663
|
+
PrintSerializedPbInterval(message_descriptor, edp);
|
|
664
|
+
|
|
665
|
+
printer_->Outdent();
|
|
666
|
+
printer_->Print(")\n");
|
|
667
|
+
}
|
|
668
|
+
|
|
669
|
+
// Prints Python Descriptor objects for all nested types contained in
|
|
670
|
+
// message_descriptor.
|
|
671
|
+
//
|
|
672
|
+
// Mutually recursive with PrintDescriptor().
|
|
673
|
+
void Generator::PrintNestedDescriptors(
|
|
674
|
+
const Descriptor& containing_descriptor) const {
|
|
675
|
+
for (int i = 0; i < containing_descriptor.nested_type_count(); ++i) {
|
|
676
|
+
PrintDescriptor(*containing_descriptor.nested_type(i));
|
|
677
|
+
}
|
|
678
|
+
}
|
|
679
|
+
|
|
680
|
+
// Prints all messages in |file|.
|
|
681
|
+
void Generator::PrintMessages() const {
|
|
682
|
+
for (int i = 0; i < file_->message_type_count(); ++i) {
|
|
683
|
+
vector<string> to_register;
|
|
684
|
+
PrintMessage(*file_->message_type(i), "", &to_register);
|
|
685
|
+
for (int j = 0; j < to_register.size(); ++j) {
|
|
686
|
+
printer_->Print("_sym_db.RegisterMessage($name$)\n", "name",
|
|
687
|
+
to_register[j]);
|
|
688
|
+
}
|
|
689
|
+
printer_->Print("\n");
|
|
690
|
+
}
|
|
691
|
+
}
|
|
692
|
+
|
|
693
|
+
// Prints a Python class for the given message descriptor. We defer to the
|
|
694
|
+
// metaclass to do almost all of the work of actually creating a useful class.
|
|
695
|
+
// The purpose of this function and its many helper functions above is merely
|
|
696
|
+
// to output a Python version of the descriptors, which the metaclass in
|
|
697
|
+
// reflection.py will use to construct the meat of the class itself.
|
|
698
|
+
//
|
|
699
|
+
// Mutually recursive with PrintNestedMessages().
|
|
700
|
+
// Collect nested message names to_register for the symbol_database.
|
|
701
|
+
void Generator::PrintMessage(const Descriptor& message_descriptor,
|
|
702
|
+
const string& prefix,
|
|
703
|
+
vector<string>* to_register) const {
|
|
704
|
+
string qualified_name(prefix + message_descriptor.name());
|
|
705
|
+
to_register->push_back(qualified_name);
|
|
706
|
+
printer_->Print(
|
|
707
|
+
"$name$ = _reflection.GeneratedProtocolMessageType('$name$', "
|
|
708
|
+
"(_message.Message,), dict(\n",
|
|
709
|
+
"name", message_descriptor.name());
|
|
710
|
+
printer_->Indent();
|
|
711
|
+
|
|
712
|
+
PrintNestedMessages(message_descriptor, qualified_name + ".", to_register);
|
|
713
|
+
map<string, string> m;
|
|
714
|
+
m["descriptor_key"] = kDescriptorKey;
|
|
715
|
+
m["descriptor_name"] = ModuleLevelDescriptorName(message_descriptor);
|
|
716
|
+
printer_->Print(m, "$descriptor_key$ = $descriptor_name$,\n");
|
|
717
|
+
printer_->Print("__module__ = '$module_name$'\n",
|
|
718
|
+
"module_name", ModuleName(file_->name()));
|
|
719
|
+
printer_->Print("# @@protoc_insertion_point(class_scope:$full_name$)\n",
|
|
720
|
+
"full_name", message_descriptor.full_name());
|
|
721
|
+
printer_->Print("))\n");
|
|
722
|
+
printer_->Outdent();
|
|
723
|
+
}
|
|
724
|
+
|
|
725
|
+
// Prints all nested messages within |containing_descriptor|.
|
|
726
|
+
// Mutually recursive with PrintMessage().
|
|
727
|
+
void Generator::PrintNestedMessages(const Descriptor& containing_descriptor,
|
|
728
|
+
const string& prefix,
|
|
729
|
+
vector<string>* to_register) const {
|
|
730
|
+
for (int i = 0; i < containing_descriptor.nested_type_count(); ++i) {
|
|
731
|
+
printer_->Print("\n");
|
|
732
|
+
PrintMessage(*containing_descriptor.nested_type(i), prefix, to_register);
|
|
733
|
+
printer_->Print(",\n");
|
|
734
|
+
}
|
|
735
|
+
}
|
|
736
|
+
|
|
737
|
+
// Recursively fixes foreign fields in all nested types in |descriptor|, then
|
|
738
|
+
// sets the message_type and enum_type of all message and enum fields to point
|
|
739
|
+
// to their respective descriptors.
|
|
740
|
+
// Args:
|
|
741
|
+
// descriptor: descriptor to print fields for.
|
|
742
|
+
// containing_descriptor: if descriptor is a nested type, this is its
|
|
743
|
+
// containing type, or NULL if this is a root/top-level type.
|
|
744
|
+
void Generator::FixForeignFieldsInDescriptor(
|
|
745
|
+
const Descriptor& descriptor,
|
|
746
|
+
const Descriptor* containing_descriptor) const {
|
|
747
|
+
for (int i = 0; i < descriptor.nested_type_count(); ++i) {
|
|
748
|
+
FixForeignFieldsInDescriptor(*descriptor.nested_type(i), &descriptor);
|
|
749
|
+
}
|
|
750
|
+
|
|
751
|
+
for (int i = 0; i < descriptor.field_count(); ++i) {
|
|
752
|
+
const FieldDescriptor& field_descriptor = *descriptor.field(i);
|
|
753
|
+
FixForeignFieldsInField(&descriptor, field_descriptor, "fields_by_name");
|
|
754
|
+
}
|
|
755
|
+
|
|
756
|
+
FixContainingTypeInDescriptor(descriptor, containing_descriptor);
|
|
757
|
+
for (int i = 0; i < descriptor.enum_type_count(); ++i) {
|
|
758
|
+
const EnumDescriptor& enum_descriptor = *descriptor.enum_type(i);
|
|
759
|
+
FixContainingTypeInDescriptor(enum_descriptor, &descriptor);
|
|
760
|
+
}
|
|
761
|
+
for (int i = 0; i < descriptor.oneof_decl_count(); ++i) {
|
|
762
|
+
map<string, string> m;
|
|
763
|
+
const OneofDescriptor* oneof = descriptor.oneof_decl(i);
|
|
764
|
+
m["descriptor_name"] = ModuleLevelDescriptorName(descriptor);
|
|
765
|
+
m["oneof_name"] = oneof->name();
|
|
766
|
+
for (int j = 0; j < oneof->field_count(); ++j) {
|
|
767
|
+
m["field_name"] = oneof->field(j)->name();
|
|
768
|
+
printer_->Print(
|
|
769
|
+
m,
|
|
770
|
+
"$descriptor_name$.oneofs_by_name['$oneof_name$'].fields.append(\n"
|
|
771
|
+
" $descriptor_name$.fields_by_name['$field_name$'])\n");
|
|
772
|
+
printer_->Print(
|
|
773
|
+
m,
|
|
774
|
+
"$descriptor_name$.fields_by_name['$field_name$'].containing_oneof = "
|
|
775
|
+
"$descriptor_name$.oneofs_by_name['$oneof_name$']\n");
|
|
776
|
+
}
|
|
777
|
+
}
|
|
778
|
+
}
|
|
779
|
+
|
|
780
|
+
void Generator::AddMessageToFileDescriptor(const Descriptor& descriptor) const {
|
|
781
|
+
map<string, string> m;
|
|
782
|
+
m["descriptor_name"] = kDescriptorKey;
|
|
783
|
+
m["message_name"] = descriptor.name();
|
|
784
|
+
m["message_descriptor_name"] = ModuleLevelDescriptorName(descriptor);
|
|
785
|
+
const char file_descriptor_template[] =
|
|
786
|
+
"$descriptor_name$.message_types_by_name['$message_name$'] = "
|
|
787
|
+
"$message_descriptor_name$\n";
|
|
788
|
+
printer_->Print(m, file_descriptor_template);
|
|
789
|
+
}
|
|
790
|
+
|
|
791
|
+
void Generator::AddEnumToFileDescriptor(
|
|
792
|
+
const EnumDescriptor& descriptor) const {
|
|
793
|
+
map<string, string> m;
|
|
794
|
+
m["descriptor_name"] = kDescriptorKey;
|
|
795
|
+
m["enum_name"] = descriptor.name();
|
|
796
|
+
m["enum_descriptor_name"] = ModuleLevelDescriptorName(descriptor);
|
|
797
|
+
const char file_descriptor_template[] =
|
|
798
|
+
"$descriptor_name$.enum_types_by_name['$enum_name$'] = "
|
|
799
|
+
"$enum_descriptor_name$\n";
|
|
800
|
+
printer_->Print(m, file_descriptor_template);
|
|
801
|
+
}
|
|
802
|
+
|
|
803
|
+
void Generator::AddExtensionToFileDescriptor(
|
|
804
|
+
const FieldDescriptor& descriptor) const {
|
|
805
|
+
map<string, string> m;
|
|
806
|
+
m["descriptor_name"] = kDescriptorKey;
|
|
807
|
+
m["field_name"] = descriptor.name();
|
|
808
|
+
const char file_descriptor_template[] =
|
|
809
|
+
"$descriptor_name$.extensions_by_name['$field_name$'] = "
|
|
810
|
+
"$field_name$\n";
|
|
811
|
+
printer_->Print(m, file_descriptor_template);
|
|
812
|
+
}
|
|
813
|
+
|
|
814
|
+
// Sets any necessary message_type and enum_type attributes
|
|
815
|
+
// for the Python version of |field|.
|
|
816
|
+
//
|
|
817
|
+
// containing_type may be NULL, in which case this is a module-level field.
|
|
818
|
+
//
|
|
819
|
+
// python_dict_name is the name of the Python dict where we should
|
|
820
|
+
// look the field up in the containing type. (e.g., fields_by_name
|
|
821
|
+
// or extensions_by_name). We ignore python_dict_name if containing_type
|
|
822
|
+
// is NULL.
|
|
823
|
+
void Generator::FixForeignFieldsInField(const Descriptor* containing_type,
|
|
824
|
+
const FieldDescriptor& field,
|
|
825
|
+
const string& python_dict_name) const {
|
|
826
|
+
const string field_referencing_expression = FieldReferencingExpression(
|
|
827
|
+
containing_type, field, python_dict_name);
|
|
828
|
+
map<string, string> m;
|
|
829
|
+
m["field_ref"] = field_referencing_expression;
|
|
830
|
+
const Descriptor* foreign_message_type = field.message_type();
|
|
831
|
+
if (foreign_message_type) {
|
|
832
|
+
m["foreign_type"] = ModuleLevelDescriptorName(*foreign_message_type);
|
|
833
|
+
printer_->Print(m, "$field_ref$.message_type = $foreign_type$\n");
|
|
834
|
+
}
|
|
835
|
+
const EnumDescriptor* enum_type = field.enum_type();
|
|
836
|
+
if (enum_type) {
|
|
837
|
+
m["enum_type"] = ModuleLevelDescriptorName(*enum_type);
|
|
838
|
+
printer_->Print(m, "$field_ref$.enum_type = $enum_type$\n");
|
|
839
|
+
}
|
|
840
|
+
}
|
|
841
|
+
|
|
842
|
+
// Returns the module-level expression for the given FieldDescriptor.
|
|
843
|
+
// Only works for fields in the .proto file this Generator is generating for.
|
|
844
|
+
//
|
|
845
|
+
// containing_type may be NULL, in which case this is a module-level field.
|
|
846
|
+
//
|
|
847
|
+
// python_dict_name is the name of the Python dict where we should
|
|
848
|
+
// look the field up in the containing type. (e.g., fields_by_name
|
|
849
|
+
// or extensions_by_name). We ignore python_dict_name if containing_type
|
|
850
|
+
// is NULL.
|
|
851
|
+
string Generator::FieldReferencingExpression(
|
|
852
|
+
const Descriptor* containing_type,
|
|
853
|
+
const FieldDescriptor& field,
|
|
854
|
+
const string& python_dict_name) const {
|
|
855
|
+
// We should only ever be looking up fields in the current file.
|
|
856
|
+
// The only things we refer to from other files are message descriptors.
|
|
857
|
+
GOOGLE_CHECK_EQ(field.file(), file_) << field.file()->name() << " vs. "
|
|
858
|
+
<< file_->name();
|
|
859
|
+
if (!containing_type) {
|
|
860
|
+
return field.name();
|
|
861
|
+
}
|
|
862
|
+
return strings::Substitute(
|
|
863
|
+
"$0.$1['$2']",
|
|
864
|
+
ModuleLevelDescriptorName(*containing_type),
|
|
865
|
+
python_dict_name, field.name());
|
|
866
|
+
}
|
|
867
|
+
|
|
868
|
+
// Prints containing_type for nested descriptors or enum descriptors.
|
|
869
|
+
template <typename DescriptorT>
|
|
870
|
+
void Generator::FixContainingTypeInDescriptor(
|
|
871
|
+
const DescriptorT& descriptor,
|
|
872
|
+
const Descriptor* containing_descriptor) const {
|
|
873
|
+
if (containing_descriptor != NULL) {
|
|
874
|
+
const string nested_name = ModuleLevelDescriptorName(descriptor);
|
|
875
|
+
const string parent_name = ModuleLevelDescriptorName(
|
|
876
|
+
*containing_descriptor);
|
|
877
|
+
printer_->Print(
|
|
878
|
+
"$nested_name$.containing_type = $parent_name$\n",
|
|
879
|
+
"nested_name", nested_name,
|
|
880
|
+
"parent_name", parent_name);
|
|
881
|
+
}
|
|
882
|
+
}
|
|
883
|
+
|
|
884
|
+
// Prints statements setting the message_type and enum_type fields in the
|
|
885
|
+
// Python descriptor objects we've already output in ths file. We must
|
|
886
|
+
// do this in a separate step due to circular references (otherwise, we'd
|
|
887
|
+
// just set everything in the initial assignment statements).
|
|
888
|
+
void Generator::FixForeignFieldsInDescriptors() const {
|
|
889
|
+
for (int i = 0; i < file_->message_type_count(); ++i) {
|
|
890
|
+
FixForeignFieldsInDescriptor(*file_->message_type(i), NULL);
|
|
891
|
+
}
|
|
892
|
+
for (int i = 0; i < file_->message_type_count(); ++i) {
|
|
893
|
+
AddMessageToFileDescriptor(*file_->message_type(i));
|
|
894
|
+
}
|
|
895
|
+
for (int i = 0; i < file_->enum_type_count(); ++i) {
|
|
896
|
+
AddEnumToFileDescriptor(*file_->enum_type(i));
|
|
897
|
+
}
|
|
898
|
+
for (int i = 0; i < file_->extension_count(); ++i) {
|
|
899
|
+
AddExtensionToFileDescriptor(*file_->extension(i));
|
|
900
|
+
}
|
|
901
|
+
printer_->Print("\n");
|
|
902
|
+
}
|
|
903
|
+
|
|
904
|
+
// We need to not only set any necessary message_type fields, but
|
|
905
|
+
// also need to call RegisterExtension() on each message we're
|
|
906
|
+
// extending.
|
|
907
|
+
void Generator::FixForeignFieldsInExtensions() const {
|
|
908
|
+
// Top-level extensions.
|
|
909
|
+
for (int i = 0; i < file_->extension_count(); ++i) {
|
|
910
|
+
FixForeignFieldsInExtension(*file_->extension(i));
|
|
911
|
+
}
|
|
912
|
+
// Nested extensions.
|
|
913
|
+
for (int i = 0; i < file_->message_type_count(); ++i) {
|
|
914
|
+
FixForeignFieldsInNestedExtensions(*file_->message_type(i));
|
|
915
|
+
}
|
|
916
|
+
printer_->Print("\n");
|
|
917
|
+
}
|
|
918
|
+
|
|
919
|
+
void Generator::FixForeignFieldsInExtension(
|
|
920
|
+
const FieldDescriptor& extension_field) const {
|
|
921
|
+
GOOGLE_CHECK(extension_field.is_extension());
|
|
922
|
+
// extension_scope() will be NULL for top-level extensions, which is
|
|
923
|
+
// exactly what FixForeignFieldsInField() wants.
|
|
924
|
+
FixForeignFieldsInField(extension_field.extension_scope(), extension_field,
|
|
925
|
+
"extensions_by_name");
|
|
926
|
+
|
|
927
|
+
map<string, string> m;
|
|
928
|
+
// Confusingly, for FieldDescriptors that happen to be extensions,
|
|
929
|
+
// containing_type() means "extended type."
|
|
930
|
+
// On the other hand, extension_scope() will give us what we normally
|
|
931
|
+
// mean by containing_type().
|
|
932
|
+
m["extended_message_class"] = ModuleLevelMessageName(
|
|
933
|
+
*extension_field.containing_type());
|
|
934
|
+
m["field"] = FieldReferencingExpression(extension_field.extension_scope(),
|
|
935
|
+
extension_field,
|
|
936
|
+
"extensions_by_name");
|
|
937
|
+
printer_->Print(m, "$extended_message_class$.RegisterExtension($field$)\n");
|
|
938
|
+
}
|
|
939
|
+
|
|
940
|
+
void Generator::FixForeignFieldsInNestedExtensions(
|
|
941
|
+
const Descriptor& descriptor) const {
|
|
942
|
+
// Recursively fix up extensions in all nested types.
|
|
943
|
+
for (int i = 0; i < descriptor.nested_type_count(); ++i) {
|
|
944
|
+
FixForeignFieldsInNestedExtensions(*descriptor.nested_type(i));
|
|
945
|
+
}
|
|
946
|
+
// Fix up extensions directly contained within this type.
|
|
947
|
+
for (int i = 0; i < descriptor.extension_count(); ++i) {
|
|
948
|
+
FixForeignFieldsInExtension(*descriptor.extension(i));
|
|
949
|
+
}
|
|
950
|
+
}
|
|
951
|
+
|
|
952
|
+
// Returns a Python expression that instantiates a Python EnumValueDescriptor
|
|
953
|
+
// object for the given C++ descriptor.
|
|
954
|
+
void Generator::PrintEnumValueDescriptor(
|
|
955
|
+
const EnumValueDescriptor& descriptor) const {
|
|
956
|
+
// TODO(robinson): Fix up EnumValueDescriptor "type" fields.
|
|
957
|
+
// More circular references. ::sigh::
|
|
958
|
+
string options_string;
|
|
959
|
+
descriptor.options().SerializeToString(&options_string);
|
|
960
|
+
map<string, string> m;
|
|
961
|
+
m["name"] = descriptor.name();
|
|
962
|
+
m["index"] = SimpleItoa(descriptor.index());
|
|
963
|
+
m["number"] = SimpleItoa(descriptor.number());
|
|
964
|
+
m["options"] = OptionsValue("EnumValueOptions", options_string);
|
|
965
|
+
printer_->Print(
|
|
966
|
+
m,
|
|
967
|
+
"_descriptor.EnumValueDescriptor(\n"
|
|
968
|
+
" name='$name$', index=$index$, number=$number$,\n"
|
|
969
|
+
" options=$options$,\n"
|
|
970
|
+
" type=None)");
|
|
971
|
+
}
|
|
972
|
+
|
|
973
|
+
// Returns a Python expression that calls descriptor._ParseOptions using
|
|
974
|
+
// the given descriptor class name and serialized options protobuf string.
|
|
975
|
+
string Generator::OptionsValue(
|
|
976
|
+
const string& class_name, const string& serialized_options) const {
|
|
977
|
+
if (serialized_options.length() == 0 || GeneratingDescriptorProto()) {
|
|
978
|
+
return "None";
|
|
979
|
+
} else {
|
|
980
|
+
string full_class_name = "descriptor_pb2." + class_name;
|
|
981
|
+
//##!PY25 return "_descriptor._ParseOptions(" + full_class_name + "(), b'"
|
|
982
|
+
//##!PY25 + CEscape(serialized_options)+ "')";
|
|
983
|
+
return "_descriptor._ParseOptions(" + full_class_name + "(), _b('" //##PY25
|
|
984
|
+
+ CEscape(serialized_options)+ "'))"; //##PY25
|
|
985
|
+
}
|
|
986
|
+
}
|
|
987
|
+
|
|
988
|
+
// Prints an expression for a Python FieldDescriptor for |field|.
|
|
989
|
+
void Generator::PrintFieldDescriptor(
|
|
990
|
+
const FieldDescriptor& field, bool is_extension) const {
|
|
991
|
+
string options_string;
|
|
992
|
+
field.options().SerializeToString(&options_string);
|
|
993
|
+
map<string, string> m;
|
|
994
|
+
m["name"] = field.name();
|
|
995
|
+
m["full_name"] = field.full_name();
|
|
996
|
+
m["index"] = SimpleItoa(field.index());
|
|
997
|
+
m["number"] = SimpleItoa(field.number());
|
|
998
|
+
m["type"] = SimpleItoa(field.type());
|
|
999
|
+
m["cpp_type"] = SimpleItoa(field.cpp_type());
|
|
1000
|
+
m["label"] = SimpleItoa(field.label());
|
|
1001
|
+
m["has_default_value"] = field.has_default_value() ? "True" : "False";
|
|
1002
|
+
m["default_value"] = StringifyDefaultValue(field);
|
|
1003
|
+
m["is_extension"] = is_extension ? "True" : "False";
|
|
1004
|
+
m["options"] = OptionsValue("FieldOptions", options_string);
|
|
1005
|
+
// We always set message_type and enum_type to None at this point, and then
|
|
1006
|
+
// these fields in correctly after all referenced descriptors have been
|
|
1007
|
+
// defined and/or imported (see FixForeignFieldsInDescriptors()).
|
|
1008
|
+
const char field_descriptor_decl[] =
|
|
1009
|
+
"_descriptor.FieldDescriptor(\n"
|
|
1010
|
+
" name='$name$', full_name='$full_name$', index=$index$,\n"
|
|
1011
|
+
" number=$number$, type=$type$, cpp_type=$cpp_type$, label=$label$,\n"
|
|
1012
|
+
" has_default_value=$has_default_value$, default_value=$default_value$,\n"
|
|
1013
|
+
" message_type=None, enum_type=None, containing_type=None,\n"
|
|
1014
|
+
" is_extension=$is_extension$, extension_scope=None,\n"
|
|
1015
|
+
" options=$options$)";
|
|
1016
|
+
printer_->Print(m, field_descriptor_decl);
|
|
1017
|
+
}
|
|
1018
|
+
|
|
1019
|
+
// Helper for Print{Fields,Extensions}InDescriptor().
|
|
1020
|
+
void Generator::PrintFieldDescriptorsInDescriptor(
|
|
1021
|
+
const Descriptor& message_descriptor,
|
|
1022
|
+
bool is_extension,
|
|
1023
|
+
const string& list_variable_name,
|
|
1024
|
+
int (Descriptor::*CountFn)() const,
|
|
1025
|
+
const FieldDescriptor* (Descriptor::*GetterFn)(int) const) const {
|
|
1026
|
+
printer_->Print("$list$=[\n", "list", list_variable_name);
|
|
1027
|
+
printer_->Indent();
|
|
1028
|
+
for (int i = 0; i < (message_descriptor.*CountFn)(); ++i) {
|
|
1029
|
+
PrintFieldDescriptor(*(message_descriptor.*GetterFn)(i),
|
|
1030
|
+
is_extension);
|
|
1031
|
+
printer_->Print(",\n");
|
|
1032
|
+
}
|
|
1033
|
+
printer_->Outdent();
|
|
1034
|
+
printer_->Print("],\n");
|
|
1035
|
+
}
|
|
1036
|
+
|
|
1037
|
+
// Prints a statement assigning "fields" to a list of Python FieldDescriptors,
|
|
1038
|
+
// one for each field present in message_descriptor.
|
|
1039
|
+
void Generator::PrintFieldsInDescriptor(
|
|
1040
|
+
const Descriptor& message_descriptor) const {
|
|
1041
|
+
const bool is_extension = false;
|
|
1042
|
+
PrintFieldDescriptorsInDescriptor(
|
|
1043
|
+
message_descriptor, is_extension, "fields",
|
|
1044
|
+
&Descriptor::field_count, &Descriptor::field);
|
|
1045
|
+
}
|
|
1046
|
+
|
|
1047
|
+
// Prints a statement assigning "extensions" to a list of Python
|
|
1048
|
+
// FieldDescriptors, one for each extension present in message_descriptor.
|
|
1049
|
+
void Generator::PrintExtensionsInDescriptor(
|
|
1050
|
+
const Descriptor& message_descriptor) const {
|
|
1051
|
+
const bool is_extension = true;
|
|
1052
|
+
PrintFieldDescriptorsInDescriptor(
|
|
1053
|
+
message_descriptor, is_extension, "extensions",
|
|
1054
|
+
&Descriptor::extension_count, &Descriptor::extension);
|
|
1055
|
+
}
|
|
1056
|
+
|
|
1057
|
+
bool Generator::GeneratingDescriptorProto() const {
|
|
1058
|
+
return file_->name() == "google/protobuf/descriptor.proto";
|
|
1059
|
+
}
|
|
1060
|
+
|
|
1061
|
+
// Returns the unique Python module-level identifier given to a descriptor.
|
|
1062
|
+
// This name is module-qualified iff the given descriptor describes an
|
|
1063
|
+
// entity that doesn't come from the current file.
|
|
1064
|
+
template <typename DescriptorT>
|
|
1065
|
+
string Generator::ModuleLevelDescriptorName(
|
|
1066
|
+
const DescriptorT& descriptor) const {
|
|
1067
|
+
// FIXME(robinson):
|
|
1068
|
+
// We currently don't worry about collisions with underscores in the type
|
|
1069
|
+
// names, so these would collide in nasty ways if found in the same file:
|
|
1070
|
+
// OuterProto.ProtoA.ProtoB
|
|
1071
|
+
// OuterProto_ProtoA.ProtoB # Underscore instead of period.
|
|
1072
|
+
// As would these:
|
|
1073
|
+
// OuterProto.ProtoA_.ProtoB
|
|
1074
|
+
// OuterProto.ProtoA._ProtoB # Leading vs. trailing underscore.
|
|
1075
|
+
// (Contrived, but certainly possible).
|
|
1076
|
+
//
|
|
1077
|
+
// The C++ implementation doesn't guard against this either. Leaving
|
|
1078
|
+
// it for now...
|
|
1079
|
+
string name = NamePrefixedWithNestedTypes(descriptor, "_");
|
|
1080
|
+
UpperString(&name);
|
|
1081
|
+
// Module-private for now. Easy to make public later; almost impossible
|
|
1082
|
+
// to make private later.
|
|
1083
|
+
name = "_" + name;
|
|
1084
|
+
// We now have the name relative to its own module. Also qualify with
|
|
1085
|
+
// the module name iff this descriptor is from a different .proto file.
|
|
1086
|
+
if (descriptor.file() != file_) {
|
|
1087
|
+
name = ModuleName(descriptor.file()->name()) + "." + name;
|
|
1088
|
+
}
|
|
1089
|
+
return name;
|
|
1090
|
+
}
|
|
1091
|
+
|
|
1092
|
+
// Returns the name of the message class itself, not the descriptor.
|
|
1093
|
+
// Like ModuleLevelDescriptorName(), module-qualifies the name iff
|
|
1094
|
+
// the given descriptor describes an entity that doesn't come from
|
|
1095
|
+
// the current file.
|
|
1096
|
+
string Generator::ModuleLevelMessageName(const Descriptor& descriptor) const {
|
|
1097
|
+
string name = NamePrefixedWithNestedTypes(descriptor, ".");
|
|
1098
|
+
if (descriptor.file() != file_) {
|
|
1099
|
+
name = ModuleName(descriptor.file()->name()) + "." + name;
|
|
1100
|
+
}
|
|
1101
|
+
return name;
|
|
1102
|
+
}
|
|
1103
|
+
|
|
1104
|
+
// Returns the unique Python module-level identifier given to a service
|
|
1105
|
+
// descriptor.
|
|
1106
|
+
string Generator::ModuleLevelServiceDescriptorName(
|
|
1107
|
+
const ServiceDescriptor& descriptor) const {
|
|
1108
|
+
string name = descriptor.name();
|
|
1109
|
+
UpperString(&name);
|
|
1110
|
+
name = "_" + name;
|
|
1111
|
+
if (descriptor.file() != file_) {
|
|
1112
|
+
name = ModuleName(descriptor.file()->name()) + "." + name;
|
|
1113
|
+
}
|
|
1114
|
+
return name;
|
|
1115
|
+
}
|
|
1116
|
+
|
|
1117
|
+
// Prints standard constructor arguments serialized_start and serialized_end.
|
|
1118
|
+
// Args:
|
|
1119
|
+
// descriptor: The cpp descriptor to have a serialized reference.
|
|
1120
|
+
// proto: A proto
|
|
1121
|
+
// Example printer output:
|
|
1122
|
+
// serialized_start=41,
|
|
1123
|
+
// serialized_end=43,
|
|
1124
|
+
//
|
|
1125
|
+
template <typename DescriptorT, typename DescriptorProtoT>
|
|
1126
|
+
void Generator::PrintSerializedPbInterval(
|
|
1127
|
+
const DescriptorT& descriptor, DescriptorProtoT& proto) const {
|
|
1128
|
+
descriptor.CopyTo(&proto);
|
|
1129
|
+
string sp;
|
|
1130
|
+
proto.SerializeToString(&sp);
|
|
1131
|
+
int offset = file_descriptor_serialized_.find(sp);
|
|
1132
|
+
GOOGLE_CHECK_GE(offset, 0);
|
|
1133
|
+
|
|
1134
|
+
printer_->Print("serialized_start=$serialized_start$,\n"
|
|
1135
|
+
"serialized_end=$serialized_end$,\n",
|
|
1136
|
+
"serialized_start", SimpleItoa(offset),
|
|
1137
|
+
"serialized_end", SimpleItoa(offset + sp.size()));
|
|
1138
|
+
}
|
|
1139
|
+
|
|
1140
|
+
namespace {
|
|
1141
|
+
void PrintDescriptorOptionsFixingCode(const string& descriptor,
|
|
1142
|
+
const string& options,
|
|
1143
|
+
io::Printer* printer) {
|
|
1144
|
+
// TODO(xiaofeng): I have added a method _SetOptions() to DescriptorBase
|
|
1145
|
+
// in proto2 python runtime but it couldn't be used here because appengine
|
|
1146
|
+
// uses a snapshot version of the library in which the new method is not
|
|
1147
|
+
// yet present. After appengine has synced their runtime library, the code
|
|
1148
|
+
// below should be cleaned up to use _SetOptions().
|
|
1149
|
+
printer->Print(
|
|
1150
|
+
"$descriptor$.has_options = True\n"
|
|
1151
|
+
"$descriptor$._options = $options$\n",
|
|
1152
|
+
"descriptor", descriptor, "options", options);
|
|
1153
|
+
}
|
|
1154
|
+
} // namespace
|
|
1155
|
+
|
|
1156
|
+
// Prints expressions that set the options field of all descriptors.
|
|
1157
|
+
void Generator::FixAllDescriptorOptions() const {
|
|
1158
|
+
// Prints an expression that sets the file descriptor's options.
|
|
1159
|
+
string file_options = OptionsValue(
|
|
1160
|
+
"FileOptions", file_->options().SerializeAsString());
|
|
1161
|
+
if (file_options != "None") {
|
|
1162
|
+
PrintDescriptorOptionsFixingCode(kDescriptorKey, file_options, printer_);
|
|
1163
|
+
}
|
|
1164
|
+
// Prints expressions that set the options for all top level enums.
|
|
1165
|
+
for (int i = 0; i < file_->enum_type_count(); ++i) {
|
|
1166
|
+
const EnumDescriptor& enum_descriptor = *file_->enum_type(i);
|
|
1167
|
+
FixOptionsForEnum(enum_descriptor);
|
|
1168
|
+
}
|
|
1169
|
+
// Prints expressions that set the options for all top level extensions.
|
|
1170
|
+
for (int i = 0; i < file_->extension_count(); ++i) {
|
|
1171
|
+
const FieldDescriptor& field = *file_->extension(i);
|
|
1172
|
+
FixOptionsForField(field);
|
|
1173
|
+
}
|
|
1174
|
+
// Prints expressions that set the options for all messages, nested enums,
|
|
1175
|
+
// nested extensions and message fields.
|
|
1176
|
+
for (int i = 0; i < file_->message_type_count(); ++i) {
|
|
1177
|
+
FixOptionsForMessage(*file_->message_type(i));
|
|
1178
|
+
}
|
|
1179
|
+
}
|
|
1180
|
+
|
|
1181
|
+
// Prints expressions that set the options for an enum descriptor and its
|
|
1182
|
+
// value descriptors.
|
|
1183
|
+
void Generator::FixOptionsForEnum(const EnumDescriptor& enum_descriptor) const {
|
|
1184
|
+
string descriptor_name = ModuleLevelDescriptorName(enum_descriptor);
|
|
1185
|
+
string enum_options = OptionsValue(
|
|
1186
|
+
"EnumOptions", enum_descriptor.options().SerializeAsString());
|
|
1187
|
+
if (enum_options != "None") {
|
|
1188
|
+
PrintDescriptorOptionsFixingCode(descriptor_name, enum_options, printer_);
|
|
1189
|
+
}
|
|
1190
|
+
for (int i = 0; i < enum_descriptor.value_count(); ++i) {
|
|
1191
|
+
const EnumValueDescriptor& value_descriptor = *enum_descriptor.value(i);
|
|
1192
|
+
string value_options = OptionsValue(
|
|
1193
|
+
"EnumValueOptions", value_descriptor.options().SerializeAsString());
|
|
1194
|
+
if (value_options != "None") {
|
|
1195
|
+
PrintDescriptorOptionsFixingCode(
|
|
1196
|
+
StringPrintf("%s.values_by_name[\"%s\"]", descriptor_name.c_str(),
|
|
1197
|
+
value_descriptor.name().c_str()),
|
|
1198
|
+
value_options, printer_);
|
|
1199
|
+
}
|
|
1200
|
+
}
|
|
1201
|
+
}
|
|
1202
|
+
|
|
1203
|
+
// Prints expressions that set the options for field descriptors (including
|
|
1204
|
+
// extensions).
|
|
1205
|
+
void Generator::FixOptionsForField(
|
|
1206
|
+
const FieldDescriptor& field) const {
|
|
1207
|
+
string field_options = OptionsValue(
|
|
1208
|
+
"FieldOptions", field.options().SerializeAsString());
|
|
1209
|
+
if (field_options != "None") {
|
|
1210
|
+
string field_name;
|
|
1211
|
+
if (field.is_extension()) {
|
|
1212
|
+
if (field.extension_scope() == NULL) {
|
|
1213
|
+
// Top level extensions.
|
|
1214
|
+
field_name = field.name();
|
|
1215
|
+
} else {
|
|
1216
|
+
field_name = FieldReferencingExpression(
|
|
1217
|
+
field.extension_scope(), field, "extensions_by_name");
|
|
1218
|
+
}
|
|
1219
|
+
} else {
|
|
1220
|
+
field_name = FieldReferencingExpression(
|
|
1221
|
+
field.containing_type(), field, "fields_by_name");
|
|
1222
|
+
}
|
|
1223
|
+
PrintDescriptorOptionsFixingCode(field_name, field_options, printer_);
|
|
1224
|
+
}
|
|
1225
|
+
}
|
|
1226
|
+
|
|
1227
|
+
// Prints expressions that set the options for a message and all its inner
|
|
1228
|
+
// types (nested messages, nested enums, extensions, fields).
|
|
1229
|
+
void Generator::FixOptionsForMessage(const Descriptor& descriptor) const {
|
|
1230
|
+
// Nested messages.
|
|
1231
|
+
for (int i = 0; i < descriptor.nested_type_count(); ++i) {
|
|
1232
|
+
FixOptionsForMessage(*descriptor.nested_type(i));
|
|
1233
|
+
}
|
|
1234
|
+
// Enums.
|
|
1235
|
+
for (int i = 0; i < descriptor.enum_type_count(); ++i) {
|
|
1236
|
+
FixOptionsForEnum(*descriptor.enum_type(i));
|
|
1237
|
+
}
|
|
1238
|
+
// Fields.
|
|
1239
|
+
for (int i = 0; i < descriptor.field_count(); ++i) {
|
|
1240
|
+
const FieldDescriptor& field = *descriptor.field(i);
|
|
1241
|
+
FixOptionsForField(field);
|
|
1242
|
+
}
|
|
1243
|
+
// Extensions.
|
|
1244
|
+
for (int i = 0; i < descriptor.extension_count(); ++i) {
|
|
1245
|
+
const FieldDescriptor& field = *descriptor.extension(i);
|
|
1246
|
+
FixOptionsForField(field);
|
|
1247
|
+
}
|
|
1248
|
+
// Message option for this message.
|
|
1249
|
+
string message_options = OptionsValue(
|
|
1250
|
+
"MessageOptions", descriptor.options().SerializeAsString());
|
|
1251
|
+
if (message_options != "None") {
|
|
1252
|
+
string descriptor_name = ModuleLevelDescriptorName(descriptor);
|
|
1253
|
+
PrintDescriptorOptionsFixingCode(descriptor_name,
|
|
1254
|
+
message_options,
|
|
1255
|
+
printer_);
|
|
1256
|
+
}
|
|
1257
|
+
}
|
|
1258
|
+
|
|
1259
|
+
} // namespace python
|
|
1260
|
+
} // namespace compiler
|
|
1261
|
+
} // namespace protobuf
|
|
1262
|
+
} // namespace google
|