Skip to content

Commit

Permalink
cherry-pick c38281d
Browse files Browse the repository at this point in the history
  • Loading branch information
esorot committed Jun 22, 2022
1 parent 39996cf commit 71adb83
Show file tree
Hide file tree
Showing 4 changed files with 79 additions and 12 deletions.
35 changes: 27 additions & 8 deletions php/src/Google/Protobuf/FieldDescriptor.php
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ class FieldDescriptor
{
use GetPublicDescriptorTrait;

/** @var \Google\Protobuf\Internal\FieldDescriptor $internal_desc */
private $internal_desc;

/**
Expand Down Expand Up @@ -81,6 +82,32 @@ public function getType()
return $this->internal_desc->getType();
}

/**
* @return OneofDescriptor
*/
public function getContainingOneof()
{
return $this->getPublicDescriptor($this->internal_desc->getContainingOneof());
}

/**
* Gets the field's containing oneof, only if non-synthetic.
*
* @return null|OneofDescriptor
*/
public function getRealContainingOneof()
{
return $this->getPublicDescriptor($this->internal_desc->getRealContainingOneof());
}

/**
* @return boolean
*/
public function hasOptionalKeyword()
{
return $this->internal_desc->hasOptionalKeyword();
}

/**
* @return Descriptor Returns a descriptor for the field type if the field type is a message, otherwise throws \Exception
* @throws \Exception
Expand Down Expand Up @@ -114,12 +141,4 @@ public function isMap()
{
return $this->internal_desc->isMap();
}

/**
* @return boolean
*/
public function hasOptionalKeyword()
{
return $this->internal_desc->hasOptionalKeyword();
}
}
38 changes: 35 additions & 3 deletions php/src/Google/Protobuf/Internal/FieldDescriptor.php
Original file line number Diff line number Diff line change
Expand Up @@ -46,8 +46,11 @@ class FieldDescriptor
private $message_type;
private $enum_type;
private $packed;
private $is_map;
private $oneof_index = -1;
private $proto3_optional;

/** @var OneofDescriptor $containing_oneof */
private $containing_oneof;

public function __construct()
{
Expand Down Expand Up @@ -169,6 +172,32 @@ public function getPacked()
return $this->packed;
}

public function getProto3Optional()
{
return $this->proto3_optional;
}

public function setProto3Optional($proto3_optional)
{
$this->proto3_optional = $proto3_optional;
}

public function getContainingOneof()
{
return $this->containing_oneof;
}

public function setContainingOneof($containing_oneof)
{
$this->containing_oneof = $containing_oneof;
}

public function getRealContainingOneof()
{
return !is_null($this->containing_oneof) && !$this->containing_oneof->isSynthetic()
? $this->containing_oneof : null;
}

public function isPackable()
{
return $this->isRepeated() && self::isTypePackable($this->type);
Expand Down Expand Up @@ -214,6 +243,10 @@ private static function isTypePackable($field_type)
$field_type !== GPBType::BYTES);
}

/**
* @param FieldDescriptorProto $proto
* @return FieldDescriptor
*/
public static function getFieldDescriptor($proto)
{
$type_name = null;
Expand Down Expand Up @@ -248,8 +281,6 @@ public static function getFieldDescriptor($proto)
$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 {
Expand All @@ -269,6 +300,7 @@ public static function getFieldDescriptor($proto)
$field->setLabel($proto->getLabel());
$field->setPacked($packed);
$field->setOneofIndex($oneof_index);
$field->setProto3Optional($proto->getProto3Optional());

// 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
Expand Down
9 changes: 9 additions & 0 deletions php/src/Google/Protobuf/Internal/OneofDescriptor.php
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ class OneofDescriptor
use HasPublicDescriptorTrait;

private $name;
/** @var \Google\Protobuf\FieldDescriptor[] $fields */
private $fields;

public function __construct()
Expand Down Expand Up @@ -64,13 +65,21 @@ public function getFields()
return $this->fields;
}

public function isSynthetic()
{
return !is_null($this->fields) && count($this->fields) === 1
&& $this->fields[0]->getProto3Optional();
}

public static function buildFromProto($oneof_proto, $desc, $index)
{
$oneof = new OneofDescriptor();
$oneof->setName($oneof_proto->getName());
foreach ($desc->getField() as $field) {
/** @var FieldDescriptor $field */
if ($field->getOneofIndex() == $index) {
$oneof->addField($field);
$field->setContainingOneof($oneof);
}
}
return $oneof;
Expand Down
9 changes: 8 additions & 1 deletion php/src/Google/Protobuf/OneofDescriptor.php
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ class OneofDescriptor
{
use GetPublicDescriptorTrait;

/** @var \Google\Protobuf\Internal\OneofDescriptor $internal_desc */
private $internal_desc;

/**
Expand All @@ -62,6 +63,12 @@ public function getName()
*/
public function getField($index)
{
if (
is_null($this->internal_desc->getFields())
|| !isset($this->internal_desc->getFields()[$index])
) {
return null;
}
return $this->getPublicDescriptor($this->internal_desc->getFields()[$index]);
}

Expand All @@ -75,6 +82,6 @@ public function getFieldCount()

public function isSynthetic()
{
return $this->internal_desc->isSynthetic();
return $this->internal_desc->isSynthetic();
}
}

0 comments on commit 71adb83

Please sign in to comment.