<?php declare(strict_types=1); /** * This file is part of phpDocumentor. * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. * * @link http://phpdoc.org */ namespace phpDocumentor\Reflection\Php; use phpDocumentor\Reflection\DocBlock; use phpDocumentor\Reflection\Fqsen; use phpDocumentor\Reflection\Metadata\MetaDataContainer as MetaDataContainerInterface; use function basename; /** * Represents a file in the project. * * @api */ final class File implements MetaDataContainerInterface { use MetadataContainer; private readonly string $name; /** @var Fqsen[] */ private array $namespaces = []; /** @var string[] */ private array $includes = []; /** @var Function_[] */ private array $functions = []; /** @var Constant[] */ private array $constants = []; /** @var Class_[] */ private array $classes = []; /** @var Interface_[] */ private array $interfaces = []; /** @var Trait_[] */ private array $traits = []; /** @var Enum_[] */ private array $enums = []; /** * Initializes a new file descriptor with the given hash of its contents. * * @param string $hash An MD5 hash of the contents if this file. */ public function __construct(private readonly string $hash, private readonly string $path, private readonly string $source = '', private readonly DocBlock|null $docBlock = null) { $this->name = basename($path); } /** * Returns the hash of the contents for this file. */ public function getHash(): string { return $this->hash; } /** * Retrieves the contents of this file. */ public function getSource(): string { return $this->source; } /** * Returns the namespace fqsens that have been defined in this file. * * @return Fqsen[] */ public function getNamespaces(): array { return $this->namespaces; } /** * Add namespace to file */ public function addNamespace(Fqsen $fqsen): void { $this->namespaces[(string) $fqsen] = $fqsen; } /** * Returns a list of all includes that have been declared in this file. * * @return string[] */ public function getIncludes(): array { return $this->includes; } public function addInclude(string $include): void { $this->includes[$include] = $include; } /** * Returns a list of constant descriptors contained in this file. * * @return Constant[] */ public function getConstants(): array { return $this->constants; } /** * Add constant to this file. */ public function addConstant(Constant $constant): void { $this->constants[(string) $constant->getFqsen()] = $constant; } /** * Returns a list of function descriptors contained in this file. * * @return Function_[] */ public function getFunctions(): array { return $this->functions; } /** * Add function to this file. */ public function addFunction(Function_ $function): void { $this->functions[(string) $function->getFqsen()] = $function; } /** * Returns a list of class descriptors contained in this file. * * @return Class_[] */ public function getClasses(): array { return $this->classes; } /** * Add Class to this file. */ public function addClass(Class_ $class): void { $this->classes[(string) $class->getFqsen()] = $class; } /** * Returns a list of interface descriptors contained in this file. * * @return Interface_[] */ public function getInterfaces(): array { return $this->interfaces; } /** * Add interface to this file. */ public function addInterface(Interface_ $interface): void { $this->interfaces[(string) $interface->getFqsen()] = $interface; } /** * Returns a list of trait descriptors contained in this file. * * @return Trait_[] */ public function getTraits(): array { return $this->traits; } /** * Add trait to this file. */ public function addTrait(Trait_ $trait): void { $this->traits[(string) $trait->getFqsen()] = $trait; } public function addEnum(Enum_ $enum): void { $this->enums[(string) $enum->getFqsen()] = $enum; } /** * Returns a list of enum descriptors contained in this file. * * @return Enum_[] */ public function getEnums(): array { return $this->enums; } /** * Returns the file path relative to the project's root. */ public function getPath(): string { return $this->path; } /** * Returns the DocBlock of the element if available */ public function getDocBlock(): DocBlock|null { return $this->docBlock; } /** * Returns the full name of this file */ public function getName(): string { return $this->name; } }