diff --git a/objectivec/DevTools/compile_testing_protos.sh b/objectivec/DevTools/compile_testing_protos.sh index f414bd877..e9c5fe611 100755 --- a/objectivec/DevTools/compile_testing_protos.sh +++ b/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 \ diff --git a/objectivec/Tests/GPBUnittestProtos.m b/objectivec/Tests/GPBUnittestProtos.m index 0a3fc5832..50c4dfa98 100644 --- a/objectivec/Tests/GPBUnittestProtos.m +++ b/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" diff --git a/objectivec/Tests/GPBWireFormatTests.m b/objectivec/Tests/GPBWireFormatTests.m index d722d7b26..c1244212d 100644 --- a/objectivec/Tests/GPBWireFormatTests.m +++ b/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 diff --git a/objectivec/google/protobuf/Any.pbobjc.h b/objectivec/google/protobuf/Any.pbobjc.h index e09f3a49c..6511b8ed5 100644 --- a/objectivec/google/protobuf/Any.pbobjc.h +++ b/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. diff --git a/objectivec/google/protobuf/Api.pbobjc.h b/objectivec/google/protobuf/Api.pbobjc.h index 021dac5fd..d6292cbae 100644 --- a/objectivec/google/protobuf/Api.pbobjc.h +++ b/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 diff --git a/objectivec/google/protobuf/Api.pbobjc.m b/objectivec/google/protobuf/Api.pbobjc.m index c2be94ab6..d964ff412 100644 --- a/objectivec/google/protobuf/Api.pbobjc.m +++ b/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) diff --git a/objectivec/google/protobuf/Descriptor.pbobjc.h b/objectivec/google/protobuf/Descriptor.pbobjc.h index bf0f51a63..2a86a7e11 100644 --- a/objectivec/google/protobuf/Descriptor.pbobjc.h +++ b/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; diff --git a/objectivec/google/protobuf/Descriptor.pbobjc.m b/objectivec/google/protobuf/Descriptor.pbobjc.m index 8c535b9a4..8d69867b3 100644 --- a/objectivec/google/protobuf/Descriptor.pbobjc.m +++ b/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, diff --git a/objectivec/google/protobuf/Empty.pbobjc.h b/objectivec/google/protobuf/Empty.pbobjc.h index 17e2b19ba..ff7f384a2 100644 --- a/objectivec/google/protobuf/Empty.pbobjc.h +++ b/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 diff --git a/objectivec/google/protobuf/FieldMask.pbobjc.h b/objectivec/google/protobuf/FieldMask.pbobjc.h index de62c03b2..0cdbd5747 100644 --- a/objectivec/google/protobuf/FieldMask.pbobjc.h +++ b/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. diff --git a/objectivec/google/protobuf/Struct.pbobjc.h b/objectivec/google/protobuf/Struct.pbobjc.h index d72f97381..7513cf90b 100644 --- a/objectivec/google/protobuf/Struct.pbobjc.h +++ b/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. diff --git a/objectivec/google/protobuf/Timestamp.pbobjc.h b/objectivec/google/protobuf/Timestamp.pbobjc.h index 0b3421566..a1f68bd25 100644 --- a/objectivec/google/protobuf/Timestamp.pbobjc.h +++ b/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 diff --git a/objectivec/google/protobuf/Type.pbobjc.h b/objectivec/google/protobuf/Type.pbobjc.h index eb807ae53..44ef05c5a 100644 --- a/objectivec/google/protobuf/Type.pbobjc.h +++ b/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) { diff --git a/objectivec/google/protobuf/Type.pbobjc.m b/objectivec/google/protobuf/Type.pbobjc.m index 5a2ce2823..4485e9046 100644 --- a/objectivec/google/protobuf/Type.pbobjc.m +++ b/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 diff --git a/objectivec/google/protobuf/Wrappers.pbobjc.h b/objectivec/google/protobuf/Wrappers.pbobjc.h index b4718d025..a9a260bc8 100644 --- a/objectivec/google/protobuf/Wrappers.pbobjc.h +++ b/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. diff --git a/src/google/protobuf/unittest_no_arena.proto b/src/google/protobuf/unittest_no_arena.proto index 36fb86560..41518df29 100644 --- a/src/google/protobuf/unittest_no_arena.proto +++ b/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";