Skip to content

Commit

Permalink
Add ReflectionHandlerV5
Browse files Browse the repository at this point in the history
  • Loading branch information
jeromegamez committed Jun 10, 2022
1 parent 1e54a4a commit f576c97
Show file tree
Hide file tree
Showing 3 changed files with 166 additions and 5 deletions.
15 changes: 11 additions & 4 deletions Core/src/Testing/Reflection/ReflectionHandlerFactory.php
Original file line number Diff line number Diff line change
Expand Up @@ -18,19 +18,26 @@
namespace Google\Cloud\Core\Testing\Reflection;

use phpDocumentor\Reflection\File\LocalFile;
use phpDocumentor\Reflection\Metadata\MetaDataContainer;

/**
* Class for determining if phpdocumentor/reflection v3 or v4 is being used.
*/
class ReflectionHandlerFactory
{
/**
* @return ReflectionHandlerV3|ReflectionHandlerV4
* @return ReflectionHandlerV3|ReflectionHandlerV4|ReflectionHandlerV5
*/
public static function create()
{
return class_exists(LocalFile::class)
? new ReflectionHandlerV4()
: new ReflectionHandlerV3();
if (class_exists(MetaDataContainer::class)) {
return new ReflectionHandlerV5();
}

if (class_exists(LocalFile::class)) {
return new ReflectionHandlerV4();
}

return new ReflectionHandlerV3();
}
}
155 changes: 155 additions & 0 deletions Core/src/Testing/Reflection/ReflectionHandlerV5.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,155 @@
<?php
/**
* Copyright 2022 Google LLC
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

namespace Google\Cloud\Core\Testing\Reflection;

use Google\Cloud\Core\Testing\Reflection\DescriptionFactory as CoreDescriptionFactory;
use phpDocumentor\Reflection\DocBlock;
use phpDocumentor\Reflection\DocBlock\DescriptionFactory;
use phpDocumentor\Reflection\DocBlock\StandardTagFactory;
use phpDocumentor\Reflection\DocBlockFactory;
use phpDocumentor\Reflection\File\LocalFile;
use phpDocumentor\Reflection\FqsenResolver;
use phpDocumentor\Reflection\NodeVisitor\ElementNameResolver;
use phpDocumentor\Reflection\Php\Factory;
use phpDocumentor\Reflection\Php\NodesFactory;
use phpDocumentor\Reflection\Php\ProjectFactory;
use phpDocumentor\Reflection\TypeResolver;
use PhpParser\Lexer;
use PhpParser\NodeTraverser;
use PhpParser\NodeVisitor\NameResolver;
use PhpParser\ParserFactory;
use PhpParser\PrettyPrinter\Standard as PrettyPrinter;

/**
* Class for running snippets using phpdocumentor/reflection:v4.
*/
class ReflectionHandlerV5
{
private $descriptionFactory;
private $docBlockFactory;

public function __construct()
{
$this->descriptionFactory = $this->createDescriptionFactory();
$this->docBlockFactory = $this->createDocBlockFactory($this->descriptionFactory);
}

/**
* @param string $class
* @return DocBlock
*/
public function createDocBlock($classOrMethod)
{
return $this->docBlockFactory->create($classOrMethod);
}

/**
* @param DocBlock $docBlock
* @return string
*/
public function getDocBlockText(DocBlock $docBlock)
{
$description = $this->descriptionFactory->create(
$docBlock->getSummary() . "\n\n" . $docBlock->getDescription(),
$docBlock->getContext()
);
return $description->render();
}

/**
* @param array $files
* @return string[]
*/
public function classes(array $files)
{
$projectFactory = $this->createProjectFactory();
$localFiles = [];
foreach ($files as $file) {
$localFiles[] = new LocalFile($file);
}
$project = $projectFactory->create('My Project', $localFiles);
$classes = [];
foreach ($files as $file) {
$classesInFile = $project->getFiles()[$file]->getClasses();
foreach ($classesInFile as $class) {
$classes[] = (string) $class->getFqsen();
}
}
return $classes;
}

/**
* @return ProjectFactory
*/
public function createProjectFactory()
{
$parser = (new ParserFactory())->create(
ParserFactory::ONLY_PHP7,
new Lexer\Emulative(['phpVersion' => Lexer\Emulative::PHP_8_0])
);
$nodeTraverser = new NodeTraverser();
$nodeTraverser->addVisitor(new NameResolver());
$nodeTraverser->addVisitor(new ElementNameResolver());
$nodesFactory = new NodesFactory($parser, $nodeTraverser);

$docBlockFactory = $this->createDocBlockFactory($this->createDescriptionFactory());

$projectFactory = new ProjectFactory(
[
new Factory\Argument(new PrettyPrinter()),
new Factory\Class_($docBlockFactory),
new Factory\Define($docBlockFactory, new PrettyPrinter()),
new Factory\GlobalConstant($docBlockFactory, new PrettyPrinter()),
new Factory\ClassConstant($docBlockFactory, new PrettyPrinter()),
// new Factory\DocBlock($docBlockFactory),
new Factory\File($docBlockFactory, $nodesFactory),
new Factory\Function_($docBlockFactory),
new Factory\Interface_($docBlockFactory),
new Factory\Method($docBlockFactory),
new Factory\Property($docBlockFactory, new PrettyPrinter()),
new Factory\Trait_($docBlockFactory),
]
);

return $projectFactory;
}

/**
* @return DescriptionFactory
*/
public function createDescriptionFactory()
{
$fqsenResolver = new FqsenResolver();
$tagFactory = new StandardTagFactory($fqsenResolver);
$descriptionFactory = new CoreDescriptionFactory($tagFactory);

$tagFactory->addService($descriptionFactory, DescriptionFactory::class);
$tagFactory->addService(new TypeResolver($fqsenResolver));

return $descriptionFactory;
}

/**
* @return DocBlockFactory
*/
private function createDocBlockFactory($descriptionFactory)
{
$tagFactory = $descriptionFactory->getTagFactory();
return new DocBlockFactory($descriptionFactory, $tagFactory);
}
}
1 change: 0 additions & 1 deletion Logging/tests/Unit/LoggerInterfaceTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@

namespace Google\Cloud\Logging\Tests\Unit;


use PHPUnit\Framework\TestCase;
use Psr\Log\LoggerInterface;
use Psr\Log\LogLevel;
Expand Down

0 comments on commit f576c97

Please sign in to comment.