summaryrefslogtreecommitdiff
path: root/vendor/phpunit/phpunit/src/Util/Annotation/Registry.php
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/phpunit/phpunit/src/Util/Annotation/Registry.php')
-rw-r--r--vendor/phpunit/phpunit/src/Util/Annotation/Registry.php93
1 files changed, 93 insertions, 0 deletions
diff --git a/vendor/phpunit/phpunit/src/Util/Annotation/Registry.php b/vendor/phpunit/phpunit/src/Util/Annotation/Registry.php
new file mode 100644
index 000000000..8df14cfc0
--- /dev/null
+++ b/vendor/phpunit/phpunit/src/Util/Annotation/Registry.php
@@ -0,0 +1,93 @@
+<?php declare(strict_types=1);
+/*
+ * This file is part of PHPUnit.
+ *
+ * (c) Sebastian Bergmann <[email protected]>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+namespace PHPUnit\Util\Annotation;
+
+use function array_key_exists;
+use PHPUnit\Util\Exception;
+use ReflectionClass;
+use ReflectionException;
+use ReflectionMethod;
+
+/**
+ * Reflection information, and therefore DocBlock information, is static within
+ * a single PHP process. It is therefore okay to use a Singleton registry here.
+ *
+ * @internal This class is not covered by the backward compatibility promise for PHPUnit
+ */
+final class Registry
+{
+ /** @var null|self */
+ private static $instance;
+
+ /** @var array<string, DocBlock> indexed by class name */
+ private $classDocBlocks = [];
+
+ /** @var array<string, array<string, DocBlock>> indexed by class name and method name */
+ private $methodDocBlocks = [];
+
+ public static function getInstance(): self
+ {
+ return self::$instance ?? self::$instance = new self;
+ }
+
+ private function __construct()
+ {
+ }
+
+ /**
+ * @throws Exception
+ * @psalm-param class-string $class
+ */
+ public function forClassName(string $class): DocBlock
+ {
+ if (array_key_exists($class, $this->classDocBlocks)) {
+ return $this->classDocBlocks[$class];
+ }
+
+ try {
+ $reflection = new ReflectionClass($class);
+ // @codeCoverageIgnoreStart
+ } catch (ReflectionException $e) {
+ throw new Exception(
+ $e->getMessage(),
+ (int) $e->getCode(),
+ $e
+ );
+ }
+ // @codeCoverageIgnoreEnd
+
+ return $this->classDocBlocks[$class] = DocBlock::ofClass($reflection);
+ }
+
+ /**
+ * @throws Exception
+ * @psalm-param class-string $classInHierarchy
+ */
+ public function forMethod(string $classInHierarchy, string $method): DocBlock
+ {
+ if (isset($this->methodDocBlocks[$classInHierarchy][$method])) {
+ return $this->methodDocBlocks[$classInHierarchy][$method];
+ }
+
+ try {
+ $reflection = new ReflectionMethod($classInHierarchy, $method);
+ // @codeCoverageIgnoreStart
+ } catch (ReflectionException $e) {
+ throw new Exception(
+ $e->getMessage(),
+ (int) $e->getCode(),
+ $e
+ );
+ }
+ // @codeCoverageIgnoreEnd
+
+ return $this->methodDocBlocks[$classInHierarchy][$method] = DocBlock::ofMethod($reflection, $classInHierarchy);
+ }
+}