Browse Source

Merge branch 'master' of github.com:google/protobuf

Jisi Liu 9 years ago
parent
commit
0de06f54bc
100 changed files with 4003 additions and 6610 deletions
  1. 10 1
      .travis.yml
  2. 64 11
      BUILD
  3. 2 4
      Makefile.am
  4. 0 1
      Protobuf.podspec
  5. 20 0
      WORKSPACE
  6. 12 4
      conformance/conformance_ruby.rb
  7. 4 140
      conformance/failure_list_ruby.txt
  8. 8 1
      csharp/protos/unittest_issues.proto
  9. 9 0
      csharp/src/Google.Protobuf.Test/GeneratedMessageTest.cs
  10. 19 0
      csharp/src/Google.Protobuf.Test/IssuesTest.cs
  11. 168 5
      csharp/src/Google.Protobuf.Test/TestProtos/UnittestIssues.cs
  12. 4 3
      csharp/src/Google.Protobuf/Collections/MapField.cs
  13. 4 3
      csharp/src/Google.Protobuf/Collections/RepeatedField.cs
  14. 134 118
      csharp/src/Google.Protobuf/JsonFormatter.cs
  15. 6 0
      csharp/src/Google.Protobuf/Reflection/FieldDescriptor.cs
  16. 1 1
      csharp/src/Google.Protobuf/Reflection/MessageDescriptor.cs
  17. 9 8
      csharp/src/Google.Protobuf/WellKnownTypes/FieldMaskPartial.cs
  18. 2 2
      generate_descriptor_proto.sh
  19. 3 4
      java/util/src/main/java/com/google/protobuf/util/JsonFormat.java
  20. 6 0
      jenkins/README.md
  21. 56 0
      jenkins/build_and_run_docker.sh
  22. 6 0
      jenkins/buildcmds/README.md
  23. 15 0
      jenkins/buildcmds/pull_request.sh
  24. 130 0
      jenkins/docker/Dockerfile
  25. 91 0
      jenkins/make_test_output.py
  26. 72 0
      jenkins/pull_request_in_docker.sh
  27. 36 29
      objectivec/DevTools/compile_testing_protos.sh
  28. 2 2
      objectivec/DevTools/full_mac_build.sh
  29. 1 8
      objectivec/GPBBootstrap.h
  30. 50 16
      objectivec/GPBCodedInputStream.h
  31. 104 102
      objectivec/GPBCodedOutputStream.h
  32. 3 14
      objectivec/GPBCodedOutputStream.m
  33. 126 0
      objectivec/GPBCodedOutputStream_PackagePrivate.h
  34. 3 8
      objectivec/GPBDescriptor.h
  35. 163 197
      objectivec/GPBDescriptor.m
  36. 89 94
      objectivec/GPBDescriptor_PackagePrivate.h
  37. 1 1
      objectivec/GPBDictionary.m
  38. 1 1
      objectivec/GPBExtensionInternals.m
  39. 34 19
      objectivec/GPBExtensionRegistry.h
  40. 179 48
      objectivec/GPBMessage.h
  41. 9 26
      objectivec/GPBMessage.m
  42. 12 0
      objectivec/GPBMessage_PackagePrivate.h
  43. 0 2
      objectivec/GPBProtocolBuffers.m
  44. 4 3
      objectivec/GPBRootObject.h
  45. 2 2
      objectivec/GPBRuntimeTypes.h
  46. 31 2
      objectivec/GPBUnknownField.h
  47. 1 1
      objectivec/GPBUnknownField.m
  48. 16 1
      objectivec/GPBUnknownFieldSet.h
  49. 110 40
      objectivec/GPBUtilities.h
  50. 36 29
      objectivec/GPBUtilities.m
  51. 1 1
      objectivec/GPBUtilities_PackagePrivate.h
  52. 3 11
      objectivec/ProtocolBuffers_OSX.xcodeproj/project.pbxproj
  53. 3 11
      objectivec/ProtocolBuffers_iOS.xcodeproj/project.pbxproj
  54. 5 0
      objectivec/Tests/GPBARCUnittestProtos.m
  55. 20 1
      objectivec/Tests/GPBCodedOuputStreamTests.m
  56. 0 13
      objectivec/Tests/GPBDescriptorTests.m
  57. 18 0
      objectivec/Tests/GPBMessageTests.m
  58. 5 0
      objectivec/Tests/GPBUnittestProtos.m
  59. 12 0
      objectivec/Tests/unittest_objc.proto
  60. 3 4
      objectivec/generate_well_known_types.sh
  61. 60 58
      objectivec/google/protobuf/Any.pbobjc.h
  62. 11 22
      objectivec/google/protobuf/Any.pbobjc.m
  63. 142 125
      objectivec/google/protobuf/Api.pbobjc.h
  64. 49 102
      objectivec/google/protobuf/Api.pbobjc.m
  65. 0 1199
      objectivec/google/protobuf/Descriptor.pbobjc.h
  66. 0 2594
      objectivec/google/protobuf/Descriptor.pbobjc.m
  67. 57 55
      objectivec/google/protobuf/Duration.pbobjc.h
  68. 6 16
      objectivec/google/protobuf/Duration.pbobjc.m
  69. 18 16
      objectivec/google/protobuf/Empty.pbobjc.h
  70. 2 8
      objectivec/google/protobuf/Empty.pbobjc.m
  71. 133 130
      objectivec/google/protobuf/FieldMask.pbobjc.h
  72. 4 12
      objectivec/google/protobuf/FieldMask.pbobjc.m
  73. 13 11
      objectivec/google/protobuf/SourceContext.pbobjc.h
  74. 4 12
      objectivec/google/protobuf/SourceContext.pbobjc.m
  75. 53 38
      objectivec/google/protobuf/Struct.pbobjc.h
  76. 42 70
      objectivec/google/protobuf/Struct.pbobjc.m
  77. 69 67
      objectivec/google/protobuf/Timestamp.pbobjc.h
  78. 6 16
      objectivec/google/protobuf/Timestamp.pbobjc.m
  79. 119 72
      objectivec/google/protobuf/Type.pbobjc.h
  80. 138 199
      objectivec/google/protobuf/Type.pbobjc.m
  81. 45 43
      objectivec/google/protobuf/Wrappers.pbobjc.h
  82. 36 109
      objectivec/google/protobuf/Wrappers.pbobjc.m
  83. 25 0
      protobuf.bzl
  84. 1 1
      python/google/protobuf/__init__.py
  85. 1 0
      python/setup.py
  86. 44 1
      ruby/Rakefile
  87. 5 0
      ruby/ext/google/protobuf_c/defs.c
  88. 15 4
      ruby/ext/google/protobuf_c/encode_decode.c
  89. 1 0
      ruby/ext/google/protobuf_c/protobuf.h
  90. 479 407
      ruby/ext/google/protobuf_c/upb.c
  91. 307 40
      ruby/ext/google/protobuf_c/upb.h
  92. 1 1
      ruby/tests/basic.rb
  93. 0 74
      ruby/tests/generated_code.rb
  94. 45 26
      src/google/protobuf/compiler/objectivec/objectivec_enum.cc
  95. 8 14
      src/google/protobuf/compiler/objectivec/objectivec_enum_field.cc
  96. 0 2
      src/google/protobuf/compiler/objectivec/objectivec_enum_field.h
  97. 4 4
      src/google/protobuf/compiler/objectivec/objectivec_extension.cc
  98. 95 61
      src/google/protobuf/compiler/objectivec/objectivec_field.cc
  99. 18 2
      src/google/protobuf/compiler/objectivec/objectivec_field.h
  100. 9 7
      src/google/protobuf/compiler/objectivec/objectivec_file.cc

+ 10 - 1
.travis.yml

@@ -10,7 +10,7 @@ os:
 # The Objective C build needs Xcode 7.0 or later.
 # The Objective C build needs Xcode 7.0 or later.
 osx_image: xcode7.2
 osx_image: xcode7.2
 script:
 script:
-  - ./travis.sh $CONFIG
+  - ./tests.sh $CONFIG
 env:
 env:
   - CONFIG=cpp
   - CONFIG=cpp
   - CONFIG=cpp_distcheck
   - CONFIG=cpp_distcheck
@@ -71,5 +71,14 @@ matrix:
     # we moved to an OS X image that is 10.11.
     # we moved to an OS X image that is 10.11.
     - os: osx
     - os: osx
       env: CONFIG=python_cpp
       env: CONFIG=python_cpp
+    # xctool 0.2.8 seems to have a bug where it randomly kills tests saying
+    # they failed.
+    #   https://github.com/facebook/xctool/issues/619
+    #   https://github.com/google/protobuf/issues/1232
+    # travis updated their images to include 0.2.8:
+    #   https://blog.travis-ci.com/2016-03-23-xcode-image-updates
+    # Mark the iOS test as flakey so these failures don't turn things red.
+    - os: osx
+      env: CONFIG=objectivec_ios
 notifications:
 notifications:
   email: false
   email: false

+ 64 - 11
BUILD

@@ -22,9 +22,41 @@ load(
     "protobuf",
     "protobuf",
     "cc_proto_library",
     "cc_proto_library",
     "py_proto_library",
     "py_proto_library",
+    "internal_gen_well_known_protos_java",
     "internal_protobuf_py_tests",
     "internal_protobuf_py_tests",
 )
 )
 
 
+config_setting(
+    name = "ios_armv7",
+    values = {
+        "ios_cpu": "armv7",
+    },
+)
+
+config_setting(
+    name = "ios_armv7s",
+    values = {
+        "ios_cpu": "armv7s",
+    },
+)
+
+config_setting(
+    name = "ios_arm64",
+    values = {
+        "ios_cpu": "arm64",
+    },
+)
+
+IOS_ARM_COPTS = COPTS + [
+    "-DOS_IOS",
+    "-miphoneos-version-min=7.0",
+    "-arch armv7",
+    "-arch armv7s",
+    "-arch arm64",
+    "-D__thread=",
+    "-isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS9.2.sdk/",
+]
+
 cc_library(
 cc_library(
     name = "protobuf_lite",
     name = "protobuf_lite",
     srcs = [
     srcs = [
@@ -54,7 +86,12 @@ cc_library(
         "src/google/protobuf/wire_format_lite.cc",
         "src/google/protobuf/wire_format_lite.cc",
     ],
     ],
     hdrs = glob(["src/google/protobuf/**/*.h"]),
     hdrs = glob(["src/google/protobuf/**/*.h"]),
-    copts = COPTS,
+    copts = select({
+        ":ios_armv7": IOS_ARM_COPTS,
+        ":ios_armv7s": IOS_ARM_COPTS,
+        ":ios_arm64": IOS_ARM_COPTS,
+        "//conditions:default": COPTS,
+    }),
     includes = ["src/"],
     includes = ["src/"],
     linkopts = LINK_OPTS,
     linkopts = LINK_OPTS,
     visibility = ["//visibility:public"],
     visibility = ["//visibility:public"],
@@ -119,7 +156,12 @@ cc_library(
         "src/google/protobuf/wrappers.pb.cc",
         "src/google/protobuf/wrappers.pb.cc",
     ],
     ],
     hdrs = glob(["src/**/*.h"]),
     hdrs = glob(["src/**/*.h"]),
-    copts = COPTS,
+    copts = select({
+        ":ios_armv7": IOS_ARM_COPTS,
+        ":ios_armv7s": IOS_ARM_COPTS,
+        ":ios_arm64": IOS_ARM_COPTS,
+        "//conditions:default": COPTS,
+    }),
     includes = ["src/"],
     includes = ["src/"],
     linkopts = LINK_OPTS,
     linkopts = LINK_OPTS,
     visibility = ["//visibility:public"],
     visibility = ["//visibility:public"],
@@ -152,6 +194,12 @@ RELATIVE_WELL_KNOWN_PROTOS = [
 
 
 WELL_KNOWN_PROTOS = ["src/" + s for s in RELATIVE_WELL_KNOWN_PROTOS]
 WELL_KNOWN_PROTOS = ["src/" + s for s in RELATIVE_WELL_KNOWN_PROTOS]
 
 
+filegroup(
+    name = "well_known_protos",
+    srcs = WELL_KNOWN_PROTOS,
+    visibility = ["//visibility:public"],
+)
+
 cc_proto_library(
 cc_proto_library(
     name = "cc_wkt_protos",
     name = "cc_wkt_protos",
     srcs = WELL_KNOWN_PROTOS,
     srcs = WELL_KNOWN_PROTOS,
@@ -457,16 +505,8 @@ cc_test(
 ################################################################################
 ################################################################################
 # Java support
 # Java support
 ################################################################################
 ################################################################################
-genrule(
-    name = "gen_well_known_protos_java",
+internal_gen_well_known_protos_java(
     srcs = WELL_KNOWN_PROTOS,
     srcs = WELL_KNOWN_PROTOS,
-    outs = [
-        "wellknown.srcjar",
-    ],
-    cmd = "$(location :protoc) --java_out=$(@D)/wellknown.jar" +
-          " -Isrc $(SRCS) " +
-          " && mv $(@D)/wellknown.jar $(@D)/wellknown.srcjar",
-    tools = [":protoc"],
 )
 )
 
 
 java_library(
 java_library(
@@ -479,6 +519,19 @@ java_library(
     visibility = ["//visibility:public"],
     visibility = ["//visibility:public"],
 )
 )
 
 
+java_library(
+    name = "protobuf_java_util",
+    srcs = glob([
+        "java/util/src/main/java/com/google/protobuf/util/*.java",
+    ]),
+    deps = [
+      "protobuf_java",
+      "//external:gson",
+      "//external:guava",
+    ],
+    visibility = ["//visibility:public"],
+)
+
 ################################################################################
 ################################################################################
 # Python support
 # Python support
 ################################################################################
 ################################################################################

+ 2 - 4
Makefile.am

@@ -389,13 +389,11 @@ objectivec_EXTRA_DIST=                                                       \
   objectivec/DevTools/full_mac_build.sh                                      \
   objectivec/DevTools/full_mac_build.sh                                      \
   objectivec/DevTools/pddm.py                                                \
   objectivec/DevTools/pddm.py                                                \
   objectivec/DevTools/pddm_tests.py                                          \
   objectivec/DevTools/pddm_tests.py                                          \
-  objectivec/generate_descriptors_proto.sh                                   \
+  objectivec/generate_well_known_types.sh                                    \
   objectivec/google/protobuf/Any.pbobjc.h                                    \
   objectivec/google/protobuf/Any.pbobjc.h                                    \
   objectivec/google/protobuf/Any.pbobjc.m                                    \
   objectivec/google/protobuf/Any.pbobjc.m                                    \
   objectivec/google/protobuf/Api.pbobjc.h                                    \
   objectivec/google/protobuf/Api.pbobjc.h                                    \
   objectivec/google/protobuf/Api.pbobjc.m                                    \
   objectivec/google/protobuf/Api.pbobjc.m                                    \
-  objectivec/google/protobuf/Descriptor.pbobjc.h                             \
-  objectivec/google/protobuf/Descriptor.pbobjc.m                             \
   objectivec/google/protobuf/Duration.pbobjc.h                               \
   objectivec/google/protobuf/Duration.pbobjc.h                               \
   objectivec/google/protobuf/Duration.pbobjc.m                               \
   objectivec/google/protobuf/Duration.pbobjc.m                               \
   objectivec/google/protobuf/Empty.pbobjc.h                                  \
   objectivec/google/protobuf/Empty.pbobjc.h                                  \
@@ -421,6 +419,7 @@ objectivec_EXTRA_DIST=                                                       \
   objectivec/GPBCodedInputStream_PackagePrivate.h                            \
   objectivec/GPBCodedInputStream_PackagePrivate.h                            \
   objectivec/GPBCodedOutputStream.h                                          \
   objectivec/GPBCodedOutputStream.h                                          \
   objectivec/GPBCodedOutputStream.m                                          \
   objectivec/GPBCodedOutputStream.m                                          \
+  objectivec/GPBCodedOutputStream_PackagePrivate.h                           \
   objectivec/GPBDescriptor.h                                                 \
   objectivec/GPBDescriptor.h                                                 \
   objectivec/GPBDescriptor.m                                                 \
   objectivec/GPBDescriptor.m                                                 \
   objectivec/GPBDescriptor_PackagePrivate.h                                  \
   objectivec/GPBDescriptor_PackagePrivate.h                                  \
@@ -661,7 +660,6 @@ ruby_EXTRA_DIST=                                                             \
   ruby/tests/repeated_field_test.rb                                          \
   ruby/tests/repeated_field_test.rb                                          \
   ruby/tests/stress.rb                                                       \
   ruby/tests/stress.rb                                                       \
   ruby/tests/generated_code.proto                                            \
   ruby/tests/generated_code.proto                                            \
-  ruby/tests/generated_code.rb                                               \
   ruby/tests/generated_code_test.rb                                          \
   ruby/tests/generated_code_test.rb                                          \
   ruby/travis-test.sh
   ruby/travis-test.sh
 
 

+ 0 - 1
Protobuf.podspec

@@ -17,7 +17,6 @@ Pod::Spec.new do |s|
   s.source_files = 'objectivec/*.{h,m}',
   s.source_files = 'objectivec/*.{h,m}',
                    'objectivec/google/protobuf/Any.pbobjc.{h,m}',
                    'objectivec/google/protobuf/Any.pbobjc.{h,m}',
                    'objectivec/google/protobuf/Api.pbobjc.{h,m}',
                    'objectivec/google/protobuf/Api.pbobjc.{h,m}',
-                   'objectivec/google/protobuf/Descriptor.pbobjc.{h,m}',
                    'objectivec/google/protobuf/Duration.pbobjc.h',
                    'objectivec/google/protobuf/Duration.pbobjc.h',
                    'objectivec/google/protobuf/Empty.pbobjc.{h,m}',
                    'objectivec/google/protobuf/Empty.pbobjc.{h,m}',
                    'objectivec/google/protobuf/FieldMask.pbobjc.{h,m}',
                    'objectivec/google/protobuf/FieldMask.pbobjc.{h,m}',

+ 20 - 0
WORKSPACE

@@ -31,3 +31,23 @@ bind(
     name = "six",
     name = "six",
     actual = "@six_archive//:six",
     actual = "@six_archive//:six",
 )
 )
+
+maven_jar(
+  name = "guava_maven",
+  artifact = "com.google.guava:guava:18.0",
+)
+
+bind(
+    name = "guava",
+    actual = "@guava_maven//jar",
+)
+
+maven_jar(
+  name = "gson_maven",
+  artifact = "com.google.code.gson:gson:2.3",
+)
+
+bind(
+    name = "gson",
+    actual = "@gson_maven//jar",
+)

+ 12 - 4
conformance/conformance_ruby.rb

@@ -51,7 +51,12 @@ def do_test(request)
       end
       end
 
 
     when :json_payload
     when :json_payload
-      test_message = Conformance::TestAllTypes.decode_json(request.json_payload)
+      begin
+        test_message = Conformance::TestAllTypes.decode_json(request.json_payload)
+      rescue Google::Protobuf::ParseError => err
+        response.parse_error = err.message.encode('utf-8')
+        return response
+      end
 
 
     when nil
     when nil
       fail "Request didn't have payload"
       fail "Request didn't have payload"
@@ -66,6 +71,9 @@ def do_test(request)
 
 
     when :JSON
     when :JSON
       response.json_payload = test_message.to_json
       response.json_payload = test_message.to_json
+
+    when nil
+      fail "Request didn't have requested output format"
     end
     end
   rescue StandardError => err
   rescue StandardError => err
     response.runtime_error = err.message.encode('utf-8')
     response.runtime_error = err.message.encode('utf-8')
@@ -96,8 +104,8 @@ def do_test_io
   STDOUT.flush
   STDOUT.flush
 
 
   if $verbose
   if $verbose
-    STDERR.puts("conformance-cpp: request={request.to_json}, " \
-                                 "response={response.to_json}\n")
+    STDERR.puts("conformance_ruby: request=#{request.to_json}, " \
+                                 "response=#{response.to_json}\n")
   end
   end
 
 
   $test_count += 1
   $test_count += 1
@@ -107,7 +115,7 @@ end
 
 
 loop do
 loop do
   unless do_test_io
   unless do_test_io
-    STDERR.puts('conformance-cpp: received EOF from test runner ' \
+    STDERR.puts('conformance_ruby: received EOF from test runner ' \
                 "after #{$test_count} tests, exiting")
                 "after #{$test_count} tests, exiting")
     break
     break
   end
   end

+ 4 - 140
conformance/failure_list_ruby.txt

@@ -1,18 +1,12 @@
-# Many of the JSON tests are failing due to a simple bug:
-# fields are not camel-cased at all right now.  Once this
-# is fixed, this list should grow a lot shorter.
-
 DurationProtoInputTooLarge.JsonOutput
 DurationProtoInputTooLarge.JsonOutput
 DurationProtoInputTooSmall.JsonOutput
 DurationProtoInputTooSmall.JsonOutput
 FieldMaskNumbersDontRoundTrip.JsonOutput
 FieldMaskNumbersDontRoundTrip.JsonOutput
 FieldMaskPathsDontRoundTrip.JsonOutput
 FieldMaskPathsDontRoundTrip.JsonOutput
 FieldMaskTooManyUnderscore.JsonOutput
 FieldMaskTooManyUnderscore.JsonOutput
-JsonInput.AllFieldAcceptNull.JsonOutput
-JsonInput.AllFieldAcceptNull.ProtobufOutput
 JsonInput.Any.JsonOutput
 JsonInput.Any.JsonOutput
+JsonInput.Any.ProtobufOutput
 JsonInput.AnyNested.JsonOutput
 JsonInput.AnyNested.JsonOutput
 JsonInput.AnyNested.ProtobufOutput
 JsonInput.AnyNested.ProtobufOutput
-JsonInput.Any.ProtobufOutput
 JsonInput.AnyUnorderedTypeTag.JsonOutput
 JsonInput.AnyUnorderedTypeTag.JsonOutput
 JsonInput.AnyUnorderedTypeTag.ProtobufOutput
 JsonInput.AnyUnorderedTypeTag.ProtobufOutput
 JsonInput.AnyWithDuration.JsonOutput
 JsonInput.AnyWithDuration.JsonOutput
@@ -29,31 +23,9 @@ JsonInput.AnyWithValueForInteger.JsonOutput
 JsonInput.AnyWithValueForInteger.ProtobufOutput
 JsonInput.AnyWithValueForInteger.ProtobufOutput
 JsonInput.AnyWithValueForJsonObject.JsonOutput
 JsonInput.AnyWithValueForJsonObject.JsonOutput
 JsonInput.AnyWithValueForJsonObject.ProtobufOutput
 JsonInput.AnyWithValueForJsonObject.ProtobufOutput
-JsonInput.BoolFieldAllCapitalFalse
-JsonInput.BoolFieldAllCapitalTrue
-JsonInput.BoolFieldCamelCaseFalse
-JsonInput.BoolFieldCamelCaseTrue
-JsonInput.BoolFieldDoubleQuotedFalse
-JsonInput.BoolFieldDoubleQuotedTrue
-JsonInput.BoolFieldFalse.JsonOutput
-JsonInput.BoolFieldFalse.ProtobufOutput
 JsonInput.BoolFieldIntegerOne
 JsonInput.BoolFieldIntegerOne
 JsonInput.BoolFieldIntegerZero
 JsonInput.BoolFieldIntegerZero
-JsonInput.BoolFieldTrue.JsonOutput
-JsonInput.BoolFieldTrue.ProtobufOutput
-JsonInput.BoolMapEscapedKey.JsonOutput
-JsonInput.BoolMapEscapedKey.ProtobufOutput
-JsonInput.BoolMapField.JsonOutput
-JsonInput.BoolMapFieldKeyNotQuoted
-JsonInput.BoolMapField.ProtobufOutput
-JsonInput.BytesFieldInvalidBase64Characters
-JsonInput.BytesField.JsonOutput
-JsonInput.BytesFieldNoPadding
-JsonInput.BytesField.ProtobufOutput
-JsonInput.BytesRepeatedField.JsonOutput
-JsonInput.BytesRepeatedField.ProtobufOutput
 JsonInput.DoubleFieldInfinity.JsonOutput
 JsonInput.DoubleFieldInfinity.JsonOutput
-JsonInput.DoubleFieldInfinityNotQuoted
 JsonInput.DoubleFieldInfinity.ProtobufOutput
 JsonInput.DoubleFieldInfinity.ProtobufOutput
 JsonInput.DoubleFieldMaxNegativeValue.JsonOutput
 JsonInput.DoubleFieldMaxNegativeValue.JsonOutput
 JsonInput.DoubleFieldMaxNegativeValue.ProtobufOutput
 JsonInput.DoubleFieldMaxNegativeValue.ProtobufOutput
@@ -64,136 +36,74 @@ JsonInput.DoubleFieldMinNegativeValue.ProtobufOutput
 JsonInput.DoubleFieldMinPositiveValue.JsonOutput
 JsonInput.DoubleFieldMinPositiveValue.JsonOutput
 JsonInput.DoubleFieldMinPositiveValue.ProtobufOutput
 JsonInput.DoubleFieldMinPositiveValue.ProtobufOutput
 JsonInput.DoubleFieldNan.JsonOutput
 JsonInput.DoubleFieldNan.JsonOutput
-JsonInput.DoubleFieldNanNotQuoted
 JsonInput.DoubleFieldNan.ProtobufOutput
 JsonInput.DoubleFieldNan.ProtobufOutput
 JsonInput.DoubleFieldNegativeInfinity.JsonOutput
 JsonInput.DoubleFieldNegativeInfinity.JsonOutput
-JsonInput.DoubleFieldNegativeInfinityNotQuoted
 JsonInput.DoubleFieldNegativeInfinity.ProtobufOutput
 JsonInput.DoubleFieldNegativeInfinity.ProtobufOutput
 JsonInput.DoubleFieldQuotedValue.JsonOutput
 JsonInput.DoubleFieldQuotedValue.JsonOutput
 JsonInput.DoubleFieldQuotedValue.ProtobufOutput
 JsonInput.DoubleFieldQuotedValue.ProtobufOutput
-JsonInput.DoubleFieldTooLarge
-JsonInput.DoubleFieldTooSmall
 JsonInput.DurationHas3FractionalDigits.Validator
 JsonInput.DurationHas3FractionalDigits.Validator
 JsonInput.DurationHas6FractionalDigits.Validator
 JsonInput.DurationHas6FractionalDigits.Validator
 JsonInput.DurationHas9FractionalDigits.Validator
 JsonInput.DurationHas9FractionalDigits.Validator
 JsonInput.DurationHasZeroFractionalDigit.Validator
 JsonInput.DurationHasZeroFractionalDigit.Validator
-JsonInput.DurationJsonInputTooLarge
-JsonInput.DurationJsonInputTooSmall
 JsonInput.DurationMaxValue.JsonOutput
 JsonInput.DurationMaxValue.JsonOutput
 JsonInput.DurationMaxValue.ProtobufOutput
 JsonInput.DurationMaxValue.ProtobufOutput
 JsonInput.DurationMinValue.JsonOutput
 JsonInput.DurationMinValue.JsonOutput
 JsonInput.DurationMinValue.ProtobufOutput
 JsonInput.DurationMinValue.ProtobufOutput
-JsonInput.DurationMissingS
 JsonInput.DurationRepeatedValue.JsonOutput
 JsonInput.DurationRepeatedValue.JsonOutput
 JsonInput.DurationRepeatedValue.ProtobufOutput
 JsonInput.DurationRepeatedValue.ProtobufOutput
-JsonInput.EnumField.JsonOutput
-JsonInput.EnumFieldNotQuoted
 JsonInput.EnumFieldNumericValueNonZero.JsonOutput
 JsonInput.EnumFieldNumericValueNonZero.JsonOutput
 JsonInput.EnumFieldNumericValueNonZero.ProtobufOutput
 JsonInput.EnumFieldNumericValueNonZero.ProtobufOutput
 JsonInput.EnumFieldNumericValueZero.JsonOutput
 JsonInput.EnumFieldNumericValueZero.JsonOutput
 JsonInput.EnumFieldNumericValueZero.ProtobufOutput
 JsonInput.EnumFieldNumericValueZero.ProtobufOutput
-JsonInput.EnumField.ProtobufOutput
 JsonInput.EnumFieldUnknownValue.Validator
 JsonInput.EnumFieldUnknownValue.Validator
-JsonInput.EnumRepeatedField.JsonOutput
-JsonInput.EnumRepeatedField.ProtobufOutput
-JsonInput.FieldMaskInvalidCharacter
 JsonInput.FieldMask.JsonOutput
 JsonInput.FieldMask.JsonOutput
 JsonInput.FieldMask.ProtobufOutput
 JsonInput.FieldMask.ProtobufOutput
-JsonInput.FieldNameDuplicate
-JsonInput.FieldNameDuplicateDifferentCasing1
-JsonInput.FieldNameDuplicateDifferentCasing2
-JsonInput.FieldNameEscaped.JsonOutput
-JsonInput.FieldNameInLowerCamelCase.Validator
 JsonInput.FieldNameInSnakeCase.JsonOutput
 JsonInput.FieldNameInSnakeCase.JsonOutput
-JsonInput.FieldNameInSnakeCase.ProtobufOutput
-JsonInput.FieldNameNotQuoted
 JsonInput.FieldNameWithMixedCases.JsonOutput
 JsonInput.FieldNameWithMixedCases.JsonOutput
 JsonInput.FieldNameWithMixedCases.ProtobufOutput
 JsonInput.FieldNameWithMixedCases.ProtobufOutput
 JsonInput.FieldNameWithMixedCases.Validator
 JsonInput.FieldNameWithMixedCases.Validator
-JsonInput.FieldNameWithNumbers.JsonOutput
-JsonInput.FieldNameWithNumbers.ProtobufOutput
-JsonInput.FieldNameWithNumbers.Validator
 JsonInput.FloatFieldInfinity.JsonOutput
 JsonInput.FloatFieldInfinity.JsonOutput
-JsonInput.FloatFieldInfinityNotQuoted
 JsonInput.FloatFieldInfinity.ProtobufOutput
 JsonInput.FloatFieldInfinity.ProtobufOutput
-JsonInput.FloatFieldMaxNegativeValue.JsonOutput
-JsonInput.FloatFieldMaxNegativeValue.ProtobufOutput
-JsonInput.FloatFieldMaxPositiveValue.JsonOutput
-JsonInput.FloatFieldMaxPositiveValue.ProtobufOutput
-JsonInput.FloatFieldMinNegativeValue.JsonOutput
-JsonInput.FloatFieldMinNegativeValue.ProtobufOutput
-JsonInput.FloatFieldMinPositiveValue.JsonOutput
-JsonInput.FloatFieldMinPositiveValue.ProtobufOutput
 JsonInput.FloatFieldNan.JsonOutput
 JsonInput.FloatFieldNan.JsonOutput
-JsonInput.FloatFieldNanNotQuoted
 JsonInput.FloatFieldNan.ProtobufOutput
 JsonInput.FloatFieldNan.ProtobufOutput
 JsonInput.FloatFieldNegativeInfinity.JsonOutput
 JsonInput.FloatFieldNegativeInfinity.JsonOutput
-JsonInput.FloatFieldNegativeInfinityNotQuoted
 JsonInput.FloatFieldNegativeInfinity.ProtobufOutput
 JsonInput.FloatFieldNegativeInfinity.ProtobufOutput
 JsonInput.FloatFieldQuotedValue.JsonOutput
 JsonInput.FloatFieldQuotedValue.JsonOutput
 JsonInput.FloatFieldQuotedValue.ProtobufOutput
 JsonInput.FloatFieldQuotedValue.ProtobufOutput
 JsonInput.FloatFieldTooLarge
 JsonInput.FloatFieldTooLarge
 JsonInput.FloatFieldTooSmall
 JsonInput.FloatFieldTooSmall
-JsonInput.HelloWorld.JsonOutput
-JsonInput.HelloWorld.ProtobufOutput
 JsonInput.Int32FieldExponentialFormat.JsonOutput
 JsonInput.Int32FieldExponentialFormat.JsonOutput
 JsonInput.Int32FieldExponentialFormat.ProtobufOutput
 JsonInput.Int32FieldExponentialFormat.ProtobufOutput
 JsonInput.Int32FieldFloatTrailingZero.JsonOutput
 JsonInput.Int32FieldFloatTrailingZero.JsonOutput
 JsonInput.Int32FieldFloatTrailingZero.ProtobufOutput
 JsonInput.Int32FieldFloatTrailingZero.ProtobufOutput
-JsonInput.Int32FieldLeadingSpace
-JsonInput.Int32FieldLeadingZero
 JsonInput.Int32FieldMaxFloatValue.JsonOutput
 JsonInput.Int32FieldMaxFloatValue.JsonOutput
 JsonInput.Int32FieldMaxFloatValue.ProtobufOutput
 JsonInput.Int32FieldMaxFloatValue.ProtobufOutput
-JsonInput.Int32FieldMaxValue.JsonOutput
-JsonInput.Int32FieldMaxValue.ProtobufOutput
 JsonInput.Int32FieldMinFloatValue.JsonOutput
 JsonInput.Int32FieldMinFloatValue.JsonOutput
 JsonInput.Int32FieldMinFloatValue.ProtobufOutput
 JsonInput.Int32FieldMinFloatValue.ProtobufOutput
 JsonInput.Int32FieldMinValue.JsonOutput
 JsonInput.Int32FieldMinValue.JsonOutput
-JsonInput.Int32FieldMinValue.ProtobufOutput
-JsonInput.Int32FieldNegativeWithLeadingZero
-JsonInput.Int32FieldNotInteger
-JsonInput.Int32FieldNotNumber
-JsonInput.Int32FieldPlusSign
-JsonInput.Int32FieldStringValueEscaped.JsonOutput
-JsonInput.Int32FieldStringValueEscaped.ProtobufOutput
 JsonInput.Int32FieldStringValue.JsonOutput
 JsonInput.Int32FieldStringValue.JsonOutput
 JsonInput.Int32FieldStringValue.ProtobufOutput
 JsonInput.Int32FieldStringValue.ProtobufOutput
-JsonInput.Int32FieldTooLarge
-JsonInput.Int32FieldTooSmall
-JsonInput.Int32FieldTrailingSpace
+JsonInput.Int32FieldStringValueEscaped.JsonOutput
+JsonInput.Int32FieldStringValueEscaped.ProtobufOutput
 JsonInput.Int32MapEscapedKey.JsonOutput
 JsonInput.Int32MapEscapedKey.JsonOutput
 JsonInput.Int32MapEscapedKey.ProtobufOutput
 JsonInput.Int32MapEscapedKey.ProtobufOutput
 JsonInput.Int32MapField.JsonOutput
 JsonInput.Int32MapField.JsonOutput
-JsonInput.Int32MapFieldKeyNotQuoted
 JsonInput.Int32MapField.ProtobufOutput
 JsonInput.Int32MapField.ProtobufOutput
 JsonInput.Int64FieldBeString.Validator
 JsonInput.Int64FieldBeString.Validator
 JsonInput.Int64FieldMaxValue.JsonOutput
 JsonInput.Int64FieldMaxValue.JsonOutput
-JsonInput.Int64FieldMaxValueNotQuoted.JsonOutput
-JsonInput.Int64FieldMaxValueNotQuoted.ProtobufOutput
 JsonInput.Int64FieldMaxValue.ProtobufOutput
 JsonInput.Int64FieldMaxValue.ProtobufOutput
 JsonInput.Int64FieldMinValue.JsonOutput
 JsonInput.Int64FieldMinValue.JsonOutput
-JsonInput.Int64FieldMinValueNotQuoted.JsonOutput
-JsonInput.Int64FieldMinValueNotQuoted.ProtobufOutput
 JsonInput.Int64FieldMinValue.ProtobufOutput
 JsonInput.Int64FieldMinValue.ProtobufOutput
-JsonInput.Int64FieldNotInteger
-JsonInput.Int64FieldNotNumber
-JsonInput.Int64FieldTooLarge
-JsonInput.Int64FieldTooSmall
 JsonInput.Int64MapEscapedKey.JsonOutput
 JsonInput.Int64MapEscapedKey.JsonOutput
 JsonInput.Int64MapEscapedKey.ProtobufOutput
 JsonInput.Int64MapEscapedKey.ProtobufOutput
 JsonInput.Int64MapField.JsonOutput
 JsonInput.Int64MapField.JsonOutput
-JsonInput.Int64MapFieldKeyNotQuoted
 JsonInput.Int64MapField.ProtobufOutput
 JsonInput.Int64MapField.ProtobufOutput
-JsonInput.JsonWithComments
-JsonInput.MapFieldKeyIsNull
-JsonInput.MapFieldValueIsNull
 JsonInput.MessageField.JsonOutput
 JsonInput.MessageField.JsonOutput
 JsonInput.MessageField.ProtobufOutput
 JsonInput.MessageField.ProtobufOutput
 JsonInput.MessageMapField.JsonOutput
 JsonInput.MessageMapField.JsonOutput
 JsonInput.MessageMapField.ProtobufOutput
 JsonInput.MessageMapField.ProtobufOutput
 JsonInput.MessageRepeatedField.JsonOutput
 JsonInput.MessageRepeatedField.JsonOutput
 JsonInput.MessageRepeatedField.ProtobufOutput
 JsonInput.MessageRepeatedField.ProtobufOutput
-JsonInput.OneofFieldDuplicate
 JsonInput.OptionalBoolWrapper.JsonOutput
 JsonInput.OptionalBoolWrapper.JsonOutput
 JsonInput.OptionalBoolWrapper.ProtobufOutput
 JsonInput.OptionalBoolWrapper.ProtobufOutput
 JsonInput.OptionalBytesWrapper.JsonOutput
 JsonInput.OptionalBytesWrapper.JsonOutput
@@ -215,6 +125,7 @@ JsonInput.OptionalUint64Wrapper.ProtobufOutput
 JsonInput.OptionalWrapperTypesWithNonDefaultValue.JsonOutput
 JsonInput.OptionalWrapperTypesWithNonDefaultValue.JsonOutput
 JsonInput.OptionalWrapperTypesWithNonDefaultValue.ProtobufOutput
 JsonInput.OptionalWrapperTypesWithNonDefaultValue.ProtobufOutput
 JsonInput.OriginalProtoFieldName.JsonOutput
 JsonInput.OriginalProtoFieldName.JsonOutput
+JsonInput.OriginalProtoFieldName.ProtobufOutput
 JsonInput.PrimitiveRepeatedField.JsonOutput
 JsonInput.PrimitiveRepeatedField.JsonOutput
 JsonInput.PrimitiveRepeatedField.ProtobufOutput
 JsonInput.PrimitiveRepeatedField.ProtobufOutput
 JsonInput.RepeatedBoolWrapper.JsonOutput
 JsonInput.RepeatedBoolWrapper.JsonOutput
@@ -223,18 +134,7 @@ JsonInput.RepeatedBytesWrapper.JsonOutput
 JsonInput.RepeatedBytesWrapper.ProtobufOutput
 JsonInput.RepeatedBytesWrapper.ProtobufOutput
 JsonInput.RepeatedDoubleWrapper.JsonOutput
 JsonInput.RepeatedDoubleWrapper.JsonOutput
 JsonInput.RepeatedDoubleWrapper.ProtobufOutput
 JsonInput.RepeatedDoubleWrapper.ProtobufOutput
-JsonInput.RepeatedFieldMessageElementIsNull
-JsonInput.RepeatedFieldPrimitiveElementIsNull
-JsonInput.RepeatedFieldTrailingComma
-JsonInput.RepeatedFieldWrongElementTypeExpectingIntegersGotBool
-JsonInput.RepeatedFieldWrongElementTypeExpectingIntegersGotMessage
-JsonInput.RepeatedFieldWrongElementTypeExpectingIntegersGotString
-JsonInput.RepeatedFieldWrongElementTypeExpectingMessagesGotBool
-JsonInput.RepeatedFieldWrongElementTypeExpectingMessagesGotInt
-JsonInput.RepeatedFieldWrongElementTypeExpectingMessagesGotString
-JsonInput.RepeatedFieldWrongElementTypeExpectingStringsGotBool
 JsonInput.RepeatedFieldWrongElementTypeExpectingStringsGotInt
 JsonInput.RepeatedFieldWrongElementTypeExpectingStringsGotInt
-JsonInput.RepeatedFieldWrongElementTypeExpectingStringsGotMessage
 JsonInput.RepeatedFloatWrapper.JsonOutput
 JsonInput.RepeatedFloatWrapper.JsonOutput
 JsonInput.RepeatedFloatWrapper.ProtobufOutput
 JsonInput.RepeatedFloatWrapper.ProtobufOutput
 JsonInput.RepeatedInt32Wrapper.JsonOutput
 JsonInput.RepeatedInt32Wrapper.JsonOutput
@@ -247,39 +147,18 @@ JsonInput.RepeatedUint32Wrapper.JsonOutput
 JsonInput.RepeatedUint32Wrapper.ProtobufOutput
 JsonInput.RepeatedUint32Wrapper.ProtobufOutput
 JsonInput.RepeatedUint64Wrapper.JsonOutput
 JsonInput.RepeatedUint64Wrapper.JsonOutput
 JsonInput.RepeatedUint64Wrapper.ProtobufOutput
 JsonInput.RepeatedUint64Wrapper.ProtobufOutput
-JsonInput.StringFieldEscape.JsonOutput
-JsonInput.StringFieldEscape.ProtobufOutput
-JsonInput.StringFieldInvalidEscape
-JsonInput.StringField.JsonOutput
 JsonInput.StringFieldNotAString
 JsonInput.StringFieldNotAString
-JsonInput.StringField.ProtobufOutput
 JsonInput.StringFieldSurrogateInWrongOrder
 JsonInput.StringFieldSurrogateInWrongOrder
 JsonInput.StringFieldSurrogatePair.JsonOutput
 JsonInput.StringFieldSurrogatePair.JsonOutput
 JsonInput.StringFieldSurrogatePair.ProtobufOutput
 JsonInput.StringFieldSurrogatePair.ProtobufOutput
-JsonInput.StringFieldUnicodeEscape.JsonOutput
-JsonInput.StringFieldUnicodeEscape.ProtobufOutput
-JsonInput.StringFieldUnicodeEscapeWithLowercaseHexLetters.JsonOutput
-JsonInput.StringFieldUnicodeEscapeWithLowercaseHexLetters.ProtobufOutput
-JsonInput.StringFieldUnicode.JsonOutput
-JsonInput.StringFieldUnicode.ProtobufOutput
 JsonInput.StringFieldUnpairedHighSurrogate
 JsonInput.StringFieldUnpairedHighSurrogate
 JsonInput.StringFieldUnpairedLowSurrogate
 JsonInput.StringFieldUnpairedLowSurrogate
-JsonInput.StringFieldUnterminatedEscape
-JsonInput.StringFieldUppercaseEscapeLetter
-JsonInput.StringRepeatedField.JsonOutput
-JsonInput.StringRepeatedField.ProtobufOutput
 JsonInput.Struct.JsonOutput
 JsonInput.Struct.JsonOutput
 JsonInput.Struct.ProtobufOutput
 JsonInput.Struct.ProtobufOutput
 JsonInput.TimestampHas3FractionalDigits.Validator
 JsonInput.TimestampHas3FractionalDigits.Validator
 JsonInput.TimestampHas6FractionalDigits.Validator
 JsonInput.TimestampHas6FractionalDigits.Validator
 JsonInput.TimestampHas9FractionalDigits.Validator
 JsonInput.TimestampHas9FractionalDigits.Validator
 JsonInput.TimestampHasZeroFractionalDigit.Validator
 JsonInput.TimestampHasZeroFractionalDigit.Validator
-JsonInput.TimestampJsonInputLowercaseT
-JsonInput.TimestampJsonInputLowercaseZ
-JsonInput.TimestampJsonInputMissingT
-JsonInput.TimestampJsonInputMissingZ
-JsonInput.TimestampJsonInputTooLarge
-JsonInput.TimestampJsonInputTooSmall
 JsonInput.TimestampMaxValue.JsonOutput
 JsonInput.TimestampMaxValue.JsonOutput
 JsonInput.TimestampMaxValue.ProtobufOutput
 JsonInput.TimestampMaxValue.ProtobufOutput
 JsonInput.TimestampMinValue.JsonOutput
 JsonInput.TimestampMinValue.JsonOutput
@@ -291,27 +170,14 @@ JsonInput.TimestampWithNegativeOffset.ProtobufOutput
 JsonInput.TimestampWithPositiveOffset.JsonOutput
 JsonInput.TimestampWithPositiveOffset.JsonOutput
 JsonInput.TimestampWithPositiveOffset.ProtobufOutput
 JsonInput.TimestampWithPositiveOffset.ProtobufOutput
 JsonInput.TimestampZeroNormalized.Validator
 JsonInput.TimestampZeroNormalized.Validator
-JsonInput.TrailingCommaInAnObject
 JsonInput.Uint32FieldMaxFloatValue.JsonOutput
 JsonInput.Uint32FieldMaxFloatValue.JsonOutput
 JsonInput.Uint32FieldMaxFloatValue.ProtobufOutput
 JsonInput.Uint32FieldMaxFloatValue.ProtobufOutput
-JsonInput.Uint32FieldMaxValue.JsonOutput
-JsonInput.Uint32FieldMaxValue.ProtobufOutput
-JsonInput.Uint32FieldNotInteger
-JsonInput.Uint32FieldNotNumber
-JsonInput.Uint32FieldTooLarge
 JsonInput.Uint32MapField.JsonOutput
 JsonInput.Uint32MapField.JsonOutput
-JsonInput.Uint32MapFieldKeyNotQuoted
 JsonInput.Uint32MapField.ProtobufOutput
 JsonInput.Uint32MapField.ProtobufOutput
 JsonInput.Uint64FieldBeString.Validator
 JsonInput.Uint64FieldBeString.Validator
 JsonInput.Uint64FieldMaxValue.JsonOutput
 JsonInput.Uint64FieldMaxValue.JsonOutput
-JsonInput.Uint64FieldMaxValueNotQuoted.JsonOutput
-JsonInput.Uint64FieldMaxValueNotQuoted.ProtobufOutput
 JsonInput.Uint64FieldMaxValue.ProtobufOutput
 JsonInput.Uint64FieldMaxValue.ProtobufOutput
-JsonInput.Uint64FieldNotInteger
-JsonInput.Uint64FieldNotNumber
-JsonInput.Uint64FieldTooLarge
 JsonInput.Uint64MapField.JsonOutput
 JsonInput.Uint64MapField.JsonOutput
-JsonInput.Uint64MapFieldKeyNotQuoted
 JsonInput.Uint64MapField.ProtobufOutput
 JsonInput.Uint64MapField.ProtobufOutput
 JsonInput.ValueAcceptBool.JsonOutput
 JsonInput.ValueAcceptBool.JsonOutput
 JsonInput.ValueAcceptBool.ProtobufOutput
 JsonInput.ValueAcceptBool.ProtobufOutput
@@ -327,8 +193,6 @@ JsonInput.ValueAcceptObject.JsonOutput
 JsonInput.ValueAcceptObject.ProtobufOutput
 JsonInput.ValueAcceptObject.ProtobufOutput
 JsonInput.ValueAcceptString.JsonOutput
 JsonInput.ValueAcceptString.JsonOutput
 JsonInput.ValueAcceptString.ProtobufOutput
 JsonInput.ValueAcceptString.ProtobufOutput
-JsonInput.WrapperTypesWithNullValue.JsonOutput
-JsonInput.WrapperTypesWithNullValue.ProtobufOutput
 ProtobufInput.DoubleFieldNormalizeQuietNan.JsonOutput
 ProtobufInput.DoubleFieldNormalizeQuietNan.JsonOutput
 ProtobufInput.DoubleFieldNormalizeSignalingNan.JsonOutput
 ProtobufInput.DoubleFieldNormalizeSignalingNan.JsonOutput
 ProtobufInput.FloatFieldNormalizeQuietNan.JsonOutput
 ProtobufInput.FloatFieldNormalizeQuietNan.JsonOutput

+ 8 - 1
csharp/protos/unittest_issues.proto

@@ -116,4 +116,11 @@ message TestJsonFieldOrdering {
     string o2_string = 3;
     string o2_string = 3;
   }
   }
   
   
-}
+}
+
+message TestJsonName {
+  // Message for testing the effects for of the json_name option
+  string name = 1;
+  string description = 2 [json_name = "desc"];
+  string guid = 3 [json_name = "exid"];
+}

+ 9 - 0
csharp/src/Google.Protobuf.Test/GeneratedMessageTest.cs

@@ -710,5 +710,14 @@ namespace Google.Protobuf
             Assert.AreEqual("{ \"singleForeignMessage\": { \"c\": 16, \"@cInHex\": \"10\" } }", message.ToString());
             Assert.AreEqual("{ \"singleForeignMessage\": { \"c\": 16, \"@cInHex\": \"10\" } }", message.ToString());
             Assert.AreEqual("{ \"singleForeignMessage\": { \"c\": 16 } }", JsonFormatter.Default.Format(message));
             Assert.AreEqual("{ \"singleForeignMessage\": { \"c\": 16 } }", JsonFormatter.Default.Format(message));
         }
         }
+
+        [Test]
+        public void CustomDiagnosticMessage_DirectToTextWriterCall()
+        {
+            var message = new ForeignMessage { C = 31 };
+            var writer = new StringWriter();
+            JsonFormatter.Default.Format(message, writer);
+            Assert.AreEqual("{ \"c\": 31 }", writer.ToString());
+        }
     }
     }
 }
 }

+ 19 - 0
csharp/src/Google.Protobuf.Test/IssuesTest.cs

@@ -59,5 +59,24 @@ namespace Google.Protobuf
             // Underscores aren't reflected in the JSON.
             // Underscores aren't reflected in the JSON.
             Assert.AreEqual("{ \"types\": 10, \"descriptor\": 20 }", message.ToString());
             Assert.AreEqual("{ \"types\": 10, \"descriptor\": 20 }", message.ToString());
         }
         }
+
+        [Test]
+        public void JsonNameParseTest()
+        {
+            var settings = new JsonParser.Settings(10, TypeRegistry.FromFiles(UnittestIssuesReflection.Descriptor));
+            var parser = new JsonParser(settings);
+
+            // It is safe to use either original field name or explicitly specified json_name
+            Assert.AreEqual(new TestJsonName { Name = "test", Description = "test2", Guid = "test3" },
+                parser.Parse<TestJsonName>("{ \"name\": \"test\", \"desc\": \"test2\", \"guid\": \"test3\" }"));
+        }
+
+        [Test]
+        public void JsonNameFormatTest()
+        {
+            var message = new TestJsonName { Name = "test", Description = "test2", Guid = "test3" };
+            Assert.AreEqual("{ \"name\": \"test\", \"desc\": \"test2\", \"exid\": \"test3\" }",
+                JsonFormatter.Default.Format(message));
+        }
     }
     }
 }
 }

+ 168 - 5
csharp/src/Google.Protobuf.Test/TestProtos/UnittestIssues.cs

@@ -42,10 +42,12 @@ namespace UnitTest.Issues.TestProtos {
             "CgtwbGFpbl9pbnQzMhgEIAEoBRITCglvMV9zdHJpbmcYAiABKAlIABISCghv",
             "CgtwbGFpbl9pbnQzMhgEIAEoBRITCglvMV9zdHJpbmcYAiABKAlIABISCghv",
             "MV9pbnQzMhgFIAEoBUgAEhQKDHBsYWluX3N0cmluZxgBIAEoCRISCghvMl9p",
             "MV9pbnQzMhgFIAEoBUgAEhQKDHBsYWluX3N0cmluZxgBIAEoCRISCghvMl9p",
             "bnQzMhgGIAEoBUgBEhMKCW8yX3N0cmluZxgDIAEoCUgBQgQKAm8xQgQKAm8y",
             "bnQzMhgGIAEoBUgBEhMKCW8yX3N0cmluZxgDIAEoCUgBQgQKAm8xQgQKAm8y",
-            "KlUKDE5lZ2F0aXZlRW51bRIWChJORUdBVElWRV9FTlVNX1pFUk8QABIWCglG",
-            "aXZlQmVsb3cQ+///////////ARIVCghNaW51c09uZRD///////////8BKi4K",
-            "DkRlcHJlY2F0ZWRFbnVtEhMKD0RFUFJFQ0FURURfWkVSTxAAEgcKA29uZRAB",
-            "Qh9IAaoCGlVuaXRUZXN0Lklzc3Vlcy5UZXN0UHJvdG9zYgZwcm90bzM="));
+            "IksKDFRlc3RKc29uTmFtZRIMCgRuYW1lGAEgASgJEhkKC2Rlc2NyaXB0aW9u",
+            "GAIgASgJUgRkZXNjEhIKBGd1aWQYAyABKAlSBGV4aWQqVQoMTmVnYXRpdmVF",
+            "bnVtEhYKEk5FR0FUSVZFX0VOVU1fWkVSTxAAEhYKCUZpdmVCZWxvdxD7////",
+            "//////8BEhUKCE1pbnVzT25lEP///////////wEqLgoORGVwcmVjYXRlZEVu",
+            "dW0SEwoPREVQUkVDQVRFRF9aRVJPEAASBwoDb25lEAFCH0gBqgIaVW5pdFRl",
+            "c3QuSXNzdWVzLlRlc3RQcm90b3NiBnByb3RvMw=="));
       descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
       descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
           new pbr::FileDescriptor[] { },
           new pbr::FileDescriptor[] { },
           new pbr::GeneratedClrTypeInfo(new[] {typeof(global::UnitTest.Issues.TestProtos.NegativeEnum), typeof(global::UnitTest.Issues.TestProtos.DeprecatedEnum), }, new pbr::GeneratedClrTypeInfo[] {
           new pbr::GeneratedClrTypeInfo(new[] {typeof(global::UnitTest.Issues.TestProtos.NegativeEnum), typeof(global::UnitTest.Issues.TestProtos.DeprecatedEnum), }, new pbr::GeneratedClrTypeInfo[] {
@@ -55,7 +57,8 @@ namespace UnitTest.Issues.TestProtos {
             new pbr::GeneratedClrTypeInfo(typeof(global::UnitTest.Issues.TestProtos.DeprecatedFieldsMessage), global::UnitTest.Issues.TestProtos.DeprecatedFieldsMessage.Parser, new[]{ "PrimitiveValue", "PrimitiveArray", "MessageValue", "MessageArray", "EnumValue", "EnumArray" }, null, null, null),
             new pbr::GeneratedClrTypeInfo(typeof(global::UnitTest.Issues.TestProtos.DeprecatedFieldsMessage), global::UnitTest.Issues.TestProtos.DeprecatedFieldsMessage.Parser, new[]{ "PrimitiveValue", "PrimitiveArray", "MessageValue", "MessageArray", "EnumValue", "EnumArray" }, null, null, null),
             new pbr::GeneratedClrTypeInfo(typeof(global::UnitTest.Issues.TestProtos.ItemField), global::UnitTest.Issues.TestProtos.ItemField.Parser, new[]{ "Item" }, null, null, null),
             new pbr::GeneratedClrTypeInfo(typeof(global::UnitTest.Issues.TestProtos.ItemField), global::UnitTest.Issues.TestProtos.ItemField.Parser, new[]{ "Item" }, null, null, null),
             new pbr::GeneratedClrTypeInfo(typeof(global::UnitTest.Issues.TestProtos.ReservedNames), global::UnitTest.Issues.TestProtos.ReservedNames.Parser, new[]{ "Types_", "Descriptor_" }, null, null, new pbr::GeneratedClrTypeInfo[] { new pbr::GeneratedClrTypeInfo(typeof(global::UnitTest.Issues.TestProtos.ReservedNames.Types.SomeNestedType), global::UnitTest.Issues.TestProtos.ReservedNames.Types.SomeNestedType.Parser, null, null, null, null)}),
             new pbr::GeneratedClrTypeInfo(typeof(global::UnitTest.Issues.TestProtos.ReservedNames), global::UnitTest.Issues.TestProtos.ReservedNames.Parser, new[]{ "Types_", "Descriptor_" }, null, null, new pbr::GeneratedClrTypeInfo[] { new pbr::GeneratedClrTypeInfo(typeof(global::UnitTest.Issues.TestProtos.ReservedNames.Types.SomeNestedType), global::UnitTest.Issues.TestProtos.ReservedNames.Types.SomeNestedType.Parser, null, null, null, null)}),
-            new pbr::GeneratedClrTypeInfo(typeof(global::UnitTest.Issues.TestProtos.TestJsonFieldOrdering), global::UnitTest.Issues.TestProtos.TestJsonFieldOrdering.Parser, new[]{ "PlainInt32", "O1String", "O1Int32", "PlainString", "O2Int32", "O2String" }, new[]{ "O1", "O2" }, null, null)
+            new pbr::GeneratedClrTypeInfo(typeof(global::UnitTest.Issues.TestProtos.TestJsonFieldOrdering), global::UnitTest.Issues.TestProtos.TestJsonFieldOrdering.Parser, new[]{ "PlainInt32", "O1String", "O1Int32", "PlainString", "O2Int32", "O2String" }, new[]{ "O1", "O2" }, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::UnitTest.Issues.TestProtos.TestJsonName), global::UnitTest.Issues.TestProtos.TestJsonName.Parser, new[]{ "Name", "Description", "Guid" }, null, null, null)
           }));
           }));
     }
     }
     #endregion
     #endregion
@@ -1399,6 +1402,166 @@ namespace UnitTest.Issues.TestProtos {
 
 
   }
   }
 
 
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  public sealed partial class TestJsonName : pb::IMessage<TestJsonName> {
+    private static readonly pb::MessageParser<TestJsonName> _parser = new pb::MessageParser<TestJsonName>(() => new TestJsonName());
+    public static pb::MessageParser<TestJsonName> Parser { get { return _parser; } }
+
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::UnitTest.Issues.TestProtos.UnittestIssuesReflection.Descriptor.MessageTypes[7]; }
+    }
+
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    public TestJsonName() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    public TestJsonName(TestJsonName other) : this() {
+      name_ = other.name_;
+      description_ = other.description_;
+      guid_ = other.guid_;
+    }
+
+    public TestJsonName Clone() {
+      return new TestJsonName(this);
+    }
+
+    /// <summary>Field number for the "name" field.</summary>
+    public const int NameFieldNumber = 1;
+    private string name_ = "";
+    /// <summary>
+    ///  json_name field options are not properly handled during deserialization
+    /// </summary>
+    public string Name {
+      get { return name_; }
+      set {
+        name_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    /// <summary>Field number for the "description" field.</summary>
+    public const int DescriptionFieldNumber = 2;
+    private string description_ = "";
+    public string Description {
+      get { return description_; }
+      set {
+        description_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    /// <summary>Field number for the "guid" field.</summary>
+    public const int GuidFieldNumber = 3;
+    private string guid_ = "";
+    public string Guid {
+      get { return guid_; }
+      set {
+        guid_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    public override bool Equals(object other) {
+      return Equals(other as TestJsonName);
+    }
+
+    public bool Equals(TestJsonName other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Name != other.Name) return false;
+      if (Description != other.Description) return false;
+      if (Guid != other.Guid) return false;
+      return true;
+    }
+
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Name.Length != 0) hash ^= Name.GetHashCode();
+      if (Description.Length != 0) hash ^= Description.GetHashCode();
+      if (Guid.Length != 0) hash ^= Guid.GetHashCode();
+      return hash;
+    }
+
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (Name.Length != 0) {
+        output.WriteRawTag(10);
+        output.WriteString(Name);
+      }
+      if (Description.Length != 0) {
+        output.WriteRawTag(18);
+        output.WriteString(Description);
+      }
+      if (Guid.Length != 0) {
+        output.WriteRawTag(26);
+        output.WriteString(Guid);
+      }
+    }
+
+    public int CalculateSize() {
+      int size = 0;
+      if (Name.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(Name);
+      }
+      if (Description.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(Description);
+      }
+      if (Guid.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(Guid);
+      }
+      return size;
+    }
+
+    public void MergeFrom(TestJsonName other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Name.Length != 0) {
+        Name = other.Name;
+      }
+      if (other.Description.Length != 0) {
+        Description = other.Description;
+      }
+      if (other.Guid.Length != 0) {
+        Guid = other.Guid;
+      }
+    }
+
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 10: {
+            Name = input.ReadString();
+            break;
+          }
+          case 18: {
+            Description = input.ReadString();
+            break;
+          }
+          case 26: {
+            Guid = input.ReadString();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
   #endregion
   #endregion
 
 
 }
 }

+ 4 - 3
csharp/src/Google.Protobuf/Collections/MapField.cs

@@ -34,6 +34,7 @@ using Google.Protobuf.Reflection;
 using System;
 using System;
 using System.Collections;
 using System.Collections;
 using System.Collections.Generic;
 using System.Collections.Generic;
+using System.IO;
 using System.Linq;
 using System.Linq;
 using System.Text;
 using System.Text;
 using Google.Protobuf.Compatibility;
 using Google.Protobuf.Compatibility;
@@ -474,9 +475,9 @@ namespace Google.Protobuf.Collections
         /// </summary>
         /// </summary>
         public override string ToString()
         public override string ToString()
         {
         {
-            var builder = new StringBuilder();
-            JsonFormatter.Default.WriteDictionary(builder, this);
-            return builder.ToString();
+            var writer = new StringWriter();
+            JsonFormatter.Default.WriteDictionary(writer, this);
+            return writer.ToString();
         }
         }
 
 
         #region IDictionary explicit interface implementation
         #region IDictionary explicit interface implementation

+ 4 - 3
csharp/src/Google.Protobuf/Collections/RepeatedField.cs

@@ -33,6 +33,7 @@
 using System;
 using System;
 using System.Collections;
 using System.Collections;
 using System.Collections.Generic;
 using System.Collections.Generic;
+using System.IO;
 using System.Text;
 using System.Text;
 
 
 namespace Google.Protobuf.Collections
 namespace Google.Protobuf.Collections
@@ -474,9 +475,9 @@ namespace Google.Protobuf.Collections
         /// </summary>
         /// </summary>
         public override string ToString()
         public override string ToString()
         {
         {
-            var builder = new StringBuilder();
-            JsonFormatter.Default.WriteList(builder, this);
-            return builder.ToString();
+            var writer = new StringWriter();
+            JsonFormatter.Default.WriteList(writer, this);
+            return writer.ToString();
         }
         }
 
 
         /// <summary>
         /// <summary>

+ 134 - 118
csharp/src/Google.Protobuf/JsonFormatter.cs

@@ -36,6 +36,7 @@ using System.Globalization;
 using System.Text;
 using System.Text;
 using Google.Protobuf.Reflection;
 using Google.Protobuf.Reflection;
 using Google.Protobuf.WellKnownTypes;
 using Google.Protobuf.WellKnownTypes;
+using System.IO;
 using System.Linq;
 using System.Linq;
 using System.Collections.Generic;
 using System.Collections.Generic;
 
 
@@ -140,18 +141,31 @@ namespace Google.Protobuf
         /// <param name="message">The message to format.</param>
         /// <param name="message">The message to format.</param>
         /// <returns>The formatted message.</returns>
         /// <returns>The formatted message.</returns>
         public string Format(IMessage message)
         public string Format(IMessage message)
+        {
+            var writer = new StringWriter();
+            Format(message, writer);
+            return writer.ToString();
+        }
+
+        /// <summary>
+        /// Formats the specified message as JSON.
+        /// </summary>
+        /// <param name="message">The message to format.</param>
+        /// <param name="writer">The TextWriter to write the formatted message to.</param>
+        /// <returns>The formatted message.</returns>
+        public void Format(IMessage message, TextWriter writer)
         {
         {
             ProtoPreconditions.CheckNotNull(message, nameof(message));
             ProtoPreconditions.CheckNotNull(message, nameof(message));
-            StringBuilder builder = new StringBuilder();
+            ProtoPreconditions.CheckNotNull(writer, nameof(writer));
+
             if (message.Descriptor.IsWellKnownType)
             if (message.Descriptor.IsWellKnownType)
             {
             {
-                WriteWellKnownTypeValue(builder, message.Descriptor, message);
+                WriteWellKnownTypeValue(writer, message.Descriptor, message);
             }
             }
             else
             else
             {
             {
-                WriteMessage(builder, message);
+                WriteMessage(writer, message);
             }
             }
-            return builder.ToString();
         }
         }
 
 
         /// <summary>
         /// <summary>
@@ -177,11 +191,11 @@ namespace Google.Protobuf
             return diagnosticFormatter.Format(message);
             return diagnosticFormatter.Format(message);
         }
         }
 
 
-        private void WriteMessage(StringBuilder builder, IMessage message)
+        private void WriteMessage(TextWriter writer, IMessage message)
         {
         {
             if (message == null)
             if (message == null)
             {
             {
-                WriteNull(builder);
+                WriteNull(writer);
                 return;
                 return;
             }
             }
             if (DiagnosticOnly)
             if (DiagnosticOnly)
@@ -189,16 +203,16 @@ namespace Google.Protobuf
                 ICustomDiagnosticMessage customDiagnosticMessage = message as ICustomDiagnosticMessage;
                 ICustomDiagnosticMessage customDiagnosticMessage = message as ICustomDiagnosticMessage;
                 if (customDiagnosticMessage != null)
                 if (customDiagnosticMessage != null)
                 {
                 {
-                    builder.Append(customDiagnosticMessage.ToDiagnosticString());
+                    writer.Write(customDiagnosticMessage.ToDiagnosticString());
                     return;
                     return;
                 }
                 }
             }
             }
-            builder.Append("{ ");
-            bool writtenFields = WriteMessageFields(builder, message, false);
-            builder.Append(writtenFields ? " }" : "}");
+            writer.Write("{ ");
+            bool writtenFields = WriteMessageFields(writer, message, false);
+            writer.Write(writtenFields ? " }" : "}");
         }
         }
 
 
-        private bool WriteMessageFields(StringBuilder builder, IMessage message, bool assumeFirstFieldWritten)
+        private bool WriteMessageFields(TextWriter writer, IMessage message, bool assumeFirstFieldWritten)
         {
         {
             var fields = message.Descriptor.Fields;
             var fields = message.Descriptor.Fields;
             bool first = !assumeFirstFieldWritten;
             bool first = !assumeFirstFieldWritten;
@@ -221,13 +235,15 @@ namespace Google.Protobuf
                 // Okay, all tests complete: let's write the field value...
                 // Okay, all tests complete: let's write the field value...
                 if (!first)
                 if (!first)
                 {
                 {
-                    builder.Append(PropertySeparator);
+                    writer.Write(PropertySeparator);
                 }
                 }
-                WriteString(builder, ToCamelCase(accessor.Descriptor.Name));
-                builder.Append(NameValueSeparator);
-                WriteValue(builder, value);
+
+                WriteString(writer, accessor.Descriptor.JsonName);
+                writer.Write(NameValueSeparator);
+                WriteValue(writer, value);
+
                 first = false;
                 first = false;
-            }            
+            }
             return !first;
             return !first;
         }
         }
 
 
@@ -309,9 +325,9 @@ namespace Google.Protobuf
             return result.ToString();
             return result.ToString();
         }
         }
         
         
-        private static void WriteNull(StringBuilder builder)
+        private static void WriteNull(TextWriter writer)
         {
         {
-            builder.Append("null");
+            writer.Write("null");
         }
         }
 
 
         private static bool IsDefaultValue(IFieldAccessor accessor, object value)
         private static bool IsDefaultValue(IFieldAccessor accessor, object value)
@@ -361,56 +377,56 @@ namespace Google.Protobuf
             }
             }
         }
         }
         
         
-        private void WriteValue(StringBuilder builder, object value)
+        private void WriteValue(TextWriter writer, object value)
         {
         {
             if (value == null)
             if (value == null)
             {
             {
-                WriteNull(builder);
+                WriteNull(writer);
             }
             }
             else if (value is bool)
             else if (value is bool)
             {
             {
-                builder.Append((bool) value ? "true" : "false");
+                writer.Write((bool)value ? "true" : "false");
             }
             }
             else if (value is ByteString)
             else if (value is ByteString)
             {
             {
                 // Nothing in Base64 needs escaping
                 // Nothing in Base64 needs escaping
-                builder.Append('"');
-                builder.Append(((ByteString) value).ToBase64());
-                builder.Append('"');
+                writer.Write('"');
+                writer.Write(((ByteString)value).ToBase64());
+                writer.Write('"');
             }
             }
             else if (value is string)
             else if (value is string)
             {
             {
-                WriteString(builder, (string) value);
+                WriteString(writer, (string)value);
             }
             }
             else if (value is IDictionary)
             else if (value is IDictionary)
             {
             {
-                WriteDictionary(builder, (IDictionary) value);
+                WriteDictionary(writer, (IDictionary)value);
             }
             }
             else if (value is IList)
             else if (value is IList)
             {
             {
-                WriteList(builder, (IList) value);
+                WriteList(writer, (IList)value);
             }
             }
             else if (value is int || value is uint)
             else if (value is int || value is uint)
             {
             {
                 IFormattable formattable = (IFormattable) value;
                 IFormattable formattable = (IFormattable) value;
-                builder.Append(formattable.ToString("d", CultureInfo.InvariantCulture));
+                writer.Write(formattable.ToString("d", CultureInfo.InvariantCulture));
             }
             }
             else if (value is long || value is ulong)
             else if (value is long || value is ulong)
             {
             {
-                builder.Append('"');
+                writer.Write('"');
                 IFormattable formattable = (IFormattable) value;
                 IFormattable formattable = (IFormattable) value;
-                builder.Append(formattable.ToString("d", CultureInfo.InvariantCulture));
-                builder.Append('"');
+                writer.Write(formattable.ToString("d", CultureInfo.InvariantCulture));
+                writer.Write('"');
             }
             }
             else if (value is System.Enum)
             else if (value is System.Enum)
             {
             {
                 if (System.Enum.IsDefined(value.GetType(), value))
                 if (System.Enum.IsDefined(value.GetType(), value))
                 {
                 {
-                    WriteString(builder, value.ToString());
+                    WriteString(writer, value.ToString());
                 }
                 }
                 else
                 else
                 {
                 {
-                    WriteValue(builder, (int) value);
+                    WriteValue(writer, (int)value);
                 }
                 }
             }
             }
             else if (value is float || value is double)
             else if (value is float || value is double)
@@ -418,13 +434,13 @@ namespace Google.Protobuf
                 string text = ((IFormattable) value).ToString("r", CultureInfo.InvariantCulture);
                 string text = ((IFormattable) value).ToString("r", CultureInfo.InvariantCulture);
                 if (text == "NaN" || text == "Infinity" || text == "-Infinity")
                 if (text == "NaN" || text == "Infinity" || text == "-Infinity")
                 {
                 {
-                    builder.Append('"');
-                    builder.Append(text);
-                    builder.Append('"');
+                    writer.Write('"');
+                    writer.Write(text);
+                    writer.Write('"');
                 }
                 }
                 else
                 else
                 {
                 {
-                    builder.Append(text);
+                    writer.Write(text);
                 }
                 }
             }
             }
             else if (value is IMessage)
             else if (value is IMessage)
@@ -432,11 +448,11 @@ namespace Google.Protobuf
                 IMessage message = (IMessage) value;
                 IMessage message = (IMessage) value;
                 if (message.Descriptor.IsWellKnownType)
                 if (message.Descriptor.IsWellKnownType)
                 {
                 {
-                    WriteWellKnownTypeValue(builder, message.Descriptor, value);
+                    WriteWellKnownTypeValue(writer, message.Descriptor, value);
                 }
                 }
                 else
                 else
                 {
                 {
-                    WriteMessage(builder, (IMessage) value);
+                    WriteMessage(writer, (IMessage)value);
                 }
                 }
             }
             }
             else
             else
@@ -451,13 +467,13 @@ namespace Google.Protobuf
         /// values are using the embedded well-known types, in order to allow for dynamic messages
         /// values are using the embedded well-known types, in order to allow for dynamic messages
         /// in the future.
         /// in the future.
         /// </summary>
         /// </summary>
-        private void WriteWellKnownTypeValue(StringBuilder builder, MessageDescriptor descriptor, object value)
+        private void WriteWellKnownTypeValue(TextWriter writer, MessageDescriptor descriptor, object value)
         {
         {
             // Currently, we can never actually get here, because null values are always handled by the caller. But if we *could*,
             // Currently, we can never actually get here, because null values are always handled by the caller. But if we *could*,
             // this would do the right thing.
             // this would do the right thing.
             if (value == null)
             if (value == null)
             {
             {
-                WriteNull(builder);
+                WriteNull(writer);
                 return;
                 return;
             }
             }
             // For wrapper types, the value will either be the (possibly boxed) "native" value,
             // For wrapper types, the value will either be the (possibly boxed) "native" value,
@@ -472,49 +488,49 @@ namespace Google.Protobuf
                     var message = (IMessage) value;
                     var message = (IMessage) value;
                     value = message.Descriptor.Fields[WrappersReflection.WrapperValueFieldNumber].Accessor.GetValue(message);
                     value = message.Descriptor.Fields[WrappersReflection.WrapperValueFieldNumber].Accessor.GetValue(message);
                 }
                 }
-                WriteValue(builder, value);
+                WriteValue(writer, value);
                 return;
                 return;
             }
             }
             if (descriptor.FullName == Timestamp.Descriptor.FullName)
             if (descriptor.FullName == Timestamp.Descriptor.FullName)
             {
             {
-                WriteTimestamp(builder, (IMessage) value);
+                WriteTimestamp(writer, (IMessage)value);
                 return;
                 return;
             }
             }
             if (descriptor.FullName == Duration.Descriptor.FullName)
             if (descriptor.FullName == Duration.Descriptor.FullName)
             {
             {
-                WriteDuration(builder, (IMessage) value);
+                WriteDuration(writer, (IMessage)value);
                 return;
                 return;
             }
             }
             if (descriptor.FullName == FieldMask.Descriptor.FullName)
             if (descriptor.FullName == FieldMask.Descriptor.FullName)
             {
             {
-                WriteFieldMask(builder, (IMessage) value);
+                WriteFieldMask(writer, (IMessage)value);
                 return;
                 return;
             }
             }
             if (descriptor.FullName == Struct.Descriptor.FullName)
             if (descriptor.FullName == Struct.Descriptor.FullName)
             {
             {
-                WriteStruct(builder, (IMessage) value);
+                WriteStruct(writer, (IMessage)value);
                 return;
                 return;
             }
             }
             if (descriptor.FullName == ListValue.Descriptor.FullName)
             if (descriptor.FullName == ListValue.Descriptor.FullName)
             {
             {
                 var fieldAccessor = descriptor.Fields[ListValue.ValuesFieldNumber].Accessor;
                 var fieldAccessor = descriptor.Fields[ListValue.ValuesFieldNumber].Accessor;
-                WriteList(builder, (IList) fieldAccessor.GetValue((IMessage) value));
+                WriteList(writer, (IList)fieldAccessor.GetValue((IMessage)value));
                 return;
                 return;
             }
             }
             if (descriptor.FullName == Value.Descriptor.FullName)
             if (descriptor.FullName == Value.Descriptor.FullName)
             {
             {
-                WriteStructFieldValue(builder, (IMessage) value);
+                WriteStructFieldValue(writer, (IMessage)value);
                 return;
                 return;
             }
             }
             if (descriptor.FullName == Any.Descriptor.FullName)
             if (descriptor.FullName == Any.Descriptor.FullName)
             {
             {
-                WriteAny(builder, (IMessage) value);
+                WriteAny(writer, (IMessage)value);
                 return;
                 return;
             }
             }
-            WriteMessage(builder, (IMessage) value);
+            WriteMessage(writer, (IMessage)value);
         }
         }
 
 
-        private void WriteTimestamp(StringBuilder builder, IMessage value)
+        private void WriteTimestamp(TextWriter writer, IMessage value)
         {
         {
             // TODO: In the common case where this *is* using the built-in Timestamp type, we could
             // TODO: In the common case where this *is* using the built-in Timestamp type, we could
             // avoid all the reflection at this point, by casting to Timestamp. In the interests of
             // avoid all the reflection at this point, by casting to Timestamp. In the interests of
@@ -522,28 +538,28 @@ namespace Google.Protobuf
             // it still works in that case.
             // it still works in that case.
             int nanos = (int) value.Descriptor.Fields[Timestamp.NanosFieldNumber].Accessor.GetValue(value);
             int nanos = (int) value.Descriptor.Fields[Timestamp.NanosFieldNumber].Accessor.GetValue(value);
             long seconds = (long) value.Descriptor.Fields[Timestamp.SecondsFieldNumber].Accessor.GetValue(value);
             long seconds = (long) value.Descriptor.Fields[Timestamp.SecondsFieldNumber].Accessor.GetValue(value);
-            builder.Append(Timestamp.ToJson(seconds, nanos, DiagnosticOnly));
+            writer.Write(Timestamp.ToJson(seconds, nanos, DiagnosticOnly));
         }
         }
 
 
-        private void WriteDuration(StringBuilder builder, IMessage value)
+        private void WriteDuration(TextWriter writer, IMessage value)
         {
         {
             // TODO: Same as for WriteTimestamp
             // TODO: Same as for WriteTimestamp
             int nanos = (int) value.Descriptor.Fields[Duration.NanosFieldNumber].Accessor.GetValue(value);
             int nanos = (int) value.Descriptor.Fields[Duration.NanosFieldNumber].Accessor.GetValue(value);
             long seconds = (long) value.Descriptor.Fields[Duration.SecondsFieldNumber].Accessor.GetValue(value);
             long seconds = (long) value.Descriptor.Fields[Duration.SecondsFieldNumber].Accessor.GetValue(value);
-            builder.Append(Duration.ToJson(seconds, nanos, DiagnosticOnly));
+            writer.Write(Duration.ToJson(seconds, nanos, DiagnosticOnly));
         }
         }
 
 
-        private void WriteFieldMask(StringBuilder builder, IMessage value)
+        private void WriteFieldMask(TextWriter writer, IMessage value)
         {
         {
             var paths = (IList<string>) value.Descriptor.Fields[FieldMask.PathsFieldNumber].Accessor.GetValue(value);
             var paths = (IList<string>) value.Descriptor.Fields[FieldMask.PathsFieldNumber].Accessor.GetValue(value);
-            builder.Append(FieldMask.ToJson(paths, DiagnosticOnly));
+            writer.Write(FieldMask.ToJson(paths, DiagnosticOnly));
         }
         }
 
 
-        private void WriteAny(StringBuilder builder, IMessage value)
+        private void WriteAny(TextWriter writer, IMessage value)
         {
         {
             if (DiagnosticOnly)
             if (DiagnosticOnly)
             {
             {
-                WriteDiagnosticOnlyAny(builder, value);
+                WriteDiagnosticOnlyAny(writer, value);
                 return;
                 return;
             }
             }
 
 
@@ -556,40 +572,40 @@ namespace Google.Protobuf
                 throw new InvalidOperationException($"Type registry has no descriptor for type name '{typeName}'");
                 throw new InvalidOperationException($"Type registry has no descriptor for type name '{typeName}'");
             }
             }
             IMessage message = descriptor.Parser.ParseFrom(data);
             IMessage message = descriptor.Parser.ParseFrom(data);
-            builder.Append("{ ");
-            WriteString(builder, AnyTypeUrlField);
-            builder.Append(NameValueSeparator);
-            WriteString(builder, typeUrl);
+            writer.Write("{ ");
+            WriteString(writer, AnyTypeUrlField);
+            writer.Write(NameValueSeparator);
+            WriteString(writer, typeUrl);
 
 
             if (descriptor.IsWellKnownType)
             if (descriptor.IsWellKnownType)
             {
             {
-                builder.Append(PropertySeparator);
-                WriteString(builder, AnyWellKnownTypeValueField);
-                builder.Append(NameValueSeparator);
-                WriteWellKnownTypeValue(builder, descriptor, message);
+                writer.Write(PropertySeparator);
+                WriteString(writer, AnyWellKnownTypeValueField);
+                writer.Write(NameValueSeparator);
+                WriteWellKnownTypeValue(writer, descriptor, message);
             }
             }
             else
             else
             {
             {
-                WriteMessageFields(builder, message, true);
+                WriteMessageFields(writer, message, true);
             }
             }
-            builder.Append(" }");
+            writer.Write(" }");
         }
         }
 
 
-        private void WriteDiagnosticOnlyAny(StringBuilder builder, IMessage value)
+        private void WriteDiagnosticOnlyAny(TextWriter writer, IMessage value)
         {
         {
             string typeUrl = (string) value.Descriptor.Fields[Any.TypeUrlFieldNumber].Accessor.GetValue(value);
             string typeUrl = (string) value.Descriptor.Fields[Any.TypeUrlFieldNumber].Accessor.GetValue(value);
             ByteString data = (ByteString) value.Descriptor.Fields[Any.ValueFieldNumber].Accessor.GetValue(value);
             ByteString data = (ByteString) value.Descriptor.Fields[Any.ValueFieldNumber].Accessor.GetValue(value);
-            builder.Append("{ ");
-            WriteString(builder, AnyTypeUrlField);
-            builder.Append(NameValueSeparator);
-            WriteString(builder, typeUrl);
-            builder.Append(PropertySeparator);
-            WriteString(builder, AnyDiagnosticValueField);
-            builder.Append(NameValueSeparator);
-            builder.Append('"');
-            builder.Append(data.ToBase64());
-            builder.Append('"');
-            builder.Append(" }");
+            writer.Write("{ ");
+            WriteString(writer, AnyTypeUrlField);
+            writer.Write(NameValueSeparator);
+            WriteString(writer, typeUrl);
+            writer.Write(PropertySeparator);
+            WriteString(writer, AnyDiagnosticValueField);
+            writer.Write(NameValueSeparator);
+            writer.Write('"');
+            writer.Write(data.ToBase64());
+            writer.Write('"');
+            writer.Write(" }");
         }
         }
 
 
         internal static string GetTypeName(String typeUrl)
         internal static string GetTypeName(String typeUrl)
@@ -602,9 +618,9 @@ namespace Google.Protobuf
             return parts[1];
             return parts[1];
         }
         }
 
 
-        private void WriteStruct(StringBuilder builder, IMessage message)
+        private void WriteStruct(TextWriter writer, IMessage message)
         {
         {
-            builder.Append("{ ");
+            writer.Write("{ ");
             IDictionary fields = (IDictionary) message.Descriptor.Fields[Struct.FieldsFieldNumber].Accessor.GetValue(message);
             IDictionary fields = (IDictionary) message.Descriptor.Fields[Struct.FieldsFieldNumber].Accessor.GetValue(message);
             bool first = true;
             bool first = true;
             foreach (DictionaryEntry entry in fields)
             foreach (DictionaryEntry entry in fields)
@@ -618,17 +634,17 @@ namespace Google.Protobuf
 
 
                 if (!first)
                 if (!first)
                 {
                 {
-                    builder.Append(PropertySeparator);
+                    writer.Write(PropertySeparator);
                 }
                 }
-                WriteString(builder, key);
-                builder.Append(NameValueSeparator);
-                WriteStructFieldValue(builder, value);
+                WriteString(writer, key);
+                writer.Write(NameValueSeparator);
+                WriteStructFieldValue(writer, value);
                 first = false;
                 first = false;
             }
             }
-            builder.Append(first ? "}" : " }");
+            writer.Write(first ? "}" : " }");
         }
         }
 
 
-        private void WriteStructFieldValue(StringBuilder builder, IMessage message)
+        private void WriteStructFieldValue(TextWriter writer, IMessage message)
         {
         {
             var specifiedField = message.Descriptor.Oneofs[0].Accessor.GetCaseFieldDescriptor(message);
             var specifiedField = message.Descriptor.Oneofs[0].Accessor.GetCaseFieldDescriptor(message);
             if (specifiedField == null)
             if (specifiedField == null)
@@ -643,48 +659,48 @@ namespace Google.Protobuf
                 case Value.BoolValueFieldNumber:
                 case Value.BoolValueFieldNumber:
                 case Value.StringValueFieldNumber:
                 case Value.StringValueFieldNumber:
                 case Value.NumberValueFieldNumber:
                 case Value.NumberValueFieldNumber:
-                    WriteValue(builder, value);
+                    WriteValue(writer, value);
                     return;
                     return;
                 case Value.StructValueFieldNumber:
                 case Value.StructValueFieldNumber:
                 case Value.ListValueFieldNumber:
                 case Value.ListValueFieldNumber:
                     // Structs and ListValues are nested messages, and already well-known types.
                     // Structs and ListValues are nested messages, and already well-known types.
                     var nestedMessage = (IMessage) specifiedField.Accessor.GetValue(message);
                     var nestedMessage = (IMessage) specifiedField.Accessor.GetValue(message);
-                    WriteWellKnownTypeValue(builder, nestedMessage.Descriptor, nestedMessage);
+                    WriteWellKnownTypeValue(writer, nestedMessage.Descriptor, nestedMessage);
                     return;
                     return;
                 case Value.NullValueFieldNumber:
                 case Value.NullValueFieldNumber:
-                    WriteNull(builder);
+                    WriteNull(writer);
                     return;
                     return;
                 default:
                 default:
                     throw new InvalidOperationException("Unexpected case in struct field: " + specifiedField.FieldNumber);
                     throw new InvalidOperationException("Unexpected case in struct field: " + specifiedField.FieldNumber);
             }
             }
         }
         }
 
 
-        internal void WriteList(StringBuilder builder, IList list)
+        internal void WriteList(TextWriter writer, IList list)
         {
         {
-            builder.Append("[ ");
+            writer.Write("[ ");
             bool first = true;
             bool first = true;
             foreach (var value in list)
             foreach (var value in list)
             {
             {
                 if (!first)
                 if (!first)
                 {
                 {
-                    builder.Append(PropertySeparator);
+                    writer.Write(PropertySeparator);
                 }
                 }
-                WriteValue(builder, value);
+                WriteValue(writer, value);
                 first = false;
                 first = false;
             }
             }
-            builder.Append(first ? "]" : " ]");
+            writer.Write(first ? "]" : " ]");
         }
         }
 
 
-        internal void WriteDictionary(StringBuilder builder, IDictionary dictionary)
+        internal void WriteDictionary(TextWriter writer, IDictionary dictionary)
         {
         {
-            builder.Append("{ ");
+            writer.Write("{ ");
             bool first = true;
             bool first = true;
             // This will box each pair. Could use IDictionaryEnumerator, but that's ugly in terms of disposal.
             // This will box each pair. Could use IDictionaryEnumerator, but that's ugly in terms of disposal.
             foreach (DictionaryEntry pair in dictionary)
             foreach (DictionaryEntry pair in dictionary)
             {
             {
                 if (!first)
                 if (!first)
                 {
                 {
-                    builder.Append(PropertySeparator);
+                    writer.Write(PropertySeparator);
                 }
                 }
                 string keyText;
                 string keyText;
                 if (pair.Key is string)
                 if (pair.Key is string)
@@ -707,12 +723,12 @@ namespace Google.Protobuf
                     }
                     }
                     throw new ArgumentException("Unhandled dictionary key type: " + pair.Key.GetType());
                     throw new ArgumentException("Unhandled dictionary key type: " + pair.Key.GetType());
                 }
                 }
-                WriteString(builder, keyText);
-                builder.Append(NameValueSeparator);
-                WriteValue(builder, pair.Value);
+                WriteString(writer, keyText);
+                writer.Write(NameValueSeparator);
+                WriteValue(writer, pair.Value);
                 first = false;
                 first = false;
             }
             }
-            builder.Append(first ? "}" : " }");
+            writer.Write(first ? "}" : " }");
         }
         }
 
 
         /// <summary>
         /// <summary>
@@ -735,15 +751,15 @@ namespace Google.Protobuf
         /// <remarks>
         /// <remarks>
         /// Other than surrogate pair handling, this code is mostly taken from src/google/protobuf/util/internal/json_escaping.cc.
         /// Other than surrogate pair handling, this code is mostly taken from src/google/protobuf/util/internal/json_escaping.cc.
         /// </remarks>
         /// </remarks>
-        internal static void WriteString(StringBuilder builder, string text)
+        internal static void WriteString(TextWriter writer, string text)
         {
         {
-            builder.Append('"');
+            writer.Write('"');
             for (int i = 0; i < text.Length; i++)
             for (int i = 0; i < text.Length; i++)
             {
             {
                 char c = text[i];
                 char c = text[i];
                 if (c < 0xa0)
                 if (c < 0xa0)
                 {
                 {
-                    builder.Append(CommonRepresentations[c]);
+                    writer.Write(CommonRepresentations[c]);
                     continue;
                     continue;
                 }
                 }
                 if (char.IsHighSurrogate(c))
                 if (char.IsHighSurrogate(c))
@@ -755,8 +771,8 @@ namespace Google.Protobuf
                     {
                     {
                         throw new ArgumentException("String contains low surrogate not followed by high surrogate");
                         throw new ArgumentException("String contains low surrogate not followed by high surrogate");
                     }
                     }
-                    HexEncodeUtf16CodeUnit(builder, c);
-                    HexEncodeUtf16CodeUnit(builder, text[i]);
+                    HexEncodeUtf16CodeUnit(writer, c);
+                    HexEncodeUtf16CodeUnit(writer, text[i]);
                     continue;
                     continue;
                 }
                 }
                 else if (char.IsLowSurrogate(c))
                 else if (char.IsLowSurrogate(c))
@@ -777,7 +793,7 @@ namespace Google.Protobuf
                     case 0x070f:  // Syriac abbreviation mark
                     case 0x070f:  // Syriac abbreviation mark
                     case 0x17b4:  // Khmer vowel inherent Aq
                     case 0x17b4:  // Khmer vowel inherent Aq
                     case 0x17b5:  // Khmer vowel inherent Aa
                     case 0x17b5:  // Khmer vowel inherent Aa
-                        HexEncodeUtf16CodeUnit(builder, c);
+                        HexEncodeUtf16CodeUnit(writer, c);
                         break;
                         break;
 
 
                     default:
                     default:
@@ -787,27 +803,27 @@ namespace Google.Protobuf
                             (c >= 0x2060 && c <= 0x2064) ||  // Invisible etc.
                             (c >= 0x2060 && c <= 0x2064) ||  // Invisible etc.
                             (c >= 0x206a && c <= 0x206f))
                             (c >= 0x206a && c <= 0x206f))
                         {
                         {
-                            HexEncodeUtf16CodeUnit(builder, c);
+                            HexEncodeUtf16CodeUnit(writer, c);
                         }
                         }
                         else
                         else
                         {
                         {
                             // No handling of surrogates here - that's done earlier
                             // No handling of surrogates here - that's done earlier
-                            builder.Append(c);
+                            writer.Write(c);
                         }
                         }
                         break;
                         break;
                 }
                 }
             }
             }
-            builder.Append('"');
+            writer.Write('"');
         }
         }
 
 
         private const string Hex = "0123456789abcdef";
         private const string Hex = "0123456789abcdef";
-        private static void HexEncodeUtf16CodeUnit(StringBuilder builder, char c)
+        private static void HexEncodeUtf16CodeUnit(TextWriter writer, char c)
         {
         {
-            builder.Append("\\u");
-            builder.Append(Hex[(c >> 12) & 0xf]);
-            builder.Append(Hex[(c >> 8) & 0xf]);
-            builder.Append(Hex[(c >> 4) & 0xf]);
-            builder.Append(Hex[(c >> 0) & 0xf]);
+            writer.Write("\\u");
+            writer.Write(Hex[(c >> 12) & 0xf]);
+            writer.Write(Hex[(c >> 8) & 0xf]);
+            writer.Write(Hex[(c >> 4) & 0xf]);
+            writer.Write(Hex[(c >> 0) & 0xf]);
         }
         }
 
 
         /// <summary>
         /// <summary>

+ 6 - 0
csharp/src/Google.Protobuf/Reflection/FieldDescriptor.cs

@@ -90,6 +90,12 @@ namespace Google.Protobuf.Reflection
         /// </summary>
         /// </summary>
         public override string Name { get { return proto.Name; } }
         public override string Name { get { return proto.Name; } }
 
 
+
+        /// <summary>
+        /// The json_name option of the descriptor's target.
+        /// </summary>
+        public string JsonName { get { return proto.JsonName == "" ? JsonFormatter.ToCamelCase(proto.Name) : proto.JsonName; } }
+
         internal FieldDescriptorProto Proto { get { return proto; } }
         internal FieldDescriptorProto Proto { get { return proto; } }
 
 
         /// <summary>
         /// <summary>

+ 1 - 1
csharp/src/Google.Protobuf/Reflection/MessageDescriptor.cs

@@ -102,8 +102,8 @@ namespace Google.Protobuf.Reflection
             var map = new Dictionary<string, FieldDescriptor>();
             var map = new Dictionary<string, FieldDescriptor>();
             foreach (var field in fields)
             foreach (var field in fields)
             {
             {
-                map[JsonFormatter.ToCamelCase(field.Name)] = field;
                 map[field.Name] = field;
                 map[field.Name] = field;
+                map[field.JsonName] = field;
             }
             }
             return new ReadOnlyDictionary<string, FieldDescriptor>(map);
             return new ReadOnlyDictionary<string, FieldDescriptor>(map);
         }
         }

+ 9 - 8
csharp/src/Google.Protobuf/WellKnownTypes/FieldMaskPartial.cs

@@ -33,6 +33,7 @@
 using System;
 using System;
 using System.Collections;
 using System.Collections;
 using System.Collections.Generic;
 using System.Collections.Generic;
+using System.IO;
 using System.Linq;
 using System.Linq;
 using System.Text;
 using System.Text;
 
 
@@ -57,19 +58,19 @@ namespace Google.Protobuf.WellKnownTypes
             var firstInvalid = paths.FirstOrDefault(p => !ValidatePath(p));
             var firstInvalid = paths.FirstOrDefault(p => !ValidatePath(p));
             if (firstInvalid == null)
             if (firstInvalid == null)
             {
             {
-                var builder = new StringBuilder();
-                JsonFormatter.WriteString(builder, string.Join(",", paths.Select(JsonFormatter.ToCamelCase)));
-                return builder.ToString();
+                var writer = new StringWriter();
+                JsonFormatter.WriteString(writer, string.Join(",", paths.Select(JsonFormatter.ToCamelCase)));
+                return writer.ToString();
             }
             }
             else
             else
             {
             {
                 if (diagnosticOnly)
                 if (diagnosticOnly)
                 {
                 {
-                    var builder = new StringBuilder();
-                    builder.Append("{ \"@warning\": \"Invalid FieldMask\", \"paths\": ");
-                    JsonFormatter.Default.WriteList(builder, (IList) paths);
-                    builder.Append(" }");
-                    return builder.ToString();
+                    var writer = new StringWriter();
+                    writer.Write("{ \"@warning\": \"Invalid FieldMask\", \"paths\": ");
+                    JsonFormatter.Default.WriteList(writer, (IList)paths);
+                    writer.Write(" }");
+                    return writer.ToString();
                 }
                 }
                 else
                 else
                 {
                 {

+ 2 - 2
generate_descriptor_proto.sh

@@ -95,9 +95,9 @@ do
 done
 done
 cd ..
 cd ..
 
 
-if test -x objectivec/generate_descriptors_proto.sh; then
+if test -x objectivec/generate_well_known_types.sh; then
   echo "Generating messages for objc."
   echo "Generating messages for objc."
-  objectivec/generate_descriptors_proto.sh $@
+  objectivec/generate_well_known_types.sh $@
 fi
 fi
 
 
 if test -x csharp/generate_protos.sh; then
 if test -x csharp/generate_protos.sh; then

+ 3 - 4
java/util/src/main/java/com/google/protobuf/util/JsonFormat.java

@@ -952,16 +952,15 @@ public class JsonFormat {
     }
     }
   }
   }
   
   
-  private static final String TYPE_URL_PREFIX = "type.googleapis.com";
-  
+
   private static String getTypeName(String typeUrl)
   private static String getTypeName(String typeUrl)
       throws InvalidProtocolBufferException {
       throws InvalidProtocolBufferException {
     String[] parts = typeUrl.split("/");
     String[] parts = typeUrl.split("/");
-    if (parts.length != 2 || !parts[0].equals(TYPE_URL_PREFIX)) {
+    if (parts.length == 1) {
       throw new InvalidProtocolBufferException(
       throw new InvalidProtocolBufferException(
           "Invalid type url found: " + typeUrl);
           "Invalid type url found: " + typeUrl);
     }
     }
-    return parts[1];
+    return parts[parts.length - 1];
   }
   }
   
   
   private static class ParserImpl {
   private static class ParserImpl {

+ 6 - 0
jenkins/README.md

@@ -0,0 +1,6 @@
+
+Jenkins Infrastructure
+----------------------
+
+The scripts in this directory serve as plumbing for running the protobuf
+tests under Jenkins.

+ 56 - 0
jenkins/build_and_run_docker.sh

@@ -0,0 +1,56 @@
+#!/bin/bash
+#
+# Builds docker image and runs a command under it.
+# This is a generic script that is configured with the following variables:
+#
+# DOCKERFILE_DIR - Directory in which Dockerfile file is located.
+# DOCKER_RUN_SCRIPT - Script to run under docker (relative to protobuf repo root)
+# OUTPUT_DIR - Directory that will be copied from inside docker after finishing.
+# $@ - Extra args to pass to docker run
+
+
+set -ex
+
+cd $(dirname $0)/..
+git_root=$(pwd)
+cd -
+
+# Use image name based on Dockerfile location checksum
+DOCKER_IMAGE_NAME=$(basename $DOCKERFILE_DIR)_$(sha1sum $DOCKERFILE_DIR/Dockerfile | cut -f1 -d\ )
+
+# Make sure docker image has been built. Should be instantaneous if so.
+docker build -t $DOCKER_IMAGE_NAME $DOCKERFILE_DIR
+
+# Ensure existence of ccache directory
+CCACHE_DIR=/tmp/protobuf-ccache
+mkdir -p $CCACHE_DIR
+
+# Choose random name for docker container
+CONTAINER_NAME="build_and_run_docker_$(uuidgen)"
+
+# Run command inside docker
+docker run \
+  "$@" \
+  -e CCACHE_DIR=$CCACHE_DIR \
+  -e EXTERNAL_GIT_ROOT="/var/local/jenkins/protobuf" \
+  -e THIS_IS_REALLY_NEEDED='see https://github.com/docker/docker/issues/14203 for why docker is awful' \
+  -v "$git_root:/var/local/jenkins/protobuf:ro" \
+  -v $CCACHE_DIR:$CCACHE_DIR \
+  -w /var/local/git/protobuf \
+  --name=$CONTAINER_NAME \
+  $DOCKER_IMAGE_NAME \
+  bash -l "/var/local/jenkins/protobuf/$DOCKER_RUN_SCRIPT" || FAILED="true"
+
+# Copy output artifacts
+if [ "$OUTPUT_DIR" != "" ]
+then
+  docker cp "$CONTAINER_NAME:/var/local/git/protobuf/$OUTPUT_DIR" "$git_root" || FAILED="true"
+fi
+
+# remove the container, possibly killing it first
+docker rm -f $CONTAINER_NAME || true
+
+if [ "$FAILED" != "" ]
+then
+  exit 1
+fi

+ 6 - 0
jenkins/buildcmds/README.md

@@ -0,0 +1,6 @@
+
+Jenkins Build Commands
+----------------------
+
+The scripts in this directory are designed to be top-level entry points for
+Jenkins projects.

+ 15 - 0
jenkins/buildcmds/pull_request.sh

@@ -0,0 +1,15 @@
+#!/bin/bash
+#
+# This is the top-level script we give to Jenkins as the entry point for
+# running the "pull request" project:
+#
+#   https://grpc-testing.appspot.com/view/Protocol%20Buffers/job/protobuf_pull_request/
+#
+# This script selects a specific Dockerfile (for building a Docker image) and
+# a script to run inside that image.  Then we delegate to the general
+# build_and_run_docker.sh script.
+
+export DOCKERFILE_DIR=jenkins/docker
+export DOCKER_RUN_SCRIPT=jenkins/pull_request_in_docker.sh
+export OUTPUT_DIR=testoutput
+./jenkins/build_and_run_docker.sh

+ 130 - 0
jenkins/docker/Dockerfile

@@ -0,0 +1,130 @@
+# This Dockerfile specifies the recipe for creating an image for the tests
+# to run in.
+#
+# We install as many test dependencies here as we can, because these setup
+# steps can be cached.  They do *not* run every time we run the build.
+# The Docker image is only rebuilt when the Dockerfile (ie. this file)
+# changes.
+
+# Base Dockerfile for gRPC dev images
+FROM debian:latest
+
+# Apt source for old Python versions.
+RUN echo 'deb http://ppa.launchpad.net/fkrull/deadsnakes/ubuntu trusty main' > /etc/apt/sources.list.d/deadsnakes.list && \
+  apt-key adv --keyserver keyserver.ubuntu.com --recv-keys DB82666C
+
+# Apt source for Oracle Java.
+run echo 'deb http://ppa.launchpad.net/webupd8team/java/ubuntu trusty main' > /etc/apt/sources.list.d/webupd8team-java-trusty.list && \
+  apt-key adv --keyserver keyserver.ubuntu.com --recv-keys EEA14886 && \
+  echo "oracle-java7-installer shared/accepted-oracle-license-v1-1 select true" | debconf-set-selections
+
+# Apt source for Mono
+run echo "deb http://download.mono-project.com/repo/debian wheezy main" | tee /etc/apt/sources.list.d/mono-xamarin.list && \
+  echo "deb http://download.mono-project.com/repo/debian wheezy-libjpeg62-compat main" | tee -a /etc/apt/sources.list.d/mono-xamarin.list && \
+  apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF
+
+# Install dependencies.  We start with the basic ones require to build protoc
+# and the C++ build
+RUN apt-get update && apt-get install -y \
+  autoconf \
+  autotools-dev \
+  build-essential \
+  bzip2 \
+  ccache \
+  curl \
+  gcc \
+  git \
+  libc6 \
+  libc6-dbg \
+  libc6-dev \
+  libgtest-dev \
+  libtool \
+  make \
+  parallel \
+  time \
+  wget \
+  # -- For csharp --
+  mono-devel \
+  referenceassemblies-pcl \
+  nunit \
+  # -- For all Java builds -- \
+  maven \
+  # -- For java_jdk6 -- \
+  #   oops! not in jessie. too old? openjdk-6-jdk \
+  # -- For java_jdk7 -- \
+  openjdk-7-jdk \
+  # -- For java_oracle7 -- \
+  oracle-java7-installer \
+  # -- For python / python_cpp -- \
+  python-setuptools \
+  python-pip \
+  python-dev \
+  python2.6-dev \
+  python3.3-dev \
+  python3.4-dev \
+  # -- For Ruby --
+  ruby \
+  && apt-get clean
+
+##################
+# C# dependencies
+
+RUN wget www.nuget.org/NuGet.exe -O /usr/local/bin/nuget.exe
+
+##################
+# Python dependencies
+
+# These packages exist in apt-get, but their versions are too old, so we have
+# to get updates from pip.
+
+RUN pip install pip --upgrade
+RUN pip install virtualenv tox yattag
+
+
+##################
+# Ruby dependencies
+
+# Install rvm
+RUN gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3
+RUN \curl -sSL https://get.rvm.io | bash -s stable
+
+# Install Ruby 2.1
+RUN /bin/bash -l -c "rvm install ruby-2.1"
+RUN /bin/bash -l -c "rvm use --default ruby-2.1"
+RUN /bin/bash -l -c "echo 'gem: --no-ri --no-rdoc' > ~/.gemrc"
+RUN /bin/bash -l -c "echo 'export PATH=/usr/local/rvm/bin:$PATH' >> ~/.bashrc"
+RUN /bin/bash -l -c "echo 'rvm --default use ruby-2.1' >> ~/.bashrc"
+RUN /bin/bash -l -c "gem install bundler --no-ri --no-rdoc"
+
+##################
+# Java dependencies
+
+# This step requires compiling protoc. :(
+
+ENV MAVEN_REPO /var/maven_local_repository
+ENV MVN mvn --batch-mode
+
+RUN cd /tmp && \
+  git clone https://github.com/google/protobuf.git && \
+  cd protobuf && \
+  ./autogen.sh && \
+  ./configure && \
+  make -j6 && \
+  cd java && \
+  $MVN install dependency:go-offline -Dmaven.repo.local=$MAVEN_REPO -P lite && \
+  $MVN install dependency:go-offline -Dmaven.repo.local=$MAVEN_REPO && \
+  cd ../javanano && \
+  $MVN install dependency:go-offline -Dmaven.repo.local=$MAVEN_REPO
+
+##################
+# Prepare ccache
+
+RUN ln -s /usr/bin/ccache /usr/local/bin/gcc
+RUN ln -s /usr/bin/ccache /usr/local/bin/g++
+RUN ln -s /usr/bin/ccache /usr/local/bin/cc
+RUN ln -s /usr/bin/ccache /usr/local/bin/c++
+RUN ln -s /usr/bin/ccache /usr/local/bin/clang
+RUN ln -s /usr/bin/ccache /usr/local/bin/clang++
+
+# Define the default command.
+CMD ["bash"]

+ 91 - 0
jenkins/make_test_output.py

@@ -0,0 +1,91 @@
+"""Gathers output from test runs and create an XML file in JUnit format.
+
+The output files from the individual tests have been written in a directory
+structure like:
+
+  $DIR/joblog  (output from "parallel --joblog joblog")
+  $DIR/logs/1/cpp/stdout
+  $DIR/logs/1/cpp/stderr
+  $DIR/logs/1/csharp/stdout
+  $DIR/logs/1/csharp/stderr
+  $DIR/logs/1/java_jdk7/stdout
+  $DIR/logs/1/java_jdk7/stderr
+  etc.
+
+This script bundles them into a single output XML file so Jenkins can show
+detailed test results.  It runs as the last step before the Jenkins build
+finishes.
+"""
+
+import os;
+import sys;
+from yattag import Doc
+from collections import defaultdict
+
+def readtests(basedir):
+  tests = defaultdict(dict)
+
+  # Sample input (note: separators are tabs).
+  #
+  # Seq	Host	Starttime	Runtime	Send	Receive	Exitval	Signal	Command
+  # 1	:	1456263838.313	0.005	0	0	0	0	echo A
+  with open(basedir + "/joblog") as jobs:
+    firstline = next(jobs)
+    for line in jobs:
+      values = line.split("\t")
+
+      name = values[8].split()[-1]
+      test = tests[name]
+      test["name"] = name
+      test["time"] = values[3]
+
+      exitval = values[6]
+      if int(exitval):
+        # We don't have a more specific message.  User should look at stderr.
+        test["failure"] = "TEST FAILURE"
+      else:
+        test["failure"] = False
+
+  for testname in os.listdir(basedir + "/logs/1"):
+    test = tests[testname]
+
+    with open(basedir + "/logs/1/" + testname + "/stdout") as f:
+      test["stdout"] = f.read()
+
+    with open(basedir + "/logs/1/" + testname + "/stderr") as f:
+      test["stderr"] = f.read()
+
+  # The cpp test is special since it doesn't run under parallel so doesn't show
+  # up in the job log.
+  tests["cpp"]["name"] = "cpp"
+
+  with open(basedir + '/logs/1/cpp/build_time', 'r') as f:
+    tests["cpp"]["time"] = f.read().strip()
+  tests["cpp"]["failure"] = False
+
+  ret = tests.values()
+  ret.sort(key=lambda x: x["name"])
+
+  return ret
+
+def genxml(tests):
+  doc, tag, text = Doc().tagtext()
+
+  with tag("testsuites"):
+    with tag("testsuite", name="Protobuf Tests"):
+      for test in tests:
+        with tag("testcase", name=test["name"], classname=test["name"],
+                             time=test["time"]):
+          with tag("system-out"):
+            text(test["stdout"])
+          with tag("system-err"):
+            text(test["stderr"])
+          if test["failure"]:
+            with tag("failure"):
+              text(test["failure"])
+
+  return doc.getvalue()
+
+sys.stderr.write("make_test_output.py: writing XML from directory: " +
+                 sys.argv[1] + "\n");
+print genxml(readtests(sys.argv[1]))

+ 72 - 0
jenkins/pull_request_in_docker.sh

@@ -0,0 +1,72 @@
+#!/bin/bash
+#
+# This is the script that runs inside Docker, once the image has been built,
+# to execute all tests for the "pull request" project.
+
+WORKSPACE_BASE=`pwd`
+MY_DIR="$(dirname "$0")"
+TEST_SCRIPT=$MY_DIR/../tests.sh
+BUILD_DIR=/tmp/protobuf
+
+set -e  # exit immediately on error
+set -x  # display all commands
+
+# The protobuf repository is mounted into our Docker image, but read-only.
+# We clone into a directory inside Docker (this is faster than cp).
+rm -rf $BUILD_DIR
+mkdir -p $BUILD_DIR
+cd $BUILD_DIR
+git clone /var/local/jenkins/protobuf
+cd protobuf
+
+# Set up the directory where our test output is going to go.
+OUTPUT_DIR=`mktemp -d`
+LOG_OUTPUT_DIR=$OUTPUT_DIR/logs
+mkdir -p $LOG_OUTPUT_DIR/1/cpp
+
+################################################################################
+# cpp build needs to run first, non-parallelized, so that protoc is available
+# for other builds.
+
+# Output filenames to follow the overall scheme used by parallel, ie:
+#  $DIR/logs/1/cpp/stdout
+#  $DIR/logs/1/cpp/stderr
+#  $DIR/logs/1/csharp/stdout
+#  $DIR/logs/1/csharp/stderr
+#  $DIR/logs/1/java_jdk7/stdout
+#  $DIR/logs/1/java_jdk7/stderr
+CPP_STDOUT=$LOG_OUTPUT_DIR/1/cpp/stdout
+CPP_STDERR=$LOG_OUTPUT_DIR/1/cpp/stderr
+
+# Time the C++ build, so we can put this info in the test output.
+# It's important that we get /usr/bin/time (which supports -f and -o) and not
+# the bash builtin "time" which doesn't.
+TIME_CMD="/usr/bin/time -f %e -o $LOG_OUTPUT_DIR/1/cpp/build_time"
+
+$TIME_CMD $TEST_SCRIPT cpp > >(tee $CPP_STDOUT) 2> >(tee $CPP_STDERR >&2)
+
+# Other tests are run in parallel.
+
+parallel --results $LOG_OUTPUT_DIR --joblog $OUTPUT_DIR/joblog $TEST_SCRIPT ::: \
+  csharp \
+  java_jdk7 \
+  javanano_jdk7 \
+  java_oracle7 \
+  javanano_oracle7 \
+  python \
+  python_cpp \
+  ruby21 \
+  || true  # Process test results even if tests fail.
+
+cat $OUTPUT_DIR/joblog
+
+# The directory that is copied from Docker back into the Jenkins workspace.
+COPY_FROM_DOCKER=/var/local/git/protobuf/testoutput
+mkdir -p $COPY_FROM_DOCKER
+TESTOUTPUT_XML_FILE=$COPY_FROM_DOCKER/testresults.xml
+
+# Process all the output files from "parallel" and package them into a single
+# .xml file with detailed, broken-down test output.
+python $MY_DIR/make_test_output.py $OUTPUT_DIR > $TESTOUTPUT_XML_FILE
+
+ls -l $TESTOUTPUT_XML_FILE

+ 36 - 29
objectivec/DevTools/compile_testing_protos.sh

@@ -67,29 +67,36 @@ fi
 # Ensure the output dir exists
 # Ensure the output dir exists
 mkdir -p "${OUTPUT_DIR}/google/protobuf"
 mkdir -p "${OUTPUT_DIR}/google/protobuf"
 
 
-CORE_PROTO_FILES=(                                         \
-  src/google/protobuf/unittest_arena.proto                 \
-  src/google/protobuf/unittest_custom_options.proto        \
-  src/google/protobuf/unittest_enormous_descriptor.proto   \
-  src/google/protobuf/unittest_embed_optimize_for.proto    \
-  src/google/protobuf/unittest_empty.proto                 \
-  src/google/protobuf/unittest_import.proto                \
-  src/google/protobuf/unittest_import_lite.proto           \
-  src/google/protobuf/unittest_lite.proto                  \
-  src/google/protobuf/unittest_mset.proto                  \
-  src/google/protobuf/unittest_mset_wire_format.proto      \
-  src/google/protobuf/unittest_no_arena.proto              \
-  src/google/protobuf/unittest_no_arena_import.proto       \
-  src/google/protobuf/unittest_no_generic_services.proto   \
-  src/google/protobuf/unittest_optimize_for.proto          \
-  src/google/protobuf/unittest.proto                       \
-  src/google/protobuf/unittest_import_public.proto         \
-  src/google/protobuf/unittest_import_public_lite.proto    \
-  src/google/protobuf/unittest_drop_unknown_fields.proto   \
-  src/google/protobuf/unittest_preserve_unknown_enum.proto \
-  src/google/protobuf/map_lite_unittest.proto              \
-  src/google/protobuf/map_proto2_unittest.proto            \
-  src/google/protobuf/map_unittest.proto                   \
+CORE_PROTO_FILES=(
+  src/google/protobuf/unittest_arena.proto
+  src/google/protobuf/unittest_custom_options.proto
+  src/google/protobuf/unittest_enormous_descriptor.proto
+  src/google/protobuf/unittest_embed_optimize_for.proto
+  src/google/protobuf/unittest_empty.proto
+  src/google/protobuf/unittest_import.proto
+  src/google/protobuf/unittest_import_lite.proto
+  src/google/protobuf/unittest_lite.proto
+  src/google/protobuf/unittest_mset.proto
+  src/google/protobuf/unittest_mset_wire_format.proto
+  src/google/protobuf/unittest_no_arena.proto
+  src/google/protobuf/unittest_no_arena_import.proto
+  src/google/protobuf/unittest_no_generic_services.proto
+  src/google/protobuf/unittest_optimize_for.proto
+  src/google/protobuf/unittest.proto
+  src/google/protobuf/unittest_import_public.proto
+  src/google/protobuf/unittest_import_public_lite.proto
+  src/google/protobuf/unittest_drop_unknown_fields.proto
+  src/google/protobuf/unittest_preserve_unknown_enum.proto
+  src/google/protobuf/map_lite_unittest.proto
+  src/google/protobuf/map_proto2_unittest.proto
+  src/google/protobuf/map_unittest.proto
+)
+
+# The unittest_custom_options.proto extends the messages in descriptor.proto
+# so we build it in to test extending in general. The library doesn't provide
+# a descriptor as it doesn't use the classes/enums.
+CORE_PROTO_FILES+=(
+  src/google/protobuf/descriptor.proto
 )
 )
 
 
 compile_proto() {
 compile_proto() {
@@ -104,12 +111,12 @@ for a_proto in "${CORE_PROTO_FILES[@]}" ; do
   compile_proto "${a_proto}"
   compile_proto "${a_proto}"
 done
 done
 
 
-OBJC_PROTO_FILES=(                               \
-  objectivec/Tests/unittest_cycle.proto          \
-  objectivec/Tests/unittest_runtime_proto2.proto \
-  objectivec/Tests/unittest_runtime_proto3.proto \
-  objectivec/Tests/unittest_objc.proto           \
-  objectivec/Tests/unittest_objc_startup.proto   \
+OBJC_PROTO_FILES=(
+  objectivec/Tests/unittest_cycle.proto
+  objectivec/Tests/unittest_runtime_proto2.proto
+  objectivec/Tests/unittest_runtime_proto3.proto
+  objectivec/Tests/unittest_objc.proto
+  objectivec/Tests/unittest_objc_startup.proto
 )
 )
 
 
 for a_proto in "${OBJC_PROTO_FILES[@]}" ; do
 for a_proto in "${OBJC_PROTO_FILES[@]}" ; do

+ 2 - 2
objectivec/DevTools/full_mac_build.sh

@@ -190,7 +190,7 @@ header "Ensuring the ObjC descriptors are current."
 readonly NewestInput=$(find \
 readonly NewestInput=$(find \
    src/google/protobuf/*.proto \
    src/google/protobuf/*.proto \
    src/.libs src/*.la src/protoc \
    src/.libs src/*.la src/protoc \
-   objectivec/generate_descriptors_proto.sh \
+   objectivec/generate_well_known_types.sh \
       -type f -print0 \
       -type f -print0 \
       | xargs -0 stat -f "%m %N" \
       | xargs -0 stat -f "%m %N" \
       | sort -n | tail -n1 | cut -f2- -d" ")
       | sort -n | tail -n1 | cut -f2- -d" ")
@@ -203,7 +203,7 @@ readonly OldestOutput=$(find \
 # If the newest input is newer than the oldest output, regenerate.
 # If the newest input is newer than the oldest output, regenerate.
 if [[ "${NewestInput}" -nt "${OldestOutput}" ]] ; then
 if [[ "${NewestInput}" -nt "${OldestOutput}" ]] ; then
   echo ">> Newest input is newer than oldest output, regenerating."
   echo ">> Newest input is newer than oldest output, regenerating."
-  objectivec/generate_descriptors_proto.sh -j "${NUM_MAKE_JOBS}"
+  objectivec/generate_well_known_types.sh -j "${NUM_MAKE_JOBS}"
 else
 else
   echo ">> Newest input is older than oldest output, no need to regenerating."
   echo ">> Newest input is older than oldest output, no need to regenerating."
 fi
 fi

+ 1 - 8
objectivec/GPBBootstrap.h

@@ -37,13 +37,6 @@
 #define GPBOBJC_SKIP_MESSAGE_TEXTFORMAT_EXTRAS 0
 #define GPBOBJC_SKIP_MESSAGE_TEXTFORMAT_EXTRAS 0
 #endif
 #endif
 
 
-// Most uses of protocol buffers don't need field options, by default the
-// static data will be compiled out, define this to 1 to include it. The only
-// time you need this is if you are doing introspection of the protocol buffers.
-#ifndef GPBOBJC_INCLUDE_FIELD_OPTIONS
-#define GPBOBJC_INCLUDE_FIELD_OPTIONS 0
-#endif
-
 // Used in the generated code to give sizes to enums. int32_t was chosen based
 // Used in the generated code to give sizes to enums. int32_t was chosen based
 // on the fact that Protocol Buffers enums are limited to this range.
 // on the fact that Protocol Buffers enums are limited to this range.
 #if !__has_feature(objc_fixed_enum)
 #if !__has_feature(objc_fixed_enum)
@@ -89,4 +82,4 @@
 // generated Objective C sources.  In general we don't want to change the
 // generated Objective C sources.  In general we don't want to change the
 // runtime interfaces (or this version) as it means everything has to be
 // runtime interfaces (or this version) as it means everything has to be
 // regenerated.
 // regenerated.
-#define GOOGLE_PROTOBUF_OBJC_GEN_VERSION 30000
+#define GOOGLE_PROTOBUF_OBJC_GEN_VERSION 30001

+ 50 - 16
objectivec/GPBCodedInputStream.h

@@ -35,52 +35,86 @@
 
 
 NS_ASSUME_NONNULL_BEGIN
 NS_ASSUME_NONNULL_BEGIN
 
 
-// Reads and decodes protocol message fields.
-// Subclassing of GPBCodedInputStream is NOT supported.
+/// Reads and decodes protocol message fields.
+///
+/// The common uses of protocol buffers shouldn't need to use this class.
+/// @c GPBMessage's provide a @c +parseFromData:error: and @c
+/// +parseFromData:extensionRegistry:error: method that will decode a
+/// message for you.
+///
+/// @note Subclassing of GPBCodedInputStream is NOT supported.
 @interface GPBCodedInputStream : NSObject
 @interface GPBCodedInputStream : NSObject
 
 
+/// Creates a new stream wrapping some data.
 + (instancetype)streamWithData:(NSData *)data;
 + (instancetype)streamWithData:(NSData *)data;
+
+/// Initializes a stream wrapping some data.
 - (instancetype)initWithData:(NSData *)data;
 - (instancetype)initWithData:(NSData *)data;
 
 
-// Attempt to read a field tag, returning zero if we have reached EOF.
-// Protocol message parsers use this to read tags, since a protocol message
-// may legally end wherever a tag occurs, and zero is not a valid tag number.
+/// Attempt to read a field tag, returning zero if we have reached EOF.
+/// Protocol message parsers use this to read tags, since a protocol message
+/// may legally end wherever a tag occurs, and zero is not a valid tag number.
 - (int32_t)readTag;
 - (int32_t)readTag;
 
 
+/// Read and return a double.
 - (double)readDouble;
 - (double)readDouble;
+/// Read and return a float.
 - (float)readFloat;
 - (float)readFloat;
+/// Read and return a uint64.
 - (uint64_t)readUInt64;
 - (uint64_t)readUInt64;
+/// Read and return a uint32.
 - (uint32_t)readUInt32;
 - (uint32_t)readUInt32;
+/// Read and return an int64.
 - (int64_t)readInt64;
 - (int64_t)readInt64;
+/// Read and return an int32.
 - (int32_t)readInt32;
 - (int32_t)readInt32;
+/// Read and return a fixed64.
 - (uint64_t)readFixed64;
 - (uint64_t)readFixed64;
+/// Read and return a fixed32.
 - (uint32_t)readFixed32;
 - (uint32_t)readFixed32;
+/// Read and return an enum (int).
 - (int32_t)readEnum;
 - (int32_t)readEnum;
+/// Read and return a sfixed32.
 - (int32_t)readSFixed32;
 - (int32_t)readSFixed32;
+/// Read and return a sfixed64.
 - (int64_t)readSFixed64;
 - (int64_t)readSFixed64;
+/// Read and return a sint32.
 - (int32_t)readSInt32;
 - (int32_t)readSInt32;
+/// Read and return a sint64.
 - (int64_t)readSInt64;
 - (int64_t)readSInt64;
+/// Read and return a boolean.
 - (BOOL)readBool;
 - (BOOL)readBool;
+/// Read and return a string.
 - (NSString *)readString;
 - (NSString *)readString;
+/// Read and return length delimited data.
 - (NSData *)readBytes;
 - (NSData *)readBytes;
 
 
-// Read an embedded message field value from the stream.
+/// Read an embedded message field value from the stream.
+///
+/// @param message           The message to set fields on as they are read.
+/// @param extensionRegistry An optional extension registry to use to lookup
+///                          extensions for @message.
 - (void)readMessage:(GPBMessage *)message
 - (void)readMessage:(GPBMessage *)message
-    extensionRegistry:(nullable GPBExtensionRegistry *)extensionRegistry;
+  extensionRegistry:(nullable GPBExtensionRegistry *)extensionRegistry;
 
 
-// Reads and discards a single field, given its tag value. Returns NO if the
-// tag is an endgroup tag, in which case nothing is skipped.  Otherwise,
-// returns YES.
+/// Reads and discards a single field, given its tag value.
+///
+/// @param tag The tag number of the field to skip.
+///
+/// @return NO if the tag is an endgroup tag (in which case nothing is skipped),
+///         YES in all other cases.
 - (BOOL)skipField:(int32_t)tag;
 - (BOOL)skipField:(int32_t)tag;
 
 
-// Reads and discards an entire message.  This will read either until EOF
-// or until an endgroup tag, whichever comes first.
+/// Reads and discards an entire message.  This will read either until EOF
+/// or until an endgroup tag, whichever comes first.
 - (void)skipMessage;
 - (void)skipMessage;
 
 
-// Verifies that the last call to readTag() returned the given tag value.
-// This is used to verify that a nested group ended with the correct end tag.
-// Throws NSParseErrorException if value does not match the last tag.
-- (void)checkLastTagWas:(int32_t)value;
+/// Verifies that the last call to @c -readTag returned the given tag value.
+/// This is used to verify that a nested group ended with the correct end tag.
+/// Throws @c NSParseErrorException if value does not match the last tag.
+///
+/// @param expected The tag that was expected.
+- (void)checkLastTagWas:(int32_t)expected;
 
 
 @end
 @end
 
 

+ 104 - 102
objectivec/GPBCodedOutputStream.h

@@ -46,36 +46,63 @@
 
 
 NS_ASSUME_NONNULL_BEGIN
 NS_ASSUME_NONNULL_BEGIN
 
 
+/// Writes out protocol message fields.
+///
+/// The common uses of protocol buffers shouldn't need to use this class.
+/// @c GPBMessage's provide a @c -data method that will serialize the message
+/// for you.
+///
+/// @note Subclassing of GPBCodedOutputStream is NOT supported.
 @interface GPBCodedOutputStream : NSObject
 @interface GPBCodedOutputStream : NSObject
 
 
-// Creates a new stream to write into data.  Data must be sized to fit or it
-// will error when it runs out of space.
+/// Creates a stream to fill in the given data. Data must be sized to fit or
+/// an error will be raised when out of space.
 + (instancetype)streamWithData:(NSMutableData *)data;
 + (instancetype)streamWithData:(NSMutableData *)data;
+
+/// Creates a stream to write into the given @c NSOutputStream.
 + (instancetype)streamWithOutputStream:(NSOutputStream *)output;
 + (instancetype)streamWithOutputStream:(NSOutputStream *)output;
-+ (instancetype)streamWithOutputStream:(NSOutputStream *)output
-                            bufferSize:(size_t)bufferSize;
 
 
+/// Initializes a stream to fill in the given data. Data must be sized to fit
+/// or an error will be raised when out of space.
 - (instancetype)initWithData:(NSMutableData *)data;
 - (instancetype)initWithData:(NSMutableData *)data;
+
+/// Initializes a stream to write into the given @c NSOutputStream.
 - (instancetype)initWithOutputStream:(NSOutputStream *)output;
 - (instancetype)initWithOutputStream:(NSOutputStream *)output;
-- (instancetype)initWithOutputStream:(NSOutputStream *)output
-                          bufferSize:(size_t)bufferSize;
 
 
+/// Flush any buffered data out.
 - (void)flush;
 - (void)flush;
 
 
+/// Write the raw byte out.
 - (void)writeRawByte:(uint8_t)value;
 - (void)writeRawByte:(uint8_t)value;
 
 
+/// Write the tag for the given field number and wire format.
+///
+/// @param fieldNumber The field number.
+/// @param format      The wire format the data for the field will be in.
 - (void)writeTag:(uint32_t)fieldNumber format:(GPBWireFormat)format;
 - (void)writeTag:(uint32_t)fieldNumber format:(GPBWireFormat)format;
 
 
+/// Write a 32bit value out in little endian format.
 - (void)writeRawLittleEndian32:(int32_t)value;
 - (void)writeRawLittleEndian32:(int32_t)value;
+/// Write a 64bit value out in little endian format.
 - (void)writeRawLittleEndian64:(int64_t)value;
 - (void)writeRawLittleEndian64:(int64_t)value;
 
 
+/// Write a 32bit value out in varint format.
 - (void)writeRawVarint32:(int32_t)value;
 - (void)writeRawVarint32:(int32_t)value;
+/// Write a 64bit value out in varint format.
 - (void)writeRawVarint64:(int64_t)value;
 - (void)writeRawVarint64:(int64_t)value;
 
 
-// Note that this will truncate 64 bit values to 32.
+/// Write a size_t out as a 32bit varint value.
+///
+/// @note This will truncate 64 bit values to 32.
 - (void)writeRawVarintSizeTAs32:(size_t)value;
 - (void)writeRawVarintSizeTAs32:(size_t)value;
 
 
+/// Writes the contents of an @c NSData out.
 - (void)writeRawData:(NSData *)data;
 - (void)writeRawData:(NSData *)data;
+/// Writes out the given data.
+///
+/// @param data   The data blob to write out.
+/// @param offset The offset into the blob to start writing out.
+/// @param length The number of bytes from the blob to write out.
 - (void)writeRawPtr:(const void *)data
 - (void)writeRawPtr:(const void *)data
              offset:(size_t)offset
              offset:(size_t)offset
              length:(size_t)length;
              length:(size_t)length;
@@ -83,238 +110,213 @@ NS_ASSUME_NONNULL_BEGIN
 //%PDDM-EXPAND _WRITE_DECLS()
 //%PDDM-EXPAND _WRITE_DECLS()
 // This block of code is generated, do not edit it directly.
 // This block of code is generated, do not edit it directly.
 
 
+/// Write a double for the given field number.
 - (void)writeDouble:(int32_t)fieldNumber value:(double)value;
 - (void)writeDouble:(int32_t)fieldNumber value:(double)value;
+/// Write a packaged array of double for the given field number.
 - (void)writeDoubleArray:(int32_t)fieldNumber
 - (void)writeDoubleArray:(int32_t)fieldNumber
                   values:(GPBDoubleArray *)values
                   values:(GPBDoubleArray *)values
                      tag:(uint32_t)tag;
                      tag:(uint32_t)tag;
+/// Write a double without any tag.
 - (void)writeDoubleNoTag:(double)value;
 - (void)writeDoubleNoTag:(double)value;
 
 
+/// Write a float for the given field number.
 - (void)writeFloat:(int32_t)fieldNumber value:(float)value;
 - (void)writeFloat:(int32_t)fieldNumber value:(float)value;
+/// Write a packaged array of float for the given field number.
 - (void)writeFloatArray:(int32_t)fieldNumber
 - (void)writeFloatArray:(int32_t)fieldNumber
                  values:(GPBFloatArray *)values
                  values:(GPBFloatArray *)values
                     tag:(uint32_t)tag;
                     tag:(uint32_t)tag;
+/// Write a float without any tag.
 - (void)writeFloatNoTag:(float)value;
 - (void)writeFloatNoTag:(float)value;
 
 
+/// Write a uint64_t for the given field number.
 - (void)writeUInt64:(int32_t)fieldNumber value:(uint64_t)value;
 - (void)writeUInt64:(int32_t)fieldNumber value:(uint64_t)value;
+/// Write a packaged array of uint64_t for the given field number.
 - (void)writeUInt64Array:(int32_t)fieldNumber
 - (void)writeUInt64Array:(int32_t)fieldNumber
                   values:(GPBUInt64Array *)values
                   values:(GPBUInt64Array *)values
                      tag:(uint32_t)tag;
                      tag:(uint32_t)tag;
+/// Write a uint64_t without any tag.
 - (void)writeUInt64NoTag:(uint64_t)value;
 - (void)writeUInt64NoTag:(uint64_t)value;
 
 
+/// Write a int64_t for the given field number.
 - (void)writeInt64:(int32_t)fieldNumber value:(int64_t)value;
 - (void)writeInt64:(int32_t)fieldNumber value:(int64_t)value;
+/// Write a packaged array of int64_t for the given field number.
 - (void)writeInt64Array:(int32_t)fieldNumber
 - (void)writeInt64Array:(int32_t)fieldNumber
                  values:(GPBInt64Array *)values
                  values:(GPBInt64Array *)values
                     tag:(uint32_t)tag;
                     tag:(uint32_t)tag;
+/// Write a int64_t without any tag.
 - (void)writeInt64NoTag:(int64_t)value;
 - (void)writeInt64NoTag:(int64_t)value;
 
 
+/// Write a int32_t for the given field number.
 - (void)writeInt32:(int32_t)fieldNumber value:(int32_t)value;
 - (void)writeInt32:(int32_t)fieldNumber value:(int32_t)value;
+/// Write a packaged array of int32_t for the given field number.
 - (void)writeInt32Array:(int32_t)fieldNumber
 - (void)writeInt32Array:(int32_t)fieldNumber
                  values:(GPBInt32Array *)values
                  values:(GPBInt32Array *)values
                     tag:(uint32_t)tag;
                     tag:(uint32_t)tag;
+/// Write a int32_t without any tag.
 - (void)writeInt32NoTag:(int32_t)value;
 - (void)writeInt32NoTag:(int32_t)value;
 
 
+/// Write a uint32_t for the given field number.
 - (void)writeUInt32:(int32_t)fieldNumber value:(uint32_t)value;
 - (void)writeUInt32:(int32_t)fieldNumber value:(uint32_t)value;
+/// Write a packaged array of uint32_t for the given field number.
 - (void)writeUInt32Array:(int32_t)fieldNumber
 - (void)writeUInt32Array:(int32_t)fieldNumber
                   values:(GPBUInt32Array *)values
                   values:(GPBUInt32Array *)values
                      tag:(uint32_t)tag;
                      tag:(uint32_t)tag;
+/// Write a uint32_t without any tag.
 - (void)writeUInt32NoTag:(uint32_t)value;
 - (void)writeUInt32NoTag:(uint32_t)value;
 
 
+/// Write a uint64_t for the given field number.
 - (void)writeFixed64:(int32_t)fieldNumber value:(uint64_t)value;
 - (void)writeFixed64:(int32_t)fieldNumber value:(uint64_t)value;
+/// Write a packaged array of uint64_t for the given field number.
 - (void)writeFixed64Array:(int32_t)fieldNumber
 - (void)writeFixed64Array:(int32_t)fieldNumber
                    values:(GPBUInt64Array *)values
                    values:(GPBUInt64Array *)values
                       tag:(uint32_t)tag;
                       tag:(uint32_t)tag;
+/// Write a uint64_t without any tag.
 - (void)writeFixed64NoTag:(uint64_t)value;
 - (void)writeFixed64NoTag:(uint64_t)value;
 
 
+/// Write a uint32_t for the given field number.
 - (void)writeFixed32:(int32_t)fieldNumber value:(uint32_t)value;
 - (void)writeFixed32:(int32_t)fieldNumber value:(uint32_t)value;
+/// Write a packaged array of uint32_t for the given field number.
 - (void)writeFixed32Array:(int32_t)fieldNumber
 - (void)writeFixed32Array:(int32_t)fieldNumber
                    values:(GPBUInt32Array *)values
                    values:(GPBUInt32Array *)values
                       tag:(uint32_t)tag;
                       tag:(uint32_t)tag;
+/// Write a uint32_t without any tag.
 - (void)writeFixed32NoTag:(uint32_t)value;
 - (void)writeFixed32NoTag:(uint32_t)value;
 
 
+/// Write a int32_t for the given field number.
 - (void)writeSInt32:(int32_t)fieldNumber value:(int32_t)value;
 - (void)writeSInt32:(int32_t)fieldNumber value:(int32_t)value;
+/// Write a packaged array of int32_t for the given field number.
 - (void)writeSInt32Array:(int32_t)fieldNumber
 - (void)writeSInt32Array:(int32_t)fieldNumber
                   values:(GPBInt32Array *)values
                   values:(GPBInt32Array *)values
                      tag:(uint32_t)tag;
                      tag:(uint32_t)tag;
+/// Write a int32_t without any tag.
 - (void)writeSInt32NoTag:(int32_t)value;
 - (void)writeSInt32NoTag:(int32_t)value;
 
 
+/// Write a int64_t for the given field number.
 - (void)writeSInt64:(int32_t)fieldNumber value:(int64_t)value;
 - (void)writeSInt64:(int32_t)fieldNumber value:(int64_t)value;
+/// Write a packaged array of int64_t for the given field number.
 - (void)writeSInt64Array:(int32_t)fieldNumber
 - (void)writeSInt64Array:(int32_t)fieldNumber
                   values:(GPBInt64Array *)values
                   values:(GPBInt64Array *)values
                      tag:(uint32_t)tag;
                      tag:(uint32_t)tag;
+/// Write a int64_t without any tag.
 - (void)writeSInt64NoTag:(int64_t)value;
 - (void)writeSInt64NoTag:(int64_t)value;
 
 
+/// Write a int64_t for the given field number.
 - (void)writeSFixed64:(int32_t)fieldNumber value:(int64_t)value;
 - (void)writeSFixed64:(int32_t)fieldNumber value:(int64_t)value;
+/// Write a packaged array of int64_t for the given field number.
 - (void)writeSFixed64Array:(int32_t)fieldNumber
 - (void)writeSFixed64Array:(int32_t)fieldNumber
                     values:(GPBInt64Array *)values
                     values:(GPBInt64Array *)values
                        tag:(uint32_t)tag;
                        tag:(uint32_t)tag;
+/// Write a int64_t without any tag.
 - (void)writeSFixed64NoTag:(int64_t)value;
 - (void)writeSFixed64NoTag:(int64_t)value;
 
 
+/// Write a int32_t for the given field number.
 - (void)writeSFixed32:(int32_t)fieldNumber value:(int32_t)value;
 - (void)writeSFixed32:(int32_t)fieldNumber value:(int32_t)value;
+/// Write a packaged array of int32_t for the given field number.
 - (void)writeSFixed32Array:(int32_t)fieldNumber
 - (void)writeSFixed32Array:(int32_t)fieldNumber
                     values:(GPBInt32Array *)values
                     values:(GPBInt32Array *)values
                        tag:(uint32_t)tag;
                        tag:(uint32_t)tag;
+/// Write a int32_t without any tag.
 - (void)writeSFixed32NoTag:(int32_t)value;
 - (void)writeSFixed32NoTag:(int32_t)value;
 
 
+/// Write a BOOL for the given field number.
 - (void)writeBool:(int32_t)fieldNumber value:(BOOL)value;
 - (void)writeBool:(int32_t)fieldNumber value:(BOOL)value;
+/// Write a packaged array of BOOL for the given field number.
 - (void)writeBoolArray:(int32_t)fieldNumber
 - (void)writeBoolArray:(int32_t)fieldNumber
                 values:(GPBBoolArray *)values
                 values:(GPBBoolArray *)values
                    tag:(uint32_t)tag;
                    tag:(uint32_t)tag;
+/// Write a BOOL without any tag.
 - (void)writeBoolNoTag:(BOOL)value;
 - (void)writeBoolNoTag:(BOOL)value;
 
 
+/// Write a int32_t for the given field number.
 - (void)writeEnum:(int32_t)fieldNumber value:(int32_t)value;
 - (void)writeEnum:(int32_t)fieldNumber value:(int32_t)value;
+/// Write a packaged array of int32_t for the given field number.
 - (void)writeEnumArray:(int32_t)fieldNumber
 - (void)writeEnumArray:(int32_t)fieldNumber
                 values:(GPBEnumArray *)values
                 values:(GPBEnumArray *)values
                    tag:(uint32_t)tag;
                    tag:(uint32_t)tag;
+/// Write a int32_t without any tag.
 - (void)writeEnumNoTag:(int32_t)value;
 - (void)writeEnumNoTag:(int32_t)value;
 
 
+/// Write a NSString for the given field number.
 - (void)writeString:(int32_t)fieldNumber value:(NSString *)value;
 - (void)writeString:(int32_t)fieldNumber value:(NSString *)value;
+/// Write an array of NSString for the given field number.
 - (void)writeStringArray:(int32_t)fieldNumber values:(NSArray<NSString*> *)values;
 - (void)writeStringArray:(int32_t)fieldNumber values:(NSArray<NSString*> *)values;
+/// Write a NSString without any tag.
 - (void)writeStringNoTag:(NSString *)value;
 - (void)writeStringNoTag:(NSString *)value;
 
 
+/// Write a GPBMessage for the given field number.
 - (void)writeMessage:(int32_t)fieldNumber value:(GPBMessage *)value;
 - (void)writeMessage:(int32_t)fieldNumber value:(GPBMessage *)value;
+/// Write an array of GPBMessage for the given field number.
 - (void)writeMessageArray:(int32_t)fieldNumber values:(NSArray<GPBMessage*> *)values;
 - (void)writeMessageArray:(int32_t)fieldNumber values:(NSArray<GPBMessage*> *)values;
+/// Write a GPBMessage without any tag.
 - (void)writeMessageNoTag:(GPBMessage *)value;
 - (void)writeMessageNoTag:(GPBMessage *)value;
 
 
+/// Write a NSData for the given field number.
 - (void)writeBytes:(int32_t)fieldNumber value:(NSData *)value;
 - (void)writeBytes:(int32_t)fieldNumber value:(NSData *)value;
+/// Write an array of NSData for the given field number.
 - (void)writeBytesArray:(int32_t)fieldNumber values:(NSArray<NSData*> *)values;
 - (void)writeBytesArray:(int32_t)fieldNumber values:(NSArray<NSData*> *)values;
+/// Write a NSData without any tag.
 - (void)writeBytesNoTag:(NSData *)value;
 - (void)writeBytesNoTag:(NSData *)value;
 
 
+/// Write a GPBMessage for the given field number.
 - (void)writeGroup:(int32_t)fieldNumber
 - (void)writeGroup:(int32_t)fieldNumber
              value:(GPBMessage *)value;
              value:(GPBMessage *)value;
+/// Write an array of GPBMessage for the given field number.
 - (void)writeGroupArray:(int32_t)fieldNumber values:(NSArray<GPBMessage*> *)values;
 - (void)writeGroupArray:(int32_t)fieldNumber values:(NSArray<GPBMessage*> *)values;
+/// Write a GPBMessage without any tag (but does write the endGroup tag).
 - (void)writeGroupNoTag:(int32_t)fieldNumber
 - (void)writeGroupNoTag:(int32_t)fieldNumber
                   value:(GPBMessage *)value;
                   value:(GPBMessage *)value;
 
 
+/// Write a GPBUnknownFieldSet for the given field number.
 - (void)writeUnknownGroup:(int32_t)fieldNumber
 - (void)writeUnknownGroup:(int32_t)fieldNumber
                     value:(GPBUnknownFieldSet *)value;
                     value:(GPBUnknownFieldSet *)value;
+/// Write an array of GPBUnknownFieldSet for the given field number.
 - (void)writeUnknownGroupArray:(int32_t)fieldNumber values:(NSArray<GPBUnknownFieldSet*> *)values;
 - (void)writeUnknownGroupArray:(int32_t)fieldNumber values:(NSArray<GPBUnknownFieldSet*> *)values;
+/// Write a GPBUnknownFieldSet without any tag (but does write the endGroup tag).
 - (void)writeUnknownGroupNoTag:(int32_t)fieldNumber
 - (void)writeUnknownGroupNoTag:(int32_t)fieldNumber
                          value:(GPBUnknownFieldSet *)value;
                          value:(GPBUnknownFieldSet *)value;
 
 
 //%PDDM-EXPAND-END _WRITE_DECLS()
 //%PDDM-EXPAND-END _WRITE_DECLS()
 
 
-// Write a MessageSet extension field to the stream.  For historical reasons,
-// the wire format differs from normal fields.
+/// Write a MessageSet extension field to the stream. For historical reasons,
+/// the wire format differs from normal fields.
 - (void)writeMessageSetExtension:(int32_t)fieldNumber value:(GPBMessage *)value;
 - (void)writeMessageSetExtension:(int32_t)fieldNumber value:(GPBMessage *)value;
 
 
-// Write an unparsed MessageSet extension field to the stream.  For
-// historical reasons, the wire format differs from normal fields.
+/// Write an unparsed MessageSet extension field to the stream. For
+/// historical reasons, the wire format differs from normal fields.
 - (void)writeRawMessageSetExtension:(int32_t)fieldNumber value:(NSData *)value;
 - (void)writeRawMessageSetExtension:(int32_t)fieldNumber value:(NSData *)value;
 
 
 @end
 @end
 
 
-CF_EXTERN_C_BEGIN
-
-size_t GPBComputeDoubleSize(int32_t fieldNumber, double value)
-    __attribute__((const));
-size_t GPBComputeFloatSize(int32_t fieldNumber, float value)
-    __attribute__((const));
-size_t GPBComputeUInt64Size(int32_t fieldNumber, uint64_t value)
-    __attribute__((const));
-size_t GPBComputeInt64Size(int32_t fieldNumber, int64_t value)
-    __attribute__((const));
-size_t GPBComputeInt32Size(int32_t fieldNumber, int32_t value)
-    __attribute__((const));
-size_t GPBComputeFixed64Size(int32_t fieldNumber, uint64_t value)
-    __attribute__((const));
-size_t GPBComputeFixed32Size(int32_t fieldNumber, uint32_t value)
-    __attribute__((const));
-size_t GPBComputeBoolSize(int32_t fieldNumber, BOOL value)
-    __attribute__((const));
-size_t GPBComputeStringSize(int32_t fieldNumber, NSString *value)
-    __attribute__((const));
-size_t GPBComputeGroupSize(int32_t fieldNumber, GPBMessage *value)
-    __attribute__((const));
-size_t GPBComputeUnknownGroupSize(int32_t fieldNumber,
-                                  GPBUnknownFieldSet *value)
-    __attribute__((const));
-size_t GPBComputeMessageSize(int32_t fieldNumber, GPBMessage *value)
-    __attribute__((const));
-size_t GPBComputeBytesSize(int32_t fieldNumber, NSData *value)
-    __attribute__((const));
-size_t GPBComputeUInt32Size(int32_t fieldNumber, uint32_t value)
-    __attribute__((const));
-size_t GPBComputeSFixed32Size(int32_t fieldNumber, int32_t value)
-    __attribute__((const));
-size_t GPBComputeSFixed64Size(int32_t fieldNumber, int64_t value)
-    __attribute__((const));
-size_t GPBComputeSInt32Size(int32_t fieldNumber, int32_t value)
-    __attribute__((const));
-size_t GPBComputeSInt64Size(int32_t fieldNumber, int64_t value)
-    __attribute__((const));
-size_t GPBComputeTagSize(int32_t fieldNumber) __attribute__((const));
-size_t GPBComputeWireFormatTagSize(int field_number, GPBDataType dataType)
-    __attribute__((const));
-
-size_t GPBComputeDoubleSizeNoTag(double value) __attribute__((const));
-size_t GPBComputeFloatSizeNoTag(float value) __attribute__((const));
-size_t GPBComputeUInt64SizeNoTag(uint64_t value) __attribute__((const));
-size_t GPBComputeInt64SizeNoTag(int64_t value) __attribute__((const));
-size_t GPBComputeInt32SizeNoTag(int32_t value) __attribute__((const));
-size_t GPBComputeFixed64SizeNoTag(uint64_t value) __attribute__((const));
-size_t GPBComputeFixed32SizeNoTag(uint32_t value) __attribute__((const));
-size_t GPBComputeBoolSizeNoTag(BOOL value) __attribute__((const));
-size_t GPBComputeStringSizeNoTag(NSString *value) __attribute__((const));
-size_t GPBComputeGroupSizeNoTag(GPBMessage *value) __attribute__((const));
-size_t GPBComputeUnknownGroupSizeNoTag(GPBUnknownFieldSet *value)
-    __attribute__((const));
-size_t GPBComputeMessageSizeNoTag(GPBMessage *value) __attribute__((const));
-size_t GPBComputeBytesSizeNoTag(NSData *value) __attribute__((const));
-size_t GPBComputeUInt32SizeNoTag(int32_t value) __attribute__((const));
-size_t GPBComputeEnumSizeNoTag(int32_t value) __attribute__((const));
-size_t GPBComputeSFixed32SizeNoTag(int32_t value) __attribute__((const));
-size_t GPBComputeSFixed64SizeNoTag(int64_t value) __attribute__((const));
-size_t GPBComputeSInt32SizeNoTag(int32_t value) __attribute__((const));
-size_t GPBComputeSInt64SizeNoTag(int64_t value) __attribute__((const));
-
-// Note that this will calculate the size of 64 bit values truncated to 32.
-size_t GPBComputeSizeTSizeAsInt32NoTag(size_t value) __attribute__((const));
-
-size_t GPBComputeRawVarint32Size(int32_t value) __attribute__((const));
-size_t GPBComputeRawVarint64Size(int64_t value) __attribute__((const));
-
-// Note that this will calculate the size of 64 bit values truncated to 32.
-size_t GPBComputeRawVarint32SizeForInteger(NSInteger value)
-    __attribute__((const));
-
-// Compute the number of bytes that would be needed to encode a
-// MessageSet extension to the stream.  For historical reasons,
-// the wire format differs from normal fields.
-size_t GPBComputeMessageSetExtensionSize(int32_t fieldNumber, GPBMessage *value)
-    __attribute__((const));
-
-// Compute the number of bytes that would be needed to encode an
-// unparsed MessageSet extension field to the stream.  For
-// historical reasons, the wire format differs from normal fields.
-size_t GPBComputeRawMessageSetExtensionSize(int32_t fieldNumber, NSData *value)
-    __attribute__((const));
-
-size_t GPBComputeEnumSize(int32_t fieldNumber, int32_t value)
-    __attribute__((const));
-
-CF_EXTERN_C_END
-
 NS_ASSUME_NONNULL_END
 NS_ASSUME_NONNULL_END
 
 
 // Write methods for types that can be in packed arrays.
 // Write methods for types that can be in packed arrays.
 //%PDDM-DEFINE _WRITE_PACKABLE_DECLS(NAME, ARRAY_TYPE, TYPE)
 //%PDDM-DEFINE _WRITE_PACKABLE_DECLS(NAME, ARRAY_TYPE, TYPE)
+//%/// Write a TYPE for the given field number.
 //%- (void)write##NAME:(int32_t)fieldNumber value:(TYPE)value;
 //%- (void)write##NAME:(int32_t)fieldNumber value:(TYPE)value;
+//%/// Write a packaged array of TYPE for the given field number.
 //%- (void)write##NAME##Array:(int32_t)fieldNumber
 //%- (void)write##NAME##Array:(int32_t)fieldNumber
 //%       NAME$S     values:(GPB##ARRAY_TYPE##Array *)values
 //%       NAME$S     values:(GPB##ARRAY_TYPE##Array *)values
 //%       NAME$S        tag:(uint32_t)tag;
 //%       NAME$S        tag:(uint32_t)tag;
+//%/// Write a TYPE without any tag.
 //%- (void)write##NAME##NoTag:(TYPE)value;
 //%- (void)write##NAME##NoTag:(TYPE)value;
 //%
 //%
 // Write methods for types that aren't in packed arrays.
 // Write methods for types that aren't in packed arrays.
 //%PDDM-DEFINE _WRITE_UNPACKABLE_DECLS(NAME, TYPE)
 //%PDDM-DEFINE _WRITE_UNPACKABLE_DECLS(NAME, TYPE)
+//%/// Write a TYPE for the given field number.
 //%- (void)write##NAME:(int32_t)fieldNumber value:(TYPE *)value;
 //%- (void)write##NAME:(int32_t)fieldNumber value:(TYPE *)value;
+//%/// Write an array of TYPE for the given field number.
 //%- (void)write##NAME##Array:(int32_t)fieldNumber values:(NSArray<##TYPE##*> *)values;
 //%- (void)write##NAME##Array:(int32_t)fieldNumber values:(NSArray<##TYPE##*> *)values;
+//%/// Write a TYPE without any tag.
 //%- (void)write##NAME##NoTag:(TYPE *)value;
 //%- (void)write##NAME##NoTag:(TYPE *)value;
 //%
 //%
 // Special write methods for Groups.
 // Special write methods for Groups.
 //%PDDM-DEFINE _WRITE_GROUP_DECLS(NAME, TYPE)
 //%PDDM-DEFINE _WRITE_GROUP_DECLS(NAME, TYPE)
+//%/// Write a TYPE for the given field number.
 //%- (void)write##NAME:(int32_t)fieldNumber
 //%- (void)write##NAME:(int32_t)fieldNumber
 //%       NAME$S value:(TYPE *)value;
 //%       NAME$S value:(TYPE *)value;
+//%/// Write an array of TYPE for the given field number.
 //%- (void)write##NAME##Array:(int32_t)fieldNumber values:(NSArray<##TYPE##*> *)values;
 //%- (void)write##NAME##Array:(int32_t)fieldNumber values:(NSArray<##TYPE##*> *)values;
+//%/// Write a TYPE without any tag (but does write the endGroup tag).
 //%- (void)write##NAME##NoTag:(int32_t)fieldNumber
 //%- (void)write##NAME##NoTag:(int32_t)fieldNumber
 //%            NAME$S value:(TYPE *)value;
 //%            NAME$S value:(TYPE *)value;
 //%
 //%

+ 3 - 14
objectivec/GPBCodedOutputStream.m

@@ -28,7 +28,7 @@
 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 
-#import "GPBCodedOutputStream.h"
+#import "GPBCodedOutputStream_PackagePrivate.h"
 
 
 #import <mach/vm_param.h>
 #import <mach/vm_param.h>
 
 
@@ -178,12 +178,6 @@ static void GPBWriteRawLittleEndian64(GPBOutputBufferState *state,
   return [self initWithOutputStream:nil data:data];
   return [self initWithOutputStream:nil data:data];
 }
 }
 
 
-- (instancetype)initWithOutputStream:(NSOutputStream *)output
-                          bufferSize:(size_t)bufferSize {
-  NSMutableData *data = [NSMutableData dataWithLength:bufferSize];
-  return [self initWithOutputStream:output data:data];
-}
-
 // This initializer isn't exposed, but it is the designated initializer.
 // This initializer isn't exposed, but it is the designated initializer.
 // Setting OutputStream and NSData is to control the buffering behavior/size
 // Setting OutputStream and NSData is to control the buffering behavior/size
 // of the work, but that is more obvious via the bufferSize: version.
 // of the work, but that is more obvious via the bufferSize: version.
@@ -199,15 +193,10 @@ static void GPBWriteRawLittleEndian64(GPBOutputBufferState *state,
   return self;
   return self;
 }
 }
 
 
-+ (instancetype)streamWithOutputStream:(NSOutputStream *)output
-                            bufferSize:(size_t)bufferSize {
-  return [[[self alloc] initWithOutputStream:output
-                                  bufferSize:bufferSize] autorelease];
-}
-
 + (instancetype)streamWithOutputStream:(NSOutputStream *)output {
 + (instancetype)streamWithOutputStream:(NSOutputStream *)output {
+  NSMutableData *data = [NSMutableData dataWithLength:PAGE_SIZE];
   return [[[self alloc] initWithOutputStream:output
   return [[[self alloc] initWithOutputStream:output
-                                  bufferSize:PAGE_SIZE] autorelease];
+                                        data:data] autorelease];
 }
 }
 
 
 + (instancetype)streamWithData:(NSMutableData *)data {
 + (instancetype)streamWithData:(NSMutableData *)data {

+ 126 - 0
objectivec/GPBCodedOutputStream_PackagePrivate.h

@@ -0,0 +1,126 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2016 Google Inc.  All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#import "GPBCodedOutputStream.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+CF_EXTERN_C_BEGIN
+
+size_t GPBComputeDoubleSize(int32_t fieldNumber, double value)
+    __attribute__((const));
+size_t GPBComputeFloatSize(int32_t fieldNumber, float value)
+    __attribute__((const));
+size_t GPBComputeUInt64Size(int32_t fieldNumber, uint64_t value)
+    __attribute__((const));
+size_t GPBComputeInt64Size(int32_t fieldNumber, int64_t value)
+    __attribute__((const));
+size_t GPBComputeInt32Size(int32_t fieldNumber, int32_t value)
+    __attribute__((const));
+size_t GPBComputeFixed64Size(int32_t fieldNumber, uint64_t value)
+    __attribute__((const));
+size_t GPBComputeFixed32Size(int32_t fieldNumber, uint32_t value)
+    __attribute__((const));
+size_t GPBComputeBoolSize(int32_t fieldNumber, BOOL value)
+    __attribute__((const));
+size_t GPBComputeStringSize(int32_t fieldNumber, NSString *value)
+    __attribute__((const));
+size_t GPBComputeGroupSize(int32_t fieldNumber, GPBMessage *value)
+    __attribute__((const));
+size_t GPBComputeUnknownGroupSize(int32_t fieldNumber,
+                                  GPBUnknownFieldSet *value)
+    __attribute__((const));
+size_t GPBComputeMessageSize(int32_t fieldNumber, GPBMessage *value)
+    __attribute__((const));
+size_t GPBComputeBytesSize(int32_t fieldNumber, NSData *value)
+    __attribute__((const));
+size_t GPBComputeUInt32Size(int32_t fieldNumber, uint32_t value)
+    __attribute__((const));
+size_t GPBComputeSFixed32Size(int32_t fieldNumber, int32_t value)
+    __attribute__((const));
+size_t GPBComputeSFixed64Size(int32_t fieldNumber, int64_t value)
+    __attribute__((const));
+size_t GPBComputeSInt32Size(int32_t fieldNumber, int32_t value)
+    __attribute__((const));
+size_t GPBComputeSInt64Size(int32_t fieldNumber, int64_t value)
+    __attribute__((const));
+size_t GPBComputeTagSize(int32_t fieldNumber) __attribute__((const));
+size_t GPBComputeWireFormatTagSize(int field_number, GPBDataType dataType)
+    __attribute__((const));
+
+size_t GPBComputeDoubleSizeNoTag(double value) __attribute__((const));
+size_t GPBComputeFloatSizeNoTag(float value) __attribute__((const));
+size_t GPBComputeUInt64SizeNoTag(uint64_t value) __attribute__((const));
+size_t GPBComputeInt64SizeNoTag(int64_t value) __attribute__((const));
+size_t GPBComputeInt32SizeNoTag(int32_t value) __attribute__((const));
+size_t GPBComputeFixed64SizeNoTag(uint64_t value) __attribute__((const));
+size_t GPBComputeFixed32SizeNoTag(uint32_t value) __attribute__((const));
+size_t GPBComputeBoolSizeNoTag(BOOL value) __attribute__((const));
+size_t GPBComputeStringSizeNoTag(NSString *value) __attribute__((const));
+size_t GPBComputeGroupSizeNoTag(GPBMessage *value) __attribute__((const));
+size_t GPBComputeUnknownGroupSizeNoTag(GPBUnknownFieldSet *value)
+    __attribute__((const));
+size_t GPBComputeMessageSizeNoTag(GPBMessage *value) __attribute__((const));
+size_t GPBComputeBytesSizeNoTag(NSData *value) __attribute__((const));
+size_t GPBComputeUInt32SizeNoTag(int32_t value) __attribute__((const));
+size_t GPBComputeEnumSizeNoTag(int32_t value) __attribute__((const));
+size_t GPBComputeSFixed32SizeNoTag(int32_t value) __attribute__((const));
+size_t GPBComputeSFixed64SizeNoTag(int64_t value) __attribute__((const));
+size_t GPBComputeSInt32SizeNoTag(int32_t value) __attribute__((const));
+size_t GPBComputeSInt64SizeNoTag(int64_t value) __attribute__((const));
+
+// Note that this will calculate the size of 64 bit values truncated to 32.
+size_t GPBComputeSizeTSizeAsInt32NoTag(size_t value) __attribute__((const));
+
+size_t GPBComputeRawVarint32Size(int32_t value) __attribute__((const));
+size_t GPBComputeRawVarint64Size(int64_t value) __attribute__((const));
+
+// Note that this will calculate the size of 64 bit values truncated to 32.
+size_t GPBComputeRawVarint32SizeForInteger(NSInteger value)
+    __attribute__((const));
+
+// Compute the number of bytes that would be needed to encode a
+// MessageSet extension to the stream.  For historical reasons,
+// the wire format differs from normal fields.
+size_t GPBComputeMessageSetExtensionSize(int32_t fieldNumber, GPBMessage *value)
+    __attribute__((const));
+
+// Compute the number of bytes that would be needed to encode an
+// unparsed MessageSet extension field to the stream.  For
+// historical reasons, the wire format differs from normal fields.
+size_t GPBComputeRawMessageSetExtensionSize(int32_t fieldNumber, NSData *value)
+    __attribute__((const));
+
+size_t GPBComputeEnumSize(int32_t fieldNumber, int32_t value)
+    __attribute__((const));
+
+CF_EXTERN_C_END
+
+NS_ASSUME_NONNULL_END

+ 3 - 8
objectivec/GPBDescriptor.h

@@ -34,19 +34,18 @@
 
 
 @class GPBEnumDescriptor;
 @class GPBEnumDescriptor;
 @class GPBFieldDescriptor;
 @class GPBFieldDescriptor;
-@class GPBFieldOptions;
 @class GPBFileDescriptor;
 @class GPBFileDescriptor;
 @class GPBOneofDescriptor;
 @class GPBOneofDescriptor;
 
 
 NS_ASSUME_NONNULL_BEGIN
 NS_ASSUME_NONNULL_BEGIN
 
 
-typedef NS_ENUM(NSInteger, GPBFileSyntax) {
+typedef NS_ENUM(uint8_t, GPBFileSyntax) {
   GPBFileSyntaxUnknown = 0,
   GPBFileSyntaxUnknown = 0,
   GPBFileSyntaxProto2 = 2,
   GPBFileSyntaxProto2 = 2,
   GPBFileSyntaxProto3 = 3,
   GPBFileSyntaxProto3 = 3,
 };
 };
 
 
-typedef NS_ENUM(NSInteger, GPBFieldType) {
+typedef NS_ENUM(uint8_t, GPBFieldType) {
   GPBFieldTypeSingle,    // optional/required
   GPBFieldTypeSingle,    // optional/required
   GPBFieldTypeRepeated,  // repeated
   GPBFieldTypeRepeated,  // repeated
   GPBFieldTypeMap,       // map<K,V>
   GPBFieldTypeMap,       // map<K,V>
@@ -57,9 +56,8 @@ typedef NS_ENUM(NSInteger, GPBFieldType) {
 @property(nonatomic, readonly, copy) NSString *name;
 @property(nonatomic, readonly, copy) NSString *name;
 @property(nonatomic, readonly, strong, nullable) NSArray<GPBFieldDescriptor*> *fields;
 @property(nonatomic, readonly, strong, nullable) NSArray<GPBFieldDescriptor*> *fields;
 @property(nonatomic, readonly, strong, nullable) NSArray<GPBOneofDescriptor*> *oneofs;
 @property(nonatomic, readonly, strong, nullable) NSArray<GPBOneofDescriptor*> *oneofs;
-@property(nonatomic, readonly, strong, nullable) NSArray<GPBEnumDescriptor*> *enums;
 @property(nonatomic, readonly, nullable) const GPBExtensionRange *extensionRanges;
 @property(nonatomic, readonly, nullable) const GPBExtensionRange *extensionRanges;
-@property(nonatomic, readonly) NSUInteger extensionRangesCount;
+@property(nonatomic, readonly) uint32_t extensionRangesCount;
 @property(nonatomic, readonly, assign) GPBFileDescriptor *file;
 @property(nonatomic, readonly, assign) GPBFileDescriptor *file;
 
 
 @property(nonatomic, readonly, getter=isWireFormat) BOOL wireFormat;
 @property(nonatomic, readonly, getter=isWireFormat) BOOL wireFormat;
@@ -68,7 +66,6 @@ typedef NS_ENUM(NSInteger, GPBFieldType) {
 - (nullable GPBFieldDescriptor *)fieldWithNumber:(uint32_t)fieldNumber;
 - (nullable GPBFieldDescriptor *)fieldWithNumber:(uint32_t)fieldNumber;
 - (nullable GPBFieldDescriptor *)fieldWithName:(NSString *)name;
 - (nullable GPBFieldDescriptor *)fieldWithName:(NSString *)name;
 - (nullable GPBOneofDescriptor *)oneofWithName:(NSString *)name;
 - (nullable GPBOneofDescriptor *)oneofWithName:(NSString *)name;
-- (nullable GPBEnumDescriptor *)enumWithName:(NSString *)name;
 
 
 @end
 @end
 
 
@@ -103,8 +100,6 @@ typedef NS_ENUM(NSInteger, GPBFieldType) {
 
 
 @property(nonatomic, readonly, assign, nullable) GPBOneofDescriptor *containingOneof;
 @property(nonatomic, readonly, assign, nullable) GPBOneofDescriptor *containingOneof;
 
 
-@property(nonatomic, readonly, nullable) GPBFieldOptions *fieldOptions;
-
 // Message properties
 // Message properties
 @property(nonatomic, readonly, assign, nullable) Class msgClass;
 @property(nonatomic, readonly, assign, nullable) Class msgClass;
 
 

+ 163 - 197
objectivec/GPBDescriptor.m

@@ -35,7 +35,6 @@
 #import "GPBUtilities_PackagePrivate.h"
 #import "GPBUtilities_PackagePrivate.h"
 #import "GPBWireFormat.h"
 #import "GPBWireFormat.h"
 #import "GPBMessage_PackagePrivate.h"
 #import "GPBMessage_PackagePrivate.h"
-#import "google/protobuf/Descriptor.pbobjc.h"
 
 
 // The address of this variable is used as a key for obj_getAssociatedObject.
 // The address of this variable is used as a key for obj_getAssociatedObject.
 static const char kTextFormatExtraValueKey = 0;
 static const char kTextFormatExtraValueKey = 0;
@@ -92,7 +91,6 @@ static NSArray *NewFieldsArrayForHasIndex(int hasIndex,
 
 
 @implementation GPBDescriptor {
 @implementation GPBDescriptor {
   Class messageClass_;
   Class messageClass_;
-  NSArray *enums_;
   GPBFileDescriptor *file_;
   GPBFileDescriptor *file_;
   BOOL wireFormat_;
   BOOL wireFormat_;
 }
 }
@@ -100,7 +98,6 @@ static NSArray *NewFieldsArrayForHasIndex(int hasIndex,
 @synthesize messageClass = messageClass_;
 @synthesize messageClass = messageClass_;
 @synthesize fields = fields_;
 @synthesize fields = fields_;
 @synthesize oneofs = oneofs_;
 @synthesize oneofs = oneofs_;
-@synthesize enums = enums_;
 @synthesize extensionRanges = extensionRanges_;
 @synthesize extensionRanges = extensionRanges_;
 @synthesize extensionRangesCount = extensionRangesCount_;
 @synthesize extensionRangesCount = extensionRangesCount_;
 @synthesize file = file_;
 @synthesize file = file_;
@@ -110,130 +107,58 @@ static NSArray *NewFieldsArrayForHasIndex(int hasIndex,
     allocDescriptorForClass:(Class)messageClass
     allocDescriptorForClass:(Class)messageClass
                   rootClass:(Class)rootClass
                   rootClass:(Class)rootClass
                        file:(GPBFileDescriptor *)file
                        file:(GPBFileDescriptor *)file
-                     fields:(GPBMessageFieldDescription *)fieldDescriptions
-                 fieldCount:(NSUInteger)fieldCount
-                     oneofs:(GPBMessageOneofDescription *)oneofDescriptions
-                 oneofCount:(NSUInteger)oneofCount
-                      enums:(GPBMessageEnumDescription *)enumDescriptions
-                  enumCount:(NSUInteger)enumCount
-                     ranges:(const GPBExtensionRange *)ranges
-                 rangeCount:(NSUInteger)rangeCount
-                storageSize:(size_t)storageSize
-                 wireFormat:(BOOL)wireFormat {
+                     fields:(void *)fieldDescriptions
+                 fieldCount:(uint32_t)fieldCount
+                storageSize:(uint32_t)storageSize
+                      flags:(GPBDescriptorInitializationFlags)flags {
+  // The rootClass is no longer used, but it is passed in to ensure it
+  // was started up during initialization also.
+  (void)rootClass;
   NSMutableArray *fields = nil;
   NSMutableArray *fields = nil;
-  NSMutableArray *oneofs = nil;
-  NSMutableArray *enums = nil;
-  NSMutableArray *extensionRanges = nil;
   GPBFileSyntax syntax = file.syntax;
   GPBFileSyntax syntax = file.syntax;
-  for (NSUInteger i = 0; i < fieldCount; ++i) {
+  BOOL fieldsIncludeDefault =
+      (flags & GPBDescriptorInitializationFlag_FieldsWithDefault) != 0;
+
+  void *desc;
+  for (uint32_t i = 0; i < fieldCount; ++i) {
     if (fields == nil) {
     if (fields == nil) {
       fields = [[NSMutableArray alloc] initWithCapacity:fieldCount];
       fields = [[NSMutableArray alloc] initWithCapacity:fieldCount];
     }
     }
-    GPBFieldDescriptor *fieldDescriptor = [[GPBFieldDescriptor alloc]
-        initWithFieldDescription:&fieldDescriptions[i]
-                       rootClass:rootClass
-                          syntax:syntax];
+    // Need correctly typed pointer for array indexing below to work.
+    if (fieldsIncludeDefault) {
+      GPBMessageFieldDescriptionWithDefault *fieldDescWithDefault = fieldDescriptions;
+      desc = &(fieldDescWithDefault[i]);
+    } else {
+      GPBMessageFieldDescription *fieldDesc = fieldDescriptions;
+      desc = &(fieldDesc[i]);
+    }
+    GPBFieldDescriptor *fieldDescriptor =
+        [[GPBFieldDescriptor alloc] initWithFieldDescription:desc
+                                             includesDefault:fieldsIncludeDefault
+                                                      syntax:syntax];
     [fields addObject:fieldDescriptor];
     [fields addObject:fieldDescriptor];
     [fieldDescriptor release];
     [fieldDescriptor release];
   }
   }
-  for (NSUInteger i = 0; i < oneofCount; ++i) {
-    if (oneofs == nil) {
-      oneofs = [[NSMutableArray alloc] initWithCapacity:oneofCount];
-    }
-    GPBMessageOneofDescription *oneofDescription = &oneofDescriptions[i];
-    NSArray *fieldsForOneof =
-        NewFieldsArrayForHasIndex(oneofDescription->index, fields);
-    GPBOneofDescriptor *oneofDescriptor =
-        [[GPBOneofDescriptor alloc] initWithOneofDescription:oneofDescription
-                                                      fields:fieldsForOneof];
-    [oneofs addObject:oneofDescriptor];
-    [oneofDescriptor release];
-    [fieldsForOneof release];
-  }
-  for (NSUInteger i = 0; i < enumCount; ++i) {
-    if (enums == nil) {
-      enums = [[NSMutableArray alloc] initWithCapacity:enumCount];
-    }
-    GPBEnumDescriptor *enumDescriptor =
-        enumDescriptions[i].enumDescriptorFunc();
-    [enums addObject:enumDescriptor];
-  }
 
 
+  BOOL wireFormat = (flags & GPBDescriptorInitializationFlag_WireFormat) != 0;
   GPBDescriptor *descriptor = [[self alloc] initWithClass:messageClass
   GPBDescriptor *descriptor = [[self alloc] initWithClass:messageClass
                                                      file:file
                                                      file:file
                                                    fields:fields
                                                    fields:fields
-                                                   oneofs:oneofs
-                                                    enums:enums
-                                          extensionRanges:ranges
-                                     extensionRangesCount:rangeCount
                                               storageSize:storageSize
                                               storageSize:storageSize
                                                wireFormat:wireFormat];
                                                wireFormat:wireFormat];
   [fields release];
   [fields release];
-  [oneofs release];
-  [enums release];
-  [extensionRanges release];
-  return descriptor;
-}
-
-+ (instancetype)
-    allocDescriptorForClass:(Class)messageClass
-                  rootClass:(Class)rootClass
-                       file:(GPBFileDescriptor *)file
-                     fields:(GPBMessageFieldDescription *)fieldDescriptions
-                 fieldCount:(NSUInteger)fieldCount
-                     oneofs:(GPBMessageOneofDescription *)oneofDescriptions
-                 oneofCount:(NSUInteger)oneofCount
-                      enums:(GPBMessageEnumDescription *)enumDescriptions
-                  enumCount:(NSUInteger)enumCount
-                     ranges:(const GPBExtensionRange *)ranges
-                 rangeCount:(NSUInteger)rangeCount
-                storageSize:(size_t)storageSize
-                 wireFormat:(BOOL)wireFormat
-        extraTextFormatInfo:(const char *)extraTextFormatInfo {
-  GPBDescriptor *descriptor = [self allocDescriptorForClass:messageClass
-                                                  rootClass:rootClass
-                                                       file:file
-                                                     fields:fieldDescriptions
-                                                 fieldCount:fieldCount
-                                                     oneofs:oneofDescriptions
-                                                 oneofCount:oneofCount
-                                                      enums:enumDescriptions
-                                                  enumCount:enumCount
-                                                     ranges:ranges
-                                                 rangeCount:rangeCount
-                                                storageSize:storageSize
-                                                 wireFormat:wireFormat];
-  // Extra info is a compile time option, so skip the work if not needed.
-  if (extraTextFormatInfo) {
-    NSValue *extraInfoValue = [NSValue valueWithPointer:extraTextFormatInfo];
-    for (GPBFieldDescriptor *fieldDescriptor in descriptor->fields_) {
-      if (fieldDescriptor->description_->flags & GPBFieldTextFormatNameCustom) {
-        objc_setAssociatedObject(fieldDescriptor, &kTextFormatExtraValueKey,
-                                 extraInfoValue,
-                                 OBJC_ASSOCIATION_RETAIN_NONATOMIC);
-      }
-    }
-  }
   return descriptor;
   return descriptor;
 }
 }
 
 
 - (instancetype)initWithClass:(Class)messageClass
 - (instancetype)initWithClass:(Class)messageClass
                          file:(GPBFileDescriptor *)file
                          file:(GPBFileDescriptor *)file
                        fields:(NSArray *)fields
                        fields:(NSArray *)fields
-                       oneofs:(NSArray *)oneofs
-                        enums:(NSArray *)enums
-              extensionRanges:(const GPBExtensionRange *)extensionRanges
-         extensionRangesCount:(NSUInteger)extensionRangesCount
-                  storageSize:(size_t)storageSize
+                  storageSize:(uint32_t)storageSize
                    wireFormat:(BOOL)wireFormat {
                    wireFormat:(BOOL)wireFormat {
   if ((self = [super init])) {
   if ((self = [super init])) {
     messageClass_ = messageClass;
     messageClass_ = messageClass;
     file_ = file;
     file_ = file;
     fields_ = [fields retain];
     fields_ = [fields retain];
-    oneofs_ = [oneofs retain];
-    enums_ = [enums retain];
-    extensionRanges_ = extensionRanges;
-    extensionRangesCount_ = extensionRangesCount;
     storageSize_ = storageSize;
     storageSize_ = storageSize;
     wireFormat_ = wireFormat;
     wireFormat_ = wireFormat;
   }
   }
@@ -243,10 +168,47 @@ static NSArray *NewFieldsArrayForHasIndex(int hasIndex,
 - (void)dealloc {
 - (void)dealloc {
   [fields_ release];
   [fields_ release];
   [oneofs_ release];
   [oneofs_ release];
-  [enums_ release];
   [super dealloc];
   [super dealloc];
 }
 }
 
 
+- (void)setupOneofs:(const char **)oneofNames
+              count:(uint32_t)count
+      firstHasIndex:(int32_t)firstHasIndex {
+  NSCAssert(firstHasIndex < 0, @"Should always be <0");
+  NSMutableArray *oneofs = [[NSMutableArray alloc] initWithCapacity:count];
+  for (uint32_t i = 0, hasIndex = firstHasIndex; i < count; ++i, --hasIndex) {
+    const char *name = oneofNames[i];
+    NSArray *fieldsForOneof = NewFieldsArrayForHasIndex(hasIndex, fields_);
+    NSCAssert(fieldsForOneof.count > 0,
+              @"No fields for this oneof? (%s:%d)", name, hasIndex);
+    GPBOneofDescriptor *oneofDescriptor =
+        [[GPBOneofDescriptor alloc] initWithName:name fields:fieldsForOneof];
+    [oneofs addObject:oneofDescriptor];
+    [oneofDescriptor release];
+    [fieldsForOneof release];
+  }
+  oneofs_ = oneofs;
+}
+
+- (void)setupExtraTextInfo:(const char *)extraTextFormatInfo {
+  // Extra info is a compile time option, so skip the work if not needed.
+  if (extraTextFormatInfo) {
+    NSValue *extraInfoValue = [NSValue valueWithPointer:extraTextFormatInfo];
+    for (GPBFieldDescriptor *fieldDescriptor in fields_) {
+      if (fieldDescriptor->description_->flags & GPBFieldTextFormatNameCustom) {
+        objc_setAssociatedObject(fieldDescriptor, &kTextFormatExtraValueKey,
+                                 extraInfoValue,
+                                 OBJC_ASSOCIATION_RETAIN_NONATOMIC);
+      }
+    }
+  }
+}
+
+- (void)setupExtensionRanges:(const GPBExtensionRange *)ranges count:(int32_t)count {
+  extensionRanges_ = ranges;
+  extensionRangesCount_ = count;
+}
+
 - (NSString *)name {
 - (NSString *)name {
   return NSStringFromClass(messageClass_);
   return NSStringFromClass(messageClass_);
 }
 }
@@ -283,15 +245,6 @@ static NSArray *NewFieldsArrayForHasIndex(int hasIndex,
   return nil;
   return nil;
 }
 }
 
 
-- (GPBEnumDescriptor *)enumWithName:(NSString *)name {
-  for (GPBEnumDescriptor *descriptor in enums_) {
-    if ([descriptor.name isEqual:name]) {
-      return descriptor;
-    }
-  }
-  return nil;
-}
-
 @end
 @end
 
 
 @implementation GPBFileDescriptor {
 @implementation GPBFileDescriptor {
@@ -318,19 +271,16 @@ static NSArray *NewFieldsArrayForHasIndex(int hasIndex,
 
 
 @synthesize fields = fields_;
 @synthesize fields = fields_;
 
 
-- (instancetype)initWithOneofDescription:
-                    (GPBMessageOneofDescription *)oneofDescription
-                                  fields:(NSArray *)fields {
+- (instancetype)initWithName:(const char *)name fields:(NSArray *)fields {
   self = [super init];
   self = [super init];
   if (self) {
   if (self) {
-    NSAssert(oneofDescription->index < 0, @"Should always be <0");
-    oneofDescription_ = oneofDescription;
+    name_ = name;
     fields_ = [fields retain];
     fields_ = [fields retain];
     for (GPBFieldDescriptor *fieldDesc in fields) {
     for (GPBFieldDescriptor *fieldDesc in fields) {
       fieldDesc->containingOneof_ = self;
       fieldDesc->containingOneof_ = self;
     }
     }
 
 
-    caseSel_ = SelFromStrings(NULL, oneofDescription->name, "OneOfCase", NO);
+    caseSel_ = SelFromStrings(NULL, name, "OneOfCase", NO);
   }
   }
   return self;
   return self;
 }
 }
@@ -341,7 +291,7 @@ static NSArray *NewFieldsArrayForHasIndex(int hasIndex,
 }
 }
 
 
 - (NSString *)name {
 - (NSString *)name {
-  return @(oneofDescription_->name);
+  return @(name_);
 }
 }
 
 
 - (GPBFieldDescriptor *)fieldWithNumber:(uint32_t)fieldNumber {
 - (GPBFieldDescriptor *)fieldWithNumber:(uint32_t)fieldNumber {
@@ -389,7 +339,6 @@ uint32_t GPBFieldAlternateTag(GPBFieldDescriptor *self) {
 
 
 @implementation GPBFieldDescriptor {
 @implementation GPBFieldDescriptor {
   GPBGenericValue defaultValue_;
   GPBGenericValue defaultValue_;
-  GPBFieldOptions *fieldOptions_;
 
 
   // Message ivars
   // Message ivars
   Class msgClass_;
   Class msgClass_;
@@ -403,7 +352,6 @@ uint32_t GPBFieldAlternateTag(GPBFieldDescriptor *self) {
   } enumHandling_;
   } enumHandling_;
 }
 }
 
 
-@synthesize fieldOptions = fieldOptions_;
 @synthesize msgClass = msgClass_;
 @synthesize msgClass = msgClass_;
 @synthesize containingOneof = containingOneof_;
 @synthesize containingOneof = containingOneof_;
 
 
@@ -417,16 +365,21 @@ uint32_t GPBFieldAlternateTag(GPBFieldDescriptor *self) {
   return self;
   return self;
 }
 }
 
 
-- (instancetype)initWithFieldDescription:
-                    (GPBMessageFieldDescription *)description
-                               rootClass:(Class)rootClass
+- (instancetype)initWithFieldDescription:(void *)description
+                         includesDefault:(BOOL)includesDefault
                                   syntax:(GPBFileSyntax)syntax {
                                   syntax:(GPBFileSyntax)syntax {
   if ((self = [super init])) {
   if ((self = [super init])) {
-    description_ = description;
-    getSel_ = sel_getUid(description->name);
-    setSel_ = SelFromStrings("set", description->name, NULL, YES);
+    GPBMessageFieldDescription *coreDesc;
+    if (includesDefault) {
+      coreDesc = &(((GPBMessageFieldDescriptionWithDefault *)description)->core);
+    } else {
+      coreDesc = description;
+    }
+    description_ = coreDesc;
+    getSel_ = sel_getUid(coreDesc->name);
+    setSel_ = SelFromStrings("set", coreDesc->name, NULL, YES);
 
 
-    GPBDataType dataType = description->dataType;
+    GPBDataType dataType = coreDesc->dataType;
     BOOL isMessage = GPBDataTypeIsMessage(dataType);
     BOOL isMessage = GPBDataTypeIsMessage(dataType);
     BOOL isMapOrArray = GPBFieldIsMapOrArray(self);
     BOOL isMapOrArray = GPBFieldIsMapOrArray(self);
 
 
@@ -434,39 +387,39 @@ uint32_t GPBFieldAlternateTag(GPBFieldDescriptor *self) {
       // map<>/repeated fields get a *Count property (inplace of a has*) to
       // map<>/repeated fields get a *Count property (inplace of a has*) to
       // support checking if there are any entries without triggering
       // support checking if there are any entries without triggering
       // autocreation.
       // autocreation.
-      hasOrCountSel_ = SelFromStrings(NULL, description->name, "_Count", NO);
+      hasOrCountSel_ = SelFromStrings(NULL, coreDesc->name, "_Count", NO);
     } else {
     } else {
       // If there is a positive hasIndex, then:
       // If there is a positive hasIndex, then:
       //   - All fields types for proto2 messages get has* selectors.
       //   - All fields types for proto2 messages get has* selectors.
       //   - Only message fields for proto3 messages get has* selectors.
       //   - Only message fields for proto3 messages get has* selectors.
       // Note: the positive check is to handle oneOfs, we can't check
       // Note: the positive check is to handle oneOfs, we can't check
       // containingOneof_ because it isn't set until after initialization.
       // containingOneof_ because it isn't set until after initialization.
-      if ((description->hasIndex >= 0) &&
-          (description->hasIndex != GPBNoHasBit) &&
+      if ((coreDesc->hasIndex >= 0) &&
+          (coreDesc->hasIndex != GPBNoHasBit) &&
           ((syntax != GPBFileSyntaxProto3) || isMessage)) {
           ((syntax != GPBFileSyntaxProto3) || isMessage)) {
-        hasOrCountSel_ = SelFromStrings("has", description->name, NULL, NO);
-        setHasSel_ = SelFromStrings("setHas", description->name, NULL, YES);
+        hasOrCountSel_ = SelFromStrings("has", coreDesc->name, NULL, NO);
+        setHasSel_ = SelFromStrings("setHas", coreDesc->name, NULL, YES);
       }
       }
     }
     }
 
 
     // Extra type specific data.
     // Extra type specific data.
     if (isMessage) {
     if (isMessage) {
-      const char *className = description->dataTypeSpecific.className;
+      const char *className = coreDesc->dataTypeSpecific.className;
       msgClass_ = objc_getClass(className);
       msgClass_ = objc_getClass(className);
       NSAssert(msgClass_, @"Class %s not defined", className);
       NSAssert(msgClass_, @"Class %s not defined", className);
     } else if (dataType == GPBDataTypeEnum) {
     } else if (dataType == GPBDataTypeEnum) {
-      if ((description_->flags & GPBFieldHasEnumDescriptor) != 0) {
+      if ((coreDesc->flags & GPBFieldHasEnumDescriptor) != 0) {
         enumHandling_.enumDescriptor_ =
         enumHandling_.enumDescriptor_ =
-            description->dataTypeSpecific.enumDescFunc();
+            coreDesc->dataTypeSpecific.enumDescFunc();
       } else {
       } else {
         enumHandling_.enumVerifier_ =
         enumHandling_.enumVerifier_ =
-            description->dataTypeSpecific.enumVerifier;
+            coreDesc->dataTypeSpecific.enumVerifier;
       }
       }
     }
     }
 
 
-    // Non map<>/repeated fields can have defaults.
-    if (!isMapOrArray) {
-      defaultValue_ = description->defaultValue;
+    // Non map<>/repeated fields can have defaults in proto2 syntax.
+    if (!isMapOrArray && includesDefault) {
+      defaultValue_ = ((GPBMessageFieldDescriptionWithDefault *)description)->defaultValue;
       if (dataType == GPBDataTypeBytes) {
       if (dataType == GPBDataTypeBytes) {
         // Data stored as a length prefixed (network byte order) c-string in
         // Data stored as a length prefixed (network byte order) c-string in
         // descriptor structure.
         // descriptor structure.
@@ -480,24 +433,6 @@ uint32_t GPBFieldAlternateTag(GPBFieldDescriptor *self) {
         }
         }
       }
       }
     }
     }
-
-    // FieldOptions stored as a length prefixed (network byte order) c-escaped
-    // string in descriptor records.
-    if (description->fieldOptions) {
-      uint8_t *optionsBytes = (uint8_t *)description->fieldOptions;
-      uint32_t optionsLength = *((uint32_t *)optionsBytes);
-      optionsLength = ntohl(optionsLength);
-      if (optionsLength > 0) {
-        optionsBytes += sizeof(optionsLength);
-        NSData *optionsData = [NSData dataWithBytesNoCopy:optionsBytes
-                                                   length:optionsLength
-                                             freeWhenDone:NO];
-        GPBExtensionRegistry *registry = [rootClass extensionRegistry];
-        fieldOptions_ = [[GPBFieldOptions parseFromData:optionsData
-                                      extensionRegistry:registry
-                                                  error:NULL] retain];
-      }
-    }
   }
   }
   return self;
   return self;
 }
 }
@@ -666,7 +601,7 @@ uint32_t GPBFieldAlternateTag(GPBFieldDescriptor *self) {
   } else {
   } else {
     // Undo the CamelCase.
     // Undo the CamelCase.
     NSMutableString *result = [NSMutableString stringWithCapacity:len];
     NSMutableString *result = [NSMutableString stringWithCapacity:len];
-    for (NSUInteger i = 0; i < len; i++) {
+    for (uint32_t i = 0; i < len; i++) {
       unichar c = [name characterAtIndex:i];
       unichar c = [name characterAtIndex:i];
       if (c >= 'A' && c <= 'Z') {
       if (c >= 'A' && c <= 'Z') {
         if (i > 0) {
         if (i > 0) {
@@ -686,10 +621,16 @@ uint32_t GPBFieldAlternateTag(GPBFieldDescriptor *self) {
 
 
 @implementation GPBEnumDescriptor {
 @implementation GPBEnumDescriptor {
   NSString *name_;
   NSString *name_;
-  GPBMessageEnumValueDescription *valueDescriptions_;
-  NSUInteger valueDescriptionsCount_;
+  // valueNames_ is a single c string with all of the value names appended
+  // together, each null terminated.  -calcValueNameOffsets fills in
+  // nameOffsets_ with the offsets to allow quicker access to the individual
+  // names.
+  const char *valueNames_;
+  const int32_t *values_;
   GPBEnumValidationFunc enumVerifier_;
   GPBEnumValidationFunc enumVerifier_;
   const uint8_t *extraTextFormatInfo_;
   const uint8_t *extraTextFormatInfo_;
+  uint32_t *nameOffsets_;
+  uint32_t valueCount_;
 }
 }
 
 
 @synthesize name = name_;
 @synthesize name = name_;
@@ -697,26 +638,30 @@ uint32_t GPBFieldAlternateTag(GPBFieldDescriptor *self) {
 
 
 + (instancetype)
 + (instancetype)
     allocDescriptorForName:(NSString *)name
     allocDescriptorForName:(NSString *)name
-                    values:(GPBMessageEnumValueDescription *)valueDescriptions
-                valueCount:(NSUInteger)valueCount
+                valueNames:(const char *)valueNames
+                    values:(const int32_t *)values
+                     count:(uint32_t)valueCount
               enumVerifier:(GPBEnumValidationFunc)enumVerifier {
               enumVerifier:(GPBEnumValidationFunc)enumVerifier {
   GPBEnumDescriptor *descriptor = [[self alloc] initWithName:name
   GPBEnumDescriptor *descriptor = [[self alloc] initWithName:name
-                                                      values:valueDescriptions
-                                                  valueCount:valueCount
+                                                  valueNames:valueNames
+                                                      values:values
+                                                       count:valueCount
                                                 enumVerifier:enumVerifier];
                                                 enumVerifier:enumVerifier];
   return descriptor;
   return descriptor;
 }
 }
 
 
 + (instancetype)
 + (instancetype)
     allocDescriptorForName:(NSString *)name
     allocDescriptorForName:(NSString *)name
-                    values:(GPBMessageEnumValueDescription *)valueDescriptions
-                valueCount:(NSUInteger)valueCount
+                valueNames:(const char *)valueNames
+                    values:(const int32_t *)values
+                     count:(uint32_t)valueCount
               enumVerifier:(GPBEnumValidationFunc)enumVerifier
               enumVerifier:(GPBEnumValidationFunc)enumVerifier
        extraTextFormatInfo:(const char *)extraTextFormatInfo {
        extraTextFormatInfo:(const char *)extraTextFormatInfo {
   // Call the common case.
   // Call the common case.
   GPBEnumDescriptor *descriptor = [self allocDescriptorForName:name
   GPBEnumDescriptor *descriptor = [self allocDescriptorForName:name
-                                                        values:valueDescriptions
-                                                    valueCount:valueCount
+                                                    valueNames:valueNames
+                                                        values:values
+                                                         count:valueCount
                                                   enumVerifier:enumVerifier];
                                                   enumVerifier:enumVerifier];
   // Set the extra info.
   // Set the extra info.
   descriptor->extraTextFormatInfo_ = (const uint8_t *)extraTextFormatInfo;
   descriptor->extraTextFormatInfo_ = (const uint8_t *)extraTextFormatInfo;
@@ -724,24 +669,49 @@ uint32_t GPBFieldAlternateTag(GPBFieldDescriptor *self) {
 }
 }
 
 
 - (instancetype)initWithName:(NSString *)name
 - (instancetype)initWithName:(NSString *)name
-                      values:(GPBMessageEnumValueDescription *)valueDescriptions
-                  valueCount:(NSUInteger)valueCount
+                  valueNames:(const char *)valueNames
+                      values:(const int32_t *)values
+                       count:(uint32_t)valueCount
                 enumVerifier:(GPBEnumValidationFunc)enumVerifier {
                 enumVerifier:(GPBEnumValidationFunc)enumVerifier {
   if ((self = [super init])) {
   if ((self = [super init])) {
     name_ = [name copy];
     name_ = [name copy];
-    valueDescriptions_ = valueDescriptions;
-    valueDescriptionsCount_ = valueCount;
+    valueNames_ = valueNames;
+    values_ = values;
+    valueCount_ = valueCount;
     enumVerifier_ = enumVerifier;
     enumVerifier_ = enumVerifier;
   }
   }
   return self;
   return self;
 }
 }
 
 
+- (void)dealloc {
+  [name_ release];
+  if (nameOffsets_) free(nameOffsets_);
+  [super dealloc];
+}
+
+- (void)calcValueNameOffsets {
+  @synchronized(self) {
+    if (nameOffsets_ != NULL) {
+      return;
+    }
+    uint32_t *offsets = malloc(valueCount_ * sizeof(uint32_t));
+    const char *scan = valueNames_;
+    for (uint32_t i = 0; i < valueCount_; ++i) {
+      offsets[i] = (uint32_t)(scan - valueNames_);
+      while (*scan != '\0') ++scan;
+      ++scan;  // Step over the null.
+    }
+    nameOffsets_ = offsets;
+  }
+}
+
 - (NSString *)enumNameForValue:(int32_t)number {
 - (NSString *)enumNameForValue:(int32_t)number {
-  for (NSUInteger i = 0; i < valueDescriptionsCount_; ++i) {
-    GPBMessageEnumValueDescription *scan = &valueDescriptions_[i];
-    if ((scan->number == number) && (scan->name != NULL)) {
-      NSString *fullName =
-          [NSString stringWithFormat:@"%@_%s", name_, scan->name];
+  if (nameOffsets_ == NULL) [self calcValueNameOffsets];
+
+  for (uint32_t i = 0; i < valueCount_; ++i) {
+    if (values_[i] == number) {
+      const char *valueName = valueNames_ + nameOffsets_[i];
+      NSString *fullName = [NSString stringWithFormat:@"%@_%s", name_, valueName];
       return fullName;
       return fullName;
     }
     }
   }
   }
@@ -760,12 +730,14 @@ uint32_t GPBFieldAlternateTag(GPBFieldDescriptor *self) {
   const char *nameAsCStr = [name UTF8String];
   const char *nameAsCStr = [name UTF8String];
   nameAsCStr += prefixLen;
   nameAsCStr += prefixLen;
 
 
+  if (nameOffsets_ == NULL) [self calcValueNameOffsets];
+
   // Find it.
   // Find it.
-  for (NSUInteger i = 0; i < valueDescriptionsCount_; ++i) {
-    GPBMessageEnumValueDescription *scan = &valueDescriptions_[i];
-    if ((scan->name != NULL) && (strcmp(nameAsCStr, scan->name) == 0)) {
+  for (uint32_t i = 0; i < valueCount_; ++i) {
+    const char *valueName = valueNames_ + nameOffsets_[i];
+    if (strcmp(nameAsCStr, valueName) == 0) {
       if (outValue) {
       if (outValue) {
-        *outValue = scan->number;
+        *outValue = values_[i];
       }
       }
       return YES;
       return YES;
     }
     }
@@ -773,34 +745,28 @@ uint32_t GPBFieldAlternateTag(GPBFieldDescriptor *self) {
   return NO;
   return NO;
 }
 }
 
 
-- (void)dealloc {
-  [name_ release];
-  [super dealloc];
-}
-
 - (NSString *)textFormatNameForValue:(int32_t)number {
 - (NSString *)textFormatNameForValue:(int32_t)number {
+  if (nameOffsets_ == NULL) [self calcValueNameOffsets];
+
   // Find the EnumValue descriptor and its index.
   // Find the EnumValue descriptor and its index.
-  GPBMessageEnumValueDescription *valueDescriptor = NULL;
-  NSUInteger valueDescriptorIndex;
-  for (valueDescriptorIndex = 0; valueDescriptorIndex < valueDescriptionsCount_;
+  BOOL foundIt = NO;
+  uint32_t valueDescriptorIndex;
+  for (valueDescriptorIndex = 0; valueDescriptorIndex < valueCount_;
        ++valueDescriptorIndex) {
        ++valueDescriptorIndex) {
-    GPBMessageEnumValueDescription *scan =
-        &valueDescriptions_[valueDescriptorIndex];
-    if (scan->number == number) {
-      valueDescriptor = scan;
+    if (values_[valueDescriptorIndex] == number) {
+      foundIt = YES;
       break;
       break;
     }
     }
   }
   }
 
 
-  // If we didn't find it, or names were disable at proto compile time, nothing
-  // we can do.
-  if (!valueDescriptor || !valueDescriptor->name) {
+  if (!foundIt) {
     return nil;
     return nil;
   }
   }
 
 
   NSString *result = nil;
   NSString *result = nil;
   // Naming adds an underscore between enum name and value name, skip that also.
   // Naming adds an underscore between enum name and value name, skip that also.
-  NSString *shortName = @(valueDescriptor->name);
+  const char *valueName = valueNames_ + nameOffsets_[valueDescriptorIndex];
+  NSString *shortName = @(valueName);
 
 
   // See if it is in the map of special format handling.
   // See if it is in the map of special format handling.
   if (extraTextFormatInfo_) {
   if (extraTextFormatInfo_) {

+ 89 - 94
objectivec/GPBDescriptor_PackagePrivate.h

@@ -36,7 +36,7 @@
 #import "GPBWireFormat.h"
 #import "GPBWireFormat.h"
 
 
 // Describes attributes of the field.
 // Describes attributes of the field.
-typedef NS_OPTIONS(uint32_t, GPBFieldFlags) {
+typedef NS_OPTIONS(uint16_t, GPBFieldFlags) {
   // These map to standard protobuf concepts.
   // These map to standard protobuf concepts.
   GPBFieldRequired        = 1 << 0,
   GPBFieldRequired        = 1 << 0,
   GPBFieldRepeated        = 1 << 1,
   GPBFieldRepeated        = 1 << 1,
@@ -44,6 +44,12 @@ typedef NS_OPTIONS(uint32_t, GPBFieldFlags) {
   GPBFieldOptional        = 1 << 3,
   GPBFieldOptional        = 1 << 3,
   GPBFieldHasDefaultValue = 1 << 4,
   GPBFieldHasDefaultValue = 1 << 4,
 
 
+  // Indicates the field needs custom handling for the TextFormat name, if not
+  // set, the name can be derived from the ObjC name.
+  GPBFieldTextFormatNameCustom = 1 << 6,
+  // Indicates the field has an enum descriptor.
+  GPBFieldHasEnumDescriptor = 1 << 7,
+
   // These are not standard protobuf concepts, they are specific to the
   // These are not standard protobuf concepts, they are specific to the
   // Objective C runtime.
   // Objective C runtime.
 
 
@@ -62,67 +68,49 @@ typedef NS_OPTIONS(uint32_t, GPBFieldFlags) {
   GPBFieldMapKeySFixed64 = 10 << 8,
   GPBFieldMapKeySFixed64 = 10 << 8,
   GPBFieldMapKeyBool     = 11 << 8,
   GPBFieldMapKeyBool     = 11 << 8,
   GPBFieldMapKeyString   = 12 << 8,
   GPBFieldMapKeyString   = 12 << 8,
-
-  // Indicates the field needs custom handling for the TextFormat name, if not
-  // set, the name can be derived from the ObjC name.
-  GPBFieldTextFormatNameCustom = 1 << 16,
-  // Indicates the field has an enum descriptor.
-  GPBFieldHasEnumDescriptor = 1 << 17,
 };
 };
 
 
+// NOTE: The structures defined here have their members ordered to minimize
+// their size. This directly impacts the size of apps since these exist per
+// field/extension.
+
 // Describes a single field in a protobuf as it is represented as an ivar.
 // Describes a single field in a protobuf as it is represented as an ivar.
 typedef struct GPBMessageFieldDescription {
 typedef struct GPBMessageFieldDescription {
   // Name of ivar.
   // Name of ivar.
   const char *name;
   const char *name;
+  union {
+    const char *className;  // Name for message class.
+    // For enums only: If EnumDescriptors are compiled in, it will be that,
+    // otherwise it will be the verifier.
+    GPBEnumDescriptorFunc enumDescFunc;
+    GPBEnumValidationFunc enumVerifier;
+  } dataTypeSpecific;
   // The field number for the ivar.
   // The field number for the ivar.
   uint32_t number;
   uint32_t number;
   // The index (in bits) into _has_storage_.
   // The index (in bits) into _has_storage_.
-  //   > 0: the bit to use for a value being set.
-  //   = 0: no storage used.
+  //   >= 0: the bit to use for a value being set.
+  //   = GPBNoHasBit(INT32_MAX): no storage used.
   //   < 0: in a oneOf, use a full int32 to record the field active.
   //   < 0: in a oneOf, use a full int32 to record the field active.
   int32_t hasIndex;
   int32_t hasIndex;
+  // Offset of the variable into it's structure struct.
+  uint32_t offset;
   // Field flags. Use accessor functions below.
   // Field flags. Use accessor functions below.
   GPBFieldFlags flags;
   GPBFieldFlags flags;
   // Data type of the ivar.
   // Data type of the ivar.
   GPBDataType dataType;
   GPBDataType dataType;
-  // Offset of the variable into it's structure struct.
-  size_t offset;
-  // FieldOptions protobuf, serialized as string.
-  const char *fieldOptions;
-
-  GPBGenericValue defaultValue;  // Default value for the ivar.
-  union {
-    const char *className;  // Name for message class.
-    // For enums only: If EnumDescriptors are compiled in, it will be that,
-    // otherwise it will be the verifier.
-    GPBEnumDescriptorFunc enumDescFunc;
-    GPBEnumValidationFunc enumVerifier;
-  } dataTypeSpecific;
 } GPBMessageFieldDescription;
 } GPBMessageFieldDescription;
 
 
-// Describes a oneof.
-typedef struct GPBMessageOneofDescription {
-  // Name of this enum oneof.
-  const char *name;
-  // The index of this oneof in the has_storage.
-  int32_t index;
-} GPBMessageOneofDescription;
-
-// Describes an enum type defined in a .proto file.
-typedef struct GPBMessageEnumDescription {
-  GPBEnumDescriptorFunc enumDescriptorFunc;
-} GPBMessageEnumDescription;
+// Fields in messages defined in a 'proto2' syntax file can provide a default
+// value. This struct provides the default along with the field info.
+typedef struct GPBMessageFieldDescriptionWithDefault {
+  // Default value for the ivar.
+  GPBGenericValue defaultValue;
 
 
-// Describes an individual enum constant of a particular type.
-typedef struct GPBMessageEnumValueDescription {
-  // Name of this enum constant.
-  const char *name;
-  // Numeric value of this enum constant.
-  int32_t number;
-} GPBMessageEnumValueDescription;
+  GPBMessageFieldDescription core;
+} GPBMessageFieldDescriptionWithDefault;
 
 
 // Describes attributes of the extension.
 // Describes attributes of the extension.
-typedef NS_OPTIONS(uint32_t, GPBExtensionOptions) {
+typedef NS_OPTIONS(uint8_t, GPBExtensionOptions) {
   // These map to standard protobuf concepts.
   // These map to standard protobuf concepts.
   GPBExtensionRepeated      = 1 << 0,
   GPBExtensionRepeated      = 1 << 0,
   GPBExtensionPacked        = 1 << 1,
   GPBExtensionPacked        = 1 << 1,
@@ -131,65 +119,53 @@ typedef NS_OPTIONS(uint32_t, GPBExtensionOptions) {
 
 
 // An extension
 // An extension
 typedef struct GPBExtensionDescription {
 typedef struct GPBExtensionDescription {
+  GPBGenericValue defaultValue;
   const char *singletonName;
   const char *singletonName;
-  GPBDataType dataType;
   const char *extendedClass;
   const char *extendedClass;
-  int32_t fieldNumber;
-  GPBGenericValue defaultValue;
   const char *messageOrGroupClassName;
   const char *messageOrGroupClassName;
-  GPBExtensionOptions options;
   GPBEnumDescriptorFunc enumDescriptorFunc;
   GPBEnumDescriptorFunc enumDescriptorFunc;
+  int32_t fieldNumber;
+  GPBDataType dataType;
+  GPBExtensionOptions options;
 } GPBExtensionDescription;
 } GPBExtensionDescription;
 
 
+typedef NS_OPTIONS(uint32_t, GPBDescriptorInitializationFlags) {
+  GPBDescriptorInitializationFlag_FieldsWithDefault = 1 << 0,
+  GPBDescriptorInitializationFlag_WireFormat        = 1 << 1,
+};
+
 @interface GPBDescriptor () {
 @interface GPBDescriptor () {
  @package
  @package
   NSArray *fields_;
   NSArray *fields_;
   NSArray *oneofs_;
   NSArray *oneofs_;
-  size_t storageSize_;
+  uint32_t storageSize_;
 }
 }
 
 
-// fieldDescriptions, enumDescriptions, rangeDescriptions, and
-// extraTextFormatInfo have to be long lived, they are held as raw pointers.
+// fieldDescriptions have to be long lived, they are held as raw pointers.
 + (instancetype)
 + (instancetype)
     allocDescriptorForClass:(Class)messageClass
     allocDescriptorForClass:(Class)messageClass
                   rootClass:(Class)rootClass
                   rootClass:(Class)rootClass
                        file:(GPBFileDescriptor *)file
                        file:(GPBFileDescriptor *)file
-                     fields:(GPBMessageFieldDescription *)fieldDescriptions
-                 fieldCount:(NSUInteger)fieldCount
-                     oneofs:(GPBMessageOneofDescription *)oneofDescriptions
-                 oneofCount:(NSUInteger)oneofCount
-                      enums:(GPBMessageEnumDescription *)enumDescriptions
-                  enumCount:(NSUInteger)enumCount
-                     ranges:(const GPBExtensionRange *)ranges
-                 rangeCount:(NSUInteger)rangeCount
-                storageSize:(size_t)storageSize
-                 wireFormat:(BOOL)wireFormat;
-+ (instancetype)
-    allocDescriptorForClass:(Class)messageClass
-                  rootClass:(Class)rootClass
-                       file:(GPBFileDescriptor *)file
-                     fields:(GPBMessageFieldDescription *)fieldDescriptions
-                 fieldCount:(NSUInteger)fieldCount
-                     oneofs:(GPBMessageOneofDescription *)oneofDescriptions
-                 oneofCount:(NSUInteger)oneofCount
-                      enums:(GPBMessageEnumDescription *)enumDescriptions
-                  enumCount:(NSUInteger)enumCount
-                     ranges:(const GPBExtensionRange *)ranges
-                 rangeCount:(NSUInteger)rangeCount
-                storageSize:(size_t)storageSize
-                 wireFormat:(BOOL)wireFormat
-        extraTextFormatInfo:(const char *)extraTextFormatInfo;
+                     fields:(void *)fieldDescriptions
+                 fieldCount:(uint32_t)fieldCount
+                storageSize:(uint32_t)storageSize
+                      flags:(GPBDescriptorInitializationFlags)flags;
 
 
 - (instancetype)initWithClass:(Class)messageClass
 - (instancetype)initWithClass:(Class)messageClass
                          file:(GPBFileDescriptor *)file
                          file:(GPBFileDescriptor *)file
                        fields:(NSArray *)fields
                        fields:(NSArray *)fields
-                       oneofs:(NSArray *)oneofs
-                        enums:(NSArray *)enums
-              extensionRanges:(const GPBExtensionRange *)ranges
-         extensionRangesCount:(NSUInteger)rangeCount
-                  storageSize:(size_t)storage
+                  storageSize:(uint32_t)storage
                    wireFormat:(BOOL)wireFormat;
                    wireFormat:(BOOL)wireFormat;
 
 
+// Called right after init to provide extra information to avoid init having
+// an explosion of args. These pointers are recorded, so they are expected
+// to live for the lifetime of the app.
+- (void)setupOneofs:(const char **)oneofNames
+              count:(uint32_t)count
+      firstHasIndex:(int32_t)firstHasIndex;
+- (void)setupExtraTextInfo:(const char *)extraTextFormatInfo;
+- (void)setupExtensionRanges:(const GPBExtensionRange *)ranges count:(int32_t)count;
+
 @end
 @end
 
 
 @interface GPBFileDescriptor ()
 @interface GPBFileDescriptor ()
@@ -199,14 +175,12 @@ typedef struct GPBExtensionDescription {
 
 
 @interface GPBOneofDescriptor () {
 @interface GPBOneofDescriptor () {
  @package
  @package
-  GPBMessageOneofDescription *oneofDescription_;
+  const char *name_;
   NSArray *fields_;
   NSArray *fields_;
-
   SEL caseSel_;
   SEL caseSel_;
 }
 }
-- (instancetype)initWithOneofDescription:
-                    (GPBMessageOneofDescription *)oneofDescription
-                                  fields:(NSArray *)fields;
+// name must be long lived.
+- (instancetype)initWithName:(const char *)name fields:(NSArray *)fields;
 @end
 @end
 
 
 @interface GPBFieldDescriptor () {
 @interface GPBFieldDescriptor () {
@@ -222,30 +196,32 @@ typedef struct GPBExtensionDescription {
 
 
 // Single initializer
 // Single initializer
 // description has to be long lived, it is held as a raw pointer.
 // description has to be long lived, it is held as a raw pointer.
-- (instancetype)initWithFieldDescription:
-                    (GPBMessageFieldDescription *)description
-                               rootClass:(Class)rootClass
+- (instancetype)initWithFieldDescription:(void *)description
+                         includesDefault:(BOOL)includesDefault
                                   syntax:(GPBFileSyntax)syntax;
                                   syntax:(GPBFileSyntax)syntax;
 @end
 @end
 
 
 @interface GPBEnumDescriptor ()
 @interface GPBEnumDescriptor ()
-// valueDescriptions and extraTextFormatInfo have to be long lived, they are
+// valueNames, values and extraTextFormatInfo have to be long lived, they are
 // held as raw pointers.
 // held as raw pointers.
 + (instancetype)
 + (instancetype)
     allocDescriptorForName:(NSString *)name
     allocDescriptorForName:(NSString *)name
-                    values:(GPBMessageEnumValueDescription *)valueDescriptions
-                valueCount:(NSUInteger)valueCount
+                valueNames:(const char *)valueNames
+                    values:(const int32_t *)values
+                     count:(uint32_t)valueCount
               enumVerifier:(GPBEnumValidationFunc)enumVerifier;
               enumVerifier:(GPBEnumValidationFunc)enumVerifier;
 + (instancetype)
 + (instancetype)
     allocDescriptorForName:(NSString *)name
     allocDescriptorForName:(NSString *)name
-                    values:(GPBMessageEnumValueDescription *)valueDescriptions
-                valueCount:(NSUInteger)valueCount
+                valueNames:(const char *)valueNames
+                    values:(const int32_t *)values
+                     count:(uint32_t)valueCount
               enumVerifier:(GPBEnumValidationFunc)enumVerifier
               enumVerifier:(GPBEnumValidationFunc)enumVerifier
        extraTextFormatInfo:(const char *)extraTextFormatInfo;
        extraTextFormatInfo:(const char *)extraTextFormatInfo;
 
 
 - (instancetype)initWithName:(NSString *)name
 - (instancetype)initWithName:(NSString *)name
-                      values:(GPBMessageEnumValueDescription *)valueDescriptions
-                  valueCount:(NSUInteger)valueCount
+                  valueNames:(const char *)valueNames
+                      values:(const int32_t *)values
+                       count:(uint32_t)valueCount
                 enumVerifier:(GPBEnumValidationFunc)enumVerifier;
                 enumVerifier:(GPBEnumValidationFunc)enumVerifier;
 @end
 @end
 
 
@@ -314,5 +290,24 @@ GPB_INLINE BOOL GPBExtensionIsWireFormat(GPBExtensionDescription *description) {
   return (description->options & GPBExtensionSetWireFormat) != 0;
   return (description->options & GPBExtensionSetWireFormat) != 0;
 }
 }
 
 
+// Helper for compile time assets.
+#ifndef _GPBCompileAssert
+  #if __has_feature(c_static_assert) || __has_extension(c_static_assert)
+    #define _GPBCompileAssert(test, msg) _Static_assert((test), #msg)
+  #else
+    // Pre-Xcode 7 support.
+    #define _GPBCompileAssertSymbolInner(line, msg) _GPBCompileAssert ## line ## __ ## msg
+    #define _GPBCompileAssertSymbol(line, msg) _GPBCompileAssertSymbolInner(line, msg)
+    #define _GPBCompileAssert(test, msg) \
+        typedef char _GPBCompileAssertSymbol(__LINE__, msg) [ ((test) ? 1 : -1) ]
+  #endif  // __has_feature(c_static_assert) || __has_extension(c_static_assert)
+#endif // _GPBCompileAssert
+
+// Sanity check that there isn't padding between the field description
+// structures with and without a default.
+_GPBCompileAssert(sizeof(GPBMessageFieldDescriptionWithDefault) ==
+                  (sizeof(GPBGenericValue) +
+                   sizeof(GPBMessageFieldDescription)),
+                  DescriptionsWithDefault_different_size_than_expected);
 
 
 CF_EXTERN_C_END
 CF_EXTERN_C_END

+ 1 - 1
objectivec/GPBDictionary.m

@@ -31,7 +31,7 @@
 #import "GPBDictionary_PackagePrivate.h"
 #import "GPBDictionary_PackagePrivate.h"
 
 
 #import "GPBCodedInputStream_PackagePrivate.h"
 #import "GPBCodedInputStream_PackagePrivate.h"
-#import "GPBCodedOutputStream.h"
+#import "GPBCodedOutputStream_PackagePrivate.h"
 #import "GPBDescriptor_PackagePrivate.h"
 #import "GPBDescriptor_PackagePrivate.h"
 #import "GPBMessage_PackagePrivate.h"
 #import "GPBMessage_PackagePrivate.h"
 #import "GPBUtilities_PackagePrivate.h"
 #import "GPBUtilities_PackagePrivate.h"

+ 1 - 1
objectivec/GPBExtensionInternals.m

@@ -33,7 +33,7 @@
 #import <objc/runtime.h>
 #import <objc/runtime.h>
 
 
 #import "GPBCodedInputStream_PackagePrivate.h"
 #import "GPBCodedInputStream_PackagePrivate.h"
-#import "GPBCodedOutputStream.h"
+#import "GPBCodedOutputStream_PackagePrivate.h"
 #import "GPBDescriptor_PackagePrivate.h"
 #import "GPBDescriptor_PackagePrivate.h"
 #import "GPBMessage_PackagePrivate.h"
 #import "GPBMessage_PackagePrivate.h"
 #import "GPBUtilities_PackagePrivate.h"
 #import "GPBUtilities_PackagePrivate.h"

+ 34 - 19
objectivec/GPBExtensionRegistry.h

@@ -35,30 +35,45 @@
 
 
 NS_ASSUME_NONNULL_BEGIN
 NS_ASSUME_NONNULL_BEGIN
 
 
-// A table of known extensions, searchable by name or field number.  When
-// parsing a protocol message that might have extensions, you must provide an
-// ExtensionRegistry in which you have registered any extensions that you want
-// to be able to parse.  Otherwise, those extensions will just be treated like
-// unknown fields.
-//
-// The *Root classes provide +extensionRegistry for the extensions defined in a
-// given file *and* all files it imports.  You can also create a
-// GPBExtensionRegistry, and merge those registries to handle parsing extensions
-// defined from non overlapping files.
-//
-//    GPBExtensionRegistry *registry =
-//        [[[MyProtoFileRoot extensionRegistry] copy] autorelease];
-//    [registry addExtension:[OtherMessage neededExtension];  // Not in MyProtoFile
-//    NSError *parseError = nil;
-//    MyMessage *msg = [MyMessage parseData:data
-//                        extensionRegistry:registry
-//                                    error:&parseError];
-//
+/// A table of known extensions, searchable by name or field number.  When
+/// parsing a protocol message that might have extensions, you must provide a
+/// @c GPBExtensionRegistry in which you have registered any extensions that you
+/// want to be able to parse. Otherwise, those extensions will just be treated
+/// like unknown fields.
+///
+/// The @c *Root classes provide @c +extensionRegistry for the extensions defined
+/// in a given file *and* all files it imports. You can also create a
+/// @c GPBExtensionRegistry, and merge those registries to handle parsing
+/// extensions defined from non overlapping files.
+///
+/// @code
+/// GPBExtensionRegistry *registry =
+///     [[[MyProtoFileRoot extensionRegistry] copy] autorelease];
+/// [registry addExtension:[OtherMessage neededExtension];  // Not in MyProtoFile
+/// NSError *parseError = nil;
+/// MyMessage *msg = [MyMessage parseData:data
+///                     extensionRegistry:registry
+///                                 error:&parseError];
+/// @endcode
 @interface GPBExtensionRegistry : NSObject<NSCopying>
 @interface GPBExtensionRegistry : NSObject<NSCopying>
 
 
+/// Add the given @c GPBExtensionDescriptor to this registry.
+///
+/// @param extension The extension description to add.
 - (void)addExtension:(GPBExtensionDescriptor *)extension;
 - (void)addExtension:(GPBExtensionDescriptor *)extension;
+
+/// Adds all the extensions from another registry to this registry.
+///
+/// @param registry The registry to merge into this registry.
 - (void)addExtensions:(GPBExtensionRegistry *)registry;
 - (void)addExtensions:(GPBExtensionRegistry *)registry;
 
 
+/// Looks for the extension registered for the given field number on a given
+/// @c GPBDescriptor.
+///
+/// @param descriptor  The descriptor to look for a registered extension on.
+/// @param fieldNumber The field number of an extension to look for.
+///
+/// @return The registered @c GPBExtensionDescripto or nil if none was found.
 - (nullable GPBExtensionDescriptor *)extensionForDescriptor:(GPBDescriptor *)descriptor
 - (nullable GPBExtensionDescriptor *)extensionForDescriptor:(GPBDescriptor *)descriptor
                                                 fieldNumber:(NSInteger)fieldNumber;
                                                 fieldNumber:(NSInteger)fieldNumber;
 
 

+ 179 - 48
objectivec/GPBMessage.h

@@ -44,23 +44,27 @@ NS_ASSUME_NONNULL_BEGIN
 
 
 CF_EXTERN_C_BEGIN
 CF_EXTERN_C_BEGIN
 
 
-// NSError domain used for errors.
+/// NSError domain used for errors.
 extern NSString *const GPBMessageErrorDomain;
 extern NSString *const GPBMessageErrorDomain;
 
 
+/// Error code for NSError with GPBMessageErrorDomain.
 typedef NS_ENUM(NSInteger, GPBMessageErrorCode) {
 typedef NS_ENUM(NSInteger, GPBMessageErrorCode) {
+  /// The data being parsed is bad and a message can not be created from it.
   GPBMessageErrorCodeMalformedData = -100,
   GPBMessageErrorCodeMalformedData = -100,
+  /// A message can't be serialized because it is missing required fields.
   GPBMessageErrorCodeMissingRequiredField = -101,
   GPBMessageErrorCodeMissingRequiredField = -101,
 };
 };
 
 
-// In DEBUG ONLY, an NSException is thrown when a parsed message doesn't
-// contain required fields. This key allows you to retrieve the parsed message
-// from the exception's |userInfo| dictionary.
 #ifdef DEBUG
 #ifdef DEBUG
+/// In DEBUG ONLY, an NSException is thrown when a parsed message doesn't
+/// contain required fields. This key allows you to retrieve the parsed message
+/// from the exception's @c userInfo dictionary.
 extern NSString *const GPBExceptionMessageKey;
 extern NSString *const GPBExceptionMessageKey;
 #endif  // DEBUG
 #endif  // DEBUG
 
 
 CF_EXTERN_C_END
 CF_EXTERN_C_END
 
 
+/// Base class for all of the generated message classes.
 @interface GPBMessage : NSObject<NSSecureCoding, NSCopying>
 @interface GPBMessage : NSObject<NSSecureCoding, NSCopying>
 
 
 // NOTE: If you add a instance method/property to this class that may conflict
 // NOTE: If you add a instance method/property to this class that may conflict
@@ -68,108 +72,235 @@ CF_EXTERN_C_END
 // The main cases are methods that take no arguments, or setFoo:/hasFoo: type
 // The main cases are methods that take no arguments, or setFoo:/hasFoo: type
 // methods.
 // methods.
 
 
+/// The unknown fields for this message.
+///
+/// Only messages from proto files declared with "proto2" syntax support unknown
+/// fields. For "proto3" syntax, any unknown fields found while parsing are
+/// dropped.
 @property(nonatomic, copy, nullable) GPBUnknownFieldSet *unknownFields;
 @property(nonatomic, copy, nullable) GPBUnknownFieldSet *unknownFields;
 
 
-// Are all required fields in the message and all embedded messages set.
+/// Are all required fields set in the message and all embedded messages.
 @property(nonatomic, readonly, getter=isInitialized) BOOL initialized;
 @property(nonatomic, readonly, getter=isInitialized) BOOL initialized;
 
 
-// Returns an autoreleased instance.
+/// Returns an autoreleased instance.
 + (instancetype)message;
 + (instancetype)message;
 
 
-// Create a message based on a variety of inputs.  If there is a data parse
-// error, nil is returned and if not NULL, errorPtr is filled in.
-// NOTE: In DEBUG ONLY, the message is also checked for all required field,
-// if one is missing, the parse will fail (returning nil, filling in errorPtr).
+/// Creates a new instance by parsing the data. This method should be sent to
+/// the generated message class that the data should be interpreted as. If
+/// there is an error the method returns nil and the error is returned in
+/// errorPtr (when provided).
+///
+/// @note In DEBUG builds, the parsed message is checked to be sure all required
+///       fields were provided, and the parse will fail if some are missing.
+///
+/// @param data     The data to parse.
+/// @param errorPtr An optional error pointer to fill in with a failure reason if
+///                 the data can not be parsed.
+///
+/// @return A new instance of the class messaged.
 + (instancetype)parseFromData:(NSData *)data error:(NSError **)errorPtr;
 + (instancetype)parseFromData:(NSData *)data error:(NSError **)errorPtr;
+
+/// Creates a new instance by parsing the data. This method should be sent to
+/// the generated message class that the data should be interpreted as. If
+/// there is an error the method returns nil and the error is returned in
+/// errorPtr (when provided).
+///
+/// @note In DEBUG builds, the parsed message is checked to be sure all required
+///       fields were provided, and the parse will fail if some are missing.
+///
+/// @param data              The data to parse.
+/// @param extensionRegistry The extension registry to use to look up extensions.
+/// @param errorPtr          An optional error pointer to fill in with a failure
+///                          reason if the data can not be parsed.
+///
+/// @return A new instance of the class messaged.
 + (instancetype)parseFromData:(NSData *)data
 + (instancetype)parseFromData:(NSData *)data
             extensionRegistry:(nullable GPBExtensionRegistry *)extensionRegistry
             extensionRegistry:(nullable GPBExtensionRegistry *)extensionRegistry
                         error:(NSError **)errorPtr;
                         error:(NSError **)errorPtr;
+
+/// Creates a new instance by parsing the data from the given input stream. This
+/// method should be sent to the generated message class that the data should
+/// be interpreted as. If there is an error the method returns nil and the error
+/// is returned in errorPtr (when provided).
+///
+/// @note In DEBUG builds, the parsed message is checked to be sure all required
+///       fields were provided, and the parse will fail if some are missing.
+///
+/// @param input             The stream to read data from.
+/// @param extensionRegistry The extension registry to use to look up extensions.
+/// @param errorPtr          An optional error pointer to fill in with a failure
+///                          reason if the data can not be parsed.
+///
+/// @return A new instance of the class messaged.
 + (instancetype)parseFromCodedInputStream:(GPBCodedInputStream *)input
 + (instancetype)parseFromCodedInputStream:(GPBCodedInputStream *)input
                         extensionRegistry:
                         extensionRegistry:
                             (nullable GPBExtensionRegistry *)extensionRegistry
                             (nullable GPBExtensionRegistry *)extensionRegistry
                                     error:(NSError **)errorPtr;
                                     error:(NSError **)errorPtr;
 
 
-// Create a message based on delimited input.  If there is a data parse
-// error, nil is returned and if not NULL, errorPtr is filled in.
+/// Creates a new instance by parsing the data from the given input stream. This
+/// method should be sent to the generated message class that the data should
+/// be interpreted as. If there is an error the method returns nil and the error
+/// is returned in errorPtr (when provided).
+///
+/// @note Unlike the parseFrom... methods, this never checks to see if all of
+///       the required fields are set. So this method can be used to reload
+///       messages that may not be complete.
+///
+/// @param input             The stream to read data from.
+/// @param extensionRegistry The extension registry to use to look up extensions.
+/// @param errorPtr          An optional error pointer to fill in with a failure
+///                          reason if the data can not be parsed.
+///
+/// @return A new instance of the class messaged.
 + (instancetype)parseDelimitedFromCodedInputStream:(GPBCodedInputStream *)input
 + (instancetype)parseDelimitedFromCodedInputStream:(GPBCodedInputStream *)input
                                  extensionRegistry:
                                  extensionRegistry:
                                      (nullable GPBExtensionRegistry *)extensionRegistry
                                      (nullable GPBExtensionRegistry *)extensionRegistry
                                              error:(NSError **)errorPtr;
                                              error:(NSError **)errorPtr;
 
 
-// If there is a data parse error, nil is returned and if not NULL, errorPtr is
-// filled in.
-// NOTE: In DEBUG ONLY, the message is also checked for all required field,
-// if one is missing, the parse will fail (returning nil, filling in errorPtr).
+/// Initializes an instance by parsing the data. This method should be sent to
+/// the generated message class that the data should be interpreted as. If
+/// there is an error the method returns nil and the error is returned in
+/// errorPtr (when provided).
+///
+/// @note In DEBUG builds, the parsed message is checked to be sure all required
+///       fields were provided, and the parse will fail if some are missing.
+///
+/// @param data     The data to parse.
+/// @param errorPtr An optional error pointer to fill in with a failure reason if
+///                 the data can not be parsed.
 - (instancetype)initWithData:(NSData *)data error:(NSError **)errorPtr;
 - (instancetype)initWithData:(NSData *)data error:(NSError **)errorPtr;
+
+/// Initializes an instance by parsing the data. This method should be sent to
+/// the generated message class that the data should be interpreted as. If
+/// there is an error the method returns nil and the error is returned in
+/// errorPtr (when provided).
+///
+/// @note In DEBUG builds, the parsed message is checked to be sure all required
+///       fields were provided, and the parse will fail if some are missing.
+///
+/// @param data              The data to parse.
+/// @param extensionRegistry The extension registry to use to look up extensions.
+/// @param errorPtr          An optional error pointer to fill in with a failure
+///                          reason if the data can not be parsed.
 - (instancetype)initWithData:(NSData *)data
 - (instancetype)initWithData:(NSData *)data
            extensionRegistry:(nullable GPBExtensionRegistry *)extensionRegistry
            extensionRegistry:(nullable GPBExtensionRegistry *)extensionRegistry
                        error:(NSError **)errorPtr;
                        error:(NSError **)errorPtr;
+
+/// Initializes an instance by parsing the data from the given input stream. This
+/// method should be sent to the generated message class that the data should
+/// be interpreted as. If there is an error the method returns nil and the error
+/// is returned in errorPtr (when provided).
+///
+/// @note Unlike the parseFrom... methods, this never checks to see if all of
+///       the required fields are set. So this method can be used to reload
+///       messages that may not be complete.
+///
+/// @param input             The stream to read data from.
+/// @param extensionRegistry The extension registry to use to look up extensions.
+/// @param errorPtr          An optional error pointer to fill in with a failure
+///                          reason if the data can not be parsed.
 - (instancetype)initWithCodedInputStream:(GPBCodedInputStream *)input
 - (instancetype)initWithCodedInputStream:(GPBCodedInputStream *)input
                        extensionRegistry:
                        extensionRegistry:
                            (nullable GPBExtensionRegistry *)extensionRegistry
                            (nullable GPBExtensionRegistry *)extensionRegistry
                                    error:(NSError **)errorPtr;
                                    error:(NSError **)errorPtr;
 
 
-// Serializes the message and writes it to output.
+/// Writes out the message to the given output stream.
 - (void)writeToCodedOutputStream:(GPBCodedOutputStream *)output;
 - (void)writeToCodedOutputStream:(GPBCodedOutputStream *)output;
+/// Writes out the message to the given output stream.
 - (void)writeToOutputStream:(NSOutputStream *)output;
 - (void)writeToOutputStream:(NSOutputStream *)output;
 
 
-// Serializes the message and writes it to output, but writes the size of the
-// message as a variant before writing the message.
+/// Writes out a varint for the message size followed by the the message to
+/// the given output stream.
 - (void)writeDelimitedToCodedOutputStream:(GPBCodedOutputStream *)output;
 - (void)writeDelimitedToCodedOutputStream:(GPBCodedOutputStream *)output;
+/// Writes out a varint for the message size followed by the the message to
+/// the given output stream.
 - (void)writeDelimitedToOutputStream:(NSOutputStream *)output;
 - (void)writeDelimitedToOutputStream:(NSOutputStream *)output;
 
 
-// Serializes the message to an NSData. Note that this value is not cached, so
-// if you are using it repeatedly, cache it yourself. If there is an error
-// while generating the data, nil is returned.
-// NOTE: In DEBUG ONLY, the message is also checked for all required field,
-// if one is missing, nil will be returned.
+/// Serializes the message to a @c NSData.
+///
+/// If there is an error while generating the data, nil is returned.
+///
+/// @note This value is not cached, so if you are using it repeatedly, cache
+///       it yourself.
+///
+/// @note In DEBUG ONLY, the message is also checked for all required field,
+///       if one is missing, nil will be returned.
 - (nullable NSData *)data;
 - (nullable NSData *)data;
 
 
-// Same as -[data], except a delimiter is added to the start of the data
-// indicating the size of the message data that follows.
+/// Serializes a varint with the message size followed by the message data,
+/// returning that as a @c NSData.
+///
+/// @note This value is not cached, so if you are using it repeatedly, cache
+///       it yourself.
 - (NSData *)delimitedData;
 - (NSData *)delimitedData;
 
 
-// Returns the size of the object if it were serialized.
-// This is not a cached value. If you are following a pattern like this:
-//   size_t size = [aMsg serializedSize];
-//   NSMutableData *foo = [NSMutableData dataWithCapacity:size + sizeof(size)];
-//   [foo writeSize:size];
-//   [foo appendData:[aMsg data]];
-// you would be better doing:
-//   NSData *data = [aMsg data];
-//   NSUInteger size = [aMsg length];
-//   NSMutableData *foo = [NSMutableData dataWithCapacity:size + sizeof(size)];
-//   [foo writeSize:size];
-//   [foo appendData:data];
+/// Calculates the size of the object if it were serialized.
+///
+/// This is not a cached value. If you are following a pattern like this:
+/// @code
+///   size_t size = [aMsg serializedSize];
+///   NSMutableData *foo = [NSMutableData dataWithCapacity:size + sizeof(size)];
+///   [foo writeSize:size];
+///   [foo appendData:[aMsg data]];
+/// @endcode
+/// you would be better doing:
+/// @code
+///   NSData *data = [aMsg data];
+///   NSUInteger size = [aMsg length];
+///   NSMutableData *foo = [NSMutableData dataWithCapacity:size + sizeof(size)];
+///   [foo writeSize:size];
+///   [foo appendData:data];
+/// @endcode
 - (size_t)serializedSize;
 - (size_t)serializedSize;
 
 
-// Return the descriptor for the message
+/// Return the descriptor for the message class.
 + (GPBDescriptor *)descriptor;
 + (GPBDescriptor *)descriptor;
+/// Return the descriptor for the message.
 - (GPBDescriptor *)descriptor;
 - (GPBDescriptor *)descriptor;
 
 
-// Extensions use boxed values (NSNumbers) for PODs, NSMutableArrays for
-// repeated. If the extension is a Message one will be auto created for you
-// and returned similar to fields.
+/// Test to see if the given extension is set on the message.
 - (BOOL)hasExtension:(GPBExtensionDescriptor *)extension;
 - (BOOL)hasExtension:(GPBExtensionDescriptor *)extension;
+
+/// Fetches the given extension's value for this message.
+///
+/// Extensions use boxed values (NSNumbers) for PODs and NSMutableArrays for
+/// repeated fields. If the extension is a Message one will be auto created for you
+/// and returned similar to fields.
 - (nullable id)getExtension:(GPBExtensionDescriptor *)extension;
 - (nullable id)getExtension:(GPBExtensionDescriptor *)extension;
+
+/// Sets the given extension's value for this message. This is only for single
+/// field extensions (i.e. - not repeated fields).
+///
+/// Extensions use boxed values (@c NSNumbers).
 - (void)setExtension:(GPBExtensionDescriptor *)extension value:(nullable id)value;
 - (void)setExtension:(GPBExtensionDescriptor *)extension value:(nullable id)value;
+
+/// Adds the given value to the extension for this message. This is only for
+/// repeated field extensions. If the field is a repeated POD type the @c value
+/// is a @c NSNumber.
 - (void)addExtension:(GPBExtensionDescriptor *)extension value:(id)value;
 - (void)addExtension:(GPBExtensionDescriptor *)extension value:(id)value;
+
+/// Replaces the given value at an index for the extension on this message. This
+/// is only for repeated field extensions. If the field is a repeated POD type
+/// the @c value is a @c NSNumber.
 - (void)setExtension:(GPBExtensionDescriptor *)extension
 - (void)setExtension:(GPBExtensionDescriptor *)extension
                index:(NSUInteger)index
                index:(NSUInteger)index
                value:(id)value;
                value:(id)value;
+
+/// Clears the given extension for this message.
 - (void)clearExtension:(GPBExtensionDescriptor *)extension;
 - (void)clearExtension:(GPBExtensionDescriptor *)extension;
 
 
-// Resets all fields to their default values.
+/// Resets all of the fields of this message to their default values.
 - (void)clear;
 - (void)clear;
 
 
-// Parses a message of this type from the input and merges it with this
-// message.
-// NOTE: This will throw if there is an error parsing the data.
+/// Parses a message of this type from the input and merges it with this
+/// message.
+///
+/// @note This will throw if there is an error parsing the data.
 - (void)mergeFromData:(NSData *)data
 - (void)mergeFromData:(NSData *)data
     extensionRegistry:(nullable GPBExtensionRegistry *)extensionRegistry;
     extensionRegistry:(nullable GPBExtensionRegistry *)extensionRegistry;
 
 
-// Merges the fields from another message (of the same type) into this
-// message.
+/// Merges the fields from another message (of the same type) into this
+/// message.
 - (void)mergeFrom:(GPBMessage *)other;
 - (void)mergeFrom:(GPBMessage *)other;
 
 
 @end
 @end

+ 9 - 26
objectivec/GPBMessage.m

@@ -35,7 +35,7 @@
 
 
 #import "GPBArray_PackagePrivate.h"
 #import "GPBArray_PackagePrivate.h"
 #import "GPBCodedInputStream_PackagePrivate.h"
 #import "GPBCodedInputStream_PackagePrivate.h"
-#import "GPBCodedOutputStream.h"
+#import "GPBCodedOutputStream_PackagePrivate.h"
 #import "GPBDescriptor_PackagePrivate.h"
 #import "GPBDescriptor_PackagePrivate.h"
 #import "GPBDictionary_PackagePrivate.h"
 #import "GPBDictionary_PackagePrivate.h"
 #import "GPBExtensionInternals.h"
 #import "GPBExtensionInternals.h"
@@ -54,18 +54,6 @@ NSString *const GPBExceptionMessageKey =
 
 
 static NSString *const kGPBDataCoderKey = @"GPBData";
 static NSString *const kGPBDataCoderKey = @"GPBData";
 
 
-#ifndef _GPBCompileAssert
-  #if __has_feature(c_static_assert) || __has_extension(c_static_assert)
-    #define _GPBCompileAssert(test, msg) _Static_assert((test), #msg)
-  #else
-    // Pre-Xcode 7 support.
-    #define _GPBCompileAssertSymbolInner(line, msg) _GPBCompileAssert ## line ## __ ## msg
-    #define _GPBCompileAssertSymbol(line, msg) _GPBCompileAssertSymbolInner(line, msg)
-    #define _GPBCompileAssert(test, msg) \
-        typedef char _GPBCompileAssertSymbol(__LINE__, msg) [ ((test) ? 1 : -1) ]
-  #endif  // __has_feature(c_static_assert) || __has_extension(c_static_assert)
-#endif // _GPBCompileAssert
-
 //
 //
 // PLEASE REMEMBER:
 // PLEASE REMEMBER:
 //
 //
@@ -568,6 +556,7 @@ static id GetArrayIvarWithField(GPBMessage *self, GPBFieldDescriptor *field) {
   id array = GPBGetObjectIvarWithFieldNoAutocreate(self, field);
   id array = GPBGetObjectIvarWithFieldNoAutocreate(self, field);
   if (!array) {
   if (!array) {
     // Check again after getting the lock.
     // Check again after getting the lock.
+    GPBPrepareReadOnlySemaphore(self);
     dispatch_semaphore_wait(self->readOnlySemaphore_, DISPATCH_TIME_FOREVER);
     dispatch_semaphore_wait(self->readOnlySemaphore_, DISPATCH_TIME_FOREVER);
     array = GPBGetObjectIvarWithFieldNoAutocreate(self, field);
     array = GPBGetObjectIvarWithFieldNoAutocreate(self, field);
     if (!array) {
     if (!array) {
@@ -598,6 +587,7 @@ static id GetMapIvarWithField(GPBMessage *self, GPBFieldDescriptor *field) {
   id dict = GPBGetObjectIvarWithFieldNoAutocreate(self, field);
   id dict = GPBGetObjectIvarWithFieldNoAutocreate(self, field);
   if (!dict) {
   if (!dict) {
     // Check again after getting the lock.
     // Check again after getting the lock.
+    GPBPrepareReadOnlySemaphore(self);
     dispatch_semaphore_wait(self->readOnlySemaphore_, DISPATCH_TIME_FOREVER);
     dispatch_semaphore_wait(self->readOnlySemaphore_, DISPATCH_TIME_FOREVER);
     dict = GPBGetObjectIvarWithFieldNoAutocreate(self, field);
     dict = GPBGetObjectIvarWithFieldNoAutocreate(self, field);
     if (!dict) {
     if (!dict) {
@@ -789,14 +779,8 @@ static GPBUnknownFieldSet *GetOrMakeUnknownFields(GPBMessage *self) {
                                                    file:fileDescriptor
                                                    file:fileDescriptor
                                                  fields:NULL
                                                  fields:NULL
                                              fieldCount:0
                                              fieldCount:0
-                                                 oneofs:NULL
-                                             oneofCount:0
-                                                  enums:NULL
-                                              enumCount:0
-                                                 ranges:NULL
-                                             rangeCount:0
                                             storageSize:0
                                             storageSize:0
-                                             wireFormat:NO];
+                                                  flags:0];
   }
   }
   return descriptor;
   return descriptor;
 }
 }
@@ -809,8 +793,6 @@ static GPBUnknownFieldSet *GetOrMakeUnknownFields(GPBMessage *self) {
   if ((self = [super init])) {
   if ((self = [super init])) {
     messageStorage_ = (GPBMessage_StoragePtr)(
     messageStorage_ = (GPBMessage_StoragePtr)(
         ((uint8_t *)self) + class_getInstanceSize([self class]));
         ((uint8_t *)self) + class_getInstanceSize([self class]));
-
-    readOnlySemaphore_ = dispatch_semaphore_create(1);
   }
   }
 
 
   return self;
   return self;
@@ -886,7 +868,9 @@ static GPBUnknownFieldSet *GetOrMakeUnknownFields(GPBMessage *self) {
 - (void)dealloc {
 - (void)dealloc {
   [self internalClear:NO];
   [self internalClear:NO];
   NSCAssert(!autocreator_, @"Autocreator was not cleared before dealloc.");
   NSCAssert(!autocreator_, @"Autocreator was not cleared before dealloc.");
-  dispatch_release(readOnlySemaphore_);
+  if (readOnlySemaphore_) {
+    dispatch_release(readOnlySemaphore_);
+  }
   [super dealloc];
   [super dealloc];
 }
 }
 
 
@@ -1724,6 +1708,7 @@ static GPBUnknownFieldSet *GetOrMakeUnknownFields(GPBMessage *self) {
   }
   }
 
 
   // Check for an autocreated value.
   // Check for an autocreated value.
+  GPBPrepareReadOnlySemaphore(self);
   dispatch_semaphore_wait(readOnlySemaphore_, DISPATCH_TIME_FOREVER);
   dispatch_semaphore_wait(readOnlySemaphore_, DISPATCH_TIME_FOREVER);
   value = [autocreatedExtensionMap_ objectForKey:extension];
   value = [autocreatedExtensionMap_ objectForKey:extension];
   if (!value) {
   if (!value) {
@@ -1935,7 +1920,6 @@ static GPBUnknownFieldSet *GetOrMakeUnknownFields(GPBMessage *self) {
     }
     }
   }
   }
   @catch (NSException *exception) {
   @catch (NSException *exception) {
-    [message release];
     message = nil;
     message = nil;
     if (errorPtr) {
     if (errorPtr) {
       *errorPtr = MessageErrorWithReason(GPBMessageErrorCodeMalformedData,
       *errorPtr = MessageErrorWithReason(GPBMessageErrorCodeMalformedData,
@@ -1944,7 +1928,6 @@ static GPBUnknownFieldSet *GetOrMakeUnknownFields(GPBMessage *self) {
   }
   }
 #ifdef DEBUG
 #ifdef DEBUG
   if (message && !message.initialized) {
   if (message && !message.initialized) {
-    [message release];
     message = nil;
     message = nil;
     if (errorPtr) {
     if (errorPtr) {
       *errorPtr = MessageError(GPBMessageErrorCodeMissingRequiredField, nil);
       *errorPtr = MessageError(GPBMessageErrorCodeMissingRequiredField, nil);
@@ -3096,7 +3079,7 @@ static void ResolveIvarSet(GPBFieldDescriptor *field,
       } else {
       } else {
         GPBOneofDescriptor *oneof = field->containingOneof_;
         GPBOneofDescriptor *oneof = field->containingOneof_;
         if (oneof && (sel == oneof->caseSel_)) {
         if (oneof && (sel == oneof->caseSel_)) {
-          int32_t index = oneof->oneofDescription_->index;
+          int32_t index = GPBFieldHasIndex(field);
           result.impToAdd = imp_implementationWithBlock(^(id obj) {
           result.impToAdd = imp_implementationWithBlock(^(id obj) {
             return GPBGetHasOneof(obj, index);
             return GPBGetHasOneof(obj, index);
           });
           });

+ 12 - 0
objectivec/GPBMessage_PackagePrivate.h

@@ -67,6 +67,10 @@ typedef struct GPBMessage_Storage *GPBMessage_StoragePtr;
   // priority inversion:
   // priority inversion:
   //   http://mjtsai.com/blog/2015/12/16/osspinlock-is-unsafe/
   //   http://mjtsai.com/blog/2015/12/16/osspinlock-is-unsafe/
   //   https://lists.swift.org/pipermail/swift-dev/Week-of-Mon-20151214/000372.html
   //   https://lists.swift.org/pipermail/swift-dev/Week-of-Mon-20151214/000372.html
+  // Use of readOnlySemaphore_ must be prefaced by a call to
+  // GPBPrepareReadOnlySemaphore to ensure it has been created. This allows
+  // readOnlySemaphore_ to be only created when actually needed.
+  dispatch_once_t readOnlySemaphoreCreationOnce_;
   dispatch_semaphore_t readOnlySemaphore_;
   dispatch_semaphore_t readOnlySemaphore_;
 }
 }
 
 
@@ -103,6 +107,14 @@ typedef struct GPBMessage_Storage *GPBMessage_StoragePtr;
 
 
 CF_EXTERN_C_BEGIN
 CF_EXTERN_C_BEGIN
 
 
+
+// Call this before using the readOnlySemaphore_. This ensures it is created only once.
+NS_INLINE void GPBPrepareReadOnlySemaphore(GPBMessage *self) {
+  dispatch_once(&self->readOnlySemaphoreCreationOnce_, ^{
+    self->readOnlySemaphore_ = dispatch_semaphore_create(1);
+  });
+}
+
 // Returns a new instance that was automatically created by |autocreator| for
 // Returns a new instance that was automatically created by |autocreator| for
 // its field |field|.
 // its field |field|.
 GPBMessage *GPBCreateMessageWithAutocreator(Class msgClass,
 GPBMessage *GPBCreateMessageWithAutocreator(Class msgClass,

+ 0 - 2
objectivec/GPBProtocolBuffers.m

@@ -46,8 +46,6 @@
 #import "GPBWellKnownTypes.m"
 #import "GPBWellKnownTypes.m"
 #import "GPBWireFormat.m"
 #import "GPBWireFormat.m"
 
 
-#import "google/protobuf/Descriptor.pbobjc.m"
-
 // Duration and Timestamp are #imported into GPBWellKnownTypes.m to the
 // Duration and Timestamp are #imported into GPBWellKnownTypes.m to the
 // Objective C categories added will always be linked in with the classes.
 // Objective C categories added will always be linked in with the classes.
 #import "google/protobuf/Any.pbobjc.m"
 #import "google/protobuf/Any.pbobjc.m"

+ 4 - 3
objectivec/GPBRootObject.h

@@ -34,11 +34,12 @@
 
 
 NS_ASSUME_NONNULL_BEGIN
 NS_ASSUME_NONNULL_BEGIN
 
 
-// All Root Objects derive from GPBRootObject. It supplies a registry
-// for derived classes to register their extensions to.
+/// Every generated proto file defines a local "Root" class that exposes a
+/// @c GPBExtensionRegistry for all the extensions defined by that file and
+/// the files it depends on.
 @interface GPBRootObject : NSObject
 @interface GPBRootObject : NSObject
 
 
-// Per class registry.
+/// An extension registry for the given file and all the files it depends on.
 + (GPBExtensionRegistry *)extensionRegistry;
 + (GPBExtensionRegistry *)extensionRegistry;
 
 
 @end
 @end

+ 2 - 2
objectivec/GPBRuntimeTypes.h

@@ -67,7 +67,7 @@ typedef union {
 
 
 // Do not change the order of this enum (or add things to it) without thinking
 // Do not change the order of this enum (or add things to it) without thinking
 // about it very carefully. There are several things that depend on the order.
 // about it very carefully. There are several things that depend on the order.
-typedef enum {
+typedef NS_ENUM(uint8_t, GPBDataType) {
   GPBDataTypeBool = 0,
   GPBDataTypeBool = 0,
   GPBDataTypeFixed32,
   GPBDataTypeFixed32,
   GPBDataTypeSFixed32,
   GPBDataTypeSFixed32,
@@ -86,7 +86,7 @@ typedef enum {
   GPBDataTypeMessage,
   GPBDataTypeMessage,
   GPBDataTypeGroup,
   GPBDataTypeGroup,
   GPBDataTypeEnum,
   GPBDataTypeEnum,
-} GPBDataType;
+};
 
 
 enum {
 enum {
   // A count of the number of types in GPBDataType. Separated out from the
   // A count of the number of types in GPBDataType. Separated out from the

+ 31 - 2
objectivec/GPBUnknownField.h

@@ -37,22 +37,51 @@
 
 
 NS_ASSUME_NONNULL_BEGIN
 NS_ASSUME_NONNULL_BEGIN
 
 
+/// Store an unknown field. These are used in conjunction with @c GPBUnknownFieldSet
 @interface GPBUnknownField : NSObject<NSCopying>
 @interface GPBUnknownField : NSObject<NSCopying>
 
 
+/// The field number the data is stored under.
 @property(nonatomic, readonly, assign) int32_t number;
 @property(nonatomic, readonly, assign) int32_t number;
 
 
-// Only one of these will be set.
+/// An array of varint values for this field.
 @property(nonatomic, readonly, strong) GPBUInt64Array *varintList;
 @property(nonatomic, readonly, strong) GPBUInt64Array *varintList;
+
+/// An array of fixed32 values for this field.
 @property(nonatomic, readonly, strong) GPBUInt32Array *fixed32List;
 @property(nonatomic, readonly, strong) GPBUInt32Array *fixed32List;
+
+/// An array of fixed64 values for this field.
 @property(nonatomic, readonly, strong) GPBUInt64Array *fixed64List;
 @property(nonatomic, readonly, strong) GPBUInt64Array *fixed64List;
+
+/// An array of data values for this field.
 @property(nonatomic, readonly, strong) NSArray<NSData*> *lengthDelimitedList;
 @property(nonatomic, readonly, strong) NSArray<NSData*> *lengthDelimitedList;
+
+/// An array of groups of values for this field.
 @property(nonatomic, readonly, strong) NSArray<GPBUnknownFieldSet*> *groupList;
 @property(nonatomic, readonly, strong) NSArray<GPBUnknownFieldSet*> *groupList;
 
 
-// Only one of these should be used per Field.
+
+/// Add a value to the varintList.
+///
+/// @param value The value to add.
 - (void)addVarint:(uint64_t)value;
 - (void)addVarint:(uint64_t)value;
+
+/// Add a value to the fixed32List.
+///
+/// @param value The value to add.
 - (void)addFixed32:(uint32_t)value;
 - (void)addFixed32:(uint32_t)value;
+
+/// Add a value to the fixed64List.
+///
+/// @param value The value to add.
 - (void)addFixed64:(uint64_t)value;
 - (void)addFixed64:(uint64_t)value;
+
+/// Add a value to the lengthDelimitedList.
+///
+/// @param value The value to add.
 - (void)addLengthDelimited:(NSData *)value;
 - (void)addLengthDelimited:(NSData *)value;
+
+/// Add a value to the groupList.
+///
+/// @param value The value to add.
 - (void)addGroup:(GPBUnknownFieldSet *)value;
 - (void)addGroup:(GPBUnknownFieldSet *)value;
 
 
 @end
 @end

+ 1 - 1
objectivec/GPBUnknownField.m

@@ -31,7 +31,7 @@
 #import "GPBUnknownField_PackagePrivate.h"
 #import "GPBUnknownField_PackagePrivate.h"
 
 
 #import "GPBArray.h"
 #import "GPBArray.h"
-#import "GPBCodedOutputStream.h"
+#import "GPBCodedOutputStream_PackagePrivate.h"
 
 
 @implementation GPBUnknownField {
 @implementation GPBUnknownField {
  @protected
  @protected

+ 16 - 1
objectivec/GPBUnknownFieldSet.h

@@ -34,15 +34,30 @@
 
 
 NS_ASSUME_NONNULL_BEGIN
 NS_ASSUME_NONNULL_BEGIN
 
 
+/// A collection of unknown fields.
 @interface GPBUnknownFieldSet : NSObject<NSCopying>
 @interface GPBUnknownFieldSet : NSObject<NSCopying>
 
 
+/// Tests to see if the given field number has a value.
+///
+/// @param number The field number to check.
+///
+/// @return YES if there is an unknown field for the given field number.
 - (BOOL)hasField:(int32_t)number;
 - (BOOL)hasField:(int32_t)number;
+
+/// Fetches the @c GPBUnknownField for the given field number.
+///
+/// @param number The field number to look up.
+///
+/// @return The @c GPBUnknownField or nil.
 - (nullable GPBUnknownField *)getField:(int32_t)number;
 - (nullable GPBUnknownField *)getField:(int32_t)number;
+
+/// Returns the number of fields in this set.
 - (NSUInteger)countOfFields;
 - (NSUInteger)countOfFields;
 
 
+/// Adds the given field to the set.
 - (void)addField:(GPBUnknownField *)field;
 - (void)addField:(GPBUnknownField *)field;
 
 
-// Returns an NSArray of the GPBUnknownFields sorted by the field numbers.
+/// Returns an NSArray of the @c GPBUnknownFields sorted by the field numbers.
 - (NSArray<GPBUnknownField*> *)sortedFields;
 - (NSArray<GPBUnknownField*> *)sortedFields;
 
 
 @end
 @end

+ 110 - 40
objectivec/GPBUtilities.h

@@ -38,24 +38,34 @@ CF_EXTERN_C_BEGIN
 
 
 NS_ASSUME_NONNULL_BEGIN
 NS_ASSUME_NONNULL_BEGIN
 
 
-// Generates a string that should be a valid "Text Format" for the C++ version
-// of Protocol Buffers. lineIndent can be nil if no additional line indent is
-// needed. The comments provide the names according to the ObjC library, they
-// most likely won't exactly match the original .proto file.
+/// Generates a string that should be a valid "Text Format" for the C++ version
+/// of Protocol Buffers.
+///
+///  @param message    The message to generate from.
+///  @param lineIndent A string to use as the prefix for all lines generated. Can
+///                    be nil if no extra indent is needed.
+///
+/// @return A @c NSString with the Text Format of the message.
 NSString *GPBTextFormatForMessage(GPBMessage *message,
 NSString *GPBTextFormatForMessage(GPBMessage *message,
                                   NSString * __nullable lineIndent);
                                   NSString * __nullable lineIndent);
+
+/// Generates a string that should be a valid "Text Format" for the C++ version
+/// of Protocol Buffers.
+///
+///  @param unknownSet The unknown field set to generate from.
+///  @param lineIndent A string to use as the prefix for all lines generated. Can
+///                    be nil if no extra indent is needed.
+///
+/// @return A @c NSString with the Text Format of the unknown field set.
 NSString *GPBTextFormatForUnknownFieldSet(GPBUnknownFieldSet * __nullable unknownSet,
 NSString *GPBTextFormatForUnknownFieldSet(GPBUnknownFieldSet * __nullable unknownSet,
                                           NSString * __nullable lineIndent);
                                           NSString * __nullable lineIndent);
 
 
-//
-// Test if the given field is set on a message.
-//
+/// Test if the given field is set on a message.
 BOOL GPBMessageHasFieldNumberSet(GPBMessage *self, uint32_t fieldNumber);
 BOOL GPBMessageHasFieldNumberSet(GPBMessage *self, uint32_t fieldNumber);
+/// Test if the given field is set on a message.
 BOOL GPBMessageHasFieldSet(GPBMessage *self, GPBFieldDescriptor *field);
 BOOL GPBMessageHasFieldSet(GPBMessage *self, GPBFieldDescriptor *field);
 
 
-//
-// Clear the given field of a message.
-//
+/// Clear the given field of a message.
 void GPBClearMessageField(GPBMessage *self, GPBFieldDescriptor *field);
 void GPBClearMessageField(GPBMessage *self, GPBFieldDescriptor *field);
 
 
 //%PDDM-EXPAND GPB_ACCESSORS()
 //%PDDM-EXPAND GPB_ACCESSORS()
@@ -68,60 +78,100 @@ void GPBClearMessageField(GPBMessage *self, GPBFieldDescriptor *field);
 
 
 // Single Fields
 // Single Fields
 
 
+/// Gets the value of a bytes field.
 NSData *GPBGetMessageBytesField(GPBMessage *self, GPBFieldDescriptor *field);
 NSData *GPBGetMessageBytesField(GPBMessage *self, GPBFieldDescriptor *field);
+/// Sets the value of a bytes field.
 void GPBSetMessageBytesField(GPBMessage *self, GPBFieldDescriptor *field, NSData *value);
 void GPBSetMessageBytesField(GPBMessage *self, GPBFieldDescriptor *field, NSData *value);
 
 
+/// Gets the value of a string field.
 NSString *GPBGetMessageStringField(GPBMessage *self, GPBFieldDescriptor *field);
 NSString *GPBGetMessageStringField(GPBMessage *self, GPBFieldDescriptor *field);
+/// Sets the value of a string field.
 void GPBSetMessageStringField(GPBMessage *self, GPBFieldDescriptor *field, NSString *value);
 void GPBSetMessageStringField(GPBMessage *self, GPBFieldDescriptor *field, NSString *value);
 
 
+/// Gets the value of a message field.
 GPBMessage *GPBGetMessageMessageField(GPBMessage *self, GPBFieldDescriptor *field);
 GPBMessage *GPBGetMessageMessageField(GPBMessage *self, GPBFieldDescriptor *field);
+/// Sets the value of a message field.
 void GPBSetMessageMessageField(GPBMessage *self, GPBFieldDescriptor *field, GPBMessage *value);
 void GPBSetMessageMessageField(GPBMessage *self, GPBFieldDescriptor *field, GPBMessage *value);
 
 
+/// Gets the value of a group field.
 GPBMessage *GPBGetMessageGroupField(GPBMessage *self, GPBFieldDescriptor *field);
 GPBMessage *GPBGetMessageGroupField(GPBMessage *self, GPBFieldDescriptor *field);
+/// Sets the value of a group field.
 void GPBSetMessageGroupField(GPBMessage *self, GPBFieldDescriptor *field, GPBMessage *value);
 void GPBSetMessageGroupField(GPBMessage *self, GPBFieldDescriptor *field, GPBMessage *value);
 
 
+/// Gets the value of a bool field.
 BOOL GPBGetMessageBoolField(GPBMessage *self, GPBFieldDescriptor *field);
 BOOL GPBGetMessageBoolField(GPBMessage *self, GPBFieldDescriptor *field);
+/// Sets the value of a bool field.
 void GPBSetMessageBoolField(GPBMessage *self, GPBFieldDescriptor *field, BOOL value);
 void GPBSetMessageBoolField(GPBMessage *self, GPBFieldDescriptor *field, BOOL value);
 
 
+/// Gets the value of an int32 field.
 int32_t GPBGetMessageInt32Field(GPBMessage *self, GPBFieldDescriptor *field);
 int32_t GPBGetMessageInt32Field(GPBMessage *self, GPBFieldDescriptor *field);
+/// Sets the value of an int32 field.
 void GPBSetMessageInt32Field(GPBMessage *self, GPBFieldDescriptor *field, int32_t value);
 void GPBSetMessageInt32Field(GPBMessage *self, GPBFieldDescriptor *field, int32_t value);
 
 
+/// Gets the value of an uint32 field.
 uint32_t GPBGetMessageUInt32Field(GPBMessage *self, GPBFieldDescriptor *field);
 uint32_t GPBGetMessageUInt32Field(GPBMessage *self, GPBFieldDescriptor *field);
+/// Sets the value of an uint32 field.
 void GPBSetMessageUInt32Field(GPBMessage *self, GPBFieldDescriptor *field, uint32_t value);
 void GPBSetMessageUInt32Field(GPBMessage *self, GPBFieldDescriptor *field, uint32_t value);
 
 
+/// Gets the value of an int64 field.
 int64_t GPBGetMessageInt64Field(GPBMessage *self, GPBFieldDescriptor *field);
 int64_t GPBGetMessageInt64Field(GPBMessage *self, GPBFieldDescriptor *field);
+/// Sets the value of an int64 field.
 void GPBSetMessageInt64Field(GPBMessage *self, GPBFieldDescriptor *field, int64_t value);
 void GPBSetMessageInt64Field(GPBMessage *self, GPBFieldDescriptor *field, int64_t value);
 
 
+/// Gets the value of an uint64 field.
 uint64_t GPBGetMessageUInt64Field(GPBMessage *self, GPBFieldDescriptor *field);
 uint64_t GPBGetMessageUInt64Field(GPBMessage *self, GPBFieldDescriptor *field);
+/// Sets the value of an uint64 field.
 void GPBSetMessageUInt64Field(GPBMessage *self, GPBFieldDescriptor *field, uint64_t value);
 void GPBSetMessageUInt64Field(GPBMessage *self, GPBFieldDescriptor *field, uint64_t value);
 
 
+/// Gets the value of a float field.
 float GPBGetMessageFloatField(GPBMessage *self, GPBFieldDescriptor *field);
 float GPBGetMessageFloatField(GPBMessage *self, GPBFieldDescriptor *field);
+/// Sets the value of a float field.
 void GPBSetMessageFloatField(GPBMessage *self, GPBFieldDescriptor *field, float value);
 void GPBSetMessageFloatField(GPBMessage *self, GPBFieldDescriptor *field, float value);
 
 
+/// Gets the value of a double field.
 double GPBGetMessageDoubleField(GPBMessage *self, GPBFieldDescriptor *field);
 double GPBGetMessageDoubleField(GPBMessage *self, GPBFieldDescriptor *field);
+/// Sets the value of a double field.
 void GPBSetMessageDoubleField(GPBMessage *self, GPBFieldDescriptor *field, double value);
 void GPBSetMessageDoubleField(GPBMessage *self, GPBFieldDescriptor *field, double value);
 
 
-// Get/Set the given enum field of a message.  You can only Set values that are
-// members of the enum.  For proto3, when doing a Get, if the value isn't a
-// memeber of the enum, kGPBUnrecognizedEnumeratorValue will be returned. The
-// the functions with "Raw" in the will bypass all checks.
+/// Get the given enum field of a message. For proto3, if the value isn't a
+/// member of the enum, @c kGPBUnrecognizedEnumeratorValue will be returned.
+/// GPBGetMessageRawEnumField will bypass the check and return whatever value
+/// was set.
 int32_t GPBGetMessageEnumField(GPBMessage *self, GPBFieldDescriptor *field);
 int32_t GPBGetMessageEnumField(GPBMessage *self, GPBFieldDescriptor *field);
+/// Set the given enum field of a message. You can only set values that are
+/// members of the enum.
 void GPBSetMessageEnumField(GPBMessage *self, GPBFieldDescriptor *field, int32_t value);
 void GPBSetMessageEnumField(GPBMessage *self, GPBFieldDescriptor *field, int32_t value);
+/// Get the given enum field of a message. No check is done to ensure the value
+/// was defined in the enum.
 int32_t GPBGetMessageRawEnumField(GPBMessage *self, GPBFieldDescriptor *field);
 int32_t GPBGetMessageRawEnumField(GPBMessage *self, GPBFieldDescriptor *field);
+/// Set the given enum field of a message. You can set the value to anything,
+/// even a value that is not a member of the enum.
 void GPBSetMessageRawEnumField(GPBMessage *self, GPBFieldDescriptor *field, int32_t value);
 void GPBSetMessageRawEnumField(GPBMessage *self, GPBFieldDescriptor *field, int32_t value);
 
 
 // Repeated Fields
 // Repeated Fields
 
 
-// The object will/should be GPB*Array or NSMutableArray based on the field's
-// type.
+/// Gets the value of a repeated field.
+///
+/// The result will be @c GPB*Array or @c NSMutableArray based on the
+/// field's type.
 id GPBGetMessageRepeatedField(GPBMessage *self, GPBFieldDescriptor *field);
 id GPBGetMessageRepeatedField(GPBMessage *self, GPBFieldDescriptor *field);
+/// Sets the value of a repeated field.
+///
+/// The value should be @c GPB*Array or @c NSMutableArray based on the
+/// field's type.
 void GPBSetMessageRepeatedField(GPBMessage *self, GPBFieldDescriptor *field, id array);
 void GPBSetMessageRepeatedField(GPBMessage *self, GPBFieldDescriptor *field, id array);
 
 
 // Map Fields
 // Map Fields
 
 
-// The object will/should be GPB*Dictionary or NSMutableDictionary based on the
-// field's type.
+/// Gets the value of a map<> field.
+///
+/// The result will be @c GPB*Dictionary or @c NSMutableDictionary based on
+/// the field's type.
 id GPBGetMessageMapField(GPBMessage *self, GPBFieldDescriptor *field);
 id GPBGetMessageMapField(GPBMessage *self, GPBFieldDescriptor *field);
+/// Sets the value of a map<> field.
+///
+/// The object should be @c GPB*Dictionary or @c NSMutableDictionary based
+/// on the field's type.
 void GPBSetMessageMapField(GPBMessage *self, GPBFieldDescriptor *field, id dictionary);
 void GPBSetMessageMapField(GPBMessage *self, GPBFieldDescriptor *field, id dictionary);
 
 
 //%PDDM-EXPAND-END GPB_ACCESSORS()
 //%PDDM-EXPAND-END GPB_ACCESSORS()
@@ -144,44 +194,64 @@ CF_EXTERN_C_END
 //%
 //%
 //%// Single Fields
 //%// Single Fields
 //%
 //%
-//%GPB_ACCESSOR_SINGLE_FULL(Bytes, NSData, *)
-//%GPB_ACCESSOR_SINGLE_FULL(String, NSString, *)
-//%GPB_ACCESSOR_SINGLE_FULL(Message, GPBMessage, *)
-//%GPB_ACCESSOR_SINGLE_FULL(Group, GPBMessage, *)
-//%GPB_ACCESSOR_SINGLE(Bool, BOOL)
-//%GPB_ACCESSOR_SINGLE(Int32, int32_t)
-//%GPB_ACCESSOR_SINGLE(UInt32, uint32_t)
-//%GPB_ACCESSOR_SINGLE(Int64, int64_t)
-//%GPB_ACCESSOR_SINGLE(UInt64, uint64_t)
-//%GPB_ACCESSOR_SINGLE(Float, float)
-//%GPB_ACCESSOR_SINGLE(Double, double)
-//%// Get/Set the given enum field of a message.  You can only Set values that are
-//%// members of the enum.  For proto3, when doing a Get, if the value isn't a
-//%// memeber of the enum, kGPBUnrecognizedEnumeratorValue will be returned. The
-//%// the functions with "Raw" in the will bypass all checks.
+//%GPB_ACCESSOR_SINGLE_FULL(Bytes, NSData, , *)
+//%GPB_ACCESSOR_SINGLE_FULL(String, NSString, , *)
+//%GPB_ACCESSOR_SINGLE_FULL(Message, GPBMessage, , *)
+//%GPB_ACCESSOR_SINGLE_FULL(Group, GPBMessage, , *)
+//%GPB_ACCESSOR_SINGLE(Bool, BOOL, )
+//%GPB_ACCESSOR_SINGLE(Int32, int32_t, n)
+//%GPB_ACCESSOR_SINGLE(UInt32, uint32_t, n)
+//%GPB_ACCESSOR_SINGLE(Int64, int64_t, n)
+//%GPB_ACCESSOR_SINGLE(UInt64, uint64_t, n)
+//%GPB_ACCESSOR_SINGLE(Float, float, )
+//%GPB_ACCESSOR_SINGLE(Double, double, )
+//%/// Get the given enum field of a message. For proto3, if the value isn't a
+//%/// member of the enum, @c kGPBUnrecognizedEnumeratorValue will be returned.
+//%/// GPBGetMessageRawEnumField will bypass the check and return whatever value
+//%/// was set.
 //%int32_t GPBGetMessageEnumField(GPBMessage *self, GPBFieldDescriptor *field);
 //%int32_t GPBGetMessageEnumField(GPBMessage *self, GPBFieldDescriptor *field);
+//%/// Set the given enum field of a message. You can only set values that are
+//%/// members of the enum.
 //%void GPBSetMessageEnumField(GPBMessage *self, GPBFieldDescriptor *field, int32_t value);
 //%void GPBSetMessageEnumField(GPBMessage *self, GPBFieldDescriptor *field, int32_t value);
+//%/// Get the given enum field of a message. No check is done to ensure the value
+//%/// was defined in the enum.
 //%int32_t GPBGetMessageRawEnumField(GPBMessage *self, GPBFieldDescriptor *field);
 //%int32_t GPBGetMessageRawEnumField(GPBMessage *self, GPBFieldDescriptor *field);
+//%/// Set the given enum field of a message. You can set the value to anything,
+//%/// even a value that is not a member of the enum.
 //%void GPBSetMessageRawEnumField(GPBMessage *self, GPBFieldDescriptor *field, int32_t value);
 //%void GPBSetMessageRawEnumField(GPBMessage *self, GPBFieldDescriptor *field, int32_t value);
 //%
 //%
 //%// Repeated Fields
 //%// Repeated Fields
 //%
 //%
-//%// The object will/should be GPB*Array or NSMutableArray based on the field's
-//%// type.
+//%/// Gets the value of a repeated field.
+//%///
+//%/// The result will be @c GPB*Array or @c NSMutableArray based on the
+//%/// field's type.
 //%id GPBGetMessageRepeatedField(GPBMessage *self, GPBFieldDescriptor *field);
 //%id GPBGetMessageRepeatedField(GPBMessage *self, GPBFieldDescriptor *field);
+//%/// Sets the value of a repeated field.
+//%///
+//%/// The value should be @c GPB*Array or @c NSMutableArray based on the
+//%/// field's type.
 //%void GPBSetMessageRepeatedField(GPBMessage *self, GPBFieldDescriptor *field, id array);
 //%void GPBSetMessageRepeatedField(GPBMessage *self, GPBFieldDescriptor *field, id array);
 //%
 //%
 //%// Map Fields
 //%// Map Fields
 //%
 //%
-//%// The object will/should be GPB*Dictionary or NSMutableDictionary based on the
-//%// field's type.
+//%/// Gets the value of a map<> field.
+//%///
+//%/// The result will be @c GPB*Dictionary or @c NSMutableDictionary based on
+//%/// the field's type.
 //%id GPBGetMessageMapField(GPBMessage *self, GPBFieldDescriptor *field);
 //%id GPBGetMessageMapField(GPBMessage *self, GPBFieldDescriptor *field);
+//%/// Sets the value of a map<> field.
+//%///
+//%/// The object should be @c GPB*Dictionary or @c NSMutableDictionary based
+//%/// on the field's type.
 //%void GPBSetMessageMapField(GPBMessage *self, GPBFieldDescriptor *field, id dictionary);
 //%void GPBSetMessageMapField(GPBMessage *self, GPBFieldDescriptor *field, id dictionary);
 //%
 //%
 
 
-//%PDDM-DEFINE GPB_ACCESSOR_SINGLE(NAME, TYPE)
-//%GPB_ACCESSOR_SINGLE_FULL(NAME, TYPE, )
-//%PDDM-DEFINE GPB_ACCESSOR_SINGLE_FULL(NAME, TYPE, TisP)
+//%PDDM-DEFINE GPB_ACCESSOR_SINGLE(NAME, TYPE, AN)
+//%GPB_ACCESSOR_SINGLE_FULL(NAME, TYPE, AN, )
+//%PDDM-DEFINE GPB_ACCESSOR_SINGLE_FULL(NAME, TYPE, AN, TisP)
+//%/// Gets the value of a##AN NAME$L field.
 //%TYPE TisP##GPBGetMessage##NAME##Field(GPBMessage *self, GPBFieldDescriptor *field);
 //%TYPE TisP##GPBGetMessage##NAME##Field(GPBMessage *self, GPBFieldDescriptor *field);
+//%/// Sets the value of a##AN NAME$L field.
 //%void GPBSetMessage##NAME##Field(GPBMessage *self, GPBFieldDescriptor *field, TYPE TisP##value);
 //%void GPBSetMessage##NAME##Field(GPBMessage *self, GPBFieldDescriptor *field, TYPE TisP##value);
 //%
 //%

+ 36 - 29
objectivec/GPBUtilities.m

@@ -145,9 +145,8 @@ void GPBSetHasIvar(GPBMessage *self, int32_t idx, uint32_t fieldNumber,
 }
 }
 
 
 void GPBMaybeClearOneof(GPBMessage *self, GPBOneofDescriptor *oneof,
 void GPBMaybeClearOneof(GPBMessage *self, GPBOneofDescriptor *oneof,
-                        uint32_t fieldNumberNotToClear) {
-  int32_t hasIndex = oneof->oneofDescription_->index;
-  uint32_t fieldNumberSet = GPBGetHasOneof(self, hasIndex);
+                        int32_t oneofHasIndex, uint32_t fieldNumberNotToClear) {
+  uint32_t fieldNumberSet = GPBGetHasOneof(self, oneofHasIndex);
   if ((fieldNumberSet == fieldNumberNotToClear) || (fieldNumberSet == 0)) {
   if ((fieldNumberSet == fieldNumberNotToClear) || (fieldNumberSet == 0)) {
     // Do nothing/nothing set in the oneof.
     // Do nothing/nothing set in the oneof.
     return;
     return;
@@ -168,7 +167,7 @@ void GPBMaybeClearOneof(GPBMessage *self, GPBOneofDescriptor *oneof,
 
 
   // Set to nothing stored in the oneof.
   // Set to nothing stored in the oneof.
   // (field number doesn't matter since setting to nothing).
   // (field number doesn't matter since setting to nothing).
-  GPBSetHasIvar(self, hasIndex, 1, NO);
+  GPBSetHasIvar(self, oneofHasIndex, 1, NO);
 }
 }
 
 
 #pragma mark - IVar accessors
 #pragma mark - IVar accessors
@@ -200,7 +199,8 @@ void GPBMaybeClearOneof(GPBMessage *self, GPBOneofDescriptor *oneof,
 //%            NAME$S                     GPBFileSyntax syntax) {
 //%            NAME$S                     GPBFileSyntax syntax) {
 //%  GPBOneofDescriptor *oneof = field->containingOneof_;
 //%  GPBOneofDescriptor *oneof = field->containingOneof_;
 //%  if (oneof) {
 //%  if (oneof) {
-//%    GPBMaybeClearOneof(self, oneof, GPBFieldNumber(field));
+//%    GPBMessageFieldDescription *fieldDesc = field->description_;
+//%    GPBMaybeClearOneof(self, oneof, fieldDesc->hasIndex, fieldDesc->number);
 //%  }
 //%  }
 //%  NSCAssert(self->messageStorage_ != NULL,
 //%  NSCAssert(self->messageStorage_ != NULL,
 //%            @"%@: All messages should have storage (from init)",
 //%            @"%@: All messages should have storage (from init)",
@@ -321,7 +321,8 @@ void GPBSetRetainedObjectIvarWithFieldInternal(GPBMessage *self,
     // oneof.
     // oneof.
     GPBOneofDescriptor *oneof = field->containingOneof_;
     GPBOneofDescriptor *oneof = field->containingOneof_;
     if (oneof) {
     if (oneof) {
-      GPBMaybeClearOneof(self, oneof, GPBFieldNumber(field));
+      GPBMessageFieldDescription *fieldDesc = field->description_;
+      GPBMaybeClearOneof(self, oneof, fieldDesc->hasIndex, fieldDesc->number);
     }
     }
     // Clear "has" if they are being set to nil.
     // Clear "has" if they are being set to nil.
     BOOL setHasValue = (value != nil);
     BOOL setHasValue = (value != nil);
@@ -411,6 +412,7 @@ id GPBGetObjectIvarWithField(GPBMessage *self, GPBFieldDescriptor *field) {
     return field.defaultValue.valueMessage;
     return field.defaultValue.valueMessage;
   }
   }
 
 
+  GPBPrepareReadOnlySemaphore(self);
   dispatch_semaphore_wait(self->readOnlySemaphore_, DISPATCH_TIME_FOREVER);
   dispatch_semaphore_wait(self->readOnlySemaphore_, DISPATCH_TIME_FOREVER);
   GPBMessage *result = GPBGetObjectIvarWithFieldNoAutocreate(self, field);
   GPBMessage *result = GPBGetObjectIvarWithFieldNoAutocreate(self, field);
   if (!result) {
   if (!result) {
@@ -476,15 +478,15 @@ void GPBSetMessageRawEnumField(GPBMessage *self, GPBFieldDescriptor *field,
   GPBSetInt32IvarWithFieldInternal(self, field, value, syntax);
   GPBSetInt32IvarWithFieldInternal(self, field, value, syntax);
 }
 }
 
 
-//%PDDM-EXPAND IVAR_POD_ACCESSORS_DEFN(Bool, BOOL)
-// This block of code is generated, do not edit it directly.
-
 BOOL GPBGetMessageBoolField(GPBMessage *self,
 BOOL GPBGetMessageBoolField(GPBMessage *self,
                             GPBFieldDescriptor *field) {
                             GPBFieldDescriptor *field) {
   if (GPBGetHasIvarField(self, field)) {
   if (GPBGetHasIvarField(self, field)) {
-    uint8_t *storage = (uint8_t *)self->messageStorage_;
-    BOOL *typePtr = (BOOL *)&storage[field->description_->offset];
-    return *typePtr;
+    // Bools are stored in the has bits to avoid needing explicit space in the
+    // storage structure.
+    // (the field number passed to the HasIvar helper doesn't really matter
+    // since the offset is never negative)
+    GPBMessageFieldDescription *fieldDesc = field->description_;
+    return GPBGetHasIvar(self, (int32_t)(fieldDesc->offset), fieldDesc->number);
   } else {
   } else {
     return field.defaultValue.valueBool;
     return field.defaultValue.valueBool;
   }
   }
@@ -503,19 +505,18 @@ void GPBSetBoolIvarWithFieldInternal(GPBMessage *self,
                                      GPBFieldDescriptor *field,
                                      GPBFieldDescriptor *field,
                                      BOOL value,
                                      BOOL value,
                                      GPBFileSyntax syntax) {
                                      GPBFileSyntax syntax) {
+  GPBMessageFieldDescription *fieldDesc = field->description_;
   GPBOneofDescriptor *oneof = field->containingOneof_;
   GPBOneofDescriptor *oneof = field->containingOneof_;
   if (oneof) {
   if (oneof) {
-    GPBMaybeClearOneof(self, oneof, GPBFieldNumber(field));
+    GPBMaybeClearOneof(self, oneof, fieldDesc->hasIndex, fieldDesc->number);
   }
   }
-  NSCAssert(self->messageStorage_ != NULL,
-            @"%@: All messages should have storage (from init)",
-            [self class]);
-#if defined(__clang_analyzer__)
-  if (self->messageStorage_ == NULL) return;
-#endif
-  uint8_t *storage = (uint8_t *)self->messageStorage_;
-  BOOL *typePtr = (BOOL *)&storage[field->description_->offset];
-  *typePtr = value;
+
+  // Bools are stored in the has bits to avoid needing explicit space in the
+  // storage structure.
+  // (the field number passed to the HasIvar helper doesn't really matter since
+  // the offset is never negative)
+  GPBSetHasIvar(self, (int32_t)(fieldDesc->offset), fieldDesc->number, value);
+
   // proto2: any value counts as having been set; proto3, it
   // proto2: any value counts as having been set; proto3, it
   // has to be a non zero value.
   // has to be a non zero value.
   BOOL hasValue =
   BOOL hasValue =
@@ -553,7 +554,8 @@ void GPBSetInt32IvarWithFieldInternal(GPBMessage *self,
                                       GPBFileSyntax syntax) {
                                       GPBFileSyntax syntax) {
   GPBOneofDescriptor *oneof = field->containingOneof_;
   GPBOneofDescriptor *oneof = field->containingOneof_;
   if (oneof) {
   if (oneof) {
-    GPBMaybeClearOneof(self, oneof, GPBFieldNumber(field));
+    GPBMessageFieldDescription *fieldDesc = field->description_;
+    GPBMaybeClearOneof(self, oneof, fieldDesc->hasIndex, fieldDesc->number);
   }
   }
   NSCAssert(self->messageStorage_ != NULL,
   NSCAssert(self->messageStorage_ != NULL,
             @"%@: All messages should have storage (from init)",
             @"%@: All messages should have storage (from init)",
@@ -601,7 +603,8 @@ void GPBSetUInt32IvarWithFieldInternal(GPBMessage *self,
                                        GPBFileSyntax syntax) {
                                        GPBFileSyntax syntax) {
   GPBOneofDescriptor *oneof = field->containingOneof_;
   GPBOneofDescriptor *oneof = field->containingOneof_;
   if (oneof) {
   if (oneof) {
-    GPBMaybeClearOneof(self, oneof, GPBFieldNumber(field));
+    GPBMessageFieldDescription *fieldDesc = field->description_;
+    GPBMaybeClearOneof(self, oneof, fieldDesc->hasIndex, fieldDesc->number);
   }
   }
   NSCAssert(self->messageStorage_ != NULL,
   NSCAssert(self->messageStorage_ != NULL,
             @"%@: All messages should have storage (from init)",
             @"%@: All messages should have storage (from init)",
@@ -649,7 +652,8 @@ void GPBSetInt64IvarWithFieldInternal(GPBMessage *self,
                                       GPBFileSyntax syntax) {
                                       GPBFileSyntax syntax) {
   GPBOneofDescriptor *oneof = field->containingOneof_;
   GPBOneofDescriptor *oneof = field->containingOneof_;
   if (oneof) {
   if (oneof) {
-    GPBMaybeClearOneof(self, oneof, GPBFieldNumber(field));
+    GPBMessageFieldDescription *fieldDesc = field->description_;
+    GPBMaybeClearOneof(self, oneof, fieldDesc->hasIndex, fieldDesc->number);
   }
   }
   NSCAssert(self->messageStorage_ != NULL,
   NSCAssert(self->messageStorage_ != NULL,
             @"%@: All messages should have storage (from init)",
             @"%@: All messages should have storage (from init)",
@@ -697,7 +701,8 @@ void GPBSetUInt64IvarWithFieldInternal(GPBMessage *self,
                                        GPBFileSyntax syntax) {
                                        GPBFileSyntax syntax) {
   GPBOneofDescriptor *oneof = field->containingOneof_;
   GPBOneofDescriptor *oneof = field->containingOneof_;
   if (oneof) {
   if (oneof) {
-    GPBMaybeClearOneof(self, oneof, GPBFieldNumber(field));
+    GPBMessageFieldDescription *fieldDesc = field->description_;
+    GPBMaybeClearOneof(self, oneof, fieldDesc->hasIndex, fieldDesc->number);
   }
   }
   NSCAssert(self->messageStorage_ != NULL,
   NSCAssert(self->messageStorage_ != NULL,
             @"%@: All messages should have storage (from init)",
             @"%@: All messages should have storage (from init)",
@@ -745,7 +750,8 @@ void GPBSetFloatIvarWithFieldInternal(GPBMessage *self,
                                       GPBFileSyntax syntax) {
                                       GPBFileSyntax syntax) {
   GPBOneofDescriptor *oneof = field->containingOneof_;
   GPBOneofDescriptor *oneof = field->containingOneof_;
   if (oneof) {
   if (oneof) {
-    GPBMaybeClearOneof(self, oneof, GPBFieldNumber(field));
+    GPBMessageFieldDescription *fieldDesc = field->description_;
+    GPBMaybeClearOneof(self, oneof, fieldDesc->hasIndex, fieldDesc->number);
   }
   }
   NSCAssert(self->messageStorage_ != NULL,
   NSCAssert(self->messageStorage_ != NULL,
             @"%@: All messages should have storage (from init)",
             @"%@: All messages should have storage (from init)",
@@ -793,7 +799,8 @@ void GPBSetDoubleIvarWithFieldInternal(GPBMessage *self,
                                        GPBFileSyntax syntax) {
                                        GPBFileSyntax syntax) {
   GPBOneofDescriptor *oneof = field->containingOneof_;
   GPBOneofDescriptor *oneof = field->containingOneof_;
   if (oneof) {
   if (oneof) {
-    GPBMaybeClearOneof(self, oneof, GPBFieldNumber(field));
+    GPBMessageFieldDescription *fieldDesc = field->description_;
+    GPBMaybeClearOneof(self, oneof, fieldDesc->hasIndex, fieldDesc->number);
   }
   }
   NSCAssert(self->messageStorage_ != NULL,
   NSCAssert(self->messageStorage_ != NULL,
             @"%@: All messages should have storage (from init)",
             @"%@: All messages should have storage (from init)",
@@ -812,7 +819,7 @@ void GPBSetDoubleIvarWithFieldInternal(GPBMessage *self,
   GPBBecomeVisibleToAutocreator(self);
   GPBBecomeVisibleToAutocreator(self);
 }
 }
 
 
-//%PDDM-EXPAND-END (7 expansions)
+//%PDDM-EXPAND-END (6 expansions)
 
 
 // Aliases are function calls that are virtually the same.
 // Aliases are function calls that are virtually the same.
 
 

+ 1 - 1
objectivec/GPBUtilities_PackagePrivate.h

@@ -185,7 +185,7 @@ GPB_INLINE void GPBSetHasIvarField(GPBMessage *self, GPBFieldDescriptor *field,
 }
 }
 
 
 void GPBMaybeClearOneof(GPBMessage *self, GPBOneofDescriptor *oneof,
 void GPBMaybeClearOneof(GPBMessage *self, GPBOneofDescriptor *oneof,
-                        uint32_t fieldNumberNotToClear);
+                        int32_t oneofHasIndex, uint32_t fieldNumberNotToClear);
 
 
 //%PDDM-DEFINE GPB_IVAR_SET_DECL(NAME, TYPE)
 //%PDDM-DEFINE GPB_IVAR_SET_DECL(NAME, TYPE)
 //%void GPBSet##NAME##IvarWithFieldInternal(GPBMessage *self,
 //%void GPBSet##NAME##IvarWithFieldInternal(GPBMessage *self,

+ 3 - 11
objectivec/ProtocolBuffers_OSX.xcodeproj/project.pbxproj

@@ -7,7 +7,6 @@
 	objects = {
 	objects = {
 
 
 /* Begin PBXBuildFile section */
 /* Begin PBXBuildFile section */
-		2CFB390415C718CE00CBF84D /* Descriptor.pbobjc.m in Sources */ = {isa = PBXBuildFile; fileRef = 8BD3982214BE5B0C0081D629 /* Descriptor.pbobjc.m */; };
 		5102DABC1891A073002037B6 /* GPBConcurrencyTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 5102DABB1891A052002037B6 /* GPBConcurrencyTests.m */; };
 		5102DABC1891A073002037B6 /* GPBConcurrencyTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 5102DABB1891A052002037B6 /* GPBConcurrencyTests.m */; };
 		7461B5360F94FB4600A0C422 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1D30AB110D05D00D00671497 /* Foundation.framework */; };
 		7461B5360F94FB4600A0C422 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1D30AB110D05D00D00671497 /* Foundation.framework */; };
 		7461B53C0F94FB4E00A0C422 /* GPBCodedInputStream.m in Sources */ = {isa = PBXBuildFile; fileRef = 7461B48F0F94F99000A0C422 /* GPBCodedInputStream.m */; };
 		7461B53C0F94FB4E00A0C422 /* GPBCodedInputStream.m in Sources */ = {isa = PBXBuildFile; fileRef = 7461B48F0F94F99000A0C422 /* GPBCodedInputStream.m */; };
@@ -27,7 +26,6 @@
 		8B79657D14992E3F002FFBFC /* GPBRootObject.m in Sources */ = {isa = PBXBuildFile; fileRef = 8B79657914992E3E002FFBFC /* GPBRootObject.m */; };
 		8B79657D14992E3F002FFBFC /* GPBRootObject.m in Sources */ = {isa = PBXBuildFile; fileRef = 8B79657914992E3E002FFBFC /* GPBRootObject.m */; };
 		8B8B615D17DF7056002EE618 /* GPBARCUnittestProtos.m in Sources */ = {isa = PBXBuildFile; fileRef = 8B8B615C17DF7056002EE618 /* GPBARCUnittestProtos.m */; settings = {COMPILER_FLAGS = "-fobjc-arc"; }; };
 		8B8B615D17DF7056002EE618 /* GPBARCUnittestProtos.m in Sources */ = {isa = PBXBuildFile; fileRef = 8B8B615C17DF7056002EE618 /* GPBARCUnittestProtos.m */; settings = {COMPILER_FLAGS = "-fobjc-arc"; }; };
 		8B96157414C8C38C00A2AC0B /* GPBDescriptor.m in Sources */ = {isa = PBXBuildFile; fileRef = 8B96157314C8C38C00A2AC0B /* GPBDescriptor.m */; };
 		8B96157414C8C38C00A2AC0B /* GPBDescriptor.m in Sources */ = {isa = PBXBuildFile; fileRef = 8B96157314C8C38C00A2AC0B /* GPBDescriptor.m */; };
-		8B96157514CA019D00A2AC0B /* Descriptor.pbobjc.m in Sources */ = {isa = PBXBuildFile; fileRef = 8BD3982214BE5B0C0081D629 /* Descriptor.pbobjc.m */; };
 		8BBEA4A9147C727D00C4ADB7 /* GPBCodedInputStreamTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 7461B69B0F94FDF800A0C422 /* GPBCodedInputStreamTests.m */; };
 		8BBEA4A9147C727D00C4ADB7 /* GPBCodedInputStreamTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 7461B69B0F94FDF800A0C422 /* GPBCodedInputStreamTests.m */; };
 		8BBEA4AA147C727D00C4ADB7 /* GPBCodedOuputStreamTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 7461B69D0F94FDF800A0C422 /* GPBCodedOuputStreamTests.m */; };
 		8BBEA4AA147C727D00C4ADB7 /* GPBCodedOuputStreamTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 7461B69D0F94FDF800A0C422 /* GPBCodedOuputStreamTests.m */; };
 		8BBEA4AC147C727D00C4ADB7 /* GPBMessageTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 7461B6A30F94FDF800A0C422 /* GPBMessageTests.m */; };
 		8BBEA4AC147C727D00C4ADB7 /* GPBMessageTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 7461B6A30F94FDF800A0C422 /* GPBMessageTests.m */; };
@@ -140,10 +138,8 @@
 		8B4248D51A92826400BC1EC6 /* Timestamp.pbobjc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Timestamp.pbobjc.h; path = google/protobuf/Timestamp.pbobjc.h; sourceTree = "<group>"; };
 		8B4248D51A92826400BC1EC6 /* Timestamp.pbobjc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Timestamp.pbobjc.h; path = google/protobuf/Timestamp.pbobjc.h; sourceTree = "<group>"; };
 		8B4248D61A92826400BC1EC6 /* Timestamp.pbobjc.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Timestamp.pbobjc.m; path = google/protobuf/Timestamp.pbobjc.m; sourceTree = "<group>"; };
 		8B4248D61A92826400BC1EC6 /* Timestamp.pbobjc.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Timestamp.pbobjc.m; path = google/protobuf/Timestamp.pbobjc.m; sourceTree = "<group>"; };
 		8B4248DB1A92933A00BC1EC6 /* GPBWellKnownTypesTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GPBWellKnownTypesTest.m; sourceTree = "<group>"; };
 		8B4248DB1A92933A00BC1EC6 /* GPBWellKnownTypesTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GPBWellKnownTypesTest.m; sourceTree = "<group>"; };
-		8B42494B1A92A16600BC1EC6 /* descriptor.proto */ = {isa = PBXFileReference; lastKnownFileType = text; name = descriptor.proto; path = ../src/google/protobuf/descriptor.proto; sourceTree = "<group>"; };
 		8B42494C1A92A16600BC1EC6 /* duration.proto */ = {isa = PBXFileReference; lastKnownFileType = text; name = duration.proto; path = ../src/google/protobuf/duration.proto; sourceTree = "<group>"; };
 		8B42494C1A92A16600BC1EC6 /* duration.proto */ = {isa = PBXFileReference; lastKnownFileType = text; name = duration.proto; path = ../src/google/protobuf/duration.proto; sourceTree = "<group>"; };
 		8B42494D1A92A16600BC1EC6 /* timestamp.proto */ = {isa = PBXFileReference; lastKnownFileType = text; name = timestamp.proto; path = ../src/google/protobuf/timestamp.proto; sourceTree = "<group>"; };
 		8B42494D1A92A16600BC1EC6 /* timestamp.proto */ = {isa = PBXFileReference; lastKnownFileType = text; name = timestamp.proto; path = ../src/google/protobuf/timestamp.proto; sourceTree = "<group>"; };
-		8B54585814DCC34E003D7338 /* Descriptor.pbobjc.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Descriptor.pbobjc.h; path = google/protobuf/Descriptor.pbobjc.h; sourceTree = SOURCE_ROOT; };
 		8B79657814992E3E002FFBFC /* GPBRootObject.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GPBRootObject.h; sourceTree = "<group>"; };
 		8B79657814992E3E002FFBFC /* GPBRootObject.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GPBRootObject.h; sourceTree = "<group>"; };
 		8B79657914992E3E002FFBFC /* GPBRootObject.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GPBRootObject.m; sourceTree = "<group>"; };
 		8B79657914992E3E002FFBFC /* GPBRootObject.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GPBRootObject.m; sourceTree = "<group>"; };
 		8B7E6A7414893DBA00F8884A /* unittest_custom_options.proto */ = {isa = PBXFileReference; lastKnownFileType = text; name = unittest_custom_options.proto; path = ../../src/google/protobuf/unittest_custom_options.proto; sourceTree = "<group>"; };
 		8B7E6A7414893DBA00F8884A /* unittest_custom_options.proto */ = {isa = PBXFileReference; lastKnownFileType = text; name = unittest_custom_options.proto; path = ../../src/google/protobuf/unittest_custom_options.proto; sourceTree = "<group>"; };
@@ -162,7 +158,6 @@
 		8BCF338814ED799900BC5317 /* GPBProtocolBuffers.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = GPBProtocolBuffers.m; sourceTree = "<group>"; };
 		8BCF338814ED799900BC5317 /* GPBProtocolBuffers.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = GPBProtocolBuffers.m; sourceTree = "<group>"; };
 		8BD3981D14BE54220081D629 /* unittest_enormous_descriptor.proto */ = {isa = PBXFileReference; lastKnownFileType = text; name = unittest_enormous_descriptor.proto; path = ../../src/google/protobuf/unittest_enormous_descriptor.proto; sourceTree = "<group>"; };
 		8BD3981D14BE54220081D629 /* unittest_enormous_descriptor.proto */ = {isa = PBXFileReference; lastKnownFileType = text; name = unittest_enormous_descriptor.proto; path = ../../src/google/protobuf/unittest_enormous_descriptor.proto; sourceTree = "<group>"; };
 		8BD3981E14BE59D70081D629 /* GPBUnittestProtos.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GPBUnittestProtos.m; sourceTree = "<group>"; };
 		8BD3981E14BE59D70081D629 /* GPBUnittestProtos.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GPBUnittestProtos.m; sourceTree = "<group>"; };
-		8BD3982214BE5B0C0081D629 /* Descriptor.pbobjc.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Descriptor.pbobjc.m; path = google/protobuf/Descriptor.pbobjc.m; sourceTree = SOURCE_ROOT; };
 		8BEB5AE01498033E0078BF9D /* GPBRuntimeTypes.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GPBRuntimeTypes.h; sourceTree = "<group>"; };
 		8BEB5AE01498033E0078BF9D /* GPBRuntimeTypes.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GPBRuntimeTypes.h; sourceTree = "<group>"; };
 		F401DC2A1A8D444600FCC765 /* GPBArray.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GPBArray.h; sourceTree = "<group>"; };
 		F401DC2A1A8D444600FCC765 /* GPBArray.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GPBArray.h; sourceTree = "<group>"; };
 		F401DC2B1A8D444600FCC765 /* GPBArray.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GPBArray.m; sourceTree = "<group>"; };
 		F401DC2B1A8D444600FCC765 /* GPBArray.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GPBArray.m; sourceTree = "<group>"; };
@@ -188,6 +183,7 @@
 		F4487C7C1AAE06AC00531423 /* GPBUtilities_PackagePrivate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GPBUtilities_PackagePrivate.h; sourceTree = "<group>"; };
 		F4487C7C1AAE06AC00531423 /* GPBUtilities_PackagePrivate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GPBUtilities_PackagePrivate.h; sourceTree = "<group>"; };
 		F4487C7E1AAF62CD00531423 /* GPBMessageTests+Serialization.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "GPBMessageTests+Serialization.m"; sourceTree = "<group>"; };
 		F4487C7E1AAF62CD00531423 /* GPBMessageTests+Serialization.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "GPBMessageTests+Serialization.m"; sourceTree = "<group>"; };
 		F4487C821AAF6AB300531423 /* GPBMessageTests+Merge.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "GPBMessageTests+Merge.m"; sourceTree = "<group>"; };
 		F4487C821AAF6AB300531423 /* GPBMessageTests+Merge.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "GPBMessageTests+Merge.m"; sourceTree = "<group>"; };
+		F44929001C866B1900C2548A /* GPBCodedOutputStream_PackagePrivate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GPBCodedOutputStream_PackagePrivate.h; sourceTree = "<group>"; };
 		F451D3F51A8AAE8700B8A22C /* GPBProtocolBuffers_RuntimeSupport.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GPBProtocolBuffers_RuntimeSupport.h; sourceTree = "<group>"; };
 		F451D3F51A8AAE8700B8A22C /* GPBProtocolBuffers_RuntimeSupport.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GPBProtocolBuffers_RuntimeSupport.h; sourceTree = "<group>"; };
 		F45C69CB16DFD08D0081955B /* GPBExtensionInternals.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GPBExtensionInternals.m; sourceTree = "<group>"; };
 		F45C69CB16DFD08D0081955B /* GPBExtensionInternals.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GPBExtensionInternals.m; sourceTree = "<group>"; };
 		F45E57C61AE6DC6A000B7D99 /* text_format_map_unittest_data.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = text_format_map_unittest_data.txt; sourceTree = "<group>"; };
 		F45E57C61AE6DC6A000B7D99 /* text_format_map_unittest_data.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = text_format_map_unittest_data.txt; sourceTree = "<group>"; };
@@ -299,9 +295,6 @@
 				F4E675881B21D0000054530B /* Api.pbobjc.h */,
 				F4E675881B21D0000054530B /* Api.pbobjc.h */,
 				F4E675891B21D0000054530B /* Api.pbobjc.m */,
 				F4E675891B21D0000054530B /* Api.pbobjc.m */,
 				F4E675A71B21D05C0054530B /* api.proto */,
 				F4E675A71B21D05C0054530B /* api.proto */,
-				8B54585814DCC34E003D7338 /* Descriptor.pbobjc.h */,
-				8BD3982214BE5B0C0081D629 /* Descriptor.pbobjc.m */,
-				8B42494B1A92A16600BC1EC6 /* descriptor.proto */,
 				8B4248D31A92826400BC1EC6 /* Duration.pbobjc.h */,
 				8B4248D31A92826400BC1EC6 /* Duration.pbobjc.h */,
 				8B4248D41A92826400BC1EC6 /* Duration.pbobjc.m */,
 				8B4248D41A92826400BC1EC6 /* Duration.pbobjc.m */,
 				8B42494C1A92A16600BC1EC6 /* duration.proto */,
 				8B42494C1A92A16600BC1EC6 /* duration.proto */,
@@ -368,9 +361,10 @@
 		7461B4860F94F96B00A0C422 /* IO */ = {
 		7461B4860F94F96B00A0C422 /* IO */ = {
 			isa = PBXGroup;
 			isa = PBXGroup;
 			children = (
 			children = (
-				7461B48E0F94F99000A0C422 /* GPBCodedInputStream.h */,
 				51457B5F18D0B7AF00CCC606 /* GPBCodedInputStream_PackagePrivate.h */,
 				51457B5F18D0B7AF00CCC606 /* GPBCodedInputStream_PackagePrivate.h */,
+				7461B48E0F94F99000A0C422 /* GPBCodedInputStream.h */,
 				7461B48F0F94F99000A0C422 /* GPBCodedInputStream.m */,
 				7461B48F0F94F99000A0C422 /* GPBCodedInputStream.m */,
+				F44929001C866B1900C2548A /* GPBCodedOutputStream_PackagePrivate.h */,
 				7461B4900F94F99000A0C422 /* GPBCodedOutputStream.h */,
 				7461B4900F94F99000A0C422 /* GPBCodedOutputStream.h */,
 				7461B4910F94F99000A0C422 /* GPBCodedOutputStream.m */,
 				7461B4910F94F99000A0C422 /* GPBCodedOutputStream.m */,
 				7461B4E70F94F99000A0C422 /* GPBWireFormat.h */,
 				7461B4E70F94F99000A0C422 /* GPBWireFormat.h */,
@@ -632,7 +626,6 @@
 			isa = PBXSourcesBuildPhase;
 			isa = PBXSourcesBuildPhase;
 			buildActionMask = 2147483647;
 			buildActionMask = 2147483647;
 			files = (
 			files = (
-				2CFB390415C718CE00CBF84D /* Descriptor.pbobjc.m in Sources */,
 				7461B53C0F94FB4E00A0C422 /* GPBCodedInputStream.m in Sources */,
 				7461B53C0F94FB4E00A0C422 /* GPBCodedInputStream.m in Sources */,
 				F4E6759B1B21D0000054530B /* Empty.pbobjc.m in Sources */,
 				F4E6759B1B21D0000054530B /* Empty.pbobjc.m in Sources */,
 				7461B53D0F94FB4E00A0C422 /* GPBCodedOutputStream.m in Sources */,
 				7461B53D0F94FB4E00A0C422 /* GPBCodedOutputStream.m in Sources */,
@@ -694,7 +687,6 @@
 				8B79657D14992E3F002FFBFC /* GPBRootObject.m in Sources */,
 				8B79657D14992E3F002FFBFC /* GPBRootObject.m in Sources */,
 				8BD3981F14BE59D70081D629 /* GPBUnittestProtos.m in Sources */,
 				8BD3981F14BE59D70081D629 /* GPBUnittestProtos.m in Sources */,
 				F4E675B11B21D0A70054530B /* FieldMask.pbobjc.m in Sources */,
 				F4E675B11B21D0A70054530B /* FieldMask.pbobjc.m in Sources */,
-				8B96157514CA019D00A2AC0B /* Descriptor.pbobjc.m in Sources */,
 				8B8B615D17DF7056002EE618 /* GPBARCUnittestProtos.m in Sources */,
 				8B8B615D17DF7056002EE618 /* GPBARCUnittestProtos.m in Sources */,
 				F4E675AF1B21D0A70054530B /* Api.pbobjc.m in Sources */,
 				F4E675AF1B21D0A70054530B /* Api.pbobjc.m in Sources */,
 			);
 			);

+ 3 - 11
objectivec/ProtocolBuffers_iOS.xcodeproj/project.pbxproj

@@ -7,7 +7,6 @@
 	objects = {
 	objects = {
 
 
 /* Begin PBXBuildFile section */
 /* Begin PBXBuildFile section */
-		2CFB390415C718CE00CBF84D /* Descriptor.pbobjc.m in Sources */ = {isa = PBXBuildFile; fileRef = 8BD3982214BE5B0C0081D629 /* Descriptor.pbobjc.m */; };
 		5102DABC1891A073002037B6 /* GPBConcurrencyTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 5102DABB1891A052002037B6 /* GPBConcurrencyTests.m */; };
 		5102DABC1891A073002037B6 /* GPBConcurrencyTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 5102DABB1891A052002037B6 /* GPBConcurrencyTests.m */; };
 		7461B5360F94FB4600A0C422 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1D30AB110D05D00D00671497 /* Foundation.framework */; };
 		7461B5360F94FB4600A0C422 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1D30AB110D05D00D00671497 /* Foundation.framework */; };
 		7461B53C0F94FB4E00A0C422 /* GPBCodedInputStream.m in Sources */ = {isa = PBXBuildFile; fileRef = 7461B48F0F94F99000A0C422 /* GPBCodedInputStream.m */; };
 		7461B53C0F94FB4E00A0C422 /* GPBCodedInputStream.m in Sources */ = {isa = PBXBuildFile; fileRef = 7461B48F0F94F99000A0C422 /* GPBCodedInputStream.m */; };
@@ -27,7 +26,6 @@
 		8B79657D14992E3F002FFBFC /* GPBRootObject.m in Sources */ = {isa = PBXBuildFile; fileRef = 8B79657914992E3E002FFBFC /* GPBRootObject.m */; };
 		8B79657D14992E3F002FFBFC /* GPBRootObject.m in Sources */ = {isa = PBXBuildFile; fileRef = 8B79657914992E3E002FFBFC /* GPBRootObject.m */; };
 		8B8B615D17DF7056002EE618 /* GPBARCUnittestProtos.m in Sources */ = {isa = PBXBuildFile; fileRef = 8B8B615C17DF7056002EE618 /* GPBARCUnittestProtos.m */; settings = {COMPILER_FLAGS = "-fobjc-arc"; }; };
 		8B8B615D17DF7056002EE618 /* GPBARCUnittestProtos.m in Sources */ = {isa = PBXBuildFile; fileRef = 8B8B615C17DF7056002EE618 /* GPBARCUnittestProtos.m */; settings = {COMPILER_FLAGS = "-fobjc-arc"; }; };
 		8B96157414C8C38C00A2AC0B /* GPBDescriptor.m in Sources */ = {isa = PBXBuildFile; fileRef = 8B96157314C8C38C00A2AC0B /* GPBDescriptor.m */; };
 		8B96157414C8C38C00A2AC0B /* GPBDescriptor.m in Sources */ = {isa = PBXBuildFile; fileRef = 8B96157314C8C38C00A2AC0B /* GPBDescriptor.m */; };
-		8B96157514CA019D00A2AC0B /* Descriptor.pbobjc.m in Sources */ = {isa = PBXBuildFile; fileRef = 8BD3982214BE5B0C0081D629 /* Descriptor.pbobjc.m */; };
 		8B9742331A89D19F00DCE92C /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 8B9742321A89D19F00DCE92C /* LaunchScreen.xib */; };
 		8B9742331A89D19F00DCE92C /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 8B9742321A89D19F00DCE92C /* LaunchScreen.xib */; };
 		8B9742431A8AAA7800DCE92C /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8B9742421A8AAA7800DCE92C /* CoreGraphics.framework */; };
 		8B9742431A8AAA7800DCE92C /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8B9742421A8AAA7800DCE92C /* CoreGraphics.framework */; };
 		8B9A5EA61831993600A9D33B /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1D30AB110D05D00D00671497 /* Foundation.framework */; };
 		8B9A5EA61831993600A9D33B /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1D30AB110D05D00D00671497 /* Foundation.framework */; };
@@ -155,7 +153,6 @@
 		8B4248E21A929C8900BC1EC6 /* GPBWellKnownTypes.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GPBWellKnownTypes.m; sourceTree = "<group>"; };
 		8B4248E21A929C8900BC1EC6 /* GPBWellKnownTypes.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GPBWellKnownTypes.m; sourceTree = "<group>"; };
 		8B4248E51A929C9900BC1EC6 /* GPBWellKnownTypesTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GPBWellKnownTypesTest.m; sourceTree = "<group>"; };
 		8B4248E51A929C9900BC1EC6 /* GPBWellKnownTypesTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GPBWellKnownTypesTest.m; sourceTree = "<group>"; };
 		8B4249481A92A02300BC1EC6 /* timestamp.proto */ = {isa = PBXFileReference; lastKnownFileType = text; name = timestamp.proto; path = ../src/google/protobuf/timestamp.proto; sourceTree = "<group>"; };
 		8B4249481A92A02300BC1EC6 /* timestamp.proto */ = {isa = PBXFileReference; lastKnownFileType = text; name = timestamp.proto; path = ../src/google/protobuf/timestamp.proto; sourceTree = "<group>"; };
-		8B4249491A92A0BA00BC1EC6 /* descriptor.proto */ = {isa = PBXFileReference; lastKnownFileType = text; name = descriptor.proto; path = ../src/google/protobuf/descriptor.proto; sourceTree = "<group>"; };
 		8B42494A1A92A0BA00BC1EC6 /* duration.proto */ = {isa = PBXFileReference; lastKnownFileType = text; name = duration.proto; path = ../src/google/protobuf/duration.proto; sourceTree = "<group>"; };
 		8B42494A1A92A0BA00BC1EC6 /* duration.proto */ = {isa = PBXFileReference; lastKnownFileType = text; name = duration.proto; path = ../src/google/protobuf/duration.proto; sourceTree = "<group>"; };
 		8B79657814992E3E002FFBFC /* GPBRootObject.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GPBRootObject.h; sourceTree = "<group>"; };
 		8B79657814992E3E002FFBFC /* GPBRootObject.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GPBRootObject.h; sourceTree = "<group>"; };
 		8B79657914992E3E002FFBFC /* GPBRootObject.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GPBRootObject.m; sourceTree = "<group>"; };
 		8B79657914992E3E002FFBFC /* GPBRootObject.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GPBRootObject.m; sourceTree = "<group>"; };
@@ -183,7 +180,6 @@
 		8BCF338814ED799900BC5317 /* GPBProtocolBuffers.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = GPBProtocolBuffers.m; sourceTree = "<group>"; };
 		8BCF338814ED799900BC5317 /* GPBProtocolBuffers.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = GPBProtocolBuffers.m; sourceTree = "<group>"; };
 		8BD3981D14BE54220081D629 /* unittest_enormous_descriptor.proto */ = {isa = PBXFileReference; lastKnownFileType = text; name = unittest_enormous_descriptor.proto; path = ../../src/google/protobuf/unittest_enormous_descriptor.proto; sourceTree = "<group>"; };
 		8BD3981D14BE54220081D629 /* unittest_enormous_descriptor.proto */ = {isa = PBXFileReference; lastKnownFileType = text; name = unittest_enormous_descriptor.proto; path = ../../src/google/protobuf/unittest_enormous_descriptor.proto; sourceTree = "<group>"; };
 		8BD3981E14BE59D70081D629 /* GPBUnittestProtos.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GPBUnittestProtos.m; sourceTree = "<group>"; };
 		8BD3981E14BE59D70081D629 /* GPBUnittestProtos.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GPBUnittestProtos.m; sourceTree = "<group>"; };
-		8BD3982214BE5B0C0081D629 /* Descriptor.pbobjc.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Descriptor.pbobjc.m; path = google/protobuf/Descriptor.pbobjc.m; sourceTree = SOURCE_ROOT; };
 		8BEB5AE01498033E0078BF9D /* GPBRuntimeTypes.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GPBRuntimeTypes.h; sourceTree = "<group>"; };
 		8BEB5AE01498033E0078BF9D /* GPBRuntimeTypes.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GPBRuntimeTypes.h; sourceTree = "<group>"; };
 		F401DC341A8E5C6F00FCC765 /* GPBArrayTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GPBArrayTests.m; sourceTree = "<group>"; };
 		F401DC341A8E5C6F00FCC765 /* GPBArrayTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GPBArrayTests.m; sourceTree = "<group>"; };
 		F41C175C1833D3310064ED4D /* GPBPerfTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GPBPerfTests.m; sourceTree = "<group>"; };
 		F41C175C1833D3310064ED4D /* GPBPerfTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GPBPerfTests.m; sourceTree = "<group>"; };
@@ -209,6 +205,7 @@
 		F4487C7D1AAE06C500531423 /* GPBUtilities_PackagePrivate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GPBUtilities_PackagePrivate.h; sourceTree = "<group>"; };
 		F4487C7D1AAE06C500531423 /* GPBUtilities_PackagePrivate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GPBUtilities_PackagePrivate.h; sourceTree = "<group>"; };
 		F4487C801AAF62FC00531423 /* GPBMessageTests+Serialization.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "GPBMessageTests+Serialization.m"; sourceTree = "<group>"; };
 		F4487C801AAF62FC00531423 /* GPBMessageTests+Serialization.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "GPBMessageTests+Serialization.m"; sourceTree = "<group>"; };
 		F4487C841AAF6AC500531423 /* GPBMessageTests+Merge.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "GPBMessageTests+Merge.m"; sourceTree = "<group>"; };
 		F4487C841AAF6AC500531423 /* GPBMessageTests+Merge.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "GPBMessageTests+Merge.m"; sourceTree = "<group>"; };
+		F44929021C866B3B00C2548A /* GPBCodedOutputStream_PackagePrivate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GPBCodedOutputStream_PackagePrivate.h; sourceTree = "<group>"; };
 		F451D3F61A8AAEA600B8A22C /* GPBProtocolBuffers_RuntimeSupport.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GPBProtocolBuffers_RuntimeSupport.h; sourceTree = "<group>"; };
 		F451D3F61A8AAEA600B8A22C /* GPBProtocolBuffers_RuntimeSupport.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GPBProtocolBuffers_RuntimeSupport.h; sourceTree = "<group>"; };
 		F45C69CB16DFD08D0081955B /* GPBExtensionInternals.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GPBExtensionInternals.m; sourceTree = "<group>"; };
 		F45C69CB16DFD08D0081955B /* GPBExtensionInternals.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GPBExtensionInternals.m; sourceTree = "<group>"; };
 		F45E57C81AE6DC98000B7D99 /* text_format_map_unittest_data.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = text_format_map_unittest_data.txt; sourceTree = "<group>"; };
 		F45E57C81AE6DC98000B7D99 /* text_format_map_unittest_data.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = text_format_map_unittest_data.txt; sourceTree = "<group>"; };
@@ -223,7 +220,6 @@
 		F4E675B71B21D1440054530B /* Any.pbobjc.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = Any.pbobjc.m; path = google/protobuf/Any.pbobjc.m; sourceTree = "<group>"; };
 		F4E675B71B21D1440054530B /* Any.pbobjc.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = Any.pbobjc.m; path = google/protobuf/Any.pbobjc.m; sourceTree = "<group>"; };
 		F4E675B81B21D1440054530B /* Api.pbobjc.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Api.pbobjc.h; path = google/protobuf/Api.pbobjc.h; sourceTree = "<group>"; };
 		F4E675B81B21D1440054530B /* Api.pbobjc.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Api.pbobjc.h; path = google/protobuf/Api.pbobjc.h; sourceTree = "<group>"; };
 		F4E675B91B21D1440054530B /* Api.pbobjc.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = Api.pbobjc.m; path = google/protobuf/Api.pbobjc.m; sourceTree = "<group>"; };
 		F4E675B91B21D1440054530B /* Api.pbobjc.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = Api.pbobjc.m; path = google/protobuf/Api.pbobjc.m; sourceTree = "<group>"; };
-		F4E675BA1B21D1440054530B /* Descriptor.pbobjc.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Descriptor.pbobjc.h; path = google/protobuf/Descriptor.pbobjc.h; sourceTree = "<group>"; };
 		F4E675BB1B21D1440054530B /* Empty.pbobjc.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Empty.pbobjc.h; path = google/protobuf/Empty.pbobjc.h; sourceTree = "<group>"; };
 		F4E675BB1B21D1440054530B /* Empty.pbobjc.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Empty.pbobjc.h; path = google/protobuf/Empty.pbobjc.h; sourceTree = "<group>"; };
 		F4E675BC1B21D1440054530B /* Empty.pbobjc.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = Empty.pbobjc.m; path = google/protobuf/Empty.pbobjc.m; sourceTree = "<group>"; };
 		F4E675BC1B21D1440054530B /* Empty.pbobjc.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = Empty.pbobjc.m; path = google/protobuf/Empty.pbobjc.m; sourceTree = "<group>"; };
 		F4E675BD1B21D1440054530B /* FieldMask.pbobjc.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = FieldMask.pbobjc.h; path = google/protobuf/FieldMask.pbobjc.h; sourceTree = "<group>"; };
 		F4E675BD1B21D1440054530B /* FieldMask.pbobjc.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = FieldMask.pbobjc.h; path = google/protobuf/FieldMask.pbobjc.h; sourceTree = "<group>"; };
@@ -334,9 +330,6 @@
 				F4E675B81B21D1440054530B /* Api.pbobjc.h */,
 				F4E675B81B21D1440054530B /* Api.pbobjc.h */,
 				F4E675B91B21D1440054530B /* Api.pbobjc.m */,
 				F4E675B91B21D1440054530B /* Api.pbobjc.m */,
 				F4E675D91B21D1DE0054530B /* api.proto */,
 				F4E675D91B21D1DE0054530B /* api.proto */,
-				F4E675BA1B21D1440054530B /* Descriptor.pbobjc.h */,
-				8BD3982214BE5B0C0081D629 /* Descriptor.pbobjc.m */,
-				8B4249491A92A0BA00BC1EC6 /* descriptor.proto */,
 				8B4248DD1A929C7D00BC1EC6 /* Duration.pbobjc.h */,
 				8B4248DD1A929C7D00BC1EC6 /* Duration.pbobjc.h */,
 				8B4248DE1A929C7D00BC1EC6 /* Duration.pbobjc.m */,
 				8B4248DE1A929C7D00BC1EC6 /* Duration.pbobjc.m */,
 				8B42494A1A92A0BA00BC1EC6 /* duration.proto */,
 				8B42494A1A92A0BA00BC1EC6 /* duration.proto */,
@@ -405,9 +398,10 @@
 		7461B4860F94F96B00A0C422 /* IO */ = {
 		7461B4860F94F96B00A0C422 /* IO */ = {
 			isa = PBXGroup;
 			isa = PBXGroup;
 			children = (
 			children = (
-				7461B48E0F94F99000A0C422 /* GPBCodedInputStream.h */,
 				51457B5F18D0B7AF00CCC606 /* GPBCodedInputStream_PackagePrivate.h */,
 				51457B5F18D0B7AF00CCC606 /* GPBCodedInputStream_PackagePrivate.h */,
+				7461B48E0F94F99000A0C422 /* GPBCodedInputStream.h */,
 				7461B48F0F94F99000A0C422 /* GPBCodedInputStream.m */,
 				7461B48F0F94F99000A0C422 /* GPBCodedInputStream.m */,
+				F44929021C866B3B00C2548A /* GPBCodedOutputStream_PackagePrivate.h */,
 				7461B4900F94F99000A0C422 /* GPBCodedOutputStream.h */,
 				7461B4900F94F99000A0C422 /* GPBCodedOutputStream.h */,
 				7461B4910F94F99000A0C422 /* GPBCodedOutputStream.m */,
 				7461B4910F94F99000A0C422 /* GPBCodedOutputStream.m */,
 				7461B4E70F94F99000A0C422 /* GPBWireFormat.h */,
 				7461B4E70F94F99000A0C422 /* GPBWireFormat.h */,
@@ -720,7 +714,6 @@
 			isa = PBXSourcesBuildPhase;
 			isa = PBXSourcesBuildPhase;
 			buildActionMask = 2147483647;
 			buildActionMask = 2147483647;
 			files = (
 			files = (
-				2CFB390415C718CE00CBF84D /* Descriptor.pbobjc.m in Sources */,
 				7461B53C0F94FB4E00A0C422 /* GPBCodedInputStream.m in Sources */,
 				7461B53C0F94FB4E00A0C422 /* GPBCodedInputStream.m in Sources */,
 				F4E675D21B21D1620054530B /* Empty.pbobjc.m in Sources */,
 				F4E675D21B21D1620054530B /* Empty.pbobjc.m in Sources */,
 				F4487C731A9F906200531423 /* GPBArray.m in Sources */,
 				F4487C731A9F906200531423 /* GPBArray.m in Sources */,
@@ -790,7 +783,6 @@
 				8B79657D14992E3F002FFBFC /* GPBRootObject.m in Sources */,
 				8B79657D14992E3F002FFBFC /* GPBRootObject.m in Sources */,
 				8BD3981F14BE59D70081D629 /* GPBUnittestProtos.m in Sources */,
 				8BD3981F14BE59D70081D629 /* GPBUnittestProtos.m in Sources */,
 				F4E675CB1B21D1610054530B /* FieldMask.pbobjc.m in Sources */,
 				F4E675CB1B21D1610054530B /* FieldMask.pbobjc.m in Sources */,
-				8B96157514CA019D00A2AC0B /* Descriptor.pbobjc.m in Sources */,
 				8B8B615D17DF7056002EE618 /* GPBARCUnittestProtos.m in Sources */,
 				8B8B615D17DF7056002EE618 /* GPBARCUnittestProtos.m in Sources */,
 				F4E675C91B21D1610054530B /* Api.pbobjc.m in Sources */,
 				F4E675C91B21D1610054530B /* Api.pbobjc.m in Sources */,
 			);
 			);

+ 5 - 0
objectivec/Tests/GPBARCUnittestProtos.m

@@ -34,6 +34,11 @@
 
 
 // Makes sure all the generated headers compile with ARC on.
 // Makes sure all the generated headers compile with ARC on.
 
 
+// The unittest_custom_options.proto extends the messages in descriptor.proto
+// so we build it in to test extending in general. The library doesn't provide
+// a descriptor as it doesn't use the classes/enums.
+#import "google/protobuf/Descriptor.pbobjc.h"
+
 #import "google/protobuf/Unittest.pbobjc.h"
 #import "google/protobuf/Unittest.pbobjc.h"
 #import "google/protobuf/UnittestCustomOptions.pbobjc.h"
 #import "google/protobuf/UnittestCustomOptions.pbobjc.h"
 #import "google/protobuf/UnittestCycle.pbobjc.h"
 #import "google/protobuf/UnittestCycle.pbobjc.h"

+ 20 - 1
objectivec/Tests/GPBCodedOuputStreamTests.m

@@ -30,11 +30,30 @@
 
 
 #import "GPBTestUtilities.h"
 #import "GPBTestUtilities.h"
 
 
-#import "GPBCodedOutputStream.h"
+#import "GPBCodedOutputStream_PackagePrivate.h"
 #import "GPBCodedInputStream.h"
 #import "GPBCodedInputStream.h"
 #import "GPBUtilities_PackagePrivate.h"
 #import "GPBUtilities_PackagePrivate.h"
 #import "google/protobuf/Unittest.pbobjc.h"
 #import "google/protobuf/Unittest.pbobjc.h"
 
 
+@interface GPBCodedOutputStream (InternalMethods)
+// Declared in the .m file, expose for testing.
+- (instancetype)initWithOutputStream:(NSOutputStream *)output
+                                data:(NSMutableData *)data;
+@end
+
+@interface GPBCodedOutputStream (Helper)
++ (instancetype)streamWithOutputStream:(NSOutputStream *)output
+                            bufferSize:(size_t)bufferSize;
+@end
+
+@implementation GPBCodedOutputStream (Helper)
++ (instancetype)streamWithOutputStream:(NSOutputStream *)output
+                            bufferSize:(size_t)bufferSize {
+  NSMutableData *data = [NSMutableData dataWithLength:bufferSize];
+  return [[[self alloc] initWithOutputStream:output data:data] autorelease];
+}
+@end
+
 @interface CodedOutputStreamTests : GPBTestCase
 @interface CodedOutputStreamTests : GPBTestCase
 @end
 @end
 
 

+ 0 - 13
objectivec/Tests/GPBDescriptorTests.m

@@ -153,19 +153,6 @@
   XCTAssertFalse([fieldDescriptor isValidEnumValue:-2]);
   XCTAssertFalse([fieldDescriptor isValidEnumValue:-2]);
 }
 }
 
 
-- (void)testEnumDescriptorLookup {
-  GPBDescriptor *descriptor = [TestAllTypes descriptor];
-  GPBEnumDescriptor *enumDescriptor =
-      [descriptor enumWithName:@"TestAllTypes_NestedEnum"];
-  XCTAssertNotNil(enumDescriptor);
-
-  // Descriptor cannot find foreign or imported enums.
-  enumDescriptor = [descriptor enumWithName:@"ForeignEnumEnum"];
-  XCTAssertNil(enumDescriptor);
-  enumDescriptor = [descriptor enumWithName:@"ImportEnumEnum"];
-  XCTAssertNil(enumDescriptor);
-}
-
 - (void)testOneofDescriptor {
 - (void)testOneofDescriptor {
   GPBDescriptor *descriptor = [TestOneof2 descriptor];
   GPBDescriptor *descriptor = [TestOneof2 descriptor];
 
 

+ 18 - 0
objectivec/Tests/GPBMessageTests.m

@@ -1820,6 +1820,24 @@
   XCTAssertEqualObjects(enumDescriptor, expectedDescriptor);
   XCTAssertEqualObjects(enumDescriptor, expectedDescriptor);
 }
 }
 
 
+- (void)testPropertyNaming {
+  // objectivec_helpers.cc has some special handing to get proper all caps
+  // for a few cases to meet objc developer expectations.
+  //
+  // This "test" confirms that the expected names are generated, otherwise the
+  // test itself will fail to compile.
+  ObjCPropertyNaming *msg = [ObjCPropertyNaming message];
+  // On their own, at the end, in the middle.
+  msg.URL = @"good";
+  msg.thumbnailURL = @"good";
+  msg.URLFoo = @"good";
+  msg.someURLBlah = @"good";
+  msg.HTTP = @"good";
+  msg.HTTPS = @"good";
+  // No caps since it was "urls".
+  [msg.urlsArray addObject:@"good"];
+}
+
 - (void)testEnumNaming {
 - (void)testEnumNaming {
   // objectivec_helpers.cc has some interesting cases to deal with in
   // objectivec_helpers.cc has some interesting cases to deal with in
   // EnumValueName/EnumValueShortName.  Confirm that things generated as
   // EnumValueName/EnumValueShortName.  Confirm that things generated as

+ 5 - 0
objectivec/Tests/GPBUnittestProtos.m

@@ -31,6 +31,11 @@
 // Collects all the compiled protos into one file and compiles them to make sure
 // Collects all the compiled protos into one file and compiles them to make sure
 // the compiler is generating valid code.
 // the compiler is generating valid code.
 
 
+// The unittest_custom_options.proto extends the messages in descriptor.proto
+// so we build it in to test extending in general. The library doesn't provide
+// a descriptor as it doesn't use the classes/enums.
+#import "google/protobuf/Descriptor.pbobjc.m"
+
 #import "google/protobuf/MapProto2Unittest.pbobjc.m"
 #import "google/protobuf/MapProto2Unittest.pbobjc.m"
 #import "google/protobuf/MapUnittest.pbobjc.m"
 #import "google/protobuf/MapUnittest.pbobjc.m"
 #import "google/protobuf/Unittest.pbobjc.m"
 #import "google/protobuf/Unittest.pbobjc.m"

+ 12 - 0
objectivec/Tests/unittest_objc.proto

@@ -112,6 +112,18 @@ enum retain {
   serializedSize = 6;
   serializedSize = 6;
 }
 }
 
 
+message ObjCPropertyNaming {
+  // Test that the properties properly get things all caps.
+  optional string url           = 1;
+  optional string thumbnail_url = 2;
+  optional string url_foo       = 3;
+  optional string some_url_blah = 4;
+  optional string http          = 5;
+  optional string https         = 6;
+  // This one doesn't.
+  repeated string urls          = 7;
+}
+
 // EnumValueShortName: The short names shouldn't get suffixes/prefixes.
 // EnumValueShortName: The short names shouldn't get suffixes/prefixes.
 enum Foo {
 enum Foo {
   SERIALIZED_SIZE = 1;
   SERIALIZED_SIZE = 1;

+ 3 - 4
objectivec/generate_descriptors_proto.sh → objectivec/generate_well_known_types.sh

@@ -1,9 +1,9 @@
 #!/bin/bash
 #!/bin/bash
 
 
-# Run this script to regenerate descriptor.pbobjc.{h,m} after the protocol
-# compiler changes.
+# Run this script to regenerate *.pbobjc.{h,m} for the well known types after
+# the protocol compiler changes.
 
 
-# HINT:  Flags passed to generate_descriptor_proto.sh will be passed directly
+# HINT:  Flags passed to generate_well_known_types.sh will be passed directly
 #   to make when building protoc.  This is particularly useful for passing
 #   to make when building protoc.  This is particularly useful for passing
 #   -j4 to run 4 jobs simultaneously.
 #   -j4 to run 4 jobs simultaneously.
 
 
@@ -37,7 +37,6 @@ make $@ protoc
 declare -a RUNTIME_PROTO_FILES=( \
 declare -a RUNTIME_PROTO_FILES=( \
   google/protobuf/any.proto \
   google/protobuf/any.proto \
   google/protobuf/api.proto \
   google/protobuf/api.proto \
-  google/protobuf/descriptor.proto \
   google/protobuf/duration.proto \
   google/protobuf/duration.proto \
   google/protobuf/empty.proto \
   google/protobuf/empty.proto \
   google/protobuf/field_mask.proto \
   google/protobuf/field_mask.proto \

+ 60 - 58
objectivec/google/protobuf/Any.pbobjc.h

@@ -3,7 +3,7 @@
 
 
 #import "GPBProtocolBuffers.h"
 #import "GPBProtocolBuffers.h"
 
 
-#if GOOGLE_PROTOBUF_OBJC_GEN_VERSION != 30000
+#if GOOGLE_PROTOBUF_OBJC_GEN_VERSION != 30001
 #error This file was generated by a different version of protoc which is incompatible with your Protocol Buffer library sources.
 #error This file was generated by a different version of protoc which is incompatible with your Protocol Buffer library sources.
 #endif
 #endif
 
 
@@ -15,13 +15,15 @@ NS_ASSUME_NONNULL_BEGIN
 
 
 #pragma mark - GPBAnyRoot
 #pragma mark - GPBAnyRoot
 
 
+/// Exposes the extension registry for this file.
+///
+/// The base class provides:
+/// @code
+///   + (GPBExtensionRegistry *)extensionRegistry;
+/// @endcode
+/// which is a @c GPBExtensionRegistry that includes all the extensions defined by
+/// this file and all files that it depends on.
 @interface GPBAnyRoot : GPBRootObject
 @interface GPBAnyRoot : GPBRootObject
-
-// The base class provides:
-//   + (GPBExtensionRegistry *)extensionRegistry;
-// which is an GPBExtensionRegistry that includes all the extensions defined by
-// this file and all files that it depends on.
-
 @end
 @end
 
 
 #pragma mark - GPBAny
 #pragma mark - GPBAny
@@ -31,61 +33,61 @@ typedef GPB_ENUM(GPBAny_FieldNumber) {
   GPBAny_FieldNumber_Value = 2,
   GPBAny_FieldNumber_Value = 2,
 };
 };
 
 
-// `Any` contains an arbitrary serialized message along with a URL
-// that describes the type of the serialized message.
-//
-//
-// JSON
-// ====
-// The JSON representation of an `Any` value uses the regular
-// representation of the deserialized, embedded message, with an
-// additional field `@type` which contains the type URL. Example:
-//
-//     package google.profile;
-//     message Person {
-//       string first_name = 1;
-//       string last_name = 2;
-//     }
-//
-//     {
-//       "@type": "type.googleapis.com/google.profile.Person",
-//       "firstName": <string>,
-//       "lastName": <string>
-//     }
-//
-// If the embedded message type is well-known and has a custom JSON
-// representation, that representation will be embedded adding a field
-// `value` which holds the custom JSON in addition to the `@type`
-// field. Example (for message [google.protobuf.Duration][]):
-//
-//     {
-//       "@type": "type.googleapis.com/google.protobuf.Duration",
-//       "value": "1.212s"
-//     }
+/// `Any` contains an arbitrary serialized message along with a URL
+/// that describes the type of the serialized message.
+///
+///
+/// JSON
+/// ====
+/// The JSON representation of an `Any` value uses the regular
+/// representation of the deserialized, embedded message, with an
+/// additional field `\@type` which contains the type URL. Example:
+///
+///     package google.profile;
+///     message Person {
+///       string first_name = 1;
+///       string last_name = 2;
+///     }
+///
+///     {
+///       "\@type": "type.googleapis.com/google.profile.Person",
+///       "firstName": <string>,
+///       "lastName": <string>
+///     }
+///
+/// If the embedded message type is well-known and has a custom JSON
+/// representation, that representation will be embedded adding a field
+/// `value` which holds the custom JSON in addition to the `\@type`
+/// field. Example (for message [google.protobuf.Duration][]):
+///
+///     {
+///       "\@type": "type.googleapis.com/google.protobuf.Duration",
+///       "value": "1.212s"
+///     }
 @interface GPBAny : GPBMessage
 @interface GPBAny : GPBMessage
 
 
-// A URL/resource name whose content describes the type of the
-// serialized message.
-//
-// For URLs which use the schema `http`, `https`, or no schema, the
-// following restrictions and interpretations apply:
-//
-// * If no schema is provided, `https` is assumed.
-// * The last segment of the URL's path must represent the fully
-//   qualified name of the type (as in `path/google.protobuf.Duration`).
-// * An HTTP GET on the URL must yield a [google.protobuf.Type][]
-//   value in binary format, or produce an error.
-// * Applications are allowed to cache lookup results based on the
-//   URL, or have them precompiled into a binary to avoid any
-//   lookup. Therefore, binary compatibility needs to be preserved
-//   on changes to types. (Use versioned type names to manage
-//   breaking changes.)
-//
-// Schemas other than `http`, `https` (or the empty schema) might be
-// used with implementation specific semantics.
+/// A URL/resource name whose content describes the type of the
+/// serialized message.
+///
+/// For URLs which use the schema `http`, `https`, or no schema, the
+/// following restrictions and interpretations apply:
+///
+/// * If no schema is provided, `https` is assumed.
+/// * The last segment of the URL's path must represent the fully
+///   qualified name of the type (as in `path/google.protobuf.Duration`).
+/// * An HTTP GET on the URL must yield a [google.protobuf.Type][]
+///   value in binary format, or produce an error.
+/// * Applications are allowed to cache lookup results based on the
+///   URL, or have them precompiled into a binary to avoid any
+///   lookup. Therefore, binary compatibility needs to be preserved
+///   on changes to types. (Use versioned type names to manage
+///   breaking changes.)
+///
+/// Schemas other than `http`, `https` (or the empty schema) might be
+/// used with implementation specific semantics.
 @property(nonatomic, readwrite, copy, null_resettable) NSString *typeURL;
 @property(nonatomic, readwrite, copy, null_resettable) NSString *typeURL;
 
 
-// Must be valid serialized data of the above specified type.
+/// Must be valid serialized data of the above specified type.
 @property(nonatomic, readwrite, copy, null_resettable) NSData *value;
 @property(nonatomic, readwrite, copy, null_resettable) NSData *value;
 
 
 @end
 @end

+ 11 - 22
objectivec/google/protobuf/Any.pbobjc.m

@@ -46,47 +46,36 @@ typedef struct GPBAny__storage_ {
     static GPBMessageFieldDescription fields[] = {
     static GPBMessageFieldDescription fields[] = {
       {
       {
         .name = "typeURL",
         .name = "typeURL",
+        .dataTypeSpecific.className = NULL,
         .number = GPBAny_FieldNumber_TypeURL,
         .number = GPBAny_FieldNumber_TypeURL,
         .hasIndex = 0,
         .hasIndex = 0,
+        .offset = (uint32_t)offsetof(GPBAny__storage_, typeURL),
         .flags = GPBFieldOptional | GPBFieldTextFormatNameCustom,
         .flags = GPBFieldOptional | GPBFieldTextFormatNameCustom,
         .dataType = GPBDataTypeString,
         .dataType = GPBDataTypeString,
-        .offset = offsetof(GPBAny__storage_, typeURL),
-        .defaultValue.valueString = nil,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
       },
       },
       {
       {
         .name = "value",
         .name = "value",
+        .dataTypeSpecific.className = NULL,
         .number = GPBAny_FieldNumber_Value,
         .number = GPBAny_FieldNumber_Value,
         .hasIndex = 1,
         .hasIndex = 1,
+        .offset = (uint32_t)offsetof(GPBAny__storage_, value),
         .flags = GPBFieldOptional,
         .flags = GPBFieldOptional,
         .dataType = GPBDataTypeBytes,
         .dataType = GPBDataTypeBytes,
-        .offset = offsetof(GPBAny__storage_, value),
-        .defaultValue.valueData = nil,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
       },
       },
     };
     };
-#if GPBOBJC_SKIP_MESSAGE_TEXTFORMAT_EXTRAS
-    const char *extraTextFormatInfo = NULL;
-#else
-    static const char *extraTextFormatInfo = "\001\001\004\241!!\000";
-#endif  // GPBOBJC_SKIP_MESSAGE_TEXTFORMAT_EXTRAS
     GPBDescriptor *localDescriptor =
     GPBDescriptor *localDescriptor =
         [GPBDescriptor allocDescriptorForClass:[GPBAny class]
         [GPBDescriptor allocDescriptorForClass:[GPBAny class]
                                      rootClass:[GPBAnyRoot class]
                                      rootClass:[GPBAnyRoot class]
                                           file:GPBAnyRoot_FileDescriptor()
                                           file:GPBAnyRoot_FileDescriptor()
                                         fields:fields
                                         fields:fields
-                                    fieldCount:sizeof(fields) / sizeof(GPBMessageFieldDescription)
-                                        oneofs:NULL
-                                    oneofCount:0
-                                         enums:NULL
-                                     enumCount:0
-                                        ranges:NULL
-                                    rangeCount:0
+                                    fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription))
                                    storageSize:sizeof(GPBAny__storage_)
                                    storageSize:sizeof(GPBAny__storage_)
-                                    wireFormat:NO
-                           extraTextFormatInfo:extraTextFormatInfo];
+                                         flags:0];
+#if !GPBOBJC_SKIP_MESSAGE_TEXTFORMAT_EXTRAS
+    static const char *extraTextFormatInfo =
+        "\001\001\004\241!!\000";
+    [localDescriptor setupExtraTextInfo:extraTextFormatInfo];
+#endif  // !GPBOBJC_SKIP_MESSAGE_TEXTFORMAT_EXTRAS
     NSAssert(descriptor == nil, @"Startup recursed!");
     NSAssert(descriptor == nil, @"Startup recursed!");
     descriptor = localDescriptor;
     descriptor = localDescriptor;
   }
   }

+ 142 - 125
objectivec/google/protobuf/Api.pbobjc.h

@@ -3,7 +3,7 @@
 
 
 #import "GPBProtocolBuffers.h"
 #import "GPBProtocolBuffers.h"
 
 
-#if GOOGLE_PROTOBUF_OBJC_GEN_VERSION != 30000
+#if GOOGLE_PROTOBUF_OBJC_GEN_VERSION != 30001
 #error This file was generated by a different version of protoc which is incompatible with your Protocol Buffer library sources.
 #error This file was generated by a different version of protoc which is incompatible with your Protocol Buffer library sources.
 #endif
 #endif
 
 
@@ -21,13 +21,15 @@ NS_ASSUME_NONNULL_BEGIN
 
 
 #pragma mark - GPBApiRoot
 #pragma mark - GPBApiRoot
 
 
+/// Exposes the extension registry for this file.
+///
+/// The base class provides:
+/// @code
+///   + (GPBExtensionRegistry *)extensionRegistry;
+/// @endcode
+/// which is a @c GPBExtensionRegistry that includes all the extensions defined by
+/// this file and all files that it depends on.
 @interface GPBApiRoot : GPBRootObject
 @interface GPBApiRoot : GPBRootObject
-
-// The base class provides:
-//   + (GPBExtensionRegistry *)extensionRegistry;
-// which is an GPBExtensionRegistry that includes all the extensions defined by
-// this file and all files that it depends on.
-
 @end
 @end
 
 
 #pragma mark - GPBApi
 #pragma mark - GPBApi
@@ -42,58 +44,67 @@ typedef GPB_ENUM(GPBApi_FieldNumber) {
   GPBApi_FieldNumber_Syntax = 7,
   GPBApi_FieldNumber_Syntax = 7,
 };
 };
 
 
-// Api is a light-weight descriptor for a protocol buffer service.
+/// Api is a light-weight descriptor for a protocol buffer service.
 @interface GPBApi : GPBMessage
 @interface GPBApi : GPBMessage
 
 
-// The fully qualified name of this api, including package name
-// followed by the api's simple name.
+/// The fully qualified name of this api, including package name
+/// followed by the api's simple name.
 @property(nonatomic, readwrite, copy, null_resettable) NSString *name;
 @property(nonatomic, readwrite, copy, null_resettable) NSString *name;
 
 
-// The methods of this api, in unspecified order.
+/// The methods of this api, in unspecified order.
 @property(nonatomic, readwrite, strong, null_resettable) NSMutableArray<GPBMethod*> *methodsArray;
 @property(nonatomic, readwrite, strong, null_resettable) NSMutableArray<GPBMethod*> *methodsArray;
+/// The number of items in @c methodsArray without causing the array to be created.
 @property(nonatomic, readonly) NSUInteger methodsArray_Count;
 @property(nonatomic, readonly) NSUInteger methodsArray_Count;
 
 
-// Any metadata attached to the API.
+/// Any metadata attached to the API.
 @property(nonatomic, readwrite, strong, null_resettable) NSMutableArray<GPBOption*> *optionsArray;
 @property(nonatomic, readwrite, strong, null_resettable) NSMutableArray<GPBOption*> *optionsArray;
+/// The number of items in @c optionsArray without causing the array to be created.
 @property(nonatomic, readonly) NSUInteger optionsArray_Count;
 @property(nonatomic, readonly) NSUInteger optionsArray_Count;
 
 
-// A version string for this api. If specified, must have the form
-// `major-version.minor-version`, as in `1.10`. If the minor version
-// is omitted, it defaults to zero. If the entire version field is
-// empty, the major version is derived from the package name, as
-// outlined below. If the field is not empty, the version in the
-// package name will be verified to be consistent with what is
-// provided here.
-//
-// The versioning schema uses [semantic
-// versioning](http://semver.org) where the major version number
-// indicates a breaking change and the minor version an additive,
-// non-breaking change. Both version numbers are signals to users
-// what to expect from different versions, and should be carefully
-// chosen based on the product plan.
-//
-// The major version is also reflected in the package name of the
-// API, which must end in `v<major-version>`, as in
-// `google.feature.v1`. For major versions 0 and 1, the suffix can
-// be omitted. Zero major versions must only be used for
-// experimental, none-GA apis.
+/// A version string for this api. If specified, must have the form
+/// `major-version.minor-version`, as in `1.10`. If the minor version
+/// is omitted, it defaults to zero. If the entire version field is
+/// empty, the major version is derived from the package name, as
+/// outlined below. If the field is not empty, the version in the
+/// package name will be verified to be consistent with what is
+/// provided here.
+///
+/// The versioning schema uses [semantic
+/// versioning](http://semver.org) where the major version number
+/// indicates a breaking change and the minor version an additive,
+/// non-breaking change. Both version numbers are signals to users
+/// what to expect from different versions, and should be carefully
+/// chosen based on the product plan.
+///
+/// The major version is also reflected in the package name of the
+/// API, which must end in `v<major-version>`, as in
+/// `google.feature.v1`. For major versions 0 and 1, the suffix can
+/// be omitted. Zero major versions must only be used for
+/// experimental, none-GA apis.
 @property(nonatomic, readwrite, copy, null_resettable) NSString *version;
 @property(nonatomic, readwrite, copy, null_resettable) NSString *version;
 
 
-// Source context for the protocol buffer service represented by this
-// message.
-@property(nonatomic, readwrite) BOOL hasSourceContext;
+/// Source context for the protocol buffer service represented by this
+/// message.
 @property(nonatomic, readwrite, strong, null_resettable) GPBSourceContext *sourceContext;
 @property(nonatomic, readwrite, strong, null_resettable) GPBSourceContext *sourceContext;
+/// Test to see if @c sourceContext has been set.
+@property(nonatomic, readwrite) BOOL hasSourceContext;
 
 
-// Included APIs. See [Mixin][].
+/// Included APIs. See [Mixin][].
 @property(nonatomic, readwrite, strong, null_resettable) NSMutableArray<GPBMixin*> *mixinsArray;
 @property(nonatomic, readwrite, strong, null_resettable) NSMutableArray<GPBMixin*> *mixinsArray;
+/// The number of items in @c mixinsArray without causing the array to be created.
 @property(nonatomic, readonly) NSUInteger mixinsArray_Count;
 @property(nonatomic, readonly) NSUInteger mixinsArray_Count;
 
 
-// The source syntax of the service.
+/// The source syntax of the service.
 @property(nonatomic, readwrite) enum GPBSyntax syntax;
 @property(nonatomic, readwrite) enum GPBSyntax syntax;
 
 
 @end
 @end
 
 
+/// Fetches the raw value of a @c GPBApi's @c syntax property, even
+/// if the value was not defined by the enum at the time the code was generated.
 int32_t GPBApi_Syntax_RawValue(GPBApi *message);
 int32_t GPBApi_Syntax_RawValue(GPBApi *message);
+/// Sets the raw value of an @c GPBApi's @c syntax property, allowing
+/// it to be set to a value that was not defined by the enum at the time the code
+/// was generated.
 void SetGPBApi_Syntax_RawValue(GPBApi *message, int32_t value);
 void SetGPBApi_Syntax_RawValue(GPBApi *message, int32_t value);
 
 
 #pragma mark - GPBMethod
 #pragma mark - GPBMethod
@@ -108,34 +119,40 @@ typedef GPB_ENUM(GPBMethod_FieldNumber) {
   GPBMethod_FieldNumber_Syntax = 7,
   GPBMethod_FieldNumber_Syntax = 7,
 };
 };
 
 
-// Method represents a method of an api.
+/// Method represents a method of an api.
 @interface GPBMethod : GPBMessage
 @interface GPBMethod : GPBMessage
 
 
-// The simple name of this method.
+/// The simple name of this method.
 @property(nonatomic, readwrite, copy, null_resettable) NSString *name;
 @property(nonatomic, readwrite, copy, null_resettable) NSString *name;
 
 
-// A URL of the input message type.
+/// A URL of the input message type.
 @property(nonatomic, readwrite, copy, null_resettable) NSString *requestTypeURL;
 @property(nonatomic, readwrite, copy, null_resettable) NSString *requestTypeURL;
 
 
-// If true, the request is streamed.
+/// If true, the request is streamed.
 @property(nonatomic, readwrite) BOOL requestStreaming;
 @property(nonatomic, readwrite) BOOL requestStreaming;
 
 
-// The URL of the output message type.
+/// The URL of the output message type.
 @property(nonatomic, readwrite, copy, null_resettable) NSString *responseTypeURL;
 @property(nonatomic, readwrite, copy, null_resettable) NSString *responseTypeURL;
 
 
-// If true, the response is streamed.
+/// If true, the response is streamed.
 @property(nonatomic, readwrite) BOOL responseStreaming;
 @property(nonatomic, readwrite) BOOL responseStreaming;
 
 
-// Any metadata attached to the method.
+/// Any metadata attached to the method.
 @property(nonatomic, readwrite, strong, null_resettable) NSMutableArray<GPBOption*> *optionsArray;
 @property(nonatomic, readwrite, strong, null_resettable) NSMutableArray<GPBOption*> *optionsArray;
+/// The number of items in @c optionsArray without causing the array to be created.
 @property(nonatomic, readonly) NSUInteger optionsArray_Count;
 @property(nonatomic, readonly) NSUInteger optionsArray_Count;
 
 
-// The source syntax of this method.
+/// The source syntax of this method.
 @property(nonatomic, readwrite) enum GPBSyntax syntax;
 @property(nonatomic, readwrite) enum GPBSyntax syntax;
 
 
 @end
 @end
 
 
+/// Fetches the raw value of a @c GPBMethod's @c syntax property, even
+/// if the value was not defined by the enum at the time the code was generated.
 int32_t GPBMethod_Syntax_RawValue(GPBMethod *message);
 int32_t GPBMethod_Syntax_RawValue(GPBMethod *message);
+/// Sets the raw value of an @c GPBMethod's @c syntax property, allowing
+/// it to be set to a value that was not defined by the enum at the time the code
+/// was generated.
 void SetGPBMethod_Syntax_RawValue(GPBMethod *message, int32_t value);
 void SetGPBMethod_Syntax_RawValue(GPBMethod *message, int32_t value);
 
 
 #pragma mark - GPBMixin
 #pragma mark - GPBMixin
@@ -145,90 +162,90 @@ typedef GPB_ENUM(GPBMixin_FieldNumber) {
   GPBMixin_FieldNumber_Root = 2,
   GPBMixin_FieldNumber_Root = 2,
 };
 };
 
 
-// Declares an API to be included in this API. The including API must
-// redeclare all the methods from the included API, but documentation
-// and options are inherited as follows:
-//
-// - If after comment and whitespace stripping, the documentation
-//   string of the redeclared method is empty, it will be inherited
-//   from the original method.
-//
-// - Each annotation belonging to the service config (http,
-//   visibility) which is not set in the redeclared method will be
-//   inherited.
-//
-// - If an http annotation is inherited, the path pattern will be
-//   modified as follows. Any version prefix will be replaced by the
-//   version of the including API plus the [root][] path if specified.
-//
-// Example of a simple mixin:
-//
-//     package google.acl.v1;
-//     service AccessControl {
-//       // Get the underlying ACL object.
-//       rpc GetAcl(GetAclRequest) returns (Acl) {
-//         option (google.api.http).get = "/v1/{resource=**}:getAcl";
-//       }
-//     }
-//
-//     package google.storage.v2;
-//     service Storage {
-//       rpc GetAcl(GetAclRequest) returns (Acl);
-//
-//       // Get a data record.
-//       rpc GetData(GetDataRequest) returns (Data) {
-//         option (google.api.http).get = "/v2/{resource=**}";
-//       }
-//     }
-//
-// Example of a mixin configuration:
-//
-//     apis:
-//     - name: google.storage.v2.Storage
-//       mixins:
-//       - name: google.acl.v1.AccessControl
-//
-// The mixin construct implies that all methods in `AccessControl` are
-// also declared with same name and request/response types in
-// `Storage`. A documentation generator or annotation processor will
-// see the effective `Storage.GetAcl` method after inherting
-// documentation and annotations as follows:
-//
-//     service Storage {
-//       // Get the underlying ACL object.
-//       rpc GetAcl(GetAclRequest) returns (Acl) {
-//         option (google.api.http).get = "/v2/{resource=**}:getAcl";
-//       }
-//       ...
-//     }
-//
-// Note how the version in the path pattern changed from `v1` to `v2`.
-//
-// If the `root` field in the mixin is specified, it should be a
-// relative path under which inherited HTTP paths are placed. Example:
-//
-//     apis:
-//     - name: google.storage.v2.Storage
-//       mixins:
-//       - name: google.acl.v1.AccessControl
-//         root: acls
-//
-// This implies the following inherited HTTP annotation:
-//
-//     service Storage {
-//       // Get the underlying ACL object.
-//       rpc GetAcl(GetAclRequest) returns (Acl) {
-//         option (google.api.http).get = "/v2/acls/{resource=**}:getAcl";
-//       }
-//       ...
-//     }
+/// Declares an API to be included in this API. The including API must
+/// redeclare all the methods from the included API, but documentation
+/// and options are inherited as follows:
+///
+/// - If after comment and whitespace stripping, the documentation
+///   string of the redeclared method is empty, it will be inherited
+///   from the original method.
+///
+/// - Each annotation belonging to the service config (http,
+///   visibility) which is not set in the redeclared method will be
+///   inherited.
+///
+/// - If an http annotation is inherited, the path pattern will be
+///   modified as follows. Any version prefix will be replaced by the
+///   version of the including API plus the [root][] path if specified.
+///
+/// Example of a simple mixin:
+///
+///     package google.acl.v1;
+///     service AccessControl {
+///       // Get the underlying ACL object.
+///       rpc GetAcl(GetAclRequest) returns (Acl) {
+///         option (google.api.http).get = "/v1/{resource=**}:getAcl";
+///       }
+///     }
+///
+///     package google.storage.v2;
+///     service Storage {
+///       rpc GetAcl(GetAclRequest) returns (Acl);
+///
+///       // Get a data record.
+///       rpc GetData(GetDataRequest) returns (Data) {
+///         option (google.api.http).get = "/v2/{resource=**}";
+///       }
+///     }
+///
+/// Example of a mixin configuration:
+///
+///     apis:
+///     - name: google.storage.v2.Storage
+///       mixins:
+///       - name: google.acl.v1.AccessControl
+///
+/// The mixin construct implies that all methods in `AccessControl` are
+/// also declared with same name and request/response types in
+/// `Storage`. A documentation generator or annotation processor will
+/// see the effective `Storage.GetAcl` method after inherting
+/// documentation and annotations as follows:
+///
+///     service Storage {
+///       // Get the underlying ACL object.
+///       rpc GetAcl(GetAclRequest) returns (Acl) {
+///         option (google.api.http).get = "/v2/{resource=**}:getAcl";
+///       }
+///       ...
+///     }
+///
+/// Note how the version in the path pattern changed from `v1` to `v2`.
+///
+/// If the `root` field in the mixin is specified, it should be a
+/// relative path under which inherited HTTP paths are placed. Example:
+///
+///     apis:
+///     - name: google.storage.v2.Storage
+///       mixins:
+///       - name: google.acl.v1.AccessControl
+///         root: acls
+///
+/// This implies the following inherited HTTP annotation:
+///
+///     service Storage {
+///       // Get the underlying ACL object.
+///       rpc GetAcl(GetAclRequest) returns (Acl) {
+///         option (google.api.http).get = "/v2/acls/{resource=**}:getAcl";
+///       }
+///       ...
+///     }
 @interface GPBMixin : GPBMessage
 @interface GPBMixin : GPBMessage
 
 
-// The fully qualified name of the API which is included.
+/// The fully qualified name of the API which is included.
 @property(nonatomic, readwrite, copy, null_resettable) NSString *name;
 @property(nonatomic, readwrite, copy, null_resettable) NSString *name;
 
 
-// If non-empty specifies a path under which inherited HTTP paths
-// are rooted.
+/// If non-empty specifies a path under which inherited HTTP paths
+/// are rooted.
 @property(nonatomic, readwrite, copy, null_resettable) NSString *root;
 @property(nonatomic, readwrite, copy, null_resettable) NSString *root;
 
 
 @end
 @end

+ 49 - 102
objectivec/google/protobuf/Api.pbobjc.m

@@ -71,80 +71,66 @@ typedef struct GPBApi__storage_ {
     static GPBMessageFieldDescription fields[] = {
     static GPBMessageFieldDescription fields[] = {
       {
       {
         .name = "name",
         .name = "name",
+        .dataTypeSpecific.className = NULL,
         .number = GPBApi_FieldNumber_Name,
         .number = GPBApi_FieldNumber_Name,
         .hasIndex = 0,
         .hasIndex = 0,
+        .offset = (uint32_t)offsetof(GPBApi__storage_, name),
         .flags = GPBFieldOptional,
         .flags = GPBFieldOptional,
         .dataType = GPBDataTypeString,
         .dataType = GPBDataTypeString,
-        .offset = offsetof(GPBApi__storage_, name),
-        .defaultValue.valueString = nil,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
       },
       },
       {
       {
         .name = "methodsArray",
         .name = "methodsArray",
+        .dataTypeSpecific.className = GPBStringifySymbol(GPBMethod),
         .number = GPBApi_FieldNumber_MethodsArray,
         .number = GPBApi_FieldNumber_MethodsArray,
         .hasIndex = GPBNoHasBit,
         .hasIndex = GPBNoHasBit,
+        .offset = (uint32_t)offsetof(GPBApi__storage_, methodsArray),
         .flags = GPBFieldRepeated,
         .flags = GPBFieldRepeated,
         .dataType = GPBDataTypeMessage,
         .dataType = GPBDataTypeMessage,
-        .offset = offsetof(GPBApi__storage_, methodsArray),
-        .defaultValue.valueMessage = nil,
-        .dataTypeSpecific.className = GPBStringifySymbol(GPBMethod),
-        .fieldOptions = NULL,
       },
       },
       {
       {
         .name = "optionsArray",
         .name = "optionsArray",
+        .dataTypeSpecific.className = GPBStringifySymbol(GPBOption),
         .number = GPBApi_FieldNumber_OptionsArray,
         .number = GPBApi_FieldNumber_OptionsArray,
         .hasIndex = GPBNoHasBit,
         .hasIndex = GPBNoHasBit,
+        .offset = (uint32_t)offsetof(GPBApi__storage_, optionsArray),
         .flags = GPBFieldRepeated,
         .flags = GPBFieldRepeated,
         .dataType = GPBDataTypeMessage,
         .dataType = GPBDataTypeMessage,
-        .offset = offsetof(GPBApi__storage_, optionsArray),
-        .defaultValue.valueMessage = nil,
-        .dataTypeSpecific.className = GPBStringifySymbol(GPBOption),
-        .fieldOptions = NULL,
       },
       },
       {
       {
         .name = "version",
         .name = "version",
+        .dataTypeSpecific.className = NULL,
         .number = GPBApi_FieldNumber_Version,
         .number = GPBApi_FieldNumber_Version,
-        .hasIndex = 3,
+        .hasIndex = 1,
+        .offset = (uint32_t)offsetof(GPBApi__storage_, version),
         .flags = GPBFieldOptional,
         .flags = GPBFieldOptional,
         .dataType = GPBDataTypeString,
         .dataType = GPBDataTypeString,
-        .offset = offsetof(GPBApi__storage_, version),
-        .defaultValue.valueString = nil,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
       },
       },
       {
       {
         .name = "sourceContext",
         .name = "sourceContext",
+        .dataTypeSpecific.className = GPBStringifySymbol(GPBSourceContext),
         .number = GPBApi_FieldNumber_SourceContext,
         .number = GPBApi_FieldNumber_SourceContext,
-        .hasIndex = 4,
+        .hasIndex = 2,
+        .offset = (uint32_t)offsetof(GPBApi__storage_, sourceContext),
         .flags = GPBFieldOptional,
         .flags = GPBFieldOptional,
         .dataType = GPBDataTypeMessage,
         .dataType = GPBDataTypeMessage,
-        .offset = offsetof(GPBApi__storage_, sourceContext),
-        .defaultValue.valueMessage = nil,
-        .dataTypeSpecific.className = GPBStringifySymbol(GPBSourceContext),
-        .fieldOptions = NULL,
       },
       },
       {
       {
         .name = "mixinsArray",
         .name = "mixinsArray",
+        .dataTypeSpecific.className = GPBStringifySymbol(GPBMixin),
         .number = GPBApi_FieldNumber_MixinsArray,
         .number = GPBApi_FieldNumber_MixinsArray,
         .hasIndex = GPBNoHasBit,
         .hasIndex = GPBNoHasBit,
+        .offset = (uint32_t)offsetof(GPBApi__storage_, mixinsArray),
         .flags = GPBFieldRepeated,
         .flags = GPBFieldRepeated,
         .dataType = GPBDataTypeMessage,
         .dataType = GPBDataTypeMessage,
-        .offset = offsetof(GPBApi__storage_, mixinsArray),
-        .defaultValue.valueMessage = nil,
-        .dataTypeSpecific.className = GPBStringifySymbol(GPBMixin),
-        .fieldOptions = NULL,
       },
       },
       {
       {
         .name = "syntax",
         .name = "syntax",
+        .dataTypeSpecific.enumDescFunc = GPBSyntax_EnumDescriptor,
         .number = GPBApi_FieldNumber_Syntax,
         .number = GPBApi_FieldNumber_Syntax,
-        .hasIndex = 6,
+        .hasIndex = 3,
+        .offset = (uint32_t)offsetof(GPBApi__storage_, syntax),
         .flags = GPBFieldOptional | GPBFieldHasEnumDescriptor,
         .flags = GPBFieldOptional | GPBFieldHasEnumDescriptor,
         .dataType = GPBDataTypeEnum,
         .dataType = GPBDataTypeEnum,
-        .offset = offsetof(GPBApi__storage_, syntax),
-        .defaultValue.valueEnum = GPBSyntax_SyntaxProto2,
-        .dataTypeSpecific.enumDescFunc = GPBSyntax_EnumDescriptor,
-        .fieldOptions = NULL,
       },
       },
     };
     };
     GPBDescriptor *localDescriptor =
     GPBDescriptor *localDescriptor =
@@ -152,15 +138,9 @@ typedef struct GPBApi__storage_ {
                                      rootClass:[GPBApiRoot class]
                                      rootClass:[GPBApiRoot class]
                                           file:GPBApiRoot_FileDescriptor()
                                           file:GPBApiRoot_FileDescriptor()
                                         fields:fields
                                         fields:fields
-                                    fieldCount:sizeof(fields) / sizeof(GPBMessageFieldDescription)
-                                        oneofs:NULL
-                                    oneofCount:0
-                                         enums:NULL
-                                     enumCount:0
-                                        ranges:NULL
-                                    rangeCount:0
+                                    fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription))
                                    storageSize:sizeof(GPBApi__storage_)
                                    storageSize:sizeof(GPBApi__storage_)
-                                    wireFormat:NO];
+                                         flags:0];
     NSAssert(descriptor == nil, @"Startup recursed!");
     NSAssert(descriptor == nil, @"Startup recursed!");
     descriptor = localDescriptor;
     descriptor = localDescriptor;
   }
   }
@@ -195,8 +175,6 @@ void SetGPBApi_Syntax_RawValue(GPBApi *message, int32_t value) {
 
 
 typedef struct GPBMethod__storage_ {
 typedef struct GPBMethod__storage_ {
   uint32_t _has_storage_[1];
   uint32_t _has_storage_[1];
-  BOOL requestStreaming;
-  BOOL responseStreaming;
   GPBSyntax syntax;
   GPBSyntax syntax;
   NSString *name;
   NSString *name;
   NSString *requestTypeURL;
   NSString *requestTypeURL;
@@ -212,102 +190,81 @@ typedef struct GPBMethod__storage_ {
     static GPBMessageFieldDescription fields[] = {
     static GPBMessageFieldDescription fields[] = {
       {
       {
         .name = "name",
         .name = "name",
+        .dataTypeSpecific.className = NULL,
         .number = GPBMethod_FieldNumber_Name,
         .number = GPBMethod_FieldNumber_Name,
         .hasIndex = 0,
         .hasIndex = 0,
+        .offset = (uint32_t)offsetof(GPBMethod__storage_, name),
         .flags = GPBFieldOptional,
         .flags = GPBFieldOptional,
         .dataType = GPBDataTypeString,
         .dataType = GPBDataTypeString,
-        .offset = offsetof(GPBMethod__storage_, name),
-        .defaultValue.valueString = nil,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
       },
       },
       {
       {
         .name = "requestTypeURL",
         .name = "requestTypeURL",
+        .dataTypeSpecific.className = NULL,
         .number = GPBMethod_FieldNumber_RequestTypeURL,
         .number = GPBMethod_FieldNumber_RequestTypeURL,
         .hasIndex = 1,
         .hasIndex = 1,
+        .offset = (uint32_t)offsetof(GPBMethod__storage_, requestTypeURL),
         .flags = GPBFieldOptional | GPBFieldTextFormatNameCustom,
         .flags = GPBFieldOptional | GPBFieldTextFormatNameCustom,
         .dataType = GPBDataTypeString,
         .dataType = GPBDataTypeString,
-        .offset = offsetof(GPBMethod__storage_, requestTypeURL),
-        .defaultValue.valueString = nil,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
       },
       },
       {
       {
         .name = "requestStreaming",
         .name = "requestStreaming",
+        .dataTypeSpecific.className = NULL,
         .number = GPBMethod_FieldNumber_RequestStreaming,
         .number = GPBMethod_FieldNumber_RequestStreaming,
         .hasIndex = 2,
         .hasIndex = 2,
+        .offset = 3,  // Stored in _has_storage_ to save space.
         .flags = GPBFieldOptional,
         .flags = GPBFieldOptional,
         .dataType = GPBDataTypeBool,
         .dataType = GPBDataTypeBool,
-        .offset = offsetof(GPBMethod__storage_, requestStreaming),
-        .defaultValue.valueBool = NO,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
       },
       },
       {
       {
         .name = "responseTypeURL",
         .name = "responseTypeURL",
+        .dataTypeSpecific.className = NULL,
         .number = GPBMethod_FieldNumber_ResponseTypeURL,
         .number = GPBMethod_FieldNumber_ResponseTypeURL,
-        .hasIndex = 3,
+        .hasIndex = 4,
+        .offset = (uint32_t)offsetof(GPBMethod__storage_, responseTypeURL),
         .flags = GPBFieldOptional | GPBFieldTextFormatNameCustom,
         .flags = GPBFieldOptional | GPBFieldTextFormatNameCustom,
         .dataType = GPBDataTypeString,
         .dataType = GPBDataTypeString,
-        .offset = offsetof(GPBMethod__storage_, responseTypeURL),
-        .defaultValue.valueString = nil,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
       },
       },
       {
       {
         .name = "responseStreaming",
         .name = "responseStreaming",
+        .dataTypeSpecific.className = NULL,
         .number = GPBMethod_FieldNumber_ResponseStreaming,
         .number = GPBMethod_FieldNumber_ResponseStreaming,
-        .hasIndex = 4,
+        .hasIndex = 5,
+        .offset = 6,  // Stored in _has_storage_ to save space.
         .flags = GPBFieldOptional,
         .flags = GPBFieldOptional,
         .dataType = GPBDataTypeBool,
         .dataType = GPBDataTypeBool,
-        .offset = offsetof(GPBMethod__storage_, responseStreaming),
-        .defaultValue.valueBool = NO,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
       },
       },
       {
       {
         .name = "optionsArray",
         .name = "optionsArray",
+        .dataTypeSpecific.className = GPBStringifySymbol(GPBOption),
         .number = GPBMethod_FieldNumber_OptionsArray,
         .number = GPBMethod_FieldNumber_OptionsArray,
         .hasIndex = GPBNoHasBit,
         .hasIndex = GPBNoHasBit,
+        .offset = (uint32_t)offsetof(GPBMethod__storage_, optionsArray),
         .flags = GPBFieldRepeated,
         .flags = GPBFieldRepeated,
         .dataType = GPBDataTypeMessage,
         .dataType = GPBDataTypeMessage,
-        .offset = offsetof(GPBMethod__storage_, optionsArray),
-        .defaultValue.valueMessage = nil,
-        .dataTypeSpecific.className = GPBStringifySymbol(GPBOption),
-        .fieldOptions = NULL,
       },
       },
       {
       {
         .name = "syntax",
         .name = "syntax",
+        .dataTypeSpecific.enumDescFunc = GPBSyntax_EnumDescriptor,
         .number = GPBMethod_FieldNumber_Syntax,
         .number = GPBMethod_FieldNumber_Syntax,
-        .hasIndex = 6,
+        .hasIndex = 7,
+        .offset = (uint32_t)offsetof(GPBMethod__storage_, syntax),
         .flags = GPBFieldOptional | GPBFieldHasEnumDescriptor,
         .flags = GPBFieldOptional | GPBFieldHasEnumDescriptor,
         .dataType = GPBDataTypeEnum,
         .dataType = GPBDataTypeEnum,
-        .offset = offsetof(GPBMethod__storage_, syntax),
-        .defaultValue.valueEnum = GPBSyntax_SyntaxProto2,
-        .dataTypeSpecific.enumDescFunc = GPBSyntax_EnumDescriptor,
-        .fieldOptions = NULL,
       },
       },
     };
     };
-#if GPBOBJC_SKIP_MESSAGE_TEXTFORMAT_EXTRAS
-    const char *extraTextFormatInfo = NULL;
-#else
-    static const char *extraTextFormatInfo = "\002\002\007\244\241!!\000\004\010\244\241!!\000";
-#endif  // GPBOBJC_SKIP_MESSAGE_TEXTFORMAT_EXTRAS
     GPBDescriptor *localDescriptor =
     GPBDescriptor *localDescriptor =
         [GPBDescriptor allocDescriptorForClass:[GPBMethod class]
         [GPBDescriptor allocDescriptorForClass:[GPBMethod class]
                                      rootClass:[GPBApiRoot class]
                                      rootClass:[GPBApiRoot class]
                                           file:GPBApiRoot_FileDescriptor()
                                           file:GPBApiRoot_FileDescriptor()
                                         fields:fields
                                         fields:fields
-                                    fieldCount:sizeof(fields) / sizeof(GPBMessageFieldDescription)
-                                        oneofs:NULL
-                                    oneofCount:0
-                                         enums:NULL
-                                     enumCount:0
-                                        ranges:NULL
-                                    rangeCount:0
+                                    fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription))
                                    storageSize:sizeof(GPBMethod__storage_)
                                    storageSize:sizeof(GPBMethod__storage_)
-                                    wireFormat:NO
-                           extraTextFormatInfo:extraTextFormatInfo];
+                                         flags:0];
+#if !GPBOBJC_SKIP_MESSAGE_TEXTFORMAT_EXTRAS
+    static const char *extraTextFormatInfo =
+        "\002\002\007\244\241!!\000\004\010\244\241!!\000";
+    [localDescriptor setupExtraTextInfo:extraTextFormatInfo];
+#endif  // !GPBOBJC_SKIP_MESSAGE_TEXTFORMAT_EXTRAS
     NSAssert(descriptor == nil, @"Startup recursed!");
     NSAssert(descriptor == nil, @"Startup recursed!");
     descriptor = localDescriptor;
     descriptor = localDescriptor;
   }
   }
@@ -349,25 +306,21 @@ typedef struct GPBMixin__storage_ {
     static GPBMessageFieldDescription fields[] = {
     static GPBMessageFieldDescription fields[] = {
       {
       {
         .name = "name",
         .name = "name",
+        .dataTypeSpecific.className = NULL,
         .number = GPBMixin_FieldNumber_Name,
         .number = GPBMixin_FieldNumber_Name,
         .hasIndex = 0,
         .hasIndex = 0,
+        .offset = (uint32_t)offsetof(GPBMixin__storage_, name),
         .flags = GPBFieldOptional,
         .flags = GPBFieldOptional,
         .dataType = GPBDataTypeString,
         .dataType = GPBDataTypeString,
-        .offset = offsetof(GPBMixin__storage_, name),
-        .defaultValue.valueString = nil,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
       },
       },
       {
       {
         .name = "root",
         .name = "root",
+        .dataTypeSpecific.className = NULL,
         .number = GPBMixin_FieldNumber_Root,
         .number = GPBMixin_FieldNumber_Root,
         .hasIndex = 1,
         .hasIndex = 1,
+        .offset = (uint32_t)offsetof(GPBMixin__storage_, root),
         .flags = GPBFieldOptional,
         .flags = GPBFieldOptional,
         .dataType = GPBDataTypeString,
         .dataType = GPBDataTypeString,
-        .offset = offsetof(GPBMixin__storage_, root),
-        .defaultValue.valueString = nil,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
       },
       },
     };
     };
     GPBDescriptor *localDescriptor =
     GPBDescriptor *localDescriptor =
@@ -375,15 +328,9 @@ typedef struct GPBMixin__storage_ {
                                      rootClass:[GPBApiRoot class]
                                      rootClass:[GPBApiRoot class]
                                           file:GPBApiRoot_FileDescriptor()
                                           file:GPBApiRoot_FileDescriptor()
                                         fields:fields
                                         fields:fields
-                                    fieldCount:sizeof(fields) / sizeof(GPBMessageFieldDescription)
-                                        oneofs:NULL
-                                    oneofCount:0
-                                         enums:NULL
-                                     enumCount:0
-                                        ranges:NULL
-                                    rangeCount:0
+                                    fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription))
                                    storageSize:sizeof(GPBMixin__storage_)
                                    storageSize:sizeof(GPBMixin__storage_)
-                                    wireFormat:NO];
+                                         flags:0];
     NSAssert(descriptor == nil, @"Startup recursed!");
     NSAssert(descriptor == nil, @"Startup recursed!");
     descriptor = localDescriptor;
     descriptor = localDescriptor;
   }
   }

+ 0 - 1199
objectivec/google/protobuf/Descriptor.pbobjc.h

@@ -1,1199 +0,0 @@
-// Generated by the protocol buffer compiler.  DO NOT EDIT!
-// source: google/protobuf/descriptor.proto
-
-#import "GPBProtocolBuffers.h"
-
-#if GOOGLE_PROTOBUF_OBJC_GEN_VERSION != 30000
-#error This file was generated by a different version of protoc which is incompatible with your Protocol Buffer library sources.
-#endif
-
-// @@protoc_insertion_point(imports)
-
-CF_EXTERN_C_BEGIN
-
-@class GPBDescriptorProto;
-@class GPBDescriptorProto_ExtensionRange;
-@class GPBDescriptorProto_ReservedRange;
-@class GPBEnumDescriptorProto;
-@class GPBEnumOptions;
-@class GPBEnumValueDescriptorProto;
-@class GPBEnumValueOptions;
-@class GPBFieldDescriptorProto;
-@class GPBFieldOptions;
-@class GPBFileDescriptorProto;
-@class GPBFileOptions;
-@class GPBGeneratedCodeInfo_Annotation;
-@class GPBMessageOptions;
-@class GPBMethodDescriptorProto;
-@class GPBMethodOptions;
-@class GPBOneofDescriptorProto;
-@class GPBServiceDescriptorProto;
-@class GPBServiceOptions;
-@class GPBSourceCodeInfo;
-@class GPBSourceCodeInfo_Location;
-@class GPBUninterpretedOption;
-@class GPBUninterpretedOption_NamePart;
-
-NS_ASSUME_NONNULL_BEGIN
-
-#pragma mark - Enum GPBFieldDescriptorProto_Type
-
-typedef GPB_ENUM(GPBFieldDescriptorProto_Type) {
-  // 0 is reserved for errors.
-  // Order is weird for historical reasons.
-  GPBFieldDescriptorProto_Type_TypeDouble = 1,
-  GPBFieldDescriptorProto_Type_TypeFloat = 2,
-
-  // Not ZigZag encoded.  Negative numbers take 10 bytes.  Use TYPE_SINT64 if
-  // negative values are likely.
-  GPBFieldDescriptorProto_Type_TypeInt64 = 3,
-  GPBFieldDescriptorProto_Type_TypeUint64 = 4,
-
-  // Not ZigZag encoded.  Negative numbers take 10 bytes.  Use TYPE_SINT32 if
-  // negative values are likely.
-  GPBFieldDescriptorProto_Type_TypeInt32 = 5,
-  GPBFieldDescriptorProto_Type_TypeFixed64 = 6,
-  GPBFieldDescriptorProto_Type_TypeFixed32 = 7,
-  GPBFieldDescriptorProto_Type_TypeBool = 8,
-  GPBFieldDescriptorProto_Type_TypeString = 9,
-
-  // Tag-delimited aggregate.
-  GPBFieldDescriptorProto_Type_TypeGroup = 10,
-
-  // Length-delimited aggregate.
-  GPBFieldDescriptorProto_Type_TypeMessage = 11,
-
-  // New in version 2.
-  GPBFieldDescriptorProto_Type_TypeBytes = 12,
-  GPBFieldDescriptorProto_Type_TypeUint32 = 13,
-  GPBFieldDescriptorProto_Type_TypeEnum = 14,
-  GPBFieldDescriptorProto_Type_TypeSfixed32 = 15,
-  GPBFieldDescriptorProto_Type_TypeSfixed64 = 16,
-
-  // Uses ZigZag encoding.
-  GPBFieldDescriptorProto_Type_TypeSint32 = 17,
-
-  // Uses ZigZag encoding.
-  GPBFieldDescriptorProto_Type_TypeSint64 = 18,
-};
-
-GPBEnumDescriptor *GPBFieldDescriptorProto_Type_EnumDescriptor(void);
-
-BOOL GPBFieldDescriptorProto_Type_IsValidValue(int32_t value);
-
-#pragma mark - Enum GPBFieldDescriptorProto_Label
-
-typedef GPB_ENUM(GPBFieldDescriptorProto_Label) {
-  // 0 is reserved for errors
-  GPBFieldDescriptorProto_Label_LabelOptional = 1,
-  GPBFieldDescriptorProto_Label_LabelRequired = 2,
-
-  // TODO(sanjay): Should we add LABEL_MAP?
-  GPBFieldDescriptorProto_Label_LabelRepeated = 3,
-};
-
-GPBEnumDescriptor *GPBFieldDescriptorProto_Label_EnumDescriptor(void);
-
-BOOL GPBFieldDescriptorProto_Label_IsValidValue(int32_t value);
-
-#pragma mark - Enum GPBFileOptions_OptimizeMode
-
-// Generated classes can be optimized for speed or code size.
-typedef GPB_ENUM(GPBFileOptions_OptimizeMode) {
-  // Generate complete code for parsing, serialization,
-  GPBFileOptions_OptimizeMode_Speed = 1,
-
-  // etc.
-  GPBFileOptions_OptimizeMode_CodeSize = 2,
-
-  // Generate code using MessageLite and the lite runtime.
-  GPBFileOptions_OptimizeMode_LiteRuntime = 3,
-};
-
-GPBEnumDescriptor *GPBFileOptions_OptimizeMode_EnumDescriptor(void);
-
-BOOL GPBFileOptions_OptimizeMode_IsValidValue(int32_t value);
-
-#pragma mark - Enum GPBFieldOptions_CType
-
-typedef GPB_ENUM(GPBFieldOptions_CType) {
-  // Default mode.
-  GPBFieldOptions_CType_String = 0,
-  GPBFieldOptions_CType_Cord = 1,
-  GPBFieldOptions_CType_StringPiece = 2,
-};
-
-GPBEnumDescriptor *GPBFieldOptions_CType_EnumDescriptor(void);
-
-BOOL GPBFieldOptions_CType_IsValidValue(int32_t value);
-
-#pragma mark - Enum GPBFieldOptions_JSType
-
-typedef GPB_ENUM(GPBFieldOptions_JSType) {
-  // Use the default type.
-  GPBFieldOptions_JSType_JsNormal = 0,
-
-  // Use JavaScript strings.
-  GPBFieldOptions_JSType_JsString = 1,
-
-  // Use JavaScript numbers.
-  GPBFieldOptions_JSType_JsNumber = 2,
-};
-
-GPBEnumDescriptor *GPBFieldOptions_JSType_EnumDescriptor(void);
-
-BOOL GPBFieldOptions_JSType_IsValidValue(int32_t value);
-
-#pragma mark - GPBDescriptorRoot
-
-@interface GPBDescriptorRoot : GPBRootObject
-
-// The base class provides:
-//   + (GPBExtensionRegistry *)extensionRegistry;
-// which is an GPBExtensionRegistry that includes all the extensions defined by
-// this file and all files that it depends on.
-
-@end
-
-#pragma mark - GPBFileDescriptorSet
-
-typedef GPB_ENUM(GPBFileDescriptorSet_FieldNumber) {
-  GPBFileDescriptorSet_FieldNumber_FileArray = 1,
-};
-
-// The protocol compiler can output a FileDescriptorSet containing the .proto
-// files it parses.
-@interface GPBFileDescriptorSet : GPBMessage
-
-@property(nonatomic, readwrite, strong, null_resettable) NSMutableArray<GPBFileDescriptorProto*> *fileArray;
-@property(nonatomic, readonly) NSUInteger fileArray_Count;
-
-@end
-
-#pragma mark - GPBFileDescriptorProto
-
-typedef GPB_ENUM(GPBFileDescriptorProto_FieldNumber) {
-  GPBFileDescriptorProto_FieldNumber_Name = 1,
-  GPBFileDescriptorProto_FieldNumber_Package = 2,
-  GPBFileDescriptorProto_FieldNumber_DependencyArray = 3,
-  GPBFileDescriptorProto_FieldNumber_MessageTypeArray = 4,
-  GPBFileDescriptorProto_FieldNumber_EnumTypeArray = 5,
-  GPBFileDescriptorProto_FieldNumber_ServiceArray = 6,
-  GPBFileDescriptorProto_FieldNumber_ExtensionArray = 7,
-  GPBFileDescriptorProto_FieldNumber_Options = 8,
-  GPBFileDescriptorProto_FieldNumber_SourceCodeInfo = 9,
-  GPBFileDescriptorProto_FieldNumber_PublicDependencyArray = 10,
-  GPBFileDescriptorProto_FieldNumber_WeakDependencyArray = 11,
-  GPBFileDescriptorProto_FieldNumber_Syntax = 12,
-};
-
-// Describes a complete .proto file.
-@interface GPBFileDescriptorProto : GPBMessage
-
-// file name, relative to root of source tree
-@property(nonatomic, readwrite) BOOL hasName;
-@property(nonatomic, readwrite, copy, null_resettable) NSString *name;
-
-// e.g. "foo", "foo.bar", etc.
-@property(nonatomic, readwrite) BOOL hasPackage;
-@property(nonatomic, readwrite, copy, null_resettable) NSString *package;
-
-// Names of files imported by this file.
-@property(nonatomic, readwrite, strong, null_resettable) NSMutableArray<NSString*> *dependencyArray;
-@property(nonatomic, readonly) NSUInteger dependencyArray_Count;
-
-// Indexes of the public imported files in the dependency list above.
-@property(nonatomic, readwrite, strong, null_resettable) GPBInt32Array *publicDependencyArray;
-@property(nonatomic, readonly) NSUInteger publicDependencyArray_Count;
-
-// Indexes of the weak imported files in the dependency list.
-// For Google-internal migration only. Do not use.
-@property(nonatomic, readwrite, strong, null_resettable) GPBInt32Array *weakDependencyArray;
-@property(nonatomic, readonly) NSUInteger weakDependencyArray_Count;
-
-// All top-level definitions in this file.
-@property(nonatomic, readwrite, strong, null_resettable) NSMutableArray<GPBDescriptorProto*> *messageTypeArray;
-@property(nonatomic, readonly) NSUInteger messageTypeArray_Count;
-
-@property(nonatomic, readwrite, strong, null_resettable) NSMutableArray<GPBEnumDescriptorProto*> *enumTypeArray;
-@property(nonatomic, readonly) NSUInteger enumTypeArray_Count;
-
-@property(nonatomic, readwrite, strong, null_resettable) NSMutableArray<GPBServiceDescriptorProto*> *serviceArray;
-@property(nonatomic, readonly) NSUInteger serviceArray_Count;
-
-@property(nonatomic, readwrite, strong, null_resettable) NSMutableArray<GPBFieldDescriptorProto*> *extensionArray;
-@property(nonatomic, readonly) NSUInteger extensionArray_Count;
-
-@property(nonatomic, readwrite) BOOL hasOptions;
-@property(nonatomic, readwrite, strong, null_resettable) GPBFileOptions *options;
-
-// This field contains optional information about the original source code.
-// You may safely remove this entire field without harming runtime
-// functionality of the descriptors -- the information is needed only by
-// development tools.
-@property(nonatomic, readwrite) BOOL hasSourceCodeInfo;
-@property(nonatomic, readwrite, strong, null_resettable) GPBSourceCodeInfo *sourceCodeInfo;
-
-// The syntax of the proto file.
-// The supported values are "proto2" and "proto3".
-@property(nonatomic, readwrite) BOOL hasSyntax;
-@property(nonatomic, readwrite, copy, null_resettable) NSString *syntax;
-
-@end
-
-#pragma mark - GPBDescriptorProto
-
-typedef GPB_ENUM(GPBDescriptorProto_FieldNumber) {
-  GPBDescriptorProto_FieldNumber_Name = 1,
-  GPBDescriptorProto_FieldNumber_FieldArray = 2,
-  GPBDescriptorProto_FieldNumber_NestedTypeArray = 3,
-  GPBDescriptorProto_FieldNumber_EnumTypeArray = 4,
-  GPBDescriptorProto_FieldNumber_ExtensionRangeArray = 5,
-  GPBDescriptorProto_FieldNumber_ExtensionArray = 6,
-  GPBDescriptorProto_FieldNumber_Options = 7,
-  GPBDescriptorProto_FieldNumber_OneofDeclArray = 8,
-  GPBDescriptorProto_FieldNumber_ReservedRangeArray = 9,
-  GPBDescriptorProto_FieldNumber_ReservedNameArray = 10,
-};
-
-// Describes a message type.
-@interface GPBDescriptorProto : GPBMessage
-
-@property(nonatomic, readwrite) BOOL hasName;
-@property(nonatomic, readwrite, copy, null_resettable) NSString *name;
-
-@property(nonatomic, readwrite, strong, null_resettable) NSMutableArray<GPBFieldDescriptorProto*> *fieldArray;
-@property(nonatomic, readonly) NSUInteger fieldArray_Count;
-
-@property(nonatomic, readwrite, strong, null_resettable) NSMutableArray<GPBFieldDescriptorProto*> *extensionArray;
-@property(nonatomic, readonly) NSUInteger extensionArray_Count;
-
-@property(nonatomic, readwrite, strong, null_resettable) NSMutableArray<GPBDescriptorProto*> *nestedTypeArray;
-@property(nonatomic, readonly) NSUInteger nestedTypeArray_Count;
-
-@property(nonatomic, readwrite, strong, null_resettable) NSMutableArray<GPBEnumDescriptorProto*> *enumTypeArray;
-@property(nonatomic, readonly) NSUInteger enumTypeArray_Count;
-
-@property(nonatomic, readwrite, strong, null_resettable) NSMutableArray<GPBDescriptorProto_ExtensionRange*> *extensionRangeArray;
-@property(nonatomic, readonly) NSUInteger extensionRangeArray_Count;
-
-@property(nonatomic, readwrite, strong, null_resettable) NSMutableArray<GPBOneofDescriptorProto*> *oneofDeclArray;
-@property(nonatomic, readonly) NSUInteger oneofDeclArray_Count;
-
-@property(nonatomic, readwrite) BOOL hasOptions;
-@property(nonatomic, readwrite, strong, null_resettable) GPBMessageOptions *options;
-
-@property(nonatomic, readwrite, strong, null_resettable) NSMutableArray<GPBDescriptorProto_ReservedRange*> *reservedRangeArray;
-@property(nonatomic, readonly) NSUInteger reservedRangeArray_Count;
-
-// Reserved field names, which may not be used by fields in the same message.
-// A given name may only be reserved once.
-@property(nonatomic, readwrite, strong, null_resettable) NSMutableArray<NSString*> *reservedNameArray;
-@property(nonatomic, readonly) NSUInteger reservedNameArray_Count;
-
-@end
-
-#pragma mark - GPBDescriptorProto_ExtensionRange
-
-typedef GPB_ENUM(GPBDescriptorProto_ExtensionRange_FieldNumber) {
-  GPBDescriptorProto_ExtensionRange_FieldNumber_Start = 1,
-  GPBDescriptorProto_ExtensionRange_FieldNumber_End = 2,
-};
-
-@interface GPBDescriptorProto_ExtensionRange : GPBMessage
-
-@property(nonatomic, readwrite) BOOL hasStart;
-@property(nonatomic, readwrite) int32_t start;
-
-@property(nonatomic, readwrite) BOOL hasEnd;
-@property(nonatomic, readwrite) int32_t end;
-
-@end
-
-#pragma mark - GPBDescriptorProto_ReservedRange
-
-typedef GPB_ENUM(GPBDescriptorProto_ReservedRange_FieldNumber) {
-  GPBDescriptorProto_ReservedRange_FieldNumber_Start = 1,
-  GPBDescriptorProto_ReservedRange_FieldNumber_End = 2,
-};
-
-// Range of reserved tag numbers. Reserved tag numbers may not be used by
-// fields or extension ranges in the same message. Reserved ranges may
-// not overlap.
-@interface GPBDescriptorProto_ReservedRange : GPBMessage
-
-// Inclusive.
-@property(nonatomic, readwrite) BOOL hasStart;
-@property(nonatomic, readwrite) int32_t start;
-
-// Exclusive.
-@property(nonatomic, readwrite) BOOL hasEnd;
-@property(nonatomic, readwrite) int32_t end;
-
-@end
-
-#pragma mark - GPBFieldDescriptorProto
-
-typedef GPB_ENUM(GPBFieldDescriptorProto_FieldNumber) {
-  GPBFieldDescriptorProto_FieldNumber_Name = 1,
-  GPBFieldDescriptorProto_FieldNumber_Extendee = 2,
-  GPBFieldDescriptorProto_FieldNumber_Number = 3,
-  GPBFieldDescriptorProto_FieldNumber_Label = 4,
-  GPBFieldDescriptorProto_FieldNumber_Type = 5,
-  GPBFieldDescriptorProto_FieldNumber_TypeName = 6,
-  GPBFieldDescriptorProto_FieldNumber_DefaultValue = 7,
-  GPBFieldDescriptorProto_FieldNumber_Options = 8,
-  GPBFieldDescriptorProto_FieldNumber_OneofIndex = 9,
-  GPBFieldDescriptorProto_FieldNumber_JsonName = 10,
-};
-
-// Describes a field within a message.
-@interface GPBFieldDescriptorProto : GPBMessage
-
-@property(nonatomic, readwrite) BOOL hasName;
-@property(nonatomic, readwrite, copy, null_resettable) NSString *name;
-
-@property(nonatomic, readwrite) BOOL hasNumber;
-@property(nonatomic, readwrite) int32_t number;
-
-@property(nonatomic, readwrite) BOOL hasLabel;
-@property(nonatomic, readwrite) GPBFieldDescriptorProto_Label label;
-
-// If type_name is set, this need not be set.  If both this and type_name
-// are set, this must be one of TYPE_ENUM, TYPE_MESSAGE or TYPE_GROUP.
-@property(nonatomic, readwrite) BOOL hasType;
-@property(nonatomic, readwrite) GPBFieldDescriptorProto_Type type;
-
-// For message and enum types, this is the name of the type.  If the name
-// starts with a '.', it is fully-qualified.  Otherwise, C++-like scoping
-// rules are used to find the type (i.e. first the nested types within this
-// message are searched, then within the parent, on up to the root
-// namespace).
-@property(nonatomic, readwrite) BOOL hasTypeName;
-@property(nonatomic, readwrite, copy, null_resettable) NSString *typeName;
-
-// For extensions, this is the name of the type being extended.  It is
-// resolved in the same manner as type_name.
-@property(nonatomic, readwrite) BOOL hasExtendee;
-@property(nonatomic, readwrite, copy, null_resettable) NSString *extendee;
-
-// For numeric types, contains the original text representation of the value.
-// For booleans, "true" or "false".
-// For strings, contains the default text contents (not escaped in any way).
-// For bytes, contains the C escaped value.  All bytes >= 128 are escaped.
-// TODO(kenton):  Base-64 encode?
-@property(nonatomic, readwrite) BOOL hasDefaultValue;
-@property(nonatomic, readwrite, copy, null_resettable) NSString *defaultValue;
-
-// If set, gives the index of a oneof in the containing type's oneof_decl
-// list.  This field is a member of that oneof.
-@property(nonatomic, readwrite) BOOL hasOneofIndex;
-@property(nonatomic, readwrite) int32_t oneofIndex;
-
-// JSON name of this field. The value is set by protocol compiler. If the
-// user has set a "json_name" option on this field, that option's value
-// will be used. Otherwise, it's deduced from the field's name by converting
-// it to camelCase.
-@property(nonatomic, readwrite) BOOL hasJsonName;
-@property(nonatomic, readwrite, copy, null_resettable) NSString *jsonName;
-
-@property(nonatomic, readwrite) BOOL hasOptions;
-@property(nonatomic, readwrite, strong, null_resettable) GPBFieldOptions *options;
-
-@end
-
-#pragma mark - GPBOneofDescriptorProto
-
-typedef GPB_ENUM(GPBOneofDescriptorProto_FieldNumber) {
-  GPBOneofDescriptorProto_FieldNumber_Name = 1,
-};
-
-// Describes a oneof.
-@interface GPBOneofDescriptorProto : GPBMessage
-
-@property(nonatomic, readwrite) BOOL hasName;
-@property(nonatomic, readwrite, copy, null_resettable) NSString *name;
-
-@end
-
-#pragma mark - GPBEnumDescriptorProto
-
-typedef GPB_ENUM(GPBEnumDescriptorProto_FieldNumber) {
-  GPBEnumDescriptorProto_FieldNumber_Name = 1,
-  GPBEnumDescriptorProto_FieldNumber_ValueArray = 2,
-  GPBEnumDescriptorProto_FieldNumber_Options = 3,
-};
-
-// Describes an enum type.
-@interface GPBEnumDescriptorProto : GPBMessage
-
-@property(nonatomic, readwrite) BOOL hasName;
-@property(nonatomic, readwrite, copy, null_resettable) NSString *name;
-
-@property(nonatomic, readwrite, strong, null_resettable) NSMutableArray<GPBEnumValueDescriptorProto*> *valueArray;
-@property(nonatomic, readonly) NSUInteger valueArray_Count;
-
-@property(nonatomic, readwrite) BOOL hasOptions;
-@property(nonatomic, readwrite, strong, null_resettable) GPBEnumOptions *options;
-
-@end
-
-#pragma mark - GPBEnumValueDescriptorProto
-
-typedef GPB_ENUM(GPBEnumValueDescriptorProto_FieldNumber) {
-  GPBEnumValueDescriptorProto_FieldNumber_Name = 1,
-  GPBEnumValueDescriptorProto_FieldNumber_Number = 2,
-  GPBEnumValueDescriptorProto_FieldNumber_Options = 3,
-};
-
-// Describes a value within an enum.
-@interface GPBEnumValueDescriptorProto : GPBMessage
-
-@property(nonatomic, readwrite) BOOL hasName;
-@property(nonatomic, readwrite, copy, null_resettable) NSString *name;
-
-@property(nonatomic, readwrite) BOOL hasNumber;
-@property(nonatomic, readwrite) int32_t number;
-
-@property(nonatomic, readwrite) BOOL hasOptions;
-@property(nonatomic, readwrite, strong, null_resettable) GPBEnumValueOptions *options;
-
-@end
-
-#pragma mark - GPBServiceDescriptorProto
-
-typedef GPB_ENUM(GPBServiceDescriptorProto_FieldNumber) {
-  GPBServiceDescriptorProto_FieldNumber_Name = 1,
-  GPBServiceDescriptorProto_FieldNumber_MethodArray = 2,
-  GPBServiceDescriptorProto_FieldNumber_Options = 3,
-};
-
-// Describes a service.
-@interface GPBServiceDescriptorProto : GPBMessage
-
-@property(nonatomic, readwrite) BOOL hasName;
-@property(nonatomic, readwrite, copy, null_resettable) NSString *name;
-
-@property(nonatomic, readwrite, strong, null_resettable) NSMutableArray<GPBMethodDescriptorProto*> *methodArray;
-@property(nonatomic, readonly) NSUInteger methodArray_Count;
-
-@property(nonatomic, readwrite) BOOL hasOptions;
-@property(nonatomic, readwrite, strong, null_resettable) GPBServiceOptions *options;
-
-@end
-
-#pragma mark - GPBMethodDescriptorProto
-
-typedef GPB_ENUM(GPBMethodDescriptorProto_FieldNumber) {
-  GPBMethodDescriptorProto_FieldNumber_Name = 1,
-  GPBMethodDescriptorProto_FieldNumber_InputType = 2,
-  GPBMethodDescriptorProto_FieldNumber_OutputType = 3,
-  GPBMethodDescriptorProto_FieldNumber_Options = 4,
-  GPBMethodDescriptorProto_FieldNumber_ClientStreaming = 5,
-  GPBMethodDescriptorProto_FieldNumber_ServerStreaming = 6,
-};
-
-// Describes a method of a service.
-@interface GPBMethodDescriptorProto : GPBMessage
-
-@property(nonatomic, readwrite) BOOL hasName;
-@property(nonatomic, readwrite, copy, null_resettable) NSString *name;
-
-// Input and output type names.  These are resolved in the same way as
-// FieldDescriptorProto.type_name, but must refer to a message type.
-@property(nonatomic, readwrite) BOOL hasInputType;
-@property(nonatomic, readwrite, copy, null_resettable) NSString *inputType;
-
-@property(nonatomic, readwrite) BOOL hasOutputType;
-@property(nonatomic, readwrite, copy, null_resettable) NSString *outputType;
-
-@property(nonatomic, readwrite) BOOL hasOptions;
-@property(nonatomic, readwrite, strong, null_resettable) GPBMethodOptions *options;
-
-// Identifies if client streams multiple client messages
-@property(nonatomic, readwrite) BOOL hasClientStreaming;
-@property(nonatomic, readwrite) BOOL clientStreaming;
-
-// Identifies if server streams multiple server messages
-@property(nonatomic, readwrite) BOOL hasServerStreaming;
-@property(nonatomic, readwrite) BOOL serverStreaming;
-
-@end
-
-#pragma mark - GPBFileOptions
-
-typedef GPB_ENUM(GPBFileOptions_FieldNumber) {
-  GPBFileOptions_FieldNumber_JavaPackage = 1,
-  GPBFileOptions_FieldNumber_JavaOuterClassname = 8,
-  GPBFileOptions_FieldNumber_OptimizeFor = 9,
-  GPBFileOptions_FieldNumber_JavaMultipleFiles = 10,
-  GPBFileOptions_FieldNumber_GoPackage = 11,
-  GPBFileOptions_FieldNumber_CcGenericServices = 16,
-  GPBFileOptions_FieldNumber_JavaGenericServices = 17,
-  GPBFileOptions_FieldNumber_PyGenericServices = 18,
-  GPBFileOptions_FieldNumber_JavaGenerateEqualsAndHash = 20,
-  GPBFileOptions_FieldNumber_Deprecated = 23,
-  GPBFileOptions_FieldNumber_JavaStringCheckUtf8 = 27,
-  GPBFileOptions_FieldNumber_CcEnableArenas = 31,
-  GPBFileOptions_FieldNumber_ObjcClassPrefix = 36,
-  GPBFileOptions_FieldNumber_CsharpNamespace = 37,
-  GPBFileOptions_FieldNumber_JavananoUseDeprecatedPackage = 38,
-  GPBFileOptions_FieldNumber_UninterpretedOptionArray = 999,
-};
-
-@interface GPBFileOptions : GPBMessage
-
-// Sets the Java package where classes generated from this .proto will be
-// placed.  By default, the proto package is used, but this is often
-// inappropriate because proto packages do not normally start with backwards
-// domain names.
-@property(nonatomic, readwrite) BOOL hasJavaPackage;
-@property(nonatomic, readwrite, copy, null_resettable) NSString *javaPackage;
-
-// If set, all the classes from the .proto file are wrapped in a single
-// outer class with the given name.  This applies to both Proto1
-// (equivalent to the old "--one_java_file" option) and Proto2 (where
-// a .proto always translates to a single class, but you may want to
-// explicitly choose the class name).
-@property(nonatomic, readwrite) BOOL hasJavaOuterClassname;
-@property(nonatomic, readwrite, copy, null_resettable) NSString *javaOuterClassname;
-
-// If set true, then the Java code generator will generate a separate .java
-// file for each top-level message, enum, and service defined in the .proto
-// file.  Thus, these types will *not* be nested inside the outer class
-// named by java_outer_classname.  However, the outer class will still be
-// generated to contain the file's getDescriptor() method as well as any
-// top-level extensions defined in the file.
-@property(nonatomic, readwrite) BOOL hasJavaMultipleFiles;
-@property(nonatomic, readwrite) BOOL javaMultipleFiles;
-
-// If set true, then the Java code generator will generate equals() and
-// hashCode() methods for all messages defined in the .proto file.
-// This increases generated code size, potentially substantially for large
-// protos, which may harm a memory-constrained application.
-// - In the full runtime this is a speed optimization, as the
-// AbstractMessage base class includes reflection-based implementations of
-// these methods.
-// - In the lite runtime, setting this option changes the semantics of
-// equals() and hashCode() to more closely match those of the full runtime;
-// the generated methods compute their results based on field values rather
-// than object identity. (Implementations should not assume that hashcodes
-// will be consistent across runtimes or versions of the protocol compiler.)
-@property(nonatomic, readwrite) BOOL hasJavaGenerateEqualsAndHash;
-@property(nonatomic, readwrite) BOOL javaGenerateEqualsAndHash;
-
-// If set true, then the Java2 code generator will generate code that
-// throws an exception whenever an attempt is made to assign a non-UTF-8
-// byte sequence to a string field.
-// Message reflection will do the same.
-// However, an extension field still accepts non-UTF-8 byte sequences.
-// This option has no effect on when used with the lite runtime.
-@property(nonatomic, readwrite) BOOL hasJavaStringCheckUtf8;
-@property(nonatomic, readwrite) BOOL javaStringCheckUtf8;
-
-@property(nonatomic, readwrite) BOOL hasOptimizeFor;
-@property(nonatomic, readwrite) GPBFileOptions_OptimizeMode optimizeFor;
-
-// Sets the Go package where structs generated from this .proto will be
-// placed. If omitted, the Go package will be derived from the following:
-//   - The basename of the package import path, if provided.
-//   - Otherwise, the package statement in the .proto file, if present.
-//   - Otherwise, the basename of the .proto file, without extension.
-@property(nonatomic, readwrite) BOOL hasGoPackage;
-@property(nonatomic, readwrite, copy, null_resettable) NSString *goPackage;
-
-// Should generic services be generated in each language?  "Generic" services
-// are not specific to any particular RPC system.  They are generated by the
-// main code generators in each language (without additional plugins).
-// Generic services were the only kind of service generation supported by
-// early versions of google.protobuf.
-//
-// Generic services are now considered deprecated in favor of using plugins
-// that generate code specific to your particular RPC system.  Therefore,
-// these default to false.  Old code which depends on generic services should
-// explicitly set them to true.
-@property(nonatomic, readwrite) BOOL hasCcGenericServices;
-@property(nonatomic, readwrite) BOOL ccGenericServices;
-
-@property(nonatomic, readwrite) BOOL hasJavaGenericServices;
-@property(nonatomic, readwrite) BOOL javaGenericServices;
-
-@property(nonatomic, readwrite) BOOL hasPyGenericServices;
-@property(nonatomic, readwrite) BOOL pyGenericServices;
-
-// Is this file deprecated?
-// Depending on the target platform, this can emit Deprecated annotations
-// for everything in the file, or it will be completely ignored; in the very
-// least, this is a formalization for deprecating files.
-@property(nonatomic, readwrite) BOOL hasDeprecated;
-@property(nonatomic, readwrite) BOOL deprecated;
-
-// Enables the use of arenas for the proto messages in this file. This applies
-// only to generated classes for C++.
-@property(nonatomic, readwrite) BOOL hasCcEnableArenas;
-@property(nonatomic, readwrite) BOOL ccEnableArenas;
-
-// Sets the objective c class prefix which is prepended to all objective c
-// generated classes from this .proto. There is no default.
-@property(nonatomic, readwrite) BOOL hasObjcClassPrefix;
-@property(nonatomic, readwrite, copy, null_resettable) NSString *objcClassPrefix;
-
-// Namespace for generated classes; defaults to the package.
-@property(nonatomic, readwrite) BOOL hasCsharpNamespace;
-@property(nonatomic, readwrite, copy, null_resettable) NSString *csharpNamespace;
-
-// Whether the nano proto compiler should generate in the deprecated non-nano
-// suffixed package.
-@property(nonatomic, readwrite) BOOL hasJavananoUseDeprecatedPackage;
-@property(nonatomic, readwrite) BOOL javananoUseDeprecatedPackage;
-
-// The parser stores options it doesn't recognize here. See above.
-@property(nonatomic, readwrite, strong, null_resettable) NSMutableArray<GPBUninterpretedOption*> *uninterpretedOptionArray;
-@property(nonatomic, readonly) NSUInteger uninterpretedOptionArray_Count;
-
-@end
-
-#pragma mark - GPBMessageOptions
-
-typedef GPB_ENUM(GPBMessageOptions_FieldNumber) {
-  GPBMessageOptions_FieldNumber_MessageSetWireFormat = 1,
-  GPBMessageOptions_FieldNumber_NoStandardDescriptorAccessor = 2,
-  GPBMessageOptions_FieldNumber_Deprecated = 3,
-  GPBMessageOptions_FieldNumber_MapEntry = 7,
-  GPBMessageOptions_FieldNumber_UninterpretedOptionArray = 999,
-};
-
-@interface GPBMessageOptions : GPBMessage
-
-// Set true to use the old proto1 MessageSet wire format for extensions.
-// This is provided for backwards-compatibility with the MessageSet wire
-// format.  You should not use this for any other reason:  It's less
-// efficient, has fewer features, and is more complicated.
-//
-// The message must be defined exactly as follows:
-//   message Foo {
-//     option message_set_wire_format = true;
-//     extensions 4 to max;
-//   }
-// Note that the message cannot have any defined fields; MessageSets only
-// have extensions.
-//
-// All extensions of your type must be singular messages; e.g. they cannot
-// be int32s, enums, or repeated messages.
-//
-// Because this is an option, the above two restrictions are not enforced by
-// the protocol compiler.
-@property(nonatomic, readwrite) BOOL hasMessageSetWireFormat;
-@property(nonatomic, readwrite) BOOL messageSetWireFormat;
-
-// Disables the generation of the standard "descriptor()" accessor, which can
-// conflict with a field of the same name.  This is meant to make migration
-// from proto1 easier; new code should avoid fields named "descriptor".
-@property(nonatomic, readwrite) BOOL hasNoStandardDescriptorAccessor;
-@property(nonatomic, readwrite) BOOL noStandardDescriptorAccessor;
-
-// Is this message deprecated?
-// Depending on the target platform, this can emit Deprecated annotations
-// for the message, or it will be completely ignored; in the very least,
-// this is a formalization for deprecating messages.
-@property(nonatomic, readwrite) BOOL hasDeprecated;
-@property(nonatomic, readwrite) BOOL deprecated;
-
-// Whether the message is an automatically generated map entry type for the
-// maps field.
-//
-// For maps fields:
-//     map<KeyType, ValueType> map_field = 1;
-// The parsed descriptor looks like:
-//     message MapFieldEntry {
-//         option map_entry = true;
-//         optional KeyType key = 1;
-//         optional ValueType value = 2;
-//     }
-//     repeated MapFieldEntry map_field = 1;
-//
-// Implementations may choose not to generate the map_entry=true message, but
-// use a native map in the target language to hold the keys and values.
-// The reflection APIs in such implementions still need to work as
-// if the field is a repeated message field.
-//
-// NOTE: Do not set the option in .proto files. Always use the maps syntax
-// instead. The option should only be implicitly set by the proto compiler
-// parser.
-@property(nonatomic, readwrite) BOOL hasMapEntry;
-@property(nonatomic, readwrite) BOOL mapEntry;
-
-// The parser stores options it doesn't recognize here. See above.
-@property(nonatomic, readwrite, strong, null_resettable) NSMutableArray<GPBUninterpretedOption*> *uninterpretedOptionArray;
-@property(nonatomic, readonly) NSUInteger uninterpretedOptionArray_Count;
-
-@end
-
-#pragma mark - GPBFieldOptions
-
-typedef GPB_ENUM(GPBFieldOptions_FieldNumber) {
-  GPBFieldOptions_FieldNumber_Ctype = 1,
-  GPBFieldOptions_FieldNumber_Packed = 2,
-  GPBFieldOptions_FieldNumber_Deprecated = 3,
-  GPBFieldOptions_FieldNumber_Lazy = 5,
-  GPBFieldOptions_FieldNumber_Jstype = 6,
-  GPBFieldOptions_FieldNumber_Weak = 10,
-  GPBFieldOptions_FieldNumber_UninterpretedOptionArray = 999,
-};
-
-@interface GPBFieldOptions : GPBMessage
-
-// The ctype option instructs the C++ code generator to use a different
-// representation of the field than it normally would.  See the specific
-// options below.  This option is not yet implemented in the open source
-// release -- sorry, we'll try to include it in a future version!
-@property(nonatomic, readwrite) BOOL hasCtype;
-@property(nonatomic, readwrite) GPBFieldOptions_CType ctype;
-
-// The packed option can be enabled for repeated primitive fields to enable
-// a more efficient representation on the wire. Rather than repeatedly
-// writing the tag and type for each element, the entire array is encoded as
-// a single length-delimited blob. In proto3, only explicit setting it to
-// false will avoid using packed encoding.
-@property(nonatomic, readwrite) BOOL hasPacked;
-@property(nonatomic, readwrite) BOOL packed;
-
-// The jstype option determines the JavaScript type used for values of the
-// field.  The option is permitted only for 64 bit integral and fixed types
-// (int64, uint64, sint64, fixed64, sfixed64).  By default these types are
-// represented as JavaScript strings.  This avoids loss of precision that can
-// happen when a large value is converted to a floating point JavaScript
-// numbers.  Specifying JS_NUMBER for the jstype causes the generated
-// JavaScript code to use the JavaScript "number" type instead of strings.
-// This option is an enum to permit additional types to be added,
-// e.g. goog.math.Integer.
-@property(nonatomic, readwrite) BOOL hasJstype;
-@property(nonatomic, readwrite) GPBFieldOptions_JSType jstype;
-
-// Should this field be parsed lazily?  Lazy applies only to message-type
-// fields.  It means that when the outer message is initially parsed, the
-// inner message's contents will not be parsed but instead stored in encoded
-// form.  The inner message will actually be parsed when it is first accessed.
-//
-// This is only a hint.  Implementations are free to choose whether to use
-// eager or lazy parsing regardless of the value of this option.  However,
-// setting this option true suggests that the protocol author believes that
-// using lazy parsing on this field is worth the additional bookkeeping
-// overhead typically needed to implement it.
-//
-// This option does not affect the public interface of any generated code;
-// all method signatures remain the same.  Furthermore, thread-safety of the
-// interface is not affected by this option; const methods remain safe to
-// call from multiple threads concurrently, while non-const methods continue
-// to require exclusive access.
-//
-//
-// Note that implementations may choose not to check required fields within
-// a lazy sub-message.  That is, calling IsInitialized() on the outher message
-// may return true even if the inner message has missing required fields.
-// This is necessary because otherwise the inner message would have to be
-// parsed in order to perform the check, defeating the purpose of lazy
-// parsing.  An implementation which chooses not to check required fields
-// must be consistent about it.  That is, for any particular sub-message, the
-// implementation must either *always* check its required fields, or *never*
-// check its required fields, regardless of whether or not the message has
-// been parsed.
-@property(nonatomic, readwrite) BOOL hasLazy;
-@property(nonatomic, readwrite) BOOL lazy;
-
-// Is this field deprecated?
-// Depending on the target platform, this can emit Deprecated annotations
-// for accessors, or it will be completely ignored; in the very least, this
-// is a formalization for deprecating fields.
-@property(nonatomic, readwrite) BOOL hasDeprecated;
-@property(nonatomic, readwrite) BOOL deprecated;
-
-// For Google-internal migration only. Do not use.
-@property(nonatomic, readwrite) BOOL hasWeak;
-@property(nonatomic, readwrite) BOOL weak;
-
-// The parser stores options it doesn't recognize here. See above.
-@property(nonatomic, readwrite, strong, null_resettable) NSMutableArray<GPBUninterpretedOption*> *uninterpretedOptionArray;
-@property(nonatomic, readonly) NSUInteger uninterpretedOptionArray_Count;
-
-@end
-
-#pragma mark - GPBEnumOptions
-
-typedef GPB_ENUM(GPBEnumOptions_FieldNumber) {
-  GPBEnumOptions_FieldNumber_AllowAlias = 2,
-  GPBEnumOptions_FieldNumber_Deprecated = 3,
-  GPBEnumOptions_FieldNumber_UninterpretedOptionArray = 999,
-};
-
-@interface GPBEnumOptions : GPBMessage
-
-// Set this option to true to allow mapping different tag names to the same
-// value.
-@property(nonatomic, readwrite) BOOL hasAllowAlias;
-@property(nonatomic, readwrite) BOOL allowAlias;
-
-// Is this enum deprecated?
-// Depending on the target platform, this can emit Deprecated annotations
-// for the enum, or it will be completely ignored; in the very least, this
-// is a formalization for deprecating enums.
-@property(nonatomic, readwrite) BOOL hasDeprecated;
-@property(nonatomic, readwrite) BOOL deprecated;
-
-// The parser stores options it doesn't recognize here. See above.
-@property(nonatomic, readwrite, strong, null_resettable) NSMutableArray<GPBUninterpretedOption*> *uninterpretedOptionArray;
-@property(nonatomic, readonly) NSUInteger uninterpretedOptionArray_Count;
-
-@end
-
-#pragma mark - GPBEnumValueOptions
-
-typedef GPB_ENUM(GPBEnumValueOptions_FieldNumber) {
-  GPBEnumValueOptions_FieldNumber_Deprecated = 1,
-  GPBEnumValueOptions_FieldNumber_UninterpretedOptionArray = 999,
-};
-
-@interface GPBEnumValueOptions : GPBMessage
-
-// Is this enum value deprecated?
-// Depending on the target platform, this can emit Deprecated annotations
-// for the enum value, or it will be completely ignored; in the very least,
-// this is a formalization for deprecating enum values.
-@property(nonatomic, readwrite) BOOL hasDeprecated;
-@property(nonatomic, readwrite) BOOL deprecated;
-
-// The parser stores options it doesn't recognize here. See above.
-@property(nonatomic, readwrite, strong, null_resettable) NSMutableArray<GPBUninterpretedOption*> *uninterpretedOptionArray;
-@property(nonatomic, readonly) NSUInteger uninterpretedOptionArray_Count;
-
-@end
-
-#pragma mark - GPBServiceOptions
-
-typedef GPB_ENUM(GPBServiceOptions_FieldNumber) {
-  GPBServiceOptions_FieldNumber_Deprecated = 33,
-  GPBServiceOptions_FieldNumber_UninterpretedOptionArray = 999,
-};
-
-@interface GPBServiceOptions : GPBMessage
-
-// Is this service deprecated?
-// Depending on the target platform, this can emit Deprecated annotations
-// for the service, or it will be completely ignored; in the very least,
-// this is a formalization for deprecating services.
-@property(nonatomic, readwrite) BOOL hasDeprecated;
-@property(nonatomic, readwrite) BOOL deprecated;
-
-// The parser stores options it doesn't recognize here. See above.
-@property(nonatomic, readwrite, strong, null_resettable) NSMutableArray<GPBUninterpretedOption*> *uninterpretedOptionArray;
-@property(nonatomic, readonly) NSUInteger uninterpretedOptionArray_Count;
-
-@end
-
-#pragma mark - GPBMethodOptions
-
-typedef GPB_ENUM(GPBMethodOptions_FieldNumber) {
-  GPBMethodOptions_FieldNumber_Deprecated = 33,
-  GPBMethodOptions_FieldNumber_UninterpretedOptionArray = 999,
-};
-
-@interface GPBMethodOptions : GPBMessage
-
-// Is this method deprecated?
-// Depending on the target platform, this can emit Deprecated annotations
-// for the method, or it will be completely ignored; in the very least,
-// this is a formalization for deprecating methods.
-@property(nonatomic, readwrite) BOOL hasDeprecated;
-@property(nonatomic, readwrite) BOOL deprecated;
-
-// The parser stores options it doesn't recognize here. See above.
-@property(nonatomic, readwrite, strong, null_resettable) NSMutableArray<GPBUninterpretedOption*> *uninterpretedOptionArray;
-@property(nonatomic, readonly) NSUInteger uninterpretedOptionArray_Count;
-
-@end
-
-#pragma mark - GPBUninterpretedOption
-
-typedef GPB_ENUM(GPBUninterpretedOption_FieldNumber) {
-  GPBUninterpretedOption_FieldNumber_NameArray = 2,
-  GPBUninterpretedOption_FieldNumber_IdentifierValue = 3,
-  GPBUninterpretedOption_FieldNumber_PositiveIntValue = 4,
-  GPBUninterpretedOption_FieldNumber_NegativeIntValue = 5,
-  GPBUninterpretedOption_FieldNumber_DoubleValue = 6,
-  GPBUninterpretedOption_FieldNumber_StringValue = 7,
-  GPBUninterpretedOption_FieldNumber_AggregateValue = 8,
-};
-
-// A message representing a option the parser does not recognize. This only
-// appears in options protos created by the compiler::Parser class.
-// DescriptorPool resolves these when building Descriptor objects. Therefore,
-// options protos in descriptor objects (e.g. returned by Descriptor::options(),
-// or produced by Descriptor::CopyTo()) will never have UninterpretedOptions
-// in them.
-@interface GPBUninterpretedOption : GPBMessage
-
-@property(nonatomic, readwrite, strong, null_resettable) NSMutableArray<GPBUninterpretedOption_NamePart*> *nameArray;
-@property(nonatomic, readonly) NSUInteger nameArray_Count;
-
-// The value of the uninterpreted option, in whatever type the tokenizer
-// identified it as during parsing. Exactly one of these should be set.
-@property(nonatomic, readwrite) BOOL hasIdentifierValue;
-@property(nonatomic, readwrite, copy, null_resettable) NSString *identifierValue;
-
-@property(nonatomic, readwrite) BOOL hasPositiveIntValue;
-@property(nonatomic, readwrite) uint64_t positiveIntValue;
-
-@property(nonatomic, readwrite) BOOL hasNegativeIntValue;
-@property(nonatomic, readwrite) int64_t negativeIntValue;
-
-@property(nonatomic, readwrite) BOOL hasDoubleValue;
-@property(nonatomic, readwrite) double doubleValue;
-
-@property(nonatomic, readwrite) BOOL hasStringValue;
-@property(nonatomic, readwrite, copy, null_resettable) NSData *stringValue;
-
-@property(nonatomic, readwrite) BOOL hasAggregateValue;
-@property(nonatomic, readwrite, copy, null_resettable) NSString *aggregateValue;
-
-@end
-
-#pragma mark - GPBUninterpretedOption_NamePart
-
-typedef GPB_ENUM(GPBUninterpretedOption_NamePart_FieldNumber) {
-  GPBUninterpretedOption_NamePart_FieldNumber_NamePart = 1,
-  GPBUninterpretedOption_NamePart_FieldNumber_IsExtension = 2,
-};
-
-// The name of the uninterpreted option.  Each string represents a segment in
-// a dot-separated name.  is_extension is true iff a segment represents an
-// extension (denoted with parentheses in options specs in .proto files).
-// E.g.,{ ["foo", false], ["bar.baz", true], ["qux", false] } represents
-// "foo.(bar.baz).qux".
-@interface GPBUninterpretedOption_NamePart : GPBMessage
-
-@property(nonatomic, readwrite) BOOL hasNamePart;
-@property(nonatomic, readwrite, copy, null_resettable) NSString *namePart;
-
-@property(nonatomic, readwrite) BOOL hasIsExtension;
-@property(nonatomic, readwrite) BOOL isExtension;
-
-@end
-
-#pragma mark - GPBSourceCodeInfo
-
-typedef GPB_ENUM(GPBSourceCodeInfo_FieldNumber) {
-  GPBSourceCodeInfo_FieldNumber_LocationArray = 1,
-};
-
-// Encapsulates information about the original source file from which a
-// FileDescriptorProto was generated.
-@interface GPBSourceCodeInfo : GPBMessage
-
-// A Location identifies a piece of source code in a .proto file which
-// corresponds to a particular definition.  This information is intended
-// to be useful to IDEs, code indexers, documentation generators, and similar
-// tools.
-//
-// For example, say we have a file like:
-//   message Foo {
-//     optional string foo = 1;
-//   }
-// Let's look at just the field definition:
-//   optional string foo = 1;
-//   ^       ^^     ^^  ^  ^^^
-//   a       bc     de  f  ghi
-// We have the following locations:
-//   span   path               represents
-//   [a,i)  [ 4, 0, 2, 0 ]     The whole field definition.
-//   [a,b)  [ 4, 0, 2, 0, 4 ]  The label (optional).
-//   [c,d)  [ 4, 0, 2, 0, 5 ]  The type (string).
-//   [e,f)  [ 4, 0, 2, 0, 1 ]  The name (foo).
-//   [g,h)  [ 4, 0, 2, 0, 3 ]  The number (1).
-//
-// Notes:
-// - A location may refer to a repeated field itself (i.e. not to any
-//   particular index within it).  This is used whenever a set of elements are
-//   logically enclosed in a single code segment.  For example, an entire
-//   extend block (possibly containing multiple extension definitions) will
-//   have an outer location whose path refers to the "extensions" repeated
-//   field without an index.
-// - Multiple locations may have the same path.  This happens when a single
-//   logical declaration is spread out across multiple places.  The most
-//   obvious example is the "extend" block again -- there may be multiple
-//   extend blocks in the same scope, each of which will have the same path.
-// - A location's span is not always a subset of its parent's span.  For
-//   example, the "extendee" of an extension declaration appears at the
-//   beginning of the "extend" block and is shared by all extensions within
-//   the block.
-// - Just because a location's span is a subset of some other location's span
-//   does not mean that it is a descendent.  For example, a "group" defines
-//   both a type and a field in a single declaration.  Thus, the locations
-//   corresponding to the type and field and their components will overlap.
-// - Code which tries to interpret locations should probably be designed to
-//   ignore those that it doesn't understand, as more types of locations could
-//   be recorded in the future.
-@property(nonatomic, readwrite, strong, null_resettable) NSMutableArray<GPBSourceCodeInfo_Location*> *locationArray;
-@property(nonatomic, readonly) NSUInteger locationArray_Count;
-
-@end
-
-#pragma mark - GPBSourceCodeInfo_Location
-
-typedef GPB_ENUM(GPBSourceCodeInfo_Location_FieldNumber) {
-  GPBSourceCodeInfo_Location_FieldNumber_PathArray = 1,
-  GPBSourceCodeInfo_Location_FieldNumber_SpanArray = 2,
-  GPBSourceCodeInfo_Location_FieldNumber_LeadingComments = 3,
-  GPBSourceCodeInfo_Location_FieldNumber_TrailingComments = 4,
-  GPBSourceCodeInfo_Location_FieldNumber_LeadingDetachedCommentsArray = 6,
-};
-
-@interface GPBSourceCodeInfo_Location : GPBMessage
-
-// Identifies which part of the FileDescriptorProto was defined at this
-// location.
-//
-// Each element is a field number or an index.  They form a path from
-// the root FileDescriptorProto to the place where the definition.  For
-// example, this path:
-//   [ 4, 3, 2, 7, 1 ]
-// refers to:
-//   file.message_type(3)  // 4, 3
-//       .field(7)         // 2, 7
-//       .name()           // 1
-// This is because FileDescriptorProto.message_type has field number 4:
-//   repeated DescriptorProto message_type = 4;
-// and DescriptorProto.field has field number 2:
-//   repeated FieldDescriptorProto field = 2;
-// and FieldDescriptorProto.name has field number 1:
-//   optional string name = 1;
-//
-// Thus, the above path gives the location of a field name.  If we removed
-// the last element:
-//   [ 4, 3, 2, 7 ]
-// this path refers to the whole field declaration (from the beginning
-// of the label to the terminating semicolon).
-@property(nonatomic, readwrite, strong, null_resettable) GPBInt32Array *pathArray;
-@property(nonatomic, readonly) NSUInteger pathArray_Count;
-
-// Always has exactly three or four elements: start line, start column,
-// end line (optional, otherwise assumed same as start line), end column.
-// These are packed into a single field for efficiency.  Note that line
-// and column numbers are zero-based -- typically you will want to add
-// 1 to each before displaying to a user.
-@property(nonatomic, readwrite, strong, null_resettable) GPBInt32Array *spanArray;
-@property(nonatomic, readonly) NSUInteger spanArray_Count;
-
-// If this SourceCodeInfo represents a complete declaration, these are any
-// comments appearing before and after the declaration which appear to be
-// attached to the declaration.
-//
-// A series of line comments appearing on consecutive lines, with no other
-// tokens appearing on those lines, will be treated as a single comment.
-//
-// leading_detached_comments will keep paragraphs of comments that appear
-// before (but not connected to) the current element. Each paragraph,
-// separated by empty lines, will be one comment element in the repeated
-// field.
-//
-// Only the comment content is provided; comment markers (e.g. //) are
-// stripped out.  For block comments, leading whitespace and an asterisk
-// will be stripped from the beginning of each line other than the first.
-// Newlines are included in the output.
-//
-// Examples:
-//
-//   optional int32 foo = 1;  // Comment attached to foo.
-//   // Comment attached to bar.
-//   optional int32 bar = 2;
-//
-//   optional string baz = 3;
-//   // Comment attached to baz.
-//   // Another line attached to baz.
-//
-//   // Comment attached to qux.
-//   //
-//   // Another line attached to qux.
-//   optional double qux = 4;
-//
-//   // Detached comment for corge. This is not leading or trailing comments
-//   // to qux or corge because there are blank lines separating it from
-//   // both.
-//
-//   // Detached comment for corge paragraph 2.
-//
-//   optional string corge = 5;
-//   /* Block comment attached
-//    * to corge.  Leading asterisks
-//    * will be removed. */
-//   /* Block comment attached to
-//    * grault. */
-//   optional int32 grault = 6;
-//
-//   // ignored detached comments.
-@property(nonatomic, readwrite) BOOL hasLeadingComments;
-@property(nonatomic, readwrite, copy, null_resettable) NSString *leadingComments;
-
-@property(nonatomic, readwrite) BOOL hasTrailingComments;
-@property(nonatomic, readwrite, copy, null_resettable) NSString *trailingComments;
-
-@property(nonatomic, readwrite, strong, null_resettable) NSMutableArray<NSString*> *leadingDetachedCommentsArray;
-@property(nonatomic, readonly) NSUInteger leadingDetachedCommentsArray_Count;
-
-@end
-
-#pragma mark - GPBGeneratedCodeInfo
-
-typedef GPB_ENUM(GPBGeneratedCodeInfo_FieldNumber) {
-  GPBGeneratedCodeInfo_FieldNumber_AnnotationArray = 1,
-};
-
-// Describes the relationship between generated code and its original source
-// file. A GeneratedCodeInfo message is associated with only one generated
-// source file, but may contain references to different source .proto files.
-@interface GPBGeneratedCodeInfo : GPBMessage
-
-// An Annotation connects some span of text in generated code to an element
-// of its generating .proto file.
-@property(nonatomic, readwrite, strong, null_resettable) NSMutableArray<GPBGeneratedCodeInfo_Annotation*> *annotationArray;
-@property(nonatomic, readonly) NSUInteger annotationArray_Count;
-
-@end
-
-#pragma mark - GPBGeneratedCodeInfo_Annotation
-
-typedef GPB_ENUM(GPBGeneratedCodeInfo_Annotation_FieldNumber) {
-  GPBGeneratedCodeInfo_Annotation_FieldNumber_PathArray = 1,
-  GPBGeneratedCodeInfo_Annotation_FieldNumber_SourceFile = 2,
-  GPBGeneratedCodeInfo_Annotation_FieldNumber_Begin = 3,
-  GPBGeneratedCodeInfo_Annotation_FieldNumber_End = 4,
-};
-
-@interface GPBGeneratedCodeInfo_Annotation : GPBMessage
-
-// Identifies the element in the original source .proto file. This field
-// is formatted the same as SourceCodeInfo.Location.path.
-@property(nonatomic, readwrite, strong, null_resettable) GPBInt32Array *pathArray;
-@property(nonatomic, readonly) NSUInteger pathArray_Count;
-
-// Identifies the filesystem path to the original source .proto.
-@property(nonatomic, readwrite) BOOL hasSourceFile;
-@property(nonatomic, readwrite, copy, null_resettable) NSString *sourceFile;
-
-// Identifies the starting offset in bytes in the generated code
-// that relates to the identified object.
-@property(nonatomic, readwrite) BOOL hasBegin;
-@property(nonatomic, readwrite) int32_t begin;
-
-// Identifies the ending offset in bytes in the generated code that
-// relates to the identified offset. The end offset should be one past
-// the last relevant byte (so the length of the text = end - begin).
-@property(nonatomic, readwrite) BOOL hasEnd;
-@property(nonatomic, readwrite) int32_t end;
-
-@end
-
-NS_ASSUME_NONNULL_END
-
-CF_EXTERN_C_END
-
-// @@protoc_insertion_point(global_scope)

+ 0 - 2594
objectivec/google/protobuf/Descriptor.pbobjc.m

@@ -1,2594 +0,0 @@
-// Generated by the protocol buffer compiler.  DO NOT EDIT!
-// source: google/protobuf/descriptor.proto
-
-#import "GPBProtocolBuffers_RuntimeSupport.h"
-#import "google/protobuf/Descriptor.pbobjc.h"
-// @@protoc_insertion_point(imports)
-
-#pragma mark - GPBDescriptorRoot
-
-@implementation GPBDescriptorRoot
-
-@end
-
-#pragma mark - GPBDescriptorRoot_FileDescriptor
-
-static GPBFileDescriptor *GPBDescriptorRoot_FileDescriptor(void) {
-  // This is called by +initialize so there is no need to worry
-  // about thread safety of the singleton.
-  static GPBFileDescriptor *descriptor = NULL;
-  if (!descriptor) {
-    GPBDebugCheckRuntimeVersion();
-    descriptor = [[GPBFileDescriptor alloc] initWithPackage:@"google.protobuf"
-                                                     syntax:GPBFileSyntaxProto2];
-  }
-  return descriptor;
-}
-
-#pragma mark - GPBFileDescriptorSet
-
-@implementation GPBFileDescriptorSet
-
-@dynamic fileArray, fileArray_Count;
-
-typedef struct GPBFileDescriptorSet__storage_ {
-  uint32_t _has_storage_[1];
-  NSMutableArray *fileArray;
-} GPBFileDescriptorSet__storage_;
-
-// This method is threadsafe because it is initially called
-// in +initialize for each subclass.
-+ (GPBDescriptor *)descriptor {
-  static GPBDescriptor *descriptor = nil;
-  if (!descriptor) {
-    static GPBMessageFieldDescription fields[] = {
-      {
-        .name = "fileArray",
-        .number = GPBFileDescriptorSet_FieldNumber_FileArray,
-        .hasIndex = GPBNoHasBit,
-        .flags = GPBFieldRepeated,
-        .dataType = GPBDataTypeMessage,
-        .offset = offsetof(GPBFileDescriptorSet__storage_, fileArray),
-        .defaultValue.valueMessage = nil,
-        .dataTypeSpecific.className = GPBStringifySymbol(GPBFileDescriptorProto),
-        .fieldOptions = NULL,
-      },
-    };
-    GPBDescriptor *localDescriptor =
-        [GPBDescriptor allocDescriptorForClass:[GPBFileDescriptorSet class]
-                                     rootClass:[GPBDescriptorRoot class]
-                                          file:GPBDescriptorRoot_FileDescriptor()
-                                        fields:fields
-                                    fieldCount:sizeof(fields) / sizeof(GPBMessageFieldDescription)
-                                        oneofs:NULL
-                                    oneofCount:0
-                                         enums:NULL
-                                     enumCount:0
-                                        ranges:NULL
-                                    rangeCount:0
-                                   storageSize:sizeof(GPBFileDescriptorSet__storage_)
-                                    wireFormat:NO];
-    NSAssert(descriptor == nil, @"Startup recursed!");
-    descriptor = localDescriptor;
-  }
-  return descriptor;
-}
-
-@end
-
-#pragma mark - GPBFileDescriptorProto
-
-@implementation GPBFileDescriptorProto
-
-@dynamic hasName, name;
-@dynamic hasPackage, package;
-@dynamic dependencyArray, dependencyArray_Count;
-@dynamic publicDependencyArray, publicDependencyArray_Count;
-@dynamic weakDependencyArray, weakDependencyArray_Count;
-@dynamic messageTypeArray, messageTypeArray_Count;
-@dynamic enumTypeArray, enumTypeArray_Count;
-@dynamic serviceArray, serviceArray_Count;
-@dynamic extensionArray, extensionArray_Count;
-@dynamic hasOptions, options;
-@dynamic hasSourceCodeInfo, sourceCodeInfo;
-@dynamic hasSyntax, syntax;
-
-typedef struct GPBFileDescriptorProto__storage_ {
-  uint32_t _has_storage_[1];
-  NSString *name;
-  NSString *package;
-  NSMutableArray *dependencyArray;
-  NSMutableArray *messageTypeArray;
-  NSMutableArray *enumTypeArray;
-  NSMutableArray *serviceArray;
-  NSMutableArray *extensionArray;
-  GPBFileOptions *options;
-  GPBSourceCodeInfo *sourceCodeInfo;
-  GPBInt32Array *publicDependencyArray;
-  GPBInt32Array *weakDependencyArray;
-  NSString *syntax;
-} GPBFileDescriptorProto__storage_;
-
-// This method is threadsafe because it is initially called
-// in +initialize for each subclass.
-+ (GPBDescriptor *)descriptor {
-  static GPBDescriptor *descriptor = nil;
-  if (!descriptor) {
-    static GPBMessageFieldDescription fields[] = {
-      {
-        .name = "name",
-        .number = GPBFileDescriptorProto_FieldNumber_Name,
-        .hasIndex = 0,
-        .flags = GPBFieldOptional,
-        .dataType = GPBDataTypeString,
-        .offset = offsetof(GPBFileDescriptorProto__storage_, name),
-        .defaultValue.valueString = nil,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "package",
-        .number = GPBFileDescriptorProto_FieldNumber_Package,
-        .hasIndex = 1,
-        .flags = GPBFieldOptional,
-        .dataType = GPBDataTypeString,
-        .offset = offsetof(GPBFileDescriptorProto__storage_, package),
-        .defaultValue.valueString = nil,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "dependencyArray",
-        .number = GPBFileDescriptorProto_FieldNumber_DependencyArray,
-        .hasIndex = GPBNoHasBit,
-        .flags = GPBFieldRepeated,
-        .dataType = GPBDataTypeString,
-        .offset = offsetof(GPBFileDescriptorProto__storage_, dependencyArray),
-        .defaultValue.valueMessage = nil,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "messageTypeArray",
-        .number = GPBFileDescriptorProto_FieldNumber_MessageTypeArray,
-        .hasIndex = GPBNoHasBit,
-        .flags = GPBFieldRepeated,
-        .dataType = GPBDataTypeMessage,
-        .offset = offsetof(GPBFileDescriptorProto__storage_, messageTypeArray),
-        .defaultValue.valueMessage = nil,
-        .dataTypeSpecific.className = GPBStringifySymbol(GPBDescriptorProto),
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "enumTypeArray",
-        .number = GPBFileDescriptorProto_FieldNumber_EnumTypeArray,
-        .hasIndex = GPBNoHasBit,
-        .flags = GPBFieldRepeated,
-        .dataType = GPBDataTypeMessage,
-        .offset = offsetof(GPBFileDescriptorProto__storage_, enumTypeArray),
-        .defaultValue.valueMessage = nil,
-        .dataTypeSpecific.className = GPBStringifySymbol(GPBEnumDescriptorProto),
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "serviceArray",
-        .number = GPBFileDescriptorProto_FieldNumber_ServiceArray,
-        .hasIndex = GPBNoHasBit,
-        .flags = GPBFieldRepeated,
-        .dataType = GPBDataTypeMessage,
-        .offset = offsetof(GPBFileDescriptorProto__storage_, serviceArray),
-        .defaultValue.valueMessage = nil,
-        .dataTypeSpecific.className = GPBStringifySymbol(GPBServiceDescriptorProto),
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "extensionArray",
-        .number = GPBFileDescriptorProto_FieldNumber_ExtensionArray,
-        .hasIndex = GPBNoHasBit,
-        .flags = GPBFieldRepeated,
-        .dataType = GPBDataTypeMessage,
-        .offset = offsetof(GPBFileDescriptorProto__storage_, extensionArray),
-        .defaultValue.valueMessage = nil,
-        .dataTypeSpecific.className = GPBStringifySymbol(GPBFieldDescriptorProto),
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "options",
-        .number = GPBFileDescriptorProto_FieldNumber_Options,
-        .hasIndex = 9,
-        .flags = GPBFieldOptional,
-        .dataType = GPBDataTypeMessage,
-        .offset = offsetof(GPBFileDescriptorProto__storage_, options),
-        .defaultValue.valueMessage = nil,
-        .dataTypeSpecific.className = GPBStringifySymbol(GPBFileOptions),
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "sourceCodeInfo",
-        .number = GPBFileDescriptorProto_FieldNumber_SourceCodeInfo,
-        .hasIndex = 10,
-        .flags = GPBFieldOptional,
-        .dataType = GPBDataTypeMessage,
-        .offset = offsetof(GPBFileDescriptorProto__storage_, sourceCodeInfo),
-        .defaultValue.valueMessage = nil,
-        .dataTypeSpecific.className = GPBStringifySymbol(GPBSourceCodeInfo),
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "publicDependencyArray",
-        .number = GPBFileDescriptorProto_FieldNumber_PublicDependencyArray,
-        .hasIndex = GPBNoHasBit,
-        .flags = GPBFieldRepeated,
-        .dataType = GPBDataTypeInt32,
-        .offset = offsetof(GPBFileDescriptorProto__storage_, publicDependencyArray),
-        .defaultValue.valueMessage = nil,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "weakDependencyArray",
-        .number = GPBFileDescriptorProto_FieldNumber_WeakDependencyArray,
-        .hasIndex = GPBNoHasBit,
-        .flags = GPBFieldRepeated,
-        .dataType = GPBDataTypeInt32,
-        .offset = offsetof(GPBFileDescriptorProto__storage_, weakDependencyArray),
-        .defaultValue.valueMessage = nil,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "syntax",
-        .number = GPBFileDescriptorProto_FieldNumber_Syntax,
-        .hasIndex = 11,
-        .flags = GPBFieldOptional,
-        .dataType = GPBDataTypeString,
-        .offset = offsetof(GPBFileDescriptorProto__storage_, syntax),
-        .defaultValue.valueString = nil,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
-      },
-    };
-    GPBDescriptor *localDescriptor =
-        [GPBDescriptor allocDescriptorForClass:[GPBFileDescriptorProto class]
-                                     rootClass:[GPBDescriptorRoot class]
-                                          file:GPBDescriptorRoot_FileDescriptor()
-                                        fields:fields
-                                    fieldCount:sizeof(fields) / sizeof(GPBMessageFieldDescription)
-                                        oneofs:NULL
-                                    oneofCount:0
-                                         enums:NULL
-                                     enumCount:0
-                                        ranges:NULL
-                                    rangeCount:0
-                                   storageSize:sizeof(GPBFileDescriptorProto__storage_)
-                                    wireFormat:NO];
-    NSAssert(descriptor == nil, @"Startup recursed!");
-    descriptor = localDescriptor;
-  }
-  return descriptor;
-}
-
-@end
-
-#pragma mark - GPBDescriptorProto
-
-@implementation GPBDescriptorProto
-
-@dynamic hasName, name;
-@dynamic fieldArray, fieldArray_Count;
-@dynamic extensionArray, extensionArray_Count;
-@dynamic nestedTypeArray, nestedTypeArray_Count;
-@dynamic enumTypeArray, enumTypeArray_Count;
-@dynamic extensionRangeArray, extensionRangeArray_Count;
-@dynamic oneofDeclArray, oneofDeclArray_Count;
-@dynamic hasOptions, options;
-@dynamic reservedRangeArray, reservedRangeArray_Count;
-@dynamic reservedNameArray, reservedNameArray_Count;
-
-typedef struct GPBDescriptorProto__storage_ {
-  uint32_t _has_storage_[1];
-  NSString *name;
-  NSMutableArray *fieldArray;
-  NSMutableArray *nestedTypeArray;
-  NSMutableArray *enumTypeArray;
-  NSMutableArray *extensionRangeArray;
-  NSMutableArray *extensionArray;
-  GPBMessageOptions *options;
-  NSMutableArray *oneofDeclArray;
-  NSMutableArray *reservedRangeArray;
-  NSMutableArray *reservedNameArray;
-} GPBDescriptorProto__storage_;
-
-// This method is threadsafe because it is initially called
-// in +initialize for each subclass.
-+ (GPBDescriptor *)descriptor {
-  static GPBDescriptor *descriptor = nil;
-  if (!descriptor) {
-    static GPBMessageFieldDescription fields[] = {
-      {
-        .name = "name",
-        .number = GPBDescriptorProto_FieldNumber_Name,
-        .hasIndex = 0,
-        .flags = GPBFieldOptional,
-        .dataType = GPBDataTypeString,
-        .offset = offsetof(GPBDescriptorProto__storage_, name),
-        .defaultValue.valueString = nil,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "fieldArray",
-        .number = GPBDescriptorProto_FieldNumber_FieldArray,
-        .hasIndex = GPBNoHasBit,
-        .flags = GPBFieldRepeated,
-        .dataType = GPBDataTypeMessage,
-        .offset = offsetof(GPBDescriptorProto__storage_, fieldArray),
-        .defaultValue.valueMessage = nil,
-        .dataTypeSpecific.className = GPBStringifySymbol(GPBFieldDescriptorProto),
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "nestedTypeArray",
-        .number = GPBDescriptorProto_FieldNumber_NestedTypeArray,
-        .hasIndex = GPBNoHasBit,
-        .flags = GPBFieldRepeated,
-        .dataType = GPBDataTypeMessage,
-        .offset = offsetof(GPBDescriptorProto__storage_, nestedTypeArray),
-        .defaultValue.valueMessage = nil,
-        .dataTypeSpecific.className = GPBStringifySymbol(GPBDescriptorProto),
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "enumTypeArray",
-        .number = GPBDescriptorProto_FieldNumber_EnumTypeArray,
-        .hasIndex = GPBNoHasBit,
-        .flags = GPBFieldRepeated,
-        .dataType = GPBDataTypeMessage,
-        .offset = offsetof(GPBDescriptorProto__storage_, enumTypeArray),
-        .defaultValue.valueMessage = nil,
-        .dataTypeSpecific.className = GPBStringifySymbol(GPBEnumDescriptorProto),
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "extensionRangeArray",
-        .number = GPBDescriptorProto_FieldNumber_ExtensionRangeArray,
-        .hasIndex = GPBNoHasBit,
-        .flags = GPBFieldRepeated,
-        .dataType = GPBDataTypeMessage,
-        .offset = offsetof(GPBDescriptorProto__storage_, extensionRangeArray),
-        .defaultValue.valueMessage = nil,
-        .dataTypeSpecific.className = GPBStringifySymbol(GPBDescriptorProto_ExtensionRange),
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "extensionArray",
-        .number = GPBDescriptorProto_FieldNumber_ExtensionArray,
-        .hasIndex = GPBNoHasBit,
-        .flags = GPBFieldRepeated,
-        .dataType = GPBDataTypeMessage,
-        .offset = offsetof(GPBDescriptorProto__storage_, extensionArray),
-        .defaultValue.valueMessage = nil,
-        .dataTypeSpecific.className = GPBStringifySymbol(GPBFieldDescriptorProto),
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "options",
-        .number = GPBDescriptorProto_FieldNumber_Options,
-        .hasIndex = 7,
-        .flags = GPBFieldOptional,
-        .dataType = GPBDataTypeMessage,
-        .offset = offsetof(GPBDescriptorProto__storage_, options),
-        .defaultValue.valueMessage = nil,
-        .dataTypeSpecific.className = GPBStringifySymbol(GPBMessageOptions),
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "oneofDeclArray",
-        .number = GPBDescriptorProto_FieldNumber_OneofDeclArray,
-        .hasIndex = GPBNoHasBit,
-        .flags = GPBFieldRepeated,
-        .dataType = GPBDataTypeMessage,
-        .offset = offsetof(GPBDescriptorProto__storage_, oneofDeclArray),
-        .defaultValue.valueMessage = nil,
-        .dataTypeSpecific.className = GPBStringifySymbol(GPBOneofDescriptorProto),
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "reservedRangeArray",
-        .number = GPBDescriptorProto_FieldNumber_ReservedRangeArray,
-        .hasIndex = GPBNoHasBit,
-        .flags = GPBFieldRepeated,
-        .dataType = GPBDataTypeMessage,
-        .offset = offsetof(GPBDescriptorProto__storage_, reservedRangeArray),
-        .defaultValue.valueMessage = nil,
-        .dataTypeSpecific.className = GPBStringifySymbol(GPBDescriptorProto_ReservedRange),
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "reservedNameArray",
-        .number = GPBDescriptorProto_FieldNumber_ReservedNameArray,
-        .hasIndex = GPBNoHasBit,
-        .flags = GPBFieldRepeated,
-        .dataType = GPBDataTypeString,
-        .offset = offsetof(GPBDescriptorProto__storage_, reservedNameArray),
-        .defaultValue.valueMessage = nil,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
-      },
-    };
-    GPBDescriptor *localDescriptor =
-        [GPBDescriptor allocDescriptorForClass:[GPBDescriptorProto class]
-                                     rootClass:[GPBDescriptorRoot class]
-                                          file:GPBDescriptorRoot_FileDescriptor()
-                                        fields:fields
-                                    fieldCount:sizeof(fields) / sizeof(GPBMessageFieldDescription)
-                                        oneofs:NULL
-                                    oneofCount:0
-                                         enums:NULL
-                                     enumCount:0
-                                        ranges:NULL
-                                    rangeCount:0
-                                   storageSize:sizeof(GPBDescriptorProto__storage_)
-                                    wireFormat:NO];
-    NSAssert(descriptor == nil, @"Startup recursed!");
-    descriptor = localDescriptor;
-  }
-  return descriptor;
-}
-
-@end
-
-#pragma mark - GPBDescriptorProto_ExtensionRange
-
-@implementation GPBDescriptorProto_ExtensionRange
-
-@dynamic hasStart, start;
-@dynamic hasEnd, end;
-
-typedef struct GPBDescriptorProto_ExtensionRange__storage_ {
-  uint32_t _has_storage_[1];
-  int32_t start;
-  int32_t end;
-} GPBDescriptorProto_ExtensionRange__storage_;
-
-// This method is threadsafe because it is initially called
-// in +initialize for each subclass.
-+ (GPBDescriptor *)descriptor {
-  static GPBDescriptor *descriptor = nil;
-  if (!descriptor) {
-    static GPBMessageFieldDescription fields[] = {
-      {
-        .name = "start",
-        .number = GPBDescriptorProto_ExtensionRange_FieldNumber_Start,
-        .hasIndex = 0,
-        .flags = GPBFieldOptional,
-        .dataType = GPBDataTypeInt32,
-        .offset = offsetof(GPBDescriptorProto_ExtensionRange__storage_, start),
-        .defaultValue.valueInt32 = 0,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "end",
-        .number = GPBDescriptorProto_ExtensionRange_FieldNumber_End,
-        .hasIndex = 1,
-        .flags = GPBFieldOptional,
-        .dataType = GPBDataTypeInt32,
-        .offset = offsetof(GPBDescriptorProto_ExtensionRange__storage_, end),
-        .defaultValue.valueInt32 = 0,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
-      },
-    };
-    GPBDescriptor *localDescriptor =
-        [GPBDescriptor allocDescriptorForClass:[GPBDescriptorProto_ExtensionRange class]
-                                     rootClass:[GPBDescriptorRoot class]
-                                          file:GPBDescriptorRoot_FileDescriptor()
-                                        fields:fields
-                                    fieldCount:sizeof(fields) / sizeof(GPBMessageFieldDescription)
-                                        oneofs:NULL
-                                    oneofCount:0
-                                         enums:NULL
-                                     enumCount:0
-                                        ranges:NULL
-                                    rangeCount:0
-                                   storageSize:sizeof(GPBDescriptorProto_ExtensionRange__storage_)
-                                    wireFormat:NO];
-    NSAssert(descriptor == nil, @"Startup recursed!");
-    descriptor = localDescriptor;
-  }
-  return descriptor;
-}
-
-@end
-
-#pragma mark - GPBDescriptorProto_ReservedRange
-
-@implementation GPBDescriptorProto_ReservedRange
-
-@dynamic hasStart, start;
-@dynamic hasEnd, end;
-
-typedef struct GPBDescriptorProto_ReservedRange__storage_ {
-  uint32_t _has_storage_[1];
-  int32_t start;
-  int32_t end;
-} GPBDescriptorProto_ReservedRange__storage_;
-
-// This method is threadsafe because it is initially called
-// in +initialize for each subclass.
-+ (GPBDescriptor *)descriptor {
-  static GPBDescriptor *descriptor = nil;
-  if (!descriptor) {
-    static GPBMessageFieldDescription fields[] = {
-      {
-        .name = "start",
-        .number = GPBDescriptorProto_ReservedRange_FieldNumber_Start,
-        .hasIndex = 0,
-        .flags = GPBFieldOptional,
-        .dataType = GPBDataTypeInt32,
-        .offset = offsetof(GPBDescriptorProto_ReservedRange__storage_, start),
-        .defaultValue.valueInt32 = 0,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "end",
-        .number = GPBDescriptorProto_ReservedRange_FieldNumber_End,
-        .hasIndex = 1,
-        .flags = GPBFieldOptional,
-        .dataType = GPBDataTypeInt32,
-        .offset = offsetof(GPBDescriptorProto_ReservedRange__storage_, end),
-        .defaultValue.valueInt32 = 0,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
-      },
-    };
-    GPBDescriptor *localDescriptor =
-        [GPBDescriptor allocDescriptorForClass:[GPBDescriptorProto_ReservedRange class]
-                                     rootClass:[GPBDescriptorRoot class]
-                                          file:GPBDescriptorRoot_FileDescriptor()
-                                        fields:fields
-                                    fieldCount:sizeof(fields) / sizeof(GPBMessageFieldDescription)
-                                        oneofs:NULL
-                                    oneofCount:0
-                                         enums:NULL
-                                     enumCount:0
-                                        ranges:NULL
-                                    rangeCount:0
-                                   storageSize:sizeof(GPBDescriptorProto_ReservedRange__storage_)
-                                    wireFormat:NO];
-    NSAssert(descriptor == nil, @"Startup recursed!");
-    descriptor = localDescriptor;
-  }
-  return descriptor;
-}
-
-@end
-
-#pragma mark - GPBFieldDescriptorProto
-
-@implementation GPBFieldDescriptorProto
-
-@dynamic hasName, name;
-@dynamic hasNumber, number;
-@dynamic hasLabel, label;
-@dynamic hasType, type;
-@dynamic hasTypeName, typeName;
-@dynamic hasExtendee, extendee;
-@dynamic hasDefaultValue, defaultValue;
-@dynamic hasOneofIndex, oneofIndex;
-@dynamic hasJsonName, jsonName;
-@dynamic hasOptions, options;
-
-typedef struct GPBFieldDescriptorProto__storage_ {
-  uint32_t _has_storage_[1];
-  int32_t number;
-  GPBFieldDescriptorProto_Label label;
-  GPBFieldDescriptorProto_Type type;
-  int32_t oneofIndex;
-  NSString *name;
-  NSString *extendee;
-  NSString *typeName;
-  NSString *defaultValue;
-  GPBFieldOptions *options;
-  NSString *jsonName;
-} GPBFieldDescriptorProto__storage_;
-
-// This method is threadsafe because it is initially called
-// in +initialize for each subclass.
-+ (GPBDescriptor *)descriptor {
-  static GPBDescriptor *descriptor = nil;
-  if (!descriptor) {
-    static GPBMessageFieldDescription fields[] = {
-      {
-        .name = "name",
-        .number = GPBFieldDescriptorProto_FieldNumber_Name,
-        .hasIndex = 0,
-        .flags = GPBFieldOptional,
-        .dataType = GPBDataTypeString,
-        .offset = offsetof(GPBFieldDescriptorProto__storage_, name),
-        .defaultValue.valueString = nil,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "extendee",
-        .number = GPBFieldDescriptorProto_FieldNumber_Extendee,
-        .hasIndex = 5,
-        .flags = GPBFieldOptional,
-        .dataType = GPBDataTypeString,
-        .offset = offsetof(GPBFieldDescriptorProto__storage_, extendee),
-        .defaultValue.valueString = nil,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "number",
-        .number = GPBFieldDescriptorProto_FieldNumber_Number,
-        .hasIndex = 1,
-        .flags = GPBFieldOptional,
-        .dataType = GPBDataTypeInt32,
-        .offset = offsetof(GPBFieldDescriptorProto__storage_, number),
-        .defaultValue.valueInt32 = 0,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "label",
-        .number = GPBFieldDescriptorProto_FieldNumber_Label,
-        .hasIndex = 2,
-        .flags = GPBFieldOptional | GPBFieldHasEnumDescriptor,
-        .dataType = GPBDataTypeEnum,
-        .offset = offsetof(GPBFieldDescriptorProto__storage_, label),
-        .defaultValue.valueEnum = GPBFieldDescriptorProto_Label_LabelOptional,
-        .dataTypeSpecific.enumDescFunc = GPBFieldDescriptorProto_Label_EnumDescriptor,
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "type",
-        .number = GPBFieldDescriptorProto_FieldNumber_Type,
-        .hasIndex = 3,
-        .flags = GPBFieldOptional | GPBFieldHasEnumDescriptor,
-        .dataType = GPBDataTypeEnum,
-        .offset = offsetof(GPBFieldDescriptorProto__storage_, type),
-        .defaultValue.valueEnum = GPBFieldDescriptorProto_Type_TypeDouble,
-        .dataTypeSpecific.enumDescFunc = GPBFieldDescriptorProto_Type_EnumDescriptor,
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "typeName",
-        .number = GPBFieldDescriptorProto_FieldNumber_TypeName,
-        .hasIndex = 4,
-        .flags = GPBFieldOptional,
-        .dataType = GPBDataTypeString,
-        .offset = offsetof(GPBFieldDescriptorProto__storage_, typeName),
-        .defaultValue.valueString = nil,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "defaultValue",
-        .number = GPBFieldDescriptorProto_FieldNumber_DefaultValue,
-        .hasIndex = 6,
-        .flags = GPBFieldOptional,
-        .dataType = GPBDataTypeString,
-        .offset = offsetof(GPBFieldDescriptorProto__storage_, defaultValue),
-        .defaultValue.valueString = nil,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "options",
-        .number = GPBFieldDescriptorProto_FieldNumber_Options,
-        .hasIndex = 9,
-        .flags = GPBFieldOptional,
-        .dataType = GPBDataTypeMessage,
-        .offset = offsetof(GPBFieldDescriptorProto__storage_, options),
-        .defaultValue.valueMessage = nil,
-        .dataTypeSpecific.className = GPBStringifySymbol(GPBFieldOptions),
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "oneofIndex",
-        .number = GPBFieldDescriptorProto_FieldNumber_OneofIndex,
-        .hasIndex = 7,
-        .flags = GPBFieldOptional,
-        .dataType = GPBDataTypeInt32,
-        .offset = offsetof(GPBFieldDescriptorProto__storage_, oneofIndex),
-        .defaultValue.valueInt32 = 0,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "jsonName",
-        .number = GPBFieldDescriptorProto_FieldNumber_JsonName,
-        .hasIndex = 8,
-        .flags = GPBFieldOptional,
-        .dataType = GPBDataTypeString,
-        .offset = offsetof(GPBFieldDescriptorProto__storage_, jsonName),
-        .defaultValue.valueString = nil,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
-      },
-    };
-    static GPBMessageEnumDescription enums[] = {
-      { .enumDescriptorFunc = GPBFieldDescriptorProto_Type_EnumDescriptor },
-      { .enumDescriptorFunc = GPBFieldDescriptorProto_Label_EnumDescriptor },
-    };
-    GPBDescriptor *localDescriptor =
-        [GPBDescriptor allocDescriptorForClass:[GPBFieldDescriptorProto class]
-                                     rootClass:[GPBDescriptorRoot class]
-                                          file:GPBDescriptorRoot_FileDescriptor()
-                                        fields:fields
-                                    fieldCount:sizeof(fields) / sizeof(GPBMessageFieldDescription)
-                                        oneofs:NULL
-                                    oneofCount:0
-                                         enums:enums
-                                     enumCount:sizeof(enums) / sizeof(GPBMessageEnumDescription)
-                                        ranges:NULL
-                                    rangeCount:0
-                                   storageSize:sizeof(GPBFieldDescriptorProto__storage_)
-                                    wireFormat:NO];
-    NSAssert(descriptor == nil, @"Startup recursed!");
-    descriptor = localDescriptor;
-  }
-  return descriptor;
-}
-
-@end
-
-#pragma mark - Enum GPBFieldDescriptorProto_Type
-
-GPBEnumDescriptor *GPBFieldDescriptorProto_Type_EnumDescriptor(void) {
-  static GPBEnumDescriptor *descriptor = NULL;
-  if (!descriptor) {
-    static GPBMessageEnumValueDescription values[] = {
-      { .name = "TypeDouble", .number = GPBFieldDescriptorProto_Type_TypeDouble },
-      { .name = "TypeFloat", .number = GPBFieldDescriptorProto_Type_TypeFloat },
-      { .name = "TypeInt64", .number = GPBFieldDescriptorProto_Type_TypeInt64 },
-      { .name = "TypeUint64", .number = GPBFieldDescriptorProto_Type_TypeUint64 },
-      { .name = "TypeInt32", .number = GPBFieldDescriptorProto_Type_TypeInt32 },
-      { .name = "TypeFixed64", .number = GPBFieldDescriptorProto_Type_TypeFixed64 },
-      { .name = "TypeFixed32", .number = GPBFieldDescriptorProto_Type_TypeFixed32 },
-      { .name = "TypeBool", .number = GPBFieldDescriptorProto_Type_TypeBool },
-      { .name = "TypeString", .number = GPBFieldDescriptorProto_Type_TypeString },
-      { .name = "TypeGroup", .number = GPBFieldDescriptorProto_Type_TypeGroup },
-      { .name = "TypeMessage", .number = GPBFieldDescriptorProto_Type_TypeMessage },
-      { .name = "TypeBytes", .number = GPBFieldDescriptorProto_Type_TypeBytes },
-      { .name = "TypeUint32", .number = GPBFieldDescriptorProto_Type_TypeUint32 },
-      { .name = "TypeEnum", .number = GPBFieldDescriptorProto_Type_TypeEnum },
-      { .name = "TypeSfixed32", .number = GPBFieldDescriptorProto_Type_TypeSfixed32 },
-      { .name = "TypeSfixed64", .number = GPBFieldDescriptorProto_Type_TypeSfixed64 },
-      { .name = "TypeSint32", .number = GPBFieldDescriptorProto_Type_TypeSint32 },
-      { .name = "TypeSint64", .number = GPBFieldDescriptorProto_Type_TypeSint64 },
-    };
-    descriptor = [GPBEnumDescriptor allocDescriptorForName:GPBNSStringifySymbol(GPBFieldDescriptorProto_Type)
-                                                   values:values
-                                               valueCount:sizeof(values) / sizeof(GPBMessageEnumValueDescription)
-                                             enumVerifier:GPBFieldDescriptorProto_Type_IsValidValue];
-  }
-  return descriptor;
-}
-
-BOOL GPBFieldDescriptorProto_Type_IsValidValue(int32_t value__) {
-  switch (value__) {
-    case GPBFieldDescriptorProto_Type_TypeDouble:
-    case GPBFieldDescriptorProto_Type_TypeFloat:
-    case GPBFieldDescriptorProto_Type_TypeInt64:
-    case GPBFieldDescriptorProto_Type_TypeUint64:
-    case GPBFieldDescriptorProto_Type_TypeInt32:
-    case GPBFieldDescriptorProto_Type_TypeFixed64:
-    case GPBFieldDescriptorProto_Type_TypeFixed32:
-    case GPBFieldDescriptorProto_Type_TypeBool:
-    case GPBFieldDescriptorProto_Type_TypeString:
-    case GPBFieldDescriptorProto_Type_TypeGroup:
-    case GPBFieldDescriptorProto_Type_TypeMessage:
-    case GPBFieldDescriptorProto_Type_TypeBytes:
-    case GPBFieldDescriptorProto_Type_TypeUint32:
-    case GPBFieldDescriptorProto_Type_TypeEnum:
-    case GPBFieldDescriptorProto_Type_TypeSfixed32:
-    case GPBFieldDescriptorProto_Type_TypeSfixed64:
-    case GPBFieldDescriptorProto_Type_TypeSint32:
-    case GPBFieldDescriptorProto_Type_TypeSint64:
-      return YES;
-    default:
-      return NO;
-  }
-}
-
-#pragma mark - Enum GPBFieldDescriptorProto_Label
-
-GPBEnumDescriptor *GPBFieldDescriptorProto_Label_EnumDescriptor(void) {
-  static GPBEnumDescriptor *descriptor = NULL;
-  if (!descriptor) {
-    static GPBMessageEnumValueDescription values[] = {
-      { .name = "LabelOptional", .number = GPBFieldDescriptorProto_Label_LabelOptional },
-      { .name = "LabelRequired", .number = GPBFieldDescriptorProto_Label_LabelRequired },
-      { .name = "LabelRepeated", .number = GPBFieldDescriptorProto_Label_LabelRepeated },
-    };
-    descriptor = [GPBEnumDescriptor allocDescriptorForName:GPBNSStringifySymbol(GPBFieldDescriptorProto_Label)
-                                                   values:values
-                                               valueCount:sizeof(values) / sizeof(GPBMessageEnumValueDescription)
-                                             enumVerifier:GPBFieldDescriptorProto_Label_IsValidValue];
-  }
-  return descriptor;
-}
-
-BOOL GPBFieldDescriptorProto_Label_IsValidValue(int32_t value__) {
-  switch (value__) {
-    case GPBFieldDescriptorProto_Label_LabelOptional:
-    case GPBFieldDescriptorProto_Label_LabelRequired:
-    case GPBFieldDescriptorProto_Label_LabelRepeated:
-      return YES;
-    default:
-      return NO;
-  }
-}
-
-#pragma mark - GPBOneofDescriptorProto
-
-@implementation GPBOneofDescriptorProto
-
-@dynamic hasName, name;
-
-typedef struct GPBOneofDescriptorProto__storage_ {
-  uint32_t _has_storage_[1];
-  NSString *name;
-} GPBOneofDescriptorProto__storage_;
-
-// This method is threadsafe because it is initially called
-// in +initialize for each subclass.
-+ (GPBDescriptor *)descriptor {
-  static GPBDescriptor *descriptor = nil;
-  if (!descriptor) {
-    static GPBMessageFieldDescription fields[] = {
-      {
-        .name = "name",
-        .number = GPBOneofDescriptorProto_FieldNumber_Name,
-        .hasIndex = 0,
-        .flags = GPBFieldOptional,
-        .dataType = GPBDataTypeString,
-        .offset = offsetof(GPBOneofDescriptorProto__storage_, name),
-        .defaultValue.valueString = nil,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
-      },
-    };
-    GPBDescriptor *localDescriptor =
-        [GPBDescriptor allocDescriptorForClass:[GPBOneofDescriptorProto class]
-                                     rootClass:[GPBDescriptorRoot class]
-                                          file:GPBDescriptorRoot_FileDescriptor()
-                                        fields:fields
-                                    fieldCount:sizeof(fields) / sizeof(GPBMessageFieldDescription)
-                                        oneofs:NULL
-                                    oneofCount:0
-                                         enums:NULL
-                                     enumCount:0
-                                        ranges:NULL
-                                    rangeCount:0
-                                   storageSize:sizeof(GPBOneofDescriptorProto__storage_)
-                                    wireFormat:NO];
-    NSAssert(descriptor == nil, @"Startup recursed!");
-    descriptor = localDescriptor;
-  }
-  return descriptor;
-}
-
-@end
-
-#pragma mark - GPBEnumDescriptorProto
-
-@implementation GPBEnumDescriptorProto
-
-@dynamic hasName, name;
-@dynamic valueArray, valueArray_Count;
-@dynamic hasOptions, options;
-
-typedef struct GPBEnumDescriptorProto__storage_ {
-  uint32_t _has_storage_[1];
-  NSString *name;
-  NSMutableArray *valueArray;
-  GPBEnumOptions *options;
-} GPBEnumDescriptorProto__storage_;
-
-// This method is threadsafe because it is initially called
-// in +initialize for each subclass.
-+ (GPBDescriptor *)descriptor {
-  static GPBDescriptor *descriptor = nil;
-  if (!descriptor) {
-    static GPBMessageFieldDescription fields[] = {
-      {
-        .name = "name",
-        .number = GPBEnumDescriptorProto_FieldNumber_Name,
-        .hasIndex = 0,
-        .flags = GPBFieldOptional,
-        .dataType = GPBDataTypeString,
-        .offset = offsetof(GPBEnumDescriptorProto__storage_, name),
-        .defaultValue.valueString = nil,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "valueArray",
-        .number = GPBEnumDescriptorProto_FieldNumber_ValueArray,
-        .hasIndex = GPBNoHasBit,
-        .flags = GPBFieldRepeated,
-        .dataType = GPBDataTypeMessage,
-        .offset = offsetof(GPBEnumDescriptorProto__storage_, valueArray),
-        .defaultValue.valueMessage = nil,
-        .dataTypeSpecific.className = GPBStringifySymbol(GPBEnumValueDescriptorProto),
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "options",
-        .number = GPBEnumDescriptorProto_FieldNumber_Options,
-        .hasIndex = 2,
-        .flags = GPBFieldOptional,
-        .dataType = GPBDataTypeMessage,
-        .offset = offsetof(GPBEnumDescriptorProto__storage_, options),
-        .defaultValue.valueMessage = nil,
-        .dataTypeSpecific.className = GPBStringifySymbol(GPBEnumOptions),
-        .fieldOptions = NULL,
-      },
-    };
-    GPBDescriptor *localDescriptor =
-        [GPBDescriptor allocDescriptorForClass:[GPBEnumDescriptorProto class]
-                                     rootClass:[GPBDescriptorRoot class]
-                                          file:GPBDescriptorRoot_FileDescriptor()
-                                        fields:fields
-                                    fieldCount:sizeof(fields) / sizeof(GPBMessageFieldDescription)
-                                        oneofs:NULL
-                                    oneofCount:0
-                                         enums:NULL
-                                     enumCount:0
-                                        ranges:NULL
-                                    rangeCount:0
-                                   storageSize:sizeof(GPBEnumDescriptorProto__storage_)
-                                    wireFormat:NO];
-    NSAssert(descriptor == nil, @"Startup recursed!");
-    descriptor = localDescriptor;
-  }
-  return descriptor;
-}
-
-@end
-
-#pragma mark - GPBEnumValueDescriptorProto
-
-@implementation GPBEnumValueDescriptorProto
-
-@dynamic hasName, name;
-@dynamic hasNumber, number;
-@dynamic hasOptions, options;
-
-typedef struct GPBEnumValueDescriptorProto__storage_ {
-  uint32_t _has_storage_[1];
-  int32_t number;
-  NSString *name;
-  GPBEnumValueOptions *options;
-} GPBEnumValueDescriptorProto__storage_;
-
-// This method is threadsafe because it is initially called
-// in +initialize for each subclass.
-+ (GPBDescriptor *)descriptor {
-  static GPBDescriptor *descriptor = nil;
-  if (!descriptor) {
-    static GPBMessageFieldDescription fields[] = {
-      {
-        .name = "name",
-        .number = GPBEnumValueDescriptorProto_FieldNumber_Name,
-        .hasIndex = 0,
-        .flags = GPBFieldOptional,
-        .dataType = GPBDataTypeString,
-        .offset = offsetof(GPBEnumValueDescriptorProto__storage_, name),
-        .defaultValue.valueString = nil,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "number",
-        .number = GPBEnumValueDescriptorProto_FieldNumber_Number,
-        .hasIndex = 1,
-        .flags = GPBFieldOptional,
-        .dataType = GPBDataTypeInt32,
-        .offset = offsetof(GPBEnumValueDescriptorProto__storage_, number),
-        .defaultValue.valueInt32 = 0,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "options",
-        .number = GPBEnumValueDescriptorProto_FieldNumber_Options,
-        .hasIndex = 2,
-        .flags = GPBFieldOptional,
-        .dataType = GPBDataTypeMessage,
-        .offset = offsetof(GPBEnumValueDescriptorProto__storage_, options),
-        .defaultValue.valueMessage = nil,
-        .dataTypeSpecific.className = GPBStringifySymbol(GPBEnumValueOptions),
-        .fieldOptions = NULL,
-      },
-    };
-    GPBDescriptor *localDescriptor =
-        [GPBDescriptor allocDescriptorForClass:[GPBEnumValueDescriptorProto class]
-                                     rootClass:[GPBDescriptorRoot class]
-                                          file:GPBDescriptorRoot_FileDescriptor()
-                                        fields:fields
-                                    fieldCount:sizeof(fields) / sizeof(GPBMessageFieldDescription)
-                                        oneofs:NULL
-                                    oneofCount:0
-                                         enums:NULL
-                                     enumCount:0
-                                        ranges:NULL
-                                    rangeCount:0
-                                   storageSize:sizeof(GPBEnumValueDescriptorProto__storage_)
-                                    wireFormat:NO];
-    NSAssert(descriptor == nil, @"Startup recursed!");
-    descriptor = localDescriptor;
-  }
-  return descriptor;
-}
-
-@end
-
-#pragma mark - GPBServiceDescriptorProto
-
-@implementation GPBServiceDescriptorProto
-
-@dynamic hasName, name;
-@dynamic methodArray, methodArray_Count;
-@dynamic hasOptions, options;
-
-typedef struct GPBServiceDescriptorProto__storage_ {
-  uint32_t _has_storage_[1];
-  NSString *name;
-  NSMutableArray *methodArray;
-  GPBServiceOptions *options;
-} GPBServiceDescriptorProto__storage_;
-
-// This method is threadsafe because it is initially called
-// in +initialize for each subclass.
-+ (GPBDescriptor *)descriptor {
-  static GPBDescriptor *descriptor = nil;
-  if (!descriptor) {
-    static GPBMessageFieldDescription fields[] = {
-      {
-        .name = "name",
-        .number = GPBServiceDescriptorProto_FieldNumber_Name,
-        .hasIndex = 0,
-        .flags = GPBFieldOptional,
-        .dataType = GPBDataTypeString,
-        .offset = offsetof(GPBServiceDescriptorProto__storage_, name),
-        .defaultValue.valueString = nil,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "methodArray",
-        .number = GPBServiceDescriptorProto_FieldNumber_MethodArray,
-        .hasIndex = GPBNoHasBit,
-        .flags = GPBFieldRepeated,
-        .dataType = GPBDataTypeMessage,
-        .offset = offsetof(GPBServiceDescriptorProto__storage_, methodArray),
-        .defaultValue.valueMessage = nil,
-        .dataTypeSpecific.className = GPBStringifySymbol(GPBMethodDescriptorProto),
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "options",
-        .number = GPBServiceDescriptorProto_FieldNumber_Options,
-        .hasIndex = 2,
-        .flags = GPBFieldOptional,
-        .dataType = GPBDataTypeMessage,
-        .offset = offsetof(GPBServiceDescriptorProto__storage_, options),
-        .defaultValue.valueMessage = nil,
-        .dataTypeSpecific.className = GPBStringifySymbol(GPBServiceOptions),
-        .fieldOptions = NULL,
-      },
-    };
-    GPBDescriptor *localDescriptor =
-        [GPBDescriptor allocDescriptorForClass:[GPBServiceDescriptorProto class]
-                                     rootClass:[GPBDescriptorRoot class]
-                                          file:GPBDescriptorRoot_FileDescriptor()
-                                        fields:fields
-                                    fieldCount:sizeof(fields) / sizeof(GPBMessageFieldDescription)
-                                        oneofs:NULL
-                                    oneofCount:0
-                                         enums:NULL
-                                     enumCount:0
-                                        ranges:NULL
-                                    rangeCount:0
-                                   storageSize:sizeof(GPBServiceDescriptorProto__storage_)
-                                    wireFormat:NO];
-    NSAssert(descriptor == nil, @"Startup recursed!");
-    descriptor = localDescriptor;
-  }
-  return descriptor;
-}
-
-@end
-
-#pragma mark - GPBMethodDescriptorProto
-
-@implementation GPBMethodDescriptorProto
-
-@dynamic hasName, name;
-@dynamic hasInputType, inputType;
-@dynamic hasOutputType, outputType;
-@dynamic hasOptions, options;
-@dynamic hasClientStreaming, clientStreaming;
-@dynamic hasServerStreaming, serverStreaming;
-
-typedef struct GPBMethodDescriptorProto__storage_ {
-  uint32_t _has_storage_[1];
-  BOOL clientStreaming;
-  BOOL serverStreaming;
-  NSString *name;
-  NSString *inputType;
-  NSString *outputType;
-  GPBMethodOptions *options;
-} GPBMethodDescriptorProto__storage_;
-
-// This method is threadsafe because it is initially called
-// in +initialize for each subclass.
-+ (GPBDescriptor *)descriptor {
-  static GPBDescriptor *descriptor = nil;
-  if (!descriptor) {
-    static GPBMessageFieldDescription fields[] = {
-      {
-        .name = "name",
-        .number = GPBMethodDescriptorProto_FieldNumber_Name,
-        .hasIndex = 0,
-        .flags = GPBFieldOptional,
-        .dataType = GPBDataTypeString,
-        .offset = offsetof(GPBMethodDescriptorProto__storage_, name),
-        .defaultValue.valueString = nil,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "inputType",
-        .number = GPBMethodDescriptorProto_FieldNumber_InputType,
-        .hasIndex = 1,
-        .flags = GPBFieldOptional,
-        .dataType = GPBDataTypeString,
-        .offset = offsetof(GPBMethodDescriptorProto__storage_, inputType),
-        .defaultValue.valueString = nil,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "outputType",
-        .number = GPBMethodDescriptorProto_FieldNumber_OutputType,
-        .hasIndex = 2,
-        .flags = GPBFieldOptional,
-        .dataType = GPBDataTypeString,
-        .offset = offsetof(GPBMethodDescriptorProto__storage_, outputType),
-        .defaultValue.valueString = nil,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "options",
-        .number = GPBMethodDescriptorProto_FieldNumber_Options,
-        .hasIndex = 3,
-        .flags = GPBFieldOptional,
-        .dataType = GPBDataTypeMessage,
-        .offset = offsetof(GPBMethodDescriptorProto__storage_, options),
-        .defaultValue.valueMessage = nil,
-        .dataTypeSpecific.className = GPBStringifySymbol(GPBMethodOptions),
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "clientStreaming",
-        .number = GPBMethodDescriptorProto_FieldNumber_ClientStreaming,
-        .hasIndex = 4,
-        .flags = GPBFieldOptional | GPBFieldHasDefaultValue,
-        .dataType = GPBDataTypeBool,
-        .offset = offsetof(GPBMethodDescriptorProto__storage_, clientStreaming),
-        .defaultValue.valueBool = NO,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "serverStreaming",
-        .number = GPBMethodDescriptorProto_FieldNumber_ServerStreaming,
-        .hasIndex = 5,
-        .flags = GPBFieldOptional | GPBFieldHasDefaultValue,
-        .dataType = GPBDataTypeBool,
-        .offset = offsetof(GPBMethodDescriptorProto__storage_, serverStreaming),
-        .defaultValue.valueBool = NO,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
-      },
-    };
-    GPBDescriptor *localDescriptor =
-        [GPBDescriptor allocDescriptorForClass:[GPBMethodDescriptorProto class]
-                                     rootClass:[GPBDescriptorRoot class]
-                                          file:GPBDescriptorRoot_FileDescriptor()
-                                        fields:fields
-                                    fieldCount:sizeof(fields) / sizeof(GPBMessageFieldDescription)
-                                        oneofs:NULL
-                                    oneofCount:0
-                                         enums:NULL
-                                     enumCount:0
-                                        ranges:NULL
-                                    rangeCount:0
-                                   storageSize:sizeof(GPBMethodDescriptorProto__storage_)
-                                    wireFormat:NO];
-    NSAssert(descriptor == nil, @"Startup recursed!");
-    descriptor = localDescriptor;
-  }
-  return descriptor;
-}
-
-@end
-
-#pragma mark - GPBFileOptions
-
-@implementation GPBFileOptions
-
-@dynamic hasJavaPackage, javaPackage;
-@dynamic hasJavaOuterClassname, javaOuterClassname;
-@dynamic hasJavaMultipleFiles, javaMultipleFiles;
-@dynamic hasJavaGenerateEqualsAndHash, javaGenerateEqualsAndHash;
-@dynamic hasJavaStringCheckUtf8, javaStringCheckUtf8;
-@dynamic hasOptimizeFor, optimizeFor;
-@dynamic hasGoPackage, goPackage;
-@dynamic hasCcGenericServices, ccGenericServices;
-@dynamic hasJavaGenericServices, javaGenericServices;
-@dynamic hasPyGenericServices, pyGenericServices;
-@dynamic hasDeprecated, deprecated;
-@dynamic hasCcEnableArenas, ccEnableArenas;
-@dynamic hasObjcClassPrefix, objcClassPrefix;
-@dynamic hasCsharpNamespace, csharpNamespace;
-@dynamic hasJavananoUseDeprecatedPackage, javananoUseDeprecatedPackage;
-@dynamic uninterpretedOptionArray, uninterpretedOptionArray_Count;
-
-typedef struct GPBFileOptions__storage_ {
-  uint32_t _has_storage_[1];
-  BOOL javaMultipleFiles;
-  BOOL ccGenericServices;
-  BOOL javaGenericServices;
-  BOOL pyGenericServices;
-  BOOL javaGenerateEqualsAndHash;
-  BOOL deprecated;
-  BOOL javaStringCheckUtf8;
-  BOOL ccEnableArenas;
-  BOOL javananoUseDeprecatedPackage;
-  GPBFileOptions_OptimizeMode optimizeFor;
-  NSString *javaPackage;
-  NSString *javaOuterClassname;
-  NSString *goPackage;
-  NSString *objcClassPrefix;
-  NSString *csharpNamespace;
-  NSMutableArray *uninterpretedOptionArray;
-} GPBFileOptions__storage_;
-
-// This method is threadsafe because it is initially called
-// in +initialize for each subclass.
-+ (GPBDescriptor *)descriptor {
-  static GPBDescriptor *descriptor = nil;
-  if (!descriptor) {
-    static GPBMessageFieldDescription fields[] = {
-      {
-        .name = "javaPackage",
-        .number = GPBFileOptions_FieldNumber_JavaPackage,
-        .hasIndex = 0,
-        .flags = GPBFieldOptional,
-        .dataType = GPBDataTypeString,
-        .offset = offsetof(GPBFileOptions__storage_, javaPackage),
-        .defaultValue.valueString = nil,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "javaOuterClassname",
-        .number = GPBFileOptions_FieldNumber_JavaOuterClassname,
-        .hasIndex = 1,
-        .flags = GPBFieldOptional,
-        .dataType = GPBDataTypeString,
-        .offset = offsetof(GPBFileOptions__storage_, javaOuterClassname),
-        .defaultValue.valueString = nil,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "optimizeFor",
-        .number = GPBFileOptions_FieldNumber_OptimizeFor,
-        .hasIndex = 5,
-        .flags = GPBFieldOptional | GPBFieldHasDefaultValue | GPBFieldHasEnumDescriptor,
-        .dataType = GPBDataTypeEnum,
-        .offset = offsetof(GPBFileOptions__storage_, optimizeFor),
-        .defaultValue.valueEnum = GPBFileOptions_OptimizeMode_Speed,
-        .dataTypeSpecific.enumDescFunc = GPBFileOptions_OptimizeMode_EnumDescriptor,
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "javaMultipleFiles",
-        .number = GPBFileOptions_FieldNumber_JavaMultipleFiles,
-        .hasIndex = 2,
-        .flags = GPBFieldOptional | GPBFieldHasDefaultValue,
-        .dataType = GPBDataTypeBool,
-        .offset = offsetof(GPBFileOptions__storage_, javaMultipleFiles),
-        .defaultValue.valueBool = NO,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "goPackage",
-        .number = GPBFileOptions_FieldNumber_GoPackage,
-        .hasIndex = 6,
-        .flags = GPBFieldOptional,
-        .dataType = GPBDataTypeString,
-        .offset = offsetof(GPBFileOptions__storage_, goPackage),
-        .defaultValue.valueString = nil,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "ccGenericServices",
-        .number = GPBFileOptions_FieldNumber_CcGenericServices,
-        .hasIndex = 7,
-        .flags = GPBFieldOptional | GPBFieldHasDefaultValue,
-        .dataType = GPBDataTypeBool,
-        .offset = offsetof(GPBFileOptions__storage_, ccGenericServices),
-        .defaultValue.valueBool = NO,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "javaGenericServices",
-        .number = GPBFileOptions_FieldNumber_JavaGenericServices,
-        .hasIndex = 8,
-        .flags = GPBFieldOptional | GPBFieldHasDefaultValue,
-        .dataType = GPBDataTypeBool,
-        .offset = offsetof(GPBFileOptions__storage_, javaGenericServices),
-        .defaultValue.valueBool = NO,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "pyGenericServices",
-        .number = GPBFileOptions_FieldNumber_PyGenericServices,
-        .hasIndex = 9,
-        .flags = GPBFieldOptional | GPBFieldHasDefaultValue,
-        .dataType = GPBDataTypeBool,
-        .offset = offsetof(GPBFileOptions__storage_, pyGenericServices),
-        .defaultValue.valueBool = NO,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "javaGenerateEqualsAndHash",
-        .number = GPBFileOptions_FieldNumber_JavaGenerateEqualsAndHash,
-        .hasIndex = 3,
-        .flags = GPBFieldOptional | GPBFieldHasDefaultValue,
-        .dataType = GPBDataTypeBool,
-        .offset = offsetof(GPBFileOptions__storage_, javaGenerateEqualsAndHash),
-        .defaultValue.valueBool = NO,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "deprecated",
-        .number = GPBFileOptions_FieldNumber_Deprecated,
-        .hasIndex = 10,
-        .flags = GPBFieldOptional | GPBFieldHasDefaultValue,
-        .dataType = GPBDataTypeBool,
-        .offset = offsetof(GPBFileOptions__storage_, deprecated),
-        .defaultValue.valueBool = NO,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "javaStringCheckUtf8",
-        .number = GPBFileOptions_FieldNumber_JavaStringCheckUtf8,
-        .hasIndex = 4,
-        .flags = GPBFieldOptional | GPBFieldHasDefaultValue,
-        .dataType = GPBDataTypeBool,
-        .offset = offsetof(GPBFileOptions__storage_, javaStringCheckUtf8),
-        .defaultValue.valueBool = NO,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "ccEnableArenas",
-        .number = GPBFileOptions_FieldNumber_CcEnableArenas,
-        .hasIndex = 11,
-        .flags = GPBFieldOptional | GPBFieldHasDefaultValue,
-        .dataType = GPBDataTypeBool,
-        .offset = offsetof(GPBFileOptions__storage_, ccEnableArenas),
-        .defaultValue.valueBool = NO,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "objcClassPrefix",
-        .number = GPBFileOptions_FieldNumber_ObjcClassPrefix,
-        .hasIndex = 12,
-        .flags = GPBFieldOptional,
-        .dataType = GPBDataTypeString,
-        .offset = offsetof(GPBFileOptions__storage_, objcClassPrefix),
-        .defaultValue.valueString = nil,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "csharpNamespace",
-        .number = GPBFileOptions_FieldNumber_CsharpNamespace,
-        .hasIndex = 13,
-        .flags = GPBFieldOptional,
-        .dataType = GPBDataTypeString,
-        .offset = offsetof(GPBFileOptions__storage_, csharpNamespace),
-        .defaultValue.valueString = nil,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "javananoUseDeprecatedPackage",
-        .number = GPBFileOptions_FieldNumber_JavananoUseDeprecatedPackage,
-        .hasIndex = 14,
-        .flags = GPBFieldOptional,
-        .dataType = GPBDataTypeBool,
-        .offset = offsetof(GPBFileOptions__storage_, javananoUseDeprecatedPackage),
-        .defaultValue.valueBool = NO,
-        .dataTypeSpecific.className = NULL,
-      #if GPBOBJC_INCLUDE_FIELD_OPTIONS
-        .fieldOptions = "\000\000\000\002\030\001",
-      #else
-        .fieldOptions = NULL,
-      #endif  // GPBOBJC_INCLUDE_FIELD_OPTIONS
-      },
-      {
-        .name = "uninterpretedOptionArray",
-        .number = GPBFileOptions_FieldNumber_UninterpretedOptionArray,
-        .hasIndex = GPBNoHasBit,
-        .flags = GPBFieldRepeated,
-        .dataType = GPBDataTypeMessage,
-        .offset = offsetof(GPBFileOptions__storage_, uninterpretedOptionArray),
-        .defaultValue.valueMessage = nil,
-        .dataTypeSpecific.className = GPBStringifySymbol(GPBUninterpretedOption),
-        .fieldOptions = NULL,
-      },
-    };
-    static GPBMessageEnumDescription enums[] = {
-      { .enumDescriptorFunc = GPBFileOptions_OptimizeMode_EnumDescriptor },
-    };
-    static GPBExtensionRange ranges[] = {
-      { .start = 1000, .end = 536870912 },
-    };
-    GPBDescriptor *localDescriptor =
-        [GPBDescriptor allocDescriptorForClass:[GPBFileOptions class]
-                                     rootClass:[GPBDescriptorRoot class]
-                                          file:GPBDescriptorRoot_FileDescriptor()
-                                        fields:fields
-                                    fieldCount:sizeof(fields) / sizeof(GPBMessageFieldDescription)
-                                        oneofs:NULL
-                                    oneofCount:0
-                                         enums:enums
-                                     enumCount:sizeof(enums) / sizeof(GPBMessageEnumDescription)
-                                        ranges:ranges
-                                    rangeCount:sizeof(ranges) / sizeof(GPBExtensionRange)
-                                   storageSize:sizeof(GPBFileOptions__storage_)
-                                    wireFormat:NO];
-    NSAssert(descriptor == nil, @"Startup recursed!");
-    descriptor = localDescriptor;
-  }
-  return descriptor;
-}
-
-@end
-
-#pragma mark - Enum GPBFileOptions_OptimizeMode
-
-GPBEnumDescriptor *GPBFileOptions_OptimizeMode_EnumDescriptor(void) {
-  static GPBEnumDescriptor *descriptor = NULL;
-  if (!descriptor) {
-    static GPBMessageEnumValueDescription values[] = {
-      { .name = "Speed", .number = GPBFileOptions_OptimizeMode_Speed },
-      { .name = "CodeSize", .number = GPBFileOptions_OptimizeMode_CodeSize },
-      { .name = "LiteRuntime", .number = GPBFileOptions_OptimizeMode_LiteRuntime },
-    };
-    descriptor = [GPBEnumDescriptor allocDescriptorForName:GPBNSStringifySymbol(GPBFileOptions_OptimizeMode)
-                                                   values:values
-                                               valueCount:sizeof(values) / sizeof(GPBMessageEnumValueDescription)
-                                             enumVerifier:GPBFileOptions_OptimizeMode_IsValidValue];
-  }
-  return descriptor;
-}
-
-BOOL GPBFileOptions_OptimizeMode_IsValidValue(int32_t value__) {
-  switch (value__) {
-    case GPBFileOptions_OptimizeMode_Speed:
-    case GPBFileOptions_OptimizeMode_CodeSize:
-    case GPBFileOptions_OptimizeMode_LiteRuntime:
-      return YES;
-    default:
-      return NO;
-  }
-}
-
-#pragma mark - GPBMessageOptions
-
-@implementation GPBMessageOptions
-
-@dynamic hasMessageSetWireFormat, messageSetWireFormat;
-@dynamic hasNoStandardDescriptorAccessor, noStandardDescriptorAccessor;
-@dynamic hasDeprecated, deprecated;
-@dynamic hasMapEntry, mapEntry;
-@dynamic uninterpretedOptionArray, uninterpretedOptionArray_Count;
-
-typedef struct GPBMessageOptions__storage_ {
-  uint32_t _has_storage_[1];
-  BOOL messageSetWireFormat;
-  BOOL noStandardDescriptorAccessor;
-  BOOL deprecated;
-  BOOL mapEntry;
-  NSMutableArray *uninterpretedOptionArray;
-} GPBMessageOptions__storage_;
-
-// This method is threadsafe because it is initially called
-// in +initialize for each subclass.
-+ (GPBDescriptor *)descriptor {
-  static GPBDescriptor *descriptor = nil;
-  if (!descriptor) {
-    static GPBMessageFieldDescription fields[] = {
-      {
-        .name = "messageSetWireFormat",
-        .number = GPBMessageOptions_FieldNumber_MessageSetWireFormat,
-        .hasIndex = 0,
-        .flags = GPBFieldOptional | GPBFieldHasDefaultValue,
-        .dataType = GPBDataTypeBool,
-        .offset = offsetof(GPBMessageOptions__storage_, messageSetWireFormat),
-        .defaultValue.valueBool = NO,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "noStandardDescriptorAccessor",
-        .number = GPBMessageOptions_FieldNumber_NoStandardDescriptorAccessor,
-        .hasIndex = 1,
-        .flags = GPBFieldOptional | GPBFieldHasDefaultValue,
-        .dataType = GPBDataTypeBool,
-        .offset = offsetof(GPBMessageOptions__storage_, noStandardDescriptorAccessor),
-        .defaultValue.valueBool = NO,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "deprecated",
-        .number = GPBMessageOptions_FieldNumber_Deprecated,
-        .hasIndex = 2,
-        .flags = GPBFieldOptional | GPBFieldHasDefaultValue,
-        .dataType = GPBDataTypeBool,
-        .offset = offsetof(GPBMessageOptions__storage_, deprecated),
-        .defaultValue.valueBool = NO,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "mapEntry",
-        .number = GPBMessageOptions_FieldNumber_MapEntry,
-        .hasIndex = 3,
-        .flags = GPBFieldOptional,
-        .dataType = GPBDataTypeBool,
-        .offset = offsetof(GPBMessageOptions__storage_, mapEntry),
-        .defaultValue.valueBool = NO,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "uninterpretedOptionArray",
-        .number = GPBMessageOptions_FieldNumber_UninterpretedOptionArray,
-        .hasIndex = GPBNoHasBit,
-        .flags = GPBFieldRepeated,
-        .dataType = GPBDataTypeMessage,
-        .offset = offsetof(GPBMessageOptions__storage_, uninterpretedOptionArray),
-        .defaultValue.valueMessage = nil,
-        .dataTypeSpecific.className = GPBStringifySymbol(GPBUninterpretedOption),
-        .fieldOptions = NULL,
-      },
-    };
-    static GPBExtensionRange ranges[] = {
-      { .start = 1000, .end = 536870912 },
-    };
-    GPBDescriptor *localDescriptor =
-        [GPBDescriptor allocDescriptorForClass:[GPBMessageOptions class]
-                                     rootClass:[GPBDescriptorRoot class]
-                                          file:GPBDescriptorRoot_FileDescriptor()
-                                        fields:fields
-                                    fieldCount:sizeof(fields) / sizeof(GPBMessageFieldDescription)
-                                        oneofs:NULL
-                                    oneofCount:0
-                                         enums:NULL
-                                     enumCount:0
-                                        ranges:ranges
-                                    rangeCount:sizeof(ranges) / sizeof(GPBExtensionRange)
-                                   storageSize:sizeof(GPBMessageOptions__storage_)
-                                    wireFormat:NO];
-    NSAssert(descriptor == nil, @"Startup recursed!");
-    descriptor = localDescriptor;
-  }
-  return descriptor;
-}
-
-@end
-
-#pragma mark - GPBFieldOptions
-
-@implementation GPBFieldOptions
-
-@dynamic hasCtype, ctype;
-@dynamic hasPacked, packed;
-@dynamic hasJstype, jstype;
-@dynamic hasLazy, lazy;
-@dynamic hasDeprecated, deprecated;
-@dynamic hasWeak, weak;
-@dynamic uninterpretedOptionArray, uninterpretedOptionArray_Count;
-
-typedef struct GPBFieldOptions__storage_ {
-  uint32_t _has_storage_[1];
-  BOOL packed;
-  BOOL deprecated;
-  BOOL lazy;
-  BOOL weak;
-  GPBFieldOptions_CType ctype;
-  GPBFieldOptions_JSType jstype;
-  NSMutableArray *uninterpretedOptionArray;
-} GPBFieldOptions__storage_;
-
-// This method is threadsafe because it is initially called
-// in +initialize for each subclass.
-+ (GPBDescriptor *)descriptor {
-  static GPBDescriptor *descriptor = nil;
-  if (!descriptor) {
-    static GPBMessageFieldDescription fields[] = {
-      {
-        .name = "ctype",
-        .number = GPBFieldOptions_FieldNumber_Ctype,
-        .hasIndex = 0,
-        .flags = GPBFieldOptional | GPBFieldHasDefaultValue | GPBFieldHasEnumDescriptor,
-        .dataType = GPBDataTypeEnum,
-        .offset = offsetof(GPBFieldOptions__storage_, ctype),
-        .defaultValue.valueEnum = GPBFieldOptions_CType_String,
-        .dataTypeSpecific.enumDescFunc = GPBFieldOptions_CType_EnumDescriptor,
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "packed",
-        .number = GPBFieldOptions_FieldNumber_Packed,
-        .hasIndex = 1,
-        .flags = GPBFieldOptional,
-        .dataType = GPBDataTypeBool,
-        .offset = offsetof(GPBFieldOptions__storage_, packed),
-        .defaultValue.valueBool = NO,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "deprecated",
-        .number = GPBFieldOptions_FieldNumber_Deprecated,
-        .hasIndex = 4,
-        .flags = GPBFieldOptional | GPBFieldHasDefaultValue,
-        .dataType = GPBDataTypeBool,
-        .offset = offsetof(GPBFieldOptions__storage_, deprecated),
-        .defaultValue.valueBool = NO,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "lazy",
-        .number = GPBFieldOptions_FieldNumber_Lazy,
-        .hasIndex = 3,
-        .flags = GPBFieldOptional | GPBFieldHasDefaultValue,
-        .dataType = GPBDataTypeBool,
-        .offset = offsetof(GPBFieldOptions__storage_, lazy),
-        .defaultValue.valueBool = NO,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "jstype",
-        .number = GPBFieldOptions_FieldNumber_Jstype,
-        .hasIndex = 2,
-        .flags = GPBFieldOptional | GPBFieldHasDefaultValue | GPBFieldHasEnumDescriptor,
-        .dataType = GPBDataTypeEnum,
-        .offset = offsetof(GPBFieldOptions__storage_, jstype),
-        .defaultValue.valueEnum = GPBFieldOptions_JSType_JsNormal,
-        .dataTypeSpecific.enumDescFunc = GPBFieldOptions_JSType_EnumDescriptor,
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "weak",
-        .number = GPBFieldOptions_FieldNumber_Weak,
-        .hasIndex = 5,
-        .flags = GPBFieldOptional | GPBFieldHasDefaultValue,
-        .dataType = GPBDataTypeBool,
-        .offset = offsetof(GPBFieldOptions__storage_, weak),
-        .defaultValue.valueBool = NO,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "uninterpretedOptionArray",
-        .number = GPBFieldOptions_FieldNumber_UninterpretedOptionArray,
-        .hasIndex = GPBNoHasBit,
-        .flags = GPBFieldRepeated,
-        .dataType = GPBDataTypeMessage,
-        .offset = offsetof(GPBFieldOptions__storage_, uninterpretedOptionArray),
-        .defaultValue.valueMessage = nil,
-        .dataTypeSpecific.className = GPBStringifySymbol(GPBUninterpretedOption),
-        .fieldOptions = NULL,
-      },
-    };
-    static GPBMessageEnumDescription enums[] = {
-      { .enumDescriptorFunc = GPBFieldOptions_CType_EnumDescriptor },
-      { .enumDescriptorFunc = GPBFieldOptions_JSType_EnumDescriptor },
-    };
-    static GPBExtensionRange ranges[] = {
-      { .start = 1000, .end = 536870912 },
-    };
-    GPBDescriptor *localDescriptor =
-        [GPBDescriptor allocDescriptorForClass:[GPBFieldOptions class]
-                                     rootClass:[GPBDescriptorRoot class]
-                                          file:GPBDescriptorRoot_FileDescriptor()
-                                        fields:fields
-                                    fieldCount:sizeof(fields) / sizeof(GPBMessageFieldDescription)
-                                        oneofs:NULL
-                                    oneofCount:0
-                                         enums:enums
-                                     enumCount:sizeof(enums) / sizeof(GPBMessageEnumDescription)
-                                        ranges:ranges
-                                    rangeCount:sizeof(ranges) / sizeof(GPBExtensionRange)
-                                   storageSize:sizeof(GPBFieldOptions__storage_)
-                                    wireFormat:NO];
-    NSAssert(descriptor == nil, @"Startup recursed!");
-    descriptor = localDescriptor;
-  }
-  return descriptor;
-}
-
-@end
-
-#pragma mark - Enum GPBFieldOptions_CType
-
-GPBEnumDescriptor *GPBFieldOptions_CType_EnumDescriptor(void) {
-  static GPBEnumDescriptor *descriptor = NULL;
-  if (!descriptor) {
-    static GPBMessageEnumValueDescription values[] = {
-      { .name = "String", .number = GPBFieldOptions_CType_String },
-      { .name = "Cord", .number = GPBFieldOptions_CType_Cord },
-      { .name = "StringPiece", .number = GPBFieldOptions_CType_StringPiece },
-    };
-    descriptor = [GPBEnumDescriptor allocDescriptorForName:GPBNSStringifySymbol(GPBFieldOptions_CType)
-                                                   values:values
-                                               valueCount:sizeof(values) / sizeof(GPBMessageEnumValueDescription)
-                                             enumVerifier:GPBFieldOptions_CType_IsValidValue];
-  }
-  return descriptor;
-}
-
-BOOL GPBFieldOptions_CType_IsValidValue(int32_t value__) {
-  switch (value__) {
-    case GPBFieldOptions_CType_String:
-    case GPBFieldOptions_CType_Cord:
-    case GPBFieldOptions_CType_StringPiece:
-      return YES;
-    default:
-      return NO;
-  }
-}
-
-#pragma mark - Enum GPBFieldOptions_JSType
-
-GPBEnumDescriptor *GPBFieldOptions_JSType_EnumDescriptor(void) {
-  static GPBEnumDescriptor *descriptor = NULL;
-  if (!descriptor) {
-    static GPBMessageEnumValueDescription values[] = {
-      { .name = "JsNormal", .number = GPBFieldOptions_JSType_JsNormal },
-      { .name = "JsString", .number = GPBFieldOptions_JSType_JsString },
-      { .name = "JsNumber", .number = GPBFieldOptions_JSType_JsNumber },
-    };
-    descriptor = [GPBEnumDescriptor allocDescriptorForName:GPBNSStringifySymbol(GPBFieldOptions_JSType)
-                                                   values:values
-                                               valueCount:sizeof(values) / sizeof(GPBMessageEnumValueDescription)
-                                             enumVerifier:GPBFieldOptions_JSType_IsValidValue];
-  }
-  return descriptor;
-}
-
-BOOL GPBFieldOptions_JSType_IsValidValue(int32_t value__) {
-  switch (value__) {
-    case GPBFieldOptions_JSType_JsNormal:
-    case GPBFieldOptions_JSType_JsString:
-    case GPBFieldOptions_JSType_JsNumber:
-      return YES;
-    default:
-      return NO;
-  }
-}
-
-#pragma mark - GPBEnumOptions
-
-@implementation GPBEnumOptions
-
-@dynamic hasAllowAlias, allowAlias;
-@dynamic hasDeprecated, deprecated;
-@dynamic uninterpretedOptionArray, uninterpretedOptionArray_Count;
-
-typedef struct GPBEnumOptions__storage_ {
-  uint32_t _has_storage_[1];
-  BOOL allowAlias;
-  BOOL deprecated;
-  NSMutableArray *uninterpretedOptionArray;
-} GPBEnumOptions__storage_;
-
-// This method is threadsafe because it is initially called
-// in +initialize for each subclass.
-+ (GPBDescriptor *)descriptor {
-  static GPBDescriptor *descriptor = nil;
-  if (!descriptor) {
-    static GPBMessageFieldDescription fields[] = {
-      {
-        .name = "allowAlias",
-        .number = GPBEnumOptions_FieldNumber_AllowAlias,
-        .hasIndex = 0,
-        .flags = GPBFieldOptional,
-        .dataType = GPBDataTypeBool,
-        .offset = offsetof(GPBEnumOptions__storage_, allowAlias),
-        .defaultValue.valueBool = NO,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "deprecated",
-        .number = GPBEnumOptions_FieldNumber_Deprecated,
-        .hasIndex = 1,
-        .flags = GPBFieldOptional | GPBFieldHasDefaultValue,
-        .dataType = GPBDataTypeBool,
-        .offset = offsetof(GPBEnumOptions__storage_, deprecated),
-        .defaultValue.valueBool = NO,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "uninterpretedOptionArray",
-        .number = GPBEnumOptions_FieldNumber_UninterpretedOptionArray,
-        .hasIndex = GPBNoHasBit,
-        .flags = GPBFieldRepeated,
-        .dataType = GPBDataTypeMessage,
-        .offset = offsetof(GPBEnumOptions__storage_, uninterpretedOptionArray),
-        .defaultValue.valueMessage = nil,
-        .dataTypeSpecific.className = GPBStringifySymbol(GPBUninterpretedOption),
-        .fieldOptions = NULL,
-      },
-    };
-    static GPBExtensionRange ranges[] = {
-      { .start = 1000, .end = 536870912 },
-    };
-    GPBDescriptor *localDescriptor =
-        [GPBDescriptor allocDescriptorForClass:[GPBEnumOptions class]
-                                     rootClass:[GPBDescriptorRoot class]
-                                          file:GPBDescriptorRoot_FileDescriptor()
-                                        fields:fields
-                                    fieldCount:sizeof(fields) / sizeof(GPBMessageFieldDescription)
-                                        oneofs:NULL
-                                    oneofCount:0
-                                         enums:NULL
-                                     enumCount:0
-                                        ranges:ranges
-                                    rangeCount:sizeof(ranges) / sizeof(GPBExtensionRange)
-                                   storageSize:sizeof(GPBEnumOptions__storage_)
-                                    wireFormat:NO];
-    NSAssert(descriptor == nil, @"Startup recursed!");
-    descriptor = localDescriptor;
-  }
-  return descriptor;
-}
-
-@end
-
-#pragma mark - GPBEnumValueOptions
-
-@implementation GPBEnumValueOptions
-
-@dynamic hasDeprecated, deprecated;
-@dynamic uninterpretedOptionArray, uninterpretedOptionArray_Count;
-
-typedef struct GPBEnumValueOptions__storage_ {
-  uint32_t _has_storage_[1];
-  BOOL deprecated;
-  NSMutableArray *uninterpretedOptionArray;
-} GPBEnumValueOptions__storage_;
-
-// This method is threadsafe because it is initially called
-// in +initialize for each subclass.
-+ (GPBDescriptor *)descriptor {
-  static GPBDescriptor *descriptor = nil;
-  if (!descriptor) {
-    static GPBMessageFieldDescription fields[] = {
-      {
-        .name = "deprecated",
-        .number = GPBEnumValueOptions_FieldNumber_Deprecated,
-        .hasIndex = 0,
-        .flags = GPBFieldOptional | GPBFieldHasDefaultValue,
-        .dataType = GPBDataTypeBool,
-        .offset = offsetof(GPBEnumValueOptions__storage_, deprecated),
-        .defaultValue.valueBool = NO,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "uninterpretedOptionArray",
-        .number = GPBEnumValueOptions_FieldNumber_UninterpretedOptionArray,
-        .hasIndex = GPBNoHasBit,
-        .flags = GPBFieldRepeated,
-        .dataType = GPBDataTypeMessage,
-        .offset = offsetof(GPBEnumValueOptions__storage_, uninterpretedOptionArray),
-        .defaultValue.valueMessage = nil,
-        .dataTypeSpecific.className = GPBStringifySymbol(GPBUninterpretedOption),
-        .fieldOptions = NULL,
-      },
-    };
-    static GPBExtensionRange ranges[] = {
-      { .start = 1000, .end = 536870912 },
-    };
-    GPBDescriptor *localDescriptor =
-        [GPBDescriptor allocDescriptorForClass:[GPBEnumValueOptions class]
-                                     rootClass:[GPBDescriptorRoot class]
-                                          file:GPBDescriptorRoot_FileDescriptor()
-                                        fields:fields
-                                    fieldCount:sizeof(fields) / sizeof(GPBMessageFieldDescription)
-                                        oneofs:NULL
-                                    oneofCount:0
-                                         enums:NULL
-                                     enumCount:0
-                                        ranges:ranges
-                                    rangeCount:sizeof(ranges) / sizeof(GPBExtensionRange)
-                                   storageSize:sizeof(GPBEnumValueOptions__storage_)
-                                    wireFormat:NO];
-    NSAssert(descriptor == nil, @"Startup recursed!");
-    descriptor = localDescriptor;
-  }
-  return descriptor;
-}
-
-@end
-
-#pragma mark - GPBServiceOptions
-
-@implementation GPBServiceOptions
-
-@dynamic hasDeprecated, deprecated;
-@dynamic uninterpretedOptionArray, uninterpretedOptionArray_Count;
-
-typedef struct GPBServiceOptions__storage_ {
-  uint32_t _has_storage_[1];
-  BOOL deprecated;
-  NSMutableArray *uninterpretedOptionArray;
-} GPBServiceOptions__storage_;
-
-// This method is threadsafe because it is initially called
-// in +initialize for each subclass.
-+ (GPBDescriptor *)descriptor {
-  static GPBDescriptor *descriptor = nil;
-  if (!descriptor) {
-    static GPBMessageFieldDescription fields[] = {
-      {
-        .name = "deprecated",
-        .number = GPBServiceOptions_FieldNumber_Deprecated,
-        .hasIndex = 0,
-        .flags = GPBFieldOptional | GPBFieldHasDefaultValue,
-        .dataType = GPBDataTypeBool,
-        .offset = offsetof(GPBServiceOptions__storage_, deprecated),
-        .defaultValue.valueBool = NO,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "uninterpretedOptionArray",
-        .number = GPBServiceOptions_FieldNumber_UninterpretedOptionArray,
-        .hasIndex = GPBNoHasBit,
-        .flags = GPBFieldRepeated,
-        .dataType = GPBDataTypeMessage,
-        .offset = offsetof(GPBServiceOptions__storage_, uninterpretedOptionArray),
-        .defaultValue.valueMessage = nil,
-        .dataTypeSpecific.className = GPBStringifySymbol(GPBUninterpretedOption),
-        .fieldOptions = NULL,
-      },
-    };
-    static GPBExtensionRange ranges[] = {
-      { .start = 1000, .end = 536870912 },
-    };
-    GPBDescriptor *localDescriptor =
-        [GPBDescriptor allocDescriptorForClass:[GPBServiceOptions class]
-                                     rootClass:[GPBDescriptorRoot class]
-                                          file:GPBDescriptorRoot_FileDescriptor()
-                                        fields:fields
-                                    fieldCount:sizeof(fields) / sizeof(GPBMessageFieldDescription)
-                                        oneofs:NULL
-                                    oneofCount:0
-                                         enums:NULL
-                                     enumCount:0
-                                        ranges:ranges
-                                    rangeCount:sizeof(ranges) / sizeof(GPBExtensionRange)
-                                   storageSize:sizeof(GPBServiceOptions__storage_)
-                                    wireFormat:NO];
-    NSAssert(descriptor == nil, @"Startup recursed!");
-    descriptor = localDescriptor;
-  }
-  return descriptor;
-}
-
-@end
-
-#pragma mark - GPBMethodOptions
-
-@implementation GPBMethodOptions
-
-@dynamic hasDeprecated, deprecated;
-@dynamic uninterpretedOptionArray, uninterpretedOptionArray_Count;
-
-typedef struct GPBMethodOptions__storage_ {
-  uint32_t _has_storage_[1];
-  BOOL deprecated;
-  NSMutableArray *uninterpretedOptionArray;
-} GPBMethodOptions__storage_;
-
-// This method is threadsafe because it is initially called
-// in +initialize for each subclass.
-+ (GPBDescriptor *)descriptor {
-  static GPBDescriptor *descriptor = nil;
-  if (!descriptor) {
-    static GPBMessageFieldDescription fields[] = {
-      {
-        .name = "deprecated",
-        .number = GPBMethodOptions_FieldNumber_Deprecated,
-        .hasIndex = 0,
-        .flags = GPBFieldOptional | GPBFieldHasDefaultValue,
-        .dataType = GPBDataTypeBool,
-        .offset = offsetof(GPBMethodOptions__storage_, deprecated),
-        .defaultValue.valueBool = NO,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "uninterpretedOptionArray",
-        .number = GPBMethodOptions_FieldNumber_UninterpretedOptionArray,
-        .hasIndex = GPBNoHasBit,
-        .flags = GPBFieldRepeated,
-        .dataType = GPBDataTypeMessage,
-        .offset = offsetof(GPBMethodOptions__storage_, uninterpretedOptionArray),
-        .defaultValue.valueMessage = nil,
-        .dataTypeSpecific.className = GPBStringifySymbol(GPBUninterpretedOption),
-        .fieldOptions = NULL,
-      },
-    };
-    static GPBExtensionRange ranges[] = {
-      { .start = 1000, .end = 536870912 },
-    };
-    GPBDescriptor *localDescriptor =
-        [GPBDescriptor allocDescriptorForClass:[GPBMethodOptions class]
-                                     rootClass:[GPBDescriptorRoot class]
-                                          file:GPBDescriptorRoot_FileDescriptor()
-                                        fields:fields
-                                    fieldCount:sizeof(fields) / sizeof(GPBMessageFieldDescription)
-                                        oneofs:NULL
-                                    oneofCount:0
-                                         enums:NULL
-                                     enumCount:0
-                                        ranges:ranges
-                                    rangeCount:sizeof(ranges) / sizeof(GPBExtensionRange)
-                                   storageSize:sizeof(GPBMethodOptions__storage_)
-                                    wireFormat:NO];
-    NSAssert(descriptor == nil, @"Startup recursed!");
-    descriptor = localDescriptor;
-  }
-  return descriptor;
-}
-
-@end
-
-#pragma mark - GPBUninterpretedOption
-
-@implementation GPBUninterpretedOption
-
-@dynamic nameArray, nameArray_Count;
-@dynamic hasIdentifierValue, identifierValue;
-@dynamic hasPositiveIntValue, positiveIntValue;
-@dynamic hasNegativeIntValue, negativeIntValue;
-@dynamic hasDoubleValue, doubleValue;
-@dynamic hasStringValue, stringValue;
-@dynamic hasAggregateValue, aggregateValue;
-
-typedef struct GPBUninterpretedOption__storage_ {
-  uint32_t _has_storage_[1];
-  NSMutableArray *nameArray;
-  NSString *identifierValue;
-  NSData *stringValue;
-  NSString *aggregateValue;
-  uint64_t positiveIntValue;
-  int64_t negativeIntValue;
-  double doubleValue;
-} GPBUninterpretedOption__storage_;
-
-// This method is threadsafe because it is initially called
-// in +initialize for each subclass.
-+ (GPBDescriptor *)descriptor {
-  static GPBDescriptor *descriptor = nil;
-  if (!descriptor) {
-    static GPBMessageFieldDescription fields[] = {
-      {
-        .name = "nameArray",
-        .number = GPBUninterpretedOption_FieldNumber_NameArray,
-        .hasIndex = GPBNoHasBit,
-        .flags = GPBFieldRepeated,
-        .dataType = GPBDataTypeMessage,
-        .offset = offsetof(GPBUninterpretedOption__storage_, nameArray),
-        .defaultValue.valueMessage = nil,
-        .dataTypeSpecific.className = GPBStringifySymbol(GPBUninterpretedOption_NamePart),
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "identifierValue",
-        .number = GPBUninterpretedOption_FieldNumber_IdentifierValue,
-        .hasIndex = 1,
-        .flags = GPBFieldOptional,
-        .dataType = GPBDataTypeString,
-        .offset = offsetof(GPBUninterpretedOption__storage_, identifierValue),
-        .defaultValue.valueString = nil,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "positiveIntValue",
-        .number = GPBUninterpretedOption_FieldNumber_PositiveIntValue,
-        .hasIndex = 2,
-        .flags = GPBFieldOptional,
-        .dataType = GPBDataTypeUInt64,
-        .offset = offsetof(GPBUninterpretedOption__storage_, positiveIntValue),
-        .defaultValue.valueUInt64 = 0ULL,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "negativeIntValue",
-        .number = GPBUninterpretedOption_FieldNumber_NegativeIntValue,
-        .hasIndex = 3,
-        .flags = GPBFieldOptional,
-        .dataType = GPBDataTypeInt64,
-        .offset = offsetof(GPBUninterpretedOption__storage_, negativeIntValue),
-        .defaultValue.valueInt64 = 0LL,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "doubleValue",
-        .number = GPBUninterpretedOption_FieldNumber_DoubleValue,
-        .hasIndex = 4,
-        .flags = GPBFieldOptional,
-        .dataType = GPBDataTypeDouble,
-        .offset = offsetof(GPBUninterpretedOption__storage_, doubleValue),
-        .defaultValue.valueDouble = 0,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "stringValue",
-        .number = GPBUninterpretedOption_FieldNumber_StringValue,
-        .hasIndex = 5,
-        .flags = GPBFieldOptional,
-        .dataType = GPBDataTypeBytes,
-        .offset = offsetof(GPBUninterpretedOption__storage_, stringValue),
-        .defaultValue.valueData = nil,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "aggregateValue",
-        .number = GPBUninterpretedOption_FieldNumber_AggregateValue,
-        .hasIndex = 6,
-        .flags = GPBFieldOptional,
-        .dataType = GPBDataTypeString,
-        .offset = offsetof(GPBUninterpretedOption__storage_, aggregateValue),
-        .defaultValue.valueString = nil,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
-      },
-    };
-    GPBDescriptor *localDescriptor =
-        [GPBDescriptor allocDescriptorForClass:[GPBUninterpretedOption class]
-                                     rootClass:[GPBDescriptorRoot class]
-                                          file:GPBDescriptorRoot_FileDescriptor()
-                                        fields:fields
-                                    fieldCount:sizeof(fields) / sizeof(GPBMessageFieldDescription)
-                                        oneofs:NULL
-                                    oneofCount:0
-                                         enums:NULL
-                                     enumCount:0
-                                        ranges:NULL
-                                    rangeCount:0
-                                   storageSize:sizeof(GPBUninterpretedOption__storage_)
-                                    wireFormat:NO];
-    NSAssert(descriptor == nil, @"Startup recursed!");
-    descriptor = localDescriptor;
-  }
-  return descriptor;
-}
-
-@end
-
-#pragma mark - GPBUninterpretedOption_NamePart
-
-@implementation GPBUninterpretedOption_NamePart
-
-@dynamic hasNamePart, namePart;
-@dynamic hasIsExtension, isExtension;
-
-typedef struct GPBUninterpretedOption_NamePart__storage_ {
-  uint32_t _has_storage_[1];
-  BOOL isExtension;
-  NSString *namePart;
-} GPBUninterpretedOption_NamePart__storage_;
-
-// This method is threadsafe because it is initially called
-// in +initialize for each subclass.
-+ (GPBDescriptor *)descriptor {
-  static GPBDescriptor *descriptor = nil;
-  if (!descriptor) {
-    static GPBMessageFieldDescription fields[] = {
-      {
-        .name = "namePart",
-        .number = GPBUninterpretedOption_NamePart_FieldNumber_NamePart,
-        .hasIndex = 0,
-        .flags = GPBFieldRequired,
-        .dataType = GPBDataTypeString,
-        .offset = offsetof(GPBUninterpretedOption_NamePart__storage_, namePart),
-        .defaultValue.valueString = nil,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "isExtension",
-        .number = GPBUninterpretedOption_NamePart_FieldNumber_IsExtension,
-        .hasIndex = 1,
-        .flags = GPBFieldRequired,
-        .dataType = GPBDataTypeBool,
-        .offset = offsetof(GPBUninterpretedOption_NamePart__storage_, isExtension),
-        .defaultValue.valueBool = NO,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
-      },
-    };
-    GPBDescriptor *localDescriptor =
-        [GPBDescriptor allocDescriptorForClass:[GPBUninterpretedOption_NamePart class]
-                                     rootClass:[GPBDescriptorRoot class]
-                                          file:GPBDescriptorRoot_FileDescriptor()
-                                        fields:fields
-                                    fieldCount:sizeof(fields) / sizeof(GPBMessageFieldDescription)
-                                        oneofs:NULL
-                                    oneofCount:0
-                                         enums:NULL
-                                     enumCount:0
-                                        ranges:NULL
-                                    rangeCount:0
-                                   storageSize:sizeof(GPBUninterpretedOption_NamePart__storage_)
-                                    wireFormat:NO];
-    NSAssert(descriptor == nil, @"Startup recursed!");
-    descriptor = localDescriptor;
-  }
-  return descriptor;
-}
-
-@end
-
-#pragma mark - GPBSourceCodeInfo
-
-@implementation GPBSourceCodeInfo
-
-@dynamic locationArray, locationArray_Count;
-
-typedef struct GPBSourceCodeInfo__storage_ {
-  uint32_t _has_storage_[1];
-  NSMutableArray *locationArray;
-} GPBSourceCodeInfo__storage_;
-
-// This method is threadsafe because it is initially called
-// in +initialize for each subclass.
-+ (GPBDescriptor *)descriptor {
-  static GPBDescriptor *descriptor = nil;
-  if (!descriptor) {
-    static GPBMessageFieldDescription fields[] = {
-      {
-        .name = "locationArray",
-        .number = GPBSourceCodeInfo_FieldNumber_LocationArray,
-        .hasIndex = GPBNoHasBit,
-        .flags = GPBFieldRepeated,
-        .dataType = GPBDataTypeMessage,
-        .offset = offsetof(GPBSourceCodeInfo__storage_, locationArray),
-        .defaultValue.valueMessage = nil,
-        .dataTypeSpecific.className = GPBStringifySymbol(GPBSourceCodeInfo_Location),
-        .fieldOptions = NULL,
-      },
-    };
-    GPBDescriptor *localDescriptor =
-        [GPBDescriptor allocDescriptorForClass:[GPBSourceCodeInfo class]
-                                     rootClass:[GPBDescriptorRoot class]
-                                          file:GPBDescriptorRoot_FileDescriptor()
-                                        fields:fields
-                                    fieldCount:sizeof(fields) / sizeof(GPBMessageFieldDescription)
-                                        oneofs:NULL
-                                    oneofCount:0
-                                         enums:NULL
-                                     enumCount:0
-                                        ranges:NULL
-                                    rangeCount:0
-                                   storageSize:sizeof(GPBSourceCodeInfo__storage_)
-                                    wireFormat:NO];
-    NSAssert(descriptor == nil, @"Startup recursed!");
-    descriptor = localDescriptor;
-  }
-  return descriptor;
-}
-
-@end
-
-#pragma mark - GPBSourceCodeInfo_Location
-
-@implementation GPBSourceCodeInfo_Location
-
-@dynamic pathArray, pathArray_Count;
-@dynamic spanArray, spanArray_Count;
-@dynamic hasLeadingComments, leadingComments;
-@dynamic hasTrailingComments, trailingComments;
-@dynamic leadingDetachedCommentsArray, leadingDetachedCommentsArray_Count;
-
-typedef struct GPBSourceCodeInfo_Location__storage_ {
-  uint32_t _has_storage_[1];
-  GPBInt32Array *pathArray;
-  GPBInt32Array *spanArray;
-  NSString *leadingComments;
-  NSString *trailingComments;
-  NSMutableArray *leadingDetachedCommentsArray;
-} GPBSourceCodeInfo_Location__storage_;
-
-// This method is threadsafe because it is initially called
-// in +initialize for each subclass.
-+ (GPBDescriptor *)descriptor {
-  static GPBDescriptor *descriptor = nil;
-  if (!descriptor) {
-    static GPBMessageFieldDescription fields[] = {
-      {
-        .name = "pathArray",
-        .number = GPBSourceCodeInfo_Location_FieldNumber_PathArray,
-        .hasIndex = GPBNoHasBit,
-        .flags = GPBFieldRepeated | GPBFieldPacked,
-        .dataType = GPBDataTypeInt32,
-        .offset = offsetof(GPBSourceCodeInfo_Location__storage_, pathArray),
-        .defaultValue.valueMessage = nil,
-        .dataTypeSpecific.className = NULL,
-      #if GPBOBJC_INCLUDE_FIELD_OPTIONS
-        .fieldOptions = "\000\000\000\002\020\001",
-      #else
-        .fieldOptions = NULL,
-      #endif  // GPBOBJC_INCLUDE_FIELD_OPTIONS
-      },
-      {
-        .name = "spanArray",
-        .number = GPBSourceCodeInfo_Location_FieldNumber_SpanArray,
-        .hasIndex = GPBNoHasBit,
-        .flags = GPBFieldRepeated | GPBFieldPacked,
-        .dataType = GPBDataTypeInt32,
-        .offset = offsetof(GPBSourceCodeInfo_Location__storage_, spanArray),
-        .defaultValue.valueMessage = nil,
-        .dataTypeSpecific.className = NULL,
-      #if GPBOBJC_INCLUDE_FIELD_OPTIONS
-        .fieldOptions = "\000\000\000\002\020\001",
-      #else
-        .fieldOptions = NULL,
-      #endif  // GPBOBJC_INCLUDE_FIELD_OPTIONS
-      },
-      {
-        .name = "leadingComments",
-        .number = GPBSourceCodeInfo_Location_FieldNumber_LeadingComments,
-        .hasIndex = 2,
-        .flags = GPBFieldOptional,
-        .dataType = GPBDataTypeString,
-        .offset = offsetof(GPBSourceCodeInfo_Location__storage_, leadingComments),
-        .defaultValue.valueString = nil,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "trailingComments",
-        .number = GPBSourceCodeInfo_Location_FieldNumber_TrailingComments,
-        .hasIndex = 3,
-        .flags = GPBFieldOptional,
-        .dataType = GPBDataTypeString,
-        .offset = offsetof(GPBSourceCodeInfo_Location__storage_, trailingComments),
-        .defaultValue.valueString = nil,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "leadingDetachedCommentsArray",
-        .number = GPBSourceCodeInfo_Location_FieldNumber_LeadingDetachedCommentsArray,
-        .hasIndex = GPBNoHasBit,
-        .flags = GPBFieldRepeated,
-        .dataType = GPBDataTypeString,
-        .offset = offsetof(GPBSourceCodeInfo_Location__storage_, leadingDetachedCommentsArray),
-        .defaultValue.valueMessage = nil,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
-      },
-    };
-    GPBDescriptor *localDescriptor =
-        [GPBDescriptor allocDescriptorForClass:[GPBSourceCodeInfo_Location class]
-                                     rootClass:[GPBDescriptorRoot class]
-                                          file:GPBDescriptorRoot_FileDescriptor()
-                                        fields:fields
-                                    fieldCount:sizeof(fields) / sizeof(GPBMessageFieldDescription)
-                                        oneofs:NULL
-                                    oneofCount:0
-                                         enums:NULL
-                                     enumCount:0
-                                        ranges:NULL
-                                    rangeCount:0
-                                   storageSize:sizeof(GPBSourceCodeInfo_Location__storage_)
-                                    wireFormat:NO];
-    NSAssert(descriptor == nil, @"Startup recursed!");
-    descriptor = localDescriptor;
-  }
-  return descriptor;
-}
-
-@end
-
-#pragma mark - GPBGeneratedCodeInfo
-
-@implementation GPBGeneratedCodeInfo
-
-@dynamic annotationArray, annotationArray_Count;
-
-typedef struct GPBGeneratedCodeInfo__storage_ {
-  uint32_t _has_storage_[1];
-  NSMutableArray *annotationArray;
-} GPBGeneratedCodeInfo__storage_;
-
-// This method is threadsafe because it is initially called
-// in +initialize for each subclass.
-+ (GPBDescriptor *)descriptor {
-  static GPBDescriptor *descriptor = nil;
-  if (!descriptor) {
-    static GPBMessageFieldDescription fields[] = {
-      {
-        .name = "annotationArray",
-        .number = GPBGeneratedCodeInfo_FieldNumber_AnnotationArray,
-        .hasIndex = GPBNoHasBit,
-        .flags = GPBFieldRepeated,
-        .dataType = GPBDataTypeMessage,
-        .offset = offsetof(GPBGeneratedCodeInfo__storage_, annotationArray),
-        .defaultValue.valueMessage = nil,
-        .dataTypeSpecific.className = GPBStringifySymbol(GPBGeneratedCodeInfo_Annotation),
-        .fieldOptions = NULL,
-      },
-    };
-    GPBDescriptor *localDescriptor =
-        [GPBDescriptor allocDescriptorForClass:[GPBGeneratedCodeInfo class]
-                                     rootClass:[GPBDescriptorRoot class]
-                                          file:GPBDescriptorRoot_FileDescriptor()
-                                        fields:fields
-                                    fieldCount:sizeof(fields) / sizeof(GPBMessageFieldDescription)
-                                        oneofs:NULL
-                                    oneofCount:0
-                                         enums:NULL
-                                     enumCount:0
-                                        ranges:NULL
-                                    rangeCount:0
-                                   storageSize:sizeof(GPBGeneratedCodeInfo__storage_)
-                                    wireFormat:NO];
-    NSAssert(descriptor == nil, @"Startup recursed!");
-    descriptor = localDescriptor;
-  }
-  return descriptor;
-}
-
-@end
-
-#pragma mark - GPBGeneratedCodeInfo_Annotation
-
-@implementation GPBGeneratedCodeInfo_Annotation
-
-@dynamic pathArray, pathArray_Count;
-@dynamic hasSourceFile, sourceFile;
-@dynamic hasBegin, begin;
-@dynamic hasEnd, end;
-
-typedef struct GPBGeneratedCodeInfo_Annotation__storage_ {
-  uint32_t _has_storage_[1];
-  int32_t begin;
-  int32_t end;
-  GPBInt32Array *pathArray;
-  NSString *sourceFile;
-} GPBGeneratedCodeInfo_Annotation__storage_;
-
-// This method is threadsafe because it is initially called
-// in +initialize for each subclass.
-+ (GPBDescriptor *)descriptor {
-  static GPBDescriptor *descriptor = nil;
-  if (!descriptor) {
-    static GPBMessageFieldDescription fields[] = {
-      {
-        .name = "pathArray",
-        .number = GPBGeneratedCodeInfo_Annotation_FieldNumber_PathArray,
-        .hasIndex = GPBNoHasBit,
-        .flags = GPBFieldRepeated | GPBFieldPacked,
-        .dataType = GPBDataTypeInt32,
-        .offset = offsetof(GPBGeneratedCodeInfo_Annotation__storage_, pathArray),
-        .defaultValue.valueMessage = nil,
-        .dataTypeSpecific.className = NULL,
-      #if GPBOBJC_INCLUDE_FIELD_OPTIONS
-        .fieldOptions = "\000\000\000\002\020\001",
-      #else
-        .fieldOptions = NULL,
-      #endif  // GPBOBJC_INCLUDE_FIELD_OPTIONS
-      },
-      {
-        .name = "sourceFile",
-        .number = GPBGeneratedCodeInfo_Annotation_FieldNumber_SourceFile,
-        .hasIndex = 1,
-        .flags = GPBFieldOptional,
-        .dataType = GPBDataTypeString,
-        .offset = offsetof(GPBGeneratedCodeInfo_Annotation__storage_, sourceFile),
-        .defaultValue.valueString = nil,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "begin",
-        .number = GPBGeneratedCodeInfo_Annotation_FieldNumber_Begin,
-        .hasIndex = 2,
-        .flags = GPBFieldOptional,
-        .dataType = GPBDataTypeInt32,
-        .offset = offsetof(GPBGeneratedCodeInfo_Annotation__storage_, begin),
-        .defaultValue.valueInt32 = 0,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "end",
-        .number = GPBGeneratedCodeInfo_Annotation_FieldNumber_End,
-        .hasIndex = 3,
-        .flags = GPBFieldOptional,
-        .dataType = GPBDataTypeInt32,
-        .offset = offsetof(GPBGeneratedCodeInfo_Annotation__storage_, end),
-        .defaultValue.valueInt32 = 0,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
-      },
-    };
-    GPBDescriptor *localDescriptor =
-        [GPBDescriptor allocDescriptorForClass:[GPBGeneratedCodeInfo_Annotation class]
-                                     rootClass:[GPBDescriptorRoot class]
-                                          file:GPBDescriptorRoot_FileDescriptor()
-                                        fields:fields
-                                    fieldCount:sizeof(fields) / sizeof(GPBMessageFieldDescription)
-                                        oneofs:NULL
-                                    oneofCount:0
-                                         enums:NULL
-                                     enumCount:0
-                                        ranges:NULL
-                                    rangeCount:0
-                                   storageSize:sizeof(GPBGeneratedCodeInfo_Annotation__storage_)
-                                    wireFormat:NO];
-    NSAssert(descriptor == nil, @"Startup recursed!");
-    descriptor = localDescriptor;
-  }
-  return descriptor;
-}
-
-@end
-
-
-// @@protoc_insertion_point(global_scope)

+ 57 - 55
objectivec/google/protobuf/Duration.pbobjc.h

@@ -3,7 +3,7 @@
 
 
 #import "GPBProtocolBuffers.h"
 #import "GPBProtocolBuffers.h"
 
 
-#if GOOGLE_PROTOBUF_OBJC_GEN_VERSION != 30000
+#if GOOGLE_PROTOBUF_OBJC_GEN_VERSION != 30001
 #error This file was generated by a different version of protoc which is incompatible with your Protocol Buffer library sources.
 #error This file was generated by a different version of protoc which is incompatible with your Protocol Buffer library sources.
 #endif
 #endif
 
 
@@ -15,13 +15,15 @@ NS_ASSUME_NONNULL_BEGIN
 
 
 #pragma mark - GPBDurationRoot
 #pragma mark - GPBDurationRoot
 
 
+/// Exposes the extension registry for this file.
+///
+/// The base class provides:
+/// @code
+///   + (GPBExtensionRegistry *)extensionRegistry;
+/// @endcode
+/// which is a @c GPBExtensionRegistry that includes all the extensions defined by
+/// this file and all files that it depends on.
 @interface GPBDurationRoot : GPBRootObject
 @interface GPBDurationRoot : GPBRootObject
-
-// The base class provides:
-//   + (GPBExtensionRegistry *)extensionRegistry;
-// which is an GPBExtensionRegistry that includes all the extensions defined by
-// this file and all files that it depends on.
-
 @end
 @end
 
 
 #pragma mark - GPBDuration
 #pragma mark - GPBDuration
@@ -31,58 +33,58 @@ typedef GPB_ENUM(GPBDuration_FieldNumber) {
   GPBDuration_FieldNumber_Nanos = 2,
   GPBDuration_FieldNumber_Nanos = 2,
 };
 };
 
 
-// A Duration represents a signed, fixed-length span of time represented
-// as a count of seconds and fractions of seconds at nanosecond
-// resolution. It is independent of any calendar and concepts like "day"
-// or "month". It is related to Timestamp in that the difference between
-// two Timestamp values is a Duration and it can be added or subtracted
-// from a Timestamp. Range is approximately +-10,000 years.
-//
-// Example 1: Compute Duration from two Timestamps in pseudo code.
-//
-//     Timestamp start = ...;
-//     Timestamp end = ...;
-//     Duration duration = ...;
-//
-//     duration.seconds = end.seconds - start.seconds;
-//     duration.nanos = end.nanos - start.nanos;
-//
-//     if (duration.seconds < 0 && duration.nanos > 0) {
-//       duration.seconds += 1;
-//       duration.nanos -= 1000000000;
-//     } else if (durations.seconds > 0 && duration.nanos < 0) {
-//       duration.seconds -= 1;
-//       duration.nanos += 1000000000;
-//     }
-//
-// Example 2: Compute Timestamp from Timestamp + Duration in pseudo code.
-//
-//     Timestamp start = ...;
-//     Duration duration = ...;
-//     Timestamp end = ...;
-//
-//     end.seconds = start.seconds + duration.seconds;
-//     end.nanos = start.nanos + duration.nanos;
-//
-//     if (end.nanos < 0) {
-//       end.seconds -= 1;
-//       end.nanos += 1000000000;
-//     } else if (end.nanos >= 1000000000) {
-//       end.seconds += 1;
-//       end.nanos -= 1000000000;
-//     }
+/// A Duration represents a signed, fixed-length span of time represented
+/// as a count of seconds and fractions of seconds at nanosecond
+/// resolution. It is independent of any calendar and concepts like "day"
+/// or "month". It is related to Timestamp in that the difference between
+/// two Timestamp values is a Duration and it can be added or subtracted
+/// from a Timestamp. Range is approximately +-10,000 years.
+///
+/// Example 1: Compute Duration from two Timestamps in pseudo code.
+///
+///     Timestamp start = ...;
+///     Timestamp end = ...;
+///     Duration duration = ...;
+///
+///     duration.seconds = end.seconds - start.seconds;
+///     duration.nanos = end.nanos - start.nanos;
+///
+///     if (duration.seconds < 0 && duration.nanos > 0) {
+///       duration.seconds += 1;
+///       duration.nanos -= 1000000000;
+///     } else if (durations.seconds > 0 && duration.nanos < 0) {
+///       duration.seconds -= 1;
+///       duration.nanos += 1000000000;
+///     }
+///
+/// Example 2: Compute Timestamp from Timestamp + Duration in pseudo code.
+///
+///     Timestamp start = ...;
+///     Duration duration = ...;
+///     Timestamp end = ...;
+///
+///     end.seconds = start.seconds + duration.seconds;
+///     end.nanos = start.nanos + duration.nanos;
+///
+///     if (end.nanos < 0) {
+///       end.seconds -= 1;
+///       end.nanos += 1000000000;
+///     } else if (end.nanos >= 1000000000) {
+///       end.seconds += 1;
+///       end.nanos -= 1000000000;
+///     }
 @interface GPBDuration : GPBMessage
 @interface GPBDuration : GPBMessage
 
 
-// Signed seconds of the span of time. Must be from -315,576,000,000
-// to +315,576,000,000 inclusive.
+/// Signed seconds of the span of time. Must be from -315,576,000,000
+/// to +315,576,000,000 inclusive.
 @property(nonatomic, readwrite) int64_t seconds;
 @property(nonatomic, readwrite) int64_t seconds;
 
 
-// Signed fractions of a second at nanosecond resolution of the span
-// of time. Durations less than one second are represented with a 0
-// `seconds` field and a positive or negative `nanos` field. For durations
-// of one second or more, a non-zero value for the `nanos` field must be
-// of the same sign as the `seconds` field. Must be from -999,999,999
-// to +999,999,999 inclusive.
+/// Signed fractions of a second at nanosecond resolution of the span
+/// of time. Durations less than one second are represented with a 0
+/// `seconds` field and a positive or negative `nanos` field. For durations
+/// of one second or more, a non-zero value for the `nanos` field must be
+/// of the same sign as the `seconds` field. Must be from -999,999,999
+/// to +999,999,999 inclusive.
 @property(nonatomic, readwrite) int32_t nanos;
 @property(nonatomic, readwrite) int32_t nanos;
 
 
 @end
 @end

+ 6 - 16
objectivec/google/protobuf/Duration.pbobjc.m

@@ -46,25 +46,21 @@ typedef struct GPBDuration__storage_ {
     static GPBMessageFieldDescription fields[] = {
     static GPBMessageFieldDescription fields[] = {
       {
       {
         .name = "seconds",
         .name = "seconds",
+        .dataTypeSpecific.className = NULL,
         .number = GPBDuration_FieldNumber_Seconds,
         .number = GPBDuration_FieldNumber_Seconds,
         .hasIndex = 0,
         .hasIndex = 0,
+        .offset = (uint32_t)offsetof(GPBDuration__storage_, seconds),
         .flags = GPBFieldOptional,
         .flags = GPBFieldOptional,
         .dataType = GPBDataTypeInt64,
         .dataType = GPBDataTypeInt64,
-        .offset = offsetof(GPBDuration__storage_, seconds),
-        .defaultValue.valueInt64 = 0LL,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
       },
       },
       {
       {
         .name = "nanos",
         .name = "nanos",
+        .dataTypeSpecific.className = NULL,
         .number = GPBDuration_FieldNumber_Nanos,
         .number = GPBDuration_FieldNumber_Nanos,
         .hasIndex = 1,
         .hasIndex = 1,
+        .offset = (uint32_t)offsetof(GPBDuration__storage_, nanos),
         .flags = GPBFieldOptional,
         .flags = GPBFieldOptional,
         .dataType = GPBDataTypeInt32,
         .dataType = GPBDataTypeInt32,
-        .offset = offsetof(GPBDuration__storage_, nanos),
-        .defaultValue.valueInt32 = 0,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
       },
       },
     };
     };
     GPBDescriptor *localDescriptor =
     GPBDescriptor *localDescriptor =
@@ -72,15 +68,9 @@ typedef struct GPBDuration__storage_ {
                                      rootClass:[GPBDurationRoot class]
                                      rootClass:[GPBDurationRoot class]
                                           file:GPBDurationRoot_FileDescriptor()
                                           file:GPBDurationRoot_FileDescriptor()
                                         fields:fields
                                         fields:fields
-                                    fieldCount:sizeof(fields) / sizeof(GPBMessageFieldDescription)
-                                        oneofs:NULL
-                                    oneofCount:0
-                                         enums:NULL
-                                     enumCount:0
-                                        ranges:NULL
-                                    rangeCount:0
+                                    fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription))
                                    storageSize:sizeof(GPBDuration__storage_)
                                    storageSize:sizeof(GPBDuration__storage_)
-                                    wireFormat:NO];
+                                         flags:0];
     NSAssert(descriptor == nil, @"Startup recursed!");
     NSAssert(descriptor == nil, @"Startup recursed!");
     descriptor = localDescriptor;
     descriptor = localDescriptor;
   }
   }

+ 18 - 16
objectivec/google/protobuf/Empty.pbobjc.h

@@ -3,7 +3,7 @@
 
 
 #import "GPBProtocolBuffers.h"
 #import "GPBProtocolBuffers.h"
 
 
-#if GOOGLE_PROTOBUF_OBJC_GEN_VERSION != 30000
+#if GOOGLE_PROTOBUF_OBJC_GEN_VERSION != 30001
 #error This file was generated by a different version of protoc which is incompatible with your Protocol Buffer library sources.
 #error This file was generated by a different version of protoc which is incompatible with your Protocol Buffer library sources.
 #endif
 #endif
 
 
@@ -15,26 +15,28 @@ NS_ASSUME_NONNULL_BEGIN
 
 
 #pragma mark - GPBEmptyRoot
 #pragma mark - GPBEmptyRoot
 
 
+/// Exposes the extension registry for this file.
+///
+/// The base class provides:
+/// @code
+///   + (GPBExtensionRegistry *)extensionRegistry;
+/// @endcode
+/// which is a @c GPBExtensionRegistry that includes all the extensions defined by
+/// this file and all files that it depends on.
 @interface GPBEmptyRoot : GPBRootObject
 @interface GPBEmptyRoot : GPBRootObject
-
-// The base class provides:
-//   + (GPBExtensionRegistry *)extensionRegistry;
-// which is an GPBExtensionRegistry that includes all the extensions defined by
-// this file and all files that it depends on.
-
 @end
 @end
 
 
 #pragma mark - GPBEmpty
 #pragma mark - GPBEmpty
 
 
-// A generic empty message that you can re-use to avoid defining duplicated
-// empty messages in your APIs. A typical example is to use it as the request
-// or the response type of an API method. For instance:
-//
-//     service Foo {
-//       rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty);
-//     }
-//
-// The JSON representation for `Empty` is empty JSON object `{}`.
+/// A generic empty message that you can re-use to avoid defining duplicated
+/// empty messages in your APIs. A typical example is to use it as the request
+/// or the response type of an API method. For instance:
+///
+///     service Foo {
+///       rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty);
+///     }
+///
+/// The JSON representation for `Empty` is empty JSON object `{}`.
 @interface GPBEmpty : GPBMessage
 @interface GPBEmpty : GPBMessage
 
 
 @end
 @end

+ 2 - 8
objectivec/google/protobuf/Empty.pbobjc.m

@@ -31,7 +31,7 @@ static GPBFileDescriptor *GPBEmptyRoot_FileDescriptor(void) {
 
 
 
 
 typedef struct GPBEmpty__storage_ {
 typedef struct GPBEmpty__storage_ {
-  uint32_t _has_storage_[0];
+  uint32_t _has_storage_[1];
 } GPBEmpty__storage_;
 } GPBEmpty__storage_;
 
 
 // This method is threadsafe because it is initially called
 // This method is threadsafe because it is initially called
@@ -45,14 +45,8 @@ typedef struct GPBEmpty__storage_ {
                                           file:GPBEmptyRoot_FileDescriptor()
                                           file:GPBEmptyRoot_FileDescriptor()
                                         fields:NULL
                                         fields:NULL
                                     fieldCount:0
                                     fieldCount:0
-                                        oneofs:NULL
-                                    oneofCount:0
-                                         enums:NULL
-                                     enumCount:0
-                                        ranges:NULL
-                                    rangeCount:0
                                    storageSize:sizeof(GPBEmpty__storage_)
                                    storageSize:sizeof(GPBEmpty__storage_)
-                                    wireFormat:NO];
+                                         flags:0];
     NSAssert(descriptor == nil, @"Startup recursed!");
     NSAssert(descriptor == nil, @"Startup recursed!");
     descriptor = localDescriptor;
     descriptor = localDescriptor;
   }
   }

+ 133 - 130
objectivec/google/protobuf/FieldMask.pbobjc.h

@@ -3,7 +3,7 @@
 
 
 #import "GPBProtocolBuffers.h"
 #import "GPBProtocolBuffers.h"
 
 
-#if GOOGLE_PROTOBUF_OBJC_GEN_VERSION != 30000
+#if GOOGLE_PROTOBUF_OBJC_GEN_VERSION != 30001
 #error This file was generated by a different version of protoc which is incompatible with your Protocol Buffer library sources.
 #error This file was generated by a different version of protoc which is incompatible with your Protocol Buffer library sources.
 #endif
 #endif
 
 
@@ -15,13 +15,15 @@ NS_ASSUME_NONNULL_BEGIN
 
 
 #pragma mark - GPBFieldMaskRoot
 #pragma mark - GPBFieldMaskRoot
 
 
+/// Exposes the extension registry for this file.
+///
+/// The base class provides:
+/// @code
+///   + (GPBExtensionRegistry *)extensionRegistry;
+/// @endcode
+/// which is a @c GPBExtensionRegistry that includes all the extensions defined by
+/// this file and all files that it depends on.
 @interface GPBFieldMaskRoot : GPBRootObject
 @interface GPBFieldMaskRoot : GPBRootObject
-
-// The base class provides:
-//   + (GPBExtensionRegistry *)extensionRegistry;
-// which is an GPBExtensionRegistry that includes all the extensions defined by
-// this file and all files that it depends on.
-
 @end
 @end
 
 
 #pragma mark - GPBFieldMask
 #pragma mark - GPBFieldMask
@@ -30,132 +32,133 @@ typedef GPB_ENUM(GPBFieldMask_FieldNumber) {
   GPBFieldMask_FieldNumber_PathsArray = 1,
   GPBFieldMask_FieldNumber_PathsArray = 1,
 };
 };
 
 
-// `FieldMask` represents a set of symbolic field paths, for example:
-//
-//     paths: "f.a"
-//     paths: "f.b.d"
-//
-// Here `f` represents a field in some root message, `a` and `b`
-// fields in the message found in `f`, and `d` a field found in the
-// message in `f.b`.
-//
-// Field masks are used to specify a subset of fields that should be
-// returned by a get operation or modified by an update operation.
-// Field masks also have a custom JSON encoding (see below).
-//
-// # Field Masks in Projections
-//
-// When used in the context of a projection, a response message or
-// sub-message is filtered by the API to only contain those fields as
-// specified in the mask. For example, if the mask in the previous
-// example is applied to a response message as follows:
-//
-//     f {
-//       a : 22
-//       b {
-//         d : 1
-//         x : 2
-//       }
-//       y : 13
-//     }
-//     z: 8
-//
-// The result will not contain specific values for fields x,y and z
-// (their value will be set to the default, and omitted in proto text
-// output):
-//
-//
-//     f {
-//       a : 22
-//       b {
-//         d : 1
-//       }
-//     }
-//
-// A repeated field is not allowed except at the last position of a
-// field mask.
-//
-// If a FieldMask object is not present in a get operation, the
-// operation applies to all fields (as if a FieldMask of all fields
-// had been specified).
-//
-// Note that a field mask does not necessarily applies to the
-// top-level response message. In case of a REST get operation, the
-// field mask applies directly to the response, but in case of a REST
-// list operation, the mask instead applies to each individual message
-// in the returned resource list. In case of a REST custom method,
-// other definitions may be used. Where the mask applies will be
-// clearly documented together with its declaration in the API.  In
-// any case, the effect on the returned resource/resources is required
-// behavior for APIs.
-//
-// # Field Masks in Update Operations
-//
-// A field mask in update operations specifies which fields of the
-// targeted resource are going to be updated. The API is required
-// to only change the values of the fields as specified in the mask
-// and leave the others untouched. If a resource is passed in to
-// describe the updated values, the API ignores the values of all
-// fields not covered by the mask.
-//
-// In order to reset a field's value to the default, the field must
-// be in the mask and set to the default value in the provided resource.
-// Hence, in order to reset all fields of a resource, provide a default
-// instance of the resource and set all fields in the mask, or do
-// not provide a mask as described below.
-//
-// If a field mask is not present on update, the operation applies to
-// all fields (as if a field mask of all fields has been specified).
-// Note that in the presence of schema evolution, this may mean that
-// fields the client does not know and has therefore not filled into
-// the request will be reset to their default. If this is unwanted
-// behavior, a specific service may require a client to always specify
-// a field mask, producing an error if not.
-//
-// As with get operations, the location of the resource which
-// describes the updated values in the request message depends on the
-// operation kind. In any case, the effect of the field mask is
-// required to be honored by the API.
-//
-// ## Considerations for HTTP REST
-//
-// The HTTP kind of an update operation which uses a field mask must
-// be set to PATCH instead of PUT in order to satisfy HTTP semantics
-// (PUT must only be used for full updates).
-//
-// # JSON Encoding of Field Masks
-//
-// In JSON, a field mask is encoded as a single string where paths are
-// separated by a comma. Fields name in each path are converted
-// to/from lower-camel naming conventions.
-//
-// As an example, consider the following message declarations:
-//
-//     message Profile {
-//       User user = 1;
-//       Photo photo = 2;
-//     }
-//     message User {
-//       string display_name = 1;
-//       string address = 2;
-//     }
-//
-// In proto a field mask for `Profile` may look as such:
-//
-//     mask {
-//       paths: "user.display_name"
-//       paths: "photo"
-//     }
-//
-// In JSON, the same mask is represented as below:
-//
-//     {
-//       mask: "user.displayName,photo"
-//     }
+/// `FieldMask` represents a set of symbolic field paths, for example:
+///
+///     paths: "f.a"
+///     paths: "f.b.d"
+///
+/// Here `f` represents a field in some root message, `a` and `b`
+/// fields in the message found in `f`, and `d` a field found in the
+/// message in `f.b`.
+///
+/// Field masks are used to specify a subset of fields that should be
+/// returned by a get operation or modified by an update operation.
+/// Field masks also have a custom JSON encoding (see below).
+///
+/// # Field Masks in Projections
+///
+/// When used in the context of a projection, a response message or
+/// sub-message is filtered by the API to only contain those fields as
+/// specified in the mask. For example, if the mask in the previous
+/// example is applied to a response message as follows:
+///
+///     f {
+///       a : 22
+///       b {
+///         d : 1
+///         x : 2
+///       }
+///       y : 13
+///     }
+///     z: 8
+///
+/// The result will not contain specific values for fields x,y and z
+/// (their value will be set to the default, and omitted in proto text
+/// output):
+///
+///
+///     f {
+///       a : 22
+///       b {
+///         d : 1
+///       }
+///     }
+///
+/// A repeated field is not allowed except at the last position of a
+/// field mask.
+///
+/// If a FieldMask object is not present in a get operation, the
+/// operation applies to all fields (as if a FieldMask of all fields
+/// had been specified).
+///
+/// Note that a field mask does not necessarily applies to the
+/// top-level response message. In case of a REST get operation, the
+/// field mask applies directly to the response, but in case of a REST
+/// list operation, the mask instead applies to each individual message
+/// in the returned resource list. In case of a REST custom method,
+/// other definitions may be used. Where the mask applies will be
+/// clearly documented together with its declaration in the API.  In
+/// any case, the effect on the returned resource/resources is required
+/// behavior for APIs.
+///
+/// # Field Masks in Update Operations
+///
+/// A field mask in update operations specifies which fields of the
+/// targeted resource are going to be updated. The API is required
+/// to only change the values of the fields as specified in the mask
+/// and leave the others untouched. If a resource is passed in to
+/// describe the updated values, the API ignores the values of all
+/// fields not covered by the mask.
+///
+/// In order to reset a field's value to the default, the field must
+/// be in the mask and set to the default value in the provided resource.
+/// Hence, in order to reset all fields of a resource, provide a default
+/// instance of the resource and set all fields in the mask, or do
+/// not provide a mask as described below.
+///
+/// If a field mask is not present on update, the operation applies to
+/// all fields (as if a field mask of all fields has been specified).
+/// Note that in the presence of schema evolution, this may mean that
+/// fields the client does not know and has therefore not filled into
+/// the request will be reset to their default. If this is unwanted
+/// behavior, a specific service may require a client to always specify
+/// a field mask, producing an error if not.
+///
+/// As with get operations, the location of the resource which
+/// describes the updated values in the request message depends on the
+/// operation kind. In any case, the effect of the field mask is
+/// required to be honored by the API.
+///
+/// ## Considerations for HTTP REST
+///
+/// The HTTP kind of an update operation which uses a field mask must
+/// be set to PATCH instead of PUT in order to satisfy HTTP semantics
+/// (PUT must only be used for full updates).
+///
+/// # JSON Encoding of Field Masks
+///
+/// In JSON, a field mask is encoded as a single string where paths are
+/// separated by a comma. Fields name in each path are converted
+/// to/from lower-camel naming conventions.
+///
+/// As an example, consider the following message declarations:
+///
+///     message Profile {
+///       User user = 1;
+///       Photo photo = 2;
+///     }
+///     message User {
+///       string display_name = 1;
+///       string address = 2;
+///     }
+///
+/// In proto a field mask for `Profile` may look as such:
+///
+///     mask {
+///       paths: "user.display_name"
+///       paths: "photo"
+///     }
+///
+/// In JSON, the same mask is represented as below:
+///
+///     {
+///       mask: "user.displayName,photo"
+///     }
 @interface GPBFieldMask : GPBMessage
 @interface GPBFieldMask : GPBMessage
 
 
-// The set of field mask paths.
+/// The set of field mask paths.
 @property(nonatomic, readwrite, strong, null_resettable) NSMutableArray<NSString*> *pathsArray;
 @property(nonatomic, readwrite, strong, null_resettable) NSMutableArray<NSString*> *pathsArray;
+/// The number of items in @c pathsArray without causing the array to be created.
 @property(nonatomic, readonly) NSUInteger pathsArray_Count;
 @property(nonatomic, readonly) NSUInteger pathsArray_Count;
 
 
 @end
 @end

+ 4 - 12
objectivec/google/protobuf/FieldMask.pbobjc.m

@@ -44,14 +44,12 @@ typedef struct GPBFieldMask__storage_ {
     static GPBMessageFieldDescription fields[] = {
     static GPBMessageFieldDescription fields[] = {
       {
       {
         .name = "pathsArray",
         .name = "pathsArray",
+        .dataTypeSpecific.className = NULL,
         .number = GPBFieldMask_FieldNumber_PathsArray,
         .number = GPBFieldMask_FieldNumber_PathsArray,
         .hasIndex = GPBNoHasBit,
         .hasIndex = GPBNoHasBit,
+        .offset = (uint32_t)offsetof(GPBFieldMask__storage_, pathsArray),
         .flags = GPBFieldRepeated,
         .flags = GPBFieldRepeated,
         .dataType = GPBDataTypeString,
         .dataType = GPBDataTypeString,
-        .offset = offsetof(GPBFieldMask__storage_, pathsArray),
-        .defaultValue.valueMessage = nil,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
       },
       },
     };
     };
     GPBDescriptor *localDescriptor =
     GPBDescriptor *localDescriptor =
@@ -59,15 +57,9 @@ typedef struct GPBFieldMask__storage_ {
                                      rootClass:[GPBFieldMaskRoot class]
                                      rootClass:[GPBFieldMaskRoot class]
                                           file:GPBFieldMaskRoot_FileDescriptor()
                                           file:GPBFieldMaskRoot_FileDescriptor()
                                         fields:fields
                                         fields:fields
-                                    fieldCount:sizeof(fields) / sizeof(GPBMessageFieldDescription)
-                                        oneofs:NULL
-                                    oneofCount:0
-                                         enums:NULL
-                                     enumCount:0
-                                        ranges:NULL
-                                    rangeCount:0
+                                    fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription))
                                    storageSize:sizeof(GPBFieldMask__storage_)
                                    storageSize:sizeof(GPBFieldMask__storage_)
-                                    wireFormat:NO];
+                                         flags:0];
     NSAssert(descriptor == nil, @"Startup recursed!");
     NSAssert(descriptor == nil, @"Startup recursed!");
     descriptor = localDescriptor;
     descriptor = localDescriptor;
   }
   }

+ 13 - 11
objectivec/google/protobuf/SourceContext.pbobjc.h

@@ -3,7 +3,7 @@
 
 
 #import "GPBProtocolBuffers.h"
 #import "GPBProtocolBuffers.h"
 
 
-#if GOOGLE_PROTOBUF_OBJC_GEN_VERSION != 30000
+#if GOOGLE_PROTOBUF_OBJC_GEN_VERSION != 30001
 #error This file was generated by a different version of protoc which is incompatible with your Protocol Buffer library sources.
 #error This file was generated by a different version of protoc which is incompatible with your Protocol Buffer library sources.
 #endif
 #endif
 
 
@@ -15,13 +15,15 @@ NS_ASSUME_NONNULL_BEGIN
 
 
 #pragma mark - GPBSourceContextRoot
 #pragma mark - GPBSourceContextRoot
 
 
+/// Exposes the extension registry for this file.
+///
+/// The base class provides:
+/// @code
+///   + (GPBExtensionRegistry *)extensionRegistry;
+/// @endcode
+/// which is a @c GPBExtensionRegistry that includes all the extensions defined by
+/// this file and all files that it depends on.
 @interface GPBSourceContextRoot : GPBRootObject
 @interface GPBSourceContextRoot : GPBRootObject
-
-// The base class provides:
-//   + (GPBExtensionRegistry *)extensionRegistry;
-// which is an GPBExtensionRegistry that includes all the extensions defined by
-// this file and all files that it depends on.
-
 @end
 @end
 
 
 #pragma mark - GPBSourceContext
 #pragma mark - GPBSourceContext
@@ -30,12 +32,12 @@ typedef GPB_ENUM(GPBSourceContext_FieldNumber) {
   GPBSourceContext_FieldNumber_FileName = 1,
   GPBSourceContext_FieldNumber_FileName = 1,
 };
 };
 
 
-// `SourceContext` represents information about the source of a
-// protobuf element, like the file in which it is defined.
+/// `SourceContext` represents information about the source of a
+/// protobuf element, like the file in which it is defined.
 @interface GPBSourceContext : GPBMessage
 @interface GPBSourceContext : GPBMessage
 
 
-// The path-qualified name of the .proto file that contained the associated
-// protobuf element.  For example: `"google/protobuf/source.proto"`.
+/// The path-qualified name of the .proto file that contained the associated
+/// protobuf element.  For example: `"google/protobuf/source.proto"`.
 @property(nonatomic, readwrite, copy, null_resettable) NSString *fileName;
 @property(nonatomic, readwrite, copy, null_resettable) NSString *fileName;
 
 
 @end
 @end

+ 4 - 12
objectivec/google/protobuf/SourceContext.pbobjc.m

@@ -44,14 +44,12 @@ typedef struct GPBSourceContext__storage_ {
     static GPBMessageFieldDescription fields[] = {
     static GPBMessageFieldDescription fields[] = {
       {
       {
         .name = "fileName",
         .name = "fileName",
+        .dataTypeSpecific.className = NULL,
         .number = GPBSourceContext_FieldNumber_FileName,
         .number = GPBSourceContext_FieldNumber_FileName,
         .hasIndex = 0,
         .hasIndex = 0,
+        .offset = (uint32_t)offsetof(GPBSourceContext__storage_, fileName),
         .flags = GPBFieldOptional,
         .flags = GPBFieldOptional,
         .dataType = GPBDataTypeString,
         .dataType = GPBDataTypeString,
-        .offset = offsetof(GPBSourceContext__storage_, fileName),
-        .defaultValue.valueString = nil,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
       },
       },
     };
     };
     GPBDescriptor *localDescriptor =
     GPBDescriptor *localDescriptor =
@@ -59,15 +57,9 @@ typedef struct GPBSourceContext__storage_ {
                                      rootClass:[GPBSourceContextRoot class]
                                      rootClass:[GPBSourceContextRoot class]
                                           file:GPBSourceContextRoot_FileDescriptor()
                                           file:GPBSourceContextRoot_FileDescriptor()
                                         fields:fields
                                         fields:fields
-                                    fieldCount:sizeof(fields) / sizeof(GPBMessageFieldDescription)
-                                        oneofs:NULL
-                                    oneofCount:0
-                                         enums:NULL
-                                     enumCount:0
-                                        ranges:NULL
-                                    rangeCount:0
+                                    fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription))
                                    storageSize:sizeof(GPBSourceContext__storage_)
                                    storageSize:sizeof(GPBSourceContext__storage_)
-                                    wireFormat:NO];
+                                         flags:0];
     NSAssert(descriptor == nil, @"Startup recursed!");
     NSAssert(descriptor == nil, @"Startup recursed!");
     descriptor = localDescriptor;
     descriptor = localDescriptor;
   }
   }

+ 53 - 38
objectivec/google/protobuf/Struct.pbobjc.h

@@ -3,7 +3,7 @@
 
 
 #import "GPBProtocolBuffers.h"
 #import "GPBProtocolBuffers.h"
 
 
-#if GOOGLE_PROTOBUF_OBJC_GEN_VERSION != 30000
+#if GOOGLE_PROTOBUF_OBJC_GEN_VERSION != 30001
 #error This file was generated by a different version of protoc which is incompatible with your Protocol Buffer library sources.
 #error This file was generated by a different version of protoc which is incompatible with your Protocol Buffer library sources.
 #endif
 #endif
 
 
@@ -19,29 +19,36 @@ NS_ASSUME_NONNULL_BEGIN
 
 
 #pragma mark - Enum GPBNullValue
 #pragma mark - Enum GPBNullValue
 
 
-// `NullValue` is a singleton enumeration to represent the null value for the
-// `Value` type union.
-//
-//  The JSON representation for `NullValue` is JSON `null`.
+/// `NullValue` is a singleton enumeration to represent the null value for the
+/// `Value` type union.
+///
+///  The JSON representation for `NullValue` is JSON `null`.
 typedef GPB_ENUM(GPBNullValue) {
 typedef GPB_ENUM(GPBNullValue) {
+  /// Value used if any message's field encounters a value that is not defined
+  /// by this enum. The message will also have C functions to get/set the rawValue
+  /// of the field.
   GPBNullValue_GPBUnrecognizedEnumeratorValue = kGPBUnrecognizedEnumeratorValue,
   GPBNullValue_GPBUnrecognizedEnumeratorValue = kGPBUnrecognizedEnumeratorValue,
-  // Null value.
+  /// Null value.
   GPBNullValue_NullValue = 0,
   GPBNullValue_NullValue = 0,
 };
 };
 
 
 GPBEnumDescriptor *GPBNullValue_EnumDescriptor(void);
 GPBEnumDescriptor *GPBNullValue_EnumDescriptor(void);
 
 
+/// Checks to see if the given value is defined by the enum or was not known at
+/// the time this source was generated.
 BOOL GPBNullValue_IsValidValue(int32_t value);
 BOOL GPBNullValue_IsValidValue(int32_t value);
 
 
 #pragma mark - GPBStructRoot
 #pragma mark - GPBStructRoot
 
 
+/// Exposes the extension registry for this file.
+///
+/// The base class provides:
+/// @code
+///   + (GPBExtensionRegistry *)extensionRegistry;
+/// @endcode
+/// which is a @c GPBExtensionRegistry that includes all the extensions defined by
+/// this file and all files that it depends on.
 @interface GPBStructRoot : GPBRootObject
 @interface GPBStructRoot : GPBRootObject
-
-// The base class provides:
-//   + (GPBExtensionRegistry *)extensionRegistry;
-// which is an GPBExtensionRegistry that includes all the extensions defined by
-// this file and all files that it depends on.
-
 @end
 @end
 
 
 #pragma mark - GPBStruct
 #pragma mark - GPBStruct
@@ -50,18 +57,19 @@ typedef GPB_ENUM(GPBStruct_FieldNumber) {
   GPBStruct_FieldNumber_Fields = 1,
   GPBStruct_FieldNumber_Fields = 1,
 };
 };
 
 
-// `Struct` represents a structured data value, consisting of fields
-// which map to dynamically typed values. In some languages, `Struct`
-// might be supported by a native representation. For example, in
-// scripting languages like JS a struct is represented as an
-// object. The details of that representation are described together
-// with the proto support for the language.
-//
-// The JSON representation for `Struct` is JSON object.
+/// `Struct` represents a structured data value, consisting of fields
+/// which map to dynamically typed values. In some languages, `Struct`
+/// might be supported by a native representation. For example, in
+/// scripting languages like JS a struct is represented as an
+/// object. The details of that representation are described together
+/// with the proto support for the language.
+///
+/// The JSON representation for `Struct` is JSON object.
 @interface GPBStruct : GPBMessage
 @interface GPBStruct : GPBMessage
 
 
-// Map of dynamically typed values.
+/// Map of dynamically typed values.
 @property(nonatomic, readwrite, strong, null_resettable) NSMutableDictionary<NSString*, GPBValue*> *fields;
 @property(nonatomic, readwrite, strong, null_resettable) NSMutableDictionary<NSString*, GPBValue*> *fields;
+/// The number of items in @c fields without causing the array to be created.
 @property(nonatomic, readonly) NSUInteger fields_Count;
 @property(nonatomic, readonly) NSUInteger fields_Count;
 
 
 @end
 @end
@@ -87,40 +95,46 @@ typedef GPB_ENUM(GPBValue_Kind_OneOfCase) {
   GPBValue_Kind_OneOfCase_ListValue = 6,
   GPBValue_Kind_OneOfCase_ListValue = 6,
 };
 };
 
 
-// `Value` represents a dynamically typed value which can be either
-// null, a number, a string, a boolean, a recursive struct value, or a
-// list of values. A producer of value is expected to set one of that
-// variants, absence of any variant indicates an error.
-//
-// The JSON representation for `Value` is JSON value.
+/// `Value` represents a dynamically typed value which can be either
+/// null, a number, a string, a boolean, a recursive struct value, or a
+/// list of values. A producer of value is expected to set one of that
+/// variants, absence of any variant indicates an error.
+///
+/// The JSON representation for `Value` is JSON value.
 @interface GPBValue : GPBMessage
 @interface GPBValue : GPBMessage
 
 
-// The kind of value.
+/// The kind of value.
 @property(nonatomic, readonly) GPBValue_Kind_OneOfCase kindOneOfCase;
 @property(nonatomic, readonly) GPBValue_Kind_OneOfCase kindOneOfCase;
 
 
-// Represents a null value.
+/// Represents a null value.
 @property(nonatomic, readwrite) GPBNullValue nullValue;
 @property(nonatomic, readwrite) GPBNullValue nullValue;
 
 
-// Represents a double value.
+/// Represents a double value.
 @property(nonatomic, readwrite) double numberValue;
 @property(nonatomic, readwrite) double numberValue;
 
 
-// Represents a string value.
+/// Represents a string value.
 @property(nonatomic, readwrite, copy, null_resettable) NSString *stringValue;
 @property(nonatomic, readwrite, copy, null_resettable) NSString *stringValue;
 
 
-// Represents a boolean value.
+/// Represents a boolean value.
 @property(nonatomic, readwrite) BOOL boolValue;
 @property(nonatomic, readwrite) BOOL boolValue;
 
 
-// Represents a structured value.
+/// Represents a structured value.
 @property(nonatomic, readwrite, strong, null_resettable) GPBStruct *structValue;
 @property(nonatomic, readwrite, strong, null_resettable) GPBStruct *structValue;
 
 
-// Represents a repeated `Value`.
+/// Represents a repeated `Value`.
 @property(nonatomic, readwrite, strong, null_resettable) GPBListValue *listValue;
 @property(nonatomic, readwrite, strong, null_resettable) GPBListValue *listValue;
 
 
 @end
 @end
 
 
+/// Fetches the raw value of a @c GPBValue's @c nullValue property, even
+/// if the value was not defined by the enum at the time the code was generated.
 int32_t GPBValue_NullValue_RawValue(GPBValue *message);
 int32_t GPBValue_NullValue_RawValue(GPBValue *message);
+/// Sets the raw value of an @c GPBValue's @c nullValue property, allowing
+/// it to be set to a value that was not defined by the enum at the time the code
+/// was generated.
 void SetGPBValue_NullValue_RawValue(GPBValue *message, int32_t value);
 void SetGPBValue_NullValue_RawValue(GPBValue *message, int32_t value);
 
 
+/// Clears whatever value was set for the oneof 'kind'.
 void GPBValue_ClearKindOneOfCase(GPBValue *message);
 void GPBValue_ClearKindOneOfCase(GPBValue *message);
 
 
 #pragma mark - GPBListValue
 #pragma mark - GPBListValue
@@ -129,13 +143,14 @@ typedef GPB_ENUM(GPBListValue_FieldNumber) {
   GPBListValue_FieldNumber_ValuesArray = 1,
   GPBListValue_FieldNumber_ValuesArray = 1,
 };
 };
 
 
-// `ListValue` is a wrapper around a repeated field of values.
-//
-// The JSON representation for `ListValue` is JSON array.
+/// `ListValue` is a wrapper around a repeated field of values.
+///
+/// The JSON representation for `ListValue` is JSON array.
 @interface GPBListValue : GPBMessage
 @interface GPBListValue : GPBMessage
 
 
-// Repeated field of dynamically typed values.
+/// Repeated field of dynamically typed values.
 @property(nonatomic, readwrite, strong, null_resettable) NSMutableArray<GPBValue*> *valuesArray;
 @property(nonatomic, readwrite, strong, null_resettable) NSMutableArray<GPBValue*> *valuesArray;
+/// The number of items in @c valuesArray without causing the array to be created.
 @property(nonatomic, readonly) NSUInteger valuesArray_Count;
 @property(nonatomic, readonly) NSUInteger valuesArray_Count;
 
 
 @end
 @end

+ 42 - 70
objectivec/google/protobuf/Struct.pbobjc.m

@@ -30,13 +30,20 @@ static GPBFileDescriptor *GPBStructRoot_FileDescriptor(void) {
 GPBEnumDescriptor *GPBNullValue_EnumDescriptor(void) {
 GPBEnumDescriptor *GPBNullValue_EnumDescriptor(void) {
   static GPBEnumDescriptor *descriptor = NULL;
   static GPBEnumDescriptor *descriptor = NULL;
   if (!descriptor) {
   if (!descriptor) {
-    static GPBMessageEnumValueDescription values[] = {
-      { .name = "NullValue", .number = GPBNullValue_NullValue },
+    static const char *valueNames =
+        "NullValue\000";
+    static const int32_t values[] = {
+        GPBNullValue_NullValue,
     };
     };
-    descriptor = [GPBEnumDescriptor allocDescriptorForName:GPBNSStringifySymbol(GPBNullValue)
-                                                   values:values
-                                               valueCount:sizeof(values) / sizeof(GPBMessageEnumValueDescription)
-                                             enumVerifier:GPBNullValue_IsValidValue];
+    GPBEnumDescriptor *worker =
+        [GPBEnumDescriptor allocDescriptorForName:GPBNSStringifySymbol(GPBNullValue)
+                                       valueNames:valueNames
+                                           values:values
+                                            count:(uint32_t)(sizeof(values) / sizeof(int32_t))
+                                     enumVerifier:GPBNullValue_IsValidValue];
+    if (!OSAtomicCompareAndSwapPtrBarrier(nil, worker, (void * volatile *)&descriptor)) {
+      [worker release];
+    }
   }
   }
   return descriptor;
   return descriptor;
 }
 }
@@ -69,14 +76,12 @@ typedef struct GPBStruct__storage_ {
     static GPBMessageFieldDescription fields[] = {
     static GPBMessageFieldDescription fields[] = {
       {
       {
         .name = "fields",
         .name = "fields",
+        .dataTypeSpecific.className = GPBStringifySymbol(GPBValue),
         .number = GPBStruct_FieldNumber_Fields,
         .number = GPBStruct_FieldNumber_Fields,
         .hasIndex = GPBNoHasBit,
         .hasIndex = GPBNoHasBit,
+        .offset = (uint32_t)offsetof(GPBStruct__storage_, fields),
         .flags = GPBFieldMapKeyString,
         .flags = GPBFieldMapKeyString,
         .dataType = GPBDataTypeMessage,
         .dataType = GPBDataTypeMessage,
-        .offset = offsetof(GPBStruct__storage_, fields),
-        .defaultValue.valueMessage = nil,
-        .dataTypeSpecific.className = GPBStringifySymbol(GPBValue),
-        .fieldOptions = NULL,
       },
       },
     };
     };
     GPBDescriptor *localDescriptor =
     GPBDescriptor *localDescriptor =
@@ -84,15 +89,9 @@ typedef struct GPBStruct__storage_ {
                                      rootClass:[GPBStructRoot class]
                                      rootClass:[GPBStructRoot class]
                                           file:GPBStructRoot_FileDescriptor()
                                           file:GPBStructRoot_FileDescriptor()
                                         fields:fields
                                         fields:fields
-                                    fieldCount:sizeof(fields) / sizeof(GPBMessageFieldDescription)
-                                        oneofs:NULL
-                                    oneofCount:0
-                                         enums:NULL
-                                     enumCount:0
-                                        ranges:NULL
-                                    rangeCount:0
+                                    fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription))
                                    storageSize:sizeof(GPBStruct__storage_)
                                    storageSize:sizeof(GPBStruct__storage_)
-                                    wireFormat:NO];
+                                         flags:0];
     NSAssert(descriptor == nil, @"Startup recursed!");
     NSAssert(descriptor == nil, @"Startup recursed!");
     descriptor = localDescriptor;
     descriptor = localDescriptor;
   }
   }
@@ -115,7 +114,6 @@ typedef struct GPBStruct__storage_ {
 
 
 typedef struct GPBValue__storage_ {
 typedef struct GPBValue__storage_ {
   uint32_t _has_storage_[2];
   uint32_t _has_storage_[2];
-  BOOL boolValue;
   GPBNullValue nullValue;
   GPBNullValue nullValue;
   NSString *stringValue;
   NSString *stringValue;
   GPBStruct *structValue;
   GPBStruct *structValue;
@@ -128,78 +126,60 @@ typedef struct GPBValue__storage_ {
 + (GPBDescriptor *)descriptor {
 + (GPBDescriptor *)descriptor {
   static GPBDescriptor *descriptor = nil;
   static GPBDescriptor *descriptor = nil;
   if (!descriptor) {
   if (!descriptor) {
-    static GPBMessageOneofDescription oneofs[] = {
-      {
-        .name = "kind",
-        .index = -1,
-      },
-    };
     static GPBMessageFieldDescription fields[] = {
     static GPBMessageFieldDescription fields[] = {
       {
       {
         .name = "nullValue",
         .name = "nullValue",
+        .dataTypeSpecific.enumDescFunc = GPBNullValue_EnumDescriptor,
         .number = GPBValue_FieldNumber_NullValue,
         .number = GPBValue_FieldNumber_NullValue,
         .hasIndex = -1,
         .hasIndex = -1,
+        .offset = (uint32_t)offsetof(GPBValue__storage_, nullValue),
         .flags = GPBFieldOptional | GPBFieldHasEnumDescriptor,
         .flags = GPBFieldOptional | GPBFieldHasEnumDescriptor,
         .dataType = GPBDataTypeEnum,
         .dataType = GPBDataTypeEnum,
-        .offset = offsetof(GPBValue__storage_, nullValue),
-        .defaultValue.valueEnum = GPBNullValue_NullValue,
-        .dataTypeSpecific.enumDescFunc = GPBNullValue_EnumDescriptor,
-        .fieldOptions = NULL,
       },
       },
       {
       {
         .name = "numberValue",
         .name = "numberValue",
+        .dataTypeSpecific.className = NULL,
         .number = GPBValue_FieldNumber_NumberValue,
         .number = GPBValue_FieldNumber_NumberValue,
         .hasIndex = -1,
         .hasIndex = -1,
+        .offset = (uint32_t)offsetof(GPBValue__storage_, numberValue),
         .flags = GPBFieldOptional,
         .flags = GPBFieldOptional,
         .dataType = GPBDataTypeDouble,
         .dataType = GPBDataTypeDouble,
-        .offset = offsetof(GPBValue__storage_, numberValue),
-        .defaultValue.valueDouble = 0,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
       },
       },
       {
       {
         .name = "stringValue",
         .name = "stringValue",
+        .dataTypeSpecific.className = NULL,
         .number = GPBValue_FieldNumber_StringValue,
         .number = GPBValue_FieldNumber_StringValue,
         .hasIndex = -1,
         .hasIndex = -1,
+        .offset = (uint32_t)offsetof(GPBValue__storage_, stringValue),
         .flags = GPBFieldOptional,
         .flags = GPBFieldOptional,
         .dataType = GPBDataTypeString,
         .dataType = GPBDataTypeString,
-        .offset = offsetof(GPBValue__storage_, stringValue),
-        .defaultValue.valueString = nil,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
       },
       },
       {
       {
         .name = "boolValue",
         .name = "boolValue",
+        .dataTypeSpecific.className = NULL,
         .number = GPBValue_FieldNumber_BoolValue,
         .number = GPBValue_FieldNumber_BoolValue,
         .hasIndex = -1,
         .hasIndex = -1,
+        .offset = 0,  // Stored in _has_storage_ to save space.
         .flags = GPBFieldOptional,
         .flags = GPBFieldOptional,
         .dataType = GPBDataTypeBool,
         .dataType = GPBDataTypeBool,
-        .offset = offsetof(GPBValue__storage_, boolValue),
-        .defaultValue.valueBool = NO,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
       },
       },
       {
       {
         .name = "structValue",
         .name = "structValue",
+        .dataTypeSpecific.className = GPBStringifySymbol(GPBStruct),
         .number = GPBValue_FieldNumber_StructValue,
         .number = GPBValue_FieldNumber_StructValue,
         .hasIndex = -1,
         .hasIndex = -1,
+        .offset = (uint32_t)offsetof(GPBValue__storage_, structValue),
         .flags = GPBFieldOptional,
         .flags = GPBFieldOptional,
         .dataType = GPBDataTypeMessage,
         .dataType = GPBDataTypeMessage,
-        .offset = offsetof(GPBValue__storage_, structValue),
-        .defaultValue.valueMessage = nil,
-        .dataTypeSpecific.className = GPBStringifySymbol(GPBStruct),
-        .fieldOptions = NULL,
       },
       },
       {
       {
         .name = "listValue",
         .name = "listValue",
+        .dataTypeSpecific.className = GPBStringifySymbol(GPBListValue),
         .number = GPBValue_FieldNumber_ListValue,
         .number = GPBValue_FieldNumber_ListValue,
         .hasIndex = -1,
         .hasIndex = -1,
+        .offset = (uint32_t)offsetof(GPBValue__storage_, listValue),
         .flags = GPBFieldOptional,
         .flags = GPBFieldOptional,
         .dataType = GPBDataTypeMessage,
         .dataType = GPBDataTypeMessage,
-        .offset = offsetof(GPBValue__storage_, listValue),
-        .defaultValue.valueMessage = nil,
-        .dataTypeSpecific.className = GPBStringifySymbol(GPBListValue),
-        .fieldOptions = NULL,
       },
       },
     };
     };
     GPBDescriptor *localDescriptor =
     GPBDescriptor *localDescriptor =
@@ -207,15 +187,15 @@ typedef struct GPBValue__storage_ {
                                      rootClass:[GPBStructRoot class]
                                      rootClass:[GPBStructRoot class]
                                           file:GPBStructRoot_FileDescriptor()
                                           file:GPBStructRoot_FileDescriptor()
                                         fields:fields
                                         fields:fields
-                                    fieldCount:sizeof(fields) / sizeof(GPBMessageFieldDescription)
-                                        oneofs:oneofs
-                                    oneofCount:sizeof(oneofs) / sizeof(GPBMessageOneofDescription)
-                                         enums:NULL
-                                     enumCount:0
-                                        ranges:NULL
-                                    rangeCount:0
+                                    fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription))
                                    storageSize:sizeof(GPBValue__storage_)
                                    storageSize:sizeof(GPBValue__storage_)
-                                    wireFormat:NO];
+                                         flags:0];
+    static const char *oneofs[] = {
+      "kind",
+    };
+    [localDescriptor setupOneofs:oneofs
+                           count:(uint32_t)(sizeof(oneofs) / sizeof(char*))
+                   firstHasIndex:-1];
     NSAssert(descriptor == nil, @"Startup recursed!");
     NSAssert(descriptor == nil, @"Startup recursed!");
     descriptor = localDescriptor;
     descriptor = localDescriptor;
   }
   }
@@ -239,7 +219,7 @@ void SetGPBValue_NullValue_RawValue(GPBValue *message, int32_t value) {
 void GPBValue_ClearKindOneOfCase(GPBValue *message) {
 void GPBValue_ClearKindOneOfCase(GPBValue *message) {
   GPBDescriptor *descriptor = [message descriptor];
   GPBDescriptor *descriptor = [message descriptor];
   GPBOneofDescriptor *oneof = descriptor->oneofs_[0];
   GPBOneofDescriptor *oneof = descriptor->oneofs_[0];
-  GPBMaybeClearOneof(message, oneof, 0);
+  GPBMaybeClearOneof(message, oneof, -1, 0);
 }
 }
 #pragma mark - GPBListValue
 #pragma mark - GPBListValue
 
 
@@ -260,14 +240,12 @@ typedef struct GPBListValue__storage_ {
     static GPBMessageFieldDescription fields[] = {
     static GPBMessageFieldDescription fields[] = {
       {
       {
         .name = "valuesArray",
         .name = "valuesArray",
+        .dataTypeSpecific.className = GPBStringifySymbol(GPBValue),
         .number = GPBListValue_FieldNumber_ValuesArray,
         .number = GPBListValue_FieldNumber_ValuesArray,
         .hasIndex = GPBNoHasBit,
         .hasIndex = GPBNoHasBit,
+        .offset = (uint32_t)offsetof(GPBListValue__storage_, valuesArray),
         .flags = GPBFieldRepeated,
         .flags = GPBFieldRepeated,
         .dataType = GPBDataTypeMessage,
         .dataType = GPBDataTypeMessage,
-        .offset = offsetof(GPBListValue__storage_, valuesArray),
-        .defaultValue.valueMessage = nil,
-        .dataTypeSpecific.className = GPBStringifySymbol(GPBValue),
-        .fieldOptions = NULL,
       },
       },
     };
     };
     GPBDescriptor *localDescriptor =
     GPBDescriptor *localDescriptor =
@@ -275,15 +253,9 @@ typedef struct GPBListValue__storage_ {
                                      rootClass:[GPBStructRoot class]
                                      rootClass:[GPBStructRoot class]
                                           file:GPBStructRoot_FileDescriptor()
                                           file:GPBStructRoot_FileDescriptor()
                                         fields:fields
                                         fields:fields
-                                    fieldCount:sizeof(fields) / sizeof(GPBMessageFieldDescription)
-                                        oneofs:NULL
-                                    oneofCount:0
-                                         enums:NULL
-                                     enumCount:0
-                                        ranges:NULL
-                                    rangeCount:0
+                                    fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription))
                                    storageSize:sizeof(GPBListValue__storage_)
                                    storageSize:sizeof(GPBListValue__storage_)
-                                    wireFormat:NO];
+                                         flags:0];
     NSAssert(descriptor == nil, @"Startup recursed!");
     NSAssert(descriptor == nil, @"Startup recursed!");
     descriptor = localDescriptor;
     descriptor = localDescriptor;
   }
   }

+ 69 - 67
objectivec/google/protobuf/Timestamp.pbobjc.h

@@ -3,7 +3,7 @@
 
 
 #import "GPBProtocolBuffers.h"
 #import "GPBProtocolBuffers.h"
 
 
-#if GOOGLE_PROTOBUF_OBJC_GEN_VERSION != 30000
+#if GOOGLE_PROTOBUF_OBJC_GEN_VERSION != 30001
 #error This file was generated by a different version of protoc which is incompatible with your Protocol Buffer library sources.
 #error This file was generated by a different version of protoc which is incompatible with your Protocol Buffer library sources.
 #endif
 #endif
 
 
@@ -15,13 +15,15 @@ NS_ASSUME_NONNULL_BEGIN
 
 
 #pragma mark - GPBTimestampRoot
 #pragma mark - GPBTimestampRoot
 
 
+/// Exposes the extension registry for this file.
+///
+/// The base class provides:
+/// @code
+///   + (GPBExtensionRegistry *)extensionRegistry;
+/// @endcode
+/// which is a @c GPBExtensionRegistry that includes all the extensions defined by
+/// this file and all files that it depends on.
 @interface GPBTimestampRoot : GPBRootObject
 @interface GPBTimestampRoot : GPBRootObject
-
-// The base class provides:
-//   + (GPBExtensionRegistry *)extensionRegistry;
-// which is an GPBExtensionRegistry that includes all the extensions defined by
-// this file and all files that it depends on.
-
 @end
 @end
 
 
 #pragma mark - GPBTimestamp
 #pragma mark - GPBTimestamp
@@ -31,70 +33,70 @@ typedef GPB_ENUM(GPBTimestamp_FieldNumber) {
   GPBTimestamp_FieldNumber_Nanos = 2,
   GPBTimestamp_FieldNumber_Nanos = 2,
 };
 };
 
 
-// A Timestamp represents a point in time independent of any time zone
-// or calendar, represented as seconds and fractions of seconds at
-// nanosecond resolution in UTC Epoch time. It is encoded using the
-// Proleptic Gregorian Calendar which extends the Gregorian calendar
-// backwards to year one. It is encoded assuming all minutes are 60
-// seconds long, i.e. leap seconds are "smeared" so that no leap second
-// table is needed for interpretation. Range is from
-// 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z.
-// By restricting to that range, we ensure that we can convert to
-// and from  RFC 3339 date strings.
-// See [https://www.ietf.org/rfc/rfc3339.txt](https://www.ietf.org/rfc/rfc3339.txt).
-//
-// Example 1: Compute Timestamp from POSIX `time()`.
-//
-//     Timestamp timestamp;
-//     timestamp.set_seconds(time(NULL));
-//     timestamp.set_nanos(0);
-//
-// Example 2: Compute Timestamp from POSIX `gettimeofday()`.
-//
-//     struct timeval tv;
-//     gettimeofday(&tv, NULL);
-//
-//     Timestamp timestamp;
-//     timestamp.set_seconds(tv.tv_sec);
-//     timestamp.set_nanos(tv.tv_usec * 1000);
-//
-// Example 3: Compute Timestamp from Win32 `GetSystemTimeAsFileTime()`.
-//
-//     FILETIME ft;
-//     GetSystemTimeAsFileTime(&ft);
-//     UINT64 ticks = (((UINT64)ft.dwHighDateTime) << 32) | ft.dwLowDateTime;
-//
-//     // A Windows tick is 100 nanoseconds. Windows epoch 1601-01-01T00:00:00Z
-//     // is 11644473600 seconds before Unix epoch 1970-01-01T00:00:00Z.
-//     Timestamp timestamp;
-//     timestamp.set_seconds((INT64) ((ticks / 10000000) - 11644473600LL));
-//     timestamp.set_nanos((INT32) ((ticks % 10000000) * 100));
-//
-// Example 4: Compute Timestamp from Java `System.currentTimeMillis()`.
-//
-//     long millis = System.currentTimeMillis();
-//
-//     Timestamp timestamp = Timestamp.newBuilder().setSeconds(millis / 1000)
-//         .setNanos((int) ((millis % 1000) * 1000000)).build();
-//
-//
-// Example 5: Compute Timestamp from current time in Python.
-//
-//     now = time.time()
-//     seconds = int(now)
-//     nanos = int((now - seconds) * 10**9)
-//     timestamp = Timestamp(seconds=seconds, nanos=nanos)
+/// A Timestamp represents a point in time independent of any time zone
+/// or calendar, represented as seconds and fractions of seconds at
+/// nanosecond resolution in UTC Epoch time. It is encoded using the
+/// Proleptic Gregorian Calendar which extends the Gregorian calendar
+/// backwards to year one. It is encoded assuming all minutes are 60
+/// seconds long, i.e. leap seconds are "smeared" so that no leap second
+/// table is needed for interpretation. Range is from
+/// 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z.
+/// By restricting to that range, we ensure that we can convert to
+/// and from  RFC 3339 date strings.
+/// See [https://www.ietf.org/rfc/rfc3339.txt](https://www.ietf.org/rfc/rfc3339.txt).
+///
+/// Example 1: Compute Timestamp from POSIX `time()`.
+///
+///     Timestamp timestamp;
+///     timestamp.set_seconds(time(NULL));
+///     timestamp.set_nanos(0);
+///
+/// Example 2: Compute Timestamp from POSIX `gettimeofday()`.
+///
+///     struct timeval tv;
+///     gettimeofday(&tv, NULL);
+///
+///     Timestamp timestamp;
+///     timestamp.set_seconds(tv.tv_sec);
+///     timestamp.set_nanos(tv.tv_usec * 1000);
+///
+/// Example 3: Compute Timestamp from Win32 `GetSystemTimeAsFileTime()`.
+///
+///     FILETIME ft;
+///     GetSystemTimeAsFileTime(&ft);
+///     UINT64 ticks = (((UINT64)ft.dwHighDateTime) << 32) | ft.dwLowDateTime;
+///
+///     // A Windows tick is 100 nanoseconds. Windows epoch 1601-01-01T00:00:00Z
+///     // is 11644473600 seconds before Unix epoch 1970-01-01T00:00:00Z.
+///     Timestamp timestamp;
+///     timestamp.set_seconds((INT64) ((ticks / 10000000) - 11644473600LL));
+///     timestamp.set_nanos((INT32) ((ticks % 10000000) * 100));
+///
+/// Example 4: Compute Timestamp from Java `System.currentTimeMillis()`.
+///
+///     long millis = System.currentTimeMillis();
+///
+///     Timestamp timestamp = Timestamp.newBuilder().setSeconds(millis / 1000)
+///         .setNanos((int) ((millis % 1000) * 1000000)).build();
+///
+///
+/// Example 5: Compute Timestamp from current time in Python.
+///
+///     now = time.time()
+///     seconds = int(now)
+///     nanos = int((now - seconds) * 10**9)
+///     timestamp = Timestamp(seconds=seconds, nanos=nanos)
 @interface GPBTimestamp : GPBMessage
 @interface GPBTimestamp : GPBMessage
 
 
-// Represents seconds of UTC time since Unix epoch
-// 1970-01-01T00:00:00Z. Must be from from 0001-01-01T00:00:00Z to
-// 9999-12-31T23:59:59Z inclusive.
+/// Represents seconds of UTC time since Unix epoch
+/// 1970-01-01T00:00:00Z. Must be from from 0001-01-01T00:00:00Z to
+/// 9999-12-31T23:59:59Z inclusive.
 @property(nonatomic, readwrite) int64_t seconds;
 @property(nonatomic, readwrite) int64_t seconds;
 
 
-// Non-negative fractions of a second at nanosecond resolution. Negative
-// second values with fractions must still have non-negative nanos values
-// that count forward in time. Must be from 0 to 999,999,999
-// inclusive.
+/// Non-negative fractions of a second at nanosecond resolution. Negative
+/// second values with fractions must still have non-negative nanos values
+/// that count forward in time. Must be from 0 to 999,999,999
+/// inclusive.
 @property(nonatomic, readwrite) int32_t nanos;
 @property(nonatomic, readwrite) int32_t nanos;
 
 
 @end
 @end

+ 6 - 16
objectivec/google/protobuf/Timestamp.pbobjc.m

@@ -46,25 +46,21 @@ typedef struct GPBTimestamp__storage_ {
     static GPBMessageFieldDescription fields[] = {
     static GPBMessageFieldDescription fields[] = {
       {
       {
         .name = "seconds",
         .name = "seconds",
+        .dataTypeSpecific.className = NULL,
         .number = GPBTimestamp_FieldNumber_Seconds,
         .number = GPBTimestamp_FieldNumber_Seconds,
         .hasIndex = 0,
         .hasIndex = 0,
+        .offset = (uint32_t)offsetof(GPBTimestamp__storage_, seconds),
         .flags = GPBFieldOptional,
         .flags = GPBFieldOptional,
         .dataType = GPBDataTypeInt64,
         .dataType = GPBDataTypeInt64,
-        .offset = offsetof(GPBTimestamp__storage_, seconds),
-        .defaultValue.valueInt64 = 0LL,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
       },
       },
       {
       {
         .name = "nanos",
         .name = "nanos",
+        .dataTypeSpecific.className = NULL,
         .number = GPBTimestamp_FieldNumber_Nanos,
         .number = GPBTimestamp_FieldNumber_Nanos,
         .hasIndex = 1,
         .hasIndex = 1,
+        .offset = (uint32_t)offsetof(GPBTimestamp__storage_, nanos),
         .flags = GPBFieldOptional,
         .flags = GPBFieldOptional,
         .dataType = GPBDataTypeInt32,
         .dataType = GPBDataTypeInt32,
-        .offset = offsetof(GPBTimestamp__storage_, nanos),
-        .defaultValue.valueInt32 = 0,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
       },
       },
     };
     };
     GPBDescriptor *localDescriptor =
     GPBDescriptor *localDescriptor =
@@ -72,15 +68,9 @@ typedef struct GPBTimestamp__storage_ {
                                      rootClass:[GPBTimestampRoot class]
                                      rootClass:[GPBTimestampRoot class]
                                           file:GPBTimestampRoot_FileDescriptor()
                                           file:GPBTimestampRoot_FileDescriptor()
                                         fields:fields
                                         fields:fields
-                                    fieldCount:sizeof(fields) / sizeof(GPBMessageFieldDescription)
-                                        oneofs:NULL
-                                    oneofCount:0
-                                         enums:NULL
-                                     enumCount:0
-                                        ranges:NULL
-                                    rangeCount:0
+                                    fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription))
                                    storageSize:sizeof(GPBTimestamp__storage_)
                                    storageSize:sizeof(GPBTimestamp__storage_)
-                                    wireFormat:NO];
+                                         flags:0];
     NSAssert(descriptor == nil, @"Startup recursed!");
     NSAssert(descriptor == nil, @"Startup recursed!");
     descriptor = localDescriptor;
     descriptor = localDescriptor;
   }
   }

+ 119 - 72
objectivec/google/protobuf/Type.pbobjc.h

@@ -3,7 +3,7 @@
 
 
 #import "GPBProtocolBuffers.h"
 #import "GPBProtocolBuffers.h"
 
 
-#if GOOGLE_PROTOBUF_OBJC_GEN_VERSION != 30000
+#if GOOGLE_PROTOBUF_OBJC_GEN_VERSION != 30001
 #error This file was generated by a different version of protoc which is incompatible with your Protocol Buffer library sources.
 #error This file was generated by a different version of protoc which is incompatible with your Protocol Buffer library sources.
 #endif
 #endif
 
 
@@ -21,118 +21,135 @@ NS_ASSUME_NONNULL_BEGIN
 
 
 #pragma mark - Enum GPBSyntax
 #pragma mark - Enum GPBSyntax
 
 
-// The syntax in which a protocol buffer element is defined.
+/// The syntax in which a protocol buffer element is defined.
 typedef GPB_ENUM(GPBSyntax) {
 typedef GPB_ENUM(GPBSyntax) {
+  /// Value used if any message's field encounters a value that is not defined
+  /// by this enum. The message will also have C functions to get/set the rawValue
+  /// of the field.
   GPBSyntax_GPBUnrecognizedEnumeratorValue = kGPBUnrecognizedEnumeratorValue,
   GPBSyntax_GPBUnrecognizedEnumeratorValue = kGPBUnrecognizedEnumeratorValue,
-  // Syntax `proto2`.
+  /// Syntax `proto2`.
   GPBSyntax_SyntaxProto2 = 0,
   GPBSyntax_SyntaxProto2 = 0,
 
 
-  // Syntax `proto3`.
+  /// Syntax `proto3`.
   GPBSyntax_SyntaxProto3 = 1,
   GPBSyntax_SyntaxProto3 = 1,
 };
 };
 
 
 GPBEnumDescriptor *GPBSyntax_EnumDescriptor(void);
 GPBEnumDescriptor *GPBSyntax_EnumDescriptor(void);
 
 
+/// Checks to see if the given value is defined by the enum or was not known at
+/// the time this source was generated.
 BOOL GPBSyntax_IsValidValue(int32_t value);
 BOOL GPBSyntax_IsValidValue(int32_t value);
 
 
 #pragma mark - Enum GPBField_Kind
 #pragma mark - Enum GPBField_Kind
 
 
-// Basic field types.
+/// Basic field types.
 typedef GPB_ENUM(GPBField_Kind) {
 typedef GPB_ENUM(GPBField_Kind) {
+  /// Value used if any message's field encounters a value that is not defined
+  /// by this enum. The message will also have C functions to get/set the rawValue
+  /// of the field.
   GPBField_Kind_GPBUnrecognizedEnumeratorValue = kGPBUnrecognizedEnumeratorValue,
   GPBField_Kind_GPBUnrecognizedEnumeratorValue = kGPBUnrecognizedEnumeratorValue,
-  // Field type unknown.
+  /// Field type unknown.
   GPBField_Kind_TypeUnknown = 0,
   GPBField_Kind_TypeUnknown = 0,
 
 
-  // Field type double.
+  /// Field type double.
   GPBField_Kind_TypeDouble = 1,
   GPBField_Kind_TypeDouble = 1,
 
 
-  // Field type float.
+  /// Field type float.
   GPBField_Kind_TypeFloat = 2,
   GPBField_Kind_TypeFloat = 2,
 
 
-  // Field type int64.
+  /// Field type int64.
   GPBField_Kind_TypeInt64 = 3,
   GPBField_Kind_TypeInt64 = 3,
 
 
-  // Field type uint64.
+  /// Field type uint64.
   GPBField_Kind_TypeUint64 = 4,
   GPBField_Kind_TypeUint64 = 4,
 
 
-  // Field type int32.
+  /// Field type int32.
   GPBField_Kind_TypeInt32 = 5,
   GPBField_Kind_TypeInt32 = 5,
 
 
-  // Field type fixed64.
+  /// Field type fixed64.
   GPBField_Kind_TypeFixed64 = 6,
   GPBField_Kind_TypeFixed64 = 6,
 
 
-  // Field type fixed32.
+  /// Field type fixed32.
   GPBField_Kind_TypeFixed32 = 7,
   GPBField_Kind_TypeFixed32 = 7,
 
 
-  // Field type bool.
+  /// Field type bool.
   GPBField_Kind_TypeBool = 8,
   GPBField_Kind_TypeBool = 8,
 
 
-  // Field type string.
+  /// Field type string.
   GPBField_Kind_TypeString = 9,
   GPBField_Kind_TypeString = 9,
 
 
-  // Field type group. Proto2 syntax only, and deprecated.
+  /// Field type group. Proto2 syntax only, and deprecated.
   GPBField_Kind_TypeGroup = 10,
   GPBField_Kind_TypeGroup = 10,
 
 
-  // Field type message.
+  /// Field type message.
   GPBField_Kind_TypeMessage = 11,
   GPBField_Kind_TypeMessage = 11,
 
 
-  // Field type bytes.
+  /// Field type bytes.
   GPBField_Kind_TypeBytes = 12,
   GPBField_Kind_TypeBytes = 12,
 
 
-  // Field type uint32.
+  /// Field type uint32.
   GPBField_Kind_TypeUint32 = 13,
   GPBField_Kind_TypeUint32 = 13,
 
 
-  // Field type enum.
+  /// Field type enum.
   GPBField_Kind_TypeEnum = 14,
   GPBField_Kind_TypeEnum = 14,
 
 
-  // Field type sfixed32.
+  /// Field type sfixed32.
   GPBField_Kind_TypeSfixed32 = 15,
   GPBField_Kind_TypeSfixed32 = 15,
 
 
-  // Field type sfixed64.
+  /// Field type sfixed64.
   GPBField_Kind_TypeSfixed64 = 16,
   GPBField_Kind_TypeSfixed64 = 16,
 
 
-  // Field type sint32.
+  /// Field type sint32.
   GPBField_Kind_TypeSint32 = 17,
   GPBField_Kind_TypeSint32 = 17,
 
 
-  // Field type sint64.
+  /// Field type sint64.
   GPBField_Kind_TypeSint64 = 18,
   GPBField_Kind_TypeSint64 = 18,
 };
 };
 
 
 GPBEnumDescriptor *GPBField_Kind_EnumDescriptor(void);
 GPBEnumDescriptor *GPBField_Kind_EnumDescriptor(void);
 
 
+/// Checks to see if the given value is defined by the enum or was not known at
+/// the time this source was generated.
 BOOL GPBField_Kind_IsValidValue(int32_t value);
 BOOL GPBField_Kind_IsValidValue(int32_t value);
 
 
 #pragma mark - Enum GPBField_Cardinality
 #pragma mark - Enum GPBField_Cardinality
 
 
-// Whether a field is optional, required, or repeated.
+/// Whether a field is optional, required, or repeated.
 typedef GPB_ENUM(GPBField_Cardinality) {
 typedef GPB_ENUM(GPBField_Cardinality) {
+  /// Value used if any message's field encounters a value that is not defined
+  /// by this enum. The message will also have C functions to get/set the rawValue
+  /// of the field.
   GPBField_Cardinality_GPBUnrecognizedEnumeratorValue = kGPBUnrecognizedEnumeratorValue,
   GPBField_Cardinality_GPBUnrecognizedEnumeratorValue = kGPBUnrecognizedEnumeratorValue,
-  // For fields with unknown cardinality.
+  /// For fields with unknown cardinality.
   GPBField_Cardinality_CardinalityUnknown = 0,
   GPBField_Cardinality_CardinalityUnknown = 0,
 
 
-  // For optional fields.
+  /// For optional fields.
   GPBField_Cardinality_CardinalityOptional = 1,
   GPBField_Cardinality_CardinalityOptional = 1,
 
 
-  // For required fields. Proto2 syntax only.
+  /// For required fields. Proto2 syntax only.
   GPBField_Cardinality_CardinalityRequired = 2,
   GPBField_Cardinality_CardinalityRequired = 2,
 
 
-  // For repeated fields.
+  /// For repeated fields.
   GPBField_Cardinality_CardinalityRepeated = 3,
   GPBField_Cardinality_CardinalityRepeated = 3,
 };
 };
 
 
 GPBEnumDescriptor *GPBField_Cardinality_EnumDescriptor(void);
 GPBEnumDescriptor *GPBField_Cardinality_EnumDescriptor(void);
 
 
+/// Checks to see if the given value is defined by the enum or was not known at
+/// the time this source was generated.
 BOOL GPBField_Cardinality_IsValidValue(int32_t value);
 BOOL GPBField_Cardinality_IsValidValue(int32_t value);
 
 
 #pragma mark - GPBTypeRoot
 #pragma mark - GPBTypeRoot
 
 
+/// Exposes the extension registry for this file.
+///
+/// The base class provides:
+/// @code
+///   + (GPBExtensionRegistry *)extensionRegistry;
+/// @endcode
+/// which is a @c GPBExtensionRegistry that includes all the extensions defined by
+/// this file and all files that it depends on.
 @interface GPBTypeRoot : GPBRootObject
 @interface GPBTypeRoot : GPBRootObject
-
-// The base class provides:
-//   + (GPBExtensionRegistry *)extensionRegistry;
-// which is an GPBExtensionRegistry that includes all the extensions defined by
-// this file and all files that it depends on.
-
 @end
 @end
 
 
 #pragma mark - GPBType
 #pragma mark - GPBType
@@ -146,34 +163,43 @@ typedef GPB_ENUM(GPBType_FieldNumber) {
   GPBType_FieldNumber_Syntax = 6,
   GPBType_FieldNumber_Syntax = 6,
 };
 };
 
 
-// A protocol buffer message type.
+/// A protocol buffer message type.
 @interface GPBType : GPBMessage
 @interface GPBType : GPBMessage
 
 
-// The fully qualified message name.
+/// The fully qualified message name.
 @property(nonatomic, readwrite, copy, null_resettable) NSString *name;
 @property(nonatomic, readwrite, copy, null_resettable) NSString *name;
 
 
-// The list of fields.
+/// The list of fields.
 @property(nonatomic, readwrite, strong, null_resettable) NSMutableArray<GPBField*> *fieldsArray;
 @property(nonatomic, readwrite, strong, null_resettable) NSMutableArray<GPBField*> *fieldsArray;
+/// The number of items in @c fieldsArray without causing the array to be created.
 @property(nonatomic, readonly) NSUInteger fieldsArray_Count;
 @property(nonatomic, readonly) NSUInteger fieldsArray_Count;
 
 
-// The list of types appearing in `oneof` definitions in this type.
+/// The list of types appearing in `oneof` definitions in this type.
 @property(nonatomic, readwrite, strong, null_resettable) NSMutableArray<NSString*> *oneofsArray;
 @property(nonatomic, readwrite, strong, null_resettable) NSMutableArray<NSString*> *oneofsArray;
+/// The number of items in @c oneofsArray without causing the array to be created.
 @property(nonatomic, readonly) NSUInteger oneofsArray_Count;
 @property(nonatomic, readonly) NSUInteger oneofsArray_Count;
 
 
-// The protocol buffer options.
+/// The protocol buffer options.
 @property(nonatomic, readwrite, strong, null_resettable) NSMutableArray<GPBOption*> *optionsArray;
 @property(nonatomic, readwrite, strong, null_resettable) NSMutableArray<GPBOption*> *optionsArray;
+/// The number of items in @c optionsArray without causing the array to be created.
 @property(nonatomic, readonly) NSUInteger optionsArray_Count;
 @property(nonatomic, readonly) NSUInteger optionsArray_Count;
 
 
-// The source context.
-@property(nonatomic, readwrite) BOOL hasSourceContext;
+/// The source context.
 @property(nonatomic, readwrite, strong, null_resettable) GPBSourceContext *sourceContext;
 @property(nonatomic, readwrite, strong, null_resettable) GPBSourceContext *sourceContext;
+/// Test to see if @c sourceContext has been set.
+@property(nonatomic, readwrite) BOOL hasSourceContext;
 
 
-// The source syntax.
+/// The source syntax.
 @property(nonatomic, readwrite) GPBSyntax syntax;
 @property(nonatomic, readwrite) GPBSyntax syntax;
 
 
 @end
 @end
 
 
+/// Fetches the raw value of a @c GPBType's @c syntax property, even
+/// if the value was not defined by the enum at the time the code was generated.
 int32_t GPBType_Syntax_RawValue(GPBType *message);
 int32_t GPBType_Syntax_RawValue(GPBType *message);
+/// Sets the raw value of an @c GPBType's @c syntax property, allowing
+/// it to be set to a value that was not defined by the enum at the time the code
+/// was generated.
 void SetGPBType_Syntax_RawValue(GPBType *message, int32_t value);
 void SetGPBType_Syntax_RawValue(GPBType *message, int32_t value);
 
 
 #pragma mark - GPBField
 #pragma mark - GPBField
@@ -191,48 +217,59 @@ typedef GPB_ENUM(GPBField_FieldNumber) {
   GPBField_FieldNumber_DefaultValue = 11,
   GPBField_FieldNumber_DefaultValue = 11,
 };
 };
 
 
-// A single field of a message type.
+/// A single field of a message type.
 @interface GPBField : GPBMessage
 @interface GPBField : GPBMessage
 
 
-// The field type.
+/// The field type.
 @property(nonatomic, readwrite) GPBField_Kind kind;
 @property(nonatomic, readwrite) GPBField_Kind kind;
 
 
-// The field cardinality.
+/// The field cardinality.
 @property(nonatomic, readwrite) GPBField_Cardinality cardinality;
 @property(nonatomic, readwrite) GPBField_Cardinality cardinality;
 
 
-// The field number.
+/// The field number.
 @property(nonatomic, readwrite) int32_t number;
 @property(nonatomic, readwrite) int32_t number;
 
 
-// The field name.
+/// The field name.
 @property(nonatomic, readwrite, copy, null_resettable) NSString *name;
 @property(nonatomic, readwrite, copy, null_resettable) NSString *name;
 
 
-// The field type URL, without the scheme, for message or enumeration
-// types. Example: `"type.googleapis.com/google.protobuf.Timestamp"`.
+/// The field type URL, without the scheme, for message or enumeration
+/// types. Example: `"type.googleapis.com/google.protobuf.Timestamp"`.
 @property(nonatomic, readwrite, copy, null_resettable) NSString *typeURL;
 @property(nonatomic, readwrite, copy, null_resettable) NSString *typeURL;
 
 
-// The index of the field type in `Type.oneofs`, for message or enumeration
-// types. The first type has index 1; zero means the type is not in the list.
+/// The index of the field type in `Type.oneofs`, for message or enumeration
+/// types. The first type has index 1; zero means the type is not in the list.
 @property(nonatomic, readwrite) int32_t oneofIndex;
 @property(nonatomic, readwrite) int32_t oneofIndex;
 
 
-// Whether to use alternative packed wire representation.
+/// Whether to use alternative packed wire representation.
 @property(nonatomic, readwrite) BOOL packed;
 @property(nonatomic, readwrite) BOOL packed;
 
 
-// The protocol buffer options.
+/// The protocol buffer options.
 @property(nonatomic, readwrite, strong, null_resettable) NSMutableArray<GPBOption*> *optionsArray;
 @property(nonatomic, readwrite, strong, null_resettable) NSMutableArray<GPBOption*> *optionsArray;
+/// The number of items in @c optionsArray without causing the array to be created.
 @property(nonatomic, readonly) NSUInteger optionsArray_Count;
 @property(nonatomic, readonly) NSUInteger optionsArray_Count;
 
 
-// The field JSON name.
+/// The field JSON name.
 @property(nonatomic, readwrite, copy, null_resettable) NSString *jsonName;
 @property(nonatomic, readwrite, copy, null_resettable) NSString *jsonName;
 
 
-// The string value of the default value of this field. Proto2 syntax only.
+/// The string value of the default value of this field. Proto2 syntax only.
 @property(nonatomic, readwrite, copy, null_resettable) NSString *defaultValue;
 @property(nonatomic, readwrite, copy, null_resettable) NSString *defaultValue;
 
 
 @end
 @end
 
 
+/// Fetches the raw value of a @c GPBField's @c kind property, even
+/// if the value was not defined by the enum at the time the code was generated.
 int32_t GPBField_Kind_RawValue(GPBField *message);
 int32_t GPBField_Kind_RawValue(GPBField *message);
+/// Sets the raw value of an @c GPBField's @c kind property, allowing
+/// it to be set to a value that was not defined by the enum at the time the code
+/// was generated.
 void SetGPBField_Kind_RawValue(GPBField *message, int32_t value);
 void SetGPBField_Kind_RawValue(GPBField *message, int32_t value);
 
 
+/// Fetches the raw value of a @c GPBField's @c cardinality property, even
+/// if the value was not defined by the enum at the time the code was generated.
 int32_t GPBField_Cardinality_RawValue(GPBField *message);
 int32_t GPBField_Cardinality_RawValue(GPBField *message);
+/// Sets the raw value of an @c GPBField's @c cardinality property, allowing
+/// it to be set to a value that was not defined by the enum at the time the code
+/// was generated.
 void SetGPBField_Cardinality_RawValue(GPBField *message, int32_t value);
 void SetGPBField_Cardinality_RawValue(GPBField *message, int32_t value);
 
 
 #pragma mark - GPBEnum
 #pragma mark - GPBEnum
@@ -245,30 +282,38 @@ typedef GPB_ENUM(GPBEnum_FieldNumber) {
   GPBEnum_FieldNumber_Syntax = 5,
   GPBEnum_FieldNumber_Syntax = 5,
 };
 };
 
 
-// Enum type definition.
+/// Enum type definition.
 @interface GPBEnum : GPBMessage
 @interface GPBEnum : GPBMessage
 
 
-// Enum type name.
+/// Enum type name.
 @property(nonatomic, readwrite, copy, null_resettable) NSString *name;
 @property(nonatomic, readwrite, copy, null_resettable) NSString *name;
 
 
-// Enum value definitions.
+/// Enum value definitions.
 @property(nonatomic, readwrite, strong, null_resettable) NSMutableArray<GPBEnumValue*> *enumvalueArray;
 @property(nonatomic, readwrite, strong, null_resettable) NSMutableArray<GPBEnumValue*> *enumvalueArray;
+/// The number of items in @c enumvalueArray without causing the array to be created.
 @property(nonatomic, readonly) NSUInteger enumvalueArray_Count;
 @property(nonatomic, readonly) NSUInteger enumvalueArray_Count;
 
 
-// Protocol buffer options.
+/// Protocol buffer options.
 @property(nonatomic, readwrite, strong, null_resettable) NSMutableArray<GPBOption*> *optionsArray;
 @property(nonatomic, readwrite, strong, null_resettable) NSMutableArray<GPBOption*> *optionsArray;
+/// The number of items in @c optionsArray without causing the array to be created.
 @property(nonatomic, readonly) NSUInteger optionsArray_Count;
 @property(nonatomic, readonly) NSUInteger optionsArray_Count;
 
 
-// The source context.
-@property(nonatomic, readwrite) BOOL hasSourceContext;
+/// The source context.
 @property(nonatomic, readwrite, strong, null_resettable) GPBSourceContext *sourceContext;
 @property(nonatomic, readwrite, strong, null_resettable) GPBSourceContext *sourceContext;
+/// Test to see if @c sourceContext has been set.
+@property(nonatomic, readwrite) BOOL hasSourceContext;
 
 
-// The source syntax.
+/// The source syntax.
 @property(nonatomic, readwrite) GPBSyntax syntax;
 @property(nonatomic, readwrite) GPBSyntax syntax;
 
 
 @end
 @end
 
 
+/// Fetches the raw value of a @c GPBEnum's @c syntax property, even
+/// if the value was not defined by the enum at the time the code was generated.
 int32_t GPBEnum_Syntax_RawValue(GPBEnum *message);
 int32_t GPBEnum_Syntax_RawValue(GPBEnum *message);
+/// Sets the raw value of an @c GPBEnum's @c syntax property, allowing
+/// it to be set to a value that was not defined by the enum at the time the code
+/// was generated.
 void SetGPBEnum_Syntax_RawValue(GPBEnum *message, int32_t value);
 void SetGPBEnum_Syntax_RawValue(GPBEnum *message, int32_t value);
 
 
 #pragma mark - GPBEnumValue
 #pragma mark - GPBEnumValue
@@ -279,17 +324,18 @@ typedef GPB_ENUM(GPBEnumValue_FieldNumber) {
   GPBEnumValue_FieldNumber_OptionsArray = 3,
   GPBEnumValue_FieldNumber_OptionsArray = 3,
 };
 };
 
 
-// Enum value definition.
+/// Enum value definition.
 @interface GPBEnumValue : GPBMessage
 @interface GPBEnumValue : GPBMessage
 
 
-// Enum value name.
+/// Enum value name.
 @property(nonatomic, readwrite, copy, null_resettable) NSString *name;
 @property(nonatomic, readwrite, copy, null_resettable) NSString *name;
 
 
-// Enum value number.
+/// Enum value number.
 @property(nonatomic, readwrite) int32_t number;
 @property(nonatomic, readwrite) int32_t number;
 
 
-// Protocol buffer options.
+/// Protocol buffer options.
 @property(nonatomic, readwrite, strong, null_resettable) NSMutableArray<GPBOption*> *optionsArray;
 @property(nonatomic, readwrite, strong, null_resettable) NSMutableArray<GPBOption*> *optionsArray;
+/// The number of items in @c optionsArray without causing the array to be created.
 @property(nonatomic, readonly) NSUInteger optionsArray_Count;
 @property(nonatomic, readonly) NSUInteger optionsArray_Count;
 
 
 @end
 @end
@@ -301,16 +347,17 @@ typedef GPB_ENUM(GPBOption_FieldNumber) {
   GPBOption_FieldNumber_Value = 2,
   GPBOption_FieldNumber_Value = 2,
 };
 };
 
 
-// A protocol buffer option, which can be attached to a message, field,
-// enumeration, etc.
+/// A protocol buffer option, which can be attached to a message, field,
+/// enumeration, etc.
 @interface GPBOption : GPBMessage
 @interface GPBOption : GPBMessage
 
 
-// The option's name. For example, `"java_package"`.
+/// The option's name. For example, `"java_package"`.
 @property(nonatomic, readwrite, copy, null_resettable) NSString *name;
 @property(nonatomic, readwrite, copy, null_resettable) NSString *name;
 
 
-// The option's value. For example, `"com.google.protobuf"`.
-@property(nonatomic, readwrite) BOOL hasValue;
+/// The option's value. For example, `"com.google.protobuf"`.
 @property(nonatomic, readwrite, strong, null_resettable) GPBAny *value;
 @property(nonatomic, readwrite, strong, null_resettable) GPBAny *value;
+/// Test to see if @c value has been set.
+@property(nonatomic, readwrite) BOOL hasValue;
 
 
 @end
 @end
 
 

+ 138 - 199
objectivec/google/protobuf/Type.pbobjc.m

@@ -45,14 +45,21 @@ static GPBFileDescriptor *GPBTypeRoot_FileDescriptor(void) {
 GPBEnumDescriptor *GPBSyntax_EnumDescriptor(void) {
 GPBEnumDescriptor *GPBSyntax_EnumDescriptor(void) {
   static GPBEnumDescriptor *descriptor = NULL;
   static GPBEnumDescriptor *descriptor = NULL;
   if (!descriptor) {
   if (!descriptor) {
-    static GPBMessageEnumValueDescription values[] = {
-      { .name = "SyntaxProto2", .number = GPBSyntax_SyntaxProto2 },
-      { .name = "SyntaxProto3", .number = GPBSyntax_SyntaxProto3 },
+    static const char *valueNames =
+        "SyntaxProto2\000SyntaxProto3\000";
+    static const int32_t values[] = {
+        GPBSyntax_SyntaxProto2,
+        GPBSyntax_SyntaxProto3,
     };
     };
-    descriptor = [GPBEnumDescriptor allocDescriptorForName:GPBNSStringifySymbol(GPBSyntax)
-                                                   values:values
-                                               valueCount:sizeof(values) / sizeof(GPBMessageEnumValueDescription)
-                                             enumVerifier:GPBSyntax_IsValidValue];
+    GPBEnumDescriptor *worker =
+        [GPBEnumDescriptor allocDescriptorForName:GPBNSStringifySymbol(GPBSyntax)
+                                       valueNames:valueNames
+                                           values:values
+                                            count:(uint32_t)(sizeof(values) / sizeof(int32_t))
+                                     enumVerifier:GPBSyntax_IsValidValue];
+    if (!OSAtomicCompareAndSwapPtrBarrier(nil, worker, (void * volatile *)&descriptor)) {
+      [worker release];
+    }
   }
   }
   return descriptor;
   return descriptor;
 }
 }
@@ -96,69 +103,57 @@ typedef struct GPBType__storage_ {
     static GPBMessageFieldDescription fields[] = {
     static GPBMessageFieldDescription fields[] = {
       {
       {
         .name = "name",
         .name = "name",
+        .dataTypeSpecific.className = NULL,
         .number = GPBType_FieldNumber_Name,
         .number = GPBType_FieldNumber_Name,
         .hasIndex = 0,
         .hasIndex = 0,
+        .offset = (uint32_t)offsetof(GPBType__storage_, name),
         .flags = GPBFieldOptional,
         .flags = GPBFieldOptional,
         .dataType = GPBDataTypeString,
         .dataType = GPBDataTypeString,
-        .offset = offsetof(GPBType__storage_, name),
-        .defaultValue.valueString = nil,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
       },
       },
       {
       {
         .name = "fieldsArray",
         .name = "fieldsArray",
+        .dataTypeSpecific.className = GPBStringifySymbol(GPBField),
         .number = GPBType_FieldNumber_FieldsArray,
         .number = GPBType_FieldNumber_FieldsArray,
         .hasIndex = GPBNoHasBit,
         .hasIndex = GPBNoHasBit,
+        .offset = (uint32_t)offsetof(GPBType__storage_, fieldsArray),
         .flags = GPBFieldRepeated,
         .flags = GPBFieldRepeated,
         .dataType = GPBDataTypeMessage,
         .dataType = GPBDataTypeMessage,
-        .offset = offsetof(GPBType__storage_, fieldsArray),
-        .defaultValue.valueMessage = nil,
-        .dataTypeSpecific.className = GPBStringifySymbol(GPBField),
-        .fieldOptions = NULL,
       },
       },
       {
       {
         .name = "oneofsArray",
         .name = "oneofsArray",
+        .dataTypeSpecific.className = NULL,
         .number = GPBType_FieldNumber_OneofsArray,
         .number = GPBType_FieldNumber_OneofsArray,
         .hasIndex = GPBNoHasBit,
         .hasIndex = GPBNoHasBit,
+        .offset = (uint32_t)offsetof(GPBType__storage_, oneofsArray),
         .flags = GPBFieldRepeated,
         .flags = GPBFieldRepeated,
         .dataType = GPBDataTypeString,
         .dataType = GPBDataTypeString,
-        .offset = offsetof(GPBType__storage_, oneofsArray),
-        .defaultValue.valueMessage = nil,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
       },
       },
       {
       {
         .name = "optionsArray",
         .name = "optionsArray",
+        .dataTypeSpecific.className = GPBStringifySymbol(GPBOption),
         .number = GPBType_FieldNumber_OptionsArray,
         .number = GPBType_FieldNumber_OptionsArray,
         .hasIndex = GPBNoHasBit,
         .hasIndex = GPBNoHasBit,
+        .offset = (uint32_t)offsetof(GPBType__storage_, optionsArray),
         .flags = GPBFieldRepeated,
         .flags = GPBFieldRepeated,
         .dataType = GPBDataTypeMessage,
         .dataType = GPBDataTypeMessage,
-        .offset = offsetof(GPBType__storage_, optionsArray),
-        .defaultValue.valueMessage = nil,
-        .dataTypeSpecific.className = GPBStringifySymbol(GPBOption),
-        .fieldOptions = NULL,
       },
       },
       {
       {
         .name = "sourceContext",
         .name = "sourceContext",
+        .dataTypeSpecific.className = GPBStringifySymbol(GPBSourceContext),
         .number = GPBType_FieldNumber_SourceContext,
         .number = GPBType_FieldNumber_SourceContext,
-        .hasIndex = 4,
+        .hasIndex = 1,
+        .offset = (uint32_t)offsetof(GPBType__storage_, sourceContext),
         .flags = GPBFieldOptional,
         .flags = GPBFieldOptional,
         .dataType = GPBDataTypeMessage,
         .dataType = GPBDataTypeMessage,
-        .offset = offsetof(GPBType__storage_, sourceContext),
-        .defaultValue.valueMessage = nil,
-        .dataTypeSpecific.className = GPBStringifySymbol(GPBSourceContext),
-        .fieldOptions = NULL,
       },
       },
       {
       {
         .name = "syntax",
         .name = "syntax",
+        .dataTypeSpecific.enumDescFunc = GPBSyntax_EnumDescriptor,
         .number = GPBType_FieldNumber_Syntax,
         .number = GPBType_FieldNumber_Syntax,
-        .hasIndex = 5,
+        .hasIndex = 2,
+        .offset = (uint32_t)offsetof(GPBType__storage_, syntax),
         .flags = GPBFieldOptional | GPBFieldHasEnumDescriptor,
         .flags = GPBFieldOptional | GPBFieldHasEnumDescriptor,
         .dataType = GPBDataTypeEnum,
         .dataType = GPBDataTypeEnum,
-        .offset = offsetof(GPBType__storage_, syntax),
-        .defaultValue.valueEnum = GPBSyntax_SyntaxProto2,
-        .dataTypeSpecific.enumDescFunc = GPBSyntax_EnumDescriptor,
-        .fieldOptions = NULL,
       },
       },
     };
     };
     GPBDescriptor *localDescriptor =
     GPBDescriptor *localDescriptor =
@@ -166,15 +161,9 @@ typedef struct GPBType__storage_ {
                                      rootClass:[GPBTypeRoot class]
                                      rootClass:[GPBTypeRoot class]
                                           file:GPBTypeRoot_FileDescriptor()
                                           file:GPBTypeRoot_FileDescriptor()
                                         fields:fields
                                         fields:fields
-                                    fieldCount:sizeof(fields) / sizeof(GPBMessageFieldDescription)
-                                        oneofs:NULL
-                                    oneofCount:0
-                                         enums:NULL
-                                     enumCount:0
-                                        ranges:NULL
-                                    rangeCount:0
+                                    fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription))
                                    storageSize:sizeof(GPBType__storage_)
                                    storageSize:sizeof(GPBType__storage_)
-                                    wireFormat:NO];
+                                         flags:0];
     NSAssert(descriptor == nil, @"Startup recursed!");
     NSAssert(descriptor == nil, @"Startup recursed!");
     descriptor = localDescriptor;
     descriptor = localDescriptor;
   }
   }
@@ -212,7 +201,6 @@ void SetGPBType_Syntax_RawValue(GPBType *message, int32_t value) {
 
 
 typedef struct GPBField__storage_ {
 typedef struct GPBField__storage_ {
   uint32_t _has_storage_[1];
   uint32_t _has_storage_[1];
-  BOOL packed;
   GPBField_Kind kind;
   GPBField_Kind kind;
   GPBField_Cardinality cardinality;
   GPBField_Cardinality cardinality;
   int32_t number;
   int32_t number;
@@ -232,139 +220,108 @@ typedef struct GPBField__storage_ {
     static GPBMessageFieldDescription fields[] = {
     static GPBMessageFieldDescription fields[] = {
       {
       {
         .name = "kind",
         .name = "kind",
+        .dataTypeSpecific.enumDescFunc = GPBField_Kind_EnumDescriptor,
         .number = GPBField_FieldNumber_Kind,
         .number = GPBField_FieldNumber_Kind,
         .hasIndex = 0,
         .hasIndex = 0,
+        .offset = (uint32_t)offsetof(GPBField__storage_, kind),
         .flags = GPBFieldOptional | GPBFieldHasEnumDescriptor,
         .flags = GPBFieldOptional | GPBFieldHasEnumDescriptor,
         .dataType = GPBDataTypeEnum,
         .dataType = GPBDataTypeEnum,
-        .offset = offsetof(GPBField__storage_, kind),
-        .defaultValue.valueEnum = GPBField_Kind_TypeUnknown,
-        .dataTypeSpecific.enumDescFunc = GPBField_Kind_EnumDescriptor,
-        .fieldOptions = NULL,
       },
       },
       {
       {
         .name = "cardinality",
         .name = "cardinality",
+        .dataTypeSpecific.enumDescFunc = GPBField_Cardinality_EnumDescriptor,
         .number = GPBField_FieldNumber_Cardinality,
         .number = GPBField_FieldNumber_Cardinality,
         .hasIndex = 1,
         .hasIndex = 1,
+        .offset = (uint32_t)offsetof(GPBField__storage_, cardinality),
         .flags = GPBFieldOptional | GPBFieldHasEnumDescriptor,
         .flags = GPBFieldOptional | GPBFieldHasEnumDescriptor,
         .dataType = GPBDataTypeEnum,
         .dataType = GPBDataTypeEnum,
-        .offset = offsetof(GPBField__storage_, cardinality),
-        .defaultValue.valueEnum = GPBField_Cardinality_CardinalityUnknown,
-        .dataTypeSpecific.enumDescFunc = GPBField_Cardinality_EnumDescriptor,
-        .fieldOptions = NULL,
       },
       },
       {
       {
         .name = "number",
         .name = "number",
+        .dataTypeSpecific.className = NULL,
         .number = GPBField_FieldNumber_Number,
         .number = GPBField_FieldNumber_Number,
         .hasIndex = 2,
         .hasIndex = 2,
+        .offset = (uint32_t)offsetof(GPBField__storage_, number),
         .flags = GPBFieldOptional,
         .flags = GPBFieldOptional,
         .dataType = GPBDataTypeInt32,
         .dataType = GPBDataTypeInt32,
-        .offset = offsetof(GPBField__storage_, number),
-        .defaultValue.valueInt32 = 0,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
       },
       },
       {
       {
         .name = "name",
         .name = "name",
+        .dataTypeSpecific.className = NULL,
         .number = GPBField_FieldNumber_Name,
         .number = GPBField_FieldNumber_Name,
         .hasIndex = 3,
         .hasIndex = 3,
+        .offset = (uint32_t)offsetof(GPBField__storage_, name),
         .flags = GPBFieldOptional,
         .flags = GPBFieldOptional,
         .dataType = GPBDataTypeString,
         .dataType = GPBDataTypeString,
-        .offset = offsetof(GPBField__storage_, name),
-        .defaultValue.valueString = nil,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
       },
       },
       {
       {
         .name = "typeURL",
         .name = "typeURL",
+        .dataTypeSpecific.className = NULL,
         .number = GPBField_FieldNumber_TypeURL,
         .number = GPBField_FieldNumber_TypeURL,
         .hasIndex = 4,
         .hasIndex = 4,
+        .offset = (uint32_t)offsetof(GPBField__storage_, typeURL),
         .flags = GPBFieldOptional | GPBFieldTextFormatNameCustom,
         .flags = GPBFieldOptional | GPBFieldTextFormatNameCustom,
         .dataType = GPBDataTypeString,
         .dataType = GPBDataTypeString,
-        .offset = offsetof(GPBField__storage_, typeURL),
-        .defaultValue.valueString = nil,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
       },
       },
       {
       {
         .name = "oneofIndex",
         .name = "oneofIndex",
+        .dataTypeSpecific.className = NULL,
         .number = GPBField_FieldNumber_OneofIndex,
         .number = GPBField_FieldNumber_OneofIndex,
         .hasIndex = 5,
         .hasIndex = 5,
+        .offset = (uint32_t)offsetof(GPBField__storage_, oneofIndex),
         .flags = GPBFieldOptional,
         .flags = GPBFieldOptional,
         .dataType = GPBDataTypeInt32,
         .dataType = GPBDataTypeInt32,
-        .offset = offsetof(GPBField__storage_, oneofIndex),
-        .defaultValue.valueInt32 = 0,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
       },
       },
       {
       {
         .name = "packed",
         .name = "packed",
+        .dataTypeSpecific.className = NULL,
         .number = GPBField_FieldNumber_Packed,
         .number = GPBField_FieldNumber_Packed,
         .hasIndex = 6,
         .hasIndex = 6,
+        .offset = 7,  // Stored in _has_storage_ to save space.
         .flags = GPBFieldOptional,
         .flags = GPBFieldOptional,
         .dataType = GPBDataTypeBool,
         .dataType = GPBDataTypeBool,
-        .offset = offsetof(GPBField__storage_, packed),
-        .defaultValue.valueBool = NO,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
       },
       },
       {
       {
         .name = "optionsArray",
         .name = "optionsArray",
+        .dataTypeSpecific.className = GPBStringifySymbol(GPBOption),
         .number = GPBField_FieldNumber_OptionsArray,
         .number = GPBField_FieldNumber_OptionsArray,
         .hasIndex = GPBNoHasBit,
         .hasIndex = GPBNoHasBit,
+        .offset = (uint32_t)offsetof(GPBField__storage_, optionsArray),
         .flags = GPBFieldRepeated,
         .flags = GPBFieldRepeated,
         .dataType = GPBDataTypeMessage,
         .dataType = GPBDataTypeMessage,
-        .offset = offsetof(GPBField__storage_, optionsArray),
-        .defaultValue.valueMessage = nil,
-        .dataTypeSpecific.className = GPBStringifySymbol(GPBOption),
-        .fieldOptions = NULL,
       },
       },
       {
       {
         .name = "jsonName",
         .name = "jsonName",
+        .dataTypeSpecific.className = NULL,
         .number = GPBField_FieldNumber_JsonName,
         .number = GPBField_FieldNumber_JsonName,
         .hasIndex = 8,
         .hasIndex = 8,
+        .offset = (uint32_t)offsetof(GPBField__storage_, jsonName),
         .flags = GPBFieldOptional,
         .flags = GPBFieldOptional,
         .dataType = GPBDataTypeString,
         .dataType = GPBDataTypeString,
-        .offset = offsetof(GPBField__storage_, jsonName),
-        .defaultValue.valueString = nil,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
       },
       },
       {
       {
         .name = "defaultValue",
         .name = "defaultValue",
+        .dataTypeSpecific.className = NULL,
         .number = GPBField_FieldNumber_DefaultValue,
         .number = GPBField_FieldNumber_DefaultValue,
         .hasIndex = 9,
         .hasIndex = 9,
+        .offset = (uint32_t)offsetof(GPBField__storage_, defaultValue),
         .flags = GPBFieldOptional,
         .flags = GPBFieldOptional,
         .dataType = GPBDataTypeString,
         .dataType = GPBDataTypeString,
-        .offset = offsetof(GPBField__storage_, defaultValue),
-        .defaultValue.valueString = nil,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
       },
       },
     };
     };
-    static GPBMessageEnumDescription enums[] = {
-      { .enumDescriptorFunc = GPBField_Kind_EnumDescriptor },
-      { .enumDescriptorFunc = GPBField_Cardinality_EnumDescriptor },
-    };
-#if GPBOBJC_SKIP_MESSAGE_TEXTFORMAT_EXTRAS
-    const char *extraTextFormatInfo = NULL;
-#else
-    static const char *extraTextFormatInfo = "\001\006\004\241!!\000";
-#endif  // GPBOBJC_SKIP_MESSAGE_TEXTFORMAT_EXTRAS
     GPBDescriptor *localDescriptor =
     GPBDescriptor *localDescriptor =
         [GPBDescriptor allocDescriptorForClass:[GPBField class]
         [GPBDescriptor allocDescriptorForClass:[GPBField class]
                                      rootClass:[GPBTypeRoot class]
                                      rootClass:[GPBTypeRoot class]
                                           file:GPBTypeRoot_FileDescriptor()
                                           file:GPBTypeRoot_FileDescriptor()
                                         fields:fields
                                         fields:fields
-                                    fieldCount:sizeof(fields) / sizeof(GPBMessageFieldDescription)
-                                        oneofs:NULL
-                                    oneofCount:0
-                                         enums:enums
-                                     enumCount:sizeof(enums) / sizeof(GPBMessageEnumDescription)
-                                        ranges:NULL
-                                    rangeCount:0
+                                    fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription))
                                    storageSize:sizeof(GPBField__storage_)
                                    storageSize:sizeof(GPBField__storage_)
-                                    wireFormat:NO
-                           extraTextFormatInfo:extraTextFormatInfo];
+                                         flags:0];
+#if !GPBOBJC_SKIP_MESSAGE_TEXTFORMAT_EXTRAS
+    static const char *extraTextFormatInfo =
+        "\001\006\004\241!!\000";
+    [localDescriptor setupExtraTextInfo:extraTextFormatInfo];
+#endif  // !GPBOBJC_SKIP_MESSAGE_TEXTFORMAT_EXTRAS
     NSAssert(descriptor == nil, @"Startup recursed!");
     NSAssert(descriptor == nil, @"Startup recursed!");
     descriptor = localDescriptor;
     descriptor = localDescriptor;
   }
   }
@@ -402,31 +359,43 @@ void SetGPBField_Cardinality_RawValue(GPBField *message, int32_t value) {
 GPBEnumDescriptor *GPBField_Kind_EnumDescriptor(void) {
 GPBEnumDescriptor *GPBField_Kind_EnumDescriptor(void) {
   static GPBEnumDescriptor *descriptor = NULL;
   static GPBEnumDescriptor *descriptor = NULL;
   if (!descriptor) {
   if (!descriptor) {
-    static GPBMessageEnumValueDescription values[] = {
-      { .name = "TypeUnknown", .number = GPBField_Kind_TypeUnknown },
-      { .name = "TypeDouble", .number = GPBField_Kind_TypeDouble },
-      { .name = "TypeFloat", .number = GPBField_Kind_TypeFloat },
-      { .name = "TypeInt64", .number = GPBField_Kind_TypeInt64 },
-      { .name = "TypeUint64", .number = GPBField_Kind_TypeUint64 },
-      { .name = "TypeInt32", .number = GPBField_Kind_TypeInt32 },
-      { .name = "TypeFixed64", .number = GPBField_Kind_TypeFixed64 },
-      { .name = "TypeFixed32", .number = GPBField_Kind_TypeFixed32 },
-      { .name = "TypeBool", .number = GPBField_Kind_TypeBool },
-      { .name = "TypeString", .number = GPBField_Kind_TypeString },
-      { .name = "TypeGroup", .number = GPBField_Kind_TypeGroup },
-      { .name = "TypeMessage", .number = GPBField_Kind_TypeMessage },
-      { .name = "TypeBytes", .number = GPBField_Kind_TypeBytes },
-      { .name = "TypeUint32", .number = GPBField_Kind_TypeUint32 },
-      { .name = "TypeEnum", .number = GPBField_Kind_TypeEnum },
-      { .name = "TypeSfixed32", .number = GPBField_Kind_TypeSfixed32 },
-      { .name = "TypeSfixed64", .number = GPBField_Kind_TypeSfixed64 },
-      { .name = "TypeSint32", .number = GPBField_Kind_TypeSint32 },
-      { .name = "TypeSint64", .number = GPBField_Kind_TypeSint64 },
+    static const char *valueNames =
+        "TypeUnknown\000TypeDouble\000TypeFloat\000TypeInt"
+        "64\000TypeUint64\000TypeInt32\000TypeFixed64\000Type"
+        "Fixed32\000TypeBool\000TypeString\000TypeGroup\000Ty"
+        "peMessage\000TypeBytes\000TypeUint32\000TypeEnum\000"
+        "TypeSfixed32\000TypeSfixed64\000TypeSint32\000Typ"
+        "eSint64\000";
+    static const int32_t values[] = {
+        GPBField_Kind_TypeUnknown,
+        GPBField_Kind_TypeDouble,
+        GPBField_Kind_TypeFloat,
+        GPBField_Kind_TypeInt64,
+        GPBField_Kind_TypeUint64,
+        GPBField_Kind_TypeInt32,
+        GPBField_Kind_TypeFixed64,
+        GPBField_Kind_TypeFixed32,
+        GPBField_Kind_TypeBool,
+        GPBField_Kind_TypeString,
+        GPBField_Kind_TypeGroup,
+        GPBField_Kind_TypeMessage,
+        GPBField_Kind_TypeBytes,
+        GPBField_Kind_TypeUint32,
+        GPBField_Kind_TypeEnum,
+        GPBField_Kind_TypeSfixed32,
+        GPBField_Kind_TypeSfixed64,
+        GPBField_Kind_TypeSint32,
+        GPBField_Kind_TypeSint64,
     };
     };
-    descriptor = [GPBEnumDescriptor allocDescriptorForName:GPBNSStringifySymbol(GPBField_Kind)
-                                                   values:values
-                                               valueCount:sizeof(values) / sizeof(GPBMessageEnumValueDescription)
-                                             enumVerifier:GPBField_Kind_IsValidValue];
+    GPBEnumDescriptor *worker =
+        [GPBEnumDescriptor allocDescriptorForName:GPBNSStringifySymbol(GPBField_Kind)
+                                       valueNames:valueNames
+                                           values:values
+                                            count:(uint32_t)(sizeof(values) / sizeof(int32_t))
+                                     enumVerifier:GPBField_Kind_IsValidValue];
+    if (!OSAtomicCompareAndSwapPtrBarrier(nil, worker, (void * volatile *)&descriptor)) {
+      [worker release];
+    }
   }
   }
   return descriptor;
   return descriptor;
 }
 }
@@ -463,16 +432,24 @@ BOOL GPBField_Kind_IsValidValue(int32_t value__) {
 GPBEnumDescriptor *GPBField_Cardinality_EnumDescriptor(void) {
 GPBEnumDescriptor *GPBField_Cardinality_EnumDescriptor(void) {
   static GPBEnumDescriptor *descriptor = NULL;
   static GPBEnumDescriptor *descriptor = NULL;
   if (!descriptor) {
   if (!descriptor) {
-    static GPBMessageEnumValueDescription values[] = {
-      { .name = "CardinalityUnknown", .number = GPBField_Cardinality_CardinalityUnknown },
-      { .name = "CardinalityOptional", .number = GPBField_Cardinality_CardinalityOptional },
-      { .name = "CardinalityRequired", .number = GPBField_Cardinality_CardinalityRequired },
-      { .name = "CardinalityRepeated", .number = GPBField_Cardinality_CardinalityRepeated },
+    static const char *valueNames =
+        "CardinalityUnknown\000CardinalityOptional\000C"
+        "ardinalityRequired\000CardinalityRepeated\000";
+    static const int32_t values[] = {
+        GPBField_Cardinality_CardinalityUnknown,
+        GPBField_Cardinality_CardinalityOptional,
+        GPBField_Cardinality_CardinalityRequired,
+        GPBField_Cardinality_CardinalityRepeated,
     };
     };
-    descriptor = [GPBEnumDescriptor allocDescriptorForName:GPBNSStringifySymbol(GPBField_Cardinality)
-                                                   values:values
-                                               valueCount:sizeof(values) / sizeof(GPBMessageEnumValueDescription)
-                                             enumVerifier:GPBField_Cardinality_IsValidValue];
+    GPBEnumDescriptor *worker =
+        [GPBEnumDescriptor allocDescriptorForName:GPBNSStringifySymbol(GPBField_Cardinality)
+                                       valueNames:valueNames
+                                           values:values
+                                            count:(uint32_t)(sizeof(values) / sizeof(int32_t))
+                                     enumVerifier:GPBField_Cardinality_IsValidValue];
+    if (!OSAtomicCompareAndSwapPtrBarrier(nil, worker, (void * volatile *)&descriptor)) {
+      [worker release];
+    }
   }
   }
   return descriptor;
   return descriptor;
 }
 }
@@ -516,58 +493,48 @@ typedef struct GPBEnum__storage_ {
     static GPBMessageFieldDescription fields[] = {
     static GPBMessageFieldDescription fields[] = {
       {
       {
         .name = "name",
         .name = "name",
+        .dataTypeSpecific.className = NULL,
         .number = GPBEnum_FieldNumber_Name,
         .number = GPBEnum_FieldNumber_Name,
         .hasIndex = 0,
         .hasIndex = 0,
+        .offset = (uint32_t)offsetof(GPBEnum__storage_, name),
         .flags = GPBFieldOptional,
         .flags = GPBFieldOptional,
         .dataType = GPBDataTypeString,
         .dataType = GPBDataTypeString,
-        .offset = offsetof(GPBEnum__storage_, name),
-        .defaultValue.valueString = nil,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
       },
       },
       {
       {
         .name = "enumvalueArray",
         .name = "enumvalueArray",
+        .dataTypeSpecific.className = GPBStringifySymbol(GPBEnumValue),
         .number = GPBEnum_FieldNumber_EnumvalueArray,
         .number = GPBEnum_FieldNumber_EnumvalueArray,
         .hasIndex = GPBNoHasBit,
         .hasIndex = GPBNoHasBit,
+        .offset = (uint32_t)offsetof(GPBEnum__storage_, enumvalueArray),
         .flags = GPBFieldRepeated,
         .flags = GPBFieldRepeated,
         .dataType = GPBDataTypeMessage,
         .dataType = GPBDataTypeMessage,
-        .offset = offsetof(GPBEnum__storage_, enumvalueArray),
-        .defaultValue.valueMessage = nil,
-        .dataTypeSpecific.className = GPBStringifySymbol(GPBEnumValue),
-        .fieldOptions = NULL,
       },
       },
       {
       {
         .name = "optionsArray",
         .name = "optionsArray",
+        .dataTypeSpecific.className = GPBStringifySymbol(GPBOption),
         .number = GPBEnum_FieldNumber_OptionsArray,
         .number = GPBEnum_FieldNumber_OptionsArray,
         .hasIndex = GPBNoHasBit,
         .hasIndex = GPBNoHasBit,
+        .offset = (uint32_t)offsetof(GPBEnum__storage_, optionsArray),
         .flags = GPBFieldRepeated,
         .flags = GPBFieldRepeated,
         .dataType = GPBDataTypeMessage,
         .dataType = GPBDataTypeMessage,
-        .offset = offsetof(GPBEnum__storage_, optionsArray),
-        .defaultValue.valueMessage = nil,
-        .dataTypeSpecific.className = GPBStringifySymbol(GPBOption),
-        .fieldOptions = NULL,
       },
       },
       {
       {
         .name = "sourceContext",
         .name = "sourceContext",
+        .dataTypeSpecific.className = GPBStringifySymbol(GPBSourceContext),
         .number = GPBEnum_FieldNumber_SourceContext,
         .number = GPBEnum_FieldNumber_SourceContext,
-        .hasIndex = 3,
+        .hasIndex = 1,
+        .offset = (uint32_t)offsetof(GPBEnum__storage_, sourceContext),
         .flags = GPBFieldOptional,
         .flags = GPBFieldOptional,
         .dataType = GPBDataTypeMessage,
         .dataType = GPBDataTypeMessage,
-        .offset = offsetof(GPBEnum__storage_, sourceContext),
-        .defaultValue.valueMessage = nil,
-        .dataTypeSpecific.className = GPBStringifySymbol(GPBSourceContext),
-        .fieldOptions = NULL,
       },
       },
       {
       {
         .name = "syntax",
         .name = "syntax",
+        .dataTypeSpecific.enumDescFunc = GPBSyntax_EnumDescriptor,
         .number = GPBEnum_FieldNumber_Syntax,
         .number = GPBEnum_FieldNumber_Syntax,
-        .hasIndex = 4,
+        .hasIndex = 2,
+        .offset = (uint32_t)offsetof(GPBEnum__storage_, syntax),
         .flags = GPBFieldOptional | GPBFieldHasEnumDescriptor,
         .flags = GPBFieldOptional | GPBFieldHasEnumDescriptor,
         .dataType = GPBDataTypeEnum,
         .dataType = GPBDataTypeEnum,
-        .offset = offsetof(GPBEnum__storage_, syntax),
-        .defaultValue.valueEnum = GPBSyntax_SyntaxProto2,
-        .dataTypeSpecific.enumDescFunc = GPBSyntax_EnumDescriptor,
-        .fieldOptions = NULL,
       },
       },
     };
     };
     GPBDescriptor *localDescriptor =
     GPBDescriptor *localDescriptor =
@@ -575,15 +542,9 @@ typedef struct GPBEnum__storage_ {
                                      rootClass:[GPBTypeRoot class]
                                      rootClass:[GPBTypeRoot class]
                                           file:GPBTypeRoot_FileDescriptor()
                                           file:GPBTypeRoot_FileDescriptor()
                                         fields:fields
                                         fields:fields
-                                    fieldCount:sizeof(fields) / sizeof(GPBMessageFieldDescription)
-                                        oneofs:NULL
-                                    oneofCount:0
-                                         enums:NULL
-                                     enumCount:0
-                                        ranges:NULL
-                                    rangeCount:0
+                                    fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription))
                                    storageSize:sizeof(GPBEnum__storage_)
                                    storageSize:sizeof(GPBEnum__storage_)
-                                    wireFormat:NO];
+                                         flags:0];
     NSAssert(descriptor == nil, @"Startup recursed!");
     NSAssert(descriptor == nil, @"Startup recursed!");
     descriptor = localDescriptor;
     descriptor = localDescriptor;
   }
   }
@@ -627,36 +588,30 @@ typedef struct GPBEnumValue__storage_ {
     static GPBMessageFieldDescription fields[] = {
     static GPBMessageFieldDescription fields[] = {
       {
       {
         .name = "name",
         .name = "name",
+        .dataTypeSpecific.className = NULL,
         .number = GPBEnumValue_FieldNumber_Name,
         .number = GPBEnumValue_FieldNumber_Name,
         .hasIndex = 0,
         .hasIndex = 0,
+        .offset = (uint32_t)offsetof(GPBEnumValue__storage_, name),
         .flags = GPBFieldOptional,
         .flags = GPBFieldOptional,
         .dataType = GPBDataTypeString,
         .dataType = GPBDataTypeString,
-        .offset = offsetof(GPBEnumValue__storage_, name),
-        .defaultValue.valueString = nil,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
       },
       },
       {
       {
         .name = "number",
         .name = "number",
+        .dataTypeSpecific.className = NULL,
         .number = GPBEnumValue_FieldNumber_Number,
         .number = GPBEnumValue_FieldNumber_Number,
         .hasIndex = 1,
         .hasIndex = 1,
+        .offset = (uint32_t)offsetof(GPBEnumValue__storage_, number),
         .flags = GPBFieldOptional,
         .flags = GPBFieldOptional,
         .dataType = GPBDataTypeInt32,
         .dataType = GPBDataTypeInt32,
-        .offset = offsetof(GPBEnumValue__storage_, number),
-        .defaultValue.valueInt32 = 0,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
       },
       },
       {
       {
         .name = "optionsArray",
         .name = "optionsArray",
+        .dataTypeSpecific.className = GPBStringifySymbol(GPBOption),
         .number = GPBEnumValue_FieldNumber_OptionsArray,
         .number = GPBEnumValue_FieldNumber_OptionsArray,
         .hasIndex = GPBNoHasBit,
         .hasIndex = GPBNoHasBit,
+        .offset = (uint32_t)offsetof(GPBEnumValue__storage_, optionsArray),
         .flags = GPBFieldRepeated,
         .flags = GPBFieldRepeated,
         .dataType = GPBDataTypeMessage,
         .dataType = GPBDataTypeMessage,
-        .offset = offsetof(GPBEnumValue__storage_, optionsArray),
-        .defaultValue.valueMessage = nil,
-        .dataTypeSpecific.className = GPBStringifySymbol(GPBOption),
-        .fieldOptions = NULL,
       },
       },
     };
     };
     GPBDescriptor *localDescriptor =
     GPBDescriptor *localDescriptor =
@@ -664,15 +619,9 @@ typedef struct GPBEnumValue__storage_ {
                                      rootClass:[GPBTypeRoot class]
                                      rootClass:[GPBTypeRoot class]
                                           file:GPBTypeRoot_FileDescriptor()
                                           file:GPBTypeRoot_FileDescriptor()
                                         fields:fields
                                         fields:fields
-                                    fieldCount:sizeof(fields) / sizeof(GPBMessageFieldDescription)
-                                        oneofs:NULL
-                                    oneofCount:0
-                                         enums:NULL
-                                     enumCount:0
-                                        ranges:NULL
-                                    rangeCount:0
+                                    fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription))
                                    storageSize:sizeof(GPBEnumValue__storage_)
                                    storageSize:sizeof(GPBEnumValue__storage_)
-                                    wireFormat:NO];
+                                         flags:0];
     NSAssert(descriptor == nil, @"Startup recursed!");
     NSAssert(descriptor == nil, @"Startup recursed!");
     descriptor = localDescriptor;
     descriptor = localDescriptor;
   }
   }
@@ -702,25 +651,21 @@ typedef struct GPBOption__storage_ {
     static GPBMessageFieldDescription fields[] = {
     static GPBMessageFieldDescription fields[] = {
       {
       {
         .name = "name",
         .name = "name",
+        .dataTypeSpecific.className = NULL,
         .number = GPBOption_FieldNumber_Name,
         .number = GPBOption_FieldNumber_Name,
         .hasIndex = 0,
         .hasIndex = 0,
+        .offset = (uint32_t)offsetof(GPBOption__storage_, name),
         .flags = GPBFieldOptional,
         .flags = GPBFieldOptional,
         .dataType = GPBDataTypeString,
         .dataType = GPBDataTypeString,
-        .offset = offsetof(GPBOption__storage_, name),
-        .defaultValue.valueString = nil,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
       },
       },
       {
       {
         .name = "value",
         .name = "value",
+        .dataTypeSpecific.className = GPBStringifySymbol(GPBAny),
         .number = GPBOption_FieldNumber_Value,
         .number = GPBOption_FieldNumber_Value,
         .hasIndex = 1,
         .hasIndex = 1,
+        .offset = (uint32_t)offsetof(GPBOption__storage_, value),
         .flags = GPBFieldOptional,
         .flags = GPBFieldOptional,
         .dataType = GPBDataTypeMessage,
         .dataType = GPBDataTypeMessage,
-        .offset = offsetof(GPBOption__storage_, value),
-        .defaultValue.valueMessage = nil,
-        .dataTypeSpecific.className = GPBStringifySymbol(GPBAny),
-        .fieldOptions = NULL,
       },
       },
     };
     };
     GPBDescriptor *localDescriptor =
     GPBDescriptor *localDescriptor =
@@ -728,15 +673,9 @@ typedef struct GPBOption__storage_ {
                                      rootClass:[GPBTypeRoot class]
                                      rootClass:[GPBTypeRoot class]
                                           file:GPBTypeRoot_FileDescriptor()
                                           file:GPBTypeRoot_FileDescriptor()
                                         fields:fields
                                         fields:fields
-                                    fieldCount:sizeof(fields) / sizeof(GPBMessageFieldDescription)
-                                        oneofs:NULL
-                                    oneofCount:0
-                                         enums:NULL
-                                     enumCount:0
-                                        ranges:NULL
-                                    rangeCount:0
+                                    fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription))
                                    storageSize:sizeof(GPBOption__storage_)
                                    storageSize:sizeof(GPBOption__storage_)
-                                    wireFormat:NO];
+                                         flags:0];
     NSAssert(descriptor == nil, @"Startup recursed!");
     NSAssert(descriptor == nil, @"Startup recursed!");
     descriptor = localDescriptor;
     descriptor = localDescriptor;
   }
   }

+ 45 - 43
objectivec/google/protobuf/Wrappers.pbobjc.h

@@ -3,7 +3,7 @@
 
 
 #import "GPBProtocolBuffers.h"
 #import "GPBProtocolBuffers.h"
 
 
-#if GOOGLE_PROTOBUF_OBJC_GEN_VERSION != 30000
+#if GOOGLE_PROTOBUF_OBJC_GEN_VERSION != 30001
 #error This file was generated by a different version of protoc which is incompatible with your Protocol Buffer library sources.
 #error This file was generated by a different version of protoc which is incompatible with your Protocol Buffer library sources.
 #endif
 #endif
 
 
@@ -15,13 +15,15 @@ NS_ASSUME_NONNULL_BEGIN
 
 
 #pragma mark - GPBWrappersRoot
 #pragma mark - GPBWrappersRoot
 
 
+/// Exposes the extension registry for this file.
+///
+/// The base class provides:
+/// @code
+///   + (GPBExtensionRegistry *)extensionRegistry;
+/// @endcode
+/// which is a @c GPBExtensionRegistry that includes all the extensions defined by
+/// this file and all files that it depends on.
 @interface GPBWrappersRoot : GPBRootObject
 @interface GPBWrappersRoot : GPBRootObject
-
-// The base class provides:
-//   + (GPBExtensionRegistry *)extensionRegistry;
-// which is an GPBExtensionRegistry that includes all the extensions defined by
-// this file and all files that it depends on.
-
 @end
 @end
 
 
 #pragma mark - GPBDoubleValue
 #pragma mark - GPBDoubleValue
@@ -30,12 +32,12 @@ typedef GPB_ENUM(GPBDoubleValue_FieldNumber) {
   GPBDoubleValue_FieldNumber_Value = 1,
   GPBDoubleValue_FieldNumber_Value = 1,
 };
 };
 
 
-// Wrapper message for `double`.
-//
-// The JSON representation for `DoubleValue` is JSON number.
+/// Wrapper message for `double`.
+///
+/// The JSON representation for `DoubleValue` is JSON number.
 @interface GPBDoubleValue : GPBMessage
 @interface GPBDoubleValue : GPBMessage
 
 
-// The double value.
+/// The double value.
 @property(nonatomic, readwrite) double value;
 @property(nonatomic, readwrite) double value;
 
 
 @end
 @end
@@ -46,12 +48,12 @@ typedef GPB_ENUM(GPBFloatValue_FieldNumber) {
   GPBFloatValue_FieldNumber_Value = 1,
   GPBFloatValue_FieldNumber_Value = 1,
 };
 };
 
 
-// Wrapper message for `float`.
-//
-// The JSON representation for `FloatValue` is JSON number.
+/// Wrapper message for `float`.
+///
+/// The JSON representation for `FloatValue` is JSON number.
 @interface GPBFloatValue : GPBMessage
 @interface GPBFloatValue : GPBMessage
 
 
-// The float value.
+/// The float value.
 @property(nonatomic, readwrite) float value;
 @property(nonatomic, readwrite) float value;
 
 
 @end
 @end
@@ -62,12 +64,12 @@ typedef GPB_ENUM(GPBInt64Value_FieldNumber) {
   GPBInt64Value_FieldNumber_Value = 1,
   GPBInt64Value_FieldNumber_Value = 1,
 };
 };
 
 
-// Wrapper message for `int64`.
-//
-// The JSON representation for `Int64Value` is JSON string.
+/// Wrapper message for `int64`.
+///
+/// The JSON representation for `Int64Value` is JSON string.
 @interface GPBInt64Value : GPBMessage
 @interface GPBInt64Value : GPBMessage
 
 
-// The int64 value.
+/// The int64 value.
 @property(nonatomic, readwrite) int64_t value;
 @property(nonatomic, readwrite) int64_t value;
 
 
 @end
 @end
@@ -78,12 +80,12 @@ typedef GPB_ENUM(GPBUInt64Value_FieldNumber) {
   GPBUInt64Value_FieldNumber_Value = 1,
   GPBUInt64Value_FieldNumber_Value = 1,
 };
 };
 
 
-// Wrapper message for `uint64`.
-//
-// The JSON representation for `UInt64Value` is JSON string.
+/// Wrapper message for `uint64`.
+///
+/// The JSON representation for `UInt64Value` is JSON string.
 @interface GPBUInt64Value : GPBMessage
 @interface GPBUInt64Value : GPBMessage
 
 
-// The uint64 value.
+/// The uint64 value.
 @property(nonatomic, readwrite) uint64_t value;
 @property(nonatomic, readwrite) uint64_t value;
 
 
 @end
 @end
@@ -94,12 +96,12 @@ typedef GPB_ENUM(GPBInt32Value_FieldNumber) {
   GPBInt32Value_FieldNumber_Value = 1,
   GPBInt32Value_FieldNumber_Value = 1,
 };
 };
 
 
-// Wrapper message for `int32`.
-//
-// The JSON representation for `Int32Value` is JSON number.
+/// Wrapper message for `int32`.
+///
+/// The JSON representation for `Int32Value` is JSON number.
 @interface GPBInt32Value : GPBMessage
 @interface GPBInt32Value : GPBMessage
 
 
-// The int32 value.
+/// The int32 value.
 @property(nonatomic, readwrite) int32_t value;
 @property(nonatomic, readwrite) int32_t value;
 
 
 @end
 @end
@@ -110,12 +112,12 @@ typedef GPB_ENUM(GPBUInt32Value_FieldNumber) {
   GPBUInt32Value_FieldNumber_Value = 1,
   GPBUInt32Value_FieldNumber_Value = 1,
 };
 };
 
 
-// Wrapper message for `uint32`.
-//
-// The JSON representation for `UInt32Value` is JSON number.
+/// Wrapper message for `uint32`.
+///
+/// The JSON representation for `UInt32Value` is JSON number.
 @interface GPBUInt32Value : GPBMessage
 @interface GPBUInt32Value : GPBMessage
 
 
-// The uint32 value.
+/// The uint32 value.
 @property(nonatomic, readwrite) uint32_t value;
 @property(nonatomic, readwrite) uint32_t value;
 
 
 @end
 @end
@@ -126,12 +128,12 @@ typedef GPB_ENUM(GPBBoolValue_FieldNumber) {
   GPBBoolValue_FieldNumber_Value = 1,
   GPBBoolValue_FieldNumber_Value = 1,
 };
 };
 
 
-// Wrapper message for `bool`.
-//
-// The JSON representation for `BoolValue` is JSON `true` and `false`.
+/// Wrapper message for `bool`.
+///
+/// The JSON representation for `BoolValue` is JSON `true` and `false`.
 @interface GPBBoolValue : GPBMessage
 @interface GPBBoolValue : GPBMessage
 
 
-// The bool value.
+/// The bool value.
 @property(nonatomic, readwrite) BOOL value;
 @property(nonatomic, readwrite) BOOL value;
 
 
 @end
 @end
@@ -142,12 +144,12 @@ typedef GPB_ENUM(GPBStringValue_FieldNumber) {
   GPBStringValue_FieldNumber_Value = 1,
   GPBStringValue_FieldNumber_Value = 1,
 };
 };
 
 
-// Wrapper message for `string`.
-//
-// The JSON representation for `StringValue` is JSON string.
+/// Wrapper message for `string`.
+///
+/// The JSON representation for `StringValue` is JSON string.
 @interface GPBStringValue : GPBMessage
 @interface GPBStringValue : GPBMessage
 
 
-// The string value.
+/// The string value.
 @property(nonatomic, readwrite, copy, null_resettable) NSString *value;
 @property(nonatomic, readwrite, copy, null_resettable) NSString *value;
 
 
 @end
 @end
@@ -158,12 +160,12 @@ typedef GPB_ENUM(GPBBytesValue_FieldNumber) {
   GPBBytesValue_FieldNumber_Value = 1,
   GPBBytesValue_FieldNumber_Value = 1,
 };
 };
 
 
-// Wrapper message for `bytes`.
-//
-// The JSON representation for `BytesValue` is JSON string.
+/// Wrapper message for `bytes`.
+///
+/// The JSON representation for `BytesValue` is JSON string.
 @interface GPBBytesValue : GPBMessage
 @interface GPBBytesValue : GPBMessage
 
 
-// The bytes value.
+/// The bytes value.
 @property(nonatomic, readwrite, copy, null_resettable) NSData *value;
 @property(nonatomic, readwrite, copy, null_resettable) NSData *value;
 
 
 @end
 @end

+ 36 - 109
objectivec/google/protobuf/Wrappers.pbobjc.m

@@ -44,14 +44,12 @@ typedef struct GPBDoubleValue__storage_ {
     static GPBMessageFieldDescription fields[] = {
     static GPBMessageFieldDescription fields[] = {
       {
       {
         .name = "value",
         .name = "value",
+        .dataTypeSpecific.className = NULL,
         .number = GPBDoubleValue_FieldNumber_Value,
         .number = GPBDoubleValue_FieldNumber_Value,
         .hasIndex = 0,
         .hasIndex = 0,
+        .offset = (uint32_t)offsetof(GPBDoubleValue__storage_, value),
         .flags = GPBFieldOptional,
         .flags = GPBFieldOptional,
         .dataType = GPBDataTypeDouble,
         .dataType = GPBDataTypeDouble,
-        .offset = offsetof(GPBDoubleValue__storage_, value),
-        .defaultValue.valueDouble = 0,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
       },
       },
     };
     };
     GPBDescriptor *localDescriptor =
     GPBDescriptor *localDescriptor =
@@ -59,15 +57,9 @@ typedef struct GPBDoubleValue__storage_ {
                                      rootClass:[GPBWrappersRoot class]
                                      rootClass:[GPBWrappersRoot class]
                                           file:GPBWrappersRoot_FileDescriptor()
                                           file:GPBWrappersRoot_FileDescriptor()
                                         fields:fields
                                         fields:fields
-                                    fieldCount:sizeof(fields) / sizeof(GPBMessageFieldDescription)
-                                        oneofs:NULL
-                                    oneofCount:0
-                                         enums:NULL
-                                     enumCount:0
-                                        ranges:NULL
-                                    rangeCount:0
+                                    fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription))
                                    storageSize:sizeof(GPBDoubleValue__storage_)
                                    storageSize:sizeof(GPBDoubleValue__storage_)
-                                    wireFormat:NO];
+                                         flags:0];
     NSAssert(descriptor == nil, @"Startup recursed!");
     NSAssert(descriptor == nil, @"Startup recursed!");
     descriptor = localDescriptor;
     descriptor = localDescriptor;
   }
   }
@@ -95,14 +87,12 @@ typedef struct GPBFloatValue__storage_ {
     static GPBMessageFieldDescription fields[] = {
     static GPBMessageFieldDescription fields[] = {
       {
       {
         .name = "value",
         .name = "value",
+        .dataTypeSpecific.className = NULL,
         .number = GPBFloatValue_FieldNumber_Value,
         .number = GPBFloatValue_FieldNumber_Value,
         .hasIndex = 0,
         .hasIndex = 0,
+        .offset = (uint32_t)offsetof(GPBFloatValue__storage_, value),
         .flags = GPBFieldOptional,
         .flags = GPBFieldOptional,
         .dataType = GPBDataTypeFloat,
         .dataType = GPBDataTypeFloat,
-        .offset = offsetof(GPBFloatValue__storage_, value),
-        .defaultValue.valueFloat = 0,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
       },
       },
     };
     };
     GPBDescriptor *localDescriptor =
     GPBDescriptor *localDescriptor =
@@ -110,15 +100,9 @@ typedef struct GPBFloatValue__storage_ {
                                      rootClass:[GPBWrappersRoot class]
                                      rootClass:[GPBWrappersRoot class]
                                           file:GPBWrappersRoot_FileDescriptor()
                                           file:GPBWrappersRoot_FileDescriptor()
                                         fields:fields
                                         fields:fields
-                                    fieldCount:sizeof(fields) / sizeof(GPBMessageFieldDescription)
-                                        oneofs:NULL
-                                    oneofCount:0
-                                         enums:NULL
-                                     enumCount:0
-                                        ranges:NULL
-                                    rangeCount:0
+                                    fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription))
                                    storageSize:sizeof(GPBFloatValue__storage_)
                                    storageSize:sizeof(GPBFloatValue__storage_)
-                                    wireFormat:NO];
+                                         flags:0];
     NSAssert(descriptor == nil, @"Startup recursed!");
     NSAssert(descriptor == nil, @"Startup recursed!");
     descriptor = localDescriptor;
     descriptor = localDescriptor;
   }
   }
@@ -146,14 +130,12 @@ typedef struct GPBInt64Value__storage_ {
     static GPBMessageFieldDescription fields[] = {
     static GPBMessageFieldDescription fields[] = {
       {
       {
         .name = "value",
         .name = "value",
+        .dataTypeSpecific.className = NULL,
         .number = GPBInt64Value_FieldNumber_Value,
         .number = GPBInt64Value_FieldNumber_Value,
         .hasIndex = 0,
         .hasIndex = 0,
+        .offset = (uint32_t)offsetof(GPBInt64Value__storage_, value),
         .flags = GPBFieldOptional,
         .flags = GPBFieldOptional,
         .dataType = GPBDataTypeInt64,
         .dataType = GPBDataTypeInt64,
-        .offset = offsetof(GPBInt64Value__storage_, value),
-        .defaultValue.valueInt64 = 0LL,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
       },
       },
     };
     };
     GPBDescriptor *localDescriptor =
     GPBDescriptor *localDescriptor =
@@ -161,15 +143,9 @@ typedef struct GPBInt64Value__storage_ {
                                      rootClass:[GPBWrappersRoot class]
                                      rootClass:[GPBWrappersRoot class]
                                           file:GPBWrappersRoot_FileDescriptor()
                                           file:GPBWrappersRoot_FileDescriptor()
                                         fields:fields
                                         fields:fields
-                                    fieldCount:sizeof(fields) / sizeof(GPBMessageFieldDescription)
-                                        oneofs:NULL
-                                    oneofCount:0
-                                         enums:NULL
-                                     enumCount:0
-                                        ranges:NULL
-                                    rangeCount:0
+                                    fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription))
                                    storageSize:sizeof(GPBInt64Value__storage_)
                                    storageSize:sizeof(GPBInt64Value__storage_)
-                                    wireFormat:NO];
+                                         flags:0];
     NSAssert(descriptor == nil, @"Startup recursed!");
     NSAssert(descriptor == nil, @"Startup recursed!");
     descriptor = localDescriptor;
     descriptor = localDescriptor;
   }
   }
@@ -197,14 +173,12 @@ typedef struct GPBUInt64Value__storage_ {
     static GPBMessageFieldDescription fields[] = {
     static GPBMessageFieldDescription fields[] = {
       {
       {
         .name = "value",
         .name = "value",
+        .dataTypeSpecific.className = NULL,
         .number = GPBUInt64Value_FieldNumber_Value,
         .number = GPBUInt64Value_FieldNumber_Value,
         .hasIndex = 0,
         .hasIndex = 0,
+        .offset = (uint32_t)offsetof(GPBUInt64Value__storage_, value),
         .flags = GPBFieldOptional,
         .flags = GPBFieldOptional,
         .dataType = GPBDataTypeUInt64,
         .dataType = GPBDataTypeUInt64,
-        .offset = offsetof(GPBUInt64Value__storage_, value),
-        .defaultValue.valueUInt64 = 0ULL,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
       },
       },
     };
     };
     GPBDescriptor *localDescriptor =
     GPBDescriptor *localDescriptor =
@@ -212,15 +186,9 @@ typedef struct GPBUInt64Value__storage_ {
                                      rootClass:[GPBWrappersRoot class]
                                      rootClass:[GPBWrappersRoot class]
                                           file:GPBWrappersRoot_FileDescriptor()
                                           file:GPBWrappersRoot_FileDescriptor()
                                         fields:fields
                                         fields:fields
-                                    fieldCount:sizeof(fields) / sizeof(GPBMessageFieldDescription)
-                                        oneofs:NULL
-                                    oneofCount:0
-                                         enums:NULL
-                                     enumCount:0
-                                        ranges:NULL
-                                    rangeCount:0
+                                    fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription))
                                    storageSize:sizeof(GPBUInt64Value__storage_)
                                    storageSize:sizeof(GPBUInt64Value__storage_)
-                                    wireFormat:NO];
+                                         flags:0];
     NSAssert(descriptor == nil, @"Startup recursed!");
     NSAssert(descriptor == nil, @"Startup recursed!");
     descriptor = localDescriptor;
     descriptor = localDescriptor;
   }
   }
@@ -248,14 +216,12 @@ typedef struct GPBInt32Value__storage_ {
     static GPBMessageFieldDescription fields[] = {
     static GPBMessageFieldDescription fields[] = {
       {
       {
         .name = "value",
         .name = "value",
+        .dataTypeSpecific.className = NULL,
         .number = GPBInt32Value_FieldNumber_Value,
         .number = GPBInt32Value_FieldNumber_Value,
         .hasIndex = 0,
         .hasIndex = 0,
+        .offset = (uint32_t)offsetof(GPBInt32Value__storage_, value),
         .flags = GPBFieldOptional,
         .flags = GPBFieldOptional,
         .dataType = GPBDataTypeInt32,
         .dataType = GPBDataTypeInt32,
-        .offset = offsetof(GPBInt32Value__storage_, value),
-        .defaultValue.valueInt32 = 0,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
       },
       },
     };
     };
     GPBDescriptor *localDescriptor =
     GPBDescriptor *localDescriptor =
@@ -263,15 +229,9 @@ typedef struct GPBInt32Value__storage_ {
                                      rootClass:[GPBWrappersRoot class]
                                      rootClass:[GPBWrappersRoot class]
                                           file:GPBWrappersRoot_FileDescriptor()
                                           file:GPBWrappersRoot_FileDescriptor()
                                         fields:fields
                                         fields:fields
-                                    fieldCount:sizeof(fields) / sizeof(GPBMessageFieldDescription)
-                                        oneofs:NULL
-                                    oneofCount:0
-                                         enums:NULL
-                                     enumCount:0
-                                        ranges:NULL
-                                    rangeCount:0
+                                    fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription))
                                    storageSize:sizeof(GPBInt32Value__storage_)
                                    storageSize:sizeof(GPBInt32Value__storage_)
-                                    wireFormat:NO];
+                                         flags:0];
     NSAssert(descriptor == nil, @"Startup recursed!");
     NSAssert(descriptor == nil, @"Startup recursed!");
     descriptor = localDescriptor;
     descriptor = localDescriptor;
   }
   }
@@ -299,14 +259,12 @@ typedef struct GPBUInt32Value__storage_ {
     static GPBMessageFieldDescription fields[] = {
     static GPBMessageFieldDescription fields[] = {
       {
       {
         .name = "value",
         .name = "value",
+        .dataTypeSpecific.className = NULL,
         .number = GPBUInt32Value_FieldNumber_Value,
         .number = GPBUInt32Value_FieldNumber_Value,
         .hasIndex = 0,
         .hasIndex = 0,
+        .offset = (uint32_t)offsetof(GPBUInt32Value__storage_, value),
         .flags = GPBFieldOptional,
         .flags = GPBFieldOptional,
         .dataType = GPBDataTypeUInt32,
         .dataType = GPBDataTypeUInt32,
-        .offset = offsetof(GPBUInt32Value__storage_, value),
-        .defaultValue.valueUInt32 = 0U,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
       },
       },
     };
     };
     GPBDescriptor *localDescriptor =
     GPBDescriptor *localDescriptor =
@@ -314,15 +272,9 @@ typedef struct GPBUInt32Value__storage_ {
                                      rootClass:[GPBWrappersRoot class]
                                      rootClass:[GPBWrappersRoot class]
                                           file:GPBWrappersRoot_FileDescriptor()
                                           file:GPBWrappersRoot_FileDescriptor()
                                         fields:fields
                                         fields:fields
-                                    fieldCount:sizeof(fields) / sizeof(GPBMessageFieldDescription)
-                                        oneofs:NULL
-                                    oneofCount:0
-                                         enums:NULL
-                                     enumCount:0
-                                        ranges:NULL
-                                    rangeCount:0
+                                    fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription))
                                    storageSize:sizeof(GPBUInt32Value__storage_)
                                    storageSize:sizeof(GPBUInt32Value__storage_)
-                                    wireFormat:NO];
+                                         flags:0];
     NSAssert(descriptor == nil, @"Startup recursed!");
     NSAssert(descriptor == nil, @"Startup recursed!");
     descriptor = localDescriptor;
     descriptor = localDescriptor;
   }
   }
@@ -339,7 +291,6 @@ typedef struct GPBUInt32Value__storage_ {
 
 
 typedef struct GPBBoolValue__storage_ {
 typedef struct GPBBoolValue__storage_ {
   uint32_t _has_storage_[1];
   uint32_t _has_storage_[1];
-  BOOL value;
 } GPBBoolValue__storage_;
 } GPBBoolValue__storage_;
 
 
 // This method is threadsafe because it is initially called
 // This method is threadsafe because it is initially called
@@ -350,14 +301,12 @@ typedef struct GPBBoolValue__storage_ {
     static GPBMessageFieldDescription fields[] = {
     static GPBMessageFieldDescription fields[] = {
       {
       {
         .name = "value",
         .name = "value",
+        .dataTypeSpecific.className = NULL,
         .number = GPBBoolValue_FieldNumber_Value,
         .number = GPBBoolValue_FieldNumber_Value,
         .hasIndex = 0,
         .hasIndex = 0,
+        .offset = 1,  // Stored in _has_storage_ to save space.
         .flags = GPBFieldOptional,
         .flags = GPBFieldOptional,
         .dataType = GPBDataTypeBool,
         .dataType = GPBDataTypeBool,
-        .offset = offsetof(GPBBoolValue__storage_, value),
-        .defaultValue.valueBool = NO,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
       },
       },
     };
     };
     GPBDescriptor *localDescriptor =
     GPBDescriptor *localDescriptor =
@@ -365,15 +314,9 @@ typedef struct GPBBoolValue__storage_ {
                                      rootClass:[GPBWrappersRoot class]
                                      rootClass:[GPBWrappersRoot class]
                                           file:GPBWrappersRoot_FileDescriptor()
                                           file:GPBWrappersRoot_FileDescriptor()
                                         fields:fields
                                         fields:fields
-                                    fieldCount:sizeof(fields) / sizeof(GPBMessageFieldDescription)
-                                        oneofs:NULL
-                                    oneofCount:0
-                                         enums:NULL
-                                     enumCount:0
-                                        ranges:NULL
-                                    rangeCount:0
+                                    fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription))
                                    storageSize:sizeof(GPBBoolValue__storage_)
                                    storageSize:sizeof(GPBBoolValue__storage_)
-                                    wireFormat:NO];
+                                         flags:0];
     NSAssert(descriptor == nil, @"Startup recursed!");
     NSAssert(descriptor == nil, @"Startup recursed!");
     descriptor = localDescriptor;
     descriptor = localDescriptor;
   }
   }
@@ -401,14 +344,12 @@ typedef struct GPBStringValue__storage_ {
     static GPBMessageFieldDescription fields[] = {
     static GPBMessageFieldDescription fields[] = {
       {
       {
         .name = "value",
         .name = "value",
+        .dataTypeSpecific.className = NULL,
         .number = GPBStringValue_FieldNumber_Value,
         .number = GPBStringValue_FieldNumber_Value,
         .hasIndex = 0,
         .hasIndex = 0,
+        .offset = (uint32_t)offsetof(GPBStringValue__storage_, value),
         .flags = GPBFieldOptional,
         .flags = GPBFieldOptional,
         .dataType = GPBDataTypeString,
         .dataType = GPBDataTypeString,
-        .offset = offsetof(GPBStringValue__storage_, value),
-        .defaultValue.valueString = nil,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
       },
       },
     };
     };
     GPBDescriptor *localDescriptor =
     GPBDescriptor *localDescriptor =
@@ -416,15 +357,9 @@ typedef struct GPBStringValue__storage_ {
                                      rootClass:[GPBWrappersRoot class]
                                      rootClass:[GPBWrappersRoot class]
                                           file:GPBWrappersRoot_FileDescriptor()
                                           file:GPBWrappersRoot_FileDescriptor()
                                         fields:fields
                                         fields:fields
-                                    fieldCount:sizeof(fields) / sizeof(GPBMessageFieldDescription)
-                                        oneofs:NULL
-                                    oneofCount:0
-                                         enums:NULL
-                                     enumCount:0
-                                        ranges:NULL
-                                    rangeCount:0
+                                    fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription))
                                    storageSize:sizeof(GPBStringValue__storage_)
                                    storageSize:sizeof(GPBStringValue__storage_)
-                                    wireFormat:NO];
+                                         flags:0];
     NSAssert(descriptor == nil, @"Startup recursed!");
     NSAssert(descriptor == nil, @"Startup recursed!");
     descriptor = localDescriptor;
     descriptor = localDescriptor;
   }
   }
@@ -452,14 +387,12 @@ typedef struct GPBBytesValue__storage_ {
     static GPBMessageFieldDescription fields[] = {
     static GPBMessageFieldDescription fields[] = {
       {
       {
         .name = "value",
         .name = "value",
+        .dataTypeSpecific.className = NULL,
         .number = GPBBytesValue_FieldNumber_Value,
         .number = GPBBytesValue_FieldNumber_Value,
         .hasIndex = 0,
         .hasIndex = 0,
+        .offset = (uint32_t)offsetof(GPBBytesValue__storage_, value),
         .flags = GPBFieldOptional,
         .flags = GPBFieldOptional,
         .dataType = GPBDataTypeBytes,
         .dataType = GPBDataTypeBytes,
-        .offset = offsetof(GPBBytesValue__storage_, value),
-        .defaultValue.valueData = nil,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
       },
       },
     };
     };
     GPBDescriptor *localDescriptor =
     GPBDescriptor *localDescriptor =
@@ -467,15 +400,9 @@ typedef struct GPBBytesValue__storage_ {
                                      rootClass:[GPBWrappersRoot class]
                                      rootClass:[GPBWrappersRoot class]
                                           file:GPBWrappersRoot_FileDescriptor()
                                           file:GPBWrappersRoot_FileDescriptor()
                                         fields:fields
                                         fields:fields
-                                    fieldCount:sizeof(fields) / sizeof(GPBMessageFieldDescription)
-                                        oneofs:NULL
-                                    oneofCount:0
-                                         enums:NULL
-                                     enumCount:0
-                                        ranges:NULL
-                                    rangeCount:0
+                                    fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription))
                                    storageSize:sizeof(GPBBytesValue__storage_)
                                    storageSize:sizeof(GPBBytesValue__storage_)
-                                    wireFormat:NO];
+                                         flags:0];
     NSAssert(descriptor == nil, @"Startup recursed!");
     NSAssert(descriptor == nil, @"Startup recursed!");
     descriptor = localDescriptor;
     descriptor = localDescriptor;
   }
   }

+ 25 - 0
protobuf.bzl

@@ -199,6 +199,31 @@ def cc_proto_library(
       includes=includes,
       includes=includes,
       **kargs)
       **kargs)
 
 
+
+def internal_gen_well_known_protos_java(srcs):
+  """Bazel rule to generate the gen_well_known_protos_java genrule
+
+  Args:
+    srcs: the well known protos
+  """
+  root = Label("%s//protobuf_java" % (REPOSITORY_NAME)).workspace_root
+  if root == "":
+    include = " -Isrc "
+  else:
+    include = " -I%s/src " % root
+  native.genrule(
+    name = "gen_well_known_protos_java",
+    srcs = srcs,
+    outs = [
+        "wellknown.srcjar",
+    ],
+    cmd = "$(location :protoc) --java_out=$(@D)/wellknown.jar" +
+          " %s $(SRCS) " % include +
+          " && mv $(@D)/wellknown.jar $(@D)/wellknown.srcjar",
+    tools = [":protoc"],
+  )
+
+
 def py_proto_library(
 def py_proto_library(
         name,
         name,
         srcs=[],
         srcs=[],

+ 1 - 1
python/google/protobuf/__init__.py

@@ -30,7 +30,7 @@
 
 
 # Copyright 2007 Google Inc. All Rights Reserved.
 # Copyright 2007 Google Inc. All Rights Reserved.
 
 
-__version__ = '3.0.0b2'
+__version__ = '3.0.0b2.post2'
 
 
 if __name__ != '__main__':
 if __name__ != '__main__':
   try:
   try:

+ 1 - 0
python/setup.py

@@ -210,6 +210,7 @@ if __name__ == '__main__':
         "Programming Language :: Python :: 3.3",
         "Programming Language :: Python :: 3.3",
         "Programming Language :: Python :: 3.4",
         "Programming Language :: Python :: 3.4",
         ],
         ],
+      namespace_packages=['google'],
       packages=find_packages(
       packages=find_packages(
           exclude=[
           exclude=[
               'import_test_package',
               'import_test_package',

+ 44 - 1
ruby/Rakefile

@@ -34,6 +34,49 @@ else
   end
   end
 end
 end
 
 
+well_known_protos = %w[
+  google/protobuf/any.proto
+  google/protobuf/api.proto
+  google/protobuf/duration.proto
+  google/protobuf/empty.proto
+  google/protobuf/field_mask.proto
+  google/protobuf/source_context.proto
+  google/protobuf/struct.proto
+  google/protobuf/timestamp.proto
+  google/protobuf/type.proto
+  google/protobuf/wrappers.proto
+]
+
+# These are omitted for now because we don't support proto2.
+proto2_protos = %w[
+  google/protobuf/descriptor.proto
+  google/protobuf/compiler/plugin.proto
+]
+
+genproto_output = []
+
+well_known_protos.each do |proto_file|
+  input_file = "../src/" + proto_file
+  output_file = "lib/" + proto_file.sub(/\.proto$/, ".rb")
+  genproto_output << output_file
+  file output_file => input_file do |file_task|
+    sh "../src/protoc -I../src --ruby_out=lib #{input_file}"
+  end
+end
+
+
+# Proto for tests.
+genproto_output << "tests/generated_code.rb"
+file "tests/generated_code.rb" => "tests/generated_code.proto" do |file_task|
+  sh "../src/protoc --ruby_out=. tests/generated_code.proto"
+end
+
+task :genproto => genproto_output
+
+task :clean do
+  sh "rm -f #{genproto_output.join(' ')}"
+end
+
 Gem::PackageTask.new(spec) do |pkg|
 Gem::PackageTask.new(spec) do |pkg|
 end
 end
 
 
@@ -41,7 +84,7 @@ Rake::TestTask.new(:test => :build) do |t|
   t.test_files = FileList["tests/*.rb"]
   t.test_files = FileList["tests/*.rb"]
 end
 end
 
 
-task :build => [:clean, :compile]
+task :build => [:clean, :compile, :genproto]
 task :default => [:build]
 task :default => [:build]
 
 
 # vim:sw=2:et
 # vim:sw=2:et

+ 5 - 0
ruby/ext/google/protobuf_c/defs.c

@@ -243,6 +243,10 @@ void Descriptor_free(void* _self) {
   if (self->fill_method) {
   if (self->fill_method) {
     upb_pbdecodermethod_unref(self->fill_method, &self->fill_method);
     upb_pbdecodermethod_unref(self->fill_method, &self->fill_method);
   }
   }
+  if (self->json_fill_method) {
+    upb_json_parsermethod_unref(self->json_fill_method,
+                                &self->json_fill_method);
+  }
   if (self->pb_serialize_handlers) {
   if (self->pb_serialize_handlers) {
     upb_handlers_unref(self->pb_serialize_handlers,
     upb_handlers_unref(self->pb_serialize_handlers,
                        &self->pb_serialize_handlers);
                        &self->pb_serialize_handlers);
@@ -271,6 +275,7 @@ VALUE Descriptor_alloc(VALUE klass) {
   self->layout = NULL;
   self->layout = NULL;
   self->fill_handlers = NULL;
   self->fill_handlers = NULL;
   self->fill_method = NULL;
   self->fill_method = NULL;
+  self->json_fill_method = NULL;
   self->pb_serialize_handlers = NULL;
   self->pb_serialize_handlers = NULL;
   self->json_serialize_handlers = NULL;
   self->json_serialize_handlers = NULL;
   self->typeclass_references = rb_ary_new();
   self->typeclass_references = rb_ary_new();

+ 15 - 4
ruby/ext/google/protobuf_c/encode_decode.c

@@ -640,6 +640,14 @@ static const upb_pbdecodermethod *msgdef_decodermethod(Descriptor* desc) {
   return desc->fill_method;
   return desc->fill_method;
 }
 }
 
 
+static const upb_json_parsermethod *msgdef_jsonparsermethod(Descriptor* desc) {
+  if (desc->json_fill_method == NULL) {
+    desc->json_fill_method =
+        upb_json_parsermethod_new(desc->msgdef, &desc->json_fill_method);
+  }
+  return desc->json_fill_method;
+}
+
 
 
 // Stack-allocated context during an encode/decode operation. Contains the upb
 // Stack-allocated context during an encode/decode operation. Contains the upb
 // environment and its stack-based allocator, an initial buffer for allocations
 // environment and its stack-based allocator, an initial buffer for allocations
@@ -752,13 +760,14 @@ VALUE Message_decode_json(VALUE klass, VALUE data) {
   TypedData_Get_Struct(msg_rb, MessageHeader, &Message_type, msg);
   TypedData_Get_Struct(msg_rb, MessageHeader, &Message_type, msg);
 
 
   {
   {
+    const upb_json_parsermethod* method = msgdef_jsonparsermethod(desc);
     stackenv se;
     stackenv se;
     upb_sink sink;
     upb_sink sink;
     upb_json_parser* parser;
     upb_json_parser* parser;
     stackenv_init(&se, "Error occurred during parsing: %s");
     stackenv_init(&se, "Error occurred during parsing: %s");
 
 
     upb_sink_reset(&sink, get_fill_handlers(desc), msg);
     upb_sink_reset(&sink, get_fill_handlers(desc), msg);
-    parser = upb_json_parser_create(&se.env, &sink);
+    parser = upb_json_parser_create(&se.env, method, &sink);
     upb_bufsrc_putbuf(RSTRING_PTR(data), RSTRING_LEN(data),
     upb_bufsrc_putbuf(RSTRING_PTR(data), RSTRING_LEN(data),
                       upb_json_parser_input(parser));
                       upb_json_parser_input(parser));
 
 
@@ -1041,6 +1050,7 @@ static void putmsg(VALUE msg_rb, const Descriptor* desc,
        !upb_msg_field_done(&i);
        !upb_msg_field_done(&i);
        upb_msg_field_next(&i)) {
        upb_msg_field_next(&i)) {
     upb_fielddef *f = upb_msg_iter_field(&i);
     upb_fielddef *f = upb_msg_iter_field(&i);
+    bool is_matching_oneof = false;
     uint32_t offset =
     uint32_t offset =
         desc->layout->fields[upb_fielddef_index(f)].offset +
         desc->layout->fields[upb_fielddef_index(f)].offset +
         sizeof(MessageHeader);
         sizeof(MessageHeader);
@@ -1057,6 +1067,7 @@ static void putmsg(VALUE msg_rb, const Descriptor* desc,
       }
       }
       // Otherwise, fall through to the appropriate singular-field handler
       // Otherwise, fall through to the appropriate singular-field handler
       // below.
       // below.
+      is_matching_oneof = true;
     }
     }
 
 
     if (is_map_field(f)) {
     if (is_map_field(f)) {
@@ -1071,7 +1082,7 @@ static void putmsg(VALUE msg_rb, const Descriptor* desc,
       }
       }
     } else if (upb_fielddef_isstring(f)) {
     } else if (upb_fielddef_isstring(f)) {
       VALUE str = DEREF(msg, offset, VALUE);
       VALUE str = DEREF(msg, offset, VALUE);
-      if (RSTRING_LEN(str) > 0) {
+      if (is_matching_oneof || RSTRING_LEN(str) > 0) {
         putstr(str, f, sink);
         putstr(str, f, sink);
       }
       }
     } else if (upb_fielddef_issubmsg(f)) {
     } else if (upb_fielddef_issubmsg(f)) {
@@ -1082,7 +1093,7 @@ static void putmsg(VALUE msg_rb, const Descriptor* desc,
 #define T(upbtypeconst, upbtype, ctype, default_value)                \
 #define T(upbtypeconst, upbtype, ctype, default_value)                \
   case upbtypeconst: {                                                \
   case upbtypeconst: {                                                \
       ctype value = DEREF(msg, offset, ctype);                        \
       ctype value = DEREF(msg, offset, ctype);                        \
-      if (value != default_value) {                                   \
+      if (is_matching_oneof || value != default_value) {              \
         upb_sink_put##upbtype(sink, sel, value);                      \
         upb_sink_put##upbtype(sink, sel, value);                      \
       }                                                               \
       }                                                               \
     }                                                                 \
     }                                                                 \
@@ -1189,7 +1200,7 @@ VALUE Message_encode_json(VALUE klass, VALUE msg_rb) {
 
 
     putmsg(msg_rb, desc, upb_json_printer_input(printer), 0);
     putmsg(msg_rb, desc, upb_json_printer_input(printer), 0);
 
 
-    ret = rb_str_new(sink.ptr, sink.len);
+    ret = rb_enc_str_new(sink.ptr, sink.len, rb_utf8_encoding());
 
 
     stackenv_uninit(&se);
     stackenv_uninit(&se);
     stringsink_uninit(&sink);
     stringsink_uninit(&sink);

+ 1 - 0
ruby/ext/google/protobuf_c/protobuf.h

@@ -112,6 +112,7 @@ struct Descriptor {
   VALUE klass;  // begins as nil
   VALUE klass;  // begins as nil
   const upb_handlers* fill_handlers;
   const upb_handlers* fill_handlers;
   const upb_pbdecodermethod* fill_method;
   const upb_pbdecodermethod* fill_method;
+  const upb_json_parsermethod* json_fill_method;
   const upb_handlers* pb_serialize_handlers;
   const upb_handlers* pb_serialize_handlers;
   const upb_handlers* json_serialize_handlers;
   const upb_handlers* json_serialize_handlers;
   // Handlers hold type class references for sub-message fields directly in some
   // Handlers hold type class references for sub-message fields directly in some

File diff suppressed because it is too large
+ 479 - 407
ruby/ext/google/protobuf_c/upb.c


+ 307 - 40
ruby/ext/google/protobuf_c/upb.h

@@ -193,13 +193,15 @@
   template <>                                                     \
   template <>                                                     \
   class Pointer<cppname> : public PointerBase<cppname, cppbase> { \
   class Pointer<cppname> : public PointerBase<cppname, cppbase> { \
    public:                                                        \
    public:                                                        \
-    explicit Pointer(cppname* ptr) : PointerBase(ptr) {}          \
+    explicit Pointer(cppname* ptr)                                \
+        : PointerBase<cppname, cppbase>(ptr) {}                   \
   };                                                              \
   };                                                              \
   template <>                                                     \
   template <>                                                     \
   class Pointer<const cppname>                                    \
   class Pointer<const cppname>                                    \
       : public PointerBase<const cppname, const cppbase> {        \
       : public PointerBase<const cppname, const cppbase> {        \
    public:                                                        \
    public:                                                        \
-    explicit Pointer(const cppname* ptr) : PointerBase(ptr) {}    \
+    explicit Pointer(const cppname* ptr)                          \
+        : PointerBase<const cppname, const cppbase>(ptr) {}       \
   };                                                              \
   };                                                              \
   }
   }
 
 
@@ -211,13 +213,15 @@
   template <>                                                                \
   template <>                                                                \
   class Pointer<cppname> : public PointerBase2<cppname, cppbase, cppbase2> { \
   class Pointer<cppname> : public PointerBase2<cppname, cppbase, cppbase2> { \
    public:                                                                   \
    public:                                                                   \
-    explicit Pointer(cppname* ptr) : PointerBase2(ptr) {}                    \
+    explicit Pointer(cppname* ptr)                                           \
+        : PointerBase2<cppname, cppbase, cppbase2>(ptr) {}                   \
   };                                                                         \
   };                                                                         \
   template <>                                                                \
   template <>                                                                \
   class Pointer<const cppname>                                               \
   class Pointer<const cppname>                                               \
       : public PointerBase2<const cppname, const cppbase, const cppbase2> {  \
       : public PointerBase2<const cppname, const cppbase, const cppbase2> {  \
    public:                                                                   \
    public:                                                                   \
-    explicit Pointer(const cppname* ptr) : PointerBase2(ptr) {}              \
+    explicit Pointer(const cppname* ptr)                                     \
+        : PointerBase2<const cppname, const cppbase, const cppbase2>(ptr) {} \
   };                                                                         \
   };                                                                         \
   }
   }
 
 
@@ -1537,6 +1541,27 @@ class upb::FieldDef {
   uint32_t number() const;   /* Returns 0 if uninitialized. */
   uint32_t number() const;   /* Returns 0 if uninitialized. */
   bool is_extension() const;
   bool is_extension() const;
 
 
+  /* Copies the JSON name for this field into the given buffer.  Returns the
+   * actual size of the JSON name, including the NULL terminator.  If the
+   * return value is 0, the JSON name is unset.  If the return value is
+   * greater than len, the JSON name was truncated.  The buffer is always
+   * NULL-terminated if len > 0.
+   *
+   * The JSON name always defaults to a camelCased version of the regular
+   * name.  However if the regular name is unset, the JSON name will be unset
+   * also.
+   */
+  size_t GetJsonName(char* buf, size_t len) const;
+
+  /* Convenience version of the above function which copies the JSON name
+   * into the given string, returning false if the name is not set. */
+  template <class T>
+  bool GetJsonName(T* str) {
+    str->resize(GetJsonName(NULL, 0));
+    GetJsonName(&(*str)[0], str->size());
+    return str->size() > 0;
+  }
+
   /* For UPB_TYPE_MESSAGE fields only where is_tag_delimited() == false,
   /* For UPB_TYPE_MESSAGE fields only where is_tag_delimited() == false,
    * indicates whether this field should have lazy parsing handlers that yield
    * indicates whether this field should have lazy parsing handlers that yield
    * the unparsed string for the submessage.
    * the unparsed string for the submessage.
@@ -1589,6 +1614,18 @@ class upb::FieldDef {
   bool IsPrimitive() const;
   bool IsPrimitive() const;
   bool IsMap() const;
   bool IsMap() const;
 
 
+  /* Whether this field must be able to explicitly represent presence:
+   *
+   * * This is always false for repeated fields (an empty repeated field is
+   *   equivalent to a repeated field with zero entries).
+   *
+   * * This is always true for submessages.
+   *
+   * * For other fields, it depends on the message (see
+   *   MessageDef::SetPrimitivesHavePresence())
+   */
+  bool HasPresence() const;
+
   /* How integers are encoded.  Only meaningful for integer types.
   /* How integers are encoded.  Only meaningful for integer types.
    * Defaults to UPB_INTFMT_VARIABLE, and is reset when "type" changes. */
    * Defaults to UPB_INTFMT_VARIABLE, and is reset when "type" changes. */
   IntegerFormat integer_format() const;
   IntegerFormat integer_format() const;
@@ -1690,6 +1727,16 @@ class upb::FieldDef {
   bool set_name(const char* name, upb::Status* s);
   bool set_name(const char* name, upb::Status* s);
   bool set_name(const std::string& name, upb::Status* s);
   bool set_name(const std::string& name, upb::Status* s);
 
 
+  /* Sets the JSON name to the given string. */
+  /* TODO(haberman): implement.  Right now only default json_name (camelCase)
+   * is supported. */
+  bool set_json_name(const char* json_name, upb::Status* s);
+  bool set_json_name(const std::string& name, upb::Status* s);
+
+  /* Clears the JSON name. This will make it revert to its default, which is
+   * a camelCased version of the regular field name. */
+  void clear_json_name();
+
   void set_integer_format(IntegerFormat format);
   void set_integer_format(IntegerFormat format);
   bool set_tag_delimited(bool tag_delimited, upb::Status* s);
   bool set_tag_delimited(bool tag_delimited, upb::Status* s);
 
 
@@ -1754,6 +1801,7 @@ const char *upb_fielddef_name(const upb_fielddef *f);
 bool upb_fielddef_isextension(const upb_fielddef *f);
 bool upb_fielddef_isextension(const upb_fielddef *f);
 bool upb_fielddef_lazy(const upb_fielddef *f);
 bool upb_fielddef_lazy(const upb_fielddef *f);
 bool upb_fielddef_packed(const upb_fielddef *f);
 bool upb_fielddef_packed(const upb_fielddef *f);
+size_t upb_fielddef_getjsonname(const upb_fielddef *f, char *buf, size_t len);
 const upb_msgdef *upb_fielddef_containingtype(const upb_fielddef *f);
 const upb_msgdef *upb_fielddef_containingtype(const upb_fielddef *f);
 const upb_oneofdef *upb_fielddef_containingoneof(const upb_fielddef *f);
 const upb_oneofdef *upb_fielddef_containingoneof(const upb_fielddef *f);
 upb_msgdef *upb_fielddef_containingtype_mutable(upb_fielddef *f);
 upb_msgdef *upb_fielddef_containingtype_mutable(upb_fielddef *f);
@@ -1766,6 +1814,7 @@ bool upb_fielddef_isstring(const upb_fielddef *f);
 bool upb_fielddef_isseq(const upb_fielddef *f);
 bool upb_fielddef_isseq(const upb_fielddef *f);
 bool upb_fielddef_isprimitive(const upb_fielddef *f);
 bool upb_fielddef_isprimitive(const upb_fielddef *f);
 bool upb_fielddef_ismap(const upb_fielddef *f);
 bool upb_fielddef_ismap(const upb_fielddef *f);
+bool upb_fielddef_haspresence(const upb_fielddef *f);
 int64_t upb_fielddef_defaultint64(const upb_fielddef *f);
 int64_t upb_fielddef_defaultint64(const upb_fielddef *f);
 int32_t upb_fielddef_defaultint32(const upb_fielddef *f);
 int32_t upb_fielddef_defaultint32(const upb_fielddef *f);
 uint64_t upb_fielddef_defaultuint64(const upb_fielddef *f);
 uint64_t upb_fielddef_defaultuint64(const upb_fielddef *f);
@@ -1787,6 +1836,8 @@ void upb_fielddef_setdescriptortype(upb_fielddef *f, int type);
 void upb_fielddef_setlabel(upb_fielddef *f, upb_label_t label);
 void upb_fielddef_setlabel(upb_fielddef *f, upb_label_t label);
 bool upb_fielddef_setnumber(upb_fielddef *f, uint32_t number, upb_status *s);
 bool upb_fielddef_setnumber(upb_fielddef *f, uint32_t number, upb_status *s);
 bool upb_fielddef_setname(upb_fielddef *f, const char *name, upb_status *s);
 bool upb_fielddef_setname(upb_fielddef *f, const char *name, upb_status *s);
+bool upb_fielddef_setjsonname(upb_fielddef *f, const char *name, upb_status *s);
+bool upb_fielddef_clearjsonname(upb_fielddef *f);
 bool upb_fielddef_setcontainingtypename(upb_fielddef *f, const char *name,
 bool upb_fielddef_setcontainingtypename(upb_fielddef *f, const char *name,
                                         upb_status *s);
                                         upb_status *s);
 void upb_fielddef_setisextension(upb_fielddef *f, bool is_extension);
 void upb_fielddef_setisextension(upb_fielddef *f, bool is_extension);
@@ -1884,6 +1935,11 @@ class upb::MessageDef {
   bool AddOneof(OneofDef* o, Status* s);
   bool AddOneof(OneofDef* o, Status* s);
   bool AddOneof(const reffed_ptr<OneofDef>& o, Status* s);
   bool AddOneof(const reffed_ptr<OneofDef>& o, Status* s);
 
 
+  /* Set this to false to indicate that primitive fields should not have
+   * explicit presence information associated with them.  This will affect all
+   * fields added to this message.  Defaults to true. */
+  void SetPrimitivesHavePresence(bool have_presence);
+
   /* These return NULL if the field is not found. */
   /* These return NULL if the field is not found. */
   FieldDef* FindFieldByNumber(uint32_t number);
   FieldDef* FindFieldByNumber(uint32_t number);
   FieldDef* FindFieldByName(const char *name, size_t len);
   FieldDef* FindFieldByName(const char *name, size_t len);
@@ -2077,6 +2133,7 @@ bool upb_msgdef_addfield(upb_msgdef *m, upb_fielddef *f, const void *ref_donor,
                          upb_status *s);
                          upb_status *s);
 bool upb_msgdef_addoneof(upb_msgdef *m, upb_oneofdef *o, const void *ref_donor,
 bool upb_msgdef_addoneof(upb_msgdef *m, upb_oneofdef *o, const void *ref_donor,
                          upb_status *s);
                          upb_status *s);
+void upb_msgdef_setprimitiveshavepresence(upb_msgdef *m, bool have_presence);
 
 
 /* Field lookup in a couple of different variations:
 /* Field lookup in a couple of different variations:
  *   - itof = int to field
  *   - itof = int to field
@@ -2527,6 +2584,9 @@ inline const char* FieldDef::name() const { return upb_fielddef_name(this); }
 inline bool FieldDef::is_extension() const {
 inline bool FieldDef::is_extension() const {
   return upb_fielddef_isextension(this);
   return upb_fielddef_isextension(this);
 }
 }
+inline size_t FieldDef::GetJsonName(char* buf, size_t len) const {
+  return upb_fielddef_getjsonname(this, buf, len);
+}
 inline bool FieldDef::lazy() const {
 inline bool FieldDef::lazy() const {
   return upb_fielddef_lazy(this);
   return upb_fielddef_lazy(this);
 }
 }
@@ -2557,6 +2617,15 @@ inline bool FieldDef::set_name(const char *name, Status* s) {
 inline bool FieldDef::set_name(const std::string& name, Status* s) {
 inline bool FieldDef::set_name(const std::string& name, Status* s) {
   return upb_fielddef_setname(this, upb_safecstr(name), s);
   return upb_fielddef_setname(this, upb_safecstr(name), s);
 }
 }
+inline bool FieldDef::set_json_name(const char *name, Status* s) {
+  return upb_fielddef_setjsonname(this, name, s);
+}
+inline bool FieldDef::set_json_name(const std::string& name, Status* s) {
+  return upb_fielddef_setjsonname(this, upb_safecstr(name), s);
+}
+inline void FieldDef::clear_json_name() {
+  upb_fielddef_clearjsonname(this);
+}
 inline bool FieldDef::set_containing_type_name(const char *name, Status* s) {
 inline bool FieldDef::set_containing_type_name(const char *name, Status* s) {
   return upb_fielddef_setcontainingtypename(this, name, s);
   return upb_fielddef_setcontainingtypename(this, name, s);
 }
 }
@@ -3107,6 +3176,11 @@ struct upb_msgdef {
    * descriptor.upb.c. */
    * descriptor.upb.c. */
   bool map_entry;
   bool map_entry;
 
 
+  /* Do primitive values in this message have explicit presence or not?
+   * TODO: set this flag properly for static descriptors; regenerate
+   * descriptor.upb.c. */
+  bool primitives_have_presence;
+
   /* TODO(haberman): proper extension ranges (there can be multiple). */
   /* TODO(haberman): proper extension ranges (there can be multiple). */
 };
 };
 
 
@@ -3117,7 +3191,7 @@ struct upb_msgdef {
   {                                                                           \
   {                                                                           \
     UPB_DEF_INIT(name, UPB_DEF_MSG, refs, ref2s), selector_count,             \
     UPB_DEF_INIT(name, UPB_DEF_MSG, refs, ref2s), selector_count,             \
         submsg_field_count, itof, ntof,                                       \
         submsg_field_count, itof, ntof,                                       \
-        UPB_EMPTY_STRTABLE_INIT(UPB_CTYPE_PTR), false                         \
+        UPB_EMPTY_STRTABLE_INIT(UPB_CTYPE_PTR), false, true                   \
   }
   }
 
 
 
 
@@ -6278,6 +6352,12 @@ typedef enum {
   GOOGLE_PROTOBUF_FIELDOPTIONS_STRING_PIECE = 2
   GOOGLE_PROTOBUF_FIELDOPTIONS_STRING_PIECE = 2
 } google_protobuf_FieldOptions_CType;
 } google_protobuf_FieldOptions_CType;
 
 
+typedef enum {
+  GOOGLE_PROTOBUF_FIELDOPTIONS_JS_NORMAL = 0,
+  GOOGLE_PROTOBUF_FIELDOPTIONS_JS_STRING = 1,
+  GOOGLE_PROTOBUF_FIELDOPTIONS_JS_NUMBER = 2
+} google_protobuf_FieldOptions_JSType;
+
 typedef enum {
 typedef enum {
   GOOGLE_PROTOBUF_FILEOPTIONS_SPEED = 1,
   GOOGLE_PROTOBUF_FILEOPTIONS_SPEED = 1,
   GOOGLE_PROTOBUF_FILEOPTIONS_CODE_SIZE = 2,
   GOOGLE_PROTOBUF_FILEOPTIONS_CODE_SIZE = 2,
@@ -6293,30 +6373,47 @@ typedef enum {
 #define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_EXTENSION_RANGE_STARTSUBMSG 5
 #define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_EXTENSION_RANGE_STARTSUBMSG 5
 #define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_EXTENSION_STARTSUBMSG 6
 #define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_EXTENSION_STARTSUBMSG 6
 #define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_OPTIONS_STARTSUBMSG 7
 #define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_OPTIONS_STARTSUBMSG 7
-#define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_FIELD_STARTSEQ 8
-#define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_FIELD_ENDSEQ 9
-#define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_FIELD_ENDSUBMSG 10
-#define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_NESTED_TYPE_STARTSEQ 11
-#define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_NESTED_TYPE_ENDSEQ 12
-#define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_NESTED_TYPE_ENDSUBMSG 13
-#define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_ENUM_TYPE_STARTSEQ 14
-#define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_ENUM_TYPE_ENDSEQ 15
-#define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_ENUM_TYPE_ENDSUBMSG 16
-#define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_EXTENSION_RANGE_STARTSEQ 17
-#define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_EXTENSION_RANGE_ENDSEQ 18
-#define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_EXTENSION_RANGE_ENDSUBMSG 19
-#define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_EXTENSION_STARTSEQ 20
-#define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_EXTENSION_ENDSEQ 21
-#define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_EXTENSION_ENDSUBMSG 22
-#define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_OPTIONS_ENDSUBMSG 23
-#define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_NAME_STRING 24
-#define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_NAME_STARTSTR 25
-#define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_NAME_ENDSTR 26
+#define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_ONEOF_DECL_STARTSUBMSG 8
+#define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_RESERVED_RANGE_STARTSUBMSG 9
+#define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_FIELD_STARTSEQ 10
+#define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_FIELD_ENDSEQ 11
+#define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_FIELD_ENDSUBMSG 12
+#define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_NESTED_TYPE_STARTSEQ 13
+#define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_NESTED_TYPE_ENDSEQ 14
+#define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_NESTED_TYPE_ENDSUBMSG 15
+#define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_ENUM_TYPE_STARTSEQ 16
+#define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_ENUM_TYPE_ENDSEQ 17
+#define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_ENUM_TYPE_ENDSUBMSG 18
+#define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_EXTENSION_RANGE_STARTSEQ 19
+#define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_EXTENSION_RANGE_ENDSEQ 20
+#define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_EXTENSION_RANGE_ENDSUBMSG 21
+#define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_EXTENSION_STARTSEQ 22
+#define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_EXTENSION_ENDSEQ 23
+#define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_EXTENSION_ENDSUBMSG 24
+#define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_OPTIONS_ENDSUBMSG 25
+#define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_ONEOF_DECL_STARTSEQ 26
+#define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_ONEOF_DECL_ENDSEQ 27
+#define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_ONEOF_DECL_ENDSUBMSG 28
+#define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_RESERVED_RANGE_STARTSEQ 29
+#define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_RESERVED_RANGE_ENDSEQ 30
+#define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_RESERVED_RANGE_ENDSUBMSG 31
+#define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_NAME_STRING 32
+#define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_NAME_STARTSTR 33
+#define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_NAME_ENDSTR 34
+#define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_RESERVED_NAME_STARTSEQ 35
+#define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_RESERVED_NAME_ENDSEQ 36
+#define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_RESERVED_NAME_STRING 37
+#define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_RESERVED_NAME_STARTSTR 38
+#define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_RESERVED_NAME_ENDSTR 39
 
 
 /* google.protobuf.DescriptorProto.ExtensionRange */
 /* google.protobuf.DescriptorProto.ExtensionRange */
 #define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_EXTENSIONRANGE_START_INT32 2
 #define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_EXTENSIONRANGE_START_INT32 2
 #define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_EXTENSIONRANGE_END_INT32 3
 #define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_EXTENSIONRANGE_END_INT32 3
 
 
+/* google.protobuf.DescriptorProto.ReservedRange */
+#define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_RESERVEDRANGE_START_INT32 2
+#define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_RESERVEDRANGE_END_INT32 3
+
 /* google.protobuf.EnumDescriptorProto */
 /* google.protobuf.EnumDescriptorProto */
 #define SEL_GOOGLE_PROTOBUF_ENUMDESCRIPTORPROTO_VALUE_STARTSUBMSG 2
 #define SEL_GOOGLE_PROTOBUF_ENUMDESCRIPTORPROTO_VALUE_STARTSUBMSG 2
 #define SEL_GOOGLE_PROTOBUF_ENUMDESCRIPTORPROTO_OPTIONS_STARTSUBMSG 3
 #define SEL_GOOGLE_PROTOBUF_ENUMDESCRIPTORPROTO_OPTIONS_STARTSUBMSG 3
@@ -6334,6 +6431,7 @@ typedef enum {
 #define SEL_GOOGLE_PROTOBUF_ENUMOPTIONS_UNINTERPRETED_OPTION_ENDSEQ 4
 #define SEL_GOOGLE_PROTOBUF_ENUMOPTIONS_UNINTERPRETED_OPTION_ENDSEQ 4
 #define SEL_GOOGLE_PROTOBUF_ENUMOPTIONS_UNINTERPRETED_OPTION_ENDSUBMSG 5
 #define SEL_GOOGLE_PROTOBUF_ENUMOPTIONS_UNINTERPRETED_OPTION_ENDSUBMSG 5
 #define SEL_GOOGLE_PROTOBUF_ENUMOPTIONS_ALLOW_ALIAS_BOOL 6
 #define SEL_GOOGLE_PROTOBUF_ENUMOPTIONS_ALLOW_ALIAS_BOOL 6
+#define SEL_GOOGLE_PROTOBUF_ENUMOPTIONS_DEPRECATED_BOOL 7
 
 
 /* google.protobuf.EnumValueDescriptorProto */
 /* google.protobuf.EnumValueDescriptorProto */
 #define SEL_GOOGLE_PROTOBUF_ENUMVALUEDESCRIPTORPROTO_OPTIONS_STARTSUBMSG 2
 #define SEL_GOOGLE_PROTOBUF_ENUMVALUEDESCRIPTORPROTO_OPTIONS_STARTSUBMSG 2
@@ -6348,6 +6446,7 @@ typedef enum {
 #define SEL_GOOGLE_PROTOBUF_ENUMVALUEOPTIONS_UNINTERPRETED_OPTION_STARTSEQ 3
 #define SEL_GOOGLE_PROTOBUF_ENUMVALUEOPTIONS_UNINTERPRETED_OPTION_STARTSEQ 3
 #define SEL_GOOGLE_PROTOBUF_ENUMVALUEOPTIONS_UNINTERPRETED_OPTION_ENDSEQ 4
 #define SEL_GOOGLE_PROTOBUF_ENUMVALUEOPTIONS_UNINTERPRETED_OPTION_ENDSEQ 4
 #define SEL_GOOGLE_PROTOBUF_ENUMVALUEOPTIONS_UNINTERPRETED_OPTION_ENDSUBMSG 5
 #define SEL_GOOGLE_PROTOBUF_ENUMVALUEOPTIONS_UNINTERPRETED_OPTION_ENDSUBMSG 5
+#define SEL_GOOGLE_PROTOBUF_ENUMVALUEOPTIONS_DEPRECATED_BOOL 6
 
 
 /* google.protobuf.FieldDescriptorProto */
 /* google.protobuf.FieldDescriptorProto */
 #define SEL_GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_OPTIONS_STARTSUBMSG 2
 #define SEL_GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_OPTIONS_STARTSUBMSG 2
@@ -6367,6 +6466,10 @@ typedef enum {
 #define SEL_GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_DEFAULT_VALUE_STRING 16
 #define SEL_GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_DEFAULT_VALUE_STRING 16
 #define SEL_GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_DEFAULT_VALUE_STARTSTR 17
 #define SEL_GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_DEFAULT_VALUE_STARTSTR 17
 #define SEL_GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_DEFAULT_VALUE_ENDSTR 18
 #define SEL_GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_DEFAULT_VALUE_ENDSTR 18
+#define SEL_GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_ONEOF_INDEX_INT32 19
+#define SEL_GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_JSON_NAME_STRING 20
+#define SEL_GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_JSON_NAME_STARTSTR 21
+#define SEL_GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_JSON_NAME_ENDSTR 22
 
 
 /* google.protobuf.FieldOptions */
 /* google.protobuf.FieldOptions */
 #define SEL_GOOGLE_PROTOBUF_FIELDOPTIONS_UNINTERPRETED_OPTION_STARTSUBMSG 2
 #define SEL_GOOGLE_PROTOBUF_FIELDOPTIONS_UNINTERPRETED_OPTION_STARTSUBMSG 2
@@ -6377,10 +6480,8 @@ typedef enum {
 #define SEL_GOOGLE_PROTOBUF_FIELDOPTIONS_PACKED_BOOL 7
 #define SEL_GOOGLE_PROTOBUF_FIELDOPTIONS_PACKED_BOOL 7
 #define SEL_GOOGLE_PROTOBUF_FIELDOPTIONS_DEPRECATED_BOOL 8
 #define SEL_GOOGLE_PROTOBUF_FIELDOPTIONS_DEPRECATED_BOOL 8
 #define SEL_GOOGLE_PROTOBUF_FIELDOPTIONS_LAZY_BOOL 9
 #define SEL_GOOGLE_PROTOBUF_FIELDOPTIONS_LAZY_BOOL 9
-#define SEL_GOOGLE_PROTOBUF_FIELDOPTIONS_EXPERIMENTAL_MAP_KEY_STRING 10
-#define SEL_GOOGLE_PROTOBUF_FIELDOPTIONS_EXPERIMENTAL_MAP_KEY_STARTSTR 11
-#define SEL_GOOGLE_PROTOBUF_FIELDOPTIONS_EXPERIMENTAL_MAP_KEY_ENDSTR 12
-#define SEL_GOOGLE_PROTOBUF_FIELDOPTIONS_WEAK_BOOL 13
+#define SEL_GOOGLE_PROTOBUF_FIELDOPTIONS_JSTYPE_INT32 10
+#define SEL_GOOGLE_PROTOBUF_FIELDOPTIONS_WEAK_BOOL 11
 
 
 /* google.protobuf.FileDescriptorProto */
 /* google.protobuf.FileDescriptorProto */
 #define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_MESSAGE_TYPE_STARTSUBMSG 2
 #define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_MESSAGE_TYPE_STARTSUBMSG 2
@@ -6420,6 +6521,9 @@ typedef enum {
 #define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_WEAK_DEPENDENCY_STARTSEQ 36
 #define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_WEAK_DEPENDENCY_STARTSEQ 36
 #define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_WEAK_DEPENDENCY_ENDSEQ 37
 #define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_WEAK_DEPENDENCY_ENDSEQ 37
 #define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_WEAK_DEPENDENCY_INT32 38
 #define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_WEAK_DEPENDENCY_INT32 38
+#define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_SYNTAX_STRING 39
+#define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_SYNTAX_STARTSTR 40
+#define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_SYNTAX_ENDSTR 41
 
 
 /* google.protobuf.FileDescriptorSet */
 /* google.protobuf.FileDescriptorSet */
 #define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORSET_FILE_STARTSUBMSG 2
 #define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORSET_FILE_STARTSUBMSG 2
@@ -6447,6 +6551,16 @@ typedef enum {
 #define SEL_GOOGLE_PROTOBUF_FILEOPTIONS_JAVA_GENERIC_SERVICES_BOOL 18
 #define SEL_GOOGLE_PROTOBUF_FILEOPTIONS_JAVA_GENERIC_SERVICES_BOOL 18
 #define SEL_GOOGLE_PROTOBUF_FILEOPTIONS_PY_GENERIC_SERVICES_BOOL 19
 #define SEL_GOOGLE_PROTOBUF_FILEOPTIONS_PY_GENERIC_SERVICES_BOOL 19
 #define SEL_GOOGLE_PROTOBUF_FILEOPTIONS_JAVA_GENERATE_EQUALS_AND_HASH_BOOL 20
 #define SEL_GOOGLE_PROTOBUF_FILEOPTIONS_JAVA_GENERATE_EQUALS_AND_HASH_BOOL 20
+#define SEL_GOOGLE_PROTOBUF_FILEOPTIONS_DEPRECATED_BOOL 21
+#define SEL_GOOGLE_PROTOBUF_FILEOPTIONS_JAVA_STRING_CHECK_UTF8_BOOL 22
+#define SEL_GOOGLE_PROTOBUF_FILEOPTIONS_CC_ENABLE_ARENAS_BOOL 23
+#define SEL_GOOGLE_PROTOBUF_FILEOPTIONS_OBJC_CLASS_PREFIX_STRING 24
+#define SEL_GOOGLE_PROTOBUF_FILEOPTIONS_OBJC_CLASS_PREFIX_STARTSTR 25
+#define SEL_GOOGLE_PROTOBUF_FILEOPTIONS_OBJC_CLASS_PREFIX_ENDSTR 26
+#define SEL_GOOGLE_PROTOBUF_FILEOPTIONS_CSHARP_NAMESPACE_STRING 27
+#define SEL_GOOGLE_PROTOBUF_FILEOPTIONS_CSHARP_NAMESPACE_STARTSTR 28
+#define SEL_GOOGLE_PROTOBUF_FILEOPTIONS_CSHARP_NAMESPACE_ENDSTR 29
+#define SEL_GOOGLE_PROTOBUF_FILEOPTIONS_JAVANANO_USE_DEPRECATED_PACKAGE_BOOL 30
 
 
 /* google.protobuf.MessageOptions */
 /* google.protobuf.MessageOptions */
 #define SEL_GOOGLE_PROTOBUF_MESSAGEOPTIONS_UNINTERPRETED_OPTION_STARTSUBMSG 2
 #define SEL_GOOGLE_PROTOBUF_MESSAGEOPTIONS_UNINTERPRETED_OPTION_STARTSUBMSG 2
@@ -6455,6 +6569,8 @@ typedef enum {
 #define SEL_GOOGLE_PROTOBUF_MESSAGEOPTIONS_UNINTERPRETED_OPTION_ENDSUBMSG 5
 #define SEL_GOOGLE_PROTOBUF_MESSAGEOPTIONS_UNINTERPRETED_OPTION_ENDSUBMSG 5
 #define SEL_GOOGLE_PROTOBUF_MESSAGEOPTIONS_MESSAGE_SET_WIRE_FORMAT_BOOL 6
 #define SEL_GOOGLE_PROTOBUF_MESSAGEOPTIONS_MESSAGE_SET_WIRE_FORMAT_BOOL 6
 #define SEL_GOOGLE_PROTOBUF_MESSAGEOPTIONS_NO_STANDARD_DESCRIPTOR_ACCESSOR_BOOL 7
 #define SEL_GOOGLE_PROTOBUF_MESSAGEOPTIONS_NO_STANDARD_DESCRIPTOR_ACCESSOR_BOOL 7
+#define SEL_GOOGLE_PROTOBUF_MESSAGEOPTIONS_DEPRECATED_BOOL 8
+#define SEL_GOOGLE_PROTOBUF_MESSAGEOPTIONS_MAP_ENTRY_BOOL 9
 
 
 /* google.protobuf.MethodDescriptorProto */
 /* google.protobuf.MethodDescriptorProto */
 #define SEL_GOOGLE_PROTOBUF_METHODDESCRIPTORPROTO_OPTIONS_STARTSUBMSG 2
 #define SEL_GOOGLE_PROTOBUF_METHODDESCRIPTORPROTO_OPTIONS_STARTSUBMSG 2
@@ -6468,12 +6584,20 @@ typedef enum {
 #define SEL_GOOGLE_PROTOBUF_METHODDESCRIPTORPROTO_OUTPUT_TYPE_STRING 10
 #define SEL_GOOGLE_PROTOBUF_METHODDESCRIPTORPROTO_OUTPUT_TYPE_STRING 10
 #define SEL_GOOGLE_PROTOBUF_METHODDESCRIPTORPROTO_OUTPUT_TYPE_STARTSTR 11
 #define SEL_GOOGLE_PROTOBUF_METHODDESCRIPTORPROTO_OUTPUT_TYPE_STARTSTR 11
 #define SEL_GOOGLE_PROTOBUF_METHODDESCRIPTORPROTO_OUTPUT_TYPE_ENDSTR 12
 #define SEL_GOOGLE_PROTOBUF_METHODDESCRIPTORPROTO_OUTPUT_TYPE_ENDSTR 12
+#define SEL_GOOGLE_PROTOBUF_METHODDESCRIPTORPROTO_CLIENT_STREAMING_BOOL 13
+#define SEL_GOOGLE_PROTOBUF_METHODDESCRIPTORPROTO_SERVER_STREAMING_BOOL 14
 
 
 /* google.protobuf.MethodOptions */
 /* google.protobuf.MethodOptions */
 #define SEL_GOOGLE_PROTOBUF_METHODOPTIONS_UNINTERPRETED_OPTION_STARTSUBMSG 2
 #define SEL_GOOGLE_PROTOBUF_METHODOPTIONS_UNINTERPRETED_OPTION_STARTSUBMSG 2
 #define SEL_GOOGLE_PROTOBUF_METHODOPTIONS_UNINTERPRETED_OPTION_STARTSEQ 3
 #define SEL_GOOGLE_PROTOBUF_METHODOPTIONS_UNINTERPRETED_OPTION_STARTSEQ 3
 #define SEL_GOOGLE_PROTOBUF_METHODOPTIONS_UNINTERPRETED_OPTION_ENDSEQ 4
 #define SEL_GOOGLE_PROTOBUF_METHODOPTIONS_UNINTERPRETED_OPTION_ENDSEQ 4
 #define SEL_GOOGLE_PROTOBUF_METHODOPTIONS_UNINTERPRETED_OPTION_ENDSUBMSG 5
 #define SEL_GOOGLE_PROTOBUF_METHODOPTIONS_UNINTERPRETED_OPTION_ENDSUBMSG 5
+#define SEL_GOOGLE_PROTOBUF_METHODOPTIONS_DEPRECATED_BOOL 6
+
+/* google.protobuf.OneofDescriptorProto */
+#define SEL_GOOGLE_PROTOBUF_ONEOFDESCRIPTORPROTO_NAME_STRING 2
+#define SEL_GOOGLE_PROTOBUF_ONEOFDESCRIPTORPROTO_NAME_STARTSTR 3
+#define SEL_GOOGLE_PROTOBUF_ONEOFDESCRIPTORPROTO_NAME_ENDSTR 4
 
 
 /* google.protobuf.ServiceDescriptorProto */
 /* google.protobuf.ServiceDescriptorProto */
 #define SEL_GOOGLE_PROTOBUF_SERVICEDESCRIPTORPROTO_METHOD_STARTSUBMSG 2
 #define SEL_GOOGLE_PROTOBUF_SERVICEDESCRIPTORPROTO_METHOD_STARTSUBMSG 2
@@ -6491,6 +6615,7 @@ typedef enum {
 #define SEL_GOOGLE_PROTOBUF_SERVICEOPTIONS_UNINTERPRETED_OPTION_STARTSEQ 3
 #define SEL_GOOGLE_PROTOBUF_SERVICEOPTIONS_UNINTERPRETED_OPTION_STARTSEQ 3
 #define SEL_GOOGLE_PROTOBUF_SERVICEOPTIONS_UNINTERPRETED_OPTION_ENDSEQ 4
 #define SEL_GOOGLE_PROTOBUF_SERVICEOPTIONS_UNINTERPRETED_OPTION_ENDSEQ 4
 #define SEL_GOOGLE_PROTOBUF_SERVICEOPTIONS_UNINTERPRETED_OPTION_ENDSUBMSG 5
 #define SEL_GOOGLE_PROTOBUF_SERVICEOPTIONS_UNINTERPRETED_OPTION_ENDSUBMSG 5
+#define SEL_GOOGLE_PROTOBUF_SERVICEOPTIONS_DEPRECATED_BOOL 6
 
 
 /* google.protobuf.SourceCodeInfo */
 /* google.protobuf.SourceCodeInfo */
 #define SEL_GOOGLE_PROTOBUF_SOURCECODEINFO_LOCATION_STARTSUBMSG 2
 #define SEL_GOOGLE_PROTOBUF_SOURCECODEINFO_LOCATION_STARTSUBMSG 2
@@ -6511,6 +6636,11 @@ typedef enum {
 #define SEL_GOOGLE_PROTOBUF_SOURCECODEINFO_LOCATION_TRAILING_COMMENTS_STRING 11
 #define SEL_GOOGLE_PROTOBUF_SOURCECODEINFO_LOCATION_TRAILING_COMMENTS_STRING 11
 #define SEL_GOOGLE_PROTOBUF_SOURCECODEINFO_LOCATION_TRAILING_COMMENTS_STARTSTR 12
 #define SEL_GOOGLE_PROTOBUF_SOURCECODEINFO_LOCATION_TRAILING_COMMENTS_STARTSTR 12
 #define SEL_GOOGLE_PROTOBUF_SOURCECODEINFO_LOCATION_TRAILING_COMMENTS_ENDSTR 13
 #define SEL_GOOGLE_PROTOBUF_SOURCECODEINFO_LOCATION_TRAILING_COMMENTS_ENDSTR 13
+#define SEL_GOOGLE_PROTOBUF_SOURCECODEINFO_LOCATION_LEADING_DETACHED_COMMENTS_STARTSEQ 14
+#define SEL_GOOGLE_PROTOBUF_SOURCECODEINFO_LOCATION_LEADING_DETACHED_COMMENTS_ENDSEQ 15
+#define SEL_GOOGLE_PROTOBUF_SOURCECODEINFO_LOCATION_LEADING_DETACHED_COMMENTS_STRING 16
+#define SEL_GOOGLE_PROTOBUF_SOURCECODEINFO_LOCATION_LEADING_DETACHED_COMMENTS_STARTSTR 17
+#define SEL_GOOGLE_PROTOBUF_SOURCECODEINFO_LOCATION_LEADING_DETACHED_COMMENTS_ENDSTR 18
 
 
 /* google.protobuf.UninterpretedOption */
 /* google.protobuf.UninterpretedOption */
 #define SEL_GOOGLE_PROTOBUF_UNINTERPRETEDOPTION_NAME_STARTSUBMSG 2
 #define SEL_GOOGLE_PROTOBUF_UNINTERPRETEDOPTION_NAME_STARTSUBMSG 2
@@ -6549,6 +6679,11 @@ UPB_INLINE const upb_msgdef *upbdefs_google_protobuf_DescriptorProto_ExtensionRa
   assert(m);
   assert(m);
   return m;
   return m;
 }
 }
+UPB_INLINE const upb_msgdef *upbdefs_google_protobuf_DescriptorProto_ReservedRange(const upb_symtab *s) {
+  const upb_msgdef *m = upb_symtab_lookupmsg(s, "google.protobuf.DescriptorProto.ReservedRange");
+  assert(m);
+  return m;
+}
 UPB_INLINE const upb_msgdef *upbdefs_google_protobuf_EnumDescriptorProto(const upb_symtab *s) {
 UPB_INLINE const upb_msgdef *upbdefs_google_protobuf_EnumDescriptorProto(const upb_symtab *s) {
   const upb_msgdef *m = upb_symtab_lookupmsg(s, "google.protobuf.EnumDescriptorProto");
   const upb_msgdef *m = upb_symtab_lookupmsg(s, "google.protobuf.EnumDescriptorProto");
   assert(m);
   assert(m);
@@ -6609,6 +6744,11 @@ UPB_INLINE const upb_msgdef *upbdefs_google_protobuf_MethodOptions(const upb_sym
   assert(m);
   assert(m);
   return m;
   return m;
 }
 }
+UPB_INLINE const upb_msgdef *upbdefs_google_protobuf_OneofDescriptorProto(const upb_symtab *s) {
+  const upb_msgdef *m = upb_symtab_lookupmsg(s, "google.protobuf.OneofDescriptorProto");
+  assert(m);
+  return m;
+}
 UPB_INLINE const upb_msgdef *upbdefs_google_protobuf_ServiceDescriptorProto(const upb_symtab *s) {
 UPB_INLINE const upb_msgdef *upbdefs_google_protobuf_ServiceDescriptorProto(const upb_symtab *s) {
   const upb_msgdef *m = upb_symtab_lookupmsg(s, "google.protobuf.ServiceDescriptorProto");
   const upb_msgdef *m = upb_symtab_lookupmsg(s, "google.protobuf.ServiceDescriptorProto");
   assert(m);
   assert(m);
@@ -6657,6 +6797,11 @@ UPB_INLINE const upb_enumdef *upbdefs_google_protobuf_FieldOptions_CType(const u
   assert(e);
   assert(e);
   return e;
   return e;
 }
 }
+UPB_INLINE const upb_enumdef *upbdefs_google_protobuf_FieldOptions_JSType(const upb_symtab *s) {
+  const upb_enumdef *e = upb_symtab_lookupenum(s, "google.protobuf.FieldOptions.JSType");
+  assert(e);
+  return e;
+}
 UPB_INLINE const upb_enumdef *upbdefs_google_protobuf_FileOptions_OptimizeMode(const upb_symtab *s) {
 UPB_INLINE const upb_enumdef *upbdefs_google_protobuf_FileOptions_OptimizeMode(const upb_symtab *s) {
   const upb_enumdef *e = upb_symtab_lookupenum(s, "google.protobuf.FileOptions.OptimizeMode");
   const upb_enumdef *e = upb_symtab_lookupenum(s, "google.protobuf.FileOptions.OptimizeMode");
   assert(e);
   assert(e);
@@ -6665,33 +6810,42 @@ UPB_INLINE const upb_enumdef *upbdefs_google_protobuf_FileOptions_OptimizeMode(c
 
 
 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_DescriptorProto_ExtensionRange_end(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_DescriptorProto_ExtensionRange(s), 2); }
 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_DescriptorProto_ExtensionRange_end(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_DescriptorProto_ExtensionRange(s), 2); }
 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_DescriptorProto_ExtensionRange_start(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_DescriptorProto_ExtensionRange(s), 1); }
 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_DescriptorProto_ExtensionRange_start(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_DescriptorProto_ExtensionRange(s), 1); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_DescriptorProto_ReservedRange_end(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_DescriptorProto_ReservedRange(s), 2); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_DescriptorProto_ReservedRange_start(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_DescriptorProto_ReservedRange(s), 1); }
 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_DescriptorProto_enum_type(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_DescriptorProto(s), 4); }
 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_DescriptorProto_enum_type(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_DescriptorProto(s), 4); }
 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_DescriptorProto_extension(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_DescriptorProto(s), 6); }
 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_DescriptorProto_extension(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_DescriptorProto(s), 6); }
 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_DescriptorProto_extension_range(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_DescriptorProto(s), 5); }
 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_DescriptorProto_extension_range(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_DescriptorProto(s), 5); }
 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_DescriptorProto_field(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_DescriptorProto(s), 2); }
 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_DescriptorProto_field(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_DescriptorProto(s), 2); }
 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_DescriptorProto_name(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_DescriptorProto(s), 1); }
 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_DescriptorProto_name(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_DescriptorProto(s), 1); }
 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_DescriptorProto_nested_type(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_DescriptorProto(s), 3); }
 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_DescriptorProto_nested_type(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_DescriptorProto(s), 3); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_DescriptorProto_oneof_decl(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_DescriptorProto(s), 8); }
 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_DescriptorProto_options(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_DescriptorProto(s), 7); }
 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_DescriptorProto_options(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_DescriptorProto(s), 7); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_DescriptorProto_reserved_name(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_DescriptorProto(s), 10); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_DescriptorProto_reserved_range(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_DescriptorProto(s), 9); }
 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_EnumDescriptorProto_name(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_EnumDescriptorProto(s), 1); }
 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_EnumDescriptorProto_name(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_EnumDescriptorProto(s), 1); }
 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_EnumDescriptorProto_options(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_EnumDescriptorProto(s), 3); }
 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_EnumDescriptorProto_options(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_EnumDescriptorProto(s), 3); }
 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_EnumDescriptorProto_value(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_EnumDescriptorProto(s), 2); }
 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_EnumDescriptorProto_value(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_EnumDescriptorProto(s), 2); }
 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_EnumOptions_allow_alias(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_EnumOptions(s), 2); }
 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_EnumOptions_allow_alias(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_EnumOptions(s), 2); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_EnumOptions_deprecated(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_EnumOptions(s), 3); }
 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_EnumOptions_uninterpreted_option(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_EnumOptions(s), 999); }
 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_EnumOptions_uninterpreted_option(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_EnumOptions(s), 999); }
 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_EnumValueDescriptorProto_name(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_EnumValueDescriptorProto(s), 1); }
 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_EnumValueDescriptorProto_name(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_EnumValueDescriptorProto(s), 1); }
 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_EnumValueDescriptorProto_number(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_EnumValueDescriptorProto(s), 2); }
 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_EnumValueDescriptorProto_number(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_EnumValueDescriptorProto(s), 2); }
 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_EnumValueDescriptorProto_options(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_EnumValueDescriptorProto(s), 3); }
 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_EnumValueDescriptorProto_options(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_EnumValueDescriptorProto(s), 3); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_EnumValueOptions_deprecated(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_EnumValueOptions(s), 1); }
 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_EnumValueOptions_uninterpreted_option(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_EnumValueOptions(s), 999); }
 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_EnumValueOptions_uninterpreted_option(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_EnumValueOptions(s), 999); }
 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldDescriptorProto_default_value(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FieldDescriptorProto(s), 7); }
 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldDescriptorProto_default_value(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FieldDescriptorProto(s), 7); }
 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldDescriptorProto_extendee(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FieldDescriptorProto(s), 2); }
 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldDescriptorProto_extendee(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FieldDescriptorProto(s), 2); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldDescriptorProto_json_name(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FieldDescriptorProto(s), 10); }
 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldDescriptorProto_label(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FieldDescriptorProto(s), 4); }
 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldDescriptorProto_label(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FieldDescriptorProto(s), 4); }
 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldDescriptorProto_name(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FieldDescriptorProto(s), 1); }
 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldDescriptorProto_name(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FieldDescriptorProto(s), 1); }
 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldDescriptorProto_number(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FieldDescriptorProto(s), 3); }
 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldDescriptorProto_number(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FieldDescriptorProto(s), 3); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldDescriptorProto_oneof_index(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FieldDescriptorProto(s), 9); }
 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldDescriptorProto_options(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FieldDescriptorProto(s), 8); }
 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldDescriptorProto_options(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FieldDescriptorProto(s), 8); }
 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldDescriptorProto_type(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FieldDescriptorProto(s), 5); }
 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldDescriptorProto_type(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FieldDescriptorProto(s), 5); }
 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldDescriptorProto_type_name(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FieldDescriptorProto(s), 6); }
 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldDescriptorProto_type_name(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FieldDescriptorProto(s), 6); }
 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldOptions_ctype(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FieldOptions(s), 1); }
 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldOptions_ctype(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FieldOptions(s), 1); }
 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldOptions_deprecated(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FieldOptions(s), 3); }
 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldOptions_deprecated(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FieldOptions(s), 3); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldOptions_experimental_map_key(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FieldOptions(s), 9); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldOptions_jstype(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FieldOptions(s), 6); }
 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldOptions_lazy(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FieldOptions(s), 5); }
 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldOptions_lazy(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FieldOptions(s), 5); }
 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldOptions_packed(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FieldOptions(s), 2); }
 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldOptions_packed(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FieldOptions(s), 2); }
 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldOptions_uninterpreted_option(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FieldOptions(s), 999); }
 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldOptions_uninterpreted_option(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FieldOptions(s), 999); }
@@ -6706,31 +6860,46 @@ UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileDescriptorProto_packa
 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileDescriptorProto_public_dependency(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FileDescriptorProto(s), 10); }
 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileDescriptorProto_public_dependency(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FileDescriptorProto(s), 10); }
 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileDescriptorProto_service(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FileDescriptorProto(s), 6); }
 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileDescriptorProto_service(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FileDescriptorProto(s), 6); }
 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileDescriptorProto_source_code_info(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FileDescriptorProto(s), 9); }
 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileDescriptorProto_source_code_info(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FileDescriptorProto(s), 9); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileDescriptorProto_syntax(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FileDescriptorProto(s), 12); }
 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileDescriptorProto_weak_dependency(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FileDescriptorProto(s), 11); }
 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileDescriptorProto_weak_dependency(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FileDescriptorProto(s), 11); }
 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileDescriptorSet_file(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FileDescriptorSet(s), 1); }
 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileDescriptorSet_file(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FileDescriptorSet(s), 1); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_cc_enable_arenas(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FileOptions(s), 31); }
 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_cc_generic_services(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FileOptions(s), 16); }
 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_cc_generic_services(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FileOptions(s), 16); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_csharp_namespace(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FileOptions(s), 37); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_deprecated(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FileOptions(s), 23); }
 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_go_package(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FileOptions(s), 11); }
 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_go_package(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FileOptions(s), 11); }
 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_java_generate_equals_and_hash(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FileOptions(s), 20); }
 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_java_generate_equals_and_hash(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FileOptions(s), 20); }
 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_java_generic_services(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FileOptions(s), 17); }
 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_java_generic_services(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FileOptions(s), 17); }
 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_java_multiple_files(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FileOptions(s), 10); }
 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_java_multiple_files(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FileOptions(s), 10); }
 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_java_outer_classname(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FileOptions(s), 8); }
 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_java_outer_classname(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FileOptions(s), 8); }
 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_java_package(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FileOptions(s), 1); }
 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_java_package(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FileOptions(s), 1); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_java_string_check_utf8(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FileOptions(s), 27); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_javanano_use_deprecated_package(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FileOptions(s), 38); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_objc_class_prefix(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FileOptions(s), 36); }
 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_optimize_for(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FileOptions(s), 9); }
 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_optimize_for(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FileOptions(s), 9); }
 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_py_generic_services(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FileOptions(s), 18); }
 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_py_generic_services(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FileOptions(s), 18); }
 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_uninterpreted_option(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FileOptions(s), 999); }
 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_uninterpreted_option(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FileOptions(s), 999); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_MessageOptions_deprecated(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_MessageOptions(s), 3); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_MessageOptions_map_entry(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_MessageOptions(s), 7); }
 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_MessageOptions_message_set_wire_format(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_MessageOptions(s), 1); }
 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_MessageOptions_message_set_wire_format(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_MessageOptions(s), 1); }
 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_MessageOptions_no_standard_descriptor_accessor(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_MessageOptions(s), 2); }
 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_MessageOptions_no_standard_descriptor_accessor(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_MessageOptions(s), 2); }
 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_MessageOptions_uninterpreted_option(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_MessageOptions(s), 999); }
 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_MessageOptions_uninterpreted_option(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_MessageOptions(s), 999); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_MethodDescriptorProto_client_streaming(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_MethodDescriptorProto(s), 5); }
 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_MethodDescriptorProto_input_type(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_MethodDescriptorProto(s), 2); }
 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_MethodDescriptorProto_input_type(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_MethodDescriptorProto(s), 2); }
 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_MethodDescriptorProto_name(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_MethodDescriptorProto(s), 1); }
 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_MethodDescriptorProto_name(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_MethodDescriptorProto(s), 1); }
 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_MethodDescriptorProto_options(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_MethodDescriptorProto(s), 4); }
 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_MethodDescriptorProto_options(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_MethodDescriptorProto(s), 4); }
 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_MethodDescriptorProto_output_type(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_MethodDescriptorProto(s), 3); }
 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_MethodDescriptorProto_output_type(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_MethodDescriptorProto(s), 3); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_MethodDescriptorProto_server_streaming(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_MethodDescriptorProto(s), 6); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_MethodOptions_deprecated(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_MethodOptions(s), 33); }
 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_MethodOptions_uninterpreted_option(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_MethodOptions(s), 999); }
 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_MethodOptions_uninterpreted_option(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_MethodOptions(s), 999); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_OneofDescriptorProto_name(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_OneofDescriptorProto(s), 1); }
 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_ServiceDescriptorProto_method(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_ServiceDescriptorProto(s), 2); }
 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_ServiceDescriptorProto_method(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_ServiceDescriptorProto(s), 2); }
 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_ServiceDescriptorProto_name(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_ServiceDescriptorProto(s), 1); }
 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_ServiceDescriptorProto_name(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_ServiceDescriptorProto(s), 1); }
 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_ServiceDescriptorProto_options(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_ServiceDescriptorProto(s), 3); }
 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_ServiceDescriptorProto_options(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_ServiceDescriptorProto(s), 3); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_ServiceOptions_deprecated(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_ServiceOptions(s), 33); }
 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_ServiceOptions_uninterpreted_option(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_ServiceOptions(s), 999); }
 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_ServiceOptions_uninterpreted_option(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_ServiceOptions(s), 999); }
 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_SourceCodeInfo_Location_leading_comments(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_SourceCodeInfo_Location(s), 3); }
 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_SourceCodeInfo_Location_leading_comments(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_SourceCodeInfo_Location(s), 3); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_SourceCodeInfo_Location_leading_detached_comments(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_SourceCodeInfo_Location(s), 6); }
 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_SourceCodeInfo_Location_path(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_SourceCodeInfo_Location(s), 1); }
 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_SourceCodeInfo_Location_path(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_SourceCodeInfo_Location(s), 1); }
 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_SourceCodeInfo_Location_span(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_SourceCodeInfo_Location(s), 2); }
 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_SourceCodeInfo_Location_span(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_SourceCodeInfo_Location(s), 2); }
 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_SourceCodeInfo_Location_trailing_comments(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_SourceCodeInfo_Location(s), 4); }
 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_SourceCodeInfo_Location_trailing_comments(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_SourceCodeInfo_Location(s), 4); }
@@ -6775,7 +6944,10 @@ inline upb::reffed_ptr<const upb::FieldDef> extension_range() { RETURN_REFFED(up
 inline upb::reffed_ptr<const upb::FieldDef> field() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_DescriptorProto_field) }
 inline upb::reffed_ptr<const upb::FieldDef> field() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_DescriptorProto_field) }
 inline upb::reffed_ptr<const upb::FieldDef> name() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_DescriptorProto_name) }
 inline upb::reffed_ptr<const upb::FieldDef> name() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_DescriptorProto_name) }
 inline upb::reffed_ptr<const upb::FieldDef> nested_type() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_DescriptorProto_nested_type) }
 inline upb::reffed_ptr<const upb::FieldDef> nested_type() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_DescriptorProto_nested_type) }
+inline upb::reffed_ptr<const upb::FieldDef> oneof_decl() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_DescriptorProto_oneof_decl) }
 inline upb::reffed_ptr<const upb::FieldDef> options() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_DescriptorProto_options) }
 inline upb::reffed_ptr<const upb::FieldDef> options() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_DescriptorProto_options) }
+inline upb::reffed_ptr<const upb::FieldDef> reserved_name() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_DescriptorProto_reserved_name) }
+inline upb::reffed_ptr<const upb::FieldDef> reserved_range() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_DescriptorProto_reserved_range) }
 }  /* namespace DescriptorProto */
 }  /* namespace DescriptorProto */
 }  /* namespace protobuf */
 }  /* namespace protobuf */
 }  /* namespace google */
 }  /* namespace google */
@@ -6792,6 +6964,18 @@ inline upb::reffed_ptr<const upb::FieldDef> start() { RETURN_REFFED(upb::FieldDe
 }  /* namespace protobuf */
 }  /* namespace protobuf */
 }  /* namespace google */
 }  /* namespace google */
 
 
+namespace google {
+namespace protobuf {
+namespace DescriptorProto {
+namespace ReservedRange {
+inline upb::reffed_ptr<const upb::MessageDef> MessageDef() { RETURN_REFFED(upb::MessageDef, upbdefs_google_protobuf_DescriptorProto_ReservedRange) }
+inline upb::reffed_ptr<const upb::FieldDef> end() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_DescriptorProto_ReservedRange_end) }
+inline upb::reffed_ptr<const upb::FieldDef> start() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_DescriptorProto_ReservedRange_start) }
+}  /* namespace ReservedRange */
+}  /* namespace DescriptorProto */
+}  /* namespace protobuf */
+}  /* namespace google */
+
 namespace google {
 namespace google {
 namespace protobuf {
 namespace protobuf {
 namespace EnumDescriptorProto {
 namespace EnumDescriptorProto {
@@ -6808,6 +6992,7 @@ namespace protobuf {
 namespace EnumOptions {
 namespace EnumOptions {
 inline upb::reffed_ptr<const upb::MessageDef> MessageDef() { RETURN_REFFED(upb::MessageDef, upbdefs_google_protobuf_EnumOptions) }
 inline upb::reffed_ptr<const upb::MessageDef> MessageDef() { RETURN_REFFED(upb::MessageDef, upbdefs_google_protobuf_EnumOptions) }
 inline upb::reffed_ptr<const upb::FieldDef> allow_alias() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_EnumOptions_allow_alias) }
 inline upb::reffed_ptr<const upb::FieldDef> allow_alias() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_EnumOptions_allow_alias) }
+inline upb::reffed_ptr<const upb::FieldDef> deprecated() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_EnumOptions_deprecated) }
 inline upb::reffed_ptr<const upb::FieldDef> uninterpreted_option() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_EnumOptions_uninterpreted_option) }
 inline upb::reffed_ptr<const upb::FieldDef> uninterpreted_option() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_EnumOptions_uninterpreted_option) }
 }  /* namespace EnumOptions */
 }  /* namespace EnumOptions */
 }  /* namespace protobuf */
 }  /* namespace protobuf */
@@ -6828,6 +7013,7 @@ namespace google {
 namespace protobuf {
 namespace protobuf {
 namespace EnumValueOptions {
 namespace EnumValueOptions {
 inline upb::reffed_ptr<const upb::MessageDef> MessageDef() { RETURN_REFFED(upb::MessageDef, upbdefs_google_protobuf_EnumValueOptions) }
 inline upb::reffed_ptr<const upb::MessageDef> MessageDef() { RETURN_REFFED(upb::MessageDef, upbdefs_google_protobuf_EnumValueOptions) }
+inline upb::reffed_ptr<const upb::FieldDef> deprecated() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_EnumValueOptions_deprecated) }
 inline upb::reffed_ptr<const upb::FieldDef> uninterpreted_option() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_EnumValueOptions_uninterpreted_option) }
 inline upb::reffed_ptr<const upb::FieldDef> uninterpreted_option() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_EnumValueOptions_uninterpreted_option) }
 }  /* namespace EnumValueOptions */
 }  /* namespace EnumValueOptions */
 }  /* namespace protobuf */
 }  /* namespace protobuf */
@@ -6839,9 +7025,11 @@ namespace FieldDescriptorProto {
 inline upb::reffed_ptr<const upb::MessageDef> MessageDef() { RETURN_REFFED(upb::MessageDef, upbdefs_google_protobuf_FieldDescriptorProto) }
 inline upb::reffed_ptr<const upb::MessageDef> MessageDef() { RETURN_REFFED(upb::MessageDef, upbdefs_google_protobuf_FieldDescriptorProto) }
 inline upb::reffed_ptr<const upb::FieldDef> default_value() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FieldDescriptorProto_default_value) }
 inline upb::reffed_ptr<const upb::FieldDef> default_value() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FieldDescriptorProto_default_value) }
 inline upb::reffed_ptr<const upb::FieldDef> extendee() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FieldDescriptorProto_extendee) }
 inline upb::reffed_ptr<const upb::FieldDef> extendee() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FieldDescriptorProto_extendee) }
+inline upb::reffed_ptr<const upb::FieldDef> json_name() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FieldDescriptorProto_json_name) }
 inline upb::reffed_ptr<const upb::FieldDef> label() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FieldDescriptorProto_label) }
 inline upb::reffed_ptr<const upb::FieldDef> label() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FieldDescriptorProto_label) }
 inline upb::reffed_ptr<const upb::FieldDef> name() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FieldDescriptorProto_name) }
 inline upb::reffed_ptr<const upb::FieldDef> name() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FieldDescriptorProto_name) }
 inline upb::reffed_ptr<const upb::FieldDef> number() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FieldDescriptorProto_number) }
 inline upb::reffed_ptr<const upb::FieldDef> number() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FieldDescriptorProto_number) }
+inline upb::reffed_ptr<const upb::FieldDef> oneof_index() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FieldDescriptorProto_oneof_index) }
 inline upb::reffed_ptr<const upb::FieldDef> options() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FieldDescriptorProto_options) }
 inline upb::reffed_ptr<const upb::FieldDef> options() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FieldDescriptorProto_options) }
 inline upb::reffed_ptr<const upb::FieldDef> type() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FieldDescriptorProto_type) }
 inline upb::reffed_ptr<const upb::FieldDef> type() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FieldDescriptorProto_type) }
 inline upb::reffed_ptr<const upb::FieldDef> type_name() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FieldDescriptorProto_type_name) }
 inline upb::reffed_ptr<const upb::FieldDef> type_name() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FieldDescriptorProto_type_name) }
@@ -6857,12 +7045,13 @@ namespace FieldOptions {
 inline upb::reffed_ptr<const upb::MessageDef> MessageDef() { RETURN_REFFED(upb::MessageDef, upbdefs_google_protobuf_FieldOptions) }
 inline upb::reffed_ptr<const upb::MessageDef> MessageDef() { RETURN_REFFED(upb::MessageDef, upbdefs_google_protobuf_FieldOptions) }
 inline upb::reffed_ptr<const upb::FieldDef> ctype() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FieldOptions_ctype) }
 inline upb::reffed_ptr<const upb::FieldDef> ctype() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FieldOptions_ctype) }
 inline upb::reffed_ptr<const upb::FieldDef> deprecated() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FieldOptions_deprecated) }
 inline upb::reffed_ptr<const upb::FieldDef> deprecated() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FieldOptions_deprecated) }
-inline upb::reffed_ptr<const upb::FieldDef> experimental_map_key() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FieldOptions_experimental_map_key) }
+inline upb::reffed_ptr<const upb::FieldDef> jstype() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FieldOptions_jstype) }
 inline upb::reffed_ptr<const upb::FieldDef> lazy() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FieldOptions_lazy) }
 inline upb::reffed_ptr<const upb::FieldDef> lazy() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FieldOptions_lazy) }
 inline upb::reffed_ptr<const upb::FieldDef> packed() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FieldOptions_packed) }
 inline upb::reffed_ptr<const upb::FieldDef> packed() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FieldOptions_packed) }
 inline upb::reffed_ptr<const upb::FieldDef> uninterpreted_option() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FieldOptions_uninterpreted_option) }
 inline upb::reffed_ptr<const upb::FieldDef> uninterpreted_option() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FieldOptions_uninterpreted_option) }
 inline upb::reffed_ptr<const upb::FieldDef> weak() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FieldOptions_weak) }
 inline upb::reffed_ptr<const upb::FieldDef> weak() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FieldOptions_weak) }
 inline upb::reffed_ptr<const upb::EnumDef> CType() { RETURN_REFFED(upb::EnumDef, upbdefs_google_protobuf_FieldOptions_CType) }
 inline upb::reffed_ptr<const upb::EnumDef> CType() { RETURN_REFFED(upb::EnumDef, upbdefs_google_protobuf_FieldOptions_CType) }
+inline upb::reffed_ptr<const upb::EnumDef> JSType() { RETURN_REFFED(upb::EnumDef, upbdefs_google_protobuf_FieldOptions_JSType) }
 }  /* namespace FieldOptions */
 }  /* namespace FieldOptions */
 }  /* namespace protobuf */
 }  /* namespace protobuf */
 }  /* namespace google */
 }  /* namespace google */
@@ -6881,6 +7070,7 @@ inline upb::reffed_ptr<const upb::FieldDef> package() { RETURN_REFFED(upb::Field
 inline upb::reffed_ptr<const upb::FieldDef> public_dependency() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FileDescriptorProto_public_dependency) }
 inline upb::reffed_ptr<const upb::FieldDef> public_dependency() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FileDescriptorProto_public_dependency) }
 inline upb::reffed_ptr<const upb::FieldDef> service() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FileDescriptorProto_service) }
 inline upb::reffed_ptr<const upb::FieldDef> service() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FileDescriptorProto_service) }
 inline upb::reffed_ptr<const upb::FieldDef> source_code_info() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FileDescriptorProto_source_code_info) }
 inline upb::reffed_ptr<const upb::FieldDef> source_code_info() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FileDescriptorProto_source_code_info) }
+inline upb::reffed_ptr<const upb::FieldDef> syntax() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FileDescriptorProto_syntax) }
 inline upb::reffed_ptr<const upb::FieldDef> weak_dependency() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FileDescriptorProto_weak_dependency) }
 inline upb::reffed_ptr<const upb::FieldDef> weak_dependency() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FileDescriptorProto_weak_dependency) }
 }  /* namespace FileDescriptorProto */
 }  /* namespace FileDescriptorProto */
 }  /* namespace protobuf */
 }  /* namespace protobuf */
@@ -6899,13 +7089,19 @@ namespace google {
 namespace protobuf {
 namespace protobuf {
 namespace FileOptions {
 namespace FileOptions {
 inline upb::reffed_ptr<const upb::MessageDef> MessageDef() { RETURN_REFFED(upb::MessageDef, upbdefs_google_protobuf_FileOptions) }
 inline upb::reffed_ptr<const upb::MessageDef> MessageDef() { RETURN_REFFED(upb::MessageDef, upbdefs_google_protobuf_FileOptions) }
+inline upb::reffed_ptr<const upb::FieldDef> cc_enable_arenas() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FileOptions_cc_enable_arenas) }
 inline upb::reffed_ptr<const upb::FieldDef> cc_generic_services() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FileOptions_cc_generic_services) }
 inline upb::reffed_ptr<const upb::FieldDef> cc_generic_services() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FileOptions_cc_generic_services) }
+inline upb::reffed_ptr<const upb::FieldDef> csharp_namespace() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FileOptions_csharp_namespace) }
+inline upb::reffed_ptr<const upb::FieldDef> deprecated() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FileOptions_deprecated) }
 inline upb::reffed_ptr<const upb::FieldDef> go_package() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FileOptions_go_package) }
 inline upb::reffed_ptr<const upb::FieldDef> go_package() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FileOptions_go_package) }
 inline upb::reffed_ptr<const upb::FieldDef> java_generate_equals_and_hash() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FileOptions_java_generate_equals_and_hash) }
 inline upb::reffed_ptr<const upb::FieldDef> java_generate_equals_and_hash() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FileOptions_java_generate_equals_and_hash) }
 inline upb::reffed_ptr<const upb::FieldDef> java_generic_services() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FileOptions_java_generic_services) }
 inline upb::reffed_ptr<const upb::FieldDef> java_generic_services() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FileOptions_java_generic_services) }
 inline upb::reffed_ptr<const upb::FieldDef> java_multiple_files() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FileOptions_java_multiple_files) }
 inline upb::reffed_ptr<const upb::FieldDef> java_multiple_files() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FileOptions_java_multiple_files) }
 inline upb::reffed_ptr<const upb::FieldDef> java_outer_classname() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FileOptions_java_outer_classname) }
 inline upb::reffed_ptr<const upb::FieldDef> java_outer_classname() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FileOptions_java_outer_classname) }
 inline upb::reffed_ptr<const upb::FieldDef> java_package() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FileOptions_java_package) }
 inline upb::reffed_ptr<const upb::FieldDef> java_package() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FileOptions_java_package) }
+inline upb::reffed_ptr<const upb::FieldDef> java_string_check_utf8() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FileOptions_java_string_check_utf8) }
+inline upb::reffed_ptr<const upb::FieldDef> javanano_use_deprecated_package() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FileOptions_javanano_use_deprecated_package) }
+inline upb::reffed_ptr<const upb::FieldDef> objc_class_prefix() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FileOptions_objc_class_prefix) }
 inline upb::reffed_ptr<const upb::FieldDef> optimize_for() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FileOptions_optimize_for) }
 inline upb::reffed_ptr<const upb::FieldDef> optimize_for() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FileOptions_optimize_for) }
 inline upb::reffed_ptr<const upb::FieldDef> py_generic_services() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FileOptions_py_generic_services) }
 inline upb::reffed_ptr<const upb::FieldDef> py_generic_services() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FileOptions_py_generic_services) }
 inline upb::reffed_ptr<const upb::FieldDef> uninterpreted_option() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FileOptions_uninterpreted_option) }
 inline upb::reffed_ptr<const upb::FieldDef> uninterpreted_option() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FileOptions_uninterpreted_option) }
@@ -6918,6 +7114,8 @@ namespace google {
 namespace protobuf {
 namespace protobuf {
 namespace MessageOptions {
 namespace MessageOptions {
 inline upb::reffed_ptr<const upb::MessageDef> MessageDef() { RETURN_REFFED(upb::MessageDef, upbdefs_google_protobuf_MessageOptions) }
 inline upb::reffed_ptr<const upb::MessageDef> MessageDef() { RETURN_REFFED(upb::MessageDef, upbdefs_google_protobuf_MessageOptions) }
+inline upb::reffed_ptr<const upb::FieldDef> deprecated() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_MessageOptions_deprecated) }
+inline upb::reffed_ptr<const upb::FieldDef> map_entry() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_MessageOptions_map_entry) }
 inline upb::reffed_ptr<const upb::FieldDef> message_set_wire_format() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_MessageOptions_message_set_wire_format) }
 inline upb::reffed_ptr<const upb::FieldDef> message_set_wire_format() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_MessageOptions_message_set_wire_format) }
 inline upb::reffed_ptr<const upb::FieldDef> no_standard_descriptor_accessor() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_MessageOptions_no_standard_descriptor_accessor) }
 inline upb::reffed_ptr<const upb::FieldDef> no_standard_descriptor_accessor() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_MessageOptions_no_standard_descriptor_accessor) }
 inline upb::reffed_ptr<const upb::FieldDef> uninterpreted_option() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_MessageOptions_uninterpreted_option) }
 inline upb::reffed_ptr<const upb::FieldDef> uninterpreted_option() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_MessageOptions_uninterpreted_option) }
@@ -6929,10 +7127,12 @@ namespace google {
 namespace protobuf {
 namespace protobuf {
 namespace MethodDescriptorProto {
 namespace MethodDescriptorProto {
 inline upb::reffed_ptr<const upb::MessageDef> MessageDef() { RETURN_REFFED(upb::MessageDef, upbdefs_google_protobuf_MethodDescriptorProto) }
 inline upb::reffed_ptr<const upb::MessageDef> MessageDef() { RETURN_REFFED(upb::MessageDef, upbdefs_google_protobuf_MethodDescriptorProto) }
+inline upb::reffed_ptr<const upb::FieldDef> client_streaming() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_MethodDescriptorProto_client_streaming) }
 inline upb::reffed_ptr<const upb::FieldDef> input_type() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_MethodDescriptorProto_input_type) }
 inline upb::reffed_ptr<const upb::FieldDef> input_type() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_MethodDescriptorProto_input_type) }
 inline upb::reffed_ptr<const upb::FieldDef> name() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_MethodDescriptorProto_name) }
 inline upb::reffed_ptr<const upb::FieldDef> name() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_MethodDescriptorProto_name) }
 inline upb::reffed_ptr<const upb::FieldDef> options() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_MethodDescriptorProto_options) }
 inline upb::reffed_ptr<const upb::FieldDef> options() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_MethodDescriptorProto_options) }
 inline upb::reffed_ptr<const upb::FieldDef> output_type() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_MethodDescriptorProto_output_type) }
 inline upb::reffed_ptr<const upb::FieldDef> output_type() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_MethodDescriptorProto_output_type) }
+inline upb::reffed_ptr<const upb::FieldDef> server_streaming() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_MethodDescriptorProto_server_streaming) }
 }  /* namespace MethodDescriptorProto */
 }  /* namespace MethodDescriptorProto */
 }  /* namespace protobuf */
 }  /* namespace protobuf */
 }  /* namespace google */
 }  /* namespace google */
@@ -6941,11 +7141,21 @@ namespace google {
 namespace protobuf {
 namespace protobuf {
 namespace MethodOptions {
 namespace MethodOptions {
 inline upb::reffed_ptr<const upb::MessageDef> MessageDef() { RETURN_REFFED(upb::MessageDef, upbdefs_google_protobuf_MethodOptions) }
 inline upb::reffed_ptr<const upb::MessageDef> MessageDef() { RETURN_REFFED(upb::MessageDef, upbdefs_google_protobuf_MethodOptions) }
+inline upb::reffed_ptr<const upb::FieldDef> deprecated() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_MethodOptions_deprecated) }
 inline upb::reffed_ptr<const upb::FieldDef> uninterpreted_option() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_MethodOptions_uninterpreted_option) }
 inline upb::reffed_ptr<const upb::FieldDef> uninterpreted_option() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_MethodOptions_uninterpreted_option) }
 }  /* namespace MethodOptions */
 }  /* namespace MethodOptions */
 }  /* namespace protobuf */
 }  /* namespace protobuf */
 }  /* namespace google */
 }  /* namespace google */
 
 
+namespace google {
+namespace protobuf {
+namespace OneofDescriptorProto {
+inline upb::reffed_ptr<const upb::MessageDef> MessageDef() { RETURN_REFFED(upb::MessageDef, upbdefs_google_protobuf_OneofDescriptorProto) }
+inline upb::reffed_ptr<const upb::FieldDef> name() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_OneofDescriptorProto_name) }
+}  /* namespace OneofDescriptorProto */
+}  /* namespace protobuf */
+}  /* namespace google */
+
 namespace google {
 namespace google {
 namespace protobuf {
 namespace protobuf {
 namespace ServiceDescriptorProto {
 namespace ServiceDescriptorProto {
@@ -6961,6 +7171,7 @@ namespace google {
 namespace protobuf {
 namespace protobuf {
 namespace ServiceOptions {
 namespace ServiceOptions {
 inline upb::reffed_ptr<const upb::MessageDef> MessageDef() { RETURN_REFFED(upb::MessageDef, upbdefs_google_protobuf_ServiceOptions) }
 inline upb::reffed_ptr<const upb::MessageDef> MessageDef() { RETURN_REFFED(upb::MessageDef, upbdefs_google_protobuf_ServiceOptions) }
+inline upb::reffed_ptr<const upb::FieldDef> deprecated() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_ServiceOptions_deprecated) }
 inline upb::reffed_ptr<const upb::FieldDef> uninterpreted_option() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_ServiceOptions_uninterpreted_option) }
 inline upb::reffed_ptr<const upb::FieldDef> uninterpreted_option() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_ServiceOptions_uninterpreted_option) }
 }  /* namespace ServiceOptions */
 }  /* namespace ServiceOptions */
 }  /* namespace protobuf */
 }  /* namespace protobuf */
@@ -6981,6 +7192,7 @@ namespace SourceCodeInfo {
 namespace Location {
 namespace Location {
 inline upb::reffed_ptr<const upb::MessageDef> MessageDef() { RETURN_REFFED(upb::MessageDef, upbdefs_google_protobuf_SourceCodeInfo_Location) }
 inline upb::reffed_ptr<const upb::MessageDef> MessageDef() { RETURN_REFFED(upb::MessageDef, upbdefs_google_protobuf_SourceCodeInfo_Location) }
 inline upb::reffed_ptr<const upb::FieldDef> leading_comments() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_SourceCodeInfo_Location_leading_comments) }
 inline upb::reffed_ptr<const upb::FieldDef> leading_comments() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_SourceCodeInfo_Location_leading_comments) }
+inline upb::reffed_ptr<const upb::FieldDef> leading_detached_comments() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_SourceCodeInfo_Location_leading_detached_comments) }
 inline upb::reffed_ptr<const upb::FieldDef> path() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_SourceCodeInfo_Location_path) }
 inline upb::reffed_ptr<const upb::FieldDef> path() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_SourceCodeInfo_Location_path) }
 inline upb::reffed_ptr<const upb::FieldDef> span() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_SourceCodeInfo_Location_span) }
 inline upb::reffed_ptr<const upb::FieldDef> span() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_SourceCodeInfo_Location_span) }
 inline upb::reffed_ptr<const upb::FieldDef> trailing_comments() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_SourceCodeInfo_Location_trailing_comments) }
 inline upb::reffed_ptr<const upb::FieldDef> trailing_comments() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_SourceCodeInfo_Location_trailing_comments) }
@@ -7067,6 +7279,13 @@ UPB_DECLARE_TYPE(upb::pb::DecoderMethodOptions, upb_pbdecodermethodopts)
 UPB_DECLARE_DERIVED_TYPE(upb::pb::DecoderMethod, upb::RefCounted,
 UPB_DECLARE_DERIVED_TYPE(upb::pb::DecoderMethod, upb::RefCounted,
                          upb_pbdecodermethod, upb_refcounted)
                          upb_pbdecodermethod, upb_refcounted)
 
 
+/* The maximum number of bytes we are required to buffer internally between
+ * calls to the decoder.  The value is 14: a 5 byte unknown tag plus ten-byte
+ * varint, less one because we are buffering an incomplete value.
+ *
+ * Should only be used by unit tests. */
+#define UPB_DECODER_MAX_RESIDUAL_BYTES 14
+
 #ifdef __cplusplus
 #ifdef __cplusplus
 
 
 /* The parameters one uses to construct a DecoderMethod.
 /* The parameters one uses to construct a DecoderMethod.
@@ -7541,11 +7760,8 @@ struct upb_pbdecoder {
   /* Overall stream offset of "buf." */
   /* Overall stream offset of "buf." */
   uint64_t bufstart_ofs;
   uint64_t bufstart_ofs;
 
 
-  /* Buffer for residual bytes not parsed from the previous buffer.
-   * The maximum number of residual bytes we require is 12; a five-byte
-   * unknown tag plus an eight-byte value, less one because the value
-   * is only a partial value. */
-  char residual[12];
+  /* Buffer for residual bytes not parsed from the previous buffer. */
+  char residual[UPB_DECODER_MAX_RESIDUAL_BYTES];
   char *residual_end;
   char *residual_end;
 
 
   /* Bytes of data that should be discarded from the input beore we start
   /* Bytes of data that should be discarded from the input beore we start
@@ -8083,11 +8299,14 @@ inline reffed_ptr<const Handlers> TextPrinter::NewHandlers(
 namespace upb {
 namespace upb {
 namespace json {
 namespace json {
 class Parser;
 class Parser;
+class ParserMethod;
 }  /* namespace json */
 }  /* namespace json */
 }  /* namespace upb */
 }  /* namespace upb */
 #endif
 #endif
 
 
 UPB_DECLARE_TYPE(upb::json::Parser, upb_json_parser)
 UPB_DECLARE_TYPE(upb::json::Parser, upb_json_parser)
+UPB_DECLARE_DERIVED_TYPE(upb::json::ParserMethod, upb::RefCounted,
+                         upb_json_parsermethod, upb_refcounted)
 
 
 /* upb::json::Parser **********************************************************/
 /* upb::json::Parser **********************************************************/
 
 
@@ -8095,7 +8314,7 @@ UPB_DECLARE_TYPE(upb::json::Parser, upb_json_parser)
  * constructed.  This hint may be an overestimate for some build configurations.
  * constructed.  This hint may be an overestimate for some build configurations.
  * But if the parser library is upgraded without recompiling the application,
  * But if the parser library is upgraded without recompiling the application,
  * it may be an underestimate. */
  * it may be an underestimate. */
-#define UPB_JSON_PARSER_SIZE 3704
+#define UPB_JSON_PARSER_SIZE 4104
 
 
 #ifdef __cplusplus
 #ifdef __cplusplus
 
 
@@ -8103,7 +8322,8 @@ UPB_DECLARE_TYPE(upb::json::Parser, upb_json_parser)
  * sink. */
  * sink. */
 class upb::json::Parser {
 class upb::json::Parser {
  public:
  public:
-  static Parser* Create(Environment* env, Sink* output);
+  static Parser* Create(Environment* env, const ParserMethod* method,
+                        Sink* output);
 
 
   BytesSink* input();
   BytesSink* input();
 
 
@@ -8111,25 +8331,72 @@ class upb::json::Parser {
   UPB_DISALLOW_POD_OPS(Parser, upb::json::Parser)
   UPB_DISALLOW_POD_OPS(Parser, upb::json::Parser)
 };
 };
 
 
+class upb::json::ParserMethod {
+ public:
+  /* Include base methods from upb::ReferenceCounted. */
+  UPB_REFCOUNTED_CPPMETHODS
+
+  /* Returns handlers for parsing according to the specified schema. */
+  static reffed_ptr<const ParserMethod> New(const upb::MessageDef* md);
+
+  /* The destination handlers that are statically bound to this method.
+   * This method is only capable of outputting to a sink that uses these
+   * handlers. */
+  const Handlers* dest_handlers() const;
+
+  /* The input handlers for this decoder method. */
+  const BytesHandler* input_handler() const;
+
+ private:
+  UPB_DISALLOW_POD_OPS(ParserMethod, upb::json::ParserMethod)
+};
+
 #endif
 #endif
 
 
 UPB_BEGIN_EXTERN_C
 UPB_BEGIN_EXTERN_C
 
 
-upb_json_parser *upb_json_parser_create(upb_env *e, upb_sink *output);
+upb_json_parser* upb_json_parser_create(upb_env* e,
+                                        const upb_json_parsermethod* m,
+                                        upb_sink* output);
 upb_bytessink *upb_json_parser_input(upb_json_parser *p);
 upb_bytessink *upb_json_parser_input(upb_json_parser *p);
 
 
+upb_json_parsermethod* upb_json_parsermethod_new(const upb_msgdef* md,
+                                                 const void* owner);
+const upb_handlers *upb_json_parsermethod_desthandlers(
+    const upb_json_parsermethod *m);
+const upb_byteshandler *upb_json_parsermethod_inputhandler(
+    const upb_json_parsermethod *m);
+
+/* Include refcounted methods like upb_json_parsermethod_ref(). */
+UPB_REFCOUNTED_CMETHODS(upb_json_parsermethod, upb_json_parsermethod_upcast)
+
 UPB_END_EXTERN_C
 UPB_END_EXTERN_C
 
 
 #ifdef __cplusplus
 #ifdef __cplusplus
 
 
 namespace upb {
 namespace upb {
 namespace json {
 namespace json {
-inline Parser* Parser::Create(Environment* env, Sink* output) {
-  return upb_json_parser_create(env, output);
+inline Parser* Parser::Create(Environment* env, const ParserMethod* method,
+                              Sink* output) {
+  return upb_json_parser_create(env, method, output);
 }
 }
 inline BytesSink* Parser::input() {
 inline BytesSink* Parser::input() {
   return upb_json_parser_input(this);
   return upb_json_parser_input(this);
 }
 }
+
+inline const Handlers* ParserMethod::dest_handlers() const {
+  return upb_json_parsermethod_desthandlers(this);
+}
+inline const BytesHandler* ParserMethod::input_handler() const {
+  return upb_json_parsermethod_inputhandler(this);
+}
+/* static */
+inline reffed_ptr<const ParserMethod> ParserMethod::New(
+    const MessageDef* md) {
+  const upb_json_parsermethod *m = upb_json_parsermethod_new(md, &m);
+  return reffed_ptr<const ParserMethod>(m, &m);
+}
+
 }  /* namespace json */
 }  /* namespace json */
 }  /* namespace upb */
 }  /* namespace upb */
 
 

+ 1 - 1
ruby/tests/basic.rb

@@ -1160,7 +1160,7 @@ module BasicTest
       # TODO: Fix JSON in JRuby version.
       # TODO: Fix JSON in JRuby version.
       return if RUBY_PLATFORM == "java"
       return if RUBY_PLATFORM == "java"
       m = MapMessage.new(:map_string_int32 => {"a" => 1})
       m = MapMessage.new(:map_string_int32 => {"a" => 1})
-      expected = '{"map_string_int32":{"a":1},"map_string_msg":{}}'
+      expected = '{"mapStringInt32":{"a":1},"mapStringMsg":{}}'
       assert MapMessage.encode_json(m) == expected
       assert MapMessage.encode_json(m) == expected
       m2 = MapMessage.decode_json(MapMessage.encode_json(m))
       m2 = MapMessage.decode_json(MapMessage.encode_json(m))
       assert m == m2
       assert m == m2

+ 0 - 74
ruby/tests/generated_code.rb

@@ -1,74 +0,0 @@
-# Generated by the protocol buffer compiler.  DO NOT EDIT!
-# source: generated_code.proto
-
-require 'google/protobuf'
-
-Google::Protobuf::DescriptorPool.generated_pool.build do
-  add_message "A.B.C.TestMessage" do
-    optional :optional_int32, :int32, 1
-    optional :optional_int64, :int64, 2
-    optional :optional_uint32, :uint32, 3
-    optional :optional_uint64, :uint64, 4
-    optional :optional_bool, :bool, 5
-    optional :optional_double, :double, 6
-    optional :optional_float, :float, 7
-    optional :optional_string, :string, 8
-    optional :optional_bytes, :string, 9
-    optional :optional_enum, :enum, 10, "A.B.C.TestEnum"
-    optional :optional_msg, :message, 11, "A.B.C.TestMessage"
-    repeated :repeated_int32, :int32, 21
-    repeated :repeated_int64, :int64, 22
-    repeated :repeated_uint32, :uint32, 23
-    repeated :repeated_uint64, :uint64, 24
-    repeated :repeated_bool, :bool, 25
-    repeated :repeated_double, :double, 26
-    repeated :repeated_float, :float, 27
-    repeated :repeated_string, :string, 28
-    repeated :repeated_bytes, :string, 29
-    repeated :repeated_enum, :enum, 30, "A.B.C.TestEnum"
-    repeated :repeated_msg, :message, 31, "A.B.C.TestMessage"
-    map :map_int32_string, :int32, :string, 61
-    map :map_int64_string, :int64, :string, 62
-    map :map_uint32_string, :uint32, :string, 63
-    map :map_uint64_string, :uint64, :string, 64
-    map :map_bool_string, :bool, :string, 65
-    map :map_string_string, :string, :string, 66
-    map :map_string_msg, :string, :message, 67, "A.B.C.TestMessage"
-    map :map_string_enum, :string, :enum, 68, "A.B.C.TestEnum"
-    map :map_string_int32, :string, :int32, 69
-    map :map_string_bool, :string, :bool, 70
-    optional :nested_message, :message, 80, "A.B.C.TestMessage.NestedMessage"
-    oneof :my_oneof do
-      optional :oneof_int32, :int32, 41
-      optional :oneof_int64, :int64, 42
-      optional :oneof_uint32, :uint32, 43
-      optional :oneof_uint64, :uint64, 44
-      optional :oneof_bool, :bool, 45
-      optional :oneof_double, :double, 46
-      optional :oneof_float, :float, 47
-      optional :oneof_string, :string, 48
-      optional :oneof_bytes, :string, 49
-      optional :oneof_enum, :enum, 50, "A.B.C.TestEnum"
-      optional :oneof_msg, :message, 51, "A.B.C.TestMessage"
-    end
-  end
-  add_message "A.B.C.TestMessage.NestedMessage" do
-    optional :foo, :int32, 1
-  end
-  add_enum "A.B.C.TestEnum" do
-    value :Default, 0
-    value :A, 1
-    value :B, 2
-    value :C, 3
-  end
-end
-
-module A
-  module B
-    module C
-      TestMessage = Google::Protobuf::DescriptorPool.generated_pool.lookup("A.B.C.TestMessage").msgclass
-      TestMessage::NestedMessage = Google::Protobuf::DescriptorPool.generated_pool.lookup("A.B.C.TestMessage.NestedMessage").msgclass
-      TestEnum = Google::Protobuf::DescriptorPool.generated_pool.lookup("A.B.C.TestEnum").enummodule
-    end
-  end
-end

+ 45 - 26
src/google/protobuf/compiler/objectivec/objectivec_enum.cc

@@ -80,10 +80,12 @@ void EnumGenerator::GenerateHeader(io::Printer* printer) {
   if (HasPreservingUnknownEnumSemantics(descriptor_->file())) {
   if (HasPreservingUnknownEnumSemantics(descriptor_->file())) {
     // Include the unknown value.
     // Include the unknown value.
     printer->Print(
     printer->Print(
+      "/// Value used if any message's field encounters a value that is not defined\n"
+      "/// by this enum. The message will also have C functions to get/set the rawValue\n"
+      "/// of the field.\n"
       "$name$_GPBUnrecognizedEnumeratorValue = kGPBUnrecognizedEnumeratorValue,\n",
       "$name$_GPBUnrecognizedEnumeratorValue = kGPBUnrecognizedEnumeratorValue,\n",
       "name", name_);
       "name", name_);
   }
   }
-
   for (int i = 0; i < all_values_.size(); i++) {
   for (int i = 0; i < all_values_.size(); i++) {
     SourceLocation location;
     SourceLocation location;
     if (all_values_[i]->GetSourceLocation(&location)) {
     if (all_values_[i]->GetSourceLocation(&location)) {
@@ -107,6 +109,8 @@ void EnumGenerator::GenerateHeader(io::Printer* printer) {
       "\n"
       "\n"
       "GPBEnumDescriptor *$name$_EnumDescriptor(void);\n"
       "GPBEnumDescriptor *$name$_EnumDescriptor(void);\n"
       "\n"
       "\n"
+      "/// Checks to see if the given value is defined by the enum or was not known at\n"
+      "/// the time this source was generated.\n"
       "BOOL $name$_IsValidValue(int32_t value);\n"
       "BOOL $name$_IsValidValue(int32_t value);\n"
       "\n",
       "\n",
       "name", name_);
       "name", name_);
@@ -118,16 +122,6 @@ void EnumGenerator::GenerateSource(io::Printer* printer) {
       "\n",
       "\n",
       "name", name_);
       "name", name_);
 
 
-  printer->Print(
-      "GPBEnumDescriptor *$name$_EnumDescriptor(void) {\n"
-      "  static GPBEnumDescriptor *descriptor = NULL;\n"
-      "  if (!descriptor) {\n"
-      "    static GPBMessageEnumValueDescription values[] = {\n",
-      "name", name_);
-  printer->Indent();
-  printer->Indent();
-  printer->Indent();
-
   // Note: For the TextFormat decode info, we can't use the enum value as
   // Note: For the TextFormat decode info, we can't use the enum value as
   // the key because protocol buffer enums have 'allow_alias', which lets
   // the key because protocol buffer enums have 'allow_alias', which lets
   // a value be used more than once. Instead, the index into the list of
   // a value be used more than once. Instead, the index into the list of
@@ -135,41 +129,66 @@ void EnumGenerator::GenerateSource(io::Printer* printer) {
   // will be zero.
   // will be zero.
   TextFormatDecodeData text_format_decode_data;
   TextFormatDecodeData text_format_decode_data;
   int enum_value_description_key = -1;
   int enum_value_description_key = -1;
+  string text_blob;
 
 
   for (int i = 0; i < all_values_.size(); i++) {
   for (int i = 0; i < all_values_.size(); i++) {
     ++enum_value_description_key;
     ++enum_value_description_key;
     string short_name(EnumValueShortName(all_values_[i]));
     string short_name(EnumValueShortName(all_values_[i]));
-    printer->Print("{ .name = \"$short_name$\", .number = $name$ },\n",
-                   "short_name", short_name,
-                   "name", EnumValueName(all_values_[i]));
+    text_blob += short_name + '\0';
     if (UnCamelCaseEnumShortName(short_name) != all_values_[i]->name()) {
     if (UnCamelCaseEnumShortName(short_name) != all_values_[i]->name()) {
       text_format_decode_data.AddString(enum_value_description_key, short_name,
       text_format_decode_data.AddString(enum_value_description_key, short_name,
                                         all_values_[i]->name());
                                         all_values_[i]->name());
     }
     }
   }
   }
-  printer->Outdent();
-  printer->Outdent();
-  printer->Outdent();
+
+  printer->Print(
+      "GPBEnumDescriptor *$name$_EnumDescriptor(void) {\n"
+      "  static GPBEnumDescriptor *descriptor = NULL;\n"
+      "  if (!descriptor) {\n",
+      "name", name_);
+
+  static const int kBytesPerLine = 40;  // allow for escaping
+  printer->Print(
+      "    static const char *valueNames =");
+  for (int i = 0; i < text_blob.size(); i += kBytesPerLine) {
+    printer->Print(
+        "\n        \"$data$\"",
+        "data", EscapeTrigraphs(CEscape(text_blob.substr(i, kBytesPerLine))));
+  }
+  printer->Print(
+      ";\n"
+      "    static const int32_t values[] = {\n");
+  for (int i = 0; i < all_values_.size(); i++) {
+    printer->Print("        $name$,\n",  "name", EnumValueName(all_values_[i]));
+  }
   printer->Print("    };\n");
   printer->Print("    };\n");
+
   if (text_format_decode_data.num_entries() == 0) {
   if (text_format_decode_data.num_entries() == 0) {
     printer->Print(
     printer->Print(
-        "    descriptor = [GPBEnumDescriptor allocDescriptorForName:GPBNSStringifySymbol($name$)\n"
-        "                                                   values:values\n"
-        "                                               valueCount:sizeof(values) / sizeof(GPBMessageEnumValueDescription)\n"
-        "                                             enumVerifier:$name$_IsValidValue];\n",
+        "    GPBEnumDescriptor *worker =\n"
+        "        [GPBEnumDescriptor allocDescriptorForName:GPBNSStringifySymbol($name$)\n"
+        "                                       valueNames:valueNames\n"
+        "                                           values:values\n"
+        "                                            count:(uint32_t)(sizeof(values) / sizeof(int32_t))\n"
+        "                                     enumVerifier:$name$_IsValidValue];\n",
         "name", name_);
         "name", name_);
     } else {
     } else {
       printer->Print(
       printer->Print(
         "    static const char *extraTextFormatInfo = \"$extraTextFormatInfo$\";\n"
         "    static const char *extraTextFormatInfo = \"$extraTextFormatInfo$\";\n"
-        "    descriptor = [GPBEnumDescriptor allocDescriptorForName:GPBNSStringifySymbol($name$)\n"
-        "                                                   values:values\n"
-        "                                               valueCount:sizeof(values) / sizeof(GPBMessageEnumValueDescription)\n"
-        "                                             enumVerifier:$name$_IsValidValue\n"
-        "                                      extraTextFormatInfo:extraTextFormatInfo];\n",
+        "    GPBEnumDescriptor *worker =\n"
+        "        [GPBEnumDescriptor allocDescriptorForName:GPBNSStringifySymbol($name$)\n"
+        "                                       valueNames:valueNames\n"
+        "                                           values:values\n"
+        "                                            count:(uint32_t)(sizeof(values) / sizeof(int32_t))\n"
+        "                                     enumVerifier:$name$_IsValidValue\n"
+        "                              extraTextFormatInfo:extraTextFormatInfo];\n",
         "name", name_,
         "name", name_,
         "extraTextFormatInfo", CEscape(text_format_decode_data.Data()));
         "extraTextFormatInfo", CEscape(text_format_decode_data.Data()));
     }
     }
     printer->Print(
     printer->Print(
+      "    if (!OSAtomicCompareAndSwapPtrBarrier(nil, worker, (void * volatile *)&descriptor)) {\n"
+      "      [worker release];\n"
+      "    }\n"
       "  }\n"
       "  }\n"
       "  return descriptor;\n"
       "  return descriptor;\n"
       "}\n\n");
       "}\n\n");

+ 8 - 14
src/google/protobuf/compiler/objectivec/objectivec_enum_field.cc

@@ -59,6 +59,9 @@ void SetEnumVariables(const FieldDescriptor* descriptor,
   (*variables)["enum_verifier"] = type + "_IsValidValue";
   (*variables)["enum_verifier"] = type + "_IsValidValue";
   (*variables)["enum_desc_func"] = type + "_EnumDescriptor";
   (*variables)["enum_desc_func"] = type + "_EnumDescriptor";
 
 
+  (*variables)["dataTypeSpecific_name"] = "enumDescFunc";
+  (*variables)["dataTypeSpecific_value"] = (*variables)["enum_desc_func"];
+
   const Descriptor* msg_descriptor = descriptor->containing_type();
   const Descriptor* msg_descriptor = descriptor->containing_type();
   (*variables)["owning_message_class"] = ClassName(msg_descriptor);
   (*variables)["owning_message_class"] = ClassName(msg_descriptor);
 }
 }
@@ -72,13 +75,6 @@ EnumFieldGenerator::EnumFieldGenerator(const FieldDescriptor* descriptor,
 
 
 EnumFieldGenerator::~EnumFieldGenerator() {}
 EnumFieldGenerator::~EnumFieldGenerator() {}
 
 
-void EnumFieldGenerator::GenerateFieldDescriptionTypeSpecific(
-    io::Printer* printer) const {
-  printer->Print(
-      variables_,
-      "  .dataTypeSpecific.enumDescFunc = $enum_desc_func$,\n");
-}
-
 void EnumFieldGenerator::GenerateCFunctionDeclarations(
 void EnumFieldGenerator::GenerateCFunctionDeclarations(
     io::Printer* printer) const {
     io::Printer* printer) const {
   if (!HasPreservingUnknownEnumSemantics(descriptor_->file())) {
   if (!HasPreservingUnknownEnumSemantics(descriptor_->file())) {
@@ -87,7 +83,12 @@ void EnumFieldGenerator::GenerateCFunctionDeclarations(
 
 
   printer->Print(
   printer->Print(
       variables_,
       variables_,
+      "/// Fetches the raw value of a @c $owning_message_class$'s @c $name$ property, even\n"
+      "/// if the value was not defined by the enum at the time the code was generated.\n"
       "int32_t $owning_message_class$_$capitalized_name$_RawValue($owning_message_class$ *message);\n"
       "int32_t $owning_message_class$_$capitalized_name$_RawValue($owning_message_class$ *message);\n"
+      "/// Sets the raw value of an @c $owning_message_class$'s @c $name$ property, allowing\n"
+      "/// it to be set to a value that was not defined by the enum at the time the code\n"
+      "/// was generated.\n"
       "void Set$owning_message_class$_$capitalized_name$_RawValue($owning_message_class$ *message, int32_t value);\n"
       "void Set$owning_message_class$_$capitalized_name$_RawValue($owning_message_class$ *message, int32_t value);\n"
       "\n");
       "\n");
 }
 }
@@ -140,13 +141,6 @@ void RepeatedEnumFieldGenerator::FinishInitialization(void) {
       "// |" + variables_["name"] + "| contains |" + variables_["storage_type"] + "|\n";
       "// |" + variables_["name"] + "| contains |" + variables_["storage_type"] + "|\n";
 }
 }
 
 
-void RepeatedEnumFieldGenerator::GenerateFieldDescriptionTypeSpecific(
-    io::Printer* printer) const {
-  printer->Print(
-      variables_,
-      "  .dataTypeSpecific.enumDescFunc = $enum_desc_func$,\n");
-}
-
 }  // namespace objectivec
 }  // namespace objectivec
 }  // namespace compiler
 }  // namespace compiler
 }  // namespace protobuf
 }  // namespace protobuf

+ 0 - 2
src/google/protobuf/compiler/objectivec/objectivec_enum_field.h

@@ -45,7 +45,6 @@ class EnumFieldGenerator : public SingleFieldGenerator {
                                               const Options& options);
                                               const Options& options);
 
 
  public:
  public:
-  virtual void GenerateFieldDescriptionTypeSpecific(io::Printer* printer) const;
   virtual void GenerateCFunctionDeclarations(io::Printer* printer) const;
   virtual void GenerateCFunctionDeclarations(io::Printer* printer) const;
   virtual void GenerateCFunctionImplementations(io::Printer* printer) const;
   virtual void GenerateCFunctionImplementations(io::Printer* printer) const;
   virtual void DetermineForwardDeclarations(set<string>* fwd_decls) const;
   virtual void DetermineForwardDeclarations(set<string>* fwd_decls) const;
@@ -64,7 +63,6 @@ class RepeatedEnumFieldGenerator : public RepeatedFieldGenerator {
 
 
  public:
  public:
   virtual void FinishInitialization();
   virtual void FinishInitialization();
-  virtual void GenerateFieldDescriptionTypeSpecific(io::Printer* printer) const;
 
 
  protected:
  protected:
   RepeatedEnumFieldGenerator(const FieldDescriptor* descriptor,
   RepeatedEnumFieldGenerator(const FieldDescriptor* descriptor,

+ 4 - 4
src/google/protobuf/compiler/objectivec/objectivec_extension.cc

@@ -114,14 +114,14 @@ void ExtensionGenerator::GenerateStaticVariablesInitialization(
 
 
   printer->Print(vars,
   printer->Print(vars,
                  "{\n"
                  "{\n"
+                 "  .defaultValue.$default_name$ = $default$,\n"
                  "  .singletonName = GPBStringifySymbol($root_class_and_method_name$),\n"
                  "  .singletonName = GPBStringifySymbol($root_class_and_method_name$),\n"
-                 "  .dataType = $extension_type$,\n"
                  "  .extendedClass = GPBStringifySymbol($extended_type$),\n"
                  "  .extendedClass = GPBStringifySymbol($extended_type$),\n"
-                 "  .fieldNumber = $number$,\n"
-                 "  .defaultValue.$default_name$ = $default$,\n"
                  "  .messageOrGroupClassName = $type$,\n"
                  "  .messageOrGroupClassName = $type$,\n"
-                 "  .options = $options$,\n"
                  "  .enumDescriptorFunc = $enum_desc_func_name$,\n"
                  "  .enumDescriptorFunc = $enum_desc_func_name$,\n"
+                 "  .fieldNumber = $number$,\n"
+                 "  .dataType = $extension_type$,\n"
+                 "  .options = $options$,\n"
                  "},\n");
                  "},\n");
 }
 }
 
 

+ 95 - 61
src/google/protobuf/compiler/objectivec/objectivec_field.cc

@@ -28,6 +28,8 @@
 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 
+#include <iostream>
+
 #include <google/protobuf/compiler/objectivec/objectivec_field.h>
 #include <google/protobuf/compiler/objectivec/objectivec_field.h>
 #include <google/protobuf/compiler/objectivec/objectivec_helpers.h>
 #include <google/protobuf/compiler/objectivec/objectivec_helpers.h>
 #include <google/protobuf/compiler/objectivec/objectivec_enum_field.h>
 #include <google/protobuf/compiler/objectivec/objectivec_enum_field.h>
@@ -75,7 +77,6 @@ void SetCommonFieldVariables(const FieldDescriptor* descriptor,
   (*variables)["field_number_name"] =
   (*variables)["field_number_name"] =
       classname + "_FieldNumber_" + capitalized_name;
       classname + "_FieldNumber_" + capitalized_name;
   (*variables)["field_number"] = SimpleItoa(descriptor->number());
   (*variables)["field_number"] = SimpleItoa(descriptor->number());
-  (*variables)["has_index"] = SimpleItoa(descriptor->index());
   (*variables)["field_type"] = GetCapitalizedType(descriptor);
   (*variables)["field_type"] = GetCapitalizedType(descriptor);
   std::vector<string> field_flags;
   std::vector<string> field_flags;
   if (descriptor->is_repeated()) field_flags.push_back("GPBFieldRepeated");
   if (descriptor->is_repeated()) field_flags.push_back("GPBFieldRepeated");
@@ -99,18 +100,9 @@ void SetCommonFieldVariables(const FieldDescriptor* descriptor,
   (*variables)["dataTypeSpecific_name"] = "className";
   (*variables)["dataTypeSpecific_name"] = "className";
   (*variables)["dataTypeSpecific_value"] = "NULL";
   (*variables)["dataTypeSpecific_value"] = "NULL";
 
 
-  string field_options = descriptor->options().SerializeAsString();
-  // Must convert to a standard byte order for packing length into
-  // a cstring.
-  uint32 length = ghtonl(field_options.length());
-  if (length > 0) {
-    string bytes((const char*)&length, sizeof(length));
-    bytes.append(field_options);
-    string options_str = "\"" + CEscape(bytes) + "\"";
-    (*variables)["fieldoptions"] = "\"" + CEscape(bytes) + "\"";
-  } else {
-    (*variables)["fieldoptions"] = "";
-  }
+  (*variables)["storage_offset_value"] =
+      "(uint32_t)offsetof(" + classname + "__storage_, " + camel_case_name + ")";
+  (*variables)["storage_offset_comment"] = "";
 
 
   // Clear some common things so they can be set just when needed.
   // Clear some common things so they can be set just when needed.
   (*variables)["storage_attribute"] = "";
   (*variables)["storage_attribute"] = "";
@@ -190,52 +182,54 @@ void FieldGenerator::DetermineForwardDeclarations(
 }
 }
 
 
 void FieldGenerator::GenerateFieldDescription(
 void FieldGenerator::GenerateFieldDescription(
-    io::Printer* printer) const {
-  printer->Print(
-      variables_,
-      "{\n"
-      "  .name = \"$name$\",\n"
-      "  .number = $field_number_name$,\n"
-      "  .hasIndex = $has_index$,\n"
-      "  .flags = $fieldflags$,\n"
-      "  .dataType = GPBDataType$field_type$,\n"
-      "  .offset = offsetof($classname$__storage_, $name$),\n"
-      "  .defaultValue.$default_name$ = $default$,\n");
-
-  // TODO(thomasvl): It might be useful to add a CPP wrapper to support
-  // compiling away the EnumDescriptors.  To do that, we'd need a #if here
-  // to control setting the descriptor vs. the validator, and above in
-  // SetCommonFieldVariables() we'd want to wrap how we add
-  // GPBFieldHasDefaultValue to the flags.
-
-  // "  .dataTypeSpecific.value* = [something],"
-  GenerateFieldDescriptionTypeSpecific(printer);
-
-  const string& field_options(variables_.find("fieldoptions")->second);
-  if (field_options.empty()) {
-    printer->Print("  .fieldOptions = NULL,\n");
+    io::Printer* printer, bool include_default) const {
+  // Printed in the same order as the structure decl.
+  if (include_default) {
+    printer->Print(
+        variables_,
+        "{\n"
+        "  .defaultValue.$default_name$ = $default$,\n"
+        "  .core.name = \"$name$\",\n"
+        "  .core.dataTypeSpecific.$dataTypeSpecific_name$ = $dataTypeSpecific_value$,\n"
+        "  .core.number = $field_number_name$,\n"
+        "  .core.hasIndex = $has_index$,\n"
+        "  .core.offset = $storage_offset_value$,$storage_offset_comment$\n"
+        "  .core.flags = $fieldflags$,\n"
+        "  .core.dataType = GPBDataType$field_type$,\n"
+        "},\n");
   } else {
   } else {
-    // Can't use PrintRaw() here to get the #if/#else/#endif lines completely
-    // outdented because the need for indent captured on the previous
-    // printing of a \n and there is no way to get the current indent level
-    // to call the right number of Outdent()/Indents() to maintain state.
     printer->Print(
     printer->Print(
         variables_,
         variables_,
-        "#if GPBOBJC_INCLUDE_FIELD_OPTIONS\n"
-        "  .fieldOptions = $fieldoptions$,\n"
-        "#else\n"
-        "  .fieldOptions = NULL,\n"
-        "#endif  // GPBOBJC_INCLUDE_FIELD_OPTIONS\n");
+        "{\n"
+        "  .name = \"$name$\",\n"
+        "  .dataTypeSpecific.$dataTypeSpecific_name$ = $dataTypeSpecific_value$,\n"
+        "  .number = $field_number_name$,\n"
+        "  .hasIndex = $has_index$,\n"
+        "  .offset = $storage_offset_value$,$storage_offset_comment$\n"
+        "  .flags = $fieldflags$,\n"
+        "  .dataType = GPBDataType$field_type$,\n"
+        "},\n");
   }
   }
+}
 
 
-  printer->Print("},\n");
+void FieldGenerator::SetRuntimeHasBit(int has_index) {
+  variables_["has_index"] = SimpleItoa(has_index);
 }
 }
 
 
-void FieldGenerator::GenerateFieldDescriptionTypeSpecific(
-    io::Printer* printer) const {
-  printer->Print(
-      variables_,
-      "  .dataTypeSpecific.$dataTypeSpecific_name$ = $dataTypeSpecific_value$,\n");
+void FieldGenerator::SetNoHasBit(void) {
+  variables_["has_index"] = "GPBNoHasBit";
+}
+
+int FieldGenerator::ExtraRuntimeHasBitsNeeded(void) const {
+  return 0;
+}
+
+void FieldGenerator::SetExtraRuntimeHasBitsBase(int index_base) {
+  // NOTE: src/google/protobuf/compiler/plugin.cc makes use of cerr for some
+  // error cases, so it seems to be ok to use as a back door for errors.
+  cerr << "Error: should have overriden SetExtraRuntimeHasBitsBase()." << endl;
+  cerr.flush();
+  abort();
 }
 }
 
 
 void FieldGenerator::SetOneofIndexBase(int index_base) {
 void FieldGenerator::SetOneofIndexBase(int index_base) {
@@ -270,15 +264,15 @@ void SingleFieldGenerator::GenerateFieldStorageDeclaration(
 void SingleFieldGenerator::GeneratePropertyDeclaration(
 void SingleFieldGenerator::GeneratePropertyDeclaration(
     io::Printer* printer) const {
     io::Printer* printer) const {
   printer->Print(variables_, "$comments$");
   printer->Print(variables_, "$comments$");
+  printer->Print(
+      variables_,
+      "@property(nonatomic, readwrite) $property_type$ $name$;\n"
+      "\n");
   if (WantsHasProperty()) {
   if (WantsHasProperty()) {
     printer->Print(
     printer->Print(
         variables_,
         variables_,
         "@property(nonatomic, readwrite) BOOL has$capitalized_name$;\n");
         "@property(nonatomic, readwrite) BOOL has$capitalized_name$;\n");
   }
   }
-  printer->Print(
-      variables_,
-      "@property(nonatomic, readwrite) $property_type$ $name$;\n"
-      "\n");
 }
 }
 
 
 void SingleFieldGenerator::GeneratePropertyImplementation(
 void SingleFieldGenerator::GeneratePropertyImplementation(
@@ -302,6 +296,14 @@ bool SingleFieldGenerator::WantsHasProperty(void) const {
   return false;
   return false;
 }
 }
 
 
+bool SingleFieldGenerator::RuntimeUsesHasBit(void) const {
+  if (descriptor_->containing_oneof() != NULL) {
+    // The oneof tracks what is set instead.
+    return false;
+  }
+  return true;
+}
+
 ObjCObjFieldGenerator::ObjCObjFieldGenerator(const FieldDescriptor* descriptor,
 ObjCObjFieldGenerator::ObjCObjFieldGenerator(const FieldDescriptor* descriptor,
                                              const Options& options)
                                              const Options& options)
     : SingleFieldGenerator(descriptor, options) {
     : SingleFieldGenerator(descriptor, options) {
@@ -326,14 +328,15 @@ void ObjCObjFieldGenerator::GeneratePropertyDeclaration(
   // conventions (init*, new*, etc.)
   // conventions (init*, new*, etc.)
 
 
   printer->Print(variables_, "$comments$");
   printer->Print(variables_, "$comments$");
+  printer->Print(
+      variables_,
+      "@property(nonatomic, readwrite, $property_storage_attribute$, null_resettable) $property_type$ *$name$$storage_attribute$;\n");
   if (WantsHasProperty()) {
   if (WantsHasProperty()) {
     printer->Print(
     printer->Print(
         variables_,
         variables_,
+        "/// Test to see if @c $name$ has been set.\n"
         "@property(nonatomic, readwrite) BOOL has$capitalized_name$;\n");
         "@property(nonatomic, readwrite) BOOL has$capitalized_name$;\n");
   }
   }
-  printer->Print(
-      variables_,
-      "@property(nonatomic, readwrite, $property_storage_attribute$, null_resettable) $property_type$ *$name$$storage_attribute$;\n");
   if (IsInitName(variables_.find("name")->second)) {
   if (IsInitName(variables_.find("name")->second)) {
     // If property name starts with init we need to annotate it to get past ARC.
     // If property name starts with init we need to annotate it to get past ARC.
     // http://stackoverflow.com/questions/18723226/how-do-i-annotate-an-objective-c-property-with-an-objc-method-family/18723227#18723227
     // http://stackoverflow.com/questions/18723226/how-do-i-annotate-an-objective-c-property-with-an-objc-method-family/18723227#18723227
@@ -346,8 +349,6 @@ void ObjCObjFieldGenerator::GeneratePropertyDeclaration(
 RepeatedFieldGenerator::RepeatedFieldGenerator(
 RepeatedFieldGenerator::RepeatedFieldGenerator(
     const FieldDescriptor* descriptor, const Options& options)
     const FieldDescriptor* descriptor, const Options& options)
     : ObjCObjFieldGenerator(descriptor, options) {
     : ObjCObjFieldGenerator(descriptor, options) {
-  // Repeated fields don't use the has index.
-  variables_["has_index"] = "GPBNoHasBit";
   // Default to no comment and let the cases needing it fill it in.
   // Default to no comment and let the cases needing it fill it in.
   variables_["array_comment"] = "";
   variables_["array_comment"] = "";
 }
 }
@@ -385,6 +386,7 @@ void RepeatedFieldGenerator::GeneratePropertyDeclaration(
       "$comments$"
       "$comments$"
       "$array_comment$"
       "$array_comment$"
       "@property(nonatomic, readwrite, strong, null_resettable) $array_property_type$ *$name$$storage_attribute$;\n"
       "@property(nonatomic, readwrite, strong, null_resettable) $array_property_type$ *$name$$storage_attribute$;\n"
+      "/// The number of items in @c $name$ without causing the array to be created.\n"
       "@property(nonatomic, readonly) NSUInteger $name$_Count;\n");
       "@property(nonatomic, readonly) NSUInteger $name$_Count;\n");
   if (IsInitName(variables_.find("name")->second)) {
   if (IsInitName(variables_.find("name")->second)) {
     // If property name starts with init we need to annotate it to get past ARC.
     // If property name starts with init we need to annotate it to get past ARC.
@@ -400,6 +402,10 @@ bool RepeatedFieldGenerator::WantsHasProperty(void) const {
   return false;
   return false;
 }
 }
 
 
+bool RepeatedFieldGenerator::RuntimeUsesHasBit(void) const {
+  return false;  // The array having anything is what is used.
+}
+
 FieldGeneratorMap::FieldGeneratorMap(const Descriptor* descriptor,
 FieldGeneratorMap::FieldGeneratorMap(const Descriptor* descriptor,
                                      const Options& options)
                                      const Options& options)
     : descriptor_(descriptor),
     : descriptor_(descriptor),
@@ -430,12 +436,40 @@ const FieldGenerator& FieldGeneratorMap::get_extension(int index) const {
   return *extension_generators_[index];
   return *extension_generators_[index];
 }
 }
 
 
+int FieldGeneratorMap::CalculateHasBits(void) {
+  int total_bits = 0;
+  for (int i = 0; i < descriptor_->field_count(); i++) {
+    if (field_generators_[i]->RuntimeUsesHasBit()) {
+      field_generators_[i]->SetRuntimeHasBit(total_bits);
+      ++total_bits;
+    } else {
+      field_generators_[i]->SetNoHasBit();
+    }
+    int extra_bits = field_generators_[i]->ExtraRuntimeHasBitsNeeded();
+    if (extra_bits) {
+      field_generators_[i]->SetExtraRuntimeHasBitsBase(total_bits);
+      total_bits += extra_bits;
+    }
+  }
+  return total_bits;
+}
+
 void FieldGeneratorMap::SetOneofIndexBase(int index_base) {
 void FieldGeneratorMap::SetOneofIndexBase(int index_base) {
   for (int i = 0; i < descriptor_->field_count(); i++) {
   for (int i = 0; i < descriptor_->field_count(); i++) {
     field_generators_[i]->SetOneofIndexBase(index_base);
     field_generators_[i]->SetOneofIndexBase(index_base);
   }
   }
 }
 }
 
 
+bool FieldGeneratorMap::DoesAnyFieldHaveNonZeroDefault(void) const {
+  for (int i = 0; i < descriptor_->field_count(); i++) {
+    if (HasNonZeroDefaultValue(descriptor_->field(i))) {
+      return true;
+    }
+  }
+
+  return false;
+}
+
 }  // namespace objectivec
 }  // namespace objectivec
 }  // namespace compiler
 }  // namespace compiler
 }  // namespace protobuf
 }  // namespace protobuf

+ 18 - 2
src/google/protobuf/compiler/objectivec/objectivec_field.h

@@ -61,7 +61,6 @@ class FieldGenerator {
 
 
   // Called by GenerateFieldDescription, exposed for classes that need custom
   // Called by GenerateFieldDescription, exposed for classes that need custom
   // generation.
   // generation.
-  virtual void GenerateFieldDescriptionTypeSpecific(io::Printer* printer) const;
 
 
   // Exposed for subclasses to extend, base does nothing.
   // Exposed for subclasses to extend, base does nothing.
   virtual void GenerateCFunctionDeclarations(io::Printer* printer) const;
   virtual void GenerateCFunctionDeclarations(io::Printer* printer) const;
@@ -71,9 +70,16 @@ class FieldGenerator {
   virtual void DetermineForwardDeclarations(set<string>* fwd_decls) const;
   virtual void DetermineForwardDeclarations(set<string>* fwd_decls) const;
 
 
   // Used during generation, not intended to be extended by subclasses.
   // Used during generation, not intended to be extended by subclasses.
-  void GenerateFieldDescription(io::Printer* printer) const;
+  void GenerateFieldDescription(
+      io::Printer* printer, bool include_default) const;
   void GenerateFieldNumberConstant(io::Printer* printer) const;
   void GenerateFieldNumberConstant(io::Printer* printer) const;
 
 
+  // Exposed to get and set the has bits information.
+  virtual bool RuntimeUsesHasBit(void) const = 0;
+  void SetRuntimeHasBit(int has_index);
+  void SetNoHasBit(void);
+  virtual int ExtraRuntimeHasBitsNeeded(void) const;
+  virtual void SetExtraRuntimeHasBitsBase(int index_base);
   void SetOneofIndexBase(int index_base);
   void SetOneofIndexBase(int index_base);
 
 
   string variable(const char* key) const {
   string variable(const char* key) const {
@@ -109,6 +115,8 @@ class SingleFieldGenerator : public FieldGenerator {
 
 
   virtual void GeneratePropertyImplementation(io::Printer* printer) const;
   virtual void GeneratePropertyImplementation(io::Printer* printer) const;
 
 
+  virtual bool RuntimeUsesHasBit(void) const;
+
  protected:
  protected:
   SingleFieldGenerator(const FieldDescriptor* descriptor,
   SingleFieldGenerator(const FieldDescriptor* descriptor,
                        const Options& options);
                        const Options& options);
@@ -143,6 +151,8 @@ class RepeatedFieldGenerator : public ObjCObjFieldGenerator {
 
 
   virtual void GeneratePropertyImplementation(io::Printer* printer) const;
   virtual void GeneratePropertyImplementation(io::Printer* printer) const;
 
 
+  virtual bool RuntimeUsesHasBit(void) const;
+
  protected:
  protected:
   RepeatedFieldGenerator(const FieldDescriptor* descriptor,
   RepeatedFieldGenerator(const FieldDescriptor* descriptor,
                          const Options& options);
                          const Options& options);
@@ -162,8 +172,14 @@ class FieldGeneratorMap {
   const FieldGenerator& get(const FieldDescriptor* field) const;
   const FieldGenerator& get(const FieldDescriptor* field) const;
   const FieldGenerator& get_extension(int index) const;
   const FieldGenerator& get_extension(int index) const;
 
 
+  // Assigns the has bits and returns the number of bits needed.
+  int CalculateHasBits(void);
+
   void SetOneofIndexBase(int index_base);
   void SetOneofIndexBase(int index_base);
 
 
+  // Check if any field of this message has a non zero default.
+  bool DoesAnyFieldHaveNonZeroDefault(void) const;
+
  private:
  private:
   const Descriptor* descriptor_;
   const Descriptor* descriptor_;
   scoped_array<scoped_ptr<FieldGenerator> > field_generators_;
   scoped_array<scoped_ptr<FieldGenerator> > field_generators_;

+ 9 - 7
src/google/protobuf/compiler/objectivec/objectivec_file.cc

@@ -45,7 +45,7 @@ namespace protobuf {
 // This is also found in GPBBootstrap.h, and needs to be kept in sync.  It
 // This is also found in GPBBootstrap.h, and needs to be kept in sync.  It
 // is the version check done to ensure generated code works with the current
 // is the version check done to ensure generated code works with the current
 // runtime being used.
 // runtime being used.
-const int32 GOOGLE_PROTOBUF_OBJC_GEN_VERSION = 30000;
+const int32 GOOGLE_PROTOBUF_OBJC_GEN_VERSION = 30001;
 
 
 namespace compiler {
 namespace compiler {
 namespace objectivec {
 namespace objectivec {
@@ -151,13 +151,15 @@ void FileGenerator::GenerateHeader(io::Printer *printer) {
   printer->Print(
   printer->Print(
       "#pragma mark - $root_class_name$\n"
       "#pragma mark - $root_class_name$\n"
       "\n"
       "\n"
+      "/// Exposes the extension registry for this file.\n"
+      "///\n"
+      "/// The base class provides:\n"
+      "/// @code\n"
+      "///   + (GPBExtensionRegistry *)extensionRegistry;\n"
+      "/// @endcode\n"
+      "/// which is a @c GPBExtensionRegistry that includes all the extensions defined by\n"
+      "/// this file and all files that it depends on.\n"
       "@interface $root_class_name$ : GPBRootObject\n"
       "@interface $root_class_name$ : GPBRootObject\n"
-      "\n"
-      "// The base class provides:\n"
-      "//   + (GPBExtensionRegistry *)extensionRegistry;\n"
-      "// which is an GPBExtensionRegistry that includes all the extensions defined by\n"
-      "// this file and all files that it depends on.\n"
-      "\n"
       "@end\n"
       "@end\n"
       "\n",
       "\n",
       "root_class_name", root_class_name_);
       "root_class_name", root_class_name_);

Some files were not shown because too many files changed in this diff