From bbb6a02b91c91ae7960d9f6cd534809548dacd2d Mon Sep 17 00:00:00 2001 From: AhJ Date: Tue, 16 Jul 2024 21:19:04 +0330 Subject: [PATCH] Add implements --- .../Tags/Factory/ImplementsFactory.php | 45 ++++++++++++++++ src/DocBlock/Tags/Implements_.php | 53 +++++++++++++++++++ src/DocBlockFactory.php | 5 +- 3 files changed, 102 insertions(+), 1 deletion(-) create mode 100644 src/DocBlock/Tags/Factory/ImplementsFactory.php create mode 100644 src/DocBlock/Tags/Implements_.php diff --git a/src/DocBlock/Tags/Factory/ImplementsFactory.php b/src/DocBlock/Tags/Factory/ImplementsFactory.php new file mode 100644 index 0000000..ba7ac5f --- /dev/null +++ b/src/DocBlock/Tags/Factory/ImplementsFactory.php @@ -0,0 +1,45 @@ +descriptionFactory = $descriptionFactory; + $this->typeResolver = $typeResolver; + } + + public function create(PhpDocTagNode $node, Context $context): Tag + { + $tagValue = $node->value; + Assert::isInstanceOf($tagValue, ImplementsTagValueNode::class); + + return new Implements_( + $this->typeResolver->createType($tagValue->type, $context), + $this->descriptionFactory->create($tagValue->description, $context) + ); + } + + public function supports(PhpDocTagNode $node, Context $context): bool + { + return $node->value instanceof ImplementsTagValueNode && $node->name === '@implements'; + } +} diff --git a/src/DocBlock/Tags/Implements_.php b/src/DocBlock/Tags/Implements_.php new file mode 100644 index 0000000..679f3a1 --- /dev/null +++ b/src/DocBlock/Tags/Implements_.php @@ -0,0 +1,53 @@ +name = 'implements'; + $this->type = $type; + $this->description = $description; + } + + public static function create(string $body) + { + trigger_error( + 'Create using static factory is deprecated, this method should not be called directly + by library consumers', + E_USER_DEPRECATED + ); + } + + public function __toString(): string + { + if ($this->description) { + $description = $this->description->render(); + } else { + $description = ''; + } + + $type = $this->type; + + return $type . ($description !== '' ? ' ' . $description : ''); + } +} diff --git a/src/DocBlockFactory.php b/src/DocBlockFactory.php index 1f7faf1..a37fd12 100644 --- a/src/DocBlockFactory.php +++ b/src/DocBlockFactory.php @@ -28,6 +28,7 @@ use phpDocumentor\Reflection\DocBlock\Tags\Factory\PropertyReadFactory; use phpDocumentor\Reflection\DocBlock\Tags\Factory\PropertyWriteFactory; use phpDocumentor\Reflection\DocBlock\Tags\Factory\ReturnFactory; use phpDocumentor\Reflection\DocBlock\Tags\Factory\VarFactory; +use phpDocumentor\Reflection\DocBlock\Tags\Factory\ImplementsFactory; use Webmozart\Assert\Assert; use function array_shift; @@ -76,7 +77,8 @@ final class DocBlockFactory implements DocBlockFactoryInterface new PropertyFactory($typeResolver, $descriptionFactory), new PropertyReadFactory($typeResolver, $descriptionFactory), new PropertyWriteFactory($typeResolver, $descriptionFactory), - new MethodFactory($typeResolver, $descriptionFactory) + new MethodFactory($typeResolver, $descriptionFactory), + new ImplementsFactory($typeResolver, $descriptionFactory) ); $tagFactory->addService($descriptionFactory); @@ -88,6 +90,7 @@ final class DocBlockFactory implements DocBlockFactoryInterface $tagFactory->registerTagHandler('property-read', $phpstanTagFactory); $tagFactory->registerTagHandler('property-write', $phpstanTagFactory); $tagFactory->registerTagHandler('method', $phpstanTagFactory); + $tagFactory->registerTagHandler('implements', $phpstanTagFactory); $docBlockFactory = new self($descriptionFactory, $tagFactory); foreach ($additionalTags as $tagName => $tagHandler) {