From 1dd491c8ecad9698e1bb2c3b87b2513f76f5bc2c Mon Sep 17 00:00:00 2001 From: Jaapio Date: Fri, 28 Oct 2022 16:47:01 +0200 Subject: [PATCH] Add return tag factory --- src/DocBlock/Tags/Factory/ReturnFactory.php | 44 +++++++++++++++++++ src/DocBlock/Tags/Factory/TypeFactory.php | 2 + src/DocBlock/Tags/Method.php | 3 ++ src/DocBlock/Tags/Param.php | 2 + src/DocBlock/Tags/Property.php | 2 + src/DocBlock/Tags/PropertyRead.php | 2 + src/DocBlock/Tags/PropertyWrite.php | 2 + src/DocBlock/Tags/Return_.php | 4 ++ src/DocBlock/Tags/Var_.php | 2 + src/DocBlockFactory.php | 7 ++- src/PseudoTypes/ArrayShapeItem.php | 2 +- .../Tags/Factory/ReturnFactoryTest.php | 43 ++++++++++++++++++ 12 files changed, 113 insertions(+), 2 deletions(-) create mode 100644 src/DocBlock/Tags/Factory/ReturnFactory.php create mode 100644 tests/unit/DocBlock/Tags/Factory/ReturnFactoryTest.php diff --git a/src/DocBlock/Tags/Factory/ReturnFactory.php b/src/DocBlock/Tags/Factory/ReturnFactory.php new file mode 100644 index 0000000..f01a111 --- /dev/null +++ b/src/DocBlock/Tags/Factory/ReturnFactory.php @@ -0,0 +1,44 @@ +typeFactory = $typeFactory; + $this->descriptionFactory = $descriptionFactory; + } + + public function create(PhpDocTagNode $node, ?Context $context): Tag + { + $tagValue = $node->value; + Assert::isInstanceOf($tagValue, ReturnTagValueNode::class); + + return new Return_( + $this->typeFactory->createType($tagValue->type, $context), + $this->descriptionFactory->create($tagValue->description, $context) + ); + } + + public function supports(PhpDocTagNode $node, ?Context $context): bool + { + return $node->value instanceof ReturnTagValueNode; + } +} diff --git a/src/DocBlock/Tags/Factory/TypeFactory.php b/src/DocBlock/Tags/Factory/TypeFactory.php index 51fa527..469930c 100644 --- a/src/DocBlock/Tags/Factory/TypeFactory.php +++ b/src/DocBlock/Tags/Factory/TypeFactory.php @@ -36,6 +36,7 @@ use PHPStan\PhpDocParser\Ast\Type\ThisTypeNode; use PHPStan\PhpDocParser\Ast\Type\TypeNode; use PHPStan\PhpDocParser\Ast\Type\UnionTypeNode; +use function array_filter; use function array_map; use function array_reverse; use function get_class; @@ -78,6 +79,7 @@ final class TypeFactory case ConstTypeNode::class: return null; + case GenericTypeNode::class: return $this->createFromGeneric($type, $context); diff --git a/src/DocBlock/Tags/Method.php b/src/DocBlock/Tags/Method.php index e50cd4c..10a0fbc 100644 --- a/src/DocBlock/Tags/Method.php +++ b/src/DocBlock/Tags/Method.php @@ -31,9 +31,12 @@ use function preg_match; use function sort; use function strpos; use function substr; +use function trigger_error; use function trim; use function var_export; +use const E_USER_DEPRECATED; + /** * Reflection class for an {@}method in a Docblock. */ diff --git a/src/DocBlock/Tags/Param.php b/src/DocBlock/Tags/Param.php index 1a7eac9..c4c0880 100644 --- a/src/DocBlock/Tags/Param.php +++ b/src/DocBlock/Tags/Param.php @@ -26,7 +26,9 @@ use function array_unshift; use function implode; use function strpos; use function substr; +use function trigger_error; +use const E_USER_DEPRECATED; use const PREG_SPLIT_DELIM_CAPTURE; /** diff --git a/src/DocBlock/Tags/Property.php b/src/DocBlock/Tags/Property.php index fd9b57b..429e7a6 100644 --- a/src/DocBlock/Tags/Property.php +++ b/src/DocBlock/Tags/Property.php @@ -26,7 +26,9 @@ use function array_unshift; use function implode; use function strpos; use function substr; +use function trigger_error; +use const E_USER_DEPRECATED; use const PREG_SPLIT_DELIM_CAPTURE; /** diff --git a/src/DocBlock/Tags/PropertyRead.php b/src/DocBlock/Tags/PropertyRead.php index 37d01af..150d451 100644 --- a/src/DocBlock/Tags/PropertyRead.php +++ b/src/DocBlock/Tags/PropertyRead.php @@ -26,7 +26,9 @@ use function array_unshift; use function implode; use function strpos; use function substr; +use function trigger_error; +use const E_USER_DEPRECATED; use const PREG_SPLIT_DELIM_CAPTURE; /** diff --git a/src/DocBlock/Tags/PropertyWrite.php b/src/DocBlock/Tags/PropertyWrite.php index 3b429e5..debbb45 100644 --- a/src/DocBlock/Tags/PropertyWrite.php +++ b/src/DocBlock/Tags/PropertyWrite.php @@ -26,7 +26,9 @@ use function array_unshift; use function implode; use function strpos; use function substr; +use function trigger_error; +use const E_USER_DEPRECATED; use const PREG_SPLIT_DELIM_CAPTURE; /** diff --git a/src/DocBlock/Tags/Return_.php b/src/DocBlock/Tags/Return_.php index 64b276d..af3a24a 100644 --- a/src/DocBlock/Tags/Return_.php +++ b/src/DocBlock/Tags/Return_.php @@ -20,6 +20,10 @@ use phpDocumentor\Reflection\TypeResolver; use phpDocumentor\Reflection\Types\Context as TypeContext; use Webmozart\Assert\Assert; +use function trigger_error; + +use const E_USER_DEPRECATED; + /** * Reflection class for a {@}return tag in a Docblock. */ diff --git a/src/DocBlock/Tags/Var_.php b/src/DocBlock/Tags/Var_.php index 12e3aad..c523612 100644 --- a/src/DocBlock/Tags/Var_.php +++ b/src/DocBlock/Tags/Var_.php @@ -26,7 +26,9 @@ use function array_unshift; use function implode; use function strpos; use function substr; +use function trigger_error; +use const E_USER_DEPRECATED; use const PREG_SPLIT_DELIM_CAPTURE; /** diff --git a/src/DocBlockFactory.php b/src/DocBlockFactory.php index 299fd6d..43ad3be 100644 --- a/src/DocBlockFactory.php +++ b/src/DocBlockFactory.php @@ -22,7 +22,9 @@ use phpDocumentor\Reflection\DocBlock\TagFactory; use phpDocumentor\Reflection\DocBlock\Tags\Factory\AbstractPHPStanFactory; use phpDocumentor\Reflection\DocBlock\Tags\Factory\Factory; use phpDocumentor\Reflection\DocBlock\Tags\Factory\ParamFactory; +use phpDocumentor\Reflection\DocBlock\Tags\Factory\ReturnFactory; use phpDocumentor\Reflection\DocBlock\Tags\Factory\TypeFactory; +use phpDocumentor\Reflection\DocBlock\Tags\Factory\VarFactory; use Webmozart\Assert\Assert; use function array_shift; @@ -68,13 +70,16 @@ final class DocBlockFactory implements DocBlockFactoryInterface $typeFactory = new TypeFactory($typeResolver); $phpstanTagFactory = new AbstractPHPStanFactory( - new ParamFactory($typeFactory, $descriptionFactory) + new ParamFactory($typeFactory, $descriptionFactory), + new VarFactory($typeFactory, $descriptionFactory), + new ReturnFactory($typeFactory, $descriptionFactory), ); $tagFactory->addService($descriptionFactory); $tagFactory->addService($typeResolver); $tagFactory->registerTagHandler('param', $phpstanTagFactory); $tagFactory->registerTagHandler('var', $phpstanTagFactory); + $tagFactory->registerTagHandler('return', $phpstanTagFactory); $docBlockFactory = new self($descriptionFactory, $tagFactory); foreach ($additionalTags as $tagName => $tagHandler) { diff --git a/src/PseudoTypes/ArrayShapeItem.php b/src/PseudoTypes/ArrayShapeItem.php index 5ff245e..6231782 100644 --- a/src/PseudoTypes/ArrayShapeItem.php +++ b/src/PseudoTypes/ArrayShapeItem.php @@ -5,8 +5,8 @@ declare(strict_types=1); namespace phpDocumentor\Reflection\PseudoTypes; use phpDocumentor\Reflection\Type; - use phpDocumentor\Reflection\Types\Mixed_; + use function sprintf; final class ArrayShapeItem diff --git a/tests/unit/DocBlock/Tags/Factory/ReturnFactoryTest.php b/tests/unit/DocBlock/Tags/Factory/ReturnFactoryTest.php new file mode 100644 index 0000000..3d3be54 --- /dev/null +++ b/tests/unit/DocBlock/Tags/Factory/ReturnFactoryTest.php @@ -0,0 +1,43 @@ +parseTag('@return string'); + $factory = new ReturnFactory($this->giveTypeFactory(), $this->givenDescriptionFactory()); + $context = new Context('global'); + + self::assertTrue($factory->supports($ast, $context)); + self::assertEquals( + new Return_( + new String_(), + new Description('') + ), + $factory->create($ast, $context) + ); + } +}