diff options
Diffstat (limited to 'php')
81 files changed, 5832 insertions, 3387 deletions
diff --git a/php/composer.json b/php/composer.json index 32b0f44c..724a45dd 100644 --- a/php/composer.json +++ b/php/composer.json @@ -20,9 +20,6 @@ "GPBMetadata\\": "tests/generated/GPBMetadata", "GPBMetadata\\Google\\Protobuf\\Internal\\": "src/GPBMetadata/Google/Protobuf/Internal", "": "tests/generated" - }, - "files": [ - "src/Google/Protobuf/descriptor.php" - ] + } } } diff --git a/php/ext/google/protobuf/def.c b/php/ext/google/protobuf/def.c index 8e563a61..332616b2 100644 --- a/php/ext/google/protobuf/def.c +++ b/php/ext/google/protobuf/def.c @@ -30,8 +30,8 @@ #include "protobuf.h" -const char* const kReservedNames[] = {"Empty"}; -const int kReservedNamesSize = 1; +const char* const kReservedNames[] = {"Empty", "ECHO", "ARRAY"}; +const int kReservedNamesSize = 3; // Forward declare. static void descriptor_init_c_instance(Descriptor* intern TSRMLS_DC); @@ -405,23 +405,34 @@ static const char *classname_prefix(const char *classname, } static void convert_to_class_name_inplace(const char *package, + const char *namespace_given, const char *prefix, char *classname) { - size_t package_len = package == NULL ? 0 : strlen(package); size_t prefix_len = prefix == NULL ? 0 : strlen(prefix); size_t classname_len = strlen(classname); int i = 0, j; bool first_char = true; - int offset = package_len != 0 ? 2 : 0; + size_t package_len = package == NULL ? 0 : strlen(package); + size_t namespace_given_len = + namespace_given == NULL ? 0 : strlen(namespace_given); + bool use_namespace_given = namespace_given != NULL; + size_t namespace_len = + use_namespace_given ? namespace_given_len : package_len; + + int offset = namespace_len != 0 ? 2 : 0; for (j = 0; j < classname_len; j++) { - classname[package_len + prefix_len + classname_len + offset - 1 - j] = + classname[namespace_len + prefix_len + classname_len + offset - 1 - j] = classname[classname_len - j - 1]; } - if (package_len != 0) { + if (namespace_len != 0) { classname[i++] = '\\'; - for (j = 0; j < package_len; j++) { + for (j = 0; j < namespace_len; j++) { + if (use_namespace_given) { + classname[i++] = namespace_given[j]; + continue; + } // php packages are divided by '\'. if (package[j] == '.') { classname[i++] = '\\'; @@ -490,16 +501,20 @@ PHP_METHOD(DescriptorPool, internalAddGeneratedFile) { * bytes allocated, one for '.', one for trailing 0, and 3 for 'GPB' if \ * given message is google.protobuf.Empty.*/ \ const char *fullname = upb_##def_type_lower##_fullname(def_type_lower); \ + const char *php_namespace = upb_filedef_phpnamespace(files[0]); \ const char *prefix_given = upb_filedef_phpprefix(files[0]); \ size_t classname_len = strlen(fullname) + 5; \ if (prefix_given != NULL) { \ classname_len += strlen(prefix_given); \ } \ + if (php_namespace != NULL) { \ + classname_len += strlen(php_namespace); \ + } \ char *classname = ecalloc(sizeof(char), classname_len); \ const char *package = upb_filedef_package(files[0]); \ classname_no_prefix(fullname, package, classname); \ const char *prefix = classname_prefix(classname, prefix_given, package); \ - convert_to_class_name_inplace(package, prefix, classname); \ + convert_to_class_name_inplace(package, php_namespace, prefix, classname); \ PHP_PROTO_CE_DECLARE pce; \ if (php_proto_zend_lookup_class(classname, strlen(classname), &pce) == \ FAILURE) { \ diff --git a/php/ext/google/protobuf/encode_decode.c b/php/ext/google/protobuf/encode_decode.c index 28bf18f4..ef3d4cf6 100644 --- a/php/ext/google/protobuf/encode_decode.c +++ b/php/ext/google/protobuf/encode_decode.c @@ -164,18 +164,21 @@ typedef struct { int property_ofs; // properties table cache uint32_t oneof_case_num; // oneof-case number to place in oneof_case field const upb_msgdef *md; // msgdef, for oneof submessage handler + const upb_msgdef *parent_md; // msgdef, for parent submessage } oneof_handlerdata_t; static const void *newoneofhandlerdata(upb_handlers *h, uint32_t ofs, uint32_t case_ofs, int property_ofs, + const upb_msgdef *m, const upb_fielddef *f) { oneof_handlerdata_t* hd = (oneof_handlerdata_t*)malloc(sizeof(oneof_handlerdata_t)); hd->ofs = ofs; hd->case_ofs = case_ofs; hd->property_ofs = property_ofs; + hd->parent_md = m; // We reuse the field tag number as a oneof union discriminant tag. Note that // we don't expose these numbers to the user, so the only requirement is that // we have some unique ID for each union case/possibility. The field tag @@ -284,10 +287,19 @@ DEFINE_SINGULAR_HANDLER(double, double) #if PHP_MAJOR_VERSION < 7 static void *empty_php_string(zval** value_ptr) { SEPARATE_ZVAL_IF_NOT_REF(value_ptr); + if (Z_TYPE_PP(value_ptr) == IS_STRING && + !IS_INTERNED(Z_STRVAL_PP(value_ptr))) { + FREE(Z_STRVAL_PP(value_ptr)); + } + ZVAL_EMPTY_STRING(*value_ptr); return (void*)(*value_ptr); } #else static void *empty_php_string(zval* value_ptr) { + if (Z_TYPE_P(value_ptr) == IS_STRING) { + zend_string_release(Z_STR_P(value_ptr)); + } + ZVAL_EMPTY_STRING(value_ptr); return value_ptr; } #endif @@ -654,6 +666,44 @@ DEFINE_ONEOF_HANDLER(double, double) #undef DEFINE_ONEOF_HANDLER +static void oneof_cleanup(MessageHeader* msg, + const oneof_handlerdata_t* oneofdata) { + uint32_t old_case_num = + DEREF(message_data(msg), oneofdata->case_ofs, uint32_t); + if (old_case_num == 0) { + return; + } + + const upb_fielddef* old_field = + upb_msgdef_itof(oneofdata->parent_md, old_case_num); + bool need_clean = false; + + switch (upb_fielddef_type(old_field)) { + case UPB_TYPE_STRING: + case UPB_TYPE_BYTES: + need_clean = true; + break; + case UPB_TYPE_MESSAGE: + if (oneofdata->oneof_case_num != old_case_num) { + need_clean = true; + } + break; + default: + break; + } + + if (need_clean) { +#if PHP_MAJOR_VERSION < 7 + SEPARATE_ZVAL_IF_NOT_REF( + DEREF(message_data(msg), oneofdata->ofs, CACHED_VALUE*)); + php_proto_zval_ptr_dtor( + *DEREF(message_data(msg), oneofdata->ofs, CACHED_VALUE*)); + MAKE_STD_ZVAL(*DEREF(message_data(msg), oneofdata->ofs, CACHED_VALUE*)); + ZVAL_NULL(*DEREF(message_data(msg), oneofdata->ofs, CACHED_VALUE*)); +#endif + } +} + // Handlers for string/bytes in a oneof. static void *oneofbytes_handler(void *closure, const void *hd, @@ -661,6 +711,8 @@ static void *oneofbytes_handler(void *closure, MessageHeader* msg = closure; const oneof_handlerdata_t *oneofdata = hd; + oneof_cleanup(msg, oneofdata); + DEREF(message_data(msg), oneofdata->case_ofs, uint32_t) = oneofdata->oneof_case_num; DEREF(message_data(msg), oneofdata->ofs, CACHED_VALUE*) = @@ -691,22 +743,11 @@ static void* oneofsubmsg_handler(void* closure, const void* hd) { MessageHeader* submsg; if (oldcase != oneofdata->oneof_case_num) { - // Ideally, we should clean up the old data. However, we don't even know the - // type of the old data. So, we will defer the desctruction of the old data - // to the time that containing message's destroyed or the same oneof field - // is accessed again and find that the old data hasn't been cleaned. - DEREF(message_data(msg), oneofdata->ofs, CACHED_VALUE*) = - &(msg->std.properties_table)[oneofdata->property_ofs]; - - // Old data was't cleaned when the oneof was accessed from another field. - if (Z_TYPE_P(CACHED_PTR_TO_ZVAL_PTR(DEREF( - message_data(msg), oneofdata->ofs, CACHED_VALUE*))) != IS_NULL) { - php_proto_zval_ptr_dtor( - CACHED_PTR_TO_ZVAL_PTR( - DEREF(message_data(msg), oneofdata->ofs, CACHED_VALUE*))); - } + oneof_cleanup(msg, oneofdata); // Create new message. + DEREF(message_data(msg), oneofdata->ofs, CACHED_VALUE*) = + &(msg->std.properties_table)[oneofdata->property_ofs]; ZVAL_OBJ(CACHED_PTR_TO_ZVAL_PTR( DEREF(message_data(msg), oneofdata->ofs, CACHED_VALUE*)), subklass->create_object(subklass TSRMLS_CC)); @@ -856,6 +897,7 @@ static void add_handlers_for_mapentry(const upb_msgdef* msgdef, upb_handlers* h, // Set up handlers for a oneof field. static void add_handlers_for_oneof_field(upb_handlers *h, + const upb_msgdef *m, const upb_fielddef *f, size_t offset, size_t oneof_case_offset, @@ -864,7 +906,7 @@ static void add_handlers_for_oneof_field(upb_handlers *h, upb_handlerattr attr = UPB_HANDLERATTR_INITIALIZER; upb_handlerattr_sethandlerdata( &attr, newoneofhandlerdata(h, offset, oneof_case_offset, - property_cache_offset, f)); + property_cache_offset, m, f)); switch (upb_fielddef_type(f)) { @@ -936,8 +978,8 @@ static void add_handlers_for_message(const void* closure, desc->layout->fields[upb_fielddef_index(f)].case_offset; int property_cache_index = desc->layout->fields[upb_fielddef_index(f)].cache_index; - add_handlers_for_oneof_field(h, f, offset, oneof_case_offset, - property_cache_index); + add_handlers_for_oneof_field(h, desc->msgdef, f, offset, + oneof_case_offset, property_cache_index); } else if (is_map_field(f)) { add_handlers_for_mapfield(h, f, offset, desc); } else if (upb_fielddef_isseq(f)) { @@ -1167,6 +1209,7 @@ static void putrawmsg(MessageHeader* msg, const Descriptor* desc, upb_msg_field_next(&i)) { upb_fielddef* f = upb_msg_iter_field(&i); uint32_t offset = desc->layout->fields[upb_fielddef_index(f)].offset; + bool containing_oneof = false; if (upb_fielddef_containingoneof(f)) { uint32_t oneof_case_offset = @@ -1179,6 +1222,7 @@ static void putrawmsg(MessageHeader* msg, const Descriptor* desc, } // Otherwise, fall through to the appropriate singular-field handler // below. + containing_oneof = true; } if (is_map_field(f)) { @@ -1196,7 +1240,7 @@ static void putrawmsg(MessageHeader* msg, const Descriptor* desc, } else if (upb_fielddef_isstring(f)) { zval* str = CACHED_PTR_TO_ZVAL_PTR( DEREF(message_data(msg), offset, CACHED_VALUE*)); - if (Z_STRLEN_P(str) > 0) { + if (containing_oneof || Z_STRLEN_P(str) > 0) { putstr(str, f, sink); } } else if (upb_fielddef_issubmsg(f)) { @@ -1209,7 +1253,7 @@ static void putrawmsg(MessageHeader* msg, const Descriptor* desc, #define T(upbtypeconst, upbtype, ctype, default_value) \ case upbtypeconst: { \ ctype value = DEREF(message_data(msg), offset, ctype); \ - if (value != default_value) { \ + if (containing_oneof || value != default_value) { \ upb_sink_put##upbtype(sink, sel, value); \ } \ } break; @@ -1219,10 +1263,10 @@ static void putrawmsg(MessageHeader* msg, const Descriptor* desc, T(UPB_TYPE_DOUBLE, double, double, 0.0) T(UPB_TYPE_BOOL, bool, uint8_t, 0) case UPB_TYPE_ENUM: - T(UPB_TYPE_INT32, int32, int32_t, 0) - T(UPB_TYPE_UINT32, uint32, uint32_t, 0) - T(UPB_TYPE_INT64, int64, int64_t, 0) - T(UPB_TYPE_UINT64, uint64, uint64_t, 0) + T(UPB_TYPE_INT32, int32, int32_t, 0) + T(UPB_TYPE_UINT32, uint32, uint32_t, 0) + T(UPB_TYPE_INT64, int64, int64_t, 0) + T(UPB_TYPE_UINT64, uint64, uint64_t, 0) case UPB_TYPE_STRING: case UPB_TYPE_BYTES: @@ -1244,18 +1288,23 @@ static void putstr(zval* str, const upb_fielddef *f, upb_sink *sink) { assert(Z_TYPE_P(str) == IS_STRING); - // Ensure that the string has the correct encoding. We also check at field-set - // time, but the user may have mutated the string object since then. - if (upb_fielddef_type(f) == UPB_TYPE_STRING && - !is_structurally_valid_utf8(Z_STRVAL_P(str), Z_STRLEN_P(str))) { - zend_error(E_USER_ERROR, "Given string is not UTF8 encoded."); - return; - } - upb_sink_startstr(sink, getsel(f, UPB_HANDLER_STARTSTR), Z_STRLEN_P(str), &subsink); - upb_sink_putstring(&subsink, getsel(f, UPB_HANDLER_STRING), Z_STRVAL_P(str), - Z_STRLEN_P(str), NULL); + + // For oneof string field, we may get here with string length is zero. + if (Z_STRLEN_P(str) > 0) { + // Ensure that the string has the correct encoding. We also check at + // field-set time, but the user may have mutated the string object since + // then. + if (upb_fielddef_type(f) == UPB_TYPE_STRING && + !is_structurally_valid_utf8(Z_STRVAL_P(str), Z_STRLEN_P(str))) { + zend_error(E_USER_ERROR, "Given string is not UTF8 encoded."); + return; + } + upb_sink_putstring(&subsink, getsel(f, UPB_HANDLER_STRING), Z_STRVAL_P(str), + Z_STRLEN_P(str), NULL); + } + upb_sink_endstr(sink, getsel(f, UPB_HANDLER_ENDSTR)); } @@ -1450,7 +1499,7 @@ PHP_METHOD(Message, mergeFromString) { } } -PHP_METHOD(Message, jsonEncode) { +PHP_METHOD(Message, serializeToJsonString) { Descriptor* desc = UNBOX_HASHTABLE_VALUE(Descriptor, get_ce_obj(Z_OBJCE_P(getThis()))); @@ -1481,13 +1530,14 @@ PHP_METHOD(Message, jsonEncode) { } } -PHP_METHOD(Message, jsonDecode) { +PHP_METHOD(Message, mergeFromJsonString) { Descriptor* desc = UNBOX_HASHTABLE_VALUE(Descriptor, get_ce_obj(Z_OBJCE_P(getThis()))); MessageHeader* msg = UNBOX(MessageHeader, getThis()); char *data = NULL; - int data_len; + PHP_PROTO_SIZE data_len; + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &data, &data_len) == FAILURE) { return; diff --git a/php/ext/google/protobuf/map.c b/php/ext/google/protobuf/map.c index a5d48446..4a524864 100644 --- a/php/ext/google/protobuf/map.c +++ b/php/ext/google/protobuf/map.c @@ -143,6 +143,7 @@ static zend_function_entry map_field_methods[] = { PHP_ME(MapField, offsetSet, arginfo_offsetSet, ZEND_ACC_PUBLIC) PHP_ME(MapField, offsetUnset, arginfo_offsetGet, ZEND_ACC_PUBLIC) PHP_ME(MapField, count, arginfo_void, ZEND_ACC_PUBLIC) + PHP_ME(MapField, getIterator, arginfo_void, ZEND_ACC_PUBLIC) ZEND_FE_END }; @@ -156,7 +157,10 @@ static void map_field_write_dimension(zval *object, zval *key, // ----------------------------------------------------------------------------- zend_class_entry* map_field_type; +zend_class_entry* map_field_iter_type; + zend_object_handlers* map_field_handlers; +zend_object_handlers* map_field_iter_handlers; static void map_begin_internal(Map *map, MapIter *iter) { iter->self = map; @@ -231,8 +235,8 @@ PHP_PROTO_OBJECT_CREATE_END(Map, map_field) // Init class entry. PHP_PROTO_INIT_CLASS_START("Google\\Protobuf\\Internal\\MapField", Map, map_field) -zend_class_implements(map_field_type TSRMLS_CC, 2, spl_ce_ArrayAccess, - spl_ce_Countable); +zend_class_implements(map_field_type TSRMLS_CC, 3, spl_ce_ArrayAccess, + zend_ce_aggregate, spl_ce_Countable); map_field_handlers->write_dimension = map_field_write_dimension; map_field_handlers->get_gc = map_field_get_gc; PHP_PROTO_INIT_CLASS_END @@ -444,6 +448,15 @@ PHP_METHOD(MapField, count) { RETURN_LONG(upb_strtable_count(&intern->table)); } +PHP_METHOD(MapField, getIterator) { + CREATE_OBJ_ON_ALLOCATED_ZVAL_PTR(return_value, + map_field_iter_type); + + Map *intern = UNBOX(Map, getThis()); + MapIter *iter = UNBOX(MapIter, return_value); + map_begin(getThis(), iter TSRMLS_CC); +} + // ----------------------------------------------------------------------------- // Map Iterator // ----------------------------------------------------------------------------- @@ -470,3 +483,79 @@ upb_value map_iter_value(MapIter *iter, int *len) { *len = native_slot_size(iter->self->value_type); return upb_strtable_iter_value(&iter->it); } + +// ----------------------------------------------------------------------------- +// MapFieldIter methods +// ----------------------------------------------------------------------------- +static zend_function_entry map_field_iter_methods[] = { + PHP_ME(MapFieldIter, rewind, arginfo_void, ZEND_ACC_PUBLIC) + PHP_ME(MapFieldIter, current, arginfo_void, ZEND_ACC_PUBLIC) + PHP_ME(MapFieldIter, key, arginfo_void, ZEND_ACC_PUBLIC) + PHP_ME(MapFieldIter, next, arginfo_void, ZEND_ACC_PUBLIC) + PHP_ME(MapFieldIter, valid, arginfo_void, ZEND_ACC_PUBLIC) + ZEND_FE_END +}; + +// ----------------------------------------------------------------------------- +// MapFieldIter creation/desctruction +// ----------------------------------------------------------------------------- + +// Define object free method. +PHP_PROTO_OBJECT_FREE_START(MapIter, map_field_iter) +PHP_PROTO_OBJECT_FREE_END + +PHP_PROTO_OBJECT_DTOR_START(MapIter, map_field_iter) +PHP_PROTO_OBJECT_DTOR_END + +// Define object create method. +PHP_PROTO_OBJECT_CREATE_START(MapIter, map_field_iter) +intern->self = NULL; +PHP_PROTO_OBJECT_CREATE_END(MapIter, map_field_iter) + +// Init class entry. +PHP_PROTO_INIT_CLASS_START("Google\\Protobuf\\Internal\\MapFieldIter", + MapIter, map_field_iter) +zend_class_implements(map_field_iter_type TSRMLS_CC, 1, zend_ce_iterator); +PHP_PROTO_INIT_CLASS_END + +// ----------------------------------------------------------------------------- +// PHP MapFieldIter Methods +// ----------------------------------------------------------------------------- + +PHP_METHOD(MapFieldIter, rewind) { + MapIter *intern = UNBOX(MapIter, getThis()); + map_begin_internal(intern->self, intern); +} + +PHP_METHOD(MapFieldIter, current) { + MapIter *intern = UNBOX(MapIter, getThis()); + Map *map_field = intern->self; + + int value_length = 0; + upb_value value = map_iter_value(intern, &value_length); + + void* mem = upb_value_memory(&value); + native_slot_get_by_array(map_field->value_type, mem, + ZVAL_PTR_TO_CACHED_PTR(return_value) TSRMLS_CC); +} + +PHP_METHOD(MapFieldIter, key) { + MapIter *intern = UNBOX(MapIter, getThis()); + Map *map_field = intern->self; + + int key_length = 0; + const char* key = map_iter_key(intern, &key_length); + + native_slot_get_by_map_key(map_field->key_type, key, key_length, + ZVAL_PTR_TO_CACHED_PTR(return_value) TSRMLS_CC); +} + +PHP_METHOD(MapFieldIter, next) { + MapIter *intern = UNBOX(MapIter, getThis()); + map_next(intern); +} + +PHP_METHOD(MapFieldIter, valid) { + MapIter *intern = UNBOX(MapIter, getThis()); + RETURN_BOOL(!map_done(intern)); +} diff --git a/php/ext/google/protobuf/message.c b/php/ext/google/protobuf/message.c index cabc3987..b8ef9fc0 100644 --- a/php/ext/google/protobuf/message.c +++ b/php/ext/google/protobuf/message.c @@ -30,7 +30,6 @@ #include <php.h> #include <stdlib.h> -#include <ext/json/php_json.h> #include "protobuf.h" @@ -41,8 +40,8 @@ static zend_function_entry message_methods[] = { PHP_ME(Message, clear, NULL, ZEND_ACC_PUBLIC) PHP_ME(Message, serializeToString, NULL, ZEND_ACC_PUBLIC) PHP_ME(Message, mergeFromString, NULL, ZEND_ACC_PUBLIC) - PHP_ME(Message, jsonEncode, NULL, ZEND_ACC_PUBLIC) - PHP_ME(Message, jsonDecode, NULL, ZEND_ACC_PUBLIC) + PHP_ME(Message, serializeToJsonString, NULL, ZEND_ACC_PUBLIC) + PHP_ME(Message, mergeFromJsonString, NULL, ZEND_ACC_PUBLIC) PHP_ME(Message, mergeFrom, NULL, ZEND_ACC_PUBLIC) PHP_ME(Message, readOneof, NULL, ZEND_ACC_PROTECTED) PHP_ME(Message, writeOneof, NULL, ZEND_ACC_PROTECTED) diff --git a/php/ext/google/protobuf/protobuf.c b/php/ext/google/protobuf/protobuf.c index 6a848b27..5de9cfe9 100644 --- a/php/ext/google/protobuf/protobuf.c +++ b/php/ext/google/protobuf/protobuf.c @@ -189,6 +189,7 @@ static PHP_RSHUTDOWN_FUNCTION(protobuf) { static PHP_MINIT_FUNCTION(protobuf) { map_field_init(TSRMLS_C); + map_field_iter_init(TSRMLS_C); repeated_field_init(TSRMLS_C); repeated_field_iter_init(TSRMLS_C); gpb_type_init(TSRMLS_C); @@ -206,6 +207,7 @@ static PHP_MSHUTDOWN_FUNCTION(protobuf) { PEFREE(repeated_field_handlers); PEFREE(repeated_field_iter_handlers); PEFREE(map_field_handlers); + PEFREE(map_field_iter_handlers); return 0; } diff --git a/php/ext/google/protobuf/protobuf.h b/php/ext/google/protobuf/protobuf.h index e6d42eba..eecae136 100644 --- a/php/ext/google/protobuf/protobuf.h +++ b/php/ext/google/protobuf/protobuf.h @@ -373,6 +373,7 @@ struct MessageLayout; struct RepeatedField; struct RepeatedFieldIter; struct Map; +struct MapIter; struct Oneof; typedef struct DescriptorPool DescriptorPool; @@ -385,6 +386,7 @@ typedef struct MessageLayout MessageLayout; typedef struct RepeatedField RepeatedField; typedef struct RepeatedFieldIter RepeatedFieldIter; typedef struct Map Map; +typedef struct MapIter MapIter; typedef struct Oneof Oneof; // ----------------------------------------------------------------------------- @@ -400,6 +402,7 @@ void enum_descriptor_init(TSRMLS_D); void descriptor_pool_init(TSRMLS_D); void gpb_type_init(TSRMLS_D); void map_field_init(TSRMLS_D); +void map_field_iter_init(TSRMLS_D); void repeated_field_init(TSRMLS_D); void repeated_field_iter_init(TSRMLS_D); void util_init(TSRMLS_D); @@ -593,8 +596,8 @@ const upb_pbdecodermethod *new_fillmsg_decodermethod(Descriptor *desc, PHP_METHOD(Message, serializeToString); PHP_METHOD(Message, mergeFromString); -PHP_METHOD(Message, jsonEncode); -PHP_METHOD(Message, jsonDecode); +PHP_METHOD(Message, serializeToJsonString); +PHP_METHOD(Message, mergeFromJsonString); // ----------------------------------------------------------------------------- // Type check / conversion. @@ -637,7 +640,7 @@ bool native_slot_set(upb_fieldtype_t type, const zend_class_entry* klass, bool native_slot_set_by_array(upb_fieldtype_t type, const zend_class_entry* klass, void* memory, zval* value TSRMLS_DC); -void native_slot_init(upb_fieldtype_t type, void* memory, void* cache); +void native_slot_init(upb_fieldtype_t type, void* memory, CACHED_VALUE* cache); // For each property, in order to avoid conversion between the zval object and // the actual data type during parsing/serialization, the containing message // object use the custom memory layout to store the actual data type for each @@ -659,6 +662,7 @@ void native_slot_get_default(upb_fieldtype_t type, // ----------------------------------------------------------------------------- extern zend_object_handlers* map_field_handlers; +extern zend_object_handlers* map_field_iter_handlers; PHP_PROTO_WRAP_OBJECT_START(Map) upb_fieldtype_t key_type; @@ -667,10 +671,10 @@ PHP_PROTO_WRAP_OBJECT_START(Map) upb_strtable table; PHP_PROTO_WRAP_OBJECT_END -typedef struct { +PHP_PROTO_WRAP_OBJECT_START(MapIter) Map* self; upb_strtable_iter it; -} MapIter; +PHP_PROTO_WRAP_OBJECT_END void map_begin(zval* self, MapIter* iter TSRMLS_DC); void map_next(MapIter* iter); @@ -709,6 +713,13 @@ PHP_METHOD(MapField, offsetGet); PHP_METHOD(MapField, offsetSet); PHP_METHOD(MapField, offsetUnset); PHP_METHOD(MapField, count); +PHP_METHOD(MapField, getIterator); + +PHP_METHOD(MapFieldIter, rewind); +PHP_METHOD(MapFieldIter, current); +PHP_METHOD(MapFieldIter, key); +PHP_METHOD(MapFieldIter, next); +PHP_METHOD(MapFieldIter, valid); // ----------------------------------------------------------------------------- // Repeated Field. diff --git a/php/ext/google/protobuf/storage.c b/php/ext/google/protobuf/storage.c index 6318f88c..6c789bcb 100644 --- a/php/ext/google/protobuf/storage.c +++ b/php/ext/google/protobuf/storage.c @@ -210,7 +210,7 @@ bool native_slot_set_by_array(upb_fieldtype_t type, return true; } -void native_slot_init(upb_fieldtype_t type, void* memory, void* cache) { +void native_slot_init(upb_fieldtype_t type, void* memory, CACHED_VALUE* cache) { zval* tmp = NULL; switch (type) { case UPB_TYPE_FLOAT: @@ -224,6 +224,9 @@ void native_slot_init(upb_fieldtype_t type, void* memory, void* cache) { break; case UPB_TYPE_STRING: case UPB_TYPE_BYTES: + DEREF(memory, CACHED_VALUE*) = cache; + ZVAL_EMPTY_STRING(CACHED_PTR_TO_ZVAL_PTR(cache)); + break; case UPB_TYPE_MESSAGE: DEREF(memory, CACHED_VALUE*) = cache; break; @@ -355,6 +358,19 @@ void native_slot_get_by_array(upb_fieldtype_t type, const void* memory, } } +void native_slot_get_by_map_key(upb_fieldtype_t type, const void* memory, + int length, CACHED_VALUE* cache TSRMLS_DC) { + switch (type) { + case UPB_TYPE_STRING: + case UPB_TYPE_BYTES: { + PHP_PROTO_ZVAL_STRINGL(CACHED_PTR_TO_ZVAL_PTR(cache), memory, length, 1); + return; + } + default: + native_slot_get(type, memory, cache TSRMLS_CC); + } +} + void native_slot_get_default(upb_fieldtype_t type, CACHED_VALUE* cache TSRMLS_DC) { switch (type) { @@ -608,6 +624,21 @@ void layout_init(MessageLayout* layout, void* storage, int cache_index = slot_property_cache(layout, storage, field); CACHED_VALUE* property_ptr = &properties_table[cache_index]; + // Clean up initial value by generated code. In the generated code of + // previous versions, each php field is given an initial value. However, the + // order to initialize these fields may not be consistent with the order of + // upb fields. + if (Z_TYPE_P(CACHED_PTR_TO_ZVAL_PTR(property_ptr)) == IS_STRING) { +#if PHP_MAJOR_VERSION < 7 + if (!IS_INTERNED(Z_STRVAL_PP(property_ptr))) { + FREE(Z_STRVAL_PP(property_ptr)); + } +#else + zend_string_release(Z_STR_P(property_ptr)); +#endif + } + ZVAL_NULL(CACHED_PTR_TO_ZVAL_PTR(property_ptr)); + if (upb_fielddef_containingoneof(field)) { memset(memory, 0, NATIVE_SLOT_MAX_SIZE); *oneof_case = ONEOF_CASE_NONE; @@ -731,7 +762,7 @@ void layout_set(MessageLayout* layout, MessageHeader* header, } } -static native_slot_merge(const upb_fielddef* field, const void* from_memory, +static void native_slot_merge(const upb_fielddef* field, const void* from_memory, void* to_memory PHP_PROTO_TSRMLS_DC) { upb_fieldtype_t type = upb_fielddef_type(field); zend_class_entry* ce = NULL; @@ -788,7 +819,7 @@ static native_slot_merge(const upb_fielddef* field, const void* from_memory, } } -static native_slot_merge_by_array(const upb_fielddef* field, const void* from_memory, +static void native_slot_merge_by_array(const upb_fielddef* field, const void* from_memory, void* to_memory PHP_PROTO_TSRMLS_DC) { upb_fieldtype_t type = upb_fielddef_type(field); switch (type) { diff --git a/php/ext/google/protobuf/upb.c b/php/ext/google/protobuf/upb.c index 70983016..d701dcba 100644 --- a/php/ext/google/protobuf/upb.c +++ b/php/ext/google/protobuf/upb.c @@ -1859,6 +1859,7 @@ static void freefiledef(upb_refcounted *r) { upb_gfree((void*)f->name); upb_gfree((void*)f->package); upb_gfree((void*)f->phpprefix); + upb_gfree((void*)f->phpnamespace); upb_gfree(f); } @@ -1874,6 +1875,7 @@ upb_filedef *upb_filedef_new(const void *owner) { f->package = NULL; f->name = NULL; f->phpprefix = NULL; + f->phpnamespace = NULL; f->syntax = UPB_SYNTAX_PROTO2; if (!upb_refcounted_init(upb_filedef_upcast_mutable(f), &upb_filedef_vtbl, @@ -1912,6 +1914,10 @@ const char *upb_filedef_phpprefix(const upb_filedef *f) { return f->phpprefix; } +const char *upb_filedef_phpnamespace(const upb_filedef *f) { + return f->phpnamespace; +} + upb_syntax_t upb_filedef_syntax(const upb_filedef *f) { return f->syntax; } @@ -1980,6 +1986,18 @@ bool upb_filedef_setphpprefix(upb_filedef *f, const char *phpprefix, return true; } +bool upb_filedef_setphpnamespace(upb_filedef *f, const char *phpnamespace, + upb_status *s) { + phpnamespace = upb_gstrdup(phpnamespace); + if (!phpnamespace) { + upb_upberr_setoom(s); + return false; + } + upb_gfree((void*)f->phpnamespace); + f->phpnamespace = phpnamespace; + return true; +} + bool upb_filedef_setsyntax(upb_filedef *f, upb_syntax_t syntax, upb_status *s) { UPB_UNUSED(s); @@ -2290,6 +2308,9 @@ bool upb_symtab_addfile(upb_symtab *s, upb_filedef *file, upb_status *status) { bool ret; n = upb_filedef_defcount(file); + if (n == 0) { + return true; + } defs = upb_gmalloc(sizeof(*defs) * n); if (defs == NULL) { @@ -6419,14 +6440,14 @@ size_t upb_env_bytesallocated(const upb_env *e) { static const upb_msgdef msgs[22]; -static const upb_fielddef fields[106]; +static const upb_fielddef fields[107]; static const upb_enumdef enums[5]; static const upb_tabent strentries[236]; static const upb_tabent intentries[18]; -static const upb_tabval arrays[186]; +static const upb_tabval arrays[187]; #ifdef UPB_DEBUG_REFS -static upb_inttable reftables[266]; +static upb_inttable reftables[268]; #endif static const upb_msgdef msgs[22] = { @@ -6441,20 +6462,20 @@ static const upb_msgdef msgs[22] = { UPB_MSGDEF_INIT("google.protobuf.FieldOptions", 12, 1, UPB_INTTABLE_INIT(1, 1, UPB_CTYPE_PTR, 1, &intentries[4], &arrays[42], 11, 6), UPB_STRTABLE_INIT(7, 15, UPB_CTYPE_PTR, 4, &strentries[56]), false, UPB_SYNTAX_PROTO2, &reftables[16], &reftables[17]), UPB_MSGDEF_INIT("google.protobuf.FileDescriptorProto", 42, 6, UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_PTR, 0, NULL, &arrays[53], 13, 12), UPB_STRTABLE_INIT(12, 15, UPB_CTYPE_PTR, 4, &strentries[72]), false, UPB_SYNTAX_PROTO2, &reftables[18], &reftables[19]), UPB_MSGDEF_INIT("google.protobuf.FileDescriptorSet", 6, 1, UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_PTR, 0, NULL, &arrays[66], 2, 1), UPB_STRTABLE_INIT(1, 3, UPB_CTYPE_PTR, 2, &strentries[88]), false, UPB_SYNTAX_PROTO2, &reftables[20], &reftables[21]), - UPB_MSGDEF_INIT("google.protobuf.FileOptions", 34, 1, UPB_INTTABLE_INIT(1, 1, UPB_CTYPE_PTR, 1, &intentries[6], &arrays[68], 41, 16), UPB_STRTABLE_INIT(17, 31, UPB_CTYPE_PTR, 5, &strentries[92]), false, UPB_SYNTAX_PROTO2, &reftables[22], &reftables[23]), - UPB_MSGDEF_INIT("google.protobuf.MessageOptions", 10, 1, UPB_INTTABLE_INIT(1, 1, UPB_CTYPE_PTR, 1, &intentries[8], &arrays[109], 8, 4), UPB_STRTABLE_INIT(5, 7, UPB_CTYPE_PTR, 3, &strentries[124]), false, UPB_SYNTAX_PROTO2, &reftables[24], &reftables[25]), - UPB_MSGDEF_INIT("google.protobuf.MethodDescriptorProto", 15, 1, UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_PTR, 0, NULL, &arrays[117], 7, 6), UPB_STRTABLE_INIT(6, 7, UPB_CTYPE_PTR, 3, &strentries[132]), false, UPB_SYNTAX_PROTO2, &reftables[26], &reftables[27]), - UPB_MSGDEF_INIT("google.protobuf.MethodOptions", 7, 1, UPB_INTTABLE_INIT(2, 3, UPB_CTYPE_PTR, 2, &intentries[10], &arrays[124], 1, 0), UPB_STRTABLE_INIT(2, 3, UPB_CTYPE_PTR, 2, &strentries[140]), false, UPB_SYNTAX_PROTO2, &reftables[28], &reftables[29]), - UPB_MSGDEF_INIT("google.protobuf.OneofDescriptorProto", 5, 0, UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_PTR, 0, NULL, &arrays[125], 2, 1), UPB_STRTABLE_INIT(1, 3, UPB_CTYPE_PTR, 2, &strentries[144]), false, UPB_SYNTAX_PROTO2, &reftables[30], &reftables[31]), - UPB_MSGDEF_INIT("google.protobuf.ServiceDescriptorProto", 11, 2, UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_PTR, 0, NULL, &arrays[127], 4, 3), UPB_STRTABLE_INIT(3, 3, UPB_CTYPE_PTR, 2, &strentries[148]), false, UPB_SYNTAX_PROTO2, &reftables[32], &reftables[33]), - UPB_MSGDEF_INIT("google.protobuf.ServiceOptions", 7, 1, UPB_INTTABLE_INIT(2, 3, UPB_CTYPE_PTR, 2, &intentries[14], &arrays[131], 1, 0), UPB_STRTABLE_INIT(2, 3, UPB_CTYPE_PTR, 2, &strentries[152]), false, UPB_SYNTAX_PROTO2, &reftables[34], &reftables[35]), - UPB_MSGDEF_INIT("google.protobuf.SourceCodeInfo", 6, 1, UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_PTR, 0, NULL, &arrays[132], 2, 1), UPB_STRTABLE_INIT(1, 3, UPB_CTYPE_PTR, 2, &strentries[156]), false, UPB_SYNTAX_PROTO2, &reftables[36], &reftables[37]), - UPB_MSGDEF_INIT("google.protobuf.SourceCodeInfo.Location", 19, 0, UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_PTR, 0, NULL, &arrays[134], 7, 5), UPB_STRTABLE_INIT(5, 7, UPB_CTYPE_PTR, 3, &strentries[160]), false, UPB_SYNTAX_PROTO2, &reftables[38], &reftables[39]), - UPB_MSGDEF_INIT("google.protobuf.UninterpretedOption", 18, 1, UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_PTR, 0, NULL, &arrays[141], 9, 7), UPB_STRTABLE_INIT(7, 15, UPB_CTYPE_PTR, 4, &strentries[168]), false, UPB_SYNTAX_PROTO2, &reftables[40], &reftables[41]), - UPB_MSGDEF_INIT("google.protobuf.UninterpretedOption.NamePart", 6, 0, UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_PTR, 0, NULL, &arrays[150], 3, 2), UPB_STRTABLE_INIT(2, 3, UPB_CTYPE_PTR, 2, &strentries[184]), false, UPB_SYNTAX_PROTO2, &reftables[42], &reftables[43]), + UPB_MSGDEF_INIT("google.protobuf.FileOptions", 37, 1, UPB_INTTABLE_INIT(1, 1, UPB_CTYPE_PTR, 1, &intentries[6], &arrays[68], 42, 17), UPB_STRTABLE_INIT(18, 31, UPB_CTYPE_PTR, 5, &strentries[92]), false, UPB_SYNTAX_PROTO2, &reftables[22], &reftables[23]), + UPB_MSGDEF_INIT("google.protobuf.MessageOptions", 10, 1, UPB_INTTABLE_INIT(1, 1, UPB_CTYPE_PTR, 1, &intentries[8], &arrays[110], 8, 4), UPB_STRTABLE_INIT(5, 7, UPB_CTYPE_PTR, 3, &strentries[124]), false, UPB_SYNTAX_PROTO2, &reftables[24], &reftables[25]), + UPB_MSGDEF_INIT("google.protobuf.MethodDescriptorProto", 15, 1, UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_PTR, 0, NULL, &arrays[118], 7, 6), UPB_STRTABLE_INIT(6, 7, UPB_CTYPE_PTR, 3, &strentries[132]), false, UPB_SYNTAX_PROTO2, &reftables[26], &reftables[27]), + UPB_MSGDEF_INIT("google.protobuf.MethodOptions", 7, 1, UPB_INTTABLE_INIT(2, 3, UPB_CTYPE_PTR, 2, &intentries[10], &arrays[125], 1, 0), UPB_STRTABLE_INIT(2, 3, UPB_CTYPE_PTR, 2, &strentries[140]), false, UPB_SYNTAX_PROTO2, &reftables[28], &reftables[29]), + UPB_MSGDEF_INIT("google.protobuf.OneofDescriptorProto", 5, 0, UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_PTR, 0, NULL, &arrays[126], 2, 1), UPB_STRTABLE_INIT(1, 3, UPB_CTYPE_PTR, 2, &strentries[144]), false, UPB_SYNTAX_PROTO2, &reftables[30], &reftables[31]), + UPB_MSGDEF_INIT("google.protobuf.ServiceDescriptorProto", 11, 2, UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_PTR, 0, NULL, &arrays[128], 4, 3), UPB_STRTABLE_INIT(3, 3, UPB_CTYPE_PTR, 2, &strentries[148]), false, UPB_SYNTAX_PROTO2, &reftables[32], &reftables[33]), + UPB_MSGDEF_INIT("google.protobuf.ServiceOptions", 7, 1, UPB_INTTABLE_INIT(2, 3, UPB_CTYPE_PTR, 2, &intentries[14], &arrays[132], 1, 0), UPB_STRTABLE_INIT(2, 3, UPB_CTYPE_PTR, 2, &strentries[152]), false, UPB_SYNTAX_PROTO2, &reftables[34], &reftables[35]), + UPB_MSGDEF_INIT("google.protobuf.SourceCodeInfo", 6, 1, UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_PTR, 0, NULL, &arrays[133], 2, 1), UPB_STRTABLE_INIT(1, 3, UPB_CTYPE_PTR, 2, &strentries[156]), false, UPB_SYNTAX_PROTO2, &reftables[36], &reftables[37]), + UPB_MSGDEF_INIT("google.protobuf.SourceCodeInfo.Location", 19, 0, UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_PTR, 0, NULL, &arrays[135], 7, 5), UPB_STRTABLE_INIT(5, 7, UPB_CTYPE_PTR, 3, &strentries[160]), false, UPB_SYNTAX_PROTO2, &reftables[38], &reftables[39]), + UPB_MSGDEF_INIT("google.protobuf.UninterpretedOption", 18, 1, UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_PTR, 0, NULL, &arrays[142], 9, 7), UPB_STRTABLE_INIT(7, 15, UPB_CTYPE_PTR, 4, &strentries[168]), false, UPB_SYNTAX_PROTO2, &reftables[40], &reftables[41]), + UPB_MSGDEF_INIT("google.protobuf.UninterpretedOption.NamePart", 6, 0, UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_PTR, 0, NULL, &arrays[151], 3, 2), UPB_STRTABLE_INIT(2, 3, UPB_CTYPE_PTR, 2, &strentries[184]), false, UPB_SYNTAX_PROTO2, &reftables[42], &reftables[43]), }; -static const upb_fielddef fields[106] = { +static const upb_fielddef fields[107] = { UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "aggregate_value", 8, &msgs[20], NULL, 15, 6, {0},&reftables[44], &reftables[45]), UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "allow_alias", 2, &msgs[4], NULL, 6, 1, {0},&reftables[46], &reftables[47]), UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "cc_enable_arenas", 31, &msgs[11], NULL, 23, 12, {0},&reftables[48], &reftables[49]), @@ -6505,77 +6526,78 @@ static const upb_fielddef fields[106] = { UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "message_type", 4, &msgs[9], (const upb_def*)(&msgs[0]), 10, 0, {0},&reftables[138], &reftables[139]), UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "method", 2, &msgs[16], (const upb_def*)(&msgs[13]), 6, 0, {0},&reftables[140], &reftables[141]), UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "name", 2, &msgs[20], (const upb_def*)(&msgs[21]), 5, 0, {0},&reftables[142], &reftables[143]), - UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "name", 1, &msgs[0], NULL, 32, 8, {0},&reftables[144], &reftables[145]), - UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "name", 1, &msgs[5], NULL, 4, 1, {0},&reftables[146], &reftables[147]), - UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "name", 1, &msgs[13], NULL, 4, 1, {0},&reftables[148], &reftables[149]), + UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "name", 1, &msgs[5], NULL, 4, 1, {0},&reftables[144], &reftables[145]), + UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "name", 1, &msgs[9], NULL, 22, 6, {0},&reftables[146], &reftables[147]), + UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "name", 1, &msgs[3], NULL, 8, 2, {0},&reftables[148], &reftables[149]), UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "name", 1, &msgs[16], NULL, 8, 2, {0},&reftables[150], &reftables[151]), - UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "name", 1, &msgs[3], NULL, 8, 2, {0},&reftables[152], &reftables[153]), - UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "name", 1, &msgs[15], NULL, 2, 0, {0},&reftables[154], &reftables[155]), + UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "name", 1, &msgs[15], NULL, 2, 0, {0},&reftables[152], &reftables[153]), + UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "name", 1, &msgs[13], NULL, 4, 1, {0},&reftables[154], &reftables[155]), UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "name", 1, &msgs[7], NULL, 4, 1, {0},&reftables[156], &reftables[157]), - UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "name", 1, &msgs[9], NULL, 22, 6, {0},&reftables[158], &reftables[159]), + UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "name", 1, &msgs[0], NULL, 32, 8, {0},&reftables[158], &reftables[159]), UPB_FIELDDEF_INIT(UPB_LABEL_REQUIRED, UPB_TYPE_STRING, 0, false, false, false, false, "name_part", 1, &msgs[21], NULL, 2, 0, {0},&reftables[160], &reftables[161]), UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_INT64, UPB_INTFMT_VARIABLE, false, false, false, false, "negative_int_value", 5, &msgs[20], NULL, 10, 3, {0},&reftables[162], &reftables[163]), UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "nested_type", 3, &msgs[0], (const upb_def*)(&msgs[0]), 15, 1, {0},&reftables[164], &reftables[165]), UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "no_standard_descriptor_accessor", 2, &msgs[12], NULL, 7, 2, {0},&reftables[166], &reftables[167]), - UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_INT32, UPB_INTFMT_VARIABLE, false, false, false, false, "number", 2, &msgs[5], NULL, 7, 2, {0},&reftables[168], &reftables[169]), - UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_INT32, UPB_INTFMT_VARIABLE, false, false, false, false, "number", 3, &msgs[7], NULL, 10, 3, {0},&reftables[170], &reftables[171]), + UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_INT32, UPB_INTFMT_VARIABLE, false, false, false, false, "number", 3, &msgs[7], NULL, 10, 3, {0},&reftables[168], &reftables[169]), + UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_INT32, UPB_INTFMT_VARIABLE, false, false, false, false, "number", 2, &msgs[5], NULL, 7, 2, {0},&reftables[170], &reftables[171]), UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "objc_class_prefix", 36, &msgs[11], NULL, 24, 13, {0},&reftables[172], &reftables[173]), UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "oneof_decl", 8, &msgs[0], (const upb_def*)(&msgs[15]), 28, 6, {0},&reftables[174], &reftables[175]), UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_INT32, UPB_INTFMT_VARIABLE, false, false, false, false, "oneof_index", 9, &msgs[7], NULL, 19, 8, {0},&reftables[176], &reftables[177]), UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_ENUM, 0, false, false, false, false, "optimize_for", 9, &msgs[11], (const upb_def*)(&enums[4]), 12, 3, {0},&reftables[178], &reftables[179]), - UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_MESSAGE, 0, false, false, false, false, "options", 8, &msgs[9], (const upb_def*)(&msgs[11]), 20, 4, {0},&reftables[180], &reftables[181]), - UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_MESSAGE, 0, false, false, false, false, "options", 7, &msgs[0], (const upb_def*)(&msgs[12]), 25, 5, {0},&reftables[182], &reftables[183]), - UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_MESSAGE, 0, false, false, false, false, "options", 4, &msgs[13], (const upb_def*)(&msgs[14]), 3, 0, {0},&reftables[184], &reftables[185]), - UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_MESSAGE, 0, false, false, false, false, "options", 8, &msgs[7], (const upb_def*)(&msgs[8]), 3, 0, {0},&reftables[186], &reftables[187]), - UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_MESSAGE, 0, false, false, false, false, "options", 3, &msgs[5], (const upb_def*)(&msgs[6]), 3, 0, {0},&reftables[188], &reftables[189]), - UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_MESSAGE, 0, false, false, false, false, "options", 3, &msgs[16], (const upb_def*)(&msgs[17]), 7, 1, {0},&reftables[190], &reftables[191]), - UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_MESSAGE, 0, false, false, false, false, "options", 3, &msgs[3], (const upb_def*)(&msgs[4]), 7, 1, {0},&reftables[192], &reftables[193]), + UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_MESSAGE, 0, false, false, false, false, "options", 7, &msgs[0], (const upb_def*)(&msgs[12]), 25, 5, {0},&reftables[180], &reftables[181]), + UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_MESSAGE, 0, false, false, false, false, "options", 8, &msgs[9], (const upb_def*)(&msgs[11]), 20, 4, {0},&reftables[182], &reftables[183]), + UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_MESSAGE, 0, false, false, false, false, "options", 8, &msgs[7], (const upb_def*)(&msgs[8]), 3, 0, {0},&reftables[184], &reftables[185]), + UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_MESSAGE, 0, false, false, false, false, "options", 4, &msgs[13], (const upb_def*)(&msgs[14]), 3, 0, {0},&reftables[186], &reftables[187]), + UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_MESSAGE, 0, false, false, false, false, "options", 3, &msgs[16], (const upb_def*)(&msgs[17]), 7, 1, {0},&reftables[188], &reftables[189]), + UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_MESSAGE, 0, false, false, false, false, "options", 3, &msgs[3], (const upb_def*)(&msgs[4]), 7, 1, {0},&reftables[190], &reftables[191]), + UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_MESSAGE, 0, false, false, false, false, "options", 3, &msgs[5], (const upb_def*)(&msgs[6]), 3, 0, {0},&reftables[192], &reftables[193]), UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "output_type", 3, &msgs[13], NULL, 10, 3, {0},&reftables[194], &reftables[195]), UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "package", 2, &msgs[9], NULL, 25, 7, {0},&reftables[196], &reftables[197]), UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "packed", 2, &msgs[8], NULL, 7, 2, {0},&reftables[198], &reftables[199]), UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_INT32, UPB_INTFMT_VARIABLE, false, false, false, true, "path", 1, &msgs[19], NULL, 4, 0, {0},&reftables[200], &reftables[201]), UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "php_class_prefix", 40, &msgs[11], NULL, 31, 16, {0},&reftables[202], &reftables[203]), - UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_UINT64, UPB_INTFMT_VARIABLE, false, false, false, false, "positive_int_value", 4, &msgs[20], NULL, 9, 2, {0},&reftables[204], &reftables[205]), - UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_INT32, UPB_INTFMT_VARIABLE, false, false, false, false, "public_dependency", 10, &msgs[9], NULL, 35, 9, {0},&reftables[206], &reftables[207]), - UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "py_generic_services", 18, &msgs[11], NULL, 19, 8, {0},&reftables[208], &reftables[209]), - UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_STRING, 0, false, false, false, false, "reserved_name", 10, &msgs[0], NULL, 37, 9, {0},&reftables[210], &reftables[211]), - UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "reserved_range", 9, &msgs[0], (const upb_def*)(&msgs[2]), 31, 7, {0},&reftables[212], &reftables[213]), - UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "server_streaming", 6, &msgs[13], NULL, 14, 5, {0},&reftables[214], &reftables[215]), - UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "service", 6, &msgs[9], (const upb_def*)(&msgs[16]), 16, 2, {0},&reftables[216], &reftables[217]), - UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_MESSAGE, 0, false, false, false, false, "source_code_info", 9, &msgs[9], (const upb_def*)(&msgs[18]), 21, 5, {0},&reftables[218], &reftables[219]), - UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_INT32, UPB_INTFMT_VARIABLE, false, false, false, true, "span", 2, &msgs[19], NULL, 7, 1, {0},&reftables[220], &reftables[221]), - UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_INT32, UPB_INTFMT_VARIABLE, false, false, false, false, "start", 1, &msgs[2], NULL, 2, 0, {0},&reftables[222], &reftables[223]), - UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_INT32, UPB_INTFMT_VARIABLE, false, false, false, false, "start", 1, &msgs[1], NULL, 2, 0, {0},&reftables[224], &reftables[225]), - UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BYTES, 0, false, false, false, false, "string_value", 7, &msgs[20], NULL, 12, 5, {0},&reftables[226], &reftables[227]), - UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "syntax", 12, &msgs[9], NULL, 39, 11, {0},&reftables[228], &reftables[229]), - UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "trailing_comments", 4, &msgs[19], NULL, 11, 3, {0},&reftables[230], &reftables[231]), - UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_ENUM, 0, false, false, false, false, "type", 5, &msgs[7], (const upb_def*)(&enums[1]), 12, 5, {0},&reftables[232], &reftables[233]), - UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "type_name", 6, &msgs[7], NULL, 13, 6, {0},&reftables[234], &reftables[235]), - UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "uninterpreted_option", 999, &msgs[14], (const upb_def*)(&msgs[20]), 5, 0, {0},&reftables[236], &reftables[237]), + UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "php_namespace", 41, &msgs[11], NULL, 34, 17, {0},&reftables[204], &reftables[205]), + UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_UINT64, UPB_INTFMT_VARIABLE, false, false, false, false, "positive_int_value", 4, &msgs[20], NULL, 9, 2, {0},&reftables[206], &reftables[207]), + UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_INT32, UPB_INTFMT_VARIABLE, false, false, false, false, "public_dependency", 10, &msgs[9], NULL, 35, 9, {0},&reftables[208], &reftables[209]), + UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "py_generic_services", 18, &msgs[11], NULL, 19, 8, {0},&reftables[210], &reftables[211]), + UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_STRING, 0, false, false, false, false, "reserved_name", 10, &msgs[0], NULL, 37, 9, {0},&reftables[212], &reftables[213]), + UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "reserved_range", 9, &msgs[0], (const upb_def*)(&msgs[2]), 31, 7, {0},&reftables[214], &reftables[215]), + UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "server_streaming", 6, &msgs[13], NULL, 14, 5, {0},&reftables[216], &reftables[217]), + UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "service", 6, &msgs[9], (const upb_def*)(&msgs[16]), 16, 2, {0},&reftables[218], &reftables[219]), + UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_MESSAGE, 0, false, false, false, false, "source_code_info", 9, &msgs[9], (const upb_def*)(&msgs[18]), 21, 5, {0},&reftables[220], &reftables[221]), + UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_INT32, UPB_INTFMT_VARIABLE, false, false, false, true, "span", 2, &msgs[19], NULL, 7, 1, {0},&reftables[222], &reftables[223]), + UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_INT32, UPB_INTFMT_VARIABLE, false, false, false, false, "start", 1, &msgs[2], NULL, 2, 0, {0},&reftables[224], &reftables[225]), + UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_INT32, UPB_INTFMT_VARIABLE, false, false, false, false, "start", 1, &msgs[1], NULL, 2, 0, {0},&reftables[226], &reftables[227]), + UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BYTES, 0, false, false, false, false, "string_value", 7, &msgs[20], NULL, 12, 5, {0},&reftables[228], &reftables[229]), + UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "syntax", 12, &msgs[9], NULL, 39, 11, {0},&reftables[230], &reftables[231]), + UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "trailing_comments", 4, &msgs[19], NULL, 11, 3, {0},&reftables[232], &reftables[233]), + UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_ENUM, 0, false, false, false, false, "type", 5, &msgs[7], (const upb_def*)(&enums[1]), 12, 5, {0},&reftables[234], &reftables[235]), + UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "type_name", 6, &msgs[7], NULL, 13, 6, {0},&reftables[236], &reftables[237]), UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "uninterpreted_option", 999, &msgs[12], (const upb_def*)(&msgs[20]), 5, 0, {0},&reftables[238], &reftables[239]), UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "uninterpreted_option", 999, &msgs[17], (const upb_def*)(&msgs[20]), 5, 0, {0},&reftables[240], &reftables[241]), - UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "uninterpreted_option", 999, &msgs[8], (const upb_def*)(&msgs[20]), 5, 0, {0},&reftables[242], &reftables[243]), - UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "uninterpreted_option", 999, &msgs[11], (const upb_def*)(&msgs[20]), 5, 0, {0},&reftables[244], &reftables[245]), - UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "uninterpreted_option", 999, &msgs[6], (const upb_def*)(&msgs[20]), 5, 0, {0},&reftables[246], &reftables[247]), - UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "uninterpreted_option", 999, &msgs[4], (const upb_def*)(&msgs[20]), 5, 0, {0},&reftables[248], &reftables[249]), - UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "value", 2, &msgs[3], (const upb_def*)(&msgs[5]), 6, 0, {0},&reftables[250], &reftables[251]), - UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "weak", 10, &msgs[8], NULL, 11, 6, {0},&reftables[252], &reftables[253]), - UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_INT32, UPB_INTFMT_VARIABLE, false, false, false, false, "weak_dependency", 11, &msgs[9], NULL, 38, 10, {0},&reftables[254], &reftables[255]), + UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "uninterpreted_option", 999, &msgs[11], (const upb_def*)(&msgs[20]), 5, 0, {0},&reftables[242], &reftables[243]), + UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "uninterpreted_option", 999, &msgs[14], (const upb_def*)(&msgs[20]), 5, 0, {0},&reftables[244], &reftables[245]), + UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "uninterpreted_option", 999, &msgs[8], (const upb_def*)(&msgs[20]), 5, 0, {0},&reftables[246], &reftables[247]), + UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "uninterpreted_option", 999, &msgs[6], (const upb_def*)(&msgs[20]), 5, 0, {0},&reftables[248], &reftables[249]), + UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "uninterpreted_option", 999, &msgs[4], (const upb_def*)(&msgs[20]), 5, 0, {0},&reftables[250], &reftables[251]), + UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "value", 2, &msgs[3], (const upb_def*)(&msgs[5]), 6, 0, {0},&reftables[252], &reftables[253]), + UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "weak", 10, &msgs[8], NULL, 11, 6, {0},&reftables[254], &reftables[255]), + UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_INT32, UPB_INTFMT_VARIABLE, false, false, false, false, "weak_dependency", 11, &msgs[9], NULL, 38, 10, {0},&reftables[256], &reftables[257]), }; static const upb_enumdef enums[5] = { - UPB_ENUMDEF_INIT("google.protobuf.FieldDescriptorProto.Label", UPB_STRTABLE_INIT(3, 3, UPB_CTYPE_INT32, 2, &strentries[188]), UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_CSTR, 0, NULL, &arrays[153], 4, 3), 0, &reftables[256], &reftables[257]), - UPB_ENUMDEF_INIT("google.protobuf.FieldDescriptorProto.Type", UPB_STRTABLE_INIT(18, 31, UPB_CTYPE_INT32, 5, &strentries[192]), UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_CSTR, 0, NULL, &arrays[157], 19, 18), 0, &reftables[258], &reftables[259]), - UPB_ENUMDEF_INIT("google.protobuf.FieldOptions.CType", UPB_STRTABLE_INIT(3, 3, UPB_CTYPE_INT32, 2, &strentries[224]), UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_CSTR, 0, NULL, &arrays[176], 3, 3), 0, &reftables[260], &reftables[261]), - UPB_ENUMDEF_INIT("google.protobuf.FieldOptions.JSType", UPB_STRTABLE_INIT(3, 3, UPB_CTYPE_INT32, 2, &strentries[228]), UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_CSTR, 0, NULL, &arrays[179], 3, 3), 0, &reftables[262], &reftables[263]), - UPB_ENUMDEF_INIT("google.protobuf.FileOptions.OptimizeMode", UPB_STRTABLE_INIT(3, 3, UPB_CTYPE_INT32, 2, &strentries[232]), UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_CSTR, 0, NULL, &arrays[182], 4, 3), 0, &reftables[264], &reftables[265]), + UPB_ENUMDEF_INIT("google.protobuf.FieldDescriptorProto.Label", UPB_STRTABLE_INIT(3, 3, UPB_CTYPE_INT32, 2, &strentries[188]), UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_CSTR, 0, NULL, &arrays[154], 4, 3), 0, &reftables[258], &reftables[259]), + UPB_ENUMDEF_INIT("google.protobuf.FieldDescriptorProto.Type", UPB_STRTABLE_INIT(18, 31, UPB_CTYPE_INT32, 5, &strentries[192]), UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_CSTR, 0, NULL, &arrays[158], 19, 18), 0, &reftables[260], &reftables[261]), + UPB_ENUMDEF_INIT("google.protobuf.FieldOptions.CType", UPB_STRTABLE_INIT(3, 3, UPB_CTYPE_INT32, 2, &strentries[224]), UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_CSTR, 0, NULL, &arrays[177], 3, 3), 0, &reftables[262], &reftables[263]), + UPB_ENUMDEF_INIT("google.protobuf.FieldOptions.JSType", UPB_STRTABLE_INIT(3, 3, UPB_CTYPE_INT32, 2, &strentries[228]), UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_CSTR, 0, NULL, &arrays[180], 3, 3), 0, &reftables[264], &reftables[265]), + UPB_ENUMDEF_INIT("google.protobuf.FileOptions.OptimizeMode", UPB_STRTABLE_INIT(3, 3, UPB_CTYPE_INT32, 2, &strentries[232]), UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_CSTR, 0, NULL, &arrays[183], 4, 3), 0, &reftables[266], &reftables[267]), }; static const upb_tabent strentries[236] = { {UPB_TABKEY_STR("\011", "\000", "\000", "\000", "extension"), UPB_TABVALUE_PTR_INIT(&fields[22]), NULL}, {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, - {UPB_TABKEY_STR("\015", "\000", "\000", "\000", "reserved_name"), UPB_TABVALUE_PTR_INIT(&fields[83]), NULL}, - {UPB_TABKEY_STR("\004", "\000", "\000", "\000", "name"), UPB_TABVALUE_PTR_INIT(&fields[50]), NULL}, + {UPB_TABKEY_STR("\015", "\000", "\000", "\000", "reserved_name"), UPB_TABVALUE_PTR_INIT(&fields[84]), NULL}, + {UPB_TABKEY_STR("\004", "\000", "\000", "\000", "name"), UPB_TABVALUE_PTR_INIT(&fields[57]), NULL}, {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, @@ -6584,31 +6606,31 @@ static const upb_tabent strentries[236] = { {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, {UPB_TABKEY_STR("\013", "\000", "\000", "\000", "nested_type"), UPB_TABVALUE_PTR_INIT(&fields[60]), NULL}, {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, - {UPB_TABKEY_STR("\016", "\000", "\000", "\000", "reserved_range"), UPB_TABVALUE_PTR_INIT(&fields[84]), NULL}, - {UPB_TABKEY_STR("\007", "\000", "\000", "\000", "options"), UPB_TABVALUE_PTR_INIT(&fields[69]), NULL}, + {UPB_TABKEY_STR("\016", "\000", "\000", "\000", "reserved_range"), UPB_TABVALUE_PTR_INIT(&fields[85]), NULL}, + {UPB_TABKEY_STR("\007", "\000", "\000", "\000", "options"), UPB_TABVALUE_PTR_INIT(&fields[68]), NULL}, {UPB_TABKEY_STR("\012", "\000", "\000", "\000", "oneof_decl"), UPB_TABVALUE_PTR_INIT(&fields[65]), NULL}, {UPB_TABKEY_STR("\011", "\000", "\000", "\000", "enum_type"), UPB_TABVALUE_PTR_INIT(&fields[20]), &strentries[13]}, - {UPB_TABKEY_STR("\005", "\000", "\000", "\000", "start"), UPB_TABVALUE_PTR_INIT(&fields[90]), NULL}, + {UPB_TABKEY_STR("\005", "\000", "\000", "\000", "start"), UPB_TABVALUE_PTR_INIT(&fields[91]), NULL}, {UPB_TABKEY_STR("\003", "\000", "\000", "\000", "end"), UPB_TABVALUE_PTR_INIT(&fields[18]), NULL}, {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, - {UPB_TABKEY_STR("\005", "\000", "\000", "\000", "start"), UPB_TABVALUE_PTR_INIT(&fields[89]), NULL}, + {UPB_TABKEY_STR("\005", "\000", "\000", "\000", "start"), UPB_TABVALUE_PTR_INIT(&fields[90]), NULL}, {UPB_TABKEY_STR("\003", "\000", "\000", "\000", "end"), UPB_TABVALUE_PTR_INIT(&fields[17]), NULL}, {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, - {UPB_TABKEY_STR("\005", "\000", "\000", "\000", "value"), UPB_TABVALUE_PTR_INIT(&fields[103]), NULL}, - {UPB_TABKEY_STR("\007", "\000", "\000", "\000", "options"), UPB_TABVALUE_PTR_INIT(&fields[74]), NULL}, - {UPB_TABKEY_STR("\004", "\000", "\000", "\000", "name"), UPB_TABVALUE_PTR_INIT(&fields[54]), &strentries[26]}, - {UPB_TABKEY_STR("\024", "\000", "\000", "\000", "uninterpreted_option"), UPB_TABVALUE_PTR_INIT(&fields[102]), NULL}, + {UPB_TABKEY_STR("\005", "\000", "\000", "\000", "value"), UPB_TABVALUE_PTR_INIT(&fields[104]), NULL}, + {UPB_TABKEY_STR("\007", "\000", "\000", "\000", "options"), UPB_TABVALUE_PTR_INIT(&fields[73]), NULL}, + {UPB_TABKEY_STR("\004", "\000", "\000", "\000", "name"), UPB_TABVALUE_PTR_INIT(&fields[52]), &strentries[26]}, + {UPB_TABKEY_STR("\024", "\000", "\000", "\000", "uninterpreted_option"), UPB_TABVALUE_PTR_INIT(&fields[103]), NULL}, {UPB_TABKEY_STR("\012", "\000", "\000", "\000", "deprecated"), UPB_TABVALUE_PTR_INIT(&fields[14]), NULL}, {UPB_TABKEY_STR("\013", "\000", "\000", "\000", "allow_alias"), UPB_TABVALUE_PTR_INIT(&fields[1]), NULL}, {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, - {UPB_TABKEY_STR("\006", "\000", "\000", "\000", "number"), UPB_TABVALUE_PTR_INIT(&fields[62]), NULL}, + {UPB_TABKEY_STR("\006", "\000", "\000", "\000", "number"), UPB_TABVALUE_PTR_INIT(&fields[63]), NULL}, {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, - {UPB_TABKEY_STR("\007", "\000", "\000", "\000", "options"), UPB_TABVALUE_PTR_INIT(&fields[72]), NULL}, - {UPB_TABKEY_STR("\004", "\000", "\000", "\000", "name"), UPB_TABVALUE_PTR_INIT(&fields[51]), &strentries[34]}, - {UPB_TABKEY_STR("\024", "\000", "\000", "\000", "uninterpreted_option"), UPB_TABVALUE_PTR_INIT(&fields[101]), NULL}, + {UPB_TABKEY_STR("\007", "\000", "\000", "\000", "options"), UPB_TABVALUE_PTR_INIT(&fields[74]), NULL}, + {UPB_TABKEY_STR("\004", "\000", "\000", "\000", "name"), UPB_TABVALUE_PTR_INIT(&fields[50]), &strentries[34]}, + {UPB_TABKEY_STR("\024", "\000", "\000", "\000", "uninterpreted_option"), UPB_TABVALUE_PTR_INIT(&fields[102]), NULL}, {UPB_TABKEY_STR("\012", "\000", "\000", "\000", "deprecated"), UPB_TABVALUE_PTR_INIT(&fields[13]), NULL}, {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, @@ -6620,17 +6642,17 @@ static const upb_tabent strentries[236] = { {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, - {UPB_TABKEY_STR("\006", "\000", "\000", "\000", "number"), UPB_TABVALUE_PTR_INIT(&fields[63]), &strentries[53]}, + {UPB_TABKEY_STR("\006", "\000", "\000", "\000", "number"), UPB_TABVALUE_PTR_INIT(&fields[62]), &strentries[53]}, {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, {UPB_TABKEY_STR("\010", "\000", "\000", "\000", "extendee"), UPB_TABVALUE_PTR_INIT(&fields[21]), NULL}, - {UPB_TABKEY_STR("\011", "\000", "\000", "\000", "type_name"), UPB_TABVALUE_PTR_INIT(&fields[95]), NULL}, + {UPB_TABKEY_STR("\011", "\000", "\000", "\000", "type_name"), UPB_TABVALUE_PTR_INIT(&fields[96]), NULL}, {UPB_TABKEY_STR("\011", "\000", "\000", "\000", "json_name"), UPB_TABVALUE_PTR_INIT(&fields[38]), NULL}, - {UPB_TABKEY_STR("\004", "\000", "\000", "\000", "type"), UPB_TABVALUE_PTR_INIT(&fields[94]), &strentries[50]}, + {UPB_TABKEY_STR("\004", "\000", "\000", "\000", "type"), UPB_TABVALUE_PTR_INIT(&fields[95]), &strentries[50]}, {UPB_TABKEY_STR("\015", "\000", "\000", "\000", "default_value"), UPB_TABVALUE_PTR_INIT(&fields[7]), NULL}, - {UPB_TABKEY_STR("\007", "\000", "\000", "\000", "options"), UPB_TABVALUE_PTR_INIT(&fields[71]), NULL}, - {UPB_TABKEY_STR("\024", "\000", "\000", "\000", "uninterpreted_option"), UPB_TABVALUE_PTR_INIT(&fields[99]), NULL}, + {UPB_TABKEY_STR("\007", "\000", "\000", "\000", "options"), UPB_TABVALUE_PTR_INIT(&fields[70]), NULL}, + {UPB_TABKEY_STR("\024", "\000", "\000", "\000", "uninterpreted_option"), UPB_TABVALUE_PTR_INIT(&fields[101]), NULL}, {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, - {UPB_TABKEY_STR("\004", "\000", "\000", "\000", "weak"), UPB_TABVALUE_PTR_INIT(&fields[104]), NULL}, + {UPB_TABKEY_STR("\004", "\000", "\000", "\000", "weak"), UPB_TABVALUE_PTR_INIT(&fields[105]), NULL}, {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, @@ -6645,21 +6667,21 @@ static const upb_tabent strentries[236] = { {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, {UPB_TABKEY_STR("\011", "\000", "\000", "\000", "extension"), UPB_TABVALUE_PTR_INIT(&fields[23]), NULL}, - {UPB_TABKEY_STR("\017", "\000", "\000", "\000", "weak_dependency"), UPB_TABVALUE_PTR_INIT(&fields[105]), NULL}, + {UPB_TABKEY_STR("\017", "\000", "\000", "\000", "weak_dependency"), UPB_TABVALUE_PTR_INIT(&fields[106]), NULL}, {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, - {UPB_TABKEY_STR("\004", "\000", "\000", "\000", "name"), UPB_TABVALUE_PTR_INIT(&fields[57]), NULL}, - {UPB_TABKEY_STR("\007", "\000", "\000", "\000", "service"), UPB_TABVALUE_PTR_INIT(&fields[86]), NULL}, + {UPB_TABKEY_STR("\004", "\000", "\000", "\000", "name"), UPB_TABVALUE_PTR_INIT(&fields[51]), NULL}, + {UPB_TABKEY_STR("\007", "\000", "\000", "\000", "service"), UPB_TABVALUE_PTR_INIT(&fields[87]), NULL}, {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, - {UPB_TABKEY_STR("\020", "\000", "\000", "\000", "source_code_info"), UPB_TABVALUE_PTR_INIT(&fields[87]), NULL}, + {UPB_TABKEY_STR("\020", "\000", "\000", "\000", "source_code_info"), UPB_TABVALUE_PTR_INIT(&fields[88]), NULL}, {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, - {UPB_TABKEY_STR("\006", "\000", "\000", "\000", "syntax"), UPB_TABVALUE_PTR_INIT(&fields[92]), NULL}, + {UPB_TABKEY_STR("\006", "\000", "\000", "\000", "syntax"), UPB_TABVALUE_PTR_INIT(&fields[93]), NULL}, {UPB_TABKEY_STR("\012", "\000", "\000", "\000", "dependency"), UPB_TABVALUE_PTR_INIT(&fields[8]), NULL}, {UPB_TABKEY_STR("\014", "\000", "\000", "\000", "message_type"), UPB_TABVALUE_PTR_INIT(&fields[47]), NULL}, {UPB_TABKEY_STR("\007", "\000", "\000", "\000", "package"), UPB_TABVALUE_PTR_INIT(&fields[76]), NULL}, - {UPB_TABKEY_STR("\007", "\000", "\000", "\000", "options"), UPB_TABVALUE_PTR_INIT(&fields[68]), &strentries[86]}, + {UPB_TABKEY_STR("\007", "\000", "\000", "\000", "options"), UPB_TABVALUE_PTR_INIT(&fields[69]), &strentries[86]}, {UPB_TABKEY_STR("\011", "\000", "\000", "\000", "enum_type"), UPB_TABVALUE_PTR_INIT(&fields[19]), NULL}, - {UPB_TABKEY_STR("\021", "\000", "\000", "\000", "public_dependency"), UPB_TABVALUE_PTR_INIT(&fields[81]), &strentries[85]}, + {UPB_TABKEY_STR("\021", "\000", "\000", "\000", "public_dependency"), UPB_TABVALUE_PTR_INIT(&fields[82]), &strentries[85]}, {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, {UPB_TABKEY_STR("\004", "\000", "\000", "\000", "file"), UPB_TABVALUE_PTR_INIT(&fields[26]), NULL}, {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, @@ -6680,17 +6702,17 @@ static const upb_tabent strentries[236] = { {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, {UPB_TABKEY_STR("\024", "\000", "\000", "\000", "java_outer_classname"), UPB_TABVALUE_PTR_INIT(&fields[34]), NULL}, - {UPB_TABKEY_STR("\024", "\000", "\000", "\000", "uninterpreted_option"), UPB_TABVALUE_PTR_INIT(&fields[100]), NULL}, + {UPB_TABKEY_STR("\015", "\000", "\000", "\000", "php_namespace"), UPB_TABVALUE_PTR_INIT(&fields[80]), &strentries[113]}, {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, {UPB_TABKEY_STR("\023", "\000", "\000", "\000", "java_multiple_files"), UPB_TABVALUE_PTR_INIT(&fields[33]), &strentries[117]}, - {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, + {UPB_TABKEY_STR("\024", "\000", "\000", "\000", "uninterpreted_option"), UPB_TABVALUE_PTR_INIT(&fields[99]), NULL}, {UPB_TABKEY_STR("\025", "\000", "\000", "\000", "java_generic_services"), UPB_TABVALUE_PTR_INIT(&fields[32]), &strentries[118]}, {UPB_TABKEY_STR("\035", "\000", "\000", "\000", "java_generate_equals_and_hash"), UPB_TABVALUE_PTR_INIT(&fields[31]), NULL}, {UPB_TABKEY_STR("\020", "\000", "\000", "\000", "php_class_prefix"), UPB_TABVALUE_PTR_INIT(&fields[79]), NULL}, {UPB_TABKEY_STR("\037", "\000", "\000", "\000", "javanano_use_deprecated_package"), UPB_TABVALUE_PTR_INIT(&fields[37]), &strentries[123]}, - {UPB_TABKEY_STR("\023", "\000", "\000", "\000", "py_generic_services"), UPB_TABVALUE_PTR_INIT(&fields[82]), NULL}, + {UPB_TABKEY_STR("\023", "\000", "\000", "\000", "py_generic_services"), UPB_TABVALUE_PTR_INIT(&fields[83]), NULL}, {UPB_TABKEY_STR("\014", "\000", "\000", "\000", "optimize_for"), UPB_TABVALUE_PTR_INIT(&fields[67]), NULL}, {UPB_TABKEY_STR("\026", "\000", "\000", "\000", "java_string_check_utf8"), UPB_TABVALUE_PTR_INIT(&fields[36]), NULL}, {UPB_TABKEY_STR("\012", "\000", "\000", "\000", "deprecated"), UPB_TABVALUE_PTR_INIT(&fields[12]), &strentries[119]}, @@ -6706,22 +6728,22 @@ static const upb_tabent strentries[236] = { {UPB_TABKEY_STR("\037", "\000", "\000", "\000", "no_standard_descriptor_accessor"), UPB_TABVALUE_PTR_INIT(&fields[61]), NULL}, {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, {UPB_TABKEY_STR("\020", "\000", "\000", "\000", "client_streaming"), UPB_TABVALUE_PTR_INIT(&fields[4]), NULL}, - {UPB_TABKEY_STR("\020", "\000", "\000", "\000", "server_streaming"), UPB_TABVALUE_PTR_INIT(&fields[85]), NULL}, - {UPB_TABKEY_STR("\004", "\000", "\000", "\000", "name"), UPB_TABVALUE_PTR_INIT(&fields[52]), NULL}, + {UPB_TABKEY_STR("\020", "\000", "\000", "\000", "server_streaming"), UPB_TABVALUE_PTR_INIT(&fields[86]), NULL}, + {UPB_TABKEY_STR("\004", "\000", "\000", "\000", "name"), UPB_TABVALUE_PTR_INIT(&fields[55]), NULL}, {UPB_TABKEY_STR("\012", "\000", "\000", "\000", "input_type"), UPB_TABVALUE_PTR_INIT(&fields[29]), NULL}, {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, {UPB_TABKEY_STR("\013", "\000", "\000", "\000", "output_type"), UPB_TABVALUE_PTR_INIT(&fields[75]), NULL}, - {UPB_TABKEY_STR("\007", "\000", "\000", "\000", "options"), UPB_TABVALUE_PTR_INIT(&fields[70]), NULL}, - {UPB_TABKEY_STR("\024", "\000", "\000", "\000", "uninterpreted_option"), UPB_TABVALUE_PTR_INIT(&fields[96]), NULL}, + {UPB_TABKEY_STR("\007", "\000", "\000", "\000", "options"), UPB_TABVALUE_PTR_INIT(&fields[71]), NULL}, + {UPB_TABKEY_STR("\024", "\000", "\000", "\000", "uninterpreted_option"), UPB_TABVALUE_PTR_INIT(&fields[100]), NULL}, {UPB_TABKEY_STR("\012", "\000", "\000", "\000", "deprecated"), UPB_TABVALUE_PTR_INIT(&fields[10]), NULL}, {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, - {UPB_TABKEY_STR("\004", "\000", "\000", "\000", "name"), UPB_TABVALUE_PTR_INIT(&fields[55]), NULL}, + {UPB_TABKEY_STR("\004", "\000", "\000", "\000", "name"), UPB_TABVALUE_PTR_INIT(&fields[54]), NULL}, {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, - {UPB_TABKEY_STR("\007", "\000", "\000", "\000", "options"), UPB_TABVALUE_PTR_INIT(&fields[73]), &strentries[150]}, + {UPB_TABKEY_STR("\007", "\000", "\000", "\000", "options"), UPB_TABVALUE_PTR_INIT(&fields[72]), &strentries[150]}, {UPB_TABKEY_STR("\006", "\000", "\000", "\000", "method"), UPB_TABVALUE_PTR_INIT(&fields[48]), NULL}, {UPB_TABKEY_STR("\004", "\000", "\000", "\000", "name"), UPB_TABVALUE_PTR_INIT(&fields[53]), &strentries[149]}, {UPB_TABKEY_STR("\024", "\000", "\000", "\000", "uninterpreted_option"), UPB_TABVALUE_PTR_INIT(&fields[98]), NULL}, @@ -6735,9 +6757,9 @@ static const upb_tabent strentries[236] = { {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, - {UPB_TABKEY_STR("\004", "\000", "\000", "\000", "span"), UPB_TABVALUE_PTR_INIT(&fields[88]), &strentries[167]}, + {UPB_TABKEY_STR("\004", "\000", "\000", "\000", "span"), UPB_TABVALUE_PTR_INIT(&fields[89]), &strentries[167]}, {UPB_TABKEY_STR("\031", "\000", "\000", "\000", "leading_detached_comments"), UPB_TABVALUE_PTR_INIT(&fields[43]), &strentries[165]}, - {UPB_TABKEY_STR("\021", "\000", "\000", "\000", "trailing_comments"), UPB_TABVALUE_PTR_INIT(&fields[93]), NULL}, + {UPB_TABKEY_STR("\021", "\000", "\000", "\000", "trailing_comments"), UPB_TABVALUE_PTR_INIT(&fields[94]), NULL}, {UPB_TABKEY_STR("\020", "\000", "\000", "\000", "leading_comments"), UPB_TABVALUE_PTR_INIT(&fields[42]), &strentries[164]}, {UPB_TABKEY_STR("\004", "\000", "\000", "\000", "path"), UPB_TABVALUE_PTR_INIT(&fields[78]), NULL}, {UPB_TABKEY_STR("\014", "\000", "\000", "\000", "double_value"), UPB_TABVALUE_PTR_INIT(&fields[16]), NULL}, @@ -6753,9 +6775,9 @@ static const upb_tabent strentries[236] = { {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, - {UPB_TABKEY_STR("\022", "\000", "\000", "\000", "positive_int_value"), UPB_TABVALUE_PTR_INIT(&fields[80]), NULL}, + {UPB_TABKEY_STR("\022", "\000", "\000", "\000", "positive_int_value"), UPB_TABVALUE_PTR_INIT(&fields[81]), NULL}, {UPB_TABKEY_STR("\020", "\000", "\000", "\000", "identifier_value"), UPB_TABVALUE_PTR_INIT(&fields[28]), NULL}, - {UPB_TABKEY_STR("\014", "\000", "\000", "\000", "string_value"), UPB_TABVALUE_PTR_INIT(&fields[91]), &strentries[182]}, + {UPB_TABKEY_STR("\014", "\000", "\000", "\000", "string_value"), UPB_TABVALUE_PTR_INIT(&fields[92]), &strentries[182]}, {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, {UPB_TABKEY_STR("\014", "\000", "\000", "\000", "is_extension"), UPB_TABVALUE_PTR_INIT(&fields[30]), NULL}, @@ -6812,66 +6834,66 @@ static const upb_tabent strentries[236] = { static const upb_tabent intentries[18] = { {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, + {UPB_TABKEY_NUM(999), UPB_TABVALUE_PTR_INIT(&fields[103]), NULL}, + {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, {UPB_TABKEY_NUM(999), UPB_TABVALUE_PTR_INIT(&fields[102]), NULL}, {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, {UPB_TABKEY_NUM(999), UPB_TABVALUE_PTR_INIT(&fields[101]), NULL}, {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, {UPB_TABKEY_NUM(999), UPB_TABVALUE_PTR_INIT(&fields[99]), NULL}, {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, - {UPB_TABKEY_NUM(999), UPB_TABVALUE_PTR_INIT(&fields[100]), NULL}, - {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, {UPB_TABKEY_NUM(999), UPB_TABVALUE_PTR_INIT(&fields[97]), NULL}, {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, {UPB_TABKEY_NUM(33), UPB_TABVALUE_PTR_INIT(&fields[10]), NULL}, {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, - {UPB_TABKEY_NUM(999), UPB_TABVALUE_PTR_INIT(&fields[96]), NULL}, + {UPB_TABKEY_NUM(999), UPB_TABVALUE_PTR_INIT(&fields[100]), NULL}, {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, {UPB_TABKEY_NUM(33), UPB_TABVALUE_PTR_INIT(&fields[15]), NULL}, {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, {UPB_TABKEY_NUM(999), UPB_TABVALUE_PTR_INIT(&fields[98]), NULL}, }; -static const upb_tabval arrays[186] = { +static const upb_tabval arrays[187] = { UPB_TABVALUE_EMPTY_INIT, - UPB_TABVALUE_PTR_INIT(&fields[50]), + UPB_TABVALUE_PTR_INIT(&fields[57]), UPB_TABVALUE_PTR_INIT(&fields[25]), UPB_TABVALUE_PTR_INIT(&fields[60]), UPB_TABVALUE_PTR_INIT(&fields[20]), UPB_TABVALUE_PTR_INIT(&fields[24]), UPB_TABVALUE_PTR_INIT(&fields[22]), - UPB_TABVALUE_PTR_INIT(&fields[69]), + UPB_TABVALUE_PTR_INIT(&fields[68]), UPB_TABVALUE_PTR_INIT(&fields[65]), + UPB_TABVALUE_PTR_INIT(&fields[85]), UPB_TABVALUE_PTR_INIT(&fields[84]), - UPB_TABVALUE_PTR_INIT(&fields[83]), UPB_TABVALUE_EMPTY_INIT, - UPB_TABVALUE_PTR_INIT(&fields[90]), + UPB_TABVALUE_PTR_INIT(&fields[91]), UPB_TABVALUE_PTR_INIT(&fields[18]), UPB_TABVALUE_EMPTY_INIT, - UPB_TABVALUE_PTR_INIT(&fields[89]), + UPB_TABVALUE_PTR_INIT(&fields[90]), UPB_TABVALUE_PTR_INIT(&fields[17]), UPB_TABVALUE_EMPTY_INIT, - UPB_TABVALUE_PTR_INIT(&fields[54]), - UPB_TABVALUE_PTR_INIT(&fields[103]), - UPB_TABVALUE_PTR_INIT(&fields[74]), + UPB_TABVALUE_PTR_INIT(&fields[52]), + UPB_TABVALUE_PTR_INIT(&fields[104]), + UPB_TABVALUE_PTR_INIT(&fields[73]), UPB_TABVALUE_EMPTY_INIT, UPB_TABVALUE_EMPTY_INIT, UPB_TABVALUE_PTR_INIT(&fields[1]), UPB_TABVALUE_PTR_INIT(&fields[14]), UPB_TABVALUE_EMPTY_INIT, - UPB_TABVALUE_PTR_INIT(&fields[51]), - UPB_TABVALUE_PTR_INIT(&fields[62]), - UPB_TABVALUE_PTR_INIT(&fields[72]), + UPB_TABVALUE_PTR_INIT(&fields[50]), + UPB_TABVALUE_PTR_INIT(&fields[63]), + UPB_TABVALUE_PTR_INIT(&fields[74]), UPB_TABVALUE_EMPTY_INIT, UPB_TABVALUE_PTR_INIT(&fields[13]), UPB_TABVALUE_EMPTY_INIT, UPB_TABVALUE_PTR_INIT(&fields[56]), UPB_TABVALUE_PTR_INIT(&fields[21]), - UPB_TABVALUE_PTR_INIT(&fields[63]), + UPB_TABVALUE_PTR_INIT(&fields[62]), UPB_TABVALUE_PTR_INIT(&fields[40]), - UPB_TABVALUE_PTR_INIT(&fields[94]), UPB_TABVALUE_PTR_INIT(&fields[95]), + UPB_TABVALUE_PTR_INIT(&fields[96]), UPB_TABVALUE_PTR_INIT(&fields[7]), - UPB_TABVALUE_PTR_INIT(&fields[71]), + UPB_TABVALUE_PTR_INIT(&fields[70]), UPB_TABVALUE_PTR_INIT(&fields[66]), UPB_TABVALUE_PTR_INIT(&fields[38]), UPB_TABVALUE_EMPTY_INIT, @@ -6884,20 +6906,20 @@ static const upb_tabval arrays[186] = { UPB_TABVALUE_EMPTY_INIT, UPB_TABVALUE_EMPTY_INIT, UPB_TABVALUE_EMPTY_INIT, - UPB_TABVALUE_PTR_INIT(&fields[104]), + UPB_TABVALUE_PTR_INIT(&fields[105]), UPB_TABVALUE_EMPTY_INIT, - UPB_TABVALUE_PTR_INIT(&fields[57]), + UPB_TABVALUE_PTR_INIT(&fields[51]), UPB_TABVALUE_PTR_INIT(&fields[76]), UPB_TABVALUE_PTR_INIT(&fields[8]), UPB_TABVALUE_PTR_INIT(&fields[47]), UPB_TABVALUE_PTR_INIT(&fields[19]), - UPB_TABVALUE_PTR_INIT(&fields[86]), - UPB_TABVALUE_PTR_INIT(&fields[23]), - UPB_TABVALUE_PTR_INIT(&fields[68]), UPB_TABVALUE_PTR_INIT(&fields[87]), - UPB_TABVALUE_PTR_INIT(&fields[81]), - UPB_TABVALUE_PTR_INIT(&fields[105]), - UPB_TABVALUE_PTR_INIT(&fields[92]), + UPB_TABVALUE_PTR_INIT(&fields[23]), + UPB_TABVALUE_PTR_INIT(&fields[69]), + UPB_TABVALUE_PTR_INIT(&fields[88]), + UPB_TABVALUE_PTR_INIT(&fields[82]), + UPB_TABVALUE_PTR_INIT(&fields[106]), + UPB_TABVALUE_PTR_INIT(&fields[93]), UPB_TABVALUE_EMPTY_INIT, UPB_TABVALUE_PTR_INIT(&fields[26]), UPB_TABVALUE_EMPTY_INIT, @@ -6918,7 +6940,7 @@ static const upb_tabval arrays[186] = { UPB_TABVALUE_EMPTY_INIT, UPB_TABVALUE_PTR_INIT(&fields[3]), UPB_TABVALUE_PTR_INIT(&fields[32]), - UPB_TABVALUE_PTR_INIT(&fields[82]), + UPB_TABVALUE_PTR_INIT(&fields[83]), UPB_TABVALUE_EMPTY_INIT, UPB_TABVALUE_PTR_INIT(&fields[31]), UPB_TABVALUE_EMPTY_INIT, @@ -6941,6 +6963,7 @@ static const upb_tabval arrays[186] = { UPB_TABVALUE_PTR_INIT(&fields[37]), UPB_TABVALUE_EMPTY_INIT, UPB_TABVALUE_PTR_INIT(&fields[79]), + UPB_TABVALUE_PTR_INIT(&fields[80]), UPB_TABVALUE_EMPTY_INIT, UPB_TABVALUE_PTR_INIT(&fields[46]), UPB_TABVALUE_PTR_INIT(&fields[61]), @@ -6950,37 +6973,37 @@ static const upb_tabval arrays[186] = { UPB_TABVALUE_EMPTY_INIT, UPB_TABVALUE_PTR_INIT(&fields[45]), UPB_TABVALUE_EMPTY_INIT, - UPB_TABVALUE_PTR_INIT(&fields[52]), + UPB_TABVALUE_PTR_INIT(&fields[55]), UPB_TABVALUE_PTR_INIT(&fields[29]), UPB_TABVALUE_PTR_INIT(&fields[75]), - UPB_TABVALUE_PTR_INIT(&fields[70]), + UPB_TABVALUE_PTR_INIT(&fields[71]), UPB_TABVALUE_PTR_INIT(&fields[4]), - UPB_TABVALUE_PTR_INIT(&fields[85]), + UPB_TABVALUE_PTR_INIT(&fields[86]), UPB_TABVALUE_EMPTY_INIT, UPB_TABVALUE_EMPTY_INIT, - UPB_TABVALUE_PTR_INIT(&fields[55]), + UPB_TABVALUE_PTR_INIT(&fields[54]), UPB_TABVALUE_EMPTY_INIT, UPB_TABVALUE_PTR_INIT(&fields[53]), UPB_TABVALUE_PTR_INIT(&fields[48]), - UPB_TABVALUE_PTR_INIT(&fields[73]), + UPB_TABVALUE_PTR_INIT(&fields[72]), UPB_TABVALUE_EMPTY_INIT, UPB_TABVALUE_EMPTY_INIT, UPB_TABVALUE_PTR_INIT(&fields[44]), UPB_TABVALUE_EMPTY_INIT, UPB_TABVALUE_PTR_INIT(&fields[78]), - UPB_TABVALUE_PTR_INIT(&fields[88]), + UPB_TABVALUE_PTR_INIT(&fields[89]), UPB_TABVALUE_PTR_INIT(&fields[42]), - UPB_TABVALUE_PTR_INIT(&fields[93]), + UPB_TABVALUE_PTR_INIT(&fields[94]), UPB_TABVALUE_EMPTY_INIT, UPB_TABVALUE_PTR_INIT(&fields[43]), UPB_TABVALUE_EMPTY_INIT, UPB_TABVALUE_EMPTY_INIT, UPB_TABVALUE_PTR_INIT(&fields[49]), UPB_TABVALUE_PTR_INIT(&fields[28]), - UPB_TABVALUE_PTR_INIT(&fields[80]), + UPB_TABVALUE_PTR_INIT(&fields[81]), UPB_TABVALUE_PTR_INIT(&fields[59]), UPB_TABVALUE_PTR_INIT(&fields[16]), - UPB_TABVALUE_PTR_INIT(&fields[91]), + UPB_TABVALUE_PTR_INIT(&fields[92]), UPB_TABVALUE_PTR_INIT(&fields[0]), UPB_TABVALUE_EMPTY_INIT, UPB_TABVALUE_PTR_INIT(&fields[58]), @@ -7021,7 +7044,9 @@ static const upb_tabval arrays[186] = { }; #ifdef UPB_DEBUG_REFS -static upb_inttable reftables[266] = { +static upb_inttable reftables[268] = { + UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), + UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), @@ -7565,6 +7590,34 @@ static size_t file_onpackage(void *closure, const void *hd, const char *buf, return n; } +static void *file_startphpnamespace(void *closure, const void *hd, + size_t size_hint) { + upb_descreader *r = closure; + bool ok; + UPB_UNUSED(hd); + UPB_UNUSED(size_hint); + + ok = upb_filedef_setphpnamespace(r->file, "", NULL); + UPB_ASSERT(ok); + return closure; +} + +static size_t file_onphpnamespace(void *closure, const void *hd, + const char *buf, size_t n, + const upb_bufhandle *handle) { + upb_descreader *r = closure; + char *php_namespace; + bool ok; + UPB_UNUSED(hd); + UPB_UNUSED(handle); + + php_namespace = upb_gstrndup(buf, n); + ok = upb_filedef_setphpnamespace(r->file, php_namespace, NULL); + upb_gfree(php_namespace); + UPB_ASSERT(ok); + return n; +} + static size_t file_onphpprefix(void *closure, const void *hd, const char *buf, size_t n, const upb_bufhandle *handle) { upb_descreader *r = closure; @@ -8109,6 +8162,10 @@ static void reghandlers(const void *closure, upb_handlers *h) { } else if (upbdefs_google_protobuf_FileOptions_is(m)) { upb_handlers_setstring(h, F(FileOptions, php_class_prefix), &file_onphpprefix, NULL); + upb_handlers_setstartstr(h, F(FileOptions, php_namespace), + &file_startphpnamespace, NULL); + upb_handlers_setstring(h, F(FileOptions, php_namespace), + &file_onphpnamespace, NULL); } UPB_ASSERT(upb_ok(upb_handlers_status(h))); @@ -11271,57 +11328,6 @@ done: return r; } -/* Given an encoded varint v, returns an integer with a single bit set that - * indicates the end of the varint. Subtracting one from this value will - * yield a mask that leaves only bits that are part of the varint. Returns - * 0 if the varint is unterminated. */ -static uint64_t upb_get_vstopbit(uint64_t v) { - uint64_t cbits = v | 0x7f7f7f7f7f7f7f7fULL; - return ~cbits & (cbits+1); -} - -/* A branchless decoder. Credit to Pascal Massimino for the bit-twiddling. */ -upb_decoderet upb_vdecode_max8_massimino(upb_decoderet r) { - uint64_t b; - uint64_t stop_bit; - upb_decoderet my_r; - memcpy(&b, r.p, sizeof(b)); - stop_bit = upb_get_vstopbit(b); - b = (b & 0x7f7f7f7f7f7f7f7fULL) & (stop_bit - 1); - b += b & 0x007f007f007f007fULL; - b += 3 * (b & 0x0000ffff0000ffffULL); - b += 15 * (b & 0x00000000ffffffffULL); - if (stop_bit == 0) { - /* Error: unterminated varint. */ - upb_decoderet err_r = {(void*)0, 0}; - return err_r; - } - my_r = upb_decoderet_make(r.p + ((__builtin_ctzll(stop_bit) + 1) / 8), - r.val | (b << 7)); - return my_r; -} - -/* A branchless decoder. Credit to Daniel Wright for the bit-twiddling. */ -upb_decoderet upb_vdecode_max8_wright(upb_decoderet r) { - uint64_t b; - uint64_t stop_bit; - upb_decoderet my_r; - memcpy(&b, r.p, sizeof(b)); - stop_bit = upb_get_vstopbit(b); - b &= (stop_bit - 1); - b = ((b & 0x7f007f007f007f00ULL) >> 1) | (b & 0x007f007f007f007fULL); - b = ((b & 0xffff0000ffff0000ULL) >> 2) | (b & 0x0000ffff0000ffffULL); - b = ((b & 0xffffffff00000000ULL) >> 4) | (b & 0x00000000ffffffffULL); - if (stop_bit == 0) { - /* Error: unterminated varint. */ - upb_decoderet err_r = {(void*)0, 0}; - return err_r; - } - my_r = upb_decoderet_make(r.p + ((__builtin_ctzll(stop_bit) + 1) / 8), - r.val | (b << 14)); - return my_r; -} - #line 1 "upb/json/parser.rl" /* ** upb::json::Parser (upb_json_parser) diff --git a/php/ext/google/protobuf/upb.h b/php/ext/google/protobuf/upb.h index 78f255f9..4b51275d 100644 --- a/php/ext/google/protobuf/upb.h +++ b/php/ext/google/protobuf/upb.h @@ -2973,10 +2973,16 @@ class upb::FileDef { bool set_package(const char* package, Status* s); /* Sets the php class prefix which is prepended to all php generated classes - / from this .proto. Default is empty. */ + * from this .proto. Default is empty. */ const char* phpprefix() const; bool set_phpprefix(const char* phpprefix, Status* s); + /* Use this option to change the namespace of php generated classes. Default + * is empty. When this option is empty, the package name will be used for + * determining the namespace. */ + const char* phpnamespace() const; + bool set_phpnamespace(const char* phpnamespace, Status* s); + /* Syntax for the file. Defaults to proto2. */ upb_syntax_t syntax() const; void set_syntax(upb_syntax_t syntax); @@ -3031,6 +3037,7 @@ UPB_REFCOUNTED_CMETHODS(upb_filedef, upb_filedef_upcast) const char *upb_filedef_name(const upb_filedef *f); const char *upb_filedef_package(const upb_filedef *f); const char *upb_filedef_phpprefix(const upb_filedef *f); +const char *upb_filedef_phpnamespace(const upb_filedef *f); upb_syntax_t upb_filedef_syntax(const upb_filedef *f); size_t upb_filedef_defcount(const upb_filedef *f); size_t upb_filedef_depcount(const upb_filedef *f); @@ -3042,6 +3049,8 @@ bool upb_filedef_setname(upb_filedef *f, const char *name, upb_status *s); bool upb_filedef_setpackage(upb_filedef *f, const char *package, upb_status *s); bool upb_filedef_setphpprefix(upb_filedef *f, const char *phpprefix, upb_status *s); +bool upb_filedef_setphpnamespace(upb_filedef *f, const char *phpnamespace, + upb_status *s); bool upb_filedef_setsyntax(upb_filedef *f, upb_syntax_t syntax, upb_status *s); bool upb_filedef_adddef(upb_filedef *f, upb_def *def, const void *ref_donor, @@ -3806,6 +3815,12 @@ inline const char* FileDef::phpprefix() const { inline bool FileDef::set_phpprefix(const char* phpprefix, Status* s) { return upb_filedef_setphpprefix(this, phpprefix, s); } +inline const char* FileDef::phpnamespace() const { + return upb_filedef_phpnamespace(this); +} +inline bool FileDef::set_phpnamespace(const char* phpnamespace, Status* s) { + return upb_filedef_setphpnamespace(this, phpnamespace, s); +} inline int FileDef::def_count() const { return upb_filedef_defcount(this); } @@ -4021,6 +4036,7 @@ struct upb_filedef { const char *name; const char *package; const char *phpprefix; + const char *phpnamespace; upb_syntax_t syntax; upb_inttable defs; @@ -7228,6 +7244,7 @@ UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_f_javanano_us UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_f_objc_class_prefix(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FileOptions_is(m)); return upb_msgdef_itof(m, 36); } UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_f_optimize_for(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FileOptions_is(m)); return upb_msgdef_itof(m, 9); } UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_f_php_class_prefix(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FileOptions_is(m)); return upb_msgdef_itof(m, 40); } +UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_f_php_namespace(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FileOptions_is(m)); return upb_msgdef_itof(m, 41); } UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_f_py_generic_services(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FileOptions_is(m)); return upb_msgdef_itof(m, 18); } UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_f_uninterpreted_option(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FileOptions_is(m)); return upb_msgdef_itof(m, 999); } UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_MessageOptions_f_deprecated(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_MessageOptions_is(m)); return upb_msgdef_itof(m, 3); } @@ -8326,16 +8343,8 @@ UPB_INLINE upb_decoderet upb_decoderet_make(const char *p, uint64_t val) { return ret; } -/* Four functions for decoding a varint of at most eight bytes. They are all - * functionally identical, but are implemented in different ways and likely have - * different performance profiles. We keep them around for performance testing. - * - * Note that these functions may not read byte-by-byte, so they must not be used - * unless there are at least eight bytes left in the buffer! */ upb_decoderet upb_vdecode_max8_branch32(upb_decoderet r); upb_decoderet upb_vdecode_max8_branch64(upb_decoderet r); -upb_decoderet upb_vdecode_max8_wright(upb_decoderet r); -upb_decoderet upb_vdecode_max8_massimino(upb_decoderet r); /* Template for a function that checks the first two bytes with branching * and dispatches 2-10 bytes with a separate function. Note that this may read @@ -8360,8 +8369,6 @@ UPB_INLINE upb_decoderet upb_vdecode_check2_ ## name(const char *_p) { \ UPB_VARINT_DECODER_CHECK2(branch32, upb_vdecode_max8_branch32) UPB_VARINT_DECODER_CHECK2(branch64, upb_vdecode_max8_branch64) -UPB_VARINT_DECODER_CHECK2(wright, upb_vdecode_max8_wright) -UPB_VARINT_DECODER_CHECK2(massimino, upb_vdecode_max8_massimino) #undef UPB_VARINT_DECODER_CHECK2 /* Our canonical functions for decoding varints, based on the currently @@ -8373,10 +8380,6 @@ UPB_INLINE upb_decoderet upb_vdecode_fast(const char *p) { return upb_vdecode_check2_branch32(p); } -UPB_INLINE upb_decoderet upb_vdecode_max8_fast(upb_decoderet r) { - return upb_vdecode_max8_massimino(r); -} - /* Encoding *******************************************************************/ diff --git a/php/phpunit.xml b/php/phpunit.xml index 0191a601..637467be 100644 --- a/php/phpunit.xml +++ b/php/phpunit.xml @@ -7,8 +7,10 @@ <file>tests/array_test.php</file> <file>tests/encode_decode_test.php</file> <file>tests/generated_class_test.php</file> + <file>tests/generated_phpdoc_test.php</file> <file>tests/map_field_test.php</file> <file>tests/well_known_test.php</file> + <file>tests/generated_service_test.php</file> </testsuite> </testsuites> </phpunit> diff --git a/php/src/GPBMetadata/Google/Protobuf/Internal/Descriptor.php b/php/src/GPBMetadata/Google/Protobuf/Internal/Descriptor.php index 0b7698e3..60722d00 100644 --- a/php/src/GPBMetadata/Google/Protobuf/Internal/Descriptor.php +++ b/php/src/GPBMetadata/Google/Protobuf/Internal/Descriptor.php @@ -144,12 +144,14 @@ class Descriptor ->optional('cc_generic_services', \Google\Protobuf\Internal\GPBType::BOOL, 16) ->optional('java_generic_services', \Google\Protobuf\Internal\GPBType::BOOL, 17) ->optional('py_generic_services', \Google\Protobuf\Internal\GPBType::BOOL, 18) + ->optional('php_generic_services', \Google\Protobuf\Internal\GPBType::BOOL, 19) ->optional('deprecated', \Google\Protobuf\Internal\GPBType::BOOL, 23) ->optional('cc_enable_arenas', \Google\Protobuf\Internal\GPBType::BOOL, 31) ->optional('objc_class_prefix', \Google\Protobuf\Internal\GPBType::STRING, 36) ->optional('csharp_namespace', \Google\Protobuf\Internal\GPBType::STRING, 37) ->optional('swift_prefix', \Google\Protobuf\Internal\GPBType::STRING, 39) ->optional('php_class_prefix', \Google\Protobuf\Internal\GPBType::STRING, 40) + ->optional('php_namespace', \Google\Protobuf\Internal\GPBType::STRING, 41) ->repeated('uninterpreted_option', \Google\Protobuf\Internal\GPBType::MESSAGE, 999, 'google.protobuf.internal.UninterpretedOption') ->finalizeToPool(); diff --git a/php/src/Google/Protobuf/Internal/InputStream.php b/php/src/Google/Protobuf/Internal/CodedInputStream.php index 8012a225..6131d5d1 100644 --- a/php/src/Google/Protobuf/Internal/InputStream.php +++ b/php/src/Google/Protobuf/Internal/CodedInputStream.php @@ -34,28 +34,7 @@ namespace Google\Protobuf\Internal; use Google\Protobuf\Internal\Uint64; -function combineInt32ToInt64($high, $low) -{ - $isNeg = $high < 0; - if ($isNeg) { - $high = ~$high; - $low = ~$low; - $low++; - if (!$low) { - $high++; - } - } - $result = bcadd(bcmul($high, 4294967296), $low); - if ($low < 0) { - $result = bcadd($result, 4294967296); - } - if ($isNeg) { - $result = bcsub(0, $result); - } - return $result; -} - -class InputStream +class CodedInputStream { private $buffer; @@ -94,7 +73,7 @@ class InputStream $this->current += $amount; } - private function bufferSize() + public function bufferSize() { return $this->buffer_end - $this->current; } @@ -192,7 +171,10 @@ class InputStream $count += 1; } while ($b & 0x80); - $var = combineInt32ToInt64($high, $low); + $var = GPBUtil::combineInt32ToInt64($high, $low); + if (bccomp($var, 0) < 0) { + $var = bcadd($var, "18446744073709551616"); + } } else { $result = 0; $shift = 0; @@ -265,7 +247,7 @@ class InputStream } $high = unpack('V', $data)[1]; if (PHP_INT_SIZE == 4) { - $var = combineInt32ToInt64($high, $low); + $var = GPBUtil::combineInt32ToInt64($high, $low); } else { $var = ($high << 32) | $low; } diff --git a/php/src/Google/Protobuf/Internal/OutputStream.php b/php/src/Google/Protobuf/Internal/CodedOutputStream.php index 8c6d9b68..4525d8dd 100644 --- a/php/src/Google/Protobuf/Internal/OutputStream.php +++ b/php/src/Google/Protobuf/Internal/CodedOutputStream.php @@ -32,7 +32,7 @@ namespace Google\Protobuf\Internal; -class OutputStream +class CodedOutputStream { private $buffer; @@ -53,10 +53,10 @@ class OutputStream return $this->buffer; } - public function writeVarint32($value) + public function writeVarint32($value, $trim) { $bytes = str_repeat(chr(0), self::MAX_VARINT64_BYTES); - $size = self::writeVarintToArray($value, $bytes); + $size = self::writeVarintToArray($value, $bytes, $trim); return $this->writeRaw($bytes, $size); } @@ -83,7 +83,7 @@ class OutputStream public function writeTag($tag) { - return $this->writeVarint32($tag); + return $this->writeVarint32($tag, true); } public function writeRaw($data, $size) @@ -101,19 +101,19 @@ class OutputStream return true; } - private static function writeVarintToArray($value, &$buffer) + private static function writeVarintToArray($value, &$buffer, $trim = false) { $current = 0; $high = 0; $low = 0; if (PHP_INT_SIZE == 4) { - GPBUtil::divideInt64ToInt32($value, $high, $low); + GPBUtil::divideInt64ToInt32($value, $high, $low, $trim); } else { $low = $value; } - while ($low >= 0x80 || $low < 0) { + while (($low >= 0x80 || $low < 0) || $high != 0) { $buffer[$current] = chr($low | 0x80); $value = ($value >> 7) & ~(0x7F << ((PHP_INT_SIZE << 3) - 7)); $carry = ($high & 0x7F) << ((PHP_INT_SIZE << 3) - 7); diff --git a/php/src/Google/Protobuf/Internal/Descriptor.php b/php/src/Google/Protobuf/Internal/Descriptor.php new file mode 100644 index 00000000..44225ad2 --- /dev/null +++ b/php/src/Google/Protobuf/Internal/Descriptor.php @@ -0,0 +1,189 @@ +<?php + +// Protocol Buffers - Google's data interchange format +// Copyright 2008 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. + +namespace Google\Protobuf\Internal; + +class Descriptor +{ + + private $full_name; + private $field = []; + private $json_to_field = []; + private $name_to_field = []; + private $nested_type = []; + private $enum_type = []; + private $klass; + private $options; + private $oneof_decl = []; + + public function addOneofDecl($oneof) + { + $this->oneof_decl[] = $oneof; + } + + public function getOneofDecl() + { + return $this->oneof_decl; + } + + public function setFullName($full_name) + { + $this->full_name = $full_name; + } + + public function getFullName() + { + return $this->full_name; + } + + public function addField($field) + { + $this->field[$field->getNumber()] = $field; + $this->json_to_field[$field->getJsonName()] = $field; + $this->name_to_field[$field->getName()] = $field; + } + + public function getField() + { + return $this->field; + } + + public function addNestedType($desc) + { + $this->nested_type[] = $desc; + } + + public function getNestedType() + { + return $this->nested_type; + } + + public function addEnumType($desc) + { + $this->enum_type[] = $desc; + } + + public function getEnumType() + { + return $this->enum_type; + } + + public function getFieldByNumber($number) + { + if (!isset($this->field[$number])) { + return NULL; + } else { + return $this->field[$number]; + } + } + + public function getFieldByJsonName($json_name) + { + if (!isset($this->json_to_field[$json_name])) { + return NULL; + } else { + return $this->json_to_field[$json_name]; + } + } + + public function getFieldByName($name) + { + if (!isset($this->name_to_field[$name])) { + return NULL; + } else { + return $this->name_to_field[$name]; + } + } + + public function setClass($klass) + { + $this->klass = $klass; + } + + public function getClass() + { + return $this->klass; + } + + public function setOptions($options) + { + $this->options = $options; + } + + public function getOptions() + { + return $this->options; + } + + public static function buildFromProto($proto, $file_proto, $containing) + { + $desc = new Descriptor(); + + $message_name_without_package = ""; + $classname = ""; + $fullname = ""; + GPBUtil::getFullClassName( + $proto, + $containing, + $file_proto, + $message_name_without_package, + $classname, + $fullname); + $desc->setFullName($fullname); + $desc->setClass($classname); + $desc->setOptions($proto->getOptions()); + + foreach ($proto->getField() as $field_proto) { + $desc->addField(FieldDescriptor::buildFromProto($field_proto)); + } + + // Handle nested types. + foreach ($proto->getNestedType() as $nested_proto) { + $desc->addNestedType(Descriptor::buildFromProto( + $nested_proto, $file_proto, $message_name_without_package)); + } + + // Handle nested enum. + foreach ($proto->getEnumType() as $enum_proto) { + $desc->addEnumType(EnumDescriptor::buildFromProto( + $enum_proto, $file_proto, $message_name_without_package)); + } + + // Handle oneof fields. + foreach ($proto->getOneofDecl() as $oneof_proto) { + $desc->addOneofDecl( + OneofDescriptor::buildFromProto($oneof_proto, $desc)); + } + + return $desc; + } +} diff --git a/php/src/Google/Protobuf/Internal/DescriptorProto.php b/php/src/Google/Protobuf/Internal/DescriptorProto.php index 948c5876..1d6959b7 100644 --- a/php/src/Google/Protobuf/Internal/DescriptorProto.php +++ b/php/src/Google/Protobuf/Internal/DescriptorProto.php @@ -8,70 +8,65 @@ use Google\Protobuf\Internal\GPBType; use Google\Protobuf\Internal\GPBWire; use Google\Protobuf\Internal\RepeatedField; use Google\Protobuf\Internal\InputStream; - use Google\Protobuf\Internal\GPBUtil; /** - * <pre> * Describes a message type. - * </pre> * - * Protobuf type <code>google.protobuf.DescriptorProto</code> + * Generated from protobuf message <code>google.protobuf.DescriptorProto</code> */ class DescriptorProto extends \Google\Protobuf\Internal\Message { /** - * <code>optional string name = 1;</code> + * Generated from protobuf field <code>optional string name = 1;</code> */ private $name = ''; private $has_name = false; /** - * <code>repeated .google.protobuf.FieldDescriptorProto field = 2;</code> + * Generated from protobuf field <code>repeated .google.protobuf.FieldDescriptorProto field = 2;</code> */ private $field; private $has_field = false; /** - * <code>repeated .google.protobuf.FieldDescriptorProto extension = 6;</code> + * Generated from protobuf field <code>repeated .google.protobuf.FieldDescriptorProto extension = 6;</code> */ private $extension; private $has_extension = false; /** - * <code>repeated .google.protobuf.DescriptorProto nested_type = 3;</code> + * Generated from protobuf field <code>repeated .google.protobuf.DescriptorProto nested_type = 3;</code> */ private $nested_type; private $has_nested_type = false; /** - * <code>repeated .google.protobuf.EnumDescriptorProto enum_type = 4;</code> + * Generated from protobuf field <code>repeated .google.protobuf.EnumDescriptorProto enum_type = 4;</code> */ private $enum_type; private $has_enum_type = false; /** - * <code>repeated .google.protobuf.DescriptorProto.ExtensionRange extension_range = 5;</code> + * Generated from protobuf field <code>repeated .google.protobuf.DescriptorProto.ExtensionRange extension_range = 5;</code> */ private $extension_range; private $has_extension_range = false; /** - * <code>repeated .google.protobuf.OneofDescriptorProto oneof_decl = 8;</code> + * Generated from protobuf field <code>repeated .google.protobuf.OneofDescriptorProto oneof_decl = 8;</code> */ private $oneof_decl; private $has_oneof_decl = false; /** - * <code>optional .google.protobuf.MessageOptions options = 7;</code> + * Generated from protobuf field <code>optional .google.protobuf.MessageOptions options = 7;</code> */ private $options = null; private $has_options = false; /** - * <code>repeated .google.protobuf.DescriptorProto.ReservedRange reserved_range = 9;</code> + * Generated from protobuf field <code>repeated .google.protobuf.DescriptorProto.ReservedRange reserved_range = 9;</code> */ private $reserved_range; private $has_reserved_range = false; /** - * <pre> * Reserved field names, which may not be used by fields in the same message. * A given name may only be reserved once. - * </pre> * - * <code>repeated string reserved_name = 10;</code> + * Generated from protobuf field <code>repeated string reserved_name = 10;</code> */ private $reserved_name; private $has_reserved_name = false; @@ -82,7 +77,8 @@ class DescriptorProto extends \Google\Protobuf\Internal\Message } /** - * <code>optional string name = 1;</code> + * Generated from protobuf field <code>optional string name = 1;</code> + * @return string */ public function getName() { @@ -90,13 +86,17 @@ class DescriptorProto extends \Google\Protobuf\Internal\Message } /** - * <code>optional string name = 1;</code> + * Generated from protobuf field <code>optional string name = 1;</code> + * @param string $var + * @return $this */ public function setName($var) { GPBUtil::checkString($var, True); $this->name = $var; $this->has_name = true; + + return $this; } public function hasName() @@ -105,7 +105,8 @@ class DescriptorProto extends \Google\Protobuf\Internal\Message } /** - * <code>repeated .google.protobuf.FieldDescriptorProto field = 2;</code> + * Generated from protobuf field <code>repeated .google.protobuf.FieldDescriptorProto field = 2;</code> + * @return \Google\Protobuf\Internal\RepeatedField */ public function getField() { @@ -113,13 +114,17 @@ class DescriptorProto extends \Google\Protobuf\Internal\Message } /** - * <code>repeated .google.protobuf.FieldDescriptorProto field = 2;</code> + * Generated from protobuf field <code>repeated .google.protobuf.FieldDescriptorProto field = 2;</code> + * @param \Google\Protobuf\Internal\FieldDescriptorProto[]|\Google\Protobuf\Internal\RepeatedField $var + * @return $this */ - public function setField(&$var) + public function setField($var) { $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Protobuf\Internal\FieldDescriptorProto::class); $this->field = $arr; $this->has_field = true; + + return $this; } public function hasField() @@ -128,7 +133,8 @@ class DescriptorProto extends \Google\Protobuf\Internal\Message } /** - * <code>repeated .google.protobuf.FieldDescriptorProto extension = 6;</code> + * Generated from protobuf field <code>repeated .google.protobuf.FieldDescriptorProto extension = 6;</code> + * @return \Google\Protobuf\Internal\RepeatedField */ public function getExtension() { @@ -136,13 +142,17 @@ class DescriptorProto extends \Google\Protobuf\Internal\Message } /** - * <code>repeated .google.protobuf.FieldDescriptorProto extension = 6;</code> + * Generated from protobuf field <code>repeated .google.protobuf.FieldDescriptorProto extension = 6;</code> + * @param \Google\Protobuf\Internal\FieldDescriptorProto[]|\Google\Protobuf\Internal\RepeatedField $var + * @return $this */ - public function setExtension(&$var) + public function setExtension($var) { $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Protobuf\Internal\FieldDescriptorProto::class); $this->extension = $arr; $this->has_extension = true; + + return $this; } public function hasExtension() @@ -151,7 +161,8 @@ class DescriptorProto extends \Google\Protobuf\Internal\Message } /** - * <code>repeated .google.protobuf.DescriptorProto nested_type = 3;</code> + * Generated from protobuf field <code>repeated .google.protobuf.DescriptorProto nested_type = 3;</code> + * @return \Google\Protobuf\Internal\RepeatedField */ public function getNestedType() { @@ -159,13 +170,17 @@ class DescriptorProto extends \Google\Protobuf\Internal\Message } /** - * <code>repeated .google.protobuf.DescriptorProto nested_type = 3;</code> + * Generated from protobuf field <code>repeated .google.protobuf.DescriptorProto nested_type = 3;</code> + * @param \Google\Protobuf\Internal\DescriptorProto[]|\Google\Protobuf\Internal\RepeatedField $var + * @return $this */ - public function setNestedType(&$var) + public function setNestedType($var) { $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Protobuf\Internal\DescriptorProto::class); $this->nested_type = $arr; $this->has_nested_type = true; + + return $this; } public function hasNestedType() @@ -174,7 +189,8 @@ class DescriptorProto extends \Google\Protobuf\Internal\Message } /** - * <code>repeated .google.protobuf.EnumDescriptorProto enum_type = 4;</code> + * Generated from protobuf field <code>repeated .google.protobuf.EnumDescriptorProto enum_type = 4;</code> + * @return \Google\Protobuf\Internal\RepeatedField */ public function getEnumType() { @@ -182,13 +198,17 @@ class DescriptorProto extends \Google\Protobuf\Internal\Message } /** - * <code>repeated .google.protobuf.EnumDescriptorProto enum_type = 4;</code> + * Generated from protobuf field <code>repeated .google.protobuf.EnumDescriptorProto enum_type = 4;</code> + * @param \Google\Protobuf\Internal\EnumDescriptorProto[]|\Google\Protobuf\Internal\RepeatedField $var + * @return $this */ - public function setEnumType(&$var) + public function setEnumType($var) { $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Protobuf\Internal\EnumDescriptorProto::class); $this->enum_type = $arr; $this->has_enum_type = true; + + return $this; } public function hasEnumType() @@ -197,7 +217,8 @@ class DescriptorProto extends \Google\Protobuf\Internal\Message } /** - * <code>repeated .google.protobuf.DescriptorProto.ExtensionRange extension_range = 5;</code> + * Generated from protobuf field <code>repeated .google.protobuf.DescriptorProto.ExtensionRange extension_range = 5;</code> + * @return \Google\Protobuf\Internal\RepeatedField */ public function getExtensionRange() { @@ -205,13 +226,17 @@ class DescriptorProto extends \Google\Protobuf\Internal\Message } /** - * <code>repeated .google.protobuf.DescriptorProto.ExtensionRange extension_range = 5;</code> + * Generated from protobuf field <code>repeated .google.protobuf.DescriptorProto.ExtensionRange extension_range = 5;</code> + * @param \Google\Protobuf\Internal\DescriptorProto_ExtensionRange[]|\Google\Protobuf\Internal\RepeatedField $var + * @return $this */ - public function setExtensionRange(&$var) + public function setExtensionRange($var) { $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Protobuf\Internal\DescriptorProto_ExtensionRange::class); $this->extension_range = $arr; $this->has_extension_range = true; + + return $this; } public function hasExtensionRange() @@ -220,7 +245,8 @@ class DescriptorProto extends \Google\Protobuf\Internal\Message } /** - * <code>repeated .google.protobuf.OneofDescriptorProto oneof_decl = 8;</code> + * Generated from protobuf field <code>repeated .google.protobuf.OneofDescriptorProto oneof_decl = 8;</code> + * @return \Google\Protobuf\Internal\RepeatedField */ public function getOneofDecl() { @@ -228,13 +254,17 @@ class DescriptorProto extends \Google\Protobuf\Internal\Message } /** - * <code>repeated .google.protobuf.OneofDescriptorProto oneof_decl = 8;</code> + * Generated from protobuf field <code>repeated .google.protobuf.OneofDescriptorProto oneof_decl = 8;</code> + * @param \Google\Protobuf\Internal\OneofDescriptorProto[]|\Google\Protobuf\Internal\RepeatedField $var + * @return $this */ - public function setOneofDecl(&$var) + public function setOneofDecl($var) { $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Protobuf\Internal\OneofDescriptorProto::class); $this->oneof_decl = $arr; $this->has_oneof_decl = true; + + return $this; } public function hasOneofDecl() @@ -243,7 +273,8 @@ class DescriptorProto extends \Google\Protobuf\Internal\Message } /** - * <code>optional .google.protobuf.MessageOptions options = 7;</code> + * Generated from protobuf field <code>optional .google.protobuf.MessageOptions options = 7;</code> + * @return \Google\Protobuf\Internal\MessageOptions */ public function getOptions() { @@ -251,13 +282,17 @@ class DescriptorProto extends \Google\Protobuf\Internal\Message } /** - * <code>optional .google.protobuf.MessageOptions options = 7;</code> + * Generated from protobuf field <code>optional .google.protobuf.MessageOptions options = 7;</code> + * @param \Google\Protobuf\Internal\MessageOptions $var + * @return $this */ - public function setOptions(&$var) + public function setOptions($var) { GPBUtil::checkMessage($var, \Google\Protobuf\Internal\MessageOptions::class); $this->options = $var; $this->has_options = true; + + return $this; } public function hasOptions() @@ -266,7 +301,8 @@ class DescriptorProto extends \Google\Protobuf\Internal\Message } /** - * <code>repeated .google.protobuf.DescriptorProto.ReservedRange reserved_range = 9;</code> + * Generated from protobuf field <code>repeated .google.protobuf.DescriptorProto.ReservedRange reserved_range = 9;</code> + * @return \Google\Protobuf\Internal\RepeatedField */ public function getReservedRange() { @@ -274,13 +310,17 @@ class DescriptorProto extends \Google\Protobuf\Internal\Message } /** - * <code>repeated .google.protobuf.DescriptorProto.ReservedRange reserved_range = 9;</code> + * Generated from protobuf field <code>repeated .google.protobuf.DescriptorProto.ReservedRange reserved_range = 9;</code> + * @param \Google\Protobuf\Internal\DescriptorProto_ReservedRange[]|\Google\Protobuf\Internal\RepeatedField $var + * @return $this */ - public function setReservedRange(&$var) + public function setReservedRange($var) { $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Protobuf\Internal\DescriptorProto_ReservedRange::class); $this->reserved_range = $arr; $this->has_reserved_range = true; + + return $this; } public function hasReservedRange() @@ -289,12 +329,11 @@ class DescriptorProto extends \Google\Protobuf\Internal\Message } /** - * <pre> * Reserved field names, which may not be used by fields in the same message. * A given name may only be reserved once. - * </pre> * - * <code>repeated string reserved_name = 10;</code> + * Generated from protobuf field <code>repeated string reserved_name = 10;</code> + * @return \Google\Protobuf\Internal\RepeatedField */ public function getReservedName() { @@ -302,18 +341,20 @@ class DescriptorProto extends \Google\Protobuf\Internal\Message } /** - * <pre> * Reserved field names, which may not be used by fields in the same message. * A given name may only be reserved once. - * </pre> * - * <code>repeated string reserved_name = 10;</code> + * Generated from protobuf field <code>repeated string reserved_name = 10;</code> + * @param string[]|\Google\Protobuf\Internal\RepeatedField $var + * @return $this */ - public function setReservedName(&$var) + public function setReservedName($var) { $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::STRING); $this->reserved_name = $arr; $this->has_reserved_name = true; + + return $this; } public function hasReservedName() diff --git a/php/src/Google/Protobuf/Internal/DescriptorProto_ExtensionRange.php b/php/src/Google/Protobuf/Internal/DescriptorProto_ExtensionRange.php index b68ded5d..1d455995 100644 --- a/php/src/Google/Protobuf/Internal/DescriptorProto_ExtensionRange.php +++ b/php/src/Google/Protobuf/Internal/DescriptorProto_ExtensionRange.php @@ -8,26 +8,25 @@ use Google\Protobuf\Internal\GPBType; use Google\Protobuf\Internal\GPBWire; use Google\Protobuf\Internal\RepeatedField; use Google\Protobuf\Internal\InputStream; - use Google\Protobuf\Internal\GPBUtil; /** - * Protobuf type <code>google.protobuf.DescriptorProto.ExtensionRange</code> + * Generated from protobuf message <code>google.protobuf.DescriptorProto.ExtensionRange</code> */ class DescriptorProto_ExtensionRange extends \Google\Protobuf\Internal\Message { /** - * <code>optional int32 start = 1;</code> + * Generated from protobuf field <code>optional int32 start = 1;</code> */ private $start = 0; private $has_start = false; /** - * <code>optional int32 end = 2;</code> + * Generated from protobuf field <code>optional int32 end = 2;</code> */ private $end = 0; private $has_end = false; /** - * <code>optional .google.protobuf.ExtensionRangeOptions options = 3;</code> + * Generated from protobuf field <code>optional .google.protobuf.ExtensionRangeOptions options = 3;</code> */ private $options = null; private $has_options = false; @@ -38,7 +37,8 @@ class DescriptorProto_ExtensionRange extends \Google\Protobuf\Internal\Message } /** - * <code>optional int32 start = 1;</code> + * Generated from protobuf field <code>optional int32 start = 1;</code> + * @return int */ public function getStart() { @@ -46,13 +46,17 @@ class DescriptorProto_ExtensionRange extends \Google\Protobuf\Internal\Message } /** - * <code>optional int32 start = 1;</code> + * Generated from protobuf field <code>optional int32 start = 1;</code> + * @param int $var + * @return $this */ public function setStart($var) { GPBUtil::checkInt32($var); $this->start = $var; $this->has_start = true; + + return $this; } public function hasStart() @@ -61,7 +65,8 @@ class DescriptorProto_ExtensionRange extends \Google\Protobuf\Internal\Message } /** - * <code>optional int32 end = 2;</code> + * Generated from protobuf field <code>optional int32 end = 2;</code> + * @return int */ public function getEnd() { @@ -69,13 +74,17 @@ class DescriptorProto_ExtensionRange extends \Google\Protobuf\Internal\Message } /** - * <code>optional int32 end = 2;</code> + * Generated from protobuf field <code>optional int32 end = 2;</code> + * @param int $var + * @return $this */ public function setEnd($var) { GPBUtil::checkInt32($var); $this->end = $var; $this->has_end = true; + + return $this; } public function hasEnd() @@ -84,7 +93,8 @@ class DescriptorProto_ExtensionRange extends \Google\Protobuf\Internal\Message } /** - * <code>optional .google.protobuf.ExtensionRangeOptions options = 3;</code> + * Generated from protobuf field <code>optional .google.protobuf.ExtensionRangeOptions options = 3;</code> + * @return \Google\Protobuf\Internal\ExtensionRangeOptions */ public function getOptions() { @@ -92,13 +102,17 @@ class DescriptorProto_ExtensionRange extends \Google\Protobuf\Internal\Message } /** - * <code>optional .google.protobuf.ExtensionRangeOptions options = 3;</code> + * Generated from protobuf field <code>optional .google.protobuf.ExtensionRangeOptions options = 3;</code> + * @param \Google\Protobuf\Internal\ExtensionRangeOptions $var + * @return $this */ - public function setOptions(&$var) + public function setOptions($var) { GPBUtil::checkMessage($var, \Google\Protobuf\Internal\ExtensionRangeOptions::class); $this->options = $var; $this->has_options = true; + + return $this; } public function hasOptions() diff --git a/php/src/Google/Protobuf/Internal/DescriptorProto_ReservedRange.php b/php/src/Google/Protobuf/Internal/DescriptorProto_ReservedRange.php index be36b8aa..b1022d61 100644 --- a/php/src/Google/Protobuf/Internal/DescriptorProto_ReservedRange.php +++ b/php/src/Google/Protobuf/Internal/DescriptorProto_ReservedRange.php @@ -8,35 +8,28 @@ use Google\Protobuf\Internal\GPBType; use Google\Protobuf\Internal\GPBWire; use Google\Protobuf\Internal\RepeatedField; use Google\Protobuf\Internal\InputStream; - use Google\Protobuf\Internal\GPBUtil; /** - * <pre> * 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. - * </pre> * - * Protobuf type <code>google.protobuf.DescriptorProto.ReservedRange</code> + * Generated from protobuf message <code>google.protobuf.DescriptorProto.ReservedRange</code> */ class DescriptorProto_ReservedRange extends \Google\Protobuf\Internal\Message { /** - * <pre> * Inclusive. - * </pre> * - * <code>optional int32 start = 1;</code> + * Generated from protobuf field <code>optional int32 start = 1;</code> */ private $start = 0; private $has_start = false; /** - * <pre> * Exclusive. - * </pre> * - * <code>optional int32 end = 2;</code> + * Generated from protobuf field <code>optional int32 end = 2;</code> */ private $end = 0; private $has_end = false; @@ -47,11 +40,10 @@ class DescriptorProto_ReservedRange extends \Google\Protobuf\Internal\Message } /** - * <pre> * Inclusive. - * </pre> * - * <code>optional int32 start = 1;</code> + * Generated from protobuf field <code>optional int32 start = 1;</code> + * @return int */ public function getStart() { @@ -59,17 +51,19 @@ class DescriptorProto_ReservedRange extends \Google\Protobuf\Internal\Message } /** - * <pre> * Inclusive. - * </pre> * - * <code>optional int32 start = 1;</code> + * Generated from protobuf field <code>optional int32 start = 1;</code> + * @param int $var + * @return $this */ public function setStart($var) { GPBUtil::checkInt32($var); $this->start = $var; $this->has_start = true; + + return $this; } public function hasStart() @@ -78,11 +72,10 @@ class DescriptorProto_ReservedRange extends \Google\Protobuf\Internal\Message } /** - * <pre> * Exclusive. - * </pre> * - * <code>optional int32 end = 2;</code> + * Generated from protobuf field <code>optional int32 end = 2;</code> + * @return int */ public function getEnd() { @@ -90,17 +83,19 @@ class DescriptorProto_ReservedRange extends \Google\Protobuf\Internal\Message } /** - * <pre> * Exclusive. - * </pre> * - * <code>optional int32 end = 2;</code> + * Generated from protobuf field <code>optional int32 end = 2;</code> + * @param int $var + * @return $this */ public function setEnd($var) { GPBUtil::checkInt32($var); $this->end = $var; $this->has_end = true; + + return $this; } public function hasEnd() diff --git a/php/src/Google/Protobuf/Internal/EnumDescriptor.php b/php/src/Google/Protobuf/Internal/EnumDescriptor.php new file mode 100644 index 00000000..33a55a4a --- /dev/null +++ b/php/src/Google/Protobuf/Internal/EnumDescriptor.php @@ -0,0 +1,72 @@ +<?php + +namespace Google\Protobuf\Internal; + +class EnumDescriptor +{ + + private $klass; + private $full_name; + private $value; + private $name_to_value; + + public function setFullName($full_name) + { + $this->full_name = $full_name; + } + + public function getFullName() + { + return $this->full_name; + } + + public function addValue($number, $value) + { + $this->value[$number] = $value; + $this->name_to_value[$value->getName()] = $value; + } + + public function getValueByNumber($number) + { + return $this->value[$number]; + } + + public function getValueByName($name) + { + return $this->name_to_value[$name]; + } + + public function setClass($klass) + { + $this->klass = $klass; + } + + public function getClass() + { + return $this->klass; + } + + public static function buildFromProto($proto, $file_proto, $containing) + { + $desc = new EnumDescriptor(); + + $enum_name_without_package = ""; + $classname = ""; + $fullname = ""; + GPBUtil::getFullClassName( + $proto, + $containing, + $file_proto, + $enum_name_without_package, + $classname, + $fullname); + $desc->setFullName($fullname); + $desc->setClass($classname); + $values = $proto->getValue(); + foreach ($values as $value) { + $desc->addValue($value->getNumber(), $value); + } + + return $desc; + } +} diff --git a/php/src/Google/Protobuf/Internal/EnumDescriptorProto.php b/php/src/Google/Protobuf/Internal/EnumDescriptorProto.php index 73f6edbd..816fbae5 100644 --- a/php/src/Google/Protobuf/Internal/EnumDescriptorProto.php +++ b/php/src/Google/Protobuf/Internal/EnumDescriptorProto.php @@ -8,30 +8,27 @@ use Google\Protobuf\Internal\GPBType; use Google\Protobuf\Internal\GPBWire; use Google\Protobuf\Internal\RepeatedField; use Google\Protobuf\Internal\InputStream; - use Google\Protobuf\Internal\GPBUtil; /** - * <pre> * Describes an enum type. - * </pre> * - * Protobuf type <code>google.protobuf.EnumDescriptorProto</code> + * Generated from protobuf message <code>google.protobuf.EnumDescriptorProto</code> */ class EnumDescriptorProto extends \Google\Protobuf\Internal\Message { /** - * <code>optional string name = 1;</code> + * Generated from protobuf field <code>optional string name = 1;</code> */ private $name = ''; private $has_name = false; /** - * <code>repeated .google.protobuf.EnumValueDescriptorProto value = 2;</code> + * Generated from protobuf field <code>repeated .google.protobuf.EnumValueDescriptorProto value = 2;</code> */ private $value; private $has_value = false; /** - * <code>optional .google.protobuf.EnumOptions options = 3;</code> + * Generated from protobuf field <code>optional .google.protobuf.EnumOptions options = 3;</code> */ private $options = null; private $has_options = false; @@ -42,7 +39,8 @@ class EnumDescriptorProto extends \Google\Protobuf\Internal\Message } /** - * <code>optional string name = 1;</code> + * Generated from protobuf field <code>optional string name = 1;</code> + * @return string */ public function getName() { @@ -50,13 +48,17 @@ class EnumDescriptorProto extends \Google\Protobuf\Internal\Message } /** - * <code>optional string name = 1;</code> + * Generated from protobuf field <code>optional string name = 1;</code> + * @param string $var + * @return $this */ public function setName($var) { GPBUtil::checkString($var, True); $this->name = $var; $this->has_name = true; + + return $this; } public function hasName() @@ -65,7 +67,8 @@ class EnumDescriptorProto extends \Google\Protobuf\Internal\Message } /** - * <code>repeated .google.protobuf.EnumValueDescriptorProto value = 2;</code> + * Generated from protobuf field <code>repeated .google.protobuf.EnumValueDescriptorProto value = 2;</code> + * @return \Google\Protobuf\Internal\RepeatedField */ public function getValue() { @@ -73,13 +76,17 @@ class EnumDescriptorProto extends \Google\Protobuf\Internal\Message } /** - * <code>repeated .google.protobuf.EnumValueDescriptorProto value = 2;</code> + * Generated from protobuf field <code>repeated .google.protobuf.EnumValueDescriptorProto value = 2;</code> + * @param \Google\Protobuf\Internal\EnumValueDescriptorProto[]|\Google\Protobuf\Internal\RepeatedField $var + * @return $this */ - public function setValue(&$var) + public function setValue($var) { $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Protobuf\Internal\EnumValueDescriptorProto::class); $this->value = $arr; $this->has_value = true; + + return $this; } public function hasValue() @@ -88,7 +95,8 @@ class EnumDescriptorProto extends \Google\Protobuf\Internal\Message } /** - * <code>optional .google.protobuf.EnumOptions options = 3;</code> + * Generated from protobuf field <code>optional .google.protobuf.EnumOptions options = 3;</code> + * @return \Google\Protobuf\Internal\EnumOptions */ public function getOptions() { @@ -96,13 +104,17 @@ class EnumDescriptorProto extends \Google\Protobuf\Internal\Message } /** - * <code>optional .google.protobuf.EnumOptions options = 3;</code> + * Generated from protobuf field <code>optional .google.protobuf.EnumOptions options = 3;</code> + * @param \Google\Protobuf\Internal\EnumOptions $var + * @return $this */ - public function setOptions(&$var) + public function setOptions($var) { GPBUtil::checkMessage($var, \Google\Protobuf\Internal\EnumOptions::class); $this->options = $var; $this->has_options = true; + + return $this; } public function hasOptions() diff --git a/php/src/Google/Protobuf/Internal/EnumOptions.php b/php/src/Google/Protobuf/Internal/EnumOptions.php index 4fa0bce7..3f598a41 100644 --- a/php/src/Google/Protobuf/Internal/EnumOptions.php +++ b/php/src/Google/Protobuf/Internal/EnumOptions.php @@ -8,42 +8,35 @@ use Google\Protobuf\Internal\GPBType; use Google\Protobuf\Internal\GPBWire; use Google\Protobuf\Internal\RepeatedField; use Google\Protobuf\Internal\InputStream; - use Google\Protobuf\Internal\GPBUtil; /** - * Protobuf type <code>google.protobuf.EnumOptions</code> + * Generated from protobuf message <code>google.protobuf.EnumOptions</code> */ class EnumOptions extends \Google\Protobuf\Internal\Message { /** - * <pre> * Set this option to true to allow mapping different tag names to the same * value. - * </pre> * - * <code>optional bool allow_alias = 2;</code> + * Generated from protobuf field <code>optional bool allow_alias = 2;</code> */ private $allow_alias = false; private $has_allow_alias = false; /** - * <pre> * 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. - * </pre> * - * <code>optional bool deprecated = 3 [default = false];</code> + * Generated from protobuf field <code>optional bool deprecated = 3 [default = false];</code> */ private $deprecated = false; private $has_deprecated = false; /** - * <pre> * The parser stores options it doesn't recognize here. See above. - * </pre> * - * <code>repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;</code> + * Generated from protobuf field <code>repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;</code> */ private $uninterpreted_option; private $has_uninterpreted_option = false; @@ -54,12 +47,11 @@ class EnumOptions extends \Google\Protobuf\Internal\Message } /** - * <pre> * Set this option to true to allow mapping different tag names to the same * value. - * </pre> * - * <code>optional bool allow_alias = 2;</code> + * Generated from protobuf field <code>optional bool allow_alias = 2;</code> + * @return bool */ public function getAllowAlias() { @@ -67,18 +59,20 @@ class EnumOptions extends \Google\Protobuf\Internal\Message } /** - * <pre> * Set this option to true to allow mapping different tag names to the same * value. - * </pre> * - * <code>optional bool allow_alias = 2;</code> + * Generated from protobuf field <code>optional bool allow_alias = 2;</code> + * @param bool $var + * @return $this */ public function setAllowAlias($var) { GPBUtil::checkBool($var); $this->allow_alias = $var; $this->has_allow_alias = true; + + return $this; } public function hasAllowAlias() @@ -87,14 +81,13 @@ class EnumOptions extends \Google\Protobuf\Internal\Message } /** - * <pre> * 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. - * </pre> * - * <code>optional bool deprecated = 3 [default = false];</code> + * Generated from protobuf field <code>optional bool deprecated = 3 [default = false];</code> + * @return bool */ public function getDeprecated() { @@ -102,20 +95,22 @@ class EnumOptions extends \Google\Protobuf\Internal\Message } /** - * <pre> * 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. - * </pre> * - * <code>optional bool deprecated = 3 [default = false];</code> + * Generated from protobuf field <code>optional bool deprecated = 3 [default = false];</code> + * @param bool $var + * @return $this */ public function setDeprecated($var) { GPBUtil::checkBool($var); $this->deprecated = $var; $this->has_deprecated = true; + + return $this; } public function hasDeprecated() @@ -124,11 +119,10 @@ class EnumOptions extends \Google\Protobuf\Internal\Message } /** - * <pre> * The parser stores options it doesn't recognize here. See above. - * </pre> * - * <code>repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;</code> + * Generated from protobuf field <code>repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;</code> + * @return \Google\Protobuf\Internal\RepeatedField */ public function getUninterpretedOption() { @@ -136,17 +130,19 @@ class EnumOptions extends \Google\Protobuf\Internal\Message } /** - * <pre> * The parser stores options it doesn't recognize here. See above. - * </pre> * - * <code>repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;</code> + * Generated from protobuf field <code>repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;</code> + * @param \Google\Protobuf\Internal\UninterpretedOption[]|\Google\Protobuf\Internal\RepeatedField $var + * @return $this */ - public function setUninterpretedOption(&$var) + public function setUninterpretedOption($var) { $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Protobuf\Internal\UninterpretedOption::class); $this->uninterpreted_option = $arr; $this->has_uninterpreted_option = true; + + return $this; } public function hasUninterpretedOption() diff --git a/php/src/Google/Protobuf/Internal/EnumValueDescriptor.php b/php/src/Google/Protobuf/Internal/EnumValueDescriptor.php new file mode 100644 index 00000000..549766e3 --- /dev/null +++ b/php/src/Google/Protobuf/Internal/EnumValueDescriptor.php @@ -0,0 +1,59 @@ +<?php + +// Protocol Buffers - Google's data interchange format +// Copyright 2008 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. + +namespace Google\Protobuf\Internal; + +class EnumValueDescriptor +{ + private $name; + private $number; + + public function setName($name) + { + $this->name = $name; + } + + public function getName() + { + return $this->name; + } + + public function setNumber($number) + { + $this->number = $number; + } + + public function getNumber() + { + return $this->number; + } +} diff --git a/php/src/Google/Protobuf/Internal/EnumValueDescriptorProto.php b/php/src/Google/Protobuf/Internal/EnumValueDescriptorProto.php index 94dc36ec..e363220f 100644 --- a/php/src/Google/Protobuf/Internal/EnumValueDescriptorProto.php +++ b/php/src/Google/Protobuf/Internal/EnumValueDescriptorProto.php @@ -8,30 +8,27 @@ use Google\Protobuf\Internal\GPBType; use Google\Protobuf\Internal\GPBWire; use Google\Protobuf\Internal\RepeatedField; use Google\Protobuf\Internal\InputStream; - use Google\Protobuf\Internal\GPBUtil; /** - * <pre> * Describes a value within an enum. - * </pre> * - * Protobuf type <code>google.protobuf.EnumValueDescriptorProto</code> + * Generated from protobuf message <code>google.protobuf.EnumValueDescriptorProto</code> */ class EnumValueDescriptorProto extends \Google\Protobuf\Internal\Message { /** - * <code>optional string name = 1;</code> + * Generated from protobuf field <code>optional string name = 1;</code> */ private $name = ''; private $has_name = false; /** - * <code>optional int32 number = 2;</code> + * Generated from protobuf field <code>optional int32 number = 2;</code> */ private $number = 0; private $has_number = false; /** - * <code>optional .google.protobuf.EnumValueOptions options = 3;</code> + * Generated from protobuf field <code>optional .google.protobuf.EnumValueOptions options = 3;</code> */ private $options = null; private $has_options = false; @@ -42,7 +39,8 @@ class EnumValueDescriptorProto extends \Google\Protobuf\Internal\Message } /** - * <code>optional string name = 1;</code> + * Generated from protobuf field <code>optional string name = 1;</code> + * @return string */ public function getName() { @@ -50,13 +48,17 @@ class EnumValueDescriptorProto extends \Google\Protobuf\Internal\Message } /** - * <code>optional string name = 1;</code> + * Generated from protobuf field <code>optional string name = 1;</code> + * @param string $var + * @return $this */ public function setName($var) { GPBUtil::checkString($var, True); $this->name = $var; $this->has_name = true; + + return $this; } public function hasName() @@ -65,7 +67,8 @@ class EnumValueDescriptorProto extends \Google\Protobuf\Internal\Message } /** - * <code>optional int32 number = 2;</code> + * Generated from protobuf field <code>optional int32 number = 2;</code> + * @return int */ public function getNumber() { @@ -73,13 +76,17 @@ class EnumValueDescriptorProto extends \Google\Protobuf\Internal\Message } /** - * <code>optional int32 number = 2;</code> + * Generated from protobuf field <code>optional int32 number = 2;</code> + * @param int $var + * @return $this */ public function setNumber($var) { GPBUtil::checkInt32($var); $this->number = $var; $this->has_number = true; + + return $this; } public function hasNumber() @@ -88,7 +95,8 @@ class EnumValueDescriptorProto extends \Google\Protobuf\Internal\Message } /** - * <code>optional .google.protobuf.EnumValueOptions options = 3;</code> + * Generated from protobuf field <code>optional .google.protobuf.EnumValueOptions options = 3;</code> + * @return \Google\Protobuf\Internal\EnumValueOptions */ public function getOptions() { @@ -96,13 +104,17 @@ class EnumValueDescriptorProto extends \Google\Protobuf\Internal\Message } /** - * <code>optional .google.protobuf.EnumValueOptions options = 3;</code> + * Generated from protobuf field <code>optional .google.protobuf.EnumValueOptions options = 3;</code> + * @param \Google\Protobuf\Internal\EnumValueOptions $var + * @return $this */ - public function setOptions(&$var) + public function setOptions($var) { GPBUtil::checkMessage($var, \Google\Protobuf\Internal\EnumValueOptions::class); $this->options = $var; $this->has_options = true; + + return $this; } public function hasOptions() diff --git a/php/src/Google/Protobuf/Internal/EnumValueOptions.php b/php/src/Google/Protobuf/Internal/EnumValueOptions.php index 232a6738..db8de174 100644 --- a/php/src/Google/Protobuf/Internal/EnumValueOptions.php +++ b/php/src/Google/Protobuf/Internal/EnumValueOptions.php @@ -8,32 +8,27 @@ use Google\Protobuf\Internal\GPBType; use Google\Protobuf\Internal\GPBWire; use Google\Protobuf\Internal\RepeatedField; use Google\Protobuf\Internal\InputStream; - use Google\Protobuf\Internal\GPBUtil; /** - * Protobuf type <code>google.protobuf.EnumValueOptions</code> + * Generated from protobuf message <code>google.protobuf.EnumValueOptions</code> */ class EnumValueOptions extends \Google\Protobuf\Internal\Message { /** - * <pre> * 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. - * </pre> * - * <code>optional bool deprecated = 1 [default = false];</code> + * Generated from protobuf field <code>optional bool deprecated = 1 [default = false];</code> */ private $deprecated = false; private $has_deprecated = false; /** - * <pre> * The parser stores options it doesn't recognize here. See above. - * </pre> * - * <code>repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;</code> + * Generated from protobuf field <code>repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;</code> */ private $uninterpreted_option; private $has_uninterpreted_option = false; @@ -44,14 +39,13 @@ class EnumValueOptions extends \Google\Protobuf\Internal\Message } /** - * <pre> * 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. - * </pre> * - * <code>optional bool deprecated = 1 [default = false];</code> + * Generated from protobuf field <code>optional bool deprecated = 1 [default = false];</code> + * @return bool */ public function getDeprecated() { @@ -59,20 +53,22 @@ class EnumValueOptions extends \Google\Protobuf\Internal\Message } /** - * <pre> * 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. - * </pre> * - * <code>optional bool deprecated = 1 [default = false];</code> + * Generated from protobuf field <code>optional bool deprecated = 1 [default = false];</code> + * @param bool $var + * @return $this */ public function setDeprecated($var) { GPBUtil::checkBool($var); $this->deprecated = $var; $this->has_deprecated = true; + + return $this; } public function hasDeprecated() @@ -81,11 +77,10 @@ class EnumValueOptions extends \Google\Protobuf\Internal\Message } /** - * <pre> * The parser stores options it doesn't recognize here. See above. - * </pre> * - * <code>repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;</code> + * Generated from protobuf field <code>repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;</code> + * @return \Google\Protobuf\Internal\RepeatedField */ public function getUninterpretedOption() { @@ -93,17 +88,19 @@ class EnumValueOptions extends \Google\Protobuf\Internal\Message } /** - * <pre> * The parser stores options it doesn't recognize here. See above. - * </pre> * - * <code>repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;</code> + * Generated from protobuf field <code>repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;</code> + * @param \Google\Protobuf\Internal\UninterpretedOption[]|\Google\Protobuf\Internal\RepeatedField $var + * @return $this */ - public function setUninterpretedOption(&$var) + public function setUninterpretedOption($var) { $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Protobuf\Internal\UninterpretedOption::class); $this->uninterpreted_option = $arr; $this->has_uninterpreted_option = true; + + return $this; } public function hasUninterpretedOption() diff --git a/php/src/Google/Protobuf/Internal/FieldDescriptor.php b/php/src/Google/Protobuf/Internal/FieldDescriptor.php new file mode 100644 index 00000000..f18bf810 --- /dev/null +++ b/php/src/Google/Protobuf/Internal/FieldDescriptor.php @@ -0,0 +1,253 @@ +<?php + +// Protocol Buffers - Google's data interchange format +// Copyright 2008 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. + +namespace Google\Protobuf\Internal; + +class FieldDescriptor +{ + + private $name; + private $json_name; + private $setter; + private $getter; + private $number; + private $label; + private $type; + private $message_type; + private $enum_type; + private $packed; + private $is_map; + private $oneof_index = -1; + + public function setOneofIndex($index) + { + $this->oneof_index = $index; + } + + public function getOneofIndex() + { + return $this->oneof_index; + } + + public function setName($name) + { + $this->name = $name; + } + + public function getName() + { + return $this->name; + } + + public function setJsonName($json_name) + { + $this->json_name = $json_name; + } + + public function getJsonName() + { + return $this->json_name; + } + + public function setSetter($setter) + { + $this->setter = $setter; + } + + public function getSetter() + { + return $this->setter; + } + + public function setGetter($getter) + { + $this->getter = $getter; + } + + public function getGetter() + { + return $this->getter; + } + + public function setNumber($number) + { + $this->number = $number; + } + + public function getNumber() + { + return $this->number; + } + + public function setLabel($label) + { + $this->label = $label; + } + + public function getLabel() + { + return $this->label; + } + + public function isRepeated() + { + return $this->label === GPBLabel::REPEATED; + } + + public function setType($type) + { + $this->type = $type; + } + + public function getType() + { + return $this->type; + } + + public function setMessageType($message_type) + { + $this->message_type = $message_type; + } + + public function getMessageType() + { + return $this->message_type; + } + + public function setEnumType($enum_type) + { + $this->enum_type = $enum_type; + } + + public function getEnumType() + { + return $this->enum_type; + } + + public function setPacked($packed) + { + $this->packed = $packed; + } + + public function getPacked() + { + return $this->packed; + } + + public function isPackable() + { + return $this->isRepeated() && self::isTypePackable($this->type); + } + + public function isMap() + { + return $this->getType() == GPBType::MESSAGE && + !is_null($this->getMessageType()->getOptions()) && + $this->getMessageType()->getOptions()->getMapEntry(); + } + + private static function isTypePackable($field_type) + { + return ($field_type !== GPBType::STRING && + $field_type !== GPBType::GROUP && + $field_type !== GPBType::MESSAGE && + $field_type !== GPBType::BYTES); + } + + public static function getFieldDescriptor($proto) + { + $type_name = null; + $type = $proto->getType(); + switch ($type) { + case GPBType::MESSAGE: + case GPBType::GROUP: + case GPBType::ENUM: + $type_name = $proto->getTypeName(); + break; + default: + break; + } + + $oneof_index = $proto->hasOneofIndex() ? $proto->getOneofIndex() : -1; + $packed = false; + $options = $proto->getOptions(); + if ($options !== null) { + $packed = $options->getPacked(); + } + + $field = new FieldDescriptor(); + $field->setName($proto->getName()); + + $json_name = $proto->hasJsonName() ? $proto->getJsonName() : + lcfirst(implode('', array_map('ucwords', explode('_', $proto->getName())))); + if ($proto->hasJsonName()) { + $json_name = $proto->getJsonName(); + } else { + $proto_name = $proto->getName(); + $json_name = implode('', array_map('ucwords', explode('_', $proto_name))); + if ($proto_name[0] !== "_" && !ctype_upper($proto_name[0])) { + $json_name = lcfirst($json_name); + } + } + $field->setJsonName($json_name); + + $camel_name = implode('', array_map('ucwords', explode('_', $proto->getName()))); + $field->setGetter('get' . $camel_name); + $field->setSetter('set' . $camel_name); + $field->setType($proto->getType()); + $field->setNumber($proto->getNumber()); + $field->setLabel($proto->getLabel()); + $field->setPacked($packed); + $field->setOneofIndex($oneof_index); + + // At this time, the message/enum type may have not been added to pool. + // So we use the type name as place holder and will replace it with the + // actual descriptor in cross building. + switch ($type) { + case GPBType::MESSAGE: + $field->setMessageType($type_name); + break; + case GPBType::ENUM: + $field->setEnumType($type_name); + break; + default: + break; + } + + return $field; + } + + public static function buildFromProto($proto) + { + return FieldDescriptor::getFieldDescriptor($proto); + } +} diff --git a/php/src/Google/Protobuf/Internal/FieldDescriptorProto.php b/php/src/Google/Protobuf/Internal/FieldDescriptorProto.php index 6ae2cd41..10c27593 100644 --- a/php/src/Google/Protobuf/Internal/FieldDescriptorProto.php +++ b/php/src/Google/Protobuf/Internal/FieldDescriptorProto.php @@ -8,103 +8,88 @@ use Google\Protobuf\Internal\GPBType; use Google\Protobuf\Internal\GPBWire; use Google\Protobuf\Internal\RepeatedField; use Google\Protobuf\Internal\InputStream; - use Google\Protobuf\Internal\GPBUtil; /** - * <pre> * Describes a field within a message. - * </pre> * - * Protobuf type <code>google.protobuf.FieldDescriptorProto</code> + * Generated from protobuf message <code>google.protobuf.FieldDescriptorProto</code> */ class FieldDescriptorProto extends \Google\Protobuf\Internal\Message { /** - * <code>optional string name = 1;</code> + * Generated from protobuf field <code>optional string name = 1;</code> */ private $name = ''; private $has_name = false; /** - * <code>optional int32 number = 3;</code> + * Generated from protobuf field <code>optional int32 number = 3;</code> */ private $number = 0; private $has_number = false; /** - * <code>optional .google.protobuf.FieldDescriptorProto.Label label = 4;</code> + * Generated from protobuf field <code>optional .google.protobuf.FieldDescriptorProto.Label label = 4;</code> */ private $label = 0; private $has_label = false; /** - * <pre> * 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. - * </pre> * - * <code>optional .google.protobuf.FieldDescriptorProto.Type type = 5;</code> + * Generated from protobuf field <code>optional .google.protobuf.FieldDescriptorProto.Type type = 5;</code> */ private $type = 0; private $has_type = false; /** - * <pre> * 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). - * </pre> * - * <code>optional string type_name = 6;</code> + * Generated from protobuf field <code>optional string type_name = 6;</code> */ private $type_name = ''; private $has_type_name = false; /** - * <pre> * For extensions, this is the name of the type being extended. It is * resolved in the same manner as type_name. - * </pre> * - * <code>optional string extendee = 2;</code> + * Generated from protobuf field <code>optional string extendee = 2;</code> */ private $extendee = ''; private $has_extendee = false; /** - * <pre> * 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. + * For bytes, contains the C escaped value. All bytes >= 128 are escaped. * TODO(kenton): Base-64 encode? - * </pre> * - * <code>optional string default_value = 7;</code> + * Generated from protobuf field <code>optional string default_value = 7;</code> */ private $default_value = ''; private $has_default_value = false; /** - * <pre> * If set, gives the index of a oneof in the containing type's oneof_decl * list. This field is a member of that oneof. - * </pre> * - * <code>optional int32 oneof_index = 9;</code> + * Generated from protobuf field <code>optional int32 oneof_index = 9;</code> */ private $oneof_index = 0; private $has_oneof_index = false; /** - * <pre> * 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. - * </pre> * - * <code>optional string json_name = 10;</code> + * Generated from protobuf field <code>optional string json_name = 10;</code> */ private $json_name = ''; private $has_json_name = false; /** - * <code>optional .google.protobuf.FieldOptions options = 8;</code> + * Generated from protobuf field <code>optional .google.protobuf.FieldOptions options = 8;</code> */ private $options = null; private $has_options = false; @@ -115,7 +100,8 @@ class FieldDescriptorProto extends \Google\Protobuf\Internal\Message } /** - * <code>optional string name = 1;</code> + * Generated from protobuf field <code>optional string name = 1;</code> + * @return string */ public function getName() { @@ -123,13 +109,17 @@ class FieldDescriptorProto extends \Google\Protobuf\Internal\Message } /** - * <code>optional string name = 1;</code> + * Generated from protobuf field <code>optional string name = 1;</code> + * @param string $var + * @return $this */ public function setName($var) { GPBUtil::checkString($var, True); $this->name = $var; $this->has_name = true; + + return $this; } public function hasName() @@ -138,7 +128,8 @@ class FieldDescriptorProto extends \Google\Protobuf\Internal\Message } /** - * <code>optional int32 number = 3;</code> + * Generated from protobuf field <code>optional int32 number = 3;</code> + * @return int */ public function getNumber() { @@ -146,13 +137,17 @@ class FieldDescriptorProto extends \Google\Protobuf\Internal\Message } /** - * <code>optional int32 number = 3;</code> + * Generated from protobuf field <code>optional int32 number = 3;</code> + * @param int $var + * @return $this */ public function setNumber($var) { GPBUtil::checkInt32($var); $this->number = $var; $this->has_number = true; + + return $this; } public function hasNumber() @@ -161,7 +156,8 @@ class FieldDescriptorProto extends \Google\Protobuf\Internal\Message } /** - * <code>optional .google.protobuf.FieldDescriptorProto.Label label = 4;</code> + * Generated from protobuf field <code>optional .google.protobuf.FieldDescriptorProto.Label label = 4;</code> + * @return int */ public function getLabel() { @@ -169,13 +165,17 @@ class FieldDescriptorProto extends \Google\Protobuf\Internal\Message } /** - * <code>optional .google.protobuf.FieldDescriptorProto.Label label = 4;</code> + * Generated from protobuf field <code>optional .google.protobuf.FieldDescriptorProto.Label label = 4;</code> + * @param int $var + * @return $this */ public function setLabel($var) { GPBUtil::checkEnum($var, \Google\Protobuf\Internal\FieldDescriptorProto_Label::class); $this->label = $var; $this->has_label = true; + + return $this; } public function hasLabel() @@ -184,12 +184,11 @@ class FieldDescriptorProto extends \Google\Protobuf\Internal\Message } /** - * <pre> * 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. - * </pre> * - * <code>optional .google.protobuf.FieldDescriptorProto.Type type = 5;</code> + * Generated from protobuf field <code>optional .google.protobuf.FieldDescriptorProto.Type type = 5;</code> + * @return int */ public function getType() { @@ -197,18 +196,20 @@ class FieldDescriptorProto extends \Google\Protobuf\Internal\Message } /** - * <pre> * 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. - * </pre> * - * <code>optional .google.protobuf.FieldDescriptorProto.Type type = 5;</code> + * Generated from protobuf field <code>optional .google.protobuf.FieldDescriptorProto.Type type = 5;</code> + * @param int $var + * @return $this */ public function setType($var) { GPBUtil::checkEnum($var, \Google\Protobuf\Internal\FieldDescriptorProto_Type::class); $this->type = $var; $this->has_type = true; + + return $this; } public function hasType() @@ -217,15 +218,14 @@ class FieldDescriptorProto extends \Google\Protobuf\Internal\Message } /** - * <pre> * 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). - * </pre> * - * <code>optional string type_name = 6;</code> + * Generated from protobuf field <code>optional string type_name = 6;</code> + * @return string */ public function getTypeName() { @@ -233,21 +233,23 @@ class FieldDescriptorProto extends \Google\Protobuf\Internal\Message } /** - * <pre> * 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). - * </pre> * - * <code>optional string type_name = 6;</code> + * Generated from protobuf field <code>optional string type_name = 6;</code> + * @param string $var + * @return $this */ public function setTypeName($var) { GPBUtil::checkString($var, True); $this->type_name = $var; $this->has_type_name = true; + + return $this; } public function hasTypeName() @@ -256,12 +258,11 @@ class FieldDescriptorProto extends \Google\Protobuf\Internal\Message } /** - * <pre> * For extensions, this is the name of the type being extended. It is * resolved in the same manner as type_name. - * </pre> * - * <code>optional string extendee = 2;</code> + * Generated from protobuf field <code>optional string extendee = 2;</code> + * @return string */ public function getExtendee() { @@ -269,18 +270,20 @@ class FieldDescriptorProto extends \Google\Protobuf\Internal\Message } /** - * <pre> * For extensions, this is the name of the type being extended. It is * resolved in the same manner as type_name. - * </pre> * - * <code>optional string extendee = 2;</code> + * Generated from protobuf field <code>optional string extendee = 2;</code> + * @param string $var + * @return $this */ public function setExtendee($var) { GPBUtil::checkString($var, True); $this->extendee = $var; $this->has_extendee = true; + + return $this; } public function hasExtendee() @@ -289,15 +292,14 @@ class FieldDescriptorProto extends \Google\Protobuf\Internal\Message } /** - * <pre> * 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. + * For bytes, contains the C escaped value. All bytes >= 128 are escaped. * TODO(kenton): Base-64 encode? - * </pre> * - * <code>optional string default_value = 7;</code> + * Generated from protobuf field <code>optional string default_value = 7;</code> + * @return string */ public function getDefaultValue() { @@ -305,21 +307,23 @@ class FieldDescriptorProto extends \Google\Protobuf\Internal\Message } /** - * <pre> * 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. + * For bytes, contains the C escaped value. All bytes >= 128 are escaped. * TODO(kenton): Base-64 encode? - * </pre> * - * <code>optional string default_value = 7;</code> + * Generated from protobuf field <code>optional string default_value = 7;</code> + * @param string $var + * @return $this */ public function setDefaultValue($var) { GPBUtil::checkString($var, True); $this->default_value = $var; $this->has_default_value = true; + + return $this; } public function hasDefaultValue() @@ -328,12 +332,11 @@ class FieldDescriptorProto extends \Google\Protobuf\Internal\Message } /** - * <pre> * If set, gives the index of a oneof in the containing type's oneof_decl * list. This field is a member of that oneof. - * </pre> * - * <code>optional int32 oneof_index = 9;</code> + * Generated from protobuf field <code>optional int32 oneof_index = 9;</code> + * @return int */ public function getOneofIndex() { @@ -341,18 +344,20 @@ class FieldDescriptorProto extends \Google\Protobuf\Internal\Message } /** - * <pre> * If set, gives the index of a oneof in the containing type's oneof_decl * list. This field is a member of that oneof. - * </pre> * - * <code>optional int32 oneof_index = 9;</code> + * Generated from protobuf field <code>optional int32 oneof_index = 9;</code> + * @param int $var + * @return $this */ public function setOneofIndex($var) { GPBUtil::checkInt32($var); $this->oneof_index = $var; $this->has_oneof_index = true; + + return $this; } public function hasOneofIndex() @@ -361,14 +366,13 @@ class FieldDescriptorProto extends \Google\Protobuf\Internal\Message } /** - * <pre> * 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. - * </pre> * - * <code>optional string json_name = 10;</code> + * Generated from protobuf field <code>optional string json_name = 10;</code> + * @return string */ public function getJsonName() { @@ -376,20 +380,22 @@ class FieldDescriptorProto extends \Google\Protobuf\Internal\Message } /** - * <pre> * 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. - * </pre> * - * <code>optional string json_name = 10;</code> + * Generated from protobuf field <code>optional string json_name = 10;</code> + * @param string $var + * @return $this */ public function setJsonName($var) { GPBUtil::checkString($var, True); $this->json_name = $var; $this->has_json_name = true; + + return $this; } public function hasJsonName() @@ -398,7 +404,8 @@ class FieldDescriptorProto extends \Google\Protobuf\Internal\Message } /** - * <code>optional .google.protobuf.FieldOptions options = 8;</code> + * Generated from protobuf field <code>optional .google.protobuf.FieldOptions options = 8;</code> + * @return \Google\Protobuf\Internal\FieldOptions */ public function getOptions() { @@ -406,13 +413,17 @@ class FieldDescriptorProto extends \Google\Protobuf\Internal\Message } /** - * <code>optional .google.protobuf.FieldOptions options = 8;</code> + * Generated from protobuf field <code>optional .google.protobuf.FieldOptions options = 8;</code> + * @param \Google\Protobuf\Internal\FieldOptions $var + * @return $this */ - public function setOptions(&$var) + public function setOptions($var) { GPBUtil::checkMessage($var, \Google\Protobuf\Internal\FieldOptions::class); $this->options = $var; $this->has_options = true; + + return $this; } public function hasOptions() diff --git a/php/src/Google/Protobuf/Internal/FieldDescriptorProto_Label.php b/php/src/Google/Protobuf/Internal/FieldDescriptorProto_Label.php index a3cd8ef9..f2a32fdf 100644 --- a/php/src/Google/Protobuf/Internal/FieldDescriptorProto_Label.php +++ b/php/src/Google/Protobuf/Internal/FieldDescriptorProto_Label.php @@ -5,24 +5,22 @@ namespace Google\Protobuf\Internal; /** - * Protobuf enum <code>google.protobuf.FieldDescriptorProto.Label</code> + * Protobuf enum <code>Google\Protobuf\Internal</code> */ class FieldDescriptorProto_Label { /** - * <pre> * 0 is reserved for errors - * </pre> * - * <code>LABEL_OPTIONAL = 1;</code> + * Generated from protobuf enum <code>LABEL_OPTIONAL = 1;</code> */ const LABEL_OPTIONAL = 1; /** - * <code>LABEL_REQUIRED = 2;</code> + * Generated from protobuf enum <code>LABEL_REQUIRED = 2;</code> */ const LABEL_REQUIRED = 2; /** - * <code>LABEL_REPEATED = 3;</code> + * Generated from protobuf enum <code>LABEL_REPEATED = 3;</code> */ const LABEL_REPEATED = 3; } diff --git a/php/src/Google/Protobuf/Internal/FieldDescriptorProto_Type.php b/php/src/Google/Protobuf/Internal/FieldDescriptorProto_Type.php index 8335f9b1..1b022deb 100644 --- a/php/src/Google/Protobuf/Internal/FieldDescriptorProto_Type.php +++ b/php/src/Google/Protobuf/Internal/FieldDescriptorProto_Type.php @@ -5,118 +5,102 @@ namespace Google\Protobuf\Internal; /** - * Protobuf enum <code>google.protobuf.FieldDescriptorProto.Type</code> + * Protobuf enum <code>Google\Protobuf\Internal</code> */ class FieldDescriptorProto_Type { /** - * <pre> * 0 is reserved for errors. * Order is weird for historical reasons. - * </pre> * - * <code>TYPE_DOUBLE = 1;</code> + * Generated from protobuf enum <code>TYPE_DOUBLE = 1;</code> */ const TYPE_DOUBLE = 1; /** - * <code>TYPE_FLOAT = 2;</code> + * Generated from protobuf enum <code>TYPE_FLOAT = 2;</code> */ const TYPE_FLOAT = 2; /** - * <pre> * Not ZigZag encoded. Negative numbers take 10 bytes. Use TYPE_SINT64 if * negative values are likely. - * </pre> * - * <code>TYPE_INT64 = 3;</code> + * Generated from protobuf enum <code>TYPE_INT64 = 3;</code> */ const TYPE_INT64 = 3; /** - * <code>TYPE_UINT64 = 4;</code> + * Generated from protobuf enum <code>TYPE_UINT64 = 4;</code> */ const TYPE_UINT64 = 4; /** - * <pre> * Not ZigZag encoded. Negative numbers take 10 bytes. Use TYPE_SINT32 if * negative values are likely. - * </pre> * - * <code>TYPE_INT32 = 5;</code> + * Generated from protobuf enum <code>TYPE_INT32 = 5;</code> */ const TYPE_INT32 = 5; /** - * <code>TYPE_FIXED64 = 6;</code> + * Generated from protobuf enum <code>TYPE_FIXED64 = 6;</code> */ const TYPE_FIXED64 = 6; /** - * <code>TYPE_FIXED32 = 7;</code> + * Generated from protobuf enum <code>TYPE_FIXED32 = 7;</code> */ const TYPE_FIXED32 = 7; /** - * <code>TYPE_BOOL = 8;</code> + * Generated from protobuf enum <code>TYPE_BOOL = 8;</code> */ const TYPE_BOOL = 8; /** - * <code>TYPE_STRING = 9;</code> + * Generated from protobuf enum <code>TYPE_STRING = 9;</code> */ const TYPE_STRING = 9; /** - * <pre> * Tag-delimited aggregate. * Group type is deprecated and not supported in proto3. However, Proto3 * implementations should still be able to parse the group wire format and * treat group fields as unknown fields. - * </pre> * - * <code>TYPE_GROUP = 10;</code> + * Generated from protobuf enum <code>TYPE_GROUP = 10;</code> */ const TYPE_GROUP = 10; /** - * <pre> * Length-delimited aggregate. - * </pre> * - * <code>TYPE_MESSAGE = 11;</code> + * Generated from protobuf enum <code>TYPE_MESSAGE = 11;</code> */ const TYPE_MESSAGE = 11; /** - * <pre> * New in version 2. - * </pre> * - * <code>TYPE_BYTES = 12;</code> + * Generated from protobuf enum <code>TYPE_BYTES = 12;</code> */ const TYPE_BYTES = 12; /** - * <code>TYPE_UINT32 = 13;</code> + * Generated from protobuf enum <code>TYPE_UINT32 = 13;</code> */ const TYPE_UINT32 = 13; /** - * <code>TYPE_ENUM = 14;</code> + * Generated from protobuf enum <code>TYPE_ENUM = 14;</code> */ const TYPE_ENUM = 14; /** - * <code>TYPE_SFIXED32 = 15;</code> + * Generated from protobuf enum <code>TYPE_SFIXED32 = 15;</code> */ const TYPE_SFIXED32 = 15; /** - * <code>TYPE_SFIXED64 = 16;</code> + * Generated from protobuf enum <code>TYPE_SFIXED64 = 16;</code> */ const TYPE_SFIXED64 = 16; /** - * <pre> * Uses ZigZag encoding. - * </pre> * - * <code>TYPE_SINT32 = 17;</code> + * Generated from protobuf enum <code>TYPE_SINT32 = 17;</code> */ const TYPE_SINT32 = 17; /** - * <pre> * Uses ZigZag encoding. - * </pre> * - * <code>TYPE_SINT64 = 18;</code> + * Generated from protobuf enum <code>TYPE_SINT64 = 18;</code> */ const TYPE_SINT64 = 18; } diff --git a/php/src/Google/Protobuf/Internal/FieldOptions.php b/php/src/Google/Protobuf/Internal/FieldOptions.php index 94c4418f..169f860b 100644 --- a/php/src/Google/Protobuf/Internal/FieldOptions.php +++ b/php/src/Google/Protobuf/Internal/FieldOptions.php @@ -8,41 +8,35 @@ use Google\Protobuf\Internal\GPBType; use Google\Protobuf\Internal\GPBWire; use Google\Protobuf\Internal\RepeatedField; use Google\Protobuf\Internal\InputStream; - use Google\Protobuf\Internal\GPBUtil; /** - * Protobuf type <code>google.protobuf.FieldOptions</code> + * Generated from protobuf message <code>google.protobuf.FieldOptions</code> */ class FieldOptions extends \Google\Protobuf\Internal\Message { /** - * <pre> * 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! - * </pre> * - * <code>optional .google.protobuf.FieldOptions.CType ctype = 1 [default = STRING];</code> + * Generated from protobuf field <code>optional .google.protobuf.FieldOptions.CType ctype = 1 [default = STRING];</code> */ private $ctype = 0; private $has_ctype = false; /** - * <pre> * 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. - * </pre> * - * <code>optional bool packed = 2;</code> + * Generated from protobuf field <code>optional bool packed = 2;</code> */ private $packed = false; private $has_packed = false; /** - * <pre> * 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). A field with jstype JS_STRING @@ -53,14 +47,12 @@ class FieldOptions extends \Google\Protobuf\Internal\Message * JS_NORMAL is implementation dependent. * This option is an enum to permit additional types to be added, e.g. * goog.math.Integer. - * </pre> * - * <code>optional .google.protobuf.FieldOptions.JSType jstype = 6 [default = JS_NORMAL];</code> + * Generated from protobuf field <code>optional .google.protobuf.FieldOptions.JSType jstype = 6 [default = JS_NORMAL];</code> */ private $jstype = 0; private $has_jstype = false; /** - * <pre> * 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 @@ -85,39 +77,32 @@ class FieldOptions extends \Google\Protobuf\Internal\Message * implementation must either *always* check its required fields, or *never* * check its required fields, regardless of whether or not the message has * been parsed. - * </pre> * - * <code>optional bool lazy = 5 [default = false];</code> + * Generated from protobuf field <code>optional bool lazy = 5 [default = false];</code> */ private $lazy = false; private $has_lazy = false; /** - * <pre> * 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. - * </pre> * - * <code>optional bool deprecated = 3 [default = false];</code> + * Generated from protobuf field <code>optional bool deprecated = 3 [default = false];</code> */ private $deprecated = false; private $has_deprecated = false; /** - * <pre> * For Google-internal migration only. Do not use. - * </pre> * - * <code>optional bool weak = 10 [default = false];</code> + * Generated from protobuf field <code>optional bool weak = 10 [default = false];</code> */ private $weak = false; private $has_weak = false; /** - * <pre> * The parser stores options it doesn't recognize here. See above. - * </pre> * - * <code>repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;</code> + * Generated from protobuf field <code>repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;</code> */ private $uninterpreted_option; private $has_uninterpreted_option = false; @@ -128,14 +113,13 @@ class FieldOptions extends \Google\Protobuf\Internal\Message } /** - * <pre> * 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! - * </pre> * - * <code>optional .google.protobuf.FieldOptions.CType ctype = 1 [default = STRING];</code> + * Generated from protobuf field <code>optional .google.protobuf.FieldOptions.CType ctype = 1 [default = STRING];</code> + * @return int */ public function getCtype() { @@ -143,20 +127,22 @@ class FieldOptions extends \Google\Protobuf\Internal\Message } /** - * <pre> * 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! - * </pre> * - * <code>optional .google.protobuf.FieldOptions.CType ctype = 1 [default = STRING];</code> + * Generated from protobuf field <code>optional .google.protobuf.FieldOptions.CType ctype = 1 [default = STRING];</code> + * @param int $var + * @return $this */ public function setCtype($var) { GPBUtil::checkEnum($var, \Google\Protobuf\Internal\FieldOptions_CType::class); $this->ctype = $var; $this->has_ctype = true; + + return $this; } public function hasCtype() @@ -165,15 +151,14 @@ class FieldOptions extends \Google\Protobuf\Internal\Message } /** - * <pre> * 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. - * </pre> * - * <code>optional bool packed = 2;</code> + * Generated from protobuf field <code>optional bool packed = 2;</code> + * @return bool */ public function getPacked() { @@ -181,21 +166,23 @@ class FieldOptions extends \Google\Protobuf\Internal\Message } /** - * <pre> * 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. - * </pre> * - * <code>optional bool packed = 2;</code> + * Generated from protobuf field <code>optional bool packed = 2;</code> + * @param bool $var + * @return $this */ public function setPacked($var) { GPBUtil::checkBool($var); $this->packed = $var; $this->has_packed = true; + + return $this; } public function hasPacked() @@ -204,7 +191,6 @@ class FieldOptions extends \Google\Protobuf\Internal\Message } /** - * <pre> * 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). A field with jstype JS_STRING @@ -215,9 +201,9 @@ class FieldOptions extends \Google\Protobuf\Internal\Message * JS_NORMAL is implementation dependent. * This option is an enum to permit additional types to be added, e.g. * goog.math.Integer. - * </pre> * - * <code>optional .google.protobuf.FieldOptions.JSType jstype = 6 [default = JS_NORMAL];</code> + * Generated from protobuf field <code>optional .google.protobuf.FieldOptions.JSType jstype = 6 [default = JS_NORMAL];</code> + * @return int */ public function getJstype() { @@ -225,7 +211,6 @@ class FieldOptions extends \Google\Protobuf\Internal\Message } /** - * <pre> * 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). A field with jstype JS_STRING @@ -236,15 +221,18 @@ class FieldOptions extends \Google\Protobuf\Internal\Message * JS_NORMAL is implementation dependent. * This option is an enum to permit additional types to be added, e.g. * goog.math.Integer. - * </pre> * - * <code>optional .google.protobuf.FieldOptions.JSType jstype = 6 [default = JS_NORMAL];</code> + * Generated from protobuf field <code>optional .google.protobuf.FieldOptions.JSType jstype = 6 [default = JS_NORMAL];</code> + * @param int $var + * @return $this */ public function setJstype($var) { GPBUtil::checkEnum($var, \Google\Protobuf\Internal\FieldOptions_JSType::class); $this->jstype = $var; $this->has_jstype = true; + + return $this; } public function hasJstype() @@ -253,7 +241,6 @@ class FieldOptions extends \Google\Protobuf\Internal\Message } /** - * <pre> * 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 @@ -278,9 +265,9 @@ class FieldOptions extends \Google\Protobuf\Internal\Message * implementation must either *always* check its required fields, or *never* * check its required fields, regardless of whether or not the message has * been parsed. - * </pre> * - * <code>optional bool lazy = 5 [default = false];</code> + * Generated from protobuf field <code>optional bool lazy = 5 [default = false];</code> + * @return bool */ public function getLazy() { @@ -288,7 +275,6 @@ class FieldOptions extends \Google\Protobuf\Internal\Message } /** - * <pre> * 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 @@ -313,15 +299,18 @@ class FieldOptions extends \Google\Protobuf\Internal\Message * implementation must either *always* check its required fields, or *never* * check its required fields, regardless of whether or not the message has * been parsed. - * </pre> * - * <code>optional bool lazy = 5 [default = false];</code> + * Generated from protobuf field <code>optional bool lazy = 5 [default = false];</code> + * @param bool $var + * @return $this */ public function setLazy($var) { GPBUtil::checkBool($var); $this->lazy = $var; $this->has_lazy = true; + + return $this; } public function hasLazy() @@ -330,14 +319,13 @@ class FieldOptions extends \Google\Protobuf\Internal\Message } /** - * <pre> * 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. - * </pre> * - * <code>optional bool deprecated = 3 [default = false];</code> + * Generated from protobuf field <code>optional bool deprecated = 3 [default = false];</code> + * @return bool */ public function getDeprecated() { @@ -345,20 +333,22 @@ class FieldOptions extends \Google\Protobuf\Internal\Message } /** - * <pre> * 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. - * </pre> * - * <code>optional bool deprecated = 3 [default = false];</code> + * Generated from protobuf field <code>optional bool deprecated = 3 [default = false];</code> + * @param bool $var + * @return $this */ public function setDeprecated($var) { GPBUtil::checkBool($var); $this->deprecated = $var; $this->has_deprecated = true; + + return $this; } public function hasDeprecated() @@ -367,11 +357,10 @@ class FieldOptions extends \Google\Protobuf\Internal\Message } /** - * <pre> * For Google-internal migration only. Do not use. - * </pre> * - * <code>optional bool weak = 10 [default = false];</code> + * Generated from protobuf field <code>optional bool weak = 10 [default = false];</code> + * @return bool */ public function getWeak() { @@ -379,17 +368,19 @@ class FieldOptions extends \Google\Protobuf\Internal\Message } /** - * <pre> * For Google-internal migration only. Do not use. - * </pre> * - * <code>optional bool weak = 10 [default = false];</code> + * Generated from protobuf field <code>optional bool weak = 10 [default = false];</code> + * @param bool $var + * @return $this */ public function setWeak($var) { GPBUtil::checkBool($var); $this->weak = $var; $this->has_weak = true; + + return $this; } public function hasWeak() @@ -398,11 +389,10 @@ class FieldOptions extends \Google\Protobuf\Internal\Message } /** - * <pre> * The parser stores options it doesn't recognize here. See above. - * </pre> * - * <code>repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;</code> + * Generated from protobuf field <code>repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;</code> + * @return \Google\Protobuf\Internal\RepeatedField */ public function getUninterpretedOption() { @@ -410,17 +400,19 @@ class FieldOptions extends \Google\Protobuf\Internal\Message } /** - * <pre> * The parser stores options it doesn't recognize here. See above. - * </pre> * - * <code>repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;</code> + * Generated from protobuf field <code>repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;</code> + * @param \Google\Protobuf\Internal\UninterpretedOption[]|\Google\Protobuf\Internal\RepeatedField $var + * @return $this */ - public function setUninterpretedOption(&$var) + public function setUninterpretedOption($var) { $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Protobuf\Internal\UninterpretedOption::class); $this->uninterpreted_option = $arr; $this->has_uninterpreted_option = true; + + return $this; } public function hasUninterpretedOption() diff --git a/php/src/Google/Protobuf/Internal/FieldOptions_CType.php b/php/src/Google/Protobuf/Internal/FieldOptions_CType.php index f59f20be..0f33072d 100644 --- a/php/src/Google/Protobuf/Internal/FieldOptions_CType.php +++ b/php/src/Google/Protobuf/Internal/FieldOptions_CType.php @@ -5,24 +5,22 @@ namespace Google\Protobuf\Internal; /** - * Protobuf enum <code>google.protobuf.FieldOptions.CType</code> + * Protobuf enum <code>Google\Protobuf\Internal</code> */ class FieldOptions_CType { /** - * <pre> * Default mode. - * </pre> * - * <code>STRING = 0;</code> + * Generated from protobuf enum <code>STRING = 0;</code> */ const STRING = 0; /** - * <code>CORD = 1;</code> + * Generated from protobuf enum <code>CORD = 1;</code> */ const CORD = 1; /** - * <code>STRING_PIECE = 2;</code> + * Generated from protobuf enum <code>STRING_PIECE = 2;</code> */ const STRING_PIECE = 2; } diff --git a/php/src/Google/Protobuf/Internal/FieldOptions_JSType.php b/php/src/Google/Protobuf/Internal/FieldOptions_JSType.php index 0c6995b7..73bdf3f2 100644 --- a/php/src/Google/Protobuf/Internal/FieldOptions_JSType.php +++ b/php/src/Google/Protobuf/Internal/FieldOptions_JSType.php @@ -5,32 +5,26 @@ namespace Google\Protobuf\Internal; /** - * Protobuf enum <code>google.protobuf.FieldOptions.JSType</code> + * Protobuf enum <code>Google\Protobuf\Internal</code> */ class FieldOptions_JSType { /** - * <pre> * Use the default type. - * </pre> * - * <code>JS_NORMAL = 0;</code> + * Generated from protobuf enum <code>JS_NORMAL = 0;</code> */ const JS_NORMAL = 0; /** - * <pre> * Use JavaScript strings. - * </pre> * - * <code>JS_STRING = 1;</code> + * Generated from protobuf enum <code>JS_STRING = 1;</code> */ const JS_STRING = 1; /** - * <pre> * Use JavaScript numbers. - * </pre> * - * <code>JS_NUMBER = 2;</code> + * Generated from protobuf enum <code>JS_NUMBER = 2;</code> */ const JS_NUMBER = 2; } diff --git a/php/src/Google/Protobuf/Internal/FileDescriptor.php b/php/src/Google/Protobuf/Internal/FileDescriptor.php new file mode 100644 index 00000000..038da38c --- /dev/null +++ b/php/src/Google/Protobuf/Internal/FileDescriptor.php @@ -0,0 +1,89 @@ +<?php + +// Protocol Buffers - Google's data interchange format +// Copyright 2008 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. + +namespace Google\Protobuf\Internal; + +class FileDescriptor +{ + + private $package; + private $message_type = []; + private $enum_type = []; + + public function setPackage($package) + { + $this->package = $package; + } + + public function getPackage() + { + return $this->package; + } + + public function getMessageType() + { + return $this->message_type; + } + + public function addMessageType($desc) + { + $this->message_type[] = $desc; + } + + public function getEnumType() + { + return $this->enum_type; + } + + public function addEnumType($desc) + { + $this->enum_type[]= $desc; + } + + public static function buildFromProto($proto) + { + $file = new FileDescriptor(); + $file->setPackage($proto->getPackage()); + foreach ($proto->getMessageType() as $message_proto) { + $file->addMessageType(Descriptor::buildFromProto( + $message_proto, $proto, "")); + } + foreach ($proto->getEnumType() as $enum_proto) { + $file->addEnumType( + EnumDescriptor::buildFromProto( + $enum_proto, + $proto, + "")); + } + return $file; + } +} diff --git a/php/src/Google/Protobuf/Internal/FileDescriptorProto.php b/php/src/Google/Protobuf/Internal/FileDescriptorProto.php index 0363d9e9..9ee222d1 100644 --- a/php/src/Google/Protobuf/Internal/FileDescriptorProto.php +++ b/php/src/Google/Protobuf/Internal/FileDescriptorProto.php @@ -8,112 +8,93 @@ use Google\Protobuf\Internal\GPBType; use Google\Protobuf\Internal\GPBWire; use Google\Protobuf\Internal\RepeatedField; use Google\Protobuf\Internal\InputStream; - use Google\Protobuf\Internal\GPBUtil; /** - * <pre> * Describes a complete .proto file. - * </pre> * - * Protobuf type <code>google.protobuf.FileDescriptorProto</code> + * Generated from protobuf message <code>google.protobuf.FileDescriptorProto</code> */ class FileDescriptorProto extends \Google\Protobuf\Internal\Message { /** - * <pre> * file name, relative to root of source tree - * </pre> * - * <code>optional string name = 1;</code> + * Generated from protobuf field <code>optional string name = 1;</code> */ private $name = ''; private $has_name = false; /** - * <pre> * e.g. "foo", "foo.bar", etc. - * </pre> * - * <code>optional string package = 2;</code> + * Generated from protobuf field <code>optional string package = 2;</code> */ private $package = ''; private $has_package = false; /** - * <pre> * Names of files imported by this file. - * </pre> * - * <code>repeated string dependency = 3;</code> + * Generated from protobuf field <code>repeated string dependency = 3;</code> */ private $dependency; private $has_dependency = false; /** - * <pre> * Indexes of the public imported files in the dependency list above. - * </pre> * - * <code>repeated int32 public_dependency = 10;</code> + * Generated from protobuf field <code>repeated int32 public_dependency = 10;</code> */ private $public_dependency; private $has_public_dependency = false; /** - * <pre> * Indexes of the weak imported files in the dependency list. * For Google-internal migration only. Do not use. - * </pre> * - * <code>repeated int32 weak_dependency = 11;</code> + * Generated from protobuf field <code>repeated int32 weak_dependency = 11;</code> */ private $weak_dependency; private $has_weak_dependency = false; /** - * <pre> * All top-level definitions in this file. - * </pre> * - * <code>repeated .google.protobuf.DescriptorProto message_type = 4;</code> + * Generated from protobuf field <code>repeated .google.protobuf.DescriptorProto message_type = 4;</code> */ private $message_type; private $has_message_type = false; /** - * <code>repeated .google.protobuf.EnumDescriptorProto enum_type = 5;</code> + * Generated from protobuf field <code>repeated .google.protobuf.EnumDescriptorProto enum_type = 5;</code> */ private $enum_type; private $has_enum_type = false; /** - * <code>repeated .google.protobuf.ServiceDescriptorProto service = 6;</code> + * Generated from protobuf field <code>repeated .google.protobuf.ServiceDescriptorProto service = 6;</code> */ private $service; private $has_service = false; /** - * <code>repeated .google.protobuf.FieldDescriptorProto extension = 7;</code> + * Generated from protobuf field <code>repeated .google.protobuf.FieldDescriptorProto extension = 7;</code> */ private $extension; private $has_extension = false; /** - * <code>optional .google.protobuf.FileOptions options = 8;</code> + * Generated from protobuf field <code>optional .google.protobuf.FileOptions options = 8;</code> */ private $options = null; private $has_options = false; /** - * <pre> * 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. - * </pre> * - * <code>optional .google.protobuf.SourceCodeInfo source_code_info = 9;</code> + * Generated from protobuf field <code>optional .google.protobuf.SourceCodeInfo source_code_info = 9;</code> */ private $source_code_info = null; private $has_source_code_info = false; /** - * <pre> * The syntax of the proto file. * The supported values are "proto2" and "proto3". - * </pre> * - * <code>optional string syntax = 12;</code> + * Generated from protobuf field <code>optional string syntax = 12;</code> */ private $syntax = ''; private $has_syntax = false; @@ -124,11 +105,10 @@ class FileDescriptorProto extends \Google\Protobuf\Internal\Message } /** - * <pre> * file name, relative to root of source tree - * </pre> * - * <code>optional string name = 1;</code> + * Generated from protobuf field <code>optional string name = 1;</code> + * @return string */ public function getName() { @@ -136,17 +116,19 @@ class FileDescriptorProto extends \Google\Protobuf\Internal\Message } /** - * <pre> * file name, relative to root of source tree - * </pre> * - * <code>optional string name = 1;</code> + * Generated from protobuf field <code>optional string name = 1;</code> + * @param string $var + * @return $this */ public function setName($var) { GPBUtil::checkString($var, True); $this->name = $var; $this->has_name = true; + + return $this; } public function hasName() @@ -155,11 +137,10 @@ class FileDescriptorProto extends \Google\Protobuf\Internal\Message } /** - * <pre> * e.g. "foo", "foo.bar", etc. - * </pre> * - * <code>optional string package = 2;</code> + * Generated from protobuf field <code>optional string package = 2;</code> + * @return string */ public function getPackage() { @@ -167,17 +148,19 @@ class FileDescriptorProto extends \Google\Protobuf\Internal\Message } /** - * <pre> * e.g. "foo", "foo.bar", etc. - * </pre> * - * <code>optional string package = 2;</code> + * Generated from protobuf field <code>optional string package = 2;</code> + * @param string $var + * @return $this */ public function setPackage($var) { GPBUtil::checkString($var, True); $this->package = $var; $this->has_package = true; + + return $this; } public function hasPackage() @@ -186,11 +169,10 @@ class FileDescriptorProto extends \Google\Protobuf\Internal\Message } /** - * <pre> * Names of files imported by this file. - * </pre> * - * <code>repeated string dependency = 3;</code> + * Generated from protobuf field <code>repeated string dependency = 3;</code> + * @return \Google\Protobuf\Internal\RepeatedField */ public function getDependency() { @@ -198,17 +180,19 @@ class FileDescriptorProto extends \Google\Protobuf\Internal\Message } /** - * <pre> * Names of files imported by this file. - * </pre> * - * <code>repeated string dependency = 3;</code> + * Generated from protobuf field <code>repeated string dependency = 3;</code> + * @param string[]|\Google\Protobuf\Internal\RepeatedField $var + * @return $this */ - public function setDependency(&$var) + public function setDependency($var) { $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::STRING); $this->dependency = $arr; $this->has_dependency = true; + + return $this; } public function hasDependency() @@ -217,11 +201,10 @@ class FileDescriptorProto extends \Google\Protobuf\Internal\Message } /** - * <pre> * Indexes of the public imported files in the dependency list above. - * </pre> * - * <code>repeated int32 public_dependency = 10;</code> + * Generated from protobuf field <code>repeated int32 public_dependency = 10;</code> + * @return \Google\Protobuf\Internal\RepeatedField */ public function getPublicDependency() { @@ -229,17 +212,19 @@ class FileDescriptorProto extends \Google\Protobuf\Internal\Message } /** - * <pre> * Indexes of the public imported files in the dependency list above. - * </pre> * - * <code>repeated int32 public_dependency = 10;</code> + * Generated from protobuf field <code>repeated int32 public_dependency = 10;</code> + * @param int[]|\Google\Protobuf\Internal\RepeatedField $var + * @return $this */ - public function setPublicDependency(&$var) + public function setPublicDependency($var) { $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::INT32); $this->public_dependency = $arr; $this->has_public_dependency = true; + + return $this; } public function hasPublicDependency() @@ -248,12 +233,11 @@ class FileDescriptorProto extends \Google\Protobuf\Internal\Message } /** - * <pre> * Indexes of the weak imported files in the dependency list. * For Google-internal migration only. Do not use. - * </pre> * - * <code>repeated int32 weak_dependency = 11;</code> + * Generated from protobuf field <code>repeated int32 weak_dependency = 11;</code> + * @return \Google\Protobuf\Internal\RepeatedField */ public function getWeakDependency() { @@ -261,18 +245,20 @@ class FileDescriptorProto extends \Google\Protobuf\Internal\Message } /** - * <pre> * Indexes of the weak imported files in the dependency list. * For Google-internal migration only. Do not use. - * </pre> * - * <code>repeated int32 weak_dependency = 11;</code> + * Generated from protobuf field <code>repeated int32 weak_dependency = 11;</code> + * @param int[]|\Google\Protobuf\Internal\RepeatedField $var + * @return $this */ - public function setWeakDependency(&$var) + public function setWeakDependency($var) { $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::INT32); $this->weak_dependency = $arr; $this->has_weak_dependency = true; + + return $this; } public function hasWeakDependency() @@ -281,11 +267,10 @@ class FileDescriptorProto extends \Google\Protobuf\Internal\Message } /** - * <pre> * All top-level definitions in this file. - * </pre> * - * <code>repeated .google.protobuf.DescriptorProto message_type = 4;</code> + * Generated from protobuf field <code>repeated .google.protobuf.DescriptorProto message_type = 4;</code> + * @return \Google\Protobuf\Internal\RepeatedField */ public function getMessageType() { @@ -293,17 +278,19 @@ class FileDescriptorProto extends \Google\Protobuf\Internal\Message } /** - * <pre> * All top-level definitions in this file. - * </pre> * - * <code>repeated .google.protobuf.DescriptorProto message_type = 4;</code> + * Generated from protobuf field <code>repeated .google.protobuf.DescriptorProto message_type = 4;</code> + * @param \Google\Protobuf\Internal\DescriptorProto[]|\Google\Protobuf\Internal\RepeatedField $var + * @return $this */ - public function setMessageType(&$var) + public function setMessageType($var) { $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Protobuf\Internal\DescriptorProto::class); $this->message_type = $arr; $this->has_message_type = true; + + return $this; } public function hasMessageType() @@ -312,7 +299,8 @@ class FileDescriptorProto extends \Google\Protobuf\Internal\Message } /** - * <code>repeated .google.protobuf.EnumDescriptorProto enum_type = 5;</code> + * Generated from protobuf field <code>repeated .google.protobuf.EnumDescriptorProto enum_type = 5;</code> + * @return \Google\Protobuf\Internal\RepeatedField */ public function getEnumType() { @@ -320,13 +308,17 @@ class FileDescriptorProto extends \Google\Protobuf\Internal\Message } /** - * <code>repeated .google.protobuf.EnumDescriptorProto enum_type = 5;</code> + * Generated from protobuf field <code>repeated .google.protobuf.EnumDescriptorProto enum_type = 5;</code> + * @param \Google\Protobuf\Internal\EnumDescriptorProto[]|\Google\Protobuf\Internal\RepeatedField $var + * @return $this */ - public function setEnumType(&$var) + public function setEnumType($var) { $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Protobuf\Internal\EnumDescriptorProto::class); $this->enum_type = $arr; $this->has_enum_type = true; + + return $this; } public function hasEnumType() @@ -335,7 +327,8 @@ class FileDescriptorProto extends \Google\Protobuf\Internal\Message } /** - * <code>repeated .google.protobuf.ServiceDescriptorProto service = 6;</code> + * Generated from protobuf field <code>repeated .google.protobuf.ServiceDescriptorProto service = 6;</code> + * @return \Google\Protobuf\Internal\RepeatedField */ public function getService() { @@ -343,13 +336,17 @@ class FileDescriptorProto extends \Google\Protobuf\Internal\Message } /** - * <code>repeated .google.protobuf.ServiceDescriptorProto service = 6;</code> + * Generated from protobuf field <code>repeated .google.protobuf.ServiceDescriptorProto service = 6;</code> + * @param \Google\Protobuf\Internal\ServiceDescriptorProto[]|\Google\Protobuf\Internal\RepeatedField $var + * @return $this */ - public function setService(&$var) + public function setService($var) { $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Protobuf\Internal\ServiceDescriptorProto::class); $this->service = $arr; $this->has_service = true; + + return $this; } public function hasService() @@ -358,7 +355,8 @@ class FileDescriptorProto extends \Google\Protobuf\Internal\Message } /** - * <code>repeated .google.protobuf.FieldDescriptorProto extension = 7;</code> + * Generated from protobuf field <code>repeated .google.protobuf.FieldDescriptorProto extension = 7;</code> + * @return \Google\Protobuf\Internal\RepeatedField */ public function getExtension() { @@ -366,13 +364,17 @@ class FileDescriptorProto extends \Google\Protobuf\Internal\Message } /** - * <code>repeated .google.protobuf.FieldDescriptorProto extension = 7;</code> + * Generated from protobuf field <code>repeated .google.protobuf.FieldDescriptorProto extension = 7;</code> + * @param \Google\Protobuf\Internal\FieldDescriptorProto[]|\Google\Protobuf\Internal\RepeatedField $var + * @return $this */ - public function setExtension(&$var) + public function setExtension($var) { $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Protobuf\Internal\FieldDescriptorProto::class); $this->extension = $arr; $this->has_extension = true; + + return $this; } public function hasExtension() @@ -381,7 +383,8 @@ class FileDescriptorProto extends \Google\Protobuf\Internal\Message } /** - * <code>optional .google.protobuf.FileOptions options = 8;</code> + * Generated from protobuf field <code>optional .google.protobuf.FileOptions options = 8;</code> + * @return \Google\Protobuf\Internal\FileOptions */ public function getOptions() { @@ -389,13 +392,17 @@ class FileDescriptorProto extends \Google\Protobuf\Internal\Message } /** - * <code>optional .google.protobuf.FileOptions options = 8;</code> + * Generated from protobuf field <code>optional .google.protobuf.FileOptions options = 8;</code> + * @param \Google\Protobuf\Internal\FileOptions $var + * @return $this */ - public function setOptions(&$var) + public function setOptions($var) { GPBUtil::checkMessage($var, \Google\Protobuf\Internal\FileOptions::class); $this->options = $var; $this->has_options = true; + + return $this; } public function hasOptions() @@ -404,14 +411,13 @@ class FileDescriptorProto extends \Google\Protobuf\Internal\Message } /** - * <pre> * 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. - * </pre> * - * <code>optional .google.protobuf.SourceCodeInfo source_code_info = 9;</code> + * Generated from protobuf field <code>optional .google.protobuf.SourceCodeInfo source_code_info = 9;</code> + * @return \Google\Protobuf\Internal\SourceCodeInfo */ public function getSourceCodeInfo() { @@ -419,20 +425,22 @@ class FileDescriptorProto extends \Google\Protobuf\Internal\Message } /** - * <pre> * 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. - * </pre> * - * <code>optional .google.protobuf.SourceCodeInfo source_code_info = 9;</code> + * Generated from protobuf field <code>optional .google.protobuf.SourceCodeInfo source_code_info = 9;</code> + * @param \Google\Protobuf\Internal\SourceCodeInfo $var + * @return $this */ - public function setSourceCodeInfo(&$var) + public function setSourceCodeInfo($var) { GPBUtil::checkMessage($var, \Google\Protobuf\Internal\SourceCodeInfo::class); $this->source_code_info = $var; $this->has_source_code_info = true; + + return $this; } public function hasSourceCodeInfo() @@ -441,12 +449,11 @@ class FileDescriptorProto extends \Google\Protobuf\Internal\Message } /** - * <pre> * The syntax of the proto file. * The supported values are "proto2" and "proto3". - * </pre> * - * <code>optional string syntax = 12;</code> + * Generated from protobuf field <code>optional string syntax = 12;</code> + * @return string */ public function getSyntax() { @@ -454,18 +461,20 @@ class FileDescriptorProto extends \Google\Protobuf\Internal\Message } /** - * <pre> * The syntax of the proto file. * The supported values are "proto2" and "proto3". - * </pre> * - * <code>optional string syntax = 12;</code> + * Generated from protobuf field <code>optional string syntax = 12;</code> + * @param string $var + * @return $this */ public function setSyntax($var) { GPBUtil::checkString($var, True); $this->syntax = $var; $this->has_syntax = true; + + return $this; } public function hasSyntax() diff --git a/php/src/Google/Protobuf/Internal/FileDescriptorSet.php b/php/src/Google/Protobuf/Internal/FileDescriptorSet.php index 0bcc8051..0b2cf957 100644 --- a/php/src/Google/Protobuf/Internal/FileDescriptorSet.php +++ b/php/src/Google/Protobuf/Internal/FileDescriptorSet.php @@ -8,21 +8,18 @@ use Google\Protobuf\Internal\GPBType; use Google\Protobuf\Internal\GPBWire; use Google\Protobuf\Internal\RepeatedField; use Google\Protobuf\Internal\InputStream; - use Google\Protobuf\Internal\GPBUtil; /** - * <pre> * The protocol compiler can output a FileDescriptorSet containing the .proto * files it parses. - * </pre> * - * Protobuf type <code>google.protobuf.FileDescriptorSet</code> + * Generated from protobuf message <code>google.protobuf.FileDescriptorSet</code> */ class FileDescriptorSet extends \Google\Protobuf\Internal\Message { /** - * <code>repeated .google.protobuf.FileDescriptorProto file = 1;</code> + * Generated from protobuf field <code>repeated .google.protobuf.FileDescriptorProto file = 1;</code> */ private $file; private $has_file = false; @@ -33,7 +30,8 @@ class FileDescriptorSet extends \Google\Protobuf\Internal\Message } /** - * <code>repeated .google.protobuf.FileDescriptorProto file = 1;</code> + * Generated from protobuf field <code>repeated .google.protobuf.FileDescriptorProto file = 1;</code> + * @return \Google\Protobuf\Internal\RepeatedField */ public function getFile() { @@ -41,13 +39,17 @@ class FileDescriptorSet extends \Google\Protobuf\Internal\Message } /** - * <code>repeated .google.protobuf.FileDescriptorProto file = 1;</code> + * Generated from protobuf field <code>repeated .google.protobuf.FileDescriptorProto file = 1;</code> + * @param \Google\Protobuf\Internal\FileDescriptorProto[]|\Google\Protobuf\Internal\RepeatedField $var + * @return $this */ - public function setFile(&$var) + public function setFile($var) { $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Protobuf\Internal\FileDescriptorProto::class); $this->file = $arr; $this->has_file = true; + + return $this; } public function hasFile() diff --git a/php/src/Google/Protobuf/Internal/FileOptions.php b/php/src/Google/Protobuf/Internal/FileOptions.php index 22653a4f..c2dd5e08 100644 --- a/php/src/Google/Protobuf/Internal/FileOptions.php +++ b/php/src/Google/Protobuf/Internal/FileOptions.php @@ -8,96 +8,82 @@ use Google\Protobuf\Internal\GPBType; use Google\Protobuf\Internal\GPBWire; use Google\Protobuf\Internal\RepeatedField; use Google\Protobuf\Internal\InputStream; - use Google\Protobuf\Internal\GPBUtil; /** - * Protobuf type <code>google.protobuf.FileOptions</code> + * Generated from protobuf message <code>google.protobuf.FileOptions</code> */ class FileOptions extends \Google\Protobuf\Internal\Message { /** - * <pre> * 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. - * </pre> * - * <code>optional string java_package = 1;</code> + * Generated from protobuf field <code>optional string java_package = 1;</code> */ private $java_package = ''; private $has_java_package = false; /** - * <pre> * 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). - * </pre> * - * <code>optional string java_outer_classname = 8;</code> + * Generated from protobuf field <code>optional string java_outer_classname = 8;</code> */ private $java_outer_classname = ''; private $has_java_outer_classname = false; /** - * <pre> * 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. - * </pre> * - * <code>optional bool java_multiple_files = 10 [default = false];</code> + * Generated from protobuf field <code>optional bool java_multiple_files = 10 [default = false];</code> */ private $java_multiple_files = false; private $has_java_multiple_files = false; /** - * <pre> * This option does nothing. - * </pre> * - * <code>optional bool java_generate_equals_and_hash = 20 [deprecated = true];</code> + * Generated from protobuf field <code>optional bool java_generate_equals_and_hash = 20 [deprecated = true];</code> */ private $java_generate_equals_and_hash = false; private $has_java_generate_equals_and_hash = false; /** - * <pre> * 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. - * </pre> * - * <code>optional bool java_string_check_utf8 = 27 [default = false];</code> + * Generated from protobuf field <code>optional bool java_string_check_utf8 = 27 [default = false];</code> */ private $java_string_check_utf8 = false; private $has_java_string_check_utf8 = false; /** - * <code>optional .google.protobuf.FileOptions.OptimizeMode optimize_for = 9 [default = SPEED];</code> + * Generated from protobuf field <code>optional .google.protobuf.FileOptions.OptimizeMode optimize_for = 9 [default = SPEED];</code> */ private $optimize_for = 0; private $has_optimize_for = false; /** - * <pre> * 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. - * </pre> * - * <code>optional string go_package = 11;</code> + * Generated from protobuf field <code>optional string go_package = 11;</code> */ private $go_package = ''; private $has_go_package = false; /** - * <pre> * 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). @@ -107,91 +93,90 @@ class FileOptions extends \Google\Protobuf\Internal\Message * 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. - * </pre> * - * <code>optional bool cc_generic_services = 16 [default = false];</code> + * Generated from protobuf field <code>optional bool cc_generic_services = 16 [default = false];</code> */ private $cc_generic_services = false; private $has_cc_generic_services = false; /** - * <code>optional bool java_generic_services = 17 [default = false];</code> + * Generated from protobuf field <code>optional bool java_generic_services = 17 [default = false];</code> */ private $java_generic_services = false; private $has_java_generic_services = false; /** - * <code>optional bool py_generic_services = 18 [default = false];</code> + * Generated from protobuf field <code>optional bool py_generic_services = 18 [default = false];</code> */ private $py_generic_services = false; private $has_py_generic_services = false; /** - * <pre> + * Generated from protobuf field <code>optional bool php_generic_services = 19 [default = false];</code> + */ + private $php_generic_services = false; + private $has_php_generic_services = false; + /** * 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. - * </pre> * - * <code>optional bool deprecated = 23 [default = false];</code> + * Generated from protobuf field <code>optional bool deprecated = 23 [default = false];</code> */ private $deprecated = false; private $has_deprecated = false; /** - * <pre> * Enables the use of arenas for the proto messages in this file. This applies * only to generated classes for C++. - * </pre> * - * <code>optional bool cc_enable_arenas = 31 [default = false];</code> + * Generated from protobuf field <code>optional bool cc_enable_arenas = 31 [default = false];</code> */ private $cc_enable_arenas = false; private $has_cc_enable_arenas = false; /** - * <pre> * Sets the objective c class prefix which is prepended to all objective c * generated classes from this .proto. There is no default. - * </pre> * - * <code>optional string objc_class_prefix = 36;</code> + * Generated from protobuf field <code>optional string objc_class_prefix = 36;</code> */ private $objc_class_prefix = ''; private $has_objc_class_prefix = false; /** - * <pre> * Namespace for generated classes; defaults to the package. - * </pre> * - * <code>optional string csharp_namespace = 37;</code> + * Generated from protobuf field <code>optional string csharp_namespace = 37;</code> */ private $csharp_namespace = ''; private $has_csharp_namespace = false; /** - * <pre> * By default Swift generators will take the proto package and CamelCase it * replacing '.' with underscore and use that to prefix the types/symbols * defined. When this options is provided, they will use this value instead * to prefix the types/symbols defined. - * </pre> * - * <code>optional string swift_prefix = 39;</code> + * Generated from protobuf field <code>optional string swift_prefix = 39;</code> */ private $swift_prefix = ''; private $has_swift_prefix = false; /** - * <pre> * Sets the php class prefix which is prepended to all php generated classes * from this .proto. Default is empty. - * </pre> * - * <code>optional string php_class_prefix = 40;</code> + * Generated from protobuf field <code>optional string php_class_prefix = 40;</code> */ private $php_class_prefix = ''; private $has_php_class_prefix = false; /** - * <pre> + * Use this option to change the namespace of php generated classes. Default + * is empty. When this option is empty, the package name will be used for + * determining the namespace. + * + * Generated from protobuf field <code>optional string php_namespace = 41;</code> + */ + private $php_namespace = ''; + private $has_php_namespace = false; + /** * The parser stores options it doesn't recognize here. See above. - * </pre> * - * <code>repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;</code> + * Generated from protobuf field <code>repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;</code> */ private $uninterpreted_option; private $has_uninterpreted_option = false; @@ -202,14 +187,13 @@ class FileOptions extends \Google\Protobuf\Internal\Message } /** - * <pre> * 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. - * </pre> * - * <code>optional string java_package = 1;</code> + * Generated from protobuf field <code>optional string java_package = 1;</code> + * @return string */ public function getJavaPackage() { @@ -217,20 +201,22 @@ class FileOptions extends \Google\Protobuf\Internal\Message } /** - * <pre> * 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. - * </pre> * - * <code>optional string java_package = 1;</code> + * Generated from protobuf field <code>optional string java_package = 1;</code> + * @param string $var + * @return $this */ public function setJavaPackage($var) { GPBUtil::checkString($var, True); $this->java_package = $var; $this->has_java_package = true; + + return $this; } public function hasJavaPackage() @@ -239,15 +225,14 @@ class FileOptions extends \Google\Protobuf\Internal\Message } /** - * <pre> * 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). - * </pre> * - * <code>optional string java_outer_classname = 8;</code> + * Generated from protobuf field <code>optional string java_outer_classname = 8;</code> + * @return string */ public function getJavaOuterClassname() { @@ -255,21 +240,23 @@ class FileOptions extends \Google\Protobuf\Internal\Message } /** - * <pre> * 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). - * </pre> * - * <code>optional string java_outer_classname = 8;</code> + * Generated from protobuf field <code>optional string java_outer_classname = 8;</code> + * @param string $var + * @return $this */ public function setJavaOuterClassname($var) { GPBUtil::checkString($var, True); $this->java_outer_classname = $var; $this->has_java_outer_classname = true; + + return $this; } public function hasJavaOuterClassname() @@ -278,16 +265,15 @@ class FileOptions extends \Google\Protobuf\Internal\Message } /** - * <pre> * 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. - * </pre> * - * <code>optional bool java_multiple_files = 10 [default = false];</code> + * Generated from protobuf field <code>optional bool java_multiple_files = 10 [default = false];</code> + * @return bool */ public function getJavaMultipleFiles() { @@ -295,22 +281,24 @@ class FileOptions extends \Google\Protobuf\Internal\Message } /** - * <pre> * 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. - * </pre> * - * <code>optional bool java_multiple_files = 10 [default = false];</code> + * Generated from protobuf field <code>optional bool java_multiple_files = 10 [default = false];</code> + * @param bool $var + * @return $this */ public function setJavaMultipleFiles($var) { GPBUtil::checkBool($var); $this->java_multiple_files = $var; $this->has_java_multiple_files = true; + + return $this; } public function hasJavaMultipleFiles() @@ -319,11 +307,10 @@ class FileOptions extends \Google\Protobuf\Internal\Message } /** - * <pre> * This option does nothing. - * </pre> * - * <code>optional bool java_generate_equals_and_hash = 20 [deprecated = true];</code> + * Generated from protobuf field <code>optional bool java_generate_equals_and_hash = 20 [deprecated = true];</code> + * @return bool */ public function getJavaGenerateEqualsAndHash() { @@ -331,17 +318,19 @@ class FileOptions extends \Google\Protobuf\Internal\Message } /** - * <pre> * This option does nothing. - * </pre> * - * <code>optional bool java_generate_equals_and_hash = 20 [deprecated = true];</code> + * Generated from protobuf field <code>optional bool java_generate_equals_and_hash = 20 [deprecated = true];</code> + * @param bool $var + * @return $this */ public function setJavaGenerateEqualsAndHash($var) { GPBUtil::checkBool($var); $this->java_generate_equals_and_hash = $var; $this->has_java_generate_equals_and_hash = true; + + return $this; } public function hasJavaGenerateEqualsAndHash() @@ -350,16 +339,15 @@ class FileOptions extends \Google\Protobuf\Internal\Message } /** - * <pre> * 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. - * </pre> * - * <code>optional bool java_string_check_utf8 = 27 [default = false];</code> + * Generated from protobuf field <code>optional bool java_string_check_utf8 = 27 [default = false];</code> + * @return bool */ public function getJavaStringCheckUtf8() { @@ -367,22 +355,24 @@ class FileOptions extends \Google\Protobuf\Internal\Message } /** - * <pre> * 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. - * </pre> * - * <code>optional bool java_string_check_utf8 = 27 [default = false];</code> + * Generated from protobuf field <code>optional bool java_string_check_utf8 = 27 [default = false];</code> + * @param bool $var + * @return $this */ public function setJavaStringCheckUtf8($var) { GPBUtil::checkBool($var); $this->java_string_check_utf8 = $var; $this->has_java_string_check_utf8 = true; + + return $this; } public function hasJavaStringCheckUtf8() @@ -391,7 +381,8 @@ class FileOptions extends \Google\Protobuf\Internal\Message } /** - * <code>optional .google.protobuf.FileOptions.OptimizeMode optimize_for = 9 [default = SPEED];</code> + * Generated from protobuf field <code>optional .google.protobuf.FileOptions.OptimizeMode optimize_for = 9 [default = SPEED];</code> + * @return int */ public function getOptimizeFor() { @@ -399,13 +390,17 @@ class FileOptions extends \Google\Protobuf\Internal\Message } /** - * <code>optional .google.protobuf.FileOptions.OptimizeMode optimize_for = 9 [default = SPEED];</code> + * Generated from protobuf field <code>optional .google.protobuf.FileOptions.OptimizeMode optimize_for = 9 [default = SPEED];</code> + * @param int $var + * @return $this */ public function setOptimizeFor($var) { GPBUtil::checkEnum($var, \Google\Protobuf\Internal\FileOptions_OptimizeMode::class); $this->optimize_for = $var; $this->has_optimize_for = true; + + return $this; } public function hasOptimizeFor() @@ -414,15 +409,14 @@ class FileOptions extends \Google\Protobuf\Internal\Message } /** - * <pre> * 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. - * </pre> * - * <code>optional string go_package = 11;</code> + * Generated from protobuf field <code>optional string go_package = 11;</code> + * @return string */ public function getGoPackage() { @@ -430,21 +424,23 @@ class FileOptions extends \Google\Protobuf\Internal\Message } /** - * <pre> * 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. - * </pre> * - * <code>optional string go_package = 11;</code> + * Generated from protobuf field <code>optional string go_package = 11;</code> + * @param string $var + * @return $this */ public function setGoPackage($var) { GPBUtil::checkString($var, True); $this->go_package = $var; $this->has_go_package = true; + + return $this; } public function hasGoPackage() @@ -453,7 +449,6 @@ class FileOptions extends \Google\Protobuf\Internal\Message } /** - * <pre> * 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). @@ -463,9 +458,9 @@ class FileOptions extends \Google\Protobuf\Internal\Message * 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. - * </pre> * - * <code>optional bool cc_generic_services = 16 [default = false];</code> + * Generated from protobuf field <code>optional bool cc_generic_services = 16 [default = false];</code> + * @return bool */ public function getCcGenericServices() { @@ -473,7 +468,6 @@ class FileOptions extends \Google\Protobuf\Internal\Message } /** - * <pre> * 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). @@ -483,15 +477,18 @@ class FileOptions extends \Google\Protobuf\Internal\Message * 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. - * </pre> * - * <code>optional bool cc_generic_services = 16 [default = false];</code> + * Generated from protobuf field <code>optional bool cc_generic_services = 16 [default = false];</code> + * @param bool $var + * @return $this */ public function setCcGenericServices($var) { GPBUtil::checkBool($var); $this->cc_generic_services = $var; $this->has_cc_generic_services = true; + + return $this; } public function hasCcGenericServices() @@ -500,7 +497,8 @@ class FileOptions extends \Google\Protobuf\Internal\Message } /** - * <code>optional bool java_generic_services = 17 [default = false];</code> + * Generated from protobuf field <code>optional bool java_generic_services = 17 [default = false];</code> + * @return bool */ public function getJavaGenericServices() { @@ -508,13 +506,17 @@ class FileOptions extends \Google\Protobuf\Internal\Message } /** - * <code>optional bool java_generic_services = 17 [default = false];</code> + * Generated from protobuf field <code>optional bool java_generic_services = 17 [default = false];</code> + * @param bool $var + * @return $this */ public function setJavaGenericServices($var) { GPBUtil::checkBool($var); $this->java_generic_services = $var; $this->has_java_generic_services = true; + + return $this; } public function hasJavaGenericServices() @@ -523,7 +525,8 @@ class FileOptions extends \Google\Protobuf\Internal\Message } /** - * <code>optional bool py_generic_services = 18 [default = false];</code> + * Generated from protobuf field <code>optional bool py_generic_services = 18 [default = false];</code> + * @return bool */ public function getPyGenericServices() { @@ -531,13 +534,17 @@ class FileOptions extends \Google\Protobuf\Internal\Message } /** - * <code>optional bool py_generic_services = 18 [default = false];</code> + * Generated from protobuf field <code>optional bool py_generic_services = 18 [default = false];</code> + * @param bool $var + * @return $this */ public function setPyGenericServices($var) { GPBUtil::checkBool($var); $this->py_generic_services = $var; $this->has_py_generic_services = true; + + return $this; } public function hasPyGenericServices() @@ -546,14 +553,41 @@ class FileOptions extends \Google\Protobuf\Internal\Message } /** - * <pre> + * Generated from protobuf field <code>optional bool php_generic_services = 19 [default = false];</code> + * @return bool + */ + public function getPhpGenericServices() + { + return $this->php_generic_services; + } + + /** + * Generated from protobuf field <code>optional bool php_generic_services = 19 [default = false];</code> + * @param bool $var + * @return $this + */ + public function setPhpGenericServices($var) + { + GPBUtil::checkBool($var); + $this->php_generic_services = $var; + $this->has_php_generic_services = true; + + return $this; + } + + public function hasPhpGenericServices() + { + return $this->has_php_generic_services; + } + + /** * 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. - * </pre> * - * <code>optional bool deprecated = 23 [default = false];</code> + * Generated from protobuf field <code>optional bool deprecated = 23 [default = false];</code> + * @return bool */ public function getDeprecated() { @@ -561,20 +595,22 @@ class FileOptions extends \Google\Protobuf\Internal\Message } /** - * <pre> * 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. - * </pre> * - * <code>optional bool deprecated = 23 [default = false];</code> + * Generated from protobuf field <code>optional bool deprecated = 23 [default = false];</code> + * @param bool $var + * @return $this */ public function setDeprecated($var) { GPBUtil::checkBool($var); $this->deprecated = $var; $this->has_deprecated = true; + + return $this; } public function hasDeprecated() @@ -583,12 +619,11 @@ class FileOptions extends \Google\Protobuf\Internal\Message } /** - * <pre> * Enables the use of arenas for the proto messages in this file. This applies * only to generated classes for C++. - * </pre> * - * <code>optional bool cc_enable_arenas = 31 [default = false];</code> + * Generated from protobuf field <code>optional bool cc_enable_arenas = 31 [default = false];</code> + * @return bool */ public function getCcEnableArenas() { @@ -596,18 +631,20 @@ class FileOptions extends \Google\Protobuf\Internal\Message } /** - * <pre> * Enables the use of arenas for the proto messages in this file. This applies * only to generated classes for C++. - * </pre> * - * <code>optional bool cc_enable_arenas = 31 [default = false];</code> + * Generated from protobuf field <code>optional bool cc_enable_arenas = 31 [default = false];</code> + * @param bool $var + * @return $this */ public function setCcEnableArenas($var) { GPBUtil::checkBool($var); $this->cc_enable_arenas = $var; $this->has_cc_enable_arenas = true; + + return $this; } public function hasCcEnableArenas() @@ -616,12 +653,11 @@ class FileOptions extends \Google\Protobuf\Internal\Message } /** - * <pre> * Sets the objective c class prefix which is prepended to all objective c * generated classes from this .proto. There is no default. - * </pre> * - * <code>optional string objc_class_prefix = 36;</code> + * Generated from protobuf field <code>optional string objc_class_prefix = 36;</code> + * @return string */ public function getObjcClassPrefix() { @@ -629,18 +665,20 @@ class FileOptions extends \Google\Protobuf\Internal\Message } /** - * <pre> * Sets the objective c class prefix which is prepended to all objective c * generated classes from this .proto. There is no default. - * </pre> * - * <code>optional string objc_class_prefix = 36;</code> + * Generated from protobuf field <code>optional string objc_class_prefix = 36;</code> + * @param string $var + * @return $this */ public function setObjcClassPrefix($var) { GPBUtil::checkString($var, True); $this->objc_class_prefix = $var; $this->has_objc_class_prefix = true; + + return $this; } public function hasObjcClassPrefix() @@ -649,11 +687,10 @@ class FileOptions extends \Google\Protobuf\Internal\Message } /** - * <pre> * Namespace for generated classes; defaults to the package. - * </pre> * - * <code>optional string csharp_namespace = 37;</code> + * Generated from protobuf field <code>optional string csharp_namespace = 37;</code> + * @return string */ public function getCsharpNamespace() { @@ -661,17 +698,19 @@ class FileOptions extends \Google\Protobuf\Internal\Message } /** - * <pre> * Namespace for generated classes; defaults to the package. - * </pre> * - * <code>optional string csharp_namespace = 37;</code> + * Generated from protobuf field <code>optional string csharp_namespace = 37;</code> + * @param string $var + * @return $this */ public function setCsharpNamespace($var) { GPBUtil::checkString($var, True); $this->csharp_namespace = $var; $this->has_csharp_namespace = true; + + return $this; } public function hasCsharpNamespace() @@ -680,14 +719,13 @@ class FileOptions extends \Google\Protobuf\Internal\Message } /** - * <pre> * By default Swift generators will take the proto package and CamelCase it * replacing '.' with underscore and use that to prefix the types/symbols * defined. When this options is provided, they will use this value instead * to prefix the types/symbols defined. - * </pre> * - * <code>optional string swift_prefix = 39;</code> + * Generated from protobuf field <code>optional string swift_prefix = 39;</code> + * @return string */ public function getSwiftPrefix() { @@ -695,20 +733,22 @@ class FileOptions extends \Google\Protobuf\Internal\Message } /** - * <pre> * By default Swift generators will take the proto package and CamelCase it * replacing '.' with underscore and use that to prefix the types/symbols * defined. When this options is provided, they will use this value instead * to prefix the types/symbols defined. - * </pre> * - * <code>optional string swift_prefix = 39;</code> + * Generated from protobuf field <code>optional string swift_prefix = 39;</code> + * @param string $var + * @return $this */ public function setSwiftPrefix($var) { GPBUtil::checkString($var, True); $this->swift_prefix = $var; $this->has_swift_prefix = true; + + return $this; } public function hasSwiftPrefix() @@ -717,12 +757,11 @@ class FileOptions extends \Google\Protobuf\Internal\Message } /** - * <pre> * Sets the php class prefix which is prepended to all php generated classes * from this .proto. Default is empty. - * </pre> * - * <code>optional string php_class_prefix = 40;</code> + * Generated from protobuf field <code>optional string php_class_prefix = 40;</code> + * @return string */ public function getPhpClassPrefix() { @@ -730,18 +769,20 @@ class FileOptions extends \Google\Protobuf\Internal\Message } /** - * <pre> * Sets the php class prefix which is prepended to all php generated classes * from this .proto. Default is empty. - * </pre> * - * <code>optional string php_class_prefix = 40;</code> + * Generated from protobuf field <code>optional string php_class_prefix = 40;</code> + * @param string $var + * @return $this */ public function setPhpClassPrefix($var) { GPBUtil::checkString($var, True); $this->php_class_prefix = $var; $this->has_php_class_prefix = true; + + return $this; } public function hasPhpClassPrefix() @@ -750,11 +791,46 @@ class FileOptions extends \Google\Protobuf\Internal\Message } /** - * <pre> + * Use this option to change the namespace of php generated classes. Default + * is empty. When this option is empty, the package name will be used for + * determining the namespace. + * + * Generated from protobuf field <code>optional string php_namespace = 41;</code> + * @return string + */ + public function getPhpNamespace() + { + return $this->php_namespace; + } + + /** + * Use this option to change the namespace of php generated classes. Default + * is empty. When this option is empty, the package name will be used for + * determining the namespace. + * + * Generated from protobuf field <code>optional string php_namespace = 41;</code> + * @param string $var + * @return $this + */ + public function setPhpNamespace($var) + { + GPBUtil::checkString($var, True); + $this->php_namespace = $var; + $this->has_php_namespace = true; + + return $this; + } + + public function hasPhpNamespace() + { + return $this->has_php_namespace; + } + + /** * The parser stores options it doesn't recognize here. See above. - * </pre> * - * <code>repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;</code> + * Generated from protobuf field <code>repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;</code> + * @return \Google\Protobuf\Internal\RepeatedField */ public function getUninterpretedOption() { @@ -762,17 +838,19 @@ class FileOptions extends \Google\Protobuf\Internal\Message } /** - * <pre> * The parser stores options it doesn't recognize here. See above. - * </pre> * - * <code>repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;</code> + * Generated from protobuf field <code>repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;</code> + * @param \Google\Protobuf\Internal\UninterpretedOption[]|\Google\Protobuf\Internal\RepeatedField $var + * @return $this */ - public function setUninterpretedOption(&$var) + public function setUninterpretedOption($var) { $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Protobuf\Internal\UninterpretedOption::class); $this->uninterpreted_option = $arr; $this->has_uninterpreted_option = true; + + return $this; } public function hasUninterpretedOption() diff --git a/php/src/Google/Protobuf/Internal/FileOptions_OptimizeMode.php b/php/src/Google/Protobuf/Internal/FileOptions_OptimizeMode.php index b550e7f1..4dd56ef8 100644 --- a/php/src/Google/Protobuf/Internal/FileOptions_OptimizeMode.php +++ b/php/src/Google/Protobuf/Internal/FileOptions_OptimizeMode.php @@ -5,36 +5,28 @@ namespace Google\Protobuf\Internal; /** - * <pre> * Generated classes can be optimized for speed or code size. - * </pre> * - * Protobuf enum <code>google.protobuf.FileOptions.OptimizeMode</code> + * Protobuf enum <code>Google\Protobuf\Internal</code> */ class FileOptions_OptimizeMode { /** - * <pre> * Generate complete code for parsing, serialization, - * </pre> * - * <code>SPEED = 1;</code> + * Generated from protobuf enum <code>SPEED = 1;</code> */ const SPEED = 1; /** - * <pre> * etc. - * </pre> * - * <code>CODE_SIZE = 2;</code> + * Generated from protobuf enum <code>CODE_SIZE = 2;</code> */ const CODE_SIZE = 2; /** - * <pre> * Generate code using MessageLite and the lite runtime. - * </pre> * - * <code>LITE_RUNTIME = 3;</code> + * Generated from protobuf enum <code>LITE_RUNTIME = 3;</code> */ const LITE_RUNTIME = 3; } diff --git a/php/src/Google/Protobuf/Internal/GPBJsonWire.php b/php/src/Google/Protobuf/Internal/GPBJsonWire.php new file mode 100644 index 00000000..97789356 --- /dev/null +++ b/php/src/Google/Protobuf/Internal/GPBJsonWire.php @@ -0,0 +1,285 @@ +<?php + +// Protocol Buffers - Google's data interchange format +// Copyright 2008 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. + +namespace Google\Protobuf\Internal; + +class GPBJsonWire +{ + + public static function serializeFieldToStream( + $value, + $field, + &$output) + { + $output->writeRaw("\"", 1); + $field_name = GPBJsonWire::formatFieldName($field); + $output->writeRaw($field_name, strlen($field_name)); + $output->writeRaw("\":", 2); + return static::serializeFieldValueToStream($value, $field, $output); + } + + private static function serializeFieldValueToStream( + $values, + $field, + &$output) + { + if ($field->isMap()) { + $output->writeRaw("{", 1); + $first = true; + $map_entry = $field->getMessageType(); + $key_field = $map_entry->getFieldByNumber(1); + $value_field = $map_entry->getFieldByNumber(2); + + switch ($key_field->getType()) { + case GPBType::STRING: + case GPBType::SFIXED64: + case GPBType::INT64: + case GPBType::SINT64: + case GPBType::FIXED64: + case GPBType::UINT64: + $additional_quote = false; + break; + default: + $additional_quote = true; + } + + foreach ($values as $key => $value) { + if ($first) { + $first = false; + } else { + $output->writeRaw(",", 1); + } + if ($additional_quote) { + $output->writeRaw("\"", 1); + } + if (!static::serializeSingularFieldValueToStream( + $key, + $key_field, + $output)) { + return false; + } + if ($additional_quote) { + $output->writeRaw("\"", 1); + } + $output->writeRaw(":", 1); + if (!static::serializeSingularFieldValueToStream( + $value, + $value_field, + $output)) { + return false; + } + } + $output->writeRaw("}", 1); + return true; + } elseif ($field->isRepeated()) { + $output->writeRaw("[", 1); + $first = true; + foreach ($values as $value) { + if ($first) { + $first = false; + } else { + $output->writeRaw(",", 1); + } + if (!static::serializeSingularFieldValueToStream( + $value, + $field, + $output)) { + return false; + } + } + $output->writeRaw("]", 1); + return true; + } else { + return static::serializeSingularFieldValueToStream( + $values, + $field, + $output); + } + } + + private static function serializeSingularFieldValueToStream( + $value, + $field, + &$output) + { + switch ($field->getType()) { + case GPBType::SFIXED32: + case GPBType::SINT32: + case GPBType::INT32: + $str_value = strval($value); + $output->writeRaw($str_value, strlen($str_value)); + break; + case GPBType::FIXED32: + case GPBType::UINT32: + if ($value < 0) { + $value = bcadd($value, "4294967296"); + } + $str_value = strval($value); + $output->writeRaw($str_value, strlen($str_value)); + break; + case GPBType::FIXED64: + case GPBType::UINT64: + if ($value < 0) { + $value = bcadd($value, "18446744073709551616"); + } + // Intentional fall through. + case GPBType::SFIXED64: + case GPBType::INT64: + case GPBType::SINT64: + $output->writeRaw("\"", 1); + $str_value = strval($value); + $output->writeRaw($str_value, strlen($str_value)); + $output->writeRaw("\"", 1); + break; + case GPBType::FLOAT: + if (is_nan($value)) { + $str_value = "\"NaN\""; + } elseif ($value === INF) { + $str_value = "\"Infinity\""; + } elseif ($value === -INF) { + $str_value = "\"-Infinity\""; + } else { + $str_value = sprintf("%.8g", $value); + } + $output->writeRaw($str_value, strlen($str_value)); + break; + case GPBType::DOUBLE: + if (is_nan($value)) { + $str_value = "\"NaN\""; + } elseif ($value === INF) { + $str_value = "\"Infinity\""; + } elseif ($value === -INF) { + $str_value = "\"-Infinity\""; + } else { + $str_value = sprintf("%.17g", $value); + } + $output->writeRaw($str_value, strlen($str_value)); + break; + case GPBType::ENUM: + $enum_desc = $field->getEnumType(); + $enum_value_desc = $enum_desc->getValueByNumber($value); + if (!is_null($enum_value_desc)) { + $str_value = $enum_value_desc->getName(); + $output->writeRaw("\"", 1); + $output->writeRaw($str_value, strlen($str_value)); + $output->writeRaw("\"", 1); + } else { + $str_value = strval($value); + $output->writeRaw($str_value, strlen($str_value)); + } + break; + case GPBType::BOOL: + if ($value) { + $output->writeRaw("true", 4); + } else { + $output->writeRaw("false", 5); + } + break; + case GPBType::BYTES: + $value = base64_encode($value); + case GPBType::STRING: + $value = json_encode($value); + $output->writeRaw($value, strlen($value)); + break; + // case GPBType::GROUP: + // echo "GROUP\xA"; + // trigger_error("Not implemented.", E_ERROR); + // break; + case GPBType::MESSAGE: + $value->serializeToJsonStream($output); + break; + default: + user_error("Unsupported type."); + return false; + } + return true; + } + + private static function formatFieldName($field) + { + return $field->getJsonName(); + } + + // Used for escaping control chars in strings. + private static $k_control_char_limit = 0x20; + + private static function jsonNiceEscape($c) + { + switch ($c) { + case '"': return "\\\""; + case '\\': return "\\\\"; + case '/': return "\\/"; + case '\b': return "\\b"; + case '\f': return "\\f"; + case '\n': return "\\n"; + case '\r': return "\\r"; + case '\t': return "\\t"; + default: return NULL; + } + } + + private static function isJsonEscaped($c) + { + // See RFC 4627. + return $c < chr($k_control_char_limit) || $c === "\"" || $c === "\\"; + } + + public static function escapedJson($value) + { + $escaped_value = ""; + $unescaped_run = ""; + for ($i = 0; $i < strlen($value); $i++) { + $c = $value[$i]; + // Handle escaping. + if (static::isJsonEscaped($c)) { + // Use a "nice" escape, like \n, if one exists for this + // character. + $escape = static::jsonNiceEscape($c); + if (is_null($escape)) { + $escape = "\\u00" . bin2hex($c); + } + if ($unescaped_run !== "") { + $escaped_value .= $unescaped_run; + $unescaped_run = ""; + } + $escaped_value .= $escape; + } else { + if ($unescaped_run === "") { + $unescaped_run .= $c; + } + } + } + $escaped_value .= $unescaped_run; + return $escaped_value; + } + +} diff --git a/php/src/Google/Protobuf/Internal/GPBUtil.php b/php/src/Google/Protobuf/Internal/GPBUtil.php index 0e66ae6f..22ad27f9 100644 --- a/php/src/Google/Protobuf/Internal/GPBUtil.php +++ b/php/src/Google/Protobuf/Internal/GPBUtil.php @@ -45,8 +45,13 @@ class GPBUtil $value = bcsub(0, $value); } - $high = (int) bcdiv(bcadd($value, 1), 4294967296); + $high = bcdiv($value, 4294967296); $low = bcmod($value, 4294967296); + if (bccomp($high, 2147483647) > 0) { + $high = (int) bcsub($high, 4294967296); + } else { + $high = (int) $high; + } if (bccomp($low, 2147483647) > 0) { $low = (int) bcsub($low, 4294967296); } else { @@ -58,7 +63,7 @@ class GPBUtil $low = ~$low; $low++; if (!$low) { - $high++; + $high = (int)($high + 1); } } @@ -67,19 +72,16 @@ class GPBUtil } } - public static function checkString(&$var, $check_utf8) { if (is_array($var) || is_object($var)) { - trigger_error("Expect string.", E_USER_ERROR); - return; + throw new \InvalidArgumentException("Expect string."); } if (!is_string($var)) { $var = strval($var); } if ($check_utf8 && !preg_match('//u', $var)) { - trigger_error("Expect utf-8 encoding.", E_USER_ERROR); - return; + throw new \Exception("Expect utf-8 encoding."); } } @@ -93,7 +95,7 @@ class GPBUtil if (is_numeric($var)) { $var = intval($var); } else { - trigger_error("Expect integer.", E_USER_ERROR); + throw new \Exception("Expect integer."); } } @@ -110,7 +112,7 @@ class GPBUtil $var = (int) $var; } } else { - trigger_error("Expect integer.", E_USER_ERROR); + throw new \Exception("Expect integer."); } } @@ -120,10 +122,15 @@ class GPBUtil if (PHP_INT_SIZE == 8) { $var = intval($var); } else { - $var = bcdiv($var, 1, 0); + if (is_float($var) || + is_integer($var) || + (is_string($var) && + bccomp($var, "9223372036854774784") < 0)) { + $var = number_format($var, 0, ".", ""); + } } } else { - trigger_error("Expect integer.", E_USER_ERROR); + throw new \Exception("Expect integer."); } } @@ -133,10 +140,10 @@ class GPBUtil if (PHP_INT_SIZE == 8) { $var = intval($var); } else { - $var = bcdiv($var, 1, 0); + $var = number_format($var, 0, ".", ""); } } else { - trigger_error("Expect integer.", E_USER_ERROR); + throw new \Exception("Expect integer."); } } @@ -145,7 +152,7 @@ class GPBUtil if (is_float($var) || is_numeric($var)) { $var = floatval($var); } else { - trigger_error("Expect float.", E_USER_ERROR); + throw new \Exception("Expect float."); } } @@ -154,15 +161,14 @@ class GPBUtil if (is_float($var) || is_numeric($var)) { $var = floatval($var); } else { - trigger_error("Expect float.", E_USER_ERROR); + throw new \Exception("Expect float."); } } public static function checkBool(&$var) { if (is_array($var) || is_object($var)) { - trigger_error("Expect boolean.", E_USER_ERROR); - return; + throw new \Exception("Expect boolean."); } $var = boolval($var); } @@ -170,14 +176,14 @@ class GPBUtil public static function checkMessage(&$var, $klass) { if (!$var instanceof $klass && !is_null($var)) { - trigger_error("Expect message.", E_USER_ERROR); + throw new \Exception("Expect message."); } } public static function checkRepeatedField(&$var, $type, $klass = null) { if (!$var instanceof RepeatedField && !is_array($var)) { - trigger_error("Expect array.", E_USER_ERROR); + throw new \Exception("Expect array."); } if (is_array($var)) { $tmp = new RepeatedField($type, $klass); @@ -187,15 +193,13 @@ class GPBUtil return $tmp; } else { if ($var->getType() != $type) { - trigger_error( - "Expect repeated field of different type.", - E_USER_ERROR); + throw new \Exception( + "Expect repeated field of different type."); } if ($var->getType() === GPBType::MESSAGE && $var->getClass() !== $klass) { - trigger_error( - "Expect repeated field of different message.", - E_USER_ERROR); + throw new \Exception( + "Expect repeated field of different message."); } return $var; } @@ -204,7 +208,7 @@ class GPBUtil public static function checkMapField(&$var, $key_type, $value_type, $klass = null) { if (!$var instanceof MapField && !is_array($var)) { - trigger_error("Expect dict.", E_USER_ERROR); + throw new \Exception("Expect dict."); } if (is_array($var)) { $tmp = new MapField($key_type, $value_type, $klass); @@ -214,20 +218,15 @@ class GPBUtil return $tmp; } else { if ($var->getKeyType() != $key_type) { - trigger_error( - "Expect map field of key type.", - E_USER_ERROR); + throw new \Exception("Expect map field of key type."); } if ($var->getValueType() != $value_type) { - trigger_error( - "Expect map field of value type.", - E_USER_ERROR); + throw new \Exception("Expect map field of value type."); } if ($var->getValueType() === GPBType::MESSAGE && $var->getValueClass() !== $klass) { - trigger_error( - "Expect map field of different value message.", - E_USER_ERROR); + throw new \Exception( + "Expect map field of different value message."); } return $var; } @@ -242,4 +241,103 @@ class GPBUtil { return new Uint64($value); } + + public static function getClassNamePrefix( + $classname, + $file_proto) + { + $option = $file_proto->getOptions(); + $prefix = is_null($option) ? "" : $option->getPhpClassPrefix(); + if ($prefix !== "") { + return $prefix; + } + + $reserved_words = array("Empty", "ECHO", "ARRAY"); + foreach ($reserved_words as $reserved_word) { + if ($classname === $reserved_word) { + if ($file_proto->getPackage() === "google.protobuf") { + return "GPB"; + } else { + return "PB"; + } + } + } + + return ""; + } + + public static function getClassNameWithoutPackage( + $name, + $file_proto) + { + $classname = implode('_', array_map('ucwords', explode('.', $name))); + return static::getClassNamePrefix($classname, $file_proto) . $classname; + } + + public static function getFullClassName( + $proto, + $containing, + $file_proto, + &$message_name_without_package, + &$classname, + &$fullname) + { + // Full name needs to start with '.'. + $message_name_without_package = $proto->getName(); + if ($containing !== "") { + $message_name_without_package = + $containing . "." . $message_name_without_package; + } + + $package = $file_proto->getPackage(); + if ($package === "") { + $fullname = "." . $message_name_without_package; + } else { + $fullname = "." . $package . "." . $message_name_without_package; + } + + $class_name_without_package = + static::getClassNameWithoutPackage($message_name_without_package, $file_proto); + + $option = $file_proto->getOptions(); + if (!is_null($option) && $option->hasPhpNamespace()) { + $namespace = $option->getPhpNamespace(); + if ($namespace !== "") { + $classname = $namespace . "\\" . $class_name_without_package; + return; + } else { + $classname = $class_name_without_package; + return; + } + } + + if ($package === "") { + $classname = $class_name_without_package; + } else { + $classname = + implode('\\', array_map('ucwords', explode('.', $package))). + "\\".$class_name_without_package; + } + } + + public static function combineInt32ToInt64($high, $low) + { + $isNeg = $high < 0; + if ($isNeg) { + $high = ~$high; + $low = ~$low; + $low++; + if (!$low) { + $high = (int) ($high + 1); + } + } + $result = bcadd(bcmul($high, 4294967296), $low); + if ($low < 0) { + $result = bcadd($result, 4294967296); + } + if ($isNeg) { + $result = bcsub(0, $result); + } + return $result; + } } diff --git a/php/src/Google/Protobuf/Internal/GPBWire.php b/php/src/Google/Protobuf/Internal/GPBWire.php index 67eb1bee..e7eec552 100644 --- a/php/src/Google/Protobuf/Internal/GPBWire.php +++ b/php/src/Google/Protobuf/Internal/GPBWire.php @@ -117,19 +117,12 @@ class GPBWire // << decode << public static function zigZagEncode32($int32) { - // Fill high 32 bits. - if (PHP_INT_SIZE === 8) { - $int32 |= ((($int32 << 32) >> 31) & (0xFFFFFFFF << 32)); + if (PHP_INT_SIZE == 8) { + $trim_int32 = $int32 & 0xFFFFFFFF; + return (($trim_int32 << 1) ^ ($int32 << 32 >> 63)) & 0xFFFFFFFF; + } else { + return ($int32 << 1) ^ ($int32 >> 31); } - - $uint32 = ($int32 << 1) ^ ($int32 >> 31); - - // Fill high 32 bits. - if (PHP_INT_SIZE === 8) { - $uint32 |= ((($uint32 << 32) >> 31) & (0xFFFFFFFF << 32)); - } - - return $uint32; } public static function zigZagDecode32($uint32) @@ -177,7 +170,11 @@ class GPBWire public static function readInt64(&$input, &$value) { - return $input->readVarint64($value); + $success = $input->readVarint64($value); + if (PHP_INT_SIZE == 4 && bccomp($value, "9223372036854775807") > 0) { + $value = bcsub($value, "18446744073709551616"); + } + return $success; } public static function readUint32(&$input, &$value) @@ -231,7 +228,11 @@ class GPBWire public static function readSfixed64(&$input, &$value) { - return $input->readLittleEndian64($value); + $success = $input->readLittleEndian64($value); + if (PHP_INT_SIZE == 4 && bccomp($value, "9223372036854775807") > 0) { + $value = bcsub($value, "18446744073709551616"); + } + return $success; } public static function readFloat(&$input, &$value) @@ -298,7 +299,7 @@ class GPBWire public static function writeInt32(&$output, $value) { - return $output->writeVarint32($value); + return $output->writeVarint32($value, false); } public static function writeInt64(&$output, $value) @@ -308,7 +309,7 @@ class GPBWire public static function writeUint32(&$output, $value) { - return $output->writeVarint32($value); + return $output->writeVarint32($value, true); } public static function writeUint64(&$output, $value) @@ -319,7 +320,7 @@ class GPBWire public static function writeSint32(&$output, $value) { $value = GPBWire::zigZagEncode32($value); - return $output->writeVarint64($value); + return $output->writeVarint32($value, true); } public static function writeSint64(&$output, $value) @@ -351,9 +352,9 @@ class GPBWire public static function writeBool(&$output, $value) { if ($value) { - return $output->writeVarint32(1); + return $output->writeVarint32(1, true); } else { - return $output->writeVarint32(0); + return $output->writeVarint32(0, true); } } @@ -377,7 +378,7 @@ class GPBWire public static function writeBytes(&$output, $value) { $size = strlen($value); - if (!$output->writeVarint32($size)) { + if (!$output->writeVarint32($size, true)) { return false; } return $output->writeRaw($value, $size); @@ -386,7 +387,7 @@ class GPBWire public static function writeMessage(&$output, $value) { $size = $value->byteSize(); - if (!$output->writeVarint32($size)) { + if (!$output->writeVarint32($size, true)) { return false; } return $value->serializeToStream($output); @@ -442,7 +443,8 @@ class GPBWire public static function varint64Size($value) { if (PHP_INT_SIZE == 4) { - if (bccomp($value, 0) < 0) { + if (bccomp($value, 0) < 0 || + bccomp($value, "9223372036854775807") > 0) { return 10; } if (bccomp($value, 1 << 7) < 0) { @@ -578,6 +580,9 @@ class GPBWire } break; case GPBType::UINT32: + if (PHP_INT_SIZE === 8 && $value < 0) { + $value += 4294967296; + } if (!GPBWire::writeUint32($output, $value)) { return false; } diff --git a/php/src/Google/Protobuf/Internal/GPBWireType.php b/php/src/Google/Protobuf/Internal/GPBWireType.php new file mode 100644 index 00000000..c1ad370e --- /dev/null +++ b/php/src/Google/Protobuf/Internal/GPBWireType.php @@ -0,0 +1,43 @@ +<?php + +// Protocol Buffers - Google's data interchange format +// Copyright 2008 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. + +namespace Google\Protobuf\Internal; + +class GPBWireType +{ + const VARINT = 0; + const FIXED64 = 1; + const LENGTH_DELIMITED = 2; + const START_GROUP = 3; + const END_GROUP = 4; + const FIXED32 = 5; +} diff --git a/php/src/Google/Protobuf/Internal/GeneratedCodeInfo.php b/php/src/Google/Protobuf/Internal/GeneratedCodeInfo.php index 450854f1..ae2ad745 100644 --- a/php/src/Google/Protobuf/Internal/GeneratedCodeInfo.php +++ b/php/src/Google/Protobuf/Internal/GeneratedCodeInfo.php @@ -8,27 +8,22 @@ use Google\Protobuf\Internal\GPBType; use Google\Protobuf\Internal\GPBWire; use Google\Protobuf\Internal\RepeatedField; use Google\Protobuf\Internal\InputStream; - use Google\Protobuf\Internal\GPBUtil; /** - * <pre> * 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. - * </pre> * - * Protobuf type <code>google.protobuf.GeneratedCodeInfo</code> + * Generated from protobuf message <code>google.protobuf.GeneratedCodeInfo</code> */ class GeneratedCodeInfo extends \Google\Protobuf\Internal\Message { /** - * <pre> * An Annotation connects some span of text in generated code to an element * of its generating .proto file. - * </pre> * - * <code>repeated .google.protobuf.GeneratedCodeInfo.Annotation annotation = 1;</code> + * Generated from protobuf field <code>repeated .google.protobuf.GeneratedCodeInfo.Annotation annotation = 1;</code> */ private $annotation; private $has_annotation = false; @@ -39,12 +34,11 @@ class GeneratedCodeInfo extends \Google\Protobuf\Internal\Message } /** - * <pre> * An Annotation connects some span of text in generated code to an element * of its generating .proto file. - * </pre> * - * <code>repeated .google.protobuf.GeneratedCodeInfo.Annotation annotation = 1;</code> + * Generated from protobuf field <code>repeated .google.protobuf.GeneratedCodeInfo.Annotation annotation = 1;</code> + * @return \Google\Protobuf\Internal\RepeatedField */ public function getAnnotation() { @@ -52,18 +46,20 @@ class GeneratedCodeInfo extends \Google\Protobuf\Internal\Message } /** - * <pre> * An Annotation connects some span of text in generated code to an element * of its generating .proto file. - * </pre> * - * <code>repeated .google.protobuf.GeneratedCodeInfo.Annotation annotation = 1;</code> + * Generated from protobuf field <code>repeated .google.protobuf.GeneratedCodeInfo.Annotation annotation = 1;</code> + * @param \Google\Protobuf\Internal\GeneratedCodeInfo_Annotation[]|\Google\Protobuf\Internal\RepeatedField $var + * @return $this */ - public function setAnnotation(&$var) + public function setAnnotation($var) { $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Protobuf\Internal\GeneratedCodeInfo_Annotation::class); $this->annotation = $arr; $this->has_annotation = true; + + return $this; } public function hasAnnotation() diff --git a/php/src/Google/Protobuf/Internal/GeneratedCodeInfo_Annotation.php b/php/src/Google/Protobuf/Internal/GeneratedCodeInfo_Annotation.php index ed22cc38..22ac2337 100644 --- a/php/src/Google/Protobuf/Internal/GeneratedCodeInfo_Annotation.php +++ b/php/src/Google/Protobuf/Internal/GeneratedCodeInfo_Annotation.php @@ -8,51 +8,42 @@ use Google\Protobuf\Internal\GPBType; use Google\Protobuf\Internal\GPBWire; use Google\Protobuf\Internal\RepeatedField; use Google\Protobuf\Internal\InputStream; - use Google\Protobuf\Internal\GPBUtil; /** - * Protobuf type <code>google.protobuf.GeneratedCodeInfo.Annotation</code> + * Generated from protobuf message <code>google.protobuf.GeneratedCodeInfo.Annotation</code> */ class GeneratedCodeInfo_Annotation extends \Google\Protobuf\Internal\Message { /** - * <pre> * Identifies the element in the original source .proto file. This field * is formatted the same as SourceCodeInfo.Location.path. - * </pre> * - * <code>repeated int32 path = 1 [packed = true];</code> + * Generated from protobuf field <code>repeated int32 path = 1 [packed = true];</code> */ private $path; private $has_path = false; /** - * <pre> * Identifies the filesystem path to the original source .proto. - * </pre> * - * <code>optional string source_file = 2;</code> + * Generated from protobuf field <code>optional string source_file = 2;</code> */ private $source_file = ''; private $has_source_file = false; /** - * <pre> * Identifies the starting offset in bytes in the generated code * that relates to the identified object. - * </pre> * - * <code>optional int32 begin = 3;</code> + * Generated from protobuf field <code>optional int32 begin = 3;</code> */ private $begin = 0; private $has_begin = false; /** - * <pre> * 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). - * </pre> * - * <code>optional int32 end = 4;</code> + * Generated from protobuf field <code>optional int32 end = 4;</code> */ private $end = 0; private $has_end = false; @@ -63,12 +54,11 @@ class GeneratedCodeInfo_Annotation extends \Google\Protobuf\Internal\Message } /** - * <pre> * Identifies the element in the original source .proto file. This field * is formatted the same as SourceCodeInfo.Location.path. - * </pre> * - * <code>repeated int32 path = 1 [packed = true];</code> + * Generated from protobuf field <code>repeated int32 path = 1 [packed = true];</code> + * @return \Google\Protobuf\Internal\RepeatedField */ public function getPath() { @@ -76,18 +66,20 @@ class GeneratedCodeInfo_Annotation extends \Google\Protobuf\Internal\Message } /** - * <pre> * Identifies the element in the original source .proto file. This field * is formatted the same as SourceCodeInfo.Location.path. - * </pre> * - * <code>repeated int32 path = 1 [packed = true];</code> + * Generated from protobuf field <code>repeated int32 path = 1 [packed = true];</code> + * @param int[]|\Google\Protobuf\Internal\RepeatedField $var + * @return $this */ - public function setPath(&$var) + public function setPath($var) { $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::INT32); $this->path = $arr; $this->has_path = true; + + return $this; } public function hasPath() @@ -96,11 +88,10 @@ class GeneratedCodeInfo_Annotation extends \Google\Protobuf\Internal\Message } /** - * <pre> * Identifies the filesystem path to the original source .proto. - * </pre> * - * <code>optional string source_file = 2;</code> + * Generated from protobuf field <code>optional string source_file = 2;</code> + * @return string */ public function getSourceFile() { @@ -108,17 +99,19 @@ class GeneratedCodeInfo_Annotation extends \Google\Protobuf\Internal\Message } /** - * <pre> * Identifies the filesystem path to the original source .proto. - * </pre> * - * <code>optional string source_file = 2;</code> + * Generated from protobuf field <code>optional string source_file = 2;</code> + * @param string $var + * @return $this */ public function setSourceFile($var) { GPBUtil::checkString($var, True); $this->source_file = $var; $this->has_source_file = true; + + return $this; } public function hasSourceFile() @@ -127,12 +120,11 @@ class GeneratedCodeInfo_Annotation extends \Google\Protobuf\Internal\Message } /** - * <pre> * Identifies the starting offset in bytes in the generated code * that relates to the identified object. - * </pre> * - * <code>optional int32 begin = 3;</code> + * Generated from protobuf field <code>optional int32 begin = 3;</code> + * @return int */ public function getBegin() { @@ -140,18 +132,20 @@ class GeneratedCodeInfo_Annotation extends \Google\Protobuf\Internal\Message } /** - * <pre> * Identifies the starting offset in bytes in the generated code * that relates to the identified object. - * </pre> * - * <code>optional int32 begin = 3;</code> + * Generated from protobuf field <code>optional int32 begin = 3;</code> + * @param int $var + * @return $this */ public function setBegin($var) { GPBUtil::checkInt32($var); $this->begin = $var; $this->has_begin = true; + + return $this; } public function hasBegin() @@ -160,13 +154,12 @@ class GeneratedCodeInfo_Annotation extends \Google\Protobuf\Internal\Message } /** - * <pre> * 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). - * </pre> * - * <code>optional int32 end = 4;</code> + * Generated from protobuf field <code>optional int32 end = 4;</code> + * @return int */ public function getEnd() { @@ -174,19 +167,21 @@ class GeneratedCodeInfo_Annotation extends \Google\Protobuf\Internal\Message } /** - * <pre> * 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). - * </pre> * - * <code>optional int32 end = 4;</code> + * Generated from protobuf field <code>optional int32 end = 4;</code> + * @param int $var + * @return $this */ public function setEnd($var) { GPBUtil::checkInt32($var); $this->end = $var; $this->has_end = true; + + return $this; } public function hasEnd() diff --git a/php/src/Google/Protobuf/Internal/MapField.php b/php/src/Google/Protobuf/Internal/MapField.php index 55cc12ce..38736dad 100644 --- a/php/src/Google/Protobuf/Internal/MapField.php +++ b/php/src/Google/Protobuf/Internal/MapField.php @@ -38,131 +38,6 @@ namespace Google\Protobuf\Internal; /** - * MapFieldIter is used to iterate MapField. It is also need for the foreach - * syntax. - */ -class MapFieldIter implements \Iterator -{ - - /** - * @ignore - */ - private $container; - - /** - * Create iterator instance for MapField. - * - * @param MapField The MapField instance for which this iterator is - * created. - * @ignore - */ - public function __construct($container) - { - $this->container = $container; - } - - /** - * Reset the status of the iterator - * - * @return void - */ - public function rewind() - { - return reset($this->container); - } - - /** - * Return the element at the current position. - * - * @return object The element at the current position. - */ - public function current() - { - return current($this->container); - } - - /** - * Return the current key. - * - * @return object The current key. - */ - public function key() - { - return key($this->container); - } - - /** - * Move to the next position. - * - * @return void - */ - public function next() - { - return next($this->container); - } - - /** - * Check whether there are more elements to iterate. - * - * @return bool True if there are more elements to iterate. - */ - public function valid() - { - return key($this->container) !== null; - } -} - -/** - * @ignore - */ -function checkKey($key_type, &$key) -{ - switch ($key_type) { - case GPBType::INT32: - GPBUtil::checkInt32($key); - break; - case GPBType::UINT32: - GPBUtil::checkUint32($key); - break; - case GPBType::INT64: - GPBUtil::checkInt64($key); - break; - case GPBType::UINT64: - GPBUtil::checkUint64($key); - break; - case GPBType::FIXED64: - GPBUtil::checkUint64($key); - break; - case GPBType::FIXED32: - GPBUtil::checkUint32($key); - break; - case GPBType::SFIXED64: - GPBUtil::checkInt64($key); - break; - case GPBType::SFIXED32: - GPBUtil::checkInt32($key); - break; - case GPBType::SINT64: - GPBUtil::checkInt64($key); - break; - case GPBType::SINT32: - GPBUtil::checkInt32($key); - break; - case GPBType::BOOL: - GPBUtil::checkBool($key); - break; - case GPBType::STRING: - GPBUtil::checkString($key, true); - break; - default: - trigger_error( - "Given type cannot be map key.", - E_USER_ERROR); - break; - } -} - -/** * MapField is used by generated protocol message classes to manipulate map * fields. It can be used like native PHP array. */ @@ -255,7 +130,7 @@ class MapField implements \ArrayAccess, \IteratorAggregate, \Countable */ public function offsetSet($key, $value) { - checkKey($this->key_type, $key); + $this->checkKey($this->key_type, $key); switch ($this->value_type) { case GPBType::INT32: @@ -306,7 +181,7 @@ class MapField implements \ArrayAccess, \IteratorAggregate, \Countable */ public function offsetUnset($key) { - checkKey($this->key_type, $key); + $this->checkKey($this->key_type, $key); unset($this->container[$key]); } @@ -321,7 +196,7 @@ class MapField implements \ArrayAccess, \IteratorAggregate, \Countable */ public function offsetExists($key) { - checkKey($this->key_type, $key); + $this->checkKey($this->key_type, $key); return isset($this->container[$key]); } @@ -330,7 +205,7 @@ class MapField implements \ArrayAccess, \IteratorAggregate, \Countable */ public function getIterator() { - return new MapFieldIter($this->container); + return new MapFieldIter($this->container, $this->key_type); } /** @@ -344,4 +219,54 @@ class MapField implements \ArrayAccess, \IteratorAggregate, \Countable { return count($this->container); } + + /** + * @ignore + */ + private function checkKey($key_type, &$key) + { + switch ($key_type) { + case GPBType::INT32: + GPBUtil::checkInt32($key); + break; + case GPBType::UINT32: + GPBUtil::checkUint32($key); + break; + case GPBType::INT64: + GPBUtil::checkInt64($key); + break; + case GPBType::UINT64: + GPBUtil::checkUint64($key); + break; + case GPBType::FIXED64: + GPBUtil::checkUint64($key); + break; + case GPBType::FIXED32: + GPBUtil::checkUint32($key); + break; + case GPBType::SFIXED64: + GPBUtil::checkInt64($key); + break; + case GPBType::SFIXED32: + GPBUtil::checkInt32($key); + break; + case GPBType::SINT64: + GPBUtil::checkInt64($key); + break; + case GPBType::SINT32: + GPBUtil::checkInt32($key); + break; + case GPBType::BOOL: + GPBUtil::checkBool($key); + break; + case GPBType::STRING: + GPBUtil::checkString($key, true); + break; + default: + trigger_error( + "Given type cannot be map key.", + E_USER_ERROR); + break; + } + } } diff --git a/php/src/Google/Protobuf/Internal/MapFieldIter.php b/php/src/Google/Protobuf/Internal/MapFieldIter.php new file mode 100644 index 00000000..88e6c8b2 --- /dev/null +++ b/php/src/Google/Protobuf/Internal/MapFieldIter.php @@ -0,0 +1,124 @@ +<?php + +// Protocol Buffers - Google's data interchange format +// Copyright 2008 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. + +/** + * MapField and MapFieldIter are used by generated protocol message classes to + * manipulate map fields. + */ + +namespace Google\Protobuf\Internal; + +/** + * MapFieldIter is used to iterate MapField. It is also need for the foreach + * syntax. + */ +class MapFieldIter implements \Iterator +{ + + /** + * @ignore + */ + private $container; + + /** + * Create iterator instance for MapField. + * + * @param MapField The MapField instance for which this iterator is + * created. + * @param GPBType Map key type. + * @ignore + */ + public function __construct($container, $key_type) + { + $this->container = $container; + $this->key_type = $key_type; + } + + /** + * Reset the status of the iterator + * + * @return void + */ + public function rewind() + { + return reset($this->container); + } + + /** + * Return the element at the current position. + * + * @return object The element at the current position. + */ + public function current() + { + return current($this->container); + } + + /** + * Return the current key. + * + * @return object The current key. + */ + public function key() + { + $key = key($this->container); + if ($this->key_type === GPBType::BOOL) { + // PHP associative array stores bool as integer for key. + return boolval($key); + } elseif ($this->key_type === GPBType::STRING) { + // PHP associative array stores int string as int for key. + return strval($key); + } else { + return $key; + } + } + + /** + * Move to the next position. + * + * @return void + */ + public function next() + { + return next($this->container); + } + + /** + * Check whether there are more elements to iterate. + * + * @return bool True if there are more elements to iterate. + */ + public function valid() + { + return key($this->container) !== null; + } +} diff --git a/php/src/Google/Protobuf/Internal/Message.php b/php/src/Google/Protobuf/Internal/Message.php index cd15e0f0..1ecd4fa2 100644 --- a/php/src/Google/Protobuf/Internal/Message.php +++ b/php/src/Google/Protobuf/Internal/Message.php @@ -36,8 +36,8 @@ namespace Google\Protobuf\Internal; -use Google\Protobuf\Internal\InputStream; -use Google\Protobuf\Internal\OutputStream; +use Google\Protobuf\Internal\CodedInputStream; +use Google\Protobuf\Internal\CodedOutputStream; use Google\Protobuf\Internal\DescriptorPool; use Google\Protobuf\Internal\GPBLabel; use Google\Protobuf\Internal\GPBType; @@ -68,6 +68,10 @@ class Message // specific descriptor from the descriptor pool. if (get_class($this) === 'Google\Protobuf\Internal\MapEntry') { $this->desc = $desc; + foreach ($desc->getField() as $field) { + $setter = $field->getSetter(); + $this->$setter($this->defaultValue($field)); + } return; } $pool = DescriptorPool::getGeneratedPool(); @@ -219,6 +223,58 @@ class Message /** * @ignore */ + private static function skipField($input, $tag) + { + $number = GPBWire::getTagFieldNumber($tag); + if ($number === 0) { + throw new GPBDecodeException("Illegal field number zero."); + } + + switch (GPBWire::getTagWireType($tag)) { + case GPBWireType::VARINT: + $uint64 = 0; + if (!$input->readVarint64($uint64)) { + throw new GPBDecodeException( + "Unexpected EOF inside varint."); + } + return; + case GPBWireType::FIXED64: + $uint64 = 0; + if (!$input->readLittleEndian64($uint64)) { + throw new GPBDecodeException( + "Unexpected EOF inside fixed64."); + } + return; + case GPBWireType::FIXED32: + $uint32 = 0; + if (!$input->readLittleEndian32($uint32)) { + throw new GPBDecodeException( + "Unexpected EOF inside fixed32."); + } + return; + case GPBWireType::LENGTH_DELIMITED: + $length = 0; + if (!$input->readVarint32($length)) { + throw new GPBDecodeException( + "Unexpected EOF inside length."); + } + $data = NULL; + if (!$input->readRaw($length, $data)) { + throw new GPBDecodeException( + "Unexpected EOF inside length delimited data."); + } + return; + case GPBWireType::START_GROUP: + case GPBWireType::END_GROUP: + throw new GPBDecodeException("Unexpected wire type."); + default: + throw new GPBDecodeException("Unexpected wire type."); + } + } + + /** + * @ignore + */ private static function parseFieldFromStreamNoTag($input, $field, &$value) { switch ($field->getType()) { @@ -278,7 +334,6 @@ class Message } break; case GPBType::GROUP: - echo "GROUP\xA"; trigger_error("Not implemented.", E_ERROR); break; case GPBType::MESSAGE: @@ -349,19 +404,25 @@ class Message private function parseFieldFromStream($tag, $input, $field) { $value = null; - $field_type = $field->getType(); - $value_format = GPBWire::UNKNOWN; - if (GPBWire::getTagWireType($tag) === - GPBWire::getWireType($field_type)) { + if (is_null($field)) { + $value_format = GPBWire::UNKNOWN; + } elseif (GPBWire::getTagWireType($tag) === + GPBWire::getWireType($field->getType())) { $value_format = GPBWire::NORMAL_FORMAT; } elseif ($field->isPackable() && GPBWire::getTagWireType($tag) === GPBWire::WIRETYPE_LENGTH_DELIMITED) { $value_format = GPBWire::PACKED_FORMAT; + } else { + // the wire type doesn't match. Put it in our unknown field set. + $value_format = GPBWire::UNKNOWN; } - if ($value_format === GPBWire::NORMAL_FORMAT) { + if ($value_format === GPBWire::UNKNOWN) { + self::skipField($input, $tag); + return; + } elseif ($value_format === GPBWire::NORMAL_FORMAT) { self::parseFieldFromStreamNoTag($input, $field, $value); } elseif ($value_format === GPBWire::PACKED_FORMAT) { $length = 0; @@ -373,20 +434,18 @@ class Message $getter = $field->getGetter(); while ($input->bytesUntilLimit() > 0) { self::parseFieldFromStreamNoTag($input, $field, $value); - $this->$getter()[] = $value; + $this->appendHelper($field, $value); } $input->popLimit($limit); return; } else { - return false; + return; } if ($field->isMap()) { - $getter = $field->getGetter(); - $this->$getter()[$value->getKey()] = $value->getValue(); + $this->kvUpdateHelper($field, $value->getKey(), $value->getValue()); } else if ($field->isRepeated()) { - $getter = $field->getGetter(); - $this->$getter()[] = $value; + $this->appendHelper($field, $value); } else { $setter = $field->getSetter(); $this->$setter($value); @@ -533,9 +592,10 @@ class Message $klass = $value_field->getMessageType()->getClass(); $copy = new $klass; $copy->mergeFrom($value); - $this->$getter()[$key] = $copy; + + $this->kvUpdateHelper($field, $key, $copy); } else { - $this->$getter()[$key] = $value; + $this->kvUpdateHelper($field, $key, $value); } } } @@ -546,9 +606,9 @@ class Message $klass = $field->getMessageType()->getClass(); $copy = new $klass; $copy->mergeFrom($tmp); - $this->$getter()[] = $copy; + $this->appendHelper($field, $copy); } else { - $this->$getter()[] = $tmp; + $this->appendHelper($field, $tmp); } } } @@ -584,11 +644,29 @@ class Message */ public function mergeFromString($data) { - $input = new InputStream($data); + $input = new CodedInputStream($data); $this->parseFromStream($input); } /** + * Parses a json string to protobuf message. + * + * This function takes a string in the json wire format, matching the + * encoding output by serializeToJsonString(). + * See mergeFrom() for merging behavior, if the field is already set in the + * specified message. + * + * @param string $data Json protobuf data. + * @return null. + * @throws Exception Invalid data. + */ + public function mergeFromJsonString($data) + { + $input = new RawInputStream($data); + $this->parseFromJsonStream($input); + } + + /** * @ignore */ public function parseFromStream($input) @@ -603,12 +681,233 @@ class Message $number = GPBWire::getTagFieldNumber($tag); $field = $this->desc->getFieldByNumber($number); - // Check whether we retrieved a known field - if ($field === NULL) { - continue; + $this->parseFieldFromStream($tag, $input, $field); + } + } + + private function convertJsonValueToProtoValue( + $value, + $field, + $is_map_key = false) + { + if (is_null($value)) { + return $this->defaultValue($field); + } + switch ($field->getType()) { + case GPBType::MESSAGE: + $klass = $field->getMessageType()->getClass(); + if (!is_object($value) && !is_array($value)) { + throw new \Exception("Expect message."); + } + $submsg = new $klass; + if (!is_null($value) && + $klass !== "Google\Protobuf\Any") { + $submsg->mergeFromJsonArray($value); + } + return $submsg; + case GPBType::ENUM: + if (is_integer($value)) { + return $value; + } else { + $enum_value = + $field->getEnumType()->getValueByName($value); + } + if (!is_null($enum_value)) { + return $enum_value->getNumber(); + } + case GPBType::STRING: + if (!is_string($value)) { + throw new GPBDecodeException("Expect string"); + } + return $value; + case GPBType::BYTES: + if (!is_string($value)) { + throw new GPBDecodeException("Expect string"); + } + $proto_value = base64_decode($value, true); + if ($proto_value === false) { + throw new GPBDecodeException( + "Invalid base64 characters"); + } + return $proto_value; + case GPBType::BOOL: + if ($is_map_key) { + if ($value === "true") { + return true; + } + if ($value === "false") { + return false; + } + throw new GPBDecodeException( + "Bool field only accept bool value"); + } + if (!is_bool($value)) { + throw new GPBDecodeException( + "Bool field only accept bool value"); + } + return $value; + case GPBType::FLOAT: + if ($value === "Infinity") { + return INF; + } + if ($value === "-Infinity") { + return -INF; + } + if ($value === "NaN") { + return NAN; + } + return $value; + case GPBType::DOUBLE: + if ($value === "Infinity") { + return INF; + } + if ($value === "-Infinity") { + return -INF; + } + if ($value === "NaN") { + return NAN; + } + return $value; + case GPBType::INT32: + if (!is_numeric($value)) { + throw new GPBDecodeException( + "Invalid data type for int32 field"); + } + if (bccomp($value, "2147483647") > 0) { + throw new GPBDecodeException( + "Int32 too large"); + } + if (bccomp($value, "-2147483648") < 0) { + throw new GPBDecodeException( + "Int32 too small"); + } + return $value; + case GPBType::UINT32: + if (!is_numeric($value)) { + throw new GPBDecodeException( + "Invalid data type for uint32 field"); + } + if (bccomp($value, 4294967295) > 0) { + throw new GPBDecodeException( + "Uint32 too large"); + } + return $value; + case GPBType::INT64: + if (!is_numeric($value)) { + throw new GPBDecodeException( + "Invalid data type for int64 field"); + } + if (bccomp($value, "9223372036854775807") > 0) { + throw new GPBDecodeException( + "Int64 too large"); + } + if (bccomp($value, "-9223372036854775808") < 0) { + throw new GPBDecodeException( + "Int64 too small"); + } + return $value; + case GPBType::UINT64: + if (!is_numeric($value)) { + throw new GPBDecodeException( + "Invalid data type for int64 field"); + } + if (bccomp($value, "18446744073709551615") > 0) { + throw new GPBDecodeException( + "Uint64 too large"); + } + if (bccomp($value, "9223372036854775807") > 0) { + $value = bcsub($value, "18446744073709551616"); + } + return $value; + case GPBType::FIXED64: + return $value; + default: + return $value; + } + } + + private function mergeFromJsonArray($array) + { + foreach ($array as $key => $value) { + $field = $this->desc->getFieldByJsonName($key); + if (is_null($field)) { + $field = $this->desc->getFieldByName($key); + if (is_null($field)) { + continue; + } } + $setter = $field->getSetter(); + if ($field->isMap()) { + if (is_null($value)) { + continue; + } + $getter = $field->getGetter(); + $key_field = $field->getMessageType()->getFieldByNumber(1); + $value_field = $field->getMessageType()->getFieldByNumber(2); + foreach ($value as $tmp_key => $tmp_value) { + if (is_null($tmp_value)) { + throw new \Exception( + "Map value field element cannot be null."); + } + $proto_key = + $this->convertJsonValueToProtoValue( + $tmp_key, + $key_field, + true); + $proto_value = + $this->convertJsonValueToProtoValue( + $tmp_value, + $value_field); + $this->$getter()[$proto_key] = $proto_value; + } + } else if ($field->isRepeated()) { + if (is_null($value)) { + continue; + } + $getter = $field->getGetter(); + foreach ($value as $tmp) { + if (is_null($tmp)) { + throw new \Exception( + "Repeated field elements cannot be null."); + } + $proto_value = + $this->convertJsonValueToProtoValue($tmp, $field); + $this->$getter()[] = $proto_value; + } + } else { + $setter = $field->getSetter(); + $proto_value = + $this->convertJsonValueToProtoValue($value, $field); + if ($field->getType() === GPBType::MESSAGE) { + if (is_null($proto_value)) { + continue; + } + $getter = $field->getGetter(); + $submsg = $this->$getter(); + if (!is_null($submsg)) { + $submsg->mergeFrom($proto_value); + continue; + } + } + $this->$setter($proto_value); + } + } + } - $this->parseFieldFromStream($tag, $input, $field); + /** + * @ignore + */ + public function parseFromJsonStream($input) + { + $array = json_decode($input->getData(), JSON_BIGINT_AS_STRING); + if (is_null($array)) { + throw new GPBDecodeException( + "Cannot decode json string."); + } + try { + $this->mergeFromJsonArray($array); + } catch (Exception $e) { + throw new GPBDecodeException($e->getMessage()); } } @@ -651,7 +950,7 @@ class Message foreach ($values as $value) { $size += $this->fieldDataOnlyByteSize($field, $value); } - if (!$output->writeVarint32($size)) { + if (!$output->writeVarint32($size, true)) { return false; } } @@ -712,6 +1011,16 @@ class Message /** * @ignore */ + private function serializeFieldToJsonStream(&$output, $field) + { + $getter = $field->getGetter(); + $values = $this->$getter(); + return GPBJsonWire::serializeFieldToStream($values, $field, $output); + } + + /** + * @ignore + */ public function serializeToStream(&$output) { $fields = $this->desc->getField(); @@ -724,24 +1033,72 @@ class Message } /** + * @ignore + */ + public function serializeToJsonStream(&$output) + { + $output->writeRaw("{", 1); + $fields = $this->desc->getField(); + $first = true; + foreach ($fields as $field) { + if ($this->existField($field)) { + if ($first) { + $first = false; + } else { + $output->writeRaw(",", 1); + } + if (!$this->serializeFieldToJsonStream($output, $field)) { + return false; + } + } + } + $output->writeRaw("}", 1); + return true; + } + + /** * Serialize the message to string. * @return string Serialized binary protobuf data. */ public function serializeToString() { - $output = new OutputStream($this->byteSize()); + $output = new CodedOutputStream($this->byteSize()); $this->serializeToStream($output); return $output->getData(); } /** + * Serialize the message to json string. + * @return string Serialized json protobuf data. + */ + public function serializeToJsonString() + { + $output = new CodedOutputStream($this->jsonByteSize()); + $this->serializeToJsonStream($output); + return $output->getData(); + } + + /** * @ignore */ private function existField($field) { + $oneof_index = $field->getOneofIndex(); + if ($oneof_index !== -1) { + $oneof = $this->desc->getOneofDecl()[$oneof_index]; + $oneof_name = $oneof->getName(); + return $this->$oneof_name->getNumber() === $field->getNumber(); + } + $getter = $field->getGetter(); - $value = $this->$getter(); - return $value !== $this->defaultValue($field); + $values = $this->$getter(); + if ($field->isMap()) { + return count($values) !== 0; + } elseif ($field->isRepeated()) { + return count($values) !== 0; + } else { + return $values !== $this->defaultValue($field); + } } /** @@ -824,6 +1181,101 @@ class Message /** * @ignore */ + private function fieldDataOnlyJsonByteSize($field, $value) + { + $size = 0; + + switch ($field->getType()) { + case GPBType::SFIXED32: + case GPBType::SINT32: + case GPBType::INT32: + $size += strlen(strval($value)); + break; + case GPBType::FIXED32: + case GPBType::UINT32: + if ($value < 0) { + $value = bcadd($value, "4294967296"); + } + $size += strlen(strval($value)); + break; + case GPBType::FIXED64: + case GPBType::UINT64: + if ($value < 0) { + $value = bcadd($value, "18446744073709551616"); + } + // Intentional fall through. + case GPBType::SFIXED64: + case GPBType::INT64: + case GPBType::SINT64: + $size += 2; // size for "" + $size += strlen(strval($value)); + break; + case GPBType::FLOAT: + if (is_nan($value)) { + $size += strlen("NaN") + 2; + } elseif ($value === INF) { + $size += strlen("Infinity") + 2; + } elseif ($value === -INF) { + $size += strlen("-Infinity") + 2; + } else { + $size += strlen(sprintf("%.8g", $value)); + } + break; + case GPBType::DOUBLE: + if (is_nan($value)) { + $size += strlen("NaN") + 2; + } elseif ($value === INF) { + $size += strlen("Infinity") + 2; + } elseif ($value === -INF) { + $size += strlen("-Infinity") + 2; + } else { + $size += strlen(sprintf("%.17g", $value)); + } + break; + case GPBType::ENUM: + $enum_desc = $field->getEnumType(); + $enum_value_desc = $enum_desc->getValueByNumber($value); + if (!is_null($enum_value_desc)) { + $size += 2; // size for "" + $size += strlen($enum_value_desc->getName()); + } else { + $str_value = strval($value); + $size += strlen($str_value); + } + break; + case GPBType::BOOL: + if ($value) { + $size += 4; + } else { + $size += 5; + } + break; + case GPBType::STRING: + $value = json_encode($value); + $size += strlen($value); + break; + case GPBType::BYTES: + $size += strlen(base64_encode($value)); + $size += 2; // size for \"\" + break; + case GPBType::MESSAGE: + $size += $value->jsonByteSize(); + break; +# case GPBType::GROUP: +# // TODO(teboring): Add support. +# user_error("Unsupported type."); +# break; + default: + user_error("Unsupported type " . $field->getType()); + return 0; + } + + return $size; + } + + /** + * @ignore + */ private function fieldByteSize($field) { $size = 0; @@ -838,12 +1290,18 @@ class Message $value_field = $message_type->getFieldByNumber(2); foreach ($values as $key => $value) { $data_size = 0; - $data_size += $this->fieldDataOnlyByteSize($key_field, $key); - $data_size += $this->fieldDataOnlyByteSize( - $value_field, - $value); - $data_size += GPBWire::tagSize($key_field); - $data_size += GPBWire::tagSize($value_field); + if ($key != $this->defaultValue($key_field)) { + $data_size += $this->fieldDataOnlyByteSize( + $key_field, + $key); + $data_size += GPBWire::tagSize($key_field); + } + if ($value != $this->defaultValue($value_field)) { + $data_size += $this->fieldDataOnlyByteSize( + $value_field, + $value); + $data_size += GPBWire::tagSize($value_field); + } $size += GPBWire::varint32Size($data_size) + $data_size; } } @@ -879,6 +1337,68 @@ class Message /** * @ignore */ + private function fieldJsonByteSize($field) + { + $size = 0; + if ($field->isMap()) { + $getter = $field->getGetter(); + $values = $this->$getter(); + $count = count($values); + if ($count !== 0) { + $size += 5; // size for "\"\":{}". + $size += strlen($field->getJsonName()); // size for field name + $size += $count - 1; // size for commas + $getter = $field->getGetter(); + $map_entry = $field->getMessageType(); + $key_field = $map_entry->getFieldByNumber(1); + $value_field = $map_entry->getFieldByNumber(2); + switch ($key_field->getType()) { + case GPBType::STRING: + case GPBType::SFIXED64: + case GPBType::INT64: + case GPBType::SINT64: + case GPBType::FIXED64: + case GPBType::UINT64: + $additional_quote = false; + break; + default: + $additional_quote = true; + } + foreach ($values as $key => $value) { + if ($additional_quote) { + $size += 2; // size for "" + } + $size += $this->fieldDataOnlyJsonByteSize($key_field, $key); + $size += $this->fieldDataOnlyJsonByteSize($value_field, $value); + $size += 1; // size for : + } + } + } elseif ($field->isRepeated()) { + $getter = $field->getGetter(); + $values = $this->$getter(); + $count = count($values); + if ($count !== 0) { + $size += 5; // size for "\"\":[]". + $size += strlen($field->getJsonName()); // size for field name + $size += $count - 1; // size for commas + $getter = $field->getGetter(); + foreach ($values as $value) { + $size += $this->fieldDataOnlyJsonByteSize($field, $value); + } + } + } elseif ($this->existField($field)) { + $size += 3; // size for "\"\":". + $size += strlen($field->getJsonName()); // size for field name + $getter = $field->getGetter(); + $value = $this->$getter(); + $size += $this->fieldDataOnlyJsonByteSize($field, $value); + } + return $size; + } + + /** + * @ignore + */ public function byteSize() { $size = 0; @@ -889,4 +1409,54 @@ class Message } return $size; } + + private function appendHelper($field, $append_value) + { + $getter = $field->getGetter(); + $setter = $field->getSetter(); + + $field_arr_value = $this->$getter(); + $field_arr_value[] = $append_value; + + if (!is_object($field_arr_value)) { + $this->$setter($field_arr_value); + } + } + + private function kvUpdateHelper($field, $update_key, $update_value) + { + $getter = $field->getGetter(); + $setter = $field->getSetter(); + + $field_arr_value = $this->$getter(); + $field_arr_value[$update_key] = $update_value; + + if (!is_object($field_arr_value)) { + $this->$setter($field_arr_value); + } + } + + /** + * @ignore + */ + public function jsonByteSize() + { + $size = 0; + + // Size for "{}". + $size += 2; + + $fields = $this->desc->getField(); + $count = 0; + foreach ($fields as $field) { + $field_size = $this->fieldJsonByteSize($field); + $size += $field_size; + if ($field_size != 0) { + $count++; + } + } + // size for comma + $size += $count > 0 ? ($count - 1) : 0; + return $size; + } } diff --git a/php/src/Google/Protobuf/Internal/MessageOptions.php b/php/src/Google/Protobuf/Internal/MessageOptions.php index 747f3294..99ff3d0e 100644 --- a/php/src/Google/Protobuf/Internal/MessageOptions.php +++ b/php/src/Google/Protobuf/Internal/MessageOptions.php @@ -8,16 +8,14 @@ use Google\Protobuf\Internal\GPBType; use Google\Protobuf\Internal\GPBWire; use Google\Protobuf\Internal\RepeatedField; use Google\Protobuf\Internal\InputStream; - use Google\Protobuf\Internal\GPBUtil; /** - * Protobuf type <code>google.protobuf.MessageOptions</code> + * Generated from protobuf message <code>google.protobuf.MessageOptions</code> */ class MessageOptions extends \Google\Protobuf\Internal\Message { /** - * <pre> * 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 @@ -33,41 +31,35 @@ class MessageOptions extends \Google\Protobuf\Internal\Message * be int32s, enums, or repeated messages. * Because this is an option, the above two restrictions are not enforced by * the protocol compiler. - * </pre> * - * <code>optional bool message_set_wire_format = 1 [default = false];</code> + * Generated from protobuf field <code>optional bool message_set_wire_format = 1 [default = false];</code> */ private $message_set_wire_format = false; private $has_message_set_wire_format = false; /** - * <pre> * 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". - * </pre> * - * <code>optional bool no_standard_descriptor_accessor = 2 [default = false];</code> + * Generated from protobuf field <code>optional bool no_standard_descriptor_accessor = 2 [default = false];</code> */ private $no_standard_descriptor_accessor = false; private $has_no_standard_descriptor_accessor = false; /** - * <pre> * 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. - * </pre> * - * <code>optional bool deprecated = 3 [default = false];</code> + * Generated from protobuf field <code>optional bool deprecated = 3 [default = false];</code> */ private $deprecated = false; private $has_deprecated = false; /** - * <pre> * Whether the message is an automatically generated map entry type for the * maps field. * For maps fields: - * map<KeyType, ValueType> map_field = 1; + * map<KeyType, ValueType> map_field = 1; * The parsed descriptor looks like: * message MapFieldEntry { * option map_entry = true; @@ -82,18 +74,15 @@ class MessageOptions extends \Google\Protobuf\Internal\Message * 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. - * </pre> * - * <code>optional bool map_entry = 7;</code> + * Generated from protobuf field <code>optional bool map_entry = 7;</code> */ private $map_entry = false; private $has_map_entry = false; /** - * <pre> * The parser stores options it doesn't recognize here. See above. - * </pre> * - * <code>repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;</code> + * Generated from protobuf field <code>repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;</code> */ private $uninterpreted_option; private $has_uninterpreted_option = false; @@ -104,7 +93,6 @@ class MessageOptions extends \Google\Protobuf\Internal\Message } /** - * <pre> * 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 @@ -120,9 +108,9 @@ class MessageOptions extends \Google\Protobuf\Internal\Message * be int32s, enums, or repeated messages. * Because this is an option, the above two restrictions are not enforced by * the protocol compiler. - * </pre> * - * <code>optional bool message_set_wire_format = 1 [default = false];</code> + * Generated from protobuf field <code>optional bool message_set_wire_format = 1 [default = false];</code> + * @return bool */ public function getMessageSetWireFormat() { @@ -130,7 +118,6 @@ class MessageOptions extends \Google\Protobuf\Internal\Message } /** - * <pre> * 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 @@ -146,15 +133,18 @@ class MessageOptions extends \Google\Protobuf\Internal\Message * be int32s, enums, or repeated messages. * Because this is an option, the above two restrictions are not enforced by * the protocol compiler. - * </pre> * - * <code>optional bool message_set_wire_format = 1 [default = false];</code> + * Generated from protobuf field <code>optional bool message_set_wire_format = 1 [default = false];</code> + * @param bool $var + * @return $this */ public function setMessageSetWireFormat($var) { GPBUtil::checkBool($var); $this->message_set_wire_format = $var; $this->has_message_set_wire_format = true; + + return $this; } public function hasMessageSetWireFormat() @@ -163,13 +153,12 @@ class MessageOptions extends \Google\Protobuf\Internal\Message } /** - * <pre> * 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". - * </pre> * - * <code>optional bool no_standard_descriptor_accessor = 2 [default = false];</code> + * Generated from protobuf field <code>optional bool no_standard_descriptor_accessor = 2 [default = false];</code> + * @return bool */ public function getNoStandardDescriptorAccessor() { @@ -177,19 +166,21 @@ class MessageOptions extends \Google\Protobuf\Internal\Message } /** - * <pre> * 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". - * </pre> * - * <code>optional bool no_standard_descriptor_accessor = 2 [default = false];</code> + * Generated from protobuf field <code>optional bool no_standard_descriptor_accessor = 2 [default = false];</code> + * @param bool $var + * @return $this */ public function setNoStandardDescriptorAccessor($var) { GPBUtil::checkBool($var); $this->no_standard_descriptor_accessor = $var; $this->has_no_standard_descriptor_accessor = true; + + return $this; } public function hasNoStandardDescriptorAccessor() @@ -198,14 +189,13 @@ class MessageOptions extends \Google\Protobuf\Internal\Message } /** - * <pre> * 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. - * </pre> * - * <code>optional bool deprecated = 3 [default = false];</code> + * Generated from protobuf field <code>optional bool deprecated = 3 [default = false];</code> + * @return bool */ public function getDeprecated() { @@ -213,20 +203,22 @@ class MessageOptions extends \Google\Protobuf\Internal\Message } /** - * <pre> * 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. - * </pre> * - * <code>optional bool deprecated = 3 [default = false];</code> + * Generated from protobuf field <code>optional bool deprecated = 3 [default = false];</code> + * @param bool $var + * @return $this */ public function setDeprecated($var) { GPBUtil::checkBool($var); $this->deprecated = $var; $this->has_deprecated = true; + + return $this; } public function hasDeprecated() @@ -235,11 +227,10 @@ class MessageOptions extends \Google\Protobuf\Internal\Message } /** - * <pre> * Whether the message is an automatically generated map entry type for the * maps field. * For maps fields: - * map<KeyType, ValueType> map_field = 1; + * map<KeyType, ValueType> map_field = 1; * The parsed descriptor looks like: * message MapFieldEntry { * option map_entry = true; @@ -254,9 +245,9 @@ class MessageOptions extends \Google\Protobuf\Internal\Message * 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. - * </pre> * - * <code>optional bool map_entry = 7;</code> + * Generated from protobuf field <code>optional bool map_entry = 7;</code> + * @return bool */ public function getMapEntry() { @@ -264,11 +255,10 @@ class MessageOptions extends \Google\Protobuf\Internal\Message } /** - * <pre> * Whether the message is an automatically generated map entry type for the * maps field. * For maps fields: - * map<KeyType, ValueType> map_field = 1; + * map<KeyType, ValueType> map_field = 1; * The parsed descriptor looks like: * message MapFieldEntry { * option map_entry = true; @@ -283,15 +273,18 @@ class MessageOptions extends \Google\Protobuf\Internal\Message * 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. - * </pre> * - * <code>optional bool map_entry = 7;</code> + * Generated from protobuf field <code>optional bool map_entry = 7;</code> + * @param bool $var + * @return $this */ public function setMapEntry($var) { GPBUtil::checkBool($var); $this->map_entry = $var; $this->has_map_entry = true; + + return $this; } public function hasMapEntry() @@ -300,11 +293,10 @@ class MessageOptions extends \Google\Protobuf\Internal\Message } /** - * <pre> * The parser stores options it doesn't recognize here. See above. - * </pre> * - * <code>repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;</code> + * Generated from protobuf field <code>repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;</code> + * @return \Google\Protobuf\Internal\RepeatedField */ public function getUninterpretedOption() { @@ -312,17 +304,19 @@ class MessageOptions extends \Google\Protobuf\Internal\Message } /** - * <pre> * The parser stores options it doesn't recognize here. See above. - * </pre> * - * <code>repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;</code> + * Generated from protobuf field <code>repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;</code> + * @param \Google\Protobuf\Internal\UninterpretedOption[]|\Google\Protobuf\Internal\RepeatedField $var + * @return $this */ - public function setUninterpretedOption(&$var) + public function setUninterpretedOption($var) { $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Protobuf\Internal\UninterpretedOption::class); $this->uninterpreted_option = $arr; $this->has_uninterpreted_option = true; + + return $this; } public function hasUninterpretedOption() diff --git a/php/src/Google/Protobuf/Internal/MethodDescriptorProto.php b/php/src/Google/Protobuf/Internal/MethodDescriptorProto.php index 3d8df7af..ccfce2db 100644 --- a/php/src/Google/Protobuf/Internal/MethodDescriptorProto.php +++ b/php/src/Google/Protobuf/Internal/MethodDescriptorProto.php @@ -8,58 +8,49 @@ use Google\Protobuf\Internal\GPBType; use Google\Protobuf\Internal\GPBWire; use Google\Protobuf\Internal\RepeatedField; use Google\Protobuf\Internal\InputStream; - use Google\Protobuf\Internal\GPBUtil; /** - * <pre> * Describes a method of a service. - * </pre> * - * Protobuf type <code>google.protobuf.MethodDescriptorProto</code> + * Generated from protobuf message <code>google.protobuf.MethodDescriptorProto</code> */ class MethodDescriptorProto extends \Google\Protobuf\Internal\Message { /** - * <code>optional string name = 1;</code> + * Generated from protobuf field <code>optional string name = 1;</code> */ private $name = ''; private $has_name = false; /** - * <pre> * Input and output type names. These are resolved in the same way as * FieldDescriptorProto.type_name, but must refer to a message type. - * </pre> * - * <code>optional string input_type = 2;</code> + * Generated from protobuf field <code>optional string input_type = 2;</code> */ private $input_type = ''; private $has_input_type = false; /** - * <code>optional string output_type = 3;</code> + * Generated from protobuf field <code>optional string output_type = 3;</code> */ private $output_type = ''; private $has_output_type = false; /** - * <code>optional .google.protobuf.MethodOptions options = 4;</code> + * Generated from protobuf field <code>optional .google.protobuf.MethodOptions options = 4;</code> */ private $options = null; private $has_options = false; /** - * <pre> * Identifies if client streams multiple client messages - * </pre> * - * <code>optional bool client_streaming = 5 [default = false];</code> + * Generated from protobuf field <code>optional bool client_streaming = 5 [default = false];</code> */ private $client_streaming = false; private $has_client_streaming = false; /** - * <pre> * Identifies if server streams multiple server messages - * </pre> * - * <code>optional bool server_streaming = 6 [default = false];</code> + * Generated from protobuf field <code>optional bool server_streaming = 6 [default = false];</code> */ private $server_streaming = false; private $has_server_streaming = false; @@ -70,7 +61,8 @@ class MethodDescriptorProto extends \Google\Protobuf\Internal\Message } /** - * <code>optional string name = 1;</code> + * Generated from protobuf field <code>optional string name = 1;</code> + * @return string */ public function getName() { @@ -78,13 +70,17 @@ class MethodDescriptorProto extends \Google\Protobuf\Internal\Message } /** - * <code>optional string name = 1;</code> + * Generated from protobuf field <code>optional string name = 1;</code> + * @param string $var + * @return $this */ public function setName($var) { GPBUtil::checkString($var, True); $this->name = $var; $this->has_name = true; + + return $this; } public function hasName() @@ -93,12 +89,11 @@ class MethodDescriptorProto extends \Google\Protobuf\Internal\Message } /** - * <pre> * Input and output type names. These are resolved in the same way as * FieldDescriptorProto.type_name, but must refer to a message type. - * </pre> * - * <code>optional string input_type = 2;</code> + * Generated from protobuf field <code>optional string input_type = 2;</code> + * @return string */ public function getInputType() { @@ -106,18 +101,20 @@ class MethodDescriptorProto extends \Google\Protobuf\Internal\Message } /** - * <pre> * Input and output type names. These are resolved in the same way as * FieldDescriptorProto.type_name, but must refer to a message type. - * </pre> * - * <code>optional string input_type = 2;</code> + * Generated from protobuf field <code>optional string input_type = 2;</code> + * @param string $var + * @return $this */ public function setInputType($var) { GPBUtil::checkString($var, True); $this->input_type = $var; $this->has_input_type = true; + + return $this; } public function hasInputType() @@ -126,7 +123,8 @@ class MethodDescriptorProto extends \Google\Protobuf\Internal\Message } /** - * <code>optional string output_type = 3;</code> + * Generated from protobuf field <code>optional string output_type = 3;</code> + * @return string */ public function getOutputType() { @@ -134,13 +132,17 @@ class MethodDescriptorProto extends \Google\Protobuf\Internal\Message } /** - * <code>optional string output_type = 3;</code> + * Generated from protobuf field <code>optional string output_type = 3;</code> + * @param string $var + * @return $this */ public function setOutputType($var) { GPBUtil::checkString($var, True); $this->output_type = $var; $this->has_output_type = true; + + return $this; } public function hasOutputType() @@ -149,7 +151,8 @@ class MethodDescriptorProto extends \Google\Protobuf\Internal\Message } /** - * <code>optional .google.protobuf.MethodOptions options = 4;</code> + * Generated from protobuf field <code>optional .google.protobuf.MethodOptions options = 4;</code> + * @return \Google\Protobuf\Internal\MethodOptions */ public function getOptions() { @@ -157,13 +160,17 @@ class MethodDescriptorProto extends \Google\Protobuf\Internal\Message } /** - * <code>optional .google.protobuf.MethodOptions options = 4;</code> + * Generated from protobuf field <code>optional .google.protobuf.MethodOptions options = 4;</code> + * @param \Google\Protobuf\Internal\MethodOptions $var + * @return $this */ - public function setOptions(&$var) + public function setOptions($var) { GPBUtil::checkMessage($var, \Google\Protobuf\Internal\MethodOptions::class); $this->options = $var; $this->has_options = true; + + return $this; } public function hasOptions() @@ -172,11 +179,10 @@ class MethodDescriptorProto extends \Google\Protobuf\Internal\Message } /** - * <pre> * Identifies if client streams multiple client messages - * </pre> * - * <code>optional bool client_streaming = 5 [default = false];</code> + * Generated from protobuf field <code>optional bool client_streaming = 5 [default = false];</code> + * @return bool */ public function getClientStreaming() { @@ -184,17 +190,19 @@ class MethodDescriptorProto extends \Google\Protobuf\Internal\Message } /** - * <pre> * Identifies if client streams multiple client messages - * </pre> * - * <code>optional bool client_streaming = 5 [default = false];</code> + * Generated from protobuf field <code>optional bool client_streaming = 5 [default = false];</code> + * @param bool $var + * @return $this */ public function setClientStreaming($var) { GPBUtil::checkBool($var); $this->client_streaming = $var; $this->has_client_streaming = true; + + return $this; } public function hasClientStreaming() @@ -203,11 +211,10 @@ class MethodDescriptorProto extends \Google\Protobuf\Internal\Message } /** - * <pre> * Identifies if server streams multiple server messages - * </pre> * - * <code>optional bool server_streaming = 6 [default = false];</code> + * Generated from protobuf field <code>optional bool server_streaming = 6 [default = false];</code> + * @return bool */ public function getServerStreaming() { @@ -215,17 +222,19 @@ class MethodDescriptorProto extends \Google\Protobuf\Internal\Message } /** - * <pre> * Identifies if server streams multiple server messages - * </pre> * - * <code>optional bool server_streaming = 6 [default = false];</code> + * Generated from protobuf field <code>optional bool server_streaming = 6 [default = false];</code> + * @param bool $var + * @return $this */ public function setServerStreaming($var) { GPBUtil::checkBool($var); $this->server_streaming = $var; $this->has_server_streaming = true; + + return $this; } public function hasServerStreaming() diff --git a/php/src/Google/Protobuf/Internal/MethodOptions.php b/php/src/Google/Protobuf/Internal/MethodOptions.php index 6dca5854..baa806b7 100644 --- a/php/src/Google/Protobuf/Internal/MethodOptions.php +++ b/php/src/Google/Protobuf/Internal/MethodOptions.php @@ -8,37 +8,32 @@ use Google\Protobuf\Internal\GPBType; use Google\Protobuf\Internal\GPBWire; use Google\Protobuf\Internal\RepeatedField; use Google\Protobuf\Internal\InputStream; - use Google\Protobuf\Internal\GPBUtil; /** - * Protobuf type <code>google.protobuf.MethodOptions</code> + * Generated from protobuf message <code>google.protobuf.MethodOptions</code> */ class MethodOptions extends \Google\Protobuf\Internal\Message { /** - * <pre> * 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. - * </pre> * - * <code>optional bool deprecated = 33 [default = false];</code> + * Generated from protobuf field <code>optional bool deprecated = 33 [default = false];</code> */ private $deprecated = false; private $has_deprecated = false; /** - * <code>optional .google.protobuf.MethodOptions.IdempotencyLevel idempotency_level = 34 [default = IDEMPOTENCY_UNKNOWN];</code> + * Generated from protobuf field <code>optional .google.protobuf.MethodOptions.IdempotencyLevel idempotency_level = 34 [default = IDEMPOTENCY_UNKNOWN];</code> */ private $idempotency_level = 0; private $has_idempotency_level = false; /** - * <pre> * The parser stores options it doesn't recognize here. See above. - * </pre> * - * <code>repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;</code> + * Generated from protobuf field <code>repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;</code> */ private $uninterpreted_option; private $has_uninterpreted_option = false; @@ -49,14 +44,13 @@ class MethodOptions extends \Google\Protobuf\Internal\Message } /** - * <pre> * 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. - * </pre> * - * <code>optional bool deprecated = 33 [default = false];</code> + * Generated from protobuf field <code>optional bool deprecated = 33 [default = false];</code> + * @return bool */ public function getDeprecated() { @@ -64,20 +58,22 @@ class MethodOptions extends \Google\Protobuf\Internal\Message } /** - * <pre> * 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. - * </pre> * - * <code>optional bool deprecated = 33 [default = false];</code> + * Generated from protobuf field <code>optional bool deprecated = 33 [default = false];</code> + * @param bool $var + * @return $this */ public function setDeprecated($var) { GPBUtil::checkBool($var); $this->deprecated = $var; $this->has_deprecated = true; + + return $this; } public function hasDeprecated() @@ -86,7 +82,8 @@ class MethodOptions extends \Google\Protobuf\Internal\Message } /** - * <code>optional .google.protobuf.MethodOptions.IdempotencyLevel idempotency_level = 34 [default = IDEMPOTENCY_UNKNOWN];</code> + * Generated from protobuf field <code>optional .google.protobuf.MethodOptions.IdempotencyLevel idempotency_level = 34 [default = IDEMPOTENCY_UNKNOWN];</code> + * @return int */ public function getIdempotencyLevel() { @@ -94,13 +91,17 @@ class MethodOptions extends \Google\Protobuf\Internal\Message } /** - * <code>optional .google.protobuf.MethodOptions.IdempotencyLevel idempotency_level = 34 [default = IDEMPOTENCY_UNKNOWN];</code> + * Generated from protobuf field <code>optional .google.protobuf.MethodOptions.IdempotencyLevel idempotency_level = 34 [default = IDEMPOTENCY_UNKNOWN];</code> + * @param int $var + * @return $this */ public function setIdempotencyLevel($var) { GPBUtil::checkEnum($var, \Google\Protobuf\Internal\MethodOptions_IdempotencyLevel::class); $this->idempotency_level = $var; $this->has_idempotency_level = true; + + return $this; } public function hasIdempotencyLevel() @@ -109,11 +110,10 @@ class MethodOptions extends \Google\Protobuf\Internal\Message } /** - * <pre> * The parser stores options it doesn't recognize here. See above. - * </pre> * - * <code>repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;</code> + * Generated from protobuf field <code>repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;</code> + * @return \Google\Protobuf\Internal\RepeatedField */ public function getUninterpretedOption() { @@ -121,17 +121,19 @@ class MethodOptions extends \Google\Protobuf\Internal\Message } /** - * <pre> * The parser stores options it doesn't recognize here. See above. - * </pre> * - * <code>repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;</code> + * Generated from protobuf field <code>repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;</code> + * @param \Google\Protobuf\Internal\UninterpretedOption[]|\Google\Protobuf\Internal\RepeatedField $var + * @return $this */ - public function setUninterpretedOption(&$var) + public function setUninterpretedOption($var) { $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Protobuf\Internal\UninterpretedOption::class); $this->uninterpreted_option = $arr; $this->has_uninterpreted_option = true; + + return $this; } public function hasUninterpretedOption() diff --git a/php/src/Google/Protobuf/Internal/MethodOptions_IdempotencyLevel.php b/php/src/Google/Protobuf/Internal/MethodOptions_IdempotencyLevel.php index ce4adfe7..9e06d8ee 100644 --- a/php/src/Google/Protobuf/Internal/MethodOptions_IdempotencyLevel.php +++ b/php/src/Google/Protobuf/Internal/MethodOptions_IdempotencyLevel.php @@ -5,34 +5,28 @@ namespace Google\Protobuf\Internal; /** - * <pre> * Is this method side-effect-free (or safe in HTTP parlance), or idempotent, * or neither? HTTP based RPC implementation may choose GET verb for safe * methods, and PUT verb for idempotent methods instead of the default POST. - * </pre> * - * Protobuf enum <code>google.protobuf.MethodOptions.IdempotencyLevel</code> + * Protobuf enum <code>Google\Protobuf\Internal</code> */ class MethodOptions_IdempotencyLevel { /** - * <code>IDEMPOTENCY_UNKNOWN = 0;</code> + * Generated from protobuf enum <code>IDEMPOTENCY_UNKNOWN = 0;</code> */ const IDEMPOTENCY_UNKNOWN = 0; /** - * <pre> * implies idempotent - * </pre> * - * <code>NO_SIDE_EFFECTS = 1;</code> + * Generated from protobuf enum <code>NO_SIDE_EFFECTS = 1;</code> */ const NO_SIDE_EFFECTS = 1; /** - * <pre> * idempotent, but may have side effects - * </pre> * - * <code>IDEMPOTENT = 2;</code> + * Generated from protobuf enum <code>IDEMPOTENT = 2;</code> */ const IDEMPOTENT = 2; } diff --git a/php/src/Google/Protobuf/Internal/OneofDescriptor.php b/php/src/Google/Protobuf/Internal/OneofDescriptor.php new file mode 100644 index 00000000..04988737 --- /dev/null +++ b/php/src/Google/Protobuf/Internal/OneofDescriptor.php @@ -0,0 +1,67 @@ +<?php + +// Protocol Buffers - Google's data interchange format +// Copyright 2008 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. + +namespace Google\Protobuf\Internal; + +class OneofDescriptor +{ + + private $name; + private $fields; + + public function setName($name) + { + $this->name = $name; + } + + public function getName() + { + return $this->name; + } + + public function addField(&$field) + { + $this->fields[] = $field; + } + + public function getFields() + { + return $this->fields; + } + + public static function buildFromProto($oneof_proto) + { + $oneof = new OneofDescriptor(); + $oneof->setName($oneof_proto->getName()); + return $oneof; + } +} diff --git a/php/src/Google/Protobuf/Internal/OneofDescriptorProto.php b/php/src/Google/Protobuf/Internal/OneofDescriptorProto.php index e5fbe370..15ff0610 100644 --- a/php/src/Google/Protobuf/Internal/OneofDescriptorProto.php +++ b/php/src/Google/Protobuf/Internal/OneofDescriptorProto.php @@ -8,25 +8,22 @@ use Google\Protobuf\Internal\GPBType; use Google\Protobuf\Internal\GPBWire; use Google\Protobuf\Internal\RepeatedField; use Google\Protobuf\Internal\InputStream; - use Google\Protobuf\Internal\GPBUtil; /** - * <pre> * Describes a oneof. - * </pre> * - * Protobuf type <code>google.protobuf.OneofDescriptorProto</code> + * Generated from protobuf message <code>google.protobuf.OneofDescriptorProto</code> */ class OneofDescriptorProto extends \Google\Protobuf\Internal\Message { /** - * <code>optional string name = 1;</code> + * Generated from protobuf field <code>optional string name = 1;</code> */ private $name = ''; private $has_name = false; /** - * <code>optional .google.protobuf.OneofOptions options = 2;</code> + * Generated from protobuf field <code>optional .google.protobuf.OneofOptions options = 2;</code> */ private $options = null; private $has_options = false; @@ -37,7 +34,8 @@ class OneofDescriptorProto extends \Google\Protobuf\Internal\Message } /** - * <code>optional string name = 1;</code> + * Generated from protobuf field <code>optional string name = 1;</code> + * @return string */ public function getName() { @@ -45,13 +43,17 @@ class OneofDescriptorProto extends \Google\Protobuf\Internal\Message } /** - * <code>optional string name = 1;</code> + * Generated from protobuf field <code>optional string name = 1;</code> + * @param string $var + * @return $this */ public function setName($var) { GPBUtil::checkString($var, True); $this->name = $var; $this->has_name = true; + + return $this; } public function hasName() @@ -60,7 +62,8 @@ class OneofDescriptorProto extends \Google\Protobuf\Internal\Message } /** - * <code>optional .google.protobuf.OneofOptions options = 2;</code> + * Generated from protobuf field <code>optional .google.protobuf.OneofOptions options = 2;</code> + * @return \Google\Protobuf\Internal\OneofOptions */ public function getOptions() { @@ -68,13 +71,17 @@ class OneofDescriptorProto extends \Google\Protobuf\Internal\Message } /** - * <code>optional .google.protobuf.OneofOptions options = 2;</code> + * Generated from protobuf field <code>optional .google.protobuf.OneofOptions options = 2;</code> + * @param \Google\Protobuf\Internal\OneofOptions $var + * @return $this */ - public function setOptions(&$var) + public function setOptions($var) { GPBUtil::checkMessage($var, \Google\Protobuf\Internal\OneofOptions::class); $this->options = $var; $this->has_options = true; + + return $this; } public function hasOptions() diff --git a/php/src/Google/Protobuf/Internal/OneofOptions.php b/php/src/Google/Protobuf/Internal/OneofOptions.php index b61325d2..e5b4633d 100644 --- a/php/src/Google/Protobuf/Internal/OneofOptions.php +++ b/php/src/Google/Protobuf/Internal/OneofOptions.php @@ -8,20 +8,17 @@ use Google\Protobuf\Internal\GPBType; use Google\Protobuf\Internal\GPBWire; use Google\Protobuf\Internal\RepeatedField; use Google\Protobuf\Internal\InputStream; - use Google\Protobuf\Internal\GPBUtil; /** - * Protobuf type <code>google.protobuf.OneofOptions</code> + * Generated from protobuf message <code>google.protobuf.OneofOptions</code> */ class OneofOptions extends \Google\Protobuf\Internal\Message { /** - * <pre> * The parser stores options it doesn't recognize here. See above. - * </pre> * - * <code>repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;</code> + * Generated from protobuf field <code>repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;</code> */ private $uninterpreted_option; private $has_uninterpreted_option = false; @@ -32,11 +29,10 @@ class OneofOptions extends \Google\Protobuf\Internal\Message } /** - * <pre> * The parser stores options it doesn't recognize here. See above. - * </pre> * - * <code>repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;</code> + * Generated from protobuf field <code>repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;</code> + * @return \Google\Protobuf\Internal\RepeatedField */ public function getUninterpretedOption() { @@ -44,17 +40,19 @@ class OneofOptions extends \Google\Protobuf\Internal\Message } /** - * <pre> * The parser stores options it doesn't recognize here. See above. - * </pre> * - * <code>repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;</code> + * Generated from protobuf field <code>repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;</code> + * @param \Google\Protobuf\Internal\UninterpretedOption[]|\Google\Protobuf\Internal\RepeatedField $var + * @return $this */ - public function setUninterpretedOption(&$var) + public function setUninterpretedOption($var) { $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Protobuf\Internal\UninterpretedOption::class); $this->uninterpreted_option = $arr; $this->has_uninterpreted_option = true; + + return $this; } public function hasUninterpretedOption() diff --git a/php/src/Google/Protobuf/Internal/RawInputStream.php b/php/src/Google/Protobuf/Internal/RawInputStream.php new file mode 100644 index 00000000..4e7ed5cb --- /dev/null +++ b/php/src/Google/Protobuf/Internal/RawInputStream.php @@ -0,0 +1,50 @@ +<?php + +// Protocol Buffers - Google's data interchange format +// Copyright 2008 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. + +namespace Google\Protobuf\Internal; + +class RawInputStream +{ + + private $buffer; + + public function __construct($buffer) + { + $this->buffer = $buffer; + } + + public function getData() + { + return $this->buffer; + } + +} diff --git a/php/src/Google/Protobuf/Internal/RepeatedField.php b/php/src/Google/Protobuf/Internal/RepeatedField.php index 2ad4709a..797b3b3a 100644 --- a/php/src/Google/Protobuf/Internal/RepeatedField.php +++ b/php/src/Google/Protobuf/Internal/RepeatedField.php @@ -41,86 +41,6 @@ use Google\Protobuf\Internal\GPBType; use Google\Protobuf\Internal\GPBUtil; /** - * RepeatedFieldIter is used to iterate RepeatedField. It is also need for the - * foreach syntax. - */ -class RepeatedFieldIter implements \Iterator -{ - - /** - * @ignore - */ - private $position; - /** - * @ignore - */ - private $container; - - /** - * Create iterator instance for RepeatedField. - * - * @param RepeatedField The RepeatedField instance for which this iterator - * is created. - * @ignore - */ - public function __construct($container) - { - $this->position = 0; - $this->container = $container; - } - - /** - * Reset the status of the iterator - * - * @return void - */ - public function rewind() - { - $this->position = 0; - } - - /** - * Return the element at the current position. - * - * @return object The element at the current position. - */ - public function current() - { - return $this->container[$this->position]; - } - - /** - * Return the current position. - * - * @return integer The current position. - */ - public function key() - { - return $this->position; - } - - /** - * Move to the next position. - * - * @return void - */ - public function next() - { - ++$this->position; - } - - /** - * Check whether there are more elements to iterate. - * - * @return bool True if there are more elements to iterate. - */ - public function valid() - { - return isset($this->container[$this->position]); - } -} - -/** * RepeatedField is used by generated protocol message classes to manipulate * repeated fields. It can be used like native PHP array. */ diff --git a/php/src/Google/Protobuf/Internal/RepeatedFieldIter.php b/php/src/Google/Protobuf/Internal/RepeatedFieldIter.php new file mode 100644 index 00000000..2b6f8230 --- /dev/null +++ b/php/src/Google/Protobuf/Internal/RepeatedFieldIter.php @@ -0,0 +1,118 @@ +<?php + +// Protocol Buffers - Google's data interchange format +// Copyright 2008 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. + +/** + * RepeatedField and RepeatedFieldIter are used by generated protocol message + * classes to manipulate repeated fields. + */ + +namespace Google\Protobuf\Internal; + +/** + * RepeatedFieldIter is used to iterate RepeatedField. It is also need for the + * foreach syntax. + */ +class RepeatedFieldIter implements \Iterator +{ + + /** + * @ignore + */ + private $position; + /** + * @ignore + */ + private $container; + + /** + * Create iterator instance for RepeatedField. + * + * @param RepeatedField The RepeatedField instance for which this iterator + * is created. + * @ignore + */ + public function __construct($container) + { + $this->position = 0; + $this->container = $container; + } + + /** + * Reset the status of the iterator + * + * @return void + */ + public function rewind() + { + $this->position = 0; + } + + /** + * Return the element at the current position. + * + * @return object The element at the current position. + */ + public function current() + { + return $this->container[$this->position]; + } + + /** + * Return the current position. + * + * @return integer The current position. + */ + public function key() + { + return $this->position; + } + + /** + * Move to the next position. + * + * @return void + */ + public function next() + { + ++$this->position; + } + + /** + * Check whether there are more elements to iterate. + * + * @return bool True if there are more elements to iterate. + */ + public function valid() + { + return isset($this->container[$this->position]); + } +} diff --git a/php/src/Google/Protobuf/Internal/ServiceDescriptorProto.php b/php/src/Google/Protobuf/Internal/ServiceDescriptorProto.php index 47776202..da88e9c4 100644 --- a/php/src/Google/Protobuf/Internal/ServiceDescriptorProto.php +++ b/php/src/Google/Protobuf/Internal/ServiceDescriptorProto.php @@ -8,30 +8,27 @@ use Google\Protobuf\Internal\GPBType; use Google\Protobuf\Internal\GPBWire; use Google\Protobuf\Internal\RepeatedField; use Google\Protobuf\Internal\InputStream; - use Google\Protobuf\Internal\GPBUtil; /** - * <pre> * Describes a service. - * </pre> * - * Protobuf type <code>google.protobuf.ServiceDescriptorProto</code> + * Generated from protobuf message <code>google.protobuf.ServiceDescriptorProto</code> */ class ServiceDescriptorProto extends \Google\Protobuf\Internal\Message { /** - * <code>optional string name = 1;</code> + * Generated from protobuf field <code>optional string name = 1;</code> */ private $name = ''; private $has_name = false; /** - * <code>repeated .google.protobuf.MethodDescriptorProto method = 2;</code> + * Generated from protobuf field <code>repeated .google.protobuf.MethodDescriptorProto method = 2;</code> */ private $method; private $has_method = false; /** - * <code>optional .google.protobuf.ServiceOptions options = 3;</code> + * Generated from protobuf field <code>optional .google.protobuf.ServiceOptions options = 3;</code> */ private $options = null; private $has_options = false; @@ -42,7 +39,8 @@ class ServiceDescriptorProto extends \Google\Protobuf\Internal\Message } /** - * <code>optional string name = 1;</code> + * Generated from protobuf field <code>optional string name = 1;</code> + * @return string */ public function getName() { @@ -50,13 +48,17 @@ class ServiceDescriptorProto extends \Google\Protobuf\Internal\Message } /** - * <code>optional string name = 1;</code> + * Generated from protobuf field <code>optional string name = 1;</code> + * @param string $var + * @return $this */ public function setName($var) { GPBUtil::checkString($var, True); $this->name = $var; $this->has_name = true; + + return $this; } public function hasName() @@ -65,7 +67,8 @@ class ServiceDescriptorProto extends \Google\Protobuf\Internal\Message } /** - * <code>repeated .google.protobuf.MethodDescriptorProto method = 2;</code> + * Generated from protobuf field <code>repeated .google.protobuf.MethodDescriptorProto method = 2;</code> + * @return \Google\Protobuf\Internal\RepeatedField */ public function getMethod() { @@ -73,13 +76,17 @@ class ServiceDescriptorProto extends \Google\Protobuf\Internal\Message } /** - * <code>repeated .google.protobuf.MethodDescriptorProto method = 2;</code> + * Generated from protobuf field <code>repeated .google.protobuf.MethodDescriptorProto method = 2;</code> + * @param \Google\Protobuf\Internal\MethodDescriptorProto[]|\Google\Protobuf\Internal\RepeatedField $var + * @return $this */ - public function setMethod(&$var) + public function setMethod($var) { $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Protobuf\Internal\MethodDescriptorProto::class); $this->method = $arr; $this->has_method = true; + + return $this; } public function hasMethod() @@ -88,7 +95,8 @@ class ServiceDescriptorProto extends \Google\Protobuf\Internal\Message } /** - * <code>optional .google.protobuf.ServiceOptions options = 3;</code> + * Generated from protobuf field <code>optional .google.protobuf.ServiceOptions options = 3;</code> + * @return \Google\Protobuf\Internal\ServiceOptions */ public function getOptions() { @@ -96,13 +104,17 @@ class ServiceDescriptorProto extends \Google\Protobuf\Internal\Message } /** - * <code>optional .google.protobuf.ServiceOptions options = 3;</code> + * Generated from protobuf field <code>optional .google.protobuf.ServiceOptions options = 3;</code> + * @param \Google\Protobuf\Internal\ServiceOptions $var + * @return $this */ - public function setOptions(&$var) + public function setOptions($var) { GPBUtil::checkMessage($var, \Google\Protobuf\Internal\ServiceOptions::class); $this->options = $var; $this->has_options = true; + + return $this; } public function hasOptions() diff --git a/php/src/Google/Protobuf/Internal/ServiceOptions.php b/php/src/Google/Protobuf/Internal/ServiceOptions.php index 62323dba..3e7214a1 100644 --- a/php/src/Google/Protobuf/Internal/ServiceOptions.php +++ b/php/src/Google/Protobuf/Internal/ServiceOptions.php @@ -8,32 +8,27 @@ use Google\Protobuf\Internal\GPBType; use Google\Protobuf\Internal\GPBWire; use Google\Protobuf\Internal\RepeatedField; use Google\Protobuf\Internal\InputStream; - use Google\Protobuf\Internal\GPBUtil; /** - * Protobuf type <code>google.protobuf.ServiceOptions</code> + * Generated from protobuf message <code>google.protobuf.ServiceOptions</code> */ class ServiceOptions extends \Google\Protobuf\Internal\Message { /** - * <pre> * 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. - * </pre> * - * <code>optional bool deprecated = 33 [default = false];</code> + * Generated from protobuf field <code>optional bool deprecated = 33 [default = false];</code> */ private $deprecated = false; private $has_deprecated = false; /** - * <pre> * The parser stores options it doesn't recognize here. See above. - * </pre> * - * <code>repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;</code> + * Generated from protobuf field <code>repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;</code> */ private $uninterpreted_option; private $has_uninterpreted_option = false; @@ -44,14 +39,13 @@ class ServiceOptions extends \Google\Protobuf\Internal\Message } /** - * <pre> * 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. - * </pre> * - * <code>optional bool deprecated = 33 [default = false];</code> + * Generated from protobuf field <code>optional bool deprecated = 33 [default = false];</code> + * @return bool */ public function getDeprecated() { @@ -59,20 +53,22 @@ class ServiceOptions extends \Google\Protobuf\Internal\Message } /** - * <pre> * 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. - * </pre> * - * <code>optional bool deprecated = 33 [default = false];</code> + * Generated from protobuf field <code>optional bool deprecated = 33 [default = false];</code> + * @param bool $var + * @return $this */ public function setDeprecated($var) { GPBUtil::checkBool($var); $this->deprecated = $var; $this->has_deprecated = true; + + return $this; } public function hasDeprecated() @@ -81,11 +77,10 @@ class ServiceOptions extends \Google\Protobuf\Internal\Message } /** - * <pre> * The parser stores options it doesn't recognize here. See above. - * </pre> * - * <code>repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;</code> + * Generated from protobuf field <code>repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;</code> + * @return \Google\Protobuf\Internal\RepeatedField */ public function getUninterpretedOption() { @@ -93,17 +88,19 @@ class ServiceOptions extends \Google\Protobuf\Internal\Message } /** - * <pre> * The parser stores options it doesn't recognize here. See above. - * </pre> * - * <code>repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;</code> + * Generated from protobuf field <code>repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;</code> + * @param \Google\Protobuf\Internal\UninterpretedOption[]|\Google\Protobuf\Internal\RepeatedField $var + * @return $this */ - public function setUninterpretedOption(&$var) + public function setUninterpretedOption($var) { $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Protobuf\Internal\UninterpretedOption::class); $this->uninterpreted_option = $arr; $this->has_uninterpreted_option = true; + + return $this; } public function hasUninterpretedOption() diff --git a/php/src/Google/Protobuf/Internal/SourceCodeInfo.php b/php/src/Google/Protobuf/Internal/SourceCodeInfo.php index eab60880..6ce05ed4 100644 --- a/php/src/Google/Protobuf/Internal/SourceCodeInfo.php +++ b/php/src/Google/Protobuf/Internal/SourceCodeInfo.php @@ -8,21 +8,17 @@ use Google\Protobuf\Internal\GPBType; use Google\Protobuf\Internal\GPBWire; use Google\Protobuf\Internal\RepeatedField; use Google\Protobuf\Internal\InputStream; - use Google\Protobuf\Internal\GPBUtil; /** - * <pre> * Encapsulates information about the original source file from which a * FileDescriptorProto was generated. - * </pre> * - * Protobuf type <code>google.protobuf.SourceCodeInfo</code> + * Generated from protobuf message <code>google.protobuf.SourceCodeInfo</code> */ class SourceCodeInfo extends \Google\Protobuf\Internal\Message { /** - * <pre> * 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 @@ -64,9 +60,8 @@ class SourceCodeInfo extends \Google\Protobuf\Internal\Message * - 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. - * </pre> * - * <code>repeated .google.protobuf.SourceCodeInfo.Location location = 1;</code> + * Generated from protobuf field <code>repeated .google.protobuf.SourceCodeInfo.Location location = 1;</code> */ private $location; private $has_location = false; @@ -77,7 +72,6 @@ class SourceCodeInfo extends \Google\Protobuf\Internal\Message } /** - * <pre> * 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 @@ -119,9 +113,9 @@ class SourceCodeInfo extends \Google\Protobuf\Internal\Message * - 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. - * </pre> * - * <code>repeated .google.protobuf.SourceCodeInfo.Location location = 1;</code> + * Generated from protobuf field <code>repeated .google.protobuf.SourceCodeInfo.Location location = 1;</code> + * @return \Google\Protobuf\Internal\RepeatedField */ public function getLocation() { @@ -129,7 +123,6 @@ class SourceCodeInfo extends \Google\Protobuf\Internal\Message } /** - * <pre> * 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 @@ -171,15 +164,18 @@ class SourceCodeInfo extends \Google\Protobuf\Internal\Message * - 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. - * </pre> * - * <code>repeated .google.protobuf.SourceCodeInfo.Location location = 1;</code> + * Generated from protobuf field <code>repeated .google.protobuf.SourceCodeInfo.Location location = 1;</code> + * @param \Google\Protobuf\Internal\SourceCodeInfo_Location[]|\Google\Protobuf\Internal\RepeatedField $var + * @return $this */ - public function setLocation(&$var) + public function setLocation($var) { $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Protobuf\Internal\SourceCodeInfo_Location::class); $this->location = $arr; $this->has_location = true; + + return $this; } public function hasLocation() diff --git a/php/src/Google/Protobuf/Internal/SourceCodeInfo_Location.php b/php/src/Google/Protobuf/Internal/SourceCodeInfo_Location.php index 5a02b26c..19ed2bc2 100644 --- a/php/src/Google/Protobuf/Internal/SourceCodeInfo_Location.php +++ b/php/src/Google/Protobuf/Internal/SourceCodeInfo_Location.php @@ -8,16 +8,14 @@ use Google\Protobuf\Internal\GPBType; use Google\Protobuf\Internal\GPBWire; use Google\Protobuf\Internal\RepeatedField; use Google\Protobuf\Internal\InputStream; - use Google\Protobuf\Internal\GPBUtil; /** - * Protobuf type <code>google.protobuf.SourceCodeInfo.Location</code> + * Generated from protobuf message <code>google.protobuf.SourceCodeInfo.Location</code> */ class SourceCodeInfo_Location extends \Google\Protobuf\Internal\Message { /** - * <pre> * 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 @@ -39,27 +37,23 @@ class SourceCodeInfo_Location extends \Google\Protobuf\Internal\Message * [ 4, 3, 2, 7 ] * this path refers to the whole field declaration (from the beginning * of the label to the terminating semicolon). - * </pre> * - * <code>repeated int32 path = 1 [packed = true];</code> + * Generated from protobuf field <code>repeated int32 path = 1 [packed = true];</code> */ private $path; private $has_path = false; /** - * <pre> * 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. - * </pre> * - * <code>repeated int32 span = 2 [packed = true];</code> + * Generated from protobuf field <code>repeated int32 span = 2 [packed = true];</code> */ private $span; private $has_span = false; /** - * <pre> * 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. @@ -96,19 +90,18 @@ class SourceCodeInfo_Location extends \Google\Protobuf\Internal\Message * * grault. */ * optional int32 grault = 6; * // ignored detached comments. - * </pre> * - * <code>optional string leading_comments = 3;</code> + * Generated from protobuf field <code>optional string leading_comments = 3;</code> */ private $leading_comments = ''; private $has_leading_comments = false; /** - * <code>optional string trailing_comments = 4;</code> + * Generated from protobuf field <code>optional string trailing_comments = 4;</code> */ private $trailing_comments = ''; private $has_trailing_comments = false; /** - * <code>repeated string leading_detached_comments = 6;</code> + * Generated from protobuf field <code>repeated string leading_detached_comments = 6;</code> */ private $leading_detached_comments; private $has_leading_detached_comments = false; @@ -119,7 +112,6 @@ class SourceCodeInfo_Location extends \Google\Protobuf\Internal\Message } /** - * <pre> * 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 @@ -141,9 +133,9 @@ class SourceCodeInfo_Location extends \Google\Protobuf\Internal\Message * [ 4, 3, 2, 7 ] * this path refers to the whole field declaration (from the beginning * of the label to the terminating semicolon). - * </pre> * - * <code>repeated int32 path = 1 [packed = true];</code> + * Generated from protobuf field <code>repeated int32 path = 1 [packed = true];</code> + * @return \Google\Protobuf\Internal\RepeatedField */ public function getPath() { @@ -151,7 +143,6 @@ class SourceCodeInfo_Location extends \Google\Protobuf\Internal\Message } /** - * <pre> * 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 @@ -173,15 +164,18 @@ class SourceCodeInfo_Location extends \Google\Protobuf\Internal\Message * [ 4, 3, 2, 7 ] * this path refers to the whole field declaration (from the beginning * of the label to the terminating semicolon). - * </pre> * - * <code>repeated int32 path = 1 [packed = true];</code> + * Generated from protobuf field <code>repeated int32 path = 1 [packed = true];</code> + * @param int[]|\Google\Protobuf\Internal\RepeatedField $var + * @return $this */ - public function setPath(&$var) + public function setPath($var) { $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::INT32); $this->path = $arr; $this->has_path = true; + + return $this; } public function hasPath() @@ -190,15 +184,14 @@ class SourceCodeInfo_Location extends \Google\Protobuf\Internal\Message } /** - * <pre> * 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. - * </pre> * - * <code>repeated int32 span = 2 [packed = true];</code> + * Generated from protobuf field <code>repeated int32 span = 2 [packed = true];</code> + * @return \Google\Protobuf\Internal\RepeatedField */ public function getSpan() { @@ -206,21 +199,23 @@ class SourceCodeInfo_Location extends \Google\Protobuf\Internal\Message } /** - * <pre> * 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. - * </pre> * - * <code>repeated int32 span = 2 [packed = true];</code> + * Generated from protobuf field <code>repeated int32 span = 2 [packed = true];</code> + * @param int[]|\Google\Protobuf\Internal\RepeatedField $var + * @return $this */ - public function setSpan(&$var) + public function setSpan($var) { $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::INT32); $this->span = $arr; $this->has_span = true; + + return $this; } public function hasSpan() @@ -229,7 +224,6 @@ class SourceCodeInfo_Location extends \Google\Protobuf\Internal\Message } /** - * <pre> * 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. @@ -266,9 +260,9 @@ class SourceCodeInfo_Location extends \Google\Protobuf\Internal\Message * * grault. */ * optional int32 grault = 6; * // ignored detached comments. - * </pre> * - * <code>optional string leading_comments = 3;</code> + * Generated from protobuf field <code>optional string leading_comments = 3;</code> + * @return string */ public function getLeadingComments() { @@ -276,7 +270,6 @@ class SourceCodeInfo_Location extends \Google\Protobuf\Internal\Message } /** - * <pre> * 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. @@ -313,15 +306,18 @@ class SourceCodeInfo_Location extends \Google\Protobuf\Internal\Message * * grault. */ * optional int32 grault = 6; * // ignored detached comments. - * </pre> * - * <code>optional string leading_comments = 3;</code> + * Generated from protobuf field <code>optional string leading_comments = 3;</code> + * @param string $var + * @return $this */ public function setLeadingComments($var) { GPBUtil::checkString($var, True); $this->leading_comments = $var; $this->has_leading_comments = true; + + return $this; } public function hasLeadingComments() @@ -330,7 +326,8 @@ class SourceCodeInfo_Location extends \Google\Protobuf\Internal\Message } /** - * <code>optional string trailing_comments = 4;</code> + * Generated from protobuf field <code>optional string trailing_comments = 4;</code> + * @return string */ public function getTrailingComments() { @@ -338,13 +335,17 @@ class SourceCodeInfo_Location extends \Google\Protobuf\Internal\Message } /** - * <code>optional string trailing_comments = 4;</code> + * Generated from protobuf field <code>optional string trailing_comments = 4;</code> + * @param string $var + * @return $this */ public function setTrailingComments($var) { GPBUtil::checkString($var, True); $this->trailing_comments = $var; $this->has_trailing_comments = true; + + return $this; } public function hasTrailingComments() @@ -353,7 +354,8 @@ class SourceCodeInfo_Location extends \Google\Protobuf\Internal\Message } /** - * <code>repeated string leading_detached_comments = 6;</code> + * Generated from protobuf field <code>repeated string leading_detached_comments = 6;</code> + * @return \Google\Protobuf\Internal\RepeatedField */ public function getLeadingDetachedComments() { @@ -361,13 +363,17 @@ class SourceCodeInfo_Location extends \Google\Protobuf\Internal\Message } /** - * <code>repeated string leading_detached_comments = 6;</code> + * Generated from protobuf field <code>repeated string leading_detached_comments = 6;</code> + * @param string[]|\Google\Protobuf\Internal\RepeatedField $var + * @return $this */ - public function setLeadingDetachedComments(&$var) + public function setLeadingDetachedComments($var) { $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::STRING); $this->leading_detached_comments = $arr; $this->has_leading_detached_comments = true; + + return $this; } public function hasLeadingDetachedComments() diff --git a/php/src/Google/Protobuf/Internal/UninterpretedOption.php b/php/src/Google/Protobuf/Internal/UninterpretedOption.php index 28655019..4d342eb3 100644 --- a/php/src/Google/Protobuf/Internal/UninterpretedOption.php +++ b/php/src/Google/Protobuf/Internal/UninterpretedOption.php @@ -8,60 +8,55 @@ use Google\Protobuf\Internal\GPBType; use Google\Protobuf\Internal\GPBWire; use Google\Protobuf\Internal\RepeatedField; use Google\Protobuf\Internal\InputStream; - use Google\Protobuf\Internal\GPBUtil; /** - * <pre> * 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. - * </pre> * - * Protobuf type <code>google.protobuf.UninterpretedOption</code> + * Generated from protobuf message <code>google.protobuf.UninterpretedOption</code> */ class UninterpretedOption extends \Google\Protobuf\Internal\Message { /** - * <code>repeated .google.protobuf.UninterpretedOption.NamePart name = 2;</code> + * Generated from protobuf field <code>repeated .google.protobuf.UninterpretedOption.NamePart name = 2;</code> */ private $name; private $has_name = false; /** - * <pre> * The value of the uninterpreted option, in whatever type the tokenizer * identified it as during parsing. Exactly one of these should be set. - * </pre> * - * <code>optional string identifier_value = 3;</code> + * Generated from protobuf field <code>optional string identifier_value = 3;</code> */ private $identifier_value = ''; private $has_identifier_value = false; /** - * <code>optional uint64 positive_int_value = 4;</code> + * Generated from protobuf field <code>optional uint64 positive_int_value = 4;</code> */ private $positive_int_value = 0; private $has_positive_int_value = false; /** - * <code>optional int64 negative_int_value = 5;</code> + * Generated from protobuf field <code>optional int64 negative_int_value = 5;</code> */ private $negative_int_value = 0; private $has_negative_int_value = false; /** - * <code>optional double double_value = 6;</code> + * Generated from protobuf field <code>optional double double_value = 6;</code> */ private $double_value = 0.0; private $has_double_value = false; /** - * <code>optional bytes string_value = 7;</code> + * Generated from protobuf field <code>optional bytes string_value = 7;</code> */ private $string_value = ''; private $has_string_value = false; /** - * <code>optional string aggregate_value = 8;</code> + * Generated from protobuf field <code>optional string aggregate_value = 8;</code> */ private $aggregate_value = ''; private $has_aggregate_value = false; @@ -72,7 +67,8 @@ class UninterpretedOption extends \Google\Protobuf\Internal\Message } /** - * <code>repeated .google.protobuf.UninterpretedOption.NamePart name = 2;</code> + * Generated from protobuf field <code>repeated .google.protobuf.UninterpretedOption.NamePart name = 2;</code> + * @return \Google\Protobuf\Internal\RepeatedField */ public function getName() { @@ -80,13 +76,17 @@ class UninterpretedOption extends \Google\Protobuf\Internal\Message } /** - * <code>repeated .google.protobuf.UninterpretedOption.NamePart name = 2;</code> + * Generated from protobuf field <code>repeated .google.protobuf.UninterpretedOption.NamePart name = 2;</code> + * @param \Google\Protobuf\Internal\UninterpretedOption_NamePart[]|\Google\Protobuf\Internal\RepeatedField $var + * @return $this */ - public function setName(&$var) + public function setName($var) { $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Protobuf\Internal\UninterpretedOption_NamePart::class); $this->name = $arr; $this->has_name = true; + + return $this; } public function hasName() @@ -95,12 +95,11 @@ class UninterpretedOption extends \Google\Protobuf\Internal\Message } /** - * <pre> * The value of the uninterpreted option, in whatever type the tokenizer * identified it as during parsing. Exactly one of these should be set. - * </pre> * - * <code>optional string identifier_value = 3;</code> + * Generated from protobuf field <code>optional string identifier_value = 3;</code> + * @return string */ public function getIdentifierValue() { @@ -108,18 +107,20 @@ class UninterpretedOption extends \Google\Protobuf\Internal\Message } /** - * <pre> * The value of the uninterpreted option, in whatever type the tokenizer * identified it as during parsing. Exactly one of these should be set. - * </pre> * - * <code>optional string identifier_value = 3;</code> + * Generated from protobuf field <code>optional string identifier_value = 3;</code> + * @param string $var + * @return $this */ public function setIdentifierValue($var) { GPBUtil::checkString($var, True); $this->identifier_value = $var; $this->has_identifier_value = true; + + return $this; } public function hasIdentifierValue() @@ -128,7 +129,8 @@ class UninterpretedOption extends \Google\Protobuf\Internal\Message } /** - * <code>optional uint64 positive_int_value = 4;</code> + * Generated from protobuf field <code>optional uint64 positive_int_value = 4;</code> + * @return int|string */ public function getPositiveIntValue() { @@ -136,13 +138,17 @@ class UninterpretedOption extends \Google\Protobuf\Internal\Message } /** - * <code>optional uint64 positive_int_value = 4;</code> + * Generated from protobuf field <code>optional uint64 positive_int_value = 4;</code> + * @param int|string $var + * @return $this */ public function setPositiveIntValue($var) { GPBUtil::checkUint64($var); $this->positive_int_value = $var; $this->has_positive_int_value = true; + + return $this; } public function hasPositiveIntValue() @@ -151,7 +157,8 @@ class UninterpretedOption extends \Google\Protobuf\Internal\Message } /** - * <code>optional int64 negative_int_value = 5;</code> + * Generated from protobuf field <code>optional int64 negative_int_value = 5;</code> + * @return int|string */ public function getNegativeIntValue() { @@ -159,13 +166,17 @@ class UninterpretedOption extends \Google\Protobuf\Internal\Message } /** - * <code>optional int64 negative_int_value = 5;</code> + * Generated from protobuf field <code>optional int64 negative_int_value = 5;</code> + * @param int|string $var + * @return $this */ public function setNegativeIntValue($var) { GPBUtil::checkInt64($var); $this->negative_int_value = $var; $this->has_negative_int_value = true; + + return $this; } public function hasNegativeIntValue() @@ -174,7 +185,8 @@ class UninterpretedOption extends \Google\Protobuf\Internal\Message } /** - * <code>optional double double_value = 6;</code> + * Generated from protobuf field <code>optional double double_value = 6;</code> + * @return float */ public function getDoubleValue() { @@ -182,13 +194,17 @@ class UninterpretedOption extends \Google\Protobuf\Internal\Message } /** - * <code>optional double double_value = 6;</code> + * Generated from protobuf field <code>optional double double_value = 6;</code> + * @param float $var + * @return $this */ public function setDoubleValue($var) { GPBUtil::checkDouble($var); $this->double_value = $var; $this->has_double_value = true; + + return $this; } public function hasDoubleValue() @@ -197,7 +213,8 @@ class UninterpretedOption extends \Google\Protobuf\Internal\Message } /** - * <code>optional bytes string_value = 7;</code> + * Generated from protobuf field <code>optional bytes string_value = 7;</code> + * @return string */ public function getStringValue() { @@ -205,13 +222,17 @@ class UninterpretedOption extends \Google\Protobuf\Internal\Message } /** - * <code>optional bytes string_value = 7;</code> + * Generated from protobuf field <code>optional bytes string_value = 7;</code> + * @param string $var + * @return $this */ public function setStringValue($var) { GPBUtil::checkString($var, False); $this->string_value = $var; $this->has_string_value = true; + + return $this; } public function hasStringValue() @@ -220,7 +241,8 @@ class UninterpretedOption extends \Google\Protobuf\Internal\Message } /** - * <code>optional string aggregate_value = 8;</code> + * Generated from protobuf field <code>optional string aggregate_value = 8;</code> + * @return string */ public function getAggregateValue() { @@ -228,13 +250,17 @@ class UninterpretedOption extends \Google\Protobuf\Internal\Message } /** - * <code>optional string aggregate_value = 8;</code> + * Generated from protobuf field <code>optional string aggregate_value = 8;</code> + * @param string $var + * @return $this */ public function setAggregateValue($var) { GPBUtil::checkString($var, True); $this->aggregate_value = $var; $this->has_aggregate_value = true; + + return $this; } public function hasAggregateValue() diff --git a/php/src/Google/Protobuf/Internal/UninterpretedOption_NamePart.php b/php/src/Google/Protobuf/Internal/UninterpretedOption_NamePart.php index 86484d23..c9a6fc3c 100644 --- a/php/src/Google/Protobuf/Internal/UninterpretedOption_NamePart.php +++ b/php/src/Google/Protobuf/Internal/UninterpretedOption_NamePart.php @@ -8,29 +8,26 @@ use Google\Protobuf\Internal\GPBType; use Google\Protobuf\Internal\GPBWire; use Google\Protobuf\Internal\RepeatedField; use Google\Protobuf\Internal\InputStream; - use Google\Protobuf\Internal\GPBUtil; /** - * <pre> * 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". - * </pre> * - * Protobuf type <code>google.protobuf.UninterpretedOption.NamePart</code> + * Generated from protobuf message <code>google.protobuf.UninterpretedOption.NamePart</code> */ class UninterpretedOption_NamePart extends \Google\Protobuf\Internal\Message { /** - * <code>required string name_part = 1;</code> + * Generated from protobuf field <code>required string name_part = 1;</code> */ private $name_part = ''; private $has_name_part = false; /** - * <code>required bool is_extension = 2;</code> + * Generated from protobuf field <code>required bool is_extension = 2;</code> */ private $is_extension = false; private $has_is_extension = false; @@ -41,7 +38,8 @@ class UninterpretedOption_NamePart extends \Google\Protobuf\Internal\Message } /** - * <code>required string name_part = 1;</code> + * Generated from protobuf field <code>required string name_part = 1;</code> + * @return string */ public function getNamePart() { @@ -49,13 +47,17 @@ class UninterpretedOption_NamePart extends \Google\Protobuf\Internal\Message } /** - * <code>required string name_part = 1;</code> + * Generated from protobuf field <code>required string name_part = 1;</code> + * @param string $var + * @return $this */ public function setNamePart($var) { GPBUtil::checkString($var, True); $this->name_part = $var; $this->has_name_part = true; + + return $this; } public function hasNamePart() @@ -64,7 +66,8 @@ class UninterpretedOption_NamePart extends \Google\Protobuf\Internal\Message } /** - * <code>required bool is_extension = 2;</code> + * Generated from protobuf field <code>required bool is_extension = 2;</code> + * @return bool */ public function getIsExtension() { @@ -72,13 +75,17 @@ class UninterpretedOption_NamePart extends \Google\Protobuf\Internal\Message } /** - * <code>required bool is_extension = 2;</code> + * Generated from protobuf field <code>required bool is_extension = 2;</code> + * @param bool $var + * @return $this */ public function setIsExtension($var) { GPBUtil::checkBool($var); $this->is_extension = $var; $this->has_is_extension = true; + + return $this; } public function hasIsExtension() diff --git a/php/src/Google/Protobuf/descriptor.php b/php/src/Google/Protobuf/descriptor.php deleted file mode 100644 index fb69eda0..00000000 --- a/php/src/Google/Protobuf/descriptor.php +++ /dev/null @@ -1,587 +0,0 @@ -<?php - -// Protocol Buffers - Google's data interchange format -// Copyright 2008 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. - -namespace Google\Protobuf\Internal; - -use Google\Protobuf\Internal\GPBType; -use Google\Protobuf\Internal\MessageOptions; - -class FileDescriptor -{ - - private $package; - private $message_type = []; - private $enum_type = []; - - public function setPackage($package) - { - $this->package = $package; - } - - public function getPackage() - { - return $this->package; - } - - public function getMessageType() - { - return $this->message_type; - } - - public function addMessageType($desc) - { - $this->message_type[] = $desc; - } - - public function getEnumType() - { - return $this->enum_type; - } - - public function addEnumType($desc) - { - $this->enum_type[]= $desc; - } - - public static function buildFromProto($proto) - { - $file = new FileDescriptor(); - $file->setPackage($proto->getPackage()); - foreach ($proto->getMessageType() as $message_proto) { - $file->addMessageType(Descriptor::buildFromProto( - $message_proto, $proto, "")); - } - foreach ($proto->getEnumType() as $enum_proto) { - $file->getEnumType()[] = - $file->addEnumType( - EnumDescriptor::buildFromProto( - $enum_proto, - $proto, - "")); - } - return $file; - } -} - -class Descriptor -{ - - private $full_name; - private $field = []; - private $nested_type = []; - private $enum_type = []; - private $klass; - private $options; - private $oneof_decl = []; - - public function addOneofDecl($oneof) - { - $this->oneof_decl[] = $oneof; - } - - public function getOneofDecl() - { - return $this->oneof_decl; - } - - public function setFullName($full_name) - { - $this->full_name = $full_name; - } - - public function getFullName() - { - return $this->full_name; - } - - public function addField($field) - { - $this->field[$field->getNumber()] = $field; - } - - public function getField() - { - return $this->field; - } - - public function addNestedType($desc) - { - $this->nested_type[] = $desc; - } - - public function getNestedType() - { - return $this->nested_type; - } - - public function addEnumType($desc) - { - $this->enum_type[] = $desc; - } - - public function getEnumType() - { - return $this->enum_type; - } - - public function getFieldByNumber($number) - { - if (!isset($this->field[$number])) { - return NULL; - } else { - return $this->field[$number]; - } - } - - public function setClass($klass) - { - $this->klass = $klass; - } - - public function getClass() - { - return $this->klass; - } - - public function setOptions($options) - { - $this->options = $options; - } - - public function getOptions() - { - return $this->options; - } - - public static function buildFromProto($proto, $file_proto, $containing) - { - $desc = new Descriptor(); - - $message_name_without_package = ""; - $classname = ""; - $fullname = ""; - getFullClassName( - $proto, - $containing, - $file_proto, - $message_name_without_package, - $classname, - $fullname); - $desc->setFullName($fullname); - $desc->setClass($classname); - $desc->setOptions($proto->getOptions()); - - foreach ($proto->getField() as $field_proto) { - $desc->addField(FieldDescriptor::buildFromProto($field_proto)); - } - - // Handle nested types. - foreach ($proto->getNestedType() as $nested_proto) { - $desc->addNestedType(Descriptor::buildFromProto( - $nested_proto, $file_proto, $message_name_without_package)); - } - - // Handle nested enum. - foreach ($proto->getEnumType() as $enum_proto) { - $desc->addEnumType(EnumDescriptor::buildFromProto( - $enum_proto, $file_proto, $message_name_without_package)); - } - - // Handle oneof fields. - foreach ($proto->getOneofDecl() as $oneof_proto) { - $desc->addOneofDecl( - OneofDescriptor::buildFromProto($oneof_proto, $desc)); - } - - return $desc; - } -} - -function getClassNamePrefix( - $classname, - $file_proto) -{ - $option = $file_proto->getOptions(); - $prefix = is_null($option) ? "" : $option->getPhpClassPrefix(); - if ($prefix !== "") { - return $prefix; - } - - $reserved_words = array("Empty"); - foreach ($reserved_words as $reserved_word) { - if ($classname === $reserved_word) { - if ($file_proto->getPackage() === "google.protobuf") { - return "GPB"; - } else { - return "PB"; - } - } - } - - return ""; -} - -function getClassNameWithoutPackage( - $name, - $file_proto) -{ - $classname = implode('_', array_map('ucwords', explode('.', $name))); - return getClassNamePrefix($classname, $file_proto) . $classname; -} - -function getFullClassName( - $proto, - $containing, - $file_proto, - &$message_name_without_package, - &$classname, - &$fullname) -{ - // Full name needs to start with '.'. - $message_name_without_package = $proto->getName(); - if ($containing !== "") { - $message_name_without_package = - $containing . "." . $message_name_without_package; - } - - $package = $file_proto->getPackage(); - if ($package === "") { - $fullname = "." . $message_name_without_package; - } else { - $fullname = "." . $package . "." . $message_name_without_package; - } - - $class_name_without_package = - getClassNameWithoutPackage($message_name_without_package, $file_proto); - if ($package === "") { - $classname = $class_name_without_package; - } else { - $classname = - implode('\\', array_map('ucwords', explode('.', $package))). - "\\".$class_name_without_package; - } -} - -class OneofDescriptor -{ - - private $name; - private $fields; - - public function setName($name) - { - $this->name = $name; - } - - public function getName() - { - return $this->name; - } - - public function addField(&$field) - { - $this->fields[] = $field; - } - - public function getFields() - { - return $this->fields; - } - - public static function buildFromProto($oneof_proto) - { - $oneof = new OneofDescriptor(); - $oneof->setName($oneof_proto->getName()); - return $oneof; - } -} - - -class EnumDescriptor -{ - - private $klass; - private $full_name; - private $value; - - public function setFullName($full_name) - { - $this->full_name = $full_name; - } - - public function getFullName() - { - return $this->full_name; - } - - public function addValue($number, $value) - { - $this->value[$number] = $value; - } - - public function setClass($klass) - { - $this->klass = $klass; - } - - public function getClass() - { - return $this->klass; - } - - public static function buildFromProto($proto, $file_proto, $containing) - { - $desc = new EnumDescriptor(); - - $enum_name_without_package = ""; - $classname = ""; - $fullname = ""; - getFullClassName( - $proto, - $containing, - $file_proto, - $enum_name_without_package, - $classname, - $fullname); - $desc->setFullName($fullname); - $desc->setClass($classname); - - return $desc; - } -} - -class EnumValueDescriptor -{ -} - -class FieldDescriptor -{ - - private $name; - private $setter; - private $getter; - private $number; - private $label; - private $type; - private $message_type; - private $enum_type; - private $packed; - private $is_map; - private $oneof_index = -1; - - public function setOneofIndex($index) - { - $this->oneof_index = $index; - } - - public function getOneofIndex() - { - return $this->oneof_index; - } - - public function setName($name) - { - $this->name = $name; - } - - public function getName() - { - return $this->name; - } - - public function setSetter($setter) - { - $this->setter = $setter; - } - - public function getSetter() - { - return $this->setter; - } - - public function setGetter($getter) - { - $this->getter = $getter; - } - - public function getGetter() - { - return $this->getter; - } - - public function setNumber($number) - { - $this->number = $number; - } - - public function getNumber() - { - return $this->number; - } - - public function setLabel($label) - { - $this->label = $label; - } - - public function getLabel() - { - return $this->label; - } - - public function isRepeated() - { - return $this->label === GPBLabel::REPEATED; - } - - public function setType($type) - { - $this->type = $type; - } - - public function getType() - { - return $this->type; - } - - public function setMessageType($message_type) - { - $this->message_type = $message_type; - } - - public function getMessageType() - { - return $this->message_type; - } - - public function setEnumType($enum_type) - { - $this->enum_type = $enum_type; - } - - public function getEnumType() - { - return $this->enum_type; - } - - public function setPacked($packed) - { - $this->packed = $packed; - } - - public function getPacked() - { - return $this->packed; - } - - public function isPackable() - { - return $this->isRepeated() && self::isTypePackable($this->type); - } - - public function isMap() - { - return $this->getType() == GPBType::MESSAGE && - !is_null($this->getMessageType()->getOptions()) && - $this->getMessageType()->getOptions()->getMapEntry(); - } - - private static function isTypePackable($field_type) - { - return ($field_type !== GPBType::STRING && - $field_type !== GPBType::GROUP && - $field_type !== GPBType::MESSAGE && - $field_type !== GPBType::BYTES); - } - - public static function getFieldDescriptor( - $name, - $label, - $type, - $number, - $oneof_index, - $packed, - $type_name = null) - { - $field = new FieldDescriptor(); - $field->setName($name); - $camel_name = implode('', array_map('ucwords', explode('_', $name))); - $field->setGetter('get' . $camel_name); - $field->setSetter('set' . $camel_name); - $field->setType($type); - $field->setNumber($number); - $field->setLabel($label); - $field->setPacked($packed); - $field->setOneofIndex($oneof_index); - - // At this time, the message/enum type may have not been added to pool. - // So we use the type name as place holder and will replace it with the - // actual descriptor in cross building. - switch ($type) { - case GPBType::MESSAGE: - $field->setMessageType($type_name); - break; - case GPBType::ENUM: - $field->setEnumType($type_name); - break; - default: - break; - } - - return $field; - } - - public static function buildFromProto($proto) - { - $type_name = null; - switch ($proto->getType()) { - case GPBType::MESSAGE: - case GPBType::GROUP: - case GPBType::ENUM: - $type_name = $proto->getTypeName(); - break; - default: - break; - } - - $oneof_index = $proto->hasOneofIndex() ? $proto->getOneofIndex() : -1; - $packed = false; - $options = $proto->getOptions(); - if ($options !== null) { - $packed = $options->getPacked(); - } - - return FieldDescriptor::getFieldDescriptor( - $proto->getName(), $proto->getLabel(), $proto->getType(), - $proto->getNumber(), $oneof_index, $packed, $type_name); - } -} diff --git a/php/tests/array_test.php b/php/tests/array_test.php index b55408da..e57f0a7e 100644 --- a/php/tests/array_test.php +++ b/php/tests/array_test.php @@ -19,23 +19,23 @@ class RepeatedFieldTest extends PHPUnit_Framework_TestCase $arr = new RepeatedField(GPBType::INT32); // Test append. - $arr []= MAX_INT32; + $arr[] = MAX_INT32; $this->assertSame(MAX_INT32, $arr[0]); - $arr []= MIN_INT32; + $arr[] = MIN_INT32; $this->assertSame(MIN_INT32, $arr[1]); - $arr []= 1.1; + $arr[] = 1.1; $this->assertSame(1, $arr[2]); - $arr []= MAX_INT32_FLOAT; + $arr[] = MAX_INT32_FLOAT; $this->assertSame(MAX_INT32, $arr[3]); - $arr []= MAX_INT32_FLOAT; + $arr[] = MAX_INT32_FLOAT; $this->assertSame(MAX_INT32, $arr[4]); - $arr []= '2'; + $arr[] = '2'; $this->assertSame(2, $arr[5]); - $arr []= '3.1'; + $arr[] = '3.1'; $this->assertSame(3, $arr[6]); - $arr []= MAX_INT32_STRING; + $arr[] = MAX_INT32_STRING; $this->assertSame(MAX_INT32, $arr[7]); $this->assertEquals(8, count($arr)); @@ -46,29 +46,29 @@ class RepeatedFieldTest extends PHPUnit_Framework_TestCase } // Test set. - $arr [0]= MAX_INT32; + $arr[0] = MAX_INT32; $this->assertSame(MAX_INT32, $arr[0]); - $arr [1]= MIN_INT32; + $arr[1] = MIN_INT32; $this->assertSame(MIN_INT32, $arr[1]); - $arr [2]= 1.1; + $arr[2] = 1.1; $this->assertSame(1, $arr[2]); - $arr [3]= MAX_INT32_FLOAT; + $arr[3] = MAX_INT32_FLOAT; $this->assertSame(MAX_INT32, $arr[3]); - $arr [4]= MAX_INT32_FLOAT; + $arr[4] = MAX_INT32_FLOAT; $this->assertSame(MAX_INT32, $arr[4]); - $arr [5]= '2'; + $arr[5] = '2'; $this->assertSame(2, $arr[5]); - $arr [6]= '3.1'; + $arr[6] = '3.1'; $this->assertSame(3, $arr[6]); - $arr [7]= MAX_INT32_STRING; + $arr[7] = MAX_INT32_STRING; $this->assertSame(MAX_INT32, $arr[7]); // Test foreach. $arr = new RepeatedField(GPBType::INT32); for ($i = 0; $i < 3; $i++) { - $arr []= $i; + $arr[] = $i; } $i = 0; foreach ($arr as $val) { @@ -77,44 +77,6 @@ class RepeatedFieldTest extends PHPUnit_Framework_TestCase $this->assertSame(3, $i); } - /** - * @expectedException PHPUnit_Framework_Error - */ - public function testInt32AppendStringFail() - { - $arr = new RepeatedField(GPBType::INT32); - $arr []= 'abc'; - } - - /** - * @expectedException PHPUnit_Framework_Error - */ - public function testInt32SetStringFail() - { - $arr = new RepeatedField(GPBType::INT32); - $arr []= 0; - $arr [0]= 'abc'; - } - - /** - * @expectedException PHPUnit_Framework_Error - */ - public function testInt32AppendMessageFail() - { - $arr = new RepeatedField(GPBType::INT32); - $arr []= new TestMessage_Sub(); - } - - /** - * @expectedException PHPUnit_Framework_Error - */ - public function testInt32SetMessageFail() - { - $arr = new RepeatedField(GPBType::INT32); - $arr []= 0; - $arr [0]= new TestMessage_Sub(); - } - ######################################################### # Test uint32 field. ######################################################### @@ -124,31 +86,31 @@ class RepeatedFieldTest extends PHPUnit_Framework_TestCase $arr = new RepeatedField(GPBType::UINT32); // Test append. - $arr []= MAX_UINT32; + $arr[] = MAX_UINT32; $this->assertSame(-1, $arr[0]); - $arr []= -1; + $arr[] = -1; $this->assertSame(-1, $arr[1]); - $arr []= MIN_UINT32; + $arr[] = MIN_UINT32; $this->assertSame(MIN_UINT32, $arr[2]); - $arr []= 1.1; + $arr[] = 1.1; $this->assertSame(1, $arr[3]); - $arr []= MAX_UINT32_FLOAT; + $arr[] = MAX_UINT32_FLOAT; $this->assertSame(-1, $arr[4]); - $arr []= -1.0; + $arr[] = -1.0; $this->assertSame(-1, $arr[5]); - $arr []= MIN_UINT32_FLOAT; + $arr[] = MIN_UINT32_FLOAT; $this->assertSame(MIN_UINT32, $arr[6]); - $arr []= '2'; + $arr[] = '2'; $this->assertSame(2, $arr[7]); - $arr []= '3.1'; + $arr[] = '3.1'; $this->assertSame(3, $arr[8]); - $arr []= MAX_UINT32_STRING; + $arr[] = MAX_UINT32_STRING; $this->assertSame(-1, $arr[9]); - $arr []= '-1.0'; + $arr[] = '-1.0'; $this->assertSame(-1, $arr[10]); - $arr []= MIN_UINT32_STRING; + $arr[] = MIN_UINT32_STRING; $this->assertSame(MIN_UINT32, $arr[11]); $this->assertEquals(12, count($arr)); @@ -159,72 +121,34 @@ class RepeatedFieldTest extends PHPUnit_Framework_TestCase } // Test set. - $arr [0]= MAX_UINT32; + $arr[0] = MAX_UINT32; $this->assertSame(-1, $arr[0]); - $arr [1]= -1; + $arr[1] = -1; $this->assertSame(-1, $arr[1]); - $arr [2]= MIN_UINT32; + $arr[2] = MIN_UINT32; $this->assertSame(MIN_UINT32, $arr[2]); - $arr [3]= 1.1; + $arr[3] = 1.1; $this->assertSame(1, $arr[3]); - $arr [4]= MAX_UINT32_FLOAT; + $arr[4] = MAX_UINT32_FLOAT; $this->assertSame(-1, $arr[4]); - $arr [5]= -1.0; + $arr[5] = -1.0; $this->assertSame(-1, $arr[5]); - $arr [6]= MIN_UINT32_FLOAT; + $arr[6] = MIN_UINT32_FLOAT; $this->assertSame(MIN_UINT32, $arr[6]); - $arr [7]= '2'; + $arr[7] = '2'; $this->assertSame(2, $arr[7]); - $arr [8]= '3.1'; + $arr[8] = '3.1'; $this->assertSame(3, $arr[8]); - $arr [9]= MAX_UINT32_STRING; + $arr[9] = MAX_UINT32_STRING; $this->assertSame(-1, $arr[9]); - $arr [10]= '-1.0'; + $arr[10] = '-1.0'; $this->assertSame(-1, $arr[10]); - $arr [11]= MIN_UINT32_STRING; + $arr[11] = MIN_UINT32_STRING; $this->assertSame(MIN_UINT32, $arr[11]); } - /** - * @expectedException PHPUnit_Framework_Error - */ - public function testUint32AppendStringFail() - { - $arr = new RepeatedField(GPBType::UINT32); - $arr []= 'abc'; - } - - /** - * @expectedException PHPUnit_Framework_Error - */ - public function testUint32SetStringFail() - { - $arr = new RepeatedField(GPBType::UINT32); - $arr []= 0; - $arr [0]= 'abc'; - } - - /** - * @expectedException PHPUnit_Framework_Error - */ - public function testUint32AppendMessageFail() - { - $arr = new RepeatedField(GPBType::UINT32); - $arr []= new TestMessage_Sub(); - } - - /** - * @expectedException PHPUnit_Framework_Error - */ - public function testUint32SetMessageFail() - { - $arr = new RepeatedField(GPBType::UINT32); - $arr []= 0; - $arr [0]= new TestMessage_Sub(); - } - ######################################################### # Test int64 field. ######################################################### @@ -234,13 +158,13 @@ class RepeatedFieldTest extends PHPUnit_Framework_TestCase $arr = new RepeatedField(GPBType::INT64); // Test append. - $arr []= MAX_INT64; - $arr []= MIN_INT64; - $arr []= 1.1; - $arr []= '2'; - $arr []= '3.1'; - $arr []= MAX_INT64_STRING; - $arr []= MIN_INT64_STRING; + $arr[] = MAX_INT64; + $arr[] = MIN_INT64; + $arr[] = 1.1; + $arr[] = '2'; + $arr[] = '3.1'; + $arr[] = MAX_INT64_STRING; + $arr[] = MIN_INT64_STRING; if (PHP_INT_SIZE == 4) { $this->assertSame(MAX_INT64, $arr[0]); $this->assertSame(MIN_INT64, $arr[1]); @@ -272,13 +196,13 @@ class RepeatedFieldTest extends PHPUnit_Framework_TestCase } // Test set. - $arr [0]= MAX_INT64; - $arr [1]= MIN_INT64; - $arr [2]= 1.1; - $arr [3]= '2'; - $arr [4]= '3.1'; - $arr [5]= MAX_INT64_STRING; - $arr [6]= MIN_INT64_STRING; + $arr[0] = MAX_INT64; + $arr[1] = MIN_INT64; + $arr[2] = 1.1; + $arr[3] = '2'; + $arr[4] = '3.1'; + $arr[5] = MAX_INT64_STRING; + $arr[6] = MIN_INT64_STRING; if (PHP_INT_SIZE == 4) { $this->assertSame(MAX_INT64_STRING, $arr[0]); @@ -299,44 +223,6 @@ class RepeatedFieldTest extends PHPUnit_Framework_TestCase } } - /** - * @expectedException PHPUnit_Framework_Error - */ - public function testInt64AppendStringFail() - { - $arr = new RepeatedField(GPBType::INT64); - $arr []= 'abc'; - } - - /** - * @expectedException PHPUnit_Framework_Error - */ - public function testInt64SetStringFail() - { - $arr = new RepeatedField(GPBType::INT64); - $arr []= 0; - $arr [0]= 'abc'; - } - - /** - * @expectedException PHPUnit_Framework_Error - */ - public function testInt64AppendMessageFail() - { - $arr = new RepeatedField(GPBType::INT64); - $arr []= new TestMessage_Sub(); - } - - /** - * @expectedException PHPUnit_Framework_Error - */ - public function testInt64SetMessageFail() - { - $arr = new RepeatedField(GPBType::INT64); - $arr []= 0; - $arr [0]= new TestMessage_Sub(); - } - ######################################################### # Test uint64 field. ######################################################### @@ -346,11 +232,11 @@ class RepeatedFieldTest extends PHPUnit_Framework_TestCase $arr = new RepeatedField(GPBType::UINT64); // Test append. - $arr []= MAX_UINT64; - $arr []= 1.1; - $arr []= '2'; - $arr []= '3.1'; - $arr []= MAX_UINT64_STRING; + $arr[] = MAX_UINT64; + $arr[] = 1.1; + $arr[] = '2'; + $arr[] = '3.1'; + $arr[] = MAX_UINT64_STRING; if (PHP_INT_SIZE == 4) { $this->assertSame(MAX_UINT64_STRING, $arr[0]); @@ -379,11 +265,11 @@ class RepeatedFieldTest extends PHPUnit_Framework_TestCase } // Test set. - $arr [0]= MAX_UINT64; - $arr [1]= 1.1; - $arr [2]= '2'; - $arr [3]= '3.1'; - $arr [4]= MAX_UINT64_STRING; + $arr[0] = MAX_UINT64; + $arr[1] = 1.1; + $arr[2] = '2'; + $arr[3] = '3.1'; + $arr[4] = MAX_UINT64_STRING; if (PHP_INT_SIZE == 4) { $this->assertSame(MAX_UINT64_STRING, $arr[0]); @@ -400,44 +286,6 @@ class RepeatedFieldTest extends PHPUnit_Framework_TestCase } } - /** - * @expectedException PHPUnit_Framework_Error - */ - public function testUint64AppendStringFail() - { - $arr = new RepeatedField(GPBType::UINT64); - $arr []= 'abc'; - } - - /** - * @expectedException PHPUnit_Framework_Error - */ - public function testUint64SetStringFail() - { - $arr = new RepeatedField(GPBType::UINT64); - $arr []= 0; - $arr [0]= 'abc'; - } - - /** - * @expectedException PHPUnit_Framework_Error - */ - public function testUint64AppendMessageFail() - { - $arr = new RepeatedField(GPBType::UINT64); - $arr []= new TestMessage_Sub(); - } - - /** - * @expectedException PHPUnit_Framework_Error - */ - public function testUint64SetMessageFail() - { - $arr = new RepeatedField(GPBType::UINT64); - $arr []= 0; - $arr [0]= new TestMessage_Sub(); - } - ######################################################### # Test float field. ######################################################### @@ -447,15 +295,15 @@ class RepeatedFieldTest extends PHPUnit_Framework_TestCase $arr = new RepeatedField(GPBType::FLOAT); // Test append. - $arr []= 1; + $arr[] = 1; $this->assertEquals(1.0, $arr[0], '', MAX_FLOAT_DIFF); - $arr []= 1.1; + $arr[] = 1.1; $this->assertEquals(1.1, $arr[1], '', MAX_FLOAT_DIFF); - $arr []= '2'; + $arr[] = '2'; $this->assertEquals(2.0, $arr[2], '', MAX_FLOAT_DIFF); - $arr []= '3.1'; + $arr[] = '3.1'; $this->assertEquals(3.1, $arr[3], '', MAX_FLOAT_DIFF); $this->assertEquals(4, count($arr)); @@ -466,56 +314,18 @@ class RepeatedFieldTest extends PHPUnit_Framework_TestCase } // Test set. - $arr [0]= 1; + $arr[0] = 1; $this->assertEquals(1.0, $arr[0], '', MAX_FLOAT_DIFF); - $arr [1]= 1.1; + $arr[1] = 1.1; $this->assertEquals(1.1, $arr[1], '', MAX_FLOAT_DIFF); - $arr [2]= '2'; + $arr[2] = '2'; $this->assertEquals(2.0, $arr[2], '', MAX_FLOAT_DIFF); - $arr [3]= '3.1'; + $arr[3] = '3.1'; $this->assertEquals(3.1, $arr[3], '', MAX_FLOAT_DIFF); } - /** - * @expectedException PHPUnit_Framework_Error - */ - public function testFloatAppendStringFail() - { - $arr = new RepeatedField(GPBType::FLOAT); - $arr []= 'abc'; - } - - /** - * @expectedException PHPUnit_Framework_Error - */ - public function testFloatSetStringFail() - { - $arr = new RepeatedField(GPBType::FLOAT); - $arr []= 0.0; - $arr [0]= 'abc'; - } - - /** - * @expectedException PHPUnit_Framework_Error - */ - public function testFloatAppendMessageFail() - { - $arr = new RepeatedField(GPBType::FLOAT); - $arr []= new TestMessage_Sub(); - } - - /** - * @expectedException PHPUnit_Framework_Error - */ - public function testFloatSetMessageFail() - { - $arr = new RepeatedField(GPBType::FLOAT); - $arr []= 0.0; - $arr [0]= new TestMessage_Sub(); - } - ######################################################### # Test double field. ######################################################### @@ -525,15 +335,15 @@ class RepeatedFieldTest extends PHPUnit_Framework_TestCase $arr = new RepeatedField(GPBType::DOUBLE); // Test append. - $arr []= 1; + $arr[] = 1; $this->assertEquals(1.0, $arr[0], '', MAX_FLOAT_DIFF); - $arr []= 1.1; + $arr[] = 1.1; $this->assertEquals(1.1, $arr[1], '', MAX_FLOAT_DIFF); - $arr []= '2'; + $arr[] = '2'; $this->assertEquals(2.0, $arr[2], '', MAX_FLOAT_DIFF); - $arr []= '3.1'; + $arr[] = '3.1'; $this->assertEquals(3.1, $arr[3], '', MAX_FLOAT_DIFF); $this->assertEquals(4, count($arr)); @@ -544,56 +354,18 @@ class RepeatedFieldTest extends PHPUnit_Framework_TestCase } // Test set. - $arr [0]= 1; + $arr[0] = 1; $this->assertEquals(1.0, $arr[0], '', MAX_FLOAT_DIFF); - $arr [1]= 1.1; + $arr[1] = 1.1; $this->assertEquals(1.1, $arr[1], '', MAX_FLOAT_DIFF); - $arr [2]= '2'; + $arr[2] = '2'; $this->assertEquals(2.0, $arr[2], '', MAX_FLOAT_DIFF); - $arr [3]= '3.1'; + $arr[3] = '3.1'; $this->assertEquals(3.1, $arr[3], '', MAX_FLOAT_DIFF); } - /** - * @expectedException PHPUnit_Framework_Error - */ - public function testDoubleAppendStringFail() - { - $arr = new RepeatedField(GPBType::DOUBLE); - $arr []= 'abc'; - } - - /** - * @expectedException PHPUnit_Framework_Error - */ - public function testDoubleSetStringFail() - { - $arr = new RepeatedField(GPBType::DOUBLE); - $arr []= 0.0; - $arr [0]= 'abc'; - } - - /** - * @expectedException PHPUnit_Framework_Error - */ - public function testDoubleAppendMessageFail() - { - $arr = new RepeatedField(GPBType::DOUBLE); - $arr []= new TestMessage_Sub(); - } - - /** - * @expectedException PHPUnit_Framework_Error - */ - public function testDoubleSetMessageFail() - { - $arr = new RepeatedField(GPBType::DOUBLE); - $arr []= 0.0; - $arr [0]= new TestMessage_Sub(); - } - ######################################################### # Test bool field. ######################################################### @@ -603,16 +375,16 @@ class RepeatedFieldTest extends PHPUnit_Framework_TestCase $arr = new RepeatedField(GPBType::BOOL); // Test append. - $arr []= true; + $arr[] = true; $this->assertSame(true, $arr[0]); - $arr []= -1; + $arr[] = -1; $this->assertSame(true, $arr[1]); - $arr []= 1.1; + $arr[] = 1.1; $this->assertSame(true, $arr[2]); - $arr []= ''; + $arr[] = ''; $this->assertSame(false, $arr[3]); $this->assertEquals(4, count($arr)); @@ -623,38 +395,19 @@ class RepeatedFieldTest extends PHPUnit_Framework_TestCase } // Test set. - $arr [0]= true; + $arr[0] = true; $this->assertSame(true, $arr[0]); - $arr [1]= -1; + $arr[1] = -1; $this->assertSame(true, $arr[1]); - $arr [2]= 1.1; + $arr[2] = 1.1; $this->assertSame(true, $arr[2]); - $arr [3]= ''; + $arr[3] = ''; $this->assertSame(false, $arr[3]); } - /** - * @expectedException PHPUnit_Framework_Error - */ - public function testBoolAppendMessageFail() - { - $arr = new RepeatedField(GPBType::BOOL); - $arr []= new TestMessage_Sub(); - } - - /** - * @expectedException PHPUnit_Framework_Error - */ - public function testBoolSetMessageFail() - { - $arr = new RepeatedField(GPBType::BOOL); - $arr []= true; - $arr [0]= new TestMessage_Sub(); - } - ######################################################### # Test string field. ######################################################### @@ -664,16 +417,16 @@ class RepeatedFieldTest extends PHPUnit_Framework_TestCase $arr = new RepeatedField(GPBType::STRING); // Test append. - $arr []= 'abc'; + $arr[] = 'abc'; $this->assertSame('abc', $arr[0]); - $arr []= 1; + $arr[] = 1; $this->assertSame('1', $arr[1]); - $arr []= 1.1; + $arr[] = 1.1; $this->assertSame('1.1', $arr[2]); - $arr []= true; + $arr[] = true; $this->assertSame('1', $arr[3]); $this->assertEquals(4, count($arr)); @@ -684,59 +437,19 @@ class RepeatedFieldTest extends PHPUnit_Framework_TestCase } // Test set. - $arr [0]= 'abc'; + $arr[0] = 'abc'; $this->assertSame('abc', $arr[0]); - $arr [1]= 1; + $arr[1] = 1; $this->assertSame('1', $arr[1]); - $arr [2]= 1.1; + $arr[2] = 1.1; $this->assertSame('1.1', $arr[2]); - $arr [3]= true; + $arr[3] = true; $this->assertSame('1', $arr[3]); } - /** - * @expectedException PHPUnit_Framework_Error - */ - public function testStringAppendMessageFail() - { - $arr = new RepeatedField(GPBType::STRING); - $arr []= new TestMessage_Sub(); - } - - /** - * @expectedException PHPUnit_Framework_Error - */ - public function testStringSetMessageFail() - { - $arr = new RepeatedField(GPBType::STRING); - $arr []= 'abc'; - $arr [0]= new TestMessage_Sub(); - } - - /** - * @expectedException PHPUnit_Framework_Error - */ - public function testStringAppendInvalidUTF8Fail() - { - $arr = new RepeatedField(GPBType::STRING); - $hex = hex2bin("ff"); - $arr []= $hex; - } - - /** - * @expectedException PHPUnit_Framework_Error - */ - public function testStringSetInvalidUTF8Fail() - { - $arr = new RepeatedField(GPBType::STRING); - $arr []= 'abc'; - $hex = hex2bin("ff"); - $arr [0]= $hex; - } - ######################################################### # Test message field. ######################################################### @@ -748,7 +461,7 @@ class RepeatedFieldTest extends PHPUnit_Framework_TestCase // Test append. $sub_m = new TestMessage_Sub(); $sub_m->setA(1); - $arr []= $sub_m; + $arr[] = $sub_m; $this->assertSame(1, $arr[0]->getA()); $this->assertEquals(1, count($arr)); @@ -756,78 +469,10 @@ class RepeatedFieldTest extends PHPUnit_Framework_TestCase // Test set. $sub_m = new TestMessage_Sub(); $sub_m->setA(2); - $arr [0]= $sub_m; + $arr[0] = $sub_m; $this->assertSame(2, $arr[0]->getA()); } - /** - * @expectedException PHPUnit_Framework_Error - */ - public function testMessageAppendIntFail() - { - $arr = new RepeatedField(GPBType::MESSAGE, TestMessage_Sub::class); - $arr []= 1; - } - - /** - * @expectedException PHPUnit_Framework_Error - */ - public function testMessageSetIntFail() - { - $arr = new RepeatedField(GPBType::MESSAGE, TestMessage_Sub::class); - $arr []= new TestMessage_Sub; - $arr [0]= 'abc'; - } - - /** - * @expectedException PHPUnit_Framework_Error - */ - public function testMessageAppendStringFail() - { - $arr = new RepeatedField(GPBType::MESSAGE, TestMessage_Sub::class); - $arr []= 'abc'; - } - - /** - * @expectedException PHPUnit_Framework_Error - */ - public function testMessageSetStringFail() - { - $arr = new RepeatedField(GPBType::MESSAGE, TestMessage_Sub::class); - $arr []= new TestMessage_Sub; - $arr [0]= 'abc'; - } - - /** - * @expectedException PHPUnit_Framework_Error - */ - public function testMessageAppendOtherMessageFail() - { - $arr = new RepeatedField(GPBType::MESSAGE, TestMessage_Sub::class); - $arr []= new TestMessage; - } - - /** - * @expectedException PHPUnit_Framework_Error - */ - public function testMessageAppendNullFail() - { - $arr = new RepeatedField(GPBType::MESSAGE, TestMessage_Sub::class); - $null = null; - $arr []= $null; - } - - /** - * @expectedException PHPUnit_Framework_Error - */ - public function testMessageSetNullFail() - { - $arr = new RepeatedField(GPBType::MESSAGE, TestMessage_Sub::class); - $arr []= new TestMessage_Sub(); - $null = null; - $arr[0] = $null; - } - ######################################################### # Test offset type ######################################################### @@ -835,18 +480,18 @@ class RepeatedFieldTest extends PHPUnit_Framework_TestCase public function testOffset() { $arr = new RepeatedField(GPBType::INT32); - $arr []= 0; + $arr[] = 0; - $arr [0]= 1; + $arr[0] = 1; $this->assertSame(1, $arr[0]); $this->assertSame(1, count($arr)); - $arr ['0']= 2; + $arr['0'] = 2; $this->assertSame(2, $arr['0']); $this->assertSame(2, $arr[0]); $this->assertSame(1, count($arr)); - $arr [0.0]= 3; + $arr[0.0] = 3; $this->assertSame(3, $arr[0.0]); $this->assertSame(1, count($arr)); } @@ -855,9 +500,9 @@ class RepeatedFieldTest extends PHPUnit_Framework_TestCase { $arr = new RepeatedField(GPBType::INT32); - $arr []= 0; - $arr []= 1; - $arr []= 2; + $arr[] = 0; + $arr[] = 1; + $arr[] = 2; $this->assertSame(3, count($arr)); unset($arr[2]); @@ -865,86 +510,34 @@ class RepeatedFieldTest extends PHPUnit_Framework_TestCase $this->assertSame(0, $arr[0]); $this->assertSame(1, $arr[1]); - $arr [] = 3; + $arr[] = 3; $this->assertSame(3, count($arr)); $this->assertSame(0, $arr[0]); $this->assertSame(1, $arr[1]); $this->assertSame(3, $arr[2]); } - /** - * @expectedException PHPUnit_Framework_Error - */ - public function testRemoveMiddleFail() - { - $arr = new RepeatedField(GPBType::INT32); - - $arr []= 0; - $arr []= 1; - $arr []= 2; - $this->assertSame(3, count($arr)); - - unset($arr[1]); - } - - /** - * @expectedException PHPUnit_Framework_Error - */ - public function testRemoveEmptyFail() - { - $arr = new RepeatedField(GPBType::INT32); - - unset($arr[0]); - } - - /** - * @expectedException PHPUnit_Framework_Error - */ - public function testMessageOffsetFail() - { - $arr = new RepeatedField(GPBType::INT32); - $arr []= 0; - $arr [new TestMessage_Sub()]= 0; - } - - /** - * @expectedException PHPUnit_Framework_Error - */ - public function testStringOffsetFail() - { - $arr = new RepeatedField(GPBType::INT32); - $arr []= 0; - $arr ['abc']= 0; - } - - /** - * @expectedException PHPUnit_Framework_Error - */ - public function testSetNonExistedOffsetFail() - { - $arr = new RepeatedField(GPBType::INT32); - $arr [0]= 0; - } - ######################################################### # Test memory leak ######################################################### - public function testCycleLeak() - { - $arr = new RepeatedField(GPBType::MESSAGE, TestMessage::class); - $arr []= new TestMessage; - $arr[0]->SetRepeatedRecursive($arr); - - // Clean up memory before test. - gc_collect_cycles(); - $start = memory_get_usage(); - unset($arr); - - // Explicitly trigger garbage collection. - gc_collect_cycles(); - - $end = memory_get_usage(); - $this->assertLessThan($start, $end); - } + // COMMENTED OUT BY @bshaffer + // @see https://github.com/google/protobuf/pull/3344#issuecomment-315162761 + // public function testCycleLeak() + // { + // $arr = new RepeatedField(GPBType::MESSAGE, TestMessage::class); + // $arr[] = new TestMessage; + // $arr[0]->SetRepeatedRecursive($arr); + + // // Clean up memory before test. + // gc_collect_cycles(); + // $start = memory_get_usage(); + // unset($arr); + + // // Explicitly trigger garbage collection. + // gc_collect_cycles(); + + // $end = memory_get_usage(); + // $this->assertLessThan($start, $end); + // } } diff --git a/php/tests/compatibility_test.sh b/php/tests/compatibility_test.sh new file mode 100755 index 00000000..6f1e4900 --- /dev/null +++ b/php/tests/compatibility_test.sh @@ -0,0 +1,141 @@ +#!/bin/bash + +function use_php() { + VERSION=$1 + PHP=`which php` + PHP_CONFIG=`which php-config` + PHPIZE=`which phpize` + ln -sfn "/usr/local/php-${VERSION}/bin/php" $PHP + ln -sfn "/usr/local/php-${VERSION}/bin/php-config" $PHP_CONFIG + ln -sfn "/usr/local/php-${VERSION}/bin/phpize" $PHPIZE +} + +function generate_proto() { + PROTOC1=$1 + PROTOC2=$2 + + rm -rf generated + mkdir generated + + $PROTOC1 --php_out=generated proto/test_include.proto + $PROTOC2 --php_out=generated proto/test.proto proto/test_no_namespace.proto proto/test_prefix.proto + pushd ../../src + $PROTOC2 --php_out=../php/tests/generated google/protobuf/empty.proto + $PROTOC2 --php_out=../php/tests/generated -I../php/tests -I. ../php/tests/proto/test_import_descriptor_proto.proto + popd +} + +# Remove tests to expect error. These were added to API tests by mistake. +function remove_error_test() { + local TEMPFILE=`tempfile` + cat $1 | \ + awk -v file=`basename $1` -v dir=`basename $(dirname $1)` ' + BEGIN { + show = 1 + } + /@expectedException PHPUnit_Framework_Error/ { show = 0; next; } + / *\*\// { print; next; } + / *}/ { + if (!show) { + show = 1; + next; + } + } + show { print } + ' > $TEMPFILE + cp $TEMPFILE $1 +} + +set -ex + +# Change to the script's directory. +cd $(dirname $0) + +# The old version of protobuf that we are testing compatibility against. +case "$1" in + ""|3.3.0) + OLD_VERSION=3.3.0 + OLD_VERSION_PROTOC=http://repo1.maven.org/maven2/com/google/protobuf/protoc/3.3.0/protoc-3.3.0-linux-x86_64.exe + ;; + *) + echo "[ERROR]: Unknown version number: $1" + exit 1 + ;; +esac + +# Extract the latest protobuf version number. +VERSION_NUMBER=`grep "PHP_PROTOBUF_VERSION" ../ext/google/protobuf/protobuf.h | sed "s|#define PHP_PROTOBUF_VERSION \"\(.*\)\"|\1|"` + +echo "Running compatibility tests between $VERSION_NUMBER and $OLD_VERSION" + +# Check protoc +[ -f ../../src/protoc ] || { + echo "[ERROR]: Please build protoc first." + exit 1 +} + +# Download old test. +rm -rf protobuf +git clone https://github.com/google/protobuf.git +pushd protobuf +git checkout v$OLD_VERSION +popd + +# Build and copy the new runtime +use_php 5.5 +pushd ../ext/google/protobuf +make clean || true +phpize && ./configure && make +popd + +rm -rf protobuf/php/ext +rm -rf protobuf/php/src +cp -r ../ext protobuf/php/ext/ +cp -r ../src protobuf/php/src/ + +# Download old version protoc compiler (for linux) +wget $OLD_VERSION_PROTOC -O old_protoc +chmod +x old_protoc + +NEW_PROTOC=`pwd`/../../src/protoc +OLD_PROTOC=`pwd`/old_protoc +cd protobuf/php +cp -r /usr/local/vendor-5.5 vendor +wget https://phar.phpunit.de/phpunit-4.8.0.phar -O /usr/bin/phpunit + +# Remove implementation detail tests. +tests=( array_test.php encode_decode_test.php generated_class_test.php map_field_test.php well_known_test.php ) +sed -i.bak '/php_implementation_test.php/d' phpunit.xml +for t in "${tests[@]}" +do + remove_error_test tests/$t +done + +cd tests + +# Test A.1: +# proto set 1: use old version +# proto set 2 which may import protos in set 1: use old version +generate_proto $OLD_PROTOC $OLD_PROTOC +./test.sh +pushd .. +phpunit +popd + +# Test A.2: +# proto set 1: use new version +# proto set 2 which may import protos in set 1: use old version +generate_proto $NEW_PROTOC $OLD_PROTOC +./test.sh +pushd .. +phpunit +popd + +# Test A.3: +# proto set 1: use old version +# proto set 2 which may import protos in set 1: use new version +generate_proto $OLD_PROTOC $NEW_PROTOC +./test.sh +pushd .. +phpunit +popd diff --git a/php/tests/encode_decode_test.php b/php/tests/encode_decode_test.php index 288df569..b43dffb4 100644 --- a/php/tests/encode_decode_test.php +++ b/php/tests/encode_decode_test.php @@ -9,6 +9,7 @@ use Foo\TestEnum; use Foo\TestMessage; use Foo\TestMessage_Sub; use Foo\TestPackedMessage; +use Foo\TestRandomFieldOrder; use Foo\TestUnpackedMessage; class EncodeDecodeTest extends TestBase @@ -88,6 +89,30 @@ class EncodeDecodeTest extends TestBase $n = new TestMessage(); $n->mergeFromString($data); $this->assertSame(1, $n->getOneofMessage()->getA()); + + // Encode default value + $m->setOneofEnum(TestEnum::ZERO); + $data = $m->serializeToString(); + $n = new TestMessage(); + $n->mergeFromString($data); + $this->assertSame("oneof_enum", $n->getMyOneof()); + $this->assertSame(TestEnum::ZERO, $n->getOneofEnum()); + + $m->setOneofString(""); + $data = $m->serializeToString(); + $n = new TestMessage(); + $n->mergeFromString($data); + $this->assertSame("oneof_string", $n->getMyOneof()); + $this->assertSame("", $n->getOneofString()); + + $sub_m = new TestMessage_Sub(); + $m->setOneofMessage($sub_m); + $data = $m->serializeToString(); + $n = new TestMessage(); + $n->mergeFromString($data); + $this->assertSame("oneof_message", $n->getMyOneof()); + $this->assertFalse(is_null($n->getOneofMessage())); + } public function testPackedEncode() @@ -211,6 +236,13 @@ class EncodeDecodeTest extends TestBase $this->assertEquals(-1, $m->getOptionalInt32()); } + public function testRandomFieldOrder() + { + $m = new TestRandomFieldOrder(); + $data = $m->serializeToString(); + $this->assertSame("", $data); + } + /** * @expectedException Exception */ @@ -409,15 +441,13 @@ class EncodeDecodeTest extends TestBase $m->mergeFromString(hex2bin('D205')); } - # TODO(teboring): Add test back when php implementation is ready for json - # encode/decode. - # public function testJsonEncode() - # { - # $from = new TestMessage(); - # $this->setFields($from); - # $data = $from->jsonEncode(); - # $to = new TestMessage(); - # $to->jsonDecode($data); - # $this->expectFields($to); - # } + public function testJsonEncode() + { + $from = new TestMessage(); + $this->setFields($from); + $data = $from->serializeToJsonString(); + $to = new TestMessage(); + $to->mergeFromJsonString($data); + $this->expectFields($to); + } } diff --git a/php/tests/gdb_test.sh b/php/tests/gdb_test.sh index 0809bef3..484e2edf 100755 --- a/php/tests/gdb_test.sh +++ b/php/tests/gdb_test.sh @@ -3,7 +3,7 @@ # gdb --args php -dextension=../ext/google/protobuf/modules/protobuf.so `which # phpunit` --bootstrap autoload.php tmp_test.php # -gdb --args php -dextension=../ext/google/protobuf/modules/protobuf.so `which phpunit` --bootstrap autoload.php well_known_test.php +gdb --args php -dextension=../ext/google/protobuf/modules/protobuf.so `which phpunit` --bootstrap autoload.php encode_decode_test.php # # gdb --args php -dextension=../ext/google/protobuf/modules/protobuf.so memory_leak_test.php # diff --git a/php/tests/generated_class_test.php b/php/tests/generated_class_test.php index 21ee8490..56e3be20 100644 --- a/php/tests/generated_class_test.php +++ b/php/tests/generated_class_test.php @@ -9,9 +9,11 @@ use Google\Protobuf\Internal\RepeatedField; use Google\Protobuf\Internal\MapField; use Google\Protobuf\Internal\GPBType; use Foo\TestEnum; +use Foo\TestIncludeNamespaceMessage; use Foo\TestIncludePrefixMessage; use Foo\TestMessage; use Foo\TestMessage_Sub; +use Php\Test\TestNamespace; class GeneratedClassTest extends TestBase { @@ -60,24 +62,6 @@ class GeneratedClassTest extends TestBase $this->assertSame(MIN_INT32, $m->getOptionalInt32()); } - /** - * @expectedException PHPUnit_Framework_Error - */ - public function testInt32FieldInvalidTypeFail() - { - $m = new TestMessage(); - $m->setOptionalInt32(new TestMessage()); - } - - /** - * @expectedException PHPUnit_Framework_Error - */ - public function testInt32FieldInvalidStringFail() - { - $m = new TestMessage(); - $m->setOptionalInt32('abc'); - } - ######################################################### # Test uint32 field. ######################################################### @@ -117,24 +101,6 @@ class GeneratedClassTest extends TestBase $this->assertSame(MIN_INT32, $m->getOptionalUint32()); } - /** - * @expectedException PHPUnit_Framework_Error - */ - public function testUint32FieldInvalidTypeFail() - { - $m = new TestMessage(); - $m->setOptionalUint32(new TestMessage()); - } - - /** - * @expectedException PHPUnit_Framework_Error - */ - public function testUint32FieldInvalidStringFail() - { - $m = new TestMessage(); - $m->setOptionalUint32('abc'); - } - ######################################################### # Test int64 field. ######################################################### @@ -187,24 +153,6 @@ class GeneratedClassTest extends TestBase } } - /** - * @expectedException PHPUnit_Framework_Error - */ - public function testInt64FieldInvalidTypeFail() - { - $m = new TestMessage(); - $m->setOptionalInt64(new TestMessage()); - } - - /** - * @expectedException PHPUnit_Framework_Error - */ - public function testInt64FieldInvalidStringFail() - { - $m = new TestMessage(); - $m->setOptionalInt64('abc'); - } - ######################################################### # Test uint64 field. ######################################################### @@ -252,24 +200,6 @@ class GeneratedClassTest extends TestBase } } - /** - * @expectedException PHPUnit_Framework_Error - */ - public function testUint64FieldInvalidTypeFail() - { - $m = new TestMessage(); - $m->setOptionalUint64(new TestMessage()); - } - - /** - * @expectedException PHPUnit_Framework_Error - */ - public function testUint64FieldInvalidStringFail() - { - $m = new TestMessage(); - $m->setOptionalUint64('abc'); - } - ######################################################### # Test enum field. ######################################################### @@ -324,24 +254,6 @@ class GeneratedClassTest extends TestBase $this->assertEquals(3.1, $m->getOptionalFloat(), '', MAX_FLOAT_DIFF); } - /** - * @expectedException PHPUnit_Framework_Error - */ - public function testFloatFieldInvalidTypeFail() - { - $m = new TestMessage(); - $m->setOptionalFloat(new TestMessage()); - } - - /** - * @expectedException PHPUnit_Framework_Error - */ - public function testFloatFieldInvalidStringFail() - { - $m = new TestMessage(); - $m->setOptionalFloat('abc'); - } - ######################################################### # Test double field. ######################################################### @@ -365,24 +277,6 @@ class GeneratedClassTest extends TestBase $this->assertEquals(3.1, $m->getOptionalDouble(), '', MAX_FLOAT_DIFF); } - /** - * @expectedException PHPUnit_Framework_Error - */ - public function testDoubleFieldInvalidTypeFail() - { - $m = new TestMessage(); - $m->setOptionalDouble(new TestMessage()); - } - - /** - * @expectedException PHPUnit_Framework_Error - */ - public function testDoubleFieldInvalidStringFail() - { - $m = new TestMessage(); - $m->setOptionalDouble('abc'); - } - ######################################################### # Test bool field. ######################################################### @@ -408,15 +302,6 @@ class GeneratedClassTest extends TestBase $this->assertSame(false, $m->getOptionalBool()); } - /** - * @expectedException PHPUnit_Framework_Error - */ - public function testBoolFieldInvalidStringFail() - { - $m = new TestMessage(); - $m->setOptionalBool(new TestMessage()); - } - ######################################################### # Test string field. ######################################################### @@ -442,16 +327,6 @@ class GeneratedClassTest extends TestBase $this->assertSame('1', $m->getOptionalString()); } - /** - * @expectedException PHPUnit_Framework_Error - */ - public function testStringFieldInvalidUTF8Fail() - { - $m = new TestMessage(); - $hex = hex2bin("ff"); - $m->setOptionalString($hex); - } - ######################################################### # Test bytes field. ######################################################### @@ -502,25 +377,6 @@ class GeneratedClassTest extends TestBase $this->assertNull($m->getOptionalMessage()); } - /** - * @expectedException PHPUnit_Framework_Error - */ - public function testMessageFieldWrongTypeFail() - { - $m = new TestMessage(); - $a = 1; - $m->setOptionalMessage($a); - } - - /** - * @expectedException PHPUnit_Framework_Error - */ - public function testMessageFieldWrongClassFail() - { - $m = new TestMessage(); - $m->setOptionalMessage(new TestMessage()); - } - ######################################################### # Test repeated field. ######################################################### @@ -554,48 +410,6 @@ class GeneratedClassTest extends TestBase $this->assertFalse($arr instanceof RepeatedField); } - /** - * @expectedException PHPUnit_Framework_Error - */ - public function testRepeatedFieldWrongTypeFail() - { - $m = new TestMessage(); - $a = 1; - $m->setRepeatedInt32($a); - } - - /** - * @expectedException PHPUnit_Framework_Error - */ - public function testRepeatedFieldWrongObjectFail() - { - $m = new TestMessage(); - $m->setRepeatedInt32($m); - } - - /** - * @expectedException PHPUnit_Framework_Error - */ - public function testRepeatedFieldWrongRepeatedTypeFail() - { - $m = new TestMessage(); - - $repeated_int32 = new RepeatedField(GPBType::UINT32); - $m->setRepeatedInt32($repeated_int32); - } - - /** - * @expectedException PHPUnit_Framework_Error - */ - public function testRepeatedFieldWrongRepeatedMessageClassFail() - { - $m = new TestMessage(); - - $repeated_message = new RepeatedField(GPBType::MESSAGE, - TestMessage::class); - $m->setRepeatedMessage($repeated_message); - } - ######################################################### # Test map field. ######################################################### @@ -627,49 +441,6 @@ class GeneratedClassTest extends TestBase $this->assertFalse($dict instanceof MapField); } - /** - * @expectedException PHPUnit_Framework_Error - */ - public function testMapFieldWrongTypeFail() - { - $m = new TestMessage(); - $a = 1; - $m->setMapInt32Int32($a); - } - - /** - * @expectedException PHPUnit_Framework_Error - */ - public function testMapFieldWrongObjectFail() - { - $m = new TestMessage(); - $m->setMapInt32Int32($m); - } - - /** - * @expectedException PHPUnit_Framework_Error - */ - public function testMapFieldWrongRepeatedTypeFail() - { - $m = new TestMessage(); - - $map_uint32_uint32 = new MapField(GPBType::UINT32, GPBType::UINT32); - $m->setMapInt32Int32($map_uint32_uint32); - } - - /** - * @expectedException PHPUnit_Framework_Error - */ - public function testMapFieldWrongRepeatedMessageClassFail() - { - $m = new TestMessage(); - - $map_int32_message = new MapField(GPBType::INT32, - GPBType::MESSAGE, - TestMessage::class); - $m->setMapInt32Message($map_int32_message); - } - ######################################################### # Test oneof field. ######################################################### @@ -741,24 +512,44 @@ class GeneratedClassTest extends TestBase $n->setOptionalInt32(100); $sub1 = new TestMessage_Sub(); $sub1->setA(101); - $sub1->getB()[] = 102; + + $b = $sub1->getB(); + $b[] = 102; + $sub1->setB($b); + $n->setOptionalMessage($sub1); // Repeated - $n->getRepeatedInt32()[] = 200; - $n->getRepeatedString()[] = 'abc'; + $repeatedInt32 = $n->getRepeatedInt32(); + $repeatedInt32[] = 200; + $n->setRepeatedInt32($repeatedInt32); + + $repeatedString = $n->getRepeatedString(); + $repeatedString[] = 'abc'; + $n->setRepeatedString($repeatedString); + $sub2 = new TestMessage_Sub(); $sub2->setA(201); - $n->getRepeatedMessage()[] = $sub2; + $repeatedMessage = $n->getRepeatedMessage(); + $repeatedMessage[] = $sub2; + $n->setRepeatedMessage($repeatedMessage); // Map - $n->getMapInt32Int32()[1] = 300; - $n->getMapInt32Int32()[-62] = 301; - $n->getMapStringString()['def'] = 'def'; - $n->getMapInt32Message()[1] = new TestMessage_Sub(); - $n->getMapInt32Message()[1]->setA(302); - $n->getMapInt32Message()[2] = new TestMessage_Sub(); - $n->getMapInt32Message()[2]->setA(303); + $mapInt32Int32 = $n->getMapInt32Int32(); + $mapInt32Int32[1] = 300; + $mapInt32Int32[-62] = 301; + $n->setMapInt32Int32($mapInt32Int32); + + $mapStringString = $n->getMapStringString(); + $mapStringString['def'] = 'def'; + $n->setMapStringString($mapStringString); + + $mapInt32Message = $n->getMapInt32Message(); + $mapInt32Message[1] = new TestMessage_Sub(); + $mapInt32Message[1]->setA(302); + $mapInt32Message[2] = new TestMessage_Sub(); + $mapInt32Message[2]->setA(303); + $n->setMapInt32Message($mapInt32Message); $m->mergeFrom($n); @@ -793,9 +584,16 @@ class GeneratedClassTest extends TestBase // Check sub-messages are copied by value. $n->getOptionalMessage()->setA(-101); $this->assertSame(101, $m->getOptionalMessage()->getA()); - $n->getRepeatedMessage()[0]->setA(-201); + + $repeatedMessage = $n->getRepeatedMessage(); + $repeatedMessage[0]->setA(-201); + $n->setRepeatedMessage($repeatedMessage); $this->assertSame(201, $m->getRepeatedMessage()[2]->getA()); - $n->getMapInt32Message()[1]->setA(-302); + + $mapInt32Message = $n->getMapInt32Message(); + $mapInt32Message[1]->setA(-302); + $n->setMapInt32Message($mapInt32Message); + $this->assertSame(302, $m->getMapInt32Message()[1]->getA()); // Test merge oneof. @@ -822,16 +620,6 @@ class GeneratedClassTest extends TestBase $this->expectFields($n); } - /** - * @expectedException PHPUnit_Framework_Error - */ - public function testMessageMergeFromInvalidTypeFail() - { - $m = new TestMessage(); - $n = new TestMessage_Sub(); - $m->mergeFrom($n); - } - ######################################################### # Test message/enum without namespace. ######################################################### @@ -841,7 +629,9 @@ class GeneratedClassTest extends TestBase $m = new TestMessage(); $sub = new NoNameSpaceMessage(); $m->setOptionalNoNamespaceMessage($sub); - $m->getRepeatedNoNamespaceMessage()[] = new NoNameSpaceMessage(); + $repeatedNoNamespaceMessage = $m->getRepeatedNoNamespaceMessage(); + $repeatedNoNamespaceMessage[] = new NoNameSpaceMessage(); + $m->setRepeatedNoNamespaceMessage($repeatedNoNamespaceMessage); $n = new NoNamespaceMessage(); $n->setB(NoNamespaceMessage_NestedEnum::ZERO); @@ -851,7 +641,9 @@ class GeneratedClassTest extends TestBase { $m = new TestMessage(); $m->setOptionalNoNamespaceEnum(NoNameSpaceEnum::VALUE_A); - $m->getRepeatedNoNamespaceEnum()[] = NoNameSpaceEnum::VALUE_A; + $repeatedNoNamespaceEnum = $m->getRepeatedNoNamespaceEnum(); + $repeatedNoNamespaceEnum[] = NoNameSpaceEnum::VALUE_A; + $m->setRepeatedNoNamespaceEnum($repeatedNoNamespaceEnum); } ######################################################### @@ -868,6 +660,25 @@ class GeneratedClassTest extends TestBase } ######################################################### + # Test message with given namespace. + ######################################################### + + public function testNamespaceMessage() + { + $m = new TestIncludeNamespaceMessage(); + + $n = new TestNamespace(); + $n->setA(1); + $m->setNamespaceMessage($n); + $this->assertSame(1, $m->getNamespaceMessage()->getA()); + + $n = new TestEmptyNamespace(); + $n->setA(1); + $m->setEmptyNamespaceMessage($n); + $this->assertSame(1, $m->getEmptyNamespaceMessage()->getA()); + } + + ######################################################### # Test prefix for reserved words. ######################################################### @@ -876,5 +687,19 @@ class GeneratedClassTest extends TestBase $m = new \Foo\TestMessage_Empty(); $m = new \Foo\PBEmpty(); $m = new \PrefixEmpty(); + $m = new \Foo\PBARRAY(); + } + + ######################################################### + # Test fluent setters. + ######################################################### + + public function testFluentSetters() + { + $m = (new TestMessage()) + ->setOptionalInt32(1) + ->setOptionalUInt32(2); + $this->assertSame(1, $m->getOptionalInt32()); + $this->assertSame(2, $m->getOptionalUInt32()); } } diff --git a/php/tests/generated_phpdoc_test.php b/php/tests/generated_phpdoc_test.php new file mode 100644 index 00000000..6c1a26f7 --- /dev/null +++ b/php/tests/generated_phpdoc_test.php @@ -0,0 +1,337 @@ +<?php + +require_once('generated/NoNamespaceEnum.php'); +require_once('generated/NoNamespaceMessage.php'); +require_once('test_base.php'); +require_once('test_util.php'); + +use Foo\TestMessage; + +class GeneratedPhpdocTest extends TestBase +{ + public function testPhpDocForClass() + { + $class = new ReflectionClass('Foo\TestMessage'); + $doc = $class->getDocComment(); + $this->assertContains('foo.TestMessage', $doc); + } + + /** + * @dataProvider providePhpDocForGettersAndSetters + */ + public function testPhpDocForIntGetters($methods, $expectedDoc) + { + $class = new ReflectionClass('Foo\TestMessage'); + foreach ($methods as $method) { + $doc = $class->getMethod($method)->getDocComment(); + $this->assertContains($expectedDoc, $doc); + } + } + + public function providePhpDocForGettersAndSetters() + { + return [ + [ + [ + 'setOptionalInt32', + 'setOptionalUint32', + 'setOptionalSint32', + 'setOptionalFixed32', + 'setOptionalSfixed32', + 'setOneofInt32', + 'setOneofUint32', + 'setOneofSint32', + 'setOneofFixed32', + 'setOneofSfixed32', + 'setOptionalEnum', + 'setOptionalNoNamespaceEnum', + 'setOptionalNestedEnum', + 'setOneofEnum' + ], + '@param int $var' + ], + [ + [ + 'setOptionalInt64', + 'setOptionalUint64', + 'setOptionalSint64', + 'setOptionalFixed64', + 'setOptionalSfixed64', + 'setOneofInt64', + 'setOneofUint64', + 'setOneofSint64', + 'setOneofFixed64', + 'setOneofSfixed64', + ], + '@param int|string $var' + ], + [ + [ + 'getOptionalInt32', + 'getOptionalUint32', + 'getOptionalSint32', + 'getOptionalFixed32', + 'getOptionalSfixed32', + 'getOneofInt32', + 'getOneofUint32', + 'getOneofSint32', + 'getOneofFixed32', + 'getOneofSfixed32', + 'getOptionalEnum', + 'getOptionalNoNamespaceEnum', + 'getOptionalNestedEnum', + 'getOneofEnum', + ], + '@return int' + ], + [ + [ + 'setOptionalInt64', + 'setOptionalUint64', + 'setOptionalSint64', + 'setOptionalFixed64', + 'setOptionalSfixed64', + 'setOneofInt64', + 'setOneofUint64', + 'setOneofSint64', + 'setOneofFixed64', + 'setOneofSfixed64', + ], + '@param int|string $var' + ], + [ + [ + 'getRepeatedInt32', + 'getRepeatedInt64', + 'getRepeatedUint32', + 'getRepeatedUint64', + 'getRepeatedSint32', + 'getRepeatedSint64', + 'getRepeatedFixed32', + 'getRepeatedFixed64', + 'getRepeatedSfixed32', + 'getRepeatedSfixed64', + 'getRepeatedFloat', + 'getRepeatedDouble', + 'getRepeatedBool', + 'getRepeatedString', + 'getRepeatedBytes', + 'getRepeatedEnum', + 'getRepeatedMessage', + 'getRepeatedRecursive', + 'getRepeatedNoNamespaceMessage', + 'getRepeatedNoNamespaceEnum', + ], + '@return \Google\Protobuf\Internal\RepeatedField' + ], + [ + [ + 'getMapInt32Int32', + 'getMapInt64Int64', + 'getMapUint32Uint32', + 'getMapUint64Uint64', + 'getMapSint32Sint32', + 'getMapSint64Sint64', + 'getMapFixed32Fixed32', + 'getMapFixed64Fixed64', + 'getMapSfixed32Sfixed32', + 'getMapSfixed64Sfixed64', + 'getMapInt32Float', + 'getMapInt32Double', + 'getMapBoolBool', + 'getMapStringString', + 'getMapInt32Bytes', + 'getMapInt32Enum', + 'getMapInt32Message', + 'getMapRecursive', + ], + '@return \Google\Protobuf\Internal\MapField' + ], + [ + [ + 'setRepeatedInt32', + 'setRepeatedUint32', + 'setRepeatedSint32', + 'setRepeatedFixed32', + 'setRepeatedSfixed32', + 'setRepeatedEnum', + 'setRepeatedNoNamespaceEnum', + ], + '@param int[]|\Google\Protobuf\Internal\RepeatedField $var' + ], + [ + [ + 'setRepeatedInt64', + 'setRepeatedUint64', + 'setRepeatedSint64', + 'setRepeatedFixed64', + 'setRepeatedSfixed64', + ], + '@param int[]|string[]|\Google\Protobuf\Internal\RepeatedField $var' + ], + [ + [ + 'setRepeatedFloat', + 'setRepeatedDouble', + ], + '@param float[]|\Google\Protobuf\Internal\RepeatedField $var' + ], + [ + [ + 'setRepeatedBool', + ], + '@param bool[]|\Google\Protobuf\Internal\RepeatedField $var' + ], + [ + [ + 'setRepeatedString', + 'setRepeatedBytes', + ], + '@param string[]|\Google\Protobuf\Internal\RepeatedField $var' + ], + [ + [ + 'setRepeatedMessage', + ], + '@param \Foo\TestMessage_Sub[]|\Google\Protobuf\Internal\RepeatedField $var' + ], + [ + [ + 'setRepeatedRecursive', + ], + '@param \Foo\TestMessage[]|\Google\Protobuf\Internal\RepeatedField $var' + ], + [ + [ + 'setRepeatedNoNamespaceMessage', + ], + '@param \NoNamespaceMessage[]|\Google\Protobuf\Internal\RepeatedField $var' + ], + [ + [ + 'setMapInt32Int32', + 'setMapInt64Int64', + 'setMapUint32Uint32', + 'setMapUint64Uint64', + 'setMapSint32Sint32', + 'setMapSint64Sint64', + 'setMapFixed32Fixed32', + 'setMapFixed64Fixed64', + 'setMapSfixed32Sfixed32', + 'setMapSfixed64Sfixed64', + 'setMapInt32Float', + 'setMapInt32Double', + 'setMapBoolBool', + 'setMapStringString', + 'setMapInt32Bytes', + 'setMapInt32Enum', + 'setMapInt32Message', + 'setMapRecursive', + ], + '@param array|\Google\Protobuf\Internal\MapField $var' + ], + [ + [ + 'getOptionalFloat', + 'getOptionalDouble', + 'getOneofDouble', + 'getOneofFloat', + ], + '@return float' + ], + [ + [ + 'setOptionalFloat', + 'setOptionalDouble', + 'setOneofDouble', + 'setOneofFloat', + ], + '@param float $var' + ], + [ + [ + 'getOptionalBool', + 'getOneofBool', + ], + '@return bool'], + [ + [ + 'setOptionalBool', + 'setOneofBool', + ], + '@param bool $var' + ], + [ + [ + 'getOptionalString', + 'getOptionalBytes', + 'getOneofString', + 'getOneofBytes', + 'getMyOneof', + ], + '@return string' + ], + [ + [ + 'setOptionalString', + 'setOptionalBytes', + 'setOneofString', + 'setOneofBytes', + ], + '@param string $var' + ], + + [ + [ + 'getOptionalMessage', + 'getOneofMessage' + ], + '@return \Foo\TestMessage_Sub' + ], + [ + [ + 'setOptionalMessage', + 'setOneofMessage' + ], + '@param \Foo\TestMessage_Sub $var' + ], + [ + [ + 'getOptionalIncludedMessage' + ], + '@return \Bar\TestInclude' + ], + [ + [ + 'setOptionalIncludedMessage' + ], + '@param \Bar\TestInclude $var' + ], + [ + [ + 'getRecursive' + ], + '@return \Foo\TestMessage' + ], + [ + [ + 'setRecursive' + ], + '@param \Foo\TestMessage $var' + ], + + [ + [ + 'getOptionalNoNamespaceMessage' + ], + '@return \NoNamespaceMessage' + ], + [ + [ + 'setOptionalNoNamespaceMessage' + ], + '@param \NoNamespaceMessage $var' + ], + ]; + } +} diff --git a/php/tests/generated_service_test.php b/php/tests/generated_service_test.php new file mode 100644 index 00000000..5407db9a --- /dev/null +++ b/php/tests/generated_service_test.php @@ -0,0 +1,110 @@ +<?php + +require_once('test_base.php'); +require_once('test_util.php'); + +use Google\Protobuf\Internal\RepeatedField; +use Google\Protobuf\Internal\MapField; +use Google\Protobuf\Internal\GPBType; +use Foo\Greeter; +use Foo\HelloRequest; +use Foo\HelloReply; + +class GeneratedServiceTest extends TestBase +{ + /** + * @var \ReflectionClass + */ + private $serviceClass; + + /** + * @var \ReflectionClass + */ + private $namespacedServiceClass; + + /** + * @var array + */ + private $methodNames = [ + 'sayHello', + 'sayHelloAgain' + ]; + + public function setUp() + { + parent::setUp(); + + $this->serviceClass = new ReflectionClass('Foo\GreeterInterface'); + + $this->namespacedServiceClass = new ReflectionClass('Bar\OtherGreeterInterface'); + } + + public function testIsInterface() + { + $this->assertTrue($this->serviceClass->isInterface()); + } + + public function testPhpDocForClass() + { + $this->assertContains('foo.Greeter', $this->serviceClass->getDocComment()); + } + + public function testPhpDocForNamespacedClass() + { + $this->assertContains('foo.OtherGreeter', $this->namespacedServiceClass->getDocComment()); + } + + public function testServiceMethodsAreGenerated() + { + $this->assertCount(count($this->methodNames), $this->serviceClass->getMethods()); + foreach ($this->methodNames as $methodName) { + $this->assertTrue($this->serviceClass->hasMethod($methodName)); + } + } + + public function testPhpDocForServiceMethod() + { + foreach ($this->methodNames as $methodName) { + $docComment = $this->serviceClass->getMethod($methodName)->getDocComment(); + $this->assertContains($methodName, $docComment); + $this->assertContains('@param \Foo\HelloRequest $request', $docComment); + $this->assertContains('@return \Foo\HelloReply', $docComment); + } + } + + public function testPhpDocForServiceMethodInNamespacedClass() + { + foreach ($this->methodNames as $methodName) { + $docComment = $this->namespacedServiceClass->getMethod($methodName)->getDocComment(); + $this->assertContains($methodName, $docComment); + $this->assertContains('@param \Foo\HelloRequest $request', $docComment); + $this->assertContains('@return \Foo\HelloReply', $docComment); + } + } + + public function testParamForServiceMethod() + { + foreach ($this->methodNames as $methodName) { + $method = $this->serviceClass->getMethod($methodName); + $this->assertCount(1, $method->getParameters()); + $param = $method->getParameters()[0]; + $this->assertFalse($param->isOptional()); + $this->assertSame('request', $param->getName()); + // ReflectionParameter::getType only exists in PHP 7+, so get the type from __toString + $this->assertContains('Foo\HelloRequest $request', (string) $param); + } + } + + public function testParamForServiceMethodInNamespacedClass() + { + foreach ($this->methodNames as $methodName) { + $method = $this->serviceClass->getMethod($methodName); + $this->assertCount(1, $method->getParameters()); + $param = $method->getParameters()[0]; + $this->assertFalse($param->isOptional()); + $this->assertSame('request', $param->getName()); + // ReflectionParameter::getType only exists in PHP 7+, so get the type from __toString + $this->assertContains('Foo\HelloRequest $request', (string) $param); + } + } +} diff --git a/php/tests/map_field_test.php b/php/tests/map_field_test.php index 2fda9135..120b1bde 100644 --- a/php/tests/map_field_test.php +++ b/php/tests/map_field_test.php @@ -56,42 +56,23 @@ class MapFieldTest extends PHPUnit_Framework_TestCase { unset($arr['3.1']); unset($arr[MAX_INT32_STRING]); $this->assertEquals(0, count($arr)); - } - - /** - * @expectedException PHPUnit_Framework_Error - */ - public function testInt32SetStringKeyFail() - { - $arr = new MapField(GPBType::INT32, GPBType::INT32); - $arr ['abc']= 0; - } - /** - * @expectedException PHPUnit_Framework_Error - */ - public function testInt32SetStringValueFail() - { + // Test foreach. $arr = new MapField(GPBType::INT32, GPBType::INT32); - $arr [0]= 'abc'; - } - - /** - * @expectedException PHPUnit_Framework_Error - */ - public function testInt32SetMessageKeyFail() - { - $arr = new MapField(GPBType::INT32, GPBType::INT32); - $arr [new TestMessage_Sub()]= 0; - } - - /** - * @expectedException PHPUnit_Framework_Error - */ - public function testInt32SetMessageValueFail() - { - $arr = new MapField(GPBType::INT32, GPBType::INT32); - $arr [0]= new TestMessage_Sub(); + for ($i = 0; $i < 3; $i++) { + $arr[$i] = $i; + } + $i = 0; + $arr_test = []; + foreach ($arr as $key => $val) { + $this->assertSame($key, $val); + $arr_test[] = $key; + $i++; + } + $this->assertTrue(isset($arr_test[0])); + $this->assertTrue(isset($arr_test[1])); + $this->assertTrue(isset($arr_test[2])); + $this->assertSame(3, $i); } ######################################################### @@ -159,42 +140,6 @@ class MapFieldTest extends PHPUnit_Framework_TestCase { $this->assertEquals(0, count($arr)); } - /** - * @expectedException PHPUnit_Framework_Error - */ - public function testUint32SetStringKeyFail() - { - $arr = new MapField(GPBType::UINT32, GPBType::UINT32); - $arr ['abc']= 0; - } - - /** - * @expectedException PHPUnit_Framework_Error - */ - public function testUint32SetStringValueFail() - { - $arr = new MapField(GPBType::UINT32, GPBType::UINT32); - $arr [0]= 'abc'; - } - - /** - * @expectedException PHPUnit_Framework_Error - */ - public function testUint32SetMessageKeyFail() - { - $arr = new MapField(GPBType::UINT32, GPBType::UINT32); - $arr [new TestMessage_Sub()]= 0; - } - - /** - * @expectedException PHPUnit_Framework_Error - */ - public function testUint32SetMessageValueFail() - { - $arr = new MapField(GPBType::UINT32, GPBType::UINT32); - $arr [0]= new TestMessage_Sub(); - } - ######################################################### # Test int64 field. ######################################################### @@ -252,42 +197,6 @@ class MapFieldTest extends PHPUnit_Framework_TestCase { $this->assertEquals(0, count($arr)); } - /** - * @expectedException PHPUnit_Framework_Error - */ - public function testInt64SetStringKeyFail() - { - $arr = new MapField(GPBType::INT64, GPBType::INT64); - $arr ['abc']= 0; - } - - /** - * @expectedException PHPUnit_Framework_Error - */ - public function testInt64SetStringValueFail() - { - $arr = new MapField(GPBType::INT64, GPBType::INT64); - $arr [0]= 'abc'; - } - - /** - * @expectedException PHPUnit_Framework_Error - */ - public function testInt64SetMessageKeyFail() - { - $arr = new MapField(GPBType::INT64, GPBType::INT64); - $arr [new TestMessage_Sub()]= 0; - } - - /** - * @expectedException PHPUnit_Framework_Error - */ - public function testInt64SetMessageValueFail() - { - $arr = new MapField(GPBType::INT64, GPBType::INT64); - $arr [0]= new TestMessage_Sub(); - } - ######################################################### # Test uint64 field. ######################################################### @@ -339,42 +248,6 @@ class MapFieldTest extends PHPUnit_Framework_TestCase { $this->assertEquals(0, count($arr)); } - /** - * @expectedException PHPUnit_Framework_Error - */ - public function testUint64SetStringKeyFail() - { - $arr = new MapField(GPBType::UINT64, GPBType::UINT64); - $arr ['abc']= 0; - } - - /** - * @expectedException PHPUnit_Framework_Error - */ - public function testUint64SetStringValueFail() - { - $arr = new MapField(GPBType::UINT64, GPBType::UINT64); - $arr [0]= 'abc'; - } - - /** - * @expectedException PHPUnit_Framework_Error - */ - public function testUint64SetMessageKeyFail() - { - $arr = new MapField(GPBType::UINT64, GPBType::UINT64); - $arr [new TestMessage_Sub()]= 0; - } - - /** - * @expectedException PHPUnit_Framework_Error - */ - public function testUint64SetMessageValueFail() - { - $arr = new MapField(GPBType::UINT64, GPBType::UINT64); - $arr [0]= new TestMessage_Sub(); - } - ######################################################### # Test float field. ######################################################### @@ -397,24 +270,6 @@ class MapFieldTest extends PHPUnit_Framework_TestCase { $this->assertEquals(4, count($arr)); } - /** - * @expectedException PHPUnit_Framework_Error - */ - public function testFloatSetStringValueFail() - { - $arr = new MapField(GPBType::INT64, GPBType::FLOAT); - $arr [0]= 'abc'; - } - - /** - * @expectedException PHPUnit_Framework_Error - */ - public function testFloatSetMessageValueFail() - { - $arr = new MapField(GPBType::INT64, GPBType::FLOAT); - $arr [0]= new TestMessage_Sub(); - } - ######################################################### # Test double field. ######################################################### @@ -437,24 +292,6 @@ class MapFieldTest extends PHPUnit_Framework_TestCase { $this->assertEquals(4, count($arr)); } - /** - * @expectedException PHPUnit_Framework_Error - */ - public function testDoubleSetStringValueFail() - { - $arr = new MapField(GPBType::INT64, GPBType::DOUBLE); - $arr [0]= 'abc'; - } - - /** - * @expectedException PHPUnit_Framework_Error - */ - public function testDoubleSetMessageValueFail() - { - $arr = new MapField(GPBType::INT64, GPBType::DOUBLE); - $arr [0]= new TestMessage_Sub(); - } - ######################################################### # Test bool field. ######################################################### @@ -515,24 +352,6 @@ class MapFieldTest extends PHPUnit_Framework_TestCase { $this->assertEquals(0, count($arr)); } - /** - * @expectedException PHPUnit_Framework_Error - */ - public function testBoolSetMessageKeyFail() - { - $arr = new MapField(GPBType::BOOL, GPBType::BOOL); - $arr [new TestMessage_Sub()]= true; - } - - /** - * @expectedException PHPUnit_Framework_Error - */ - public function testBoolSetMessageValueFail() - { - $arr = new MapField(GPBType::BOOL, GPBType::BOOL); - $arr [true]= new TestMessage_Sub(); - } - ######################################################### # Test string field. ######################################################### @@ -564,42 +383,23 @@ class MapFieldTest extends PHPUnit_Framework_TestCase { $this->assertEquals(1, count($arr)); unset($arr[True]); $this->assertEquals(0, count($arr)); - } - - /** - * @expectedException PHPUnit_Framework_Error - */ - public function testStringSetInvalidUTF8KeyFail() - { - $arr = new MapField(GPBType::STRING, GPBType::STRING); - $arr[hex2bin("ff")]= 'abc'; - } - - /** - * @expectedException PHPUnit_Framework_Error - */ - public function testStringSetInvalidUTF8ValueFail() - { - $arr = new MapField(GPBType::STRING, GPBType::STRING); - $arr ['abc']= hex2bin("ff"); - } - - /** - * @expectedException PHPUnit_Framework_Error - */ - public function testStringSetMessageKeyFail() - { - $arr = new MapField(GPBType::STRING, GPBType::STRING); - $arr [new TestMessage_Sub()]= 'abc'; - } - /** - * @expectedException PHPUnit_Framework_Error - */ - public function testStringSetMessageValueFail() - { + // Test foreach. $arr = new MapField(GPBType::STRING, GPBType::STRING); - $arr ['abc']= new TestMessage_Sub(); + for ($i = 0; $i < 3; $i++) { + $arr[$i] = $i; + } + $i = 0; + $arr_test = []; + foreach ($arr as $key => $val) { + $this->assertSame($key, $val); + $arr_test[] = $key; + $i++; + } + $this->assertTrue(isset($arr_test['0'])); + $this->assertTrue(isset($arr_test['1'])); + $this->assertTrue(isset($arr_test['2'])); + $this->assertSame(3, $i); } ######################################################### @@ -619,47 +419,6 @@ class MapFieldTest extends PHPUnit_Framework_TestCase { $this->assertEquals(1, count($arr)); } - /** - * @expectedException PHPUnit_Framework_Error - */ - public function testMessageSetIntValueFail() - { - $arr = - new MapField(GPBType::INT32, GPBType::MESSAGE, TestMessage::class); - $arr[0] = 0; - } - - /** - * @expectedException PHPUnit_Framework_Error - */ - public function testMessageSetStringValueFail() - { - $arr = - new MapField(GPBType::INT32, GPBType::MESSAGE, TestMessage::class); - $arr[0] = 'abc'; - } - - /** - * @expectedException PHPUnit_Framework_Error - */ - public function testMessageSetOtherMessageValueFail() - { - $arr = - new MapField(GPBType::INT32, GPBType::MESSAGE, TestMessage::class); - $arr[0] = new TestMessage_Sub(); - } - - /** - * @expectedException PHPUnit_Framework_Error - */ - public function testMessageSetNullFail() - { - $arr = - new MapField(GPBType::INT32, GPBType::MESSAGE, TestMessage::class); - $null = NULL; - $arr[0] = $null; - } - ######################################################### # Test memory leak ######################################################### @@ -669,7 +428,7 @@ class MapFieldTest extends PHPUnit_Framework_TestCase { // { // $arr = new MapField(GPBType::INT32, // GPBType::MESSAGE, TestMessage::class); - // $arr [0]= new TestMessage; + // $arr[0] = new TestMessage; // $arr[0]->SetMapRecursive($arr); // // Clean up memory before test. diff --git a/php/tests/memory_leak_test.php b/php/tests/memory_leak_test.php index 361982b5..faa1833d 100644 --- a/php/tests/memory_leak_test.php +++ b/php/tests/memory_leak_test.php @@ -7,9 +7,12 @@ require_once('generated/NoNamespaceMessage.php'); require_once('generated/NoNamespaceMessage_NestedEnum.php'); require_once('generated/PrefixEmpty.php'); require_once('generated/PrefixTestPrefix.php'); +require_once('generated/TestEmptyNamespace.php'); require_once('generated/Bar/TestInclude.php'); +require_once('generated/Foo/PBARRAY.php'); require_once('generated/Foo/PBEmpty.php'); require_once('generated/Foo/TestEnum.php'); +require_once('generated/Foo/TestIncludeNamespaceMessage.php'); require_once('generated/Foo/TestIncludePrefixMessage.php'); require_once('generated/Foo/TestMessage.php'); require_once('generated/Foo/TestMessage_Empty.php'); @@ -17,11 +20,15 @@ require_once('generated/Foo/TestMessage_NestedEnum.php'); require_once('generated/Foo/TestMessage_Sub.php'); require_once('generated/Foo/TestPackedMessage.php'); require_once('generated/Foo/TestPhpDoc.php'); +require_once('generated/Foo/TestRandomFieldOrder.php'); require_once('generated/Foo/TestUnpackedMessage.php'); require_once('generated/GPBMetadata/Proto/Test.php'); +require_once('generated/GPBMetadata/Proto/TestEmptyPhpNamespace.php'); require_once('generated/GPBMetadata/Proto/TestInclude.php'); require_once('generated/GPBMetadata/Proto/TestNoNamespace.php'); +require_once('generated/GPBMetadata/Proto/TestPhpNamespace.php'); require_once('generated/GPBMetadata/Proto/TestPrefix.php'); +require_once('generated/Php/Test/TestNamespace.php'); require_once('test_util.php'); use Google\Protobuf\Internal\RepeatedField; @@ -43,7 +50,7 @@ TestUtil::assertTestMessage($to); $from->setRecursive($from); $arr = new RepeatedField(GPBType::MESSAGE, TestMessage::class); -$arr []= new TestMessage; +$arr[] = new TestMessage; $arr[0]->SetRepeatedRecursive($arr); // Test oneof fields. diff --git a/php/tests/php_implementation_test.php b/php/tests/php_implementation_test.php index e1249808..5dbc9233 100644 --- a/php/tests/php_implementation_test.php +++ b/php/tests/php_implementation_test.php @@ -6,12 +6,12 @@ require_once('test_util.php'); use Foo\TestMessage; use Foo\TestMessage_Sub; use Foo\TestPackedMessage; -use Google\Protobuf\Internal\InputStream; +use Google\Protobuf\Internal\CodedInputStream; use Google\Protobuf\Internal\FileDescriptorSet; use Google\Protobuf\Internal\GPBLabel; use Google\Protobuf\Internal\GPBType; use Google\Protobuf\Internal\GPBWire; -use Google\Protobuf\Internal\OutputStream; +use Google\Protobuf\Internal\CodedOutputStream; class ImplementationTest extends TestBase { @@ -21,17 +21,17 @@ class ImplementationTest extends TestBase $value = null; // Positive number. - $input = new InputStream(hex2bin("01")); + $input = new CodedInputStream(hex2bin("01")); GPBWire::readInt32($input, $value); $this->assertSame(1, $value); // Negative number. - $input = new InputStream(hex2bin("ffffffff0f")); + $input = new CodedInputStream(hex2bin("ffffffff0f")); GPBWire::readInt32($input, $value); $this->assertSame(-1, $value); // Discard overflow bits. - $input = new InputStream(hex2bin("ffffffff7f")); + $input = new CodedInputStream(hex2bin("ffffffff7f")); GPBWire::readInt32($input, $value); $this->assertSame(-1, $value); } @@ -41,17 +41,17 @@ class ImplementationTest extends TestBase $value = null; // Positive number. - $input = new InputStream(hex2bin("01")); + $input = new CodedInputStream(hex2bin("01")); GPBWire::readUint32($input, $value); $this->assertSame(1, $value); // Max uint32. - $input = new InputStream(hex2bin("ffffffff0f")); + $input = new CodedInputStream(hex2bin("ffffffff0f")); GPBWire::readUint32($input, $value); $this->assertSame(-1, $value); // Discard overflow bits. - $input = new InputStream(hex2bin("ffffffff7f")); + $input = new CodedInputStream(hex2bin("ffffffff7f")); GPBWire::readUint32($input, $value); $this->assertSame(-1, $value); } @@ -61,17 +61,17 @@ class ImplementationTest extends TestBase $value = null; // Positive number. - $input = new InputStream(hex2bin("01")); + $input = new CodedInputStream(hex2bin("01")); GPBWire::readInt64($input, $value); $this->assertEquals(1, $value); // Negative number. - $input = new InputStream(hex2bin("ffffffffffffffffff01")); + $input = new CodedInputStream(hex2bin("ffffffffffffffffff01")); GPBWire::readInt64($input, $value); $this->assertEquals(-1, $value); // Discard overflow bits. - $input = new InputStream(hex2bin("ffffffffffffffffff0f")); + $input = new CodedInputStream(hex2bin("ffffffffffffffffff0f")); GPBWire::readInt64($input, $value); $this->assertEquals(-1, $value); } @@ -81,17 +81,17 @@ class ImplementationTest extends TestBase $value = null; // Positive number. - $input = new InputStream(hex2bin("01")); + $input = new CodedInputStream(hex2bin("01")); GPBWire::readUint64($input, $value); $this->assertEquals(1, $value); // Negative number. - $input = new InputStream(hex2bin("FFFFFFFFFFFFFFFFFF01")); + $input = new CodedInputStream(hex2bin("FFFFFFFFFFFFFFFFFF01")); GPBWire::readUint64($input, $value); $this->assertEquals(-1, $value); // Discard overflow bits. - $input = new InputStream(hex2bin("FFFFFFFFFFFFFFFFFF0F")); + $input = new CodedInputStream(hex2bin("FFFFFFFFFFFFFFFFFF0F")); GPBWire::readUint64($input, $value); $this->assertEquals(-1, $value); } @@ -100,15 +100,15 @@ class ImplementationTest extends TestBase { $value = null; - $input = new InputStream(hex2bin("00")); + $input = new CodedInputStream(hex2bin("00")); GPBWire::readSint32($input, $value); $this->assertSame(0, $value); - $input = new InputStream(hex2bin("01")); + $input = new CodedInputStream(hex2bin("01")); GPBWire::readSint32($input, $value); $this->assertSame(-1, $value); - $input = new InputStream(hex2bin("02")); + $input = new CodedInputStream(hex2bin("02")); GPBWire::readSint32($input, $value); $this->assertSame(1, $value); } @@ -117,15 +117,15 @@ class ImplementationTest extends TestBase { $value = null; - $input = new InputStream(hex2bin("00")); + $input = new CodedInputStream(hex2bin("00")); GPBWire::readSint64($input, $value); $this->assertEquals(0, $value); - $input = new InputStream(hex2bin("01")); + $input = new CodedInputStream(hex2bin("01")); GPBWire::readSint64($input, $value); $this->assertEquals(-1, $value); - $input = new InputStream(hex2bin("02")); + $input = new CodedInputStream(hex2bin("02")); GPBWire::readSint64($input, $value); $this->assertEquals(1, $value); } @@ -133,7 +133,7 @@ class ImplementationTest extends TestBase public function testReadFixed32() { $value = null; - $input = new InputStream(hex2bin("12345678")); + $input = new CodedInputStream(hex2bin("12345678")); GPBWire::readFixed32($input, $value); $this->assertSame(0x78563412, $value); } @@ -141,7 +141,7 @@ class ImplementationTest extends TestBase public function testReadFixed64() { $value = null; - $input = new InputStream(hex2bin("1234567812345678")); + $input = new CodedInputStream(hex2bin("1234567812345678")); GPBWire::readFixed64($input, $value); if (PHP_INT_SIZE == 4) { $this->assertSame("8671175386481439762", $value); @@ -153,7 +153,7 @@ class ImplementationTest extends TestBase public function testReadSfixed32() { $value = null; - $input = new InputStream(hex2bin("12345678")); + $input = new CodedInputStream(hex2bin("12345678")); GPBWire::readSfixed32($input, $value); $this->assertSame(0x78563412, $value); } @@ -161,7 +161,7 @@ class ImplementationTest extends TestBase public function testReadFloat() { $value = null; - $input = new InputStream(hex2bin("0000803F")); + $input = new CodedInputStream(hex2bin("0000803F")); GPBWire::readFloat($input, $value); $this->assertSame(1.0, $value); } @@ -170,11 +170,11 @@ class ImplementationTest extends TestBase { $value = null; - $input = new InputStream(hex2bin("00")); + $input = new CodedInputStream(hex2bin("00")); GPBWire::readBool($input, $value); $this->assertSame(false, $value); - $input = new InputStream(hex2bin("01")); + $input = new CodedInputStream(hex2bin("01")); GPBWire::readBool($input, $value); $this->assertSame(true, $value); } @@ -182,7 +182,7 @@ class ImplementationTest extends TestBase public function testReadDouble() { $value = null; - $input = new InputStream(hex2bin("000000000000F03F")); + $input = new CodedInputStream(hex2bin("000000000000F03F")); GPBWire::readDouble($input, $value); $this->assertSame(1.0, $value); } @@ -190,7 +190,7 @@ class ImplementationTest extends TestBase public function testReadSfixed64() { $value = null; - $input = new InputStream(hex2bin("1234567812345678")); + $input = new CodedInputStream(hex2bin("1234567812345678")); GPBWire::readSfixed64($input, $value); if (PHP_INT_SIZE == 4) { $this->assertSame("8671175386481439762", $value); @@ -207,8 +207,7 @@ class ImplementationTest extends TestBase $this->assertSame(3, GPBWire::zigZagEncode32(-2)); $this->assertSame(0x7FFFFFFE, GPBWire::zigZagEncode32(0x3FFFFFFF)); $this->assertSame(0x7FFFFFFF, GPBWire::zigZagEncode32(0xC0000000)); - $this->assertSame(-2, GPBWire::zigZagEncode32(0x7FFFFFFF)); - $this->assertSame(-1, GPBWire::zigZagEncode32(0x80000000)); + $this->assertSame(0x7FFFFFFF, GPBWire::zigZagEncode32(-1073741824)); $this->assertSame(0, GPBWire::zigZagDecode32(0)); $this->assertSame(-1, GPBWire::zigZagDecode32(1)); @@ -220,6 +219,8 @@ class ImplementationTest extends TestBase $this->assertSame((int)-2147483648,GPBWire::zigZagDecode32(0xFFFFFFFF)); if (PHP_INT_SIZE == 4) { + $this->assertSame(-2, GPBWire::zigZagEncode32(0x7FFFFFFF)); + $this->assertSame(-1, GPBWire::zigZagEncode32(0x80000000)); $this->assertSame('0', GPBWire::zigZagEncode64(0)); $this->assertSame('1', GPBWire::zigZagEncode64(-1)); $this->assertSame('2', GPBWire::zigZagEncode64(1)); @@ -250,6 +251,8 @@ class ImplementationTest extends TestBase $this->assertSame('1', GPBWire::zigZagDecode64(2)); $this->assertSame('-2', GPBWire::zigZagDecode64(3)); } else { + $this->assertSame(4294967294, GPBWire::zigZagEncode32(0x7FFFFFFF)); + $this->assertSame(4294967295, GPBWire::zigZagEncode32(0x80000000)); $this->assertSame(0, GPBWire::zigZagEncode64(0)); $this->assertSame(1, GPBWire::zigZagEncode64(-1)); $this->assertSame(2, GPBWire::zigZagEncode64(1)); @@ -330,19 +333,19 @@ class ImplementationTest extends TestBase $var = 0; // Empty buffer. - $input = new InputStream(hex2bin('')); + $input = new CodedInputStream(hex2bin('')); $this->assertFalse($input->readVarint64($var)); // The largest varint is 10 bytes long. - $input = new InputStream(hex2bin('8080808080808080808001')); + $input = new CodedInputStream(hex2bin('8080808080808080808001')); $this->assertFalse($input->readVarint64($var)); // Corrupted varint. - $input = new InputStream(hex2bin('808080')); + $input = new CodedInputStream(hex2bin('808080')); $this->assertFalse($input->readVarint64($var)); // Normal case. - $input = new InputStream(hex2bin('808001')); + $input = new CodedInputStream(hex2bin('808001')); $this->assertTrue($input->readVarint64($var)); if (PHP_INT_SIZE == 4) { $this->assertSame('16384', $var); @@ -352,7 +355,7 @@ class ImplementationTest extends TestBase $this->assertFalse($input->readVarint64($var)); // Read two varint. - $input = new InputStream(hex2bin('808001808002')); + $input = new CodedInputStream(hex2bin('808001808002')); $this->assertTrue($input->readVarint64($var)); if (PHP_INT_SIZE == 4) { $this->assertSame('16384', $var); @@ -390,7 +393,7 @@ class ImplementationTest extends TestBase ); foreach ($testVals as $original => $encoded) { - $input = new InputStream(hex2bin($encoded)); + $input = new CodedInputStream(hex2bin($encoded)); $this->assertTrue($input->readVarint64($var)); $this->assertEquals($original, $var); } @@ -401,25 +404,25 @@ class ImplementationTest extends TestBase $var = 0; // Empty buffer. - $input = new InputStream(hex2bin('')); + $input = new CodedInputStream(hex2bin('')); $this->assertFalse($input->readVarint32($var)); // The largest varint is 10 bytes long. - $input = new InputStream(hex2bin('8080808080808080808001')); + $input = new CodedInputStream(hex2bin('8080808080808080808001')); $this->assertFalse($input->readVarint32($var)); // Corrupted varint. - $input = new InputStream(hex2bin('808080')); + $input = new CodedInputStream(hex2bin('808080')); $this->assertFalse($input->readVarint32($var)); // Normal case. - $input = new InputStream(hex2bin('808001')); + $input = new CodedInputStream(hex2bin('808001')); $this->assertTrue($input->readVarint32($var)); $this->assertSame(16384, $var); $this->assertFalse($input->readVarint32($var)); // Read two varint. - $input = new InputStream(hex2bin('808001808002')); + $input = new CodedInputStream(hex2bin('808001808002')); $this->assertTrue($input->readVarint32($var)); $this->assertSame(16384, $var); $this->assertTrue($input->readVarint32($var)); @@ -427,7 +430,7 @@ class ImplementationTest extends TestBase $this->assertFalse($input->readVarint32($var)); // Read a 64-bit integer. High-order bits should be discarded. - $input = new InputStream(hex2bin('808081808001')); + $input = new CodedInputStream(hex2bin('808081808001')); $this->assertTrue($input->readVarint32($var)); $this->assertSame(16384, $var); $this->assertFalse($input->readVarint32($var)); @@ -435,7 +438,7 @@ class ImplementationTest extends TestBase public function testReadTag() { - $input = new InputStream(hex2bin('808001')); + $input = new CodedInputStream(hex2bin('808001')); $tag = $input->readTag(); $this->assertSame(16384, $tag); $tag = $input->readTag(); @@ -444,7 +447,7 @@ class ImplementationTest extends TestBase public function testPushPopLimit() { - $input = new InputStream(hex2bin('808001')); + $input = new CodedInputStream(hex2bin('808001')); $old_limit = $input->pushLimit(0); $tag = $input->readTag(); $this->assertSame(0, $tag); @@ -455,7 +458,7 @@ class ImplementationTest extends TestBase public function testReadRaw() { - $input = new InputStream(hex2bin('808001')); + $input = new CodedInputStream(hex2bin('808001')); $buffer = null; $this->assertTrue($input->readRaw(3, $buffer)); @@ -466,33 +469,33 @@ class ImplementationTest extends TestBase public function testWriteVarint32() { - $output = new OutputStream(3); - $output->writeVarint32(16384); + $output = new CodedOutputStream(3); + $output->writeVarint32(16384, true); $this->assertSame(hex2bin('808001'), $output->getData()); // Negative numbers are padded to be compatible with int64. - $output = new OutputStream(10); - $output->writeVarint32(-43); + $output = new CodedOutputStream(10); + $output->writeVarint32(-43, false); $this->assertSame(hex2bin('D5FFFFFFFFFFFFFFFF01'), $output->getData()); } public function testWriteVarint64() { - $output = new OutputStream(10); + $output = new CodedOutputStream(10); $output->writeVarint64(-43); $this->assertSame(hex2bin('D5FFFFFFFFFFFFFFFF01'), $output->getData()); } public function testWriteLittleEndian32() { - $output = new OutputStream(4); + $output = new CodedOutputStream(4); $output->writeLittleEndian32(46); $this->assertSame(hex2bin('2E000000'), $output->getData()); } public function testWriteLittleEndian64() { - $output = new OutputStream(8); + $output = new CodedOutputStream(8); $output->writeLittleEndian64(47); $this->assertSame(hex2bin('2F00000000000000'), $output->getData()); } diff --git a/php/tests/proto/test.proto b/php/tests/proto/test.proto index 39229254..d81f66f5 100644 --- a/php/tests/proto/test.proto +++ b/php/tests/proto/test.proto @@ -2,6 +2,8 @@ syntax = "proto3"; import 'proto/test_include.proto'; import 'proto/test_no_namespace.proto'; +import 'proto/test_php_namespace.proto'; +import 'proto/test_empty_php_namespace.proto'; import 'proto/test_prefix.proto'; package foo; @@ -127,6 +129,10 @@ message Empty { int32 a = 1; } +message ARRAY { + int32 a = 1; +} + message TestPackedMessage { repeated int32 repeated_int32 = 90 [packed = true]; repeated int64 repeated_int64 = 91 [packed = true]; @@ -170,3 +176,14 @@ message TestPhpDoc { message TestIncludePrefixMessage { TestPrefix prefix_message = 1; } + +message TestIncludeNamespaceMessage { + TestNamespace namespace_message = 1; + TestEmptyNamespace empty_namespace_message = 2; +} + +// This will cause upb fields not ordered by the order in the generated code. +message TestRandomFieldOrder { + int64 tag13 = 150; + string tag14 = 160; +} diff --git a/php/tests/proto/test_empty_php_namespace.proto b/php/tests/proto/test_empty_php_namespace.proto new file mode 100644 index 00000000..7b4bc74d --- /dev/null +++ b/php/tests/proto/test_empty_php_namespace.proto @@ -0,0 +1,8 @@ +syntax = "proto3"; + +package foo; +option php_namespace = ""; + +message TestEmptyNamespace { + int32 a = 1; +} diff --git a/php/tests/proto/test_php_namespace.proto b/php/tests/proto/test_php_namespace.proto new file mode 100644 index 00000000..713187b9 --- /dev/null +++ b/php/tests/proto/test_php_namespace.proto @@ -0,0 +1,8 @@ +syntax = "proto3"; + +package foo; +option php_namespace = "Php\\Test"; + +message TestNamespace { + int32 a = 1; +} diff --git a/php/tests/proto/test_service.proto b/php/tests/proto/test_service.proto new file mode 100644 index 00000000..a03dbc46 --- /dev/null +++ b/php/tests/proto/test_service.proto @@ -0,0 +1,18 @@ +syntax = "proto3"; + +package foo; + +option php_generic_services = true; + +service Greeter { + rpc SayHello (HelloRequest) returns (HelloReply) {} + rpc SayHelloAgain (HelloRequest) returns (HelloReply) {} +} + +message HelloRequest { + string name = 1; +} + +message HelloReply { + string message = 1; +} diff --git a/php/tests/proto/test_service_namespace.proto b/php/tests/proto/test_service_namespace.proto new file mode 100644 index 00000000..719aa484 --- /dev/null +++ b/php/tests/proto/test_service_namespace.proto @@ -0,0 +1,13 @@ +syntax = "proto3"; + +import "proto/test_service.proto"; + +package foo; + +option php_generic_services = true; +option php_namespace = "Bar"; + +service OtherGreeter { + rpc SayHello (HelloRequest) returns (HelloReply) {} + rpc SayHelloAgain (HelloRequest) returns (HelloReply) {} +} diff --git a/php/tests/test.sh b/php/tests/test.sh index fc3f0186..b640c143 100755 --- a/php/tests/test.sh +++ b/php/tests/test.sh @@ -2,13 +2,13 @@ # Compile c extension pushd ../ext/google/protobuf/ -make clean +make clean || true set -e # Add following in configure for debug: --enable-debug CFLAGS='-g -O0' -phpize && ./configure --enable-debug CFLAGS='-g -O0' && make +phpize && ./configure CFLAGS='-g -O0' && make popd -tests=( array_test.php encode_decode_test.php generated_class_test.php map_field_test.php well_known_test.php ) +tests=( array_test.php encode_decode_test.php generated_class_test.php generated_phpdoc_test.php map_field_test.php well_known_test.php generated_service_test.php ) for t in "${tests[@]}" do diff --git a/php/tests/test_base.php b/php/tests/test_base.php index 67048f4c..dc5e73f5 100644 --- a/php/tests/test_base.php +++ b/php/tests/test_base.php @@ -19,6 +19,8 @@ class TestBase extends PHPUnit_Framework_TestCase public function expectFields(TestMessage $m) { + $this->assertSame(-42, $m->getOptionalInt32()); + $this->assertSame(42, $m->getOptionalUint32()); $this->assertSame(-44, $m->getOptionalSint32()); $this->assertSame(46, $m->getOptionalFixed32()); $this->assertSame(-46, $m->getOptionalSfixed32()); @@ -27,6 +29,7 @@ class TestBase extends PHPUnit_Framework_TestCase $this->assertSame(true, $m->getOptionalBool()); $this->assertSame('a', $m->getOptionalString()); $this->assertSame('b', $m->getOptionalBytes()); + $this->assertSame(TestEnum::ONE, $m->getOptionalEnum()); $this->assertSame(33, $m->getOptionalMessage()->getA()); if (PHP_INT_SIZE == 4) { $this->assertSame('-43', $m->getOptionalInt64()); diff --git a/php/tests/test_util.php b/php/tests/test_util.php index 9dbcbb62..c8afdd3e 100644 --- a/php/tests/test_util.php +++ b/php/tests/test_util.php @@ -71,61 +71,61 @@ class TestUtil $m->setOptionalMessage($sub); $m->getOptionalMessage()->SetA(33); - $m->getRepeatedInt32() []= -42; - $m->getRepeatedInt64() []= -43; - $m->getRepeatedUint32() []= 42; - $m->getRepeatedUint64() []= 43; - $m->getRepeatedSint32() []= -44; - $m->getRepeatedSint64() []= -45; - $m->getRepeatedFixed32() []= 46; - $m->getRepeatedFixed64() []= 47; - $m->getRepeatedSfixed32() []= -46; - $m->getRepeatedSfixed64() []= -47; - $m->getRepeatedFloat() []= 1.5; - $m->getRepeatedDouble() []= 1.6; - $m->getRepeatedBool() []= true; - $m->getRepeatedString() []= 'a'; - $m->getRepeatedBytes() []= 'b'; - $m->getRepeatedEnum() []= TestEnum::ZERO; - $m->getRepeatedMessage() []= new TestMessage_Sub(); + self::appendHelper($m, 'RepeatedInt32', -42); + self::appendHelper($m, 'RepeatedInt64', -43); + self::appendHelper($m, 'RepeatedUint32', 42); + self::appendHelper($m, 'RepeatedUint64', 43); + self::appendHelper($m, 'RepeatedSint32', -44); + self::appendHelper($m, 'RepeatedSint64', -45); + self::appendHelper($m, 'RepeatedFixed32', 46); + self::appendHelper($m, 'RepeatedFixed64', 47); + self::appendHelper($m, 'RepeatedSfixed32', -46); + self::appendHelper($m, 'RepeatedSfixed64', -47); + self::appendHelper($m, 'RepeatedFloat', 1.5); + self::appendHelper($m, 'RepeatedDouble', 1.6); + self::appendHelper($m, 'RepeatedBool', true); + self::appendHelper($m, 'RepeatedString', 'a'); + self::appendHelper($m, 'RepeatedBytes', 'b'); + self::appendHelper($m, 'RepeatedEnum', TestEnum::ZERO); + self::appendHelper($m, 'RepeatedMessage', new TestMessage_Sub()); $m->getRepeatedMessage()[0]->setA(34); - $m->getRepeatedInt32() []= -52; - $m->getRepeatedInt64() []= -53; - $m->getRepeatedUint32() []= 52; - $m->getRepeatedUint64() []= 53; - $m->getRepeatedSint32() []= -54; - $m->getRepeatedSint64() []= -55; - $m->getRepeatedFixed32() []= 56; - $m->getRepeatedFixed64() []= 57; - $m->getRepeatedSfixed32() []= -56; - $m->getRepeatedSfixed64() []= -57; - $m->getRepeatedFloat() []= 2.5; - $m->getRepeatedDouble() []= 2.6; - $m->getRepeatedBool() []= false; - $m->getRepeatedString() []= 'c'; - $m->getRepeatedBytes() []= 'd'; - $m->getRepeatedEnum() []= TestEnum::ONE; - $m->getRepeatedMessage() []= new TestMessage_Sub(); + self::appendHelper($m, 'RepeatedInt32', -52); + self::appendHelper($m, 'RepeatedInt64', -53); + self::appendHelper($m, 'RepeatedUint32', 52); + self::appendHelper($m, 'RepeatedUint64', 53); + self::appendHelper($m, 'RepeatedSint32', -54); + self::appendHelper($m, 'RepeatedSint64', -55); + self::appendHelper($m, 'RepeatedFixed32', 56); + self::appendHelper($m, 'RepeatedFixed64', 57); + self::appendHelper($m, 'RepeatedSfixed32', -56); + self::appendHelper($m, 'RepeatedSfixed64', -57); + self::appendHelper($m, 'RepeatedFloat', 2.5); + self::appendHelper($m, 'RepeatedDouble', 2.6); + self::appendHelper($m, 'RepeatedBool', false); + self::appendHelper($m, 'RepeatedString', 'c'); + self::appendHelper($m, 'RepeatedBytes', 'd'); + self::appendHelper($m, 'RepeatedEnum', TestEnum::ONE); + self::appendHelper($m, 'RepeatedMessage', new TestMessage_Sub()); $m->getRepeatedMessage()[1]->SetA(35); - $m->getMapInt32Int32()[-62] = -62; - $m->getMapInt64Int64()[-63] = -63; - $m->getMapUint32Uint32()[62] = 62; - $m->getMapUint64Uint64()[63] = 63; - $m->getMapSint32Sint32()[-64] = -64; - $m->getMapSint64Sint64()[-65] = -65; - $m->getMapFixed32Fixed32()[66] = 66; - $m->getMapFixed64Fixed64()[67] = 67; - $m->getMapSfixed32Sfixed32()[-68] = -68; - $m->getMapSfixed64Sfixed64()[-69] = -69; - $m->getMapInt32Float()[1] = 3.5; - $m->getMapInt32Double()[1] = 3.6; - $m->getMapBoolBool()[true] = true; - $m->getMapStringString()['e'] = 'e'; - $m->getMapInt32Bytes()[1] = 'f'; - $m->getMapInt32Enum()[1] = TestEnum::ONE; - $m->getMapInt32Message()[1] = new TestMessage_Sub(); + self::kvUpdateHelper($m, 'MapInt32Int32', -62, -62); + self::kvUpdateHelper($m, 'MapInt64Int64', -63, -63); + self::kvUpdateHelper($m, 'MapUint32Uint32', 62, 62); + self::kvUpdateHelper($m, 'MapUint64Uint64', 63, 63); + self::kvUpdateHelper($m, 'MapSint32Sint32', -64, -64); + self::kvUpdateHelper($m, 'MapSint64Sint64', -65, -65); + self::kvUpdateHelper($m, 'MapFixed32Fixed32', 66, 66); + self::kvUpdateHelper($m, 'MapFixed64Fixed64', 67, 67); + self::kvUpdateHelper($m, 'MapSfixed32Sfixed32', -68, -68); + self::kvUpdateHelper($m, 'MapSfixed64Sfixed64', -69, -69); + self::kvUpdateHelper($m, 'MapInt32Float', 1, 3.5); + self::kvUpdateHelper($m, 'MapInt32Double', 1, 3.6); + self::kvUpdateHelper($m, 'MapBoolBool', true, true); + self::kvUpdateHelper($m, 'MapStringString', 'e', 'e'); + self::kvUpdateHelper($m, 'MapInt32Bytes', 1, 'f'); + self::kvUpdateHelper($m, 'MapInt32Enum', 1, TestEnum::ONE); + self::kvUpdateHelper($m, 'MapInt32Message', 1, new TestMessage_Sub()); $m->getMapInt32Message()[1]->SetA(36); } @@ -152,61 +152,61 @@ class TestUtil $m->setOptionalMessage($sub); $m->getOptionalMessage()->SetA(133); - $m->getRepeatedInt32() []= -142; - $m->getRepeatedInt64() []= -143; - $m->getRepeatedUint32() []= 142; - $m->getRepeatedUint64() []= 143; - $m->getRepeatedSint32() []= -144; - $m->getRepeatedSint64() []= -145; - $m->getRepeatedFixed32() []= 146; - $m->getRepeatedFixed64() []= 147; - $m->getRepeatedSfixed32() []= -146; - $m->getRepeatedSfixed64() []= -147; - $m->getRepeatedFloat() []= 11.5; - $m->getRepeatedDouble() []= 11.6; - $m->getRepeatedBool() []= false; - $m->getRepeatedString() []= 'aa'; - $m->getRepeatedBytes() []= 'bb'; - $m->getRepeatedEnum() []= TestEnum::TWO; - $m->getRepeatedMessage() []= new TestMessage_Sub(); + self::appendHelper($m, 'RepeatedInt32', -142); + self::appendHelper($m, 'RepeatedInt64', -143); + self::appendHelper($m, 'RepeatedUint32', 142); + self::appendHelper($m, 'RepeatedUint64', 143); + self::appendHelper($m, 'RepeatedSint32', -144); + self::appendHelper($m, 'RepeatedSint64', -145); + self::appendHelper($m, 'RepeatedFixed32', 146); + self::appendHelper($m, 'RepeatedFixed64', 147); + self::appendHelper($m, 'RepeatedSfixed32', -146); + self::appendHelper($m, 'RepeatedSfixed64', -147); + self::appendHelper($m, 'RepeatedFloat', 11.5); + self::appendHelper($m, 'RepeatedDouble', 11.6); + self::appendHelper($m, 'RepeatedBool', false); + self::appendHelper($m, 'RepeatedString', 'aa'); + self::appendHelper($m, 'RepeatedBytes', 'bb'); + self::appendHelper($m, 'RepeatedEnum', TestEnum::TWO); + self::appendHelper($m, 'RepeatedMessage', new TestMessage_Sub()); $m->getRepeatedMessage()[0]->setA(134); - $m->getMapInt32Int32()[-62] = -162; - $m->getMapInt64Int64()[-63] = -163; - $m->getMapUint32Uint32()[62] = 162; - $m->getMapUint64Uint64()[63] = 163; - $m->getMapSint32Sint32()[-64] = -164; - $m->getMapSint64Sint64()[-65] = -165; - $m->getMapFixed32Fixed32()[66] = 166; - $m->getMapFixed64Fixed64()[67] = 167; - $m->getMapSfixed32Sfixed32()[-68] = -168; - $m->getMapSfixed64Sfixed64()[-69] = -169; - $m->getMapInt32Float()[1] = 13.5; - $m->getMapInt32Double()[1] = 13.6; - $m->getMapBoolBool()[true] = false; - $m->getMapStringString()['e'] = 'ee'; - $m->getMapInt32Bytes()[1] = 'ff'; - $m->getMapInt32Enum()[1] = TestEnum::TWO; - $m->getMapInt32Message()[1] = new TestMessage_Sub(); + self::kvUpdateHelper($m, 'MapInt32Int32', -62, -162); + self::kvUpdateHelper($m, 'MapInt64Int64', -63, -163); + self::kvUpdateHelper($m, 'MapUint32Uint32', 62, 162); + self::kvUpdateHelper($m, 'MapUint64Uint64', 63, 163); + self::kvUpdateHelper($m, 'MapSint32Sint32', -64, -164); + self::kvUpdateHelper($m, 'MapSint64Sint64', -65, -165); + self::kvUpdateHelper($m, 'MapFixed32Fixed32', 66, 166); + self::kvUpdateHelper($m, 'MapFixed64Fixed64', 67, 167); + self::kvUpdateHelper($m, 'MapSfixed32Sfixed32', -68, -168); + self::kvUpdateHelper($m, 'MapSfixed64Sfixed64', -69, -169); + self::kvUpdateHelper($m, 'MapInt32Float', 1, 13.5); + self::kvUpdateHelper($m, 'MapInt32Double', 1, 13.6); + self::kvUpdateHelper($m, 'MapBoolBool', true, false); + self::kvUpdateHelper($m, 'MapStringString', 'e', 'ee'); + self::kvUpdateHelper($m, 'MapInt32Bytes', 1, 'ff'); + self::kvUpdateHelper($m, 'MapInt32Enum', 1, TestEnum::TWO); + self::kvUpdateHelper($m, 'MapInt32Message', 1, new TestMessage_Sub()); $m->getMapInt32Message()[1]->SetA(136); - $m->getMapInt32Int32()[-162] = -162; - $m->getMapInt64Int64()[-163] = -163; - $m->getMapUint32Uint32()[162] = 162; - $m->getMapUint64Uint64()[163] = 163; - $m->getMapSint32Sint32()[-164] = -164; - $m->getMapSint64Sint64()[-165] = -165; - $m->getMapFixed32Fixed32()[166] = 166; - $m->getMapFixed64Fixed64()[167] = 167; - $m->getMapSfixed32Sfixed32()[-168] = -168; - $m->getMapSfixed64Sfixed64()[-169] = -169; - $m->getMapInt32Float()[2] = 13.5; - $m->getMapInt32Double()[2] = 13.6; - $m->getMapBoolBool()[false] = false; - $m->getMapStringString()['ee'] = 'ee'; - $m->getMapInt32Bytes()[2] = 'ff'; - $m->getMapInt32Enum()[2] = TestEnum::TWO; - $m->getMapInt32Message()[2] = new TestMessage_Sub(); + self::kvUpdateHelper($m, 'MapInt32Int32', -162, -162); + self::kvUpdateHelper($m, 'MapInt64Int64', -163, -163); + self::kvUpdateHelper($m, 'MapUint32Uint32', 162, 162); + self::kvUpdateHelper($m, 'MapUint64Uint64', 163, 163); + self::kvUpdateHelper($m, 'MapSint32Sint32', -164, -164); + self::kvUpdateHelper($m, 'MapSint64Sint64', -165, -165); + self::kvUpdateHelper($m, 'MapFixed32Fixed32', 166, 166); + self::kvUpdateHelper($m, 'MapFixed64Fixed64', 167, 167); + self::kvUpdateHelper($m, 'MapSfixed32Sfixed32', -168, -168); + self::kvUpdateHelper($m, 'MapSfixed64Sfixed64', -169, -169); + self::kvUpdateHelper($m, 'MapInt32Float', 2, 13.5); + self::kvUpdateHelper($m, 'MapInt32Double', 2, 13.6); + self::kvUpdateHelper($m, 'MapBoolBool', false, false); + self::kvUpdateHelper($m, 'MapStringString', 'ee', 'ee'); + self::kvUpdateHelper($m, 'MapInt32Bytes', 2, 'ff'); + self::kvUpdateHelper($m, 'MapInt32Enum', 2, TestEnum::TWO); + self::kvUpdateHelper($m, 'MapInt32Message', 2, new TestMessage_Sub()); $m->getMapInt32Message()[2]->SetA(136); } @@ -395,34 +395,34 @@ class TestUtil public static function setTestPackedMessage($m) { - $m->getRepeatedInt32()[] = -42; - $m->getRepeatedInt32()[] = -52; - $m->getRepeatedInt64()[] = -43; - $m->getRepeatedInt64()[] = -53; - $m->getRepeatedUint32()[] = 42; - $m->getRepeatedUint32()[] = 52; - $m->getRepeatedUint64()[] = 43; - $m->getRepeatedUint64()[] = 53; - $m->getRepeatedSint32()[] = -44; - $m->getRepeatedSint32()[] = -54; - $m->getRepeatedSint64()[] = -45; - $m->getRepeatedSint64()[] = -55; - $m->getRepeatedFixed32()[] = 46; - $m->getRepeatedFixed32()[] = 56; - $m->getRepeatedFixed64()[] = 47; - $m->getRepeatedFixed64()[] = 57; - $m->getRepeatedSfixed32()[] = -46; - $m->getRepeatedSfixed32()[] = -56; - $m->getRepeatedSfixed64()[] = -47; - $m->getRepeatedSfixed64()[] = -57; - $m->getRepeatedFloat()[] = 1.5; - $m->getRepeatedFloat()[] = 2.5; - $m->getRepeatedDouble()[] = 1.6; - $m->getRepeatedDouble()[] = 2.6; - $m->getRepeatedBool()[] = true; - $m->getRepeatedBool()[] = false; - $m->getRepeatedEnum()[] = TestEnum::ONE; - $m->getRepeatedEnum()[] = TestEnum::ZERO; + self::appendHelper($m, 'RepeatedInt32', -42); + self::appendHelper($m, 'RepeatedInt32', -52); + self::appendHelper($m, 'RepeatedInt64', -43); + self::appendHelper($m, 'RepeatedInt64', -53); + self::appendHelper($m, 'RepeatedUint32', 42); + self::appendHelper($m, 'RepeatedUint32', 52); + self::appendHelper($m, 'RepeatedUint64', 43); + self::appendHelper($m, 'RepeatedUint64', 53); + self::appendHelper($m, 'RepeatedSint32', -44); + self::appendHelper($m, 'RepeatedSint32', -54); + self::appendHelper($m, 'RepeatedSint64', -45); + self::appendHelper($m, 'RepeatedSint64', -55); + self::appendHelper($m, 'RepeatedFixed32', 46); + self::appendHelper($m, 'RepeatedFixed32', 56); + self::appendHelper($m, 'RepeatedFixed64', 47); + self::appendHelper($m, 'RepeatedFixed64', 57); + self::appendHelper($m, 'RepeatedSfixed32', -46); + self::appendHelper($m, 'RepeatedSfixed32', -56); + self::appendHelper($m, 'RepeatedSfixed64', -47); + self::appendHelper($m, 'RepeatedSfixed64', -57); + self::appendHelper($m, 'RepeatedFloat', 1.5); + self::appendHelper($m, 'RepeatedFloat', 2.5); + self::appendHelper($m, 'RepeatedDouble', 1.6); + self::appendHelper($m, 'RepeatedDouble', 2.6); + self::appendHelper($m, 'RepeatedBool', true); + self::appendHelper($m, 'RepeatedBool', false); + self::appendHelper($m, 'RepeatedEnum', TestEnum::ONE); + self::appendHelper($m, 'RepeatedEnum', TestEnum::ZERO); } public static function assertTestPackedMessage($m) @@ -524,4 +524,24 @@ class TestUtil "B80601B80600" ); } + + private static function appendHelper($obj, $func_suffix, $value) + { + $getter_function = 'get'.$func_suffix; + $setter_function = 'set'.$func_suffix; + + $arr = $obj->$getter_function(); + $arr[] = $value; + $obj->$setter_function($arr); + } + + private static function kvUpdateHelper($obj, $func_suffix, $key, $value) + { + $getter_function = 'get'.$func_suffix; + $setter_function = 'set'.$func_suffix; + + $arr = $obj->$getter_function(); + $arr[$key] = $value; + $obj->$setter_function($arr); + } } diff --git a/php/tests/undefined_test.php b/php/tests/undefined_test.php new file mode 100644 index 00000000..dc6b7086 --- /dev/null +++ b/php/tests/undefined_test.php @@ -0,0 +1,920 @@ +<?php + +require_once('test_util.php'); + +use Google\Protobuf\Internal\RepeatedField; +use Google\Protobuf\Internal\GPBType; +use Foo\TestMessage; +use Foo\TestMessage_Sub; + +class UndefinedTest extends PHPUnit_Framework_TestCase +{ + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testInt32AppendStringFail() + { + $arr = new RepeatedField(GPBType::INT32); + $arr[] = 'abc'; + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testInt32SetStringFail() + { + $arr = new RepeatedField(GPBType::INT32); + $arr[] = 0; + $arr[0] = 'abc'; + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testInt32AppendMessageFail() + { + $arr = new RepeatedField(GPBType::INT32); + $arr[] = new TestMessage_Sub(); + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testInt32SetMessageFail() + { + $arr = new RepeatedField(GPBType::INT32); + $arr[] = 0; + $arr[0] = new TestMessage_Sub(); + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testUint32AppendStringFail() + { + $arr = new RepeatedField(GPBType::UINT32); + $arr[] = 'abc'; + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testUint32SetStringFail() + { + $arr = new RepeatedField(GPBType::UINT32); + $arr[] = 0; + $arr[0] = 'abc'; + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testUint32AppendMessageFail() + { + $arr = new RepeatedField(GPBType::UINT32); + $arr[] = new TestMessage_Sub(); + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testUint32SetMessageFail() + { + $arr = new RepeatedField(GPBType::UINT32); + $arr[] = 0; + $arr[0] = new TestMessage_Sub(); + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testInt64AppendStringFail() + { + $arr = new RepeatedField(GPBType::INT64); + $arr[] = 'abc'; + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testInt64SetStringFail() + { + $arr = new RepeatedField(GPBType::INT64); + $arr[] = 0; + $arr[0] = 'abc'; + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testInt64AppendMessageFail() + { + $arr = new RepeatedField(GPBType::INT64); + $arr[] = new TestMessage_Sub(); + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testInt64SetMessageFail() + { + $arr = new RepeatedField(GPBType::INT64); + $arr[] = 0; + $arr[0] = new TestMessage_Sub(); + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testUint64AppendStringFail() + { + $arr = new RepeatedField(GPBType::UINT64); + $arr[] = 'abc'; + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testUint64SetStringFail() + { + $arr = new RepeatedField(GPBType::UINT64); + $arr[] = 0; + $arr[0] = 'abc'; + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testUint64AppendMessageFail() + { + $arr = new RepeatedField(GPBType::UINT64); + $arr[] = new TestMessage_Sub(); + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testUint64SetMessageFail() + { + $arr = new RepeatedField(GPBType::UINT64); + $arr[] = 0; + $arr[0] = new TestMessage_Sub(); + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testFloatAppendStringFail() + { + $arr = new RepeatedField(GPBType::FLOAT); + $arr[] = 'abc'; + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testFloatSetStringFail() + { + $arr = new RepeatedField(GPBType::FLOAT); + $arr[] = 0.0; + $arr[0] = 'abc'; + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testFloatAppendMessageFail() + { + $arr = new RepeatedField(GPBType::FLOAT); + $arr[] = new TestMessage_Sub(); + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testFloatSetMessageFail() + { + $arr = new RepeatedField(GPBType::FLOAT); + $arr[] = 0.0; + $arr[0] = new TestMessage_Sub(); + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testDoubleAppendStringFail() + { + $arr = new RepeatedField(GPBType::DOUBLE); + $arr[] = 'abc'; + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testDoubleSetStringFail() + { + $arr = new RepeatedField(GPBType::DOUBLE); + $arr[] = 0.0; + $arr[0] = 'abc'; + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testDoubleAppendMessageFail() + { + $arr = new RepeatedField(GPBType::DOUBLE); + $arr[] = new TestMessage_Sub(); + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testDoubleSetMessageFail() + { + $arr = new RepeatedField(GPBType::DOUBLE); + $arr[] = 0.0; + $arr[0] = new TestMessage_Sub(); + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testBoolAppendMessageFail() + { + $arr = new RepeatedField(GPBType::BOOL); + $arr[] = new TestMessage_Sub(); + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testBoolSetMessageFail() + { + $arr = new RepeatedField(GPBType::BOOL); + $arr[] = true; + $arr[0] = new TestMessage_Sub(); + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testStringAppendMessageFail() + { + $arr = new RepeatedField(GPBType::STRING); + $arr[] = new TestMessage_Sub(); + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testStringSetMessageFail() + { + $arr = new RepeatedField(GPBType::STRING); + $arr[] = 'abc'; + $arr[0] = new TestMessage_Sub(); + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testStringAppendInvalidUTF8Fail() + { + $arr = new RepeatedField(GPBType::STRING); + $hex = hex2bin("ff"); + $arr[] = $hex; + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testStringSetInvalidUTF8Fail() + { + $arr = new RepeatedField(GPBType::STRING); + $arr[] = 'abc'; + $hex = hex2bin("ff"); + $arr[0] = $hex; + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testMessageAppendIntFail() + { + $arr = new RepeatedField(GPBType::MESSAGE, TestMessage_Sub::class); + $arr[] = 1; + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testMessageSetIntFail() + { + $arr = new RepeatedField(GPBType::MESSAGE, TestMessage_Sub::class); + $arr[] = new TestMessage_Sub; + $arr[0] = 'abc'; + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testMessageAppendStringFail() + { + $arr = new RepeatedField(GPBType::MESSAGE, TestMessage_Sub::class); + $arr[] = 'abc'; + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testMessageSetStringFail() + { + $arr = new RepeatedField(GPBType::MESSAGE, TestMessage_Sub::class); + $arr[] = new TestMessage_Sub; + $arr[0] = 'abc'; + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testMessageAppendOtherMessageFail() + { + $arr = new RepeatedField(GPBType::MESSAGE, TestMessage_Sub::class); + $arr[] = new TestMessage; + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testMessageAppendNullFail() + { + $arr = new RepeatedField(GPBType::MESSAGE, TestMessage_Sub::class); + $null = null; + $arr[] = $null; + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testMessageSetNullFail() + { + $arr = new RepeatedField(GPBType::MESSAGE, TestMessage_Sub::class); + $arr[] = new TestMessage_Sub(); + $null = null; + $arr[0] = $null; + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testRemoveMiddleFail() + { + $arr = new RepeatedField(GPBType::INT32); + + $arr[] = 0; + $arr[] = 1; + $arr[] = 2; + $this->assertSame(3, count($arr)); + + unset($arr[1]); + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testRemoveEmptyFail() + { + $arr = new RepeatedField(GPBType::INT32); + + unset($arr[0]); + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testMessageOffsetFail() + { + $arr = new RepeatedField(GPBType::INT32); + $arr[] = 0; + $arr[new TestMessage_Sub()] = 0; + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testStringOffsetFail() + { + $arr = new RepeatedField(GPBType::INT32); + $arr[] = 0; + $arr['abc'] = 0; + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testSetNonExistedOffsetFail() + { + $arr = new RepeatedField(GPBType::INT32); + $arr[0] = 0; + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testInt32FieldInvalidTypeFail() + { + $m = new TestMessage(); + $m->setOptionalInt32(new TestMessage()); + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testInt32FieldInvalidStringFail() + { + $m = new TestMessage(); + $m->setOptionalInt32('abc'); + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testUint32FieldInvalidTypeFail() + { + $m = new TestMessage(); + $m->setOptionalUint32(new TestMessage()); + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testUint32FieldInvalidStringFail() + { + $m = new TestMessage(); + $m->setOptionalUint32('abc'); + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testInt64FieldInvalidTypeFail() + { + $m = new TestMessage(); + $m->setOptionalInt64(new TestMessage()); + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testInt64FieldInvalidStringFail() + { + $m = new TestMessage(); + $m->setOptionalInt64('abc'); + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testUint64FieldInvalidTypeFail() + { + $m = new TestMessage(); + $m->setOptionalUint64(new TestMessage()); + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testUint64FieldInvalidStringFail() + { + $m = new TestMessage(); + $m->setOptionalUint64('abc'); + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testFloatFieldInvalidTypeFail() + { + $m = new TestMessage(); + $m->setOptionalFloat(new TestMessage()); + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testFloatFieldInvalidStringFail() + { + $m = new TestMessage(); + $m->setOptionalFloat('abc'); + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testDoubleFieldInvalidTypeFail() + { + $m = new TestMessage(); + $m->setOptionalDouble(new TestMessage()); + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testDoubleFieldInvalidStringFail() + { + $m = new TestMessage(); + $m->setOptionalDouble('abc'); + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testBoolFieldInvalidStringFail() + { + $m = new TestMessage(); + $m->setOptionalBool(new TestMessage()); + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testStringFieldInvalidUTF8Fail() + { + $m = new TestMessage(); + $hex = hex2bin("ff"); + $m->setOptionalString($hex); + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testMessageFieldWrongTypeFail() + { + $m = new TestMessage(); + $a = 1; + $m->setOptionalMessage($a); + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testMessageFieldWrongClassFail() + { + $m = new TestMessage(); + $m->setOptionalMessage(new TestMessage()); + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testRepeatedFieldWrongTypeFail() + { + $m = new TestMessage(); + $a = 1; + $m->setRepeatedInt32($a); + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testRepeatedFieldWrongObjectFail() + { + $m = new TestMessage(); + $m->setRepeatedInt32($m); + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testRepeatedFieldWrongRepeatedTypeFail() + { + $m = new TestMessage(); + + $repeated_int32 = new RepeatedField(GPBType::UINT32); + $m->setRepeatedInt32($repeated_int32); + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testRepeatedFieldWrongRepeatedMessageClassFail() + { + $m = new TestMessage(); + + $repeated_message = new RepeatedField(GPBType::MESSAGE, + TestMessage::class); + $m->setRepeatedMessage($repeated_message); + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testMapFieldWrongTypeFail() + { + $m = new TestMessage(); + $a = 1; + $m->setMapInt32Int32($a); + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testMapFieldWrongObjectFail() + { + $m = new TestMessage(); + $m->setMapInt32Int32($m); + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testMapFieldWrongRepeatedTypeFail() + { + $m = new TestMessage(); + + $map_uint32_uint32 = new MapField(GPBType::UINT32, GPBType::UINT32); + $m->setMapInt32Int32($map_uint32_uint32); + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testMapFieldWrongRepeatedMessageClassFail() + { + $m = new TestMessage(); + + $map_int32_message = new MapField(GPBType::INT32, + GPBType::MESSAGE, + TestMessage::class); + $m->setMapInt32Message($map_int32_message); + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testMessageMergeFromInvalidTypeFail() + { + $m = new TestMessage(); + $n = new TestMessage_Sub(); + $m->mergeFrom($n); + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testInt32SetStringKeyFail() + { + $arr = new MapField(GPBType::INT32, GPBType::INT32); + $arr['abc'] = 0; + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testInt32SetStringValueFail() + { + $arr = new MapField(GPBType::INT32, GPBType::INT32); + $arr[0] = 'abc'; + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testInt32SetMessageKeyFail() + { + $arr = new MapField(GPBType::INT32, GPBType::INT32); + $arr[new TestMessage_Sub()] = 0; + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testInt32SetMessageValueFail() + { + $arr = new MapField(GPBType::INT32, GPBType::INT32); + $arr[0] = new TestMessage_Sub(); + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testUint32SetStringKeyFail() + { + $arr = new MapField(GPBType::UINT32, GPBType::UINT32); + $arr['abc'] = 0; + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testUint32SetStringValueFail() + { + $arr = new MapField(GPBType::UINT32, GPBType::UINT32); + $arr[0] = 'abc'; + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testUint32SetMessageKeyFail() + { + $arr = new MapField(GPBType::UINT32, GPBType::UINT32); + $arr[new TestMessage_Sub()] = 0; + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testUint32SetMessageValueFail() + { + $arr = new MapField(GPBType::UINT32, GPBType::UINT32); + $arr[0] = new TestMessage_Sub(); + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testInt64SetStringKeyFail() + { + $arr = new MapField(GPBType::INT64, GPBType::INT64); + $arr['abc'] = 0; + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testInt64SetStringValueFail() + { + $arr = new MapField(GPBType::INT64, GPBType::INT64); + $arr[0] = 'abc'; + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testInt64SetMessageKeyFail() + { + $arr = new MapField(GPBType::INT64, GPBType::INT64); + $arr[new TestMessage_Sub()] = 0; + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testInt64SetMessageValueFail() + { + $arr = new MapField(GPBType::INT64, GPBType::INT64); + $arr[0] = new TestMessage_Sub(); + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testUint64SetStringKeyFail() + { + $arr = new MapField(GPBType::UINT64, GPBType::UINT64); + $arr['abc'] = 0; + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testUint64SetStringValueFail() + { + $arr = new MapField(GPBType::UINT64, GPBType::UINT64); + $arr[0] = 'abc'; + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testUint64SetMessageKeyFail() + { + $arr = new MapField(GPBType::UINT64, GPBType::UINT64); + $arr[new TestMessage_Sub()] = 0; + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testUint64SetMessageValueFail() + { + $arr = new MapField(GPBType::UINT64, GPBType::UINT64); + $arr[0] = new TestMessage_Sub(); + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testDoubleSetStringValueFail() + { + $arr = new MapField(GPBType::INT64, GPBType::DOUBLE); + $arr[0] = 'abc'; + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testDoubleSetMessageValueFail() + { + $arr = new MapField(GPBType::INT64, GPBType::DOUBLE); + $arr[0] = new TestMessage_Sub(); + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testBoolSetMessageKeyFail() + { + $arr = new MapField(GPBType::BOOL, GPBType::BOOL); + $arr[new TestMessage_Sub()] = true; + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testBoolSetMessageValueFail() + { + $arr = new MapField(GPBType::BOOL, GPBType::BOOL); + $arr[true] = new TestMessage_Sub(); + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testStringSetInvalidUTF8KeyFail() + { + $arr = new MapField(GPBType::STRING, GPBType::STRING); + $arr[hex2bin("ff")] = 'abc'; + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testStringSetInvalidUTF8ValueFail() + { + $arr = new MapField(GPBType::STRING, GPBType::STRING); + $arr['abc'] = hex2bin("ff"); + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testStringSetMessageKeyFail() + { + $arr = new MapField(GPBType::STRING, GPBType::STRING); + $arr[new TestMessage_Sub()] = 'abc'; + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testStringSetMessageValueFail() + { + $arr = new MapField(GPBType::STRING, GPBType::STRING); + $arr['abc'] = new TestMessage_Sub(); + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testMessageSetIntValueFail() + { + $arr = + new MapField(GPBType::INT32, GPBType::MESSAGE, TestMessage::class); + $arr[0] = 0; + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testMessageSetStringValueFail() + { + $arr = + new MapField(GPBType::INT32, GPBType::MESSAGE, TestMessage::class); + $arr[0] = 'abc'; + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testMessageSetOtherMessageValueFail() + { + $arr = + new MapField(GPBType::INT32, GPBType::MESSAGE, TestMessage::class); + $arr[0] = new TestMessage_Sub(); + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testMessageSetNullFail() + { + $arr = + new MapField(GPBType::INT32, GPBType::MESSAGE, TestMessage::class); + $null = NULL; + $arr[0] = $null; + } + +} |