Merge pull request #6298 from TeBoring/3.9.x-merge

Merge master into 3.9.x
pull/6300/head v3.9.0-rc1
Paul Yang 6 years ago committed by GitHub
commit 3f33753f0f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 103
      BUILD
  2. 1
      Makefile.am
  3. 8
      conformance/binary_json_conformance_suite.cc
  4. 4
      conformance/failure_list_php.txt
  5. 2
      conformance/failure_list_php_c.txt
  6. 2
      conformance/failure_list_ruby.txt
  7. 2
      conformance/failure_list_ruby_mac.txt
  8. 4
      docs/options.md
  9. 10
      java/compatibility_tests/v2.5.0/test.sh
  10. 1
      java/lite/pom.xml
  11. 2
      kokoro/linux/dockerfile/release/ruby_rake_compiler/Dockerfile
  12. 41
      php/ext/google/protobuf/upb.c
  13. 2
      php/src/Google/Protobuf/Internal/DescriptorProto.php
  14. 2
      php/src/Google/Protobuf/Internal/DescriptorProto/ExtensionRange.php
  15. 2
      php/src/Google/Protobuf/Internal/DescriptorProto/ReservedRange.php
  16. 15
      php/src/Google/Protobuf/Internal/EnumDescriptor.php
  17. 2
      php/src/Google/Protobuf/Internal/EnumDescriptorProto.php
  18. 2
      php/src/Google/Protobuf/Internal/EnumDescriptorProto/EnumReservedRange.php
  19. 2
      php/src/Google/Protobuf/Internal/EnumOptions.php
  20. 2
      php/src/Google/Protobuf/Internal/EnumValueDescriptorProto.php
  21. 2
      php/src/Google/Protobuf/Internal/EnumValueOptions.php
  22. 2
      php/src/Google/Protobuf/Internal/ExtensionRangeOptions.php
  23. 2
      php/src/Google/Protobuf/Internal/FieldDescriptorProto.php
  24. 2
      php/src/Google/Protobuf/Internal/FieldOptions.php
  25. 2
      php/src/Google/Protobuf/Internal/FileDescriptorProto.php
  26. 2
      php/src/Google/Protobuf/Internal/FileDescriptorSet.php
  27. 2
      php/src/Google/Protobuf/Internal/FileOptions.php
  28. 26
      php/src/Google/Protobuf/Internal/GPBUtil.php
  29. 2
      php/src/Google/Protobuf/Internal/GeneratedCodeInfo.php
  30. 2
      php/src/Google/Protobuf/Internal/GeneratedCodeInfo/Annotation.php
  31. 2
      php/src/Google/Protobuf/Internal/MessageOptions.php
  32. 2
      php/src/Google/Protobuf/Internal/MethodDescriptorProto.php
  33. 2
      php/src/Google/Protobuf/Internal/MethodOptions.php
  34. 2
      php/src/Google/Protobuf/Internal/OneofDescriptorProto.php
  35. 2
      php/src/Google/Protobuf/Internal/OneofOptions.php
  36. 2
      php/src/Google/Protobuf/Internal/ServiceDescriptorProto.php
  37. 2
      php/src/Google/Protobuf/Internal/ServiceOptions.php
  38. 2
      php/src/Google/Protobuf/Internal/SourceCodeInfo.php
  39. 2
      php/src/Google/Protobuf/Internal/SourceCodeInfo/Location.php
  40. 2
      php/src/Google/Protobuf/Internal/UninterpretedOption.php
  41. 2
      php/src/Google/Protobuf/Internal/UninterpretedOption/NamePart.php
  42. 11
      php/tests/proto/test_wrapper_type_setters.proto
  43. 142
      php/tests/wrapper_type_setters_test.php
  44. 41
      ruby/ext/google/protobuf_c/upb.c
  45. 12
      ruby/tests/common_tests.rb
  46. 22
      src/google/protobuf/compiler/csharp/csharp_bootstrap_unittest.cc
  47. 67
      src/google/protobuf/compiler/objectivec/objectivec_file.cc
  48. 6
      src/google/protobuf/compiler/objectivec/objectivec_file.h
  49. 127
      src/google/protobuf/compiler/objectivec/objectivec_message.cc
  50. 8
      src/google/protobuf/compiler/objectivec/objectivec_message.h
  51. 72
      src/google/protobuf/compiler/php/php_generator.cc

103
BUILD

