OSDN Git Service

Добавлена возможность создавать новую запись предмета оборудования на основании уже...
[invent/invent.git] / vendor / phpdocumentor / reflection-docblock / src / DocBlock / Tags / Covers.php
1 <?php
2
3 declare(strict_types=1);
4
5 /**
6  * This file is part of phpDocumentor.
7  *
8  * For the full copyright and license information, please view the LICENSE
9  * file that was distributed with this source code.
10  *
11  * @link http://phpdoc.org
12  */
13
14 namespace phpDocumentor\Reflection\DocBlock\Tags;
15
16 use phpDocumentor\Reflection\DocBlock\Description;
17 use phpDocumentor\Reflection\DocBlock\DescriptionFactory;
18 use phpDocumentor\Reflection\Fqsen;
19 use phpDocumentor\Reflection\FqsenResolver;
20 use phpDocumentor\Reflection\Types\Context as TypeContext;
21 use phpDocumentor\Reflection\Utils;
22 use Webmozart\Assert\Assert;
23 use function array_key_exists;
24 use function explode;
25
26 /**
27  * Reflection class for a @covers tag in a Docblock.
28  */
29 final class Covers extends BaseTag implements Factory\StaticMethod
30 {
31     /** @var string */
32     protected $name = 'covers';
33
34     /** @var Fqsen */
35     private $refers;
36
37     /**
38      * Initializes this tag.
39      */
40     public function __construct(Fqsen $refers, ?Description $description = null)
41     {
42         $this->refers      = $refers;
43         $this->description = $description;
44     }
45
46     public static function create(
47         string $body,
48         ?DescriptionFactory $descriptionFactory = null,
49         ?FqsenResolver $resolver = null,
50         ?TypeContext $context = null
51     ) : self {
52         Assert::stringNotEmpty($body);
53         Assert::notNull($descriptionFactory);
54         Assert::notNull($resolver);
55
56         $parts = Utils::pregSplit('/\s+/Su', $body, 2);
57
58         return new static(
59             self::resolveFqsen($parts[0], $resolver, $context),
60             $descriptionFactory->create($parts[1] ?? '', $context)
61         );
62     }
63
64     private static function resolveFqsen(string $parts, ?FqsenResolver $fqsenResolver, ?TypeContext $context) : Fqsen
65     {
66         Assert::notNull($fqsenResolver);
67         $fqsenParts = explode('::', $parts);
68         $resolved = $fqsenResolver->resolve($fqsenParts[0], $context);
69
70         if (!array_key_exists(1, $fqsenParts)) {
71             return $resolved;
72         }
73
74         return new Fqsen($resolved . '::' . $fqsenParts[1]);
75     }
76
77     /**
78      * Returns the structural element this tag refers to.
79      */
80     public function getReference() : Fqsen
81     {
82         return $this->refers;
83     }
84
85     /**
86      * Returns a string representation of this tag.
87      */
88     public function __toString() : string
89     {
90         if ($this->description) {
91             $description = $this->description->render();
92         } else {
93             $description = '';
94         }
95
96         $refers = (string) $this->refers;
97
98         return $refers . ($description !== '' ? ($refers !== '' ? ' ' : '') . $description : '');
99     }
100 }