Explorar el Código

Fix bugs for objectivec

TeBoring hace 10 años
padre
commit
aca5a60883

+ 4 - 0
objectivec/DevTools/compile_testing_protos.sh

@@ -68,6 +68,7 @@ fi
 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    \
@@ -76,6 +77,9 @@ CORE_PROTO_FILES=(                                         \
   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                       \

+ 4 - 0
objectivec/Tests/GPBUnittestProtos.m

@@ -34,6 +34,7 @@
 #import "google/protobuf/MapProto2Unittest.pbobjc.m"
 #import "google/protobuf/MapUnittest.pbobjc.m"
 #import "google/protobuf/Unittest.pbobjc.m"
+#import "google/protobuf/UnittestArena.pbobjc.m"
 #import "google/protobuf/UnittestCustomOptions.pbobjc.m"
 #import "google/protobuf/UnittestCycle.pbobjc.m"
 #import "google/protobuf/UnittestDropUnknownFields.pbobjc.m"
@@ -46,6 +47,9 @@
 #import "google/protobuf/UnittestImportPublicLite.pbobjc.m"
 #import "google/protobuf/UnittestLite.pbobjc.m"
 #import "google/protobuf/UnittestMset.pbobjc.m"
+#import "google/protobuf/UnittestMsetWireFormat.pbobjc.m"
+#import "google/protobuf/UnittestNoArena.pbobjc.m"
+#import "google/protobuf/UnittestNoArenaImport.pbobjc.m"
 #import "google/protobuf/UnittestNoGenericServices.pbobjc.m"
 #import "google/protobuf/UnittestObjc.pbobjc.m"
 #import "google/protobuf/UnittestObjcStartup.pbobjc.m"

+ 1 - 0
objectivec/Tests/GPBWireFormatTests.m

@@ -35,6 +35,7 @@
 #import "GPBUnknownField_PackagePrivate.h"
 #import "google/protobuf/Unittest.pbobjc.h"
 #import "google/protobuf/UnittestMset.pbobjc.h"
+#import "google/protobuf/UnittestMsetWireFormat.pbobjc.h"
 
 @interface WireFormatTests : GPBTestCase
 @end

+ 2 - 9
objectivec/google/protobuf/Any.pbobjc.h

@@ -34,10 +34,8 @@ typedef GPB_ENUM(GPBAny_FieldNumber) {
 // `Any` contains an arbitrary serialized message along with a URL
 // that describes the type of the serialized message.
 //
-// The proto runtimes and/or compiler will eventually
-//  provide utilities to pack/unpack Any values (projected Q1/15).
-//
-// # JSON
+// 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:
@@ -84,11 +82,6 @@ typedef GPB_ENUM(GPBAny_FieldNumber) {
 //
 // Schemas other than `http`, `https` (or the empty schema) might be
 // used with implementation specific semantics.
-//
-// Types originating from the `google.*` package
-// namespace should use `type.googleapis.com/full.type.name` (without
-// schema and path). A type service will eventually become available which
-// serves those URLs (projected Q2/15).
 @property(nonatomic, readwrite, copy, null_resettable) NSString *typeURL;
 
 // Must be valid serialized data of the above specified type.

+ 117 - 2
objectivec/google/protobuf/Api.pbobjc.h

@@ -12,6 +12,7 @@
 CF_EXTERN_C_BEGIN
 
 @class GPBSourceContext;
+GPB_ENUM_FWD_DECLARE(GPBSyntax);
 
 NS_ASSUME_NONNULL_BEGIN
 
@@ -34,6 +35,8 @@ typedef GPB_ENUM(GPBApi_FieldNumber) {
   GPBApi_FieldNumber_OptionsArray = 3,
   GPBApi_FieldNumber_Version = 4,
   GPBApi_FieldNumber_SourceContext = 5,
+  GPBApi_FieldNumber_MixinsArray = 6,
+  GPBApi_FieldNumber_Syntax = 7,
 };
 
 // Api is a light-weight descriptor for a protocol buffer service.
@@ -73,8 +76,6 @@ typedef GPB_ENUM(GPBApi_FieldNumber) {
 // `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.
-//
-// See also: [design doc](http://go/api-versioning).
 @property(nonatomic, readwrite, copy, null_resettable) NSString *version;
 
 // Source context for the protocol buffer service represented by this
@@ -82,8 +83,19 @@ typedef GPB_ENUM(GPBApi_FieldNumber) {
 @property(nonatomic, readwrite) BOOL hasSourceContext;
 @property(nonatomic, readwrite, strong, null_resettable) GPBSourceContext *sourceContext;
 
+// Included APIs. See [Mixin][].
+// |mixinsArray| contains |GPBMixin|
+@property(nonatomic, readwrite, strong, null_resettable) NSMutableArray *mixinsArray;
+@property(nonatomic, readonly) NSUInteger mixinsArray_Count;
+
+// The source syntax of the service.
+@property(nonatomic, readwrite) enum GPBSyntax syntax;
+
 @end
 
+int32_t GPBApi_Syntax_RawValue(GPBApi *message);
+void SetGPBApi_Syntax_RawValue(GPBApi *message, int32_t value);
+
 #pragma mark - GPBMethod
 
 typedef GPB_ENUM(GPBMethod_FieldNumber) {
@@ -93,6 +105,7 @@ typedef GPB_ENUM(GPBMethod_FieldNumber) {
   GPBMethod_FieldNumber_ResponseTypeURL = 4,
   GPBMethod_FieldNumber_ResponseStreaming = 5,
   GPBMethod_FieldNumber_OptionsArray = 6,
+  GPBMethod_FieldNumber_Syntax = 7,
 };
 
 // Method represents a method of an api.
@@ -118,6 +131,108 @@ typedef GPB_ENUM(GPBMethod_FieldNumber) {
 @property(nonatomic, readwrite, strong, null_resettable) NSMutableArray *optionsArray;
 @property(nonatomic, readonly) NSUInteger optionsArray_Count;
 
+// The source syntax of this method.
+@property(nonatomic, readwrite) enum GPBSyntax syntax;
+
+@end
+
+int32_t GPBMethod_Syntax_RawValue(GPBMethod *message);
+void SetGPBMethod_Syntax_RawValue(GPBMethod *message, int32_t value);
+
+#pragma mark - GPBMixin
+
+typedef GPB_ENUM(GPBMixin_FieldNumber) {
+  GPBMixin_FieldNumber_Name = 1,
+  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 {
+//       // (-- see AccessControl.GetAcl --)
+//       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
+
+// The fully qualified name of the API which is included.
+@property(nonatomic, readwrite, copy, null_resettable) NSString *name;
+
+// If non-empty specifies a path under which inherited HTTP paths
+// are rooted.
+@property(nonatomic, readwrite, copy, null_resettable) NSString *root;
+
 @end
 
 NS_ASSUME_NONNULL_END

+ 127 - 0
objectivec/google/protobuf/Api.pbobjc.m

@@ -49,14 +49,18 @@ static GPBFileDescriptor *GPBApiRoot_FileDescriptor(void) {
 @dynamic optionsArray, optionsArray_Count;
 @dynamic version;
 @dynamic hasSourceContext, sourceContext;
+@dynamic mixinsArray, mixinsArray_Count;
+@dynamic syntax;
 
 typedef struct GPBApi__storage_ {
   uint32_t _has_storage_[1];
+  GPBSyntax syntax;
   NSString *name;
   NSMutableArray *methodsArray;
   NSMutableArray *optionsArray;
   NSString *version;
   GPBSourceContext *sourceContext;
+  NSMutableArray *mixinsArray;
 } GPBApi__storage_;
 
 // This method is threadsafe because it is initially called
@@ -120,6 +124,28 @@ typedef struct GPBApi__storage_ {
         .dataTypeSpecific.className = GPBStringifySymbol(GPBSourceContext),
         .fieldOptions = NULL,
       },
+      {
+        .name = "mixinsArray",
+        .number = GPBApi_FieldNumber_MixinsArray,
+        .hasIndex = GPBNoHasBit,
+        .flags = GPBFieldRepeated,
+        .dataType = GPBDataTypeMessage,
+        .offset = offsetof(GPBApi__storage_, mixinsArray),
+        .defaultValue.valueMessage = nil,
+        .dataTypeSpecific.className = GPBStringifySymbol(GPBMixin),
+        .fieldOptions = NULL,
+      },
+      {
+        .name = "syntax",
+        .number = GPBApi_FieldNumber_Syntax,
+        .hasIndex = 6,
+        .flags = GPBFieldOptional | GPBFieldHasEnumDescriptor,
+        .dataType = GPBDataTypeEnum,
+        .offset = offsetof(GPBApi__storage_, syntax),
+        .defaultValue.valueEnum = GPBSyntax_SyntaxProto2,
+        .dataTypeSpecific.enumDescFunc = GPBSyntax_EnumDescriptor,
+        .fieldOptions = NULL,
+      },
     };
     GPBDescriptor *localDescriptor =
         [GPBDescriptor allocDescriptorForClass:[GPBApi class]
@@ -143,6 +169,18 @@ typedef struct GPBApi__storage_ {
 
 @end
 
+int32_t GPBApi_Syntax_RawValue(GPBApi *message) {
+  GPBDescriptor *descriptor = [GPBApi descriptor];
+  GPBFieldDescriptor *field = [descriptor fieldWithNumber:GPBApi_FieldNumber_Syntax];
+  return GPBGetMessageInt32Field(message, field);
+}
+
+void SetGPBApi_Syntax_RawValue(GPBApi *message, int32_t value) {
+  GPBDescriptor *descriptor = [GPBApi descriptor];
+  GPBFieldDescriptor *field = [descriptor fieldWithNumber:GPBApi_FieldNumber_Syntax];
+  GPBSetInt32IvarWithFieldInternal(message, field, value, descriptor.file.syntax);
+}
+
 #pragma mark - GPBMethod
 
 @implementation GPBMethod
@@ -153,11 +191,13 @@ typedef struct GPBApi__storage_ {
 @dynamic responseTypeURL;
 @dynamic responseStreaming;
 @dynamic optionsArray, optionsArray_Count;
+@dynamic syntax;
 
 typedef struct GPBMethod__storage_ {
   uint32_t _has_storage_[1];
   BOOL requestStreaming;
   BOOL responseStreaming;
+  GPBSyntax syntax;
   NSString *name;
   NSString *requestTypeURL;
   NSString *responseTypeURL;
@@ -236,6 +276,17 @@ typedef struct GPBMethod__storage_ {
         .dataTypeSpecific.className = GPBStringifySymbol(GPBOption),
         .fieldOptions = NULL,
       },
+      {
+        .name = "syntax",
+        .number = GPBMethod_FieldNumber_Syntax,
+        .hasIndex = 6,
+        .flags = GPBFieldOptional | GPBFieldHasEnumDescriptor,
+        .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;
@@ -265,5 +316,81 @@ typedef struct GPBMethod__storage_ {
 
 @end
 
+int32_t GPBMethod_Syntax_RawValue(GPBMethod *message) {
+  GPBDescriptor *descriptor = [GPBMethod descriptor];
+  GPBFieldDescriptor *field = [descriptor fieldWithNumber:GPBMethod_FieldNumber_Syntax];
+  return GPBGetMessageInt32Field(message, field);
+}
+
+void SetGPBMethod_Syntax_RawValue(GPBMethod *message, int32_t value) {
+  GPBDescriptor *descriptor = [GPBMethod descriptor];
+  GPBFieldDescriptor *field = [descriptor fieldWithNumber:GPBMethod_FieldNumber_Syntax];
+  GPBSetInt32IvarWithFieldInternal(message, field, value, descriptor.file.syntax);
+}
+
+#pragma mark - GPBMixin
+
+@implementation GPBMixin
+
+@dynamic name;
+@dynamic root;
+
+typedef struct GPBMixin__storage_ {
+  uint32_t _has_storage_[1];
+  NSString *name;
+  NSString *root;
+} GPBMixin__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 = GPBMixin_FieldNumber_Name,
+        .hasIndex = 0,
+        .flags = GPBFieldOptional,
+        .dataType = GPBDataTypeString,
+        .offset = offsetof(GPBMixin__storage_, name),
+        .defaultValue.valueString = nil,
+        .dataTypeSpecific.className = NULL,
+        .fieldOptions = NULL,
+      },
+      {
+        .name = "root",
+        .number = GPBMixin_FieldNumber_Root,
+        .hasIndex = 1,
+        .flags = GPBFieldOptional,
+        .dataType = GPBDataTypeString,
+        .offset = offsetof(GPBMixin__storage_, root),
+        .defaultValue.valueString = nil,
+        .dataTypeSpecific.className = NULL,
+        .fieldOptions = NULL,
+      },
+    };
+    GPBDescriptor *localDescriptor =
+        [GPBDescriptor allocDescriptorForClass:[GPBMixin class]
+                                     rootClass:[GPBApiRoot class]
+                                          file:GPBApiRoot_FileDescriptor()
+                                        fields:fields
+                                    fieldCount:sizeof(fields) / sizeof(GPBMessageFieldDescription)
+                                        oneofs:NULL
+                                    oneofCount:0
+                                         enums:NULL
+                                     enumCount:0
+                                        ranges:NULL
+                                    rangeCount:0
+                                   storageSize:sizeof(GPBMixin__storage_)
+                                    wireFormat:NO];
+    NSAssert(descriptor == nil, @"Startup recursed!");
+    descriptor = localDescriptor;
+  }
+  return descriptor;
+}
+
+@end
+
 
 // @@protoc_insertion_point(global_scope)

+ 10 - 2
objectivec/google/protobuf/Descriptor.pbobjc.h

@@ -531,6 +531,7 @@ typedef GPB_ENUM(GPBFileOptions_FieldNumber) {
   GPBFileOptions_FieldNumber_CcEnableArenas = 31,
   GPBFileOptions_FieldNumber_ObjcClassPrefix = 36,
   GPBFileOptions_FieldNumber_CsharpNamespace = 37,
+  GPBFileOptions_FieldNumber_JavananoUseDeprecatedPackage = 38,
   GPBFileOptions_FieldNumber_UninterpretedOptionArray = 999,
 };
 
@@ -562,10 +563,12 @@ typedef GPB_ENUM(GPBFileOptions_FieldNumber) {
 
 // If set true, then the Java code generator will generate equals() and
 // hashCode() methods for all messages defined in the .proto file.
-// - In the full runtime, this is purely a speed optimization, as the
+// 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
+// - 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
@@ -633,6 +636,11 @@ typedef GPB_ENUM(GPBFileOptions_FieldNumber) {
 @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.
 // |uninterpretedOptionArray| contains |GPBUninterpretedOption|
 @property(nonatomic, readwrite, strong, null_resettable) NSMutableArray *uninterpretedOptionArray;

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

@@ -1229,6 +1229,7 @@ typedef struct GPBMethodDescriptorProto__storage_ {
 @dynamic hasCcEnableArenas, ccEnableArenas;
 @dynamic hasObjcClassPrefix, objcClassPrefix;
 @dynamic hasCsharpNamespace, csharpNamespace;
+@dynamic hasJavananoUseDeprecatedPackage, javananoUseDeprecatedPackage;
 @dynamic uninterpretedOptionArray, uninterpretedOptionArray_Count;
 
 typedef struct GPBFileOptions__storage_ {
@@ -1241,6 +1242,7 @@ typedef struct GPBFileOptions__storage_ {
   BOOL deprecated;
   BOOL javaStringCheckUtf8;
   BOOL ccEnableArenas;
+  BOOL javananoUseDeprecatedPackage;
   GPBFileOptions_OptimizeMode optimizeFor;
   NSString *javaPackage;
   NSString *javaOuterClassname;
@@ -1410,6 +1412,17 @@ typedef struct GPBFileOptions__storage_ {
         .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,
+        .fieldOptions = NULL,
+      },
       {
         .name = "uninterpretedOptionArray",
         .number = GPBFileOptions_FieldNumber_UninterpretedOptionArray,

+ 2 - 0
objectivec/google/protobuf/Empty.pbobjc.h

@@ -33,6 +33,8 @@ NS_ASSUME_NONNULL_BEGIN
 //     service Foo {
 //       rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty);
 //     }
+//
+// The JSON representation for `Empty` is empty JSON object `{}`.
 @interface GPBEmpty : GPBMessage
 
 @end

+ 4 - 0
objectivec/google/protobuf/FieldMask.pbobjc.h

@@ -44,6 +44,7 @@ typedef GPB_ENUM(GPBFieldMask_FieldNumber) {
 // 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
@@ -89,6 +90,7 @@ typedef GPB_ENUM(GPBFieldMask_FieldNumber) {
 // 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
@@ -116,11 +118,13 @@ typedef GPB_ENUM(GPBFieldMask_FieldNumber) {
 // 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.

+ 11 - 2
objectivec/google/protobuf/Struct.pbobjc.h

@@ -18,8 +18,10 @@ NS_ASSUME_NONNULL_BEGIN
 
 #pragma mark - Enum GPBNullValue
 
-// `NullValue` is a singleton enumeration to represent the null
-// value for the `Value` type union.
+// `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) {
   GPBNullValue_GPBUnrecognizedEnumeratorValue = kGPBUnrecognizedEnumeratorValue,
   // Null value.
@@ -53,6 +55,8 @@ typedef GPB_ENUM(GPBStruct_FieldNumber) {
 // 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
 
 // Map of dynamically typed values.
@@ -87,8 +91,11 @@ typedef GPB_ENUM(GPBValue_Kind_OneOfCase) {
 // 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
 
+// The kind of value.
 @property(nonatomic, readonly) GPBValue_Kind_OneOfCase kindOneOfCase;
 
 // Represents a null value.
@@ -123,6 +130,8 @@ typedef GPB_ENUM(GPBListValue_FieldNumber) {
 };
 
 // `ListValue` is a wrapper around a repeated field of values.
+//
+// The JSON representation for `ListValue` is JSON array.
 @interface GPBListValue : GPBMessage
 
 // Repeated field of dynamically typed values.

+ 5 - 4
objectivec/google/protobuf/Timestamp.pbobjc.h

@@ -77,11 +77,12 @@ typedef GPB_ENUM(GPBTimestamp_FieldNumber) {
 //     Timestamp timestamp = Timestamp.newBuilder().setSeconds(millis / 1000)
 //         .setNanos((int) ((millis % 1000) * 1000000)).build();
 //
-// Example 5: Compute Timestamp from Python `datetime.datetime`.
 //
-//     now = datetime.datetime.utcnow()
-//     seconds = int(time.mktime(now.timetuple()))
-//     nanos = now.microsecond * 1000
+// 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
 

+ 37 - 1
objectivec/google/protobuf/Type.pbobjc.h

@@ -16,6 +16,22 @@ CF_EXTERN_C_BEGIN
 
 NS_ASSUME_NONNULL_BEGIN
 
+#pragma mark - Enum GPBSyntax
+
+// Syntax specifies the syntax in which a service element was defined.
+typedef GPB_ENUM(GPBSyntax) {
+  GPBSyntax_GPBUnrecognizedEnumeratorValue = kGPBUnrecognizedEnumeratorValue,
+  // Syntax "proto2"
+  GPBSyntax_SyntaxProto2 = 0,
+
+  // Syntax "proto3"
+  GPBSyntax_SyntaxProto3 = 1,
+};
+
+GPBEnumDescriptor *GPBSyntax_EnumDescriptor(void);
+
+BOOL GPBSyntax_IsValidValue(int32_t value);
+
 #pragma mark - Enum GPBField_Kind
 
 // Kind represents a basic field type.
@@ -51,6 +67,9 @@ typedef GPB_ENUM(GPBField_Kind) {
   // Field type string.
   GPBField_Kind_TypeString = 9,
 
+  // Field type group (deprecated proto2 type)
+  GPBField_Kind_TypeGroup = 10,
+
   // Field type message.
   GPBField_Kind_TypeMessage = 11,
 
@@ -122,6 +141,7 @@ typedef GPB_ENUM(GPBType_FieldNumber) {
   GPBType_FieldNumber_OneofsArray = 3,
   GPBType_FieldNumber_OptionsArray = 4,
   GPBType_FieldNumber_SourceContext = 5,
+  GPBType_FieldNumber_Syntax = 6,
 };
 
 // A light-weight descriptor for a proto message type.
@@ -136,7 +156,6 @@ typedef GPB_ENUM(GPBType_FieldNumber) {
 @property(nonatomic, readonly) NSUInteger fieldsArray_Count;
 
 // The list of oneof definitions.
-// The list of oneofs declared in this Type
 // |oneofsArray| contains |NSString|
 @property(nonatomic, readwrite, strong, null_resettable) NSMutableArray *oneofsArray;
 @property(nonatomic, readonly) NSUInteger oneofsArray_Count;
@@ -150,8 +169,14 @@ typedef GPB_ENUM(GPBType_FieldNumber) {
 @property(nonatomic, readwrite) BOOL hasSourceContext;
 @property(nonatomic, readwrite, strong, null_resettable) GPBSourceContext *sourceContext;
 
+// The source syntax.
+@property(nonatomic, readwrite) GPBSyntax syntax;
+
 @end
 
+int32_t GPBType_Syntax_RawValue(GPBType *message);
+void SetGPBType_Syntax_RawValue(GPBType *message, int32_t value);
+
 #pragma mark - GPBField
 
 typedef GPB_ENUM(GPBField_FieldNumber) {
@@ -163,6 +188,7 @@ typedef GPB_ENUM(GPBField_FieldNumber) {
   GPBField_FieldNumber_OneofIndex = 7,
   GPBField_FieldNumber_Packed = 8,
   GPBField_FieldNumber_OptionsArray = 9,
+  GPBField_FieldNumber_JsonName = 10,
 };
 
 // Field represents a single field of a message type.
@@ -195,6 +221,9 @@ typedef GPB_ENUM(GPBField_FieldNumber) {
 @property(nonatomic, readwrite, strong, null_resettable) NSMutableArray *optionsArray;
 @property(nonatomic, readonly) NSUInteger optionsArray_Count;
 
+// The JSON name for this field.
+@property(nonatomic, readwrite, copy, null_resettable) NSString *jsonName;
+
 @end
 
 int32_t GPBField_Kind_RawValue(GPBField *message);
@@ -210,6 +239,7 @@ typedef GPB_ENUM(GPBEnum_FieldNumber) {
   GPBEnum_FieldNumber_EnumvalueArray = 2,
   GPBEnum_FieldNumber_OptionsArray = 3,
   GPBEnum_FieldNumber_SourceContext = 4,
+  GPBEnum_FieldNumber_Syntax = 5,
 };
 
 // Enum type definition.
@@ -232,8 +262,14 @@ typedef GPB_ENUM(GPBEnum_FieldNumber) {
 @property(nonatomic, readwrite) BOOL hasSourceContext;
 @property(nonatomic, readwrite, strong, null_resettable) GPBSourceContext *sourceContext;
 
+// The source syntax.
+@property(nonatomic, readwrite) GPBSyntax syntax;
+
 @end
 
+int32_t GPBEnum_Syntax_RawValue(GPBEnum *message);
+void SetGPBEnum_Syntax_RawValue(GPBEnum *message, int32_t value);
+
 #pragma mark - GPBEnumValue
 
 typedef GPB_ENUM(GPBEnumValue_FieldNumber) {

+ 92 - 0
objectivec/google/protobuf/Type.pbobjc.m

@@ -40,6 +40,33 @@ static GPBFileDescriptor *GPBTypeRoot_FileDescriptor(void) {
   return descriptor;
 }
 
+#pragma mark - Enum GPBSyntax
+
+GPBEnumDescriptor *GPBSyntax_EnumDescriptor(void) {
+  static GPBEnumDescriptor *descriptor = NULL;
+  if (!descriptor) {
+    static GPBMessageEnumValueDescription values[] = {
+      { .name = "SyntaxProto2", .number = GPBSyntax_SyntaxProto2 },
+      { .name = "SyntaxProto3", .number = GPBSyntax_SyntaxProto3 },
+    };
+    descriptor = [GPBEnumDescriptor allocDescriptorForName:GPBNSStringifySymbol(GPBSyntax)
+                                                   values:values
+                                               valueCount:sizeof(values) / sizeof(GPBMessageEnumValueDescription)
+                                             enumVerifier:GPBSyntax_IsValidValue];
+  }
+  return descriptor;
+}
+
+BOOL GPBSyntax_IsValidValue(int32_t value__) {
+  switch (value__) {
+    case GPBSyntax_SyntaxProto2:
+    case GPBSyntax_SyntaxProto3:
+      return YES;
+    default:
+      return NO;
+  }
+}
+
 #pragma mark - GPBType
 
 @implementation GPBType
@@ -49,9 +76,11 @@ static GPBFileDescriptor *GPBTypeRoot_FileDescriptor(void) {
 @dynamic oneofsArray, oneofsArray_Count;
 @dynamic optionsArray, optionsArray_Count;
 @dynamic hasSourceContext, sourceContext;
+@dynamic syntax;
 
 typedef struct GPBType__storage_ {
   uint32_t _has_storage_[1];
+  GPBSyntax syntax;
   NSString *name;
   NSMutableArray *fieldsArray;
   NSMutableArray *oneofsArray;
@@ -120,6 +149,17 @@ typedef struct GPBType__storage_ {
         .dataTypeSpecific.className = GPBStringifySymbol(GPBSourceContext),
         .fieldOptions = NULL,
       },
+      {
+        .name = "syntax",
+        .number = GPBType_FieldNumber_Syntax,
+        .hasIndex = 5,
+        .flags = GPBFieldOptional | GPBFieldHasEnumDescriptor,
+        .dataType = GPBDataTypeEnum,
+        .offset = offsetof(GPBType__storage_, syntax),
+        .defaultValue.valueEnum = GPBSyntax_SyntaxProto2,
+        .dataTypeSpecific.enumDescFunc = GPBSyntax_EnumDescriptor,
+        .fieldOptions = NULL,
+      },
     };
     GPBDescriptor *localDescriptor =
         [GPBDescriptor allocDescriptorForClass:[GPBType class]
@@ -143,6 +183,18 @@ typedef struct GPBType__storage_ {
 
 @end
 
+int32_t GPBType_Syntax_RawValue(GPBType *message) {
+  GPBDescriptor *descriptor = [GPBType descriptor];
+  GPBFieldDescriptor *field = [descriptor fieldWithNumber:GPBType_FieldNumber_Syntax];
+  return GPBGetMessageInt32Field(message, field);
+}
+
+void SetGPBType_Syntax_RawValue(GPBType *message, int32_t value) {
+  GPBDescriptor *descriptor = [GPBType descriptor];
+  GPBFieldDescriptor *field = [descriptor fieldWithNumber:GPBType_FieldNumber_Syntax];
+  GPBSetInt32IvarWithFieldInternal(message, field, value, descriptor.file.syntax);
+}
+
 #pragma mark - GPBField
 
 @implementation GPBField
@@ -155,6 +207,7 @@ typedef struct GPBType__storage_ {
 @dynamic oneofIndex;
 @dynamic packed;
 @dynamic optionsArray, optionsArray_Count;
+@dynamic jsonName;
 
 typedef struct GPBField__storage_ {
   uint32_t _has_storage_[1];
@@ -166,6 +219,7 @@ typedef struct GPBField__storage_ {
   NSString *name;
   NSString *typeURL;
   NSMutableArray *optionsArray;
+  NSString *jsonName;
 } GPBField__storage_;
 
 // This method is threadsafe because it is initially called
@@ -262,6 +316,17 @@ typedef struct GPBField__storage_ {
         .dataTypeSpecific.className = GPBStringifySymbol(GPBOption),
         .fieldOptions = NULL,
       },
+      {
+        .name = "jsonName",
+        .number = GPBField_FieldNumber_JsonName,
+        .hasIndex = 8,
+        .flags = GPBFieldOptional,
+        .dataType = GPBDataTypeString,
+        .offset = offsetof(GPBField__storage_, jsonName),
+        .defaultValue.valueString = nil,
+        .dataTypeSpecific.className = NULL,
+        .fieldOptions = NULL,
+      },
     };
     static GPBMessageEnumDescription enums[] = {
       { .enumDescriptorFunc = GPBField_Kind_EnumDescriptor },
@@ -335,6 +400,7 @@ GPBEnumDescriptor *GPBField_Kind_EnumDescriptor(void) {
       { .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 },
@@ -364,6 +430,7 @@ BOOL GPBField_Kind_IsValidValue(int32_t value__) {
     case GPBField_Kind_TypeFixed32:
     case GPBField_Kind_TypeBool:
     case GPBField_Kind_TypeString:
+    case GPBField_Kind_TypeGroup:
     case GPBField_Kind_TypeMessage:
     case GPBField_Kind_TypeBytes:
     case GPBField_Kind_TypeUint32:
@@ -417,9 +484,11 @@ BOOL GPBField_Cardinality_IsValidValue(int32_t value__) {
 @dynamic enumvalueArray, enumvalueArray_Count;
 @dynamic optionsArray, optionsArray_Count;
 @dynamic hasSourceContext, sourceContext;
+@dynamic syntax;
 
 typedef struct GPBEnum__storage_ {
   uint32_t _has_storage_[1];
+  GPBSyntax syntax;
   NSString *name;
   NSMutableArray *enumvalueArray;
   NSMutableArray *optionsArray;
@@ -476,6 +545,17 @@ typedef struct GPBEnum__storage_ {
         .dataTypeSpecific.className = GPBStringifySymbol(GPBSourceContext),
         .fieldOptions = NULL,
       },
+      {
+        .name = "syntax",
+        .number = GPBEnum_FieldNumber_Syntax,
+        .hasIndex = 4,
+        .flags = GPBFieldOptional | GPBFieldHasEnumDescriptor,
+        .dataType = GPBDataTypeEnum,
+        .offset = offsetof(GPBEnum__storage_, syntax),
+        .defaultValue.valueEnum = GPBSyntax_SyntaxProto2,
+        .dataTypeSpecific.enumDescFunc = GPBSyntax_EnumDescriptor,
+        .fieldOptions = NULL,
+      },
     };
     GPBDescriptor *localDescriptor =
         [GPBDescriptor allocDescriptorForClass:[GPBEnum class]
@@ -499,6 +579,18 @@ typedef struct GPBEnum__storage_ {
 
 @end
 
+int32_t GPBEnum_Syntax_RawValue(GPBEnum *message) {
+  GPBDescriptor *descriptor = [GPBEnum descriptor];
+  GPBFieldDescriptor *field = [descriptor fieldWithNumber:GPBEnum_FieldNumber_Syntax];
+  return GPBGetMessageInt32Field(message, field);
+}
+
+void SetGPBEnum_Syntax_RawValue(GPBEnum *message, int32_t value) {
+  GPBDescriptor *descriptor = [GPBEnum descriptor];
+  GPBFieldDescriptor *field = [descriptor fieldWithNumber:GPBEnum_FieldNumber_Syntax];
+  GPBSetInt32IvarWithFieldInternal(message, field, value, descriptor.file.syntax);
+}
+
 #pragma mark - GPBEnumValue
 
 @implementation GPBEnumValue

+ 27 - 9
objectivec/google/protobuf/Wrappers.pbobjc.h

@@ -30,7 +30,9 @@ typedef GPB_ENUM(GPBDoubleValue_FieldNumber) {
   GPBDoubleValue_FieldNumber_Value = 1,
 };
 
-// Wrapper message for double.
+// Wrapper message for `double`.
+//
+// The JSON representation for `DoubleValue` is JSON number.
 @interface GPBDoubleValue : GPBMessage
 
 // The double value.
@@ -44,7 +46,9 @@ typedef GPB_ENUM(GPBFloatValue_FieldNumber) {
   GPBFloatValue_FieldNumber_Value = 1,
 };
 
-// Wrapper message for float.
+// Wrapper message for `float`.
+//
+// The JSON representation for `FloatValue` is JSON number.
 @interface GPBFloatValue : GPBMessage
 
 // The float value.
@@ -58,7 +62,9 @@ typedef GPB_ENUM(GPBInt64Value_FieldNumber) {
   GPBInt64Value_FieldNumber_Value = 1,
 };
 
-// Wrapper message for int64.
+// Wrapper message for `int64`.
+//
+// The JSON representation for `Int64Value` is JSON string.
 @interface GPBInt64Value : GPBMessage
 
 // The int64 value.
@@ -72,7 +78,9 @@ typedef GPB_ENUM(GPBUInt64Value_FieldNumber) {
   GPBUInt64Value_FieldNumber_Value = 1,
 };
 
-// Wrapper message for uint64.
+// Wrapper message for `uint64`.
+//
+// The JSON representation for `UInt64Value` is JSON string.
 @interface GPBUInt64Value : GPBMessage
 
 // The uint64 value.
@@ -86,7 +94,9 @@ typedef GPB_ENUM(GPBInt32Value_FieldNumber) {
   GPBInt32Value_FieldNumber_Value = 1,
 };
 
-// Wrapper message for int32.
+// Wrapper message for `int32`.
+//
+// The JSON representation for `Int32Value` is JSON number.
 @interface GPBInt32Value : GPBMessage
 
 // The int32 value.
@@ -100,7 +110,9 @@ typedef GPB_ENUM(GPBUInt32Value_FieldNumber) {
   GPBUInt32Value_FieldNumber_Value = 1,
 };
 
-// Wrapper message for uint32.
+// Wrapper message for `uint32`.
+//
+// The JSON representation for `UInt32Value` is JSON number.
 @interface GPBUInt32Value : GPBMessage
 
 // The uint32 value.
@@ -114,7 +126,9 @@ typedef GPB_ENUM(GPBBoolValue_FieldNumber) {
   GPBBoolValue_FieldNumber_Value = 1,
 };
 
-// Wrapper message for bool.
+// Wrapper message for `bool`.
+//
+// The JSON representation for `BoolValue` is JSON `true` and `false`.
 @interface GPBBoolValue : GPBMessage
 
 // The bool value.
@@ -128,7 +142,9 @@ typedef GPB_ENUM(GPBStringValue_FieldNumber) {
   GPBStringValue_FieldNumber_Value = 1,
 };
 
-// Wrapper message for string.
+// Wrapper message for `string`.
+//
+// The JSON representation for `StringValue` is JSON string.
 @interface GPBStringValue : GPBMessage
 
 // The string value.
@@ -142,7 +158,9 @@ typedef GPB_ENUM(GPBBytesValue_FieldNumber) {
   GPBBytesValue_FieldNumber_Value = 1,
 };
 
-// Wrapper message for bytes.
+// Wrapper message for `bytes`.
+//
+// The JSON representation for `BytesValue` is JSON string.
 @interface GPBBytesValue : GPBMessage
 
 // The bytes value.

+ 1 - 0
src/google/protobuf/unittest_no_arena.proto

@@ -44,6 +44,7 @@ option cc_generic_services = true;     // auto-added
 option java_generic_services = true;   // auto-added
 option py_generic_services = true;     // auto-added
 option cc_enable_arenas = false;
+option objc_class_prefix = "NOARN";
 
 import "google/protobuf/unittest_import.proto";
 import "google/protobuf/unittest_arena.proto";