@ -219,7 +219,7 @@ cc_library(
# TODO(keveman): Remove this target once the support gets added to Bazel. # TODO(keveman): Remove this target once the support gets added to Bazel.
cc_library( cc_library(
name = "protobuf_headers", name = "protobuf_headers",
hdrs = glob(["src/**/*.h"]), hdrs = glob(["src/**/*.h", "src/**/*.inc"]),
includes = ["src/"], includes = ["src/"],
visibility = ["//visibility:public"], visibility = ["//visibility:public"],
) )
@ -647,6 +647,107 @@ java_library(
visibility = ["//visibility:public"], visibility = ["//visibility:public"],
) )
java_library(
name = "protobuf_javalite",
srcs = [
# Keep in sync with java/lite/pom.xml
"java/core/src/main/java/com/google/protobuf/AbstractMessageLite.java",
"java/core/src/main/java/com/google/protobuf/AbstractParser.java",
"java/core/src/main/java/com/google/protobuf/AbstractProtobufList.java",
"java/core/src/main/java/com/google/protobuf/AllocatedBuffer.java",
"java/core/src/main/java/com/google/protobuf/Android.java",
"java/core/src/main/java/com/google/protobuf/ArrayDecoders.java",
"java/core/src/main/java/com/google/protobuf/BinaryReader.java",
"java/core/src/main/java/com/google/protobuf/BinaryWriter.java",
"java/core/src/main/java/com/google/protobuf/BooleanArrayList.java",
"java/core/src/main/java/com/google/protobuf/BufferAllocator.java",
"java/core/src/main/java/com/google/protobuf/ByteBufferWriter.java",
"java/core/src/main/java/com/google/protobuf/ByteOutput.java",
"java/core/src/main/java/com/google/protobuf/ByteString.java",
"java/core/src/main/java/com/google/protobuf/CodedInputStream.java",
"java/core/src/main/java/com/google/protobuf/CodedInputStreamReader.java",
"java/core/src/main/java/com/google/protobuf/CodedOutputStream.java",
"java/core/src/main/java/com/google/protobuf/CodedOutputStreamWriter.java",
"java/core/src/main/java/com/google/protobuf/DoubleArrayList.java",
"java/core/src/main/java/com/google/protobuf/ExperimentalApi.java",
"java/core/src/main/java/com/google/protobuf/ExtensionLite.java",
"java/core/src/main/java/com/google/protobuf/ExtensionRegistryFactory.java",
"java/core/src/main/java/com/google/protobuf/ExtensionRegistryLite.java",
"java/core/src/main/java/com/google/protobuf/ExtensionSchema.java",
"java/core/src/main/java/com/google/protobuf/ExtensionSchemaLite.java",
"java/core/src/main/java/com/google/protobuf/ExtensionSchemas.java",
"java/core/src/main/java/com/google/protobuf/FieldInfo.java",
"java/core/src/main/java/com/google/protobuf/FieldSet.java",
"java/core/src/main/java/com/google/protobuf/FieldType.java",
"java/core/src/main/java/com/google/protobuf/FloatArrayList.java",
"java/core/src/main/java/com/google/protobuf/GeneratedMessageInfoFactory.java",
"java/core/src/main/java/com/google/protobuf/GeneratedMessageLite.java",
"java/core/src/main/java/com/google/protobuf/IntArrayList.java",
"java/core/src/main/java/com/google/protobuf/Internal.java",
"java/core/src/main/java/com/google/protobuf/InvalidProtocolBufferException.java",
"java/core/src/main/java/com/google/protobuf/IterableByteBufferInputStream.java",
"java/core/src/main/java/com/google/protobuf/JavaType.java",
"java/core/src/main/java/com/google/protobuf/LazyField.java",
"java/core/src/main/java/com/google/protobuf/LazyFieldLite.java",
"java/core/src/main/java/com/google/protobuf/LazyStringArrayList.java",
"java/core/src/main/java/com/google/protobuf/LazyStringList.java",
"java/core/src/main/java/com/google/protobuf/ListFieldSchema.java",
"java/core/src/main/java/com/google/protobuf/LongArrayList.java",
"java/core/src/main/java/com/google/protobuf/ManifestSchemaFactory.java",
"java/core/src/main/java/com/google/protobuf/MapEntryLite.java",
"java/core/src/main/java/com/google/protobuf/MapFieldLite.java",
"java/core/src/main/java/com/google/protobuf/MapFieldSchema.java",
"java/core/src/main/java/com/google/protobuf/MapFieldSchemaLite.java",
"java/core/src/main/java/com/google/protobuf/MapFieldSchemas.java",
"java/core/src/main/java/com/google/protobuf/MessageInfo.java",
"java/core/src/main/java/com/google/protobuf/MessageInfoFactory.java",
"java/core/src/main/java/com/google/protobuf/MessageLite.java",
"java/core/src/main/java/com/google/protobuf/MessageLiteOrBuilder.java",
"java/core/src/main/java/com/google/protobuf/MessageLiteToString.java",
"java/core/src/main/java/com/google/protobuf/MessageSchema.java",
"java/core/src/main/java/com/google/protobuf/MessageSetSchema.java",
"java/core/src/main/java/com/google/protobuf/MutabilityOracle.java",
"java/core/src/main/java/com/google/protobuf/NewInstanceSchema.java",
"java/core/src/main/java/com/google/protobuf/NewInstanceSchemaLite.java",
"java/core/src/main/java/com/google/protobuf/NewInstanceSchemas.java",
"java/core/src/main/java/com/google/protobuf/NioByteString.java",
"java/core/src/main/java/com/google/protobuf/OneofInfo.java",
"java/core/src/main/java/com/google/protobuf/Parser.java",
"java/core/src/main/java/com/google/protobuf/PrimitiveNonBoxingCollection.java",
"java/core/src/main/java/com/google/protobuf/ProtoSyntax.java",
"java/core/src/main/java/com/google/protobuf/Protobuf.java",
"java/core/src/main/java/com/google/protobuf/ProtobufArrayList.java",
"java/core/src/main/java/com/google/protobuf/ProtobufLists.java",
"java/core/src/main/java/com/google/protobuf/ProtocolStringList.java",
"java/core/src/main/java/com/google/protobuf/RawMessageInfo.java",
"java/core/src/main/java/com/google/protobuf/Reader.java",
"java/core/src/main/java/com/google/protobuf/RopeByteString.java",
"java/core/src/main/java/com/google/protobuf/Schema.java",
"java/core/src/main/java/com/google/protobuf/SchemaFactory.java",
"java/core/src/main/java/com/google/protobuf/SchemaUtil.java",
"java/core/src/main/java/com/google/protobuf/SmallSortedMap.java",
"java/core/src/main/java/com/google/protobuf/StructuralMessageInfo.java",
"java/core/src/main/java/com/google/protobuf/TextFormatEscaper.java",
"java/core/src/main/java/com/google/protobuf/UninitializedMessageException.java",
"java/core/src/main/java/com/google/protobuf/UnknownFieldSchema.java",
"java/core/src/main/java/com/google/protobuf/UnknownFieldSetLite.java",
"java/core/src/main/java/com/google/protobuf/UnknownFieldSetLiteSchema.java",
"java/core/src/main/java/com/google/protobuf/UnmodifiableLazyStringList.java",
"java/core/src/main/java/com/google/protobuf/UnsafeUtil.java",
"java/core/src/main/java/com/google/protobuf/Utf8.java",
"java/core/src/main/java/com/google/protobuf/WireFormat.java",
"java/core/src/main/java/com/google/protobuf/Writer.java",
],
javacopts = select({
"//:jdk9": ["--add-modules=jdk.unsupported"],
"//conditions:default": [
"-source 7",
"-target 7",
],
}),
visibility = ["//visibility:public"],
)
java_library( java_library(
name = "protobuf_java_util", name = "protobuf_java_util",
srcs = glob([ srcs = glob([

@ -1230,6 +1230,7 @@ EXTRA_DIST = $(@DIST_LANG@_EXTRA_DIST) \
examples/pubspec.yaml \ examples/pubspec.yaml \
examples/third_party/zlib.BUILD \ examples/third_party/zlib.BUILD \
protobuf.bzl \ protobuf.bzl \
protobuf_deps.bzl \
python/release/wheel/build_wheel_manylinux.sh \ python/release/wheel/build_wheel_manylinux.sh \
python/release/wheel/Dockerfile \ python/release/wheel/Dockerfile \
python/release/wheel/protobuf_optimized_pip.sh \ python/release/wheel/protobuf_optimized_pip.sh \

@ -1980,12 +1980,12 @@ void BinaryAndJsonConformanceSuite::RunSuiteImpl() {
"repeated_timestamp: {seconds: 253402300799 nanos: 999999999}"); "repeated_timestamp: {seconds: 253402300799 nanos: 999999999}");
RunValidJsonTest( RunValidJsonTest(
"TimestampWithPositiveOffset", REQUIRED, "TimestampWithPositiveOffset", REQUIRED,
R"({"optionalTimestamp": "1970-01-01T08:00:00+08:00"})", R"({"optionalTimestamp": "1970-01-01T08:00:01+08:00"})",
"optional_timestamp: {seconds: 0}"); "optional_timestamp: {seconds: 1}");
RunValidJsonTest( RunValidJsonTest(
"TimestampWithNegativeOffset", REQUIRED, "TimestampWithNegativeOffset", REQUIRED,
R"({"optionalTimestamp": "1969-12-31T16:00:00-08:00"})", R"({"optionalTimestamp": "1969-12-31T16:00:01-08:00"})",
"optional_timestamp: {seconds: 0}"); "optional_timestamp: {seconds: 1}");
RunValidJsonTest( RunValidJsonTest(
"TimestampNull", REQUIRED, "TimestampNull", REQUIRED,
R"({"optionalTimestamp": null})", R"({"optionalTimestamp": null})",

@ -3,10 +3,6 @@ Recommended.FieldMaskPathsDontRoundTrip.JsonOutput
Recommended.FieldMaskTooManyUnderscore.JsonOutput Recommended.FieldMaskTooManyUnderscore.JsonOutput
Recommended.Proto3.JsonInput.BytesFieldBase64Url.JsonOutput Recommended.Proto3.JsonInput.BytesFieldBase64Url.JsonOutput
Recommended.Proto3.JsonInput.BytesFieldBase64Url.ProtobufOutput Recommended.Proto3.JsonInput.BytesFieldBase64Url.ProtobufOutput
Recommended.Proto3.JsonInput.DurationHas3FractionalDigits.Validator
Recommended.Proto3.JsonInput.DurationHas6FractionalDigits.Validator
Recommended.Proto3.JsonInput.DurationHas9FractionalDigits.Validator
Recommended.Proto3.JsonInput.DurationHasZeroFractionalDigit.Validator
Recommended.Proto3.JsonInput.FieldMaskInvalidCharacter Recommended.Proto3.JsonInput.FieldMaskInvalidCharacter
Required.Proto3.JsonInput.FloatFieldTooLarge Required.Proto3.JsonInput.FloatFieldTooLarge
Required.Proto3.JsonInput.FloatFieldTooSmall Required.Proto3.JsonInput.FloatFieldTooSmall

@ -6,7 +6,6 @@ Recommended.Proto3.JsonInput.BytesFieldBase64Url.ProtobufOutput
Recommended.Proto3.JsonInput.DurationHas3FractionalDigits.Validator Recommended.Proto3.JsonInput.DurationHas3FractionalDigits.Validator
Recommended.Proto3.JsonInput.DurationHas6FractionalDigits.Validator Recommended.Proto3.JsonInput.DurationHas6FractionalDigits.Validator
Recommended.Proto3.JsonInput.FieldMaskInvalidCharacter Recommended.Proto3.JsonInput.FieldMaskInvalidCharacter
Recommended.Proto3.JsonInput.Int64FieldBeString.Validator
Recommended.Proto3.JsonInput.MapFieldValueIsNull Recommended.Proto3.JsonInput.MapFieldValueIsNull
Recommended.Proto3.JsonInput.OneofZeroBytes.JsonOutput Recommended.Proto3.JsonInput.OneofZeroBytes.JsonOutput
Recommended.Proto3.JsonInput.RepeatedFieldMessageElementIsNull Recommended.Proto3.JsonInput.RepeatedFieldMessageElementIsNull
@ -17,7 +16,6 @@ Recommended.Proto3.JsonInput.StringFieldUnpairedHighSurrogate
Recommended.Proto3.JsonInput.StringFieldUnpairedLowSurrogate Recommended.Proto3.JsonInput.StringFieldUnpairedLowSurrogate
Recommended.Proto3.JsonInput.TimestampHas3FractionalDigits.Validator Recommended.Proto3.JsonInput.TimestampHas3FractionalDigits.Validator
Recommended.Proto3.JsonInput.TimestampHas6FractionalDigits.Validator Recommended.Proto3.JsonInput.TimestampHas6FractionalDigits.Validator
Recommended.Proto3.JsonInput.Uint64FieldBeString.Validator
Recommended.Proto3.ProtobufInput.OneofZeroBytes.JsonOutput Recommended.Proto3.ProtobufInput.OneofZeroBytes.JsonOutput
Required.DurationProtoInputTooLarge.JsonOutput Required.DurationProtoInputTooLarge.JsonOutput
Required.DurationProtoInputTooSmall.JsonOutput Required.DurationProtoInputTooSmall.JsonOutput

@ -6,7 +6,6 @@ Recommended.Proto3.JsonInput.BytesFieldBase64Url.ProtobufOutput
Recommended.Proto3.JsonInput.DurationHas3FractionalDigits.Validator Recommended.Proto3.JsonInput.DurationHas3FractionalDigits.Validator
Recommended.Proto3.JsonInput.DurationHas6FractionalDigits.Validator Recommended.Proto3.JsonInput.DurationHas6FractionalDigits.Validator
Recommended.Proto3.JsonInput.FieldMaskInvalidCharacter Recommended.Proto3.JsonInput.FieldMaskInvalidCharacter
Recommended.Proto3.JsonInput.Int64FieldBeString.Validator
Recommended.Proto3.JsonInput.MapFieldValueIsNull Recommended.Proto3.JsonInput.MapFieldValueIsNull
Recommended.Proto3.JsonInput.RepeatedFieldMessageElementIsNull Recommended.Proto3.JsonInput.RepeatedFieldMessageElementIsNull
Recommended.Proto3.JsonInput.RepeatedFieldPrimitiveElementIsNull Recommended.Proto3.JsonInput.RepeatedFieldPrimitiveElementIsNull
@ -16,7 +15,6 @@ Recommended.Proto3.JsonInput.StringFieldUnpairedHighSurrogate
Recommended.Proto3.JsonInput.StringFieldUnpairedLowSurrogate Recommended.Proto3.JsonInput.StringFieldUnpairedLowSurrogate
Recommended.Proto3.JsonInput.TimestampHas3FractionalDigits.Validator Recommended.Proto3.JsonInput.TimestampHas3FractionalDigits.Validator
Recommended.Proto3.JsonInput.TimestampHas6FractionalDigits.Validator Recommended.Proto3.JsonInput.TimestampHas6FractionalDigits.Validator
Recommended.Proto3.JsonInput.Uint64FieldBeString.Validator
Required.DurationProtoInputTooLarge.JsonOutput Required.DurationProtoInputTooLarge.JsonOutput
Required.DurationProtoInputTooSmall.JsonOutput Required.DurationProtoInputTooSmall.JsonOutput
Required.Proto3.JsonInput.DoubleFieldMaxNegativeValue.JsonOutput Required.Proto3.JsonInput.DoubleFieldMaxNegativeValue.JsonOutput

@ -5,7 +5,6 @@ Recommended.Proto3.JsonInput.BytesFieldBase64Url.JsonOutput
Recommended.Proto3.JsonInput.BytesFieldBase64Url.ProtobufOutput Recommended.Proto3.JsonInput.BytesFieldBase64Url.ProtobufOutput
Recommended.Proto3.JsonInput.DurationHas3FractionalDigits.Validator Recommended.Proto3.JsonInput.DurationHas3FractionalDigits.Validator
Recommended.Proto3.JsonInput.DurationHas6FractionalDigits.Validator Recommended.Proto3.JsonInput.DurationHas6FractionalDigits.Validator
Recommended.Proto3.JsonInput.Int64FieldBeString.Validator
Recommended.Proto3.JsonInput.MapFieldValueIsNull Recommended.Proto3.JsonInput.MapFieldValueIsNull
Recommended.Proto3.JsonInput.RepeatedFieldMessageElementIsNull Recommended.Proto3.JsonInput.RepeatedFieldMessageElementIsNull
Recommended.Proto3.JsonInput.RepeatedFieldPrimitiveElementIsNull Recommended.Proto3.JsonInput.RepeatedFieldPrimitiveElementIsNull
@ -15,7 +14,6 @@ Recommended.Proto3.JsonInput.StringFieldUnpairedHighSurrogate
Recommended.Proto3.JsonInput.StringFieldUnpairedLowSurrogate Recommended.Proto3.JsonInput.StringFieldUnpairedLowSurrogate
Recommended.Proto3.JsonInput.TimestampHas3FractionalDigits.Validator Recommended.Proto3.JsonInput.TimestampHas3FractionalDigits.Validator
Recommended.Proto3.JsonInput.TimestampHas6FractionalDigits.Validator Recommended.Proto3.JsonInput.TimestampHas6FractionalDigits.Validator
Recommended.Proto3.JsonInput.Uint64FieldBeString.Validator
Required.DurationProtoInputTooLarge.JsonOutput Required.DurationProtoInputTooLarge.JsonOutput
Required.DurationProtoInputTooSmall.JsonOutput Required.DurationProtoInputTooSmall.JsonOutput
Required.Proto3.JsonInput.DoubleFieldMaxNegativeValue.JsonOutput Required.Proto3.JsonInput.DoubleFieldMaxNegativeValue.JsonOutput

@ -201,3 +201,7 @@ with info about your project (name and website) so we can add an entry for you.
* Website: https://twirpql.dev * Website: https://twirpql.dev
* Extensions: 1070 * Extensions: 1070
1. Protoc-gen-validate
* Website: https://github.com/envoyproxy/protoc-gen-validate
* Extensions: 1071

@ -24,23 +24,23 @@ case "$1" in
;; ;;
2.6.1) 2.6.1)
OLD_VERSION=2.6.1 OLD_VERSION=2.6.1
OLD_VERSION_PROTOC=http://repo1.maven.org/maven2/com/google/protobuf/protoc/2.6.1-build2/protoc-2.6.1-build2-linux-x86_64.exe OLD_VERSION_PROTOC=https://repo1.maven.org/maven2/com/google/protobuf/protoc/2.6.1-build2/protoc-2.6.1-build2-linux-x86_64.exe
;; ;;
3.0.0-beta-1) 3.0.0-beta-1)
OLD_VERSION=3.0.0-beta-1 OLD_VERSION=3.0.0-beta-1
OLD_VERSION_PROTOC=http://repo1.maven.org/maven2/com/google/protobuf/protoc/3.0.0-beta-1/protoc-3.0.0-beta-1-linux-x86_64.exe OLD_VERSION_PROTOC=https://repo1.maven.org/maven2/com/google/protobuf/protoc/3.0.0-beta-1/protoc-3.0.0-beta-1-linux-x86_64.exe
;; ;;
3.0.0-beta-2) 3.0.0-beta-2)
OLD_VERSION=3.0.0-beta-2 OLD_VERSION=3.0.0-beta-2
OLD_VERSION_PROTOC=http://repo1.maven.org/maven2/com/google/protobuf/protoc/3.0.0-beta-2/protoc-3.0.0-beta-2-linux-x86_64.exe OLD_VERSION_PROTOC=https://repo1.maven.org/maven2/com/google/protobuf/protoc/3.0.0-beta-2/protoc-3.0.0-beta-2-linux-x86_64.exe
;; ;;
3.0.0-beta-3) 3.0.0-beta-3)
OLD_VERSION=3.0.0-beta-3 OLD_VERSION=3.0.0-beta-3
OLD_VERSION_PROTOC=http://repo1.maven.org/maven2/com/google/protobuf/protoc/3.0.0-beta-3/protoc-3.0.0-beta-3-linux-x86_64.exe OLD_VERSION_PROTOC=https://repo1.maven.org/maven2/com/google/protobuf/protoc/3.0.0-beta-3/protoc-3.0.0-beta-3-linux-x86_64.exe
;; ;;
3.0.0-beta-4) 3.0.0-beta-4)
OLD_VERSION=3.0.0-beta-4 OLD_VERSION=3.0.0-beta-4
OLD_VERSION_PROTOC=http://repo1.maven.org/maven2/com/google/protobuf/protoc/3.0.0-beta-4/protoc-3.0.0-beta-4-linux-x86_64.exe OLD_VERSION_PROTOC=https://repo1.maven.org/maven2/com/google/protobuf/protoc/3.0.0-beta-4/protoc-3.0.0-beta-4-linux-x86_64.exe
;; ;;
*) *)
echo "[ERROR]: Unknown version number: $1" echo "[ERROR]: Unknown version number: $1"

