Skip to content

Commit

Permalink
Merge pull request #10356 from haberman/php-containing-oneof
Browse files Browse the repository at this point in the history
[PHP] Added getContainingOneof and getRealContainingOneof to descriptor.
  • Loading branch information
haberman committed Aug 4, 2022
1 parent de48e9d commit 005f6d1
Show file tree
Hide file tree
Showing 3 changed files with 60 additions and 2 deletions.
41 changes: 41 additions & 0 deletions php/ext/google/protobuf/def.c
Expand Up @@ -456,6 +456,44 @@ PHP_METHOD(FieldDescriptor, getEnumType) {
RETURN_COPY_VALUE(&ret);
}

/*
* FieldDescriptor::getContainingOneof()
*
* Returns the OneofDescriptor for this field, or null if it is not inside
* a oneof.
*/
PHP_METHOD(FieldDescriptor, getContainingOneof) {
FieldDescriptor *intern = (FieldDescriptor*)Z_OBJ_P(getThis());
const upb_OneofDef *o = upb_FieldDef_ContainingOneof(intern->fielddef);
zval ret;

if (!o) {
RETURN_NULL();
}

OneofDescriptor_FromOneofDef(&ret, o);
RETURN_COPY_VALUE(&ret);
}

/*
* FieldDescriptor::getRealContainingOneof()
*
* Returns the non-synthetic OneofDescriptor for this field, or null if it is
* not inside a oneof.
*/
PHP_METHOD(FieldDescriptor, getRealContainingOneof) {
FieldDescriptor *intern = (FieldDescriptor*)Z_OBJ_P(getThis());
const upb_OneofDef *o = upb_FieldDef_RealContainingOneof(intern->fielddef);
zval ret;

if (!o) {
RETURN_NULL();
}

OneofDescriptor_FromOneofDef(&ret, o);
RETURN_COPY_VALUE(&ret);
}

/*
* FieldDescriptor::getMessageType()
*
Expand All @@ -482,6 +520,8 @@ static zend_function_entry FieldDescriptor_methods[] = {
PHP_ME(FieldDescriptor, getType, arginfo_void, ZEND_ACC_PUBLIC)
PHP_ME(FieldDescriptor, isMap, arginfo_void, ZEND_ACC_PUBLIC)
PHP_ME(FieldDescriptor, getEnumType, arginfo_void, ZEND_ACC_PUBLIC)
PHP_ME(FieldDescriptor, getContainingOneof, arginfo_void, ZEND_ACC_PUBLIC)
PHP_ME(FieldDescriptor, getRealContainingOneof, arginfo_void, ZEND_ACC_PUBLIC)
PHP_ME(FieldDescriptor, getMessageType, arginfo_void, ZEND_ACC_PUBLIC)
ZEND_FE_END
};
Expand Down Expand Up @@ -516,6 +556,7 @@ static zend_class_entry *Descriptor_GetGeneratedClass(const upb_MessageDef *m) {
char *classname =
GetPhpClassname(upb_MessageDef_File(m), upb_MessageDef_FullName(m), false);
zend_error(E_ERROR, "Couldn't load generated class %s", classname);
return NULL;
}

void Descriptor_FromMessageDef(zval *val, const upb_MessageDef *m) {
Expand Down
20 changes: 18 additions & 2 deletions php/tests/DescriptorsTest.php
Expand Up @@ -83,10 +83,10 @@ public function testDescriptor()
$this->assertSame($class, $desc->getClass());

$this->assertInstanceOf('\Google\Protobuf\FieldDescriptor', $desc->getField(0));
$this->assertSame(7, $desc->getFieldCount());
$this->assertSame(8, $desc->getFieldCount());

$this->assertInstanceOf('\Google\Protobuf\OneofDescriptor', $desc->getOneofDecl(0));
$this->assertSame(1, $desc->getOneofDeclCount());
$this->assertSame(2, $desc->getOneofDeclCount());
}

public function testDescriptorForIncludedMessage()
Expand Down Expand Up @@ -180,6 +180,7 @@ public function testFieldDescriptor()
$this->assertSame(self::GPBTYPE_MESSAGE, $fieldDesc->getType());
$this->assertInstanceOf('\Google\Protobuf\Descriptor', $fieldDesc->getMessageType());
$this->assertFalse($fieldDesc->isMap());
$this->assertNull($fieldDesc->getContainingOneof());

// Oneof int field
// Tested further in testOneofDescriptor()
Expand All @@ -189,6 +190,21 @@ public function testFieldDescriptor()
$this->assertSame(self::GPBLABEL_OPTIONAL, $fieldDesc->getLabel());
$this->assertSame(self::GPBTYPE_INT32, $fieldDesc->getType());
$this->assertFalse($fieldDesc->isMap());
$this->assertSame($fieldDesc->getContainingOneof(), $fieldDesc->getRealContainingOneof());

$oneofDesc = $fieldDesc->getContainingOneof();
$this->assertSame('my_oneof', $oneofDesc->getName());

// Proto3 optional it field.
// Tested further in testOneofDescriptor()
$fieldDesc = $fieldDescMap[52];
$this->assertSame('proto3_optional_int32', $fieldDesc->getName());
$this->assertSame(52, $fieldDesc->getNumber());
$this->assertSame(self::GPBLABEL_OPTIONAL, $fieldDesc->getLabel());
$this->assertSame(self::GPBTYPE_INT32, $fieldDesc->getType());
$this->assertFalse($fieldDesc->isMap());
$this->assertNull($fieldDesc->getRealContainingOneof());
$this->assertNotNull($fieldDesc->getContainingOneof());

// Map int-enum field
$fieldDesc = $fieldDescMap[71];
Expand Down
1 change: 1 addition & 0 deletions php/tests/proto/test_descriptors.proto
Expand Up @@ -14,6 +14,7 @@ message TestDescriptorsMessage {
oneof my_oneof {
int32 oneof_int32 = 51;
}
optional int32 proto3_optional_int32 = 52;

map<int32, EnumSub> map_int32_enum = 71;

Expand Down

0 comments on commit 005f6d1

Please sign in to comment.