Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
"Google\\PostProcessor\\": "src/PostProcessor",
"Google\\Generator\\": "src",
"Google\\Generator\\Tests\\": "tests",
"Google\\Protobuf\\Internal\\": "src/Protobuf/Internal",
"Google\\": "generated/Google",
"Grpc\\": "generated/Grpc",
"GPBMetadata\\": "generated/GPBMetadata"
Expand Down
2 changes: 2 additions & 0 deletions src/Ast/PhpClass.php
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@

namespace Google\Generator\Ast;

use AllowDynamicProperties;
use Exception;
use Google\Generator\Collections\Set;
use Google\Generator\Collections\Vector;
Expand All @@ -26,6 +27,7 @@
use RuntimeException;

/** A class definition. */
#[AllowDynamicProperties]
final class PhpClass extends AST
{
use HasPhpDoc;
Expand Down
3 changes: 3 additions & 0 deletions src/Ast/PhpConstant.php
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,10 @@

namespace Google\Generator\Ast;

use AllowDynamicProperties;

/** A constant within a class. */
#[AllowDynamicProperties]
final class PhpConstant extends PhpClassMember
{
private mixed $value;
Expand Down
2 changes: 2 additions & 0 deletions src/Ast/PhpFunction.php
Original file line number Diff line number Diff line change
Expand Up @@ -18,13 +18,15 @@

namespace Google\Generator\Ast;

use AllowDynamicProperties;
use Google\Generator\Collections\Vector;
use Google\Generator\Utils\ResolvedType;

/**
* A function that can be placed in any block of code. Please use
* {@see PhpMethod} if you intend to add a function to a class.
*/
#[AllowDynamicProperties]
final class PhpFunction extends AST implements ShouldNotApplySemicolonInterface
{
use HasPhpDoc;
Expand Down
2 changes: 2 additions & 0 deletions src/Ast/PhpMethod.php
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,12 @@

namespace Google\Generator\Ast;

use AllowDynamicProperties;
use Google\Generator\Collections\Vector;
use Google\Generator\Utils\ResolvedType;

/** A method within a class. */
#[AllowDynamicProperties]
final class PhpMethod extends PhpClassMember
{
public function __construct(string $name)
Expand Down
2 changes: 2 additions & 0 deletions src/Ast/PhpProperty.php
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,11 @@

namespace Google\Generator\Ast;

use AllowDynamicProperties;
use Google\Generator\Utils\ResolvedType;

/** A property within a class. */
#[AllowDynamicProperties]
final class PhpProperty extends PhpClassMember
{
private ?ResolvedType $type;
Expand Down
216 changes: 216 additions & 0 deletions src/Protobuf/Internal/Descriptor.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,216 @@
<?php

// Protocol Buffers - Google's data interchange format
// Copyright 2008 Google Inc. All rights reserved.
//
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file or at
// https://developers.google.com/open-source/licenses/bsd

namespace Google\Protobuf\Internal;

use AllowDynamicProperties;

#[AllowDynamicProperties]
class Descriptor
{
use HasPublicDescriptorTrait;

private $full_name;
private $field = [];
private $json_to_field = [];
private $name_to_field = [];
private $index_to_field = [];
private $nested_type = [];
private $enum_type = [];
private $klass;
private $legacy_klass;
private $previous_klass;
private $options;
private $oneof_decl = [];

public function __construct()
{
$this->public_desc = new \Google\Protobuf\Descriptor($this);
}

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;
$this->index_to_field[] = $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 getFieldByIndex($index)
{
if (count($this->index_to_field) <= $index) {
return NULL;
} else {
return $this->index_to_field[$index];
}
}

public function setClass($klass)
{
$this->klass = $klass;
}

public function getClass()
{
return $this->klass;
}

public function setLegacyClass($klass)
{
$this->legacy_klass = $klass;
}

public function getLegacyClass()
{
return $this->legacy_klass;
}

public function setPreviouslyUnreservedClass($klass)
{
$this->previous_klass = $klass;
}

public function getPreviouslyUnreservedClass()
{
return $this->previous_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 = "";
$legacy_classname = "";
$previous_classname = "";
$fullname = "";
GPBUtil::getFullClassName(
$proto,
$containing,
$file_proto,
$message_name_without_package,
$classname,
$legacy_classname,
$fullname,
$previous_classname);
$desc->setFullName($fullname);
$desc->setClass($classname);
$desc->setLegacyClass($legacy_classname);
$desc->setPreviouslyUnreservedClass($previous_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.
$index = 0;
foreach ($proto->getOneofDecl() as $oneof_proto) {
$desc->addOneofDecl(
OneofDescriptor::buildFromProto($oneof_proto, $desc, $index));
$index++;
}

return $desc;
}
}
Loading
Loading