@ -84,6 +84,7 @@
<resource> <resource>
<directory>${basedir}/../core/src/main/java/com/google/protobuf</directory> <directory>${basedir}/../core/src/main/java/com/google/protobuf</directory>
<includes> <includes>
<!-- Keep in sync with //:BUILD -->
<include>AbstractMessageLite.java</include> <include>AbstractMessageLite.java</include>
<include>AbstractParser.java</include> <include>AbstractParser.java</include>
<include>AbstractProtobufList.java</include> <include>AbstractProtobufList.java</include>

@ -1,3 +1,3 @@
FROM grpctesting/rake-compiler-dock_53c22085d091183c528303791e7771359f699bcf FROM grpctesting/rake-compiler-dock_53c22085d091183c528303791e7771359f699bcf
RUN /bin/bash -l -c "gem install bundler" RUN /bin/bash -l -c "gem update --system '2.7.9' && gem install bundler"

@ -12431,18 +12431,32 @@ static size_t fmt_bool(bool val, char* buf, size_t length) {
return n; return n;
} }
static size_t fmt_int64(long val, char* buf, size_t length) { static size_t fmt_int64_as_number(long long val, char* buf, size_t length) {
size_t n = _upb_snprintf(buf, length, "%ld", val); size_t n = _upb_snprintf(buf, length, "%lld", val);
CHKLENGTH(n > 0 && n < length); CHKLENGTH(n > 0 && n < length);
return n; return n;
} }
static size_t fmt_uint64(unsigned long long val, char* buf, size_t length) { static size_t fmt_uint64_as_number(
unsigned long long val, char* buf, size_t length) {
size_t n = _upb_snprintf(buf, length, "%llu", val); size_t n = _upb_snprintf(buf, length, "%llu", val);
CHKLENGTH(n > 0 && n < length); CHKLENGTH(n > 0 && n < length);
return n; return n;
} }
static size_t fmt_int64_as_string(long long val, char* buf, size_t length) {
size_t n = _upb_snprintf(buf, length, "\"%lld\"", val);
CHKLENGTH(n > 0 && n < length);
return n;
}
static size_t fmt_uint64_as_string(
unsigned long long val, char* buf, size_t length) {
size_t n = _upb_snprintf(buf, length, "\"%llu\"", val);
CHKLENGTH(n > 0 && n < length);
return n;
}
/* Print a map key given a field name. Called by scalar field handlers and by /* Print a map key given a field name. Called by scalar field handlers and by
* startseq for repeated fields. */ * startseq for repeated fields. */
static bool putkey(void *closure, const void *handler_data) { static bool putkey(void *closure, const void *handler_data) {
@ -12486,8 +12500,11 @@ static bool putkey(void *closure, const void *handler_data) {
static bool putmapkey_##type(void *closure, const void *handler_data, \ static bool putmapkey_##type(void *closure, const void *handler_data, \
type val) { \ type val) { \
upb_json_printer *p = closure; \ upb_json_printer *p = closure; \
char data[64]; \
size_t length = fmt_func(val, data, sizeof(data)); \
UPB_UNUSED(handler_data); \
print_data(p, "\"", 1); \ print_data(p, "\"", 1); \
CHK(put##type(closure, handler_data, val)); \ print_data(p, data, length); \
print_data(p, "\":", 2); \ print_data(p, "\":", 2); \
return true; \ return true; \
} }
@ -12495,17 +12512,17 @@ static bool putkey(void *closure, const void *handler_data) {
TYPE_HANDLERS(double, fmt_double) TYPE_HANDLERS(double, fmt_double)
TYPE_HANDLERS(float, fmt_float) TYPE_HANDLERS(float, fmt_float)
TYPE_HANDLERS(bool, fmt_bool) TYPE_HANDLERS(bool, fmt_bool)
TYPE_HANDLERS(int32_t, fmt_int64) TYPE_HANDLERS(int32_t, fmt_int64_as_number)
TYPE_HANDLERS(uint32_t, fmt_int64) TYPE_HANDLERS(uint32_t, fmt_int64_as_number)
TYPE_HANDLERS(int64_t, fmt_int64) TYPE_HANDLERS(int64_t, fmt_int64_as_string)
TYPE_HANDLERS(uint64_t, fmt_uint64) TYPE_HANDLERS(uint64_t, fmt_uint64_as_string)
/* double and float are not allowed to be map keys. */ /* double and float are not allowed to be map keys. */
TYPE_HANDLERS_MAPKEY(bool, fmt_bool) TYPE_HANDLERS_MAPKEY(bool, fmt_bool)
TYPE_HANDLERS_MAPKEY(int32_t, fmt_int64) TYPE_HANDLERS_MAPKEY(int32_t, fmt_int64_as_number)
TYPE_HANDLERS_MAPKEY(uint32_t, fmt_int64) TYPE_HANDLERS_MAPKEY(uint32_t, fmt_int64_as_number)
TYPE_HANDLERS_MAPKEY(int64_t, fmt_int64) TYPE_HANDLERS_MAPKEY(int64_t, fmt_int64_as_number)
TYPE_HANDLERS_MAPKEY(uint64_t, fmt_uint64) TYPE_HANDLERS_MAPKEY(uint64_t, fmt_uint64_as_number)
#undef TYPE_HANDLERS #undef TYPE_HANDLERS
#undef TYPE_HANDLERS_MAPKEY #undef TYPE_HANDLERS_MAPKEY

@ -15,7 +15,7 @@ use Google\Protobuf\Internal\GPBUtil;
* *
* Generated from protobuf message <code>google.protobuf.DescriptorProto</code> * Generated from protobuf message <code>google.protobuf.DescriptorProto</code>
*/ */
class DescriptorProto extends \Google\Protobuf\Internal\Message final class DescriptorProto extends \Google\Protobuf\Internal\Message
{ {
/** /**
* Generated from protobuf field <code>optional string name = 1;</code> * Generated from protobuf field <code>optional string name = 1;</code>

@ -13,7 +13,7 @@ use Google\Protobuf\Internal\GPBUtil;
/** /**
* Generated from protobuf message <code>google.protobuf.DescriptorProto.ExtensionRange</code> * Generated from protobuf message <code>google.protobuf.DescriptorProto.ExtensionRange</code>
*/ */
class ExtensionRange extends \Google\Protobuf\Internal\Message final class ExtensionRange extends \Google\Protobuf\Internal\Message
{ {
/** /**
* Inclusive. * Inclusive.

@ -17,7 +17,7 @@ use Google\Protobuf\Internal\GPBUtil;
* *
* Generated from protobuf message <code>google.protobuf.DescriptorProto.ReservedRange</code> * Generated from protobuf message <code>google.protobuf.DescriptorProto.ReservedRange</code>
*/ */
class ReservedRange extends \Google\Protobuf\Internal\Message final class ReservedRange extends \Google\Protobuf\Internal\Message
{ {
/** /**
* Inclusive. * Inclusive.

@ -39,17 +39,26 @@ class EnumDescriptor
public function getValueByNumber($number) public function getValueByNumber($number)
{ {
return $this->value[$number]; if (isset($this->value[$number])) {
return $this->value[$number];
}
return null;
} }
public function getValueByName($name) public function getValueByName($name)
{ {
return $this->name_to_value[$name]; if (isset($this->name_to_value[$name])) {
return $this->name_to_value[$name];
}
return null;
} }
public function getValueDescriptorByIndex($index) public function getValueDescriptorByIndex($index)
{ {
return $this->value_descriptor[$index]; if (isset($this->value_descriptor[$index])) {
return $this->value_descriptor[$index];
}
return null;
} }
public function getValueCount() public function getValueCount()

@ -15,7 +15,7 @@ use Google\Protobuf\Internal\GPBUtil;
* *
* Generated from protobuf message <code>google.protobuf.EnumDescriptorProto</code> * Generated from protobuf message <code>google.protobuf.EnumDescriptorProto</code>
*/ */
class EnumDescriptorProto extends \Google\Protobuf\Internal\Message final class EnumDescriptorProto extends \Google\Protobuf\Internal\Message
{ {
/** /**
* Generated from protobuf field <code>optional string name = 1;</code> * Generated from protobuf field <code>optional string name = 1;</code>

@ -19,7 +19,7 @@ use Google\Protobuf\Internal\GPBUtil;
* *
* Generated from protobuf message <code>google.protobuf.EnumDescriptorProto.EnumReservedRange</code> * Generated from protobuf message <code>google.protobuf.EnumDescriptorProto.EnumReservedRange</code>
*/ */
class EnumReservedRange extends \Google\Protobuf\Internal\Message final class EnumReservedRange extends \Google\Protobuf\Internal\Message
{ {
/** /**
* Inclusive. * Inclusive.

@ -13,7 +13,7 @@ use Google\Protobuf\Internal\GPBUtil;
/** /**
* Generated from protobuf message <code>google.protobuf.EnumOptions</code> * Generated from protobuf message <code>google.protobuf.EnumOptions</code>
*/ */
class EnumOptions extends \Google\Protobuf\Internal\Message final class EnumOptions extends \Google\Protobuf\Internal\Message
{ {
/** /**
* Set this option to true to allow mapping different tag names to the same * Set this option to true to allow mapping different tag names to the same

@ -15,7 +15,7 @@ use Google\Protobuf\Internal\GPBUtil;
* *
* Generated from protobuf message <code>google.protobuf.EnumValueDescriptorProto</code> * Generated from protobuf message <code>google.protobuf.EnumValueDescriptorProto</code>
*/ */
class EnumValueDescriptorProto extends \Google\Protobuf\Internal\Message final class EnumValueDescriptorProto extends \Google\Protobuf\Internal\Message
{ {
/** /**
* Generated from protobuf field <code>optional string name = 1;</code> * Generated from protobuf field <code>optional string name = 1;</code>

@ -13,7 +13,7 @@ use Google\Protobuf\Internal\GPBUtil;
/** /**
* Generated from protobuf message <code>google.protobuf.EnumValueOptions</code> * Generated from protobuf message <code>google.protobuf.EnumValueOptions</code>
*/ */
class EnumValueOptions extends \Google\Protobuf\Internal\Message final class EnumValueOptions extends \Google\Protobuf\Internal\Message
{ {
/** /**
* Is this enum value deprecated? * Is this enum value deprecated?

@ -13,7 +13,7 @@ use Google\Protobuf\Internal\GPBUtil;
/** /**
* Generated from protobuf message <code>google.protobuf.ExtensionRangeOptions</code> * Generated from protobuf message <code>google.protobuf.ExtensionRangeOptions</code>
*/ */
class ExtensionRangeOptions extends \Google\Protobuf\Internal\Message final class ExtensionRangeOptions extends \Google\Protobuf\Internal\Message
{ {
/** /**
* The parser stores options it doesn't recognize here. See above. * The parser stores options it doesn't recognize here. See above.

@ -15,7 +15,7 @@ use Google\Protobuf\Internal\GPBUtil;
* *
* Generated from protobuf message <code>google.protobuf.FieldDescriptorProto</code> * Generated from protobuf message <code>google.protobuf.FieldDescriptorProto</code>
*/ */
class FieldDescriptorProto extends \Google\Protobuf\Internal\Message final class FieldDescriptorProto extends \Google\Protobuf\Internal\Message
{ {
/** /**
* Generated from protobuf field <code>optional string name = 1;</code> * Generated from protobuf field <code>optional string name = 1;</code>

@ -13,7 +13,7 @@ use Google\Protobuf\Internal\GPBUtil;
/** /**
* Generated from protobuf message <code>google.protobuf.FieldOptions</code> * Generated from protobuf message <code>google.protobuf.FieldOptions</code>
*/ */
class FieldOptions extends \Google\Protobuf\Internal\Message final class FieldOptions extends \Google\Protobuf\Internal\Message
{ {
/** /**
* The ctype option instructs the C++ code generator to use a different * The ctype option instructs the C++ code generator to use a different

@ -15,7 +15,7 @@ use Google\Protobuf\Internal\GPBUtil;
* *
* Generated from protobuf message <code>google.protobuf.FileDescriptorProto</code> * Generated from protobuf message <code>google.protobuf.FileDescriptorProto</code>
*/ */
class FileDescriptorProto extends \Google\Protobuf\Internal\Message final class FileDescriptorProto extends \Google\Protobuf\Internal\Message
{ {
/** /**
* file name, relative to root of source tree * file name, relative to root of source tree

@ -16,7 +16,7 @@ use Google\Protobuf\Internal\GPBUtil;
* *
* Generated from protobuf message <code>google.protobuf.FileDescriptorSet</code> * Generated from protobuf message <code>google.protobuf.FileDescriptorSet</code>
*/ */
class FileDescriptorSet extends \Google\Protobuf\Internal\Message final class FileDescriptorSet extends \Google\Protobuf\Internal\Message
{ {
/** /**
* Generated from protobuf field <code>repeated .google.protobuf.FileDescriptorProto file = 1;</code> * Generated from protobuf field <code>repeated .google.protobuf.FileDescriptorProto file = 1;</code>

@ -13,7 +13,7 @@ use Google\Protobuf\Internal\GPBUtil;
/** /**
* Generated from protobuf message <code>google.protobuf.FileOptions</code> * Generated from protobuf message <code>google.protobuf.FileOptions</code>
*/ */
class FileOptions extends \Google\Protobuf\Internal\Message final class FileOptions extends \Google\Protobuf\Internal\Message
{ {
/** /**
* Sets the Java package where classes generated from this .proto will be * Sets the Java package where classes generated from this .proto will be

@ -504,17 +504,29 @@ class GPBUtil
public static function formatDuration($value) public static function formatDuration($value)
{ {
if (bccomp($value->getSeconds(), "315576000001") != -1) { if (bccomp($value->getSeconds(), '315576000001') != -1) {
throw new GPBDecodeException("Duration number too large."); throw new GPBDecodeException('Duration number too large.');
} }
if (bccomp($value->getSeconds(), "-315576000001") != 1) { if (bccomp($value->getSeconds(), '-315576000001') != 1) {
throw new GPBDecodeException("Duration number too small."); throw new GPBDecodeException('Duration number too small.');
}
$nanos = $value->getNanos();
if ($nanos === 0) {
return (string) $value->getSeconds();
} }
return strval(bcadd($value->getSeconds(),
$value->getNanos() / 1000000000.0, 9));
}
if ($nanos % 1000000 === 0) {
$digits = 3;
} elseif ($nanos % 1000 === 0) {
$digits = 6;
} else {
$digits = 9;
}
$nanos = bcdiv($nanos, '1000000000', $digits);
return bcadd($value->getSeconds(), $nanos, $digits);
}
public static function parseFieldMask($paths_string) public static function parseFieldMask($paths_string)
{ {

@ -17,7 +17,7 @@ use Google\Protobuf\Internal\GPBUtil;
* *
* Generated from protobuf message <code>google.protobuf.GeneratedCodeInfo</code> * Generated from protobuf message <code>google.protobuf.GeneratedCodeInfo</code>
*/ */
class GeneratedCodeInfo extends \Google\Protobuf\Internal\Message final class GeneratedCodeInfo extends \Google\Protobuf\Internal\Message
{ {
/** /**
* An Annotation connects some span of text in generated code to an element * An Annotation connects some span of text in generated code to an element

@ -13,7 +13,7 @@ use Google\Protobuf\Internal\GPBUtil;
/** /**
* Generated from protobuf message <code>google.protobuf.GeneratedCodeInfo.Annotation</code> * Generated from protobuf message <code>google.protobuf.GeneratedCodeInfo.Annotation</code>
*/ */
class Annotation extends \Google\Protobuf\Internal\Message final class Annotation extends \Google\Protobuf\Internal\Message
{ {
/** /**
* Identifies the element in the original source .proto file. This field * Identifies the element in the original source .proto file. This field

@ -13,7 +13,7 @@ use Google\Protobuf\Internal\GPBUtil;
/** /**
* Generated from protobuf message <code>google.protobuf.MessageOptions</code> * Generated from protobuf message <code>google.protobuf.MessageOptions</code>
*/ */
class MessageOptions extends \Google\Protobuf\Internal\Message final class MessageOptions extends \Google\Protobuf\Internal\Message
{ {
/** /**
* Set true to use the old proto1 MessageSet wire format for extensions. * Set true to use the old proto1 MessageSet wire format for extensions.

@ -15,7 +15,7 @@ use Google\Protobuf\Internal\GPBUtil;
* *
* Generated from protobuf message <code>google.protobuf.MethodDescriptorProto</code> * Generated from protobuf message <code>google.protobuf.MethodDescriptorProto</code>
*/ */
class MethodDescriptorProto extends \Google\Protobuf\Internal\Message final class MethodDescriptorProto extends \Google\Protobuf\Internal\Message
{ {
/** /**
* Generated from protobuf field <code>optional string name = 1;</code> * Generated from protobuf field <code>optional string name = 1;</code>

@ -13,7 +13,7 @@ use Google\Protobuf\Internal\GPBUtil;
/** /**
* Generated from protobuf message <code>google.protobuf.MethodOptions</code> * Generated from protobuf message <code>google.protobuf.MethodOptions</code>
*/ */
class MethodOptions extends \Google\Protobuf\Internal\Message final class MethodOptions extends \Google\Protobuf\Internal\Message
{ {
/** /**
* Is this method deprecated? * Is this method deprecated?

@ -15,7 +15,7 @@ use Google\Protobuf\Internal\GPBUtil;
* *
* Generated from protobuf message <code>google.protobuf.OneofDescriptorProto</code> * Generated from protobuf message <code>google.protobuf.OneofDescriptorProto</code>
*/ */
class OneofDescriptorProto extends \Google\Protobuf\Internal\Message final class OneofDescriptorProto extends \Google\Protobuf\Internal\Message
{ {
/** /**
* Generated from protobuf field <code>optional string name = 1;</code> * Generated from protobuf field <code>optional string name = 1;</code>

@ -13,7 +13,7 @@ use Google\Protobuf\Internal\GPBUtil;
/** /**
* Generated from protobuf message <code>google.protobuf.OneofOptions</code> * Generated from protobuf message <code>google.protobuf.OneofOptions</code>
*/ */
class OneofOptions extends \Google\Protobuf\Internal\Message final class OneofOptions extends \Google\Protobuf\Internal\Message
{ {
/** /**
* The parser stores options it doesn't recognize here. See above. * The parser stores options it doesn't recognize here. See above.

@ -15,7 +15,7 @@ use Google\Protobuf\Internal\GPBUtil;
* *
* Generated from protobuf message <code>google.protobuf.ServiceDescriptorProto</code> * Generated from protobuf message <code>google.protobuf.ServiceDescriptorProto</code>
*/ */
class ServiceDescriptorProto extends \Google\Protobuf\Internal\Message final class ServiceDescriptorProto extends \Google\Protobuf\Internal\Message
{ {
/** /**
* Generated from protobuf field <code>optional string name = 1;</code> * Generated from protobuf field <code>optional string name = 1;</code>

@ -13,7 +13,7 @@ use Google\Protobuf\Internal\GPBUtil;
/** /**
* Generated from protobuf message <code>google.protobuf.ServiceOptions</code> * Generated from protobuf message <code>google.protobuf.ServiceOptions</code>
*/ */
class ServiceOptions extends \Google\Protobuf\Internal\Message final class ServiceOptions extends \Google\Protobuf\Internal\Message
{ {
/** /**
* Is this service deprecated? * Is this service deprecated?

@ -16,7 +16,7 @@ use Google\Protobuf\Internal\GPBUtil;
* *
* Generated from protobuf message <code>google.protobuf.SourceCodeInfo</code> * Generated from protobuf message <code>google.protobuf.SourceCodeInfo</code>
*/ */
class SourceCodeInfo extends \Google\Protobuf\Internal\Message final class SourceCodeInfo extends \Google\Protobuf\Internal\Message
{ {
/** /**
* A Location identifies a piece of source code in a .proto file which * A Location identifies a piece of source code in a .proto file which

@ -13,7 +13,7 @@ use Google\Protobuf\Internal\GPBUtil;
/** /**
* Generated from protobuf message <code>google.protobuf.SourceCodeInfo.Location</code> * Generated from protobuf message <code>google.protobuf.SourceCodeInfo.Location</code>
*/ */
class Location extends \Google\Protobuf\Internal\Message final class Location extends \Google\Protobuf\Internal\Message
{ {
/** /**
* Identifies which part of the FileDescriptorProto was defined at this * Identifies which part of the FileDescriptorProto was defined at this

@ -20,7 +20,7 @@ use Google\Protobuf\Internal\GPBUtil;
* *
* Generated from protobuf message <code>google.protobuf.UninterpretedOption</code> * Generated from protobuf message <code>google.protobuf.UninterpretedOption</code>
*/ */
class UninterpretedOption extends \Google\Protobuf\Internal\Message final class UninterpretedOption extends \Google\Protobuf\Internal\Message
{ {
/** /**
* Generated from protobuf field <code>repeated .google.protobuf.UninterpretedOption.NamePart name = 2;</code> * Generated from protobuf field <code>repeated .google.protobuf.UninterpretedOption.NamePart name = 2;</code>

@ -19,7 +19,7 @@ use Google\Protobuf\Internal\GPBUtil;
* *
* Generated from protobuf message <code>google.protobuf.UninterpretedOption.NamePart</code> * Generated from protobuf message <code>google.protobuf.UninterpretedOption.NamePart</code>
*/ */
class NamePart extends \Google\Protobuf\Internal\Message final class NamePart extends \Google\Protobuf\Internal\Message
{ {
/** /**
* Generated from protobuf field <code>required string name_part = 1;</code> * Generated from protobuf field <code>required string name_part = 1;</code>

@ -24,14 +24,3 @@ message TestWrapperSetters {
map<string, google.protobuf.StringValue> map_string_value = 13; map<string, google.protobuf.StringValue> map_string_value = 13;
} }
message TestWrapperAccessorConflicts {
int32 normal_vs_wrapper_value = 1;
google.protobuf.Int32Value normal_vs_wrapper = 2;
int32 normal_vs_normal_value = 3;
int32 normal_vs_normal = 4;
google.protobuf.Int32Value wrapper_vs_wrapper_value = 5;
google.protobuf.Int32Value wrapper_vs_wrapper = 6;
}

@ -16,44 +16,6 @@ use Google\Protobuf\UInt64Value;
class WrapperTypeSettersTest extends TestBase class WrapperTypeSettersTest extends TestBase
{ {
public function testConflictNormalVsWrapper()
{
$m = new Foo\TestWrapperAccessorConflicts();
$m->setNormalVsWrapperValue1(1);
$this->assertSame(1, $m->getNormalVsWrapperValue1());
$m->setNormalVsWrapperValue2(1);
$this->assertSame(1, $m->getNormalVsWrapperValue2());
$wrapper = new Int32Value(["value" => 1]);
$m->setNormalVsWrapper($wrapper);
$this->assertSame(1, $m->getNormalVsWrapper()->getValue());
}
public function testConflictNormalVsNormal()
{
$m = new Foo\TestWrapperAccessorConflicts();
$m->setNormalVsNormalValue(1);
$this->assertSame(1, $m->getNormalVsNormalValue());
$m->setNormalVsNormal(1);
$this->assertSame(1, $m->getNormalVsNormal());
}
public function testConflictWrapperVsWrapper()
{
$m = new Foo\TestWrapperAccessorConflicts();
$m->setWrapperVsWrapperValueValue(1);
$this->assertSame(1, $m->getWrapperVsWrapperValueValue());
$wrapper = new Int32Value(["value" => 1]);
$m->setWrapperVsWrapperValue5($wrapper);
$this->assertSame(1, $m->getWrapperVsWrapperValue5()->getValue());
}
/** /**
* @dataProvider gettersAndSettersDataProvider * @dataProvider gettersAndSettersDataProvider
*/ */
@ -98,26 +60,26 @@ class WrapperTypeSettersTest extends TestBase
public function gettersAndSettersDataProvider() public function gettersAndSettersDataProvider()
{ {
return [ return [
[TestWrapperSetters::class, DoubleValue::class, "setDoubleValue", "setDoubleValueValue", "getDoubleValue", "getDoubleValueValue", [ [TestWrapperSetters::class, DoubleValue::class, "setDoubleValue", "setDoubleValueUnwrapped", "getDoubleValue", "getDoubleValueUnwrapped", [
[1.1, new DoubleValue(["value" => 1.1])], [1.1, new DoubleValue(["value" => 1.1])],
[2.2, new DoubleValue(["value" => 2.2])], [2.2, new DoubleValue(["value" => 2.2])],
[null, null], [null, null],
[0, new DoubleValue()], [0, new DoubleValue()],
]], ]],
[TestWrapperSetters::class, FloatValue::class, "setFloatValue", "setFloatValueValue", "getFloatValue", "getFloatValueValue", [ [TestWrapperSetters::class, FloatValue::class, "setFloatValue", "setFloatValueUnwrapped", "getFloatValue", "getFloatValueUnwrapped", [
[1.1, new FloatValue(["value" => 1.1])], [1.1, new FloatValue(["value" => 1.1])],
[2.2, new FloatValue(["value" => 2.2])], [2.2, new FloatValue(["value" => 2.2])],
[null, null], [null, null],
[0, new FloatValue()], [0, new FloatValue()],
]], ]],
[TestWrapperSetters::class, Int64Value::class, "setInt64Value", "setInt64ValueValue", "getInt64Value", "getInt64ValueValue", [ [TestWrapperSetters::class, Int64Value::class, "setInt64Value", "setInt64ValueUnwrapped", "getInt64Value", "getInt64ValueUnwrapped", [
[123, new Int64Value(["value" => 123])], [123, new Int64Value(["value" => 123])],
[-789, new Int64Value(["value" => -789])], [-789, new Int64Value(["value" => -789])],
[null, null], [null, null],
[0, new Int64Value()], [0, new Int64Value()],
[5.5, new Int64Value(["value" => 5])], // Test conversion from float to int [5.5, new Int64Value(["value" => 5])], // Test conversion from float to int
]], ]],
[TestWrapperSetters::class, UInt64Value::class, "setUInt64Value", "setUInt64ValueValue", "getUInt64Value", "getUInt64ValueValue", [ [TestWrapperSetters::class, UInt64Value::class, "setUInt64Value", "setUInt64ValueUnwrapped", "getUInt64Value", "getUInt64ValueUnwrapped", [
[123, new UInt64Value(["value" => 123])], [123, new UInt64Value(["value" => 123])],
[789, new UInt64Value(["value" => 789])], [789, new UInt64Value(["value" => 789])],
[null, null], [null, null],
@ -125,14 +87,14 @@ class WrapperTypeSettersTest extends TestBase
[5.5, new UInt64Value(["value" => 5])], // Test conversion from float to int [5.5, new UInt64Value(["value" => 5])], // Test conversion from float to int
[-7, new UInt64Value(["value" => -7])], // Test conversion from -ve to +ve [-7, new UInt64Value(["value" => -7])], // Test conversion from -ve to +ve
]], ]],
[TestWrapperSetters::class, Int32Value::class, "setInt32Value", "setInt32ValueValue", "getInt32Value", "getInt32ValueValue", [ [TestWrapperSetters::class, Int32Value::class, "setInt32Value", "setInt32ValueUnwrapped", "getInt32Value", "getInt32ValueUnwrapped", [
[123, new Int32Value(["value" => 123])], [123, new Int32Value(["value" => 123])],
[-789, new Int32Value(["value" => -789])], [-789, new Int32Value(["value" => -789])],
[null, null], [null, null],
[0, new Int32Value()], [0, new Int32Value()],
[5.5, new Int32Value(["value" => 5])], // Test conversion from float to int [5.5, new Int32Value(["value" => 5])], // Test conversion from float to int
]], ]],
[TestWrapperSetters::class, UInt32Value::class, "setUInt32Value", "setUInt32ValueValue", "getUInt32Value", "getUInt32ValueValue", [ [TestWrapperSetters::class, UInt32Value::class, "setUInt32Value", "setUInt32ValueUnwrapped", "getUInt32Value", "getUInt32ValueUnwrapped", [
[123, new UInt32Value(["value" => 123])], [123, new UInt32Value(["value" => 123])],
[789, new UInt32Value(["value" => 789])], [789, new UInt32Value(["value" => 789])],
[null, null], [null, null],
@ -140,12 +102,12 @@ class WrapperTypeSettersTest extends TestBase
[5.5, new UInt32Value(["value" => 5])], // Test conversion from float to int [5.5, new UInt32Value(["value" => 5])], // Test conversion from float to int
[-7, new UInt32Value(["value" => -7])], // Test conversion from -ve to +ve [-7, new UInt32Value(["value" => -7])], // Test conversion from -ve to +ve
]], ]],
[TestWrapperSetters::class, BoolValue::class, "setBoolValue", "setBoolValueValue", "getBoolValue", "getBoolValueValue", [ [TestWrapperSetters::class, BoolValue::class, "setBoolValue", "setBoolValueUnwrapped", "getBoolValue", "getBoolValueUnwrapped", [
[true, new BoolValue(["value" => true])], [true, new BoolValue(["value" => true])],
[false, new BoolValue(["value" => false])], [false, new BoolValue(["value" => false])],
[null, null], [null, null],
]], ]],
[TestWrapperSetters::class, StringValue::class, "setStringValue", "setStringValueValue", "getStringValue", "getStringValueValue", [ [TestWrapperSetters::class, StringValue::class, "setStringValue", "setStringValueUnwrapped", "getStringValue", "getStringValueUnwrapped", [
["asdf", new StringValue(["value" => "asdf"])], ["asdf", new StringValue(["value" => "asdf"])],
["", new StringValue(["value" => ""])], ["", new StringValue(["value" => ""])],
[null, null], [null, null],
@ -155,7 +117,7 @@ class WrapperTypeSettersTest extends TestBase
[-7, new StringValue(["value" => "-7"])], // Test conversion from number to string [-7, new StringValue(["value" => "-7"])], // Test conversion from number to string
[-7.5, new StringValue(["value" => "-7.5"])], // Test conversion from number to string [-7.5, new StringValue(["value" => "-7.5"])], // Test conversion from number to string
]], ]],
[TestWrapperSetters::class, BytesValue::class, "setBytesValue", "setBytesValueValue", "getBytesValue", "getBytesValueValue", [ [TestWrapperSetters::class, BytesValue::class, "setBytesValue", "setBytesValueUnwrapped", "getBytesValue", "getBytesValueUnwrapped", [
["asdf", new BytesValue(["value" => "asdf"])], ["asdf", new BytesValue(["value" => "asdf"])],
["", new BytesValue(["value" => ""])], ["", new BytesValue(["value" => ""])],
[null, null], [null, null],
@ -165,12 +127,12 @@ class WrapperTypeSettersTest extends TestBase
[-7, new BytesValue(["value" => "-7"])], // Test conversion from number to bytes [-7, new BytesValue(["value" => "-7"])], // Test conversion from number to bytes
[-7.5, new BytesValue(["value" => "-7.5"])], // Test conversion from number to bytes [-7.5, new BytesValue(["value" => "-7.5"])], // Test conversion from number to bytes
]], ]],
[TestWrapperSetters::class, DoubleValue::class, "setDoubleValueOneof", "setDoubleValueOneofValue", "getDoubleValueOneof", "getDoubleValueOneofValue", [ [TestWrapperSetters::class, DoubleValue::class, "setDoubleValueOneof", "setDoubleValueOneofUnwrapped", "getDoubleValueOneof", "getDoubleValueOneofUnwrapped", [
[1.1, new DoubleValue(["value" => 1.1])], [1.1, new DoubleValue(["value" => 1.1])],
[2.2, new DoubleValue(["value" => 2.2])], [2.2, new DoubleValue(["value" => 2.2])],
[null, null], [null, null],
[0, new DoubleValue()], [0, new DoubleValue()],
]],[TestWrapperSetters::class, StringValue::class, "setStringValueOneof", "setStringValueOneofValue", "getStringValueOneof", "getStringValueOneofValue", [ ]],[TestWrapperSetters::class, StringValue::class, "setStringValueOneof", "setStringValueOneofUnwrapped", "getStringValueOneof", "getStringValueOneofUnwrapped", [
["asdf", new StringValue(["value" => "asdf"])], ["asdf", new StringValue(["value" => "asdf"])],
["", new StringValue(["value" => ""])], ["", new StringValue(["value" => ""])],
[null, null], [null, null],
@ -195,47 +157,47 @@ class WrapperTypeSettersTest extends TestBase
public function invalidSettersDataProvider() public function invalidSettersDataProvider()
{ {
return [ return [
[TestWrapperSetters::class, "setDoubleValueValue", "abc"], [TestWrapperSetters::class, "setDoubleValueUnwrapped", "abc"],
[TestWrapperSetters::class, "setDoubleValueValue", []], [TestWrapperSetters::class, "setDoubleValueUnwrapped", []],
[TestWrapperSetters::class, "setDoubleValueValue", new stdClass()], [TestWrapperSetters::class, "setDoubleValueUnwrapped", new stdClass()],
[TestWrapperSetters::class, "setDoubleValueValue", new DoubleValue()], [TestWrapperSetters::class, "setDoubleValueUnwrapped", new DoubleValue()],
[TestWrapperSetters::class, "setFloatValueValue", "abc"], [TestWrapperSetters::class, "setFloatValueUnwrapped", "abc"],
[TestWrapperSetters::class, "setFloatValueValue", []], [TestWrapperSetters::class, "setFloatValueUnwrapped", []],
[TestWrapperSetters::class, "setFloatValueValue", new stdClass()], [TestWrapperSetters::class, "setFloatValueUnwrapped", new stdClass()],
[TestWrapperSetters::class, "setFloatValueValue", new FloatValue()], [TestWrapperSetters::class, "setFloatValueUnwrapped", new FloatValue()],
[TestWrapperSetters::class, "setInt64ValueValue", "abc"], [TestWrapperSetters::class, "setInt64ValueUnwrapped", "abc"],
[TestWrapperSetters::class, "setInt64ValueValue", []], [TestWrapperSetters::class, "setInt64ValueUnwrapped", []],
[TestWrapperSetters::class, "setInt64ValueValue", new stdClass()], [TestWrapperSetters::class, "setInt64ValueUnwrapped", new stdClass()],
[TestWrapperSetters::class, "setInt64ValueValue", new Int64Value()], [TestWrapperSetters::class, "setInt64ValueUnwrapped", new Int64Value()],
[TestWrapperSetters::class, "setUInt64ValueValue", "abc"], [TestWrapperSetters::class, "setUInt64ValueUnwrapped", "abc"],
[TestWrapperSetters::class, "setUInt64ValueValue", []], [TestWrapperSetters::class, "setUInt64ValueUnwrapped", []],
[TestWrapperSetters::class, "setUInt64ValueValue", new stdClass()], [TestWrapperSetters::class, "setUInt64ValueUnwrapped", new stdClass()],
[TestWrapperSetters::class, "setUInt64ValueValue", new UInt64Value()], [TestWrapperSetters::class, "setUInt64ValueUnwrapped", new UInt64Value()],
[TestWrapperSetters::class, "setInt32ValueValue", "abc"], [TestWrapperSetters::class, "setInt32ValueUnwrapped", "abc"],
[TestWrapperSetters::class, "setInt32ValueValue", []], [TestWrapperSetters::class, "setInt32ValueUnwrapped", []],
[TestWrapperSetters::class, "setInt32ValueValue", new stdClass()], [TestWrapperSetters::class, "setInt32ValueUnwrapped", new stdClass()],
[TestWrapperSetters::class, "setInt32ValueValue", new Int32Value()], [TestWrapperSetters::class, "setInt32ValueUnwrapped", new Int32Value()],
[TestWrapperSetters::class, "setUInt32ValueValue", "abc"], [TestWrapperSetters::class, "setUInt32ValueUnwrapped", "abc"],
[TestWrapperSetters::class, "setUInt32ValueValue", []], [TestWrapperSetters::class, "setUInt32ValueUnwrapped", []],
[TestWrapperSetters::class, "setUInt32ValueValue", new stdClass()], [TestWrapperSetters::class, "setUInt32ValueUnwrapped", new stdClass()],
[TestWrapperSetters::class, "setUInt32ValueValue", new UInt32Value()], [TestWrapperSetters::class, "setUInt32ValueUnwrapped", new UInt32Value()],
[TestWrapperSetters::class, "setBoolValueValue", []], [TestWrapperSetters::class, "setBoolValueUnwrapped", []],
[TestWrapperSetters::class, "setBoolValueValue", new stdClass()], [TestWrapperSetters::class, "setBoolValueUnwrapped", new stdClass()],
[TestWrapperSetters::class, "setBoolValueValue", new BoolValue()], [TestWrapperSetters::class, "setBoolValueUnwrapped", new BoolValue()],
[TestWrapperSetters::class, "setStringValueValue", []], [TestWrapperSetters::class, "setStringValueUnwrapped", []],
[TestWrapperSetters::class, "setStringValueValue", new stdClass()], [TestWrapperSetters::class, "setStringValueUnwrapped", new stdClass()],
[TestWrapperSetters::class, "setStringValueValue", new StringValue()], [TestWrapperSetters::class, "setStringValueUnwrapped", new StringValue()],
[TestWrapperSetters::class, "setBytesValueValue", []], [TestWrapperSetters::class, "setBytesValueUnwrapped", []],
[TestWrapperSetters::class, "setBytesValueValue", new stdClass()], [TestWrapperSetters::class, "setBytesValueUnwrapped", new stdClass()],
[TestWrapperSetters::class, "setBytesValueValue", new BytesValue()], [TestWrapperSetters::class, "setBytesValueUnwrapped", new BytesValue()],
]; ];
} }

@ -16289,18 +16289,32 @@ static size_t fmt_bool(bool val, char* buf, size_t length) {
return n; return n;
} }
static size_t fmt_int64(long val, char* buf, size_t length) { static size_t fmt_int64_as_number(long long val, char* buf, size_t length) {
size_t n = _upb_snprintf(buf, length, "%ld", val); size_t n = _upb_snprintf(buf, length, "%lld", val);
CHKLENGTH(n > 0 && n < length); CHKLENGTH(n > 0 && n < length);
return n; return n;
} }
static size_t fmt_uint64(unsigned long long val, char* buf, size_t length) { static size_t fmt_uint64_as_number(
unsigned long long val, char* buf, size_t length) {
size_t n = _upb_snprintf(buf, length, "%llu", val); size_t n = _upb_snprintf(buf, length, "%llu", val);
CHKLENGTH(n > 0 && n < length); CHKLENGTH(n > 0 && n < length);
return n; return n;
} }
static size_t fmt_int64_as_string(long long val, char* buf, size_t length) {
size_t n = _upb_snprintf(buf, length, "\"%lld\"", val);
CHKLENGTH(n > 0 && n < length);
return n;
}
static size_t fmt_uint64_as_string(
unsigned long long val, char* buf, size_t length) {
size_t n = _upb_snprintf(buf, length, "\"%llu\"", val);
CHKLENGTH(n > 0 && n < length);
return n;
}
/* Print a map key given a field name. Called by scalar field handlers and by /* Print a map key given a field name. Called by scalar field handlers and by
* startseq for repeated fields. */ * startseq for repeated fields. */
static bool putkey(void *closure, const void *handler_data) { static bool putkey(void *closure, const void *handler_data) {
@ -16344,8 +16358,11 @@ static bool putkey(void *closure, const void *handler_data) {
static bool putmapkey_##type(void *closure, const void *handler_data, \ static bool putmapkey_##type(void *closure, const void *handler_data, \
type val) { \ type val) { \
upb_json_printer *p = closure; \ upb_json_printer *p = closure; \
char data[64]; \
size_t length = fmt_func(val, data, sizeof(data)); \
UPB_UNUSED(handler_data); \
print_data(p, "\"", 1); \ print_data(p, "\"", 1); \
CHK(put##type(closure, handler_data, val)); \ print_data(p, data, length); \
print_data(p, "\":", 2); \ print_data(p, "\":", 2); \
return true; \ return true; \
} }
@ -16353,17 +16370,17 @@ static bool putkey(void *closure, const void *handler_data) {
TYPE_HANDLERS(double, fmt_double) TYPE_HANDLERS(double, fmt_double)
TYPE_HANDLERS(float, fmt_float) TYPE_HANDLERS(float, fmt_float)
TYPE_HANDLERS(bool, fmt_bool) TYPE_HANDLERS(bool, fmt_bool)
TYPE_HANDLERS(int32_t, fmt_int64) TYPE_HANDLERS(int32_t, fmt_int64_as_number)
TYPE_HANDLERS(uint32_t, fmt_int64) TYPE_HANDLERS(uint32_t, fmt_int64_as_number)
TYPE_HANDLERS(int64_t, fmt_int64) TYPE_HANDLERS(int64_t, fmt_int64_as_string)
TYPE_HANDLERS(uint64_t, fmt_uint64) TYPE_HANDLERS(uint64_t, fmt_uint64_as_string)
/* double and float are not allowed to be map keys. */ /* double and float are not allowed to be map keys. */
TYPE_HANDLERS_MAPKEY(bool, fmt_bool) TYPE_HANDLERS_MAPKEY(bool, fmt_bool)
TYPE_HANDLERS_MAPKEY(int32_t, fmt_int64) TYPE_HANDLERS_MAPKEY(int32_t, fmt_int64_as_number)
TYPE_HANDLERS_MAPKEY(uint32_t, fmt_int64) TYPE_HANDLERS_MAPKEY(uint32_t, fmt_int64_as_number)
TYPE_HANDLERS_MAPKEY(int64_t, fmt_int64) TYPE_HANDLERS_MAPKEY(int64_t, fmt_int64_as_number)
TYPE_HANDLERS_MAPKEY(uint64_t, fmt_uint64) TYPE_HANDLERS_MAPKEY(uint64_t, fmt_uint64_as_number)
#undef TYPE_HANDLERS #undef TYPE_HANDLERS
#undef TYPE_HANDLERS_MAPKEY #undef TYPE_HANDLERS_MAPKEY

@ -1108,9 +1108,9 @@ module CommonTests
expected = { expected = {
optionalInt32: 0, optionalInt32: 0,
optionalInt64: 0, optionalInt64: "0",
optionalUint32: 0, optionalUint32: 0,
optionalUint64: 0, optionalUint64: "0",
optionalBool: false, optionalBool: false,
optionalFloat: 0, optionalFloat: 0,
optionalDouble: 0, optionalDouble: 0,
@ -1142,9 +1142,9 @@ module CommonTests
expected = { expected = {
optionalInt32: 0, optionalInt32: 0,
optionalInt64: 0, optionalInt64: "0",
optionalUint32: 0, optionalUint32: 0,
optionalUint64: 0, optionalUint64: "0",
optionalBool: false, optionalBool: false,
optionalFloat: 0, optionalFloat: 0,
optionalDouble: 0, optionalDouble: 0,
@ -1177,9 +1177,9 @@ module CommonTests
expected = { expected = {
optionalInt32: 0, optionalInt32: 0,
optionalInt64: 0, optionalInt64: "0",
optionalUint32: 0, optionalUint32: 0,
optionalUint64: 0, optionalUint64: "0",
optionalBool: false, optionalBool: false,
optionalFloat: 0, optionalFloat: 0,
optionalDouble: 0, optionalDouble: 0,

@ -77,23 +77,19 @@ class MockErrorCollector : public MultiFileErrorCollector {
class MockGeneratorContext : public GeneratorContext { class MockGeneratorContext : public GeneratorContext {
public: public:
MockGeneratorContext() {}
~MockGeneratorContext() {
STLDeleteValues(&files_);
}
void ExpectFileMatches(const string& virtual_filename, void ExpectFileMatches(const string& virtual_filename,
const string& physical_filename) { const string& physical_filename) {
string* expected_contents = FindPtrOrNull(files_, virtual_filename); auto it = files_.find(virtual_filename);
ASSERT_TRUE(expected_contents != NULL) ASSERT_TRUE(it != files_.end())
<< "Generator failed to generate file: " << virtual_filename; << "Generator failed to generate file: " << virtual_filename;
string expected_contents = *it->second;
string actual_contents; string actual_contents;
GOOGLE_CHECK_OK( GOOGLE_CHECK_OK(
File::GetContentsAsText(TestSourceDir() + "/" + physical_filename, File::GetContentsAsText(TestSourceDir() + "/" + physical_filename,
&actual_contents, true)) &actual_contents, true))
<< "Unable to get " << physical_filename; << "Unable to get " << physical_filename;
EXPECT_TRUE(actual_contents == *expected_contents) EXPECT_TRUE(actual_contents == expected_contents)
<< physical_filename << " needs to be regenerated. Please run " << physical_filename << " needs to be regenerated. Please run "
"generate_descriptor_proto.sh. Then add this file " "generate_descriptor_proto.sh. Then add this file "
"to your CL."; "to your CL.";
@ -102,15 +98,13 @@ class MockGeneratorContext : public GeneratorContext {
// implements GeneratorContext -------------------------------------- // implements GeneratorContext --------------------------------------
virtual io::ZeroCopyOutputStream* Open(const string& filename) { virtual io::ZeroCopyOutputStream* Open(const string& filename) {
string** map_slot = &files_[filename]; auto& map_slot = files_[filename];
delete *map_slot; map_slot.reset(new std::string);
*map_slot = new string; return new io::StringOutputStream(map_slot.get());
return new io::StringOutputStream(*map_slot);
} }
private: private:
std::map<string, string*> files_; std::map<std::string, std::unique_ptr<std::string>> files_;
}; };
class GenerateAndTest { class GenerateAndTest {

@ -192,27 +192,21 @@ FileGenerator::FileGenerator(const FileDescriptor *file, const Options& options)
options_(options) { options_(options) {
for (int i = 0; i < file_->enum_type_count(); i++) { for (int i = 0; i < file_->enum_type_count(); i++) {
EnumGenerator *generator = new EnumGenerator(file_->enum_type(i)); EnumGenerator *generator = new EnumGenerator(file_->enum_type(i));
enum_generators_.push_back(generator); enum_generators_.emplace_back(generator);
} }
for (int i = 0; i < file_->message_type_count(); i++) { for (int i = 0; i < file_->message_type_count(); i++) {
MessageGenerator *generator = MessageGenerator *generator =
new MessageGenerator(root_class_name_, file_->message_type(i), options_); new MessageGenerator(root_class_name_, file_->message_type(i), options_);
message_generators_.push_back(generator); message_generators_.emplace_back(generator);
} }
for (int i = 0; i < file_->extension_count(); i++) { for (int i = 0; i < file_->extension_count(); i++) {
ExtensionGenerator *generator = ExtensionGenerator *generator =
new ExtensionGenerator(root_class_name_, file_->extension(i)); new ExtensionGenerator(root_class_name_, file_->extension(i));
extension_generators_.push_back(generator); extension_generators_.emplace_back(generator);
} }
} }
FileGenerator::~FileGenerator() { FileGenerator::~FileGenerator() {}
STLDeleteContainerPointers(enum_generators_.begin(), enum_generators_.end());
STLDeleteContainerPointers(message_generators_.begin(),
message_generators_.end());
STLDeleteContainerPointers(extension_generators_.begin(),
extension_generators_.end());
}
void FileGenerator::GenerateHeader(io::Printer *printer) { void FileGenerator::GenerateHeader(io::Printer *printer) {
std::set<string> headers; std::set<string> headers;
@ -270,9 +264,8 @@ void FileGenerator::GenerateHeader(io::Printer *printer) {
"\n"); "\n");
std::set<string> fwd_decls; std::set<string> fwd_decls;
for (std::vector<MessageGenerator *>::iterator iter = message_generators_.begin(); for (const auto& generator : message_generators_) {
iter != message_generators_.end(); ++iter) { generator->DetermineForwardDeclarations(&fwd_decls);
(*iter)->DetermineForwardDeclarations(&fwd_decls);
} }
for (std::set<string>::const_iterator i(fwd_decls.begin()); for (std::set<string>::const_iterator i(fwd_decls.begin());
i != fwd_decls.end(); ++i) { i != fwd_decls.end(); ++i) {
@ -287,14 +280,12 @@ void FileGenerator::GenerateHeader(io::Printer *printer) {
"\n"); "\n");
// need to write out all enums first // need to write out all enums first
for (std::vector<EnumGenerator *>::iterator iter = enum_generators_.begin(); for (const auto& generator : enum_generators_) {
iter != enum_generators_.end(); ++iter) { generator->GenerateHeader(printer);
(*iter)->GenerateHeader(printer);
} }
for (std::vector<MessageGenerator *>::iterator iter = message_generators_.begin(); for (const auto& generator : message_generators_) {
iter != message_generators_.end(); ++iter) { generator->GenerateEnumHeader(printer);
(*iter)->GenerateEnumHeader(printer);
} }
// For extensions to chain together, the Root gets created even if there // For extensions to chain together, the Root gets created even if there
@ -323,18 +314,15 @@ void FileGenerator::GenerateHeader(io::Printer *printer) {
"@interface $root_class_name$ (DynamicMethods)\n", "@interface $root_class_name$ (DynamicMethods)\n",
"root_class_name", root_class_name_); "root_class_name", root_class_name_);
for (std::vector<ExtensionGenerator *>::iterator iter = for (const auto& generator : extension_generators_) {
extension_generators_.begin(); generator->GenerateMembersHeader(printer);
iter != extension_generators_.end(); ++iter) {
(*iter)->GenerateMembersHeader(printer);
} }
printer->Print("@end\n\n"); printer->Print("@end\n\n");
} // extension_generators_.size() > 0 } // extension_generators_.size() > 0
for (std::vector<MessageGenerator *>::iterator iter = message_generators_.begin(); for (const auto& generator : message_generators_) {
iter != message_generators_.end(); ++iter) { generator->GenerateMessageHeader(printer);
(*iter)->GenerateMessageHeader(printer);
} }
printer->Print( printer->Print(
@ -403,9 +391,8 @@ void FileGenerator::GenerateSource(io::Printer *printer) {
} }
bool includes_oneof = false; bool includes_oneof = false;
for (std::vector<MessageGenerator *>::iterator iter = message_generators_.begin(); for (const auto& generator : message_generators_) {
iter != message_generators_.end(); ++iter) { if (generator->IncludesOneOfDefinition()) {
if ((*iter)->IncludesOneOfDefinition()) {
includes_oneof = true; includes_oneof = true;
break; break;
} }
@ -456,15 +443,11 @@ void FileGenerator::GenerateSource(io::Printer *printer) {
printer->Print( printer->Print(
"static GPBExtensionDescription descriptions[] = {\n"); "static GPBExtensionDescription descriptions[] = {\n");
printer->Indent(); printer->Indent();
for (std::vector<ExtensionGenerator *>::iterator iter = for (const auto& generator : extension_generators_) {
extension_generators_.begin(); generator->GenerateStaticVariablesInitialization(printer);
iter != extension_generators_.end(); ++iter) {
(*iter)->GenerateStaticVariablesInitialization(printer);
} }
for (std::vector<MessageGenerator *>::iterator iter = for (const auto& generator : message_generators_) {
message_generators_.begin(); generator->GenerateStaticVariablesInitialization(printer);
iter != message_generators_.end(); ++iter) {
(*iter)->GenerateStaticVariablesInitialization(printer);
} }
printer->Outdent(); printer->Outdent();
printer->Print( printer->Print(
@ -561,13 +544,11 @@ void FileGenerator::GenerateSource(io::Printer *printer) {
"\n"); "\n");
} }
for (std::vector<EnumGenerator *>::iterator iter = enum_generators_.begin(); for (const auto& generator : enum_generators_) {
iter != enum_generators_.end(); ++iter) { generator->GenerateSource(printer);
(*iter)->GenerateSource(printer);
} }
for (std::vector<MessageGenerator *>::iterator iter = message_generators_.begin(); for (const auto& generator : message_generators_) {
iter != message_generators_.end(); ++iter) { generator->GenerateSource(printer);
(*iter)->GenerateSource(printer);
} }
printer->Print( printer->Print(

@ -65,9 +65,9 @@ class FileGenerator {
string root_class_name_; string root_class_name_;
bool is_bundled_proto_; bool is_bundled_proto_;
std::vector<EnumGenerator*> enum_generators_; std::vector<std::unique_ptr<EnumGenerator>> enum_generators_;
std::vector<MessageGenerator*> message_generators_; std::vector<std::unique_ptr<MessageGenerator>> message_generators_;
std::vector<ExtensionGenerator*> extension_generators_; std::vector<std::unique_ptr<ExtensionGenerator>> extension_generators_;
const Options options_; const Options options_;

@ -184,18 +184,18 @@ MessageGenerator::MessageGenerator(const string& root_classname,
GetOptionalDeprecatedAttribute(descriptor, descriptor->file(), false, true)) { GetOptionalDeprecatedAttribute(descriptor, descriptor->file(), false, true)) {
for (int i = 0; i < descriptor_->extension_count(); i++) { for (int i = 0; i < descriptor_->extension_count(); i++) {
extension_generators_.push_back( extension_generators_.emplace_back(
new ExtensionGenerator(class_name_, descriptor_->extension(i))); new ExtensionGenerator(class_name_, descriptor_->extension(i)));
} }
for (int i = 0; i < descriptor_->oneof_decl_count(); i++) { for (int i = 0; i < descriptor_->oneof_decl_count(); i++) {
OneofGenerator* generator = new OneofGenerator(descriptor_->oneof_decl(i)); OneofGenerator* generator = new OneofGenerator(descriptor_->oneof_decl(i));
oneof_generators_.push_back(generator); oneof_generators_.emplace_back(generator);
} }
for (int i = 0; i < descriptor_->enum_type_count(); i++) { for (int i = 0; i < descriptor_->enum_type_count(); i++) {
EnumGenerator* generator = new EnumGenerator(descriptor_->enum_type(i)); EnumGenerator* generator = new EnumGenerator(descriptor_->enum_type(i));
enum_generators_.push_back(generator); enum_generators_.emplace_back(generator);
} }
for (int i = 0; i < descriptor_->nested_type_count(); i++) { for (int i = 0; i < descriptor_->nested_type_count(); i++) {
@ -203,32 +203,20 @@ MessageGenerator::MessageGenerator(const string& root_classname,
new MessageGenerator(root_classname_, new MessageGenerator(root_classname_,
descriptor_->nested_type(i), descriptor_->nested_type(i),
options); options);
nested_message_generators_.push_back(generator); nested_message_generators_.emplace_back(generator);
} }
} }
MessageGenerator::~MessageGenerator() { MessageGenerator::~MessageGenerator() {}
STLDeleteContainerPointers(extension_generators_.begin(),
extension_generators_.end());
STLDeleteContainerPointers(enum_generators_.begin(), enum_generators_.end());
STLDeleteContainerPointers(nested_message_generators_.begin(),
nested_message_generators_.end());
STLDeleteContainerPointers(oneof_generators_.begin(),
oneof_generators_.end());
}
void MessageGenerator::GenerateStaticVariablesInitialization( void MessageGenerator::GenerateStaticVariablesInitialization(
io::Printer* printer) { io::Printer* printer) {
for (std::vector<ExtensionGenerator*>::iterator iter = for (const auto& generator : extension_generators_) {
extension_generators_.begin(); generator->GenerateStaticVariablesInitialization(printer);
iter != extension_generators_.end(); ++iter) {
(*iter)->GenerateStaticVariablesInitialization(printer);
} }
for (std::vector<MessageGenerator*>::iterator iter = for (const auto& generator : nested_message_generators_) {
nested_message_generators_.begin(); generator->GenerateStaticVariablesInitialization(printer);
iter != nested_message_generators_.end(); ++iter) {
(*iter)->GenerateStaticVariablesInitialization(printer);
} }
} }
@ -241,10 +229,8 @@ void MessageGenerator::DetermineForwardDeclarations(std::set<string>* fwd_decls)
} }
} }
for (std::vector<MessageGenerator*>::iterator iter = for (const auto& generator : nested_message_generators_) {
nested_message_generators_.begin(); generator->DetermineForwardDeclarations(fwd_decls);
iter != nested_message_generators_.end(); ++iter) {
(*iter)->DetermineForwardDeclarations(fwd_decls);
} }
} }
@ -253,10 +239,8 @@ bool MessageGenerator::IncludesOneOfDefinition() const {
return true; return true;
} }
for (std::vector<MessageGenerator*>::const_iterator iter = for (const auto& generator : nested_message_generators_) {
nested_message_generators_.begin(); if (generator->IncludesOneOfDefinition()) {
iter != nested_message_generators_.end(); ++iter) {
if ((*iter)->IncludesOneOfDefinition()) {
return true; return true;
} }
} }
@ -265,40 +249,31 @@ bool MessageGenerator::IncludesOneOfDefinition() const {
} }
void MessageGenerator::GenerateEnumHeader(io::Printer* printer) { void MessageGenerator::GenerateEnumHeader(io::Printer* printer) {
for (std::vector<EnumGenerator*>::iterator iter = enum_generators_.begin(); for (const auto& generator : enum_generators_) {
iter != enum_generators_.end(); ++iter) { generator->GenerateHeader(printer);
(*iter)->GenerateHeader(printer);
} }
for (std::vector<MessageGenerator*>::iterator iter = for (const auto& generator : nested_message_generators_) {
nested_message_generators_.begin(); generator->GenerateEnumHeader(printer);
iter != nested_message_generators_.end(); ++iter) {
(*iter)->GenerateEnumHeader(printer);
} }
} }
void MessageGenerator::GenerateExtensionRegistrationSource( void MessageGenerator::GenerateExtensionRegistrationSource(
io::Printer* printer) { io::Printer* printer) {
for (std::vector<ExtensionGenerator*>::iterator iter = for (const auto& generator : extension_generators_) {
extension_generators_.begin(); generator->GenerateRegistrationSource(printer);
iter != extension_generators_.end(); ++iter) {
(*iter)->GenerateRegistrationSource(printer);
} }
for (std::vector<MessageGenerator*>::iterator iter = for (const auto& generator : nested_message_generators_) {
nested_message_generators_.begin(); generator->GenerateExtensionRegistrationSource(printer);
iter != nested_message_generators_.end(); ++iter) {
(*iter)->GenerateExtensionRegistrationSource(printer);
} }
} }
void MessageGenerator::GenerateMessageHeader(io::Printer* printer) { void MessageGenerator::GenerateMessageHeader(io::Printer* printer) {
// This a a map entry message, just recurse and do nothing directly. // This a a map entry message, just recurse and do nothing directly.
if (IsMapEntryMessage(descriptor_)) { if (IsMapEntryMessage(descriptor_)) {
for (std::vector<MessageGenerator*>::iterator iter = for (const auto& generator : nested_message_generators_) {
nested_message_generators_.begin(); generator->GenerateMessageHeader(printer);
iter != nested_message_generators_.end(); ++iter) {
(*iter)->GenerateMessageHeader(printer);
} }
return; return;
} }
@ -325,9 +300,8 @@ void MessageGenerator::GenerateMessageHeader(io::Printer* printer) {
printer->Print("};\n\n"); printer->Print("};\n\n");
} }
for (std::vector<OneofGenerator*>::iterator iter = oneof_generators_.begin(); for (const auto& generator : oneof_generators_) {
iter != oneof_generators_.end(); ++iter) { generator->GenerateCaseEnum(printer);
(*iter)->GenerateCaseEnum(printer);
} }
string message_comments; string message_comments;
@ -366,9 +340,8 @@ void MessageGenerator::GenerateMessageHeader(io::Printer* printer) {
} }
if (!oneof_generators_.empty()) { if (!oneof_generators_.empty()) {
for (std::vector<OneofGenerator*>::iterator iter = oneof_generators_.begin(); for (const auto& generator : oneof_generators_) {
iter != oneof_generators_.end(); ++iter) { generator->GenerateClearFunctionDeclaration(printer);
(*iter)->GenerateClearFunctionDeclaration(printer);
} }
printer->Print("\n"); printer->Print("\n");
} }
@ -376,18 +349,14 @@ void MessageGenerator::GenerateMessageHeader(io::Printer* printer) {
if (descriptor_->extension_count() > 0) { if (descriptor_->extension_count() > 0) {
printer->Print("@interface $classname$ (DynamicMethods)\n\n", printer->Print("@interface $classname$ (DynamicMethods)\n\n",
"classname", class_name_); "classname", class_name_);
for (std::vector<ExtensionGenerator*>::iterator iter = for (const auto& generator : extension_generators_) {
extension_generators_.begin(); generator->GenerateMembersHeader(printer);
iter != extension_generators_.end(); ++iter) {
(*iter)->GenerateMembersHeader(printer);
} }
printer->Print("@end\n\n"); printer->Print("@end\n\n");
} }
for (std::vector<MessageGenerator*>::iterator iter = for (const auto& generator : nested_message_generators_) {
nested_message_generators_.begin(); generator->GenerateMessageHeader(printer);
iter != nested_message_generators_.end(); ++iter) {
(*iter)->GenerateMessageHeader(printer);
} }
} }
@ -409,9 +378,8 @@ void MessageGenerator::GenerateSource(io::Printer* printer) {
printer->Print("@implementation $classname$\n\n", printer->Print("@implementation $classname$\n\n",
"classname", class_name_); "classname", class_name_);
for (std::vector<OneofGenerator*>::iterator iter = oneof_generators_.begin(); for (const auto& generator : oneof_generators_) {
iter != oneof_generators_.end(); ++iter) { generator->GeneratePropertyImplementation(printer);
(*iter)->GeneratePropertyImplementation(printer);
} }
for (int i = 0; i < descriptor_->field_count(); i++) { for (int i = 0; i < descriptor_->field_count(); i++) {
@ -447,9 +415,8 @@ void MessageGenerator::GenerateSource(io::Printer* printer) {
sizeof_has_storage = 1; sizeof_has_storage = 1;
} }
// Tell all the fields the oneof base. // Tell all the fields the oneof base.
for (std::vector<OneofGenerator*>::iterator iter = oneof_generators_.begin(); for (const auto& generator : oneof_generators_) {
iter != oneof_generators_.end(); ++iter) { generator->SetOneofIndexBase(sizeof_has_storage);
(*iter)->SetOneofIndexBase(sizeof_has_storage);
} }
field_generators_.SetOneofIndexBase(sizeof_has_storage); field_generators_.SetOneofIndexBase(sizeof_has_storage);
// sizeof_has_storage needs enough bits for the single fields that aren't in // sizeof_has_storage needs enough bits for the single fields that aren't in
@ -547,11 +514,9 @@ void MessageGenerator::GenerateSource(io::Printer* printer) {
if (oneof_generators_.size() != 0) { if (oneof_generators_.size() != 0) {
printer->Print( printer->Print(
" static const char *oneofs[] = {\n"); " static const char *oneofs[] = {\n");
for (std::vector<OneofGenerator*>::iterator iter = oneof_generators_.begin(); for (const auto& generator : oneof_generators_) {
iter != oneof_generators_.end(); ++iter) { printer->Print(" \"$name$\",\n", "name",
printer->Print( generator->DescriptorName());
" \"$name$\",\n",
"name", (*iter)->DescriptorName());
} }
printer->Print( printer->Print(
" };\n" " };\n"
@ -624,21 +589,17 @@ void MessageGenerator::GenerateSource(io::Printer* printer) {
.GenerateCFunctionImplementations(printer); .GenerateCFunctionImplementations(printer);
} }
for (std::vector<OneofGenerator*>::iterator iter = oneof_generators_.begin(); for (const auto& generator : oneof_generators_) {
iter != oneof_generators_.end(); ++iter) { generator->GenerateClearFunctionImplementation(printer);
(*iter)->GenerateClearFunctionImplementation(printer);
} }
} }
for (std::vector<EnumGenerator*>::iterator iter = enum_generators_.begin(); for (const auto& generator : enum_generators_) {
iter != enum_generators_.end(); ++iter) { generator->GenerateSource(printer);
(*iter)->GenerateSource(printer);
} }
for (std::vector<MessageGenerator*>::iterator iter = for (const auto& generator : nested_message_generators_) {
nested_message_generators_.begin(); generator->GenerateSource(printer);
iter != nested_message_generators_.end(); ++iter) {
(*iter)->GenerateSource(printer);
} }
} }

@ -85,10 +85,10 @@ class MessageGenerator {
FieldGeneratorMap field_generators_; FieldGeneratorMap field_generators_;
const string class_name_; const string class_name_;
const string deprecated_attribute_; const string deprecated_attribute_;
std::vector<ExtensionGenerator*> extension_generators_; std::vector<std::unique_ptr<ExtensionGenerator>> extension_generators_;
std::vector<EnumGenerator*> enum_generators_; std::vector<std::unique_ptr<EnumGenerator>> enum_generators_;
std::vector<MessageGenerator*> nested_message_generators_; std::vector<std::unique_ptr<MessageGenerator>> nested_message_generators_;
std::vector<OneofGenerator*> oneof_generators_; std::vector<std::unique_ptr<OneofGenerator>> oneof_generators_;
}; };
} // namespace objectivec } // namespace objectivec

@ -655,88 +655,50 @@ void GenerateOneofField(const OneofDescriptor* oneof, io::Printer* printer) {
void GenerateFieldAccessor(const FieldDescriptor* field, bool is_descriptor, void GenerateFieldAccessor(const FieldDescriptor* field, bool is_descriptor,
io::Printer* printer) { io::Printer* printer) {
bool need_other_name_for_accessor = false;
bool need_other_name_for_wrapper_accessor = false;
const Descriptor* desc = field->containing_type();
if (!field->is_repeated() &&
field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE &&
IsWrapperType(field)) {
// Check if there is any field called xxx_value
const FieldDescriptor* other =
desc->FindFieldByName(StrCat(field->name(), "_value"));
if (other != NULL) {
need_other_name_for_wrapper_accessor = true;
}
}
if (strings::EndsWith(field->name(), "_value")) {
std::size_t pos = (field->name()).find("_value");
string name = (field->name()).substr(0, pos);
const FieldDescriptor* other = desc->FindFieldByName(name);
if (other != NULL &&
!other->is_repeated() &&
other->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE &&
IsWrapperType(other)) {
need_other_name_for_accessor = true;
}
}
const OneofDescriptor* oneof = field->containing_oneof(); const OneofDescriptor* oneof = field->containing_oneof();
// Generate getter. // Generate getter.
if (oneof != NULL) { if (oneof != NULL) {
GenerateFieldDocComment(printer, field, is_descriptor, kFieldGetter); GenerateFieldDocComment(printer, field, is_descriptor, kFieldGetter);
printer->Print( printer->Print(
"public function get^camel_name^^field_number^()\n" "public function get^camel_name^()\n"
"{\n" "{\n"
" return $this->readOneof(^number^);\n" " return $this->readOneof(^number^);\n"
"}\n\n", "}\n\n",
"camel_name", UnderscoresToCamelCase(field->name(), true), "camel_name", UnderscoresToCamelCase(field->name(), true),
"number", IntToString(field->number()), "number", IntToString(field->number()));
"field_number", need_other_name_for_accessor ?
StrCat(field->number()) : "");
} else { } else {
GenerateFieldDocComment(printer, field, is_descriptor, kFieldGetter); GenerateFieldDocComment(printer, field, is_descriptor, kFieldGetter);
printer->Print( printer->Print(
"public function get^camel_name^^field_number^()\n" "public function get^camel_name^()\n"
"{\n" "{\n"
" return $this->^name^;\n" " return $this->^name^;\n"
"}\n\n", "}\n\n",
"camel_name", UnderscoresToCamelCase(field->name(), true), "camel_name", UnderscoresToCamelCase(field->name(), true), "name",
"name", field->name(), field->name());
"field_number", need_other_name_for_accessor ?
StrCat(field->number()) : "");
} }
// For wrapper types, generate an additional getXXXValue getter // For wrapper types, generate an additional getXXXUnwrapped getter
if (!field->is_map() && if (!field->is_map() &&
!field->is_repeated() && !field->is_repeated() &&
field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE && field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE &&
IsWrapperType(field)) { IsWrapperType(field)) {
GenerateWrapperFieldGetterDocComment(printer, field); GenerateWrapperFieldGetterDocComment(printer, field);
printer->Print( printer->Print(
"public function get^camel_name^Value^field_number1^()\n" "public function get^camel_name^Unwrapped()\n"
"{\n" "{\n"
" $wrapper = $this->get^camel_name^^field_number2^();\n" " $wrapper = $this->get^camel_name^();\n"
" return is_null($wrapper) ? null : $wrapper->getValue();\n" " return is_null($wrapper) ? null : $wrapper->getValue();\n"
"}\n\n", "}\n\n",
"camel_name", UnderscoresToCamelCase(field->name(), true), "camel_name", UnderscoresToCamelCase(field->name(), true));
"field_number1", need_other_name_for_wrapper_accessor ?
StrCat(field->number()) : "",
"field_number2", need_other_name_for_accessor ?
StrCat(field->number()) : "");
} }
// Generate setter. // Generate setter.
GenerateFieldDocComment(printer, field, is_descriptor, kFieldSetter); GenerateFieldDocComment(printer, field, is_descriptor, kFieldSetter);
printer->Print( printer->Print(
"public function set^camel_name^^field_number^($var)\n" "public function set^camel_name^($var)\n"
"{\n", "{\n",
"camel_name", UnderscoresToCamelCase(field->name(), true), "camel_name", UnderscoresToCamelCase(field->name(), true));
"field_number", need_other_name_for_accessor ?
StrCat(field->number()) : "");
Indent(printer); Indent(printer);
@ -836,17 +798,13 @@ void GenerateFieldAccessor(const FieldDescriptor* field, bool is_descriptor,
IsWrapperType(field)) { IsWrapperType(field)) {
GenerateWrapperFieldSetterDocComment(printer, field); GenerateWrapperFieldSetterDocComment(printer, field);
printer->Print( printer->Print(
"public function set^camel_name^Value^field_number1^($var)\n" "public function set^camel_name^Unwrapped($var)\n"
"{\n" "{\n"
" $wrappedVar = is_null($var) ? null : new \\^wrapper_type^(['value' => $var]);\n" " $wrappedVar = is_null($var) ? null : new \\^wrapper_type^(['value' => $var]);\n"
" return $this->set^camel_name^^field_number2^($wrappedVar);\n" " return $this->set^camel_name^($wrappedVar);\n"
"}\n\n", "}\n\n",
"camel_name", UnderscoresToCamelCase(field->name(), true), "camel_name", UnderscoresToCamelCase(field->name(), true),
"wrapper_type", LegacyFullClassName(field->message_type(), is_descriptor), "wrapper_type", LegacyFullClassName(field->message_type(), is_descriptor));
"field_number1", need_other_name_for_wrapper_accessor ?
StrCat(field->number()) : "",
"field_number2", need_other_name_for_accessor ?
StrCat(field->number()) : "");
} }
// Generate has method for proto2 only. // Generate has method for proto2 only.
@ -1307,7 +1265,7 @@ void GenerateMessageFile(const FileDescriptor* file, const Descriptor* message,
} }
printer.Print( printer.Print(
"class ^name^ extends \\Google\\Protobuf\\Internal\\Message\n" "final class ^name^ extends \\Google\\Protobuf\\Internal\\Message\n"
"{\n", "{\n",
"name", fullname); "name", fullname);
Indent(&printer); Indent(&printer);

Loading…
Cancel
Save