From f26a0f50afa717a50ec81b8334fb6a12435e876d Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Tue, 7 Nov 2023 00:38:30 +0300 Subject: [PATCH 001/210] Adding dependencies checks --- src/LanguageHandler/Php/Parser/Entity/ClassEntity.php | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/LanguageHandler/Php/Parser/Entity/ClassEntity.php b/src/LanguageHandler/Php/Parser/Entity/ClassEntity.php index 5e46a273..e1ece446 100644 --- a/src/LanguageHandler/Php/Parser/Entity/ClassEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/ClassEntity.php @@ -18,7 +18,6 @@ use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Reflection\ReflectorWrapper; use BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper; use BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings; -use BumbleDocGen\LanguageHandler\Php\Plugin\Event\Entity\OnCheckIsClassEntityCanBeLoad; use DI\Attribute\Inject; use DI\Container; use DI\DependencyException; @@ -125,7 +124,12 @@ public function getEntityDependencies(): array $interfaceNames = $this->getInterfaceNames(); $classNames = array_unique(array_merge($parentClassNames, $traitClassNames, $interfaceNames)); - $classNames = array_filter($classNames, fn(string $className) => !$this->composerParser->getComposerPackageDataByClassName($className)); + $classNames = array_filter( + $classNames, + function (string $className): bool { + return !$this->composerParser->getComposerPackageDataByClassName($className) && !$this->parserHelper->isBuiltInClass($className); + } + ); $reflections = array_map(fn(string $className): ReflectionClass => $this->getReflector()->reflectClass($className), $classNames); $reflections[] = $currentClassEntityReflection; @@ -761,6 +765,7 @@ public function getFileContent(): string #[CacheableMethod] public function getMethodsData(): array { $methods = []; + // todo use ast foreach ($this->getReflection()->getMethods() as $method) { $name = $method->getName(); $methods[$name] = [ From c045573f5060cfc3b13d5d1d25b282a64dcb83b4 Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Tue, 7 Nov 2023 00:41:56 +0300 Subject: [PATCH 002/210] Adding method to get traits --- .../Php/Parser/Entity/ClassEntity.php | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/LanguageHandler/Php/Parser/Entity/ClassEntity.php b/src/LanguageHandler/Php/Parser/Entity/ClassEntity.php index e1ece446..4e0529a8 100644 --- a/src/LanguageHandler/Php/Parser/Entity/ClassEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/ClassEntity.php @@ -448,6 +448,20 @@ public function getExtends(): ?string return $extends; } + /** + * @throws ReflectionException + * @throws InvalidConfigurationParameterException + */ + public function getTraits(): array + { + // todo use collection + $traits = []; + foreach ($this->getTraitsNames() as $traitsName) { + $traits[] = $this->classEntityCollection->getLoadedOrCreateNew($traitsName); + } + return $traits; + } + /** * @return ClassEntity[] * From 8c598ee0ed2598c476892edf895936b42c7206a8 Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Tue, 7 Nov 2023 10:55:21 +0300 Subject: [PATCH 003/210] Adding return type --- src/LanguageHandler/Php/Parser/Entity/ClassEntity.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/LanguageHandler/Php/Parser/Entity/ClassEntity.php b/src/LanguageHandler/Php/Parser/Entity/ClassEntity.php index 4e0529a8..014699a0 100644 --- a/src/LanguageHandler/Php/Parser/Entity/ClassEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/ClassEntity.php @@ -451,10 +451,10 @@ public function getExtends(): ?string /** * @throws ReflectionException * @throws InvalidConfigurationParameterException + * @return ClassEntity[] $trait */ public function getTraits(): array { - // todo use collection $traits = []; foreach ($this->getTraitsNames() as $traitsName) { $traits[] = $this->classEntityCollection->getLoadedOrCreateNew($traitsName); From a7d93e1089057da855fbec8d62107834dffc55a1 Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Tue, 7 Nov 2023 11:07:25 +0300 Subject: [PATCH 004/210] Removing declaring class info --- .../Parser/Entity/Cache/CacheableEntityTrait.php | 2 +- .../Entity/Cache/CacheablePhpEntityFactory.php | 6 ------ .../Php/Parser/Entity/ClassEntity.php | 15 +++------------ .../Php/Parser/Entity/ConstantEntity.php | 1 - .../Parser/Entity/ConstantEntityCollection.php | 12 +++++------- .../Php/Parser/Entity/MethodEntity.php | 1 - .../Php/Parser/Entity/MethodEntityCollection.php | 12 +++++------- .../Php/Parser/Entity/PropertyEntity.php | 1 - .../Parser/Entity/PropertyEntityCollection.php | 12 +++++------- 9 files changed, 19 insertions(+), 43 deletions(-) diff --git a/src/Core/Parser/Entity/Cache/CacheableEntityTrait.php b/src/Core/Parser/Entity/Cache/CacheableEntityTrait.php index f09b89fc..e39e7aa5 100644 --- a/src/Core/Parser/Entity/Cache/CacheableEntityTrait.php +++ b/src/Core/Parser/Entity/Cache/CacheableEntityTrait.php @@ -13,7 +13,7 @@ trait CacheableEntityTrait #[Inject] private EntityCacheStorageHelper $entityCacheStorageHelper; #[Inject] private Configuration $configuration; - private string $entityCacheVersion = 'v1'; + private string $entityCacheVersion = 'v2'; private string $entityCacheKey = ''; private bool $isCacheChanged = false; diff --git a/src/LanguageHandler/Php/Parser/Entity/Cache/CacheablePhpEntityFactory.php b/src/LanguageHandler/Php/Parser/Entity/Cache/CacheablePhpEntityFactory.php index 2c806bbe..b4649652 100644 --- a/src/LanguageHandler/Php/Parser/Entity/Cache/CacheablePhpEntityFactory.php +++ b/src/LanguageHandler/Php/Parser/Entity/Cache/CacheablePhpEntityFactory.php @@ -40,7 +40,6 @@ public function __construct( public function createPropertyEntity( ClassEntity $classEntity, string $propertyName, - string $declaringClassName, string $implementingClassName ): PropertyEntity { $objectId = "{$classEntity->getName()}:{$propertyName}"; @@ -52,7 +51,6 @@ public function createPropertyEntity( $propertyEntity = $this->diContainer->make($wrapperClassName, [ 'classEntity' => $classEntity, 'propertyName' => $propertyName, - 'declaringClassName' => $declaringClassName, 'implementingClassName' => $implementingClassName ]); $this->localObjectCache->cacheMethodResult(__METHOD__, $objectId, $propertyEntity); @@ -66,7 +64,6 @@ public function createPropertyEntity( public function createConstantEntity( ClassEntity $classEntity, string $constantName, - string $declaringClassName, string $implementingClassName, bool $reloadCache = false ): ConstantEntity { @@ -79,7 +76,6 @@ public function createConstantEntity( $constantEntity = $this->diContainer->make($wrapperClassName, [ 'classEntity' => $classEntity, 'constantName' => $constantName, - 'declaringClassName' => $declaringClassName, 'implementingClassName' => $implementingClassName, 'reloadCache' => $reloadCache ]); @@ -94,7 +90,6 @@ public function createConstantEntity( public function createMethodEntity( ClassEntity $classEntity, string $methodName, - string $declaringClassName, string $implementingClassName ): MethodEntity { $objectId = "{$classEntity->getName()}:{$methodName}"; @@ -106,7 +101,6 @@ public function createMethodEntity( $methodEntity = $this->diContainer->make($wrapperClassName, [ 'classEntity' => $classEntity, 'methodName' => $methodName, - 'declaringClassName' => $declaringClassName, 'implementingClassName' => $implementingClassName ]); $this->localObjectCache->cacheMethodResult(__METHOD__, $objectId, $methodEntity); diff --git a/src/LanguageHandler/Php/Parser/Entity/ClassEntity.php b/src/LanguageHandler/Php/Parser/Entity/ClassEntity.php index 014699a0..6972751b 100644 --- a/src/LanguageHandler/Php/Parser/Entity/ClassEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/ClassEntity.php @@ -782,10 +782,7 @@ public function getFileContent(): string // todo use ast foreach ($this->getReflection()->getMethods() as $method) { $name = $method->getName(); - $methods[$name] = [ - 'declaringClass' => $method->getDeclaringClass()->getName(), - 'implementingClass' => $method->getLocatedSource()->getName(), - ]; + $methods[$name] = $method->getLocatedSource()->getName(); } return $methods; } @@ -799,10 +796,7 @@ public function getFileContent(): string $properties = []; foreach ($this->getReflection()->getProperties() as $property) { $name = $property->getName(); - $properties[$name] = [ - 'declaringClass' => $property->getDeclaringClass()->getName(), - 'implementingClass' => $property->getImplementingClass()->getName() - ]; + $properties[$name] = $property->getImplementingClass()->getName(); } return $properties; } @@ -816,10 +810,7 @@ public function getFileContent(): string $constants = []; foreach ($this->getReflection()->getReflectionConstants() as $constant) { $name = $constant->getName(); - $constants[$name] = [ - 'declaringClass' => $constant->getDeclaringClass()->getName(), - 'implementingClass' => $constant->getImplementingClass()->getName() - ]; + $constants[$name] = $constant->getImplementingClass()->getName(); } return $constants; } diff --git a/src/LanguageHandler/Php/Parser/Entity/ConstantEntity.php b/src/LanguageHandler/Php/Parser/Entity/ConstantEntity.php index 94927fc9..5e78aebc 100644 --- a/src/LanguageHandler/Php/Parser/Entity/ConstantEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/ConstantEntity.php @@ -33,7 +33,6 @@ public function __construct( LocalObjectCache $localObjectCache, LoggerInterface $logger, private string $constantName, - private string $declaringClassName, private string $implementingClassName, ) { parent::__construct( diff --git a/src/LanguageHandler/Php/Parser/Entity/ConstantEntityCollection.php b/src/LanguageHandler/Php/Parser/Entity/ConstantEntityCollection.php index e63fd2e4..0a458f3c 100644 --- a/src/LanguageHandler/Php/Parser/Entity/ConstantEntityCollection.php +++ b/src/LanguageHandler/Php/Parser/Entity/ConstantEntityCollection.php @@ -30,12 +30,11 @@ public function __construct( public function loadConstantEntities(): void { $classConstantEntityFilter = $this->phpHandlerSettings->getClassConstantEntityFilter(); - foreach ($this->classEntity->getConstantsData() as $name => $constantData) { + foreach ($this->classEntity->getConstantsData() as $name => $constantImplementingClass) { $constantEntity = $this->cacheablePhpEntityFactory->createConstantEntity( $this->classEntity, $name, - $constantData['declaringClass'], - $constantData['implementingClass'] + $constantImplementingClass ); if ($classConstantEntityFilter->canAddToCollection($constantEntity)) { $this->add($constantEntity); @@ -67,13 +66,12 @@ public function unsafeGet(string $constantName): ?ConstantEntity { $constantEntity = $this->get($constantName); if (!$constantEntity) { - $constantsData = $this->classEntity->getConstantsData()[$constantName] ?? null; - if (is_array($constantsData)) { + $constantsImplementingClass = $this->classEntity->getConstantsData()[$constantName] ?? null; + if (!is_null($constantsImplementingClass)) { return $this->cacheablePhpEntityFactory->createConstantEntity( $this->classEntity, $constantName, - $constantsData['declaringClass'], - $constantsData['implementingClass'] + $constantsImplementingClass ); } } diff --git a/src/LanguageHandler/Php/Parser/Entity/MethodEntity.php b/src/LanguageHandler/Php/Parser/Entity/MethodEntity.php index 02fb63da..f479b61f 100644 --- a/src/LanguageHandler/Php/Parser/Entity/MethodEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/MethodEntity.php @@ -37,7 +37,6 @@ public function __construct( private LoggerInterface $logger, private Standard $astPrinter, private string $methodName, - private string $declaringClassName, private string $implementingClassName, ) { parent::__construct( diff --git a/src/LanguageHandler/Php/Parser/Entity/MethodEntityCollection.php b/src/LanguageHandler/Php/Parser/Entity/MethodEntityCollection.php index d5d67547..4961dbbe 100644 --- a/src/LanguageHandler/Php/Parser/Entity/MethodEntityCollection.php +++ b/src/LanguageHandler/Php/Parser/Entity/MethodEntityCollection.php @@ -36,12 +36,11 @@ public function __construct( public function loadMethodEntities(): void { $methodEntityFilter = $this->phpHandlerSettings->getMethodEntityFilter(); - foreach ($this->classEntity->getMethodsData() as $name => $methodData) { + foreach ($this->classEntity->getMethodsData() as $name => $methodImplementingClass) { $methodEntity = $this->cacheablePhpEntityFactory->createMethodEntity( $this->classEntity, $name, - $methodData['declaringClass'], - $methodData['implementingClass'] + $methodImplementingClass ); if ($methodEntityFilter->canAddToCollection($methodEntity)) { $this->add($methodEntity); @@ -87,13 +86,12 @@ public function unsafeGet(string $objectName): ?MethodEntity { $methodEntity = $this->get($objectName); if (!$methodEntity) { - $methodData = $this->classEntity->getMethodsData()[$objectName] ?? null; - if (is_array($methodData)) { + $methodImplementingClass = $this->classEntity->getMethodsData()[$objectName] ?? null; + if (!is_null($methodImplementingClass)) { return $this->cacheablePhpEntityFactory->createMethodEntity( $this->classEntity, $objectName, - $methodData['declaringClass'], - $methodData['implementingClass'] + $methodImplementingClass ); } } diff --git a/src/LanguageHandler/Php/Parser/Entity/PropertyEntity.php b/src/LanguageHandler/Php/Parser/Entity/PropertyEntity.php index 100d70ed..b916bb76 100644 --- a/src/LanguageHandler/Php/Parser/Entity/PropertyEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/PropertyEntity.php @@ -33,7 +33,6 @@ public function __construct( private LocalObjectCache $localObjectCache, private LoggerInterface $logger, private string $propertyName, - private string $declaringClassName, private string $implementingClassName, ) { parent::__construct( diff --git a/src/LanguageHandler/Php/Parser/Entity/PropertyEntityCollection.php b/src/LanguageHandler/Php/Parser/Entity/PropertyEntityCollection.php index c48dcefe..7804cc04 100644 --- a/src/LanguageHandler/Php/Parser/Entity/PropertyEntityCollection.php +++ b/src/LanguageHandler/Php/Parser/Entity/PropertyEntityCollection.php @@ -30,12 +30,11 @@ public function __construct( public function loadPropertyEntities(): void { $propertyEntityFilter = $this->phpHandlerSettings->getPropertyEntityFilter(); - foreach ($this->classEntity->getPropertiesData() as $name => $propertyData) { + foreach ($this->classEntity->getPropertiesData() as $name => $propertyImplementingClass) { $propertyEntity = $this->cacheablePhpEntityFactory->createPropertyEntity( $this->classEntity, $name, - $propertyData['declaringClass'], - $propertyData['implementingClass'] + $propertyImplementingClass ); if ($propertyEntityFilter->canAddToCollection($propertyEntity)) { $this->add($propertyEntity); @@ -67,13 +66,12 @@ public function unsafeGet(string $objectName): ?PropertyEntity { $propertyEntity = $this->get($objectName); if (!$propertyEntity) { - $propertyData = $this->classEntity->getPropertiesData()[$objectName] ?? null; - if (is_array($propertyData)) { + $propertyImplementingClass = $this->classEntity->getPropertiesData()[$objectName] ?? null; + if (!is_null($propertyImplementingClass)) { return $this->cacheablePhpEntityFactory->createPropertyEntity( $this->classEntity, $objectName, - $propertyData['declaringClass'], - $propertyData['implementingClass'] + $propertyImplementingClass ); } } From d55b6c31d560f05520aaff2a69a54f244c78d167 Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Tue, 7 Nov 2023 14:50:34 +0300 Subject: [PATCH 005/210] Adding method to get AST --- .../Php/Parser/Entity/ClassEntity.php | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/LanguageHandler/Php/Parser/Entity/ClassEntity.php b/src/LanguageHandler/Php/Parser/Entity/ClassEntity.php index 6972751b..6161dff8 100644 --- a/src/LanguageHandler/Php/Parser/Entity/ClassEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/ClassEntity.php @@ -23,7 +23,10 @@ use DI\DependencyException; use DI\NotFoundException; use phpDocumentor\Reflection\DocBlock; +use PhpParser\Node\Stmt\Class_ as ClassNode; +use PhpParser\Node\Stmt\Enum_ as EnumNode; use PhpParser\Node\Stmt\Interface_ as InterfaceNode; +use PhpParser\Node\Stmt\Trait_ as TraitNode; use Psr\Log\LoggerInterface; use Roave\BetterReflection\BetterReflection; use Roave\BetterReflection\Identifier\Identifier; @@ -272,6 +275,15 @@ final protected function getReflection(): ReflectionClass return $this->reflectionClass; } + /** + * @throws ReflectionException + * @throws InvalidConfigurationParameterException + */ + public function getAst(): ClassNode|InterfaceNode|TraitNode|EnumNode + { + return $this->getReflection()->getAst(); + } + /** * @throws ReflectionException From 1e87a7d4ee9340aa0530b2d9bd7a0efd175b9fd1 Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Tue, 7 Nov 2023 15:02:04 +0300 Subject: [PATCH 006/210] Using new method to get implementing class --- .../Php/Parser/Entity/BaseEntity.php | 4 ++-- .../Php/Parser/Entity/ClassEntity.php | 9 ++------- .../Php/Parser/Entity/ConstantEntity.php | 13 ------------- .../Php/Parser/Entity/DynamicMethodEntity.php | 16 +++------------- .../Php/Parser/Entity/PropertyEntity.php | 10 ---------- 5 files changed, 7 insertions(+), 45 deletions(-) diff --git a/src/LanguageHandler/Php/Parser/Entity/BaseEntity.php b/src/LanguageHandler/Php/Parser/Entity/BaseEntity.php index 733ad1ec..0a205aa9 100644 --- a/src/LanguageHandler/Php/Parser/Entity/BaseEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/BaseEntity.php @@ -51,7 +51,7 @@ protected function __construct( */ abstract protected function getReflection(): ReflectionClass|ReflectionMethod|ReflectionProperty|ReflectionClassConstant; - abstract public function getImplementingReflectionClass(): ReflectionClass; + abstract public function getImplementingClass(): ClassEntity; abstract protected function getDocCommentRecursive(): string; @@ -399,7 +399,7 @@ private function fillInLinkDataWithUrls(array $linkData): array if (($data['className'] ?? null)) { $entityData = $this->getRootEntityCollection()->getEntityLinkData( $data['className'], - $this->getImplementingReflectionClass()->getName(), + $this->getImplementingClass()->getName(), false ); if (!$entityData['entityName'] && !str_contains($data['className'], '\\')) { diff --git a/src/LanguageHandler/Php/Parser/Entity/ClassEntity.php b/src/LanguageHandler/Php/Parser/Entity/ClassEntity.php index 6161dff8..41f41ae8 100644 --- a/src/LanguageHandler/Php/Parser/Entity/ClassEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/ClassEntity.php @@ -284,14 +284,9 @@ public function getAst(): ClassNode|InterfaceNode|TraitNode|EnumNode return $this->getReflection()->getAst(); } - - /** - * @throws ReflectionException - * @throws InvalidConfigurationParameterException - */ - public function getImplementingReflectionClass(): ReflectionClass + public function getImplementingClass(): ClassEntity { - return $this->getReflection(); + return $this; } public function hasAnnotationKey(string $annotationKey): bool diff --git a/src/LanguageHandler/Php/Parser/Entity/ConstantEntity.php b/src/LanguageHandler/Php/Parser/Entity/ConstantEntity.php index 5e78aebc..869fc280 100644 --- a/src/LanguageHandler/Php/Parser/Entity/ConstantEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/ConstantEntity.php @@ -4,7 +4,6 @@ namespace BumbleDocGen\LanguageHandler\Php\Parser\Entity; -use BumbleDocGen\Core\Cache\LocalCache\Exception\ObjectNotFoundException; use BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache; use BumbleDocGen\Core\Configuration\Configuration; use BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException; @@ -12,11 +11,8 @@ use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException; use BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper; use BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings; -use DI\DependencyException; -use DI\NotFoundException; use phpDocumentor\Reflection\DocBlock; use Psr\Log\LoggerInterface; -use Roave\BetterReflection\Reflection\ReflectionClass; use Roave\BetterReflection\Reflection\ReflectionClassConstant; /** @@ -80,15 +76,6 @@ protected function getReflection(): ReflectionClassConstant return $this->reflectionClassConstant; } - /** - * @throws ReflectionException - * @throws InvalidConfigurationParameterException - */ - public function getImplementingReflectionClass(): ReflectionClass - { - return $this->getReflection()->getDeclaringClass(); - } - public function getImplementingClassName(): string { return $this->implementingClassName; diff --git a/src/LanguageHandler/Php/Parser/Entity/DynamicMethodEntity.php b/src/LanguageHandler/Php/Parser/Entity/DynamicMethodEntity.php index 459f6b97..94b31cbb 100644 --- a/src/LanguageHandler/Php/Parser/Entity/DynamicMethodEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/DynamicMethodEntity.php @@ -10,7 +10,6 @@ use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException; use BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper; use phpDocumentor\Reflection\DocBlock\Tags\Method; -use Roave\BetterReflection\Reflection\ReflectionClass; /** * Method obtained by parsing the "method" annotation @@ -149,21 +148,12 @@ public function getParametersString(): string return implode(', ', $parameters); } - /** - * @throws \Exception - */ - public function getImplementingReflectionClass(): ReflectionClass - { - $callMethod = $this->getCallMethod(); - return $callMethod->getImplementingReflectionClass(); - } - /** * @throws \Exception */ public function getImplementingClassName(): string { - return $this->getImplementingReflectionClass()->getName(); + return $this->getImplementingClass()->getName(); } public function getDescription(): string @@ -182,8 +172,8 @@ public function isInitialization(): bool 'self', 'static', 'this', - $this->getImplementingReflectionClass()->getName(), - $this->getImplementingReflectionClass()->getShortName(), + $this->getImplementingClass()->getName(), + $this->getImplementingClass()->getShortName(), ]; return $this->isStatic() && in_array($this->getReturnType(), $initializationReturnTypes); } diff --git a/src/LanguageHandler/Php/Parser/Entity/PropertyEntity.php b/src/LanguageHandler/Php/Parser/Entity/PropertyEntity.php index b916bb76..fcdff659 100644 --- a/src/LanguageHandler/Php/Parser/Entity/PropertyEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/PropertyEntity.php @@ -16,7 +16,6 @@ use DI\NotFoundException; use phpDocumentor\Reflection\DocBlock; use Psr\Log\LoggerInterface; -use Roave\BetterReflection\Reflection\ReflectionClass; use Roave\BetterReflection\Reflection\ReflectionProperty; /** @@ -82,15 +81,6 @@ public function getDocBlock(): DocBlock return $this->parserHelper->getDocBlock($classEntity, $this->getDocCommentRecursive()); } - /** - * @throws ReflectionException - * @throws InvalidConfigurationParameterException - */ - public function getImplementingReflectionClass(): ReflectionClass - { - return $this->getReflection()->getImplementingClass(); - } - /** * @throws ReflectionException * @throws DependencyException From c348a453251e7db44674ba735c95a90509f82ece Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Tue, 7 Nov 2023 16:11:05 +0300 Subject: [PATCH 007/210] Using PHP-Parser instead of BetterReflection --- .../Php/Parser/Entity/MethodEntity.php | 87 +++++++++++-------- .../Php/Parser/ParserHelper.php | 81 +++++++++-------- 2 files changed, 99 insertions(+), 69 deletions(-) diff --git a/src/LanguageHandler/Php/Parser/Entity/MethodEntity.php b/src/LanguageHandler/Php/Parser/Entity/MethodEntity.php index f479b61f..e3df9c5d 100644 --- a/src/LanguageHandler/Php/Parser/Entity/MethodEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/MethodEntity.php @@ -17,9 +17,9 @@ use phpDocumentor\Reflection\DocBlock; use phpDocumentor\Reflection\DocBlock\Tags\InvalidTag; use phpDocumentor\Reflection\DocBlock\Tags\Param; +use PhpParser\Node\Stmt\ClassMethod; use PhpParser\PrettyPrinter\Standard; use Psr\Log\LoggerInterface; -use Roave\BetterReflection\Reflection\ReflectionClass; use Roave\BetterReflection\Reflection\ReflectionMethod; /** @@ -28,14 +28,15 @@ class MethodEntity extends BaseEntity implements MethodEntityInterface { private ?ReflectionMethod $reflectionMethod = null; + private ?ClassMethod $ast = null; public function __construct( private Configuration $configuration, private ClassEntity $classEntity, private ParserHelper $parserHelper, + private Standard $astPrinter, private LocalObjectCache $localObjectCache, private LoggerInterface $logger, - private Standard $astPrinter, private string $methodName, private string $implementingClassName, ) { @@ -59,6 +60,22 @@ protected function getReflection(): ReflectionMethod return $this->reflectionMethod; } + /** + * @throws ReflectionException + * @throws InvalidConfigurationParameterException + */ + protected function getAst(): ClassMethod + { + $implementingClass = $this->getImplementingClass(); + if (!$this->ast) { + $this->ast = $implementingClass->getAst()->getMethod($this->methodName); + } + if (is_null($this->ast)) { + throw new \RuntimeException("Method `{$this->methodName}` not found in `{$implementingClass->getName()}` class AST"); + } + return $this->ast; + } + public function getRootEntity(): ClassEntity { return $this->classEntity; @@ -90,15 +107,6 @@ public function getDocBlock(bool $recursive = true): DocBlock return $this->parserHelper->getDocBlock($classEntity, $this->getDocComment(), $this->getDocCommentLine()); } - /** - * @throws ReflectionException - * @throws InvalidConfigurationParameterException - */ - public function getImplementingReflectionClass(): ReflectionClass - { - return $this->getReflection()->getImplementingClass(); - } - public function getImplementingClass(): ClassEntity { return $this->getRootEntityCollection()->getLoadedOrCreateNew($this->getImplementingClassName()); @@ -216,7 +224,7 @@ public function getDocCommentRecursive(): string { $methodEntity = $this->getDocCommentEntity(); if ($methodEntity->getDocCommentRecursive()) { - return $methodEntity->getReflection()->getAst()->getDocComment()?->getStartLine(); + return $methodEntity->getAst()->getDocComment()?->getStartLine(); } return null; } @@ -227,7 +235,7 @@ public function getDocCommentRecursive(): string */ #[CacheableMethod] public function getDocCommentLine(): ?int { - return $this->getReflection()->getAst()->getDocComment()?->getStartLine(); + return $this->getAst()->getDocComment()?->getStartLine(); } /** @@ -292,9 +300,10 @@ public function getModifiersString(): string */ #[CacheableMethod] public function getReturnType(): string { - $type = $this->getReflection()->getReturnType(); + $type = $this->getAst()->getReturnType(); if ($type) { - $type = (string)$type; + $type = $this->astPrinter->prettyPrint([$type]); + $type = str_replace('?', 'null|', $type); } else { $docBlock = $this->getDocBlock(); $returnType = $docBlock->getTagsByName('return'); @@ -360,22 +369,28 @@ private function isArrayAnnotationType(string $annotationType): bool $params = $docBlock->getTagsByName('param'); $typesFromDoc = self::parseAnnotationParams($params); try { - foreach ($this->getReflection()->getParameters() as $param) { + /** @var \PhpParser\Node\Param[] $params */ + $params = $this->getAst()->getParams(); + foreach ($params as $param) { + if (!$param->var instanceof \PhpParser\Node\Expr\Variable) { + continue; + } + $type = ''; $defaultValue = ''; $annotationType = ''; $description = ''; - $name = $param->getName(); + $name = $param->var->name; - $paramAst = $param->getAst()->jsonSerialize(); + $paramAst = $param->jsonSerialize(); if ($paramAst['type']) { - $type = $this->astPrinter->prettyPrint([$param->getAst()->jsonSerialize()['type']]); + $type = $this->astPrinter->prettyPrint([$paramAst['type']]); if (str_starts_with($type, '?')) { $type = str_replace('?', '', $type) . '|null'; } } if ($paramAst['default']) { - $defaultValue = $this->astPrinter->prettyPrint([$param->getAst()->jsonSerialize()['default']]); + $defaultValue = $this->astPrinter->prettyPrint([$paramAst['default']]); $defaultValue = str_replace('array()', '[]', $defaultValue); } if (isset($typesFromDoc[$name])) { @@ -400,7 +415,7 @@ private function isArrayAnnotationType(string $annotationType): bool $parameters[] = [ 'type' => $this->prepareTypeString($type), 'expectedType' => $expectedType, - 'isVariadic' => $param->isVariadic(), + 'isVariadic' => $param->variadic, 'name' => $name, 'defaultValue' => $this->prepareTypeString($defaultValue), 'description' => $description, @@ -487,7 +502,7 @@ public function isDynamic(): bool */ #[CacheableMethod] public function isPublic(): bool { - return $this->getReflection()->isPublic(); + return $this->getAst()->isPublic(); } /** @@ -496,7 +511,7 @@ public function isDynamic(): bool */ #[CacheableMethod] public function isStatic(): bool { - return $this->getReflection()->isStatic(); + return $this->getAst()->isStatic(); } /** @@ -505,7 +520,7 @@ public function isDynamic(): bool */ #[CacheableMethod] public function isProtected(): bool { - return $this->getReflection()->isProtected(); + return $this->getAst()->isProtected(); } /** @@ -514,7 +529,7 @@ public function isDynamic(): bool */ #[CacheableMethod] public function isPrivate(): bool { - return $this->getReflection()->isPrivate(); + return $this->getAst()->isPrivate(); } /** @@ -523,7 +538,7 @@ public function isDynamic(): bool */ #[CacheableMethod] public function getStartLine(): int { - return $this->getReflection()->getStartLine(); + return $this->getAst()->getStartLine(); } /** @@ -532,7 +547,7 @@ public function isDynamic(): bool */ #[CacheableMethod] public function getStartColumn(): int { - return $this->getReflection()->getStartColumn(); + return $this->getAst()->getStartFilePos(); } /** @@ -541,19 +556,18 @@ public function isDynamic(): bool */ #[CacheableMethod] public function getEndLine(): int { - return $this->getReflection()->getEndLine(); + return $this->getAst()->getEndLine(); } /** + * @throws NotFoundException + * @throws DependencyException * @throws ReflectionException * @throws InvalidConfigurationParameterException */ #[CacheableMethod] public function getFirstReturnValue(): mixed { - return $this->parserHelper->getMethodReturnValue( - $this->getRootEntity()->getReflection(), - $this->getReflection() - ); + return $this->parserHelper->getMethodReturnValue($this); } /** @@ -562,11 +576,16 @@ public function isDynamic(): bool */ #[CacheableMethod] public function getBodyCode(): string { - return $this->getReflection()->getBodyCode(); + $stmts = $this->getAst()->getStmts(); + if (!is_array($stmts)) { + $stmts = []; + } + return $this->astPrinter->prettyPrint($stmts); } #[CacheableMethod] public function getDocComment(): string { - return $this->getReflection()->getDocComment(); + $docComment = $this->getAst()->getDocComment(); + return (string)$docComment?->getReformattedText(); } } diff --git a/src/LanguageHandler/Php/Parser/ParserHelper.php b/src/LanguageHandler/Php/Parser/ParserHelper.php index 5af6197e..00bab948 100644 --- a/src/LanguageHandler/Php/Parser/ParserHelper.php +++ b/src/LanguageHandler/Php/Parser/ParserHelper.php @@ -10,7 +10,10 @@ use BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\MethodEntity; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Reflection\ReflectorWrapper; +use DI\DependencyException; +use DI\NotFoundException; use Monolog\Logger; use Nette\PhpGenerator\GlobalFunction; use phpDocumentor\Reflection\DocBlock; @@ -18,8 +21,6 @@ use phpDocumentor\Reflection\Location; use phpDocumentor\Reflection\Types\Context; use phpDocumentor\Reflection\Types\ContextFactory; -use Roave\BetterReflection\Reflection\ReflectionClass; -use Roave\BetterReflection\Reflection\ReflectionMethod; final class ParserHelper { @@ -346,50 +347,55 @@ public function getClassFromFile($file): ?string return null; } - protected function getRawValue( - ReflectionClass $reflectionClass, - ReflectionMethod $reflectionMethod, - string $condition - ) { + /** + * @throws ReflectionException + * @throws DependencyException + * @throws NotFoundException + * @throws InvalidConfigurationParameterException + */ + protected function getRawValue(MethodEntity $methodEntity, string $condition) + { $prepareReturnValue = function (mixed $value): mixed { if (!is_string($value) || str_contains($value, ':') || str_contains($value, '->')) { return $value; } return "'{$value}'"; }; + + $classEntity = $methodEntity->getImplementingClass(); if ( str_contains($condition, '::') && !str_contains($condition, '"') && !str_contains($condition, '\'') ) { try { - $nextClass = null; $parts = explode('::', $condition); if ($parts[0] === 'parent') { - $nextClass = $reflectionMethod->getImplementingClass()->getParentClass(); + $classEntity = $methodEntity->getImplementingClass()->getParentClass(); } elseif ($parts[0] === 'self') { - $nextClass = $reflectionMethod->getImplementingClass(); - } elseif ($this->isClassLoaded($parts[0])) { - $nextClass = $this->reflector->reflectClass($parts[0]); + $classEntity = $methodEntity->getImplementingClass(); + } elseif ($parts[0] === 'static') { + $classEntity = $methodEntity->getRootEntity(); + } elseif ($this::isCorrectClassName($parts[0])) { + $classEntity = $classEntity->getRootEntityCollection()->getLoadedOrCreateNew($parts[0]); } - if ($nextClass) { + if ($classEntity && $classEntity->entityDataCanBeLoaded()) { if (str_contains($parts[1], '(') && !str_contains($parts[1], ' ') && !str_contains($parts[1], '.')) { $methodName = explode('(', $parts[1])[0]; - $nextReflection = $nextClass->getMethod($methodName); - $methodValue = $this->getMethodReturnValue($reflectionClass, $nextReflection); + $nextMethodEntity = $classEntity->getMethodEntity($methodName); + $methodValue = $this->getMethodReturnValue($nextMethodEntity); return $prepareReturnValue($methodValue); } elseif (!preg_match('/([-+:\/ ])/', $parts[1])) { - $constantValue = $nextClass->getConstant($parts[1]); + $constantValue = $classEntity->getConstant($parts[1]); return $prepareReturnValue($constantValue); } - $reflectionClass = $nextClass; } } catch (\Exception) { } } - $value = preg_replace_callback( + return preg_replace_callback( '/([$]?)([a-zA-Z_\\\\]+)((::)|(->))([\s\S]([^ -+\-;\]])+)(([^)]?)+[)])?/', - function (array $matches) use ($reflectionClass, $prepareReturnValue) { + function (array $matches) use ($classEntity, $prepareReturnValue) { if ($matches[1] && $matches[2] != 'this') { return $matches[0]; } @@ -397,32 +403,37 @@ function (array $matches) use ($reflectionClass, $prepareReturnValue) { return $matches[0]; } - $nextClass = $reflectionClass; if (!in_array($matches[2], ['static', 'self', 'partner', 'this'])) { - $nextClass = $this->reflector->reflectClass($matches[2]); + $classEntity = $classEntity->getRootEntityCollection()->getLoadedOrCreateNew($matches[2]); } - if (isset($matches[8]) && $nextClass->hasMethod($matches[6])) { - $methodValue = $this->getMethodReturnValue($nextClass, $nextClass->getMethod($matches[6])); + if (!$classEntity->entityDataCanBeLoaded()) { + return $matches[0]; + } + + if (isset($matches[8]) && $classEntity->hasMethod($matches[6])) { + $methodEntity = $classEntity->getMethodEntity($matches[6]); + $methodValue = $this->getMethodReturnValue($methodEntity); return $prepareReturnValue($methodValue); - } elseif ($nextClass->hasConstant($matches[6])) { - $constantValue = $nextClass->getConstant($matches[6]); + } elseif ($classEntity->hasConstant($matches[6])) { + $constantValue = $classEntity->getConstant($matches[6]); return $prepareReturnValue($constantValue); - } else { - return $matches[0]; } + return $matches[0]; }, $condition ); - - return $value; } - public function getMethodReturnValue( - ReflectionClass $reflectionClass, - ReflectionMethod $reflectionMethod - ): mixed { - if (preg_match('/(return )([^;]+)/', $reflectionMethod->getBodyCode(), $matches)) { + /** + * @throws NotFoundException + * @throws DependencyException + * @throws ReflectionException + * @throws InvalidConfigurationParameterException + */ + public function getMethodReturnValue(MethodEntity $methodEntity): mixed + { + if (preg_match('/(return )([^;]+)/', $methodEntity->getBodyCode(), $matches)) { $savedParts = []; $i = 0; $preparedConditions = preg_replace_callback("/((\")(.*?)(\"))|((')(.*?)('))/", function (array $matches) use (&$savedParts, &$i) { @@ -437,7 +448,7 @@ public function getMethodReturnValue( foreach ($savedParts as $i => $savedPart) { $condition = str_replace("[%{$i}%]", $savedPart, $condition); } - $values[] = self::getRawValue($reflectionClass, $reflectionMethod, trim($condition)); + $values[] = self::getRawValue($methodEntity, trim($condition)); } $value = implode(' . ', $values); From 82fe0dd47292efa354463875eb5a872ab2df487c Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Tue, 7 Nov 2023 22:39:49 +0300 Subject: [PATCH 008/210] Using AST instead of Reflection --- .../Php/Parser/Entity/BaseEntity.php | 9 ++- .../Php/Parser/Entity/ConstantEntity.php | 33 +++++---- .../Php/Parser/Entity/MethodEntity.php | 28 ++------ .../Php/Parser/Entity/PropertyEntity.php | 70 +++++++++++++------ 4 files changed, 82 insertions(+), 58 deletions(-) diff --git a/src/LanguageHandler/Php/Parser/Entity/BaseEntity.php b/src/LanguageHandler/Php/Parser/Entity/BaseEntity.php index 0a205aa9..4eda24b2 100644 --- a/src/LanguageHandler/Php/Parser/Entity/BaseEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/BaseEntity.php @@ -47,9 +47,8 @@ protected function __construct( /** * @throws ReflectionException * @throws InvalidConfigurationParameterException - * @internal */ - abstract protected function getReflection(): ReflectionClass|ReflectionMethod|ReflectionProperty|ReflectionClassConstant; + abstract public function getAst(): \PhpParser\Node\Stmt; abstract public function getImplementingClass(): ClassEntity; @@ -480,7 +479,6 @@ public function getDocNote(): string return (string)($docBlock->getTagsByName('note')[0] ?? ''); } - /** * Get the doc comment of an entity * @@ -489,10 +487,11 @@ public function getDocNote(): string */ #[CacheableMethod] public function getDocComment(): string { - return $this->getReflection()->getDocComment(); + $docComment = $this->getAst()->getDocComment(); + return (string)$docComment?->getReformattedText(); } - protected function getCurrentRootEntity(): ?RootEntityInterface + public function getCurrentRootEntity(): ?RootEntityInterface { if (is_a($this, RootEntityInterface::class)) { return $this; diff --git a/src/LanguageHandler/Php/Parser/Entity/ConstantEntity.php b/src/LanguageHandler/Php/Parser/Entity/ConstantEntity.php index 869fc280..b5674a4f 100644 --- a/src/LanguageHandler/Php/Parser/Entity/ConstantEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/ConstantEntity.php @@ -12,15 +12,15 @@ use BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper; use BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings; use phpDocumentor\Reflection\DocBlock; +use PhpParser\Node\Stmt\ClassConst; use Psr\Log\LoggerInterface; -use Roave\BetterReflection\Reflection\ReflectionClassConstant; /** * Class constant entity */ class ConstantEntity extends BaseEntity { - private ?ReflectionClassConstant $reflectionClassConstant = null; + private ?ClassConst $ast = null; public function __construct( Configuration $configuration, @@ -68,12 +68,21 @@ public function getRootEntity(): ClassEntity * @throws ReflectionException * @throws InvalidConfigurationParameterException */ - protected function getReflection(): ReflectionClassConstant - { - if (!$this->reflectionClassConstant) { - $this->reflectionClassConstant = $this->classEntity->getReflection()->getReflectionConstant($this->constantName); + public function getAst(): ClassConst + { + $implementingClass = $this->getImplementingClass(); + if (!$this->ast) { + foreach ($implementingClass->getAst()->getConstants() as $constant) { + if ($constant->consts[0]->name) { + $this->ast = $constant; + return $this->ast; + } + } + } + if (is_null($this->ast)) { + throw new \RuntimeException("Constant `{$this->constantName}` not found in `{$implementingClass->getName()}` class AST"); } - return $this->reflectionClassConstant; + return $this->ast; } public function getImplementingClassName(): string @@ -144,7 +153,7 @@ public function getDescription(): string */ #[CacheableMethod] public function isPublic(): bool { - return $this->getReflection()->isPublic(); + return $this->getAst()->isPublic(); } /** @@ -153,7 +162,7 @@ public function getDescription(): string */ #[CacheableMethod] public function isProtected(): bool { - return $this->getReflection()->isProtected(); + return $this->getAst()->isProtected(); } /** @@ -162,7 +171,7 @@ public function getDescription(): string */ #[CacheableMethod] public function isPrivate(): bool { - return $this->getReflection()->isPrivate(); + return $this->getAst()->isPrivate(); } /** @@ -171,7 +180,7 @@ public function getDescription(): string */ #[CacheableMethod] public function getStartLine(): int { - return $this->getReflection()->getStartLine(); + return $this->getAst()->getStartLine(); } /** @@ -180,6 +189,6 @@ public function getDescription(): string */ #[CacheableMethod] public function getEndLine(): int { - return $this->getReflection()->getEndLine(); + return $this->getAst()->getEndLine(); } } diff --git a/src/LanguageHandler/Php/Parser/Entity/MethodEntity.php b/src/LanguageHandler/Php/Parser/Entity/MethodEntity.php index e3df9c5d..13ee6f18 100644 --- a/src/LanguageHandler/Php/Parser/Entity/MethodEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/MethodEntity.php @@ -20,14 +20,12 @@ use PhpParser\Node\Stmt\ClassMethod; use PhpParser\PrettyPrinter\Standard; use Psr\Log\LoggerInterface; -use Roave\BetterReflection\Reflection\ReflectionMethod; /** * Class method entity */ class MethodEntity extends BaseEntity implements MethodEntityInterface { - private ?ReflectionMethod $reflectionMethod = null; private ?ClassMethod $ast = null; public function __construct( @@ -52,19 +50,7 @@ public function __construct( * @throws ReflectionException * @throws InvalidConfigurationParameterException */ - protected function getReflection(): ReflectionMethod - { - if (!$this->reflectionMethod) { - $this->reflectionMethod = $this->classEntity->getReflection()->getMethod($this->methodName); - } - return $this->reflectionMethod; - } - - /** - * @throws ReflectionException - * @throws InvalidConfigurationParameterException - */ - protected function getAst(): ClassMethod + public function getAst(): ClassMethod { $implementingClass = $this->getImplementingClass(); if (!$this->ast) { @@ -302,8 +288,8 @@ public function getModifiersString(): string { $type = $this->getAst()->getReturnType(); if ($type) { - $type = $this->astPrinter->prettyPrint([$type]); - $type = str_replace('?', 'null|', $type); + $typeString = $this->astPrinter->prettyPrint([$type]); + $typeString = str_replace('?', 'null|', $typeString); } else { $docBlock = $this->getDocBlock(); $returnType = $docBlock->getTagsByName('return'); @@ -315,12 +301,12 @@ public function getModifiersString(): string } return 'mixed'; } - $type = $returnType ? (string)$returnType->getType() : 'mixed'; - $type = preg_replace_callback(['/({)([^{}]*)(})/', '/(\[)([^\[\]]*)(\])/'], function ($condition) { + $typeString = $returnType ? (string)$returnType->getType() : 'mixed'; + $typeString = preg_replace_callback(['/({)([^{}]*)(})/', '/(\[)([^\[\]]*)(\])/'], function ($condition) { return str_replace(' ', '', $condition[0]); - }, $type); + }, $typeString); } - return $this->prepareTypeString($type); + return $this->prepareTypeString($typeString); } /** diff --git a/src/LanguageHandler/Php/Parser/Entity/PropertyEntity.php b/src/LanguageHandler/Php/Parser/Entity/PropertyEntity.php index fcdff659..b2957b4b 100644 --- a/src/LanguageHandler/Php/Parser/Entity/PropertyEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/PropertyEntity.php @@ -9,26 +9,32 @@ use BumbleDocGen\Core\Configuration\Configuration; use BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException; use BumbleDocGen\Core\Parser\Entity\Cache\CacheableMethod; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Ast\NodeCompiler\CompileNodeToValue; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Ast\NodeCompiler\CompilerContext; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException; use BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper; use BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings; use DI\DependencyException; use DI\NotFoundException; use phpDocumentor\Reflection\DocBlock; +use PhpParser\ConstExprEvaluationException; +use PhpParser\Node; +use PhpParser\Node\Stmt\Property; +use PhpParser\PrettyPrinter\Standard; use Psr\Log\LoggerInterface; -use Roave\BetterReflection\Reflection\ReflectionProperty; /** * Class property entity */ class PropertyEntity extends BaseEntity { - private ?ReflectionProperty $reflectionProperty = null; + private ?Property $ast = null; public function __construct( Configuration $configuration, private ClassEntity $classEntity, private ParserHelper $parserHelper, + private Standard $astPrinter, private LocalObjectCache $localObjectCache, private LoggerInterface $logger, private string $propertyName, @@ -56,12 +62,32 @@ public function getPhpHandlerSettings(): PhpHandlerSettings * @throws ReflectionException * @throws InvalidConfigurationParameterException */ - protected function getReflection(): ReflectionProperty + public function getAst(): Property { - if (!$this->reflectionProperty) { - $this->reflectionProperty = $this->classEntity->getReflection()->getProperty($this->propertyName); + $implementingClass = $this->getImplementingClass(); + if (!$this->ast) { + $classAst = $implementingClass->getAst(); + $this->ast = $classAst->getProperty($this->propertyName); + if (!$this->ast) { + $methodAst = $classAst->getMethod('__construct'); + foreach ($methodAst?->getParams() ?? [] as $param) { + if ($param->var->name === $this->propertyName) { + $this->ast = new Node\Stmt\Property( + $param->flags, + [new Node\Stmt\PropertyProperty($param->var->name)], + $param->getAttributes(), + $param->type, + $param->attrGroups, + ); + return $this->ast; + } + } + } + } + if (is_null($this->ast)) { + throw new \RuntimeException("Property `{$this->propertyName}` not found in `{$implementingClass->getName()}` class AST"); } - return $this->reflectionProperty; + return $this->ast; } public function getRootEntityCollection(): ClassEntityCollection @@ -184,11 +210,12 @@ public function getFileName(): ?string */ #[CacheableMethod] public function getType(): string { - $type = $this->getReflection()->getType(); - $typeString = 'mixed'; + $type = $this->getAst()->type; if ($type) { - $typeString = (string)$type; + $typeString = $this->astPrinter->prettyPrint([$type]); + $typeString = str_replace('?', 'null|', $typeString); } else { + $typeString = 'mixed'; $docBlock = $this->getDocBlock(); $typesFromDoc = []; foreach ($docBlock->getTagsByName('var') as $param) { @@ -214,17 +241,17 @@ public function getFileName(): ?string #[CacheableMethod] public function getModifiersString(): string { $modifiersString = []; - if ($this->getReflection()->isPrivate()) { + if ($this->isPrivate()) { $modifiersString[] = 'private'; - } elseif ($this->getReflection()->isProtected()) { + } elseif ($this->isProtected()) { $modifiersString[] = 'protected'; - } elseif ($this->getReflection()->isPublic()) { + } elseif ($this->isPublic()) { $modifiersString[] = 'public'; } - if ($this->getReflection()->isStatic()) { + if ($this->getAst()->isStatic()) { $modifiersString[] = 'static'; - } elseif ($this->getReflection()->isReadOnly()) { + } elseif ($this->getAst()->isReadOnly()) { $modifiersString[] = 'readonly'; } @@ -255,7 +282,7 @@ public function getDescription(): string */ #[CacheableMethod] public function isPublic(): bool { - return $this->getReflection()->isPublic(); + return $this->getAst()->isPublic(); } /** @@ -264,7 +291,7 @@ public function getDescription(): string */ #[CacheableMethod] public function isProtected(): bool { - return $this->getReflection()->isProtected(); + return $this->getAst()->isProtected(); } /** @@ -273,7 +300,7 @@ public function getDescription(): string */ #[CacheableMethod] public function isPrivate(): bool { - return $this->getReflection()->isPrivate(); + return $this->getAst()->isPrivate(); } /** @@ -282,7 +309,7 @@ public function getDescription(): string */ #[CacheableMethod] public function getStartLine(): int { - return $this->getReflection()->getStartLine(); + return $this->getAst()->getStartLine(); } /** @@ -291,15 +318,18 @@ public function getDescription(): string */ #[CacheableMethod] public function getEndLine(): int { - return $this->getReflection()->getEndLine(); + return $this->getAst()->getEndLine(); } /** * @throws ReflectionException + * @throws ConstExprEvaluationException * @throws InvalidConfigurationParameterException */ #[CacheableMethod] public function getDefaultValue(): string|array|int|bool|null|float { - return $this->getReflection()->getDefaultValue(); + $compiler = new CompileNodeToValue(); + $compiledValue = $compiler($this->getAst()->props[0]->default, new CompilerContext($this)); + return $compiledValue->value; } } From 323e3b1229da350e000ac448618f03ab222a0083 Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Wed, 8 Nov 2023 02:49:35 +0300 Subject: [PATCH 009/210] Fixing constant entity problems --- .../Php/Parser/Entity/ConstantEntity.php | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/src/LanguageHandler/Php/Parser/Entity/ConstantEntity.php b/src/LanguageHandler/Php/Parser/Entity/ConstantEntity.php index b5674a4f..ba48cc81 100644 --- a/src/LanguageHandler/Php/Parser/Entity/ConstantEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/ConstantEntity.php @@ -21,6 +21,7 @@ class ConstantEntity extends BaseEntity { private ?ClassConst $ast = null; + private int $nodePosition = 0; public function __construct( Configuration $configuration, @@ -72,10 +73,13 @@ public function getAst(): ClassConst { $implementingClass = $this->getImplementingClass(); if (!$this->ast) { - foreach ($implementingClass->getAst()->getConstants() as $constant) { - if ($constant->consts[0]->name) { - $this->ast = $constant; - return $this->ast; + foreach ($implementingClass->getAst()->getConstants() as $classConst) { + foreach ($classConst->consts as $pos => $const) { + if ($const->name->toString() === $this->constantName) { + $this->ast = $classConst; + $this->nodePosition = $pos; + return $this->ast; + } } } } @@ -180,7 +184,7 @@ public function getDescription(): string */ #[CacheableMethod] public function getStartLine(): int { - return $this->getAst()->getStartLine(); + return $this->getAst()->consts[$this->nodePosition]->getStartLine(); } /** @@ -189,6 +193,6 @@ public function getDescription(): string */ #[CacheableMethod] public function getEndLine(): int { - return $this->getAst()->getEndLine(); + return $this->getAst()->consts[$this->nodePosition]->getEndLine(); } } From 5aba52332dfade995681380e8c2ea48d1c16b961 Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Thu, 9 Nov 2023 13:39:56 +0300 Subject: [PATCH 010/210] Adding modifiers flags --- .../Php/Parser/Entity/ConstantEntity.php | 26 ++++++++++++++++++ .../Php/Parser/Entity/MethodEntity.php | 20 ++++++++++++++ .../Php/Parser/Entity/PropertyEntity.php | 27 +++++++++++++++++++ 3 files changed, 73 insertions(+) diff --git a/src/LanguageHandler/Php/Parser/Entity/ConstantEntity.php b/src/LanguageHandler/Php/Parser/Entity/ConstantEntity.php index ba48cc81..c7c23aeb 100644 --- a/src/LanguageHandler/Php/Parser/Entity/ConstantEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/ConstantEntity.php @@ -20,6 +20,32 @@ */ class ConstantEntity extends BaseEntity { + /** + * Indicates that the constant is public. + * + * @since 8.0 + */ + public const MODIFIERS_FLAG_IS_PUBLIC = 1; + + /** + * Indicates that the constant is protected. + * + * @since 8.0 + */ + public const MODIFIERS_FLAG_IS_PROTECTED = 2; + + /** + * Indicates that the constant is private. + * + * @since 8.0 + */ + public const MODIFIERS_FLAG_IS_PRIVATE = 4; + + public const VISIBILITY_MODIFIERS_FLAG_ANY = + self::MODIFIERS_FLAG_IS_PUBLIC | + self::MODIFIERS_FLAG_IS_PROTECTED | + self::MODIFIERS_FLAG_IS_PRIVATE; + private ?ClassConst $ast = null; private int $nodePosition = 0; diff --git a/src/LanguageHandler/Php/Parser/Entity/MethodEntity.php b/src/LanguageHandler/Php/Parser/Entity/MethodEntity.php index 13ee6f18..d0973367 100644 --- a/src/LanguageHandler/Php/Parser/Entity/MethodEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/MethodEntity.php @@ -26,6 +26,26 @@ */ class MethodEntity extends BaseEntity implements MethodEntityInterface { + /** + * Indicates that the method is public. + */ + public const MODIFIERS_FLAG_IS_PUBLIC = 1; + + /** + * Indicates that the method is protected. + */ + public const MODIFIERS_FLAG_IS_PROTECTED = 2; + + /** + * Indicates that the method is private. + */ + public const MODIFIERS_FLAG_IS_PRIVATE = 4; + + public const VISIBILITY_MODIFIERS_FLAG_ANY = + self::MODIFIERS_FLAG_IS_PUBLIC | + self::MODIFIERS_FLAG_IS_PROTECTED | + self::MODIFIERS_FLAG_IS_PRIVATE; + private ?ClassMethod $ast = null; public function __construct( diff --git a/src/LanguageHandler/Php/Parser/Entity/PropertyEntity.php b/src/LanguageHandler/Php/Parser/Entity/PropertyEntity.php index b2957b4b..bf3e27e2 100644 --- a/src/LanguageHandler/Php/Parser/Entity/PropertyEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/PropertyEntity.php @@ -28,6 +28,33 @@ */ class PropertyEntity extends BaseEntity { + /** + * Indicates that the property is public. + * + * @link https://www.php.net/manual/en/class.reflectionproperty.php#reflectionproperty.constants.is-public + */ + public const MODIFIERS_FLAG_IS_PUBLIC = 1; + + /** + * Indicates that the property is protected. + * + * @link https://www.php.net/manual/en/class.reflectionproperty.php#reflectionproperty.constants.is-protected + */ + public const MODIFIERS_FLAG_IS_PROTECTED = 2; + + /** + * Indicates that the property is private. + * + * @link https://www.php.net/manual/en/class.reflectionproperty.php#reflectionproperty.constants.is-private + */ + public const MODIFIERS_FLAG_IS_PRIVATE = 4; + + public const VISIBILITY_MODIFIERS_FLAG_ANY = + self::MODIFIERS_FLAG_IS_PUBLIC | + self::MODIFIERS_FLAG_IS_PROTECTED | + self::MODIFIERS_FLAG_IS_PRIVATE; + + private ?Property $ast = null; public function __construct( From 64846135bdc324c2075e6d721277020ac363470d Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Thu, 9 Nov 2023 13:48:40 +0300 Subject: [PATCH 011/210] Adding checks --- src/LanguageHandler/Php/Parser/Entity/MethodEntity.php | 4 ++-- src/LanguageHandler/Php/Parser/Entity/PropertyEntity.php | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/LanguageHandler/Php/Parser/Entity/MethodEntity.php b/src/LanguageHandler/Php/Parser/Entity/MethodEntity.php index d0973367..305b4e4a 100644 --- a/src/LanguageHandler/Php/Parser/Entity/MethodEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/MethodEntity.php @@ -155,12 +155,12 @@ public function getDocCommentEntity(): MethodEntity $implementingClass = $this->getImplementingClass(); $parentClass = $this->getImplementingClass()->getParentClass(); $methodName = $this->getName(); - if ($parentClass && $parentClass->hasMethod($methodName)) { + if ($parentClass && $parentClass->entityDataCanBeLoaded() && $parentClass->hasMethod($methodName)) { $parentReflectionMethod = $parentClass->getMethodEntity($methodName); $reflectionMethod = $parentReflectionMethod->getDocCommentEntity(); } else { foreach ($implementingClass->getInterfacesEntities() as $interface) { - if ($interface->hasMethod($methodName)) { + if ($interface->entityDataCanBeLoaded() && $interface->hasMethod($methodName)) { $reflectionMethod = $interface->getMethodEntity($methodName); break; } diff --git a/src/LanguageHandler/Php/Parser/Entity/PropertyEntity.php b/src/LanguageHandler/Php/Parser/Entity/PropertyEntity.php index bf3e27e2..c79b2619 100644 --- a/src/LanguageHandler/Php/Parser/Entity/PropertyEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/PropertyEntity.php @@ -157,12 +157,12 @@ public function getDocCommentEntity(): PropertyEntity $implementingClass = $this->getImplementingClass(); $parentClass = $this->getImplementingClass()->getParentClass(); $propertyName = $this->getName(); - if ($parentClass && $parentClass->hasProperty($propertyName)) { + if ($parentClass && $parentClass->entityDataCanBeLoaded() && $parentClass->hasProperty($propertyName)) { $parentReflectionProperty = $parentClass->getPropertyEntity($propertyName); $reflectionProperty = $parentReflectionProperty->getDocCommentEntity(); } else { foreach ($implementingClass->getInterfacesEntities() as $interface) { - if ($interface->hasProperty($propertyName)) { + if ($interface->entityDataCanBeLoaded() && $interface->hasProperty($propertyName)) { $reflectionProperty = $interface->getPropertyEntity($propertyName); break; } From a96fc96cd0b50da6641ea57cc6f81a51242c095e Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Thu, 9 Nov 2023 13:50:30 +0300 Subject: [PATCH 012/210] Removing ReflectionException --- .../Php/Parser/Entity/ConstantEntityCollection.php | 3 --- .../Php/Parser/Entity/MethodEntityCollection.php | 3 --- .../Php/Parser/Entity/PropertyEntityCollection.php | 4 ---- 3 files changed, 10 deletions(-) diff --git a/src/LanguageHandler/Php/Parser/Entity/ConstantEntityCollection.php b/src/LanguageHandler/Php/Parser/Entity/ConstantEntityCollection.php index 0a458f3c..94d1ea44 100644 --- a/src/LanguageHandler/Php/Parser/Entity/ConstantEntityCollection.php +++ b/src/LanguageHandler/Php/Parser/Entity/ConstantEntityCollection.php @@ -7,7 +7,6 @@ use BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException; use BumbleDocGen\Core\Parser\Entity\BaseEntityCollection; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Cache\CacheablePhpEntityFactory; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException; use BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings; use DI\DependencyException; use DI\NotFoundException; @@ -24,7 +23,6 @@ public function __construct( /** * @throws NotFoundException * @throws DependencyException - * @throws ReflectionException * @throws InvalidConfigurationParameterException */ public function loadConstantEntities(): void @@ -58,7 +56,6 @@ public function get(string $objectName): ?ConstantEntity /** * @throws NotFoundException - * @throws ReflectionException * @throws DependencyException * @throws InvalidConfigurationParameterException */ diff --git a/src/LanguageHandler/Php/Parser/Entity/MethodEntityCollection.php b/src/LanguageHandler/Php/Parser/Entity/MethodEntityCollection.php index 4961dbbe..fed5d31a 100644 --- a/src/LanguageHandler/Php/Parser/Entity/MethodEntityCollection.php +++ b/src/LanguageHandler/Php/Parser/Entity/MethodEntityCollection.php @@ -7,7 +7,6 @@ use BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException; use BumbleDocGen\Core\Parser\Entity\BaseEntityCollection; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Cache\CacheablePhpEntityFactory; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException; use BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings; use DI\DependencyException; use DI\NotFoundException; @@ -28,7 +27,6 @@ public function __construct( } /** - * @throws ReflectionException * @throws DependencyException * @throws NotFoundException * @throws InvalidConfigurationParameterException @@ -78,7 +76,6 @@ public function get(string $objectName): ?MethodEntity /** * @throws NotFoundException - * @throws ReflectionException * @throws DependencyException * @throws InvalidConfigurationParameterException */ diff --git a/src/LanguageHandler/Php/Parser/Entity/PropertyEntityCollection.php b/src/LanguageHandler/Php/Parser/Entity/PropertyEntityCollection.php index 7804cc04..66cc2ae1 100644 --- a/src/LanguageHandler/Php/Parser/Entity/PropertyEntityCollection.php +++ b/src/LanguageHandler/Php/Parser/Entity/PropertyEntityCollection.php @@ -7,7 +7,6 @@ use BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException; use BumbleDocGen\Core\Parser\Entity\BaseEntityCollection; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Cache\CacheablePhpEntityFactory; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException; use BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings; use DI\DependencyException; use DI\NotFoundException; @@ -25,7 +24,6 @@ public function __construct( * @throws DependencyException * @throws InvalidConfigurationParameterException * @throws NotFoundException - * @throws ReflectionException */ public function loadPropertyEntities(): void { @@ -58,8 +56,6 @@ public function get(string $objectName): ?PropertyEntity /** * @throws NotFoundException - * @throws DependencyException - * @throws ReflectionException * @throws InvalidConfigurationParameterException */ public function unsafeGet(string $objectName): ?PropertyEntity From 1254ac053118924aeb6e3b0a19d6ddf2f4c67120 Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Thu, 9 Nov 2023 14:26:43 +0300 Subject: [PATCH 013/210] Removing old exceptions doc --- .../Php/Parser/Entity/ConstantEntity.php | 12 --------- .../Php/Parser/Entity/MethodEntity.php | 25 ------------------- .../Php/Parser/Entity/PropertyEntity.php | 16 ------------ .../Php/Parser/ParserHelper.php | 7 ------ 4 files changed, 60 deletions(-) diff --git a/src/LanguageHandler/Php/Parser/Entity/ConstantEntity.php b/src/LanguageHandler/Php/Parser/Entity/ConstantEntity.php index c7c23aeb..c804d60d 100644 --- a/src/LanguageHandler/Php/Parser/Entity/ConstantEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/ConstantEntity.php @@ -8,7 +8,6 @@ use BumbleDocGen\Core\Configuration\Configuration; use BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException; use BumbleDocGen\Core\Parser\Entity\Cache\CacheableMethod; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException; use BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper; use BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings; use phpDocumentor\Reflection\DocBlock; @@ -77,7 +76,6 @@ public function getRootEntityCollection(): ClassEntityCollection } /** - * @throws ReflectionException * @throws InvalidConfigurationParameterException */ public function getDocBlock(): DocBlock @@ -92,7 +90,6 @@ public function getRootEntity(): ClassEntity } /** - * @throws ReflectionException * @throws InvalidConfigurationParameterException */ public function getAst(): ClassConst @@ -131,7 +128,6 @@ public function getDocCommentEntity(): ConstantEntity } /** - * @throws ReflectionException * @throws InvalidConfigurationParameterException */ protected function getDocCommentRecursive(): string @@ -150,7 +146,6 @@ public function getShortName(): string } /** - * @throws ReflectionException * @throws InvalidConfigurationParameterException */ public function getNamespaceName(): string @@ -159,7 +154,6 @@ public function getNamespaceName(): string } /** - * @throws ReflectionException * @throws InvalidConfigurationParameterException */ public function getFileName(): ?string @@ -168,7 +162,6 @@ public function getFileName(): ?string } /** - * @throws ReflectionException * @throws InvalidConfigurationParameterException */ public function getDescription(): string @@ -178,7 +171,6 @@ public function getDescription(): string } /** - * @throws ReflectionException * @throws InvalidConfigurationParameterException */ #[CacheableMethod] public function isPublic(): bool @@ -187,7 +179,6 @@ public function getDescription(): string } /** - * @throws ReflectionException * @throws InvalidConfigurationParameterException */ #[CacheableMethod] public function isProtected(): bool @@ -196,7 +187,6 @@ public function getDescription(): string } /** - * @throws ReflectionException * @throws InvalidConfigurationParameterException */ #[CacheableMethod] public function isPrivate(): bool @@ -205,7 +195,6 @@ public function getDescription(): string } /** - * @throws ReflectionException * @throws InvalidConfigurationParameterException */ #[CacheableMethod] public function getStartLine(): int @@ -214,7 +203,6 @@ public function getDescription(): string } /** - * @throws ReflectionException * @throws InvalidConfigurationParameterException */ #[CacheableMethod] public function getEndLine(): int diff --git a/src/LanguageHandler/Php/Parser/Entity/MethodEntity.php b/src/LanguageHandler/Php/Parser/Entity/MethodEntity.php index 305b4e4a..c5baaaa8 100644 --- a/src/LanguageHandler/Php/Parser/Entity/MethodEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/MethodEntity.php @@ -67,7 +67,6 @@ public function __construct( } /** - * @throws ReflectionException * @throws InvalidConfigurationParameterException */ public function getAst(): ClassMethod @@ -99,7 +98,6 @@ public function getRootEntityCollection(): ClassEntityCollection /** * @throws DependencyException - * @throws ReflectionException * @throws NotFoundException * @throws InvalidConfigurationParameterException */ @@ -124,7 +122,6 @@ public function getShortName(): string } /** - * @throws ReflectionException * @throws InvalidConfigurationParameterException */ public function getNamespaceName(): string @@ -133,7 +130,6 @@ public function getNamespaceName(): string } /** - * @throws ReflectionException * @throws DependencyException * @throws NotFoundException * @throws InvalidConfigurationParameterException @@ -172,7 +168,6 @@ public function getDocCommentEntity(): MethodEntity } /** - * @throws ReflectionException * @throws DependencyException * @throws NotFoundException * @throws InvalidConfigurationParameterException @@ -204,7 +199,6 @@ public function getPrototype(): ?MethodEntity /** * @throws NotFoundException - * @throws ReflectionException * @throws DependencyException * @throws InvalidConfigurationParameterException */ @@ -222,7 +216,6 @@ public function getDocCommentRecursive(): string /** * @throws DependencyException - * @throws ReflectionException * @throws NotFoundException * @throws InvalidConfigurationParameterException */ @@ -236,7 +229,6 @@ public function getDocCommentRecursive(): string } /** - * @throws ReflectionException * @throws InvalidConfigurationParameterException */ #[CacheableMethod] public function getDocCommentLine(): ?int @@ -245,7 +237,6 @@ public function getDocCommentRecursive(): string } /** - * @throws ReflectionException * @throws DependencyException * @throws NotFoundException * @throws InvalidConfigurationParameterException @@ -266,7 +257,6 @@ public function isConstructor(): bool } /** - * @throws ReflectionException * @throws InvalidConfigurationParameterException */ public function getFileName(): ?string @@ -275,7 +265,6 @@ public function getFileName(): ?string } /** - * @throws ReflectionException * @throws InvalidConfigurationParameterException */ public function getModifiersString(): string @@ -300,7 +289,6 @@ public function getModifiersString(): string /** * @throws NotFoundException - * @throws ReflectionException * @throws DependencyException * @throws InvalidConfigurationParameterException */ @@ -359,7 +347,6 @@ private function isArrayAnnotationType(string $annotationType): bool /** * @throws NotFoundException - * @throws ReflectionException * @throws DependencyException * @throws InvalidConfigurationParameterException * @throws \Exception @@ -435,7 +422,6 @@ private function isArrayAnnotationType(string $annotationType): bool /** * @throws NotFoundException - * @throws DependencyException * @throws ReflectionException * @throws InvalidConfigurationParameterException */ @@ -463,7 +449,6 @@ public function getImplementingClassName(): string /** * @throws NotFoundException * @throws DependencyException - * @throws ReflectionException * @throws InvalidConfigurationParameterException */ public function getDescription(): string @@ -473,7 +458,6 @@ public function getDescription(): string } /** - * @throws ReflectionException * @throws DependencyException * @throws NotFoundException * @throws InvalidConfigurationParameterException @@ -503,7 +487,6 @@ public function isDynamic(): bool } /** - * @throws ReflectionException * @throws InvalidConfigurationParameterException */ #[CacheableMethod] public function isPublic(): bool @@ -512,7 +495,6 @@ public function isDynamic(): bool } /** - * @throws ReflectionException * @throws InvalidConfigurationParameterException */ #[CacheableMethod] public function isStatic(): bool @@ -521,7 +503,6 @@ public function isDynamic(): bool } /** - * @throws ReflectionException * @throws InvalidConfigurationParameterException */ #[CacheableMethod] public function isProtected(): bool @@ -530,7 +511,6 @@ public function isDynamic(): bool } /** - * @throws ReflectionException * @throws InvalidConfigurationParameterException */ #[CacheableMethod] public function isPrivate(): bool @@ -539,7 +519,6 @@ public function isDynamic(): bool } /** - * @throws ReflectionException * @throws InvalidConfigurationParameterException */ #[CacheableMethod] public function getStartLine(): int @@ -548,7 +527,6 @@ public function isDynamic(): bool } /** - * @throws ReflectionException * @throws InvalidConfigurationParameterException */ #[CacheableMethod] public function getStartColumn(): int @@ -557,7 +535,6 @@ public function isDynamic(): bool } /** - * @throws ReflectionException * @throws InvalidConfigurationParameterException */ #[CacheableMethod] public function getEndLine(): int @@ -568,7 +545,6 @@ public function isDynamic(): bool /** * @throws NotFoundException * @throws DependencyException - * @throws ReflectionException * @throws InvalidConfigurationParameterException */ #[CacheableMethod] public function getFirstReturnValue(): mixed @@ -577,7 +553,6 @@ public function isDynamic(): bool } /** - * @throws ReflectionException * @throws InvalidConfigurationParameterException */ #[CacheableMethod] public function getBodyCode(): string diff --git a/src/LanguageHandler/Php/Parser/Entity/PropertyEntity.php b/src/LanguageHandler/Php/Parser/Entity/PropertyEntity.php index c79b2619..b5acbbbc 100644 --- a/src/LanguageHandler/Php/Parser/Entity/PropertyEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/PropertyEntity.php @@ -11,7 +11,6 @@ use BumbleDocGen\Core\Parser\Entity\Cache\CacheableMethod; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Ast\NodeCompiler\CompileNodeToValue; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Ast\NodeCompiler\CompilerContext; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException; use BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper; use BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings; use DI\DependencyException; @@ -86,7 +85,6 @@ public function getPhpHandlerSettings(): PhpHandlerSettings } /** - * @throws ReflectionException * @throws InvalidConfigurationParameterException */ public function getAst(): Property @@ -124,7 +122,6 @@ public function getRootEntityCollection(): ClassEntityCollection /** * @throws DependencyException - * @throws ReflectionException * @throws NotFoundException * @throws InvalidConfigurationParameterException */ @@ -135,7 +132,6 @@ public function getDocBlock(): DocBlock } /** - * @throws ReflectionException * @throws DependencyException * @throws NotFoundException * @throws InvalidConfigurationParameterException @@ -175,7 +171,6 @@ public function getDocCommentEntity(): PropertyEntity /** * @throws NotFoundException - * @throws ReflectionException * @throws DependencyException * @throws InvalidConfigurationParameterException */ @@ -202,7 +197,6 @@ public function getShortName(): string } /** - * @throws ReflectionException * @throws InvalidConfigurationParameterException */ public function getNamespaceName(): string @@ -221,7 +215,6 @@ public function getImplementingClass(): ClassEntity } /** - * @throws ReflectionException * @throws InvalidConfigurationParameterException */ public function getFileName(): ?string @@ -231,7 +224,6 @@ public function getFileName(): ?string /** * @throws NotFoundException - * @throws ReflectionException * @throws DependencyException * @throws InvalidConfigurationParameterException */ @@ -260,7 +252,6 @@ public function getFileName(): ?string } /** - * @throws ReflectionException * @throws DependencyException * @throws NotFoundException * @throws InvalidConfigurationParameterException @@ -294,7 +285,6 @@ public function isImplementedInParentClass(): bool /** * @throws NotFoundException * @throws DependencyException - * @throws ReflectionException * @throws InvalidConfigurationParameterException */ public function getDescription(): string @@ -304,7 +294,6 @@ public function getDescription(): string } /** - * @throws ReflectionException * @throws InvalidConfigurationParameterException */ #[CacheableMethod] public function isPublic(): bool @@ -313,7 +302,6 @@ public function getDescription(): string } /** - * @throws ReflectionException * @throws InvalidConfigurationParameterException */ #[CacheableMethod] public function isProtected(): bool @@ -322,7 +310,6 @@ public function getDescription(): string } /** - * @throws ReflectionException * @throws InvalidConfigurationParameterException */ #[CacheableMethod] public function isPrivate(): bool @@ -331,7 +318,6 @@ public function getDescription(): string } /** - * @throws ReflectionException * @throws InvalidConfigurationParameterException */ #[CacheableMethod] public function getStartLine(): int @@ -340,7 +326,6 @@ public function getDescription(): string } /** - * @throws ReflectionException * @throws InvalidConfigurationParameterException */ #[CacheableMethod] public function getEndLine(): int @@ -349,7 +334,6 @@ public function getDescription(): string } /** - * @throws ReflectionException * @throws ConstExprEvaluationException * @throws InvalidConfigurationParameterException */ diff --git a/src/LanguageHandler/Php/Parser/ParserHelper.php b/src/LanguageHandler/Php/Parser/ParserHelper.php index 00bab948..c1d68cce 100644 --- a/src/LanguageHandler/Php/Parser/ParserHelper.php +++ b/src/LanguageHandler/Php/Parser/ParserHelper.php @@ -9,7 +9,6 @@ use BumbleDocGen\Core\Configuration\Configuration; use BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\MethodEntity; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Reflection\ReflectorWrapper; use DI\DependencyException; @@ -235,7 +234,6 @@ public function isClassLoaded(string $className): bool } /** - * @throws ReflectionException * @throws InvalidConfigurationParameterException */ public function getUsesListByClassEntity(ClassEntity $classEntity, bool $extended = true): array @@ -275,7 +273,6 @@ public function getUsesListByClassEntity(ClassEntity $classEntity, bool $extende } /** - * @throws ReflectionException * @throws InvalidConfigurationParameterException */ public function parseFullClassName( @@ -348,7 +345,6 @@ public function getClassFromFile($file): ?string } /** - * @throws ReflectionException * @throws DependencyException * @throws NotFoundException * @throws InvalidConfigurationParameterException @@ -428,7 +424,6 @@ function (array $matches) use ($classEntity, $prepareReturnValue) { /** * @throws NotFoundException * @throws DependencyException - * @throws ReflectionException * @throws InvalidConfigurationParameterException */ public function getMethodReturnValue(MethodEntity $methodEntity): mixed @@ -496,7 +491,6 @@ private function getDocBlockFactory(): DocBlockFactory } /** - * @throws ReflectionException * @throws InvalidConfigurationParameterException */ public function getDocBlock(ClassEntity $classEntity, string $docComment, ?int $lineNumber = null): DocBlock @@ -528,7 +522,6 @@ public function getDocBlock(ClassEntity $classEntity, string $docComment, ?int $ } /** - * @throws ReflectionException * @throws InvalidConfigurationParameterException */ public function getDocBlockContext(ClassEntity $classEntity): Context From 871af18b32e9d975822b940861737d30d8b0afe3 Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Thu, 9 Nov 2023 15:15:35 +0300 Subject: [PATCH 014/210] Handle ast position --- .../Php/Parser/Entity/PropertyEntity.php | 24 +++++++++++++------ 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/src/LanguageHandler/Php/Parser/Entity/PropertyEntity.php b/src/LanguageHandler/Php/Parser/Entity/PropertyEntity.php index b5acbbbc..cb95dffb 100644 --- a/src/LanguageHandler/Php/Parser/Entity/PropertyEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/PropertyEntity.php @@ -55,6 +55,7 @@ class PropertyEntity extends BaseEntity private ?Property $ast = null; + private ?int $nodePosition = null; public function __construct( Configuration $configuration, @@ -89,8 +90,8 @@ public function getPhpHandlerSettings(): PhpHandlerSettings */ public function getAst(): Property { - $implementingClass = $this->getImplementingClass(); if (!$this->ast) { + $implementingClass = $this->getImplementingClass(); $classAst = $implementingClass->getAst(); $this->ast = $classAst->getProperty($this->propertyName); if (!$this->ast) { @@ -107,10 +108,16 @@ public function getAst(): Property return $this->ast; } } + } else { + foreach ($this->ast->props as $pos => $propNode) { + if ($propNode->name->toString() === $this->propertyName) { + $this->nodePosition = $pos; + } + } } } if (is_null($this->ast)) { - throw new \RuntimeException("Property `{$this->propertyName}` not found in `{$implementingClass->getName()}` class AST"); + throw new \RuntimeException("Property `{$this->propertyName}` not found in `{$this->getImplementingClassName()}` class AST"); } return $this->ast; } @@ -196,9 +203,6 @@ public function getShortName(): string return $this->getName(); } - /** - * @throws InvalidConfigurationParameterException - */ public function getNamespaceName(): string { return $this->getRootEntity()->getNamespaceName(); @@ -322,7 +326,10 @@ public function getDescription(): string */ #[CacheableMethod] public function getStartLine(): int { - return $this->getAst()->getStartLine(); + if (is_null($this->nodePosition)) { + return $this->getAst()->getStartLine(); + } + return $this->getAst()->props[$this->nodePosition]->getStartLine(); } /** @@ -330,7 +337,10 @@ public function getDescription(): string */ #[CacheableMethod] public function getEndLine(): int { - return $this->getAst()->getEndLine(); + if (is_null($this->nodePosition)) { + return $this->getAst()->getEndLine(); + } + return $this->getAst()->props[$this->nodePosition]->getEndLine(); } /** From 0613eb448f93767e1b0337a3179ead6cac9bc429 Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Thu, 9 Nov 2023 15:15:55 +0300 Subject: [PATCH 015/210] Ast getter optimization --- src/LanguageHandler/Php/Parser/Entity/ConstantEntity.php | 4 ++-- src/LanguageHandler/Php/Parser/Entity/MethodEntity.php | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/LanguageHandler/Php/Parser/Entity/ConstantEntity.php b/src/LanguageHandler/Php/Parser/Entity/ConstantEntity.php index c804d60d..27cc361e 100644 --- a/src/LanguageHandler/Php/Parser/Entity/ConstantEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/ConstantEntity.php @@ -94,8 +94,8 @@ public function getRootEntity(): ClassEntity */ public function getAst(): ClassConst { - $implementingClass = $this->getImplementingClass(); if (!$this->ast) { + $implementingClass = $this->getImplementingClass(); foreach ($implementingClass->getAst()->getConstants() as $classConst) { foreach ($classConst->consts as $pos => $const) { if ($const->name->toString() === $this->constantName) { @@ -107,7 +107,7 @@ public function getAst(): ClassConst } } if (is_null($this->ast)) { - throw new \RuntimeException("Constant `{$this->constantName}` not found in `{$implementingClass->getName()}` class AST"); + throw new \RuntimeException("Constant `{$this->constantName}` not found in `{$this->getImplementingClassName()}` class AST"); } return $this->ast; } diff --git a/src/LanguageHandler/Php/Parser/Entity/MethodEntity.php b/src/LanguageHandler/Php/Parser/Entity/MethodEntity.php index c5baaaa8..ac589c55 100644 --- a/src/LanguageHandler/Php/Parser/Entity/MethodEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/MethodEntity.php @@ -71,12 +71,12 @@ public function __construct( */ public function getAst(): ClassMethod { - $implementingClass = $this->getImplementingClass(); if (!$this->ast) { + $implementingClass = $this->getImplementingClass(); $this->ast = $implementingClass->getAst()->getMethod($this->methodName); } if (is_null($this->ast)) { - throw new \RuntimeException("Method `{$this->methodName}` not found in `{$implementingClass->getName()}` class AST"); + throw new \RuntimeException("Method `{$this->methodName}` not found in `{$this->getImplementingClassName()}` class AST"); } return $this->ast; } From 123fe7e1c57fdd6caee2439f2ffbe1d745cfb7c7 Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Thu, 9 Nov 2023 15:18:14 +0300 Subject: [PATCH 016/210] Disable builtin classes loading --- .../BasePhpStubber/BasePhpStubberPlugin.php | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/LanguageHandler/Php/Plugin/CorePlugin/BasePhpStubber/BasePhpStubberPlugin.php b/src/LanguageHandler/Php/Plugin/CorePlugin/BasePhpStubber/BasePhpStubberPlugin.php index fc7b9b67..6d603bb6 100644 --- a/src/LanguageHandler/Php/Plugin/CorePlugin/BasePhpStubber/BasePhpStubberPlugin.php +++ b/src/LanguageHandler/Php/Plugin/CorePlugin/BasePhpStubber/BasePhpStubberPlugin.php @@ -6,6 +6,8 @@ use BumbleDocGen\Core\Plugin\Event\Renderer\OnGettingResourceLink; use BumbleDocGen\Core\Plugin\PluginInterface; +use BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper; +use BumbleDocGen\LanguageHandler\Php\Plugin\Event\Entity\OnCheckIsClassEntityCanBeLoad; /** * Adding links to type documentation and documentation of built-in PHP classes @@ -144,6 +146,7 @@ public static function getSubscribedEvents(): array { return [ OnGettingResourceLink::class => 'onGettingResourceLink', + OnCheckIsClassEntityCanBeLoad::class => 'onCheckIsClassEntityCanBeLoad', ]; } @@ -161,4 +164,20 @@ final public function onGettingResourceLink(OnGettingResourceLink $event): void } } } + + final public function onCheckIsClassEntityCanBeLoad(OnCheckIsClassEntityCanBeLoad $event): void + { + $entityName = $event->getEntity()->getName(); + $entityName = explode('::', $entityName)[0]; + if (preg_match('/([{\[])/', $entityName) || preg_match('/^(array)([{<])/', $entityName)) { + $entityName = 'array'; + } + if (!ParserHelper::isCorrectClassName($entityName)) { + $event->disableClassLoading(); + return; + } + if (array_key_exists($entityName, self::$builtInUrls) || array_key_exists("\\{$entityName}", self::$builtInUrls)) { + $event->disableClassLoading(); + } + } } From 84a6ed300075e69183806a7272fa5f6fecb3fa1b Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Thu, 9 Nov 2023 15:46:21 +0300 Subject: [PATCH 017/210] Adding new event --- src/Core/Parser/ProjectParser.php | 4 ++++ .../Plugin/Event/Parser/BeforeParsingProcess.php | 14 ++++++++++++++ 2 files changed, 18 insertions(+) create mode 100644 src/Core/Plugin/Event/Parser/BeforeParsingProcess.php diff --git a/src/Core/Parser/ProjectParser.php b/src/Core/Parser/ProjectParser.php index 1956bf68..7c2519d0 100644 --- a/src/Core/Parser/ProjectParser.php +++ b/src/Core/Parser/ProjectParser.php @@ -7,6 +7,8 @@ use BumbleDocGen\Core\Configuration\Configuration; use BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException; use BumbleDocGen\Core\Parser\Entity\RootEntityCollectionsGroup; +use BumbleDocGen\Core\Plugin\Event\Parser\BeforeParsingProcess; +use BumbleDocGen\Core\Plugin\PluginEventDispatcher; use DI\DependencyException; use DI\NotFoundException; @@ -17,6 +19,7 @@ final class ProjectParser { public function __construct( private Configuration $configuration, + private PluginEventDispatcher $pluginEventDispatcher, private RootEntityCollectionsGroup $rootEntityCollectionsGroup ) { } @@ -28,6 +31,7 @@ public function __construct( */ public function parse(): RootEntityCollectionsGroup { + $this->pluginEventDispatcher->dispatch(new BeforeParsingProcess()); foreach ($this->configuration->getLanguageHandlersCollection() as $languageHandler) { $this->rootEntityCollectionsGroup->add($languageHandler->getEntityCollection()); } diff --git a/src/Core/Plugin/Event/Parser/BeforeParsingProcess.php b/src/Core/Plugin/Event/Parser/BeforeParsingProcess.php new file mode 100644 index 00000000..c53ad3bc --- /dev/null +++ b/src/Core/Plugin/Event/Parser/BeforeParsingProcess.php @@ -0,0 +1,14 @@ + Date: Thu, 9 Nov 2023 19:24:58 +0300 Subject: [PATCH 018/210] Adding php parser helper --- .../Php/Parser/Entity/Ast/PhpParserHelper.php | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 src/LanguageHandler/Php/Parser/Entity/Ast/PhpParserHelper.php diff --git a/src/LanguageHandler/Php/Parser/Entity/Ast/PhpParserHelper.php b/src/LanguageHandler/Php/Parser/Entity/Ast/PhpParserHelper.php new file mode 100644 index 00000000..77c46b74 --- /dev/null +++ b/src/LanguageHandler/Php/Parser/Entity/Ast/PhpParserHelper.php @@ -0,0 +1,24 @@ +phpParser) { + $this->phpParser = (new ParserFactory())->create(ParserFactory::ONLY_PHP7, new Emulative([ + 'usedAttributes' => ['comments', 'startLine', 'endLine', 'startFilePos', 'endFilePos'], + ])); + } + return $this->phpParser; + } +} From c1f6d4e8a2c5cd6b94d567fdaad41e6279463e1c Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Fri, 10 Nov 2023 17:34:00 +0300 Subject: [PATCH 019/210] Adding new value compiler --- .../Parser/Entity/Ast/NodeValueCompiler.php | 123 ++++++++++++++++++ 1 file changed, 123 insertions(+) create mode 100644 src/LanguageHandler/Php/Parser/Entity/Ast/NodeValueCompiler.php diff --git a/src/LanguageHandler/Php/Parser/Entity/Ast/NodeValueCompiler.php b/src/LanguageHandler/Php/Parser/Entity/Ast/NodeValueCompiler.php new file mode 100644 index 00000000..1311ce26 --- /dev/null +++ b/src/LanguageHandler/Php/Parser/Entity/Ast/NodeValueCompiler.php @@ -0,0 +1,123 @@ +expr, $entity); + } + + $constExprEvaluator = new ConstExprEvaluator(function (Node\Expr $node) use ($entity): mixed { + try { + $className = get_class($node); + return match ($className) { + Node\Expr\ClassConstFetch::class => self::getClassConstantValue($node, $entity), + Node\Scalar\MagicConst\Dir::class => dirname($entity->getRelativeFileName()), + Node\Scalar\MagicConst\File::class => $entity->getRelativeFileName(), + Node\Scalar\MagicConst\Class_::class => is_a($entity, ClassEntity::class) ? $entity->getName() : $entity->getRootEntity()->getName(), + Node\Scalar\MagicConst\Line::class => $node->getLine(), + Node\Scalar\MagicConst\Namespace_::class => $entity->getNamespaceName(), + Node\Scalar\MagicConst\Method::class => is_a($entity, MethodEntity::class) ? $entity->getRootEntity()->getName() . '::' . $entity->getName() : '', + Node\Scalar\MagicConst\Trait_::class => $entity->isTrait() ? $entity->getName() : '', + Node\Scalar\MagicConst\Function_::class => is_a($entity, MethodEntity::class) ? $entity->getName() : '', + Node\Expr\FuncCall::class => self::getFuncCallValue($node), + Node\Expr\New_::class => throw new \RuntimeException('Unable to compile initializer'), + default => throw new \RuntimeException('Not supported operation') + }; + } catch (\Exception) { + } + + $astPrinter = new Standard(); + $value = $astPrinter->prettyPrint([$node]); + $op = array_reverse(explode('\\', get_class($node)))[0]; + $op = str_replace('Fetch', '', $op); + if (str_ends_with($op, '_')) { + return '[MagicConst:' . $value . ']'; + } + return "[{$op}:{$value}]"; + }); + + return $constExprEvaluator->evaluateDirectly($node); + } + + private static function getFuncCallValue(Node\Expr\FuncCall $node): mixed + { + if ( + $node->name instanceof Node\Name && + $node->name->toLowerString() === 'constant' && + $node->args[0] instanceof Node\Arg && + $node->args[0]->value instanceof Node\Scalar\String_ && + defined($node->args[0]->value->value) + ) { + return constant($node->args[0]->value->value); + } + throw new \RuntimeException('Not supported operation'); + } + + /** + * @throws InvalidConfigurationParameterException + * @throws ConstExprEvaluationException + */ + private static function getClassConstantValue( + Node\Expr\ClassConstFetch $node, + MethodEntity|PropertyEntity|ClassEntity $entity + ): mixed { + + $className = self::resolveClassName($node->class->toString(), $entity); + $constantName = $node->name->toString(); + + if (!$entity instanceof ClassEntity) { + $entity = $entity->getRootEntity(); + } + if ($entity->getName() !== $className) { + $entity = $entity->getRootEntityCollection()->getLoadedOrCreateNew($className); + } + + if ($entity->isEnum()) { + return $entity->getEnumCaseValue($constantName); + } + + if ($constantName === 'class') { + return $className; + } + return $entity->getConstantValue($constantName); + } + + /** + * @throws InvalidConfigurationParameterException + */ + private static function resolveClassName(string $className, MethodEntity|PropertyEntity|ClassEntity $entity): string + { + if ($className !== 'self' && $className !== 'static' && $className !== 'parent') { + return $className; + } + $classEntity = $entity; + if (!$entity instanceof ClassEntity) { + $classEntity = $entity->getRootEntity(); + } + return $className === 'parent' ? $classEntity->getParentClassName() : $classEntity->getName(); + } +} From 06de4b30b72590f10292b55579cfc8b344b914ab Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Fri, 10 Nov 2023 17:34:16 +0300 Subject: [PATCH 020/210] Using new value compiler --- src/LanguageHandler/Php/Parser/Entity/PropertyEntity.php | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/LanguageHandler/Php/Parser/Entity/PropertyEntity.php b/src/LanguageHandler/Php/Parser/Entity/PropertyEntity.php index cb95dffb..ebb61d5a 100644 --- a/src/LanguageHandler/Php/Parser/Entity/PropertyEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/PropertyEntity.php @@ -9,8 +9,7 @@ use BumbleDocGen\Core\Configuration\Configuration; use BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException; use BumbleDocGen\Core\Parser\Entity\Cache\CacheableMethod; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Ast\NodeCompiler\CompileNodeToValue; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Ast\NodeCompiler\CompilerContext; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Ast\NodeValueCompiler; use BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper; use BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings; use DI\DependencyException; @@ -349,8 +348,6 @@ public function getDescription(): string */ #[CacheableMethod] public function getDefaultValue(): string|array|int|bool|null|float { - $compiler = new CompileNodeToValue(); - $compiledValue = $compiler($this->getAst()->props[0]->default, new CompilerContext($this)); - return $compiledValue->value; + return NodeValueCompiler::compile($this->getAst()->props[0]->default, $this); } } From ddb1579ccec9b497128148e704071ca84c9ca2bb Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Fri, 10 Nov 2023 17:36:12 +0300 Subject: [PATCH 021/210] Removing reflection exception --- src/AI/Console/AddDocBlocksCommand.php | 2 -- src/AI/Console/GenerateReadMeTemplateCommand.php | 2 -- src/AI/Generators/DocBlocksGenerator.php | 4 +--- src/AI/Generators/ReadmeTemplateGenerator.php | 2 -- .../Plugin/CorePlugin/PageLinker/BasePageLinker.php | 2 -- .../Twig/Function/DrawDocumentedEntityLink.php | 2 -- .../Renderer/Twig/Function/GetDocumentedEntityUrl.php | 2 -- src/DocGenerator.php | 3 --- src/LanguageHandler/Php/Parser/Entity/BaseEntity.php | 11 ----------- .../Php/Parser/Entity/DynamicMethodEntity.php | 7 ------- .../Parser/Entity/Exception/ReflectionException.php | 9 --------- .../Php/Parser/Entity/MethodEntity.php | 3 +-- src/LanguageHandler/Php/PhpHandler.php | 3 +-- .../EntityDocRenderer/EntityDocRendererHelper.php | 3 --- .../Php/Renderer/Twig/Function/DrawClassMap.php | 4 ---- .../Twig/Function/GetClassMethodsBodyCode.php | 2 -- 16 files changed, 3 insertions(+), 58 deletions(-) delete mode 100644 src/LanguageHandler/Php/Parser/Entity/Exception/ReflectionException.php diff --git a/src/AI/Console/AddDocBlocksCommand.php b/src/AI/Console/AddDocBlocksCommand.php index 1826f010..e336d965 100644 --- a/src/AI/Console/AddDocBlocksCommand.php +++ b/src/AI/Console/AddDocBlocksCommand.php @@ -7,7 +7,6 @@ use BumbleDocGen\AI\Traits\SharedCommandLogicTrait; use BumbleDocGen\Console\Command\BaseCommand; use BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException; use DI\DependencyException; use DI\NotFoundException; use GuzzleHttp\Exception\GuzzleException; @@ -46,7 +45,6 @@ protected function configure(): void * @throws DependencyException * @throws InvalidConfigurationParameterException * @throws NotFoundException - * @throws ReflectionException * @throws GuzzleException * @throws JsonException */ diff --git a/src/AI/Console/GenerateReadMeTemplateCommand.php b/src/AI/Console/GenerateReadMeTemplateCommand.php index 909dd60a..b5a1d18a 100644 --- a/src/AI/Console/GenerateReadMeTemplateCommand.php +++ b/src/AI/Console/GenerateReadMeTemplateCommand.php @@ -7,7 +7,6 @@ use BumbleDocGen\AI\Traits\SharedCommandLogicTrait; use BumbleDocGen\Console\Command\BaseCommand; use BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException; use DI\DependencyException; use DI\NotFoundException; use GuzzleHttp\Exception\GuzzleException; @@ -43,7 +42,6 @@ protected function configure(): void /** * @throws NotFoundException * @throws GuzzleException - * @throws ReflectionException * @throws DependencyException * @throws InvalidConfigurationParameterException * @throws JsonException diff --git a/src/AI/Generators/DocBlocksGenerator.php b/src/AI/Generators/DocBlocksGenerator.php index 49174426..8376a2e1 100644 --- a/src/AI/Generators/DocBlocksGenerator.php +++ b/src/AI/Generators/DocBlocksGenerator.php @@ -8,7 +8,6 @@ use BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException; use BumbleDocGen\Core\Parser\Entity\RootEntityInterface; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\MethodEntity; use BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper; use DI\DependencyException; @@ -28,7 +27,6 @@ public function __construct( /** * @throws NotFoundException * @throws DependencyException - * @throws ReflectionException * @throws InvalidConfigurationParameterException */ public function hasMethodsWithoutDocBlocks(RootEntityInterface $rootEntity): bool @@ -47,10 +45,10 @@ public function hasMethodsWithoutDocBlocks(RootEntityInterface $rootEntity): boo } /** - * @throws ReflectionException * @throws DependencyException * @throws NotFoundException * @throws InvalidConfigurationParameterException + * @throws \JsonException */ public function generateDocBlocksForMethodsWithoutIt( RootEntityInterface $rootEntity, diff --git a/src/AI/Generators/ReadmeTemplateGenerator.php b/src/AI/Generators/ReadmeTemplateGenerator.php index f6af61a9..e2bc03e2 100644 --- a/src/AI/Generators/ReadmeTemplateGenerator.php +++ b/src/AI/Generators/ReadmeTemplateGenerator.php @@ -9,7 +9,6 @@ use BumbleDocGen\Core\Parser\Entity\RootEntityCollection; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException; use DI\DependencyException; use DI\NotFoundException; @@ -30,7 +29,6 @@ public function __construct( * @throws DependencyException * @throws InvalidConfigurationParameterException * @throws NotFoundException - * @throws ReflectionException */ public function generateReadmeFileContent( RootEntityCollection $rootEntityCollection, diff --git a/src/Core/Plugin/CorePlugin/PageLinker/BasePageLinker.php b/src/Core/Plugin/CorePlugin/PageLinker/BasePageLinker.php index 6aa790d1..6db5f216 100644 --- a/src/Core/Plugin/CorePlugin/PageLinker/BasePageLinker.php +++ b/src/Core/Plugin/CorePlugin/PageLinker/BasePageLinker.php @@ -10,7 +10,6 @@ use BumbleDocGen\Core\Plugin\PluginInterface; use BumbleDocGen\Core\Renderer\Breadcrumbs\BreadcrumbsHelper; use BumbleDocGen\Core\Renderer\Twig\Function\GetDocumentedEntityUrl; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException; use DI\DependencyException; use DI\NotFoundException; use Psr\Log\LoggerInterface; @@ -67,7 +66,6 @@ public static function getSubscribedEvents(): array /** * @throws NotFoundException * @throws DependencyException - * @throws ReflectionException * @throws InvalidConfigurationParameterException */ final public function beforeCreatingDocFile(BeforeCreatingDocFile $event): void diff --git a/src/Core/Renderer/Twig/Function/DrawDocumentedEntityLink.php b/src/Core/Renderer/Twig/Function/DrawDocumentedEntityLink.php index 35a4e3ee..88eec3a2 100644 --- a/src/Core/Renderer/Twig/Function/DrawDocumentedEntityLink.php +++ b/src/Core/Renderer/Twig/Function/DrawDocumentedEntityLink.php @@ -6,7 +6,6 @@ use BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException; use BumbleDocGen\Core\Parser\Entity\RootEntityInterface; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException; use DI\DependencyException; use DI\NotFoundException; @@ -45,7 +44,6 @@ public static function getOptions(): array * @return string Entity document HTML link * * @throws NotFoundException - * @throws ReflectionException * @throws DependencyException * @throws InvalidConfigurationParameterException */ diff --git a/src/Core/Renderer/Twig/Function/GetDocumentedEntityUrl.php b/src/Core/Renderer/Twig/Function/GetDocumentedEntityUrl.php index 1155b666..573a4637 100644 --- a/src/Core/Renderer/Twig/Function/GetDocumentedEntityUrl.php +++ b/src/Core/Renderer/Twig/Function/GetDocumentedEntityUrl.php @@ -12,7 +12,6 @@ use BumbleDocGen\Core\Renderer\Context\DocumentedEntityWrappersCollection; use BumbleDocGen\Core\Renderer\Context\DocumentTransformableEntityInterface; use BumbleDocGen\Core\Renderer\RendererHelper; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException; use DI\DependencyException; use DI\NotFoundException; use Monolog\Logger; @@ -73,7 +72,6 @@ public static function getOptions(): array * @throws DependencyException * @throws InvalidConfigurationParameterException * @throws NotFoundException - * @throws ReflectionException */ public function __invoke(RootEntityCollection $rootEntityCollection, string $entityName, string $cursor = '', bool $createDocument = true): string { diff --git a/src/DocGenerator.php b/src/DocGenerator.php index a3cf7d31..fb1440d2 100644 --- a/src/DocGenerator.php +++ b/src/DocGenerator.php @@ -17,7 +17,6 @@ use BumbleDocGen\Core\Renderer\Twig\Filter\AddIndentFromLeft; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException; use BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper; use DI\DependencyException; use DI\NotFoundException; @@ -77,7 +76,6 @@ public function parseAndGetRootEntityCollectionsGroup(): RootEntityCollectionsGr * * @throws NotFoundException * @throws DependencyException - * @throws ReflectionException * @throws InvalidConfigurationParameterException */ public function addDocBlocks( @@ -159,7 +157,6 @@ public function addDocBlocks( } /** - * @throws ReflectionException * @throws DependencyException * @throws NotFoundException * @throws InvalidConfigurationParameterException diff --git a/src/LanguageHandler/Php/Parser/Entity/BaseEntity.php b/src/LanguageHandler/Php/Parser/Entity/BaseEntity.php index 4eda24b2..58cf038d 100644 --- a/src/LanguageHandler/Php/Parser/Entity/BaseEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/BaseEntity.php @@ -16,7 +16,6 @@ use BumbleDocGen\Core\Parser\Entity\RootEntityInterface; use BumbleDocGen\Core\Renderer\RendererHelper; use BumbleDocGen\Core\Renderer\Twig\Function\GetDocumentedEntityUrl; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException; use BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper; use BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings; use BumbleDocGen\LanguageHandler\Php\Plugin\Event\Entity\OnCheckIsClassEntityCanBeLoad; @@ -24,10 +23,6 @@ use phpDocumentor\Reflection\DocBlock; use Psr\Cache\InvalidArgumentException; use Psr\Log\LoggerInterface; -use Roave\BetterReflection\Reflection\ReflectionClass; -use Roave\BetterReflection\Reflection\ReflectionClassConstant; -use Roave\BetterReflection\Reflection\ReflectionMethod; -use Roave\BetterReflection\Reflection\ReflectionProperty; abstract class BaseEntity implements CacheableEntityInterface, EntityInterface { @@ -45,7 +40,6 @@ protected function __construct( } /** - * @throws ReflectionException * @throws InvalidConfigurationParameterException */ abstract public function getAst(): \PhpParser\Node\Stmt; @@ -69,7 +63,6 @@ abstract public function getRootEntityCollection(): ClassEntityCollection; abstract public function getPhpHandlerSettings(): PhpHandlerSettings; /** - * @throws ReflectionException * @throws InvalidConfigurationParameterException */ final public function isEntityFileCanBeLoad(): bool @@ -335,7 +328,6 @@ public function hasThrows(): bool } /** - * @throws ReflectionException * @throws InvalidConfigurationParameterException */ #[CacheableMethod] protected function getThrowsData(): array @@ -374,7 +366,6 @@ public function hasThrows(): bool /** * Get parsed throws from `throws` doc block * - * @throws ReflectionException * @throws InvalidConfigurationParameterException */ public function getThrows(): array @@ -384,7 +375,6 @@ public function getThrows(): array } /** - * @throws ReflectionException * @throws InvalidConfigurationParameterException */ private function fillInLinkDataWithUrls(array $linkData): array @@ -482,7 +472,6 @@ public function getDocNote(): string /** * Get the doc comment of an entity * - * @throws ReflectionException * @throws InvalidConfigurationParameterException */ #[CacheableMethod] public function getDocComment(): string diff --git a/src/LanguageHandler/Php/Parser/Entity/DynamicMethodEntity.php b/src/LanguageHandler/Php/Parser/Entity/DynamicMethodEntity.php index 94b31cbb..b2d72faa 100644 --- a/src/LanguageHandler/Php/Parser/Entity/DynamicMethodEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/DynamicMethodEntity.php @@ -7,7 +7,6 @@ use BumbleDocGen\Core\Configuration\Configuration; use BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException; use BumbleDocGen\Core\Parser\Entity\RootEntityCollection; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException; use BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper; use phpDocumentor\Reflection\DocBlock\Tags\Method; @@ -100,7 +99,6 @@ public function getModifiersString(): string } /** - * @throws ReflectionException * @throws InvalidConfigurationParameterException */ public function getReturnType(): string @@ -162,7 +160,6 @@ public function getDescription(): string } /** - * @throws ReflectionException * @throws InvalidConfigurationParameterException * @throws \Exception */ @@ -188,10 +185,6 @@ public function getShortName(): string return $this->getName(); } - /** - * @throws ReflectionException - * @throws InvalidConfigurationParameterException - */ public function getNamespaceName(): string { return $this->getRootEntity()->getNamespaceName(); diff --git a/src/LanguageHandler/Php/Parser/Entity/Exception/ReflectionException.php b/src/LanguageHandler/Php/Parser/Entity/Exception/ReflectionException.php deleted file mode 100644 index ca1584e2..00000000 --- a/src/LanguageHandler/Php/Parser/Entity/Exception/ReflectionException.php +++ /dev/null @@ -1,9 +0,0 @@ - Date: Fri, 10 Nov 2023 17:36:36 +0300 Subject: [PATCH 022/210] Adding new implode function --- .../Configuration/defaultConfiguration.yaml | 1 + src/Core/Renderer/Twig/Filter/Implode.php | 24 +++++++++++++++++++ 2 files changed, 25 insertions(+) create mode 100644 src/Core/Renderer/Twig/Filter/Implode.php diff --git a/src/Core/Configuration/defaultConfiguration.yaml b/src/Core/Configuration/defaultConfiguration.yaml index 190b6133..50bac201 100644 --- a/src/Core/Configuration/defaultConfiguration.yaml +++ b/src/Core/Configuration/defaultConfiguration.yaml @@ -30,6 +30,7 @@ twig_filters: # (array) Filters that - class: \BumbleDocGen\Core\Renderer\Twig\Filter\TextToCodeBlock - class: \BumbleDocGen\Core\Renderer\Twig\Filter\TextToHeading - class: \BumbleDocGen\Core\Renderer\Twig\Filter\PregMatch + - class: \BumbleDocGen\Core\Renderer\Twig\Filter\Implode plugins: # (array|null) List of plugins - class: \BumbleDocGen\Core\Plugin\CorePlugin\PageLinker\PageHtmlLinkerPlugin - class: \BumbleDocGen\Core\Plugin\CorePlugin\PageLinker\PageLinkerPlugin diff --git a/src/Core/Renderer/Twig/Filter/Implode.php b/src/Core/Renderer/Twig/Filter/Implode.php new file mode 100644 index 00000000..065bb8a0 --- /dev/null +++ b/src/Core/Renderer/Twig/Filter/Implode.php @@ -0,0 +1,24 @@ + Date: Fri, 10 Nov 2023 17:38:06 +0300 Subject: [PATCH 023/210] Adding new composer parser methods --- .../Php/Parser/ComposerParser.php | 64 +++++++++++++++++-- 1 file changed, 59 insertions(+), 5 deletions(-) diff --git a/src/LanguageHandler/Php/Parser/ComposerParser.php b/src/LanguageHandler/Php/Parser/ComposerParser.php index 32feaf16..edf310a7 100644 --- a/src/LanguageHandler/Php/Parser/ComposerParser.php +++ b/src/LanguageHandler/Php/Parser/ComposerParser.php @@ -5,16 +5,61 @@ namespace BumbleDocGen\LanguageHandler\Php\Parser; use BumbleDocGen\Core\Configuration\Configuration; +use BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException; +use Composer\Autoload\ClassLoader; final class ComposerParser { private array $packages = []; + private ?ClassLoader $classLoader = null; + public function __construct(private Configuration $configuration) { } /** - * @throws \Exception + * @throws InvalidConfigurationParameterException + */ + public function getComposerClassLoader(): ClassLoader + { + if ($this->classLoader) { + return $this->classLoader; + } + + $classLoader = new ClassLoader(); + $projectRoot = $this->configuration->getProjectRoot(); + $composerJsonPath = "{$projectRoot}/composer.json"; + if (!file_exists($composerJsonPath) || !is_readable($composerJsonPath)) { + return $classLoader; + } + + $composerConfig = json_decode(file_get_contents($composerJsonPath), true); + + $loadSection = function (array $section) use ($classLoader, $composerConfig, $projectRoot): void { + if (isset($section['psr-4'])) { + foreach ($section['psr-4'] as $namespace => $path) { + $classLoader->addPsr4($namespace, "{$projectRoot}/{$path}"); + } + } + if (isset($section['psr-0'])) { + foreach ($section['psr-0'] as $namespace => $path) { + $classLoader->add($namespace, "{$projectRoot}/{$path}"); + } + } + }; + + if (isset($composerConfig['autoload'])) { + $loadSection($composerConfig['autoload']); + } + if (isset($composerConfig['autoload-dev'])) { + $loadSection($composerConfig['autoload-dev']); + } + $this->classLoader = $classLoader; + return $classLoader; + } + + /** + * @throws InvalidConfigurationParameterException */ public function getComposerPackages(): array { @@ -49,15 +94,24 @@ public function getComposerPackages(): array return $this->packages; } - /** - * @throws \Exception - */ public function getComposerPackageDataByClassName(string $className): ?array { if (!ParserHelper::isCorrectClassName($className)) { return null; } - $packages = $this->getComposerPackages(); + $packages = []; + try { + $packages = $this->getComposerPackages(); + } catch (\Exception) { + } + + if ($packages) { + $packages['Composer\\'] = [ + "path" => "src/Composer/", + "namespace" => "Composer\\", + "url" => "https://github.com/composer/composer" + ]; + } $classParts = explode('\\', $className); $namespace = ''; foreach ($classParts as $part) { From 48b5d8b522d76d6be2b5325a1b8574d940002423 Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Fri, 10 Nov 2023 17:40:16 +0300 Subject: [PATCH 024/210] Optimizing ParserHelper --- .../Php/Parser/ParserHelper.php | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/src/LanguageHandler/Php/Parser/ParserHelper.php b/src/LanguageHandler/Php/Parser/ParserHelper.php index c1d68cce..defd6454 100644 --- a/src/LanguageHandler/Php/Parser/ParserHelper.php +++ b/src/LanguageHandler/Php/Parser/ParserHelper.php @@ -10,7 +10,6 @@ use BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\MethodEntity; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Reflection\ReflectorWrapper; use DI\DependencyException; use DI\NotFoundException; use Monolog\Logger; @@ -158,7 +157,7 @@ final class ParserHelper public function __construct( private Configuration $configuration, - private ReflectorWrapper $reflector, + private ComposerParser $composerParser, private LocalObjectCache $localObjectCache, private Logger $logger ) { @@ -220,16 +219,14 @@ public static function isCorrectClassName(string $className, bool $checkBuiltIns return self::checkIsClassName($className); } + /** + * @throws InvalidConfigurationParameterException + */ public function isClassLoaded(string $className): bool { if (self::isCorrectClassName($className)) { - try { - $this->reflector->reflectClass($className); - return true; - } catch (\Exception) { - } + return (bool)$this->composerParser->getComposerClassLoader()->findFile($className); } - return false; } @@ -348,6 +345,7 @@ public function getClassFromFile($file): ?string * @throws DependencyException * @throws NotFoundException * @throws InvalidConfigurationParameterException + * @throws \PhpParser\ConstExprEvaluationException */ protected function getRawValue(MethodEntity $methodEntity, string $condition) { @@ -381,7 +379,7 @@ protected function getRawValue(MethodEntity $methodEntity, string $condition) $methodValue = $this->getMethodReturnValue($nextMethodEntity); return $prepareReturnValue($methodValue); } elseif (!preg_match('/([-+:\/ ])/', $parts[1])) { - $constantValue = $classEntity->getConstant($parts[1]); + $constantValue = $classEntity->getConstantValue($parts[1]); return $prepareReturnValue($constantValue); } } @@ -412,7 +410,7 @@ function (array $matches) use ($classEntity, $prepareReturnValue) { $methodValue = $this->getMethodReturnValue($methodEntity); return $prepareReturnValue($methodValue); } elseif ($classEntity->hasConstant($matches[6])) { - $constantValue = $classEntity->getConstant($matches[6]); + $constantValue = $classEntity->getConstantValue($matches[6]); return $prepareReturnValue($constantValue); } return $matches[0]; From b0e6d76d9b9f62f5e28a2267819046876e52a966 Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Fri, 10 Nov 2023 17:40:26 +0300 Subject: [PATCH 025/210] Updating template --- .../PhpClassToMd/templates/_classMainInfo.md.twig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/LanguageHandler/Php/Renderer/EntityDocRenderer/PhpClassToMd/templates/_classMainInfo.md.twig b/src/LanguageHandler/Php/Renderer/EntityDocRenderer/PhpClassToMd/templates/_classMainInfo.md.twig index 81c394c1..0cc0ce13 100644 --- a/src/LanguageHandler/Php/Renderer/EntityDocRenderer/PhpClassToMd/templates/_classMainInfo.md.twig +++ b/src/LanguageHandler/Php/Renderer/EntityDocRenderer/PhpClassToMd/templates/_classMainInfo.md.twig @@ -6,7 +6,7 @@ namespace {{ classEntity.getNamespaceName() }}; {% endif %} -{{ classEntity.getModifiersString() }} {{ classEntity.getShortName() }}{% if classEntity.getExtends() %} extends {{ classEntity.getExtends() }}{% endif %}{% if classEntity.getInterfacesString() %} implements {{ classEntity.getInterfacesString() }}{% endif %} +{{ classEntity.getModifiersString() }} {{ classEntity.getShortName() }}{% if classEntity.isInterface() and classEntity.getInterfaceNames() %} extends {{ classEntity.getInterfaceNames() | implode(', ') }}{% else %}{% if classEntity.getParentClassName() %} extends {{ classEntity.getParentClassName() }}{% endif %}{% if classEntity.getInterfaceNames() %} implements {{ classEntity.getInterfaceNames() | implode(', ') }}{% endif %}{% endif %} ``` From 2b0e8cb53a22e6cbf8353c0a127c8c791d85169e Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Fri, 10 Nov 2023 17:43:00 +0300 Subject: [PATCH 026/210] Using phpParser instead of BetterReflection --- .../Cache/CacheablePhpEntityFactory.php | 48 -- .../Php/Parser/Entity/ClassEntity.php | 615 +++++++++++------- .../Parser/Entity/ClassEntityCollection.php | 71 +- 3 files changed, 441 insertions(+), 293 deletions(-) diff --git a/src/LanguageHandler/Php/Parser/Entity/Cache/CacheablePhpEntityFactory.php b/src/LanguageHandler/Php/Parser/Entity/Cache/CacheablePhpEntityFactory.php index b4649652..0f08b623 100644 --- a/src/LanguageHandler/Php/Parser/Entity/Cache/CacheablePhpEntityFactory.php +++ b/src/LanguageHandler/Php/Parser/Entity/Cache/CacheablePhpEntityFactory.php @@ -6,8 +6,6 @@ use BumbleDocGen\Core\Cache\LocalCache\Exception\ObjectNotFoundException; use BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache; -use BumbleDocGen\Core\Configuration\Configuration; -use BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException; use BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityWrapperFactory; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection; @@ -15,19 +13,15 @@ use BumbleDocGen\LanguageHandler\Php\Parser\Entity\DynamicMethodEntity; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\MethodEntity; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\PropertyEntity; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Reflection\ReflectorWrapper; use DI\Container; use DI\DependencyException; use DI\NotFoundException; use phpDocumentor\Reflection\DocBlock\Tags\Method; -use Roave\BetterReflection\Reflection\ReflectionClass; final class CacheablePhpEntityFactory { public function __construct( private CacheableEntityWrapperFactory $cacheableEntityWrapperFactory, - private ReflectorWrapper $reflector, - private Configuration $configuration, private LocalObjectCache $localObjectCache, private Container $diContainer ) { @@ -146,7 +140,6 @@ public function createClassEntity( } $wrapperClassName = $this->getOrCreateEntityClassWrapper(ClassEntity::class); $classEntity = $this->diContainer->make($wrapperClassName, [ - 'reflector' => $this->reflector, 'classEntityCollection' => $classEntityCollection, 'className' => $className, 'relativeFileName' => $relativeFileName @@ -155,23 +148,6 @@ public function createClassEntity( return $classEntity; } - /** - * @throws DependencyException - * @throws NotFoundException - * @throws InvalidConfigurationParameterException - */ - public function createClassEntityByReflection( - ReflectionClass $reflectionClass, - ClassEntityCollection $classEntityCollection - ): ClassEntity { - $relativeFileName = str_replace($this->configuration->getProjectRoot(), '', $reflectionClass->getFileName() ?? ''); - $relativeFileName = $relativeFileName ?: null; - $className = $reflectionClass->getName(); - $classEntity = $this->createClassEntity($classEntityCollection, $className, $relativeFileName); - $classEntity->setReflectionClass($reflectionClass); - return $classEntity; - } - /** * @throws DependencyException * @throws NotFoundException @@ -195,7 +171,6 @@ public function createSubClassEntity( } $wrapperClassName = $this->getOrCreateEntityClassWrapper($subClassEntity); $classEntity = $this->diContainer->make($wrapperClassName, [ - 'reflector' => $this->reflector, 'classEntityCollection' => $classEntityCollection, 'className' => $className, 'relativeFileName' => $relativeFileName @@ -204,29 +179,6 @@ public function createSubClassEntity( return $classEntity; } - /** - * @throws DependencyException - * @throws NotFoundException - * @throws InvalidConfigurationParameterException - */ - public function createSubClassEntityByReflection( - string $subClassEntity, - ReflectionClass $reflectionClass, - ClassEntityCollection $classEntityCollection - ): ClassEntity { - $relativeFileName = str_replace($this->configuration->getProjectRoot(), '', $reflectionClass->getFileName() ?? ''); - $relativeFileName = $relativeFileName ?: null; - $className = $reflectionClass->getName(); - $classEntity = $this->createSubClassEntity( - $subClassEntity, - $classEntityCollection, - $className, - $relativeFileName - ); - $classEntity->setReflectionClass($reflectionClass); - return $classEntity; - } - private function getOrCreateEntityClassWrapper(string $entityClassName): string { try { diff --git a/src/LanguageHandler/Php/Parser/Entity/ClassEntity.php b/src/LanguageHandler/Php/Parser/Entity/ClassEntity.php index 41f41ae8..4699c1a4 100644 --- a/src/LanguageHandler/Php/Parser/Entity/ClassEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/ClassEntity.php @@ -14,8 +14,8 @@ use BumbleDocGen\Core\Renderer\EntityDocRenderer\EntityDocRendererInterface; use BumbleDocGen\Core\Renderer\Twig\Filter\PrepareSourceLink; use BumbleDocGen\LanguageHandler\Php\Parser\ComposerParser; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Reflection\ReflectorWrapper; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Ast\NodeValueCompiler; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Ast\PhpParserHelper; use BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper; use BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings; use DI\Attribute\Inject; @@ -23,16 +23,20 @@ use DI\DependencyException; use DI\NotFoundException; use phpDocumentor\Reflection\DocBlock; +use PhpParser\ConstExprEvaluationException; +use PhpParser\Node; use PhpParser\Node\Stmt\Class_ as ClassNode; +use PhpParser\Node\Stmt\ClassConst as ConstNode; +use PhpParser\Node\Stmt\ClassMethod as MethodNode; use PhpParser\Node\Stmt\Enum_ as EnumNode; +use PhpParser\Node\Stmt\EnumCase as EnumCaseNode; use PhpParser\Node\Stmt\Interface_ as InterfaceNode; +use PhpParser\Node\Stmt\Namespace_; +use PhpParser\Node\Stmt\Property as PropertyNode; use PhpParser\Node\Stmt\Trait_ as TraitNode; +use PhpParser\NodeTraverser; +use PhpParser\NodeVisitor\NameResolver; use Psr\Log\LoggerInterface; -use Roave\BetterReflection\BetterReflection; -use Roave\BetterReflection\Identifier\Identifier; -use Roave\BetterReflection\Identifier\IdentifierType; -use Roave\BetterReflection\Reflection\ReflectionClass; -use Roave\BetterReflection\SourceLocator\Located\LocatedSource; /** * Class entity @@ -42,17 +46,16 @@ class ClassEntity extends BaseEntity implements DocumentTransformableEntityInter #[Inject] private Container $diContainer; private array $pluginsData = []; - private ?ReflectionClass $reflectionClass = null; private bool $relativeFileNameLoaded = false; private bool $isClassLoad = false; public function __construct( private Configuration $configuration, private PhpHandlerSettings $phpHandlerSettings, - private ReflectorWrapper $reflector, private ClassEntityCollection $classEntityCollection, private ParserHelper $parserHelper, private ComposerParser $composerParser, + private PhpParserHelper $phpParserHelper, private LocalObjectCache $localObjectCache, private LoggerInterface $logger, private string $className, @@ -79,26 +82,11 @@ public function getObjectId(): string return $this->className; } - /** - * @inheritDoc - * @throws \Exception - */ public function isExternalLibraryEntity(): bool { return !is_null($this->composerParser->getComposerPackageDataByClassName($this->getName())); } - public function setReflectionClass(ReflectionClass $reflectionClass): void - { - $this->reflectionClass = $reflectionClass; - $this->isClassLoad = true; - } - - public function getReflector(): ReflectorWrapper - { - return $this->reflector; - } - public function getPhpHandlerSettings(): PhpHandlerSettings { return $this->phpHandlerSettings; @@ -111,9 +99,6 @@ public function getRootEntityCollection(): ClassEntityCollection /** * {@inheritDoc} - * @throws NotFoundException - * @throws DependencyException - * @throws ReflectionException * @throws InvalidConfigurationParameterException * @throws \Exception */ @@ -121,9 +106,8 @@ public function getEntityDependencies(): array { $fileDependencies = []; if ($this->isClassLoad()) { - $currentClassEntityReflection = $this->getReflection(); $parentClassNames = $this->getParentClassNames(); - $traitClassNames = $currentClassEntityReflection->getTraitNames(); + $traitClassNames = $this->getTraitsNames(); $interfaceNames = $this->getInterfaceNames(); $classNames = array_unique(array_merge($parentClassNames, $traitClassNames, $interfaceNames)); @@ -134,12 +118,12 @@ function (string $className): bool { } ); - $reflections = array_map(fn(string $className): ReflectionClass => $this->getReflector()->reflectClass($className), $classNames); - $reflections[] = $currentClassEntityReflection; + $reflections = array_map(fn(string $className) => $this->getRootEntityCollection()->getLoadedOrCreateNew($className), $classNames); + $reflections[] = $this; foreach ($reflections as $reflectionClass) { - $fileName = $reflectionClass->getFileName(); - if ($fileName) { - $relativeFileName = str_replace($this->configuration->getProjectRoot(), '', $reflectionClass->getFileName()); + $relativeFileName = $reflectionClass->getRelativeFileName(); + if ($relativeFileName) { + $fileName = $this->configuration->getProjectRoot() . '/' . $relativeFileName; $fileDependencies[$relativeFileName] = md5_file($fileName); } } @@ -149,7 +133,6 @@ function (string $className): bool { /** * @throws NotFoundException - * @throws ReflectionException * @throws DependencyException * @throws InvalidConfigurationParameterException */ @@ -161,22 +144,22 @@ public function getDocBlock(): DocBlock /** * Checking if class file is in git repository - * - * @throws InvalidConfigurationParameterException - * @throws ReflectionException */ public function isInGit(): bool { - if (!$this->getFileName()) { - return false; + try { + if (!$this->getFileName()) { + return false; + } + $filesInGit = $this->parserHelper->getFilesInGit(); + $fileName = ltrim($this->getFileName(), DIRECTORY_SEPARATOR); + return isset($filesInGit[$fileName]); + } catch (\Exception) { } - $filesInGit = $this->parserHelper->getFilesInGit(); - $fileName = ltrim($this->getFileName(), DIRECTORY_SEPARATOR); - return isset($filesInGit[$fileName]); + return false; } /** - * @throws ReflectionException * @throws InvalidConfigurationParameterException */ public function documentCreationAllowed(): bool @@ -187,7 +170,6 @@ public function documentCreationAllowed(): bool /** * @throws NotFoundException * @throws DependencyException - * @throws ReflectionException * @throws InvalidConfigurationParameterException */ public function getDocCommentEntity(): ClassEntity @@ -201,7 +183,7 @@ public function getDocCommentEntity(): ClassEntity $classEntity = $this; if (!$docComment || str_contains(mb_strtolower($docComment), '@inheritdoc')) { $parentReflectionClass = $this->getParentClass(); - if ($parentReflectionClass) { + if ($parentReflectionClass && $parentReflectionClass->entityDataCanBeLoaded()) { $classEntity = $parentReflectionClass->getDocCommentEntity(); } } @@ -212,7 +194,6 @@ public function getDocCommentEntity(): ClassEntity /** * @throws NotFoundException * @throws DependencyException - * @throws ReflectionException * @throws InvalidConfigurationParameterException */ protected function getDocCommentRecursive(): string @@ -230,58 +211,62 @@ public function getPluginData(string $pluginKey): ?array return $this->pluginsData[$pluginKey] ?? null; } + public function setCustomAst(TraitNode|EnumNode|InterfaceNode|ClassNode|null $customAst): void + { + $objectId = $this->getObjectId(); + $this->isClassLoad = true; + $this->localObjectCache->cacheMethodResult(__CLASS__ . '::getAst', $objectId, $customAst); + } /** - * {@inheritDoc} - * @throws ReflectionException + * @throws \RuntimeException * @throws InvalidConfigurationParameterException */ - final protected function getReflection(): ReflectionClass + public function getAst(): ClassNode|InterfaceNode|TraitNode|EnumNode { - if ($this->reflectionClass) { - return $this->reflectionClass; - } $objectId = $this->getObjectId(); try { - $this->reflectionClass = $this->localObjectCache->getMethodCachedResult(__METHOD__, $objectId); - return $this->reflectionClass; + return $this->localObjectCache->getMethodCachedResult(__METHOD__, $objectId); } catch (ObjectNotFoundException) { } - if (!$this->reflectionClass) { - try { - $this->reflectionClass = $this->reflector->reflectClass($this->className); - } catch (\Exception) { + + $ast = null; + $nodes = $this->phpParserHelper->phpParser()->parse($this->getFileContent()); + $nodeTraverser = new NodeTraverser(); + $nodeTraverser->addVisitor(new NameResolver()); + $nodes = $nodeTraverser->traverse($nodes); + foreach ($nodes as $node) { + if (in_array(get_class($node), [ClassNode::class, InterfaceNode::class, TraitNode::class, EnumNode::class])) { + $className = $node->name->toString(); + if ($className === $this->getName()) { + $ast = $node; + break; + } + } elseif (!$node instanceof Namespace_) { + continue; } - if (!$this->reflectionClass && $this->relativeFileNameLoaded && $this->getName()) { - $locatedSource = new LocatedSource( - $this->getFileContent(), - $this->getName(), - $this->getAbsoluteFileName() - ); - /** - * @var ReflectionClass $reflectionClass - */ - $reflectionClass = (new BetterReflection())->astLocator()->findReflection( - $this->getReflector(), - $locatedSource, - new Identifier($this->getName(), new IdentifierType(IdentifierType::IDENTIFIER_CLASS)), - ); - $this->reflectionClass = $reflectionClass; + $namespaceName = $node->name->toString(); + foreach ($node->stmts as $subNode) { + if (!in_array(get_class($subNode), [ClassNode::class, InterfaceNode::class, TraitNode::class, EnumNode::class])) { + continue; + } + $className = "{$namespaceName}\\{$subNode->name->toString()}"; + if ($className === $this->getName()) { + $ast = $subNode; + break 2; + } } } - if (!$this->reflectionClass) { - throw new ReflectionException("'{$this->className}' could not be found in the located source "); - } - $this->localObjectCache->cacheMethodResult(__METHOD__, $objectId, $this->reflectionClass); - return $this->reflectionClass; - } - /** - * @throws ReflectionException - * @throws InvalidConfigurationParameterException - */ - public function getAst(): ClassNode|InterfaceNode|TraitNode|EnumNode - { - return $this->getReflection()->getAst(); + if (!$ast) { + if ($this->getName() === 'MeetD') { + $this->logger->emergency($this->getAbsoluteFileName()); + die(); + } + throw new \RuntimeException("Entity `{$this->getName()}` not found"); + } + $this->isClassLoad = true; + $this->localObjectCache->cacheMethodResult(__METHOD__, $objectId, $ast); + return $ast; } public function getImplementingClass(): ClassEntity @@ -289,11 +274,6 @@ public function getImplementingClass(): ClassEntity return $this; } - public function hasAnnotationKey(string $annotationKey): bool - { - return false; - } - public function getName(): string { return $this->className; @@ -306,7 +286,7 @@ public function isClassLoad(): bool { if (!$this->isClassLoad) { try { - $this->isClassLoad = ParserHelper::isCorrectClassName($this->getName()) && $this->getReflection(); + $this->isClassLoad = ParserHelper::isCorrectClassName($this->getName()) && $this->getRelativeFileName(); } catch (\Exception) { $this->isClassLoad = false; } @@ -315,9 +295,7 @@ public function isClassLoad(): bool } /** - * @throws ReflectionException * @throws InvalidConfigurationParameterException - * @throws \Exception */ #[CacheableMethod] public function entityDataCanBeLoaded(): bool { @@ -334,24 +312,24 @@ public function getShortName(): string return end($nameParts); } - /** - * @throws ReflectionException - * @throws InvalidConfigurationParameterException - */ #[CacheableMethod] public function getNamespaceName(): string { - return $this->getReflection()->getNamespaceName(); + $namespaceParts = explode('\\', $this->getName()); + if (count($namespaceParts) < 2) { + return ''; + } + array_pop($namespaceParts); + return implode('\\', $namespaceParts); } /** - * @throws ReflectionException * @throws InvalidConfigurationParameterException */ public function getRelativeFileName(bool $loadIfEmpty = true): ?string { if (!$this->relativeFileNameLoaded && $loadIfEmpty) { $this->relativeFileNameLoaded = true; - $fileName = $this->getReflection()->getFileName(); + $fileName = $this->composerParser->getComposerClassLoader()->findFile($this->getName()); $projectRoot = $this->configuration->getProjectRoot(); if (!$fileName || !str_starts_with($fileName, $projectRoot)) { return null; @@ -368,15 +346,13 @@ public function getRelativeFileName(bool $loadIfEmpty = true): ?string /** * {@inheritDoc} * @throws InvalidConfigurationParameterException - * @throws ReflectionException */ - #[CacheableMethod] public function getFileName(): ?string + public function getFileName(): ?string { return $this->getRelativeFileName(); } /** - * @throws ReflectionException * @throws InvalidConfigurationParameterException */ public function getFullFileName(): ?string @@ -389,33 +365,28 @@ public function getFullFileName(): ?string } /** - * @throws ReflectionException * @throws InvalidConfigurationParameterException */ #[CacheableMethod] public function getStartLine(): int { - return $this->getReflection()->getStartLine(); + return $this->getAst()->getStartLine(); } /** - * @throws ReflectionException * @throws InvalidConfigurationParameterException */ #[CacheableMethod] public function getEndLine(): int { - return $this->getReflection()->getEndLine(); + return $this->getAst()->getEndLine(); } /** - * @throws ReflectionException * @throws InvalidConfigurationParameterException */ #[CacheableMethod] public function getModifiersString(): string { $modifiersString = []; - - $reflection = $this->getReflection(); - if ($reflection->isFinal() && !$this->isEnum()) { + if (!$this->isInterface() && !$this->isEnum() && !$this->isTrait() && $this->getAst()->isFinal()) { $modifiersString[] = 'final'; } @@ -423,11 +394,11 @@ public function getFullFileName(): ?string if ($isInterface) { $modifiersString[] = 'interface'; return implode(' ', $modifiersString); - } elseif ($reflection->isAbstract()) { + } elseif ($this->isAbstract()) { $modifiersString[] = 'abstract'; } - if ($reflection->isTrait()) { + if ($this->isTrait()) { $modifiersString[] = 'trait'; } elseif ($this->isEnum()) { $modifiersString[] = 'enum'; @@ -439,26 +410,8 @@ public function getFullFileName(): ?string } /** - * @throws ReflectionException - * @throws InvalidConfigurationParameterException - */ - public function getExtends(): ?string - { - if ($this->isInterface()) { - $extends = $this->getInterfaceNames()[0] ?? null; - } else { - $extends = $this->getParentClassName(); - } - if ($extends) { - $extends = "\\{$extends}"; - } - return $extends; - } - - /** - * @throws ReflectionException - * @throws InvalidConfigurationParameterException * @return ClassEntity[] $trait + * @throws InvalidConfigurationParameterException */ public function getTraits(): array { @@ -472,7 +425,6 @@ public function getTraits(): array /** * @return ClassEntity[] * - * @throws ReflectionException * @throws InvalidConfigurationParameterException */ public function getInterfacesEntities(): array @@ -487,12 +439,11 @@ public function getInterfacesEntities(): array /** * @return string[] * - * @throws ReflectionException * @throws InvalidConfigurationParameterException */ #[CacheableMethod] public function getParentClassNames(): array { - if ($this->isExternalLibraryEntity()) { + if (!$this->entityDataCanBeLoaded()) { return []; } if ($this->isInterface()) { @@ -500,8 +451,8 @@ public function getInterfacesEntities(): array } else { try { $parentClass = $this->getParentClass(); - if ($parentClass?->getName()) { - return array_merge(["\\{$parentClass->getName()}"], $parentClass->getParentClassNames()); + if ($parentClass?->entityDataCanBeLoaded() && $name = $parentClass?->getName()) { + return array_merge(["\\{$name}"], $parentClass->getParentClassNames()); } } catch (\Exception $e) { $this->logger->warning($e->getMessage()); @@ -510,18 +461,28 @@ public function getInterfacesEntities(): array return []; } + /** + * @return ClassEntity[] + * @throws InvalidConfigurationParameterException + */ + public function getParentClassEntities(): array + { + return array_map( + fn(string $className) => $this->getRootEntityCollection()->getLoadedOrCreateNew($className), + $this->getParentClassNames() + ); + } /** * @return string[] * - * @throws ReflectionException * @throws InvalidConfigurationParameterException */ #[CacheableMethod] public function getInterfaceNames(): array { - // method $this->getReflection()->getInterfaceNames() is not suitable, because if at least - // one successor interface was not found in the sources, an error will be returned. - // We also need to get the maximum possible number of interfaces + if (!$this->entityDataCanBeLoaded()) { + return []; + } if ($this->isTrait()) { return []; @@ -534,7 +495,7 @@ public function getInterfacesEntities(): array $interfaceNames = []; - $node = $this->getReflection()->getAst(); + $node = $this->getAst(); $nodes = $node instanceof InterfaceNode ? $node->extends : $node->implements; $interfaces = array_map(static fn($n) => $n->toString(), $nodes ?? []); foreach ($interfaces as $interfaceName) { @@ -544,7 +505,7 @@ public function getInterfacesEntities(): array $parentInterfaceNames = []; try { $interfaceEntity = $this->getRootEntityCollection()->getLoadedOrCreateNew($interfaceName); - if (!$interfaceEntity->isExternalLibraryEntity()) { + if ($interfaceEntity->entityDataCanBeLoaded()) { $parentInterfaceNames = $interfaceEntity->getInterfaceNames(); } } catch (\Exception $e) { @@ -555,7 +516,7 @@ public function getInterfacesEntities(): array if (!$this->isInterface() && $parentClass = $this->getParentClass()) { $parentInterfaceNames = []; try { - if (!$parentClass->isExternalLibraryEntity()) { + if ($parentClass->entityDataCanBeLoaded()) { $parentInterfaceNames = $parentClass->getInterfaceNames(); } } catch (\Exception $e) { @@ -569,19 +530,20 @@ public function getInterfacesEntities(): array } /** - * @throws ReflectionException * @throws InvalidConfigurationParameterException */ #[CacheableMethod] public function getParentClassName(): ?string { - if (!$this->isInterface() && !$this->isTrait()) { - return $this->getReflection()->getAst()->extends?->toString(); + if (!$this->entityDataCanBeLoaded() || $this->isEnum()) { + return null; } - return $this->getReflection()->getParentClass()?->getName(); + if (!$this->isInterface() && !$this->isTrait() && $parentClassName = $this->getAst()->extends?->toString()) { + return '\\' . $parentClassName; + } + return null; } /** - * @throws ReflectionException * @throws InvalidConfigurationParameterException */ public function getParentClass(): ?ClassEntity @@ -594,25 +556,25 @@ public function getParentClass(): ?ClassEntity } /** - * @throws ReflectionException - * @throws InvalidConfigurationParameterException - */ - public function getInterfacesString(): string - { - return implode(', ', $this->getInterfaceNames()); - } - - /** - * @throws ReflectionException * @throws InvalidConfigurationParameterException */ #[CacheableMethod] public function getTraitsNames(): array { - return $this->getReflection()->getTraitNames(); + if (!$this->entityDataCanBeLoaded()) { + return []; + } + $traitsNames = []; + /**@var Node\Stmt\TraitUse[] $traitsNodes * */ + $traitsNodes = array_filter($this->getAst()->stmts, static fn(Node\Stmt $stmt): bool => $stmt instanceof Node\Stmt\TraitUse); + foreach ($traitsNodes as $node) { + foreach ($node->traits as $traitNode) { + $traitsNames[] = $traitNode->toString(); + } + } + return $traitsNames; } /** - * @throws ReflectionException * @throws InvalidConfigurationParameterException */ public function hasTraits(): bool @@ -622,7 +584,6 @@ public function hasTraits(): bool /** * @throws NotFoundException - * @throws ReflectionException * @throws DependencyException * @throws InvalidConfigurationParameterException */ @@ -643,7 +604,6 @@ public function getConstantEntityCollection(): ConstantEntityCollection /** * @throws NotFoundException - * @throws ReflectionException * @throws DependencyException * @throws InvalidConfigurationParameterException */ @@ -660,7 +620,6 @@ public function getConstantEntity(string $constantName, bool $unsafe = true): ?C * @throws DependencyException * @throws InvalidConfigurationParameterException * @throws NotFoundException - * @throws ReflectionException */ public function getPropertyEntityCollection(): PropertyEntityCollection { @@ -681,7 +640,6 @@ public function getPropertyEntityCollection(): PropertyEntityCollection * @throws NotFoundException * @throws DependencyException * @throws InvalidConfigurationParameterException - * @throws ReflectionException */ public function getPropertyEntity(string $propertyName, bool $unsafe = true): ?PropertyEntity { @@ -696,7 +654,6 @@ public function getPropertyEntity(string $propertyName, bool $unsafe = true): ?P * @throws DependencyException * @throws InvalidConfigurationParameterException * @throws NotFoundException - * @throws ReflectionException */ public function getMethodEntityCollection(): MethodEntityCollection { @@ -717,7 +674,6 @@ public function getMethodEntityCollection(): MethodEntityCollection * @throws NotFoundException * @throws DependencyException * @throws InvalidConfigurationParameterException - * @throws ReflectionException */ public function getMethodEntity(string $methodName, bool $unsafe = true): ?MethodEntity { @@ -730,7 +686,6 @@ public function getMethodEntity(string $methodName, bool $unsafe = true): ?Metho /** * @throws NotFoundException - * @throws ReflectionException * @throws DependencyException * @throws InvalidConfigurationParameterException */ @@ -741,27 +696,61 @@ public function getDescription(): string } /** - * @throws ReflectionException * @throws InvalidConfigurationParameterException */ #[CacheableMethod] public function isEnum(): bool { - return $this->getReflection()->isEnum(); + return $this->getAst() instanceof EnumNode; } /** - * @throws ReflectionException * @throws InvalidConfigurationParameterException + * @throws ConstExprEvaluationException */ #[CacheableMethod] public function getCasesNames(): array { - $caseNames = []; - if ($this->isEnum()) { - foreach ($this->getReflection()->getCases() as $case) { - $caseNames[] = $case->getName(); - } + return array_keys($this->getEnumCases()); + } + + /** + * @throws InvalidConfigurationParameterException + * @throws ConstExprEvaluationException + */ + #[CacheableMethod] public function getEnumCases(): array + { + if (!$this->entityDataCanBeLoaded() || !$this->isEnum()) { + return []; + } + + $enumCases = []; + /** @var EnumCaseNode[] $enumCaseNodes */ + $enumCaseNodes = array_filter( + $this->getAst()->stmts, + static fn(Node\Stmt $stmt): bool => $stmt instanceof EnumCaseNode, + ); + + foreach ($enumCaseNodes as $enumCaseNode) { + $enumCases[$enumCaseNode->name->toString()] = $enumCaseNode->expr ? NodeValueCompiler::compile($enumCaseNode->expr, $this) : null; } - return $caseNames; + return $enumCases; + } + + /** + * @throws InvalidConfigurationParameterException + * @throws ConstExprEvaluationException + */ + #[CacheableMethod] public function getEnumCaseValue(string $name): mixed + { + return $this->getEnumCases()[$name] ?? null; + } + /** + * Returns the absolute path to a file if it can be retrieved and if the file is in the project directory + * @throws InvalidConfigurationParameterException + */ + public function getAbsoluteFileName(): ?string + { + $relativeFileName = $this->getRelativeFileName(); + return $relativeFileName ? $this->configuration->getProjectRoot() . $relativeFileName : null; } /** @@ -780,86 +769,242 @@ public function getFileContent(): string } /** - * @throws ReflectionException * @throws InvalidConfigurationParameterException */ - #[CacheableMethod] public function getMethodsData(): array - { + #[CacheableMethod] public function getMethodsData( + bool $onlyFromCurrentClassAndTraits = false, + int $flags = MethodEntity::VISIBILITY_MODIFIERS_FLAG_ANY + ): array { + if (!$this->entityDataCanBeLoaded()) { + return []; + } $methods = []; - // todo use ast - foreach ($this->getReflection()->getMethods() as $method) { - $name = $method->getName(); - $methods[$name] = $method->getLocatedSource()->getName(); + /** @var MethodNode[] $methodNodes */ + $methodNodes = array_filter( + $this->getAst()->stmts, + static fn(Node\Stmt $stmt): bool => $stmt instanceof MethodNode, + ); + array_walk($methodNodes, fn(MethodNode $stmt) => $stmt->flags = $stmt->flags ?: MethodEntity::MODIFIERS_FLAG_IS_PUBLIC); + foreach ($methodNodes as $methodNode) { + if (($methodNode->flags & $flags) === 0) { + continue; + } + $methods[$methodNode->name->toString()] = $this->getName(); } + + $flags &= ~ MethodEntity::MODIFIERS_FLAG_IS_PRIVATE; + foreach ($this->getTraits() as $traitEntity) { + if (!$traitEntity->entityDataCanBeLoaded()) { + continue; + } + foreach ($traitEntity->getMethodsData(true, $flags) as $name => $methodsData) { + if (array_key_exists($name, $methods)) { + continue; + } + $methods[$name] = $methodsData; + } + } + + if (!$onlyFromCurrentClassAndTraits) { + foreach ($this->getParentClassEntities() as $parentClassEntity) { + if (!$parentClassEntity->entityDataCanBeLoaded()) { + continue; + } + foreach ($parentClassEntity->getMethodsData(true, $flags) as $name => $methodsData) { + if (array_key_exists($name, $methods)) { + continue; + } + $methods[$name] = $methodsData; + } + } + + foreach ($this->getInterfacesEntities() as $interfacesEntity) { + if (!$interfacesEntity->entityDataCanBeLoaded()) { + continue; + } + foreach ($interfacesEntity->getMethodsData(true, $flags) as $name => $methodsData) { + if (array_key_exists($name, $methods)) { + continue; + } + $methods[$name] = $methodsData; + } + } + } + return $methods; } /** - * @throws ReflectionException * @throws InvalidConfigurationParameterException */ - #[CacheableMethod] public function getPropertiesData(): array - { + #[CacheableMethod] public function getPropertiesData( + bool $onlyFromCurrentClassAndTraits = false, + int $flags = PropertyEntity::VISIBILITY_MODIFIERS_FLAG_ANY + ): array { + if (!$this->entityDataCanBeLoaded()) { + return []; + } $properties = []; - foreach ($this->getReflection()->getProperties() as $property) { - $name = $property->getName(); - $properties[$name] = $property->getImplementingClass()->getName(); + /** @var PropertyNode[] $propertyNodes */ + $propertyNodes = array_filter( + $this->getAst()->stmts, + static fn(Node\Stmt $stmt): bool => $stmt instanceof PropertyNode, + ); + array_walk($propertyNodes, fn(PropertyNode $stmt) => $stmt->flags = $stmt->flags ?: PropertyEntity::MODIFIERS_FLAG_IS_PUBLIC); + foreach ($propertyNodes as $node) { + if (($node->flags & $flags) === 0) { + continue; + } + foreach ($node->props as $propertyNode) { + $properties[$propertyNode->name->toString()] = $this->getName(); + } + } + + $flags &= ~ PropertyEntity::MODIFIERS_FLAG_IS_PRIVATE; + foreach ($this->getTraits() as $traitEntity) { + foreach ($traitEntity->getPropertiesData(true, $flags) as $name => $propertyData) { + if (!$traitEntity->entityDataCanBeLoaded()) { + continue; + } + if (array_key_exists($name, $properties)) { + continue; + } + $properties[$name] = $propertyData; + } + } + if (!$onlyFromCurrentClassAndTraits) { + foreach ($this->getParentClassEntities() as $parentClassEntity) { + if (!$parentClassEntity->entityDataCanBeLoaded()) { + continue; + } + foreach ($parentClassEntity->getPropertiesData(true, $flags) as $name => $propertyData) { + if (array_key_exists($name, $properties)) { + continue; + } + $properties[$name] = $propertyData; + } + } } return $properties; } /** - * @throws ReflectionException * @throws InvalidConfigurationParameterException */ - #[CacheableMethod] public function getConstantsData(): array - { + #[CacheableMethod] public function getConstantsData( + bool $onlyFromCurrentClassAndTraits = false, + int $flags = ConstantEntity::VISIBILITY_MODIFIERS_FLAG_ANY + ): array { + if (!$this->entityDataCanBeLoaded()) { + return []; + } $constants = []; - foreach ($this->getReflection()->getReflectionConstants() as $constant) { - $name = $constant->getName(); - $constants[$name] = $constant->getImplementingClass()->getName(); + /** @var ConstNode[] $constNodes */ + $constNodes = array_filter( + $this->getAst()->stmts, + static fn(Node\Stmt $stmt): bool => $stmt instanceof ConstNode, + ); + array_walk($constNodes, fn(ConstNode $stmt) => $stmt->flags = $stmt->flags ?: ConstantEntity::MODIFIERS_FLAG_IS_PUBLIC); + foreach ($constNodes as $constNode) { + if (($constNode->flags & $flags) === 0) { + continue; + } + foreach ($constNode->consts as $constant) { + $constants[$constant->name->toString()] = $this->getName(); + } + } + + $flags &= ~ ConstantEntity::MODIFIERS_FLAG_IS_PRIVATE; + foreach ($this->getTraits() as $traitEntity) { + if (!$traitEntity->entityDataCanBeLoaded()) { + continue; + } + foreach ($traitEntity->getConstantsData(true, $flags) as $name => $constantsData) { + if (array_key_exists($name, $constants)) { + continue; + } + $constants[$name] = $constantsData; + } + } + + if (!$onlyFromCurrentClassAndTraits) { + foreach ($this->getParentClassEntities() as $parentClassEntity) { + if (!$parentClassEntity->entityDataCanBeLoaded()) { + continue; + } + foreach ($parentClassEntity->getConstantsData(true, $flags) as $name => $constantsData) { + if (array_key_exists($name, $constants)) { + continue; + } + $constants[$name] = $constantsData; + } + } + + foreach ($this->getInterfacesEntities() as $interfacesEntity) { + if (!$interfacesEntity->entityDataCanBeLoaded()) { + continue; + } + foreach ($interfacesEntity->getConstantsData(true, $flags) as $name => $constantsData) { + if (array_key_exists($name, $constants)) { + continue; + } + $constants[$name] = $constantsData; + } + } } return $constants; } /** - * @throws ReflectionException * @throws InvalidConfigurationParameterException */ #[CacheableMethod] public function isInstantiable(): bool { - return $this->getReflection()->isInstantiable(); + if ($this->isAbstract()) { + return false; + } + + if ($this->isInterface()) { + return false; + } + + if ($this->isTrait()) { + return false; + } + + return $this->getAst()->getMethod('__construct')?->isPublic() ?? true; } /** - * @throws ReflectionException * @throws InvalidConfigurationParameterException */ #[CacheableMethod] public function isAbstract(): bool { - return $this->getReflection()->isAbstract(); + $ast = $this->getAst(); + if (!method_exists($ast, 'isAbstract')) { + return false; + } + return $ast->isAbstract(); } /** - * @throws ReflectionException * @throws InvalidConfigurationParameterException */ #[CacheableMethod] public function isInterface(): bool { - return $this->getReflection()->getAst() instanceof InterfaceNode; + return $this->getAst() instanceof InterfaceNode; } /** - * @throws ReflectionException + * @throws \RuntimeException * @throws InvalidConfigurationParameterException */ #[CacheableMethod] public function isTrait(): bool { - return $this->getReflection()->isTrait(); + return $this->getAst() instanceof TraitNode; } /** - * @throws ReflectionException * @throws InvalidConfigurationParameterException */ public function hasMethod(string $method): bool @@ -868,7 +1013,6 @@ public function hasMethod(string $method): bool } /** - * @throws ReflectionException * @throws InvalidConfigurationParameterException */ public function hasProperty(string $property): bool @@ -877,16 +1021,14 @@ public function hasProperty(string $property): bool } /** - * @throws ReflectionException * @throws InvalidConfigurationParameterException */ - public function hasConstant(string $constant): bool + public function hasConstant(string $constantName): bool { - return array_key_exists($constant, $this->getConstantsData()); + return array_key_exists($constantName, $this->getConstantsData(true)); } /** - * @throws ReflectionException * @throws InvalidConfigurationParameterException */ public function isSubclassOf(string $className): bool @@ -903,16 +1045,49 @@ public function isSubclassOf(string $className): bool } /** - * @throws ReflectionException + * @throws ConstExprEvaluationException * @throws InvalidConfigurationParameterException */ #[CacheableMethod] public function getConstant(string $name): string|array|int|bool|null|float { - return $this->getReflection()->getConstant($name); + // todo return constant entity + foreach ($this->getAst()->getConstants() as $node) { + foreach ($node->consts as $constantNode) { + if ($name === $constantNode->name->toString()) { + return NodeValueCompiler::compile($constantNode->value, $this); + } + } + } + return null; + } + + /** + * @throws ConstExprEvaluationException + * @throws InvalidConfigurationParameterException + */ + #[CacheableMethod] public function getConstantValue( + string $name, + bool $onlyFromCurrentClassAndTraits = false + ): string|array|int|bool|null|float { + $constants = $this->getConstantsData($onlyFromCurrentClassAndTraits); + $entity = $this; + if (array_key_exists($name, $constants) && $constants[$name] !== $this->getName()) { + $entity = $this->getRootEntityCollection()->getLoadedOrCreateNew($constants[$name]); + } + if (!$entity->entityDataCanBeLoaded()) { + return null; + } + foreach ($entity->getAst()->getConstants() as $node) { + foreach ($node->consts as $constantNode) { + if ($name === $constantNode->name->toString()) { + return NodeValueCompiler::compile($constantNode->value, $this); + } + } + } + return null; } /** - * @throws ReflectionException * @throws InvalidConfigurationParameterException */ public function implementsInterface(string $interfaceName): bool @@ -926,7 +1101,6 @@ public function implementsInterface(string $interfaceName): bool } /** - * @throws ReflectionException * @throws InvalidConfigurationParameterException */ public function hasParentClass(string $parentClassName): bool @@ -940,12 +1114,16 @@ public function hasParentClass(string $parentClassName): bool } /** - * @throws ReflectionException * @throws InvalidConfigurationParameterException + * @throws ConstExprEvaluationException */ #[CacheableMethod] public function getConstants(): array { - return $this->getReflection()->getImmediateConstants(); + $constants = []; + foreach ($this->getConstantsData(true) as $name => $data) { + $constants[$name] = $this->getConstantValue($name); + } + return $constants; } /** @@ -970,7 +1148,6 @@ public function getDocRender(): EntityDocRendererInterface } /** - * @throws ReflectionException * @throws DependencyException * @throws NotFoundException * @throws InvalidConfigurationParameterException diff --git a/src/LanguageHandler/Php/Parser/Entity/ClassEntityCollection.php b/src/LanguageHandler/Php/Parser/Entity/ClassEntityCollection.php index 1b14337a..51a66b1e 100644 --- a/src/LanguageHandler/Php/Parser/Entity/ClassEntityCollection.php +++ b/src/LanguageHandler/Php/Parser/Entity/ClassEntityCollection.php @@ -11,15 +11,22 @@ use BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException; use BumbleDocGen\Core\Parser\Entity\LoggableRootEntityCollection; use BumbleDocGen\Core\Plugin\PluginEventDispatcher; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Ast\PhpParserHelper; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Cache\CacheablePhpEntityFactory; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException; -use BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper; use BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings; use BumbleDocGen\LanguageHandler\Php\Plugin\Event\Parser\AfterLoadingClassEntityCollection; use BumbleDocGen\LanguageHandler\Php\Plugin\Event\Parser\OnAddClassEntityToCollection; use BumbleDocGen\LanguageHandler\Php\Renderer\EntityDocRenderer\EntityDocRendererHelper; use DI\DependencyException; use DI\NotFoundException; +use PhpParser\Node\Stmt\Class_ as ClassNode; +use PhpParser\Node\Stmt\Enum_ as EnumNode; +use PhpParser\Node\Stmt\Interface_ as InterfaceNode; +use PhpParser\Node\Stmt\Namespace_; +use PhpParser\Node\Stmt\Trait_ as TraitNode; +use PhpParser\NodeTraverser; +use PhpParser\NodeVisitor\NameResolver; +use Psr\Cache\InvalidArgumentException; use Psr\Log\LoggerInterface; use Symfony\Component\Console\Style\OutputStyle; @@ -35,14 +42,14 @@ final class ClassEntityCollection extends LoggableRootEntityCollection public function __construct( private Configuration $configuration, private PhpHandlerSettings $phpHandlerSettings, - private ParserHelper $parserHelper, private PluginEventDispatcher $pluginEventDispatcher, private CacheablePhpEntityFactory $cacheablePhpEntityFactory, private EntityDocRendererHelper $docRendererHelper, + private PhpParserHelper $phpParserHelper, private LocalObjectCache $localObjectCache, private ProgressBarFactory $progressBarFactory, private OutputStyle $io, - private LoggerInterface $logger + private LoggerInterface $logger, ) { parent::__construct(); } @@ -58,9 +65,9 @@ public function getEntityCollectionName(): string } /** - * @throws NotFoundException + * @throws InvalidArgumentException * @throws DependencyException - * @throws ReflectionException + * @throws NotFoundException * @throws InvalidConfigurationParameterException */ public function loadClassEntities(): void @@ -71,21 +78,42 @@ public function loadClassEntities(): void $allFiles = iterator_to_array($this->configuration->getSourceLocators()->getCommonFinder()->files()); $addedFilesCount = 0; + + $nodeTraverser = new NodeTraverser(); + $nodeTraverser->addVisitor(new NameResolver()); + $phpParser = $this->phpParserHelper->phpParser(); + foreach ($pb->iterate($allFiles) as $file) { $pathName = $file->getPathName(); + $nodes = $phpParser->parse(file_get_contents($pathName)); + $nodes = $nodeTraverser->traverse($nodes); $relativeFileName = str_replace($this->configuration->getProjectRoot(), '', $pathName); $pb->setStepDescription("Processing `{$relativeFileName}` file"); - $className = $this->parserHelper->getClassFromFile($pathName); - if ($className) { - $relativeFileName = str_replace($this->configuration->getProjectRoot(), '', $file->getPathName()); - $classEntity = $this->cacheablePhpEntityFactory->createClassEntity( - $this, - ltrim($className, '\\'), - $relativeFileName - ); - if ($classEntityFilter->canAddToCollection($classEntity)) { - $this->add($classEntity); - ++$addedFilesCount; + foreach ($nodes as $node) { + if (!$node instanceof Namespace_) { + continue; + } + $namespaceName = $node->name->toString(); + foreach ($node->stmts as $subNode) { + if (!in_array(get_class($subNode), [ClassNode::class, InterfaceNode::class, TraitNode::class, EnumNode::class])) { + continue; + } + $className = $subNode->name->toString(); + $classEntity = $this->cacheablePhpEntityFactory->createClassEntity( + $this, + "{$namespaceName}\\{$className}", + $relativeFileName + ); + + // todo + if ($classEntity->entityCacheIsOutdated()) { + $classEntity->setCustomAst($subNode); + } + + if ($classEntityFilter->canAddToCollection($classEntity)) { + $this->add($classEntity); + ++$addedFilesCount; + } } } } @@ -106,7 +134,6 @@ public function loadClassEntities(): void /** * @throws InvalidConfigurationParameterException - * @throws Exception\ReflectionException */ public function add(ClassEntity $classEntity, bool $reload = false): ClassEntityCollection { @@ -159,7 +186,6 @@ public function getEntityByClassName(string $className, bool $createIfNotExists /** * @param string[] $interfaces * - * @throws ReflectionException * @throws InvalidConfigurationParameterException */ public function filterByInterfaces(array $interfaces): ClassEntityCollection @@ -186,7 +212,6 @@ public function filterByInterfaces(array $interfaces): ClassEntityCollection } /** - * @throws ReflectionException * @throws InvalidConfigurationParameterException */ public function filterByParentClassNames(array $parentClassNames): ClassEntityCollection @@ -213,7 +238,6 @@ public function filterByParentClassNames(array $parentClassNames): ClassEntityCo } /** - * @throws ReflectionException * @throws InvalidConfigurationParameterException */ public function filterByPaths(array $paths): ClassEntityCollection @@ -247,7 +271,6 @@ public function filterByNameRegularExpression(string $regexPattern): ClassEntity } /** - * @throws ReflectionException * @throws InvalidConfigurationParameterException */ public function getOnlyInstantiable(): ClassEntityCollection @@ -263,7 +286,6 @@ public function getOnlyInstantiable(): ClassEntityCollection } /** - * @throws ReflectionException * @throws InvalidConfigurationParameterException */ public function getOnlyInterfaces(): ClassEntityCollection @@ -279,7 +301,6 @@ public function getOnlyInterfaces(): ClassEntityCollection } /** - * @throws ReflectionException * @throws InvalidConfigurationParameterException */ public function getOnlyTraits(): ClassEntityCollection @@ -295,7 +316,6 @@ public function getOnlyTraits(): ClassEntityCollection } /** - * @throws ReflectionException * @throws InvalidConfigurationParameterException */ public function getOnlyAbstractClasses(): ClassEntityCollection @@ -413,7 +433,6 @@ public function internalFindEntity(string $search, bool $useUnsafeKeys = true): /** * @inheritDoc - * @throws ReflectionException * @throws InvalidConfigurationParameterException */ public function getEntityLinkData( From 040e9df358e995fea902c181ae091befeffb9b95 Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Fri, 10 Nov 2023 17:43:16 +0300 Subject: [PATCH 027/210] Removing old reflector wrapper --- .../Entity/Reflection/ReflectorWrapper.php | 134 ------------------ 1 file changed, 134 deletions(-) delete mode 100644 src/LanguageHandler/Php/Parser/Entity/Reflection/ReflectorWrapper.php diff --git a/src/LanguageHandler/Php/Parser/Entity/Reflection/ReflectorWrapper.php b/src/LanguageHandler/Php/Parser/Entity/Reflection/ReflectorWrapper.php deleted file mode 100644 index e650c6aa..00000000 --- a/src/LanguageHandler/Php/Parser/Entity/Reflection/ReflectorWrapper.php +++ /dev/null @@ -1,134 +0,0 @@ -reflector) { - $sourceLocatorsCollection = $this->pluginEventDispatcher->dispatch( - new OnLoadSourceLocatorsCollection($this->configuration->getSourceLocators()) - )->getSourceLocatorsCollection(); - - $locator = $this->betterReflection->astLocator(); - - foreach ($sourceLocatorsCollection as $sourceLocator) { - if (is_a($sourceLocator, CustomSourceLocatorInterface::class, true)) { - $sourceLocators[] = $sourceLocator->getSourceLocator($locator); - } - } - - if (!$this->phpHandlerSettings->asyncSourceLoadingEnabled()) { - $sourceLocators[] = new \Roave\BetterReflection\SourceLocator\Type\FileIteratorSourceLocator( - new \ArrayIterator(iterator_to_array($sourceLocatorsCollection->getCommonFinder()->getIterator())), - $locator - ); - } - $sourceLocators[] = $this->betterReflection->sourceLocator(); - $sourceLocator = new CachedSourceLocator( - new AggregateSourceLocator($sourceLocators), - $this->configuration, - $this->sourceLocatorCache - ); - $this->reflector = new DefaultReflector($sourceLocator); - } - return $this->reflector; - } - - /** - * @throws DependencyException - * @throws NotFoundException - * @throws InvalidConfigurationParameterException - */ - public function reflectClass(string $identifierName): ReflectionClass - { - return $this->getReflector()->reflectClass($identifierName); - } - - /** - * @throws DependencyException - * @throws InvalidConfigurationParameterException - * @throws NotFoundException - */ - public function reflectAllClasses(): iterable - { - return $this->getReflector()->reflectAllClasses(); - } - - /** - * @throws DependencyException - * @throws NotFoundException - * @throws InvalidConfigurationParameterException - */ - public function reflectFunction(string $identifierName): ReflectionFunction - { - return $this->getReflector()->reflectFunction($identifierName); - } - - /** - * @throws DependencyException - * @throws InvalidConfigurationParameterException - * @throws NotFoundException - */ - public function reflectAllFunctions(): iterable - { - return $this->getReflector()->reflectAllFunctions(); - } - - /** - * @throws DependencyException - * @throws InvalidConfigurationParameterException - * @throws NotFoundException - */ - public function reflectConstant(string $identifierName): ReflectionConstant - { - return $this->getReflector()->reflectConstant($identifierName); - } - - /** - * @throws DependencyException - * @throws InvalidConfigurationParameterException - * @throws NotFoundException - */ - public function reflectAllConstants(): iterable - { - return $this->getReflector()->reflectAllConstants(); - } -} From 22d5efe98382ca8fc5fdd8cfeb50c6331adbc74e Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Fri, 10 Nov 2023 17:46:59 +0300 Subject: [PATCH 028/210] Removing old source locators --- .../SourceLocator/AsyncSourceLocator.php | 42 ----- .../CustomSourceLocatorInterface.php | 13 -- .../Internal/CachedSourceLocator.php | 154 ------------------ .../Internal/SystemAsyncSourceLocator.php | 73 --------- 4 files changed, 282 deletions(-) delete mode 100644 src/LanguageHandler/Php/Parser/SourceLocator/AsyncSourceLocator.php delete mode 100644 src/LanguageHandler/Php/Parser/SourceLocator/CustomSourceLocatorInterface.php delete mode 100644 src/LanguageHandler/Php/Parser/SourceLocator/Internal/CachedSourceLocator.php delete mode 100644 src/LanguageHandler/Php/Parser/SourceLocator/Internal/SystemAsyncSourceLocator.php diff --git a/src/LanguageHandler/Php/Parser/SourceLocator/AsyncSourceLocator.php b/src/LanguageHandler/Php/Parser/SourceLocator/AsyncSourceLocator.php deleted file mode 100644 index 4fb56381..00000000 --- a/src/LanguageHandler/Php/Parser/SourceLocator/AsyncSourceLocator.php +++ /dev/null @@ -1,42 +0,0 @@ -localObjectCache, - $this->psr4FileMap, - $this->classMap, - ); - } -} diff --git a/src/LanguageHandler/Php/Parser/SourceLocator/CustomSourceLocatorInterface.php b/src/LanguageHandler/Php/Parser/SourceLocator/CustomSourceLocatorInterface.php deleted file mode 100644 index cd53a900..00000000 --- a/src/LanguageHandler/Php/Parser/SourceLocator/CustomSourceLocatorInterface.php +++ /dev/null @@ -1,13 +0,0 @@ - indexed by reflector key and identifier cache key */ - private array $cacheByIdentifierKeyAndOid = []; - - /** @var array> indexed by reflector key and identifier type cache key */ - private array $cacheByIdentifierTypeKeyAndOid = []; - - public function __construct( - private SourceLocator $sourceLocator, - private Configuration $configuration, - private SourceLocatorCacheItemPool $cache - ) { - } - - /** - * @throws InvalidArgumentException - * @throws InvalidConfigurationParameterException - */ - public function locateIdentifier(Reflector $reflector, Identifier $identifier): ?Reflection - { - $cacheKey = $this->identifierToCacheKey($identifier); - if (array_key_exists($cacheKey, $this->cacheByIdentifierKeyAndOid)) { - return $this->cacheByIdentifierKeyAndOid[$cacheKey]; - } - - $locateIdentifier = null; - if ($this->cache->hasItem($cacheKey)) { - $cachedData = $this->cache->getItem($cacheKey)->get(); - - $actualFileName = null; - if ($cachedData['fileName']) { - $actualFileName = $this->configuration->getProjectRoot() . $cachedData['fileName']; - } - - if ( - (!$actualFileName || - file_exists($actualFileName) && md5_file($actualFileName) === $cachedData['fileHash']) && - isset($cachedData['locatedSourceSource']) && isset($cachedData['locatedSourceName']) - ) { - $locatedSource = new LocatedSource( - $cachedData['locatedSourceSource'], - $cachedData['locatedSourceName'], - $actualFileName - ); - - $locateIdentifier = $cachedData['className']::createFromNode( - $reflector, - $cachedData['node'], - $locatedSource, - $cachedData['namespaceAst'] - ); - } else { - $this->cache->deleteItem($cacheKey); - } - } - - if (is_null($locateIdentifier)) { - $locateIdentifier = $this->sourceLocator->locateIdentifier($reflector, $identifier); - if (is_a($locateIdentifier, ReflectionClass::class)) { - $node = $locateIdentifier->getAst(); - $locatedSource = $locateIdentifier->getLocatedSource(); - $namespaceAst = $locateIdentifier->getDeclaringNamespaceAst(); - $className = get_class($locateIdentifier); - $cacheItem = $this->cache->getItem($cacheKey); - $actualFileName = $locateIdentifier->getFileName() ? str_replace($this->configuration->getProjectRoot(), '', $locateIdentifier->getFileName()) : null; - $cacheItem->set([ - 'className' => $className, - 'node' => $node, - 'locatedSource' => $locatedSource, - 'namespaceAst' => $namespaceAst, - 'fileName' => $actualFileName, - 'locatedSourceName' => $locateIdentifier->getLocatedSource()->getName(), - 'locatedSourceSource' => $locateIdentifier->getLocatedSource()->getSource(), - 'fileHash' => $locateIdentifier->getFileName() ? md5_file($locateIdentifier->getFileName()) : null, - ]); - if (!$locateIdentifier->getFileName()) { - $cacheItem->expiresAfter(604800); - } - $this->cache->save($cacheItem); - } - } - return $this->cacheByIdentifierKeyAndOid[$cacheKey] = $locateIdentifier; - } - - public function locateIdentifiersByType(Reflector $reflector, IdentifierType $identifierType): array - { - $cacheKey = sprintf( - '%s_%s', - $this->reflectorCacheKey($reflector), - $this->identifierTypeToCacheKey($identifierType) - ); - - if (array_key_exists($cacheKey, $this->cacheByIdentifierTypeKeyAndOid)) { - return $this->cacheByIdentifierTypeKeyAndOid[$cacheKey]; - } - - return $this->cacheByIdentifierTypeKeyAndOid[$cacheKey] = $this->sourceLocator->locateIdentifiersByType( - $reflector, - $identifierType - ); - } - - private function reflectorCacheKey(Reflector $reflector): string - { - return sprintf('type:%s#oid:%s', $reflector::class, spl_object_hash($reflector)); - } - - private function identifierToCacheKey(Identifier $identifier): string - { - $nameElements = explode('\\', $identifier->getName()); - $name = array_pop($nameElements); - return str_replace( - ['\\', '/'], - '_', - sprintf( - '%s' . DIRECTORY_SEPARATOR . '%s_name_%s', - implode(DIRECTORY_SEPARATOR, $nameElements), - $this->identifierTypeToCacheKey($identifier->getType()), - $name, - ) - ); - } - - private function identifierTypeToCacheKey(IdentifierType $identifierType): string - { - return sprintf('type_%s', $identifierType->getName()); - } -} diff --git a/src/LanguageHandler/Php/Parser/SourceLocator/Internal/SystemAsyncSourceLocator.php b/src/LanguageHandler/Php/Parser/SourceLocator/Internal/SystemAsyncSourceLocator.php deleted file mode 100644 index 1a5b1a61..00000000 --- a/src/LanguageHandler/Php/Parser/SourceLocator/Internal/SystemAsyncSourceLocator.php +++ /dev/null @@ -1,73 +0,0 @@ -isClass()) { - return null; - } - return $this->getLocatedSource($identifier->getName()); - } - - public function getClassLoader(array $psr4FileMap, array $classMap): ClassLoader - { - $key = md5(serialize($psr4FileMap) . serialize($classMap)); - try { - return $this->localObjectCache->getMethodCachedResult(__METHOD__, $key); - } catch (ObjectNotFoundException) { - } - $classLoader = new ClassLoader(); - foreach ($psr4FileMap as $prefix => $path) { - $classLoader->addPsr4($prefix, $path); - } - $classLoader->addClassMap($classMap); - $this->localObjectCache->cacheMethodResult(__METHOD__, $key, $classLoader); - return $classLoader; - } - - public function getLocatedSource(string $className): ?LocatedSource - { - $classLoader = $this->getClassLoader($this->psr4FileMap, $this->classMap); - if ($fileName = $classLoader->findFile($className)) { - return new LocatedSource( - file_get_contents($fileName), - $className, - $fileName - ); - } - return null; - } -} From 9f395a0cb55ee47e34dd9b2bbd837b69f81b0022 Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Fri, 10 Nov 2023 17:48:34 +0300 Subject: [PATCH 029/210] Removing old data --- .../TwigFilterClassParserPlugin.php | 9 +++------ .../TwigFunctionClassParserPlugin.php | 6 ------ .../FindEntitiesClassesByCollectionClassName.php | 2 -- .../PrintClassCollectionAsGroupedTable.php | 2 -- 4 files changed, 3 insertions(+), 16 deletions(-) diff --git a/selfdoc/Plugin/TwigFilterClassParser/TwigFilterClassParserPlugin.php b/selfdoc/Plugin/TwigFilterClassParser/TwigFilterClassParserPlugin.php index edb43e63..23330990 100644 --- a/selfdoc/Plugin/TwigFilterClassParser/TwigFilterClassParserPlugin.php +++ b/selfdoc/Plugin/TwigFilterClassParser/TwigFilterClassParserPlugin.php @@ -12,7 +12,6 @@ use BumbleDocGen\Core\Renderer\Twig\Filter\CustomFilterInterface; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException; use BumbleDocGen\LanguageHandler\Php\Plugin\Event\Parser\AfterLoadingClassEntityCollection; use BumbleDocGen\LanguageHandler\Php\Renderer\EntityDocRenderer\PhpClassToMd\PhpClassToMdDocRenderer; use DI\DependencyException; @@ -42,7 +41,6 @@ public static function getSubscribedEvents(): array } /** - * @throws ReflectionException * @throws InvalidConfigurationParameterException */ public function onLoadEntityDocPluginContentEvent(OnLoadEntityDocPluginContent $event): void @@ -71,7 +69,6 @@ public function onLoadEntityDocPluginContentEvent(OnLoadEntityDocPluginContent $ /** * @throws NotFoundException - * @throws ReflectionException * @throws DependencyException * @throws InvalidConfigurationParameterException */ @@ -88,12 +85,14 @@ public function afterLoadingClassEntityCollection(AfterLoadingClassEntityCollect } /** - * @throws ReflectionException * @throws InvalidConfigurationParameterException */ private function isCustomTwigFilter(ClassEntity $classEntity): bool { foreach (self::TWIG_FILTER_DIR_NAMES as $dirName) { + if (!$classEntity->entityDataCanBeLoaded()) { + continue; + } if (str_starts_with($classEntity->getFileName(), $dirName) && $classEntity->implementsInterface(CustomFilterInterface::class)) { return true; } @@ -104,7 +103,6 @@ private function isCustomTwigFilter(ClassEntity $classEntity): bool /** * @throws NotFoundException * @throws DependencyException - * @throws ReflectionException * @throws InvalidConfigurationParameterException */ private function getAllUsedFilters(): array @@ -125,7 +123,6 @@ private function getAllUsedFilters(): array /** * @throws DependencyException - * @throws ReflectionException * @throws NotFoundException * @throws InvalidConfigurationParameterException */ diff --git a/selfdoc/Plugin/TwigFunctionClassParser/TwigFunctionClassParserPlugin.php b/selfdoc/Plugin/TwigFunctionClassParser/TwigFunctionClassParserPlugin.php index 0ae14e07..7a8a1f5e 100644 --- a/selfdoc/Plugin/TwigFunctionClassParser/TwigFunctionClassParserPlugin.php +++ b/selfdoc/Plugin/TwigFunctionClassParser/TwigFunctionClassParserPlugin.php @@ -12,7 +12,6 @@ use BumbleDocGen\Core\Renderer\Twig\Function\CustomFunctionInterface; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException; use BumbleDocGen\LanguageHandler\Php\Plugin\Event\Parser\AfterLoadingClassEntityCollection; use BumbleDocGen\LanguageHandler\Php\Renderer\EntityDocRenderer\PhpClassToMd\PhpClassToMdDocRenderer; use DI\DependencyException; @@ -42,7 +41,6 @@ public static function getSubscribedEvents(): array } /** - * @throws ReflectionException * @throws InvalidConfigurationParameterException */ public function onLoadEntityDocPluginContentEvent(OnLoadEntityDocPluginContent $event): void @@ -70,7 +68,6 @@ public function onLoadEntityDocPluginContentEvent(OnLoadEntityDocPluginContent $ /** * @throws NotFoundException * @throws DependencyException - * @throws ReflectionException * @throws InvalidConfigurationParameterException */ public function afterLoadingClassEntityCollection(AfterLoadingClassEntityCollection $event): void @@ -86,7 +83,6 @@ public function afterLoadingClassEntityCollection(AfterLoadingClassEntityCollect } /** - * @throws ReflectionException * @throws InvalidConfigurationParameterException */ private function isCustomTwigFunction(ClassEntity $classEntity): bool @@ -102,7 +98,6 @@ private function isCustomTwigFunction(ClassEntity $classEntity): bool /** * @throws NotFoundException * @throws DependencyException - * @throws ReflectionException * @throws InvalidConfigurationParameterException */ private function getAllUsedFunctions(): array @@ -122,7 +117,6 @@ private function getAllUsedFunctions(): array } /** - * @throws ReflectionException * @throws DependencyException * @throws NotFoundException * @throws InvalidConfigurationParameterException diff --git a/selfdoc/Twig/CustomFunction/FindEntitiesClassesByCollectionClassName.php b/selfdoc/Twig/CustomFunction/FindEntitiesClassesByCollectionClassName.php index 4d99893d..e11f8c17 100644 --- a/selfdoc/Twig/CustomFunction/FindEntitiesClassesByCollectionClassName.php +++ b/selfdoc/Twig/CustomFunction/FindEntitiesClassesByCollectionClassName.php @@ -9,7 +9,6 @@ use BumbleDocGen\Core\Renderer\Twig\Function\CustomFunctionInterface; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException; use DI\DependencyException; use DI\NotFoundException; @@ -21,7 +20,6 @@ public function __construct(private RootEntityCollectionsGroup $rootEntityCollec /** * @return ClassEntity[] - * @throws ReflectionException * @throws DependencyException * @throws NotFoundException * @throws InvalidConfigurationParameterException diff --git a/selfdoc/Twig/CustomFunction/PrintClassCollectionAsGroupedTable.php b/selfdoc/Twig/CustomFunction/PrintClassCollectionAsGroupedTable.php index 1023f39e..e8ffcc31 100644 --- a/selfdoc/Twig/CustomFunction/PrintClassCollectionAsGroupedTable.php +++ b/selfdoc/Twig/CustomFunction/PrintClassCollectionAsGroupedTable.php @@ -8,7 +8,6 @@ use BumbleDocGen\Core\Renderer\Twig\Function\CustomFunctionInterface; use BumbleDocGen\Core\Renderer\Twig\Function\GetDocumentedEntityUrl; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException; use DI\DependencyException; use DI\NotFoundException; @@ -32,7 +31,6 @@ public static function getOptions(): array /** * @throws NotFoundException - * @throws ReflectionException * @throws DependencyException * @throws InvalidConfigurationParameterException */ From 54c3fb589cbe082998f58aecfce1e5337cc3d270 Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Fri, 10 Nov 2023 17:52:16 +0300 Subject: [PATCH 030/210] Removing old cache item pool --- src/Core/Cache/SourceLocatorCacheItemPool.php | 74 ------------------- 1 file changed, 74 deletions(-) delete mode 100644 src/Core/Cache/SourceLocatorCacheItemPool.php diff --git a/src/Core/Cache/SourceLocatorCacheItemPool.php b/src/Core/Cache/SourceLocatorCacheItemPool.php deleted file mode 100644 index 2bf7a473..00000000 --- a/src/Core/Cache/SourceLocatorCacheItemPool.php +++ /dev/null @@ -1,74 +0,0 @@ -cacheItemPool = new FilesystemAdapter( - 'sourceLocator', - 604800, - $configuration->getCacheDir() - ); - } - - public function getItem(string $key): CacheItemInterface - { - return $this->cacheItemPool->getItem($key); - } - - public function getItems(array $keys = []): iterable - { - return $this->cacheItemPool->getItems($keys); - } - - public function hasItem(string $key): bool - { - return $this->cacheItemPool->hasItem($key); - } - - public function clear(): bool - { - return $this->cacheItemPool->clear(); - } - - public function deleteItem(string $key): bool - { - return $this->cacheItemPool->deleteItem($key); - } - - public function deleteItems(array $keys): bool - { - return $this->cacheItemPool->deleteItems($keys); - } - - public function save(CacheItemInterface $item): bool - { - return $this->cacheItemPool->save($item); - } - - public function saveDeferred(CacheItemInterface $item): bool - { - return $this->cacheItemPool->saveDeferred($item); - } - - public function commit(): bool - { - return $this->cacheItemPool->commit(); - } -} From b69f0d10e93eecc5cee322daf009c1d9af2be2c9 Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Fri, 10 Nov 2023 17:52:36 +0300 Subject: [PATCH 031/210] Removing BetterReflection lib --- composer.json | 1 - composer.lock | 315 +++++------------- .../tech/4.pluginSystem/readme.md.twig | 1 - .../Context/Dependency/FileDependency.php | 1 - 4 files changed, 82 insertions(+), 236 deletions(-) diff --git a/composer.json b/composer.json index effb2fce..94feb643 100644 --- a/composer.json +++ b/composer.json @@ -21,7 +21,6 @@ "symfony/console": "^6.0", "symfony/finder": "^6.0", "twig/twig": "^3.3", - "roave/better-reflection": "^5.5", "nikic/php-parser": "^4.13", "phpdocumentor/reflection-docblock": "^5.3", "doctrine/annotations": "^1.13", diff --git a/composer.lock b/composer.lock index 3bac40c4..521c4e8d 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "86a6a7f6923c44c4dc1e5190ec5a3510", + "content-hash": "360432be120c210d9c2955b3eb6c731a", "packages": [ { "name": "bramus/ansi-php", @@ -684,66 +684,18 @@ }, "time": "2022-12-20T19:48:37+00:00" }, - { - "name": "jetbrains/phpstorm-stubs", - "version": "v2022.2", - "source": { - "type": "git", - "url": "https://github.com/JetBrains/phpstorm-stubs.git", - "reference": "01006d9854679672fc8b85c6d5063ea6f25226ac" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/JetBrains/phpstorm-stubs/zipball/01006d9854679672fc8b85c6d5063ea6f25226ac", - "reference": "01006d9854679672fc8b85c6d5063ea6f25226ac", - "shasum": "" - }, - "require-dev": { - "friendsofphp/php-cs-fixer": "@stable", - "nikic/php-parser": "@stable", - "php": "^8.0", - "phpdocumentor/reflection-docblock": "@stable", - "phpunit/phpunit": "@stable" - }, - "type": "library", - "autoload": { - "files": [ - "PhpStormStubsMap.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "Apache-2.0" - ], - "description": "PHP runtime & extensions header files for PhpStorm", - "homepage": "https://www.jetbrains.com/phpstorm", - "keywords": [ - "autocomplete", - "code", - "inference", - "inspection", - "jetbrains", - "phpstorm", - "stubs", - "type" - ], - "support": { - "source": "https://github.com/JetBrains/phpstorm-stubs/tree/v2022.2" - }, - "time": "2022-07-25T13:18:36+00:00" - }, { "name": "laravel/serializable-closure", - "version": "v1.3.1", + "version": "v1.3.2", "source": { "type": "git", "url": "https://github.com/laravel/serializable-closure.git", - "reference": "e5a3057a5591e1cfe8183034b0203921abe2c902" + "reference": "076fe2cf128bd54b4341cdc6d49b95b34e101e4c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/e5a3057a5591e1cfe8183034b0203921abe2c902", - "reference": "e5a3057a5591e1cfe8183034b0203921abe2c902", + "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/076fe2cf128bd54b4341cdc6d49b95b34e101e4c", + "reference": "076fe2cf128bd54b4341cdc6d49b95b34e101e4c", "shasum": "" }, "require": { @@ -790,20 +742,20 @@ "issues": "https://github.com/laravel/serializable-closure/issues", "source": "https://github.com/laravel/serializable-closure" }, - "time": "2023-07-14T13:56:28+00:00" + "time": "2023-10-17T13:38:16+00:00" }, { "name": "monolog/monolog", - "version": "2.9.1", + "version": "2.9.2", "source": { "type": "git", "url": "https://github.com/Seldaek/monolog.git", - "reference": "f259e2b15fb95494c83f52d3caad003bbf5ffaa1" + "reference": "437cb3628f4cf6042cc10ae97fc2b8472e48ca1f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/monolog/zipball/f259e2b15fb95494c83f52d3caad003bbf5ffaa1", - "reference": "f259e2b15fb95494c83f52d3caad003bbf5ffaa1", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/437cb3628f4cf6042cc10ae97fc2b8472e48ca1f", + "reference": "437cb3628f4cf6042cc10ae97fc2b8472e48ca1f", "shasum": "" }, "require": { @@ -880,7 +832,7 @@ ], "support": { "issues": "https://github.com/Seldaek/monolog/issues", - "source": "https://github.com/Seldaek/monolog/tree/2.9.1" + "source": "https://github.com/Seldaek/monolog/tree/2.9.2" }, "funding": [ { @@ -892,20 +844,20 @@ "type": "tidelift" } ], - "time": "2023-02-06T13:44:46+00:00" + "time": "2023-10-27T15:25:26+00:00" }, { "name": "nette/php-generator", - "version": "v4.1.0", + "version": "v4.1.2", "source": { "type": "git", "url": "https://github.com/nette/php-generator.git", - "reference": "8b728c622c49b196513c0f95508f2f66342d1e8f" + "reference": "abc0e79b2d02d4b8aba5933765b90df3f610c143" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nette/php-generator/zipball/8b728c622c49b196513c0f95508f2f66342d1e8f", - "reference": "8b728c622c49b196513c0f95508f2f66342d1e8f", + "url": "https://api.github.com/repos/nette/php-generator/zipball/abc0e79b2d02d4b8aba5933765b90df3f610c143", + "reference": "abc0e79b2d02d4b8aba5933765b90df3f610c143", "shasum": "" }, "require": { @@ -959,22 +911,22 @@ ], "support": { "issues": "https://github.com/nette/php-generator/issues", - "source": "https://github.com/nette/php-generator/tree/v4.1.0" + "source": "https://github.com/nette/php-generator/tree/v4.1.2" }, - "time": "2023-09-26T12:28:52+00:00" + "time": "2023-10-29T22:57:32+00:00" }, { "name": "nette/utils", - "version": "v4.0.2", + "version": "v4.0.3", "source": { "type": "git", "url": "https://github.com/nette/utils.git", - "reference": "cead6637226456b35e1175cc53797dd585d85545" + "reference": "a9d127dd6a203ce6d255b2e2db49759f7506e015" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nette/utils/zipball/cead6637226456b35e1175cc53797dd585d85545", - "reference": "cead6637226456b35e1175cc53797dd585d85545", + "url": "https://api.github.com/repos/nette/utils/zipball/a9d127dd6a203ce6d255b2e2db49759f7506e015", + "reference": "a9d127dd6a203ce6d255b2e2db49759f7506e015", "shasum": "" }, "require": { @@ -1045,9 +997,9 @@ ], "support": { "issues": "https://github.com/nette/utils/issues", - "source": "https://github.com/nette/utils/tree/v4.0.2" + "source": "https://github.com/nette/utils/tree/v4.0.3" }, - "time": "2023-09-19T11:58:07+00:00" + "time": "2023-10-29T21:02:13+00:00" }, { "name": "nikic/php-parser", @@ -1162,16 +1114,16 @@ }, { "name": "php-di/php-di", - "version": "7.0.5", + "version": "7.0.6", "source": { "type": "git", "url": "https://github.com/PHP-DI/PHP-DI.git", - "reference": "9ea40a5a6970bf1ca5cbe148bc16cbad6ca3db6c" + "reference": "8097948a89f6ec782839b3e958432f427cac37fd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHP-DI/PHP-DI/zipball/9ea40a5a6970bf1ca5cbe148bc16cbad6ca3db6c", - "reference": "9ea40a5a6970bf1ca5cbe148bc16cbad6ca3db6c", + "url": "https://api.github.com/repos/PHP-DI/PHP-DI/zipball/8097948a89f6ec782839b3e958432f427cac37fd", + "reference": "8097948a89f6ec782839b3e958432f427cac37fd", "shasum": "" }, "require": { @@ -1219,7 +1171,7 @@ ], "support": { "issues": "https://github.com/PHP-DI/PHP-DI/issues", - "source": "https://github.com/PHP-DI/PHP-DI/tree/7.0.5" + "source": "https://github.com/PHP-DI/PHP-DI/tree/7.0.6" }, "funding": [ { @@ -1231,7 +1183,7 @@ "type": "tidelift" } ], - "time": "2023-08-10T14:57:56+00:00" + "time": "2023-11-02T10:04:50+00:00" }, { "name": "phpdocumentor/reflection-common", @@ -1854,120 +1806,6 @@ }, "time": "2019-03-08T08:55:37+00:00" }, - { - "name": "roave/better-reflection", - "version": "5.11.1", - "source": { - "type": "git", - "url": "https://github.com/Roave/BetterReflection.git", - "reference": "84cdf580747c3d55238be28d5681e24e7d11e065" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Roave/BetterReflection/zipball/84cdf580747c3d55238be28d5681e24e7d11e065", - "reference": "84cdf580747c3d55238be28d5681e24e7d11e065", - "shasum": "" - }, - "require": { - "ext-json": "*", - "jetbrains/phpstorm-stubs": "2022.2", - "nikic/php-parser": "^4.15.1", - "php": "~8.0.12 || ~8.1.0 || ~8.2.0", - "roave/signature": "^1.6" - }, - "conflict": { - "thecodingmachine/safe": "<1.1.3" - }, - "require-dev": { - "doctrine/coding-standard": "^10.0.0", - "phpstan/phpstan": "^1.8.5", - "phpstan/phpstan-phpunit": "^1.1.1", - "phpunit/phpunit": "^9.5.24", - "roave/infection-static-analysis-plugin": "^1.23.0", - "vimeo/psalm": "^4.27" - }, - "suggest": { - "composer/composer": "Required to use the ComposerSourceLocator" - }, - "type": "library", - "autoload": { - "psr-4": { - "Roave\\BetterReflection\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "James Titcumb", - "email": "james@asgrim.com", - "homepage": "https://github.com/asgrim" - }, - { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com", - "homepage": "https://ocramius.github.io/" - }, - { - "name": "Gary Hockin", - "email": "gary@roave.com", - "homepage": "https://github.com/geeh" - }, - { - "name": "Jaroslav Hanslík", - "email": "kukulich@kukulich.cz", - "homepage": "https://github.com/kukulich" - } - ], - "description": "Better Reflection - an improved code reflection API", - "support": { - "issues": "https://github.com/Roave/BetterReflection/issues", - "source": "https://github.com/Roave/BetterReflection/tree/5.11.1" - }, - "time": "2022-09-29T16:28:39+00:00" - }, - { - "name": "roave/signature", - "version": "1.7.0", - "source": { - "type": "git", - "url": "https://github.com/Roave/Signature.git", - "reference": "2ab4eadcb9f9d449f673a97b67797403b35eca94" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Roave/Signature/zipball/2ab4eadcb9f9d449f673a97b67797403b35eca94", - "reference": "2ab4eadcb9f9d449f673a97b67797403b35eca94", - "shasum": "" - }, - "require": { - "php": "8.0.*|8.1.*|8.2.*" - }, - "require-dev": { - "doctrine/coding-standard": "^10.0.0", - "infection/infection": "^0.26.15", - "phpunit/phpunit": "^9.5.25", - "vimeo/psalm": "^4.28.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Roave\\Signature\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "Sign and verify stuff", - "support": { - "issues": "https://github.com/Roave/Signature/issues", - "source": "https://github.com/Roave/Signature/tree/1.7.0" - }, - "time": "2022-10-10T08:44:53+00:00" - }, { "name": "symfony/cache", "version": "v6.0.19", @@ -3364,16 +3202,16 @@ "packages-dev": [ { "name": "captainhook/captainhook", - "version": "5.17.3", + "version": "5.18.3", "source": { "type": "git", "url": "https://github.com/captainhookphp/captainhook.git", - "reference": "cac493cfacf14f3a2d16b4ebff9a3bc9adb4c68d" + "reference": "b7bc503a40ccfe80ea9638e4921b4697669d725f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/captainhookphp/captainhook/zipball/cac493cfacf14f3a2d16b4ebff9a3bc9adb4c68d", - "reference": "cac493cfacf14f3a2d16b4ebff9a3bc9adb4c68d", + "url": "https://api.github.com/repos/captainhookphp/captainhook/zipball/b7bc503a40ccfe80ea9638e4921b4697669d725f", + "reference": "b7bc503a40ccfe80ea9638e4921b4697669d725f", "shasum": "" }, "require": { @@ -3435,7 +3273,7 @@ ], "support": { "issues": "https://github.com/captainhookphp/captainhook/issues", - "source": "https://github.com/captainhookphp/captainhook/tree/5.17.3" + "source": "https://github.com/captainhookphp/captainhook/tree/5.18.3" }, "funding": [ { @@ -3443,7 +3281,7 @@ "type": "github" } ], - "time": "2023-10-04T11:51:41+00:00" + "time": "2023-11-05T13:56:19+00:00" }, { "name": "captainhook/plugin-composer", @@ -4221,12 +4059,12 @@ "source": { "type": "git", "url": "https://github.com/Roave/SecurityAdvisories.git", - "reference": "66dba7265a37e4081f443ed8211d507cd3cce5ef" + "reference": "c4fd7758ddbe86b94226ad8c96d1f5fcbb19dbc5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/66dba7265a37e4081f443ed8211d507cd3cce5ef", - "reference": "66dba7265a37e4081f443ed8211d507cd3cce5ef", + "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/c4fd7758ddbe86b94226ad8c96d1f5fcbb19dbc5", + "reference": "c4fd7758ddbe86b94226ad8c96d1f5fcbb19dbc5", "shasum": "" }, "conflict": { @@ -4263,13 +4101,14 @@ "azuracast/azuracast": "<0.18.3", "backdrop/backdrop": "<1.24.2", "backpack/crud": "<3.4.9", + "bacula-web/bacula-web": "<8.0.0.0-RC2-dev", "badaso/core": "<2.7", "bagisto/bagisto": "<0.1.5", "barrelstrength/sprout-base-email": "<1.2.7", "barrelstrength/sprout-forms": "<3.9", "barryvdh/laravel-translation-manager": "<0.6.2", "barzahlen/barzahlen-php": "<2.0.1", - "baserproject/basercms": "<4.7.5", + "baserproject/basercms": "<4.8", "bassjobsen/bootstrap-3-typeahead": ">4.0.2", "bigfork/silverstripe-form-capture": ">=3,<3.1.1", "billz/raspap-webgui": "<=2.9.2", @@ -4301,7 +4140,7 @@ "cockpit-hq/cockpit": "<=2.6.3", "codeception/codeception": "<3.1.3|>=4,<4.1.22", "codeigniter/framework": "<3.1.9", - "codeigniter4/framework": "<4.3.5", + "codeigniter4/framework": "<=4.4.2", "codeigniter4/shield": "<1.0.0.0-beta4", "codiad/codiad": "<=2.8.4", "composer/composer": "<1.10.27|>=2,<2.2.22|>=2.3,<2.6.4", @@ -4328,16 +4167,16 @@ "derhansen/sf_event_mgt": "<4.3.1|>=5,<5.1.1", "desperado/xml-bundle": "<=0.1.7", "directmailteam/direct-mail": "<5.2.4", - "doctrine/annotations": ">=1,<1.2.7", - "doctrine/cache": ">=1,<1.3.2|>=1.4,<1.4.2", - "doctrine/common": ">=2,<2.4.3|>=2.5,<2.5.1", + "doctrine/annotations": "<1.2.7", + "doctrine/cache": "<1.3.2|>=1.4,<1.4.2", + "doctrine/common": "<2.4.3|>=2.5,<2.5.1", "doctrine/dbal": ">=2,<2.0.8|>=2.1,<2.1.2|>=3,<3.1.4", "doctrine/doctrine-bundle": "<1.5.2", "doctrine/doctrine-module": "<=0.7.1", - "doctrine/mongodb-odm": ">=1,<1.0.2", - "doctrine/mongodb-odm-bundle": ">=2,<3.0.1", + "doctrine/mongodb-odm": "<1.0.2", + "doctrine/mongodb-odm-bundle": "<3.0.1", "doctrine/orm": ">=2,<2.4.8|>=2.5,<2.5.1|>=2.8.3,<2.8.4", - "dolibarr/dolibarr": "<18", + "dolibarr/dolibarr": "<18.0.2", "dompdf/dompdf": "<2.0.2|==2.0.2", "drupal/core": "<9.4.14|>=9.5,<9.5.8|>=10,<10.0.8", "drupal/drupal": ">=6,<6.38|>=7,<7.80|>=8,<8.9.16|>=9,<9.1.12|>=9.2,<9.2.4", @@ -4351,6 +4190,7 @@ "enshrined/svg-sanitize": "<0.15", "erusev/parsedown": "<1.7.2", "ether/logs": "<3.0.4", + "evolutioncms/evolution": "<=3.2.3", "exceedone/exment": "<4.4.3|>=5,<5.0.3", "exceedone/laravel-admin": "<2.2.3|==3", "ezsystems/demobundle": ">=5.4,<5.4.6.1-dev", @@ -4361,11 +4201,12 @@ "ezsystems/ezplatform-admin-ui": ">=1.3,<1.3.5|>=1.4,<1.4.6|>=1.5,<1.5.29|>=2.3,<2.3.26", "ezsystems/ezplatform-admin-ui-assets": ">=4,<4.2.1|>=5,<5.0.1|>=5.1,<5.1.1", "ezsystems/ezplatform-graphql": ">=1.0.0.0-RC1-dev,<1.0.13|>=2.0.0.0-beta1,<2.3.12", - "ezsystems/ezplatform-kernel": "<1.2.5.1-dev|>=1.3,<1.3.26", + "ezsystems/ezplatform-kernel": "<1.2.5.1-dev|>=1.3,<1.3.34", "ezsystems/ezplatform-rest": ">=1.2,<=1.2.2|>=1.3,<1.3.8", "ezsystems/ezplatform-richtext": ">=2.3,<2.3.7.1-dev", + "ezsystems/ezplatform-solr-search-engine": ">=1.7,<1.7.12|>=2,<2.0.2|>=3.3,<3.3.15", "ezsystems/ezplatform-user": ">=1,<1.0.1", - "ezsystems/ezpublish-kernel": "<6.13.8.2-dev|>=7,<7.5.30", + "ezsystems/ezpublish-kernel": "<6.13.8.2-dev|>=7,<7.5.31", "ezsystems/ezpublish-legacy": "<=2017.12.7.3|>=2018.6,<=2019.03.5.1", "ezsystems/platform-ui-assets-bundle": ">=4.2,<4.2.3", "ezsystems/repository-forms": ">=2.3,<2.3.2.1-dev|>=2.5,<2.5.15", @@ -4384,9 +4225,11 @@ "flarum/mentions": "<1.6.3", "flarum/sticky": ">=0.1.0.0-beta14,<=0.1.0.0-beta15", "flarum/tags": "<=0.1.0.0-beta13", + "floriangaerber/magnesium": "<0.3.1", "fluidtypo3/vhs": "<5.1.1", "fof/byobu": ">=0.3.0.0-beta2,<1.1.7", "fof/upload": "<1.2.3", + "foodcoopshop/foodcoopshop": ">=3.2,<3.6.1", "fooman/tcpdf": "<6.2.22", "forkcms/forkcms": "<5.11.1", "fossar/tcpdf-parser": "<6.2.22", @@ -4431,9 +4274,10 @@ "httpsoft/http-message": "<1.0.12", "hyn/multi-tenant": ">=5.6,<5.7.2", "ibexa/admin-ui": ">=4.2,<4.2.3", - "ibexa/core": ">=4,<4.0.7|>=4.1,<4.1.4|>=4.2,<4.2.3", + "ibexa/core": ">=4,<4.0.7|>=4.1,<4.1.4|>=4.2,<4.2.3|>=4.5,<4.5.4", "ibexa/graphql": ">=2.5,<2.5.31|>=3.3,<3.3.28|>=4.2,<4.2.3", "ibexa/post-install": "<=1.0.4", + "ibexa/solr": ">=4.5,<4.5.4", "ibexa/user": ">=4,<4.4.3", "icecoder/icecoder": "<=8.1", "idno/known": "<=1.3.1", @@ -4470,7 +4314,7 @@ "kelvinmo/simplexrd": "<3.1.1", "kevinpapst/kimai2": "<1.16.7", "khodakhah/nodcms": "<=3", - "kimai/kimai": "<1.1", + "kimai/kimai": "<=2.1", "kitodo/presentation": "<3.2.3|>=3.3,<3.3.4", "klaviyo/magento2-extension": ">=1,<3", "knplabs/knp-snappy": "<=1.4.2", @@ -4504,7 +4348,7 @@ "magento/magento1ee": ">=1,<1.14.4.3-dev", "magento/product-community-edition": ">=2,<2.2.10|>=2.3,<2.3.2.0-patch2", "maikuolan/phpmussel": ">=1,<1.6", - "mantisbt/mantisbt": "<=2.25.5", + "mantisbt/mantisbt": "<=2.25.7", "marcwillmann/turn": "<0.3.3", "matyhtf/framework": "<3.0.6", "mautic/core": "<4.3", @@ -4515,7 +4359,7 @@ "melisplatform/melis-front": "<5.0.1", "mezzio/mezzio-swoole": "<3.7|>=4,<4.3", "mgallegos/laravel-jqgrid": "<=1.3", - "microweber/microweber": "<=1.3.4", + "microweber/microweber": "<2.0.3", "miniorange/miniorange-saml": "<1.4.3", "mittwald/typo3_forum": "<1.2.1", "mobiledetect/mobiledetectlib": "<2.8.32", @@ -4523,7 +4367,8 @@ "mojo42/jirafeau": "<4.4", "mongodb/mongodb": ">=1,<1.9.2", "monolog/monolog": ">=1.8,<1.12", - "moodle/moodle": "<4.2.0.0-RC2-dev|==4.2", + "moodle/moodle": "<4.3.0.0-RC2-dev", + "mos/cimage": "<0.7.19", "movim/moxl": ">=0.8,<=0.10", "mpdf/mpdf": "<=7.1.7", "mustache/mustache": ">=2,<2.14.1", @@ -4539,6 +4384,7 @@ "nette/application": ">=2,<2.0.19|>=2.1,<2.1.13|>=2.2,<2.2.10|>=2.3,<2.3.14|>=2.4,<2.4.16|>=3,<3.0.6", "nette/nette": ">=2,<2.0.19|>=2.1,<2.1.13", "nilsteampassnet/teampass": "<3.0.10", + "nonfiction/nterchange": "<4.1.1", "notrinos/notrinos-erp": "<=0.7", "noumo/easyii": "<=0.9", "nukeviet/nukeviet": "<4.5.02", @@ -4550,6 +4396,7 @@ "october/october": "<=3.4.4", "october/rain": "<1.0.472|>=1.1,<1.1.2", "october/system": "<1.0.476|>=1.1,<1.1.12|>=2,<2.2.34|>=3,<3.0.66", + "omeka/omeka-s": "<4.0.3", "onelogin/php-saml": "<2.10.4", "oneup/uploader-bundle": "<1.9.3|>=2,<2.1.5", "open-web-analytics/open-web-analytics": "<1.7.4", @@ -4558,7 +4405,7 @@ "openmage/magento-lts": "<=19.5|>=20,<=20.1", "opensource-workshop/connect-cms": "<1.7.2|>=2,<2.3.2", "orchid/platform": ">=9,<9.4.4|>=14.0.0.0-alpha4,<14.5", - "oro/commerce": ">=4.1,<5.0.6", + "oro/commerce": ">=4.1,<5.0.11|>=5.1,<5.1.1", "oro/crm": ">=1.7,<1.7.4|>=3.1,<4.1.17|>=4.2,<4.2.7", "oro/platform": ">=1.7,<1.7.4|>=3.1,<3.1.29|>=4.1,<4.1.17|>=4.2,<4.2.8", "oxid-esales/oxideshop-ce": "<4.5", @@ -4592,17 +4439,18 @@ "phpxmlrpc/extras": "<0.6.1", "phpxmlrpc/phpxmlrpc": "<4.9.2", "pi/pi": "<=2.5", - "pimcore/admin-ui-classic-bundle": "<1.1.2", + "pimcore/admin-ui-classic-bundle": "<1.2", "pimcore/customer-management-framework-bundle": "<3.4.2", "pimcore/data-hub": "<1.2.4", "pimcore/demo": "<10.3", "pimcore/perspective-editor": "<1.5.1", - "pimcore/pimcore": "<10.6.8", + "pimcore/pimcore": "<11.1", "pixelfed/pixelfed": "<=0.11.4", "pocketmine/bedrock-protocol": "<8.0.2", "pocketmine/pocketmine-mp": "<=4.23|>=5,<5.3.1", "pressbooks/pressbooks": "<5.18", "prestashop/autoupgrade": ">=4,<4.10.1", + "prestashop/blockreassurance": "<=5.1.3", "prestashop/blockwishlist": ">=2,<2.1.1", "prestashop/contactform": ">=1.0.1,<4.3", "prestashop/gamification": "<2.3.2", @@ -4629,6 +4477,7 @@ "react/http": ">=0.7,<1.9", "really-simple-plugins/complianz-gdpr": "<6.4.2", "remdex/livehelperchat": "<3.99", + "reportico-web/reportico": "<=7.1.21", "rmccue/requests": ">=1.6,<1.8", "robrichards/xmlseclibs": "<3.0.4", "roots/soil": "<4.1", @@ -4656,7 +4505,7 @@ "silverstripe/comments": ">=1.3,<1.9.99|>=2,<2.9.99|>=3,<3.1.1", "silverstripe/forum": "<=0.6.1|>=0.7,<=0.7.3", "silverstripe/framework": "<4.13.14|>=5,<5.0.13", - "silverstripe/graphql": "<3.5.2|>=4.0.0.0-alpha1,<4.0.0.0-alpha2|>=4.1.1,<4.1.2|>=4.2.2,<4.2.3", + "silverstripe/graphql": "<3.8.2|>=4,<4.1.3|>=4.2,<4.2.5|>=4.3,<4.3.4|>=5,<5.0.3", "silverstripe/hybridsessions": ">=1,<2.4.1|>=2.5,<2.5.1", "silverstripe/recipe-cms": ">=4.5,<4.5.3", "silverstripe/registry": ">=2.1,<2.1.2|>=2.2,<2.2.1", @@ -4679,7 +4528,7 @@ "slim/slim": "<2.6", "slub/slub-events": "<3.0.3", "smarty/smarty": "<3.1.48|>=4,<4.3.1", - "snipe/snipe-it": "<=6.2.1", + "snipe/snipe-it": "<=6.2.2", "socalnick/scn-social-auth": "<1.15.2", "socialiteproviders/steam": "<1.1", "spatie/browsershot": "<3.57.4", @@ -4747,9 +4596,9 @@ "thelia/thelia": ">=2.1,<2.1.3", "theonedemon/phpwhois": "<=4.2.5", "thinkcmf/thinkcmf": "<=5.1.7", - "thorsten/phpmyfaq": "<3.2.0.0-beta2", + "thorsten/phpmyfaq": "<3.2.2", "tikiwiki/tiki-manager": "<=17.1", - "tinymce/tinymce": "<5.10.7|>=6,<6.3.1", + "tinymce/tinymce": "<5.10.8|>=6,<6.7.1", "tinymighty/wiki-seo": "<1.2.2", "titon/framework": "<9.9.99", "tobiasbg/tablepress": "<=2.0.0.0-RC1", @@ -4822,7 +4671,7 @@ "yourls/yourls": "<=1.8.2", "zencart/zencart": "<=1.5.7.0-beta", "zendesk/zendesk_api_client_php": "<2.2.11", - "zendframework/zend-cache": ">=2.4,<2.4.8|>=2.5,<2.5.3", + "zendframework/zend-cache": "<2.4.8|>=2.5,<2.5.3", "zendframework/zend-captcha": ">=2,<2.4.9|>=2.5,<2.5.2", "zendframework/zend-crypt": ">=2,<2.4.9|>=2.5,<2.5.2", "zendframework/zend-db": ">=2,<2.0.99|>=2.1,<2.1.99|>=2.2,<2.2.10|>=2.3,<2.3.5", @@ -4854,7 +4703,7 @@ "zenstruck/collection": "<0.2.1", "zetacomponents/mail": "<1.8.2", "zf-commons/zfc-user": "<1.2.2", - "zfcampus/zf-apigility-doctrine": ">=1,<1.0.3", + "zfcampus/zf-apigility-doctrine": "<1.0.3", "zfr/zfr-oauth2-server-module": "<0.1.2", "zoujingli/thinkadmin": "<6.0.22" }, @@ -4894,7 +4743,7 @@ "type": "tidelift" } ], - "time": "2023-10-09T22:04:13+00:00" + "time": "2023-11-09T23:04:23+00:00" }, { "name": "sebastian/cli-parser", @@ -5976,16 +5825,16 @@ }, { "name": "sebastianfeldmann/git", - "version": "3.9.2", + "version": "3.9.3", "source": { "type": "git", "url": "https://github.com/sebastianfeldmann/git.git", - "reference": "11c85123216b32985f8f0b8547a52390d87d544e" + "reference": "eb2ca84a2b45a461f0bf5d4fd400df805649e83a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianfeldmann/git/zipball/11c85123216b32985f8f0b8547a52390d87d544e", - "reference": "11c85123216b32985f8f0b8547a52390d87d544e", + "url": "https://api.github.com/repos/sebastianfeldmann/git/zipball/eb2ca84a2b45a461f0bf5d4fd400df805649e83a", + "reference": "eb2ca84a2b45a461f0bf5d4fd400df805649e83a", "shasum": "" }, "require": { @@ -6025,7 +5874,7 @@ ], "support": { "issues": "https://github.com/sebastianfeldmann/git/issues", - "source": "https://github.com/sebastianfeldmann/git/tree/3.9.2" + "source": "https://github.com/sebastianfeldmann/git/tree/3.9.3" }, "funding": [ { @@ -6033,7 +5882,7 @@ "type": "github" } ], - "time": "2023-10-04T10:59:08+00:00" + "time": "2023-10-13T09:10:48+00:00" }, { "name": "squizlabs/php_codesniffer", @@ -6217,5 +6066,5 @@ "ext-mbstring": "*" }, "platform-dev": [], - "plugin-api-version": "2.3.0" + "plugin-api-version": "2.6.0" } diff --git a/selfdoc/templates/tech/4.pluginSystem/readme.md.twig b/selfdoc/templates/tech/4.pluginSystem/readme.md.twig index acce6f40..9c719b1e 100644 --- a/selfdoc/templates/tech/4.pluginSystem/readme.md.twig +++ b/selfdoc/templates/tech/4.pluginSystem/readme.md.twig @@ -13,7 +13,6 @@ You can add your plugins to the configuration like this: ```yaml plugins: - - class: \SelfDocConfig\Plugin\RoaveStubber\BetterReflectionStubberPlugin - class: \SelfDocConfig\Plugin\TwigFilterClassParser\TwigFilterClassParserPlugin - class: \SelfDocConfig\Plugin\TwigFunctionClassParser\TwigFunctionClassParserPlugin ``` diff --git a/src/Core/Renderer/Context/Dependency/FileDependency.php b/src/Core/Renderer/Context/Dependency/FileDependency.php index f1a1e3c8..be177ce8 100644 --- a/src/Core/Renderer/Context/Dependency/FileDependency.php +++ b/src/Core/Renderer/Context/Dependency/FileDependency.php @@ -6,7 +6,6 @@ use BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException; use BumbleDocGen\Core\Renderer\RendererHelper; -use Roave\BetterReflection\Util\FileHelper; final class FileDependency implements RendererDependencyInterface { From c3ae86265f951f33c7839b9b4437fff70b156e54 Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Fri, 10 Nov 2023 17:56:17 +0300 Subject: [PATCH 032/210] Fixing tests --- tests/Unit/Core/Parser/ProjectParserTest.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tests/Unit/Core/Parser/ProjectParserTest.php b/tests/Unit/Core/Parser/ProjectParserTest.php index d55a406f..4c8b2806 100644 --- a/tests/Unit/Core/Parser/ProjectParserTest.php +++ b/tests/Unit/Core/Parser/ProjectParserTest.php @@ -8,6 +8,7 @@ use BumbleDocGen\Core\Parser\Entity\RootEntityCollection; use BumbleDocGen\Core\Parser\Entity\RootEntityCollectionsGroup; use BumbleDocGen\Core\Parser\ProjectParser; +use BumbleDocGen\Core\Plugin\PluginEventDispatcher; use BumbleDocGen\LanguageHandler\LanguageHandlerInterface; use BumbleDocGen\LanguageHandler\LanguageHandlersCollection; use PHPUnit\Framework\TestCase; @@ -38,9 +39,11 @@ public function testParse(int $languageHandlerCount): void ->method('getLanguageHandlersCollection') ->willReturn($languageHandlersCollection); + $pluginEventDispatcherStub = $this->createStub(PluginEventDispatcher::class); + $rootEntityCollectionsGroup = new RootEntityCollectionsGroup(); - $projectParser = new ProjectParser($configurationStub, $rootEntityCollectionsGroup); + $projectParser = new ProjectParser($configurationStub, $pluginEventDispatcherStub, $rootEntityCollectionsGroup); $projectParser->parse(); self::assertCount($languageHandlerCount, $rootEntityCollectionsGroup); From 6185f3d711b914ae96911bf7392275bf3a89f4f3 Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Fri, 10 Nov 2023 17:58:49 +0300 Subject: [PATCH 033/210] New lib version --- src/DocGenerator.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/DocGenerator.php b/src/DocGenerator.php index a3cf7d31..16109391 100644 --- a/src/DocGenerator.php +++ b/src/DocGenerator.php @@ -37,7 +37,7 @@ */ final class DocGenerator { - public const VERSION = '1.5.0'; + public const VERSION = '2.0.0'; public const LOG_FILE_NAME = 'last_run.log'; public function __construct( From 4237479c813f481f34c4b8f5eb0d8a7f2f08c082 Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Mon, 13 Nov 2023 14:26:48 +0300 Subject: [PATCH 034/210] Handle more expressions in NodeValueCompiler --- .../Parser/Entity/Ast/NodeValueCompiler.php | 102 +++++++++++++----- 1 file changed, 74 insertions(+), 28 deletions(-) diff --git a/src/LanguageHandler/Php/Parser/Entity/Ast/NodeValueCompiler.php b/src/LanguageHandler/Php/Parser/Entity/Ast/NodeValueCompiler.php index 1311ce26..ecbaca2e 100644 --- a/src/LanguageHandler/Php/Parser/Entity/Ast/NodeValueCompiler.php +++ b/src/LanguageHandler/Php/Parser/Entity/Ast/NodeValueCompiler.php @@ -8,6 +8,8 @@ use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\MethodEntity; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\PropertyEntity; +use DI\DependencyException; +use DI\NotFoundException; use PhpParser\ConstExprEvaluationException; use PhpParser\ConstExprEvaluator; use PhpParser\Node; @@ -31,36 +33,31 @@ public static function compile(Node\Stmt\Expression|Node $node, MethodEntity|Pro } $constExprEvaluator = new ConstExprEvaluator(function (Node\Expr $node) use ($entity): mixed { - try { - $className = get_class($node); - return match ($className) { - Node\Expr\ClassConstFetch::class => self::getClassConstantValue($node, $entity), - Node\Scalar\MagicConst\Dir::class => dirname($entity->getRelativeFileName()), - Node\Scalar\MagicConst\File::class => $entity->getRelativeFileName(), - Node\Scalar\MagicConst\Class_::class => is_a($entity, ClassEntity::class) ? $entity->getName() : $entity->getRootEntity()->getName(), - Node\Scalar\MagicConst\Line::class => $node->getLine(), - Node\Scalar\MagicConst\Namespace_::class => $entity->getNamespaceName(), - Node\Scalar\MagicConst\Method::class => is_a($entity, MethodEntity::class) ? $entity->getRootEntity()->getName() . '::' . $entity->getName() : '', - Node\Scalar\MagicConst\Trait_::class => $entity->isTrait() ? $entity->getName() : '', - Node\Scalar\MagicConst\Function_::class => is_a($entity, MethodEntity::class) ? $entity->getName() : '', - Node\Expr\FuncCall::class => self::getFuncCallValue($node), - Node\Expr\New_::class => throw new \RuntimeException('Unable to compile initializer'), - default => throw new \RuntimeException('Not supported operation') - }; - } catch (\Exception) { - } - - $astPrinter = new Standard(); - $value = $astPrinter->prettyPrint([$node]); - $op = array_reverse(explode('\\', get_class($node)))[0]; - $op = str_replace('Fetch', '', $op); - if (str_ends_with($op, '_')) { - return '[MagicConst:' . $value . ']'; - } - return "[{$op}:{$value}]"; + $className = get_class($node); + return match ($className) { + Node\Expr\ClassConstFetch::class => self::getClassConstantValue($node, $entity), + Node\Scalar\MagicConst\Dir::class => dirname($entity->getRelativeFileName()), + Node\Scalar\MagicConst\File::class => $entity->getRelativeFileName(), + Node\Scalar\MagicConst\Class_::class => is_a($entity, ClassEntity::class) ? $entity->getName() : $entity->getRootEntity()->getName(), + Node\Scalar\MagicConst\Line::class => $node->getLine(), + Node\Scalar\MagicConst\Namespace_::class => $entity->getNamespaceName(), + Node\Scalar\MagicConst\Method::class => is_a($entity, MethodEntity::class) ? $entity->getRootEntity()->getName() . '::' . $entity->getName() : '', + Node\Scalar\MagicConst\Trait_::class => $entity->isTrait() ? $entity->getName() : '', + Node\Scalar\MagicConst\Function_::class => is_a($entity, MethodEntity::class) ? $entity->getName() : '', + Node\Expr\StaticCall::class => self::getStaticCallValue($node, $entity), + Node\Expr\StaticPropertyFetch::class => self::getStaticPropertyValue($node, $entity), + Node\Expr\FuncCall::class => self::getFuncCallValue($node), + Node\Expr\New_::class => throw new \RuntimeException('Unable to compile initializer'), + default => throw new \RuntimeException('Not supported operation') + }; }); - return $constExprEvaluator->evaluateDirectly($node); + try { + return $constExprEvaluator->evaluateSilently($node); + } catch (\Exception) { + } + $astPrinter = new Standard(); + return $astPrinter->prettyPrint([$node]); } private static function getFuncCallValue(Node\Expr\FuncCall $node): mixed @@ -77,6 +74,50 @@ private static function getFuncCallValue(Node\Expr\FuncCall $node): mixed throw new \RuntimeException('Not supported operation'); } + /** + * @throws NotFoundException + * @throws DependencyException + * @throws InvalidConfigurationParameterException + * @throws ConstExprEvaluationException + */ + private static function getStaticCallValue( + Node\Expr\StaticCall $node, + MethodEntity|PropertyEntity|ClassEntity $entity + ): mixed { + $className = self::resolveClassName($node->class->toString(), $entity); + if ($entity->getName() !== $className) { + $entity = $entity->getRootEntityCollection()->getLoadedOrCreateNew($className); + } + if (!$entity->entityDataCanBeLoaded()) { + throw new \RuntimeException('Entity cannot be loaded'); + } + $methodEntity = $entity->getMethodEntity($node->name->toString()); + if (!$methodEntity) { + return null; + } + return $methodEntity->getFirstReturnValue(); + } + + /** + * @throws NotFoundException + * @throws DependencyException + * @throws InvalidConfigurationParameterException + * @throws ConstExprEvaluationException + */ + private static function getStaticPropertyValue( + Node\Expr\StaticPropertyFetch $node, + MethodEntity|PropertyEntity|ClassEntity $entity + ): mixed { + $className = self::resolveClassName($node->class->toString(), $entity); + if ($entity->getName() !== $className) { + $entity = $entity->getRootEntityCollection()->getLoadedOrCreateNew($className); + } + if (!$entity->entityDataCanBeLoaded()) { + throw new \RuntimeException('Entity cannot be loaded'); + } + return $entity->getPropertyEntity($node->name->toString())->getDefaultValue(); + } + /** * @throws InvalidConfigurationParameterException * @throws ConstExprEvaluationException @@ -103,6 +144,11 @@ private static function getClassConstantValue( if ($constantName === 'class') { return $className; } + + if (!$entity->entityDataCanBeLoaded()) { + throw new \RuntimeException('Entity cannot be loaded'); + } + return $entity->getConstantValue($constantName); } From 8854cb061364a4c53ab15e9f908ce8948a46188f Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Mon, 13 Nov 2023 14:27:15 +0300 Subject: [PATCH 035/210] Use new value compiler --- .../Php/Parser/Entity/MethodEntity.php | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/LanguageHandler/Php/Parser/Entity/MethodEntity.php b/src/LanguageHandler/Php/Parser/Entity/MethodEntity.php index 745158e8..3a43b38d 100644 --- a/src/LanguageHandler/Php/Parser/Entity/MethodEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/MethodEntity.php @@ -9,6 +9,7 @@ use BumbleDocGen\Core\Configuration\Configuration; use BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException; use BumbleDocGen\Core\Parser\Entity\Cache\CacheableMethod; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Ast\NodeValueCompiler; use BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper; use BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings; use DI\DependencyException; @@ -16,7 +17,10 @@ use phpDocumentor\Reflection\DocBlock; use phpDocumentor\Reflection\DocBlock\Tags\InvalidTag; use phpDocumentor\Reflection\DocBlock\Tags\Param; +use PhpParser\ConstExprEvaluationException; use PhpParser\Node\Stmt\ClassMethod; +use PhpParser\Node\Stmt\Return_; +use PhpParser\NodeFinder; use PhpParser\PrettyPrinter\Standard; use Psr\Log\LoggerInterface; @@ -542,13 +546,18 @@ public function isDynamic(): bool } /** - * @throws NotFoundException - * @throws DependencyException * @throws InvalidConfigurationParameterException + * @throws ConstExprEvaluationException */ #[CacheableMethod] public function getFirstReturnValue(): mixed { - return $this->parserHelper->getMethodReturnValue($this); + $nodeFinder = new NodeFinder(); + /** @var Return_|null $firstReturn */ + $firstReturn = $nodeFinder->findFirstInstanceOf($this->getAst()->stmts, Return_::class); + if (!$firstReturn) { + return null; + } + return NodeValueCompiler::compile($firstReturn->expr, $this); } /** From e2835aa3ff24a3ab906667b72691e6ea07e0a631 Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Mon, 13 Nov 2023 14:27:23 +0300 Subject: [PATCH 036/210] Removing old methods --- .../Php/Parser/ParserHelper.php | 144 ------------------ 1 file changed, 144 deletions(-) diff --git a/src/LanguageHandler/Php/Parser/ParserHelper.php b/src/LanguageHandler/Php/Parser/ParserHelper.php index defd6454..9a1df332 100644 --- a/src/LanguageHandler/Php/Parser/ParserHelper.php +++ b/src/LanguageHandler/Php/Parser/ParserHelper.php @@ -317,150 +317,6 @@ public function parseFullClassName( return $className; } - public function getClassFromFile($file): ?string - { - if (str_ends_with($file, '.php')) { - $content = file_get_contents($file); - $namespaceLevel = false; - $classLevel = false; - $namespace = ''; - foreach (token_get_all($content, TOKEN_PARSE) as $token) { - if ($token[0] === T_NAMESPACE) { - $namespaceLevel = true; - } elseif ($namespaceLevel && in_array($token[0], [T_NAME_QUALIFIED, T_STRING])) { - $namespaceLevel = false; - $namespace = $token[1]; - } - if (!$namespaceLevel && in_array($token[0], [T_CLASS, T_INTERFACE, T_TRAIT])) { - $classLevel = true; - } elseif ($classLevel && $token[0] === T_STRING) { - return $namespace . '\\' . $token[1]; - } - } - } - return null; - } - - /** - * @throws DependencyException - * @throws NotFoundException - * @throws InvalidConfigurationParameterException - * @throws \PhpParser\ConstExprEvaluationException - */ - protected function getRawValue(MethodEntity $methodEntity, string $condition) - { - $prepareReturnValue = function (mixed $value): mixed { - if (!is_string($value) || str_contains($value, ':') || str_contains($value, '->')) { - return $value; - } - return "'{$value}'"; - }; - - $classEntity = $methodEntity->getImplementingClass(); - if ( - str_contains($condition, '::') && !str_contains($condition, '"') && !str_contains($condition, '\'') - ) { - try { - $parts = explode('::', $condition); - if ($parts[0] === 'parent') { - $classEntity = $methodEntity->getImplementingClass()->getParentClass(); - } elseif ($parts[0] === 'self') { - $classEntity = $methodEntity->getImplementingClass(); - } elseif ($parts[0] === 'static') { - $classEntity = $methodEntity->getRootEntity(); - } elseif ($this::isCorrectClassName($parts[0])) { - $classEntity = $classEntity->getRootEntityCollection()->getLoadedOrCreateNew($parts[0]); - } - - if ($classEntity && $classEntity->entityDataCanBeLoaded()) { - if (str_contains($parts[1], '(') && !str_contains($parts[1], ' ') && !str_contains($parts[1], '.')) { - $methodName = explode('(', $parts[1])[0]; - $nextMethodEntity = $classEntity->getMethodEntity($methodName); - $methodValue = $this->getMethodReturnValue($nextMethodEntity); - return $prepareReturnValue($methodValue); - } elseif (!preg_match('/([-+:\/ ])/', $parts[1])) { - $constantValue = $classEntity->getConstantValue($parts[1]); - return $prepareReturnValue($constantValue); - } - } - } catch (\Exception) { - } - } - - return preg_replace_callback( - '/([$]?)([a-zA-Z_\\\\]+)((::)|(->))([\s\S]([^ -+\-;\]])+)(([^)]?)+[)])?/', - function (array $matches) use ($classEntity, $prepareReturnValue) { - if ($matches[1] && $matches[2] != 'this') { - return $matches[0]; - } - if (substr_count($matches[0], '->') > 1) { - return $matches[0]; - } - - if (!in_array($matches[2], ['static', 'self', 'partner', 'this'])) { - $classEntity = $classEntity->getRootEntityCollection()->getLoadedOrCreateNew($matches[2]); - } - - if (!$classEntity->entityDataCanBeLoaded()) { - return $matches[0]; - } - - if (isset($matches[8]) && $classEntity->hasMethod($matches[6])) { - $methodEntity = $classEntity->getMethodEntity($matches[6]); - $methodValue = $this->getMethodReturnValue($methodEntity); - return $prepareReturnValue($methodValue); - } elseif ($classEntity->hasConstant($matches[6])) { - $constantValue = $classEntity->getConstantValue($matches[6]); - return $prepareReturnValue($constantValue); - } - return $matches[0]; - }, - $condition - ); - } - - /** - * @throws NotFoundException - * @throws DependencyException - * @throws InvalidConfigurationParameterException - */ - public function getMethodReturnValue(MethodEntity $methodEntity): mixed - { - if (preg_match('/(return )([^;]+)/', $methodEntity->getBodyCode(), $matches)) { - $savedParts = []; - $i = 0; - $preparedConditions = preg_replace_callback("/((\")(.*?)(\"))|((')(.*?)('))/", function (array $matches) use (&$savedParts, &$i) { - $value = array_key_exists(7, $matches) ? $matches[7] : $matches[3]; - $savedParts[++$i] = $value; - return "'[%{$i}%]'"; - }, $matches[2]); - - $conditions = explode('.', $preparedConditions); - $values = []; - foreach ($conditions as $condition) { - foreach ($savedParts as $i => $savedPart) { - $condition = str_replace("[%{$i}%]", $savedPart, $condition); - } - $values[] = self::getRawValue($methodEntity, trim($condition)); - } - $value = implode(' . ', $values); - - if ($value && !str_contains($value, '::') && !str_contains($value, '$this->')) { - try { - $fName = 'x' . uniqid(); - $fn = new GlobalFunction($fName); - $value = str_replace(['(', ')'], '', $value); - $fn->setBody("return {$value};"); - eval((string)$fn); - return $fName(); - } catch (\Exception) { - } - } - return $value; - } - return null; - } - /** * @throws InvalidConfigurationParameterException */ From a2d890e935e087d92a65b29473e8d3c7f81ac9c3 Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Mon, 13 Nov 2023 14:58:38 +0300 Subject: [PATCH 037/210] Using node position --- src/LanguageHandler/Php/Parser/Entity/PropertyEntity.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/LanguageHandler/Php/Parser/Entity/PropertyEntity.php b/src/LanguageHandler/Php/Parser/Entity/PropertyEntity.php index ebb61d5a..39cfdd61 100644 --- a/src/LanguageHandler/Php/Parser/Entity/PropertyEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/PropertyEntity.php @@ -348,6 +348,6 @@ public function getDescription(): string */ #[CacheableMethod] public function getDefaultValue(): string|array|int|bool|null|float { - return NodeValueCompiler::compile($this->getAst()->props[0]->default, $this); + return NodeValueCompiler::compile($this->getAst()->props[$this->nodePosition]->default, $this); } } From 4df5be3d3fc055f6931329adb8c21b1548a6279f Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Mon, 13 Nov 2023 16:00:19 +0300 Subject: [PATCH 038/210] Adding value getter to a constant entity --- .../Parser/Entity/Ast/NodeValueCompiler.php | 23 +++++++++------ .../Php/Parser/Entity/ClassEntity.php | 28 +++++-------------- .../Php/Parser/Entity/ConstantEntity.php | 11 ++++++++ 3 files changed, 33 insertions(+), 29 deletions(-) diff --git a/src/LanguageHandler/Php/Parser/Entity/Ast/NodeValueCompiler.php b/src/LanguageHandler/Php/Parser/Entity/Ast/NodeValueCompiler.php index ecbaca2e..43b0132b 100644 --- a/src/LanguageHandler/Php/Parser/Entity/Ast/NodeValueCompiler.php +++ b/src/LanguageHandler/Php/Parser/Entity/Ast/NodeValueCompiler.php @@ -6,6 +6,7 @@ use BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ConstantEntity; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\MethodEntity; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\PropertyEntity; use DI\DependencyException; @@ -26,8 +27,10 @@ private function __construct() * @throws ConstExprEvaluationException * @throws InvalidConfigurationParameterException */ - public static function compile(Node\Stmt\Expression|Node $node, MethodEntity|PropertyEntity|ClassEntity $entity): mixed - { + public static function compile( + Node\Stmt\Expression|Node $node, + MethodEntity|PropertyEntity|ConstantEntity|ClassEntity $entity + ): mixed { if ($node instanceof Node\Stmt\Expression) { return self::compile($node->expr, $entity); } @@ -82,7 +85,7 @@ private static function getFuncCallValue(Node\Expr\FuncCall $node): mixed */ private static function getStaticCallValue( Node\Expr\StaticCall $node, - MethodEntity|PropertyEntity|ClassEntity $entity + MethodEntity|PropertyEntity|ConstantEntity|ClassEntity $entity ): mixed { $className = self::resolveClassName($node->class->toString(), $entity); if ($entity->getName() !== $className) { @@ -106,7 +109,7 @@ private static function getStaticCallValue( */ private static function getStaticPropertyValue( Node\Expr\StaticPropertyFetch $node, - MethodEntity|PropertyEntity|ClassEntity $entity + MethodEntity|PropertyEntity|ConstantEntity|ClassEntity $entity ): mixed { $className = self::resolveClassName($node->class->toString(), $entity); if ($entity->getName() !== $className) { @@ -119,12 +122,14 @@ private static function getStaticPropertyValue( } /** - * @throws InvalidConfigurationParameterException + * @throws DependencyException * @throws ConstExprEvaluationException + * @throws NotFoundException + * @throws InvalidConfigurationParameterException */ private static function getClassConstantValue( Node\Expr\ClassConstFetch $node, - MethodEntity|PropertyEntity|ClassEntity $entity + MethodEntity|PropertyEntity|ConstantEntity|ClassEntity $entity ): mixed { $className = self::resolveClassName($node->class->toString(), $entity); @@ -155,8 +160,10 @@ private static function getClassConstantValue( /** * @throws InvalidConfigurationParameterException */ - private static function resolveClassName(string $className, MethodEntity|PropertyEntity|ClassEntity $entity): string - { + private static function resolveClassName( + string $className, + MethodEntity|PropertyEntity|ConstantEntity|ClassEntity $entity + ): string { if ($className !== 'self' && $className !== 'static' && $className !== 'parent') { return $className; } diff --git a/src/LanguageHandler/Php/Parser/Entity/ClassEntity.php b/src/LanguageHandler/Php/Parser/Entity/ClassEntity.php index 4699c1a4..c3065b72 100644 --- a/src/LanguageHandler/Php/Parser/Entity/ClassEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/ClassEntity.php @@ -1062,29 +1062,15 @@ public function isSubclassOf(string $className): bool } /** - * @throws ConstExprEvaluationException + * @throws NotFoundException + * @throws DependencyException * @throws InvalidConfigurationParameterException + * @throws ConstExprEvaluationException */ - #[CacheableMethod] public function getConstantValue( - string $name, - bool $onlyFromCurrentClassAndTraits = false - ): string|array|int|bool|null|float { - $constants = $this->getConstantsData($onlyFromCurrentClassAndTraits); - $entity = $this; - if (array_key_exists($name, $constants) && $constants[$name] !== $this->getName()) { - $entity = $this->getRootEntityCollection()->getLoadedOrCreateNew($constants[$name]); - } - if (!$entity->entityDataCanBeLoaded()) { - return null; - } - foreach ($entity->getAst()->getConstants() as $node) { - foreach ($node->consts as $constantNode) { - if ($name === $constantNode->name->toString()) { - return NodeValueCompiler::compile($constantNode->value, $this); - } - } - } - return null; + #[CacheableMethod] public function getConstantValue(string $name): string|array|int|bool|null|float + { + + return $this->getConstantEntity($name)->getValue(); } /** diff --git a/src/LanguageHandler/Php/Parser/Entity/ConstantEntity.php b/src/LanguageHandler/Php/Parser/Entity/ConstantEntity.php index 27cc361e..5708ac9c 100644 --- a/src/LanguageHandler/Php/Parser/Entity/ConstantEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/ConstantEntity.php @@ -8,9 +8,11 @@ use BumbleDocGen\Core\Configuration\Configuration; use BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException; use BumbleDocGen\Core\Parser\Entity\Cache\CacheableMethod; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Ast\NodeValueCompiler; use BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper; use BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings; use phpDocumentor\Reflection\DocBlock; +use PhpParser\ConstExprEvaluationException; use PhpParser\Node\Stmt\ClassConst; use Psr\Log\LoggerInterface; @@ -209,4 +211,13 @@ public function getDescription(): string { return $this->getAst()->consts[$this->nodePosition]->getEndLine(); } + + /** + * @throws ConstExprEvaluationException + * @throws InvalidConfigurationParameterException + */ + #[CacheableMethod] public function getValue(): string|array|int|bool|null|float + { + return NodeValueCompiler::compile($this->getAst()->consts[$this->nodePosition]->value, $this); + } } From 2a529e5bf48c3c355c8fbc1b8c07aae345ac1099 Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Mon, 13 Nov 2023 16:51:12 +0300 Subject: [PATCH 039/210] Changing array compilation logic --- .../Php/Parser/Entity/Ast/NodeValueCompiler.php | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/LanguageHandler/Php/Parser/Entity/Ast/NodeValueCompiler.php b/src/LanguageHandler/Php/Parser/Entity/Ast/NodeValueCompiler.php index 43b0132b..5592ef6c 100644 --- a/src/LanguageHandler/Php/Parser/Entity/Ast/NodeValueCompiler.php +++ b/src/LanguageHandler/Php/Parser/Entity/Ast/NodeValueCompiler.php @@ -31,10 +31,18 @@ public static function compile( Node\Stmt\Expression|Node $node, MethodEntity|PropertyEntity|ConstantEntity|ClassEntity $entity ): mixed { + if (is_a($node, \PhpParser\Node\Expr\Array_::class)) { + $compiledValue = []; + foreach ($node->items as $item) { + $key = !$item->key ? $item->key : self::compile($item->key, $entity); + $value = self::compile($item->value, $entity); + $compiledValue[$key] = $value; + } + return $compiledValue; + } if ($node instanceof Node\Stmt\Expression) { return self::compile($node->expr, $entity); } - $constExprEvaluator = new ConstExprEvaluator(function (Node\Expr $node) use ($entity): mixed { $className = get_class($node); return match ($className) { From ea5ad2666bde1cc2c024268b24078872e565ae02 Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Mon, 13 Nov 2023 17:23:51 +0300 Subject: [PATCH 040/210] Fixing key error --- .../Php/Parser/Entity/Ast/NodeValueCompiler.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/LanguageHandler/Php/Parser/Entity/Ast/NodeValueCompiler.php b/src/LanguageHandler/Php/Parser/Entity/Ast/NodeValueCompiler.php index 5592ef6c..28a8704d 100644 --- a/src/LanguageHandler/Php/Parser/Entity/Ast/NodeValueCompiler.php +++ b/src/LanguageHandler/Php/Parser/Entity/Ast/NodeValueCompiler.php @@ -33,8 +33,8 @@ public static function compile( ): mixed { if (is_a($node, \PhpParser\Node\Expr\Array_::class)) { $compiledValue = []; - foreach ($node->items as $item) { - $key = !$item->key ? $item->key : self::compile($item->key, $entity); + foreach ($node->items as $k => $item) { + $key = !$item->key ? $k : self::compile($item->key, $entity); $value = self::compile($item->value, $entity); $compiledValue[$key] = $value; } From c42b2687d88b31b8dda80acca108c135db2a05fa Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Mon, 13 Nov 2023 17:31:20 +0300 Subject: [PATCH 041/210] Adding common method to get relative file name --- src/LanguageHandler/Php/Parser/Entity/BaseEntity.php | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/LanguageHandler/Php/Parser/Entity/BaseEntity.php b/src/LanguageHandler/Php/Parser/Entity/BaseEntity.php index 58cf038d..ce76c3e2 100644 --- a/src/LanguageHandler/Php/Parser/Entity/BaseEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/BaseEntity.php @@ -62,13 +62,20 @@ abstract public function getRootEntityCollection(): ClassEntityCollection; abstract public function getPhpHandlerSettings(): PhpHandlerSettings; + /** + * @throws InvalidConfigurationParameterException + */ + public function getRelativeFileName(): ?string + { + return $this->getCurrentRootEntity()->getRelativeFileName(); + } + /** * @throws InvalidConfigurationParameterException */ final public function isEntityFileCanBeLoad(): bool { - $rootEntity = $this->getCurrentRootEntity(); - return $rootEntity->isClassLoad() && $rootEntity->getRelativeFileName(); + return $this->getCurrentRootEntity()->isClassLoad() && $this->getRelativeFileName(); } /** From edc27cd12ca9efad965e1fc603c6c5b604dfbfb8 Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Mon, 13 Nov 2023 17:31:42 +0300 Subject: [PATCH 042/210] Changing class name check condition --- .../Php/Parser/ParserHelper.php | 21 ++++--------------- 1 file changed, 4 insertions(+), 17 deletions(-) diff --git a/src/LanguageHandler/Php/Parser/ParserHelper.php b/src/LanguageHandler/Php/Parser/ParserHelper.php index 9a1df332..cb0103cd 100644 --- a/src/LanguageHandler/Php/Parser/ParserHelper.php +++ b/src/LanguageHandler/Php/Parser/ParserHelper.php @@ -9,11 +9,7 @@ use BumbleDocGen\Core\Configuration\Configuration; use BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\MethodEntity; -use DI\DependencyException; -use DI\NotFoundException; use Monolog\Logger; -use Nette\PhpGenerator\GlobalFunction; use phpDocumentor\Reflection\DocBlock; use phpDocumentor\Reflection\DocBlockFactory; use phpDocumentor\Reflection\Location; @@ -196,19 +192,10 @@ public static function isBuiltInType(string $name): bool private static function checkIsClassName(string $name): bool { - if ( - !preg_match( - '/^(?=_*[A-z]+)[A-z0-9]+$/', - $name - ) - ) { - return false; - } - - $name = explode('\\', $name); - $name = end($name); - $chr = \mb_substr($name, 0, 1, "UTF-8"); - return \mb_strtolower($chr, "UTF-8") != $chr; + return preg_match( + '/^(?=_*[A-z]+)[A-z0-9]+$/', + $name + ); } public static function isCorrectClassName(string $className, bool $checkBuiltIns = true): bool From 4dbbc02089de40986aa8c7e025a8e2ffc60ac1f6 Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Mon, 13 Nov 2023 17:42:31 +0300 Subject: [PATCH 043/210] Changing composer parser name --- .../Parser/{ComposerParser.php => ComposerHelper.php} | 2 +- src/LanguageHandler/Php/Parser/Entity/ClassEntity.php | 10 +++++----- src/LanguageHandler/Php/Parser/ParserHelper.php | 6 +++--- .../ComposerPackagesStubber/StubberPlugin.php | 9 ++++----- 4 files changed, 13 insertions(+), 14 deletions(-) rename src/LanguageHandler/Php/Parser/{ComposerParser.php => ComposerHelper.php} (99%) diff --git a/src/LanguageHandler/Php/Parser/ComposerParser.php b/src/LanguageHandler/Php/Parser/ComposerHelper.php similarity index 99% rename from src/LanguageHandler/Php/Parser/ComposerParser.php rename to src/LanguageHandler/Php/Parser/ComposerHelper.php index edf310a7..096939d1 100644 --- a/src/LanguageHandler/Php/Parser/ComposerParser.php +++ b/src/LanguageHandler/Php/Parser/ComposerHelper.php @@ -8,7 +8,7 @@ use BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException; use Composer\Autoload\ClassLoader; -final class ComposerParser +final class ComposerHelper { private array $packages = []; private ?ClassLoader $classLoader = null; diff --git a/src/LanguageHandler/Php/Parser/Entity/ClassEntity.php b/src/LanguageHandler/Php/Parser/Entity/ClassEntity.php index c3065b72..8519c8bf 100644 --- a/src/LanguageHandler/Php/Parser/Entity/ClassEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/ClassEntity.php @@ -13,7 +13,7 @@ use BumbleDocGen\Core\Renderer\Context\DocumentTransformableEntityInterface; use BumbleDocGen\Core\Renderer\EntityDocRenderer\EntityDocRendererInterface; use BumbleDocGen\Core\Renderer\Twig\Filter\PrepareSourceLink; -use BumbleDocGen\LanguageHandler\Php\Parser\ComposerParser; +use BumbleDocGen\LanguageHandler\Php\Parser\ComposerHelper; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Ast\NodeValueCompiler; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Ast\PhpParserHelper; use BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper; @@ -54,7 +54,7 @@ public function __construct( private PhpHandlerSettings $phpHandlerSettings, private ClassEntityCollection $classEntityCollection, private ParserHelper $parserHelper, - private ComposerParser $composerParser, + private ComposerHelper $composerHelper, private PhpParserHelper $phpParserHelper, private LocalObjectCache $localObjectCache, private LoggerInterface $logger, @@ -84,7 +84,7 @@ public function getObjectId(): string public function isExternalLibraryEntity(): bool { - return !is_null($this->composerParser->getComposerPackageDataByClassName($this->getName())); + return !is_null($this->composerHelper->getComposerPackageDataByClassName($this->getName())); } public function getPhpHandlerSettings(): PhpHandlerSettings @@ -114,7 +114,7 @@ public function getEntityDependencies(): array $classNames = array_filter( $classNames, function (string $className): bool { - return !$this->composerParser->getComposerPackageDataByClassName($className) && !$this->parserHelper->isBuiltInClass($className); + return !$this->composerHelper->getComposerPackageDataByClassName($className) && !$this->parserHelper->isBuiltInClass($className); } ); @@ -329,7 +329,7 @@ public function getRelativeFileName(bool $loadIfEmpty = true): ?string { if (!$this->relativeFileNameLoaded && $loadIfEmpty) { $this->relativeFileNameLoaded = true; - $fileName = $this->composerParser->getComposerClassLoader()->findFile($this->getName()); + $fileName = $this->composerHelper->getComposerClassLoader()->findFile($this->getName()); $projectRoot = $this->configuration->getProjectRoot(); if (!$fileName || !str_starts_with($fileName, $projectRoot)) { return null; diff --git a/src/LanguageHandler/Php/Parser/ParserHelper.php b/src/LanguageHandler/Php/Parser/ParserHelper.php index cb0103cd..f1a5c916 100644 --- a/src/LanguageHandler/Php/Parser/ParserHelper.php +++ b/src/LanguageHandler/Php/Parser/ParserHelper.php @@ -153,7 +153,7 @@ final class ParserHelper public function __construct( private Configuration $configuration, - private ComposerParser $composerParser, + private ComposerHelper $composerHelper, private LocalObjectCache $localObjectCache, private Logger $logger ) { @@ -192,7 +192,7 @@ public static function isBuiltInType(string $name): bool private static function checkIsClassName(string $name): bool { - return preg_match( + return (bool)preg_match( '/^(?=_*[A-z]+)[A-z0-9]+$/', $name ); @@ -212,7 +212,7 @@ public static function isCorrectClassName(string $className, bool $checkBuiltIns public function isClassLoaded(string $className): bool { if (self::isCorrectClassName($className)) { - return (bool)$this->composerParser->getComposerClassLoader()->findFile($className); + return (bool)$this->composerHelper->getComposerClassLoader()->findFile($className); } return false; } diff --git a/src/LanguageHandler/Php/Plugin/CorePlugin/ComposerPackagesStubber/StubberPlugin.php b/src/LanguageHandler/Php/Plugin/CorePlugin/ComposerPackagesStubber/StubberPlugin.php index f034b8a9..051a00fa 100644 --- a/src/LanguageHandler/Php/Plugin/CorePlugin/ComposerPackagesStubber/StubberPlugin.php +++ b/src/LanguageHandler/Php/Plugin/CorePlugin/ComposerPackagesStubber/StubberPlugin.php @@ -6,7 +6,7 @@ use BumbleDocGen\Core\Plugin\Event\Renderer\OnGettingResourceLink; use BumbleDocGen\Core\Plugin\PluginInterface; -use BumbleDocGen\LanguageHandler\Php\Parser\ComposerParser; +use BumbleDocGen\LanguageHandler\Php\Parser\ComposerHelper; use BumbleDocGen\LanguageHandler\Php\Plugin\Event\Entity\OnCheckIsClassEntityCanBeLoad; /** @@ -14,10 +14,9 @@ */ final class StubberPlugin implements PluginInterface { - private array $packages = []; private array $foundLinks = []; - public function __construct(private ComposerParser $composerParser) + public function __construct(private ComposerHelper $composerHelper) { } @@ -38,7 +37,7 @@ final public function onGettingResourceLink(OnGettingResourceLink $event): void $resourceName = trim($event->getResourceName()); $resourceName = explode('::', $resourceName)[0]; if (!isset($this->foundLinks[$resourceName])) { - $packageData = $this->composerParser->getComposerPackageDataByClassName($resourceName); + $packageData = $this->composerHelper->getComposerPackageDataByClassName($resourceName); if (!$packageData) { return; } @@ -60,7 +59,7 @@ final public function onGettingResourceLink(OnGettingResourceLink $event): void */ final public function onCheckIsClassEntityCanBeLoad(OnCheckIsClassEntityCanBeLoad $event): void { - if ($this->composerParser->getComposerPackageDataByClassName($event->getEntity()->getName())) { + if ($this->composerHelper->getComposerPackageDataByClassName($event->getEntity()->getName())) { $event->disableClassLoading(); } } From 37881765c03f20d9f2425407e0ae28a4c8e79435 Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Mon, 13 Nov 2023 18:45:10 +0300 Subject: [PATCH 044/210] Fixing filename getter --- src/LanguageHandler/Php/Parser/Entity/ClassEntity.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/LanguageHandler/Php/Parser/Entity/ClassEntity.php b/src/LanguageHandler/Php/Parser/Entity/ClassEntity.php index 8519c8bf..a6a749c2 100644 --- a/src/LanguageHandler/Php/Parser/Entity/ClassEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/ClassEntity.php @@ -335,8 +335,8 @@ public function getRelativeFileName(bool $loadIfEmpty = true): ?string return null; } $this->relativeFileName = str_replace( - $projectRoot, - '', + [$projectRoot, '//'], + ['', '/'], $fileName ); } From 7293001222aee4b0b7ace468fc7dcfd3ce58d3f6 Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Mon, 13 Nov 2023 19:15:11 +0300 Subject: [PATCH 045/210] Fixing parent classes names getter --- src/LanguageHandler/Php/Parser/Entity/ClassEntity.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/LanguageHandler/Php/Parser/Entity/ClassEntity.php b/src/LanguageHandler/Php/Parser/Entity/ClassEntity.php index a6a749c2..1cef7bbd 100644 --- a/src/LanguageHandler/Php/Parser/Entity/ClassEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/ClassEntity.php @@ -451,8 +451,8 @@ public function getInterfacesEntities(): array } else { try { $parentClass = $this->getParentClass(); - if ($parentClass?->entityDataCanBeLoaded() && $name = $parentClass?->getName()) { - return array_merge(["\\{$name}"], $parentClass->getParentClassNames()); + if ($name = $parentClass?->getName()) { + return array_unique(array_merge(["\\{$name}"], $parentClass->getParentClassNames())); } } catch (\Exception $e) { $this->logger->warning($e->getMessage()); From 70219eda0cf07e2cd3130fc37d707bb2a380f829 Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Mon, 13 Nov 2023 19:24:30 +0300 Subject: [PATCH 046/210] Changing Namespace_ class alias --- src/LanguageHandler/Php/Parser/Entity/ClassEntity.php | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/LanguageHandler/Php/Parser/Entity/ClassEntity.php b/src/LanguageHandler/Php/Parser/Entity/ClassEntity.php index 1cef7bbd..8d1b17ca 100644 --- a/src/LanguageHandler/Php/Parser/Entity/ClassEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/ClassEntity.php @@ -31,7 +31,7 @@ use PhpParser\Node\Stmt\Enum_ as EnumNode; use PhpParser\Node\Stmt\EnumCase as EnumCaseNode; use PhpParser\Node\Stmt\Interface_ as InterfaceNode; -use PhpParser\Node\Stmt\Namespace_; +use PhpParser\Node\Stmt\Namespace_ as NamespaceNode; use PhpParser\Node\Stmt\Property as PropertyNode; use PhpParser\Node\Stmt\Trait_ as TraitNode; use PhpParser\NodeTraverser; @@ -241,7 +241,7 @@ public function getAst(): ClassNode|InterfaceNode|TraitNode|EnumNode $ast = $node; break; } - } elseif (!$node instanceof Namespace_) { + } elseif (!$node instanceof NamespaceNode) { continue; } $namespaceName = $node->name->toString(); @@ -1100,6 +1100,8 @@ public function hasParentClass(string $parentClassName): bool } /** + * @throws NotFoundException + * @throws DependencyException * @throws InvalidConfigurationParameterException * @throws ConstExprEvaluationException */ From e3704029432edeab397ad630a52458f0b06b3aa8 Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Mon, 13 Nov 2023 19:33:04 +0300 Subject: [PATCH 047/210] Adding iterable type --- .../Plugin/CorePlugin/BasePhpStubber/BasePhpStubberPlugin.php | 1 + 1 file changed, 1 insertion(+) diff --git a/src/LanguageHandler/Php/Plugin/CorePlugin/BasePhpStubber/BasePhpStubberPlugin.php b/src/LanguageHandler/Php/Plugin/CorePlugin/BasePhpStubber/BasePhpStubberPlugin.php index 6d603bb6..06619934 100644 --- a/src/LanguageHandler/Php/Plugin/CorePlugin/BasePhpStubber/BasePhpStubberPlugin.php +++ b/src/LanguageHandler/Php/Plugin/CorePlugin/BasePhpStubber/BasePhpStubberPlugin.php @@ -32,6 +32,7 @@ final class BasePhpStubberPlugin implements PluginInterface 'object' => 'https://www.php.net/manual/en/language.types.object.php', 'float' => 'https://www.php.net/manual/en/language.types.float.php', 'callable' => 'https://www.php.net/manual/en/language.types.callable.php', + 'iterable' => 'https://www.php.net/manual/en/language.types.iterable.php', '[]' => 'https://www.php.net/manual/en/language.types.array.php', '\Traversable' => 'https://www.php.net/manual/en/class.traversable.php', '\Iterator' => 'https://www.php.net/manual/en/class.iterator.php', From 62a195e9d0aa527660629dca2ad23126add8baf2 Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Mon, 13 Nov 2023 19:35:15 +0300 Subject: [PATCH 048/210] Fixing template --- selfdoc/templates/tech/4.pluginSystem/readme.md.twig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/selfdoc/templates/tech/4.pluginSystem/readme.md.twig b/selfdoc/templates/tech/4.pluginSystem/readme.md.twig index 9c719b1e..241faa28 100644 --- a/selfdoc/templates/tech/4.pluginSystem/readme.md.twig +++ b/selfdoc/templates/tech/4.pluginSystem/readme.md.twig @@ -43,7 +43,7 @@ Plugins for any programming languages work regardless of which language handler {% if match[2] %}{{ match[2] | upper }}{% else %}any{% endif %}
    - {% for key in pluginEntity.getMethodEntity('getSubscribedEvents').getFirstReturnValue() | eval | keys %} + {% for key in pluginEntity.getMethodEntity('getSubscribedEvents').getFirstReturnValue() | keys %}
  • [a]{{ key }}|short_form[/a]
  • {% endfor %}
From 83c2fb060affc8363099481628abd85be604746f Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Mon, 13 Nov 2023 22:35:10 +0300 Subject: [PATCH 049/210] Removing old code --- src/Core/Renderer/RendererIteratorFactory.php | 2 -- src/DocGenerator.php | 3 +-- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/src/Core/Renderer/RendererIteratorFactory.php b/src/Core/Renderer/RendererIteratorFactory.php index 61a176f7..907112ba 100644 --- a/src/Core/Renderer/RendererIteratorFactory.php +++ b/src/Core/Renderer/RendererIteratorFactory.php @@ -9,7 +9,6 @@ use BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache; use BumbleDocGen\Core\Cache\SharedCompressedDocumentFileCache; use BumbleDocGen\Core\Configuration\Configuration; -use BumbleDocGen\Core\Configuration\ConfigurationParameterBag; use BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException; use BumbleDocGen\Core\Logger\Handler\GenerationErrorsHandler; use BumbleDocGen\Core\Parser\Entity\RootEntityCollectionsGroup; @@ -34,7 +33,6 @@ public function __construct( private RootEntityCollectionsGroup $rootEntityCollectionsGroup, private DocumentedEntityWrappersCollection $documentedEntityWrappersCollection, private Configuration $configuration, - private ConfigurationParameterBag $configurationParameterBag, private SharedCompressedDocumentFileCache $sharedCompressedDocumentFileCache, private RendererHelper $rendererHelper, private RendererDependencyFactory $dependencyFactory, diff --git a/src/DocGenerator.php b/src/DocGenerator.php index fb1440d2..59171a11 100644 --- a/src/DocGenerator.php +++ b/src/DocGenerator.php @@ -28,7 +28,6 @@ use Symfony\Component\Console\Helper\Helper; use Symfony\Component\Console\Helper\TableSeparator; use Symfony\Component\Console\Style\OutputStyle; -use Symfony\Component\Filesystem\Filesystem; use Symfony\Component\Finder\Finder; /** @@ -40,7 +39,6 @@ final class DocGenerator public const LOG_FILE_NAME = 'last_run.log'; public function __construct( - private Filesystem $fs, private OutputStyle $io, private Configuration $configuration, PluginEventDispatcher $pluginEventDispatcher, @@ -77,6 +75,7 @@ public function parseAndGetRootEntityCollectionsGroup(): RootEntityCollectionsGr * @throws NotFoundException * @throws DependencyException * @throws InvalidConfigurationParameterException + * @throws \JsonException */ public function addDocBlocks( ProviderInterface $aiProvider, From 419c577a655974cbd80a9e92a455cc538596cbe1 Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Mon, 13 Nov 2023 23:09:25 +0300 Subject: [PATCH 050/210] Fixing formatting --- src/DocGenerator.php | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/DocGenerator.php b/src/DocGenerator.php index 59171a11..1b176cbf 100644 --- a/src/DocGenerator.php +++ b/src/DocGenerator.php @@ -38,6 +38,11 @@ final class DocGenerator public const VERSION = '1.5.0'; public const LOG_FILE_NAME = 'last_run.log'; + /** + * @throws DependencyException + * @throws InvalidConfigurationParameterException + * @throws NotFoundException + */ public function __construct( private OutputStyle $io, private Configuration $configuration, @@ -91,8 +96,7 @@ public function addDocBlocks( $alreadyProcessedEntities = []; $getEntities = function (ClassEntityCollection|array $entitiesCollection) use ( &$getEntities, - & - $alreadyProcessedEntities + &$alreadyProcessedEntities ): Generator { foreach ($entitiesCollection as $classEntity) { /**@var ClassEntity $classEntity */ From ecfa5d0f81caa4dacebee92405adb3a68b15d813 Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Mon, 13 Nov 2023 23:09:59 +0300 Subject: [PATCH 051/210] Process only php files --- .../Parser/Entity/ClassEntityCollection.php | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/src/LanguageHandler/Php/Parser/Entity/ClassEntityCollection.php b/src/LanguageHandler/Php/Parser/Entity/ClassEntityCollection.php index 51a66b1e..e5b7c117 100644 --- a/src/LanguageHandler/Php/Parser/Entity/ClassEntityCollection.php +++ b/src/LanguageHandler/Php/Parser/Entity/ClassEntityCollection.php @@ -35,6 +35,7 @@ */ final class ClassEntityCollection extends LoggableRootEntityCollection { + private const PHP_FILE_TEMPLATE = '/\.php$/'; public const NAME = 'phpClassEntityCollection'; private array $entitiesNotHandledByPlugins = []; @@ -76,7 +77,12 @@ public function loadClassEntities(): void $pb->setName('Loading PHP entities'); $classEntityFilter = $this->phpHandlerSettings->getClassEntityFilter(); - $allFiles = iterator_to_array($this->configuration->getSourceLocators()->getCommonFinder()->files()); + $allFiles = iterator_to_array( + $this->configuration + ->getSourceLocators() + ->getCommonFinder() + ->files() + ); $addedFilesCount = 0; $nodeTraverser = new NodeTraverser(); @@ -84,8 +90,16 @@ public function loadClassEntities(): void $phpParser = $this->phpParserHelper->phpParser(); foreach ($pb->iterate($allFiles) as $file) { + if (!preg_match(self::PHP_FILE_TEMPLATE, $file->getPathName())) { + continue; + } $pathName = $file->getPathName(); - $nodes = $phpParser->parse(file_get_contents($pathName)); + try { + $nodes = $phpParser->parse(file_get_contents($pathName)); + } catch (\Exception $e) { + $this->logger->warning("File `{$pathName}` parsing error: {$e->getMessage()}"); + continue; + } $nodes = $nodeTraverser->traverse($nodes); $relativeFileName = str_replace($this->configuration->getProjectRoot(), '', $pathName); $pb->setStepDescription("Processing `{$relativeFileName}` file"); @@ -105,7 +119,6 @@ public function loadClassEntities(): void $relativeFileName ); - // todo if ($classEntity->entityCacheIsOutdated()) { $classEntity->setCustomAst($subNode); } From 49a4db0a770b5960f6e178de236c809f3188dd79 Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Mon, 13 Nov 2023 23:18:48 +0300 Subject: [PATCH 052/210] Changing phpParser helper namespace --- src/LanguageHandler/Php/Parser/Entity/ClassEntity.php | 4 ++-- .../Php/Parser/Entity/ClassEntityCollection.php | 2 +- src/LanguageHandler/Php/Parser/Entity/ConstantEntity.php | 2 +- src/LanguageHandler/Php/Parser/Entity/MethodEntity.php | 2 +- .../Parser/Entity/{Ast => PhpParser}/NodeValueCompiler.php | 2 +- .../Php/Parser/Entity/{Ast => PhpParser}/PhpParserHelper.php | 2 +- src/LanguageHandler/Php/Parser/Entity/PropertyEntity.php | 2 +- 7 files changed, 8 insertions(+), 8 deletions(-) rename src/LanguageHandler/Php/Parser/Entity/{Ast => PhpParser}/NodeValueCompiler.php (99%) rename src/LanguageHandler/Php/Parser/Entity/{Ast => PhpParser}/PhpParserHelper.php (88%) diff --git a/src/LanguageHandler/Php/Parser/Entity/ClassEntity.php b/src/LanguageHandler/Php/Parser/Entity/ClassEntity.php index 8d1b17ca..8156c704 100644 --- a/src/LanguageHandler/Php/Parser/Entity/ClassEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/ClassEntity.php @@ -14,8 +14,8 @@ use BumbleDocGen\Core\Renderer\EntityDocRenderer\EntityDocRendererInterface; use BumbleDocGen\Core\Renderer\Twig\Filter\PrepareSourceLink; use BumbleDocGen\LanguageHandler\Php\Parser\ComposerHelper; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Ast\NodeValueCompiler; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Ast\PhpParserHelper; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpParser\NodeValueCompiler; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpParser\PhpParserHelper; use BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper; use BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings; use DI\Attribute\Inject; diff --git a/src/LanguageHandler/Php/Parser/Entity/ClassEntityCollection.php b/src/LanguageHandler/Php/Parser/Entity/ClassEntityCollection.php index e5b7c117..e2c7a6dd 100644 --- a/src/LanguageHandler/Php/Parser/Entity/ClassEntityCollection.php +++ b/src/LanguageHandler/Php/Parser/Entity/ClassEntityCollection.php @@ -11,7 +11,7 @@ use BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException; use BumbleDocGen\Core\Parser\Entity\LoggableRootEntityCollection; use BumbleDocGen\Core\Plugin\PluginEventDispatcher; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Ast\PhpParserHelper; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpParser\PhpParserHelper; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Cache\CacheablePhpEntityFactory; use BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings; use BumbleDocGen\LanguageHandler\Php\Plugin\Event\Parser\AfterLoadingClassEntityCollection; diff --git a/src/LanguageHandler/Php/Parser/Entity/ConstantEntity.php b/src/LanguageHandler/Php/Parser/Entity/ConstantEntity.php index 5708ac9c..386d128d 100644 --- a/src/LanguageHandler/Php/Parser/Entity/ConstantEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/ConstantEntity.php @@ -8,7 +8,7 @@ use BumbleDocGen\Core\Configuration\Configuration; use BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException; use BumbleDocGen\Core\Parser\Entity\Cache\CacheableMethod; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Ast\NodeValueCompiler; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpParser\NodeValueCompiler; use BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper; use BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings; use phpDocumentor\Reflection\DocBlock; diff --git a/src/LanguageHandler/Php/Parser/Entity/MethodEntity.php b/src/LanguageHandler/Php/Parser/Entity/MethodEntity.php index 3a43b38d..7df2fab3 100644 --- a/src/LanguageHandler/Php/Parser/Entity/MethodEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/MethodEntity.php @@ -9,7 +9,7 @@ use BumbleDocGen\Core\Configuration\Configuration; use BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException; use BumbleDocGen\Core\Parser\Entity\Cache\CacheableMethod; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Ast\NodeValueCompiler; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpParser\NodeValueCompiler; use BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper; use BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings; use DI\DependencyException; diff --git a/src/LanguageHandler/Php/Parser/Entity/Ast/NodeValueCompiler.php b/src/LanguageHandler/Php/Parser/Entity/PhpParser/NodeValueCompiler.php similarity index 99% rename from src/LanguageHandler/Php/Parser/Entity/Ast/NodeValueCompiler.php rename to src/LanguageHandler/Php/Parser/Entity/PhpParser/NodeValueCompiler.php index 28a8704d..c4f3f38e 100644 --- a/src/LanguageHandler/Php/Parser/Entity/Ast/NodeValueCompiler.php +++ b/src/LanguageHandler/Php/Parser/Entity/PhpParser/NodeValueCompiler.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace BumbleDocGen\LanguageHandler\Php\Parser\Entity\Ast; +namespace BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpParser; use BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity; diff --git a/src/LanguageHandler/Php/Parser/Entity/Ast/PhpParserHelper.php b/src/LanguageHandler/Php/Parser/Entity/PhpParser/PhpParserHelper.php similarity index 88% rename from src/LanguageHandler/Php/Parser/Entity/Ast/PhpParserHelper.php rename to src/LanguageHandler/Php/Parser/Entity/PhpParser/PhpParserHelper.php index 77c46b74..07e9a9c6 100644 --- a/src/LanguageHandler/Php/Parser/Entity/Ast/PhpParserHelper.php +++ b/src/LanguageHandler/Php/Parser/Entity/PhpParser/PhpParserHelper.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace BumbleDocGen\LanguageHandler\Php\Parser\Entity\Ast; +namespace BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpParser; use PhpParser\Lexer\Emulative; use PhpParser\Parser; diff --git a/src/LanguageHandler/Php/Parser/Entity/PropertyEntity.php b/src/LanguageHandler/Php/Parser/Entity/PropertyEntity.php index 39cfdd61..0b257050 100644 --- a/src/LanguageHandler/Php/Parser/Entity/PropertyEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/PropertyEntity.php @@ -9,7 +9,7 @@ use BumbleDocGen\Core\Configuration\Configuration; use BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException; use BumbleDocGen\Core\Parser\Entity\Cache\CacheableMethod; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Ast\NodeValueCompiler; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpParser\NodeValueCompiler; use BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper; use BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings; use DI\DependencyException; From e0c235a5a3cec1b9472af578f131d5b1d62c9f15 Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Mon, 13 Nov 2023 23:19:58 +0300 Subject: [PATCH 053/210] Removing debug info --- src/LanguageHandler/Php/Parser/Entity/ClassEntity.php | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/LanguageHandler/Php/Parser/Entity/ClassEntity.php b/src/LanguageHandler/Php/Parser/Entity/ClassEntity.php index 8156c704..8fb0f826 100644 --- a/src/LanguageHandler/Php/Parser/Entity/ClassEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/ClassEntity.php @@ -258,10 +258,6 @@ public function getAst(): ClassNode|InterfaceNode|TraitNode|EnumNode } if (!$ast) { - if ($this->getName() === 'MeetD') { - $this->logger->emergency($this->getAbsoluteFileName()); - die(); - } throw new \RuntimeException("Entity `{$this->getName()}` not found"); } $this->isClassLoad = true; From 3d9b524e8e4e3adab69b53b340b4b07e931ceb12 Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Tue, 14 Nov 2023 00:49:39 +0300 Subject: [PATCH 054/210] Updating templates --- selfdoc/templates/tech/2.parser/sourceLocator.md.twig | 11 ----------- .../tech/3.renderer/04_twigCustomFilters.md.twig | 4 +--- 2 files changed, 1 insertion(+), 14 deletions(-) diff --git a/selfdoc/templates/tech/2.parser/sourceLocator.md.twig b/selfdoc/templates/tech/2.parser/sourceLocator.md.twig index 0957a20e..dfbb5a49 100644 --- a/selfdoc/templates/tech/2.parser/sourceLocator.md.twig +++ b/selfdoc/templates/tech/2.parser/sourceLocator.md.twig @@ -19,20 +19,9 @@ You can create your own source locators or use any existing ones. All source loc {{ "Built-in source locators" | textToHeading('H2') }} -**Common source locators:** - {{ printEntityCollectionAsList( phpClassEntityCollection .filterByInterfaces(['BumbleDocGen\\Core\\Parser\\SourceLocator\\SourceLocatorInterface']) .filterByPaths(['/src/Core/Parser']) .getOnlyInstantiable() ) }} - -**PHP source locators:** - -{{ printEntityCollectionAsList( - phpClassEntityCollection - .filterByInterfaces(['BumbleDocGen\\Core\\Parser\\SourceLocator\\SourceLocatorInterface']) - .filterByPaths(['/src/LanguageHandler/Php/Parser']) - .getOnlyInstantiable() -) }} \ No newline at end of file diff --git a/selfdoc/templates/tech/3.renderer/04_twigCustomFilters.md.twig b/selfdoc/templates/tech/3.renderer/04_twigCustomFilters.md.twig index b01ab5df..d760db7a 100644 --- a/selfdoc/templates/tech/3.renderer/04_twigCustomFilters.md.twig +++ b/selfdoc/templates/tech/3.renderer/04_twigCustomFilters.md.twig @@ -70,9 +70,7 @@ Here is a list of filters available by default: {% set rowspan = paramsCount * 2 - 1 %} 1 %}rowspan="{{ rowspan }}"{% endif %}> {{ twigFilterData.name }}
- {% if filter.isInternal() %}:warning: For internal use
{% endif %} - {{ filter.getDescription() | removeLineBrakes }} - {% if filter.getDocNote() %}
:warning: {{ filter.getDocNote() }}
{% endif %} + {% if filter.isInternal() %}:warning: For internal use
{% endif %}{{ filter.getDescription() | removeLineBrakes }}{% if filter.getDocNote() %}
:warning: {{ filter.getDocNote() }}
{% endif %} {% if rowspan == 1 %} The filter does not accept any additional parameters From 192e0698aa778732678b3202c5fda98e17c83c80 Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Tue, 14 Nov 2023 00:52:59 +0300 Subject: [PATCH 055/210] Adding comments --- src/Core/Renderer/Twig/Filter/Implode.php | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/Core/Renderer/Twig/Filter/Implode.php b/src/Core/Renderer/Twig/Filter/Implode.php index 065bb8a0..33a91fb2 100644 --- a/src/Core/Renderer/Twig/Filter/Implode.php +++ b/src/Core/Renderer/Twig/Filter/Implode.php @@ -3,10 +3,17 @@ namespace BumbleDocGen\Core\Renderer\Twig\Filter; /** + * Join array elements with a string + * * @see https://www.php.net/manual/en/function.implode.php */ final class Implode implements CustomFilterInterface { + /** + * @param array $elements The array to implode + * @param string $separator Element separator in result string + * @return string $result + */ public function __invoke(array $elements, string $separator = ', '): string { return implode($separator, $elements); From f67fa17775f37e126ef191f620c9438e4808f97d Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Tue, 14 Nov 2023 00:53:29 +0300 Subject: [PATCH 056/210] Updating doc --- docs/README.md | 2 +- docs/classes/DocGenerator.md | 39 +- .../InvalidConfigurationParameterException.md | 359 +---- docs/classes/ReflectionException.md | 391 ----- docs/shared_c.cache | 2 +- .../1.configuration/classes/Configuration.md | 8 +- .../DocumentedEntityWrappersCollection.md | 29 +- .../classes/DrawDocumentedEntityLink.md | 13 +- .../classes/GetDocumentedEntityUrl.md | 15 +- docs/tech/1.configuration/classes/Implode.md | 154 ++ .../InvalidConfigurationParameterException.md | 359 +---- .../classes/PageHtmlLinkerPlugin.md | 13 +- .../classes/PageLinkerPlugin.md | 13 +- .../classes/ReflectionException.md | 391 ----- .../classes/RendererContext.md | 4 +- docs/tech/1.configuration/readme.md | 4 +- .../2.parser/classes/AsyncSourceLocator.md | 159 -- docs/tech/2.parser/classes/ClassEntity.md | 818 +++++----- .../2.parser/classes/ClassEntityCollection.md | 113 +- docs/tech/2.parser/classes/ConstantEntity.md | 300 ++-- .../classes/ConstantEntityCollection.md | 45 +- .../2.parser/classes/DynamicMethodEntity.md | 115 +- docs/tech/2.parser/classes/EntityInterface.md | 8 +- .../InvalidConfigurationParameterException.md | 359 +---- docs/tech/2.parser/classes/MethodEntity.md | 374 +++-- .../classes/MethodEntityCollection.md | 49 +- docs/tech/2.parser/classes/ProjectParser.md | 13 +- docs/tech/2.parser/classes/PropertyEntity.md | 301 ++-- .../classes/PropertyEntityCollection.md | 48 +- .../2.parser/classes/ReflectionException.md | 391 ----- .../2.parser/classes/RootEntityCollection.md | 27 +- .../2.parser/classes/RootEntityInterface.md | 14 +- .../classes/SourceLocatorInterface.md | 4 +- docs/tech/2.parser/entity.md | 2 +- docs/tech/2.parser/entityFilterCondition.md | 2 +- docs/tech/2.parser/readme.md | 2 +- docs/tech/2.parser/sourceLocator.md | 7 +- docs/tech/3.renderer/01_templates.md | 2 +- docs/tech/3.renderer/02_breadcrumbs.md | 2 +- docs/tech/3.renderer/03_documentStructure.md | 2 +- docs/tech/3.renderer/04_twigCustomFilters.md | 49 +- .../tech/3.renderer/05_twigCustomFunctions.md | 2 +- .../3.renderer/classes/BreadcrumbsHelper.md | 16 +- .../classes/ClassEntityCollection.md | 113 +- .../classes/ClassEntityCollection_2.md | 113 +- .../DocumentedEntityWrappersCollection.md | 29 +- docs/tech/3.renderer/classes/DrawClassMap.md | 20 +- .../classes/DrawDocumentedEntityLink.md | 13 +- .../classes/GetClassMethodsBodyCode.md | 17 +- .../classes/GetDocumentedEntityUrl.md | 15 +- .../classes/GetDocumentedEntityUrl_2.md | 15 +- .../classes/GetDocumentedEntityUrl_3.md | 15 +- docs/tech/3.renderer/classes/Implode.md | 154 ++ .../InvalidConfigurationParameterException.md | 359 +---- .../classes/PageHtmlLinkerPlugin.md | 13 +- .../3.renderer/classes/ReflectionException.md | 391 ----- .../3.renderer/classes/RendererContext.md | 4 +- .../classes/RootEntityCollection.md | 27 +- .../3.renderer/classes/RootEntityInterface.md | 14 +- .../classes/RootEntityInterface_2.md | 14 +- docs/tech/3.renderer/readme.md | 2 +- .../tech/3.renderer/templatesDynamicBlocks.md | 2 +- docs/tech/3.renderer/templatesLinking.md | 2 +- docs/tech/3.renderer/templatesVariables.md | 2 +- .../AfterLoadingClassEntityCollection.md | 52 - .../classes/AfterRenderingEntities.md | 58 - .../classes/BasePhpStubberPlugin.md | 51 +- .../classes/BeforeCreatingDocFile.md | 52 - .../classes/BeforeParsingProcess.md | 63 + .../classes/BeforeRenderingDocFiles.md | 58 - .../classes/BeforeRenderingEntities.md | 58 - .../classes/EntityDocUnifiedPlacePlugin.md | 4 +- .../InvalidConfigurationParameterException.md | 359 +---- .../classes/LastPageCommitter.md | 4 +- .../classes/OnAddClassEntityToCollection.md | 52 - .../classes/OnCheckIsClassEntityCanBeLoad.md | 54 +- .../OnCreateDocumentedEntityWrapper.md | 52 - .../classes/OnGetProjectTemplatesDirs.md | 52 - .../OnGetTemplatePathByRelativeDocPath.md | 56 +- .../classes/OnGettingResourceLink.md | 56 +- .../classes/OnLoadEntityDocPluginContent.md | 52 - .../classes/OnLoadSourceLocatorsCollection.md | 52 - .../classes/PageHtmlLinkerPlugin.md | 13 +- .../classes/PageLinkerPlugin.md | 13 +- .../classes/PageRstLinkerPlugin.md | 13 +- .../classes/PhpDocumentorStubberPlugin.md | 4 +- .../classes/PhpUnitStubberPlugin.md | 4 +- .../4.pluginSystem/classes/PluginInterface.md | 34 +- .../classes/ReflectionException.md | 391 ----- .../4.pluginSystem/classes/StubberPlugin.md | 18 +- docs/tech/4.pluginSystem/readme.md | 6 +- docs/tech/classes/AddDocBlocksCommand.md | 1305 +-------------- .../classes/AdditionalCommandCollection.md | 19 +- .../AfterLoadingClassEntityCollection.md | 52 - docs/tech/classes/AfterRenderingEntities.md | 58 - docs/tech/classes/App.md | 1408 +---------------- docs/tech/classes/AsyncSourceLocator.md | 159 -- docs/tech/classes/BaseCommand.md | 1304 +-------------- docs/tech/classes/BaseEntity.md | 169 +- docs/tech/classes/BaseEntityCollection.md | 23 +- docs/tech/classes/BasePageLinker.md | 15 +- docs/tech/classes/BasePhpStubberPlugin.md | 51 +- docs/tech/classes/BeforeCreatingDocFile.md | 52 - docs/tech/classes/BeforeParsingProcess.md | 63 + docs/tech/classes/BeforeRenderingDocFiles.md | 58 - docs/tech/classes/BeforeRenderingEntities.md | 58 - docs/tech/classes/BreadcrumbsHelper.md | 16 +- .../tech/classes/CacheablePhpEntityFactory.md | 172 +- docs/tech/classes/CachedSourceLocator.md | 196 --- docs/tech/classes/ClassEntity.md | 818 +++++----- docs/tech/classes/ClassEntityCollection.md | 113 +- .../{ComposerParser.md => ComposerHelper.md} | 56 +- docs/tech/classes/Configuration.md | 8 +- .../tech/classes/ConfigurationParameterBag.md | 12 +- docs/tech/classes/Configuration_2.md | 8 +- docs/tech/classes/ConstantEntity.md | 300 ++-- docs/tech/classes/ConstantEntityCollection.md | 45 +- docs/tech/classes/CustomFiltersCollection.md | 23 +- .../tech/classes/CustomFunctionsCollection.md | 23 +- .../classes/CustomSourceLocatorInterface.md | 81 - docs/tech/classes/DocBlocksGenerator.md | 21 +- docs/tech/classes/DocGenerator.md | 39 +- .../DocumentedEntityWrappersCollection.md | 29 +- .../DocumentedEntityWrappersCollection_2.md | 29 +- docs/tech/classes/DrawClassMap.md | 20 +- docs/tech/classes/DrawDocumentedEntityLink.md | 13 +- docs/tech/classes/DynamicMethodEntity.md | 115 +- docs/tech/classes/EntityCacheItemPool.md | 91 +- docs/tech/classes/EntityDocRendererHelper.md | 20 +- .../classes/EntityDocRenderersCollection.md | 23 +- .../classes/EntityDocUnifiedPlacePlugin.md | 4 +- docs/tech/classes/EntityInterface.md | 8 +- docs/tech/classes/FileDependency.md | 12 +- docs/tech/classes/GenerateCommand.md | 1304 +-------------- .../classes/GenerateReadMeTemplateCommand.md | 1305 +-------------- docs/tech/classes/GenerationErrorsHandler.md | 520 +----- docs/tech/classes/GetClassMethodsBodyCode.md | 17 +- docs/tech/classes/GetDocumentedEntityUrl.md | 15 +- docs/tech/classes/GetDocumentedEntityUrl_2.md | 15 +- docs/tech/classes/Implode.md | 154 ++ .../InvalidConfigurationParameterException.md | 359 +---- ...nvalidConfigurationParameterException_2.md | 359 +---- .../classes/LanguageHandlersCollection.md | 23 +- docs/tech/classes/LastPageCommitter.md | 4 +- .../classes/LoggableRootEntityCollection.md | 27 +- docs/tech/classes/MainExtension.md | 104 -- docs/tech/classes/MethodEntity.md | 374 +++-- docs/tech/classes/MethodEntityCollection.md | 49 +- docs/tech/classes/MethodEntityInterface.md | 10 +- docs/tech/classes/NodeValueCompiler.md | 96 ++ docs/tech/classes/ObjectNotFoundException.md | 359 +---- .../tech/classes/ObjectNotFoundException_2.md | 359 +---- .../classes/OnAddClassEntityToCollection.md | 52 - .../classes/OnCheckIsClassEntityCanBeLoad.md | 54 +- .../OnCreateDocumentedEntityWrapper.md | 52 - .../tech/classes/OnGetProjectTemplatesDirs.md | 52 - .../OnGetTemplatePathByRelativeDocPath.md | 56 +- docs/tech/classes/OnGettingResourceLink.md | 56 +- .../classes/OnLoadEntityDocPluginContent.md | 52 - .../classes/OnLoadSourceLocatorsCollection.md | 52 - docs/tech/classes/OperationsCollection.md | 19 +- docs/tech/classes/PageHtmlLinkerPlugin.md | 13 +- docs/tech/classes/PageLinkerPlugin.md | 13 +- docs/tech/classes/PageRstLinkerPlugin.md | 13 +- docs/tech/classes/ParserHelper.md | 136 +- .../classes/PhpDocumentorStubberPlugin.md | 4 +- docs/tech/classes/PhpHandler.md | 18 +- docs/tech/classes/PhpHandlerSettings.md | 4 +- docs/tech/classes/PhpParserHelper.md | 64 + docs/tech/classes/PhpUnitStubberPlugin.md | 4 +- docs/tech/classes/PluginEventDispatcher.md | 329 +--- docs/tech/classes/PluginInterface.md | 34 +- docs/tech/classes/PluginsCollection.md | 23 +- docs/tech/classes/ProjectParser.md | 13 +- docs/tech/classes/PropertyEntity.md | 301 ++-- docs/tech/classes/PropertyEntityCollection.md | 48 +- docs/tech/classes/ReadmeTemplateGenerator.md | 9 +- docs/tech/classes/ReflectionException.md | 391 ----- docs/tech/classes/ReflectionException_2.md | 391 ----- docs/tech/classes/ReflectorWrapper.md | 377 ----- docs/tech/classes/RendererContext.md | 4 +- docs/tech/classes/RendererContext_2.md | 4 +- docs/tech/classes/RendererHelper.md | 4 +- docs/tech/classes/RendererIteratorFactory.md | 17 +- docs/tech/classes/RootEntityCollection.md | 27 +- .../classes/RootEntityCollectionsGroup.md | 23 +- docs/tech/classes/RootEntityInterface.md | 14 +- docs/tech/classes/RootEntityInterface_2.md | 14 +- .../classes/SingleEntitySearchOperation.md | 8 +- .../classes/SourceLocatorCacheItemPool.md | 461 ------ docs/tech/classes/SourceLocatorInterface.md | 4 +- docs/tech/classes/SourceLocatorsCollection.md | 19 +- docs/tech/classes/StubberPlugin.md | 18 +- docs/tech/classes/StylizedProgressBar.md | 2 +- docs/tech/classes/SystemAsyncSourceLocator.md | 282 ---- docs/tech/classes/TemplateFile.md | 4 +- docs/tech/classes/ValueToClassTransformer.md | 4 +- docs/tech/map.md | 44 +- docs/tech/readme.md | 2 +- 199 files changed, 3864 insertions(+), 20298 deletions(-) delete mode 100644 docs/classes/ReflectionException.md create mode 100644 docs/tech/1.configuration/classes/Implode.md delete mode 100644 docs/tech/1.configuration/classes/ReflectionException.md delete mode 100644 docs/tech/2.parser/classes/AsyncSourceLocator.md delete mode 100644 docs/tech/2.parser/classes/ReflectionException.md create mode 100644 docs/tech/3.renderer/classes/Implode.md delete mode 100644 docs/tech/3.renderer/classes/ReflectionException.md create mode 100644 docs/tech/4.pluginSystem/classes/BeforeParsingProcess.md delete mode 100644 docs/tech/4.pluginSystem/classes/ReflectionException.md delete mode 100644 docs/tech/classes/AsyncSourceLocator.md create mode 100644 docs/tech/classes/BeforeParsingProcess.md delete mode 100644 docs/tech/classes/CachedSourceLocator.md rename docs/tech/classes/{ComposerParser.md => ComposerHelper.md} (63%) delete mode 100644 docs/tech/classes/CustomSourceLocatorInterface.md create mode 100644 docs/tech/classes/Implode.md create mode 100644 docs/tech/classes/NodeValueCompiler.md create mode 100644 docs/tech/classes/PhpParserHelper.md delete mode 100644 docs/tech/classes/ReflectionException.md delete mode 100644 docs/tech/classes/ReflectionException_2.md delete mode 100644 docs/tech/classes/ReflectorWrapper.md delete mode 100644 docs/tech/classes/SourceLocatorCacheItemPool.md delete mode 100644 docs/tech/classes/SystemAsyncSourceLocator.md diff --git a/docs/README.md b/docs/README.md index 99ec2743..60813573 100644 --- a/docs/README.md +++ b/docs/README.md @@ -95,4 +95,4 @@ To update this documentation, run the following command:

-Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
Last modified date: Sat Oct 28 11:03:31 2023 +0300
Page content update date: Mon Nov 06 2023
Made with Bumble Documentation Generator
\ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
Last modified date: Sat Oct 28 11:03:31 2023 +0300
Page content update date: Mon Nov 13 2023
Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/classes/DocGenerator.md b/docs/classes/DocGenerator.md index f52e4fcb..a750e965 100644 --- a/docs/classes/DocGenerator.md +++ b/docs/classes/DocGenerator.md @@ -2,7 +2,7 @@ BumbleDocGen / DocGenerator

- DocGenerator class: + DocGenerator class:

@@ -52,11 +52,11 @@ final class DocGenerator @@ -71,11 +71,11 @@ final class DocGenerator ```php -public function __construct(\Symfony\Component\Filesystem\Filesystem $fs, \Symfony\Component\Console\Style\OutputStyle $io, \BumbleDocGen\Core\Configuration\Configuration $configuration, \BumbleDocGen\Core\Plugin\PluginEventDispatcher $pluginEventDispatcher, \BumbleDocGen\Core\Parser\ProjectParser $parser, \BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper $parserHelper, \BumbleDocGen\Core\Renderer\Renderer $renderer, \BumbleDocGen\Core\Logger\Handler\GenerationErrorsHandler $generationErrorsHandler, \BumbleDocGen\Core\Parser\Entity\RootEntityCollectionsGroup $rootEntityCollectionsGroup, \Monolog\Logger $logger); +public function __construct(\Symfony\Component\Console\Style\OutputStyle $io, \BumbleDocGen\Core\Configuration\Configuration $configuration, \BumbleDocGen\Core\Plugin\PluginEventDispatcher $pluginEventDispatcher, \BumbleDocGen\Core\Parser\ProjectParser $parser, \BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper $parserHelper, \BumbleDocGen\Core\Renderer\Renderer $renderer, \BumbleDocGen\Core\Logger\Handler\GenerationErrorsHandler $generationErrorsHandler, \BumbleDocGen\Core\Parser\Entity\RootEntityCollectionsGroup $rootEntityCollectionsGroup, \Monolog\Logger $logger); ``` @@ -91,11 +91,6 @@ public function __construct(\Symfony\Component\Filesystem\Filesystem $fs, \Symfo - - $fs - \Symfony\Component\Filesystem\Filesystem - - - $io \Symfony\Component\Console\Style\OutputStyle @@ -146,6 +141,19 @@ public function __construct(\Symfony\Component\Filesystem\Filesystem $fs, \Symfo +Throws: + +
@@ -153,7 +161,7 @@ public function __construct(\Symfony\Component\Filesystem\Filesystem $fs, \Symfo ```php @@ -193,10 +201,10 @@ public function addDocBlocks(\BumbleDocGen\AI\ProviderInterface $aiProvider): vo \DI\DependencyException
  • - \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \JsonException @@ -271,9 +279,6 @@ public function generateReadmeTemplate(\BumbleDocGen\AI\ProviderInterface $aiPro Throws:
      -
    • - \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
    • -
    • \DI\DependencyException
    • @@ -292,7 +297,7 @@ public function generateReadmeTemplate(\BumbleDocGen\AI\ProviderInterface $aiPro ```php diff --git a/docs/classes/InvalidConfigurationParameterException.md b/docs/classes/InvalidConfigurationParameterException.md index abadd7bb..7797ce0c 100644 --- a/docs/classes/InvalidConfigurationParameterException.md +++ b/docs/classes/InvalidConfigurationParameterException.md @@ -12,380 +12,23 @@ ```php namespace BumbleDocGen\Core\Configuration\Exception; -final class InvalidConfigurationParameterException extends \Exception implements \Throwable, \Stringable +final class InvalidConfigurationParameterException extends \Exception ``` -
      Exception is the base class for -all Exceptions.
      -See: - -

      Initialization methods:

      -
        -
      1. - __construct - - Construct the exception. Note: The message is NOT binary safe.
      2. -
      -

      Methods:

      -
        -
      1. - __toString - - String representation of the exception
      2. -
      3. - __wakeup -
      4. -
      5. - getCode - - Gets the Exception code
      6. -
      7. - getFile - - Gets the file in which the exception occurred
      8. -
      9. - getLine - - Gets the line in which the exception occurred
      10. -
      11. - getMessage - - Gets the Exception message
      12. -
      13. - getPrevious - - Returns previous Exception
      14. -
      15. - getTrace - - Gets the stack trace
      16. -
      17. - getTraceAsString - - Gets the stack trace as a string
      18. -
      - -

      Method details:

      - -
      - -
        -
      • # - __construct -
      • -
      - -```php -// Implemented in Exception - -public function __construct(string $message = "", int $code, \Throwable|null $previous = \null); -``` - -
      Construct the exception. Note: The message is NOT binary safe.
      - -Parameters: - - - - - - - - - - - - - - - - - - - - - - - - - - -
      NameTypeDescription
      $messagestring[optional] The Exception message to throw.
      $codeint[optional] The Exception code.
      $previous\Throwable | null[optional] The previous throwable used for the exception chaining.
      - - - - -See: - -
      -
      -
      - -
        -
      • # - __toString -
      • -
      - -```php -// Implemented in Exception - -public function __toString(): string; -``` - -
      String representation of the exception
      - -Parameters: not specified - -Return value: string - - - -See: - -
      -
      -
      - -
        -
      • # - __wakeup -
      • -
      - -```php -// Implemented in Exception - -public function __wakeup(): mixed; -``` - - - -Parameters: not specified - -Return value: mixed - - -
      -
      -
      - -
        -
      • # - getCode -
      • -
      - -```php -// Implemented in Exception - -public function getCode(): mixed|int; -``` - -
      Gets the Exception code
      - -Parameters: not specified - -Return value: mixed | int - - - -See: - -
      -
      -
      - -
        -
      • # - getFile -
      • -
      - -```php -// Implemented in Exception - -public function getFile(): string; -``` - -
      Gets the file in which the exception occurred
      - -Parameters: not specified - -Return value: string - - - -See: - -
      -
      -
      - -
        -
      • # - getLine -
      • -
      - -```php -// Implemented in Exception - -public function getLine(): int; -``` - -
      Gets the line in which the exception occurred
      - -Parameters: not specified - -Return value: int - - - -See: - -
      -
      -
      - -
        -
      • # - getMessage -
      • -
      - -```php -// Implemented in Exception - -public function getMessage(): string; -``` - -
      Gets the Exception message
      - -Parameters: not specified - -Return value: string - - - -See: - -
      -
      -
      - -
        -
      • # - getPrevious -
      • -
      - -```php -// Implemented in Exception - -public function getPrevious(): \Throwable|null; -``` - -
      Returns previous Exception
      - -Parameters: not specified - -Return value: \Throwable | null - - - -See: - -
      -
      -
      - -
        -
      • # - getTrace -
      • -
      - -```php -// Implemented in Exception - -public function getTrace(): array; -``` - -
      Gets the stack trace
      - -Parameters: not specified - -Return value: array - - - -See: - -
      -
      -
      - -
        -
      • # - getTraceAsString -
      • -
      - -```php -// Implemented in Exception - -public function getTraceAsString(): string; -``` - -
      Gets the stack trace as a string
      - -Parameters: not specified - -Return value: string - - - -See: - -
      -
      - \ No newline at end of file diff --git a/docs/classes/ReflectionException.md b/docs/classes/ReflectionException.md deleted file mode 100644 index 48c2d87a..00000000 --- a/docs/classes/ReflectionException.md +++ /dev/null @@ -1,391 +0,0 @@ - - BumbleDocGen / ReflectionException
      - -

      - ReflectionException class: -

      - - - - - -```php -namespace BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception; - -final class ReflectionException extends \Exception implements \Throwable, \Stringable -``` - -
      Exception is the base class for -all Exceptions.
      - -See: - - - - - - - -

      Initialization methods:

      - -
        -
      1. - __construct - - Construct the exception. Note: The message is NOT binary safe.
      2. -
      - -

      Methods:

      - -
        -
      1. - __toString - - String representation of the exception
      2. -
      3. - __wakeup -
      4. -
      5. - getCode - - Gets the Exception code
      6. -
      7. - getFile - - Gets the file in which the exception occurred
      8. -
      9. - getLine - - Gets the line in which the exception occurred
      10. -
      11. - getMessage - - Gets the Exception message
      12. -
      13. - getPrevious - - Returns previous Exception
      14. -
      15. - getTrace - - Gets the stack trace
      16. -
      17. - getTraceAsString - - Gets the stack trace as a string
      18. -
      - - - - - - - -

      Method details:

      - -
      - -
        -
      • # - __construct -
      • -
      - -```php -// Implemented in Exception - -public function __construct(string $message = "", int $code, \Throwable|null $previous = \null); -``` - -
      Construct the exception. Note: The message is NOT binary safe.
      - -Parameters: - - - - - - - - - - - - - - - - - - - - - - - - - - -
      NameTypeDescription
      $messagestring[optional] The Exception message to throw.
      $codeint[optional] The Exception code.
      $previous\Throwable | null[optional] The previous throwable used for the exception chaining.
      - - - - -See: - -
      -
      -
      - -
        -
      • # - __toString -
      • -
      - -```php -// Implemented in Exception - -public function __toString(): string; -``` - -
      String representation of the exception
      - -Parameters: not specified - -Return value: string - - - -See: - -
      -
      -
      - -
        -
      • # - __wakeup -
      • -
      - -```php -// Implemented in Exception - -public function __wakeup(): mixed; -``` - - - -Parameters: not specified - -Return value: mixed - - -
      -
      -
      - -
        -
      • # - getCode -
      • -
      - -```php -// Implemented in Exception - -public function getCode(): mixed|int; -``` - -
      Gets the Exception code
      - -Parameters: not specified - -Return value: mixed | int - - - -See: - -
      -
      -
      - -
        -
      • # - getFile -
      • -
      - -```php -// Implemented in Exception - -public function getFile(): string; -``` - -
      Gets the file in which the exception occurred
      - -Parameters: not specified - -Return value: string - - - -See: - -
      -
      -
      - -
        -
      • # - getLine -
      • -
      - -```php -// Implemented in Exception - -public function getLine(): int; -``` - -
      Gets the line in which the exception occurred
      - -Parameters: not specified - -Return value: int - - - -See: - -
      -
      -
      - -
        -
      • # - getMessage -
      • -
      - -```php -// Implemented in Exception - -public function getMessage(): string; -``` - -
      Gets the Exception message
      - -Parameters: not specified - -Return value: string - - - -See: - -
      -
      -
      - -
        -
      • # - getPrevious -
      • -
      - -```php -// Implemented in Exception - -public function getPrevious(): \Throwable|null; -``` - -
      Returns previous Exception
      - -Parameters: not specified - -Return value: \Throwable | null - - - -See: - -
      -
      -
      - -
        -
      • # - getTrace -
      • -
      - -```php -// Implemented in Exception - -public function getTrace(): array; -``` - -
      Gets the stack trace
      - -Parameters: not specified - -Return value: array - - - -See: - -
      -
      -
      - -
        -
      • # - getTraceAsString -
      • -
      - -```php -// Implemented in Exception - -public function getTraceAsString(): string; -``` - -
      Gets the stack trace as a string
      - -Parameters: not specified - -Return value: string - - - -See: - -
      -
      - - \ No newline at end of file diff --git a/docs/shared_c.cache b/docs/shared_c.cache index 6bdf57da..9fe18f74 100644 --- a/docs/shared_c.cache +++ b/docs/shared_c.cache @@ -1 +1 @@ -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 \ No newline at end of file +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 \ No newline at end of file diff --git a/docs/tech/1.configuration/classes/Configuration.md b/docs/tech/1.configuration/classes/Configuration.md index d62e9a5d..74a5c34a 100644 --- a/docs/tech/1.configuration/classes/Configuration.md +++ b/docs/tech/1.configuration/classes/Configuration.md @@ -197,14 +197,14 @@ public function getAdditionalConsoleCommands(): \BumbleDocGen\Console\Command\Ad
    ```php -public function getCacheDir(): string|null; +public function getCacheDir(): null|string; ``` Parameters: not specified -Return value: string | null +Return value: null | string Throws: @@ -295,7 +295,7 @@ public function getGitClientPath(): string; ```php -public function getIfExists(mixed $key): string|null; +public function getIfExists(mixed $key): null|string; ``` @@ -319,7 +319,7 @@ public function getIfExists(mixed $key): string|null; -Return value: string | null +Return value: null | string Throws: diff --git a/docs/tech/1.configuration/classes/DocumentedEntityWrappersCollection.md b/docs/tech/1.configuration/classes/DocumentedEntityWrappersCollection.md index 6759727b..bc31dee6 100644 --- a/docs/tech/1.configuration/classes/DocumentedEntityWrappersCollection.md +++ b/docs/tech/1.configuration/classes/DocumentedEntityWrappersCollection.md @@ -12,7 +12,7 @@ ```php namespace BumbleDocGen\Core\Renderer\Context; -final class DocumentedEntityWrappersCollection implements \IteratorAggregate, \Traversable, \Countable +final class DocumentedEntityWrappersCollection implements \IteratorAggregate, \Countable ``` @@ -35,7 +35,7 @@ final class DocumentedEntityWrappersCollection implements \IteratorAggregate, \T
    1. count - - Count elements of an object
    2. +
    3. createAndAddDocumentedEntityWrapper
    4. @@ -44,7 +44,7 @@ final class DocumentedEntityWrappersCollection implements \IteratorAggregate, \T
    5. getIterator - - Retrieve an external iterator
    6. +
    @@ -119,19 +119,13 @@ public function __construct(\BumbleDocGen\Core\Renderer\Context\RendererContext public function count(): int; ``` -
    Count elements of an object
    + Parameters: not specified Return value: int - -See: -

    @@ -212,26 +206,13 @@ public function getDocumentedEntitiesRelations(): array; public function getIterator(): \Generator; ``` -
    Retrieve an external iterator
    + Parameters: not specified Return value: \Generator -Throws: - - - -See: -

    diff --git a/docs/tech/1.configuration/classes/DrawDocumentedEntityLink.md b/docs/tech/1.configuration/classes/DrawDocumentedEntityLink.md index 90351755..05e15fc4 100644 --- a/docs/tech/1.configuration/classes/DrawDocumentedEntityLink.md +++ b/docs/tech/1.configuration/classes/DrawDocumentedEntityLink.md @@ -2,7 +2,7 @@ BumbleDocGen / Technical description of the project / Configuration files / DrawDocumentedEntityLink

    - DrawDocumentedEntityLink class: + DrawDocumentedEntityLink class:

    @@ -85,7 +85,7 @@ final class DrawDocumentedEntityLink implements \BumbleDocGen\Core\Renderer\Twig ```php @@ -122,7 +122,7 @@ public function __construct(\BumbleDocGen\Core\Renderer\Twig\Function\GetDocumen ```php @@ -168,9 +168,6 @@ public function __invoke(\BumbleDocGen\Core\Parser\Entity\RootEntityInterface $e
  • \DI\NotFoundException
  • -
  • - \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
  • -
  • \DI\DependencyException
  • @@ -186,7 +183,7 @@ public function __invoke(\BumbleDocGen\Core\Parser\Entity\RootEntityInterface $e ```php @@ -207,7 +204,7 @@ public static function getName(): string; ```php diff --git a/docs/tech/1.configuration/classes/GetDocumentedEntityUrl.md b/docs/tech/1.configuration/classes/GetDocumentedEntityUrl.md index 2a57a65e..be83aba3 100644 --- a/docs/tech/1.configuration/classes/GetDocumentedEntityUrl.md +++ b/docs/tech/1.configuration/classes/GetDocumentedEntityUrl.md @@ -2,7 +2,7 @@ BumbleDocGen / Technical description of the project / Configuration files / GetDocumentedEntityUrl

    - GetDocumentedEntityUrl class: + GetDocumentedEntityUrl class:

    @@ -91,7 +91,7 @@ The function returns a link to the file MainExtension @@ -106,7 +106,7 @@ The function returns a link to the file MainExtension ```php @@ -158,7 +158,7 @@ public function __construct(\BumbleDocGen\Core\Renderer\RendererHelper $renderer ```php @@ -216,9 +216,6 @@ public function __invoke(\BumbleDocGen\Core\Parser\Entity\RootEntityCollection $
  • \DI\NotFoundException
  • -
  • - \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
  • - @@ -228,7 +225,7 @@ public function __invoke(\BumbleDocGen\Core\Parser\Entity\RootEntityCollection $ ```php @@ -249,7 +246,7 @@ public static function getName(): string; ```php diff --git a/docs/tech/1.configuration/classes/Implode.md b/docs/tech/1.configuration/classes/Implode.md new file mode 100644 index 00000000..78fd4b46 --- /dev/null +++ b/docs/tech/1.configuration/classes/Implode.md @@ -0,0 +1,154 @@ + + BumbleDocGen / Technical description of the project / Configuration files / Implode
    + +

    + Implode class: +

    + + + + + +```php +namespace BumbleDocGen\Core\Renderer\Twig\Filter; + +final class Implode implements \BumbleDocGen\Core\Renderer\Twig\Filter\CustomFilterInterface +``` + +
    Join array elements with a string
    + +See: + + + + + +

    Settings:

    + + + + + + + + + + +
    namevalue
    Filter name:implode
    + + + + + +

    Methods:

    + +
      +
    1. + __invoke +
    2. +
    3. + getName +
    4. +
    5. + getOptions +
    6. +
    + + + + + + + +

    Method details:

    + +
    + + + +```php +public function __invoke(array $elements, string $separator = ', '): string; +``` + + + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $elementsarrayThe array to implode
    $separatorstringElement separator in result string
    + +Return value: string + + +
    +
    +
    + + + +```php +public static function getName(): string; +``` + + + +Parameters: not specified + +Return value: string + + +
    +
    +
    + + + +```php +public static function getOptions(): array; +``` + + + +Parameters: not specified + +Return value: array + + +
    +
    + + \ No newline at end of file diff --git a/docs/tech/1.configuration/classes/InvalidConfigurationParameterException.md b/docs/tech/1.configuration/classes/InvalidConfigurationParameterException.md index d3fa920e..7e71b968 100644 --- a/docs/tech/1.configuration/classes/InvalidConfigurationParameterException.md +++ b/docs/tech/1.configuration/classes/InvalidConfigurationParameterException.md @@ -12,380 +12,23 @@ ```php namespace BumbleDocGen\Core\Configuration\Exception; -final class InvalidConfigurationParameterException extends \Exception implements \Throwable, \Stringable +final class InvalidConfigurationParameterException extends \Exception ``` -
    Exception is the base class for -all Exceptions.
    -See: - -

    Initialization methods:

    -
      -
    1. - __construct - - Construct the exception. Note: The message is NOT binary safe.
    2. -
    -

    Methods:

    -
      -
    1. - __toString - - String representation of the exception
    2. -
    3. - __wakeup -
    4. -
    5. - getCode - - Gets the Exception code
    6. -
    7. - getFile - - Gets the file in which the exception occurred
    8. -
    9. - getLine - - Gets the line in which the exception occurred
    10. -
    11. - getMessage - - Gets the Exception message
    12. -
    13. - getPrevious - - Returns previous Exception
    14. -
    15. - getTrace - - Gets the stack trace
    16. -
    17. - getTraceAsString - - Gets the stack trace as a string
    18. -
    - -

    Method details:

    - -
    - -
      -
    • # - __construct -
    • -
    - -```php -// Implemented in Exception - -public function __construct(string $message = "", int $code, \Throwable|null $previous = \null); -``` - -
    Construct the exception. Note: The message is NOT binary safe.
    - -Parameters: - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $messagestring[optional] The Exception message to throw.
    $codeint[optional] The Exception code.
    $previous\Throwable | null[optional] The previous throwable used for the exception chaining.
    - - - - -See: - -
    -
    -
    - -
      -
    • # - __toString -
    • -
    - -```php -// Implemented in Exception - -public function __toString(): string; -``` - -
    String representation of the exception
    - -Parameters: not specified - -Return value: string - - - -See: - -
    -
    -
    - -
      -
    • # - __wakeup -
    • -
    - -```php -// Implemented in Exception - -public function __wakeup(): mixed; -``` - - - -Parameters: not specified - -Return value: mixed - - -
    -
    -
    - -
      -
    • # - getCode -
    • -
    - -```php -// Implemented in Exception - -public function getCode(): mixed|int; -``` - -
    Gets the Exception code
    - -Parameters: not specified - -Return value: mixed | int - - - -See: - -
    -
    -
    - -
      -
    • # - getFile -
    • -
    - -```php -// Implemented in Exception - -public function getFile(): string; -``` - -
    Gets the file in which the exception occurred
    - -Parameters: not specified - -Return value: string - - - -See: - -
    -
    -
    - -
      -
    • # - getLine -
    • -
    - -```php -// Implemented in Exception - -public function getLine(): int; -``` - -
    Gets the line in which the exception occurred
    - -Parameters: not specified - -Return value: int - - - -See: - -
    -
    -
    - -
      -
    • # - getMessage -
    • -
    - -```php -// Implemented in Exception - -public function getMessage(): string; -``` - -
    Gets the Exception message
    - -Parameters: not specified - -Return value: string - - - -See: - -
    -
    -
    - -
      -
    • # - getPrevious -
    • -
    - -```php -// Implemented in Exception - -public function getPrevious(): \Throwable|null; -``` - -
    Returns previous Exception
    - -Parameters: not specified - -Return value: \Throwable | null - - - -See: - -
    -
    -
    - -
      -
    • # - getTrace -
    • -
    - -```php -// Implemented in Exception - -public function getTrace(): array; -``` - -
    Gets the stack trace
    - -Parameters: not specified - -Return value: array - - - -See: - -
    -
    -
    - -
      -
    • # - getTraceAsString -
    • -
    - -```php -// Implemented in Exception - -public function getTraceAsString(): string; -``` - -
    Gets the stack trace as a string
    - -Parameters: not specified - -Return value: string - - - -See: - -
    -
    - \ No newline at end of file diff --git a/docs/tech/1.configuration/classes/PageHtmlLinkerPlugin.md b/docs/tech/1.configuration/classes/PageHtmlLinkerPlugin.md index ea63e2c6..3e0ca02b 100644 --- a/docs/tech/1.configuration/classes/PageHtmlLinkerPlugin.md +++ b/docs/tech/1.configuration/classes/PageHtmlLinkerPlugin.md @@ -68,7 +68,7 @@ final class PageHtmlLinkerPlugin extends \BumbleDocGen\Core\Plugin\CorePlugin\Pa
  • getSubscribedEvents - - Returns an array of event names this subscriber wants to listen to.
  • + @@ -84,7 +84,7 @@ final class PageHtmlLinkerPlugin extends \BumbleDocGen\Core\Plugin\CorePlugin\Pa ```php @@ -138,7 +138,7 @@ public function __construct(\BumbleDocGen\Core\Renderer\Breadcrumbs\BreadcrumbsH ```php @@ -179,9 +179,6 @@ public function beforeCreatingDocFile(\BumbleDocGen\Core\Plugin\Event\Renderer\B
  • \DI\DependencyException
  • -
  • - \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
  • -
  • \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • @@ -194,7 +191,7 @@ public function beforeCreatingDocFile(\BumbleDocGen\Core\Plugin\Event\Renderer\B ```php @@ -203,7 +200,7 @@ public function beforeCreatingDocFile(\BumbleDocGen\Core\Plugin\Event\Renderer\B public static function getSubscribedEvents(): array; ``` -
    Returns an array of event names this subscriber wants to listen to.
    + Parameters: not specified diff --git a/docs/tech/1.configuration/classes/PageLinkerPlugin.md b/docs/tech/1.configuration/classes/PageLinkerPlugin.md index d5e696de..ee8b126c 100644 --- a/docs/tech/1.configuration/classes/PageLinkerPlugin.md +++ b/docs/tech/1.configuration/classes/PageLinkerPlugin.md @@ -68,7 +68,7 @@ final class PageLinkerPlugin extends \BumbleDocGen\Core\Plugin\CorePlugin\PageLi
  • getSubscribedEvents - - Returns an array of event names this subscriber wants to listen to.
  • + @@ -84,7 +84,7 @@ final class PageLinkerPlugin extends \BumbleDocGen\Core\Plugin\CorePlugin\PageLi ```php @@ -138,7 +138,7 @@ public function __construct(\BumbleDocGen\Core\Renderer\Breadcrumbs\BreadcrumbsH ```php @@ -179,9 +179,6 @@ public function beforeCreatingDocFile(\BumbleDocGen\Core\Plugin\Event\Renderer\B
  • \DI\DependencyException
  • -
  • - \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
  • -
  • \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • @@ -194,7 +191,7 @@ public function beforeCreatingDocFile(\BumbleDocGen\Core\Plugin\Event\Renderer\B ```php @@ -203,7 +200,7 @@ public function beforeCreatingDocFile(\BumbleDocGen\Core\Plugin\Event\Renderer\B public static function getSubscribedEvents(): array; ``` -
    Returns an array of event names this subscriber wants to listen to.
    + Parameters: not specified diff --git a/docs/tech/1.configuration/classes/ReflectionException.md b/docs/tech/1.configuration/classes/ReflectionException.md deleted file mode 100644 index 73e53d94..00000000 --- a/docs/tech/1.configuration/classes/ReflectionException.md +++ /dev/null @@ -1,391 +0,0 @@ - - BumbleDocGen / Technical description of the project / Configuration files / ReflectionException
    - -

    - ReflectionException class: -

    - - - - - -```php -namespace BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception; - -final class ReflectionException extends \Exception implements \Throwable, \Stringable -``` - -
    Exception is the base class for -all Exceptions.
    - -See: - - - - - - - -

    Initialization methods:

    - -
      -
    1. - __construct - - Construct the exception. Note: The message is NOT binary safe.
    2. -
    - -

    Methods:

    - -
      -
    1. - __toString - - String representation of the exception
    2. -
    3. - __wakeup -
    4. -
    5. - getCode - - Gets the Exception code
    6. -
    7. - getFile - - Gets the file in which the exception occurred
    8. -
    9. - getLine - - Gets the line in which the exception occurred
    10. -
    11. - getMessage - - Gets the Exception message
    12. -
    13. - getPrevious - - Returns previous Exception
    14. -
    15. - getTrace - - Gets the stack trace
    16. -
    17. - getTraceAsString - - Gets the stack trace as a string
    18. -
    - - - - - - - -

    Method details:

    - -
    - -
      -
    • # - __construct -
    • -
    - -```php -// Implemented in Exception - -public function __construct(string $message = "", int $code, \Throwable|null $previous = \null); -``` - -
    Construct the exception. Note: The message is NOT binary safe.
    - -Parameters: - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $messagestring[optional] The Exception message to throw.
    $codeint[optional] The Exception code.
    $previous\Throwable | null[optional] The previous throwable used for the exception chaining.
    - - - - -See: - -
    -
    -
    - -
      -
    • # - __toString -
    • -
    - -```php -// Implemented in Exception - -public function __toString(): string; -``` - -
    String representation of the exception
    - -Parameters: not specified - -Return value: string - - - -See: - -
    -
    -
    - -
      -
    • # - __wakeup -
    • -
    - -```php -// Implemented in Exception - -public function __wakeup(): mixed; -``` - - - -Parameters: not specified - -Return value: mixed - - -
    -
    -
    - -
      -
    • # - getCode -
    • -
    - -```php -// Implemented in Exception - -public function getCode(): mixed|int; -``` - -
    Gets the Exception code
    - -Parameters: not specified - -Return value: mixed | int - - - -See: - -
    -
    -
    - -
      -
    • # - getFile -
    • -
    - -```php -// Implemented in Exception - -public function getFile(): string; -``` - -
    Gets the file in which the exception occurred
    - -Parameters: not specified - -Return value: string - - - -See: - -
    -
    -
    - -
      -
    • # - getLine -
    • -
    - -```php -// Implemented in Exception - -public function getLine(): int; -``` - -
    Gets the line in which the exception occurred
    - -Parameters: not specified - -Return value: int - - - -See: - -
    -
    -
    - -
      -
    • # - getMessage -
    • -
    - -```php -// Implemented in Exception - -public function getMessage(): string; -``` - -
    Gets the Exception message
    - -Parameters: not specified - -Return value: string - - - -See: - -
    -
    -
    - -
      -
    • # - getPrevious -
    • -
    - -```php -// Implemented in Exception - -public function getPrevious(): \Throwable|null; -``` - -
    Returns previous Exception
    - -Parameters: not specified - -Return value: \Throwable | null - - - -See: - -
    -
    -
    - -
      -
    • # - getTrace -
    • -
    - -```php -// Implemented in Exception - -public function getTrace(): array; -``` - -
    Gets the stack trace
    - -Parameters: not specified - -Return value: array - - - -See: - -
    -
    -
    - -
      -
    • # - getTraceAsString -
    • -
    - -```php -// Implemented in Exception - -public function getTraceAsString(): string; -``` - -
    Gets the stack trace as a string
    - -Parameters: not specified - -Return value: string - - - -See: - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/1.configuration/classes/RendererContext.md b/docs/tech/1.configuration/classes/RendererContext.md index c2389341..26ebf8f4 100644 --- a/docs/tech/1.configuration/classes/RendererContext.md +++ b/docs/tech/1.configuration/classes/RendererContext.md @@ -125,14 +125,14 @@ public function clearDependencies(): void; ```php -public function getCurrentDocumentedEntityWrapper(): \BumbleDocGen\Core\Renderer\Context\DocumentedEntityWrapper|null; +public function getCurrentDocumentedEntityWrapper(): null|\BumbleDocGen\Core\Renderer\Context\DocumentedEntityWrapper; ``` Parameters: not specified -Return value: \BumbleDocGen\Core\Renderer\Context\DocumentedEntityWrapper | null +Return value: null | \BumbleDocGen\Core\Renderer\Context\DocumentedEntityWrapper diff --git a/docs/tech/1.configuration/readme.md b/docs/tech/1.configuration/readme.md index d9796223..ec73123e 100644 --- a/docs/tech/1.configuration/readme.md +++ b/docs/tech/1.configuration/readme.md @@ -196,6 +196,8 @@ The inheritance algorithm is as follows: scalar types can be overwritten by each - PregMatch +- Implode + Filters that can be used in document templates @@ -222,4 +224,4 @@ The inheritance algorithm is as follows: scalar types can be overwritten by each

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Oct 28 11:03:31 2023 +0300
    Page content update date: Mon Nov 06 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Oct 28 11:03:31 2023 +0300
    Page content update date: Mon Nov 13 2023
    Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/2.parser/classes/AsyncSourceLocator.md b/docs/tech/2.parser/classes/AsyncSourceLocator.md deleted file mode 100644 index b5ed8e9a..00000000 --- a/docs/tech/2.parser/classes/AsyncSourceLocator.md +++ /dev/null @@ -1,159 +0,0 @@ - - BumbleDocGen / Technical description of the project / Parser / Source locators / AsyncSourceLocator
    - -

    - AsyncSourceLocator class: -

    - - - - - -```php -namespace BumbleDocGen\LanguageHandler\Php\Parser\SourceLocator; - -final class AsyncSourceLocator implements \BumbleDocGen\Core\Parser\SourceLocator\SourceLocatorInterface, \BumbleDocGen\LanguageHandler\Php\Parser\SourceLocator\CustomSourceLocatorInterface -``` - -
    Lazy loading classes. Cannot be used for initial parsing of files, only for getting specific documents
    - - - - - - -

    Initialization methods:

    - -
      -
    1. - __construct -
    2. -
    - -

    Methods:

    - -
      -
    1. - getFinder -
    2. -
    3. - getSourceLocator -
    4. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public function __construct(\BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache $localObjectCache, array $psr4FileMap, array $classMap); -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $localObjectCache\BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache-
    $psr4FileMaparray-
    $classMaparray-
    - - - -
    -
    -
    - - - -```php -public function getFinder(): \Symfony\Component\Finder\Finder|null; -``` - - - -Parameters: not specified - -Return value: \Symfony\Component\Finder\Finder | null - - -
    -
    -
    - - - -```php -public function getSourceLocator(\Roave\BetterReflection\SourceLocator\Ast\Locator $astLocator): \Roave\BetterReflection\SourceLocator\Type\SourceLocator; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $astLocator\Roave\BetterReflection\SourceLocator\Ast\Locator-
    - -Return value: \Roave\BetterReflection\SourceLocator\Type\SourceLocator - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/2.parser/classes/ClassEntity.md b/docs/tech/2.parser/classes/ClassEntity.md index 72861a06..23ea2164 100644 --- a/docs/tech/2.parser/classes/ClassEntity.md +++ b/docs/tech/2.parser/classes/ClassEntity.md @@ -2,7 +2,7 @@ BumbleDocGen / Technical description of the project / Parser / Entities and entities collections / ClassEntity

    - ClassEntity class: + ClassEntity class:

    @@ -48,6 +48,9 @@ class ClassEntity extends \BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEn
  • getAbsoluteFileName - Returns the absolute path to a file if it can be retrieved and if the file is in the project directory
  • +
  • + getAst +
  • getCacheKey
  • @@ -66,12 +69,18 @@ class ClassEntity extends \BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEn
  • getConstantEntityCollection
  • +
  • + getConstantValue +
  • getConstants
  • getConstantsData
  • +
  • + getCurrentRootEntity +
  • getDescription
  • @@ -100,11 +109,14 @@ class ClassEntity extends \BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEn getEntityDependencies
  • - getExamples - - Get parsed examples from `examples` doc block
  • + getEnumCaseValue +
  • - getExtends + getEnumCases
  • +
  • + getExamples + - Get parsed examples from `examples` doc block
  • getFileContent
  • @@ -121,7 +133,7 @@ class ClassEntity extends \BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEn getFullFileName
  • - getImplementingReflectionClass + getImplementingClass
  • getInterfaceNames @@ -129,9 +141,6 @@ class ClassEntity extends \BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEn
  • getInterfacesEntities
  • -
  • - getInterfacesString -
  • getMethodEntity
  • @@ -156,6 +165,9 @@ class ClassEntity extends \BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEn
  • getParentClass
  • +
  • + getParentClassEntities +
  • getParentClassName
  • @@ -177,9 +189,6 @@ class ClassEntity extends \BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEn
  • getPropertyEntityCollection
  • -
  • - getReflector -
  • getRelativeFileName
  • @@ -196,10 +205,10 @@ class ClassEntity extends \BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEn getThrows - Get parsed throws from `throws` doc block
  • - getTraitsNames + getTraits
  • - hasAnnotationKey + getTraitsNames
  • hasConstant @@ -283,7 +292,7 @@ class ClassEntity extends \BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEn removeNotUsedEntityDataCache
  • - setReflectionClass + setCustomAst
  • @@ -300,11 +309,11 @@ class ClassEntity extends \BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEn ```php -public function __construct(\BumbleDocGen\Core\Configuration\Configuration $configuration, \BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings $phpHandlerSettings, \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Reflection\ReflectorWrapper $reflector, \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection $classEntityCollection, \BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper $parserHelper, \BumbleDocGen\LanguageHandler\Php\Parser\ComposerParser $composerParser, \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache $localObjectCache, \Psr\Log\LoggerInterface $logger, string $className, string|null $relativeFileName); +public function __construct(\BumbleDocGen\Core\Configuration\Configuration $configuration, \BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings $phpHandlerSettings, \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection $classEntityCollection, \BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper $parserHelper, \BumbleDocGen\LanguageHandler\Php\Parser\ComposerHelper $composerHelper, \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpParser\PhpParserHelper $phpParserHelper, \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache $localObjectCache, \Psr\Log\LoggerInterface $logger, string $className, string|null $relativeFileName); ``` @@ -329,11 +338,6 @@ public function __construct(\BumbleDocGen\Core\Configuration\Configuration $conf $phpHandlerSettings \BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings - - - - $reflector - \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Reflection\ReflectorWrapper - - $classEntityCollection @@ -346,8 +350,13 @@ public function __construct(\BumbleDocGen\Core\Configuration\Configuration $conf - - $composerParser - \BumbleDocGen\LanguageHandler\Php\Parser\ComposerParser + $composerHelper + \BumbleDocGen\LanguageHandler\Php\Parser\ComposerHelper + - + + + $phpParserHelper + \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpParser\PhpParserHelper - @@ -382,7 +391,7 @@ public function __construct(\BumbleDocGen\Core\Configuration\Configuration $conf ```php @@ -420,9 +429,6 @@ public function cursorToDocAttributeLinkFragment(string $cursor, bool $isForDocu Throws: ```php -public function getFileName(): string|null; +public function getFileName(): null|string; ```
    Returns the relative path to a file if it can be retrieved and if the file is in the project directory
    Parameters: not specified -Return value: string | null +Return value: null | string diff --git a/docs/tech/2.parser/classes/InvalidConfigurationParameterException.md b/docs/tech/2.parser/classes/InvalidConfigurationParameterException.md index c8d2be4e..8cc190c9 100644 --- a/docs/tech/2.parser/classes/InvalidConfigurationParameterException.md +++ b/docs/tech/2.parser/classes/InvalidConfigurationParameterException.md @@ -12,380 +12,23 @@ ```php namespace BumbleDocGen\Core\Configuration\Exception; -final class InvalidConfigurationParameterException extends \Exception implements \Throwable, \Stringable +final class InvalidConfigurationParameterException extends \Exception ``` -
    Exception is the base class for -all Exceptions.
    -See: - -

    Initialization methods:

    -
      -
    1. - __construct - - Construct the exception. Note: The message is NOT binary safe.
    2. -
    -

    Methods:

    -
      -
    1. - __toString - - String representation of the exception
    2. -
    3. - __wakeup -
    4. -
    5. - getCode - - Gets the Exception code
    6. -
    7. - getFile - - Gets the file in which the exception occurred
    8. -
    9. - getLine - - Gets the line in which the exception occurred
    10. -
    11. - getMessage - - Gets the Exception message
    12. -
    13. - getPrevious - - Returns previous Exception
    14. -
    15. - getTrace - - Gets the stack trace
    16. -
    17. - getTraceAsString - - Gets the stack trace as a string
    18. -
    - -

    Method details:

    - -
    - -
      -
    • # - __construct -
    • -
    - -```php -// Implemented in Exception - -public function __construct(string $message = "", int $code, \Throwable|null $previous = \null); -``` - -
    Construct the exception. Note: The message is NOT binary safe.
    - -Parameters: - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $messagestring[optional] The Exception message to throw.
    $codeint[optional] The Exception code.
    $previous\Throwable | null[optional] The previous throwable used for the exception chaining.
    - - - - -See: - -
    -
    -
    - -
      -
    • # - __toString -
    • -
    - -```php -// Implemented in Exception - -public function __toString(): string; -``` - -
    String representation of the exception
    - -Parameters: not specified - -Return value: string - - - -See: - -
    -
    -
    - -
      -
    • # - __wakeup -
    • -
    - -```php -// Implemented in Exception - -public function __wakeup(): mixed; -``` - - - -Parameters: not specified - -Return value: mixed - - -
    -
    -
    - -
      -
    • # - getCode -
    • -
    - -```php -// Implemented in Exception - -public function getCode(): mixed|int; -``` - -
    Gets the Exception code
    - -Parameters: not specified - -Return value: mixed | int - - - -See: - -
    -
    -
    - -
      -
    • # - getFile -
    • -
    - -```php -// Implemented in Exception - -public function getFile(): string; -``` - -
    Gets the file in which the exception occurred
    - -Parameters: not specified - -Return value: string - - - -See: - -
    -
    -
    - -
      -
    • # - getLine -
    • -
    - -```php -// Implemented in Exception - -public function getLine(): int; -``` - -
    Gets the line in which the exception occurred
    - -Parameters: not specified - -Return value: int - - - -See: - -
    -
    -
    - -
      -
    • # - getMessage -
    • -
    - -```php -// Implemented in Exception - -public function getMessage(): string; -``` - -
    Gets the Exception message
    - -Parameters: not specified - -Return value: string - - - -See: - -
    -
    -
    - -
      -
    • # - getPrevious -
    • -
    - -```php -// Implemented in Exception - -public function getPrevious(): \Throwable|null; -``` - -
    Returns previous Exception
    - -Parameters: not specified - -Return value: \Throwable | null - - - -See: - -
    -
    -
    - -
      -
    • # - getTrace -
    • -
    - -```php -// Implemented in Exception - -public function getTrace(): array; -``` - -
    Gets the stack trace
    - -Parameters: not specified - -Return value: array - - - -See: - -
    -
    -
    - -
      -
    • # - getTraceAsString -
    • -
    - -```php -// Implemented in Exception - -public function getTraceAsString(): string; -``` - -
    Gets the stack trace as a string
    - -Parameters: not specified - -Return value: string - - - -See: - -
    -
    - \ No newline at end of file diff --git a/docs/tech/2.parser/classes/MethodEntity.md b/docs/tech/2.parser/classes/MethodEntity.md index 5e958af8..e3ad1405 100644 --- a/docs/tech/2.parser/classes/MethodEntity.md +++ b/docs/tech/2.parser/classes/MethodEntity.md @@ -2,7 +2,7 @@ BumbleDocGen / Technical description of the project / Parser / Entities and entities collections / MethodEntity

    - MethodEntity class: + MethodEntity class:

    @@ -39,6 +39,9 @@ class MethodEntity extends \BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseE
  • getAbsoluteFileName - Returns the absolute path to a file if it can be retrieved and if the file is in the project directory
  • +
  • + getAst +
  • getBodyCode
  • @@ -48,6 +51,9 @@ class MethodEntity extends \BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseE
  • getCachedEntityDependencies
  • +
  • + getCurrentRootEntity +
  • getDescription
  • @@ -99,9 +105,6 @@ class MethodEntity extends \BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseE
  • getImplementingClassName
  • -
  • - getImplementingReflectionClass -
  • getModifiersString
  • @@ -126,6 +129,9 @@ class MethodEntity extends \BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseE
  • getPrototype
  • +
  • + getRelativeFileName +
  • getReturnType
  • @@ -210,6 +216,25 @@ class MethodEntity extends \BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseE +

    Constants:

    + @@ -222,11 +247,11 @@ class MethodEntity extends \BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseE ```php -public function __construct(\BumbleDocGen\Core\Configuration\Configuration $configuration, \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity $classEntity, \BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper $parserHelper, \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache $localObjectCache, \Psr\Log\LoggerInterface $logger, \PhpParser\PrettyPrinter\Standard $astPrinter, string $methodName, string $declaringClassName, string $implementingClassName); +public function __construct(\BumbleDocGen\Core\Configuration\Configuration $configuration, \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity $classEntity, \BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper $parserHelper, \PhpParser\PrettyPrinter\Standard $astPrinter, \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache $localObjectCache, \Psr\Log\LoggerInterface $logger, string $methodName, string $implementingClassName); ``` @@ -256,6 +281,11 @@ public function __construct(\BumbleDocGen\Core\Configuration\Configuration $conf $parserHelper \BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper - + + + $astPrinter + \PhpParser\PrettyPrinter\Standard + - $localObjectCache @@ -266,21 +296,11 @@ public function __construct(\BumbleDocGen\Core\Configuration\Configuration $conf $logger \Psr\Log\LoggerInterface - - - - $astPrinter - \PhpParser\PrettyPrinter\Standard - - $methodName string - - - - $declaringClassName - string - - $implementingClassName @@ -299,7 +319,7 @@ public function __construct(\BumbleDocGen\Core\Configuration\Configuration $conf ```php @@ -332,20 +352,48 @@ public function entityCacheIsOutdated(): bool; ```php // Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity -public function getAbsoluteFileName(): string|null; +public function getAbsoluteFileName(): null|string; ```
    Returns the absolute path to a file if it can be retrieved and if the file is in the project directory
    Parameters: not specified -Return value: string | null +Return value: null | string + + +Throws: + + + +
    +
    + + + +```php +public function getAst(): \PhpParser\Node\Stmt\ClassMethod; +``` + + + +Parameters: not specified + +Return value: \PhpParser\Node\Stmt\ClassMethod Throws: @@ -362,7 +410,7 @@ public function getAbsoluteFileName(): string|null; ```php @@ -378,9 +426,6 @@ public function getBodyCode(): string; Throws: +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getCurrentRootEntity(): null|\BumbleDocGen\Core\Parser\Entity\RootEntityInterface; +``` + + + +Parameters: not specified + +Return value: null | \BumbleDocGen\Core\Parser\Entity\RootEntityInterface + +

    @@ -446,7 +514,7 @@ public function getCachedEntityDependencies(): array; ```php @@ -468,9 +536,6 @@ public function getDescription(): string;
  • \DI\DependencyException
  • -
  • - \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
  • -
  • \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • @@ -483,7 +548,7 @@ public function getDescription(): string; ```php @@ -516,7 +581,7 @@ public function getDescriptionLinks(): array; ```php @@ -552,9 +617,6 @@ public function getDocBlock(bool $recursive = true): \phpDocumentor\Reflection\D
  • \DI\DependencyException
  • -
  • - \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
  • -
  • \DI\NotFoundException
  • @@ -570,7 +632,7 @@ public function getDocBlock(bool $recursive = true): \phpDocumentor\Reflection\D ```php @@ -586,9 +648,6 @@ public function getDocComment(): string; Throws:
    -
    -
    - - - -```php -public function getImplementingReflectionClass(): \Roave\BetterReflection\Reflection\ReflectionClass; -``` - - - -Parameters: not specified - -Return value: \Roave\BetterReflection\Reflection\ReflectionClass - - -Throws: - -

    @@ -1025,7 +1035,7 @@ public function getImplementingReflectionClass(): \Roave\BetterReflection\Reflec ```php @@ -1041,9 +1051,6 @@ public function getModifiersString(): string; Throws:

    @@ -352,7 +339,7 @@ public function isEmpty(): bool; ```php @@ -368,9 +355,6 @@ public function loadMethodEntities(): void; Throws:
    +
    +
    + + + +```php +public function getAst(): \PhpParser\Node\Stmt\Property; +``` + + + +Parameters: not specified + +Return value: \PhpParser\Node\Stmt\Property Throws: @@ -338,7 +391,7 @@ public function getCacheKey(): string; ```php @@ -361,6 +414,29 @@ public function getCachedEntityDependencies(): array; +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getCurrentRootEntity(): null|\BumbleDocGen\Core\Parser\Entity\RootEntityInterface; +``` + + + +Parameters: not specified + +Return value: null | \BumbleDocGen\Core\Parser\Entity\RootEntityInterface + +

    @@ -368,7 +444,7 @@ public function getCachedEntityDependencies(): array; ```php @@ -385,7 +461,7 @@ public function getDefaultValue(): string|array|int|bool|null|float; Throws:
    -
    -
    - - - -```php -public function getImplementingReflectionClass(): \Roave\BetterReflection\Reflection\ReflectionClass; -``` - - - -Parameters: not specified - -Return value: \Roave\BetterReflection\Reflection\ReflectionClass - - -Throws: - -

    @@ -827,7 +854,7 @@ public function getImplementingReflectionClass(): \Roave\BetterReflection\Reflec ```php @@ -843,9 +870,6 @@ public function getModifiersString(): string; Throws:

    @@ -916,7 +930,7 @@ public function getNamespaceName(): string; ```php @@ -939,7 +953,7 @@ public function getObjectId(): string; ```php @@ -953,6 +967,36 @@ public function getPhpHandlerSettings(): \BumbleDocGen\LanguageHandler\Php\PhpHa Return value: \BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getRelativeFileName(): null|string; +``` + + + +Parameters: not specified + +Return value: null | string + + +Throws: + +

    @@ -960,7 +1004,7 @@ public function getPhpHandlerSettings(): \BumbleDocGen\LanguageHandler\Php\PhpHa ```php @@ -981,7 +1025,7 @@ public function getRootEntity(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity ```php @@ -1002,7 +1046,7 @@ public function getRootEntityCollection(): \BumbleDocGen\LanguageHandler\Php\Par ```php @@ -1023,7 +1067,7 @@ public function getShortName(): string; ```php @@ -1039,9 +1083,6 @@ public function getStartLine(): int; Throws:
    @@ -209,26 +209,13 @@ public function get(string $objectName): \BumbleDocGen\LanguageHandler\Php\Parse public function getIterator(): \Generator; ``` -
    Retrieve an external iterator
    + Parameters: not specified Return value: \Generator -Throws: - - - -See: -
    @@ -299,7 +286,7 @@ public function isEmpty(): bool; ```php @@ -324,9 +311,6 @@ public function loadPropertyEntities(): void;
  • \DI\NotFoundException
  • -
  • - \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
  • -
    @@ -376,11 +360,11 @@ public function remove(string $objectName): void; ```php -public function unsafeGet(string $objectName): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PropertyEntity|null; +public function unsafeGet(string $objectName): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\PropertyEntity; ``` @@ -404,7 +388,7 @@ public function unsafeGet(string $objectName): \BumbleDocGen\LanguageHandler\Php -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PropertyEntity | null +Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PropertyEntity Throws: @@ -412,12 +396,6 @@ public function unsafeGet(string $objectName): \BumbleDocGen\LanguageHandler\Php
  • \DI\NotFoundException
  • -
  • - \DI\DependencyException
  • - -
  • - \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
  • -
  • \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • diff --git a/docs/tech/2.parser/classes/ReflectionException.md b/docs/tech/2.parser/classes/ReflectionException.md deleted file mode 100644 index 3447c81b..00000000 --- a/docs/tech/2.parser/classes/ReflectionException.md +++ /dev/null @@ -1,391 +0,0 @@ - - BumbleDocGen / Technical description of the project / Parser / ReflectionException
    - -

    - ReflectionException class: -

    - - - - - -```php -namespace BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception; - -final class ReflectionException extends \Exception implements \Throwable, \Stringable -``` - -
    Exception is the base class for -all Exceptions.
    - -See: - - - - - - - -

    Initialization methods:

    - -
      -
    1. - __construct - - Construct the exception. Note: The message is NOT binary safe.
    2. -
    - -

    Methods:

    - -
      -
    1. - __toString - - String representation of the exception
    2. -
    3. - __wakeup -
    4. -
    5. - getCode - - Gets the Exception code
    6. -
    7. - getFile - - Gets the file in which the exception occurred
    8. -
    9. - getLine - - Gets the line in which the exception occurred
    10. -
    11. - getMessage - - Gets the Exception message
    12. -
    13. - getPrevious - - Returns previous Exception
    14. -
    15. - getTrace - - Gets the stack trace
    16. -
    17. - getTraceAsString - - Gets the stack trace as a string
    18. -
    - - - - - - - -

    Method details:

    - -
    - -
      -
    • # - __construct -
    • -
    - -```php -// Implemented in Exception - -public function __construct(string $message = "", int $code, \Throwable|null $previous = \null); -``` - -
    Construct the exception. Note: The message is NOT binary safe.
    - -Parameters: - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $messagestring[optional] The Exception message to throw.
    $codeint[optional] The Exception code.
    $previous\Throwable | null[optional] The previous throwable used for the exception chaining.
    - - - - -See: - -
    -
    -
    - -
      -
    • # - __toString -
    • -
    - -```php -// Implemented in Exception - -public function __toString(): string; -``` - -
    String representation of the exception
    - -Parameters: not specified - -Return value: string - - - -See: - -
    -
    -
    - -
      -
    • # - __wakeup -
    • -
    - -```php -// Implemented in Exception - -public function __wakeup(): mixed; -``` - - - -Parameters: not specified - -Return value: mixed - - -
    -
    -
    - -
      -
    • # - getCode -
    • -
    - -```php -// Implemented in Exception - -public function getCode(): mixed|int; -``` - -
    Gets the Exception code
    - -Parameters: not specified - -Return value: mixed | int - - - -See: - -
    -
    -
    - -
      -
    • # - getFile -
    • -
    - -```php -// Implemented in Exception - -public function getFile(): string; -``` - -
    Gets the file in which the exception occurred
    - -Parameters: not specified - -Return value: string - - - -See: - -
    -
    -
    - -
      -
    • # - getLine -
    • -
    - -```php -// Implemented in Exception - -public function getLine(): int; -``` - -
    Gets the line in which the exception occurred
    - -Parameters: not specified - -Return value: int - - - -See: - -
    -
    -
    - -
      -
    • # - getMessage -
    • -
    - -```php -// Implemented in Exception - -public function getMessage(): string; -``` - -
    Gets the Exception message
    - -Parameters: not specified - -Return value: string - - - -See: - -
    -
    -
    - -
      -
    • # - getPrevious -
    • -
    - -```php -// Implemented in Exception - -public function getPrevious(): \Throwable|null; -``` - -
    Returns previous Exception
    - -Parameters: not specified - -Return value: \Throwable | null - - - -See: - -
    -
    -
    - -
      -
    • # - getTrace -
    • -
    - -```php -// Implemented in Exception - -public function getTrace(): array; -``` - -
    Gets the stack trace
    - -Parameters: not specified - -Return value: array - - - -See: - -
    -
    -
    - -
      -
    • # - getTraceAsString -
    • -
    - -```php -// Implemented in Exception - -public function getTraceAsString(): string; -``` - -
    Gets the stack trace as a string
    - -Parameters: not specified - -Return value: string - - - -See: - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/2.parser/classes/RootEntityCollection.md b/docs/tech/2.parser/classes/RootEntityCollection.md index 397415d1..f8a02e6c 100644 --- a/docs/tech/2.parser/classes/RootEntityCollection.md +++ b/docs/tech/2.parser/classes/RootEntityCollection.md @@ -12,7 +12,7 @@ ```php namespace BumbleDocGen\Core\Parser\Entity; -abstract class RootEntityCollection extends \BumbleDocGen\Core\Parser\Entity\BaseEntityCollection implements \IteratorAggregate, \Traversable +abstract class RootEntityCollection extends \BumbleDocGen\Core\Parser\Entity\BaseEntityCollection implements \IteratorAggregate ``` @@ -40,7 +40,7 @@ abstract class RootEntityCollection extends \BumbleDocGen\Core\Parser\Entity\Bas
  • getIterator - - Retrieve an external iterator
  • +
  • getLoadedOrCreateNew
  • @@ -75,7 +75,7 @@ abstract class RootEntityCollection extends \BumbleDocGen\Core\Parser\Entity\Bas ```php -public function findEntity(string $search, bool $useUnsafeKeys = true): \BumbleDocGen\Core\Parser\Entity\RootEntityInterface|null; +public function findEntity(string $search, bool $useUnsafeKeys = true): null|\BumbleDocGen\Core\Parser\Entity\RootEntityInterface; ``` @@ -104,7 +104,7 @@ public function findEntity(string $search, bool $useUnsafeKeys = true): \BumbleD -Return value: \BumbleDocGen\Core\Parser\Entity\RootEntityInterface | null +Return value: null | \BumbleDocGen\Core\Parser\Entity\RootEntityInterface @@ -118,7 +118,7 @@ public function findEntity(string $search, bool $useUnsafeKeys = true): \BumbleD ```php -public function get(string $objectName): \BumbleDocGen\Core\Parser\Entity\RootEntityInterface|null; +public function get(string $objectName): null|\BumbleDocGen\Core\Parser\Entity\RootEntityInterface; ``` @@ -142,7 +142,7 @@ public function get(string $objectName): \BumbleDocGen\Core\Parser\Entity\RootEn -Return value: \BumbleDocGen\Core\Parser\Entity\RootEntityInterface | null +Return value: null | \BumbleDocGen\Core\Parser\Entity\RootEntityInterface @@ -231,26 +231,13 @@ public function getEntityLinkData(string $rawLink, string|null $defaultEntityNam public function getIterator(): \Generator; ``` -
    Retrieve an external iterator
    + Parameters: not specified Return value: \Generator -Throws: - - - -See: -
    diff --git a/docs/tech/2.parser/classes/RootEntityInterface.md b/docs/tech/2.parser/classes/RootEntityInterface.md index 420020ae..ea182618 100644 --- a/docs/tech/2.parser/classes/RootEntityInterface.md +++ b/docs/tech/2.parser/classes/RootEntityInterface.md @@ -12,7 +12,7 @@ ```php namespace BumbleDocGen\Core\Parser\Entity; -interface RootEntityInterface extends \\BumbleDocGen\Core\Parser\Entity\EntityInterface implements \BumbleDocGen\Core\Parser\Entity\EntityInterface +interface RootEntityInterface extends \BumbleDocGen\Core\Parser\Entity\EntityInterface ```
    Since the documentation generator supports several programming languages, @@ -134,14 +134,14 @@ public function entityDataCanBeLoaded(): bool; ```php // Implemented in BumbleDocGen\Core\Parser\Entity\EntityInterface -public function getAbsoluteFileName(): string|null; +public function getAbsoluteFileName(): null|string; ```
    Returns the absolute path to a file if it can be retrieved and if the file is in the project directory
    Parameters: not specified -Return value: string | null +Return value: null | string
    @@ -199,14 +199,14 @@ public function getFileContent(): string; ```php // Implemented in BumbleDocGen\Core\Parser\Entity\EntityInterface -public function getFileName(): string|null; +public function getFileName(): null|string; ```
    Returns the relative path to a file if it can be retrieved and if the file is in the project directory
    Parameters: not specified -Return value: string | null +Return value: null | string @@ -220,7 +220,7 @@ public function getFileName(): string|null; ```php -public function getFileSourceLink(bool $withLine = true): string|null; +public function getFileSourceLink(bool $withLine = true): null|string; ``` @@ -244,7 +244,7 @@ public function getFileSourceLink(bool $withLine = true): string|null; -Return value: string | null +Return value: null | string diff --git a/docs/tech/2.parser/classes/SourceLocatorInterface.md b/docs/tech/2.parser/classes/SourceLocatorInterface.md index ffd429ac..ab585951 100644 --- a/docs/tech/2.parser/classes/SourceLocatorInterface.md +++ b/docs/tech/2.parser/classes/SourceLocatorInterface.md @@ -48,14 +48,14 @@ interface SourceLocatorInterface ```php -public function getFinder(): \Symfony\Component\Finder\Finder|null; +public function getFinder(): null|\Symfony\Component\Finder\Finder; ``` Parameters: not specified -Return value: \Symfony\Component\Finder\Finder | null +Return value: null | \Symfony\Component\Finder\Finder diff --git a/docs/tech/2.parser/entity.md b/docs/tech/2.parser/entity.md index b3230099..03791d0d 100644 --- a/docs/tech/2.parser/entity.md +++ b/docs/tech/2.parser/entity.md @@ -123,4 +123,4 @@ These classes are a convenient wrapper for accessing data in templates:

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Oct 28 11:03:31 2023 +0300
    Page content update date: Mon Nov 06 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Oct 28 11:03:31 2023 +0300
    Page content update date: Mon Nov 13 2023
    Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/2.parser/entityFilterCondition.md b/docs/tech/2.parser/entityFilterCondition.md index 6c18390d..d1f3e5d3 100644 --- a/docs/tech/2.parser/entityFilterCondition.md +++ b/docs/tech/2.parser/entityFilterCondition.md @@ -78,4 +78,4 @@ Filter condition for working with entities PHP language handler:

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Oct 28 11:03:31 2023 +0300
    Page content update date: Mon Nov 06 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Oct 28 11:03:31 2023 +0300
    Page content update date: Mon Nov 13 2023
    Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/2.parser/readme.md b/docs/tech/2.parser/readme.md index 9d462717..590af902 100644 --- a/docs/tech/2.parser/readme.md +++ b/docs/tech/2.parser/readme.md @@ -41,4 +41,4 @@ In this section, we show how the parser works and what components it consists of

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Oct 28 11:03:31 2023 +0300
    Page content update date: Mon Nov 06 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Oct 28 11:03:31 2023 +0300
    Page content update date: Mon Nov 13 2023
    Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/2.parser/sourceLocator.md b/docs/tech/2.parser/sourceLocator.md index c7cae9be..f8db26f0 100644 --- a/docs/tech/2.parser/sourceLocator.md +++ b/docs/tech/2.parser/sourceLocator.md @@ -20,14 +20,9 @@ You can create your own source locators or use any existing ones. All source loc

    Built-in source locators

    -**Common source locators:** - -**PHP source locators:** - -
    • AsyncSourceLocator - Lazy loading classes. Cannot be used for initial parsing of files, only for getting specific documents

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Oct 28 11:03:31 2023 +0300
    Page content update date: Mon Nov 06 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Tue Nov 14 00:49:39 2023 +0300
    Page content update date: Mon Nov 13 2023
    Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/3.renderer/01_templates.md b/docs/tech/3.renderer/01_templates.md index 72ce1bb5..09e17358 100644 --- a/docs/tech/3.renderer/01_templates.md +++ b/docs/tech/3.renderer/01_templates.md @@ -101,4 +101,4 @@ Result after starting the documentation generation process:

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Fri Oct 13 18:40:45 2023 +0300
    Page content update date: Mon Nov 06 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Fri Oct 13 18:40:45 2023 +0300
    Page content update date: Mon Nov 13 2023
    Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/3.renderer/02_breadcrumbs.md b/docs/tech/3.renderer/02_breadcrumbs.md index 38a39bce..d25f0b72 100644 --- a/docs/tech/3.renderer/02_breadcrumbs.md +++ b/docs/tech/3.renderer/02_breadcrumbs.md @@ -51,4 +51,4 @@ Here is an example of the result of the `generatePageBreadcrumbs` function:

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Oct 28 11:03:31 2023 +0300
    Page content update date: Mon Nov 06 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Oct 28 11:03:31 2023 +0300
    Page content update date: Mon Nov 13 2023
    Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/3.renderer/03_documentStructure.md b/docs/tech/3.renderer/03_documentStructure.md index f7a420ff..c27f328a 100644 --- a/docs/tech/3.renderer/03_documentStructure.md +++ b/docs/tech/3.renderer/03_documentStructure.md @@ -19,4 +19,4 @@ plugins:

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Fri Oct 13 18:40:45 2023 +0300
    Page content update date: Mon Nov 06 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Fri Oct 13 18:40:45 2023 +0300
    Page content update date: Mon Nov 13 2023
    Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/3.renderer/04_twigCustomFilters.md b/docs/tech/3.renderer/04_twigCustomFilters.md index cb110aaa..200c98d0 100644 --- a/docs/tech/3.renderer/04_twigCustomFilters.md +++ b/docs/tech/3.renderer/04_twigCustomFilters.md @@ -56,8 +56,7 @@ Here is a list of filters available by default: addIndentFromLeft
    - Filter adds indent from left - + Filter adds indent from left @@ -89,8 +88,7 @@ Here is a list of filters available by default: fixStrSize
    - The filter pads the string with the specified characters on the right to the specified size - + The filter pads the string with the specified characters on the right to the specified size @@ -118,12 +116,31 @@ Here is a list of filters available by default:   + + + + implode
    + Join array elements with a string + + + + + + + $separator + + + string + + Element separator in result string + + +   preg_match
    - Perform a regular expression match - + Perform a regular expression match @@ -143,8 +160,7 @@ Here is a list of filters available by default: prepareSourceLink
    - The filter converts the string into an anchor that can be used in a GitHub document link - + The filter converts the string into an anchor that can be used in a GitHub document link The filter does not accept any additional parameters @@ -153,8 +169,7 @@ Here is a list of filters available by default: quotemeta
    - Quote meta characters - + Quote meta characters The filter does not accept any additional parameters @@ -163,8 +178,7 @@ Here is a list of filters available by default: removeLineBrakes
    - The filter replaces all line breaks with a space - + The filter replaces all line breaks with a space The filter does not accept any additional parameters @@ -173,8 +187,7 @@ Here is a list of filters available by default: strTypeToUrl
    - The filter converts the string with the data type into a link to the documented entity, if possible. -
    :warning: This filter initiates the creation of documents for the displayed entities
    + The filter converts the string with the data type into a link to the documented entity, if possible.
    :warning: This filter initiates the creation of documents for the displayed entities
    @@ -218,8 +231,7 @@ Here is a list of filters available by default: textToCodeBlock
    - Convert text to code block - + Convert text to code block @@ -239,8 +251,7 @@ Here is a list of filters available by default: textToHeading
    - Convert text to html header - + Convert text to html header @@ -263,4 +274,4 @@ Here is a list of filters available by default:

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Oct 28 11:03:31 2023 +0300
    Page content update date: Mon Nov 06 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Tue Nov 14 00:49:39 2023 +0300
    Page content update date: Mon Nov 13 2023
    Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/3.renderer/05_twigCustomFunctions.md b/docs/tech/3.renderer/05_twigCustomFunctions.md index 9a0db2a5..3c026399 100644 --- a/docs/tech/3.renderer/05_twigCustomFunctions.md +++ b/docs/tech/3.renderer/05_twigCustomFunctions.md @@ -385,4 +385,4 @@ Here is a list of functions available by default:

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Oct 28 11:03:31 2023 +0300
    Page content update date: Mon Nov 06 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Oct 28 11:03:31 2023 +0300
    Page content update date: Mon Nov 13 2023
    Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/3.renderer/classes/BreadcrumbsHelper.md b/docs/tech/3.renderer/classes/BreadcrumbsHelper.md index 3559f4cc..b8dbeecd 100644 --- a/docs/tech/3.renderer/classes/BreadcrumbsHelper.md +++ b/docs/tech/3.renderer/classes/BreadcrumbsHelper.md @@ -337,7 +337,7 @@ public function getNearestIndexFile(string $templateName): string; ```php -public function getPageDataByKey(string $key): array|null; +public function getPageDataByKey(string $key): null|array; ``` @@ -361,7 +361,7 @@ public function getPageDataByKey(string $key): array|null; -Return value: array | null +Return value: null | array Throws: @@ -388,7 +388,7 @@ public function getPageDataByKey(string $key): array|null; ```php -public function getPageDocFileByKey(string $key): string|null; +public function getPageDocFileByKey(string $key): null|string; ``` @@ -412,7 +412,7 @@ public function getPageDocFileByKey(string $key): string|null; -Return value: string | null +Return value: null | string Throws: @@ -439,7 +439,7 @@ public function getPageDocFileByKey(string $key): string|null; ```php -public function getPageLinkByKey(string $key): string|null; +public function getPageLinkByKey(string $key): null|string; ``` @@ -463,7 +463,7 @@ public function getPageLinkByKey(string $key): string|null; -Return value: string | null +Return value: null | string Throws: @@ -490,7 +490,7 @@ public function getPageLinkByKey(string $key): string|null; ```php -public function getTemplateLinkKey(string $templateName): string|null; +public function getTemplateLinkKey(string $templateName): null|string; ``` @@ -514,7 +514,7 @@ public function getTemplateLinkKey(string $templateName): string|null; -Return value: string | null +Return value: null | string Throws: diff --git a/docs/tech/3.renderer/classes/ClassEntityCollection.md b/docs/tech/3.renderer/classes/ClassEntityCollection.md index 78f49204..86747a3e 100644 --- a/docs/tech/3.renderer/classes/ClassEntityCollection.md +++ b/docs/tech/3.renderer/classes/ClassEntityCollection.md @@ -2,7 +2,7 @@ BumbleDocGen / Technical description of the project / Renderer / How to create documentation templates? / Templates variables / ClassEntityCollection

    - ClassEntityCollection class: + ClassEntityCollection class:

    @@ -12,7 +12,7 @@ ```php namespace BumbleDocGen\LanguageHandler\Php\Parser\Entity; -final class ClassEntityCollection extends \BumbleDocGen\Core\Parser\Entity\LoggableRootEntityCollection implements \IteratorAggregate, \Traversable +final class ClassEntityCollection extends \BumbleDocGen\Core\Parser\Entity\LoggableRootEntityCollection implements \IteratorAggregate ```
    Collection of PHP class entities
    @@ -68,7 +68,7 @@ final class ClassEntityCollection extends \BumbleDocGen\Core\Parser\Entity\Logga
  • getIterator - - Retrieve an external iterator
  • +
  • getLoadedOrCreateNew
  • @@ -118,7 +118,7 @@ final class ClassEntityCollection extends \BumbleDocGen\Core\Parser\Entity\Logga @@ -133,11 +133,11 @@ final class ClassEntityCollection extends \BumbleDocGen\Core\Parser\Entity\Logga ```php -public function __construct(\BumbleDocGen\Core\Configuration\Configuration $configuration, \BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings $phpHandlerSettings, \BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper $parserHelper, \BumbleDocGen\Core\Plugin\PluginEventDispatcher $pluginEventDispatcher, \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Cache\CacheablePhpEntityFactory $cacheablePhpEntityFactory, \BumbleDocGen\LanguageHandler\Php\Renderer\EntityDocRenderer\EntityDocRendererHelper $docRendererHelper, \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache $localObjectCache, \BumbleDocGen\Console\ProgressBar\ProgressBarFactory $progressBarFactory, \Symfony\Component\Console\Style\OutputStyle $io, \Psr\Log\LoggerInterface $logger); +public function __construct(\BumbleDocGen\Core\Configuration\Configuration $configuration, \BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings $phpHandlerSettings, \BumbleDocGen\Core\Plugin\PluginEventDispatcher $pluginEventDispatcher, \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Cache\CacheablePhpEntityFactory $cacheablePhpEntityFactory, \BumbleDocGen\LanguageHandler\Php\Renderer\EntityDocRenderer\EntityDocRendererHelper $docRendererHelper, \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpParser\PhpParserHelper $phpParserHelper, \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache $localObjectCache, \BumbleDocGen\Console\ProgressBar\ProgressBarFactory $progressBarFactory, \Symfony\Component\Console\Style\OutputStyle $io, \Psr\Log\LoggerInterface $logger); ``` @@ -162,11 +162,6 @@ public function __construct(\BumbleDocGen\Core\Configuration\Configuration $conf $phpHandlerSettings \BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings - - - - $parserHelper - \BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper - - $pluginEventDispatcher @@ -182,6 +177,11 @@ public function __construct(\BumbleDocGen\Core\Configuration\Configuration $conf $docRendererHelper \BumbleDocGen\LanguageHandler\Php\Renderer\EntityDocRenderer\EntityDocRendererHelper - + + + $phpParserHelper + \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpParser\PhpParserHelper + - $localObjectCache @@ -215,7 +215,7 @@ public function __construct(\BumbleDocGen\Core\Configuration\Configuration $conf ```php @@ -256,9 +256,6 @@ public function add(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity
  • \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • -
  • - \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
  • - @@ -291,7 +288,7 @@ public function clearOperationsLogCollection(): void; ```php @@ -324,9 +321,6 @@ public function filterByInterfaces(array $interfaces): \BumbleDocGen\LanguageHan Throws: ```php -public function getFileSourceLink(bool $withLine = true): string|null; +public function getFileSourceLink(bool $withLine = true): null|string; ``` @@ -244,7 +244,7 @@ public function getFileSourceLink(bool $withLine = true): string|null; -Return value: string | null +Return value: null | string diff --git a/docs/tech/3.renderer/classes/RootEntityInterface_2.md b/docs/tech/3.renderer/classes/RootEntityInterface_2.md index f771214c..28648ac9 100644 --- a/docs/tech/3.renderer/classes/RootEntityInterface_2.md +++ b/docs/tech/3.renderer/classes/RootEntityInterface_2.md @@ -12,7 +12,7 @@ ```php namespace BumbleDocGen\Core\Parser\Entity; -interface RootEntityInterface extends \\BumbleDocGen\Core\Parser\Entity\EntityInterface implements \BumbleDocGen\Core\Parser\Entity\EntityInterface +interface RootEntityInterface extends \BumbleDocGen\Core\Parser\Entity\EntityInterface ```
    Since the documentation generator supports several programming languages, @@ -134,14 +134,14 @@ public function entityDataCanBeLoaded(): bool; ```php // Implemented in BumbleDocGen\Core\Parser\Entity\EntityInterface -public function getAbsoluteFileName(): string|null; +public function getAbsoluteFileName(): null|string; ```
    Returns the absolute path to a file if it can be retrieved and if the file is in the project directory
    Parameters: not specified -Return value: string | null +Return value: null | string @@ -199,14 +199,14 @@ public function getFileContent(): string; ```php // Implemented in BumbleDocGen\Core\Parser\Entity\EntityInterface -public function getFileName(): string|null; +public function getFileName(): null|string; ```
    Returns the relative path to a file if it can be retrieved and if the file is in the project directory
    Parameters: not specified -Return value: string | null +Return value: null | string @@ -220,7 +220,7 @@ public function getFileName(): string|null; ```php -public function getFileSourceLink(bool $withLine = true): string|null; +public function getFileSourceLink(bool $withLine = true): null|string; ``` @@ -244,7 +244,7 @@ public function getFileSourceLink(bool $withLine = true): string|null; -Return value: string | null +Return value: null | string diff --git a/docs/tech/3.renderer/readme.md b/docs/tech/3.renderer/readme.md index 800c1393..eabca055 100644 --- a/docs/tech/3.renderer/readme.md +++ b/docs/tech/3.renderer/readme.md @@ -60,4 +60,4 @@ This process is presented in the form of a diagram below.

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Sep 2 21:01:47 2023 +0300
    Page content update date: Mon Nov 06 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Sep 2 21:01:47 2023 +0300
    Page content update date: Mon Nov 13 2023
    Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/3.renderer/templatesDynamicBlocks.md b/docs/tech/3.renderer/templatesDynamicBlocks.md index 5f0ba622..f123586b 100644 --- a/docs/tech/3.renderer/templatesDynamicBlocks.md +++ b/docs/tech/3.renderer/templatesDynamicBlocks.md @@ -26,4 +26,4 @@ You can use the built-in functions and filters or add your own, so you can imple

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Sep 2 21:01:47 2023 +0300
    Page content update date: Mon Nov 06 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Sep 2 21:01:47 2023 +0300
    Page content update date: Mon Nov 13 2023
    Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/3.renderer/templatesLinking.md b/docs/tech/3.renderer/templatesLinking.md index acd69845..d76c856b 100644 --- a/docs/tech/3.renderer/templatesLinking.md +++ b/docs/tech/3.renderer/templatesLinking.md @@ -27,4 +27,4 @@ You can also implement your own functions for relinking if necessary.

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Oct 28 11:03:31 2023 +0300
    Page content update date: Mon Nov 06 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Oct 28 11:03:31 2023 +0300
    Page content update date: Mon Nov 13 2023
    Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/3.renderer/templatesVariables.md b/docs/tech/3.renderer/templatesVariables.md index cf73d7a0..dc1d6885 100644 --- a/docs/tech/3.renderer/templatesVariables.md +++ b/docs/tech/3.renderer/templatesVariables.md @@ -11,4 +11,4 @@ There are several variables available in each processed template.

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Oct 28 11:03:31 2023 +0300
    Page content update date: Mon Nov 06 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Oct 28 11:03:31 2023 +0300
    Page content update date: Mon Nov 13 2023
    Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/4.pluginSystem/classes/AfterLoadingClassEntityCollection.md b/docs/tech/4.pluginSystem/classes/AfterLoadingClassEntityCollection.md index d1fde6a2..c93582ec 100644 --- a/docs/tech/4.pluginSystem/classes/AfterLoadingClassEntityCollection.md +++ b/docs/tech/4.pluginSystem/classes/AfterLoadingClassEntityCollection.md @@ -36,12 +36,6 @@ final class AfterLoadingClassEntityCollection extends \Symfony\Contracts\EventDi
  • getClassEntityCollection
  • -
  • - isPropagationStopped - - Is propagation stopped?
  • -
  • - stopPropagation - - Stops the propagation of the event to further event listeners.
  • @@ -108,52 +102,6 @@ public function getClassEntityCollection(): \BumbleDocGen\LanguageHandler\Php\Pa Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection - -
    -
    - - - -```php -// Implemented in Symfony\Contracts\EventDispatcher\Event - -public function isPropagationStopped(): bool; -``` - -
    Is propagation stopped?
    - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Contracts\EventDispatcher\Event - -public function stopPropagation(): void; -``` - -
    Stops the propagation of the event to further event listeners.
    - -Parameters: not specified - -Return value: void - -

    diff --git a/docs/tech/4.pluginSystem/classes/AfterRenderingEntities.md b/docs/tech/4.pluginSystem/classes/AfterRenderingEntities.md index 37f8776d..ef0e7529 100644 --- a/docs/tech/4.pluginSystem/classes/AfterRenderingEntities.md +++ b/docs/tech/4.pluginSystem/classes/AfterRenderingEntities.md @@ -15,7 +15,6 @@ namespace BumbleDocGen\Core\Plugin\Event\Renderer; final class AfterRenderingEntities extends \Symfony\Contracts\EventDispatcher\Event ``` -
    Event is the base class for classes containing event data.
    @@ -23,16 +22,7 @@ final class AfterRenderingEntities extends \Symfony\Contracts\EventDispatcher\Ev -

    Methods:

    -
      -
    1. - isPropagationStopped - - Is propagation stopped?
    2. -
    3. - stopPropagation - - Stops the propagation of the event to further event listeners.
    4. -
    @@ -40,53 +30,5 @@ final class AfterRenderingEntities extends \Symfony\Contracts\EventDispatcher\Ev -

    Method details:

    - -
    - - - -```php -// Implemented in Symfony\Contracts\EventDispatcher\Event - -public function isPropagationStopped(): bool; -``` - -
    Is propagation stopped?
    - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Contracts\EventDispatcher\Event - -public function stopPropagation(): void; -``` - -
    Stops the propagation of the event to further event listeners.
    - -Parameters: not specified - -Return value: void - - -
    -
    \ No newline at end of file diff --git a/docs/tech/4.pluginSystem/classes/BasePhpStubberPlugin.md b/docs/tech/4.pluginSystem/classes/BasePhpStubberPlugin.md index 9fc85aa9..09f32fd4 100644 --- a/docs/tech/4.pluginSystem/classes/BasePhpStubberPlugin.md +++ b/docs/tech/4.pluginSystem/classes/BasePhpStubberPlugin.md @@ -2,7 +2,7 @@ BumbleDocGen / Technical description of the project / Plugin system / BasePhpStubberPlugin

    - BasePhpStubberPlugin class: + BasePhpStubberPlugin class:

    @@ -28,7 +28,10 @@ final class BasePhpStubberPlugin implements \BumbleDocGen\Core\Plugin\PluginInte
    1. getSubscribedEvents - - Returns an array of event names this subscriber wants to listen to.
    2. + +
    3. + onCheckIsClassEntityCanBeLoad +
    4. onGettingResourceLink
    5. @@ -47,20 +50,58 @@ final class BasePhpStubberPlugin implements \BumbleDocGen\Core\Plugin\PluginInte ```php public static function getSubscribedEvents(): array; ``` -
      Returns an array of event names this subscriber wants to listen to.
      + Parameters: not specified Return value: array + +
      +
      + + + +```php +public function onCheckIsClassEntityCanBeLoad(\BumbleDocGen\LanguageHandler\Php\Plugin\Event\Entity\OnCheckIsClassEntityCanBeLoad $event): void; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $event\BumbleDocGen\LanguageHandler\Php\Plugin\Event\Entity\OnCheckIsClassEntityCanBeLoad-
      + +Return value: void + +

      @@ -68,7 +109,7 @@ public static function getSubscribedEvents(): array; ```php diff --git a/docs/tech/4.pluginSystem/classes/BeforeCreatingDocFile.md b/docs/tech/4.pluginSystem/classes/BeforeCreatingDocFile.md index 6c8bd9da..b6625576 100644 --- a/docs/tech/4.pluginSystem/classes/BeforeCreatingDocFile.md +++ b/docs/tech/4.pluginSystem/classes/BeforeCreatingDocFile.md @@ -39,15 +39,9 @@ final class BeforeCreatingDocFile extends \Symfony\Contracts\EventDispatcher\Eve
    6. getContext
    7. -
    8. - isPropagationStopped - - Is propagation stopped?
    9. setContent
    10. -
    11. - stopPropagation - - Stops the propagation of the event to further event listeners.
    @@ -140,29 +134,6 @@ public function getContext(): \BumbleDocGen\Core\Renderer\Context\RendererContex Return value: \BumbleDocGen\Core\Renderer\Context\RendererContext - -
    -
    - - - -```php -// Implemented in Symfony\Contracts\EventDispatcher\Event - -public function isPropagationStopped(): bool; -``` - -
    Is propagation stopped?
    - -Parameters: not specified - -Return value: bool - -

    @@ -201,29 +172,6 @@ public function setContent(string $content): void; Return value: void -
    -
    -
    - - - -```php -// Implemented in Symfony\Contracts\EventDispatcher\Event - -public function stopPropagation(): void; -``` - -
    Stops the propagation of the event to further event listeners.
    - -Parameters: not specified - -Return value: void - -

    diff --git a/docs/tech/4.pluginSystem/classes/BeforeParsingProcess.md b/docs/tech/4.pluginSystem/classes/BeforeParsingProcess.md new file mode 100644 index 00000000..3dfa8e1a --- /dev/null +++ b/docs/tech/4.pluginSystem/classes/BeforeParsingProcess.md @@ -0,0 +1,63 @@ + + BumbleDocGen / Technical description of the project / Plugin system / BeforeParsingProcess
    + +

    + BeforeParsingProcess class: +

    + + + + + +```php +namespace BumbleDocGen\Core\Plugin\Event\Parser; + +final class BeforeParsingProcess extends \Symfony\Contracts\EventDispatcher\Event +``` + + + + + + + + +

    Initialization methods:

    + +
      +
    1. + __construct +
    2. +
    + + + + + + + + +

    Method details:

    + +
    + + + +```php +public function __construct(); +``` + + + +Parameters: not specified + + + +
    +
    + + \ No newline at end of file diff --git a/docs/tech/4.pluginSystem/classes/BeforeRenderingDocFiles.md b/docs/tech/4.pluginSystem/classes/BeforeRenderingDocFiles.md index 68122b37..56d1b6d4 100644 --- a/docs/tech/4.pluginSystem/classes/BeforeRenderingDocFiles.md +++ b/docs/tech/4.pluginSystem/classes/BeforeRenderingDocFiles.md @@ -23,16 +23,7 @@ final class BeforeRenderingDocFiles extends \Symfony\Contracts\EventDispatcher\E -

    Methods:

    -
      -
    1. - isPropagationStopped - - Is propagation stopped?
    2. -
    3. - stopPropagation - - Stops the propagation of the event to further event listeners.
    4. -
    @@ -40,53 +31,4 @@ final class BeforeRenderingDocFiles extends \Symfony\Contracts\EventDispatcher\E -

    Method details:

    - -
    - - - -```php -// Implemented in Symfony\Contracts\EventDispatcher\Event - -public function isPropagationStopped(): bool; -``` - -
    Is propagation stopped?
    - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Contracts\EventDispatcher\Event - -public function stopPropagation(): void; -``` - -
    Stops the propagation of the event to further event listeners.
    - -Parameters: not specified - -Return value: void - - -
    -
    - \ No newline at end of file diff --git a/docs/tech/4.pluginSystem/classes/BeforeRenderingEntities.md b/docs/tech/4.pluginSystem/classes/BeforeRenderingEntities.md index 0ad8070a..701664b0 100644 --- a/docs/tech/4.pluginSystem/classes/BeforeRenderingEntities.md +++ b/docs/tech/4.pluginSystem/classes/BeforeRenderingEntities.md @@ -23,16 +23,7 @@ final class BeforeRenderingEntities extends \Symfony\Contracts\EventDispatcher\E -

    Methods:

    -
      -
    1. - isPropagationStopped - - Is propagation stopped?
    2. -
    3. - stopPropagation - - Stops the propagation of the event to further event listeners.
    4. -
    @@ -40,53 +31,4 @@ final class BeforeRenderingEntities extends \Symfony\Contracts\EventDispatcher\E -

    Method details:

    - -
    - - - -```php -// Implemented in Symfony\Contracts\EventDispatcher\Event - -public function isPropagationStopped(): bool; -``` - -
    Is propagation stopped?
    - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Contracts\EventDispatcher\Event - -public function stopPropagation(): void; -``` - -
    Stops the propagation of the event to further event listeners.
    - -Parameters: not specified - -Return value: void - - -
    -
    - \ No newline at end of file diff --git a/docs/tech/4.pluginSystem/classes/EntityDocUnifiedPlacePlugin.md b/docs/tech/4.pluginSystem/classes/EntityDocUnifiedPlacePlugin.md index f1b12b32..a50338c3 100644 --- a/docs/tech/4.pluginSystem/classes/EntityDocUnifiedPlacePlugin.md +++ b/docs/tech/4.pluginSystem/classes/EntityDocUnifiedPlacePlugin.md @@ -30,7 +30,7 @@ in a separate directory structure, so they are not duplicated.
    1. getSubscribedEvents - - Returns an array of event names this subscriber wants to listen to.
    2. +
    3. onCreateDocumentedEntityWrapper
    4. @@ -69,7 +69,7 @@ in a separate directory structure, so they are not duplicated. public static function getSubscribedEvents(): array; ``` -
      Returns an array of event names this subscriber wants to listen to.
      + Parameters: not specified diff --git a/docs/tech/4.pluginSystem/classes/InvalidConfigurationParameterException.md b/docs/tech/4.pluginSystem/classes/InvalidConfigurationParameterException.md index 5a1220d3..789262bc 100644 --- a/docs/tech/4.pluginSystem/classes/InvalidConfigurationParameterException.md +++ b/docs/tech/4.pluginSystem/classes/InvalidConfigurationParameterException.md @@ -12,380 +12,23 @@ ```php namespace BumbleDocGen\Core\Configuration\Exception; -final class InvalidConfigurationParameterException extends \Exception implements \Throwable, \Stringable +final class InvalidConfigurationParameterException extends \Exception ``` -
      Exception is the base class for -all Exceptions.
      -See: - -

      Initialization methods:

      -
        -
      1. - __construct - - Construct the exception. Note: The message is NOT binary safe.
      2. -
      -

      Methods:

      -
        -
      1. - __toString - - String representation of the exception
      2. -
      3. - __wakeup -
      4. -
      5. - getCode - - Gets the Exception code
      6. -
      7. - getFile - - Gets the file in which the exception occurred
      8. -
      9. - getLine - - Gets the line in which the exception occurred
      10. -
      11. - getMessage - - Gets the Exception message
      12. -
      13. - getPrevious - - Returns previous Exception
      14. -
      15. - getTrace - - Gets the stack trace
      16. -
      17. - getTraceAsString - - Gets the stack trace as a string
      18. -
      - -

      Method details:

      - -
      - -
        -
      • # - __construct -
      • -
      - -```php -// Implemented in Exception - -public function __construct(string $message = "", int $code, \Throwable|null $previous = \null); -``` - -
      Construct the exception. Note: The message is NOT binary safe.
      - -Parameters: - - - - - - - - - - - - - - - - - - - - - - - - - - -
      NameTypeDescription
      $messagestring[optional] The Exception message to throw.
      $codeint[optional] The Exception code.
      $previous\Throwable | null[optional] The previous throwable used for the exception chaining.
      - - - - -See: - -
      -
      -
      - -
        -
      • # - __toString -
      • -
      - -```php -// Implemented in Exception - -public function __toString(): string; -``` - -
      String representation of the exception
      - -Parameters: not specified - -Return value: string - - - -See: - -
      -
      -
      - -
        -
      • # - __wakeup -
      • -
      - -```php -// Implemented in Exception - -public function __wakeup(): mixed; -``` - - - -Parameters: not specified - -Return value: mixed - - -
      -
      -
      - -
        -
      • # - getCode -
      • -
      - -```php -// Implemented in Exception - -public function getCode(): mixed|int; -``` - -
      Gets the Exception code
      - -Parameters: not specified - -Return value: mixed | int - - - -See: - -
      -
      -
      - -
        -
      • # - getFile -
      • -
      - -```php -// Implemented in Exception - -public function getFile(): string; -``` - -
      Gets the file in which the exception occurred
      - -Parameters: not specified - -Return value: string - - - -See: - -
      -
      -
      - -
        -
      • # - getLine -
      • -
      - -```php -// Implemented in Exception - -public function getLine(): int; -``` - -
      Gets the line in which the exception occurred
      - -Parameters: not specified - -Return value: int - - - -See: - -
      -
      -
      - -
        -
      • # - getMessage -
      • -
      - -```php -// Implemented in Exception - -public function getMessage(): string; -``` - -
      Gets the Exception message
      - -Parameters: not specified - -Return value: string - - - -See: - -
      -
      -
      - -
        -
      • # - getPrevious -
      • -
      - -```php -// Implemented in Exception - -public function getPrevious(): \Throwable|null; -``` - -
      Returns previous Exception
      - -Parameters: not specified - -Return value: \Throwable | null - - - -See: - -
      -
      -
      - -
        -
      • # - getTrace -
      • -
      - -```php -// Implemented in Exception - -public function getTrace(): array; -``` - -
      Gets the stack trace
      - -Parameters: not specified - -Return value: array - - - -See: - -
      -
      -
      - -
        -
      • # - getTraceAsString -
      • -
      - -```php -// Implemented in Exception - -public function getTraceAsString(): string; -``` - -
      Gets the stack trace as a string
      - -Parameters: not specified - -Return value: string - - - -See: - -
      -
      - \ No newline at end of file diff --git a/docs/tech/4.pluginSystem/classes/LastPageCommitter.md b/docs/tech/4.pluginSystem/classes/LastPageCommitter.md index 8bdd4747..1f23c02c 100644 --- a/docs/tech/4.pluginSystem/classes/LastPageCommitter.md +++ b/docs/tech/4.pluginSystem/classes/LastPageCommitter.md @@ -38,7 +38,7 @@ final class LastPageCommitter implements \BumbleDocGen\Core\Plugin\PluginInterfa
    5. getSubscribedEvents - - Returns an array of event names this subscriber wants to listen to.
    6. +
    @@ -141,7 +141,7 @@ public function beforeCreatingDocFile(\BumbleDocGen\Core\Plugin\Event\Renderer\B public static function getSubscribedEvents(): array; ``` -
    Returns an array of event names this subscriber wants to listen to.
    + Parameters: not specified diff --git a/docs/tech/4.pluginSystem/classes/OnAddClassEntityToCollection.md b/docs/tech/4.pluginSystem/classes/OnAddClassEntityToCollection.md index 8247594d..33448bd1 100644 --- a/docs/tech/4.pluginSystem/classes/OnAddClassEntityToCollection.md +++ b/docs/tech/4.pluginSystem/classes/OnAddClassEntityToCollection.md @@ -42,12 +42,6 @@ final class OnAddClassEntityToCollection extends \Symfony\Contracts\EventDispatc
  • getUniqueExecutionId
  • -
  • - isPropagationStopped - - Is propagation stopped?
  • -
  • - stopPropagation - - Stops the propagation of the event to further event listeners.
  • @@ -161,52 +155,6 @@ public function getUniqueExecutionId(): string; Return value: string - -
    -
    - - - -```php -// Implemented in Symfony\Contracts\EventDispatcher\Event - -public function isPropagationStopped(): bool; -``` - -
    Is propagation stopped?
    - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Contracts\EventDispatcher\Event - -public function stopPropagation(): void; -``` - -
    Stops the propagation of the event to further event listeners.
    - -Parameters: not specified - -Return value: void - -

    diff --git a/docs/tech/4.pluginSystem/classes/OnCheckIsClassEntityCanBeLoad.md b/docs/tech/4.pluginSystem/classes/OnCheckIsClassEntityCanBeLoad.md index 2c3a1991..447ec34d 100644 --- a/docs/tech/4.pluginSystem/classes/OnCheckIsClassEntityCanBeLoad.md +++ b/docs/tech/4.pluginSystem/classes/OnCheckIsClassEntityCanBeLoad.md @@ -15,7 +15,7 @@ namespace BumbleDocGen\LanguageHandler\Php\Plugin\Event\Entity; final class OnCheckIsClassEntityCanBeLoad extends \Symfony\Contracts\EventDispatcher\Event ``` -
    Event is the base class for classes containing event data.
    + @@ -42,12 +42,6 @@ final class OnCheckIsClassEntityCanBeLoad extends \Symfony\Contracts\EventDispat
  • isClassCanBeLoad
  • -
  • - isPropagationStopped - - Is propagation stopped?
  • -
  • - stopPropagation - - Stops the propagation of the event to further event listeners.
  • @@ -175,52 +169,6 @@ public function isClassCanBeLoad(): bool; Return value: bool - -
    -
    - - - -```php -// Implemented in Symfony\Contracts\EventDispatcher\Event - -public function isPropagationStopped(): bool; -``` - -
    Is propagation stopped?
    - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Contracts\EventDispatcher\Event - -public function stopPropagation(): void; -``` - -
    Stops the propagation of the event to further event listeners.
    - -Parameters: not specified - -Return value: void - -

    diff --git a/docs/tech/4.pluginSystem/classes/OnCreateDocumentedEntityWrapper.md b/docs/tech/4.pluginSystem/classes/OnCreateDocumentedEntityWrapper.md index b0dbaf39..df37da81 100644 --- a/docs/tech/4.pluginSystem/classes/OnCreateDocumentedEntityWrapper.md +++ b/docs/tech/4.pluginSystem/classes/OnCreateDocumentedEntityWrapper.md @@ -36,12 +36,6 @@ final class OnCreateDocumentedEntityWrapper extends \Symfony\Contracts\EventDisp
  • getDocumentedEntityWrapper
  • -
  • - isPropagationStopped - - Is propagation stopped?
  • -
  • - stopPropagation - - Stops the propagation of the event to further event listeners.
  • @@ -108,52 +102,6 @@ public function getDocumentedEntityWrapper(): \BumbleDocGen\Core\Renderer\Contex Return value: \BumbleDocGen\Core\Renderer\Context\DocumentedEntityWrapper - -
    -
    - - - -```php -// Implemented in Symfony\Contracts\EventDispatcher\Event - -public function isPropagationStopped(): bool; -``` - -
    Is propagation stopped?
    - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Contracts\EventDispatcher\Event - -public function stopPropagation(): void; -``` - -
    Stops the propagation of the event to further event listeners.
    - -Parameters: not specified - -Return value: void - -

    diff --git a/docs/tech/4.pluginSystem/classes/OnGetProjectTemplatesDirs.md b/docs/tech/4.pluginSystem/classes/OnGetProjectTemplatesDirs.md index e9d504ac..8eb40ac3 100644 --- a/docs/tech/4.pluginSystem/classes/OnGetProjectTemplatesDirs.md +++ b/docs/tech/4.pluginSystem/classes/OnGetProjectTemplatesDirs.md @@ -39,12 +39,6 @@ final class OnGetProjectTemplatesDirs extends \Symfony\Contracts\EventDispatcher
  • getTemplatesDirs
  • -
  • - isPropagationStopped - - Is propagation stopped?
  • -
  • - stopPropagation - - Stops the propagation of the event to further event listeners.
  • @@ -149,52 +143,6 @@ public function getTemplatesDirs(): array; Return value: array - -
    -
    - - - -```php -// Implemented in Symfony\Contracts\EventDispatcher\Event - -public function isPropagationStopped(): bool; -``` - -
    Is propagation stopped?
    - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Contracts\EventDispatcher\Event - -public function stopPropagation(): void; -``` - -
    Stops the propagation of the event to further event listeners.
    - -Parameters: not specified - -Return value: void - -

    diff --git a/docs/tech/4.pluginSystem/classes/OnGetTemplatePathByRelativeDocPath.md b/docs/tech/4.pluginSystem/classes/OnGetTemplatePathByRelativeDocPath.md index 64f9ac0b..8a31a6dd 100644 --- a/docs/tech/4.pluginSystem/classes/OnGetTemplatePathByRelativeDocPath.md +++ b/docs/tech/4.pluginSystem/classes/OnGetTemplatePathByRelativeDocPath.md @@ -39,15 +39,9 @@ final class OnGetTemplatePathByRelativeDocPath extends \Symfony\Contracts\EventD
  • getTemplateName
  • -
  • - isPropagationStopped - - Is propagation stopped?
  • setCustomTemplateFilePath
  • -
  • - stopPropagation - - Stops the propagation of the event to further event listeners.
  • @@ -104,14 +98,14 @@ public function __construct(string $templateName); ```php -public function getCustomTemplateFilePath(): string|null; +public function getCustomTemplateFilePath(): null|string; ``` Parameters: not specified -Return value: string | null +Return value: null | string @@ -135,29 +129,6 @@ public function getTemplateName(): string; Return value: string - -
    -
    - - - -```php -// Implemented in Symfony\Contracts\EventDispatcher\Event - -public function isPropagationStopped(): bool; -``` - -
    Is propagation stopped?
    - -Parameters: not specified - -Return value: bool - -

    @@ -196,29 +167,6 @@ public function setCustomTemplateFilePath(string|null $customTemplateFilePath): Return value: void -
    -
    -
    - - - -```php -// Implemented in Symfony\Contracts\EventDispatcher\Event - -public function stopPropagation(): void; -``` - -
    Stops the propagation of the event to further event listeners.
    - -Parameters: not specified - -Return value: void - -

    diff --git a/docs/tech/4.pluginSystem/classes/OnGettingResourceLink.md b/docs/tech/4.pluginSystem/classes/OnGettingResourceLink.md index 55ab7614..f18c7386 100644 --- a/docs/tech/4.pluginSystem/classes/OnGettingResourceLink.md +++ b/docs/tech/4.pluginSystem/classes/OnGettingResourceLink.md @@ -39,15 +39,9 @@ final class OnGettingResourceLink extends \Symfony\Contracts\EventDispatcher\Eve
  • getResourceUrl
  • -
  • - isPropagationStopped - - Is propagation stopped?
  • setResourceUrl
  • -
  • - stopPropagation - - Stops the propagation of the event to further event listeners.
  • @@ -125,37 +119,14 @@ public function getResourceName(): string; ```php -public function getResourceUrl(): string|null; +public function getResourceUrl(): null|string; ``` Parameters: not specified -Return value: string | null - - - -
    -
    - - - -```php -// Implemented in Symfony\Contracts\EventDispatcher\Event - -public function isPropagationStopped(): bool; -``` - -
    Is propagation stopped?
    - -Parameters: not specified - -Return value: bool +Return value: null | string
    @@ -196,29 +167,6 @@ public function setResourceUrl(string|null $resourceUrl): void; Return value: void - -
    -
    - - - -```php -// Implemented in Symfony\Contracts\EventDispatcher\Event - -public function stopPropagation(): void; -``` - -
    Stops the propagation of the event to further event listeners.
    - -Parameters: not specified - -Return value: void - -

    diff --git a/docs/tech/4.pluginSystem/classes/OnLoadEntityDocPluginContent.md b/docs/tech/4.pluginSystem/classes/OnLoadEntityDocPluginContent.md index e03471f4..219477a2 100644 --- a/docs/tech/4.pluginSystem/classes/OnLoadEntityDocPluginContent.md +++ b/docs/tech/4.pluginSystem/classes/OnLoadEntityDocPluginContent.md @@ -54,12 +54,6 @@ See:
  • getEntity
  • -
  • - isPropagationStopped - - Is propagation stopped?
  • -
  • - stopPropagation - - Stops the propagation of the event to further event listeners.
  • @@ -237,52 +231,6 @@ public function getEntity(): \BumbleDocGen\Core\Parser\Entity\RootEntityInterfac Return value: \BumbleDocGen\Core\Parser\Entity\RootEntityInterface - -
    -
    - - - -```php -// Implemented in Symfony\Contracts\EventDispatcher\Event - -public function isPropagationStopped(): bool; -``` - -
    Is propagation stopped?
    - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Contracts\EventDispatcher\Event - -public function stopPropagation(): void; -``` - -
    Stops the propagation of the event to further event listeners.
    - -Parameters: not specified - -Return value: void - -

    diff --git a/docs/tech/4.pluginSystem/classes/OnLoadSourceLocatorsCollection.md b/docs/tech/4.pluginSystem/classes/OnLoadSourceLocatorsCollection.md index 0bc4f882..b8654837 100644 --- a/docs/tech/4.pluginSystem/classes/OnLoadSourceLocatorsCollection.md +++ b/docs/tech/4.pluginSystem/classes/OnLoadSourceLocatorsCollection.md @@ -36,12 +36,6 @@ final class OnLoadSourceLocatorsCollection extends \Symfony\Contracts\EventDispa
  • getSourceLocatorsCollection
  • -
  • - isPropagationStopped - - Is propagation stopped?
  • -
  • - stopPropagation - - Stops the propagation of the event to further event listeners.
  • @@ -108,52 +102,6 @@ public function getSourceLocatorsCollection(): \BumbleDocGen\Core\Parser\SourceL Return value: \BumbleDocGen\Core\Parser\SourceLocator\SourceLocatorsCollection - -
    -
    - - - -```php -// Implemented in Symfony\Contracts\EventDispatcher\Event - -public function isPropagationStopped(): bool; -``` - -
    Is propagation stopped?
    - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Contracts\EventDispatcher\Event - -public function stopPropagation(): void; -``` - -
    Stops the propagation of the event to further event listeners.
    - -Parameters: not specified - -Return value: void - -

    diff --git a/docs/tech/4.pluginSystem/classes/PageHtmlLinkerPlugin.md b/docs/tech/4.pluginSystem/classes/PageHtmlLinkerPlugin.md index 191d037e..d8b981e2 100644 --- a/docs/tech/4.pluginSystem/classes/PageHtmlLinkerPlugin.md +++ b/docs/tech/4.pluginSystem/classes/PageHtmlLinkerPlugin.md @@ -68,7 +68,7 @@ final class PageHtmlLinkerPlugin extends \BumbleDocGen\Core\Plugin\CorePlugin\Pa
  • getSubscribedEvents - - Returns an array of event names this subscriber wants to listen to.
  • + @@ -84,7 +84,7 @@ final class PageHtmlLinkerPlugin extends \BumbleDocGen\Core\Plugin\CorePlugin\Pa ```php @@ -138,7 +138,7 @@ public function __construct(\BumbleDocGen\Core\Renderer\Breadcrumbs\BreadcrumbsH ```php @@ -179,9 +179,6 @@ public function beforeCreatingDocFile(\BumbleDocGen\Core\Plugin\Event\Renderer\B
  • \DI\DependencyException
  • -
  • - \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
  • -
  • \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • @@ -194,7 +191,7 @@ public function beforeCreatingDocFile(\BumbleDocGen\Core\Plugin\Event\Renderer\B ```php @@ -203,7 +200,7 @@ public function beforeCreatingDocFile(\BumbleDocGen\Core\Plugin\Event\Renderer\B public static function getSubscribedEvents(): array; ``` -
    Returns an array of event names this subscriber wants to listen to.
    + Parameters: not specified diff --git a/docs/tech/4.pluginSystem/classes/PageLinkerPlugin.md b/docs/tech/4.pluginSystem/classes/PageLinkerPlugin.md index 6bd972dc..84bf4b89 100644 --- a/docs/tech/4.pluginSystem/classes/PageLinkerPlugin.md +++ b/docs/tech/4.pluginSystem/classes/PageLinkerPlugin.md @@ -68,7 +68,7 @@ final class PageLinkerPlugin extends \BumbleDocGen\Core\Plugin\CorePlugin\PageLi
  • getSubscribedEvents - - Returns an array of event names this subscriber wants to listen to.
  • + @@ -84,7 +84,7 @@ final class PageLinkerPlugin extends \BumbleDocGen\Core\Plugin\CorePlugin\PageLi ```php @@ -138,7 +138,7 @@ public function __construct(\BumbleDocGen\Core\Renderer\Breadcrumbs\BreadcrumbsH ```php @@ -179,9 +179,6 @@ public function beforeCreatingDocFile(\BumbleDocGen\Core\Plugin\Event\Renderer\B
  • \DI\DependencyException
  • -
  • - \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
  • -
  • \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • @@ -194,7 +191,7 @@ public function beforeCreatingDocFile(\BumbleDocGen\Core\Plugin\Event\Renderer\B ```php @@ -203,7 +200,7 @@ public function beforeCreatingDocFile(\BumbleDocGen\Core\Plugin\Event\Renderer\B public static function getSubscribedEvents(): array; ``` -
    Returns an array of event names this subscriber wants to listen to.
    + Parameters: not specified diff --git a/docs/tech/4.pluginSystem/classes/PageRstLinkerPlugin.md b/docs/tech/4.pluginSystem/classes/PageRstLinkerPlugin.md index 433b4745..c953ad87 100644 --- a/docs/tech/4.pluginSystem/classes/PageRstLinkerPlugin.md +++ b/docs/tech/4.pluginSystem/classes/PageRstLinkerPlugin.md @@ -58,7 +58,7 @@ final class PageRstLinkerPlugin extends \BumbleDocGen\Core\Plugin\CorePlugin\Pag
  • getSubscribedEvents - - Returns an array of event names this subscriber wants to listen to.
  • + @@ -74,7 +74,7 @@ final class PageRstLinkerPlugin extends \BumbleDocGen\Core\Plugin\CorePlugin\Pag ```php @@ -128,7 +128,7 @@ public function __construct(\BumbleDocGen\Core\Renderer\Breadcrumbs\BreadcrumbsH ```php @@ -169,9 +169,6 @@ public function beforeCreatingDocFile(\BumbleDocGen\Core\Plugin\Event\Renderer\B
  • \DI\DependencyException
  • -
  • - \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
  • -
  • \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • @@ -184,7 +181,7 @@ public function beforeCreatingDocFile(\BumbleDocGen\Core\Plugin\Event\Renderer\B ```php @@ -193,7 +190,7 @@ public function beforeCreatingDocFile(\BumbleDocGen\Core\Plugin\Event\Renderer\B public static function getSubscribedEvents(): array; ``` -
    Returns an array of event names this subscriber wants to listen to.
    + Parameters: not specified diff --git a/docs/tech/4.pluginSystem/classes/PhpDocumentorStubberPlugin.md b/docs/tech/4.pluginSystem/classes/PhpDocumentorStubberPlugin.md index a7be44da..1b573e1e 100644 --- a/docs/tech/4.pluginSystem/classes/PhpDocumentorStubberPlugin.md +++ b/docs/tech/4.pluginSystem/classes/PhpDocumentorStubberPlugin.md @@ -28,7 +28,7 @@ final class PhpDocumentorStubberPlugin implements \BumbleDocGen\Core\Plugin\Plug
    1. getSubscribedEvents - - Returns an array of event names this subscriber wants to listen to.
    2. +
    3. onCheckIsClassEntityCanBeLoad
    4. @@ -57,7 +57,7 @@ final class PhpDocumentorStubberPlugin implements \BumbleDocGen\Core\Plugin\Plug public static function getSubscribedEvents(): array; ``` -
      Returns an array of event names this subscriber wants to listen to.
      + Parameters: not specified diff --git a/docs/tech/4.pluginSystem/classes/PhpUnitStubberPlugin.md b/docs/tech/4.pluginSystem/classes/PhpUnitStubberPlugin.md index 30956139..abae1a49 100644 --- a/docs/tech/4.pluginSystem/classes/PhpUnitStubberPlugin.md +++ b/docs/tech/4.pluginSystem/classes/PhpUnitStubberPlugin.md @@ -28,7 +28,7 @@ final class PhpUnitStubberPlugin implements \BumbleDocGen\Core\Plugin\PluginInte
      1. getSubscribedEvents - - Returns an array of event names this subscriber wants to listen to.
      2. +
      3. onCheckIsClassEntityCanBeLoad
      4. @@ -57,7 +57,7 @@ final class PhpUnitStubberPlugin implements \BumbleDocGen\Core\Plugin\PluginInte public static function getSubscribedEvents(): array; ``` -
        Returns an array of event names this subscriber wants to listen to.
        + Parameters: not specified diff --git a/docs/tech/4.pluginSystem/classes/PluginInterface.md b/docs/tech/4.pluginSystem/classes/PluginInterface.md index 6e9a56d9..a1bd1f20 100644 --- a/docs/tech/4.pluginSystem/classes/PluginInterface.md +++ b/docs/tech/4.pluginSystem/classes/PluginInterface.md @@ -12,7 +12,7 @@ ```php namespace BumbleDocGen\Core\Plugin; -interface PluginInterface extends \\Symfony\Component\EventDispatcher\EventSubscriberInterface implements \Symfony\Component\EventDispatcher\EventSubscriberInterface +interface PluginInterface extends \Symfony\Component\EventDispatcher\EventSubscriberInterface ``` @@ -23,13 +23,7 @@ interface PluginInterface extends \\Symfony\Component\EventDispatcher\EventSubsc -

        Methods:

        -
          -
        1. - getSubscribedEvents - - Returns an array of event names this subscriber wants to listen to.
        2. -
        @@ -37,30 +31,4 @@ interface PluginInterface extends \\Symfony\Component\EventDispatcher\EventSubsc -

        Method details:

        - -
        - - - -```php -// Implemented in Symfony\Component\EventDispatcher\EventSubscriberInterface - -public static function getSubscribedEvents(): array>; -``` - -
        Returns an array of event names this subscriber wants to listen to.
        - -Parameters: not specified - -Return value: array | array{0:string,1:int} | list> - - -
        -
        - \ No newline at end of file diff --git a/docs/tech/4.pluginSystem/classes/ReflectionException.md b/docs/tech/4.pluginSystem/classes/ReflectionException.md deleted file mode 100644 index 96ce19e2..00000000 --- a/docs/tech/4.pluginSystem/classes/ReflectionException.md +++ /dev/null @@ -1,391 +0,0 @@ - - BumbleDocGen / Technical description of the project / Plugin system / ReflectionException
        - -

        - ReflectionException class: -

        - - - - - -```php -namespace BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception; - -final class ReflectionException extends \Exception implements \Throwable, \Stringable -``` - -
        Exception is the base class for -all Exceptions.
        - -See: - - - - - - - -

        Initialization methods:

        - -
          -
        1. - __construct - - Construct the exception. Note: The message is NOT binary safe.
        2. -
        - -

        Methods:

        - -
          -
        1. - __toString - - String representation of the exception
        2. -
        3. - __wakeup -
        4. -
        5. - getCode - - Gets the Exception code
        6. -
        7. - getFile - - Gets the file in which the exception occurred
        8. -
        9. - getLine - - Gets the line in which the exception occurred
        10. -
        11. - getMessage - - Gets the Exception message
        12. -
        13. - getPrevious - - Returns previous Exception
        14. -
        15. - getTrace - - Gets the stack trace
        16. -
        17. - getTraceAsString - - Gets the stack trace as a string
        18. -
        - - - - - - - -

        Method details:

        - -
        - -
          -
        • # - __construct -
        • -
        - -```php -// Implemented in Exception - -public function __construct(string $message = "", int $code, \Throwable|null $previous = \null); -``` - -
        Construct the exception. Note: The message is NOT binary safe.
        - -Parameters: - - - - - - - - - - - - - - - - - - - - - - - - - - -
        NameTypeDescription
        $messagestring[optional] The Exception message to throw.
        $codeint[optional] The Exception code.
        $previous\Throwable | null[optional] The previous throwable used for the exception chaining.
        - - - - -See: - -
        -
        -
        - -
          -
        • # - __toString -
        • -
        - -```php -// Implemented in Exception - -public function __toString(): string; -``` - -
        String representation of the exception
        - -Parameters: not specified - -Return value: string - - - -See: - -
        -
        -
        - -
          -
        • # - __wakeup -
        • -
        - -```php -// Implemented in Exception - -public function __wakeup(): mixed; -``` - - - -Parameters: not specified - -Return value: mixed - - -
        -
        -
        - -
          -
        • # - getCode -
        • -
        - -```php -// Implemented in Exception - -public function getCode(): mixed|int; -``` - -
        Gets the Exception code
        - -Parameters: not specified - -Return value: mixed | int - - - -See: - -
        -
        -
        - -
          -
        • # - getFile -
        • -
        - -```php -// Implemented in Exception - -public function getFile(): string; -``` - -
        Gets the file in which the exception occurred
        - -Parameters: not specified - -Return value: string - - - -See: - -
        -
        -
        - -
          -
        • # - getLine -
        • -
        - -```php -// Implemented in Exception - -public function getLine(): int; -``` - -
        Gets the line in which the exception occurred
        - -Parameters: not specified - -Return value: int - - - -See: - -
        -
        -
        - -
          -
        • # - getMessage -
        • -
        - -```php -// Implemented in Exception - -public function getMessage(): string; -``` - -
        Gets the Exception message
        - -Parameters: not specified - -Return value: string - - - -See: - -
        -
        -
        - -
          -
        • # - getPrevious -
        • -
        - -```php -// Implemented in Exception - -public function getPrevious(): \Throwable|null; -``` - -
        Returns previous Exception
        - -Parameters: not specified - -Return value: \Throwable | null - - - -See: - -
        -
        -
        - -
          -
        • # - getTrace -
        • -
        - -```php -// Implemented in Exception - -public function getTrace(): array; -``` - -
        Gets the stack trace
        - -Parameters: not specified - -Return value: array - - - -See: - -
        -
        -
        - -
          -
        • # - getTraceAsString -
        • -
        - -```php -// Implemented in Exception - -public function getTraceAsString(): string; -``` - -
        Gets the stack trace as a string
        - -Parameters: not specified - -Return value: string - - - -See: - -
        -
        - - \ No newline at end of file diff --git a/docs/tech/4.pluginSystem/classes/StubberPlugin.md b/docs/tech/4.pluginSystem/classes/StubberPlugin.md index eae9c06f..1c845b77 100644 --- a/docs/tech/4.pluginSystem/classes/StubberPlugin.md +++ b/docs/tech/4.pluginSystem/classes/StubberPlugin.md @@ -35,7 +35,7 @@ final class StubberPlugin implements \BumbleDocGen\Core\Plugin\PluginInterface,
        1. getSubscribedEvents - - Returns an array of event names this subscriber wants to listen to.
        2. +
        3. onCheckIsClassEntityCanBeLoad
        4. @@ -57,11 +57,11 @@ final class StubberPlugin implements \BumbleDocGen\Core\Plugin\PluginInterface, ```php -public function __construct(\BumbleDocGen\LanguageHandler\Php\Parser\ComposerParser $composerParser); +public function __construct(\BumbleDocGen\LanguageHandler\Php\Parser\ComposerHelper $composerHelper); ``` @@ -78,8 +78,8 @@ public function __construct(\BumbleDocGen\LanguageHandler\Php\Parser\ComposerPar - $composerParser - \BumbleDocGen\LanguageHandler\Php\Parser\ComposerParser + $composerHelper + \BumbleDocGen\LanguageHandler\Php\Parser\ComposerHelper - @@ -94,14 +94,14 @@ public function __construct(\BumbleDocGen\LanguageHandler\Php\Parser\ComposerPar ```php public static function getSubscribedEvents(): array; ``` -
          Returns an array of event names this subscriber wants to listen to.
          + Parameters: not specified @@ -115,7 +115,7 @@ public static function getSubscribedEvents(): array; ```php @@ -160,7 +160,7 @@ public function onCheckIsClassEntityCanBeLoad(\BumbleDocGen\LanguageHandler\Php\ ```php diff --git a/docs/tech/4.pluginSystem/readme.md b/docs/tech/4.pluginSystem/readme.md index 01f7ca5b..bcd2ebc4 100644 --- a/docs/tech/4.pluginSystem/readme.md +++ b/docs/tech/4.pluginSystem/readme.md @@ -12,7 +12,6 @@ You can add your plugins to the configuration like this: ```yaml plugins: - - class: \SelfDocConfig\Plugin\RoaveStubber\BetterReflectionStubberPlugin - class: \SelfDocConfig\Plugin\TwigFilterClassParser\TwigFilterClassParserPlugin - class: \SelfDocConfig\Plugin\TwigFunctionClassParser\TwigFunctionClassParserPlugin ``` @@ -96,6 +95,7 @@ Plugins for any programming languages work regardless of which language handler Adding links to type documentation and documentation of built-in PHP classes @@ -151,7 +151,7 @@ in a separate directory structure, so they are not duplicated.

          Default events

          - +

          Adding a new plugin

          @@ -190,4 +190,4 @@ plugins:

          -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
          Last modified date: Sat Oct 28 11:03:31 2023 +0300
          Page content update date: Mon Nov 06 2023
          Made with Bumble Documentation Generator
          \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
          Last modified date: Mon Nov 13 19:35:15 2023 +0300
          Page content update date: Mon Nov 13 2023
          Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/classes/AddDocBlocksCommand.md b/docs/tech/classes/AddDocBlocksCommand.md index e4bca321..54f70a3f 100644 --- a/docs/tech/classes/AddDocBlocksCommand.md +++ b/docs/tech/classes/AddDocBlocksCommand.md @@ -2,7 +2,7 @@ BumbleDocGen / Technical description of the project / Class map / AddDocBlocksCommand

          - AddDocBlocksCommand class: + AddDocBlocksCommand class:

          @@ -15,7 +15,7 @@ namespace BumbleDocGen\AI\Console; final class AddDocBlocksCommand extends \BumbleDocGen\Console\Command\BaseCommand ``` -
          Base class for all commands.
          + @@ -30,109 +30,6 @@ final class AddDocBlocksCommand extends \BumbleDocGen\Console\Command\BaseComman
        -

        Methods:

        - -
          -
        1. - addArgument - - Adds an argument.
        2. -
        3. - addOption - - Adds an option.
        4. -
        5. - addUsage - - Add a command usage example, it'll be prefixed with the command name.
        6. -
        7. - complete - - Adds suggestions to $suggestions for the current completion input (e.g. option or argument).
        8. -
        9. - getAliases - - Returns the aliases for the command.
        10. -
        11. - getApplication - - Gets the application instance for this command.
        12. -
        13. - getDefaultDescription -
        14. -
        15. - getDefaultName -
        16. -
        17. - getDefinition - - Gets the InputDefinition attached to this Command.
        18. -
        19. - getDescription - - Returns the description for the command.
        20. -
        21. - getHelp - - Returns the help for the command.
        22. -
        23. - getHelper - - Gets a helper instance by name.
        24. -
        25. - getHelperSet - - Gets the helper set.
        26. -
        27. - getName - - Returns the command name.
        28. -
        29. - getNativeDefinition - - Gets the InputDefinition to be used to create representations of this Command.
        30. -
        31. - getProcessedHelp - - Returns the processed help for the command replacing the %command.name% and %command.full_name% patterns with the real values dynamically.
        32. -
        33. - getSynopsis - - Returns the synopsis for the command.
        34. -
        35. - getUsages - - Returns alternative usages of the command.
        36. -
        37. - ignoreValidationErrors - - Ignores validation errors.
        38. -
        39. - isEnabled - - Checks whether the command is enabled or not in the current environment.
        40. -
        41. - isHidden -
        42. -
        43. - mergeApplicationDefinition - - Merges the application definition with the command definition.
        44. -
        45. - run - - Runs the command.
        46. -
        47. - setAliases - - Sets the aliases for the command.
        48. -
        49. - setApplication -
        50. -
        51. - setCode - - Sets the code to execute when running this command.
        52. -
        53. - setDefinition - - Sets an array of argument and option instances.
        54. -
        55. - setDescription - - Sets the description for the command.
        56. -
        57. - setHelp - - Sets the help for the command.
        58. -
        59. - setHelperSet -
        60. -
        61. - setHidden -
        62. -
        63. - setName - - Sets the name of the command.
        64. -
        65. - setProcessTitle - - Sets the process title of the command.
        66. -

        Traits:

        @@ -142,21 +39,9 @@ final class AddDocBlocksCommand extends \BumbleDocGen\Console\Command\BaseComman

        Constants:

        @@ -196,1195 +81,11 @@ public function __construct(string $name = null); $name string - The name of the command; passing null means it must be set in configure() - - - - - - -Throws: - - - -
        -
        - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function addArgument(string $name, int $mode = null, string $description = '', mixed $default = null): static; -``` - -
        Adds an argument.
        - -Parameters: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        NameTypeDescription
        $namestring-
        $modeintThe argument mode: InputArgument::REQUIRED or InputArgument::OPTIONAL
        $descriptionstring-
        $defaultmixedThe default value (for InputArgument::OPTIONAL mode only)
        - -Return value: static - - -Throws: - - -
        -
        -
        - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function addOption(string $name, string|array $shortcut = null, int $mode = null, string $description = '', mixed $default = null): static; -``` - -
        Adds an option.
        - -Parameters: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        NameTypeDescription
        $namestring-
        $shortcutstring | arrayThe shortcuts, can be null, a string of shortcuts delimited by | or an array of shortcuts
        $modeintThe option mode: One of the InputOption::VALUE_* constants
        $descriptionstring-
        $defaultmixedThe default value (must be null for InputOption::VALUE_NONE)
        - -Return value: static - - -Throws: - - -
        -
        -
        - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function addUsage(string $usage): static; -``` - -
        Add a command usage example, it'll be prefixed with the command name.
        - -Parameters: - - - - - - - - - - - - - - - - -
        NameTypeDescription
        $usagestring-
        - -Return value: static - - -
        -
        -
        - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function complete(\Symfony\Component\Console\Completion\CompletionInput $input, \Symfony\Component\Console\Completion\CompletionSuggestions $suggestions): void; -``` - -
        Adds suggestions to $suggestions for the current completion input (e.g. option or argument).
        - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
        NameTypeDescription
        $input\Symfony\Component\Console\Completion\CompletionInput-
        $suggestions\Symfony\Component\Console\Completion\CompletionSuggestions-
        - -Return value: void - - -
        -
        -
        - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function getAliases(): array; -``` - -
        Returns the aliases for the command.
        - -Parameters: not specified - -Return value: array - - -
        -
        -
        - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function getApplication(): \Symfony\Component\Console\Application|null; -``` - -
        Gets the application instance for this command.
        - -Parameters: not specified - -Return value: \Symfony\Component\Console\Application | null - - -
        -
        -
        - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public static function getDefaultDescription(): string|null; -``` - - - -Parameters: not specified - -Return value: string | null - - -
        -
        -
        - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public static function getDefaultName(): string|null; -``` - - - -Parameters: not specified - -Return value: string | null - - -
        -
        -
        - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function getDefinition(): \Symfony\Component\Console\Input\InputDefinition; -``` - -
        Gets the InputDefinition attached to this Command.
        - -Parameters: not specified - -Return value: \Symfony\Component\Console\Input\InputDefinition - - -
        -
        -
        - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function getDescription(): string; -``` - -
        Returns the description for the command.
        - -Parameters: not specified - -Return value: string - - -
        -
        -
        - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function getHelp(): string; -``` - -
        Returns the help for the command.
        - -Parameters: not specified - -Return value: string - - -
        -
        -
        - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function getHelper(string $name): mixed; -``` - -
        Gets a helper instance by name.
        - -Parameters: - - - - - - - - - - - - - - - - -
        NameTypeDescription
        $namestring-
        - -Return value: mixed - - -Throws: - - -
        -
        -
        - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function getHelperSet(): \Symfony\Component\Console\Helper\HelperSet|null; -``` - -
        Gets the helper set.
        - -Parameters: not specified - -Return value: \Symfony\Component\Console\Helper\HelperSet | null - - -
        -
        -
        - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function getName(): string|null; -``` - -
        Returns the command name.
        - -Parameters: not specified - -Return value: string | null - - -
        -
        -
        - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function getNativeDefinition(): \Symfony\Component\Console\Input\InputDefinition; -``` - -
        Gets the InputDefinition to be used to create representations of this Command.
        - -Parameters: not specified - -Return value: \Symfony\Component\Console\Input\InputDefinition - - -
        -
        -
        - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function getProcessedHelp(): string; -``` - -
        Returns the processed help for the command replacing the %command.name% and -%command.full_name% patterns with the real values dynamically.
        - -Parameters: not specified - -Return value: string - - -
        -
        -
        - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function getSynopsis(bool $short = false): string; -``` - -
        Returns the synopsis for the command.
        - -Parameters: - - - - - - - - - - - - - - - - -
        NameTypeDescription
        $shortboolWhether to show the short version of the synopsis (with options folded) or not
        - -Return value: string - - -
        -
        -
        - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function getUsages(): array; -``` - -
        Returns alternative usages of the command.
        - -Parameters: not specified - -Return value: array - - -
        -
        -
        - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function ignoreValidationErrors(): mixed; -``` - -
        Ignores validation errors.
        - -Parameters: not specified - -Return value: mixed - - -
        -
        -
        - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function isEnabled(): bool; -``` - -
        Checks whether the command is enabled or not in the current environment.
        - -Parameters: not specified - -Return value: bool - - -
        -
        -
        - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function isHidden(): bool; -``` - - - -Parameters: not specified - -Return value: bool - - -
        -
        -
        - -
          -
        • # - mergeApplicationDefinition - :warning: Is internal | source code
        • -
        - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function mergeApplicationDefinition(bool $mergeArgs = true): mixed; -``` - -
        Merges the application definition with the command definition.
        - -Parameters: - - - - - - - - - - - - - - - - -
        NameTypeDescription
        $mergeArgsboolWhether to merge or not the Application definition arguments to Command definition arguments
        - -Return value: mixed - - -
        -
        -
        - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function run(\Symfony\Component\Console\Input\InputInterface $input, \Symfony\Component\Console\Output\OutputInterface $output): int; -``` - -
        Runs the command.
        - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
        NameTypeDescription
        $input\Symfony\Component\Console\Input\InputInterface-
        $output\Symfony\Component\Console\Output\OutputInterface-
        - -Return value: int - - -Throws: - - - -See: - -
        -
        -
        - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function setAliases(iterable $aliases): static; -``` - -
        Sets the aliases for the command.
        - -Parameters: - - - - - - - - - - - - - - - - -
        NameTypeDescription
        $aliasesiterableAn array of aliases for the command
        - -Return value: static - - -Throws: - - -
        -
        -
        - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function setApplication(\Symfony\Component\Console\Application $application = null): mixed; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
        NameTypeDescription
        $application\Symfony\Component\Console\Application-
        - -Return value: mixed - - -
        -
        -
        - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function setCode(callable $code): static; -``` - -
        Sets the code to execute when running this command.
        - -Parameters: - - - - - - - - - - - - - - - - -
        NameTypeDescription
        $codecallableA callable(InputInterface $input, OutputInterface $output)
        - -Return value: static - - -Throws: - - - -See: - -
        -
        -
        - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function setDefinition(array|\Symfony\Component\Console\Input\InputDefinition $definition): static; -``` - -
        Sets an array of argument and option instances.
        - -Parameters: - - - - - - - - - - - - - - - - -
        NameTypeDescription
        $definitionarray | \Symfony\Component\Console\Input\InputDefinition-
        - -Return value: static - - -
        -
        -
        - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function setDescription(string $description): static; -``` - -
        Sets the description for the command.
        - -Parameters: - - - - - - - - - - - - - - - - -
        NameTypeDescription
        $descriptionstring-
        - -Return value: static - - -
        -
        -
        - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function setHelp(string $help): static; -``` - -
        Sets the help for the command.
        - -Parameters: - - - - - - - - - - - - - - - - -
        NameTypeDescription
        $helpstring-
        - -Return value: static - - -
        -
        -
        - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function setHelperSet(\Symfony\Component\Console\Helper\HelperSet $helperSet): mixed; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
        NameTypeDescription
        $helperSet\Symfony\Component\Console\Helper\HelperSet-
        - -Return value: mixed - - -
        -
        -
        - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function setHidden(bool $hidden = true): static; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
        NameTypeDescription
        $hiddenboolWhether or not the command should be hidden from the list of commands
        - -Return value: static - - -
        -
        -
        - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function setName(string $name): static; -``` - -
        Sets the name of the command.
        - -Parameters: - - - - - - - - - - - - - - - - -
        NameTypeDescription
        $namestring-
        - -Return value: static - - -Throws: - - -
        -
        -
        - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function setProcessTitle(string $title): static; -``` - -
        Sets the process title of the command.
        - -Parameters: - - - - - - - - - - - - -
        NameTypeDescription
        $titlestring -
        -Return value: static
        diff --git a/docs/tech/classes/AdditionalCommandCollection.md b/docs/tech/classes/AdditionalCommandCollection.md index 35b3aaca..45baf846 100644 --- a/docs/tech/classes/AdditionalCommandCollection.md +++ b/docs/tech/classes/AdditionalCommandCollection.md @@ -12,7 +12,7 @@ ```php namespace BumbleDocGen\Console\Command; -final class AdditionalCommandCollection implements \IteratorAggregate, \Traversable +final class AdditionalCommandCollection implements \IteratorAggregate ``` @@ -34,7 +34,7 @@ final class AdditionalCommandCollection implements \IteratorAggregate, \Traversa
      5. getIterator - - Retrieve an external iterator
      6. +
      @@ -133,26 +133,13 @@ public static function create(\Symfony\Component\Console\Command\Command ...$com public function getIterator(): \Generator; ``` -
      Retrieve an external iterator
      + Parameters: not specified Return value: \Generator -Throws: - - - -See: -
      diff --git a/docs/tech/classes/AfterLoadingClassEntityCollection.md b/docs/tech/classes/AfterLoadingClassEntityCollection.md index 82149929..3feb3a5d 100644 --- a/docs/tech/classes/AfterLoadingClassEntityCollection.md +++ b/docs/tech/classes/AfterLoadingClassEntityCollection.md @@ -36,12 +36,6 @@ final class AfterLoadingClassEntityCollection extends \Symfony\Contracts\EventDi
    5. getClassEntityCollection
    6. -
    7. - isPropagationStopped - - Is propagation stopped?
    8. -
    9. - stopPropagation - - Stops the propagation of the event to further event listeners.
    @@ -108,52 +102,6 @@ public function getClassEntityCollection(): \BumbleDocGen\LanguageHandler\Php\Pa Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection - -
    -
    - - - -```php -// Implemented in Symfony\Contracts\EventDispatcher\Event - -public function isPropagationStopped(): bool; -``` - -
    Is propagation stopped?
    - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Contracts\EventDispatcher\Event - -public function stopPropagation(): void; -``` - -
    Stops the propagation of the event to further event listeners.
    - -Parameters: not specified - -Return value: void - -

    diff --git a/docs/tech/classes/AfterRenderingEntities.md b/docs/tech/classes/AfterRenderingEntities.md index a64b57f8..68c4a830 100644 --- a/docs/tech/classes/AfterRenderingEntities.md +++ b/docs/tech/classes/AfterRenderingEntities.md @@ -15,7 +15,6 @@ namespace BumbleDocGen\Core\Plugin\Event\Renderer; final class AfterRenderingEntities extends \Symfony\Contracts\EventDispatcher\Event ``` -
    Event is the base class for classes containing event data.
    @@ -23,16 +22,7 @@ final class AfterRenderingEntities extends \Symfony\Contracts\EventDispatcher\Ev -

    Methods:

    -
      -
    1. - isPropagationStopped - - Is propagation stopped?
    2. -
    3. - stopPropagation - - Stops the propagation of the event to further event listeners.
    4. -
    @@ -40,53 +30,5 @@ final class AfterRenderingEntities extends \Symfony\Contracts\EventDispatcher\Ev -

    Method details:

    - -
    - - - -```php -// Implemented in Symfony\Contracts\EventDispatcher\Event - -public function isPropagationStopped(): bool; -``` - -
    Is propagation stopped?
    - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Contracts\EventDispatcher\Event - -public function stopPropagation(): void; -``` - -
    Stops the propagation of the event to further event listeners.
    - -Parameters: not specified - -Return value: void - - -
    -
    \ No newline at end of file diff --git a/docs/tech/classes/App.md b/docs/tech/classes/App.md index a6a41439..30d213df 100644 --- a/docs/tech/classes/App.md +++ b/docs/tech/classes/App.md @@ -15,7 +15,7 @@ namespace BumbleDocGen\Console; class App extends \Symfony\Component\Console\Application ``` -
    An Application is the container for a collection of commands.
    + @@ -30,118 +30,6 @@ class App extends \Symfony\Component\Console\Application -

    Methods:

    - -
      -
    1. - add - - Adds a command object.
    2. -
    3. - addCommands - - Adds an array of command objects.
    4. -
    5. - all - - Gets the commands (registered in the given namespace if provided).
    6. -
    7. - areExceptionsCaught - - Gets whether to catch exceptions or not during commands execution.
    8. -
    9. - complete - - Adds suggestions to $suggestions for the current completion input (e.g. option or argument).
    10. -
    11. - doRun - - Runs the current application.
    12. -
    13. - extractNamespace - - Returns the namespace part of the command name.
    14. -
    15. - find - - Finds a command by name or alias.
    16. -
    17. - findNamespace - - Finds a registered namespace by a name or an abbreviation.
    18. -
    19. - get - - Returns a registered command by name or alias.
    20. -
    21. - getAbbreviations - - Returns an array of possible abbreviations given a set of names.
    22. -
    23. - getDefinition - - Gets the InputDefinition related to this Application.
    24. -
    25. - getHelp - - Gets the help message.
    26. -
    27. - getHelperSet - - Get the helper set associated with the command.
    28. -
    29. - getLongVersion - - Returns the long version of the application.
    30. -
    31. - getName - - Gets the name of the application.
    32. -
    33. - getNamespaces - - Returns an array of all unique namespaces used by currently registered commands.
    34. -
    35. - getSignalRegistry -
    36. -
    37. - getVersion - - Gets the application version.
    38. -
    39. - has - - Returns true if the command exists, false otherwise.
    40. -
    41. - isAutoExitEnabled - - Gets whether to automatically exit after a command execution or not.
    42. -
    43. - isSingleCommand -
    44. -
    45. - register - - Registers a new command.
    46. -
    47. - renderThrowable -
    48. -
    49. - reset -
    50. -
    51. - run - - Runs the current application.
    52. -
    53. - setAutoExit - - Sets whether to automatically exit after a command execution or not.
    54. -
    55. - setCatchExceptions - - Sets whether to catch exceptions or not during commands execution.
    56. -
    57. - setCommandLoader -
    58. -
    59. - setDefaultCommand - - Sets the default Command name.
    60. -
    61. - setDefinition -
    62. -
    63. - setDispatcher -
    64. -
    65. - setHelperSet -
    66. -
    67. - setName - - Sets the application name.
    68. -
    69. - setSignalsToDispatchEvent -
    70. -
    71. - setVersion - - Sets the application version.
    72. -
    @@ -169,1300 +57,6 @@ public function __construct(); - -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Application - -public function add(\Symfony\Component\Console\Command\Command $command): \Symfony\Component\Console\Command\Command|null; -``` - -
    Adds a command object.
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $command\Symfony\Component\Console\Command\Command-
    - -Return value: \Symfony\Component\Console\Command\Command | null - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Application - -public function addCommands(array $commands): mixed; -``` - -
    Adds an array of command objects.
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $commandsarrayAn array of commands
    - -Return value: mixed - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Application - -public function all(string $namespace = null): \Symfony\Component\Console\Command\Command[]; -``` - -
    Gets the commands (registered in the given namespace if provided).
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $namespacestring-
    - -Return value: \Symfony\Component\Console\Command\Command[] - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Application - -public function areExceptionsCaught(): bool; -``` - -
    Gets whether to catch exceptions or not during commands execution.
    - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Application - -public function complete(\Symfony\Component\Console\Completion\CompletionInput $input, \Symfony\Component\Console\Completion\CompletionSuggestions $suggestions): void; -``` - -
    Adds suggestions to $suggestions for the current completion input (e.g. option or argument).
    - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $input\Symfony\Component\Console\Completion\CompletionInput-
    $suggestions\Symfony\Component\Console\Completion\CompletionSuggestions-
    - -Return value: void - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Application - -public function doRun(\Symfony\Component\Console\Input\InputInterface $input, \Symfony\Component\Console\Output\OutputInterface $output): int; -``` - -
    Runs the current application.
    - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $input\Symfony\Component\Console\Input\InputInterface-
    $output\Symfony\Component\Console\Output\OutputInterface-
    - -Return value: int - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Application - -public function extractNamespace(string $name, int $limit = null): string; -``` - -
    Returns the namespace part of the command name.
    - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $namestring-
    $limitint-
    - -Return value: string - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Application - -public function find(string $name): \Symfony\Component\Console\Command\Command; -``` - -
    Finds a command by name or alias.
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $namestring-
    - -Return value: \Symfony\Component\Console\Command\Command - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Application - -public function findNamespace(string $namespace): string; -``` - -
    Finds a registered namespace by a name or an abbreviation.
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $namespacestring-
    - -Return value: string - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Application - -public function get(string $name): \Symfony\Component\Console\Command\Command; -``` - -
    Returns a registered command by name or alias.
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $namestring-
    - -Return value: \Symfony\Component\Console\Command\Command - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Application - -public static function getAbbreviations(array $names): array; -``` - -
    Returns an array of possible abbreviations given a set of names.
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $namesarray-
    - -Return value: array - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Application - -public function getDefinition(): \Symfony\Component\Console\Input\InputDefinition; -``` - -
    Gets the InputDefinition related to this Application.
    - -Parameters: not specified - -Return value: \Symfony\Component\Console\Input\InputDefinition - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Application - -public function getHelp(): string; -``` - -
    Gets the help message.
    - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Application - -public function getHelperSet(): \Symfony\Component\Console\Helper\HelperSet; -``` - -
    Get the helper set associated with the command.
    - -Parameters: not specified - -Return value: \Symfony\Component\Console\Helper\HelperSet - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Application - -public function getLongVersion(): string; -``` - -
    Returns the long version of the application.
    - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Application - -public function getName(): string; -``` - -
    Gets the name of the application.
    - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Application - -public function getNamespaces(): array; -``` - -
    Returns an array of all unique namespaces used by currently registered commands.
    - -Parameters: not specified - -Return value: array - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Application - -public function getSignalRegistry(): \Symfony\Component\Console\SignalRegistry\SignalRegistry; -``` - - - -Parameters: not specified - -Return value: \Symfony\Component\Console\SignalRegistry\SignalRegistry - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Application - -public function getVersion(): string; -``` - -
    Gets the application version.
    - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Application - -public function has(string $name): bool; -``` - -
    Returns true if the command exists, false otherwise.
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $namestring-
    - -Return value: bool - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Application - -public function isAutoExitEnabled(): bool; -``` - -
    Gets whether to automatically exit after a command execution or not.
    - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - -
      -
    • # - isSingleCommand - :warning: Is internal | source code
    • -
    - -```php -// Implemented in Symfony\Component\Console\Application - -public function isSingleCommand(): bool; -``` - - - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Application - -public function register(string $name): \Symfony\Component\Console\Command\Command; -``` - -
    Registers a new command.
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $namestring-
    - -Return value: \Symfony\Component\Console\Command\Command - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Application - -public function renderThrowable(\Throwable $e, \Symfony\Component\Console\Output\OutputInterface $output): void; -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $e\Throwable-
    $output\Symfony\Component\Console\Output\OutputInterface-
    - -Return value: void - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Application - -public function reset(): mixed; -``` - - - -Parameters: not specified - -Return value: mixed - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Application - -public function run(\Symfony\Component\Console\Input\InputInterface $input = null, \Symfony\Component\Console\Output\OutputInterface $output = null): int; -``` - -
    Runs the current application.
    - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $input\Symfony\Component\Console\Input\InputInterface-
    $output\Symfony\Component\Console\Output\OutputInterface-
    - -Return value: int - - -Throws: -
      -
    • - \Exception - When running fails. Bypass this when {@link setCatchExceptions()}.
    • - -
    - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Application - -public function setAutoExit(bool $boolean): mixed; -``` - -
    Sets whether to automatically exit after a command execution or not.
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $booleanbool-
    - -Return value: mixed - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Application - -public function setCatchExceptions(bool $boolean): mixed; -``` - -
    Sets whether to catch exceptions or not during commands execution.
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $booleanbool-
    - -Return value: mixed - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Application - -public function setCommandLoader(\Symfony\Component\Console\CommandLoader\CommandLoaderInterface $commandLoader): mixed; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $commandLoader\Symfony\Component\Console\CommandLoader\CommandLoaderInterface-
    - -Return value: mixed - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Application - -public function setDefaultCommand(string $commandName, bool $isSingleCommand = false): static; -``` - -
    Sets the default Command name.
    - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $commandNamestring-
    $isSingleCommandbool-
    - -Return value: static - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Application - -public function setDefinition(\Symfony\Component\Console\Input\InputDefinition $definition): mixed; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $definition\Symfony\Component\Console\Input\InputDefinition-
    - -Return value: mixed - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Application - -public function setDispatcher(\Symfony\Contracts\EventDispatcher\EventDispatcherInterface $dispatcher): mixed; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $dispatcher\Symfony\Contracts\EventDispatcher\EventDispatcherInterface-
    - -Return value: mixed - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Application - -public function setHelperSet(\Symfony\Component\Console\Helper\HelperSet $helperSet): mixed; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $helperSet\Symfony\Component\Console\Helper\HelperSet-
    - -Return value: mixed - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Application - -public function setName(string $name): mixed; -``` - -
    Sets the application name.
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $namestring-
    - -Return value: mixed - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Application - -public function setSignalsToDispatchEvent(int ...$signalsToDispatchEvent): mixed; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $signalsToDispatchEvent (variadic)int-
    - -Return value: mixed - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Application - -public function setVersion(string $version): mixed; -``` - -
    Sets the application version.
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $versionstring-
    - -Return value: mixed - -

    diff --git a/docs/tech/classes/AsyncSourceLocator.md b/docs/tech/classes/AsyncSourceLocator.md deleted file mode 100644 index c5e1315f..00000000 --- a/docs/tech/classes/AsyncSourceLocator.md +++ /dev/null @@ -1,159 +0,0 @@ - - BumbleDocGen / Technical description of the project / Class map / AsyncSourceLocator
    - -

    - AsyncSourceLocator class: -

    - - - - - -```php -namespace BumbleDocGen\LanguageHandler\Php\Parser\SourceLocator; - -final class AsyncSourceLocator implements \BumbleDocGen\Core\Parser\SourceLocator\SourceLocatorInterface, \BumbleDocGen\LanguageHandler\Php\Parser\SourceLocator\CustomSourceLocatorInterface -``` - -
    Lazy loading classes. Cannot be used for initial parsing of files, only for getting specific documents
    - - - - - - -

    Initialization methods:

    - -
      -
    1. - __construct -
    2. -
    - -

    Methods:

    - -
      -
    1. - getFinder -
    2. -
    3. - getSourceLocator -
    4. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public function __construct(\BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache $localObjectCache, array $psr4FileMap, array $classMap); -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $localObjectCache\BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache-
    $psr4FileMaparray-
    $classMaparray-
    - - - -
    -
    -
    - - - -```php -public function getFinder(): \Symfony\Component\Finder\Finder|null; -``` - - - -Parameters: not specified - -Return value: \Symfony\Component\Finder\Finder | null - - -
    -
    -
    - - - -```php -public function getSourceLocator(\Roave\BetterReflection\SourceLocator\Ast\Locator $astLocator): \Roave\BetterReflection\SourceLocator\Type\SourceLocator; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $astLocator\Roave\BetterReflection\SourceLocator\Ast\Locator-
    - -Return value: \Roave\BetterReflection\SourceLocator\Type\SourceLocator - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/classes/BaseCommand.md b/docs/tech/classes/BaseCommand.md index 75a7fd8e..927d42d9 100644 --- a/docs/tech/classes/BaseCommand.md +++ b/docs/tech/classes/BaseCommand.md @@ -15,7 +15,7 @@ namespace BumbleDocGen\Console\Command; abstract class BaseCommand extends \Symfony\Component\Console\Command\Command ``` -
    Base class for all commands.
    + @@ -30,126 +30,8 @@ abstract class BaseCommand extends \Symfony\Component\Console\Command\Command -

    Methods:

    - -
      -
    1. - addArgument - - Adds an argument.
    2. -
    3. - addOption - - Adds an option.
    4. -
    5. - addUsage - - Add a command usage example, it'll be prefixed with the command name.
    6. -
    7. - complete - - Adds suggestions to $suggestions for the current completion input (e.g. option or argument).
    8. -
    9. - getAliases - - Returns the aliases for the command.
    10. -
    11. - getApplication - - Gets the application instance for this command.
    12. -
    13. - getDefaultDescription -
    14. -
    15. - getDefaultName -
    16. -
    17. - getDefinition - - Gets the InputDefinition attached to this Command.
    18. -
    19. - getDescription - - Returns the description for the command.
    20. -
    21. - getHelp - - Returns the help for the command.
    22. -
    23. - getHelper - - Gets a helper instance by name.
    24. -
    25. - getHelperSet - - Gets the helper set.
    26. -
    27. - getName - - Returns the command name.
    28. -
    29. - getNativeDefinition - - Gets the InputDefinition to be used to create representations of this Command.
    30. -
    31. - getProcessedHelp - - Returns the processed help for the command replacing the %command.name% and %command.full_name% patterns with the real values dynamically.
    32. -
    33. - getSynopsis - - Returns the synopsis for the command.
    34. -
    35. - getUsages - - Returns alternative usages of the command.
    36. -
    37. - ignoreValidationErrors - - Ignores validation errors.
    38. -
    39. - isEnabled - - Checks whether the command is enabled or not in the current environment.
    40. -
    41. - isHidden -
    42. -
    43. - mergeApplicationDefinition - - Merges the application definition with the command definition.
    44. -
    45. - run - - Runs the command.
    46. -
    47. - setAliases - - Sets the aliases for the command.
    48. -
    49. - setApplication -
    50. -
    51. - setCode - - Sets the code to execute when running this command.
    52. -
    53. - setDefinition - - Sets an array of argument and option instances.
    54. -
    55. - setDescription - - Sets the description for the command.
    56. -
    57. - setHelp - - Sets the help for the command.
    58. -
    59. - setHelperSet -
    60. -
    61. - setHidden -
    62. -
    63. - setName - - Sets the name of the command.
    64. -
    65. - setProcessTitle - - Sets the process title of the command.
    66. -
    -

    Constants:

    - @@ -185,1195 +67,11 @@ public function __construct(string $name = null); $name string - The name of the command; passing null means it must be set in configure() - - - - - - -Throws: - - - -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function addArgument(string $name, int $mode = null, string $description = '', mixed $default = null): static; -``` - -
    Adds an argument.
    - -Parameters: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $namestring-
    $modeintThe argument mode: InputArgument::REQUIRED or InputArgument::OPTIONAL
    $descriptionstring-
    $defaultmixedThe default value (for InputArgument::OPTIONAL mode only)
    - -Return value: static - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function addOption(string $name, string|array $shortcut = null, int $mode = null, string $description = '', mixed $default = null): static; -``` - -
    Adds an option.
    - -Parameters: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $namestring-
    $shortcutstring | arrayThe shortcuts, can be null, a string of shortcuts delimited by | or an array of shortcuts
    $modeintThe option mode: One of the InputOption::VALUE_* constants
    $descriptionstring-
    $defaultmixedThe default value (must be null for InputOption::VALUE_NONE)
    - -Return value: static - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function addUsage(string $usage): static; -``` - -
    Add a command usage example, it'll be prefixed with the command name.
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $usagestring-
    - -Return value: static - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function complete(\Symfony\Component\Console\Completion\CompletionInput $input, \Symfony\Component\Console\Completion\CompletionSuggestions $suggestions): void; -``` - -
    Adds suggestions to $suggestions for the current completion input (e.g. option or argument).
    - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $input\Symfony\Component\Console\Completion\CompletionInput-
    $suggestions\Symfony\Component\Console\Completion\CompletionSuggestions-
    - -Return value: void - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function getAliases(): array; -``` - -
    Returns the aliases for the command.
    - -Parameters: not specified - -Return value: array - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function getApplication(): \Symfony\Component\Console\Application|null; -``` - -
    Gets the application instance for this command.
    - -Parameters: not specified - -Return value: \Symfony\Component\Console\Application | null - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public static function getDefaultDescription(): string|null; -``` - - - -Parameters: not specified - -Return value: string | null - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public static function getDefaultName(): string|null; -``` - - - -Parameters: not specified - -Return value: string | null - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function getDefinition(): \Symfony\Component\Console\Input\InputDefinition; -``` - -
    Gets the InputDefinition attached to this Command.
    - -Parameters: not specified - -Return value: \Symfony\Component\Console\Input\InputDefinition - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function getDescription(): string; -``` - -
    Returns the description for the command.
    - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function getHelp(): string; -``` - -
    Returns the help for the command.
    - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function getHelper(string $name): mixed; -``` - -
    Gets a helper instance by name.
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $namestring-
    - -Return value: mixed - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function getHelperSet(): \Symfony\Component\Console\Helper\HelperSet|null; -``` - -
    Gets the helper set.
    - -Parameters: not specified - -Return value: \Symfony\Component\Console\Helper\HelperSet | null - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function getName(): string|null; -``` - -
    Returns the command name.
    - -Parameters: not specified - -Return value: string | null - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function getNativeDefinition(): \Symfony\Component\Console\Input\InputDefinition; -``` - -
    Gets the InputDefinition to be used to create representations of this Command.
    - -Parameters: not specified - -Return value: \Symfony\Component\Console\Input\InputDefinition - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function getProcessedHelp(): string; -``` - -
    Returns the processed help for the command replacing the %command.name% and -%command.full_name% patterns with the real values dynamically.
    - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function getSynopsis(bool $short = false): string; -``` - -
    Returns the synopsis for the command.
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $shortboolWhether to show the short version of the synopsis (with options folded) or not
    - -Return value: string - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function getUsages(): array; -``` - -
    Returns alternative usages of the command.
    - -Parameters: not specified - -Return value: array - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function ignoreValidationErrors(): mixed; -``` - -
    Ignores validation errors.
    - -Parameters: not specified - -Return value: mixed - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function isEnabled(): bool; -``` - -
    Checks whether the command is enabled or not in the current environment.
    - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function isHidden(): bool; -``` - - - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - -
      -
    • # - mergeApplicationDefinition - :warning: Is internal | source code
    • -
    - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function mergeApplicationDefinition(bool $mergeArgs = true): mixed; -``` - -
    Merges the application definition with the command definition.
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $mergeArgsboolWhether to merge or not the Application definition arguments to Command definition arguments
    - -Return value: mixed - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function run(\Symfony\Component\Console\Input\InputInterface $input, \Symfony\Component\Console\Output\OutputInterface $output): int; -``` - -
    Runs the command.
    - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $input\Symfony\Component\Console\Input\InputInterface-
    $output\Symfony\Component\Console\Output\OutputInterface-
    - -Return value: int - - -Throws: - - - -See: - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function setAliases(iterable $aliases): static; -``` - -
    Sets the aliases for the command.
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $aliasesiterableAn array of aliases for the command
    - -Return value: static - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function setApplication(\Symfony\Component\Console\Application $application = null): mixed; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $application\Symfony\Component\Console\Application-
    - -Return value: mixed - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function setCode(callable $code): static; -``` - -
    Sets the code to execute when running this command.
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $codecallableA callable(InputInterface $input, OutputInterface $output)
    - -Return value: static - - -Throws: - - - -See: - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function setDefinition(array|\Symfony\Component\Console\Input\InputDefinition $definition): static; -``` - -
    Sets an array of argument and option instances.
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $definitionarray | \Symfony\Component\Console\Input\InputDefinition-
    - -Return value: static - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function setDescription(string $description): static; -``` - -
    Sets the description for the command.
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $descriptionstring-
    - -Return value: static - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function setHelp(string $help): static; -``` - -
    Sets the help for the command.
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $helpstring-
    - -Return value: static - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function setHelperSet(\Symfony\Component\Console\Helper\HelperSet $helperSet): mixed; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $helperSet\Symfony\Component\Console\Helper\HelperSet-
    - -Return value: mixed - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function setHidden(bool $hidden = true): static; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $hiddenboolWhether or not the command should be hidden from the list of commands
    - -Return value: static - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function setName(string $name): static; -``` - -
    Sets the name of the command.
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $namestring-
    - -Return value: static - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function setProcessTitle(string $title): static; -``` - -
    Sets the process title of the command.
    - -Parameters: - - - - - - - - - - - - -
    NameTypeDescription
    $titlestring -
    -Return value: static
    diff --git a/docs/tech/classes/BaseEntity.md b/docs/tech/classes/BaseEntity.md index 1f29bd28..234383d1 100644 --- a/docs/tech/classes/BaseEntity.md +++ b/docs/tech/classes/BaseEntity.md @@ -2,7 +2,7 @@ BumbleDocGen / Technical description of the project / Class map / BaseEntity

    - BaseEntity class: + BaseEntity class:

    @@ -32,12 +32,18 @@ abstract class BaseEntity implements \BumbleDocGen\Core\Parser\Entity\Cache\Cach
  • getAbsoluteFileName - Returns the absolute path to a file if it can be retrieved and if the file is in the project directory
  • +
  • + getAst +
  • getCacheKey
  • getCachedEntityDependencies
  • +
  • + getCurrentRootEntity +
  • getDescription
  • @@ -69,7 +75,7 @@ abstract class BaseEntity implements \BumbleDocGen\Core\Parser\Entity\Cache\Cach getFirstExample - Get first example from @examples doc block
  • - getImplementingReflectionClass + getImplementingClass
  • getName @@ -80,6 +86,9 @@ abstract class BaseEntity implements \BumbleDocGen\Core\Parser\Entity\Cache\Cach
  • getPhpHandlerSettings
  • +
  • + getRelativeFileName +
  • getRootEntityCollection - Get parent collection of entities
  • @@ -142,7 +151,7 @@ abstract class BaseEntity implements \BumbleDocGen\Core\Parser\Entity\Cache\Cach ```php @@ -173,18 +182,46 @@ public function entityCacheIsOutdated(): bool; ```php -public function getAbsoluteFileName(): string|null; +public function getAbsoluteFileName(): null|string; ```
    Returns the absolute path to a file if it can be retrieved and if the file is in the project directory
    Parameters: not specified -Return value: string | null +Return value: null | string + + +Throws: + + + +
    +
    + + + +```php +public function getAst(): \PhpParser\Node\Stmt; +``` + + + +Parameters: not specified + +Return value: \PhpParser\Node\Stmt Throws: @@ -224,7 +261,7 @@ public function getCacheKey(): string; ```php @@ -245,6 +282,27 @@ public function getCachedEntityDependencies(): array; +
    +
    +
    + + + +```php +public function getCurrentRootEntity(): null|\BumbleDocGen\Core\Parser\Entity\RootEntityInterface; +``` + + + +Parameters: not specified + +Return value: null | \BumbleDocGen\Core\Parser\Entity\RootEntityInterface + +

    @@ -252,7 +310,7 @@ public function getCachedEntityDependencies(): array; ```php @@ -273,7 +331,7 @@ public function getDescription(): string; ```php @@ -304,7 +362,7 @@ public function getDescriptionLinks(): array; ```php @@ -325,7 +383,7 @@ public function getDocBlock(): \phpDocumentor\Reflection\DocBlock; ```php @@ -341,9 +399,6 @@ public function getDocComment(): string; Throws:
    @@ -440,11 +495,11 @@ public function getFileName(): string|null; ```php -public function getFileSourceLink(bool $withLine = true): string|null; +public function getFileSourceLink(bool $withLine = true): null|string; ``` @@ -468,7 +523,7 @@ public function getFileSourceLink(bool $withLine = true): string|null; -Return value: string | null +Return value: null | string Throws: @@ -485,7 +540,7 @@ public function getFileSourceLink(bool $withLine = true): string|null; ```php @@ -504,20 +559,20 @@ public function getFirstExample(): string;
    ```php -public function getImplementingReflectionClass(): \Roave\BetterReflection\Reflection\ReflectionClass; +public function getImplementingClass(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity; ``` Parameters: not specified -Return value: \Roave\BetterReflection\Reflection\ReflectionClass +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity
    @@ -550,7 +605,7 @@ public function getName(): string; ```php @@ -571,7 +626,7 @@ public function getObjectId(): string; ```php @@ -585,6 +640,34 @@ public function getPhpHandlerSettings(): \BumbleDocGen\LanguageHandler\Php\PhpHa Return value: \BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings + +
    +
    + + + +```php +public function getRelativeFileName(): null|string; +``` + + + +Parameters: not specified + +Return value: null | string + + +Throws: + +

    @@ -592,7 +675,7 @@ public function getPhpHandlerSettings(): \BumbleDocGen\LanguageHandler\Php\PhpHa ```php @@ -636,7 +719,7 @@ public function getShortName(): string; ```php @@ -657,7 +740,7 @@ public function getStartLine(): int; ```php @@ -673,9 +756,6 @@ public function getThrows(): array; Throws:
    @@ -101,26 +101,13 @@ public function get(string $objectName): \BumbleDocGen\Core\Parser\Entity\Entity public function getIterator(): \Generator; ``` -
    Retrieve an external iterator
    + Parameters: not specified Return value: \Generator -Throws: - - - -See: -
    diff --git a/docs/tech/classes/BasePageLinker.md b/docs/tech/classes/BasePageLinker.md index 9e0e7672..62d9f0cb 100644 --- a/docs/tech/classes/BasePageLinker.md +++ b/docs/tech/classes/BasePageLinker.md @@ -2,7 +2,7 @@ BumbleDocGen / Technical description of the project / Class map / BasePageLinker

    - BasePageLinker class: + BasePageLinker class:

    @@ -38,7 +38,7 @@ abstract class BasePageLinker implements \BumbleDocGen\Core\Plugin\PluginInterfa
  • getSubscribedEvents - - Returns an array of event names this subscriber wants to listen to.
  • + @@ -54,7 +54,7 @@ abstract class BasePageLinker implements \BumbleDocGen\Core\Plugin\PluginInterfa ```php @@ -106,7 +106,7 @@ public function __construct(\BumbleDocGen\Core\Renderer\Breadcrumbs\BreadcrumbsH ```php @@ -145,9 +145,6 @@ public function beforeCreatingDocFile(\BumbleDocGen\Core\Plugin\Event\Renderer\B
  • \DI\DependencyException
  • -
  • - \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
  • -
  • \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • @@ -160,14 +157,14 @@ public function beforeCreatingDocFile(\BumbleDocGen\Core\Plugin\Event\Renderer\B ```php public static function getSubscribedEvents(): array; ``` -
    Returns an array of event names this subscriber wants to listen to.
    + Parameters: not specified diff --git a/docs/tech/classes/BasePhpStubberPlugin.md b/docs/tech/classes/BasePhpStubberPlugin.md index aa636a5b..456aaf06 100644 --- a/docs/tech/classes/BasePhpStubberPlugin.md +++ b/docs/tech/classes/BasePhpStubberPlugin.md @@ -2,7 +2,7 @@ BumbleDocGen / Technical description of the project / Class map / BasePhpStubberPlugin

    - BasePhpStubberPlugin class: + BasePhpStubberPlugin class:

    @@ -28,7 +28,10 @@ final class BasePhpStubberPlugin implements \BumbleDocGen\Core\Plugin\PluginInte
    1. getSubscribedEvents - - Returns an array of event names this subscriber wants to listen to.
    2. + +
    3. + onCheckIsClassEntityCanBeLoad +
    4. onGettingResourceLink
    5. @@ -47,20 +50,58 @@ final class BasePhpStubberPlugin implements \BumbleDocGen\Core\Plugin\PluginInte ```php public static function getSubscribedEvents(): array; ``` -
      Returns an array of event names this subscriber wants to listen to.
      + Parameters: not specified Return value: array +
    +
    +
    + + + +```php +public function onCheckIsClassEntityCanBeLoad(\BumbleDocGen\LanguageHandler\Php\Plugin\Event\Entity\OnCheckIsClassEntityCanBeLoad $event): void; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $event\BumbleDocGen\LanguageHandler\Php\Plugin\Event\Entity\OnCheckIsClassEntityCanBeLoad-
    + +Return value: void + +

    @@ -68,7 +109,7 @@ public static function getSubscribedEvents(): array; ```php diff --git a/docs/tech/classes/BeforeCreatingDocFile.md b/docs/tech/classes/BeforeCreatingDocFile.md index 8fb330dd..fbf329c8 100644 --- a/docs/tech/classes/BeforeCreatingDocFile.md +++ b/docs/tech/classes/BeforeCreatingDocFile.md @@ -39,15 +39,9 @@ final class BeforeCreatingDocFile extends \Symfony\Contracts\EventDispatcher\Eve
  • getContext
  • -
  • - isPropagationStopped - - Is propagation stopped?
  • setContent
  • -
  • - stopPropagation - - Stops the propagation of the event to further event listeners.
  • @@ -140,29 +134,6 @@ public function getContext(): \BumbleDocGen\Core\Renderer\Context\RendererContex Return value: \BumbleDocGen\Core\Renderer\Context\RendererContext -
    -
    -
    - - - -```php -// Implemented in Symfony\Contracts\EventDispatcher\Event - -public function isPropagationStopped(): bool; -``` - -
    Is propagation stopped?
    - -Parameters: not specified - -Return value: bool - -

    @@ -201,29 +172,6 @@ public function setContent(string $content): void; Return value: void -
    -
    -
    - - - -```php -// Implemented in Symfony\Contracts\EventDispatcher\Event - -public function stopPropagation(): void; -``` - -
    Stops the propagation of the event to further event listeners.
    - -Parameters: not specified - -Return value: void - -

    diff --git a/docs/tech/classes/BeforeParsingProcess.md b/docs/tech/classes/BeforeParsingProcess.md new file mode 100644 index 00000000..287a3404 --- /dev/null +++ b/docs/tech/classes/BeforeParsingProcess.md @@ -0,0 +1,63 @@ + + BumbleDocGen / Technical description of the project / Class map / BeforeParsingProcess
    + +

    + BeforeParsingProcess class: +

    + + + + + +```php +namespace BumbleDocGen\Core\Plugin\Event\Parser; + +final class BeforeParsingProcess extends \Symfony\Contracts\EventDispatcher\Event +``` + + + + + + + + +

    Initialization methods:

    + +
      +
    1. + __construct +
    2. +
    + + + + + + + + +

    Method details:

    + +
    + + + +```php +public function __construct(); +``` + + + +Parameters: not specified + + + +
    +
    + + \ No newline at end of file diff --git a/docs/tech/classes/BeforeRenderingDocFiles.md b/docs/tech/classes/BeforeRenderingDocFiles.md index c31648f9..1699883e 100644 --- a/docs/tech/classes/BeforeRenderingDocFiles.md +++ b/docs/tech/classes/BeforeRenderingDocFiles.md @@ -23,16 +23,7 @@ final class BeforeRenderingDocFiles extends \Symfony\Contracts\EventDispatcher\E -

    Methods:

    -
      -
    1. - isPropagationStopped - - Is propagation stopped?
    2. -
    3. - stopPropagation - - Stops the propagation of the event to further event listeners.
    4. -
    @@ -40,53 +31,4 @@ final class BeforeRenderingDocFiles extends \Symfony\Contracts\EventDispatcher\E -

    Method details:

    - -
    - - - -```php -// Implemented in Symfony\Contracts\EventDispatcher\Event - -public function isPropagationStopped(): bool; -``` - -
    Is propagation stopped?
    - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Contracts\EventDispatcher\Event - -public function stopPropagation(): void; -``` - -
    Stops the propagation of the event to further event listeners.
    - -Parameters: not specified - -Return value: void - - -
    -
    - \ No newline at end of file diff --git a/docs/tech/classes/BeforeRenderingEntities.md b/docs/tech/classes/BeforeRenderingEntities.md index dd163de4..cf806bd3 100644 --- a/docs/tech/classes/BeforeRenderingEntities.md +++ b/docs/tech/classes/BeforeRenderingEntities.md @@ -23,16 +23,7 @@ final class BeforeRenderingEntities extends \Symfony\Contracts\EventDispatcher\E -

    Methods:

    -
      -
    1. - isPropagationStopped - - Is propagation stopped?
    2. -
    3. - stopPropagation - - Stops the propagation of the event to further event listeners.
    4. -
    @@ -40,53 +31,4 @@ final class BeforeRenderingEntities extends \Symfony\Contracts\EventDispatcher\E -

    Method details:

    - -
    - - - -```php -// Implemented in Symfony\Contracts\EventDispatcher\Event - -public function isPropagationStopped(): bool; -``` - -
    Is propagation stopped?
    - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Contracts\EventDispatcher\Event - -public function stopPropagation(): void; -``` - -
    Stops the propagation of the event to further event listeners.
    - -Parameters: not specified - -Return value: void - - -
    -
    - \ No newline at end of file diff --git a/docs/tech/classes/BreadcrumbsHelper.md b/docs/tech/classes/BreadcrumbsHelper.md index f5c84ec7..398c854a 100644 --- a/docs/tech/classes/BreadcrumbsHelper.md +++ b/docs/tech/classes/BreadcrumbsHelper.md @@ -337,7 +337,7 @@ public function getNearestIndexFile(string $templateName): string; ```php -public function getPageDataByKey(string $key): array|null; +public function getPageDataByKey(string $key): null|array; ``` @@ -361,7 +361,7 @@ public function getPageDataByKey(string $key): array|null; -Return value: array | null +Return value: null | array Throws: @@ -388,7 +388,7 @@ public function getPageDataByKey(string $key): array|null; ```php -public function getPageDocFileByKey(string $key): string|null; +public function getPageDocFileByKey(string $key): null|string; ``` @@ -412,7 +412,7 @@ public function getPageDocFileByKey(string $key): string|null; -Return value: string | null +Return value: null | string Throws: @@ -439,7 +439,7 @@ public function getPageDocFileByKey(string $key): string|null; ```php -public function getPageLinkByKey(string $key): string|null; +public function getPageLinkByKey(string $key): null|string; ``` @@ -463,7 +463,7 @@ public function getPageLinkByKey(string $key): string|null; -Return value: string | null +Return value: null | string Throws: @@ -490,7 +490,7 @@ public function getPageLinkByKey(string $key): string|null; ```php -public function getTemplateLinkKey(string $templateName): string|null; +public function getTemplateLinkKey(string $templateName): null|string; ``` @@ -514,7 +514,7 @@ public function getTemplateLinkKey(string $templateName): string|null; -Return value: string | null +Return value: null | string Throws: diff --git a/docs/tech/classes/CacheablePhpEntityFactory.md b/docs/tech/classes/CacheablePhpEntityFactory.md index b3880a8d..13968e1b 100644 --- a/docs/tech/classes/CacheablePhpEntityFactory.md +++ b/docs/tech/classes/CacheablePhpEntityFactory.md @@ -2,7 +2,7 @@ BumbleDocGen / Technical description of the project / Class map / CacheablePhpEntityFactory

    - CacheablePhpEntityFactory class: + CacheablePhpEntityFactory class:

    @@ -36,9 +36,6 @@ final class CacheablePhpEntityFactory
  • createClassEntity
  • -
  • - createClassEntityByReflection -
  • createConstantEntity
  • @@ -54,9 +51,6 @@ final class CacheablePhpEntityFactory
  • createSubClassEntity
  • -
  • - createSubClassEntityByReflection -
  • @@ -72,11 +66,11 @@ final class CacheablePhpEntityFactory ```php -public function __construct(\BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityWrapperFactory $cacheableEntityWrapperFactory, \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Reflection\ReflectorWrapper $reflector, \BumbleDocGen\Core\Configuration\Configuration $configuration, \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache $localObjectCache, \DI\Container $diContainer); +public function __construct(\BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityWrapperFactory $cacheableEntityWrapperFactory, \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache $localObjectCache, \DI\Container $diContainer); ``` @@ -96,16 +90,6 @@ public function __construct(\BumbleDocGen\Core\Parser\Entity\Cache\CacheableEnti $cacheableEntityWrapperFactory \BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityWrapperFactory - - - - $reflector - \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Reflection\ReflectorWrapper - - - - - $configuration - \BumbleDocGen\Core\Configuration\Configuration - - $localObjectCache @@ -129,7 +113,7 @@ public function __construct(\BumbleDocGen\Core\Parser\Entity\Cache\CacheableEnti ```php @@ -184,70 +168,14 @@ public function createClassEntity(\BumbleDocGen\LanguageHandler\Php\Parser\Entit
    - - -```php -public function createClassEntityByReflection(\Roave\BetterReflection\Reflection\ReflectionClass $reflectionClass, \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection $classEntityCollection): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity; -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $reflectionClass\Roave\BetterReflection\Reflection\ReflectionClass-
    $classEntityCollection\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection-
    - -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity - - -Throws: - - -
    -
    -
    - ```php -public function createConstantEntity(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity $classEntity, string $constantName, string $declaringClassName, string $implementingClassName, bool $reloadCache = false): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ConstantEntity; +public function createConstantEntity(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity $classEntity, string $constantName, string $implementingClassName, bool $reloadCache = false): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ConstantEntity; ``` @@ -272,11 +200,6 @@ public function createConstantEntity(\BumbleDocGen\LanguageHandler\Php\Parser\En $constantName string - - - - $declaringClassName - string - - $implementingClassName @@ -311,7 +234,7 @@ public function createConstantEntity(\BumbleDocGen\LanguageHandler\Php\Parser\En ```php @@ -364,11 +287,11 @@ public function createDynamicMethodEntity(\BumbleDocGen\LanguageHandler\Php\Pars ```php -public function createMethodEntity(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity $classEntity, string $methodName, string $declaringClassName, string $implementingClassName): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\MethodEntity; +public function createMethodEntity(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity $classEntity, string $methodName, string $implementingClassName): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\MethodEntity; ``` @@ -393,11 +316,6 @@ public function createMethodEntity(\BumbleDocGen\LanguageHandler\Php\Parser\Enti $methodName string - - - - $declaringClassName - string - - $implementingClassName @@ -427,11 +345,11 @@ public function createMethodEntity(\BumbleDocGen\LanguageHandler\Php\Parser\Enti ```php -public function createPropertyEntity(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity $classEntity, string $propertyName, string $declaringClassName, string $implementingClassName): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PropertyEntity; +public function createPropertyEntity(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity $classEntity, string $propertyName, string $implementingClassName): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PropertyEntity; ``` @@ -456,11 +374,6 @@ public function createPropertyEntity(\BumbleDocGen\LanguageHandler\Php\Parser\En $propertyName string - - - - $declaringClassName - string - - $implementingClassName @@ -490,7 +403,7 @@ public function createPropertyEntity(\BumbleDocGen\LanguageHandler\Php\Parser\En ```php @@ -546,67 +459,6 @@ public function createSubClassEntity(string $subClassEntity, \BumbleDocGen\Langu -
    -
    -
    - - - -```php -public function createSubClassEntityByReflection(string $subClassEntity, \Roave\BetterReflection\Reflection\ReflectionClass $reflectionClass, \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection $classEntityCollection): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity; -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $subClassEntitystring-
    $reflectionClass\Roave\BetterReflection\Reflection\ReflectionClass-
    $classEntityCollection\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection-
    - -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity - - -Throws: - -

    diff --git a/docs/tech/classes/CachedSourceLocator.md b/docs/tech/classes/CachedSourceLocator.md deleted file mode 100644 index 5726a857..00000000 --- a/docs/tech/classes/CachedSourceLocator.md +++ /dev/null @@ -1,196 +0,0 @@ - - BumbleDocGen / Technical description of the project / Class map / CachedSourceLocator
    - -

    - CachedSourceLocator class: -

    - - - - -:warning: Is internal -```php -namespace BumbleDocGen\LanguageHandler\Php\Parser\SourceLocator\Internal; - -final class CachedSourceLocator implements \Roave\BetterReflection\SourceLocator\Type\SourceLocator -``` - - - - - - - - -

    Initialization methods:

    - -
      -
    1. - __construct -
    2. -
    - -

    Methods:

    - -
      -
    1. - locateIdentifier -
    2. -
    3. - locateIdentifiersByType - - Find all identifiers of a type
    4. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public function __construct(\Roave\BetterReflection\SourceLocator\Type\SourceLocator $sourceLocator, \BumbleDocGen\Core\Configuration\Configuration $configuration, \BumbleDocGen\Core\Cache\SourceLocatorCacheItemPool $cache); -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $sourceLocator\Roave\BetterReflection\SourceLocator\Type\SourceLocator-
    $configuration\BumbleDocGen\Core\Configuration\Configuration-
    $cache\BumbleDocGen\Core\Cache\SourceLocatorCacheItemPool-
    - - - -
    -
    -
    - - - -```php -public function locateIdentifier(\Roave\BetterReflection\Reflector\Reflector $reflector, \Roave\BetterReflection\Identifier\Identifier $identifier): \Roave\BetterReflection\Reflection\Reflection|null; -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $reflector\Roave\BetterReflection\Reflector\Reflector-
    $identifier\Roave\BetterReflection\Identifier\Identifier-
    - -Return value: \Roave\BetterReflection\Reflection\Reflection | null - - -Throws: - - -
    -
    -
    - - - -```php -public function locateIdentifiersByType(\Roave\BetterReflection\Reflector\Reflector $reflector, \Roave\BetterReflection\Identifier\IdentifierType $identifierType): array; -``` - -
    Find all identifiers of a type
    - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $reflector\Roave\BetterReflection\Reflector\Reflector-
    $identifierType\Roave\BetterReflection\Identifier\IdentifierType-
    - -Return value: array - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/classes/ClassEntity.md b/docs/tech/classes/ClassEntity.md index 937dc33a..76e605cc 100644 --- a/docs/tech/classes/ClassEntity.md +++ b/docs/tech/classes/ClassEntity.md @@ -2,7 +2,7 @@ BumbleDocGen / Technical description of the project / Class map / ClassEntity

    - ClassEntity class: + ClassEntity class:

    @@ -48,6 +48,9 @@ class ClassEntity extends \BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEn
  • getAbsoluteFileName - Returns the absolute path to a file if it can be retrieved and if the file is in the project directory
  • +
  • + getAst +
  • getCacheKey
  • @@ -66,12 +69,18 @@ class ClassEntity extends \BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEn
  • getConstantEntityCollection
  • +
  • + getConstantValue +
  • getConstants
  • getConstantsData
  • +
  • + getCurrentRootEntity +
  • getDescription
  • @@ -100,11 +109,14 @@ class ClassEntity extends \BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEn getEntityDependencies
  • - getExamples - - Get parsed examples from `examples` doc block
  • + getEnumCaseValue +
  • - getExtends + getEnumCases
  • +
  • + getExamples + - Get parsed examples from `examples` doc block
  • getFileContent
  • @@ -121,7 +133,7 @@ class ClassEntity extends \BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEn getFullFileName
  • - getImplementingReflectionClass + getImplementingClass
  • getInterfaceNames @@ -129,9 +141,6 @@ class ClassEntity extends \BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEn
  • getInterfacesEntities
  • -
  • - getInterfacesString -
  • getMethodEntity
  • @@ -156,6 +165,9 @@ class ClassEntity extends \BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEn
  • getParentClass
  • +
  • + getParentClassEntities +
  • getParentClassName
  • @@ -177,9 +189,6 @@ class ClassEntity extends \BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEn
  • getPropertyEntityCollection
  • -
  • - getReflector -
  • getRelativeFileName
  • @@ -196,10 +205,10 @@ class ClassEntity extends \BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEn getThrows - Get parsed throws from `throws` doc block
  • - getTraitsNames + getTraits
  • - hasAnnotationKey + getTraitsNames
  • hasConstant @@ -283,7 +292,7 @@ class ClassEntity extends \BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEn removeNotUsedEntityDataCache
  • - setReflectionClass + setCustomAst
  • @@ -300,11 +309,11 @@ class ClassEntity extends \BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEn ```php -public function __construct(\BumbleDocGen\Core\Configuration\Configuration $configuration, \BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings $phpHandlerSettings, \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Reflection\ReflectorWrapper $reflector, \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection $classEntityCollection, \BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper $parserHelper, \BumbleDocGen\LanguageHandler\Php\Parser\ComposerParser $composerParser, \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache $localObjectCache, \Psr\Log\LoggerInterface $logger, string $className, string|null $relativeFileName); +public function __construct(\BumbleDocGen\Core\Configuration\Configuration $configuration, \BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings $phpHandlerSettings, \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection $classEntityCollection, \BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper $parserHelper, \BumbleDocGen\LanguageHandler\Php\Parser\ComposerHelper $composerHelper, \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpParser\PhpParserHelper $phpParserHelper, \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache $localObjectCache, \Psr\Log\LoggerInterface $logger, string $className, string|null $relativeFileName); ``` @@ -329,11 +338,6 @@ public function __construct(\BumbleDocGen\Core\Configuration\Configuration $conf $phpHandlerSettings \BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings - - - - $reflector - \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Reflection\ReflectorWrapper - - $classEntityCollection @@ -346,8 +350,13 @@ public function __construct(\BumbleDocGen\Core\Configuration\Configuration $conf - - $composerParser - \BumbleDocGen\LanguageHandler\Php\Parser\ComposerParser + $composerHelper + \BumbleDocGen\LanguageHandler\Php\Parser\ComposerHelper + - + + + $phpParserHelper + \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpParser\PhpParserHelper - @@ -382,7 +391,7 @@ public function __construct(\BumbleDocGen\Core\Configuration\Configuration $conf ```php @@ -420,9 +429,6 @@ public function cursorToDocAttributeLinkFragment(string $cursor, bool $isForDocu Throws: ```php -public function getIfExists(mixed $key): string|null; +public function getIfExists(mixed $key): null|string; ``` @@ -319,7 +319,7 @@ public function getIfExists(mixed $key): string|null; -Return value: string | null +Return value: null | string Throws: diff --git a/docs/tech/classes/ConfigurationParameterBag.md b/docs/tech/classes/ConfigurationParameterBag.md index fbdbf4c5..608d358e 100644 --- a/docs/tech/classes/ConfigurationParameterBag.md +++ b/docs/tech/classes/ConfigurationParameterBag.md @@ -776,7 +776,7 @@ public function validateAndGetClassValue(string $parameterName, string $classInt ```php -public function validateAndGetDirectoryPathValue(string $parameterName, bool $nullable = true): string|null; +public function validateAndGetDirectoryPathValue(string $parameterName, bool $nullable = true): null|string; ``` @@ -805,7 +805,7 @@ public function validateAndGetDirectoryPathValue(string $parameterName, bool $nu -Return value: string | null +Return value: null | string Throws: @@ -826,7 +826,7 @@ public function validateAndGetDirectoryPathValue(string $parameterName, bool $nu ```php -public function validateAndGetFilePathValue(string $parameterName, array $fileExtensions, bool $nullable = true): string|null; +public function validateAndGetFilePathValue(string $parameterName, array $fileExtensions, bool $nullable = true): null|string; ``` @@ -860,7 +860,7 @@ public function validateAndGetFilePathValue(string $parameterName, array $fileEx -Return value: string | null +Return value: null | string Throws: @@ -881,7 +881,7 @@ public function validateAndGetFilePathValue(string $parameterName, array $fileEx ```php -public function validateAndGetStringValue(string $parameterName, bool $nullable = true): string|null; +public function validateAndGetStringValue(string $parameterName, bool $nullable = true): null|string; ``` @@ -910,7 +910,7 @@ public function validateAndGetStringValue(string $parameterName, bool $nullable -Return value: string | null +Return value: null | string Throws: diff --git a/docs/tech/classes/Configuration_2.md b/docs/tech/classes/Configuration_2.md index d8fa6f21..48259066 100644 --- a/docs/tech/classes/Configuration_2.md +++ b/docs/tech/classes/Configuration_2.md @@ -197,14 +197,14 @@ public function getAdditionalConsoleCommands(): \BumbleDocGen\Console\Command\Ad ```php -public function getCacheDir(): string|null; +public function getCacheDir(): null|string; ``` Parameters: not specified -Return value: string | null +Return value: null | string Throws: @@ -295,7 +295,7 @@ public function getGitClientPath(): string; ```php -public function getIfExists(mixed $key): string|null; +public function getIfExists(mixed $key): null|string; ``` @@ -319,7 +319,7 @@ public function getIfExists(mixed $key): string|null; -Return value: string | null +Return value: null | string Throws: diff --git a/docs/tech/classes/ConstantEntity.md b/docs/tech/classes/ConstantEntity.md index 8367da3e..e1045234 100644 --- a/docs/tech/classes/ConstantEntity.md +++ b/docs/tech/classes/ConstantEntity.md @@ -2,7 +2,7 @@ BumbleDocGen / Technical description of the project / Class map / ConstantEntity

    - ConstantEntity class: + ConstantEntity class:

    @@ -39,12 +39,18 @@ class ConstantEntity extends \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Bas
  • getAbsoluteFileName - Returns the absolute path to a file if it can be retrieved and if the file is in the project directory
  • +
  • + getAst +
  • getCacheKey
  • getCachedEntityDependencies
  • +
  • + getCurrentRootEntity +
  • getDescription
  • @@ -84,9 +90,6 @@ class ConstantEntity extends \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Bas
  • getImplementingClassName
  • -
  • - getImplementingReflectionClass -
  • getName
  • @@ -99,6 +102,9 @@ class ConstantEntity extends \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Bas
  • getPhpHandlerSettings
  • +
  • + getRelativeFileName +
  • getRootEntity
  • @@ -114,6 +120,9 @@ class ConstantEntity extends \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Bas
  • getThrows - Get parsed throws from `throws` doc block
  • +
  • + getValue +
  • hasDescriptionLinks
  • @@ -156,6 +165,25 @@ class ConstantEntity extends \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Bas +

    Constants:

    + @@ -168,11 +196,11 @@ class ConstantEntity extends \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Bas ```php -public function __construct(\BumbleDocGen\Core\Configuration\Configuration $configuration, \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity $classEntity, \BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper $parserHelper, \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache $localObjectCache, \Psr\Log\LoggerInterface $logger, string $constantName, string $declaringClassName, string $implementingClassName); +public function __construct(\BumbleDocGen\Core\Configuration\Configuration $configuration, \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity $classEntity, \BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper $parserHelper, \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache $localObjectCache, \Psr\Log\LoggerInterface $logger, string $constantName, string $implementingClassName); ``` @@ -217,11 +245,6 @@ public function __construct(\BumbleDocGen\Core\Configuration\Configuration $conf $constantName string - - - - $declaringClassName - string - - $implementingClassName @@ -240,7 +263,7 @@ public function __construct(\BumbleDocGen\Core\Configuration\Configuration $conf ```php @@ -273,20 +296,48 @@ public function entityCacheIsOutdated(): bool; ```php // Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity -public function getAbsoluteFileName(): string|null; +public function getAbsoluteFileName(): null|string; ```
    Returns the absolute path to a file if it can be retrieved and if the file is in the project directory
    Parameters: not specified -Return value: string | null +Return value: null | string + + +Throws: + + + +
    +
    + + + +```php +public function getAst(): \PhpParser\Node\Stmt\ClassConst; +``` + + + +Parameters: not specified + +Return value: \PhpParser\Node\Stmt\ClassConst Throws: @@ -326,7 +377,7 @@ public function getCacheKey(): string; ```php @@ -349,6 +400,29 @@ public function getCachedEntityDependencies(): array; +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getCurrentRootEntity(): null|\BumbleDocGen\Core\Parser\Entity\RootEntityInterface; +``` + + + +Parameters: not specified + +Return value: null | \BumbleDocGen\Core\Parser\Entity\RootEntityInterface + +

    @@ -356,7 +430,7 @@ public function getCachedEntityDependencies(): array; ```php @@ -372,9 +446,6 @@ public function getDescription(): string; Throws:
    -
    -
    - - - -```php -public function getImplementingReflectionClass(): \Roave\BetterReflection\Reflection\ReflectionClass; -``` - - - -Parameters: not specified - -Return value: \Roave\BetterReflection\Reflection\ReflectionClass - - -Throws: - -

    @@ -756,7 +784,7 @@ public function getImplementingReflectionClass(): \Roave\BetterReflection\Reflec ```php @@ -777,7 +805,7 @@ public function getName(): string; ```php @@ -793,9 +821,6 @@ public function getNamespaceName(): string; Throws:
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getRelativeFileName(): null|string; +``` + + + +Parameters: not specified + +Return value: null | string + + +Throws: + +

    @@ -852,7 +907,7 @@ public function getPhpHandlerSettings(): \BumbleDocGen\LanguageHandler\Php\PhpHa ```php @@ -873,7 +928,7 @@ public function getRootEntity(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity ```php @@ -894,7 +949,7 @@ public function getRootEntityCollection(): \BumbleDocGen\LanguageHandler\Php\Par ```php @@ -915,7 +970,7 @@ public function getShortName(): string; ```php @@ -931,9 +986,6 @@ public function getStartLine(): int; Throws:
    +
    +
    + + + +```php +public function getValue(): string|array|int|bool|null|float; +``` + + + +Parameters: not specified + +Return value: string | array | int | bool | null | float + + +Throws: +
    @@ -209,26 +209,13 @@ public function get(string $objectName): \BumbleDocGen\LanguageHandler\Php\Parse public function getIterator(): \Generator; ``` -
    Retrieve an external iterator
    + Parameters: not specified Return value: \Generator -Throws: - - - -See: -
    @@ -299,7 +286,7 @@ public function isEmpty(): bool; ```php @@ -321,9 +308,6 @@ public function loadConstantEntities(): void;
  • \DI\DependencyException
  • -
  • - \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
  • -
  • \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • @@ -376,11 +360,11 @@ public function remove(string $objectName): void; ```php -public function unsafeGet(string $constantName): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ConstantEntity|null; +public function unsafeGet(string $constantName): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ConstantEntity; ``` @@ -404,7 +388,7 @@ public function unsafeGet(string $constantName): \BumbleDocGen\LanguageHandler\P -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ConstantEntity | null +Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ConstantEntity Throws: @@ -412,9 +396,6 @@ public function unsafeGet(string $constantName): \BumbleDocGen\LanguageHandler\P
  • \DI\NotFoundException
  • -
  • - \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
  • -
  • \DI\DependencyException
  • diff --git a/docs/tech/classes/CustomFiltersCollection.md b/docs/tech/classes/CustomFiltersCollection.md index 61de64a6..165f8d0b 100644 --- a/docs/tech/classes/CustomFiltersCollection.md +++ b/docs/tech/classes/CustomFiltersCollection.md @@ -12,7 +12,7 @@ ```php namespace BumbleDocGen\Core\Renderer\Twig\Filter; -final class CustomFiltersCollection implements \IteratorAggregate, \Traversable +final class CustomFiltersCollection implements \IteratorAggregate ``` @@ -37,7 +37,7 @@ final class CustomFiltersCollection implements \IteratorAggregate, \Traversable
  • getIterator - - Retrieve an external iterator
  • +
  • getTwigFilters
  • @@ -136,7 +136,7 @@ public static function create(\BumbleDocGen\Core\Renderer\Twig\Filter\CustomFilt ```php -public function get(string $key): \BumbleDocGen\Core\Renderer\Twig\Filter\CustomFilterInterface|null; +public function get(string $key): null|\BumbleDocGen\Core\Renderer\Twig\Filter\CustomFilterInterface; ``` @@ -160,7 +160,7 @@ public function get(string $key): \BumbleDocGen\Core\Renderer\Twig\Filter\Custom -Return value: \BumbleDocGen\Core\Renderer\Twig\Filter\CustomFilterInterface | null +Return value: null | \BumbleDocGen\Core\Renderer\Twig\Filter\CustomFilterInterface
    @@ -177,26 +177,13 @@ public function get(string $key): \BumbleDocGen\Core\Renderer\Twig\Filter\Custom public function getIterator(): \Generator; ``` -
    Retrieve an external iterator
    + Parameters: not specified Return value: \Generator -Throws: - - - -See: -
    diff --git a/docs/tech/classes/CustomFunctionsCollection.md b/docs/tech/classes/CustomFunctionsCollection.md index 9e1f5ba8..740c517b 100644 --- a/docs/tech/classes/CustomFunctionsCollection.md +++ b/docs/tech/classes/CustomFunctionsCollection.md @@ -12,7 +12,7 @@ ```php namespace BumbleDocGen\Core\Renderer\Twig\Function; -final class CustomFunctionsCollection implements \IteratorAggregate, \Traversable +final class CustomFunctionsCollection implements \IteratorAggregate ``` @@ -37,7 +37,7 @@ final class CustomFunctionsCollection implements \IteratorAggregate, \Traversabl
  • getIterator - - Retrieve an external iterator
  • +
  • getTwigFunctions
  • @@ -139,7 +139,7 @@ public static function create(\BumbleDocGen\Core\Renderer\Twig\Function\CustomFu ```php -public function get(string $key): \BumbleDocGen\Core\Renderer\Twig\Function\CustomFunctionInterface|null; +public function get(string $key): null|\BumbleDocGen\Core\Renderer\Twig\Function\CustomFunctionInterface; ``` @@ -163,7 +163,7 @@ public function get(string $key): \BumbleDocGen\Core\Renderer\Twig\Function\Cust -Return value: \BumbleDocGen\Core\Renderer\Twig\Function\CustomFunctionInterface | null +Return value: null | \BumbleDocGen\Core\Renderer\Twig\Function\CustomFunctionInterface
    @@ -180,26 +180,13 @@ public function get(string $key): \BumbleDocGen\Core\Renderer\Twig\Function\Cust public function getIterator(): \Generator; ``` -
    Retrieve an external iterator
    + Parameters: not specified Return value: \Generator -Throws: - - - -See: -
    diff --git a/docs/tech/classes/CustomSourceLocatorInterface.md b/docs/tech/classes/CustomSourceLocatorInterface.md deleted file mode 100644 index b0387917..00000000 --- a/docs/tech/classes/CustomSourceLocatorInterface.md +++ /dev/null @@ -1,81 +0,0 @@ - - BumbleDocGen / Technical description of the project / Class map / CustomSourceLocatorInterface
    - -

    - CustomSourceLocatorInterface class: -

    - - - - - -```php -namespace BumbleDocGen\LanguageHandler\Php\Parser\SourceLocator; - -interface CustomSourceLocatorInterface -``` - - - - - - - - - -

    Methods:

    - -
      -
    1. - getSourceLocator -
    2. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public function getSourceLocator(\Roave\BetterReflection\SourceLocator\Ast\Locator $astLocator): \Roave\BetterReflection\SourceLocator\Type\SourceLocator; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $astLocator\Roave\BetterReflection\SourceLocator\Ast\Locator-
    - -Return value: \Roave\BetterReflection\SourceLocator\Type\SourceLocator - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/classes/DocBlocksGenerator.md b/docs/tech/classes/DocBlocksGenerator.md index d1f9a760..d26f4391 100644 --- a/docs/tech/classes/DocBlocksGenerator.md +++ b/docs/tech/classes/DocBlocksGenerator.md @@ -2,7 +2,7 @@ BumbleDocGen / Technical description of the project / Class map / DocBlocksGenerator

    - DocBlocksGenerator class: + DocBlocksGenerator class:

    @@ -46,11 +46,11 @@ final class DocBlocksGenerator @@ -65,7 +65,7 @@ final class DocBlocksGenerator ```php @@ -107,7 +107,7 @@ public function __construct(\BumbleDocGen\AI\ProviderInterface $aiProvider, \Bum ```php @@ -145,9 +145,6 @@ public function generateDocBlocksForMethodsWithoutIt(\BumbleDocGen\Core\Parser\E Throws:
    @@ -166,7 +166,7 @@ public function generateDocBlocksForMethodsWithoutIt(\BumbleDocGen\Core\Parser\E ```php @@ -205,9 +205,6 @@ public function hasMethodsWithoutDocBlocks(\BumbleDocGen\Core\Parser\Entity\Root
  • \DI\DependencyException
  • -
  • - \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
  • -
  • \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • diff --git a/docs/tech/classes/DocGenerator.md b/docs/tech/classes/DocGenerator.md index 51981535..d8083ff2 100644 --- a/docs/tech/classes/DocGenerator.md +++ b/docs/tech/classes/DocGenerator.md @@ -2,7 +2,7 @@ BumbleDocGen / Technical description of the project / Class map / DocGenerator

    - DocGenerator class: + DocGenerator class:

    @@ -52,11 +52,11 @@ final class DocGenerator @@ -71,11 +71,11 @@ final class DocGenerator ```php -public function __construct(\Symfony\Component\Filesystem\Filesystem $fs, \Symfony\Component\Console\Style\OutputStyle $io, \BumbleDocGen\Core\Configuration\Configuration $configuration, \BumbleDocGen\Core\Plugin\PluginEventDispatcher $pluginEventDispatcher, \BumbleDocGen\Core\Parser\ProjectParser $parser, \BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper $parserHelper, \BumbleDocGen\Core\Renderer\Renderer $renderer, \BumbleDocGen\Core\Logger\Handler\GenerationErrorsHandler $generationErrorsHandler, \BumbleDocGen\Core\Parser\Entity\RootEntityCollectionsGroup $rootEntityCollectionsGroup, \Monolog\Logger $logger); +public function __construct(\Symfony\Component\Console\Style\OutputStyle $io, \BumbleDocGen\Core\Configuration\Configuration $configuration, \BumbleDocGen\Core\Plugin\PluginEventDispatcher $pluginEventDispatcher, \BumbleDocGen\Core\Parser\ProjectParser $parser, \BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper $parserHelper, \BumbleDocGen\Core\Renderer\Renderer $renderer, \BumbleDocGen\Core\Logger\Handler\GenerationErrorsHandler $generationErrorsHandler, \BumbleDocGen\Core\Parser\Entity\RootEntityCollectionsGroup $rootEntityCollectionsGroup, \Monolog\Logger $logger); ``` @@ -91,11 +91,6 @@ public function __construct(\Symfony\Component\Filesystem\Filesystem $fs, \Symfo - - $fs - \Symfony\Component\Filesystem\Filesystem - - - $io \Symfony\Component\Console\Style\OutputStyle @@ -146,6 +141,19 @@ public function __construct(\Symfony\Component\Filesystem\Filesystem $fs, \Symfo +Throws: + +
    @@ -153,7 +161,7 @@ public function __construct(\Symfony\Component\Filesystem\Filesystem $fs, \Symfo ```php @@ -193,10 +201,10 @@ public function addDocBlocks(\BumbleDocGen\AI\ProviderInterface $aiProvider): vo \DI\DependencyException
  • - \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \JsonException @@ -271,9 +279,6 @@ public function generateReadmeTemplate(\BumbleDocGen\AI\ProviderInterface $aiPro Throws:
      -
    • - \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
    • -
    • \DI\DependencyException
    • @@ -292,7 +297,7 @@ public function generateReadmeTemplate(\BumbleDocGen\AI\ProviderInterface $aiPro ```php diff --git a/docs/tech/classes/DocumentedEntityWrappersCollection.md b/docs/tech/classes/DocumentedEntityWrappersCollection.md index 63cdd40e..59eb5c36 100644 --- a/docs/tech/classes/DocumentedEntityWrappersCollection.md +++ b/docs/tech/classes/DocumentedEntityWrappersCollection.md @@ -12,7 +12,7 @@ ```php namespace BumbleDocGen\Core\Renderer\Context; -final class DocumentedEntityWrappersCollection implements \IteratorAggregate, \Traversable, \Countable +final class DocumentedEntityWrappersCollection implements \IteratorAggregate, \Countable ``` @@ -35,7 +35,7 @@ final class DocumentedEntityWrappersCollection implements \IteratorAggregate, \T
      1. count - - Count elements of an object
      2. +
      3. createAndAddDocumentedEntityWrapper
      4. @@ -44,7 +44,7 @@ final class DocumentedEntityWrappersCollection implements \IteratorAggregate, \T
      5. getIterator - - Retrieve an external iterator
      6. +
      @@ -119,19 +119,13 @@ public function __construct(\BumbleDocGen\Core\Renderer\Context\RendererContext public function count(): int; ``` -
      Count elements of an object
      + Parameters: not specified Return value: int - -See: -

    @@ -212,26 +206,13 @@ public function getDocumentedEntitiesRelations(): array; public function getIterator(): \Generator; ``` -
    Retrieve an external iterator
    + Parameters: not specified Return value: \Generator -Throws: - - - -See: -

    diff --git a/docs/tech/classes/DocumentedEntityWrappersCollection_2.md b/docs/tech/classes/DocumentedEntityWrappersCollection_2.md index c913bb55..54d652f1 100644 --- a/docs/tech/classes/DocumentedEntityWrappersCollection_2.md +++ b/docs/tech/classes/DocumentedEntityWrappersCollection_2.md @@ -12,7 +12,7 @@ ```php namespace BumbleDocGen\Core\Renderer\Context; -final class DocumentedEntityWrappersCollection implements \IteratorAggregate, \Traversable, \Countable +final class DocumentedEntityWrappersCollection implements \IteratorAggregate, \Countable ``` @@ -35,7 +35,7 @@ final class DocumentedEntityWrappersCollection implements \IteratorAggregate, \T
    1. count - - Count elements of an object
    2. +
    3. createAndAddDocumentedEntityWrapper
    4. @@ -44,7 +44,7 @@ final class DocumentedEntityWrappersCollection implements \IteratorAggregate, \T
    5. getIterator - - Retrieve an external iterator
    6. +
    @@ -119,19 +119,13 @@ public function __construct(\BumbleDocGen\Core\Renderer\Context\RendererContext public function count(): int; ``` -
    Count elements of an object
    + Parameters: not specified Return value: int - -See: -
    @@ -212,26 +206,13 @@ public function getDocumentedEntitiesRelations(): array; public function getIterator(): \Generator; ``` -
    Retrieve an external iterator
    + Parameters: not specified Return value: \Generator -Throws: - - - -See: -

    diff --git a/docs/tech/classes/DrawClassMap.md b/docs/tech/classes/DrawClassMap.md index 7ed2a300..9d6cb02d 100644 --- a/docs/tech/classes/DrawClassMap.md +++ b/docs/tech/classes/DrawClassMap.md @@ -2,7 +2,7 @@ BumbleDocGen / Technical description of the project / Class map / DrawClassMap

    - DrawClassMap class: + DrawClassMap class:

    @@ -86,7 +86,7 @@ final class DrawClassMap implements \BumbleDocGen\Core\Renderer\Twig\Function\Cu ```php @@ -128,7 +128,7 @@ public function __construct(\BumbleDocGen\Core\Renderer\Twig\Function\GetDocumen ```php @@ -164,9 +164,6 @@ public function __invoke(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEn
  • \DI\NotFoundException
  • -
  • - \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
  • -
  • \DI\DependencyException
  • @@ -182,7 +179,7 @@ public function __invoke(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEn ```php @@ -230,7 +227,7 @@ public function convertDirectoryStructureToFormattedString(array $structure, str ```php @@ -266,9 +263,6 @@ public function getDirectoryStructure(\BumbleDocGen\LanguageHandler\Php\Parser\E
  • \DI\NotFoundException
  • -
  • - \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
  • -
  • \DI\DependencyException
  • @@ -284,7 +278,7 @@ public function getDirectoryStructure(\BumbleDocGen\LanguageHandler\Php\Parser\E ```php @@ -305,7 +299,7 @@ public static function getName(): string; ```php diff --git a/docs/tech/classes/DrawDocumentedEntityLink.md b/docs/tech/classes/DrawDocumentedEntityLink.md index 085b28a6..2676cae9 100644 --- a/docs/tech/classes/DrawDocumentedEntityLink.md +++ b/docs/tech/classes/DrawDocumentedEntityLink.md @@ -2,7 +2,7 @@ BumbleDocGen / Technical description of the project / Class map / DrawDocumentedEntityLink

    - DrawDocumentedEntityLink class: + DrawDocumentedEntityLink class:

    @@ -85,7 +85,7 @@ final class DrawDocumentedEntityLink implements \BumbleDocGen\Core\Renderer\Twig ```php @@ -122,7 +122,7 @@ public function __construct(\BumbleDocGen\Core\Renderer\Twig\Function\GetDocumen ```php @@ -168,9 +168,6 @@ public function __invoke(\BumbleDocGen\Core\Parser\Entity\RootEntityInterface $e
  • \DI\NotFoundException
  • -
  • - \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
  • -
  • \DI\DependencyException
  • @@ -186,7 +183,7 @@ public function __invoke(\BumbleDocGen\Core\Parser\Entity\RootEntityInterface $e ```php @@ -207,7 +204,7 @@ public static function getName(): string; ```php diff --git a/docs/tech/classes/DynamicMethodEntity.md b/docs/tech/classes/DynamicMethodEntity.md index 4e60369a..34dd8cf1 100644 --- a/docs/tech/classes/DynamicMethodEntity.md +++ b/docs/tech/classes/DynamicMethodEntity.md @@ -2,7 +2,7 @@ BumbleDocGen / Technical description of the project / Class map / DynamicMethodEntity

    - DynamicMethodEntity class: + DynamicMethodEntity class:

    @@ -63,9 +63,6 @@ class DynamicMethodEntity implements \BumbleDocGen\LanguageHandler\Php\Parser\En
  • getImplementingClassName
  • -
  • - getImplementingReflectionClass -
  • getModifiersString
  • @@ -135,7 +132,7 @@ class DynamicMethodEntity implements \BumbleDocGen\LanguageHandler\Php\Parser\En ```php @@ -187,7 +184,7 @@ public function __construct(\BumbleDocGen\Core\Configuration\Configuration $conf ```php @@ -208,18 +205,18 @@ public function entityCacheIsOutdated(): bool; ```php -public function getAbsoluteFileName(): string|null; +public function getAbsoluteFileName(): null|string; ``` Parameters: not specified -Return value: string | null +Return value: null | string Throws: @@ -236,7 +233,7 @@ public function getAbsoluteFileName(): string|null; ```php @@ -257,7 +254,7 @@ public function getBodyCode(): string; ```php @@ -285,7 +282,7 @@ public function getCallMethod(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity ```php @@ -306,7 +303,7 @@ public function getDescription(): string; ```php @@ -334,18 +331,18 @@ public function getEndLine(): int; ```php -public function getFileName(): string|null; +public function getFileName(): null|string; ``` Parameters: not specified -Return value: string | null +Return value: null | string Throws: @@ -365,7 +362,7 @@ public function getFileName(): string|null; ```php @@ -386,7 +383,7 @@ public function getFirstReturnValue(): mixed; ```php @@ -407,7 +404,7 @@ public function getImplementingClass(): \BumbleDocGen\LanguageHandler\Php\Parser ```php @@ -421,34 +418,6 @@ public function getImplementingClassName(): string; Return value: string -Throws: - - - -
    -
    - - - -```php -public function getImplementingReflectionClass(): \Roave\BetterReflection\Reflection\ReflectionClass; -``` - - - -Parameters: not specified - -Return value: \Roave\BetterReflection\Reflection\ReflectionClass - - Throws:

    @@ -536,7 +495,7 @@ public function getNamespaceName(): string; ```php @@ -557,7 +516,7 @@ public function getObjectId(): string; ```php @@ -578,7 +537,7 @@ public function getParameters(): array; ```php @@ -599,7 +558,7 @@ public function getParametersString(): string; ```php @@ -615,9 +574,6 @@ public function getReturnType(): string; Throws:

    @@ -213,7 +206,7 @@ public function deleteItem(string $key): bool; public function deleteItems(array $keys): bool; ``` -
    Removes multiple items from the pool.
    + Parameters: @@ -228,8 +221,8 @@ public function deleteItems(array $keys): bool; $keys - string[] - An array of keys that should be removed from the pool. + array + - @@ -237,13 +230,6 @@ public function deleteItems(array $keys): bool; Return value: bool -Throws: - -

    @@ -258,7 +244,7 @@ public function deleteItems(array $keys): bool; public function getItem(string $key): \Psr\Cache\CacheItemInterface; ``` -
    Returns a Cache Item representing the specified key.
    + Parameters: @@ -274,7 +260,7 @@ public function getItem(string $key): \Psr\Cache\CacheItemInterface; $key string - The key for which to return the corresponding Cache Item. + - @@ -282,13 +268,6 @@ public function getItem(string $key): \Psr\Cache\CacheItemInterface; Return value: \Psr\Cache\CacheItemInterface -Throws: - -

    @@ -303,7 +282,7 @@ public function getItem(string $key): \Psr\Cache\CacheItemInterface; public function getItems(array $keys = []): iterable; ``` -
    Returns a traversable set of cache items.
    + Parameters: @@ -318,22 +297,15 @@ public function getItems(array $keys = []): iterable; $keys - string[] - An indexed array of keys of items to retrieve. + array + - -Return value: iterable +Return value: iterable -Throws: - -

    @@ -348,7 +320,7 @@ public function getItems(array $keys = []): iterable; public function hasItem(string $key): bool; ``` -
    Confirms if the cache contains specified cache item.
    + Parameters: @@ -364,7 +336,7 @@ public function hasItem(string $key): bool; $key string - The key for which to check existence. + - @@ -372,13 +344,6 @@ public function hasItem(string $key): bool; Return value: bool -Throws: - -

    @@ -393,7 +358,7 @@ public function hasItem(string $key): bool; public function save(\Psr\Cache\CacheItemInterface $item): bool; ``` -
    Persists a cache item immediately.
    + Parameters: @@ -409,7 +374,7 @@ public function save(\Psr\Cache\CacheItemInterface $item): bool; $item \Psr\Cache\CacheItemInterface - The cache item to save. + - @@ -431,7 +396,7 @@ public function save(\Psr\Cache\CacheItemInterface $item): bool; public function saveDeferred(\Psr\Cache\CacheItemInterface $item): bool; ``` -
    Sets a cache item to be persisted later.
    + Parameters: @@ -447,7 +412,7 @@ public function saveDeferred(\Psr\Cache\CacheItemInterface $item): bool; $item \Psr\Cache\CacheItemInterface - The cache item to save. + - diff --git a/docs/tech/classes/EntityDocRendererHelper.md b/docs/tech/classes/EntityDocRendererHelper.md index e38d5521..2984064f 100644 --- a/docs/tech/classes/EntityDocRendererHelper.md +++ b/docs/tech/classes/EntityDocRendererHelper.md @@ -2,7 +2,7 @@ BumbleDocGen / Technical description of the project / Class map / EntityDocRendererHelper

    - EntityDocRendererHelper class: + EntityDocRendererHelper class:

    @@ -46,15 +46,15 @@ final class EntityDocRendererHelper @@ -69,7 +69,7 @@ final class EntityDocRendererHelper ```php @@ -111,7 +111,7 @@ public function __construct(\BumbleDocGen\Core\Parser\Entity\RootEntityCollectio ```php @@ -159,9 +159,6 @@ public function getEntityDataByLink(string $linkString, \BumbleDocGen\Core\Parse Throws:
    @@ -133,26 +133,13 @@ public function getFirstMatchingRender(\BumbleDocGen\Core\Parser\Entity\RootEnti public function getIterator(): \Generator; ``` -
    Retrieve an external iterator
    + Parameters: not specified Return value: \Generator -Throws: - - - -See: -
    diff --git a/docs/tech/classes/EntityDocUnifiedPlacePlugin.md b/docs/tech/classes/EntityDocUnifiedPlacePlugin.md index d4b0f3d0..c6be906b 100644 --- a/docs/tech/classes/EntityDocUnifiedPlacePlugin.md +++ b/docs/tech/classes/EntityDocUnifiedPlacePlugin.md @@ -30,7 +30,7 @@ in a separate directory structure, so they are not duplicated.
    1. getSubscribedEvents - - Returns an array of event names this subscriber wants to listen to.
    2. +
    3. onCreateDocumentedEntityWrapper
    4. @@ -69,7 +69,7 @@ in a separate directory structure, so they are not duplicated. public static function getSubscribedEvents(): array; ``` -
      Returns an array of event names this subscriber wants to listen to.
      + Parameters: not specified diff --git a/docs/tech/classes/EntityInterface.md b/docs/tech/classes/EntityInterface.md index 85ff66e9..317c5847 100644 --- a/docs/tech/classes/EntityInterface.md +++ b/docs/tech/classes/EntityInterface.md @@ -87,14 +87,14 @@ public function entityCacheIsOutdated(): bool; ```php -public function getAbsoluteFileName(): string|null; +public function getAbsoluteFileName(): null|string; ```
      Returns the absolute path to a file if it can be retrieved and if the file is in the project directory
      Parameters: not specified -Return value: string | null +Return value: null | string @@ -108,14 +108,14 @@ public function getAbsoluteFileName(): string|null; ```php -public function getFileName(): string|null; +public function getFileName(): null|string; ```
      Returns the relative path to a file if it can be retrieved and if the file is in the project directory
      Parameters: not specified -Return value: string | null +Return value: null | string diff --git a/docs/tech/classes/FileDependency.md b/docs/tech/classes/FileDependency.md index 1175a15f..c99dd680 100644 --- a/docs/tech/classes/FileDependency.md +++ b/docs/tech/classes/FileDependency.md @@ -2,7 +2,7 @@ BumbleDocGen / Technical description of the project / Class map / FileDependency

      - FileDependency class: + FileDependency class:

      @@ -60,7 +60,7 @@ final class FileDependency implements \BumbleDocGen\Core\Renderer\Context\Depend ```php @@ -112,7 +112,7 @@ public function __construct(string $fileInternalLink, string $hash, string|null ```php @@ -133,7 +133,7 @@ public function __serialize(): array; ```php @@ -171,7 +171,7 @@ public function __unserialize(array $data): void; ```php @@ -231,7 +231,7 @@ public static function create(\BumbleDocGen\Core\Renderer\RendererHelper $render ```php diff --git a/docs/tech/classes/GenerateCommand.md b/docs/tech/classes/GenerateCommand.md index ba689bbf..f59ebcbb 100644 --- a/docs/tech/classes/GenerateCommand.md +++ b/docs/tech/classes/GenerateCommand.md @@ -15,7 +15,7 @@ namespace BumbleDocGen\Console\Command; final class GenerateCommand extends \BumbleDocGen\Console\Command\BaseCommand ``` -
      Base class for all commands.
      + @@ -30,126 +30,8 @@ final class GenerateCommand extends \BumbleDocGen\Console\Command\BaseCommand
    -

    Methods:

    - -
      -
    1. - addArgument - - Adds an argument.
    2. -
    3. - addOption - - Adds an option.
    4. -
    5. - addUsage - - Add a command usage example, it'll be prefixed with the command name.
    6. -
    7. - complete - - Adds suggestions to $suggestions for the current completion input (e.g. option or argument).
    8. -
    9. - getAliases - - Returns the aliases for the command.
    10. -
    11. - getApplication - - Gets the application instance for this command.
    12. -
    13. - getDefaultDescription -
    14. -
    15. - getDefaultName -
    16. -
    17. - getDefinition - - Gets the InputDefinition attached to this Command.
    18. -
    19. - getDescription - - Returns the description for the command.
    20. -
    21. - getHelp - - Returns the help for the command.
    22. -
    23. - getHelper - - Gets a helper instance by name.
    24. -
    25. - getHelperSet - - Gets the helper set.
    26. -
    27. - getName - - Returns the command name.
    28. -
    29. - getNativeDefinition - - Gets the InputDefinition to be used to create representations of this Command.
    30. -
    31. - getProcessedHelp - - Returns the processed help for the command replacing the %command.name% and %command.full_name% patterns with the real values dynamically.
    32. -
    33. - getSynopsis - - Returns the synopsis for the command.
    34. -
    35. - getUsages - - Returns alternative usages of the command.
    36. -
    37. - ignoreValidationErrors - - Ignores validation errors.
    38. -
    39. - isEnabled - - Checks whether the command is enabled or not in the current environment.
    40. -
    41. - isHidden -
    42. -
    43. - mergeApplicationDefinition - - Merges the application definition with the command definition.
    44. -
    45. - run - - Runs the command.
    46. -
    47. - setAliases - - Sets the aliases for the command.
    48. -
    49. - setApplication -
    50. -
    51. - setCode - - Sets the code to execute when running this command.
    52. -
    53. - setDefinition - - Sets an array of argument and option instances.
    54. -
    55. - setDescription - - Sets the description for the command.
    56. -
    57. - setHelp - - Sets the help for the command.
    58. -
    59. - setHelperSet -
    60. -
    61. - setHidden -
    62. -
    63. - setName - - Sets the name of the command.
    64. -
    65. - setProcessTitle - - Sets the process title of the command.
    66. -
    -

    Constants:

    - @@ -187,1195 +69,11 @@ public function __construct(string $name = null); $name string - The name of the command; passing null means it must be set in configure() - - - - - - -Throws: - - - -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function addArgument(string $name, int $mode = null, string $description = '', mixed $default = null): static; -``` - -
    Adds an argument.
    - -Parameters: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $namestring-
    $modeintThe argument mode: InputArgument::REQUIRED or InputArgument::OPTIONAL
    $descriptionstring-
    $defaultmixedThe default value (for InputArgument::OPTIONAL mode only)
    - -Return value: static - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function addOption(string $name, string|array $shortcut = null, int $mode = null, string $description = '', mixed $default = null): static; -``` - -
    Adds an option.
    - -Parameters: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $namestring-
    $shortcutstring | arrayThe shortcuts, can be null, a string of shortcuts delimited by | or an array of shortcuts
    $modeintThe option mode: One of the InputOption::VALUE_* constants
    $descriptionstring-
    $defaultmixedThe default value (must be null for InputOption::VALUE_NONE)
    - -Return value: static - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function addUsage(string $usage): static; -``` - -
    Add a command usage example, it'll be prefixed with the command name.
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $usagestring-
    - -Return value: static - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function complete(\Symfony\Component\Console\Completion\CompletionInput $input, \Symfony\Component\Console\Completion\CompletionSuggestions $suggestions): void; -``` - -
    Adds suggestions to $suggestions for the current completion input (e.g. option or argument).
    - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $input\Symfony\Component\Console\Completion\CompletionInput-
    $suggestions\Symfony\Component\Console\Completion\CompletionSuggestions-
    - -Return value: void - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function getAliases(): array; -``` - -
    Returns the aliases for the command.
    - -Parameters: not specified - -Return value: array - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function getApplication(): \Symfony\Component\Console\Application|null; -``` - -
    Gets the application instance for this command.
    - -Parameters: not specified - -Return value: \Symfony\Component\Console\Application | null - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public static function getDefaultDescription(): string|null; -``` - - - -Parameters: not specified - -Return value: string | null - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public static function getDefaultName(): string|null; -``` - - - -Parameters: not specified - -Return value: string | null - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function getDefinition(): \Symfony\Component\Console\Input\InputDefinition; -``` - -
    Gets the InputDefinition attached to this Command.
    - -Parameters: not specified - -Return value: \Symfony\Component\Console\Input\InputDefinition - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function getDescription(): string; -``` - -
    Returns the description for the command.
    - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function getHelp(): string; -``` - -
    Returns the help for the command.
    - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function getHelper(string $name): mixed; -``` - -
    Gets a helper instance by name.
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $namestring-
    - -Return value: mixed - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function getHelperSet(): \Symfony\Component\Console\Helper\HelperSet|null; -``` - -
    Gets the helper set.
    - -Parameters: not specified - -Return value: \Symfony\Component\Console\Helper\HelperSet | null - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function getName(): string|null; -``` - -
    Returns the command name.
    - -Parameters: not specified - -Return value: string | null - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function getNativeDefinition(): \Symfony\Component\Console\Input\InputDefinition; -``` - -
    Gets the InputDefinition to be used to create representations of this Command.
    - -Parameters: not specified - -Return value: \Symfony\Component\Console\Input\InputDefinition - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function getProcessedHelp(): string; -``` - -
    Returns the processed help for the command replacing the %command.name% and -%command.full_name% patterns with the real values dynamically.
    - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function getSynopsis(bool $short = false): string; -``` - -
    Returns the synopsis for the command.
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $shortboolWhether to show the short version of the synopsis (with options folded) or not
    - -Return value: string - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function getUsages(): array; -``` - -
    Returns alternative usages of the command.
    - -Parameters: not specified - -Return value: array - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function ignoreValidationErrors(): mixed; -``` - -
    Ignores validation errors.
    - -Parameters: not specified - -Return value: mixed - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function isEnabled(): bool; -``` - -
    Checks whether the command is enabled or not in the current environment.
    - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function isHidden(): bool; -``` - - - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - -
      -
    • # - mergeApplicationDefinition - :warning: Is internal | source code
    • -
    - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function mergeApplicationDefinition(bool $mergeArgs = true): mixed; -``` - -
    Merges the application definition with the command definition.
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $mergeArgsboolWhether to merge or not the Application definition arguments to Command definition arguments
    - -Return value: mixed - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function run(\Symfony\Component\Console\Input\InputInterface $input, \Symfony\Component\Console\Output\OutputInterface $output): int; -``` - -
    Runs the command.
    - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $input\Symfony\Component\Console\Input\InputInterface-
    $output\Symfony\Component\Console\Output\OutputInterface-
    - -Return value: int - - -Throws: - - - -See: - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function setAliases(iterable $aliases): static; -``` - -
    Sets the aliases for the command.
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $aliasesiterableAn array of aliases for the command
    - -Return value: static - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function setApplication(\Symfony\Component\Console\Application $application = null): mixed; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $application\Symfony\Component\Console\Application-
    - -Return value: mixed - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function setCode(callable $code): static; -``` - -
    Sets the code to execute when running this command.
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $codecallableA callable(InputInterface $input, OutputInterface $output)
    - -Return value: static - - -Throws: - - - -See: - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function setDefinition(array|\Symfony\Component\Console\Input\InputDefinition $definition): static; -``` - -
    Sets an array of argument and option instances.
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $definitionarray | \Symfony\Component\Console\Input\InputDefinition-
    - -Return value: static - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function setDescription(string $description): static; -``` - -
    Sets the description for the command.
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $descriptionstring-
    - -Return value: static - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function setHelp(string $help): static; -``` - -
    Sets the help for the command.
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $helpstring-
    - -Return value: static - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function setHelperSet(\Symfony\Component\Console\Helper\HelperSet $helperSet): mixed; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $helperSet\Symfony\Component\Console\Helper\HelperSet-
    - -Return value: mixed - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function setHidden(bool $hidden = true): static; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $hiddenboolWhether or not the command should be hidden from the list of commands
    - -Return value: static - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function setName(string $name): static; -``` - -
    Sets the name of the command.
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $namestring-
    - -Return value: static - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function setProcessTitle(string $title): static; -``` - -
    Sets the process title of the command.
    - -Parameters: - - - - - - - - - - - - -
    NameTypeDescription
    $titlestring -
    -Return value: static
    diff --git a/docs/tech/classes/GenerateReadMeTemplateCommand.md b/docs/tech/classes/GenerateReadMeTemplateCommand.md index 1c839113..1cff47aa 100644 --- a/docs/tech/classes/GenerateReadMeTemplateCommand.md +++ b/docs/tech/classes/GenerateReadMeTemplateCommand.md @@ -2,7 +2,7 @@ BumbleDocGen / Technical description of the project / Class map / GenerateReadMeTemplateCommand

    - GenerateReadMeTemplateCommand class: + GenerateReadMeTemplateCommand class:

    @@ -15,7 +15,7 @@ namespace BumbleDocGen\AI\Console; final class GenerateReadMeTemplateCommand extends \BumbleDocGen\Console\Command\BaseCommand ``` -
    Base class for all commands.
    + @@ -30,109 +30,6 @@ final class GenerateReadMeTemplateCommand extends \BumbleDocGen\Console\Command\ -

    Methods:

    - -
      -
    1. - addArgument - - Adds an argument.
    2. -
    3. - addOption - - Adds an option.
    4. -
    5. - addUsage - - Add a command usage example, it'll be prefixed with the command name.
    6. -
    7. - complete - - Adds suggestions to $suggestions for the current completion input (e.g. option or argument).
    8. -
    9. - getAliases - - Returns the aliases for the command.
    10. -
    11. - getApplication - - Gets the application instance for this command.
    12. -
    13. - getDefaultDescription -
    14. -
    15. - getDefaultName -
    16. -
    17. - getDefinition - - Gets the InputDefinition attached to this Command.
    18. -
    19. - getDescription - - Returns the description for the command.
    20. -
    21. - getHelp - - Returns the help for the command.
    22. -
    23. - getHelper - - Gets a helper instance by name.
    24. -
    25. - getHelperSet - - Gets the helper set.
    26. -
    27. - getName - - Returns the command name.
    28. -
    29. - getNativeDefinition - - Gets the InputDefinition to be used to create representations of this Command.
    30. -
    31. - getProcessedHelp - - Returns the processed help for the command replacing the %command.name% and %command.full_name% patterns with the real values dynamically.
    32. -
    33. - getSynopsis - - Returns the synopsis for the command.
    34. -
    35. - getUsages - - Returns alternative usages of the command.
    36. -
    37. - ignoreValidationErrors - - Ignores validation errors.
    38. -
    39. - isEnabled - - Checks whether the command is enabled or not in the current environment.
    40. -
    41. - isHidden -
    42. -
    43. - mergeApplicationDefinition - - Merges the application definition with the command definition.
    44. -
    45. - run - - Runs the command.
    46. -
    47. - setAliases - - Sets the aliases for the command.
    48. -
    49. - setApplication -
    50. -
    51. - setCode - - Sets the code to execute when running this command.
    52. -
    53. - setDefinition - - Sets an array of argument and option instances.
    54. -
    55. - setDescription - - Sets the description for the command.
    56. -
    57. - setHelp - - Sets the help for the command.
    58. -
    59. - setHelperSet -
    60. -
    61. - setHidden -
    62. -
    63. - setName - - Sets the name of the command.
    64. -
    65. - setProcessTitle - - Sets the process title of the command.
    66. -

    Traits:

    @@ -142,21 +39,9 @@ final class GenerateReadMeTemplateCommand extends \BumbleDocGen\Console\Command\

    Constants:

    @@ -196,1195 +81,11 @@ public function __construct(string $name = null); $name string - The name of the command; passing null means it must be set in configure() - - - - - - -Throws: - - - -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function addArgument(string $name, int $mode = null, string $description = '', mixed $default = null): static; -``` - -
    Adds an argument.
    - -Parameters: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $namestring-
    $modeintThe argument mode: InputArgument::REQUIRED or InputArgument::OPTIONAL
    $descriptionstring-
    $defaultmixedThe default value (for InputArgument::OPTIONAL mode only)
    - -Return value: static - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function addOption(string $name, string|array $shortcut = null, int $mode = null, string $description = '', mixed $default = null): static; -``` - -
    Adds an option.
    - -Parameters: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $namestring-
    $shortcutstring | arrayThe shortcuts, can be null, a string of shortcuts delimited by | or an array of shortcuts
    $modeintThe option mode: One of the InputOption::VALUE_* constants
    $descriptionstring-
    $defaultmixedThe default value (must be null for InputOption::VALUE_NONE)
    - -Return value: static - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function addUsage(string $usage): static; -``` - -
    Add a command usage example, it'll be prefixed with the command name.
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $usagestring-
    - -Return value: static - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function complete(\Symfony\Component\Console\Completion\CompletionInput $input, \Symfony\Component\Console\Completion\CompletionSuggestions $suggestions): void; -``` - -
    Adds suggestions to $suggestions for the current completion input (e.g. option or argument).
    - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $input\Symfony\Component\Console\Completion\CompletionInput-
    $suggestions\Symfony\Component\Console\Completion\CompletionSuggestions-
    - -Return value: void - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function getAliases(): array; -``` - -
    Returns the aliases for the command.
    - -Parameters: not specified - -Return value: array - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function getApplication(): \Symfony\Component\Console\Application|null; -``` - -
    Gets the application instance for this command.
    - -Parameters: not specified - -Return value: \Symfony\Component\Console\Application | null - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public static function getDefaultDescription(): string|null; -``` - - - -Parameters: not specified - -Return value: string | null - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public static function getDefaultName(): string|null; -``` - - - -Parameters: not specified - -Return value: string | null - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function getDefinition(): \Symfony\Component\Console\Input\InputDefinition; -``` - -
    Gets the InputDefinition attached to this Command.
    - -Parameters: not specified - -Return value: \Symfony\Component\Console\Input\InputDefinition - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function getDescription(): string; -``` - -
    Returns the description for the command.
    - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function getHelp(): string; -``` - -
    Returns the help for the command.
    - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function getHelper(string $name): mixed; -``` - -
    Gets a helper instance by name.
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $namestring-
    - -Return value: mixed - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function getHelperSet(): \Symfony\Component\Console\Helper\HelperSet|null; -``` - -
    Gets the helper set.
    - -Parameters: not specified - -Return value: \Symfony\Component\Console\Helper\HelperSet | null - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function getName(): string|null; -``` - -
    Returns the command name.
    - -Parameters: not specified - -Return value: string | null - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function getNativeDefinition(): \Symfony\Component\Console\Input\InputDefinition; -``` - -
    Gets the InputDefinition to be used to create representations of this Command.
    - -Parameters: not specified - -Return value: \Symfony\Component\Console\Input\InputDefinition - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function getProcessedHelp(): string; -``` - -
    Returns the processed help for the command replacing the %command.name% and -%command.full_name% patterns with the real values dynamically.
    - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function getSynopsis(bool $short = false): string; -``` - -
    Returns the synopsis for the command.
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $shortboolWhether to show the short version of the synopsis (with options folded) or not
    - -Return value: string - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function getUsages(): array; -``` - -
    Returns alternative usages of the command.
    - -Parameters: not specified - -Return value: array - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function ignoreValidationErrors(): mixed; -``` - -
    Ignores validation errors.
    - -Parameters: not specified - -Return value: mixed - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function isEnabled(): bool; -``` - -
    Checks whether the command is enabled or not in the current environment.
    - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function isHidden(): bool; -``` - - - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - -
      -
    • # - mergeApplicationDefinition - :warning: Is internal | source code
    • -
    - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function mergeApplicationDefinition(bool $mergeArgs = true): mixed; -``` - -
    Merges the application definition with the command definition.
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $mergeArgsboolWhether to merge or not the Application definition arguments to Command definition arguments
    - -Return value: mixed - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function run(\Symfony\Component\Console\Input\InputInterface $input, \Symfony\Component\Console\Output\OutputInterface $output): int; -``` - -
    Runs the command.
    - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $input\Symfony\Component\Console\Input\InputInterface-
    $output\Symfony\Component\Console\Output\OutputInterface-
    - -Return value: int - - -Throws: - - - -See: - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function setAliases(iterable $aliases): static; -``` - -
    Sets the aliases for the command.
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $aliasesiterableAn array of aliases for the command
    - -Return value: static - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function setApplication(\Symfony\Component\Console\Application $application = null): mixed; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $application\Symfony\Component\Console\Application-
    - -Return value: mixed - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function setCode(callable $code): static; -``` - -
    Sets the code to execute when running this command.
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $codecallableA callable(InputInterface $input, OutputInterface $output)
    - -Return value: static - - -Throws: - - - -See: - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function setDefinition(array|\Symfony\Component\Console\Input\InputDefinition $definition): static; -``` - -
    Sets an array of argument and option instances.
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $definitionarray | \Symfony\Component\Console\Input\InputDefinition-
    - -Return value: static - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function setDescription(string $description): static; -``` - -
    Sets the description for the command.
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $descriptionstring-
    - -Return value: static - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function setHelp(string $help): static; -``` - -
    Sets the help for the command.
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $helpstring-
    - -Return value: static - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function setHelperSet(\Symfony\Component\Console\Helper\HelperSet $helperSet): mixed; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $helperSet\Symfony\Component\Console\Helper\HelperSet-
    - -Return value: mixed - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function setHidden(bool $hidden = true): static; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $hiddenboolWhether or not the command should be hidden from the list of commands
    - -Return value: static - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function setName(string $name): static; -``` - -
    Sets the name of the command.
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $namestring-
    - -Return value: static - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function setProcessTitle(string $title): static; -``` - -
    Sets the process title of the command.
    - -Parameters: - - - - - - - - - - - - -
    NameTypeDescription
    $titlestring -
    -Return value: static
    diff --git a/docs/tech/classes/GenerationErrorsHandler.md b/docs/tech/classes/GenerationErrorsHandler.md index 61c91bbb..e3e5980d 100644 --- a/docs/tech/classes/GenerationErrorsHandler.md +++ b/docs/tech/classes/GenerationErrorsHandler.md @@ -15,7 +15,7 @@ namespace BumbleDocGen\Core\Logger\Handler; final class GenerationErrorsHandler extends \Monolog\Handler\AbstractProcessingHandler ``` -
    Base Handler class providing the Handler structure, including processors and formatters
    + @@ -33,57 +33,12 @@ final class GenerationErrorsHandler extends \Monolog\Handler\AbstractProcessingH

    Methods:

      -
    1. - __destruct -
    2. -
    3. - __sleep -
    4. addRecords
    5. -
    6. - close - - Closes the handler.
    7. -
    8. - getBubble - - Gets the bubbling behavior.
    9. -
    10. - getFormatter - - {@inheritDoc}
    11. -
    12. - getLevel - - Gets minimum logging level at which this handler will be triggered.
    13. getRecords
    14. -
    15. - handle - - Handles a record.
    16. -
    17. - handleBatch - - Handles a set of records at once.
    18. -
    19. - isHandling - - Checks whether the given record will be handled by this handler.
    20. -
    21. - popProcessor - - {@inheritDoc}
    22. -
    23. - pushProcessor - - {@inheritDoc}
    24. -
    25. - reset -
    26. -
    27. - setBubble - - Sets the bubbling behavior.
    28. -
    29. - setFormatter - - {@inheritDoc}
    30. -
    31. - setLevel - - Sets minimum logging level at which this handler will be triggered.
    @@ -103,7 +58,7 @@ final class GenerationErrorsHandler extends \Monolog\Handler\AbstractProcessingH ```php -public function __construct(\BumbleDocGen\Core\Renderer\Context\RendererContext $rendererContext, int|string $level = \Monolog\Logger::WARNING, bool $bubble = true); +public function __construct(\BumbleDocGen\Core\Renderer\Context\RendererContext $rendererContext, mixed $level = \Monolog\Logger::WARNING, bool $bubble = true); ``` @@ -126,65 +81,19 @@ public function __construct(\BumbleDocGen\Core\Renderer\Context\RendererContext $level - int | string - The minimum logging level at which this handler will be triggered + mixed + - $bubble bool - Whether the messages that are handled can bubble up the stack or not + - - -
    -
    - - - -```php -// Implemented in Monolog\Handler\Handler - -public function __destruct(): mixed; -``` - - - -Parameters: not specified - -Return value: mixed - - -
    -
    -
    - - - -```php -// Implemented in Monolog\Handler\Handler - -public function __sleep(): mixed; -``` - - - -Parameters: not specified - -Return value: mixed - -

    @@ -223,98 +132,6 @@ public function addRecords(array $records): void; Return value: void -
    -
    -
    - - - -```php -// Implemented in Monolog\Handler\Handler - -public function close(): void; -``` - -
    Closes the handler.
    - -Parameters: not specified - -Return value: void - - -
    -
    -
    - - - -```php -// Implemented in Monolog\Handler\AbstractHandler - -public function getBubble(): bool; -``` - -
    Gets the bubbling behavior.
    - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - - - -```php -// Implemented in Monolog\Handler\FormattableHandlerTrait - -public function getFormatter(): \Monolog\Formatter\FormatterInterface; -``` - -
    {@inheritDoc}
    - -Parameters: not specified - -Return value: \Monolog\Formatter\FormatterInterface - - -
    -
    -
    - - - -```php -// Implemented in Monolog\Handler\AbstractHandler - -public function getLevel(): int; -``` - -
    Gets minimum logging level at which this handler will be triggered.
    - -Parameters: not specified - -Return value: int - -

    @@ -336,333 +153,6 @@ public function getRecords(): array; Return value: array -
    -
    -
    - - - -```php -// Implemented in Monolog\Handler\AbstractProcessingHandler - -public function handle(array $record): bool; -``` - -
    Handles a record.
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $recordarrayThe record to handle
    - -Return value: bool - - -
    -
    -
    - - - -```php -// Implemented in Monolog\Handler\Handler - -public function handleBatch(array $records): void; -``` - -
    Handles a set of records at once.
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $recordsarrayThe records to handle (an array of record arrays)
    - -Return value: void - - -
    -
    -
    - - - -```php -// Implemented in Monolog\Handler\AbstractHandler - -public function isHandling(array $record): bool; -``` - -
    Checks whether the given record will be handled by this handler.
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $recordarrayPartial log record containing only a level key
    - -Return value: bool - - -
    -
    -
    - - - -```php -// Implemented in Monolog\Handler\ProcessableHandlerTrait - -public function popProcessor(): callable; -``` - -
    {@inheritDoc}
    - -Parameters: not specified - -Return value: callable - - -
    -
    -
    - - - -```php -// Implemented in Monolog\Handler\ProcessableHandlerTrait - -public function pushProcessor(callable $callback): \Monolog\Handler\HandlerInterface; -``` - -
    {@inheritDoc}
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $callbackcallable-
    - -Return value: \Monolog\Handler\HandlerInterface - - -
    -
    -
    - - - -```php -// Implemented in Monolog\Handler\AbstractProcessingHandler - -public function reset(): void; -``` - - - -Parameters: not specified - -Return value: void - - -
    -
    -
    - - - -```php -// Implemented in Monolog\Handler\AbstractHandler - -public function setBubble(bool $bubble): self; -``` - -
    Sets the bubbling behavior.
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $bubblebooltrue means that this handler allows bubbling. - false means that bubbling is not permitted.
    - -Return value: self - - -
    -
    -
    - - - -```php -// Implemented in Monolog\Handler\FormattableHandlerTrait - -public function setFormatter(\Monolog\Formatter\FormatterInterface $formatter): \Monolog\Handler\HandlerInterface; -``` - -
    {@inheritDoc}
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $formatter\Monolog\Formatter\FormatterInterface-
    - -Return value: \Monolog\Handler\HandlerInterface - - -
    -
    -
    - - - -```php -// Implemented in Monolog\Handler\AbstractHandler - -public function setLevel(\Monolog\Handler\Level|\Monolog\Handler\LevelName|\Psr\Log\LogLevel::* $level): self; -``` - -
    Sets minimum logging level at which this handler will be triggered.
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $level\Monolog\Handler\Level | \Monolog\Handler\LevelName | \Psr\Log\LogLevel::*Level or level name
    - -Return value: self - -

    diff --git a/docs/tech/classes/GetClassMethodsBodyCode.md b/docs/tech/classes/GetClassMethodsBodyCode.md index 98395caf..27178fd6 100644 --- a/docs/tech/classes/GetClassMethodsBodyCode.md +++ b/docs/tech/classes/GetClassMethodsBodyCode.md @@ -2,7 +2,7 @@ BumbleDocGen / Technical description of the project / Class map / GetClassMethodsBodyCode

    - GetClassMethodsBodyCode class: + GetClassMethodsBodyCode class:

    @@ -75,7 +75,7 @@ final class GetClassMethodsBodyCode implements \BumbleDocGen\Core\Renderer\Twig\ ```php @@ -112,11 +112,11 @@ public function __construct(\BumbleDocGen\Core\Parser\Entity\RootEntityCollectio ```php -public function __invoke(string $className, array $methodsNames): string|null; +public function __invoke(string $className, array $methodsNames): null|string; ``` @@ -145,14 +145,11 @@ public function __invoke(string $className, array $methodsNames): string|null; -Return value: string | null +Return value: null | string Throws: @@ -228,7 +225,7 @@ public function __invoke(\BumbleDocGen\Core\Parser\Entity\RootEntityCollection $ ```php @@ -249,7 +246,7 @@ public static function getName(): string; ```php diff --git a/docs/tech/classes/GetDocumentedEntityUrl_2.md b/docs/tech/classes/GetDocumentedEntityUrl_2.md index 738c5993..2126708d 100644 --- a/docs/tech/classes/GetDocumentedEntityUrl_2.md +++ b/docs/tech/classes/GetDocumentedEntityUrl_2.md @@ -2,7 +2,7 @@ BumbleDocGen / Technical description of the project / GetDocumentedEntityUrl

    - GetDocumentedEntityUrl class: + GetDocumentedEntityUrl class:

    @@ -91,7 +91,7 @@ The function returns a link to the file MainExtension @@ -106,7 +106,7 @@ The function returns a link to the file MainExtension ```php @@ -158,7 +158,7 @@ public function __construct(\BumbleDocGen\Core\Renderer\RendererHelper $renderer ```php @@ -216,9 +216,6 @@ public function __invoke(\BumbleDocGen\Core\Parser\Entity\RootEntityCollection $
  • \DI\NotFoundException
  • -
  • - \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
  • - @@ -228,7 +225,7 @@ public function __invoke(\BumbleDocGen\Core\Parser\Entity\RootEntityCollection $ ```php @@ -249,7 +246,7 @@ public static function getName(): string; ```php diff --git a/docs/tech/classes/Implode.md b/docs/tech/classes/Implode.md new file mode 100644 index 00000000..e71465b3 --- /dev/null +++ b/docs/tech/classes/Implode.md @@ -0,0 +1,154 @@ + + BumbleDocGen / Technical description of the project / Class map / Implode
    + +

    + Implode class: +

    + + + + + +```php +namespace BumbleDocGen\Core\Renderer\Twig\Filter; + +final class Implode implements \BumbleDocGen\Core\Renderer\Twig\Filter\CustomFilterInterface +``` + +
    Join array elements with a string
    + +See: + + + + + +

    Settings:

    + + + + + + + + + + +
    namevalue
    Filter name:implode
    + + + + + +

    Methods:

    + +
      +
    1. + __invoke +
    2. +
    3. + getName +
    4. +
    5. + getOptions +
    6. +
    + + + + + + + +

    Method details:

    + +
    + + + +```php +public function __invoke(array $elements, string $separator = ', '): string; +``` + + + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $elementsarrayThe array to implode
    $separatorstringElement separator in result string
    + +Return value: string + + +
    +
    +
    + + + +```php +public static function getName(): string; +``` + + + +Parameters: not specified + +Return value: string + + +
    +
    +
    + + + +```php +public static function getOptions(): array; +``` + + + +Parameters: not specified + +Return value: array + + +
    +
    + + \ No newline at end of file diff --git a/docs/tech/classes/InvalidConfigurationParameterException.md b/docs/tech/classes/InvalidConfigurationParameterException.md index 96600ae0..d5a4b912 100644 --- a/docs/tech/classes/InvalidConfigurationParameterException.md +++ b/docs/tech/classes/InvalidConfigurationParameterException.md @@ -12,380 +12,23 @@ ```php namespace BumbleDocGen\Core\Configuration\Exception; -final class InvalidConfigurationParameterException extends \Exception implements \Throwable, \Stringable +final class InvalidConfigurationParameterException extends \Exception ``` -
    Exception is the base class for -all Exceptions.
    -See: - -

    Initialization methods:

    -
      -
    1. - __construct - - Construct the exception. Note: The message is NOT binary safe.
    2. -
    -

    Methods:

    -
      -
    1. - __toString - - String representation of the exception
    2. -
    3. - __wakeup -
    4. -
    5. - getCode - - Gets the Exception code
    6. -
    7. - getFile - - Gets the file in which the exception occurred
    8. -
    9. - getLine - - Gets the line in which the exception occurred
    10. -
    11. - getMessage - - Gets the Exception message
    12. -
    13. - getPrevious - - Returns previous Exception
    14. -
    15. - getTrace - - Gets the stack trace
    16. -
    17. - getTraceAsString - - Gets the stack trace as a string
    18. -
    - -

    Method details:

    - -
    - -
      -
    • # - __construct -
    • -
    - -```php -// Implemented in Exception - -public function __construct(string $message = "", int $code, \Throwable|null $previous = \null); -``` - -
    Construct the exception. Note: The message is NOT binary safe.
    - -Parameters: - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $messagestring[optional] The Exception message to throw.
    $codeint[optional] The Exception code.
    $previous\Throwable | null[optional] The previous throwable used for the exception chaining.
    - - - - -See: - -
    -
    -
    - -
      -
    • # - __toString -
    • -
    - -```php -// Implemented in Exception - -public function __toString(): string; -``` - -
    String representation of the exception
    - -Parameters: not specified - -Return value: string - - - -See: - -
    -
    -
    - -
      -
    • # - __wakeup -
    • -
    - -```php -// Implemented in Exception - -public function __wakeup(): mixed; -``` - - - -Parameters: not specified - -Return value: mixed - - -
    -
    -
    - -
      -
    • # - getCode -
    • -
    - -```php -// Implemented in Exception - -public function getCode(): mixed|int; -``` - -
    Gets the Exception code
    - -Parameters: not specified - -Return value: mixed | int - - - -See: - -
    -
    -
    - -
      -
    • # - getFile -
    • -
    - -```php -// Implemented in Exception - -public function getFile(): string; -``` - -
    Gets the file in which the exception occurred
    - -Parameters: not specified - -Return value: string - - - -See: - -
    -
    -
    - -
      -
    • # - getLine -
    • -
    - -```php -// Implemented in Exception - -public function getLine(): int; -``` - -
    Gets the line in which the exception occurred
    - -Parameters: not specified - -Return value: int - - - -See: - -
    -
    -
    - -
      -
    • # - getMessage -
    • -
    - -```php -// Implemented in Exception - -public function getMessage(): string; -``` - -
    Gets the Exception message
    - -Parameters: not specified - -Return value: string - - - -See: - -
    -
    -
    - -
      -
    • # - getPrevious -
    • -
    - -```php -// Implemented in Exception - -public function getPrevious(): \Throwable|null; -``` - -
    Returns previous Exception
    - -Parameters: not specified - -Return value: \Throwable | null - - - -See: - -
    -
    -
    - -
      -
    • # - getTrace -
    • -
    - -```php -// Implemented in Exception - -public function getTrace(): array; -``` - -
    Gets the stack trace
    - -Parameters: not specified - -Return value: array - - - -See: - -
    -
    -
    - -
      -
    • # - getTraceAsString -
    • -
    - -```php -// Implemented in Exception - -public function getTraceAsString(): string; -``` - -
    Gets the stack trace as a string
    - -Parameters: not specified - -Return value: string - - - -See: - -
    -
    - \ No newline at end of file diff --git a/docs/tech/classes/InvalidConfigurationParameterException_2.md b/docs/tech/classes/InvalidConfigurationParameterException_2.md index 6f1165dc..bdc1a6d9 100644 --- a/docs/tech/classes/InvalidConfigurationParameterException_2.md +++ b/docs/tech/classes/InvalidConfigurationParameterException_2.md @@ -12,380 +12,23 @@ ```php namespace BumbleDocGen\Core\Configuration\Exception; -final class InvalidConfigurationParameterException extends \Exception implements \Throwable, \Stringable +final class InvalidConfigurationParameterException extends \Exception ``` -
    Exception is the base class for -all Exceptions.
    -See: - -

    Initialization methods:

    -
      -
    1. - __construct - - Construct the exception. Note: The message is NOT binary safe.
    2. -
    -

    Methods:

    -
      -
    1. - __toString - - String representation of the exception
    2. -
    3. - __wakeup -
    4. -
    5. - getCode - - Gets the Exception code
    6. -
    7. - getFile - - Gets the file in which the exception occurred
    8. -
    9. - getLine - - Gets the line in which the exception occurred
    10. -
    11. - getMessage - - Gets the Exception message
    12. -
    13. - getPrevious - - Returns previous Exception
    14. -
    15. - getTrace - - Gets the stack trace
    16. -
    17. - getTraceAsString - - Gets the stack trace as a string
    18. -
    - -

    Method details:

    - -
    - -
      -
    • # - __construct -
    • -
    - -```php -// Implemented in Exception - -public function __construct(string $message = "", int $code, \Throwable|null $previous = \null); -``` - -
    Construct the exception. Note: The message is NOT binary safe.
    - -Parameters: - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $messagestring[optional] The Exception message to throw.
    $codeint[optional] The Exception code.
    $previous\Throwable | null[optional] The previous throwable used for the exception chaining.
    - - - - -See: - -
    -
    -
    - -
      -
    • # - __toString -
    • -
    - -```php -// Implemented in Exception - -public function __toString(): string; -``` - -
    String representation of the exception
    - -Parameters: not specified - -Return value: string - - - -See: - -
    -
    -
    - -
      -
    • # - __wakeup -
    • -
    - -```php -// Implemented in Exception - -public function __wakeup(): mixed; -``` - - - -Parameters: not specified - -Return value: mixed - - -
    -
    -
    - -
      -
    • # - getCode -
    • -
    - -```php -// Implemented in Exception - -public function getCode(): mixed|int; -``` - -
    Gets the Exception code
    - -Parameters: not specified - -Return value: mixed | int - - - -See: - -
    -
    -
    - -
      -
    • # - getFile -
    • -
    - -```php -// Implemented in Exception - -public function getFile(): string; -``` - -
    Gets the file in which the exception occurred
    - -Parameters: not specified - -Return value: string - - - -See: - -
    -
    -
    - -
      -
    • # - getLine -
    • -
    - -```php -// Implemented in Exception - -public function getLine(): int; -``` - -
    Gets the line in which the exception occurred
    - -Parameters: not specified - -Return value: int - - - -See: - -
    -
    -
    - -
      -
    • # - getMessage -
    • -
    - -```php -// Implemented in Exception - -public function getMessage(): string; -``` - -
    Gets the Exception message
    - -Parameters: not specified - -Return value: string - - - -See: - -
    -
    -
    - -
      -
    • # - getPrevious -
    • -
    - -```php -// Implemented in Exception - -public function getPrevious(): \Throwable|null; -``` - -
    Returns previous Exception
    - -Parameters: not specified - -Return value: \Throwable | null - - - -See: - -
    -
    -
    - -
      -
    • # - getTrace -
    • -
    - -```php -// Implemented in Exception - -public function getTrace(): array; -``` - -
    Gets the stack trace
    - -Parameters: not specified - -Return value: array - - - -See: - -
    -
    -
    - -
      -
    • # - getTraceAsString -
    • -
    - -```php -// Implemented in Exception - -public function getTraceAsString(): string; -``` - -
    Gets the stack trace as a string
    - -Parameters: not specified - -Return value: string - - - -See: - -
    -
    - \ No newline at end of file diff --git a/docs/tech/classes/LanguageHandlersCollection.md b/docs/tech/classes/LanguageHandlersCollection.md index 476628ec..c10f9b32 100644 --- a/docs/tech/classes/LanguageHandlersCollection.md +++ b/docs/tech/classes/LanguageHandlersCollection.md @@ -12,7 +12,7 @@ ```php namespace BumbleDocGen\LanguageHandler; -final class LanguageHandlersCollection implements \IteratorAggregate, \Traversable +final class LanguageHandlersCollection implements \IteratorAggregate ``` @@ -37,7 +37,7 @@ final class LanguageHandlersCollection implements \IteratorAggregate, \Traversab
  • getIterator - - Retrieve an external iterator
  • + @@ -133,7 +133,7 @@ public static function create(\BumbleDocGen\LanguageHandler\LanguageHandlerInter ```php -public function get(string $key): \BumbleDocGen\LanguageHandler\LanguageHandlerInterface|null; +public function get(string $key): null|\BumbleDocGen\LanguageHandler\LanguageHandlerInterface; ``` @@ -157,7 +157,7 @@ public function get(string $key): \BumbleDocGen\LanguageHandler\LanguageHandlerI -Return value: \BumbleDocGen\LanguageHandler\LanguageHandlerInterface | null +Return value: null | \BumbleDocGen\LanguageHandler\LanguageHandlerInterface @@ -174,26 +174,13 @@ public function get(string $key): \BumbleDocGen\LanguageHandler\LanguageHandlerI public function getIterator(): \Generator; ``` -
    Retrieve an external iterator
    + Parameters: not specified Return value: \Generator -Throws: - - - -See: -
    diff --git a/docs/tech/classes/LastPageCommitter.md b/docs/tech/classes/LastPageCommitter.md index 616a0ad5..c9fbd657 100644 --- a/docs/tech/classes/LastPageCommitter.md +++ b/docs/tech/classes/LastPageCommitter.md @@ -38,7 +38,7 @@ final class LastPageCommitter implements \BumbleDocGen\Core\Plugin\PluginInterfa
  • getSubscribedEvents - - Returns an array of event names this subscriber wants to listen to.
  • + @@ -141,7 +141,7 @@ public function beforeCreatingDocFile(\BumbleDocGen\Core\Plugin\Event\Renderer\B public static function getSubscribedEvents(): array; ``` -
    Returns an array of event names this subscriber wants to listen to.
    + Parameters: not specified diff --git a/docs/tech/classes/LoggableRootEntityCollection.md b/docs/tech/classes/LoggableRootEntityCollection.md index db44b043..d5feff8b 100644 --- a/docs/tech/classes/LoggableRootEntityCollection.md +++ b/docs/tech/classes/LoggableRootEntityCollection.md @@ -12,7 +12,7 @@ ```php namespace BumbleDocGen\Core\Parser\Entity; -abstract class LoggableRootEntityCollection extends \BumbleDocGen\Core\Parser\Entity\RootEntityCollection implements \IteratorAggregate, \Traversable +abstract class LoggableRootEntityCollection extends \BumbleDocGen\Core\Parser\Entity\RootEntityCollection implements \IteratorAggregate ``` @@ -50,7 +50,7 @@ abstract class LoggableRootEntityCollection extends \BumbleDocGen\Core\Parser\En
  • getIterator - - Retrieve an external iterator
  • +
  • getLoadedOrCreateNew
  • @@ -129,7 +129,7 @@ public function clearOperationsLogCollection(): void; ```php -public function findEntity(string $search, bool $useUnsafeKeys = true): \BumbleDocGen\Core\Parser\Entity\RootEntityInterface|null; +public function findEntity(string $search, bool $useUnsafeKeys = true): null|\BumbleDocGen\Core\Parser\Entity\RootEntityInterface; ``` @@ -158,7 +158,7 @@ public function findEntity(string $search, bool $useUnsafeKeys = true): \BumbleD -Return value: \BumbleDocGen\Core\Parser\Entity\RootEntityInterface | null +Return value: null | \BumbleDocGen\Core\Parser\Entity\RootEntityInterface @@ -172,7 +172,7 @@ public function findEntity(string $search, bool $useUnsafeKeys = true): \BumbleD ```php -public function get(string $objectName): \BumbleDocGen\Core\Parser\Entity\RootEntityInterface|null; +public function get(string $objectName): null|\BumbleDocGen\Core\Parser\Entity\RootEntityInterface; ``` @@ -196,7 +196,7 @@ public function get(string $objectName): \BumbleDocGen\Core\Parser\Entity\RootEn -Return value: \BumbleDocGen\Core\Parser\Entity\RootEntityInterface | null +Return value: null | \BumbleDocGen\Core\Parser\Entity\RootEntityInterface @@ -287,26 +287,13 @@ public function getEntityLinkData(string $rawLink, string|null $defaultEntityNam public function getIterator(): \Generator; ``` -
    Retrieve an external iterator
    + Parameters: not specified Return value: \Generator -Throws: - - - -See: -
    diff --git a/docs/tech/classes/MainExtension.md b/docs/tech/classes/MainExtension.md index 4db33a6d..ac6c0d97 100644 --- a/docs/tech/classes/MainExtension.md +++ b/docs/tech/classes/MainExtension.md @@ -42,18 +42,6 @@ final class MainExtension extends \Twig\Extension\AbstractExtension
  • getLanguageHandlersCollection
  • -
  • - getNodeVisitors - - Returns the node visitor instances to add to the existing list.
  • -
  • - getOperators - - Returns a list of operators to add to the existing list.
  • -
  • - getTests - - Returns a list of tests to add to the existing list.
  • -
  • - getTokenParsers - - Returns the token parser instances to add to the existing list.
  • setDefaultFilters
  • @@ -187,98 +175,6 @@ public function getLanguageHandlersCollection(): \BumbleDocGen\LanguageHandler\L -
    -
    -
    - - - -```php -// Implemented in Twig\Extension\AbstractExtension - -public function getNodeVisitors(): \Twig\NodeVisitor\NodeVisitorInterface[]; -``` - -
    Returns the node visitor instances to add to the existing list.
    - -Parameters: not specified - -Return value: \Twig\NodeVisitor\NodeVisitorInterface[] - - -
    -
    -
    - - - -```php -// Implemented in Twig\Extension\AbstractExtension - -public function getOperators(): array[]; -``` - -
    Returns a list of operators to add to the existing list.
    - -Parameters: not specified - -Return value: array[] - - -
    -
    -
    - - - -```php -// Implemented in Twig\Extension\AbstractExtension - -public function getTests(): \Twig\TwigTest[]; -``` - -
    Returns a list of tests to add to the existing list.
    - -Parameters: not specified - -Return value: \Twig\TwigTest[] - - -
    -
    -
    - - - -```php -// Implemented in Twig\Extension\AbstractExtension - -public function getTokenParsers(): \Twig\TokenParser\TokenParserInterface[]; -``` - -
    Returns the token parser instances to add to the existing list.
    - -Parameters: not specified - -Return value: \Twig\TokenParser\TokenParserInterface[] - -

    diff --git a/docs/tech/classes/MethodEntity.md b/docs/tech/classes/MethodEntity.md index fbb57e47..42fb0dbb 100644 --- a/docs/tech/classes/MethodEntity.md +++ b/docs/tech/classes/MethodEntity.md @@ -2,7 +2,7 @@ BumbleDocGen / Technical description of the project / Class map / MethodEntity

    - MethodEntity class: + MethodEntity class:

    @@ -39,6 +39,9 @@ class MethodEntity extends \BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseE
  • getAbsoluteFileName - Returns the absolute path to a file if it can be retrieved and if the file is in the project directory
  • +
  • + getAst +
  • getBodyCode
  • @@ -48,6 +51,9 @@ class MethodEntity extends \BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseE
  • getCachedEntityDependencies
  • +
  • + getCurrentRootEntity +
  • getDescription
  • @@ -99,9 +105,6 @@ class MethodEntity extends \BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseE
  • getImplementingClassName
  • -
  • - getImplementingReflectionClass -
  • getModifiersString
  • @@ -126,6 +129,9 @@ class MethodEntity extends \BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseE
  • getPrototype
  • +
  • + getRelativeFileName +
  • getReturnType
  • @@ -210,6 +216,25 @@ class MethodEntity extends \BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseE +

    Constants:

    + @@ -222,11 +247,11 @@ class MethodEntity extends \BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseE ```php -public function __construct(\BumbleDocGen\Core\Configuration\Configuration $configuration, \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity $classEntity, \BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper $parserHelper, \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache $localObjectCache, \Psr\Log\LoggerInterface $logger, \PhpParser\PrettyPrinter\Standard $astPrinter, string $methodName, string $declaringClassName, string $implementingClassName); +public function __construct(\BumbleDocGen\Core\Configuration\Configuration $configuration, \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity $classEntity, \BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper $parserHelper, \PhpParser\PrettyPrinter\Standard $astPrinter, \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache $localObjectCache, \Psr\Log\LoggerInterface $logger, string $methodName, string $implementingClassName); ``` @@ -256,6 +281,11 @@ public function __construct(\BumbleDocGen\Core\Configuration\Configuration $conf $parserHelper \BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper - + + + $astPrinter + \PhpParser\PrettyPrinter\Standard + - $localObjectCache @@ -266,21 +296,11 @@ public function __construct(\BumbleDocGen\Core\Configuration\Configuration $conf $logger \Psr\Log\LoggerInterface - - - - $astPrinter - \PhpParser\PrettyPrinter\Standard - - $methodName string - - - - $declaringClassName - string - - $implementingClassName @@ -299,7 +319,7 @@ public function __construct(\BumbleDocGen\Core\Configuration\Configuration $conf ```php @@ -332,20 +352,48 @@ public function entityCacheIsOutdated(): bool; ```php // Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity -public function getAbsoluteFileName(): string|null; +public function getAbsoluteFileName(): null|string; ```
    Returns the absolute path to a file if it can be retrieved and if the file is in the project directory
    Parameters: not specified -Return value: string | null +Return value: null | string + + +Throws: + + +
    +
    +
    + + + +```php +public function getAst(): \PhpParser\Node\Stmt\ClassMethod; +``` + + + +Parameters: not specified + +Return value: \PhpParser\Node\Stmt\ClassMethod Throws: @@ -362,7 +410,7 @@ public function getAbsoluteFileName(): string|null; ```php @@ -378,9 +426,6 @@ public function getBodyCode(): string; Throws: +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getCurrentRootEntity(): null|\BumbleDocGen\Core\Parser\Entity\RootEntityInterface; +``` + + + +Parameters: not specified + +Return value: null | \BumbleDocGen\Core\Parser\Entity\RootEntityInterface + +

    @@ -446,7 +514,7 @@ public function getCachedEntityDependencies(): array; ```php @@ -468,9 +536,6 @@ public function getDescription(): string;
  • \DI\DependencyException
  • -
  • - \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
  • -
  • \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • @@ -483,7 +548,7 @@ public function getDescription(): string; ```php @@ -516,7 +581,7 @@ public function getDescriptionLinks(): array; ```php @@ -552,9 +617,6 @@ public function getDocBlock(bool $recursive = true): \phpDocumentor\Reflection\D
  • \DI\DependencyException
  • -
  • - \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
  • -
  • \DI\NotFoundException
  • @@ -570,7 +632,7 @@ public function getDocBlock(bool $recursive = true): \phpDocumentor\Reflection\D ```php @@ -586,9 +648,6 @@ public function getDocComment(): string; Throws:
    -
    -
    - - - -```php -public function getImplementingReflectionClass(): \Roave\BetterReflection\Reflection\ReflectionClass; -``` - - - -Parameters: not specified - -Return value: \Roave\BetterReflection\Reflection\ReflectionClass - - -Throws: - -

    @@ -1025,7 +1035,7 @@ public function getImplementingReflectionClass(): \Roave\BetterReflection\Reflec ```php @@ -1041,9 +1051,6 @@ public function getModifiersString(): string; Throws:

    @@ -352,7 +339,7 @@ public function isEmpty(): bool; ```php @@ -368,9 +355,6 @@ public function loadMethodEntities(): void; Throws:
      -
    • - \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
    • -
    • \DI\DependencyException
    • @@ -429,11 +413,11 @@ public function remove(string $objectName): void; ```php -public function unsafeGet(string $objectName): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\MethodEntity|null; +public function unsafeGet(string $objectName): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\MethodEntity; ``` @@ -457,7 +441,7 @@ public function unsafeGet(string $objectName): \BumbleDocGen\LanguageHandler\Php -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\MethodEntity | null +Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\MethodEntity Throws: @@ -465,9 +449,6 @@ public function unsafeGet(string $objectName): \BumbleDocGen\LanguageHandler\Php
    • \DI\NotFoundException
    • -
    • - \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
    • -
    • \DI\DependencyException
    • diff --git a/docs/tech/classes/MethodEntityInterface.md b/docs/tech/classes/MethodEntityInterface.md index bb73ee87..ec25ec7e 100644 --- a/docs/tech/classes/MethodEntityInterface.md +++ b/docs/tech/classes/MethodEntityInterface.md @@ -12,7 +12,7 @@ ```php namespace BumbleDocGen\LanguageHandler\Php\Parser\Entity; -interface MethodEntityInterface extends \\BumbleDocGen\Core\Parser\Entity\EntityInterface implements \BumbleDocGen\Core\Parser\Entity\EntityInterface +interface MethodEntityInterface extends \BumbleDocGen\Core\Parser\Entity\EntityInterface ``` @@ -142,14 +142,14 @@ public function entityCacheIsOutdated(): bool; ```php // Implemented in BumbleDocGen\Core\Parser\Entity\EntityInterface -public function getAbsoluteFileName(): string|null; +public function getAbsoluteFileName(): null|string; ```
      Returns the absolute path to a file if it can be retrieved and if the file is in the project directory
      Parameters: not specified -Return value: string | null +Return value: null | string
    @@ -226,14 +226,14 @@ public function getEndLine(): int; ```php -public function getFileName(): string|null; +public function getFileName(): null|string; ```
    Returns the relative path to a file if it can be retrieved and if the file is in the project directory
    Parameters: not specified -Return value: string | null +Return value: null | string diff --git a/docs/tech/classes/NodeValueCompiler.md b/docs/tech/classes/NodeValueCompiler.md new file mode 100644 index 00000000..81890289 --- /dev/null +++ b/docs/tech/classes/NodeValueCompiler.md @@ -0,0 +1,96 @@ + + BumbleDocGen / Technical description of the project / Class map / NodeValueCompiler
    + +

    + NodeValueCompiler class: +

    + + + + + +```php +namespace BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpParser; + +final class NodeValueCompiler +``` + + + + + + + + + +

    Methods:

    + +
      +
    1. + compile + - Compile an expression from a node into a value if it possible
    2. +
    + + + + + + + +

    Method details:

    + +
    + + + +```php +public static function compile(\PhpParser\Node\Stmt\Expression|\PhpParser\Node $node, \BumbleDocGen\LanguageHandler\Php\Parser\Entity\MethodEntity|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\PropertyEntity|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ConstantEntity|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity $entity): mixed; +``` + +
    Compile an expression from a node into a value if it possible
    + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $node\PhpParser\Node\Stmt\Expression | \PhpParser\Node-
    $entity\BumbleDocGen\LanguageHandler\Php\Parser\Entity\MethodEntity | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PropertyEntity | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ConstantEntity | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity-
    + +Return value: mixed + + +Throws: + + +
    +
    + + \ No newline at end of file diff --git a/docs/tech/classes/ObjectNotFoundException.md b/docs/tech/classes/ObjectNotFoundException.md index 0c7b664c..f9062fa3 100644 --- a/docs/tech/classes/ObjectNotFoundException.md +++ b/docs/tech/classes/ObjectNotFoundException.md @@ -12,380 +12,23 @@ ```php namespace BumbleDocGen\Core\Cache\LocalCache\Exception; -final class ObjectNotFoundException extends \Exception implements \Throwable, \Stringable +final class ObjectNotFoundException extends \Exception ``` -
    Exception is the base class for -all Exceptions.
    -See: - -

    Initialization methods:

    -
      -
    1. - __construct - - Construct the exception. Note: The message is NOT binary safe.
    2. -
    -

    Methods:

    -
      -
    1. - __toString - - String representation of the exception
    2. -
    3. - __wakeup -
    4. -
    5. - getCode - - Gets the Exception code
    6. -
    7. - getFile - - Gets the file in which the exception occurred
    8. -
    9. - getLine - - Gets the line in which the exception occurred
    10. -
    11. - getMessage - - Gets the Exception message
    12. -
    13. - getPrevious - - Returns previous Exception
    14. -
    15. - getTrace - - Gets the stack trace
    16. -
    17. - getTraceAsString - - Gets the stack trace as a string
    18. -
    - -

    Method details:

    - -
    - -
      -
    • # - __construct -
    • -
    - -```php -// Implemented in Exception - -public function __construct(string $message = "", int $code, \Throwable|null $previous = \null); -``` - -
    Construct the exception. Note: The message is NOT binary safe.
    - -Parameters: - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $messagestring[optional] The Exception message to throw.
    $codeint[optional] The Exception code.
    $previous\Throwable | null[optional] The previous throwable used for the exception chaining.
    - - - - -See: - -
    -
    -
    - -
      -
    • # - __toString -
    • -
    - -```php -// Implemented in Exception - -public function __toString(): string; -``` - -
    String representation of the exception
    - -Parameters: not specified - -Return value: string - - - -See: - -
    -
    -
    - -
      -
    • # - __wakeup -
    • -
    - -```php -// Implemented in Exception - -public function __wakeup(): mixed; -``` - - - -Parameters: not specified - -Return value: mixed - - -
    -
    -
    - -
      -
    • # - getCode -
    • -
    - -```php -// Implemented in Exception - -public function getCode(): mixed|int; -``` - -
    Gets the Exception code
    - -Parameters: not specified - -Return value: mixed | int - - - -See: - -
    -
    -
    - -
      -
    • # - getFile -
    • -
    - -```php -// Implemented in Exception - -public function getFile(): string; -``` - -
    Gets the file in which the exception occurred
    - -Parameters: not specified - -Return value: string - - - -See: - -
    -
    -
    - -
      -
    • # - getLine -
    • -
    - -```php -// Implemented in Exception - -public function getLine(): int; -``` - -
    Gets the line in which the exception occurred
    - -Parameters: not specified - -Return value: int - - - -See: - -
    -
    -
    - -
      -
    • # - getMessage -
    • -
    - -```php -// Implemented in Exception - -public function getMessage(): string; -``` - -
    Gets the Exception message
    - -Parameters: not specified - -Return value: string - - - -See: - -
    -
    -
    - -
      -
    • # - getPrevious -
    • -
    - -```php -// Implemented in Exception - -public function getPrevious(): \Throwable|null; -``` - -
    Returns previous Exception
    - -Parameters: not specified - -Return value: \Throwable | null - - - -See: - -
    -
    -
    - -
      -
    • # - getTrace -
    • -
    - -```php -// Implemented in Exception - -public function getTrace(): array; -``` - -
    Gets the stack trace
    - -Parameters: not specified - -Return value: array - - - -See: - -
    -
    -
    - -
      -
    • # - getTraceAsString -
    • -
    - -```php -// Implemented in Exception - -public function getTraceAsString(): string; -``` - -
    Gets the stack trace as a string
    - -Parameters: not specified - -Return value: string - - - -See: - -
    -
    - \ No newline at end of file diff --git a/docs/tech/classes/ObjectNotFoundException_2.md b/docs/tech/classes/ObjectNotFoundException_2.md index 675bfc47..65ac0f00 100644 --- a/docs/tech/classes/ObjectNotFoundException_2.md +++ b/docs/tech/classes/ObjectNotFoundException_2.md @@ -12,380 +12,23 @@ ```php namespace BumbleDocGen\Core\Cache\LocalCache\Exception; -final class ObjectNotFoundException extends \Exception implements \Throwable, \Stringable +final class ObjectNotFoundException extends \Exception ``` -
    Exception is the base class for -all Exceptions.
    -See: - -

    Initialization methods:

    -
      -
    1. - __construct - - Construct the exception. Note: The message is NOT binary safe.
    2. -
    -

    Methods:

    -
      -
    1. - __toString - - String representation of the exception
    2. -
    3. - __wakeup -
    4. -
    5. - getCode - - Gets the Exception code
    6. -
    7. - getFile - - Gets the file in which the exception occurred
    8. -
    9. - getLine - - Gets the line in which the exception occurred
    10. -
    11. - getMessage - - Gets the Exception message
    12. -
    13. - getPrevious - - Returns previous Exception
    14. -
    15. - getTrace - - Gets the stack trace
    16. -
    17. - getTraceAsString - - Gets the stack trace as a string
    18. -
    - -

    Method details:

    - -
    - -
      -
    • # - __construct -
    • -
    - -```php -// Implemented in Exception - -public function __construct(string $message = "", int $code, \Throwable|null $previous = \null); -``` - -
    Construct the exception. Note: The message is NOT binary safe.
    - -Parameters: - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $messagestring[optional] The Exception message to throw.
    $codeint[optional] The Exception code.
    $previous\Throwable | null[optional] The previous throwable used for the exception chaining.
    - - - - -See: - -
    -
    -
    - -
      -
    • # - __toString -
    • -
    - -```php -// Implemented in Exception - -public function __toString(): string; -``` - -
    String representation of the exception
    - -Parameters: not specified - -Return value: string - - - -See: - -
    -
    -
    - -
      -
    • # - __wakeup -
    • -
    - -```php -// Implemented in Exception - -public function __wakeup(): mixed; -``` - - - -Parameters: not specified - -Return value: mixed - - -
    -
    -
    - -
      -
    • # - getCode -
    • -
    - -```php -// Implemented in Exception - -public function getCode(): mixed|int; -``` - -
    Gets the Exception code
    - -Parameters: not specified - -Return value: mixed | int - - - -See: - -
    -
    -
    - -
      -
    • # - getFile -
    • -
    - -```php -// Implemented in Exception - -public function getFile(): string; -``` - -
    Gets the file in which the exception occurred
    - -Parameters: not specified - -Return value: string - - - -See: - -
    -
    -
    - -
      -
    • # - getLine -
    • -
    - -```php -// Implemented in Exception - -public function getLine(): int; -``` - -
    Gets the line in which the exception occurred
    - -Parameters: not specified - -Return value: int - - - -See: - -
    -
    -
    - -
      -
    • # - getMessage -
    • -
    - -```php -// Implemented in Exception - -public function getMessage(): string; -``` - -
    Gets the Exception message
    - -Parameters: not specified - -Return value: string - - - -See: - -
    -
    -
    - -
      -
    • # - getPrevious -
    • -
    - -```php -// Implemented in Exception - -public function getPrevious(): \Throwable|null; -``` - -
    Returns previous Exception
    - -Parameters: not specified - -Return value: \Throwable | null - - - -See: - -
    -
    -
    - -
      -
    • # - getTrace -
    • -
    - -```php -// Implemented in Exception - -public function getTrace(): array; -``` - -
    Gets the stack trace
    - -Parameters: not specified - -Return value: array - - - -See: - -
    -
    -
    - -
      -
    • # - getTraceAsString -
    • -
    - -```php -// Implemented in Exception - -public function getTraceAsString(): string; -``` - -
    Gets the stack trace as a string
    - -Parameters: not specified - -Return value: string - - - -See: - -
    -
    - \ No newline at end of file diff --git a/docs/tech/classes/OnAddClassEntityToCollection.md b/docs/tech/classes/OnAddClassEntityToCollection.md index 3b252cc8..50acb4e1 100644 --- a/docs/tech/classes/OnAddClassEntityToCollection.md +++ b/docs/tech/classes/OnAddClassEntityToCollection.md @@ -42,12 +42,6 @@ final class OnAddClassEntityToCollection extends \Symfony\Contracts\EventDispatc
  • getUniqueExecutionId
  • -
  • - isPropagationStopped - - Is propagation stopped?
  • -
  • - stopPropagation - - Stops the propagation of the event to further event listeners.
  • @@ -161,52 +155,6 @@ public function getUniqueExecutionId(): string; Return value: string - -
    -
    - - - -```php -// Implemented in Symfony\Contracts\EventDispatcher\Event - -public function isPropagationStopped(): bool; -``` - -
    Is propagation stopped?
    - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Contracts\EventDispatcher\Event - -public function stopPropagation(): void; -``` - -
    Stops the propagation of the event to further event listeners.
    - -Parameters: not specified - -Return value: void - -

    diff --git a/docs/tech/classes/OnCheckIsClassEntityCanBeLoad.md b/docs/tech/classes/OnCheckIsClassEntityCanBeLoad.md index 806ad056..cf664587 100644 --- a/docs/tech/classes/OnCheckIsClassEntityCanBeLoad.md +++ b/docs/tech/classes/OnCheckIsClassEntityCanBeLoad.md @@ -15,7 +15,7 @@ namespace BumbleDocGen\LanguageHandler\Php\Plugin\Event\Entity; final class OnCheckIsClassEntityCanBeLoad extends \Symfony\Contracts\EventDispatcher\Event ``` -
    Event is the base class for classes containing event data.
    + @@ -42,12 +42,6 @@ final class OnCheckIsClassEntityCanBeLoad extends \Symfony\Contracts\EventDispat
  • isClassCanBeLoad
  • -
  • - isPropagationStopped - - Is propagation stopped?
  • -
  • - stopPropagation - - Stops the propagation of the event to further event listeners.
  • @@ -175,52 +169,6 @@ public function isClassCanBeLoad(): bool; Return value: bool - -
    -
    - - - -```php -// Implemented in Symfony\Contracts\EventDispatcher\Event - -public function isPropagationStopped(): bool; -``` - -
    Is propagation stopped?
    - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Contracts\EventDispatcher\Event - -public function stopPropagation(): void; -``` - -
    Stops the propagation of the event to further event listeners.
    - -Parameters: not specified - -Return value: void - -

    diff --git a/docs/tech/classes/OnCreateDocumentedEntityWrapper.md b/docs/tech/classes/OnCreateDocumentedEntityWrapper.md index 0e8cdba4..2b67bd7a 100644 --- a/docs/tech/classes/OnCreateDocumentedEntityWrapper.md +++ b/docs/tech/classes/OnCreateDocumentedEntityWrapper.md @@ -36,12 +36,6 @@ final class OnCreateDocumentedEntityWrapper extends \Symfony\Contracts\EventDisp
  • getDocumentedEntityWrapper
  • -
  • - isPropagationStopped - - Is propagation stopped?
  • -
  • - stopPropagation - - Stops the propagation of the event to further event listeners.
  • @@ -108,52 +102,6 @@ public function getDocumentedEntityWrapper(): \BumbleDocGen\Core\Renderer\Contex Return value: \BumbleDocGen\Core\Renderer\Context\DocumentedEntityWrapper - -
    -
    - - - -```php -// Implemented in Symfony\Contracts\EventDispatcher\Event - -public function isPropagationStopped(): bool; -``` - -
    Is propagation stopped?
    - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Contracts\EventDispatcher\Event - -public function stopPropagation(): void; -``` - -
    Stops the propagation of the event to further event listeners.
    - -Parameters: not specified - -Return value: void - -

    diff --git a/docs/tech/classes/OnGetProjectTemplatesDirs.md b/docs/tech/classes/OnGetProjectTemplatesDirs.md index 1a3e4e7a..92f0d160 100644 --- a/docs/tech/classes/OnGetProjectTemplatesDirs.md +++ b/docs/tech/classes/OnGetProjectTemplatesDirs.md @@ -39,12 +39,6 @@ final class OnGetProjectTemplatesDirs extends \Symfony\Contracts\EventDispatcher
  • getTemplatesDirs
  • -
  • - isPropagationStopped - - Is propagation stopped?
  • -
  • - stopPropagation - - Stops the propagation of the event to further event listeners.
  • @@ -149,52 +143,6 @@ public function getTemplatesDirs(): array; Return value: array - -
    -
    - - - -```php -// Implemented in Symfony\Contracts\EventDispatcher\Event - -public function isPropagationStopped(): bool; -``` - -
    Is propagation stopped?
    - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Contracts\EventDispatcher\Event - -public function stopPropagation(): void; -``` - -
    Stops the propagation of the event to further event listeners.
    - -Parameters: not specified - -Return value: void - -

    diff --git a/docs/tech/classes/OnGetTemplatePathByRelativeDocPath.md b/docs/tech/classes/OnGetTemplatePathByRelativeDocPath.md index 289c6f8a..f4e148cb 100644 --- a/docs/tech/classes/OnGetTemplatePathByRelativeDocPath.md +++ b/docs/tech/classes/OnGetTemplatePathByRelativeDocPath.md @@ -39,15 +39,9 @@ final class OnGetTemplatePathByRelativeDocPath extends \Symfony\Contracts\EventD
  • getTemplateName
  • -
  • - isPropagationStopped - - Is propagation stopped?
  • setCustomTemplateFilePath
  • -
  • - stopPropagation - - Stops the propagation of the event to further event listeners.
  • @@ -104,14 +98,14 @@ public function __construct(string $templateName); ```php -public function getCustomTemplateFilePath(): string|null; +public function getCustomTemplateFilePath(): null|string; ``` Parameters: not specified -Return value: string | null +Return value: null | string @@ -135,29 +129,6 @@ public function getTemplateName(): string; Return value: string - -
    -
    - - - -```php -// Implemented in Symfony\Contracts\EventDispatcher\Event - -public function isPropagationStopped(): bool; -``` - -
    Is propagation stopped?
    - -Parameters: not specified - -Return value: bool - -

    @@ -196,29 +167,6 @@ public function setCustomTemplateFilePath(string|null $customTemplateFilePath): Return value: void -
    -
    -
    - - - -```php -// Implemented in Symfony\Contracts\EventDispatcher\Event - -public function stopPropagation(): void; -``` - -
    Stops the propagation of the event to further event listeners.
    - -Parameters: not specified - -Return value: void - -

    diff --git a/docs/tech/classes/OnGettingResourceLink.md b/docs/tech/classes/OnGettingResourceLink.md index 62eccd7b..7972d9c9 100644 --- a/docs/tech/classes/OnGettingResourceLink.md +++ b/docs/tech/classes/OnGettingResourceLink.md @@ -39,15 +39,9 @@ final class OnGettingResourceLink extends \Symfony\Contracts\EventDispatcher\Eve
  • getResourceUrl
  • -
  • - isPropagationStopped - - Is propagation stopped?
  • setResourceUrl
  • -
  • - stopPropagation - - Stops the propagation of the event to further event listeners.
  • @@ -125,37 +119,14 @@ public function getResourceName(): string; ```php -public function getResourceUrl(): string|null; +public function getResourceUrl(): null|string; ``` Parameters: not specified -Return value: string | null - - - -
    -
    - - - -```php -// Implemented in Symfony\Contracts\EventDispatcher\Event - -public function isPropagationStopped(): bool; -``` - -
    Is propagation stopped?
    - -Parameters: not specified - -Return value: bool +Return value: null | string
    @@ -196,29 +167,6 @@ public function setResourceUrl(string|null $resourceUrl): void; Return value: void - -
    -
    - - - -```php -// Implemented in Symfony\Contracts\EventDispatcher\Event - -public function stopPropagation(): void; -``` - -
    Stops the propagation of the event to further event listeners.
    - -Parameters: not specified - -Return value: void - -

    diff --git a/docs/tech/classes/OnLoadEntityDocPluginContent.md b/docs/tech/classes/OnLoadEntityDocPluginContent.md index 7ac5ca98..ee63f5ab 100644 --- a/docs/tech/classes/OnLoadEntityDocPluginContent.md +++ b/docs/tech/classes/OnLoadEntityDocPluginContent.md @@ -54,12 +54,6 @@ See:
  • getEntity
  • -
  • - isPropagationStopped - - Is propagation stopped?
  • -
  • - stopPropagation - - Stops the propagation of the event to further event listeners.
  • @@ -237,52 +231,6 @@ public function getEntity(): \BumbleDocGen\Core\Parser\Entity\RootEntityInterfac Return value: \BumbleDocGen\Core\Parser\Entity\RootEntityInterface - -
    -
    - - - -```php -// Implemented in Symfony\Contracts\EventDispatcher\Event - -public function isPropagationStopped(): bool; -``` - -
    Is propagation stopped?
    - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Contracts\EventDispatcher\Event - -public function stopPropagation(): void; -``` - -
    Stops the propagation of the event to further event listeners.
    - -Parameters: not specified - -Return value: void - -

    diff --git a/docs/tech/classes/OnLoadSourceLocatorsCollection.md b/docs/tech/classes/OnLoadSourceLocatorsCollection.md index 35f2157d..41627325 100644 --- a/docs/tech/classes/OnLoadSourceLocatorsCollection.md +++ b/docs/tech/classes/OnLoadSourceLocatorsCollection.md @@ -36,12 +36,6 @@ final class OnLoadSourceLocatorsCollection extends \Symfony\Contracts\EventDispa
  • getSourceLocatorsCollection
  • -
  • - isPropagationStopped - - Is propagation stopped?
  • -
  • - stopPropagation - - Stops the propagation of the event to further event listeners.
  • @@ -108,52 +102,6 @@ public function getSourceLocatorsCollection(): \BumbleDocGen\Core\Parser\SourceL Return value: \BumbleDocGen\Core\Parser\SourceLocator\SourceLocatorsCollection - -
    -
    - - - -```php -// Implemented in Symfony\Contracts\EventDispatcher\Event - -public function isPropagationStopped(): bool; -``` - -
    Is propagation stopped?
    - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Contracts\EventDispatcher\Event - -public function stopPropagation(): void; -``` - -
    Stops the propagation of the event to further event listeners.
    - -Parameters: not specified - -Return value: void - -

    diff --git a/docs/tech/classes/OperationsCollection.md b/docs/tech/classes/OperationsCollection.md index 60732bab..3e72c8ac 100644 --- a/docs/tech/classes/OperationsCollection.md +++ b/docs/tech/classes/OperationsCollection.md @@ -12,7 +12,7 @@ ```php namespace BumbleDocGen\Core\Parser\Entity\CollectionLogOperation; -final class OperationsCollection implements \IteratorAggregate, \Traversable +final class OperationsCollection implements \IteratorAggregate ``` @@ -37,7 +37,7 @@ final class OperationsCollection implements \IteratorAggregate, \Traversable
  • getIterator - - Retrieve an external iterator
  • +
  • isFoundEntitiesCacheOutdated
  • @@ -163,26 +163,13 @@ public function add(\BumbleDocGen\Core\Parser\Entity\CollectionLogOperation\Oper public function getIterator(): \Traversable; ``` -
    Retrieve an external iterator
    + Parameters: not specified Return value: \Traversable -Throws: - - - -See: -
    diff --git a/docs/tech/classes/PageHtmlLinkerPlugin.md b/docs/tech/classes/PageHtmlLinkerPlugin.md index 7b41425e..786801d2 100644 --- a/docs/tech/classes/PageHtmlLinkerPlugin.md +++ b/docs/tech/classes/PageHtmlLinkerPlugin.md @@ -68,7 +68,7 @@ final class PageHtmlLinkerPlugin extends \BumbleDocGen\Core\Plugin\CorePlugin\Pa
  • getSubscribedEvents - - Returns an array of event names this subscriber wants to listen to.
  • + @@ -84,7 +84,7 @@ final class PageHtmlLinkerPlugin extends \BumbleDocGen\Core\Plugin\CorePlugin\Pa ```php @@ -138,7 +138,7 @@ public function __construct(\BumbleDocGen\Core\Renderer\Breadcrumbs\BreadcrumbsH ```php @@ -179,9 +179,6 @@ public function beforeCreatingDocFile(\BumbleDocGen\Core\Plugin\Event\Renderer\B
  • \DI\DependencyException
  • -
  • - \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
  • -
  • \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • @@ -194,7 +191,7 @@ public function beforeCreatingDocFile(\BumbleDocGen\Core\Plugin\Event\Renderer\B ```php @@ -203,7 +200,7 @@ public function beforeCreatingDocFile(\BumbleDocGen\Core\Plugin\Event\Renderer\B public static function getSubscribedEvents(): array; ``` -
    Returns an array of event names this subscriber wants to listen to.
    + Parameters: not specified diff --git a/docs/tech/classes/PageLinkerPlugin.md b/docs/tech/classes/PageLinkerPlugin.md index b09021e6..06e9fea3 100644 --- a/docs/tech/classes/PageLinkerPlugin.md +++ b/docs/tech/classes/PageLinkerPlugin.md @@ -68,7 +68,7 @@ final class PageLinkerPlugin extends \BumbleDocGen\Core\Plugin\CorePlugin\PageLi
  • getSubscribedEvents - - Returns an array of event names this subscriber wants to listen to.
  • + @@ -84,7 +84,7 @@ final class PageLinkerPlugin extends \BumbleDocGen\Core\Plugin\CorePlugin\PageLi ```php @@ -138,7 +138,7 @@ public function __construct(\BumbleDocGen\Core\Renderer\Breadcrumbs\BreadcrumbsH ```php @@ -179,9 +179,6 @@ public function beforeCreatingDocFile(\BumbleDocGen\Core\Plugin\Event\Renderer\B
  • \DI\DependencyException
  • -
  • - \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
  • -
  • \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • @@ -194,7 +191,7 @@ public function beforeCreatingDocFile(\BumbleDocGen\Core\Plugin\Event\Renderer\B ```php @@ -203,7 +200,7 @@ public function beforeCreatingDocFile(\BumbleDocGen\Core\Plugin\Event\Renderer\B public static function getSubscribedEvents(): array; ``` -
    Returns an array of event names this subscriber wants to listen to.
    + Parameters: not specified diff --git a/docs/tech/classes/PageRstLinkerPlugin.md b/docs/tech/classes/PageRstLinkerPlugin.md index 02047850..7f3e3d27 100644 --- a/docs/tech/classes/PageRstLinkerPlugin.md +++ b/docs/tech/classes/PageRstLinkerPlugin.md @@ -58,7 +58,7 @@ final class PageRstLinkerPlugin extends \BumbleDocGen\Core\Plugin\CorePlugin\Pag
  • getSubscribedEvents - - Returns an array of event names this subscriber wants to listen to.
  • + @@ -74,7 +74,7 @@ final class PageRstLinkerPlugin extends \BumbleDocGen\Core\Plugin\CorePlugin\Pag ```php @@ -128,7 +128,7 @@ public function __construct(\BumbleDocGen\Core\Renderer\Breadcrumbs\BreadcrumbsH ```php @@ -169,9 +169,6 @@ public function beforeCreatingDocFile(\BumbleDocGen\Core\Plugin\Event\Renderer\B
  • \DI\DependencyException
  • -
  • - \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
  • -
  • \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • @@ -184,7 +181,7 @@ public function beforeCreatingDocFile(\BumbleDocGen\Core\Plugin\Event\Renderer\B ```php @@ -193,7 +190,7 @@ public function beforeCreatingDocFile(\BumbleDocGen\Core\Plugin\Event\Renderer\B public static function getSubscribedEvents(): array; ``` -
    Returns an array of event names this subscriber wants to listen to.
    + Parameters: not specified diff --git a/docs/tech/classes/ParserHelper.md b/docs/tech/classes/ParserHelper.md index c0bea1a4..a4363831 100644 --- a/docs/tech/classes/ParserHelper.md +++ b/docs/tech/classes/ParserHelper.md @@ -2,7 +2,7 @@ BumbleDocGen / Technical description of the project / Class map / ParserHelper

    - ParserHelper class: + ParserHelper class:

    @@ -36,9 +36,6 @@ final class ParserHelper
  • getBuiltInClassNames
  • -
  • - getClassFromFile -
  • getDocBlock
  • @@ -48,9 +45,6 @@ final class ParserHelper
  • getFilesInGit
  • -
  • - getMethodReturnValue -
  • getUsesListByClassEntity
  • @@ -84,11 +78,11 @@ final class ParserHelper ```php -public function __construct(\BumbleDocGen\Core\Configuration\Configuration $configuration, \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Reflection\ReflectorWrapper $reflector, \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache $localObjectCache, \Monolog\Logger $logger); +public function __construct(\BumbleDocGen\Core\Configuration\Configuration $configuration, \BumbleDocGen\LanguageHandler\Php\Parser\ComposerHelper $composerHelper, \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache $localObjectCache, \Monolog\Logger $logger); ``` @@ -110,8 +104,8 @@ public function __construct(\BumbleDocGen\Core\Configuration\Configuration $conf - - $reflector - \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Reflection\ReflectorWrapper + $composerHelper + \BumbleDocGen\LanguageHandler\Php\Parser\ComposerHelper - @@ -136,7 +130,7 @@ public function __construct(\BumbleDocGen\Core\Configuration\Configuration $conf ```php @@ -150,44 +144,6 @@ public static function getBuiltInClassNames(): array; Return value: array -
    -
    -
    - - - -```php -public function getClassFromFile(mixed $file): string|null; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $filemixed-
    - -Return value: string | null - -

    @@ -195,7 +151,7 @@ public function getClassFromFile(mixed $file): string|null; ```php @@ -238,9 +194,6 @@ public function getDocBlock(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\Clas Throws:
    -
    -
    - - - -```php -public function getMethodReturnValue(\Roave\BetterReflection\Reflection\ReflectionClass $reflectionClass, \Roave\BetterReflection\Reflection\ReflectionMethod $reflectionMethod): mixed; -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $reflectionClass\Roave\BetterReflection\Reflection\ReflectionClass-
    $reflectionMethod\Roave\BetterReflection\Reflection\ReflectionMethod-
    - -Return value: mixed - -

    @@ -372,7 +279,7 @@ public function getMethodReturnValue(\Roave\BetterReflection\Reflection\Reflecti ```php @@ -410,9 +317,6 @@ public function getUsesListByClassEntity(\BumbleDocGen\LanguageHandler\Php\Parse Throws:

    @@ -539,7 +450,7 @@ public function isClassLoaded(string $className): bool; ```php @@ -582,7 +493,7 @@ public static function isCorrectClassName(string $className, bool $checkBuiltIns ```php @@ -625,9 +536,6 @@ public function parseFullClassName(string $searchClassName, \BumbleDocGen\Langua Throws:
    @@ -241,7 +241,7 @@ public function getEntityCollection(): \BumbleDocGen\Core\Parser\Entity\RootEnti ```php diff --git a/docs/tech/classes/PhpHandlerSettings.md b/docs/tech/classes/PhpHandlerSettings.md index 9883e2be..1ad4c83d 100644 --- a/docs/tech/classes/PhpHandlerSettings.md +++ b/docs/tech/classes/PhpHandlerSettings.md @@ -330,14 +330,14 @@ public function getEntityDocRenderersCollection(): \BumbleDocGen\Core\Renderer\E ```php -public function getFileSourceBaseUrl(): string|null; +public function getFileSourceBaseUrl(): null|string; ``` Parameters: not specified -Return value: string | null +Return value: null | string Throws: diff --git a/docs/tech/classes/PhpParserHelper.md b/docs/tech/classes/PhpParserHelper.md new file mode 100644 index 00000000..ae43d32d --- /dev/null +++ b/docs/tech/classes/PhpParserHelper.md @@ -0,0 +1,64 @@ + + BumbleDocGen / Technical description of the project / Class map / PhpParserHelper
    + +

    + PhpParserHelper class: +

    + + + + + +```php +namespace BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpParser; + +final class PhpParserHelper +``` + + + + + + + + + +

    Methods:

    + +
      +
    1. + phpParser +
    2. +
    + + + + + + + +

    Method details:

    + +
    + + + +```php +public function phpParser(): \PhpParser\Parser; +``` + + + +Parameters: not specified + +Return value: \PhpParser\Parser + + +
    +
    + + \ No newline at end of file diff --git a/docs/tech/classes/PhpUnitStubberPlugin.md b/docs/tech/classes/PhpUnitStubberPlugin.md index 23f6ab62..f1f872c4 100644 --- a/docs/tech/classes/PhpUnitStubberPlugin.md +++ b/docs/tech/classes/PhpUnitStubberPlugin.md @@ -28,7 +28,7 @@ final class PhpUnitStubberPlugin implements \BumbleDocGen\Core\Plugin\PluginInte
    1. getSubscribedEvents - - Returns an array of event names this subscriber wants to listen to.
    2. +
    3. onCheckIsClassEntityCanBeLoad
    4. @@ -57,7 +57,7 @@ final class PhpUnitStubberPlugin implements \BumbleDocGen\Core\Plugin\PluginInte public static function getSubscribedEvents(): array; ``` -
      Returns an array of event names this subscriber wants to listen to.
      + Parameters: not specified diff --git a/docs/tech/classes/PluginEventDispatcher.md b/docs/tech/classes/PluginEventDispatcher.md index b626564f..326c9ebd 100644 --- a/docs/tech/classes/PluginEventDispatcher.md +++ b/docs/tech/classes/PluginEventDispatcher.md @@ -15,7 +15,7 @@ namespace BumbleDocGen\Core\Plugin; class PluginEventDispatcher extends \Symfony\Component\EventDispatcher\EventDispatcher ``` -
      The EventDispatcherInterface is the central point of Symfony's event listener system.
      + @@ -33,29 +33,8 @@ class PluginEventDispatcher extends \Symfony\Component\EventDispatcher\EventDisp

      Methods:

        -
      1. - addListener - - Adds an event listener that listens on the specified events.
      2. -
      3. - addSubscriber - - Adds an event subscriber.
      4. dispatch - - Dispatches an event to all registered listeners.
      5. -
      6. - getListenerPriority - - Gets the listener priority for a specific event.
      7. -
      8. - getListeners - - Gets the listeners of a specific event or all listeners sorted by descending priority.
      9. -
      10. - hasListeners - - Checks whether an event has any registered listeners.
      11. -
      12. - removeListener - - Removes an event listener from the specified events.
      13. -
      14. - removeSubscriber
      @@ -102,97 +81,6 @@ public function __construct(\Monolog\Logger $logger); - -
      -
      - - - -```php -// Implemented in Symfony\Component\EventDispatcher\EventDispatcher - -public function addListener(string $eventName, callable|array $listener, int $priority): mixed; -``` - -
      Adds an event listener that listens on the specified events.
      - -Parameters: - - - - - - - - - - - - - - - - - - - - - - - - - - -
      NameTypeDescription
      $eventNamestring-
      $listenercallable | array-
      $priorityintThe higher this value, the earlier an event - listener will be triggered in the chain (defaults to 0)
      - -Return value: mixed - - -
      -
      -
      - - - -```php -// Implemented in Symfony\Component\EventDispatcher\EventDispatcher - -public function addSubscriber(\Symfony\Component\EventDispatcher\EventSubscriberInterface $subscriber): mixed; -``` - -
      Adds an event subscriber.
      - -Parameters: - - - - - - - - - - - - - - - - -
      NameTypeDescription
      $subscriber\Symfony\Component\EventDispatcher\EventSubscriberInterface-
      - -Return value: mixed - -

      @@ -207,7 +95,7 @@ public function addSubscriber(\Symfony\Component\EventDispatcher\EventSubscriber public function dispatch(object $event, string $eventName = null): object; ``` -
      Dispatches an event to all registered listeners.
      + Parameters: @@ -223,228 +111,17 @@ public function dispatch(object $event, string $eventName = null): object; $event object - The event to pass to the event handlers/listeners - - - $eventName - string - The name of the event to dispatch. If not supplied, - the class of $event should be used instead. - - - - -Return value: object - - -
      -
      -
      - - - -```php -// Implemented in Symfony\Component\EventDispatcher\EventDispatcher - -public function getListenerPriority(string $eventName, callable|array $listener): int|null; -``` - -
      Gets the listener priority for a specific event.
      - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
      NameTypeDescription
      $eventNamestring-
      $listenercallable | array-
      - -Return value: int | null - - -
      -
      -
      - - - -```php -// Implemented in Symfony\Component\EventDispatcher\EventDispatcher - -public function getListeners(string $eventName = null): array; -``` - -
      Gets the listeners of a specific event or all listeners sorted by descending priority.
      - -Parameters: - - - - - - - - - - - - - - - - -
      NameTypeDescription
      $eventNamestring-
      - -Return value: array - - -
      -
      -
      - - - -```php -// Implemented in Symfony\Component\EventDispatcher\EventDispatcher - -public function hasListeners(string $eventName = null): bool; -``` - -
      Checks whether an event has any registered listeners.
      - -Parameters: - - - - - - - - - - - - - - -
      NameTypeDescription
      $eventNamestring -
      - -Return value: bool - - -
      -
      -
      - - - -```php -// Implemented in Symfony\Component\EventDispatcher\EventDispatcher - -public function removeListener(string $eventName, callable|array $listener): mixed; -``` - -
      Removes an event listener from the specified events.
      - -Parameters: - - - - - - - - - - - - - - - - - -
      NameTypeDescription
      $eventName string -
      $listenercallable | array-
      - -Return value: mixed - - -
      -
      -
      - - - -```php -// Implemented in Symfony\Component\EventDispatcher\EventDispatcher - -public function removeSubscriber(\Symfony\Component\EventDispatcher\EventSubscriberInterface $subscriber): mixed; -``` - - - -Parameters: - - - - - - - - - - - - - -
      NameTypeDescription
      $subscriber\Symfony\Component\EventDispatcher\EventSubscriberInterface-
      -Return value: mixed +Return value: object
      diff --git a/docs/tech/classes/PluginInterface.md b/docs/tech/classes/PluginInterface.md index f96c7dd7..1d51a6af 100644 --- a/docs/tech/classes/PluginInterface.md +++ b/docs/tech/classes/PluginInterface.md @@ -12,7 +12,7 @@ ```php namespace BumbleDocGen\Core\Plugin; -interface PluginInterface extends \\Symfony\Component\EventDispatcher\EventSubscriberInterface implements \Symfony\Component\EventDispatcher\EventSubscriberInterface +interface PluginInterface extends \Symfony\Component\EventDispatcher\EventSubscriberInterface ``` @@ -23,13 +23,7 @@ interface PluginInterface extends \\Symfony\Component\EventDispatcher\EventSubsc -

      Methods:

      -
        -
      1. - getSubscribedEvents - - Returns an array of event names this subscriber wants to listen to.
      2. -
      @@ -37,30 +31,4 @@ interface PluginInterface extends \\Symfony\Component\EventDispatcher\EventSubsc -

      Method details:

      - -
      - - - -```php -// Implemented in Symfony\Component\EventDispatcher\EventSubscriberInterface - -public static function getSubscribedEvents(): array>; -``` - -
      Returns an array of event names this subscriber wants to listen to.
      - -Parameters: not specified - -Return value: array | array{0:string,1:int} | list> - - -
      -
      - \ No newline at end of file diff --git a/docs/tech/classes/PluginsCollection.md b/docs/tech/classes/PluginsCollection.md index 706080fd..6a87f2d3 100644 --- a/docs/tech/classes/PluginsCollection.md +++ b/docs/tech/classes/PluginsCollection.md @@ -12,7 +12,7 @@ ```php namespace BumbleDocGen\Core\Plugin; -final class PluginsCollection implements \IteratorAggregate, \Traversable +final class PluginsCollection implements \IteratorAggregate ``` @@ -37,7 +37,7 @@ final class PluginsCollection implements \IteratorAggregate, \Traversable
    5. getIterator - - Retrieve an external iterator
    6. +
    @@ -133,7 +133,7 @@ public static function create(\BumbleDocGen\Core\Plugin\PluginInterface ...$plug ```php -public function get(string $key): \BumbleDocGen\Core\Plugin\PluginInterface|null; +public function get(string $key): null|\BumbleDocGen\Core\Plugin\PluginInterface; ``` @@ -157,7 +157,7 @@ public function get(string $key): \BumbleDocGen\Core\Plugin\PluginInterface|null -Return value: \BumbleDocGen\Core\Plugin\PluginInterface | null +Return value: null | \BumbleDocGen\Core\Plugin\PluginInterface @@ -174,26 +174,13 @@ public function get(string $key): \BumbleDocGen\Core\Plugin\PluginInterface|null public function getIterator(): \Generator; ``` -
    Retrieve an external iterator
    + Parameters: not specified Return value: \Generator -Throws: - - - -See: -
    diff --git a/docs/tech/classes/ProjectParser.md b/docs/tech/classes/ProjectParser.md index d4ec5ed0..2f2dacbc 100644 --- a/docs/tech/classes/ProjectParser.md +++ b/docs/tech/classes/ProjectParser.md @@ -2,7 +2,7 @@ BumbleDocGen / Technical description of the project / Class map / ProjectParser

    - ProjectParser class: + ProjectParser class:

    @@ -51,11 +51,11 @@ final class ProjectParser ```php -public function __construct(\BumbleDocGen\Core\Configuration\Configuration $configuration, \BumbleDocGen\Core\Parser\Entity\RootEntityCollectionsGroup $rootEntityCollectionsGroup); +public function __construct(\BumbleDocGen\Core\Configuration\Configuration $configuration, \BumbleDocGen\Core\Plugin\PluginEventDispatcher $pluginEventDispatcher, \BumbleDocGen\Core\Parser\Entity\RootEntityCollectionsGroup $rootEntityCollectionsGroup); ``` @@ -75,6 +75,11 @@ public function __construct(\BumbleDocGen\Core\Configuration\Configuration $conf $configuration \BumbleDocGen\Core\Configuration\Configuration - + + + $pluginEventDispatcher + \BumbleDocGen\Core\Plugin\PluginEventDispatcher + - $rootEntityCollectionsGroup @@ -93,7 +98,7 @@ public function __construct(\BumbleDocGen\Core\Configuration\Configuration $conf ```php diff --git a/docs/tech/classes/PropertyEntity.md b/docs/tech/classes/PropertyEntity.md index 56b3e947..d7b7460f 100644 --- a/docs/tech/classes/PropertyEntity.md +++ b/docs/tech/classes/PropertyEntity.md @@ -2,7 +2,7 @@ BumbleDocGen / Technical description of the project / Class map / PropertyEntity

    - PropertyEntity class: + PropertyEntity class:

    @@ -39,12 +39,18 @@ class PropertyEntity extends \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Bas
  • getAbsoluteFileName - Returns the absolute path to a file if it can be retrieved and if the file is in the project directory
  • +
  • + getAst +
  • getCacheKey
  • getCachedEntityDependencies
  • +
  • + getCurrentRootEntity +
  • getDefaultValue
  • @@ -87,9 +93,6 @@ class PropertyEntity extends \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Bas
  • getImplementingClassName
  • -
  • - getImplementingReflectionClass -
  • getModifiersString
  • @@ -105,6 +108,9 @@ class PropertyEntity extends \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Bas
  • getPhpHandlerSettings
  • +
  • + getRelativeFileName +
  • getRootEntity
  • @@ -168,6 +174,25 @@ class PropertyEntity extends \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Bas +

    Constants:

    + @@ -180,11 +205,11 @@ class PropertyEntity extends \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Bas ```php -public function __construct(\BumbleDocGen\Core\Configuration\Configuration $configuration, \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity $classEntity, \BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper $parserHelper, \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache $localObjectCache, \Psr\Log\LoggerInterface $logger, string $propertyName, string $declaringClassName, string $implementingClassName); +public function __construct(\BumbleDocGen\Core\Configuration\Configuration $configuration, \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity $classEntity, \BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper $parserHelper, \PhpParser\PrettyPrinter\Standard $astPrinter, \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache $localObjectCache, \Psr\Log\LoggerInterface $logger, string $propertyName, string $implementingClassName); ``` @@ -214,6 +239,11 @@ public function __construct(\BumbleDocGen\Core\Configuration\Configuration $conf $parserHelper \BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper - + + + $astPrinter + \PhpParser\PrettyPrinter\Standard + - $localObjectCache @@ -229,11 +259,6 @@ public function __construct(\BumbleDocGen\Core\Configuration\Configuration $conf $propertyName string - - - - $declaringClassName - string - - $implementingClassName @@ -252,7 +277,7 @@ public function __construct(\BumbleDocGen\Core\Configuration\Configuration $conf ```php @@ -285,20 +310,48 @@ public function entityCacheIsOutdated(): bool; ```php // Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity -public function getAbsoluteFileName(): string|null; +public function getAbsoluteFileName(): null|string; ```
    Returns the absolute path to a file if it can be retrieved and if the file is in the project directory
    Parameters: not specified -Return value: string | null +Return value: null | string + + +Throws: + + + +
    +
    + + + +```php +public function getAst(): \PhpParser\Node\Stmt\Property; +``` + + + +Parameters: not specified + +Return value: \PhpParser\Node\Stmt\Property Throws: @@ -338,7 +391,7 @@ public function getCacheKey(): string; ```php @@ -361,6 +414,29 @@ public function getCachedEntityDependencies(): array; +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getCurrentRootEntity(): null|\BumbleDocGen\Core\Parser\Entity\RootEntityInterface; +``` + + + +Parameters: not specified + +Return value: null | \BumbleDocGen\Core\Parser\Entity\RootEntityInterface + +

    @@ -368,7 +444,7 @@ public function getCachedEntityDependencies(): array; ```php @@ -385,7 +461,7 @@ public function getDefaultValue(): string|array|int|bool|null|float; Throws:
    -
    -
    - - - -```php -public function getImplementingReflectionClass(): \Roave\BetterReflection\Reflection\ReflectionClass; -``` - - - -Parameters: not specified - -Return value: \Roave\BetterReflection\Reflection\ReflectionClass - - -Throws: - -

    @@ -827,7 +854,7 @@ public function getImplementingReflectionClass(): \Roave\BetterReflection\Reflec ```php @@ -843,9 +870,6 @@ public function getModifiersString(): string; Throws:

    @@ -916,7 +930,7 @@ public function getNamespaceName(): string; ```php @@ -939,7 +953,7 @@ public function getObjectId(): string; ```php @@ -953,6 +967,36 @@ public function getPhpHandlerSettings(): \BumbleDocGen\LanguageHandler\Php\PhpHa Return value: \BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getRelativeFileName(): null|string; +``` + + + +Parameters: not specified + +Return value: null | string + + +Throws: + +

    @@ -960,7 +1004,7 @@ public function getPhpHandlerSettings(): \BumbleDocGen\LanguageHandler\Php\PhpHa ```php @@ -981,7 +1025,7 @@ public function getRootEntity(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity ```php @@ -1002,7 +1046,7 @@ public function getRootEntityCollection(): \BumbleDocGen\LanguageHandler\Php\Par ```php @@ -1023,7 +1067,7 @@ public function getShortName(): string; ```php @@ -1039,9 +1083,6 @@ public function getStartLine(): int; Throws:
    @@ -209,26 +209,13 @@ public function get(string $objectName): \BumbleDocGen\LanguageHandler\Php\Parse public function getIterator(): \Generator; ``` -
    Retrieve an external iterator
    + Parameters: not specified Return value: \Generator -Throws: - - - -See: -
    @@ -299,7 +286,7 @@ public function isEmpty(): bool; ```php @@ -324,9 +311,6 @@ public function loadPropertyEntities(): void;
  • \DI\NotFoundException
  • -
  • - \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
  • -
    @@ -376,11 +360,11 @@ public function remove(string $objectName): void; ```php -public function unsafeGet(string $objectName): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PropertyEntity|null; +public function unsafeGet(string $objectName): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\PropertyEntity; ``` @@ -404,7 +388,7 @@ public function unsafeGet(string $objectName): \BumbleDocGen\LanguageHandler\Php -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PropertyEntity | null +Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PropertyEntity Throws: @@ -412,12 +396,6 @@ public function unsafeGet(string $objectName): \BumbleDocGen\LanguageHandler\Php
  • \DI\NotFoundException
  • -
  • - \DI\DependencyException
  • - -
  • - \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
  • -
  • \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • diff --git a/docs/tech/classes/ReadmeTemplateGenerator.md b/docs/tech/classes/ReadmeTemplateGenerator.md index c151085b..d365ebf2 100644 --- a/docs/tech/classes/ReadmeTemplateGenerator.md +++ b/docs/tech/classes/ReadmeTemplateGenerator.md @@ -2,7 +2,7 @@ BumbleDocGen / Technical description of the project / Class map / ReadmeTemplateGenerator

    - ReadmeTemplateGenerator class: + ReadmeTemplateGenerator class:

    @@ -51,7 +51,7 @@ final class ReadmeTemplateGenerator ```php @@ -88,7 +88,7 @@ public function __construct(\BumbleDocGen\AI\ProviderInterface $aiProvider); ```php @@ -145,9 +145,6 @@ public function generateReadmeFileContent(\BumbleDocGen\Core\Parser\Entity\RootE
  • \DI\NotFoundException
  • -
  • - \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
  • - diff --git a/docs/tech/classes/ReflectionException.md b/docs/tech/classes/ReflectionException.md deleted file mode 100644 index 23ed1b09..00000000 --- a/docs/tech/classes/ReflectionException.md +++ /dev/null @@ -1,391 +0,0 @@ - - BumbleDocGen / Technical description of the project / Class map / ReflectionException
    - -

    - ReflectionException class: -

    - - - - - -```php -namespace BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception; - -final class ReflectionException extends \Exception implements \Throwable, \Stringable -``` - -
    Exception is the base class for -all Exceptions.
    - -See: - - - - - - - -

    Initialization methods:

    - -
      -
    1. - __construct - - Construct the exception. Note: The message is NOT binary safe.
    2. -
    - -

    Methods:

    - -
      -
    1. - __toString - - String representation of the exception
    2. -
    3. - __wakeup -
    4. -
    5. - getCode - - Gets the Exception code
    6. -
    7. - getFile - - Gets the file in which the exception occurred
    8. -
    9. - getLine - - Gets the line in which the exception occurred
    10. -
    11. - getMessage - - Gets the Exception message
    12. -
    13. - getPrevious - - Returns previous Exception
    14. -
    15. - getTrace - - Gets the stack trace
    16. -
    17. - getTraceAsString - - Gets the stack trace as a string
    18. -
    - - - - - - - -

    Method details:

    - -
    - -
      -
    • # - __construct -
    • -
    - -```php -// Implemented in Exception - -public function __construct(string $message = "", int $code, \Throwable|null $previous = \null); -``` - -
    Construct the exception. Note: The message is NOT binary safe.
    - -Parameters: - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $messagestring[optional] The Exception message to throw.
    $codeint[optional] The Exception code.
    $previous\Throwable | null[optional] The previous throwable used for the exception chaining.
    - - - - -See: - -
    -
    -
    - -
      -
    • # - __toString -
    • -
    - -```php -// Implemented in Exception - -public function __toString(): string; -``` - -
    String representation of the exception
    - -Parameters: not specified - -Return value: string - - - -See: - -
    -
    -
    - -
      -
    • # - __wakeup -
    • -
    - -```php -// Implemented in Exception - -public function __wakeup(): mixed; -``` - - - -Parameters: not specified - -Return value: mixed - - -
    -
    -
    - -
      -
    • # - getCode -
    • -
    - -```php -// Implemented in Exception - -public function getCode(): mixed|int; -``` - -
    Gets the Exception code
    - -Parameters: not specified - -Return value: mixed | int - - - -See: - -
    -
    -
    - -
      -
    • # - getFile -
    • -
    - -```php -// Implemented in Exception - -public function getFile(): string; -``` - -
    Gets the file in which the exception occurred
    - -Parameters: not specified - -Return value: string - - - -See: - -
    -
    -
    - -
      -
    • # - getLine -
    • -
    - -```php -// Implemented in Exception - -public function getLine(): int; -``` - -
    Gets the line in which the exception occurred
    - -Parameters: not specified - -Return value: int - - - -See: - -
    -
    -
    - -
      -
    • # - getMessage -
    • -
    - -```php -// Implemented in Exception - -public function getMessage(): string; -``` - -
    Gets the Exception message
    - -Parameters: not specified - -Return value: string - - - -See: - -
    -
    -
    - -
      -
    • # - getPrevious -
    • -
    - -```php -// Implemented in Exception - -public function getPrevious(): \Throwable|null; -``` - -
    Returns previous Exception
    - -Parameters: not specified - -Return value: \Throwable | null - - - -See: - -
    -
    -
    - -
      -
    • # - getTrace -
    • -
    - -```php -// Implemented in Exception - -public function getTrace(): array; -``` - -
    Gets the stack trace
    - -Parameters: not specified - -Return value: array - - - -See: - -
    -
    -
    - -
      -
    • # - getTraceAsString -
    • -
    - -```php -// Implemented in Exception - -public function getTraceAsString(): string; -``` - -
    Gets the stack trace as a string
    - -Parameters: not specified - -Return value: string - - - -See: - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/classes/ReflectionException_2.md b/docs/tech/classes/ReflectionException_2.md deleted file mode 100644 index 2c6379e1..00000000 --- a/docs/tech/classes/ReflectionException_2.md +++ /dev/null @@ -1,391 +0,0 @@ - - BumbleDocGen / Technical description of the project / ReflectionException
    - -

    - ReflectionException class: -

    - - - - - -```php -namespace BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception; - -final class ReflectionException extends \Exception implements \Throwable, \Stringable -``` - -
    Exception is the base class for -all Exceptions.
    - -See: - - - - - - - -

    Initialization methods:

    - -
      -
    1. - __construct - - Construct the exception. Note: The message is NOT binary safe.
    2. -
    - -

    Methods:

    - -
      -
    1. - __toString - - String representation of the exception
    2. -
    3. - __wakeup -
    4. -
    5. - getCode - - Gets the Exception code
    6. -
    7. - getFile - - Gets the file in which the exception occurred
    8. -
    9. - getLine - - Gets the line in which the exception occurred
    10. -
    11. - getMessage - - Gets the Exception message
    12. -
    13. - getPrevious - - Returns previous Exception
    14. -
    15. - getTrace - - Gets the stack trace
    16. -
    17. - getTraceAsString - - Gets the stack trace as a string
    18. -
    - - - - - - - -

    Method details:

    - -
    - -
      -
    • # - __construct -
    • -
    - -```php -// Implemented in Exception - -public function __construct(string $message = "", int $code, \Throwable|null $previous = \null); -``` - -
    Construct the exception. Note: The message is NOT binary safe.
    - -Parameters: - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $messagestring[optional] The Exception message to throw.
    $codeint[optional] The Exception code.
    $previous\Throwable | null[optional] The previous throwable used for the exception chaining.
    - - - - -See: - -
    -
    -
    - -
      -
    • # - __toString -
    • -
    - -```php -// Implemented in Exception - -public function __toString(): string; -``` - -
    String representation of the exception
    - -Parameters: not specified - -Return value: string - - - -See: - -
    -
    -
    - -
      -
    • # - __wakeup -
    • -
    - -```php -// Implemented in Exception - -public function __wakeup(): mixed; -``` - - - -Parameters: not specified - -Return value: mixed - - -
    -
    -
    - -
      -
    • # - getCode -
    • -
    - -```php -// Implemented in Exception - -public function getCode(): mixed|int; -``` - -
    Gets the Exception code
    - -Parameters: not specified - -Return value: mixed | int - - - -See: - -
    -
    -
    - -
      -
    • # - getFile -
    • -
    - -```php -// Implemented in Exception - -public function getFile(): string; -``` - -
    Gets the file in which the exception occurred
    - -Parameters: not specified - -Return value: string - - - -See: - -
    -
    -
    - -
      -
    • # - getLine -
    • -
    - -```php -// Implemented in Exception - -public function getLine(): int; -``` - -
    Gets the line in which the exception occurred
    - -Parameters: not specified - -Return value: int - - - -See: - -
    -
    -
    - -
      -
    • # - getMessage -
    • -
    - -```php -// Implemented in Exception - -public function getMessage(): string; -``` - -
    Gets the Exception message
    - -Parameters: not specified - -Return value: string - - - -See: - -
    -
    -
    - -
      -
    • # - getPrevious -
    • -
    - -```php -// Implemented in Exception - -public function getPrevious(): \Throwable|null; -``` - -
    Returns previous Exception
    - -Parameters: not specified - -Return value: \Throwable | null - - - -See: - -
    -
    -
    - -
      -
    • # - getTrace -
    • -
    - -```php -// Implemented in Exception - -public function getTrace(): array; -``` - -
    Gets the stack trace
    - -Parameters: not specified - -Return value: array - - - -See: - -
    -
    -
    - -
      -
    • # - getTraceAsString -
    • -
    - -```php -// Implemented in Exception - -public function getTraceAsString(): string; -``` - -
    Gets the stack trace as a string
    - -Parameters: not specified - -Return value: string - - - -See: - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/classes/ReflectorWrapper.md b/docs/tech/classes/ReflectorWrapper.md deleted file mode 100644 index 2050c50d..00000000 --- a/docs/tech/classes/ReflectorWrapper.md +++ /dev/null @@ -1,377 +0,0 @@ - - BumbleDocGen / Technical description of the project / Class map / ReflectorWrapper
    - -

    - ReflectorWrapper class: -

    - - - - - -```php -namespace BumbleDocGen\LanguageHandler\Php\Parser\Entity\Reflection; - -final class ReflectorWrapper implements \Roave\BetterReflection\Reflector\Reflector -``` - - - - - - - - -

    Initialization methods:

    - -
      -
    1. - __construct -
    2. -
    - -

    Methods:

    - -
      -
    1. - reflectAllClasses -
    2. -
    3. - reflectAllConstants -
    4. -
    5. - reflectAllFunctions -
    6. -
    7. - reflectClass -
    8. -
    9. - reflectConstant -
    10. -
    11. - reflectFunction -
    12. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public function __construct(\BumbleDocGen\Core\Configuration\Configuration $configuration, \BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings $phpHandlerSettings, \BumbleDocGen\Core\Plugin\PluginEventDispatcher $pluginEventDispatcher, \Roave\BetterReflection\BetterReflection $betterReflection, \BumbleDocGen\Core\Cache\SourceLocatorCacheItemPool $sourceLocatorCache); -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $configuration\BumbleDocGen\Core\Configuration\Configuration-
    $phpHandlerSettings\BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings-
    $pluginEventDispatcher\BumbleDocGen\Core\Plugin\PluginEventDispatcher-
    $betterReflection\Roave\BetterReflection\BetterReflection-
    $sourceLocatorCache\BumbleDocGen\Core\Cache\SourceLocatorCacheItemPool-
    - - - -
    -
    -
    - - - -```php -public function reflectAllClasses(): iterable; -``` - - - -Parameters: not specified - -Return value: iterable - - -Throws: - - -
    -
    -
    - - - -```php -public function reflectAllConstants(): iterable; -``` - - - -Parameters: not specified - -Return value: iterable - - -Throws: - - -
    -
    -
    - - - -```php -public function reflectAllFunctions(): iterable; -``` - - - -Parameters: not specified - -Return value: iterable - - -Throws: - - -
    -
    -
    - - - -```php -public function reflectClass(string $identifierName): \Roave\BetterReflection\Reflection\ReflectionClass; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $identifierNamestring-
    - -Return value: \Roave\BetterReflection\Reflection\ReflectionClass - - -Throws: - - -
    -
    -
    - - - -```php -public function reflectConstant(string $identifierName): \Roave\BetterReflection\Reflection\ReflectionConstant; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $identifierNamestring-
    - -Return value: \Roave\BetterReflection\Reflection\ReflectionConstant - - -Throws: - - -
    -
    -
    - - - -```php -public function reflectFunction(string $identifierName): \Roave\BetterReflection\Reflection\ReflectionFunction; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $identifierNamestring-
    - -Return value: \Roave\BetterReflection\Reflection\ReflectionFunction - - -Throws: - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/classes/RendererContext.md b/docs/tech/classes/RendererContext.md index 98fc97cb..f6191b17 100644 --- a/docs/tech/classes/RendererContext.md +++ b/docs/tech/classes/RendererContext.md @@ -125,14 +125,14 @@ public function clearDependencies(): void; ```php -public function getCurrentDocumentedEntityWrapper(): \BumbleDocGen\Core\Renderer\Context\DocumentedEntityWrapper|null; +public function getCurrentDocumentedEntityWrapper(): null|\BumbleDocGen\Core\Renderer\Context\DocumentedEntityWrapper; ``` Parameters: not specified -Return value: \BumbleDocGen\Core\Renderer\Context\DocumentedEntityWrapper | null +Return value: null | \BumbleDocGen\Core\Renderer\Context\DocumentedEntityWrapper diff --git a/docs/tech/classes/RendererContext_2.md b/docs/tech/classes/RendererContext_2.md index 151654d5..c3a4868d 100644 --- a/docs/tech/classes/RendererContext_2.md +++ b/docs/tech/classes/RendererContext_2.md @@ -125,14 +125,14 @@ public function clearDependencies(): void; ```php -public function getCurrentDocumentedEntityWrapper(): \BumbleDocGen\Core\Renderer\Context\DocumentedEntityWrapper|null; +public function getCurrentDocumentedEntityWrapper(): null|\BumbleDocGen\Core\Renderer\Context\DocumentedEntityWrapper; ``` Parameters: not specified -Return value: \BumbleDocGen\Core\Renderer\Context\DocumentedEntityWrapper | null +Return value: null | \BumbleDocGen\Core\Renderer\Context\DocumentedEntityWrapper diff --git a/docs/tech/classes/RendererHelper.md b/docs/tech/classes/RendererHelper.md index 6b734c00..566881e5 100644 --- a/docs/tech/classes/RendererHelper.md +++ b/docs/tech/classes/RendererHelper.md @@ -199,7 +199,7 @@ public function filePathToFileInternalLink(string $fileName): string; ```php -public function getPreloadResourceLink(string $resourceName): string|null; +public function getPreloadResourceLink(string $resourceName): null|string; ``` @@ -223,7 +223,7 @@ public function getPreloadResourceLink(string $resourceName): string|null; -Return value: string | null +Return value: null | string diff --git a/docs/tech/classes/RendererIteratorFactory.md b/docs/tech/classes/RendererIteratorFactory.md index e6896e06..9b2f1a5d 100644 --- a/docs/tech/classes/RendererIteratorFactory.md +++ b/docs/tech/classes/RendererIteratorFactory.md @@ -2,7 +2,7 @@ BumbleDocGen / Technical description of the project / Class map / RendererIteratorFactory

    - RendererIteratorFactory class: + RendererIteratorFactory class:

    @@ -57,11 +57,11 @@ final class RendererIteratorFactory ```php -public function __construct(\BumbleDocGen\Core\Renderer\Context\RendererContext $rendererContext, \BumbleDocGen\Core\Parser\Entity\RootEntityCollectionsGroup $rootEntityCollectionsGroup, \BumbleDocGen\Core\Renderer\Context\DocumentedEntityWrappersCollection $documentedEntityWrappersCollection, \BumbleDocGen\Core\Configuration\Configuration $configuration, \BumbleDocGen\Core\Configuration\ConfigurationParameterBag $configurationParameterBag, \BumbleDocGen\Core\Cache\SharedCompressedDocumentFileCache $sharedCompressedDocumentFileCache, \BumbleDocGen\Core\Renderer\RendererHelper $rendererHelper, \BumbleDocGen\Core\Renderer\Context\Dependency\RendererDependencyFactory $dependencyFactory, \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache $localObjectCache, \BumbleDocGen\Console\ProgressBar\ProgressBarFactory $progressBarFactory, \BumbleDocGen\Core\Plugin\PluginEventDispatcher $pluginEventDispatcher, \Symfony\Component\Console\Style\OutputStyle $io, \Monolog\Logger $logger, \BumbleDocGen\Core\Logger\Handler\GenerationErrorsHandler $generationErrorsHandler); +public function __construct(\BumbleDocGen\Core\Renderer\Context\RendererContext $rendererContext, \BumbleDocGen\Core\Parser\Entity\RootEntityCollectionsGroup $rootEntityCollectionsGroup, \BumbleDocGen\Core\Renderer\Context\DocumentedEntityWrappersCollection $documentedEntityWrappersCollection, \BumbleDocGen\Core\Configuration\Configuration $configuration, \BumbleDocGen\Core\Cache\SharedCompressedDocumentFileCache $sharedCompressedDocumentFileCache, \BumbleDocGen\Core\Renderer\RendererHelper $rendererHelper, \BumbleDocGen\Core\Renderer\Context\Dependency\RendererDependencyFactory $dependencyFactory, \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache $localObjectCache, \BumbleDocGen\Console\ProgressBar\ProgressBarFactory $progressBarFactory, \BumbleDocGen\Core\Plugin\PluginEventDispatcher $pluginEventDispatcher, \Symfony\Component\Console\Style\OutputStyle $io, \Monolog\Logger $logger, \BumbleDocGen\Core\Logger\Handler\GenerationErrorsHandler $generationErrorsHandler); ``` @@ -96,11 +96,6 @@ public function __construct(\BumbleDocGen\Core\Renderer\Context\RendererContext $configuration \BumbleDocGen\Core\Configuration\Configuration - - - - $configurationParameterBag - \BumbleDocGen\Core\Configuration\ConfigurationParameterBag - - $sharedCompressedDocumentFileCache @@ -159,7 +154,7 @@ public function __construct(\BumbleDocGen\Core\Renderer\Context\RendererContext ```php @@ -187,7 +182,7 @@ public function getDocumentedEntityWrappersWithOutdatedCache(): \Generator; ```php @@ -215,7 +210,7 @@ public function getFilesToRemove(): \Generator; ```php diff --git a/docs/tech/classes/RootEntityCollection.md b/docs/tech/classes/RootEntityCollection.md index afa60373..2e372463 100644 --- a/docs/tech/classes/RootEntityCollection.md +++ b/docs/tech/classes/RootEntityCollection.md @@ -12,7 +12,7 @@ ```php namespace BumbleDocGen\Core\Parser\Entity; -abstract class RootEntityCollection extends \BumbleDocGen\Core\Parser\Entity\BaseEntityCollection implements \IteratorAggregate, \Traversable +abstract class RootEntityCollection extends \BumbleDocGen\Core\Parser\Entity\BaseEntityCollection implements \IteratorAggregate ``` @@ -40,7 +40,7 @@ abstract class RootEntityCollection extends \BumbleDocGen\Core\Parser\Entity\Bas
  • getIterator - - Retrieve an external iterator
  • +
  • getLoadedOrCreateNew
  • @@ -75,7 +75,7 @@ abstract class RootEntityCollection extends \BumbleDocGen\Core\Parser\Entity\Bas ```php -public function findEntity(string $search, bool $useUnsafeKeys = true): \BumbleDocGen\Core\Parser\Entity\RootEntityInterface|null; +public function findEntity(string $search, bool $useUnsafeKeys = true): null|\BumbleDocGen\Core\Parser\Entity\RootEntityInterface; ``` @@ -104,7 +104,7 @@ public function findEntity(string $search, bool $useUnsafeKeys = true): \BumbleD -Return value: \BumbleDocGen\Core\Parser\Entity\RootEntityInterface | null +Return value: null | \BumbleDocGen\Core\Parser\Entity\RootEntityInterface @@ -118,7 +118,7 @@ public function findEntity(string $search, bool $useUnsafeKeys = true): \BumbleD ```php -public function get(string $objectName): \BumbleDocGen\Core\Parser\Entity\RootEntityInterface|null; +public function get(string $objectName): null|\BumbleDocGen\Core\Parser\Entity\RootEntityInterface; ``` @@ -142,7 +142,7 @@ public function get(string $objectName): \BumbleDocGen\Core\Parser\Entity\RootEn -Return value: \BumbleDocGen\Core\Parser\Entity\RootEntityInterface | null +Return value: null | \BumbleDocGen\Core\Parser\Entity\RootEntityInterface @@ -231,26 +231,13 @@ public function getEntityLinkData(string $rawLink, string|null $defaultEntityNam public function getIterator(): \Generator; ``` -
    Retrieve an external iterator
    + Parameters: not specified Return value: \Generator -Throws: - - - -See: -
    diff --git a/docs/tech/classes/RootEntityCollectionsGroup.md b/docs/tech/classes/RootEntityCollectionsGroup.md index 53027ea1..865ad29f 100644 --- a/docs/tech/classes/RootEntityCollectionsGroup.md +++ b/docs/tech/classes/RootEntityCollectionsGroup.md @@ -12,7 +12,7 @@ ```php namespace BumbleDocGen\Core\Parser\Entity; -final class RootEntityCollectionsGroup implements \IteratorAggregate, \Traversable +final class RootEntityCollectionsGroup implements \IteratorAggregate ``` @@ -37,7 +37,7 @@ final class RootEntityCollectionsGroup implements \IteratorAggregate, \Traversab
  • getIterator - - Retrieve an external iterator
  • +
  • getOperationsLog
  • @@ -128,7 +128,7 @@ public function clearOperationsLog(): void; ```php -public function get(string $collectionName): \BumbleDocGen\Core\Parser\Entity\RootEntityCollection|null; +public function get(string $collectionName): null|\BumbleDocGen\Core\Parser\Entity\RootEntityCollection; ``` @@ -152,7 +152,7 @@ public function get(string $collectionName): \BumbleDocGen\Core\Parser\Entity\Ro -Return value: \BumbleDocGen\Core\Parser\Entity\RootEntityCollection | null +Return value: null | \BumbleDocGen\Core\Parser\Entity\RootEntityCollection
    @@ -169,26 +169,13 @@ public function get(string $collectionName): \BumbleDocGen\Core\Parser\Entity\Ro public function getIterator(): \Generator; ``` -
    Retrieve an external iterator
    + Parameters: not specified Return value: \Generator -Throws: - - - -See: -
    diff --git a/docs/tech/classes/RootEntityInterface.md b/docs/tech/classes/RootEntityInterface.md index d581979c..f7e3978e 100644 --- a/docs/tech/classes/RootEntityInterface.md +++ b/docs/tech/classes/RootEntityInterface.md @@ -12,7 +12,7 @@ ```php namespace BumbleDocGen\Core\Parser\Entity; -interface RootEntityInterface extends \\BumbleDocGen\Core\Parser\Entity\EntityInterface implements \BumbleDocGen\Core\Parser\Entity\EntityInterface +interface RootEntityInterface extends \BumbleDocGen\Core\Parser\Entity\EntityInterface ```
    Since the documentation generator supports several programming languages, @@ -134,14 +134,14 @@ public function entityDataCanBeLoaded(): bool; ```php // Implemented in BumbleDocGen\Core\Parser\Entity\EntityInterface -public function getAbsoluteFileName(): string|null; +public function getAbsoluteFileName(): null|string; ```
    Returns the absolute path to a file if it can be retrieved and if the file is in the project directory
    Parameters: not specified -Return value: string | null +Return value: null | string
    @@ -199,14 +199,14 @@ public function getFileContent(): string; ```php // Implemented in BumbleDocGen\Core\Parser\Entity\EntityInterface -public function getFileName(): string|null; +public function getFileName(): null|string; ```
    Returns the relative path to a file if it can be retrieved and if the file is in the project directory
    Parameters: not specified -Return value: string | null +Return value: null | string @@ -220,7 +220,7 @@ public function getFileName(): string|null; ```php -public function getFileSourceLink(bool $withLine = true): string|null; +public function getFileSourceLink(bool $withLine = true): null|string; ``` @@ -244,7 +244,7 @@ public function getFileSourceLink(bool $withLine = true): string|null; -Return value: string | null +Return value: null | string diff --git a/docs/tech/classes/RootEntityInterface_2.md b/docs/tech/classes/RootEntityInterface_2.md index 68e688c4..74733aa1 100644 --- a/docs/tech/classes/RootEntityInterface_2.md +++ b/docs/tech/classes/RootEntityInterface_2.md @@ -12,7 +12,7 @@ ```php namespace BumbleDocGen\Core\Parser\Entity; -interface RootEntityInterface extends \\BumbleDocGen\Core\Parser\Entity\EntityInterface implements \BumbleDocGen\Core\Parser\Entity\EntityInterface +interface RootEntityInterface extends \BumbleDocGen\Core\Parser\Entity\EntityInterface ```
    Since the documentation generator supports several programming languages, @@ -134,14 +134,14 @@ public function entityDataCanBeLoaded(): bool; ```php // Implemented in BumbleDocGen\Core\Parser\Entity\EntityInterface -public function getAbsoluteFileName(): string|null; +public function getAbsoluteFileName(): null|string; ```
    Returns the absolute path to a file if it can be retrieved and if the file is in the project directory
    Parameters: not specified -Return value: string | null +Return value: null | string @@ -199,14 +199,14 @@ public function getFileContent(): string; ```php // Implemented in BumbleDocGen\Core\Parser\Entity\EntityInterface -public function getFileName(): string|null; +public function getFileName(): null|string; ```
    Returns the relative path to a file if it can be retrieved and if the file is in the project directory
    Parameters: not specified -Return value: string | null +Return value: null | string @@ -220,7 +220,7 @@ public function getFileName(): string|null; ```php -public function getFileSourceLink(bool $withLine = true): string|null; +public function getFileSourceLink(bool $withLine = true): null|string; ``` @@ -244,7 +244,7 @@ public function getFileSourceLink(bool $withLine = true): string|null; -Return value: string | null +Return value: null | string diff --git a/docs/tech/classes/SingleEntitySearchOperation.md b/docs/tech/classes/SingleEntitySearchOperation.md index 0b785460..364566c1 100644 --- a/docs/tech/classes/SingleEntitySearchOperation.md +++ b/docs/tech/classes/SingleEntitySearchOperation.md @@ -123,7 +123,7 @@ public function __construct(string $functionName, array $args, \BumbleDocGen\Cor ```php -public function call(\BumbleDocGen\Core\Parser\Entity\RootEntityCollection $rootEntityCollection): \BumbleDocGen\Core\Parser\Entity\RootEntityInterface|null; +public function call(\BumbleDocGen\Core\Parser\Entity\RootEntityCollection $rootEntityCollection): null|\BumbleDocGen\Core\Parser\Entity\RootEntityInterface; ``` @@ -147,7 +147,7 @@ public function call(\BumbleDocGen\Core\Parser\Entity\RootEntityCollection $root -Return value: \BumbleDocGen\Core\Parser\Entity\RootEntityInterface | null +Return value: null | \BumbleDocGen\Core\Parser\Entity\RootEntityInterface @@ -203,14 +203,14 @@ public function getArgsHash(): string; ```php -public function getEntityName(): string|null; +public function getEntityName(): null|string; ``` Parameters: not specified -Return value: string | null +Return value: null | string diff --git a/docs/tech/classes/SourceLocatorCacheItemPool.md b/docs/tech/classes/SourceLocatorCacheItemPool.md deleted file mode 100644 index 702f80cb..00000000 --- a/docs/tech/classes/SourceLocatorCacheItemPool.md +++ /dev/null @@ -1,461 +0,0 @@ - - BumbleDocGen / Technical description of the project / Class map / SourceLocatorCacheItemPool
    - -

    - SourceLocatorCacheItemPool class: -

    - - - - - -```php -namespace BumbleDocGen\Core\Cache; - -final class SourceLocatorCacheItemPool implements \Psr\Cache\CacheItemPoolInterface -``` - - - - - - - - -

    Initialization methods:

    - -
      -
    1. - __construct -
    2. -
    - -

    Methods:

    - -
      -
    1. - clear - - Deletes all items in the pool.
    2. -
    3. - commit - - Persists any deferred cache items.
    4. -
    5. - deleteItem - - Removes the item from the pool.
    6. -
    7. - deleteItems - - Removes multiple items from the pool.
    8. -
    9. - getItem - - Returns a Cache Item representing the specified key.
    10. -
    11. - getItems - - Returns a traversable set of cache items.
    12. -
    13. - hasItem - - Confirms if the cache contains specified cache item.
    14. -
    15. - save - - Persists a cache item immediately.
    16. -
    17. - saveDeferred - - Sets a cache item to be persisted later.
    18. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public function __construct(\BumbleDocGen\Core\Configuration\Configuration $configuration); -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $configuration\BumbleDocGen\Core\Configuration\Configuration-
    - - - -Throws: - - -
    -
    -
    - - - -```php -public function clear(): bool; -``` - -
    Deletes all items in the pool.
    - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - - - -```php -public function commit(): bool; -``` - -
    Persists any deferred cache items.
    - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - - - -```php -public function deleteItem(string $key): bool; -``` - -
    Removes the item from the pool.
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $keystringThe key to delete.
    - -Return value: bool - - -Throws: - - -
    -
    -
    - - - -```php -public function deleteItems(array $keys): bool; -``` - -
    Removes multiple items from the pool.
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $keysstring[]An array of keys that should be removed from the pool.
    - -Return value: bool - - -Throws: - - -
    -
    -
    - - - -```php -public function getItem(string $key): \Psr\Cache\CacheItemInterface; -``` - -
    Returns a Cache Item representing the specified key.
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $keystringThe key for which to return the corresponding Cache Item.
    - -Return value: \Psr\Cache\CacheItemInterface - - -Throws: - - -
    -
    -
    - - - -```php -public function getItems(array $keys = []): iterable; -``` - -
    Returns a traversable set of cache items.
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $keysstring[]An indexed array of keys of items to retrieve.
    - -Return value: iterable - - -Throws: - - -
    -
    -
    - - - -```php -public function hasItem(string $key): bool; -``` - -
    Confirms if the cache contains specified cache item.
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $keystringThe key for which to check existence.
    - -Return value: bool - - -Throws: - - -
    -
    -
    - - - -```php -public function save(\Psr\Cache\CacheItemInterface $item): bool; -``` - -
    Persists a cache item immediately.
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $item\Psr\Cache\CacheItemInterfaceThe cache item to save.
    - -Return value: bool - - -
    -
    -
    - - - -```php -public function saveDeferred(\Psr\Cache\CacheItemInterface $item): bool; -``` - -
    Sets a cache item to be persisted later.
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $item\Psr\Cache\CacheItemInterfaceThe cache item to save.
    - -Return value: bool - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/classes/SourceLocatorInterface.md b/docs/tech/classes/SourceLocatorInterface.md index d5962c1e..0bb8e92b 100644 --- a/docs/tech/classes/SourceLocatorInterface.md +++ b/docs/tech/classes/SourceLocatorInterface.md @@ -48,14 +48,14 @@ interface SourceLocatorInterface ```php -public function getFinder(): \Symfony\Component\Finder\Finder|null; +public function getFinder(): null|\Symfony\Component\Finder\Finder; ``` Parameters: not specified -Return value: \Symfony\Component\Finder\Finder | null +Return value: null | \Symfony\Component\Finder\Finder diff --git a/docs/tech/classes/SourceLocatorsCollection.md b/docs/tech/classes/SourceLocatorsCollection.md index 7583eaf1..d665a4a9 100644 --- a/docs/tech/classes/SourceLocatorsCollection.md +++ b/docs/tech/classes/SourceLocatorsCollection.md @@ -12,7 +12,7 @@ ```php namespace BumbleDocGen\Core\Parser\SourceLocator; -final class SourceLocatorsCollection implements \IteratorAggregate, \Traversable +final class SourceLocatorsCollection implements \IteratorAggregate ``` @@ -37,7 +37,7 @@ final class SourceLocatorsCollection implements \IteratorAggregate, \Traversable
  • getIterator - - Retrieve an external iterator
  • + @@ -157,26 +157,13 @@ public function getCommonFinder(): \Symfony\Component\Finder\Finder; public function getIterator(): \Generator; ``` -
    Retrieve an external iterator
    + Parameters: not specified Return value: \Generator -Throws: - - - -See: -
    diff --git a/docs/tech/classes/StubberPlugin.md b/docs/tech/classes/StubberPlugin.md index 115ce876..e89d8660 100644 --- a/docs/tech/classes/StubberPlugin.md +++ b/docs/tech/classes/StubberPlugin.md @@ -35,7 +35,7 @@ final class StubberPlugin implements \BumbleDocGen\Core\Plugin\PluginInterface,
    1. getSubscribedEvents - - Returns an array of event names this subscriber wants to listen to.
    2. +
    3. onCheckIsClassEntityCanBeLoad
    4. @@ -57,11 +57,11 @@ final class StubberPlugin implements \BumbleDocGen\Core\Plugin\PluginInterface, ```php -public function __construct(\BumbleDocGen\LanguageHandler\Php\Parser\ComposerParser $composerParser); +public function __construct(\BumbleDocGen\LanguageHandler\Php\Parser\ComposerHelper $composerHelper); ``` @@ -78,8 +78,8 @@ public function __construct(\BumbleDocGen\LanguageHandler\Php\Parser\ComposerPar - $composerParser - \BumbleDocGen\LanguageHandler\Php\Parser\ComposerParser + $composerHelper + \BumbleDocGen\LanguageHandler\Php\Parser\ComposerHelper - @@ -94,14 +94,14 @@ public function __construct(\BumbleDocGen\LanguageHandler\Php\Parser\ComposerPar ```php public static function getSubscribedEvents(): array; ``` -
      Returns an array of event names this subscriber wants to listen to.
      + Parameters: not specified @@ -115,7 +115,7 @@ public static function getSubscribedEvents(): array; ```php @@ -160,7 +160,7 @@ public function onCheckIsClassEntityCanBeLoad(\BumbleDocGen\LanguageHandler\Php\ ```php diff --git a/docs/tech/classes/StylizedProgressBar.md b/docs/tech/classes/StylizedProgressBar.md index f5c9ccba..d83e024d 100644 --- a/docs/tech/classes/StylizedProgressBar.md +++ b/docs/tech/classes/StylizedProgressBar.md @@ -187,7 +187,7 @@ public function iterate(iterable $iterable, int|null $max = null): \Generator; $iterable - iterable + iterable - diff --git a/docs/tech/classes/SystemAsyncSourceLocator.md b/docs/tech/classes/SystemAsyncSourceLocator.md deleted file mode 100644 index c7417701..00000000 --- a/docs/tech/classes/SystemAsyncSourceLocator.md +++ /dev/null @@ -1,282 +0,0 @@ - - BumbleDocGen / Technical description of the project / Class map / SystemAsyncSourceLocator
      - -

      - SystemAsyncSourceLocator class: -

      - - - - -:warning: Is internal -```php -namespace BumbleDocGen\LanguageHandler\Php\Parser\SourceLocator\Internal; - -final class SystemAsyncSourceLocator extends \Roave\BetterReflection\SourceLocator\Type\AbstractSourceLocator -``` - - - - - - - - -

      Initialization methods:

      - -
        -
      1. - __construct -
      2. -
      - -

      Methods:

      - -
        -
      1. - getClassLoader -
      2. -
      3. - getLocatedSource -
      4. -
      5. - locateIdentifier - - Locate some source code.
      6. -
      7. - locateIdentifiersByType - - Find all identifiers of a type
      8. -
      - - - - - - - -

      Method details:

      - -
      - - - -```php -public function __construct(\Roave\BetterReflection\SourceLocator\Ast\Locator $astLocator, \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache $localObjectCache, array $psr4FileMap, array $classMap); -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      NameTypeDescription
      $astLocator\Roave\BetterReflection\SourceLocator\Ast\Locator-
      $localObjectCache\BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache-
      $psr4FileMaparray-
      $classMaparray-
      - - - -
      -
      -
      - - - -```php -public function getClassLoader(array $psr4FileMap, array $classMap): \Composer\Autoload\ClassLoader; -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
      NameTypeDescription
      $psr4FileMaparray-
      $classMaparray-
      - -Return value: \Composer\Autoload\ClassLoader - - -
      -
      -
      - - - -```php -public function getLocatedSource(string $className): \Roave\BetterReflection\SourceLocator\Located\LocatedSource|null; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
      NameTypeDescription
      $classNamestring-
      - -Return value: \Roave\BetterReflection\SourceLocator\Located\LocatedSource | null - - -
      -
      -
      - - - -```php -// Implemented in Roave\BetterReflection\SourceLocator\Type\AbstractSourceLocator - -public function locateIdentifier(\Roave\BetterReflection\Reflector\Reflector $reflector, \Roave\BetterReflection\Identifier\Identifier $identifier): \Roave\BetterReflection\Reflection\Reflection|null; -``` - -
      Locate some source code.
      - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
      NameTypeDescription
      $reflector\Roave\BetterReflection\Reflector\Reflector-
      $identifier\Roave\BetterReflection\Identifier\Identifier-
      - -Return value: \Roave\BetterReflection\Reflection\Reflection | null - - -
      -
      -
      - - - -```php -// Implemented in Roave\BetterReflection\SourceLocator\Type\AbstractSourceLocator - -public function locateIdentifiersByType(\Roave\BetterReflection\Reflector\Reflector $reflector, \Roave\BetterReflection\Identifier\IdentifierType $identifierType): array; -``` - -
      Find all identifiers of a type
      - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
      NameTypeDescription
      $reflector\Roave\BetterReflection\Reflector\Reflector-
      $identifierType\Roave\BetterReflection\Identifier\IdentifierType-
      - -Return value: array - - -
      -
      - - \ No newline at end of file diff --git a/docs/tech/classes/TemplateFile.md b/docs/tech/classes/TemplateFile.md index 7e6b0fe3..d9d4bd18 100644 --- a/docs/tech/classes/TemplateFile.md +++ b/docs/tech/classes/TemplateFile.md @@ -267,14 +267,14 @@ public static function getRelativeDocPathByTemplatePath(string $templatePath, \B ```php -public function getRelativeTemplatePath(): string|null; +public function getRelativeTemplatePath(): null|string; ``` Parameters: not specified -Return value: string | null +Return value: null | string diff --git a/docs/tech/classes/ValueToClassTransformer.md b/docs/tech/classes/ValueToClassTransformer.md index 2b1b2fce..f2a4508c 100644 --- a/docs/tech/classes/ValueToClassTransformer.md +++ b/docs/tech/classes/ValueToClassTransformer.md @@ -161,7 +161,7 @@ public function canTransform(mixed $value): bool; ```php -public function transform(mixed $value): object|null; +public function transform(mixed $value): null|object; ``` @@ -185,7 +185,7 @@ public function transform(mixed $value): object|null; -Return value: object | null +Return value: null | object Throws: diff --git a/docs/tech/map.md b/docs/tech/map.md index 8f6177f1..b41ec5c8 100644 --- a/docs/tech/map.md +++ b/docs/tech/map.md @@ -5,8 +5,8 @@ Directory layout ( only documented files shown ):
      └──src/
       │  ├──AI/
       │  │  ├──Console/
      -│  │  │  ├── AddDocBlocksCommand.php Base class for all commands.
      -│  │  │  └── GenerateReadMeTemplateCommand.php Base class for all commands.
      +│  │  │  ├── AddDocBlocksCommand.php 
      +│  │  │  └── GenerateReadMeTemplateCommand.php 
       │  │  ├──Generators/
       │  │  │  ├── DocBlocksGenerator.php 
       │  │  │  └── ReadmeTemplateGenerator.php 
      @@ -20,24 +20,23 @@ Directory layout ( only documented files shown ):
       │  ├──Console/
       │  │  ├──Command/
       │  │  │  ├── AdditionalCommandCollection.php 
      -│  │  │  ├── BaseCommand.php Base class for all commands.
      -│  │  │  └── GenerateCommand.php Base class for all commands.
      +│  │  │  ├── BaseCommand.php 
      +│  │  │  └── GenerateCommand.php 
       │  │  ├──ProgressBar/
       │  │  │  ├── ProgressBarFactory.php 
       │  │  │  └── StylizedProgressBar.php 
      -│  │  └── App.php An Application is the container for a collection of commands.
      +│  │  └── App.php 
       │  ├──Core/
       │  │  ├──Cache/
       │  │  │  ├──LocalCache/
       │  │  │  │  ├──Exception/
      -│  │  │  │  │  └── ObjectNotFoundException.php Exception is the base class for all Exceptions.
      +│  │  │  │  │  └── ObjectNotFoundException.php 
       │  │  │  │  └── LocalObjectCache.php 
       │  │  │  ├── EntityCacheItemPool.php 
      -│  │  │  ├── SharedCompressedDocumentFileCache.php 
      -│  │  │  └── SourceLocatorCacheItemPool.php 
      +│  │  │  └── SharedCompressedDocumentFileCache.php 
       │  │  ├──Configuration/
       │  │  │  ├──Exception/
      -│  │  │  │  └── InvalidConfigurationParameterException.php Exception is the base class for all Exceptions.
      +│  │  │  │  └── InvalidConfigurationParameterException.php 
       │  │  │  ├──ValueResolver/
       │  │  │  │  ├── ArgvValueResolver.php We supplement the values by replacing the shortcodes with real values by the arguments passed to ...
       │  │  │  │  ├── InternalValueResolver.php We supplement the values by replacing the shortcodes with real values by internalValuesMap
      @@ -50,7 +49,7 @@ Directory layout ( only documented files shown ):
       │  │  │  └── ConfigurationParameterBag.php Wrapper for getting raw configuration file data
       │  │  ├──Logger/
       │  │  │  └──Handler/
      -│  │  │  │  └── GenerationErrorsHandler.php Base Handler class providing the Handler structure, including processors and formatters
      +│  │  │  │  └── GenerationErrorsHandler.php 
       │  │  ├──Parser/
       │  │  │  ├──Entity/
       │  │  │  │  ├──Cache/
      @@ -106,9 +105,10 @@ Directory layout ( only documented files shown ):
       │  │  │  │  │  └── PageRstLinkerPlugin.php Adds URLs to empty links in rst format; Links may contain: 1) Short entity name 2) Full entity na...
       │  │  │  ├──Event/
       │  │  │  │  ├──Parser/
      +│  │  │  │  │  ├── BeforeParsingProcess.php 
       │  │  │  │  │  └── OnLoadSourceLocatorsCollection.php Called when source locators are loaded
       │  │  │  │  └──Renderer/
      -│  │  │  │  │  ├── AfterRenderingEntities.php Event is the base class for classes containing event data.
      +│  │  │  │  │  ├── AfterRenderingEntities.php 
       │  │  │  │  │  ├── BeforeCreatingDocFile.php Called before the content of the documentation document is saved to a file
       │  │  │  │  │  ├── BeforeRenderingDocFiles.php The event occurs before the main documents begin rendering
       │  │  │  │  │  ├── BeforeRenderingEntities.php The event occurs before the rendering of entity documents begins, after the main documents have b...
      @@ -118,7 +118,7 @@ Directory layout ( only documented files shown ):
       │  │  │  │  │  ├── OnGettingResourceLink.php Event occurs when a reference to an entity (resource) is received
       │  │  │  │  │  └── OnLoadEntityDocPluginContent.php Called when entity documentation is generated (plugin content loading)
       │  │  │  ├── OnlySingleExecutionEvent.php 
      -│  │  │  ├── PluginEventDispatcher.php The EventDispatcherInterface is the central point of Symfony's event listener system.
      +│  │  │  ├── PluginEventDispatcher.php 
       │  │  │  ├── PluginInterface.php 
       │  │  │  └── PluginsCollection.php 
       │  │  └──Renderer/
      @@ -148,6 +148,7 @@ Directory layout ( only documented files shown ):
       │  │  │  │  │  ├── CustomFilterInterface.php 
       │  │  │  │  │  ├── CustomFiltersCollection.php 
       │  │  │  │  │  ├── FixStrSize.php The filter pads the string with the specified characters on the right to the specified size
      +│  │  │  │  │  ├── Implode.php Join array elements with a string
       │  │  │  │  │  ├── PregMatch.php Perform a regular expression match
       │  │  │  │  │  ├── PrepareSourceLink.php The filter converts the string into an anchor that can be used in a GitHub document link
       │  │  │  │  │  ├── Quotemeta.php Quote meta characters
      @@ -178,10 +179,9 @@ Directory layout ( only documented files shown ):
       │  │  │  │  ├──Entity/
       │  │  │  │  │  ├──Cache/
       │  │  │  │  │  │  └── CacheablePhpEntityFactory.php 
      -│  │  │  │  │  ├──Exception/
      -│  │  │  │  │  │  └── ReflectionException.php Exception is the base class for all Exceptions.
      -│  │  │  │  │  ├──Reflection/
      -│  │  │  │  │  │  └── ReflectorWrapper.php 
      +│  │  │  │  │  ├──PhpParser/
      +│  │  │  │  │  │  ├── NodeValueCompiler.php 
      +│  │  │  │  │  │  └── PhpParserHelper.php 
       │  │  │  │  │  ├── BaseEntity.php 
       │  │  │  │  │  ├── ClassEntity.php Class entity
       │  │  │  │  │  ├── ClassEntityCollection.php Collection of PHP class entities
      @@ -213,13 +213,7 @@ Directory layout ( only documented files shown ):
       │  │  │  │  │  │  ├── IsPublicCondition.php Check is a public property or not
       │  │  │  │  │  │  ├── OnlyFromCurrentClassCondition.php Only properties that belong to the current class (not parent)
       │  │  │  │  │  │  └── VisibilityCondition.php Property access modifier check
      -│  │  │  │  ├──SourceLocator/
      -│  │  │  │  │  ├──Internal/
      -│  │  │  │  │  │  ├── CachedSourceLocator.php 
      -│  │  │  │  │  │  └── SystemAsyncSourceLocator.php 
      -│  │  │  │  │  ├── AsyncSourceLocator.php Lazy loading classes. Cannot be used for initial parsing of files, only for getting specific docu...
      -│  │  │  │  │  └── CustomSourceLocatorInterface.php 
      -│  │  │  │  ├── ComposerParser.php 
      +│  │  │  │  ├── ComposerHelper.php 
       │  │  │  │  └── ParserHelper.php 
       │  │  │  ├──Plugin/
       │  │  │  │  ├──CorePlugin/
      @@ -233,7 +227,7 @@ Directory layout ( only documented files shown ):
       │  │  │  │  │  │  └── EntityDocUnifiedPlacePlugin.php This plugin changes the algorithm for saving entity documents. The standard system stores each fi...
       │  │  │  │  └──Event/
       │  │  │  │  │  ├──Entity/
      -│  │  │  │  │  │  └── OnCheckIsClassEntityCanBeLoad.php Event is the base class for classes containing event data.
      +│  │  │  │  │  │  └── OnCheckIsClassEntityCanBeLoad.php 
       │  │  │  │  │  └──Parser/
       │  │  │  │  │  │  ├── AfterLoadingClassEntityCollection.php The event is called after the initial creation of a collection of class entities
       │  │  │  │  │  │  └── OnAddClassEntityToCollection.php Called when each class entity is added to the entity collection
      @@ -257,4 +251,4 @@ Directory layout ( only documented files shown ):
       
       

      -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
      Last modified date: Sat Sep 2 21:01:47 2023 +0300
      Page content update date: Mon Nov 06 2023
      Made with Bumble Documentation Generator
      \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
      Last modified date: Sat Sep 2 21:01:47 2023 +0300
      Page content update date: Mon Nov 13 2023
      Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/readme.md b/docs/tech/readme.md index 79334796..6920a72e 100644 --- a/docs/tech/readme.md +++ b/docs/tech/readme.md @@ -44,4 +44,4 @@ After that, the process of parsing the project code according to the configurati

      -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
      Last modified date: Thu Oct 5 17:42:06 2023 +0300
      Page content update date: Mon Nov 06 2023
      Made with Bumble Documentation Generator
      \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
      Last modified date: Thu Oct 5 17:42:06 2023 +0300
      Page content update date: Mon Nov 13 2023
      Made with Bumble Documentation Generator \ No newline at end of file From 7dc3d383e3e5d7fb333e2d5a0a6eab6b724213eb Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Tue, 14 Nov 2023 01:06:01 +0300 Subject: [PATCH 057/210] Removing old event --- .../Parser/OnLoadSourceLocatorsCollection.php | 23 ------------------- 1 file changed, 23 deletions(-) delete mode 100644 src/Core/Plugin/Event/Parser/OnLoadSourceLocatorsCollection.php diff --git a/src/Core/Plugin/Event/Parser/OnLoadSourceLocatorsCollection.php b/src/Core/Plugin/Event/Parser/OnLoadSourceLocatorsCollection.php deleted file mode 100644 index 7025c7d3..00000000 --- a/src/Core/Plugin/Event/Parser/OnLoadSourceLocatorsCollection.php +++ /dev/null @@ -1,23 +0,0 @@ -sourceLocatorsCollection; - } -} From cff7a77551620c7c138915825190037b11624a1e Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Tue, 14 Nov 2023 01:06:22 +0300 Subject: [PATCH 058/210] Updating doc --- docs/shared_c.cache | 2 +- .../classes/OnLoadSourceLocatorsCollection.md | 108 ------------------ docs/tech/4.pluginSystem/readme.md | 2 +- .../classes/OnLoadSourceLocatorsCollection.md | 108 ------------------ docs/tech/map.md | 3 +- 5 files changed, 3 insertions(+), 220 deletions(-) delete mode 100644 docs/tech/4.pluginSystem/classes/OnLoadSourceLocatorsCollection.md delete mode 100644 docs/tech/classes/OnLoadSourceLocatorsCollection.md diff --git a/docs/shared_c.cache b/docs/shared_c.cache index 9fe18f74..c77a82c0 100644 --- a/docs/shared_c.cache +++ b/docs/shared_c.cache @@ -1 +1 @@ -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 \ No newline at end of file +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 \ No newline at end of file diff --git a/docs/tech/4.pluginSystem/classes/OnLoadSourceLocatorsCollection.md b/docs/tech/4.pluginSystem/classes/OnLoadSourceLocatorsCollection.md deleted file mode 100644 index b8654837..00000000 --- a/docs/tech/4.pluginSystem/classes/OnLoadSourceLocatorsCollection.md +++ /dev/null @@ -1,108 +0,0 @@ - - BumbleDocGen / Technical description of the project / Plugin system / OnLoadSourceLocatorsCollection
      - -

      - OnLoadSourceLocatorsCollection class: -

      - - - - - -```php -namespace BumbleDocGen\Core\Plugin\Event\Parser; - -final class OnLoadSourceLocatorsCollection extends \Symfony\Contracts\EventDispatcher\Event -``` - -
      Called when source locators are loaded
      - - - - - - -

      Initialization methods:

      - -
        -
      1. - __construct -
      2. -
      - -

      Methods:

      - -
        -
      1. - getSourceLocatorsCollection -
      2. -
      - - - - - - - -

      Method details:

      - -
      - - - -```php -public function __construct(\BumbleDocGen\Core\Parser\SourceLocator\SourceLocatorsCollection $sourceLocatorsCollection); -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
      NameTypeDescription
      $sourceLocatorsCollection\BumbleDocGen\Core\Parser\SourceLocator\SourceLocatorsCollection-
      - - - -
      -
      -
      - - - -```php -public function getSourceLocatorsCollection(): \BumbleDocGen\Core\Parser\SourceLocator\SourceLocatorsCollection; -``` - - - -Parameters: not specified - -Return value: \BumbleDocGen\Core\Parser\SourceLocator\SourceLocatorsCollection - - -
      -
      - - \ No newline at end of file diff --git a/docs/tech/4.pluginSystem/readme.md b/docs/tech/4.pluginSystem/readme.md index bcd2ebc4..dc0df8eb 100644 --- a/docs/tech/4.pluginSystem/readme.md +++ b/docs/tech/4.pluginSystem/readme.md @@ -151,7 +151,7 @@ in a separate directory structure, so they are not duplicated.

      Default events

      - +

      Adding a new plugin

      diff --git a/docs/tech/classes/OnLoadSourceLocatorsCollection.md b/docs/tech/classes/OnLoadSourceLocatorsCollection.md deleted file mode 100644 index 41627325..00000000 --- a/docs/tech/classes/OnLoadSourceLocatorsCollection.md +++ /dev/null @@ -1,108 +0,0 @@ - - BumbleDocGen / Technical description of the project / Class map / OnLoadSourceLocatorsCollection
      - -

      - OnLoadSourceLocatorsCollection class: -

      - - - - - -```php -namespace BumbleDocGen\Core\Plugin\Event\Parser; - -final class OnLoadSourceLocatorsCollection extends \Symfony\Contracts\EventDispatcher\Event -``` - -
      Called when source locators are loaded
      - - - - - - -

      Initialization methods:

      - -
        -
      1. - __construct -
      2. -
      - -

      Methods:

      - -
        -
      1. - getSourceLocatorsCollection -
      2. -
      - - - - - - - -

      Method details:

      - -
      - - - -```php -public function __construct(\BumbleDocGen\Core\Parser\SourceLocator\SourceLocatorsCollection $sourceLocatorsCollection); -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
      NameTypeDescription
      $sourceLocatorsCollection\BumbleDocGen\Core\Parser\SourceLocator\SourceLocatorsCollection-
      - - - -
      -
      -
      - - - -```php -public function getSourceLocatorsCollection(): \BumbleDocGen\Core\Parser\SourceLocator\SourceLocatorsCollection; -``` - - - -Parameters: not specified - -Return value: \BumbleDocGen\Core\Parser\SourceLocator\SourceLocatorsCollection - - -
      -
      - - \ No newline at end of file diff --git a/docs/tech/map.md b/docs/tech/map.md index b41ec5c8..fa60ef5e 100644 --- a/docs/tech/map.md +++ b/docs/tech/map.md @@ -105,8 +105,7 @@ Directory layout ( only documented files shown ): │ │ │ │ │ └── PageRstLinkerPlugin.php Adds URLs to empty links in rst format; Links may contain: 1) Short entity name 2) Full entity na... │ │ │ ├──Event/ │ │ │ │ ├──Parser/ -│ │ │ │ │ ├── BeforeParsingProcess.php -│ │ │ │ │ └── OnLoadSourceLocatorsCollection.php Called when source locators are loaded +│ │ │ │ │ └── BeforeParsingProcess.php │ │ │ │ └──Renderer/ │ │ │ │ │ ├── AfterRenderingEntities.php │ │ │ │ │ ├── BeforeCreatingDocFile.php Called before the content of the documentation document is saved to a file From 2763afaa7167c91363270875e85e9484bce9e6f9 Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Tue, 14 Nov 2023 18:10:26 +0300 Subject: [PATCH 059/210] Adding UPGRADE info --- UPGRADE.md | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 UPGRADE.md diff --git a/UPGRADE.md b/UPGRADE.md new file mode 100644 index 00000000..a6260771 --- /dev/null +++ b/UPGRADE.md @@ -0,0 +1,27 @@ +# Upgrade Documentation + +This document serves as a reference for updating your current version of the BumbleDocGen library regarding deprecation or backward compatibility issues. + +## Upgrading from BumbleDocGen 1.6.0 to 2.0.0 + +* The BetterReflection library and classes that depend on it in the code have been removed: + * `\BumbleDocGen\Core\Cache\SourceLocatorCacheItemPool` + * `\BumbleDocGen\Core\Plugin\Event\Parser\OnLoadSourceLocatorsCollection` + * `\BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException` + * `\BumbleDocGen\LanguageHandler\Php\Parser\Entity\Reflection\ReflectorWrapper` + * `\BumbleDocGen\LanguageHandler\Php\Parser\SourceLocator\AsyncSourceLocator` + * `\BumbleDocGen\LanguageHandler\Php\Parser\SourceLocator\CustomSourceLocatorInterface` + * `\BumbleDocGen\LanguageHandler\Php\Parser\SourceLocator\Internal\CachedSourceLocator` + * `\BumbleDocGen\LanguageHandler\Php\Parser\SourceLocator\Internal\SystemAsyncSourceLocator` +* Class `\BumbleDocGen\LanguageHandler\Php\Parser\ComposerParser` renamed to `\BumbleDocGen\LanguageHandler\Php\Parser\ComposerHelper` +* Doc block parsing has been removed: + * `\Roave\BetterReflection\Reflection\ReflectionMethod::getDocBlockReturnTypes()` + * `\Roave\BetterReflection\Reflection\ReflectionFunction::getDocBlockReturnTypes()` + * `\Roave\BetterReflection\Reflection\ReflectionParameter::getDocBlockTypes()` + * `\Roave\BetterReflection\Reflection\ReflectionParameter::getDocBlockTypeStrings()` + * `\Roave\BetterReflection\Reflection\ReflectionProperty::getDocBlockTypes()` + * `\Roave\BetterReflection\Reflection\ReflectionProperty::getDocBlockTypeStrings()` +* Method `\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity::hasAnnotationKey()` has been removed. +* Method `\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity::getExtends()` has been removed. +* Method `\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity::getInterfacesString()` has been removed. +* Now documentation for built classes does not load automatically From e90deb1d63dd417ff53d0bb240709ae1cbf7dea4 Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Tue, 14 Nov 2023 18:15:32 +0300 Subject: [PATCH 060/210] Removing old config param --- UPGRADE.md | 1 + bumble_doc_gen.yaml | 1 - demo/demo1/demo-config.yaml | 1 - .../demo-config.yaml | 2 -- .../demo-config.yaml | 2 -- demo/demo4-config-array/demoScript.php | 3 -- docs/README.md | 2 +- docs/shared_c.cache | 2 +- docs/tech/1.configuration/readme.md | 3 +- docs/tech/2.parser/entity.md | 2 +- docs/tech/2.parser/entityFilterCondition.md | 2 +- docs/tech/2.parser/readme.md | 2 +- docs/tech/2.parser/sourceLocator.md | 2 +- docs/tech/3.renderer/01_templates.md | 2 +- docs/tech/3.renderer/02_breadcrumbs.md | 2 +- docs/tech/3.renderer/03_documentStructure.md | 2 +- docs/tech/3.renderer/04_twigCustomFilters.md | 2 +- .../tech/3.renderer/05_twigCustomFunctions.md | 2 +- docs/tech/3.renderer/readme.md | 2 +- .../tech/3.renderer/templatesDynamicBlocks.md | 2 +- docs/tech/3.renderer/templatesLinking.md | 2 +- docs/tech/3.renderer/templatesVariables.md | 2 +- docs/tech/4.pluginSystem/readme.md | 2 +- docs/tech/classes/PhpHandlerSettings.md | 35 ++----------------- docs/tech/map.md | 2 +- docs/tech/readme.md | 2 +- .../Php/PhpHandlerSettings.php | 16 --------- .../Php/phpHandlerDefaultSettings.yaml | 1 - 28 files changed, 22 insertions(+), 79 deletions(-) diff --git a/UPGRADE.md b/UPGRADE.md index a6260771..a23f1d63 100644 --- a/UPGRADE.md +++ b/UPGRADE.md @@ -25,3 +25,4 @@ This document serves as a reference for updating your current version of the Bum * Method `\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity::getExtends()` has been removed. * Method `\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity::getInterfacesString()` has been removed. * Now documentation for built classes does not load automatically +* Removed the `async_source_loading_enabled` configuration option (Method `\BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings::asyncSourceLoadingEnabled()`) diff --git a/bumble_doc_gen.yaml b/bumble_doc_gen.yaml index 9ab32fc8..b1f0a796 100644 --- a/bumble_doc_gen.yaml +++ b/bumble_doc_gen.yaml @@ -8,7 +8,6 @@ language_handlers: class: \BumbleDocGen\LanguageHandler\Php\PhpHandler settings: file_source_base_url: 'https://github.com/bumble-tech/bumble-doc-gen/blob/master' - async_source_loading_enabled: true source_locators: - class: \BumbleDocGen\Core\Parser\SourceLocator\RecursiveDirectoriesSourceLocator arguments: diff --git a/demo/demo1/demo-config.yaml b/demo/demo1/demo-config.yaml index d7bc976c..8a6c865e 100644 --- a/demo/demo1/demo-config.yaml +++ b/demo/demo1/demo-config.yaml @@ -9,7 +9,6 @@ language_handlers: class: \BumbleDocGen\LanguageHandler\Php\PhpHandler settings: file_source_base_url: '#' - async_source_loading_enabled: true source_locators: - class: \BumbleDocGen\Core\Parser\SourceLocator\RecursiveDirectoriesSourceLocator arguments: diff --git a/demo/demo2-add-missing-doc-blocks/demo-config.yaml b/demo/demo2-add-missing-doc-blocks/demo-config.yaml index 228705e0..77f76674 100644 --- a/demo/demo2-add-missing-doc-blocks/demo-config.yaml +++ b/demo/demo2-add-missing-doc-blocks/demo-config.yaml @@ -4,8 +4,6 @@ templates_dir: '%WORKING_DIR%/demo/demo2-add-missing-doc-blocks/templates' language_handlers: php: class: \BumbleDocGen\LanguageHandler\Php\PhpHandler - settings: - async_source_loading_enabled: true source_locators: - class: \BumbleDocGen\Core\Parser\SourceLocator\RecursiveDirectoriesSourceLocator arguments: diff --git a/demo/demo3-generating-readme-file/demo-config.yaml b/demo/demo3-generating-readme-file/demo-config.yaml index bca8adfc..c5556723 100644 --- a/demo/demo3-generating-readme-file/demo-config.yaml +++ b/demo/demo3-generating-readme-file/demo-config.yaml @@ -4,8 +4,6 @@ templates_dir: '%WORKING_DIR%/demo/demo3-generating-readme-file/templates' language_handlers: php: class: \BumbleDocGen\LanguageHandler\Php\PhpHandler - settings: - async_source_loading_enabled: true source_locators: - class: \BumbleDocGen\Core\Parser\SourceLocator\RecursiveDirectoriesSourceLocator arguments: diff --git a/demo/demo4-config-array/demoScript.php b/demo/demo4-config-array/demoScript.php index 701a7c17..5409140e 100644 --- a/demo/demo4-config-array/demoScript.php +++ b/demo/demo4-config-array/demoScript.php @@ -18,9 +18,6 @@ 'language_handlers' => [ 'php' => [ 'class' => \BumbleDocGen\LanguageHandler\Php\PhpHandler::class, - 'settings' => [ - 'async_source_loading_enabled' => true, - ], ] ], 'source_locators' => [ diff --git a/docs/README.md b/docs/README.md index 60813573..3527e780 100644 --- a/docs/README.md +++ b/docs/README.md @@ -95,4 +95,4 @@ To update this documentation, run the following command:

      -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
      Last modified date: Sat Oct 28 11:03:31 2023 +0300
      Page content update date: Mon Nov 13 2023
      Made with Bumble Documentation Generator
      \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
      Last modified date: Sat Oct 28 11:03:31 2023 +0300
      Page content update date: Tue Nov 14 2023
      Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/shared_c.cache b/docs/shared_c.cache index c77a82c0..e500cfa8 100644 --- a/docs/shared_c.cache +++ b/docs/shared_c.cache @@ -1 +1 @@ -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 \ No newline at end of file +eJzsvXmPG8m1L/g+ykMDF8+eAdyxLzIGAy29CNPq1pVk3z9GD0asJdpVxQLJklvX4+8+kVxKJCsZzCSTqayM40XF5BJJnvjF2RfzjFP57F/zZ5Q/+256F2ZmMZnezv92Pb362/eL4D59PwvG34Q/3fg/Lf45ufruz+YZrt5P2LPv7j7dvbw28/kPt4vJ4svL6fV1cNXHv/vzb89kWu/F/Y29Dq+m7qdw+/HldBY+vjWzeZh9XH3g49dP/DK9+m1z848Pj+ZbS67uitH2t6y+DHr2r3//+9/p++tn38XJdZj/zYe7cOvDrZuki0O/gT771+QZSt9ToLrv+a5aYZa+6cvp7SL8vvj4arPol48/prt8vfzuGVt+MbG6/ev09tmtuf5lcvuP7/6cvpZ89t2//mMRbu6uzaL6cpPZf/y7/kulRdSz71x1w9tFukla6F24Cr9/9+df/7z65Tdm4T69TvddP5e24JOZf1rehzz7jiCsogqOhShppMpRTKXSQQlmdTTuuz//e/IM9/CbSd1vfvfD81dvfmjyc+fPeFrh+z/86z/++If/+X//8Q/zsEgP/viHhJnr8Mc//L//8//63/9n+vO/vvvff/zDn/6PP/7hf/1/36XX/+Pff/z+uxpCTZ6px6TyPBokI4s80chxHYS3xDCmBJUcMbkkFalIVQvjHKleTWYJstPZl216kYpeKt34f5y92P9I5NynOK5DWfWCxJ3ccpt0XDGPUeDUOUldkJprL7hI1yQiFn0i3b9X76xlJzfmbrC8BCu6/DqJmu56ehsePiw4pyoipKkWovpGQp/8jV7urLw+Sqp+n05Y8H/cz81VeDm9v11U2Mdp19Kv6mrxeH+7fM+v5iYsgUeXLCCh8cWXt2bxab4EHe/sfmZ2NV/DpGLXDw+WB/r7+cyt0Ka7I9+0DjB9YrB6miUEThbV02G5dJJkjkuMFDIcy+qRtAQ5ZZnFAfHgBF9+x9NR+Xr3blv4XLKucwh8aOk6pOoL3Casn1lSV4olfekeoZ6/rljhfHodPj73Pj354nrq/pH26+bG3Prq61WY45mPpcvl/d8lqf4mfFiz4q0Fqt/H9kGUFlh/cDqbf3y478Nz1QdJded9ib37wXdLVWJz051P04pt48effjubfp4kIfCjWTL76q2semvNT9y8dSl1kh4Rqjfz6udk1p1XsL/deqL6kKg+JB5/6MPMTBbzj+8/mVnwa5qlzZ245QvVJ+WfV2JiDxzrLbu728h5vr/65j3rVavtnVSwMNfrZ7aP+eSZrr7hY/Vod40XZr6zs0t+dOjLbT60Acj2BytM8H0ibj6YCHc1C/P5CzPbfry1YZisdaWjn3+/+HI9+e/gt55bLlCh49FhWJ65l8Z9Cusjt3ycztfN2+n0evm5CipCHf7cL1OXCLxa4ncX7lZ80P49EfrX6eLHdOb9w/PLBXk9JeoWXD5crbV8Yvn5CllcHv78A7Tuqp8fqiN+f7NSPMPXVWTdGV2tMr2Nk6v7jczYvlp+Uh2+/+FPJr6W5GglPM3VcpUKfapWOd9d5StNX99+NtcTX7/sDolJhVJRv9c7i//VXN8nNpYw9Dkx3eezq887zyzXqoArGvzc3bU2auvj9Sogi8dAPrLeuxAfL0UPQzOz1M7VDqMjFdZl0++WGNbtPE5nN5s1P0yXau3W88tFK7zLxyyj6aJfn9j9rqKeBc6qU3N1lT7+c2I91+nvmhulW/wwmyURsn5+uYis5yqPBHHFBh+r62mB6jDIWqTtSfLl0Vz++/+ELw8PHuTX7m/Ta3um5aqvQjT314tHiy+FY3UmGmlNu2tu7Ke1+VS/Nj6I6YNrm/TG1bM7P50u+Xwtphss9SBDKT14ahss818zc3e3oy/QpRRoohdn1vv67XidhnV8tTdh8Wm6FKdUtKL4lmx7n35S0kV/Dtd3qzNAqzPQnZFXraiaQq2lgl6trZseuCMGyg7qGFrbcl2aPdW6S02/yTbVr/t+cnu1AdH7YGbu0w4xWHVYWAOU1xw0tjwhtQJ497MVN63A9246XdSxQMYa8tCDC/CGR75ugflPs+n9UiVm4qBedWiZXYJU50DmiLny3CVGuFKrl+ru9Hb/2R/NdaUyry+XK1fnQeV+YMOVkwL3oeLBiRWbSYW17ZssFarcz292k0rlXAT/+nZndV4dEFUrxE9ZPSnG+zeoToqsFeetbvBhdr9LfL4UKLmj/Xjh9aMHaHF6UJ9stMaHL3fpEN/fLNdaHpccczy41q5RWp0amgNVMoAqw2F1tfzIYZVp/ZH30/uZC8tNms6WSs/OM8tF5DFa7C6y8bEmRv54repgiByqdteqDsBKOExnjxfTB5XX2sXeBXc/m08+h9w3FOiYnN1ddMWwq+/5eKmlkpQ7oHtLbV/tbL0g7bZg52pPQgl6WNW8vr+arB6vH/5i5glOV0u7frJI3+jxM8s12eFf+mjN6tOVbz+s8Pb1crkSP6zG5VaqHv68uLleXa5eX64nDlPu2HqP1loehPrTdGytd/PFo+XUYSm4WuOHz8mI3+zwixCr1dNFQlw66S6Z+stl9GHAbi/zEBZ5HpfRqOoqrbTRuZZ+KHRsG/eWWn2nl7OQFJTbq/T+6hwsV8LHyF670sO3Wi+1+lYZ8DdZa+cXHgX/3lq/3S5/Xdi4VILfUfCXa2YshQNr/hQWa169cWvOE09afcPDxnNmtc0yVZjixZd3IT2u+NzUVU8slxUtt3a5bLWrld9gyU2W4bi0kjzogzi00i9TsyZb9Y2Wb3q5Co0uF1yGMOvl42rB326vv6wV498TD18a9p83n9Z1btftT6/+LD/wajK/q6Knq41TqN4fuv/RHVaslq7u3HFb/dnjuooclMRfcVsFzd0svWG+/fir4aboQaQdW+TDPyfpIHyezKa3N2vKqcO4bRsCrlbjB62LFrH3aiFx8IjmFtq89vWpLWNeyYM2ZLs1d6GgWnzTNf94cG4d8IYofVAoHFyzhidpdNDEb7rMHoA1rovU1K+450Fafpwcp9UDizj8zA6tND2+qw3W3P+h7KCUf1hjI9zXYni6q8k8PLtcjh/ficfL/TRZfLq31fPzxys2OCCPV3z0zC4pqwNC87xg82D5flUXIat//1f+pfVxDD3s9Frr344IoQrVNE/LjSTcaCIY4eOct+KOayusiqFVyTW3ix9n05tfQlzFbxE5zt62V3l5P19Mb1YXO5TGiB7U146utAdVjNhB0Vm71o+T398vZu8n/73+Kvyg7Kz9+OtE2qlff3YZ7swzqu3Pvp2FqzeV7F19WrbblPTpOzPbmFhrTQQj1e47/Of9dBFuwsKsPq0P+glqP/0u3Ew/VzcPL2bmHyt9Ei/Do/U+qNpFEvkr38CH6V9mq2DjKkxaq+/VLlC5gz5MX6ZtWEbTV2scCJXm1/g5KQdJqVqtQA/a5XsrrHNkNrBcX+5CHDdgobnV9mG+DKA2OjKb9V7NzD83cm3pPH0Tbu9Xa4njWs/htTYy8gGCuDGQN8tVjCmp1msFeI2iw26RA6tsAu4VW99S81ar6farLXaoVa26AWgmtHp8tQ29HhbDB31hBxarbIcHjfrBZsCroGqTo79Z6G2yBR85k58n8Tpfr0gPxsd3V3xjkjXxe/om8w0+l1HUJkyg+miNJo6XEVOyf+/Vn69BN7yMgNL9c7D9tp38CVkXc/rF3F7dV86Sdax073r3IC+DnY9Y5JEl9k/vMrb5iMPtL/L2093G01ElMkzn24oDXsYyH6UgZNZ4FMVdLbP0Oe+j5vgye1G59IbVC9vkro9jNlj7a2Loap3aGH+rdfY2gNZ65xqsmDjxwmwOzWopXqd7tl1q//uJOnFxfNFXX27NzcStYqTbX1LWMZnj6z1eSNXp7u0W2v+t+rTd3V5y94yuIpktjtd6xfTM+olfkzKxzLyoDt5knSiBl5HMR971Nus+PNo6yMsA5glYTGZLWmLxZWt3WK0vr+1Se/uzjG0mHb35qo+CN9U53OB9/8XX8ySGPi8T5bYiVngZEE3q+AXvmjRft6iSxHbuK5b3bbHJbe97b68nbu+mcnnTFohtddO/TuYTO7lebu3ObVUnt21wuzdTP4mTDeCrA69bMLf9G6xOfkMgLaO2ugV7aX63WgAtg7j6DNwevF8NcJaB3WQ6dn23yr1cGfsv72ezpJFt0LV954rV6M5vfAiqy4jxObu4YXFNUbNiP/vejY5uWA8ccSZFM3esg86K57QQ5U3v1wA8FePRF7j1QfjoOndA5oaPpPQyCP4odbp2hU93W9mVWNQmfec/+H4VZ1rZrstIt2rELh+FXJc+2E937xf31obZ3uXXuCteRsB1I/ocu0d6uDF1p7OaO7HOfk16+JfbyaLmHrwu16jZPTaW1lvj/lH5mjc3q7mLaM4iHt3mweWefkESjMmeT8pr/bPbt5R1qXSZO67ijmst77fbl5+C+8fr+bZdZG5fhMqhsFpftdycnXD8MoperZWge9j0ErU5Wk3v8dvtc++3Fq/8fjvLLwP2qsk5bRMQ2WIEyzh+M6Upc4e36/LHD9M3/uFi82qdP2QZ8m+kNLW9a3Wx9abV3Rpb3BkP4XL1N+ZuteIyrb4Jyz/sQlstuNQb5i+m/svLjedd8j//+9/LsvCKx1+FRYXC4H+brTIVfg3/lNJRZiMmNiQzkTPDjaFc+0i9VIyEqpzuQjmqq4pPzU4vdcusXlNUd6k7LevqvmwqQVuX1K3Qe4kvtl+kSlA9Br5bS4VLfIe9wtUT6JNDr8PaCoqpwJRpRGR61SIRNedee4MloLcles+o7CwMx2dQKodoSg3GDknJCVeaG40xQUZrapSMyAOiW/Pj9qXGhSH5BArlEOylC9YYhSgj0nLOLUJGcSeDTdcCNIrWPPnEmvfCYHwqmbL6hSeGGOGDwR4JxbHSEUnBnI7CcakByy2x3KgDQ2HAbUSTrA1nkqpAgxGSOOUUM8ojq1igmnpNCAKUtkVps+YfpeG0GVVySA3CK2Ww4hITEZhTKErCGeOM+IgsBqS21W7bdZ4pDLEtqZO1ywJBhFKNiJNSBaYIp5RzL3VSA1AA5LZG7gntj0qD7wkkymLY4UhIiE4ipwgT0SCqbSCSGk6x4YDhlhjON+IqDK15YmRxmRgoj8RIi50WTlsmY7rQLCgkMaKAy7Yeg7OavxWG2/OIlbXLrEVLj4FhNihhHbLpH0mQD45H7UeCa9afztCqIWFhOG5HnBxujWfRM6EMMVRwrUyQDAVCLHGaRhJHgtsedd3WPTFLw25rAmW9DJo6IjwV1mKDVBWCcIQIma6T9cZBn2itT5zamrUwGJ9MpxyaiZWCEEai4B4FZTBPGgQODnGenglj0SJ6RPPJjYJLg/PJhMrhWQsvLbFaG8Ii01hzqpxn2hjjEtQhPtxau2jbt7owGLemT143DkIEbAyyXopIldGYGY8USVBmoBu3Rm933dMLg3V3hMvhnRtZOYgJlsE7YpWh0UVPoqKIUW1A++hAl67btsfN/QuD98l0yqFZRM5UJJhzIhA2IkoXEDPCIoxNtIDm1mg+b9REaZg+j1pZrRojI3XlbtaRYmotskiFYFWwXGqhANltter2408KQ/MJFMrmWkYUmGG8mqQnjUAeM66ZMNIJH50UgOBueHPTMTyFoflMamUz4o1xPOnOSBOMeQxUeu+N10Jj54mHvIu2yL7MaKjCAH8ZImY92dS4yJi0hMWIOOJKUuGd4iSoiED7bu876WKKWWGw74RmWZTr4A2SGEdFDJXRcmIiIpgIiijxBlDeFuVdzdcrDeld0S1rd6KkyUhPHPOaasmJFI4JIrFmznEKWntrtHcw/bE0oHdAshzGkUQsCKEZS0wcIc9F9CZS5ZHU2I8mj++bx3xOGEtaGtI7I1yWpyuNqInecxWlkcI4ipnmgqCqH4GCWpe2eO92am5hmO+WeNm8Qad0tMFrZDlllBDKuA0mOGqMtRF86K1x3/Fg59KQ3zH5slZrutbWMoqE5IxKEZ3DhLrE/gPjgQH2W2L/vOnjhSH9PGIdyV8hQquImONSUOuxDkYTFR12jMix8PT+anCaDHP+Okqh5LqykwmV5dNc+qScB+Y01xWYJVUh6SzBKh4l1Eq211GajIv/OtPj/wlfHh78tGkiVLCK0i318pxcGIGo8lhgrGQQVFuGLdNaMIcYWKWtkZ8bN12/d69CNPfXi0dbWB7uu6RdDvVWCW6CltITHkJi/AgxrgSK0mAZIN+8Perrpwfndm5vRimg/yI0zFZdSGJtYNQ6iiNWBuOAk6XKlFHICg4e+G6iTAd3sHYCcWGg74JkWe9j4E7ZoJX02DCGqorlqKoi5mTAegIYb22p1g+eP75hZXabOpdc2dxeFZZaurXREoI4CoghL5hMOg3CCGo+W/Pv2tyOBpu1ntheaoV+Z3TLxk81RdQj5AylWLtgKNHSc88FRsSNxufYI9prKw2a71qZDL0jqmWRzomOHHHNbEJ6FMYILkVMdqrUJEawTlvrLO38adWereb+FIfuMyiVQzRDUTFEo3cMR0QFI4oxLiwOVpnAIJ/xcpbm6mL5+H0SstX0q/V0scKg3QXJsj5FgrGQXFFvJRc6ymCCwkQyJx2VDrTx1hhv4g+rv8nL6+lt+Eqf4qDeHeWyiKci0mR/BmoT2DmTWIekpfj0HxmkI4D4lohv5AGuv8nrRfVodZdJmJeL/YvQMHcKIg/MS6Qs4khKQh0jPIhopWWccAd1qBfJHai/ycOjch3qHVMv6380VFhhAxJJh0//Ju6PPJVUK2eDAo2nPfKb+BaO7N284OSwzumXtWkFoZYoFAylLgiWroMVgjCazoGEuQ+t0X8hYpV2CC5FxiNdZlBkIUkMKYVwPkbDpUSYWmw1FpA/2fYssAYRldWfcjWdk2iUzYWkxHMirdccW6oiFp5F6503zjGjwZ5t7cGpbYaye5OqHKFyI7+bThdrx1u5Csz5BMvmwkhpsDMEJTbNtJIEMZTwjZgXEjM7Fn2dDKpqA3B9FqGyfUerRkfEBkeMN1bLgKIR0nitCfVWAL9ujecGyUp12zT/aTa9L28227nkyuYAUOalccwrSpMKHSXGMkYvCTXK+QAzsltju0FtwdfNKlerPplO2ZltWDjFXfAMSWu89ZgxxIILSLEEdMjdau0pzNk+P06uF8uaAL+csPexGu80vd1/9kdzXU0uW18Wh/MLUDB3AhTGLqnbijObAG8x08ggTCiXQmFvoH9da29hTvg23L/JdfhQlc1MbxdmUnl+Sz0MlyVm1ovuscNBUks5w1qlC1ON/ybSe8upBz2n9bnIye9mW1lNf1gE//q24ANxGSoe6ZNkvdPEIswVRspgZElI6hL3BLMwFu9MjyehttHPKXv463RR9GG4GCGz88tl5J56SgWPRHJeueYF896ZaLSh0Duptc1Q2w6o1TZ+mN2XbDJ0TsCsPEAaR4SlIJFRG4L0hiHNOIlUSuuhcrW1ByiXHfJ4+9aPCnVtnkOrbM+BwDT2yfLFPGk5UUtqQlCaUWysNNB5o32MNZfvl9+pD1/u0i3ub4pDdyc0y/f6JYhhR2xgVgbOgzEqEuEVxSwKBJGp1rw7l9V9cMcK9uKfS6/s5CUusSacBG9ZDA5ZHoQmzmEbUBQY0N0W3TTnfns7m1ZzOFdXxQG5DWmy0wZoUJQmbAvuCA1UUix0tE5oQROWwc/YmiPnjKH30/uZC0ujfzpb9uPceaY4FJ9HrPxcJEZCcDgISa3WJKBQtcPQinlPAoHM20716d2tejWZhapxySTMy4Z3JzTL+gIxJYlj88AjT0o1p9QwpBChTFFrOdRatEZ5zqW7u2NVYG9VGTmdFQ7zToiW1VKE14oShxLUNXbIceSS6WgtNko6Bd6R1j7vHLF2t+xdcPez+eRzALaenRFzKvFyuMdYW8oCIRzzqCLBylmrnXXUB+I18PfW/L351q0WrRhW2WjvgmRZHcbpQB3j1HDDjCAYVc4SFLXCOHIDvL01xnM5Gnsbtn1VrlewA4rl+0nTqCPSEkcfRLCy6rdLkz2KpLIe6ucuaYvuXJXcA6ATmmW930Z7hZ2M0RHFGdUek6rkv8rwdVxaQHlbHb2eK13fX01Wj9cPfzHzxdvlV7y5mSwSR3r8THFo75R2WdRHoVAk3jAlJEmqC8Layaq838UEe8hO7Eh7ebRz1R79Mrn9R1i5hr9eFof1DiiW7WEhpfeMEBRC0lsoS/+oaJBLYNcYMYgQtUZ4fYVNbr+qhz8vbq5Xl6vXy8N5V3TLzw6IXHMdNLU+VBWlnlLMcCTBUcth4l1XuvqxXSsb6V3QLNuhNEhkuDcRGyKsQlITGgmpvIscM8g2bI/y+kD2sR17N1+UDfSOyJb1oRsvjLUEyYTsQJ1USOGgtE6od4JDjXXrDJf61KPVTv3wOb15c8cXIVZ7mC7S4m9nUxfm8+Iwfi658lNKiddMuiB99ChaK7yT0UuGkRAowpTSjuJD25u1mS348XlchNnqKq2/XH0SysN3FyTLYpxbXA028opbkxi5s9I7ZUXVMEBwCRjv1MOyt2ErlrTci7R+en8V3CsP4udTLJ+rKCgmgletLwL1ytEqz4UoETk34EPs2Oas3a8HnrTesALZeBc0y8b5K+atgnY6QZ17RQTzVkjHseHWGwQo7w/l5SorXdAsG+tn3PAqJdFEopzz0vJgo3dC0/RfsDa7jYLu7dhvt6t9SO+8v0mvBL+6w3rEYHFo75R2+Tx0K7TyCCOkKEGORK29o1YYT5XHwNtb8/b6OvMDO/dTWKxLvj6Em7vrtCfzV5NZgdy9G6pl+9UlTSUGXfWrQ0k3Z0QblfSaBHohA9eQ5dKav9cXDxzes81mvTWLTy++vAvpcZVfPXXVE8VBvmvyZaswmGYOO6+kpFRaZL1NvD5qRrnlRkA2+iU9McvNq1wK78J8lZ83uf1HcXDvgGLZbC4VAxVVQ1JKuBWeeSoS4D2RRgZGoRtpa4QfD35s7Ve1H6tVK360fFPVNjPcFjhOvTPCZbuMMqZi0l+i1RYhFqkOjHNLDKomeAkHeG+Jd1bfX2S1bb/dXn9ZL/V7cPfVx5c7WRy4T6RSXjexQUjmtfABVcmJLqE5RKaFcElbgUnqrZGcS81Y/Vluy6vJ/M4s3KcC3SunkCibqcKd0ZY4F6XCTKcXMVfI4xiZVCJApLM1huvHRm1vULlFb+2Ik503JBy2XBFjFDKIc8SRTwq0xcoGCb3KT8BtLqVi9afkUra25MlOYGHGCl4NNQw0gdggbxBTKpl8lbfDS8BuS+zWt3T6GlRLhPdult4w3378c7guMUBzHrGy+rBVMWrqMDZJc3BSmogdw9IwwgjBwJO7icgc26oP/5xc/XD7eTKb3t6UaOl1RLW81hw58yGYBHVnA2Ix/asiS2afRoJDdX3HSF86ln5ffHwV7qqnbt2Xh+ZlX74+B0g/jWrZ2jRLiQkIaWOcRMHypKI46yXxinKuwFvXGum1JlBuz6o8t5JBfjbB8nPGDUn/c9SZxLul5kILxBUlOlqFodtV+9h6bbQst12b174+9aNZ8qjioN4p7bJcnQeqAzFYY8KDk0lhJz6xc4EUw46C16816mtzPNvtXLluwY6pl/Ubeud55WpJeo2iGFnsdXRMahSQDhz0mUvx+3WK54eZuZ3H6ezG2M36BeO+S9rlUB+p1t4oIWSwwbtAifPWMR2E0lRCx/32HsfaVImDO1d6Uvi55MrnT0mDJJVYUEMZUTEGbBEP3scqrAn5U60t1NpMiaabVXKQqEPKZSsfNJOCRxuo4d4qapSLEZPoLMPJjgUdpjU3b+Zi2Dyxvi4O3qeSKdsVSCGksKvi+FEphHkMLGpElKIxEAXcu2N9fLVEeunwM6CPd0K77ExCzFBVqqap51EhxqhFBDPKIqdGc/C/dOx/abBzJestHVMvq617ZjWPkSkeCGKOE6kxT/91yFVdEAH5bbX1fDrHpovZurXTdLcP68OzxUG+K7Jle6wEEZF1nhEjsBAskvQvCcRSrpPCA3WbHVumjzftp8ni072tnp8XDvfuKJetVKaCoaS/axG4EEZhUXnb0xFIT2LmGCC+W23+8b49ega0+U5ol/Wue6EYs1Q4WiWBKcup0iL9CZIiYSEbrC3qaT6vafOgOEQ3pkt+YjhDSQ0hSmIjGY9SUI40RwgRw2UEtLZFK8vzmc2DQtPNW1In6/dGDBmkZNImhFBccJn0DeQttzQGJaDjT8d+7wen1np4aqlpWaeSKcuFLecuJjUZCy2YQ5a4hGUkmPVMeAf9N1vrDHkLZ9OCpshesq1ok9V0bdCaCmmDxD567A330ZpolbBYO6h4b82B826oqiilSmeuhoQ99/51leq2+HE2vfklxALjj2cRK1vPo2xSLDSyzhCvRGLMKCBCmObJpKNQudbeU5cXmdtb9fJ+vpjerC7KdVacT7BsxTGqWthjpnWwnDgUXSDCEmswdjQaiLK3xnctsY5uV8lBxi5Ilq3kQcpwQ6UIwSCttYoJ4oY7xZjzFqzD9n6NI1rj1ob9OPn9/WL2fvLf5THuE6mU7eftMOeMGsWT6mG4DF5bHJCQGnmKGdiGrZHcXHF8nUyhqS8QxieQKOurI1FFZzEmJlLCiabOchppINyEpG0DhttiOJ9Cv71Bb2fh6k3V/Ks8FJ9EpHy+UqySUVFQ2hHMo3CCGKWwMVwJ4SBf6YIej7RFd2YW3pfbevg8YmU9eUFhQSlVBBuEA0cWK+qpNVIYx6IHXF+OP//n/XQRbsLCFIfn04iUzbHDnEXFBXZReI4cEwxRE6gQgSeLEDKpW/PnfI7B9ha9CzfTzxWvCS9m5h8FTnY6i1bZKnWnaUSqirZwFSUytBrNpx1O2nPSqaHCqzWq81kI2zuVTPQPX+7Ch+lfZtflIfpUOmU9c0EJ4rWh0XNMhGBCWeEwM8Jizxh45lqjuXYAS+0ufQi/Lz5MXyZ7/cX11BWoQZ9Bqmyvy4CdZ54k/VkFmzg1U1I7LaSXSnMC+nNrTDcPD6w26udgfFq9PESfTKhs5j7nTAbknKBEu8SmA+JaK0YExjIQ8Ne1jhA2YTxrfG0CXuvLgqPgnRAty7c9FTJopVli1ioSSTy2jqogmaWIQO/t1jhv4qKq37Kio+EdkS3ru9Ya6aCx0k5JRbi2UrPIYrTV0JoIWL9I1sdm017NzD9frTu9LBd7E27vy8N5ByTL6y0B62iZwSJQIqyPMTpBgmMyIsUA460x3sSnVbdhm25GRQZqOqJavmcrFkIoQpDkIUgbk8JeTW8KiKiAAtTWXiQSudmzKjf+p7BYTzgs0NV9FrGyHaAkES5Gw1Xw3ERNI3bBLUfjJJ6uKOD6kpZner1aZdnaYmsaRnH47oZoWU3FEYwcr9quYmZ4ekwNwUKSdIWdAZxfGOeLHc2y2roSAzzdEC3b24wGFoxBLvHwBGvuuLOUGSnTg/QXYpetcZ7vznVwyzaqZZEw74Jm2Qi90cZKyVRggpCY9G+MuOCIW4KYkBFQ3lYbb5JHv9mxajsehi6WOaz9bHpls6poxcGlp4wRRmPVwYk6x5SQkjKOIauqNQ9vkvi22a23s8ntYrXq1xs/n/8ymZcH8+4Il81Q0SiBXDGBmXSEMBKIRJxxJUVEVAM3b4t31sAf9sZMbn/4PTGj+aTAANAJFMpWsGtkAuJOK+cN45EpJ5H3SEsduUPQmaG1PtIgE67an9KnrZ5Mpyyao8IGc0kiD9hxj7GIVQ2ZJgRHDL6S1mgm+9xm9ad6c4HdUI9QIz/516jIkUXcEJH0YymYMjKBMnimPERhWiOT7hNrey9K7TjWjCjZPCekBacKaUyMcQ4RQ1zAwhKNqTUGOtq01gf2PUq/mNur+/Rdfja3/jrdaO+63CS+MyiV79GkkMRWuwrDJkGZBaWc0AR5IRkDRLdG9L4UPLJPJafrnUWrLJ92zDFmk45rGCMmMhtQ9MIKSjhCFuy21qjeD3Dt79TbT3ebe76c3txN58W25j2HVPnqRYskTTh2GnEsmcSCOIwMoklpDhLmXrTGtGy+Uet7VuNKVg/Lg/V51Mp2teFaMFKVLUrjveBJHUmmoBRCRiksTHRpjWy5794/vlcvjfsUVv9Wc5DTG1YvlGorXoKEWY0lqd7Uc7TMYApa4agVw5R64gm3DCrFWnP3Ezbw2sznpbL3M8mVzV2K0WsTkTPRiWiQld4YnXQXzigiRAG2W2L7Ufi21WYVbHB2R7isPpM0dO9cYuaEMsaUo1pyJJEMTCgDfYHb430/GtZg26a384XZ5C2UB/TzKZbtc2YIJZII40VMZmikOGKLozNccCE1ZKO21tjP3a+CmXqntMv2e1ceeyFEwJEiJLXFAkuf1Jpq5jRGMOOrNV/fL386vnOvvtyam4l7Exafpr5U5t4R2bI6jNUq6eySUqmqx84wL63DjEUcjYdu2a3t0f3M4uObVjTIz6ZXvo+2syiQEJRLJigmVgqluVQkGaiKaKhvb83Jz9utgrWXDimXrQdWlBkhgyQa42C0lyG6pMwQRR1xEjpu9+CD2d63chNZuiNctvZACcEodiomrq4FscRU08e8IEFI5wHvrS3UFmHt9T3TM+snfp368FdzfR+qgPfkusCsgK7Jl80U8InHMy7T0yIwhUlS3J0i3Ilq4o2AupvW2N8nVpvNe3hUaD5Mt8TL5xHEkGxW4U1kkdCkzJtITdJ5GCPaRcj66sHv/nY2TYstvhRqtXZAsewMM+8Ukhw7jZGWlouk05uoObeWUeuggqcHv/vufhVsuXZKu7ztaol3xJNgGeJRWkNjxEx6h7CnErqCt0U9RseKCba2btX1+uX01k+Wt1kGxDcBlP0XX8/fziaf07Y9PFXcseiXuNlzk4QEYcJz7xgyzPB0aLizJBqb1KEI8ar25+ZYwcI5WztdpC8XfMknp1/yZv1HxAgdZNSi6gbKhQ+YR02NFSraZEzD2Wl9dlrYgW03995eT1zJB6dH2uYz34LxRhKVVDbDqSSa4ySEqixPzoIHTa39qWnhN2y1s3+dzCd2cr1Uw8s9N71SN6ursUgDYrIa6mWIwSGdF6KJ58FQLCjkW/R/chrs6Zupn8RJgU7dnqmblTnCIKUwdcpgRZEiKiKBtQiOeMU1VLC3PTm6RXrZ/i6uIrXgFXh0YPohau6cMOQV0yhSTQSTkib7xhnJmYtcmhhBwrQ+Jy0SGZpvafFegL7Imj0rDkViqBTeK2EIc8Q5ooRMmpiNiEPFWuuzcoZn5+CmFm7190LTbJ4JUVxEjzwzmOBkrURvXKSUJbtfKwyaV3ubpUWThWZb+tvt9ZcfZ9Obl/ezWbrZxmgt9Mj0T+Ds7BKrk61PlEp6mVPEaByNZczJyIOjAc5PaynT+e6Cl6w3qmY754uQrBdskipGhKFY+iApjlYqiZCEk9Kr7bJJ4gArv1PbpQ1ZsxMNhTE6Bom1Rsp4z4MOLCYrn1EqOYfapvZaGbrMrhZv6vdI2Wx/GhKrEaCMBOuYVyoEI4Mi3ApBpDMQ6+9TD8tsa+n2fj9UzUYpNfLS+WTfW+a8QM7K4KJgOskXiiJUlrSXLS3KP5tuKtj8u0KmfxJne+cEJCIXTkeptKMqHSGCsMBOS6WcgSqV1tLmAvsLdn+PdM32p8ces4gMMV57EQxVkTuJeZUTw6SCOt62p4W3SBV8u1N6Vxj8TydU1jrX1BpnIgrcIyqUEBEhHg3V1BAnEeC5JZ5Zo2qLT3fry+Jg3Jo+Wd2Fu0i8FZgHLTw1gvgQpeOMyuCT8gLobcuNG9XQPezO+7BYpLXnxaH4ZDpleTEWBFmiDJLOOCeEUpG6ajKeNCZ44MVt0awaJbktJyYv779+WM0JSK+8X9xbm960e7l6T3GAvyQp8zWDwVMWvIjLiidPHYraUyKCNOlUwIzq1tZpIzXy2Eamh+nj99WMz+ms7JNxeYJm5zRYZR3S2CZJgai2SBOFZEAcqYjT/+F8fBOZkR7+5XayKPtkXJKU2eyMgCmyPGomGI7GMRWC45IREXkUGLqStD4TjdIIHm3kZprYW+P+kd483+xo4afiosTMxpUR5VILwyLDNGKKIzPGBW6lVEJY0KUulInxaC9Xa6ePJMYWJ8G/vU7bUP9soYekR8pm/UvMeOeJNF4rbqkPSgYdtMDWUOs9zJVoLUlaKMs/fE6f3dz5t9uXn4L7x+v59vwbc/siVHtW3PG4FBmzvd6osioqrFhgIhAniUv2hdXKxMiQgRqkS1oaq01cf4HncRFm1f6kW8EcrbaWRltSZiewWEKwdYJGKqynRKXjIW3V3SpyxwJ4bFufiUZ+9ZqN/O32ufdbO/hhWvJxuAwVszY3IzG4ZEwEkgxulyRFZBRxRaP0WiKwLVqfhCZx0nfh1ofZw13TOw8/U2jaxMXomD0N1GGhNXWcK+uRT5qSq5LqXKCYcwT1Qe0t7Sb9XTLbmF5e8rUP0zf+4WLz6od/Tq5+uP08mU1vKwd8cWekZ+rmTo6XnPuq7DRSpBFBlMggRTpLiGptGFQLtY73NVGN225tdbH1puIOTD9EzfYDNUqkI+KV1EhJxRUjJJIoZRUhx9ARpPU5aTQG6GEDK5728cc1ND++mpl/Lrfwjbkr7ix0R7hsHoiJmKnAGE7/UYJKSTVVNuBoYhAwS6M13mWTbPoD2/ZTWFWYrKrp5y+m/svLqS9vdNhFaJg7BUG6aAJmNDiSlCLPBBKMCiG5wEIEqD5odwp+LQ2wDD/77v2Xmzi9/bIKKN9Wzp+qaez0OlTP3CTgbv4eaUlGAqNKMi2TPZsMXROQEMISx6QmTliAIkAxB0Uqc1B8fnd3PXHmuN9RBuwDRcwKbxjnUopgUfqP4sIQz8YSoSUAwwtZcs++++F3F+6aIC0ZWdRGK7GkWATCiVJGWIq0sZxDpiUg7ajsfTO9nV5Prz5u9MPndr6YGbd4O5u6MJ+n5RqVPQmWLHwliDLGBiMIIgmPnBJpreBCjKVBCAUoXkj26m3Ze7uE4HwVCXw1md+ZhftU3fDzUW+tpJZohyKjhNhklxvuqeRYU+KV0xyifgDEPE/UdUpgLRC/XleQ/HeFSppIFSfXYf43H+4qK/vWTdLF94vgPn1/Y+7+dOP/tEhGd3VLurrlb8/EfmLh8qc9GOnVcQi/Lz6+2qz4peolEL5eroGH1/dejv++Nde/TG7/UZGOJpj86z8W4ebuOtEzfbPJ7D/+XfON0gqJyK6622Zax7twFX5fgQCnL3lT/drX6abr59LCn8z80/Im6UgJq4jBFKnAMLVUcBm5N5ojz4LkrHIkVMC9/A8mdT/43Q/PX735ocnPXTGX7//wr//44x/+5//9xz/MwyI9+OMfEn6uwx//8P/+z//rf/+f6c//+u5///EPf/o//viH//X/fZde/49///H772oINXmmHpPK82iQjCxyipOlqoPwlhjGKjciR1VM6d+Vhn15UsmD2Einz9+EgdDLeikdxhYlC19HHEn6V1PsvccBkcrLtJQJaanp5mjP/5bUmvXJY3+6W6aWvP8yT7/10U9bHv/Ef9JN79aRjxW32E41+e2Z3O8m3ZwFPTyaby25uive+dLVl0l8sPo2aWvcdWI/D58VnFMVETICmaUVKfadfc2/0MudldcoqZJ0TmWyuwvWSKsq66GjxfcFB6ZLdCdEvvjy1iw+LYu/q93q6H57QiLt0Jat9v185r6vlt780EqMLZ/cc72uMKq7o/G0DlQ94hQfgykjCGC6BVP1FaZLRhxNMrEujdWvmk2tKFnn3K3+PHyr8rAqV6PBAatrrOqlLl41cXu9mt82Mek2FwJrEngjhBtLcJssqqdXxkeyBKxPeh73gjmCqNSScuoQUzES752PS6n+KITX/Du+3r3bFhjJ0jQ9g8CHlq6Dpb7AbcL6mYq6uvoxj2arb7OzrfqrX8x88Xb5FW9uJou0/ONnqi++zBvYbx96YMnqw5UGXYVTK/m+uLleXW4KuFZ0EPt5ns2W21+qcrSL/eyeZku9my/2V6s8WJfsnDF5xv7cRweCyTPe2S+pr+eePBN/vnRt7OSZ/HOvpYWVdfXvr//JZD0a7RV2MkZHFE9Wl8fJ6ApRYewcl2MJprL+slu65FeFOeU6pV22lyZ3RlviXJQKM51exFwhj2NkUokwGu8x6g327ayOwnDd3iQ7yK4TOIkg0dAgEbZIMRpZYtWBGcbFaJpmagh7XAaJXDUOe7y/t3M3myQtpiE2ObeYYu284tYYa52V3ikrmKVMcDkWpqr6SwzPicNV9eRDhOBFiOnF5V6k9dP7q/hAcYy2A4pl22RK6T0jBIXAGKIs/aOiQcnIRxojNpbiOt4fwruyxEvDeVd0y+oaUSgUiTdMCZkgHlFi7tJiq11MtuFoxmT3Zxtm2VP9ti1dGA+X5QH9fIplGbqKXHMdNLU+KJdepBQzHElw1HI0ln59PTL0LnyhpWG8C5plK9iSrWi4NxEbIqxCUhMaCVHOWo4ZGUv+sOgP5R256UsDekdkg072PfqzoZN9Z/j/Vp3sk2XK0hHwSkpKpUXWW4Jc1Ixyy40YS+3mMB0zv93+tBrB8S7Mp/czFzY5mUVBvwOKQbfUHhEO3VK74fjfoFtqIXNL+tOAYG5J15WvMLdkTOcD5pYMzEKAuSXf3A8Kc0u6PBUwt2Qs5wLmllzqkAxkbolh3HDpVDSRKOe8tDzY6J3QNP13NN0h++qKcyQn9pHnZLUPG704+NUd/mtm7u4KjB53Srsc6pU3KAatOLPIOM6INspYSwkSMnA9liz6HlG/3xb6mL/ww7q2vaoLfvHlXUiPJ5+rD1dPlAf8jsmXwz7FVmjlURJAKgHekai1d9QK46nyeCwRt/6wL+qLFw9v3tvZ9O/pjps9nL+azMqbi94R1SqkZ+qHpfQB6oehJcPm0UDL3KXFGGC6xaHYNkxniRks4yrVy/01Zmjd+6wkwAYNfRkm0Jfhwn0ZkLHSaOGpY1oE5RnCVAohdZDMqlUbG+jLcKwvQxL6/1qVkh1RuNa3XFXaVBdJoVs3HH3oxVBvGdSqbcuRiaurtNAPD99o3Ybh/NqfdROGXD5u7UIP32m90nzTgeGMpbZ/Huval7Fy+XakMq8yb7s2OVctEzrIG1qlzTyaFZJdqDJlHlygqze9XHXE21SnXiqzY120fcmxoukWSzZxmVGNaXWy3Xpi1X2CZfplHu3a11cHTV7bULLJdzy7p6aTXjNGY0jakAqaE4eJksQzzmMU0kFPTeipedmemupAT036p9maYt8//Na/mtlSHZ0Pt7fmUkM5lAGEtEh2B9KYGOMcIoa4gIUlGlNrzFjKePub6MSPTTrduy63E8gZlMrmKcTotYnImehEYo9W+oRjhxFnFBEylqjrwGby7d2znucVBvDuCLdWHSsD8aDq2Fg48Z5UyGr5A0pBw+96tippqHPMISRdlM5Y42UIjjikDbZJ4FtQJUGVvJwqWfk9Lk4vppqcskGRDklLkAlaoqoPbNUxhnjJRSQyaaAJb0vSsR5s3MNTIrZIh/DfHt4yEALypLRLHbCXirOoK1oGRa01FGkrqsLepYIkWpgxFU2SbBusEUNzRkwhvYh6VPmgF9FpGl8fvYg0DSyYBG+HgzOUO+4sZSaJI+7S37EUePaI9trIxOGJwfuhhL/MrstDehc0y6aROoKR49YxjZnh6TE1BAtJ0hVOsAeUt0V5bVDq+I4t16q4VJEw74RoG/MdtTTfa5Syvox33sisOPxNzzfddbSU+mAiIjQZVE4w6q1KtrunWAsBpjuY7mC6g+k+StO9cvQ2Nt1ffbk1NxP34nrq/jHcKGSVV7f8ablxoa1+Xm9+7EZYO/Z9zxaIVnFvOPOEIU6lIYol0RgsFVqHqg4XBCIIRBCIIBBHKRBZA1/2wEfcbgQgb2gFPv45rCeB1/UxbCjguGCKK8qU9MYj7CyTASudmHiUxCkGAg4E3MUFXC0zyNHr1WSWDv509mWbaMuUu8o7WeOkarnY/0g03Sc7riP7sh6mvqqi7S13TqViHqPAqXOSuiA1115wka5JRCz65gYL4n+roPDyfr6Y3mycZsM1WDDP12k5zrGBOq0h1L9WOH0ogP1+g/bvK+/s9xugbQhQVULV1cV+//bT3cGPllWB6LiSCpA9mCnmrYIQu+y12OnmCcOOAIahivbSVbRJ8WYiIClUMvuT5RIoTk9IbrjTdJVtDlW0R6toUfVr6utfD/C5VzPzz51o65twe/9QSZtX4w+vtElP2JRLVr+e147qOLBYZT79FBbrCsn5Qx1tuzjy7ZJmVfz4RWVHuVn66NdC2k5i0qtK2k7SOFYVtLwW5QeWqqL6q1yn+VYxaVU7W1+cemCZt7PJ7WLfSHg+/2UyXzxUzTZJws8gY2mHvDF3G8vy0WFusV4FjOVyYfFp6ucvpj59bR9WdbTNRpRrjXTQWGmXdDTCtZWaRRajlczrKCEr5uid9rJiOuA5peXEdECybOYXD1hHywwWgRJhfYzRCRIckxEpBhhvjfFupGFpMO+GavlMXualccwrSq3GUWIsY/SSUFMNYBxL3np/7fd5fYuMnZu8m07XKkPBpben0ik7bo5jIYQiBEkegrSRM4m5MwERFVBgI0Fzj6XkZxkepUH6LGJlhwhJIlyMhqvguYmaRuyCw8nQt0lDUZCJfuFM9APGcGH47oZoUHExXJxDxUWXFRdQP9cfzqF+rj3ML10/F6SsuDZBLkimlSSIoWg9Yl5IzGwYCcp7tC0bEOurzVRw25vTCZXDszDaWCmZCkwQEpM9iREXHHGbkC3kWEYV9mhdnhuvKQ3W59IrO3SQVhqJ9JQxwmhU1vmqdZESUlLG8ViGq33DpmUnhxELg3l3hMvhnRslIkVeSY2UVFyxxNNJlLIa0YxHMxptYE36GoW5S8f7yYSDppR9DoaCppQXxHvDppQZn7mJuFLVGU7/qapSJNVU2YCjiUFEMRK898ffL5J2VBj0L0LDfCYLZzIg5wQl2nFMAuJaJ11HYCwDMXAK2nL9TjLhC4N9V+UDrdo3HC/26quatVn7hmPf9+zq1sAJ8ybZOlYISz3VDCnq0v+qObkIB6huhepWaN8wwPYN68Zt0w2DPVTdyrYZyPJnDLi2lRypnrJWSqieGkRtK8rUti6/0UNlK29e2br+YGE1gTZ4GAU7GU5da14crRTT5df7uM1Wy61ptRE7wC/UtF64phUrp41WziPPlEdBCIECDsu8bqRJhJrW5jWtjdKSVzzuufeVqpqU4Nn05pcQF5tqVtYk8rxa48fJ7+8Xs/eT/36YA8+af4HXSXFflyOStTrf8JNvZ+HqTaVrb2pUW/zs9Nk7Mwvvd8aUsnb3/8/7aTI7wsI8FKM2Kd5ZffZduJl+rm4cXszMP8LDENf6GonaJRLJP3y5Cx+m63LYqu6UN/G6rD7+IRld1eBQH5ZNIzemSn0eTWaFn8Ny1GmLctJog9ZUSBsk9tFjb7iP1kSrhMXagZu+dVLNWce9MMfkecTKphcgZbihUoRgkNZaRSKs4U4x5rwVCHDdEtcniqDCAH0ilXJINg5zzqhRnGJtuAxeWxyQkBp5itlY0nh7RPIJ+lBpMD6BRDkMUxJVdBZjYiIlnGjqLKeRBsJNUBbCoK0xfJJmXhqKTyJStvmKj4gohYLSjmAehRPEKIWN4UoIxwHHl9OWa6zEwvB8HrGyVmBQWFBKFcEG4cCRxYp6ao0Uxi1bvAKuL8WftzwXheH5NCJliygwZ1FxgV0UniPHBEPUBCpE4MkihCKK1vz5HC9aYXA+i1bZwjenaUSq8tRxFSUySW9WQjuctOekU0O5cmtUn+rYLQ3Rp9IJypJ7LISAsuSmcL5IWTIPShCvDY2eYyIEE8oKh5kRFnvGwNPcGs9nxM1KQ/QZpMphGgXsPPMk2YMq2KR5MCW100J6qTQnYA92w6ObRHJLQ/TJhNqUJ7CG5QlHsnV7K06ozcZv923PLk1gVCtkVVWbKoMT1uIYJIraECMclRhKE6A0AUoTnnBpAv2bX7ePSobavVvcz4Y/JrExJz/y4wbGybPf9mxObqSyLCgqnQ1RJpsEU8VIdEx54yIDTg6cHDj5QDl5Zc0d5eTkb/ZrO9fB8vBlHvch61IyY0VV0LDsoMwN8iaRRXlPENPMw3iHjqPoW/1/tx//HK7vqhKw0izMs4gFbcKH2uzhJ2gT3mmb8FXZgGqogx8US31p39WxbqB9H/ieZ+vdkuOqkRfHMVhOVLDIuCTSLCXeIRcp6N2gd4PePVC9u8nocvy3h18+WK174znhTVv0HPhRvC+e3awxT+23PJtjK020VASRKqWGRuJ0sFrE4IIxmCsBHBs4NnDsAXLsqjb4t2PD+WpI92oyS/xzOvuyTb+lo6Iyymp085aL/Y9E3v0dwHWIXXYnqK9xb3vLbdJxxTxGgVPnJHVBaq694CJdk4iWSdxL2YAPCDvyp7ulQPp+vkoanzqTbjZYWXekf1HAyHPolDGcTi+5eYPvtxG3e1Vsq5eABQkA4G/YgOsBu5V4/dqAa7V2gXBkFOAInYcu3HlIeSS84dIa5aLCBnmEuLdWMMu8oAE6Dx26TVg/s3a6HhowVityN6pl+vjOC5v+Q/U+5dqlKgNl9R2ns0drVT9e5iIgu2u9C+5+Np98DrnvVyXa1w+kr9culr706ls+Wok2a5lDnQ7UMU4NN8wIghGKAqOoFcaRG5hD1TrMc75uWFqMpwttegVynnEVHjcJe4vu0IOejGNf8mxHIfYERaYFcsZ7wTg3zhqLgvDIO4UROArBUfjUHYWHg6cPx2tQhNNG0XQGvUAxeOmo9Joo5yxFHlth1t4Cdiih6uCPGpiTC+fSqDyXWBNOgrcsBocsD0IT57ANlUJCQA9pqYfQ2n4E65u8nU3/nlbfWP+FKRxtSLPWLFgudSRzAPtSKbrleQ11Ca+D4h45RDVFgUuio0xmratar1AdYAYI6BKX1yUgcnZa5Ewf0yZW4mS18elr+En1zsEqF8ciaNYoAx7fwUTQ6qdPr++xh7mPD4/KjZ/Z6GDUBwQs+uKWyf6CcO1kCOFavRWtHSfXq4mbWRcjwZETbaWnhGDpCXUe88Ak4s5A3KxJ3ExUP0bKVoL25mZ6u//sj+Z6Hh4uN1E0lTOiGy6cDJSq70Wl5JpJhZiteyxJlIsMNLvH0oMe/OvbncWrMJvKhQFbLf7rdLG3fjUzRNaWZrVa/8Psfpfw1RyR+s58x1Snn2bT+7vVOJG1SyPH/gkF9j8I9l8xx4ND8Fa3+n5vz4uREkgHS7jVwsvIDTKKiUCRR4E64bW2T15KkD6kBF75i9B+fkXdMPFDTKYy/tPlUg/ff/H1/O1s8jl9jUcSBKN9AHV5z+kiUST4RzIFo/0oQod3vbfXE/dI0mC0L2q6uuVfJ/OJnVwvvS574kfvi58W91xNhW+2k5VI0vu6QCf3qtvBahiWPgM2B+/2eOfEcuf21aez71WZrNXUn5f3s1k6h5vt/XrfatqW7vy2B5Cizty9tEuJqzxyEx7Ail6SdN/D3dHtag88OpOYmRs+Rgxe8Zd9kdPB7Y6CBld8Rl/gzgdwgxuml2lFEMOO2MCsDJwHY6rhVV5RzKJAENZtG9Y923FaWKy3A0fzqn8XbRIAPhoz6a19Fz4eDz7yZc/v3mUUIjwqGj0RKCa9nOugpFY8IkeCg/AwhIch1expppqteMdgo8GJwtkAR4KMhnjatqxm2x6uBx2zernHoPBZLe3H5vHKoJcwRwC9EA2+sIPVGEzlcjSP0RpTTnyk2FkcIvVRc//kHay9hOGW1BUtfCybe9YL0YpVNrC7Y/TaJD3bRCeSbmmlNybtJKr6ehGiRmJ3E9qb4d3dDhZmgXdHuOzgGko8J9J6zbGturEKz6L1zhvnmNFjcTTp/vBeaznt3iQtfVUJWhjI1AnBYNDYKpoEg8aGhOsLDRozkgidrBnmuBTUeqxDYtMqOuwYkaCgXATQL8w8AKBPJlRW40582TAuvKEhkmBcekQSpomVwuo4FkD3pYD8WhoqqxKhTauR51dXs3CVvsQKcjlPkEMOPEFP0I95mMGMzbGUQS9FFtA7AT/mhf2YMTLtYsRIc2K1lVQgQT2vmhzxKCwGP2bzNlyd+jFX9a9t11vnQtYtWRHiETM5vuQqZa5uQXLad9xkU9UtSRu4bxEWtkIox8jRoBVOUGWYUk884ZaZkSiTPaZNnYXb8kykM8mVw3Y0hJJk/BsvIhYkUhyxxdEZLriQ2o0E2/15ajvloYUBvVPaHemziLxziaUTyhhTjmrJkUQyMKGMAY7eOj5x7s4Vh/UOKJZFOHEWBRKCcowiXPm9lOZSkeiEIno0gxBJfxDvTpMtDerdUW6ZD0kqr9Lt+lWibWQy2ZGE0mBjkAQFTRkWjgck6VgUmB5ZeXttc3u3vklxQ+V9+AqJ3sH9sRt6HfEuUykF+OcG0zSpu3MyRj9zjeNPEmOl9sFFrIJAykSLohFERo+NqJodg+PvuONv+WNEi3Li9T1ffbk1NxO3DcGN2+9RVVY7JK9++hEfmlQeeyFEwJEilOQ1Flh65Ay1QmMoPWwvpjuCQGm6aEdky9peVittoqRUquqxM8xL6zBjEcf0XsB6S6yfzaAKA/nZ9Mqh23inkOTYJbatpeWCGWGi5txaRq0byyj6QXuMD0e0CkN6p7TL8nQeQ+LpwpvIIqEkOhOpkUEyRrSLYiSoH7THeHfnisN6BxTLIdxVPgYWkkUqpRDOx2i4lAhTi63GYix8vT+Es1yzx/VNvqHPbBCYPolGraZArPZkqFMg9r/d2W0+gqeYamG008n0iFESRIWzWgThHfEK2nxAmw9o8zHENh8Hp6fjP6XvHSdX96uXHv22gXX7ICQ3WSoZjUZqhJXWMR07a5FFKgSrguVSi7EUZvSoZdRu68ttxOxeladjtKdQTk/2nlnNY2SKB1IVzBGpMU//dchFrjkg+FxP9q64eJu+VcX6ky3jwnw+nS2rNR49WxysuyJbFutaIx104tZOSUW4tlKzpDFFK5nXcTRZRP1hvZZYD5v2IQn0jz+u0fbx1cz8M73t/iatsVzsTbi9Lw/nHZAsh/HExrGOlhksAiXC+hijEyQ4JiNSDDDeGuP5IXCHNyys4w8bRb8smHdDtRzSrSTCVW49FTw3yXaL2AWHA8U2YV+Bh6810muHlhzYs/T6Mr2jEsEvKhvOzdJH5+UBvROiZYv/aWDBGOQStp2h3PFkazMjZXqQ/kJKaGuc74+jyG/ZYp81/WV2XR7Mu6BZDuXCaGOlZCowQUhEgWHEBUfcJqtUyAgob4ny+ubkB3as2o631/dXq0FZlVexOISfTa8cugmtOLj0lDHCaFTWeeocU0JKyjjGgO62PLx2QtyB3Xo7mzwuqXs+/2UyLw/m3REua4U6gpHj1jGNmVlWmhuChSTpCiclBvB+Wd38Qf4u16rUzSKVlk6Ils0y4VgIoQhBkocgbeRMYu5MQESFpMMAzttqLXk38O6WVXHWtG1rCVye7XkesbJ9FGzQmgppg8Q+euwN99GaaJWwWDvID7wIrpeB/I/Pva/C77eLaijXLyGWp6OcR6xsZ1CkDDdUihAM0lpX88Ks4U4x5rwVCHDdEtesidW02qofJ7+/X8zeT/67wLzA06iUj9vHpGMoFJROujaPwglilMLGcCWEg7j9BTn021m4M7Pwfno/c6HI8M55xMpqHkFhQSlVBBuEA0cWK+qpNVIYx6IHXLfl0E0M/tVW/ef9dBFuwsIUh+fTiJT1+GHOouICuyg8R44JhqgJVIjAkxYCHr/W/LlJRHm1Re/CzfRzxWvCi5n5RyjQMDyHVtkojdM0IlVZh1xFiQwNRC2nOHFjMYZYZGtU71dBHd6ppBZ++HIXPkxLdOWdTKesNRiUIF4bGj3HRAgmlBUOMyMs9oyBNdgazU0crqtd+hB+X3yYvpz68OJ66grUoM8gVba7b8DOM0+S/qyCTZyaKamdFtJLpTkB/bk1ppskbG5v1M/B+LR6eYg+mVD5zo9RRZd0C2IiJZxo6iynMekd3ARlobfpBe3BZLpfvanKwYrD8mlEyvYZcZhzRo3iFGvDZfDa4oCE1MhTzKCLTmscN3dBvb65u576At3OJ5AoG+2W0ntGCAohacdVq2mkokGOIKQxYhow3BLDor5fwDKxbPl4/XBT5xRWhVA/L26uV5er14sDdmd0y6JdVfWPOmhqfVAuvUgTo8aRBEctR5DD1BrttTnER3etbKR3QbNNM0ue6TByvCyf9tRohNODDRGOfcmz+43YQBj2FCUTOiJEBKlaulKfpJsgViIL/Uag38jl+o1UXYBq2maYefo68+/91P1tvpjdu8X9LJA/3d0Or1lGNfVt+SsOcJpjv6SfRka1/CXz1c7mKsJhKoPW1iWeQgzxkkljHXbWWE0JWW89arb1w9551nzne9/4WqZ6+Judve9EUksldVri6ByJiBJsmeQER6OdUat9pyq77+F3k77wwHedHN31xz+jnz1HR/Z853udvePMSkeCkI4FixSmImLilCbEGSsCXucM0JqTvi/bB7bT2S5IOCpsMJck8oAd9xiLWHlq0+/GEY+m2oP0ZimR/V1d/aneXGBrmCPUyNnwmJtkxSOLuCHCUyYFUyZxYxw8U3409Rn9IZPuE2t7L340Lv1bXivbZkRZW+H0gIZUKwB6kZHnGptNbeskHL0zjCZNmDGHtZQK62Rj4yA9CXp9kh9rQzs//fnr6vfOp9ehyv1PTy5j4kmE3dyYWz84uclycpMGggilGhGXaBGYIpxSzr3UXGoUxpIjKL5dTCih5cPMTBbzj+8/mVnwa5ik5Sdu+UJxvOoUEmUn4Vhbtb+MyDAblEgmrk3/SIJ8cDzqseSbkP4GKLDH3H7F79Y7s+x898DvSoNvK+LkgBukiybgJI4cEUJ7JpBgVAjJBa6StEcC3L6Y76/FIRE/++79l5s4va3Wu7mb3iZyPIJjIyhK6SizERMbonGcGW4M5dpH6qViZCy5Iao/FrofNTumNZaG3bb0WdsuCtXaLi2WWkcbb8zdtwgtjiWs1kcEcjxhtX7CkOwgvXbA/m3BZS0J2DrBEUaaBEIjicxjwoURTruVmBLNTfC1lyO8S5B4Ez6sfz0Y48MVwmCMD0kOgzF+kjHen78bjHEwxrsDLgNjfPDGuMPaiqR7C0xZUgZketUiUU2E9dobPJYG+v0Z4zxjbB7RHwtD8RmUWhvoup2Bnl0UTHUw1cFUH7ip/jiTbP+sPyQizD8+OOO2smcGZqLzrIlODcYOSckJV5objTFBRmtqlIzIj0U08x5jjfvbehwwhcnkEyiUtdBNQi4NRkjilFPMKI+sYoFq6jUhY2k50mNCWo3O9HY2/TxJsqLcQdQNqZJNncQes4gMMcnuEcFQFbmTmGNBA5NqLCZ5f0h91B8jM/B+9efncJ3WKg68pxMqP0aJeWkc84pSq3GUGMsYvSRJe3A+jKV4vS8X06GWXLs3eTedrudHlMuLT6ZTtv2vMY4Tq5JpgDGPgcpkRiVOLTR2nnjgzm3RrGptzt2xyj/87sLd8tHr28/meuJ3Xk5fKK2Vdu/hbcVB/TJE3CSf1BeZtVLOwacFPi3waQ3cp8Xb+LTeLdGwcV0P17GVzT3x0gVrjEKUEWk55xYho5K5FWy6FmNJAKU9Glv7x60hagoT2KeSCVxc4OJ6+i6uIGU1jZAgFyTTShLEULQeMS8kZnYsbPcburiypu62IC4MvKcTCpwCPXasA6fA4J0Csq1T4IBOA54B8AyAZ2DYnoEqXf6IZ2CjAT503RiYGyDbRykJaUOM8MFgj4Tiy1R+KZjTUTguxxKiIv0JcLofe6mDSGHyuBFNwMAHA/9b47Spgf/vTdFiA0VwD+ig9YHWB1rfwLW+4+XINWxhYHofzul9hQhU0V9uEkjU8yWqbFZL9GgBkKkgU0GmDlum8uaelHkl6G63nhicbM36VAqRrbxHnwrI1guFo4VXymDFJSYiMKdQlIQzxhnxEdnRdKCRvUGVZVxdNXytMMi2pM5GLWznaHm0EKiHoB6Cejhs9VA8nkK1f76PtakamI6Y9b9A6zdo/fY0Wr+tcl5oIwmcXw3EMIhhEMPDFsNU58XwQ5/lu7vBCdysU4aRBBIlmU4nSafDZQISQljimNTECTsSgQvt/i7lbJG5dn/pOFxP3Gq7sw4X6hKbIiE6iZwiTCSGT7UNRFKTmL4ZTb50f73+Ku5zmEUVhtI8MTZ5K/i4Mrf1OVDbQG0DtW3Yaps84j3Zb0v73PtJ9VZzvX5mW2N7SmqdDpIZxoU3NEQSjEuPiA6GWCmsjmok8pSDWncZgYkTz3y9WNXjPL+6moWr9CWOqHAaBR6JkRY7nY6gZTKmC82CQhKjsYwe5rQ3FY7vO6ZasavCEHsesTZNmxv481qsCyoiqIigIg5bReRHetxkB2k8JZWwkIk0uD/5DBNpclE1mEjTDrh9FbkVZ8u0nkizSq5q0M4gA2lQ/UD1A9Vv4Kpfw6Du5nivO5QMVv2joP7BQMKhCF1Q/9oBFzIUhqL+HYai8Swm/ClDDBVcKxMkQ4EQS5yuJMxIoNijBX0oLn9Q5JYG3tYE2mSmtkhmOLAWmDBgwoAJM2wTRhypHt4c8bez6dUszOcvzGz78ZPszRY0TZqgp8JabJCqerQ7QoRM18RJPpZAc58t2h/PxWkGm8Kk8cl0yimVVUoOIYxEwT0KymCejHIcHOI8PRNGY5j3h+bHxHq8S+8XX64n/x381nPlwflkQm2UzAYFyM2OCOiaoGuCrjlwXVO21zVrucdTUjYLkc64T20T5PPl5XMmTzcSEUSMJhIWkQve2IB9OvDOW2b4WPzpfXVhKs6fnu4zqTLD042+KoL6NEWwBrygCYImCJrgsDVBfqQP8JJwL437FNaMZ/n4dfrtb6fT68EpgNmBkDIizaTXylkhHQ/CcmdoZAbToJAYS8wPg7y8VIV8Asfb+Wx9HnZOQsNuhFp4aYnV2iSNjWmsOVXOM22Mcck8GctwPCz665zJ9ntEHmNZhYG2NX2y+MXISF1ln+mYdBZrkUUqBKuC5VKLsRSj9ph5VisYd+e47VyVh9/2FIJxjjDO8WmB/LLjHBvMHMgLBbDkwZIHS37YlnzVwLKhJf/L1Jnr9WF/YCq/2b8nLvbrdPFjkiF+i4sMzMRHz/615GoY8VZsrc2PBn4H/A743bD53fF8ybqjv3y4OvXLJwbH3rIhbG5k1UiRYBm8S0aModFFT6KiKOHKjCWETXtszPM4D7AZbAozUE6mU74IJwgRsDEo8UcRqTIaM+ORIiw9GE0RTn+2eDWvtRulrzB4d0e4VvmUTY4Q6KKgi4IuOmxdVJLGuujD5Ii7Kksm+PSO+5vVDwvD1EizvQhE5ExFgjknAmEjonQBMSMswthEOxaNFCPUn0oqD8uiBugpTHKfSS0IdkKwc0BohmDnsBEMwc6hBzsrHLQwvI6KCDC/wPwC82vY5pdATcyvnBAdmMmFs5M1S9FLe7S5QDPtWTN1MfE/w3ioxsEagTxmXDNhpBM+OinGguFv7TU4vD8POtQLc1Ucms+kVg7ZhcRoe0Q2hGi/XYi2kFFAPaIZJgH1NwmoeM8Y7m88PbjGBuwaO3wQsKoYudXOEo0NFjZxduWEJsgLyZgeyUHokcHvG0q/mNur+/Rdfk7s6TrdaO96XjJ/P4dWOVQrKhhiUWsRuBBGYeE8V9b59CRmjgGqW6Ja1iqXD87It+lbVY7Ft7OpC/P5tOaZrQrpwlDeKe1yqBfCYcsVMUYhgzhHHHlEicXKBkk98PLWbsF6Yl3fX01u139KZt9tyZPNBZY06oi0xNEHEWzSPRChASMklfWaAHZbYlfU1v2vb/J+ej9zoXIFLKZ7VyUDuhOa5VAukXVWYqZ1sJw4FF0gwhJrMHY0GgMob4vyWmI9yNYP/5xcfVwFLT++vJ8vpjeri6JB3gHJchhHngoZtNLMaaEikcRj66gKklmKiASMt8X4Yy/Y4w1bI22zZevLonHeEdk2FR2kaWLR4SgSJBNBMhEkEw07mahZLUfTSPHAEouytRyF5GRQ1F9QBLIyBpKVkdRRRE30nqsojRTG0WSFcUEQNxorPBJs9+gQriXW7l791Vzfhw8zczuP09lNuvnqiemSDW49XxzQuyUexLmfQZj7SeF/IBUgzQQLGG1gtIHRNmyjTfPWRlt7/jIwW+6hER6WJzG8tgQAPgh8EPjgsPmgbDTO47Gd8S7Mp9efEy2fz64+7zwzOLaXdWEhiVgQQjOGiUDIcxG9iVR5JDX2eizFF1j2F3yq74yVgdDOVblZX90RLjtymBoXGZOWsBgRR1xJKrxTnAQV0Wj67/BvnDbTkmWWBvUuaAbVolAtOlB8nx2XWDcsbzyHoc3JAbMMzDIwy4Ztlqn2OQW7p35DGzDNhi7DMQPTbOjyvCfTTAefBA/GURFDZbScmIhIQj9FlPix5Hpj3R/gG+hhjfhmaXjvim5go4GNNlCMd2WjnZY80OD0gJ0GdhrYacO206Q80057FyKYaEMX4WCiDV+c92OiaeSNl5445jXVkhMpHBNEYs2c43QsOmuP0bOmic0Zjlka0jsgGdhlYJcNFN7d2GVad2CW7Z8bsMjAIgOLbNgWWbOp5ieohQOzy7Jjf0uxy/ob+wt22aDtMtBZQWd98jorRrwDpbX++IDqCqorqK4DV11PDCY0qvl/SuprcEpHG7xGllNGCaGM22CCo8ZYG8cyr6rHRBjJTu4f8fWJcpXYrskHjWeSnOsP/NB5ZjidZ9aa7hnu2QY3Am0XtF3Qdgeu7equtN1aETswfTc7n7UQfZco0HefiNDvXN9dN57BXYr9mluB4AfBD4J/2IK/mm50VPAn3nWVyLYZ65WeX3/gh9lsOpuvnx+cmM9my8rAFaM2WoklxSIQTpQywlKkjeU8jkTM99Va89fSpDJLB+fN9HaaTszDwXhu54uZcYv15K+03MPRyJYapmttLaNISM6oFNE5TKgzUgTGw1jG3XHUX8C0dnhEUzZWGJLPI1Z+/DSTgidjihruraJGuRgxic6ypO8YNxJg95gI0Eyv2Tyxvi4P0SeSaZOuShsaRs3OCJhBYAaBGTRsM0g0ifbvMqoXZh4eWzdPyQTiRhKhVUTMcSmo9VgHo4mKDjtG5Fg8nQr3J58bUKseN6VJ6JMJlY3WB1nlnQpvaIgkGJcekYRpYqWwejSue7DpL4TKqhX760X18nT2/OpqFq7Slzia64wiS1ALUgrhfIyGS4kwtdhqLOhIINeficNqs3d3b7L6U25E6CQabQZhNk32OM6MwbABwwYMm2EbNqrJSIE9DmXcp7D69/8JXx4erL0b0wHndWTzmAmXHlETmNNcV6aOpCrY4INVPEo0FkmN+xumJmsbh58MpsKEeMfUyympyc63NvFU6yiOWBmMA6ZIMGUUsoKPpQK1PyW1vuvHwb0zdrNsuXDvgmQPmUtNW7GfeJpAsQXFFhTbgSu24lzF9lWI5v568YgNDE6tzTrxS1Fr++v6B2rtE1FruUkMAVHlscBYySCotgxbprVgDrGxFOf11/+vSgbtjImWhvsuaQfGHBhzQwZ7l8YcUl0Yc4fOEphyYMqBKTdsU65i8+eZcnuZnGDSPQUJDybdE5H2PZp0VglugpbSEx5COgMIMa4EitJgGchYqrJ6NOl06707zkxLw/8laAgmHph4QwZ9p/E60YWJd+xMgakHph6YesM29RqN6GrHZAZm2WV7CxUi2DEG0V6GaG882aXN6iDIQZCDIB+4IG8y2aXBof8wM5PF0xLiIXCnbNBKepwOHSJEyKioSHQT2pOxCHHVXyI5rx1L0hw9hcnvc8m1kd1NB1w0XRnkNshtkNvDltuVYOpCbv/XzNylZX40bjGdfRmcAM9WgjkVlhmC1kZLCOIoIIa8YJKHkGgXRiLAaY9GeIOC5EYwKkySd0a3fJqsDERSgmXwjlhlaHTRk6SyosRWzVj01f7QzmtTPVf79MvUmeuth7/Zv6d7LZ8oDt0n0+khNZB1p6HunhhQVUFVBVV14Koq6lRVHaanKT96rQxPk+6xQRt4mvr1NGWatWmKqEfIGUqxdsFQoqXnnguMiBtN98Ee5wqKJjzrOIcsDOMdUe1BZyWd66zgXAWNFTTWJ6CxirOabVXn/k1YfJr6wWmp2Xio5kRHjrhmNgnyKIwRXIoYqJGaxDiWnH1B+9NS2xVcbAOnMOF9BqU2UdCzewl9XRRkNMhokNHDltEnZyCv5W/1+P1iOkui4edwfTfAsWdZlxJDUTFEo3cMR0QFI4oxLiwOVpnAxEiENcb9Sevm6bSHIVSY2O6CZFnfkvDSEqu1ISwyjTWnynmmjTHOSjGWCH9/IU9Wq2c92qLXSUS8nU6viwN0a/p0kT9/6GyAGgpqKKihw1ZD1Qk9T+r51Mvr6W34Kn+Gpo2ynDYaeWBeImURR1IS6hjhQUQrLeOEOz4SOU177PfQxCFyZFvLrYzrmHrZTicEYyG5ot5KLnSUwQSFiWROOirdWFRU3mP4s0mbjmY8tDDYd0i57KwsQ4UVNiBhAkv/6hCRp5Jq5WxQo4F8j22tOpbhpeG+c/rl0B+kNNgZglyQTCtJEEPResS8kJhZQH/rKFkDYr2bThePtd/CYH46oR6SWk5s4NNEZoC3ArwV4K0YtrfilA6t9Wd/NV51xbkSCxmu3yLbobUQvwXpz3gDv8VT8VtQESlzKFArg+FM4mTGBZq4q5dBOjIS6MserbjTre/D3LS0A3AJGoI112dRLVhzfVlzp7ZjbXd+wK4Duw7sumHbdadMB2+uRg7MossWMZRi0Q1sOjhYdH1ZdOdNTm56JxD6IPRB6A9b6OsT+mq0CYIOTOxnE9B0st4N48IbGiIJxqVHRAdDrBRWx7E0IVA9Sf1fSxPTOLHRlQE8nT2/upqFq/QlIAumaurSY+wA0mDO0zX7TIMpxdACO+tpYL+/yBmEDCBk8GRDBid2NWouNcBzAJ4D8BwM3HNwQu+E9sLqSTkQClFnaX/tFECffSL6LBOEWqJQMJS6IFi6DlYIkthtiNKMBfqY9JcKdiFylXYILkXGbMsRmuSAccwrSq3GUWIsY/RJJBjlfNAjOQ09lvfUTg84ZLSUy/FPphP4KsBXMUA4n++rOLGnTusvDy4LcFmAy2LYLgvRft7dI0E5MH9EfrZdRCiykL63lEI4H6PhUiJMLU5aqaAjEdyiv+gyazCjrXQd9CQagf4J+ufwoHy2/qlOG1q3dzxAtwTdEnTLYeuWlcLXUrdMfOmqmhdQz0EGpmjK7Gy6MiS07nHqB4joy4vo7JhkIrSKiDkuBbUe62A0UdFhx8ho5tGpvnLBm+3TCzMPAOiTCZWNSJVR29DbpAcobjhe3MAp8ZxI6zXHlqqIhWdJK3DeOMcSNx0J5qTsjYnWq+NttMrCUHs+wSDM/6w/fEOY/xuG+QuJFvTnZoVgwTcIFhRSUdljSRkUVJ6F8AsUVP57k39/Qmghp+1AnAHiDBBnGHacQbQvu3kS8YVsi+VC4gtsWO5Y8CBAfOFMQA8rYAbxhcvFF8AVBq6wJ+YKW2VonVYgAOYTmE9gPj0986kqie7AfJr/NJve3z0tI6qQFIC+igEgA+B4BoCQVHhigyPGG6tlQNEIabzWhHorxpIBgEmPhrs6zR7dcKzCQHsuuaAuBYZ4DhDV59alaN6Z1bM6KWD7gO0Dts+wbR8hzrB9hlsCnTV6CklqghLoQcnnzrOaSnGvY/CvDwzK0FHqdDhDRf/w4Hx2Rb8603KCqn4wmcBk+ubEatjkukXHqNUvSMTzkyVfejm9uZne7j/7o7meh4fLp2VMaZUENXbEBmZl4DwYoyIRSSnFLAo0Fnd+j0keuUnlj/G0flSwMnouvXJKqcTCKe6CZ0ha463HjCEWXECKJfNrLPHRHitHclbwadyyMLxfgIJQAQgVgIPC+Im+snV735b91U45M2CngZ0Gdtqw7TSMWuT1NWQCiWIfEnkrKptJZTw9SZtNYewQQ4ozm5RYi5lGBmFCuRQKe2NGItNxf5EDlUspOhtbhUn/yxIzG1IDZwY4M0brzABTDky5p2XKkZYpiWcKB7DqwKoDq27YVp1ukbDYjB38MnWJKP717XCtOZ6z5hKJHA6SWsoZ1ipdGO6lJtJ7y6kfSx4Y7i+dUeXym04HVWGS/0JUzNpvGBmpEVZaxyShrEUWqRCsCpZLLSBc11rDrWVwaTfi5Op+vdrOVXEoP4FCR2y0UFXkBqm5NAJ5zLhmwkgnfHRSAILbeiBq7Y/M/qT7p48mNvTCXBWH5jOpBd4H8D4MCs+dF114YxwnViUDBWMeA01atjdeC42dJ340M+3707VrLd9djvPD7y7cLR+9vv1srie+ngU9vK04mF+GiA8JFS3T20/V7cH9Bu43cL8N3P2mL+R++3W6eLIeuOCU9U4TizBXGCmDUaKltIZ7glkYS+lanx441pXvaB9XpWkGFyMk+OHADzcgoIMfbtgIBj8c+OHGiWzww4EfDvxw4Ie7uB+O4Av64XbVe3DFgSsOXHEDd8Xhrl1xH2b30IZi0PoAVG4MVfRftHKDysg99ZQKHonkvBqhLpj3zkSjDWUjQXd/NpsUZ7tF95hlYXDvnoDgswCfxaAgfl4TCnoJW23nyICNBjYa2GjDttEkOsdGWz96gnOlAtI4IixFogm1IUhvGNKMk0iltN6PRGD32GGC57b1GHQKk9xn0Qr6Q/Q2Lg28DIPyMoCVBVbWk7Kyqk7M5xlZ26wf7Cmwp8CeGrg9pbqypz58uUss6v5mcHYVztlVJjCNPcIEc65w1JKaEJRmFBsrDYkjEdEY9SajBT3ZVvgKocJkdic023hKEepSiG/WB2EOwhyE+cCFOetAmA93BiWBfBXwJA1WhoMnCTxJ40L0WZ4k0ZESCpP8QAEFBfSbE6uZAspbDIh4O5v+PXGo1dXgdM1sewLPJdaEk+Ati8Ehy4PQxDlsA4oCj0XX7LE9Ac1NKNhDSmFSuA1poIUAtBAYEHQ7biGAmA1CMq+FDwg5ghyLNESmk0UkKYUWAq0RXJ9zfn1/Nbld//nhc/rIq8n8rlIQCuS+p5Aoh2EhqfDEBkeMN1bLpDAYIY3XmlBvxVhUB9afmyonHtc3qZs1Py80k+9MckELAWgh8LQQf9EWArLlPJ0dfR08WuDRAo/WsD1askVPgPfT+5kLy/Yf09nHF2Yedp4ZnI8rG0+lTgfqGKeGG2YEwahybaGoFcaRm9EkRqnepLnIjW/Zxc7OVbkBqA4olvUn0KAoTe8T3BGa1FWKhY6JI2hBNeFjmfNE+nMo8FwR+1H2WBi6zyPWJs7asiz6yLqgkoJKCirpwFXSFin7u8f91WSWmNZ0ljjEsDXTbCl0IWK7x0w/kNr9Se3iLa7+Oq6BwTUwg4toRkJwOAhJrU4CDgWMiNOKeV9Ju5EgvD97K1s31FT2l4bxLmh2aq1Vs/XBCgMrDKywgVthLeZ27Z76imKvF9UnpzMww4YuzMEMG6QUBzMMzLDRgvvCZljSmUji1jzwyIkNnFLDkEKEMkWt5WPJ0+rRDMvNBGws/EsDeSdEezDEWo5yaXgDsMTAEgNLbNiWmJKnWmLvgrufzSefAwTGnpBcB4tskPIcLDKwyEYL7ktnIgqvFSUOJaNMY4ccR84YZS02Sjo1FoT3Z5HJHLFaKwGFgb1b4j1YaPocC+3ojcBSA0sNLLVhW2ryZEttxb8quoF9NnQpD/bZIKU62Gdgn40W3Be2zzDWlrJACMc8qkiwctZqZx31gXgNEbPWCG9uYhwU/aVBvAOSbYrGzjLFDqwOBhgYYGCADdwAEycbYAek5sDsr+ysl0L01P7sL9BTv4meupLh6iwZXrs4iHAQ4SDCBy7CT67+3rnaFqZDE+JZJ6oOkhnGhTc0RBKMS4+IDoZYKayOY2ljLHoS4r+WJoFxYp2bVM/nV1ezcJW+RN77YySNOiItcfRBBCsZQ4SGpD5KZb0eS89W0aPi2LwG8zDXKgy4ndAM3Pg9tiYG8+jbmUdnVmYfOkFgIYGFBBbSsC0k1cjJuergXz1eP/zFzBdvl4Li5maySL/r8TODs5RYdkqR0V5hJ2N0RPEEr0QoqkNM4tw5Lu1I5DnpLy4v68XTaVAqTLR3SrusGquZFDzakPRYbxU1ysWISXSWJYlk3Fhg3xvqeTPJs3lifV0cwE8lE8zsgpldA4JxxzO7OLeYYu284tYYa52V3ikrmKVMcIkBwd04FVbCczmK6ivPeRFienG5F2n99P7KJCgO0R1Q7MGp0DjoeopeA84FcC6Ac2HYzoVmGVSPTn91zitqhFVy/dfLwbkUVM6lgLkz2hLnolSY6fQi5gp5HCOTSoSxSPP+QgSs9uDtjJcsNxrQjjjZyYQJm0SQaGiQKPFDxWhkGLuwTCWQCHDbCrfFJQ1UUzPff7mJ09tqvZu76W2lNe4Nfl1dv7+3czeb2NC0tsRHoVAk3iQ1RhKEIkrmkrTYahed42Ek2OR0GCZSM6FcGL47oFgO4pIZKzhVEQeKLTfIG8SU8p4gppmXI4F4jy7Z2lrOr1ZsZYW4WXrDfPvxz+H6rkBwn0csGObdJ65hmHdbteQccmVDDzSwYAxyDgdnKHfcWcqMlOlB+gthtG5yHh/Y0Id/Tq4+/rhG2cefwiK96/4mLRH8avW/zK6LA3gnNIPwBIQnhozxLsITuSwg4zixCmmCMY+BSu99UlGExs4TP5bWBbg3hKtar9RugPSH3124Wz56ffvZXE/8zsvpC6W1FmH28LbiQH8ZIrYujWxu4EJsDmJzEJsbdmyuEmPnxeaqhz8vbq5Xl6vXBxehE9mk3zK8yUQNQ6MFbzJ4k5+8zQbeZPAmjxLX4E0Gb/JIsQ3eZPAmF4By8CaDNxm8yeBN/obeZIxYF+7kOtcSOJXBqQxO5WE7lZv12zt28sGhPHCJDw7lAct3cCg/LbMNHMrgUB4lrsGhDA7lkWIbHMrgUC4A5eBQBocyOJTBofxNHcqNWxO3cSuBMxmcyeBMHrYzWeEunMnv5gvwJw9c4IM/ecDiHfzJT8tqA38y+JNHiWvwJ4M/eaTYBn8y+JMLQDn4k8GfDP5k8Cd/U38y7cqfvOdZApcyuJTBpTxsl7KkzV3KK/G6Zm8r4VpdJE72djZ1YT4fnCsZZ7vRGy+SEkuQxIwE6qRCCgelNZI6UW0s05H6G8t8wMBuDJ7CpPq55Nq0q+LtxPfRlUFsg9gGsT1wsS3biu0HKj6Py99TXaUzv+RViV8MTnSjZ/9asTd9Cns78muBxQGLAxY3cBbXYlRWM8ffwDgcyRknhbjaqQBf+2ANlAv72guZtN3fNDiYtN3M7j550vZJ7aGbHBTQR0EfBX104Ppoi04etWf+wQpdH/rh2tytS0ya/V7gcsDlgMuVwuUG71nsmMuBbxG4HHC5b02shoV0p/sWf7tdWa37ybP/NTN3yxKIgXG7rJfRMG64dCqaSJRzXloebPROaJr+O5oUCNxfNZ1s4TM7CqXCHDOd0i7neYxUa2+UEDLY4F2gxHnrWJJESicZpEcC+x49j7WpLI8lDwA9k/nTnFwPmbvnuSKPnCFQZEGRBUV24IosOkOR/Sks3s6mf0/c7MOGFq8ms+EZ7NksXoqt0MonIiFFCXIkJtnuqBXGU+UxGoksJ7K/QHn9trYFUWEyvSOqPYh2cqZoP3AHEOog1EGoD1yo6/OE+ubAvzWLTy++vAvp8eRz9eHqiacl3ZU3KAatOLPIOM6INspYmwR9st25tiOR7j2mwUnWUk4dQVNhYr5r8m3kPcbny/vsrUDwg+AHwT9swX9GyvuSAVQZhe/CfHo/c2FFnqck66vudg47r6SkVFpk0/lDLmpGueVGjKX3xkBT3g8AqDDx3gHFukkTrl0cZDjIcJDhw5bhqnVDja0zXzG/FaeqtPblm16ufuzgRDnNiXJhtLFSMhWYICQmeGHEE914kuhMyDgSUd5fGy2uW7T2q7ZjBZ75A3oKk+Nn0yvbJE7FQIVDDFHCrfDMU5H0Vk+kkYmRmpGgm/eXPyKOt0JpyCULw3l3hMt3t2VeGse8otRqHCXGMkYvSVWz6QPkS7Vm5/VmxoFWxEttKRpXXgXyyXR6CKOe1Byp0ZEBYwyMMTDGhm2MCdbcGPvt9vrLmjn9Htx99YklNxic5ZV1orJ0vqIyNlptEWKR6sB4MrsMskQhMZamCrg/JyqrNSWOgqYwSX0ildZyWol2YvrQgiCTQSaDTB64TG4xxG71Z3m0X03md9UXeGoldpJaoh2KjBJiMVaG+3TUsKbEK6f5WBp58Z7k8a8lCtb3X27i9LZa7+ZueltZqHtHYv86785BzAYhmdfCB4QcQS7piSEyLYSTlIqRQJLS/nTE2qFpeSZWGo5PINFGO2w5oKJ2NVANQTUE1XDYqiHnbVXDLZfvwJTCTZeZqlN3e+b18LuAbQHbArY1cLbVohn/Q57BV540MMaVTezRQTLDuPAmGQwkGJceER0MsVJYHcfSMKYv73Jx1ixOR+X1onp5Ont+dTULV+lLHBkbLRy2XBFjFDKIc8SRR5RYrGyQ1I8l+UD0N6eJ1VPrIIMqDKNtyZMDL+bOaEuci1JhptOLmCvkcYxMKhHG4v3rMRpXq5UcsglKQ24r4qy9K7LlgJ1HJwBMFDBRwEQZtokimwTdvna2reDgZukN8+3HP4fruwGG30Q2/MaMFZyqiANNaqRB3iCmlPekKjf0ciQCGBPUmwjmtZ78puApTCSfR6xsUjZGRmqEldYxyRVrkUUqBKuC5VKLsZjipD/VspZf7U5Z37kqDswnUCiHYG5kIJISLIN3xCpDo4ueREVREvzGA4LbcubadPmXxn0KH3+ZOnO99fA3W/UGWz5RHI5PplM2q8KqmNTUpLiaZNg7KU3EjmFpGGGE4LH4qfpDc31HvWOisyrt++H282Q2va162haH7Y6oBvlDfWoekD50mfShTA2vMY4nnSOZzBjzGKj03psEaY2dJ34szWZwf2ahqnXG7CqHP/zuwt3y0evbz+Z64ndeTl8orbUIs4e3FQfzyxBx05KmaR5dM/MU/L7g9wW/77D9vo36w7dWDgfmAM53lSvDLKNglw1bsndml7XsD9/yDiDUQaiDUB+TUK8h3KvJLLGz6ezLFvWGJtRZTqg7HqgOxGCdSBOcTLI92excCaQYdnQsaVX9FbBJ2vbwbV77+lS5eVcdUy+fUBg58yGYpM86GxCL6V8VmZNUI8HJSJDP+2uteEQxa8o+C4N8R1TLumg5Q0IQohJ7l4xHKShHmiOEiOEyjgXq/XWdY7Vhz4c92zwoNFOnJXUguNBjgAxiC0OPLZzgkGgmI8AhAQ4JcEgM2yEhm9TttyAc+CKGJ+z7avAEvogn44twlhITENJJ3ZUo2CRttEvslXhF0wEYS69R1WNo7VyRUxrazycYeCDAAzEQMIMHAjwQowb4ZbMbmzbaai4dwPcAvgfwPQzb96CazMxtZ/78aJY+yMG5IXjODcGpIel/jjojqZaaCy0QV5ToaBXWY5H4TPXnh8irY+2gVJik75R2YKL1WYsGJlo/JlohmTyDyUuHRJ56D1oPiTzgjABnxOCAfylnRPHxEgiXDBbzXYRL1uk+qgNv20GdHxxv4HgDx9vAHW+qc8fbcKd5ZEe8FZIB1OPMVUgBeiIpQOB+A/fbkN1vK2W14ucXUFZhSBOoq6CufnNiXTROPHX3VVuMDzNzO4/T2Y2xG2Y1XGU1O8FJeOd51f/cUqIoRhZ7HR2TGgWkAx+LEwrj/mR202BnIywVJtE7pV1OU7UKIYVdNUYqKoWqOASLGhGlaAxEmZHgfjCoXy2RXjr8DKC+E9rlUB+kNNgZglyQTCtJEEPResS8kJjZAKhviXregFjvptPFY/lfGMRPJ1QHIYYG0gJsNrDZwGYbts1WOTJPt9mCXx35/5qZu7sBzq3KVhVHqrU3SggZbPAuUOK8dSydQqXT+RtL21LV39RTrlpZGo/QU5r8PpNc2ZG+Zfgg+qurBA/EE/BAwLirrjk6jLtqxsovMe4K/GngTxsMwjv2p63qifm57oc9nQg8DuBxAI/DsD0OinXocdh2AgzN+aByzgevZDqIVGJBDWVExZgoh3jwPhLn4lhkO+svoVHoc6zpHSAVJto7pFxOnaWaScGjDdRwbxU1ysWISXSWJVlkxuKS6NE4ayZzNk+sr4uD96lkAkcDOBqGB+ZLOBokM1ZwqiIOFFtukDeIqcp7jJhmXgKa26K5dpRus5mf5UH6LGLBFG2Yoj0kNHc9RVvTxICNY15RajWOEmMZo5ek0p99GEuU+ltrGoeypsp1+J5MpxyaC8m56BHNkHIxlJSLQnrw9Dc2DnrwDLgHzzqBWHQcwdvyJkIwD4J5EMwbdjBPnDSW6JGrdWCRu2x1ZyFhDCEhjjEsSX6JOEYhfXV6TDGDtjpPo61OIZ6I/hLkwRPRsydiaYGpk0ey7MkJsLbA2gJra9jWVrsGOyuG0TQl+ymZYIUURojBVLe1g1Jhkry3TiOFqKwQPBso0C8ZPIM0B0hzeGppDqf20GkjEcAsA7MMzLKBm2Wt2vQ3OP1DrmrLttTRQTLDuPCGhkiCcekR0cEQK4XVUY1EivOepPivpQljnJjo60X18nT2/OpqFq7SlziiOGKGHLVC0yQJFGKMWkQwo5VAMJqPJYLF+0u7OhKEacu/CoNwx9SD/iDD6fEEXrAheMHAUwCegqfpKWg/I6WdtABfAfgKwFcwcF8BbuMreJskQkWEt7OpC/P5dPbxhZmHR88OzkmQjd56z6zmMTLFA0HMcSI15um/DrnI9WjqZPqz2ES+groxigoT6F2RLaetKioYSlaZFoELYRQWVV9e63x6EjPHRgL2/pLFj9gZjzft0TPlarCd0i7vlENGaoSV1jGpWtYii1QIVgXLpRZj8QP3Z6OxWsG9W8W3c1Uctk+g0EMEl7a1yxqKBjDIwCADg2zgBlmrdqSPD/5Pk8Wne1s9P3/CNlkhairuK3ILeuqT0FNJEBEllDNiBBaCRZL+TZzCUq6JMXYksCf9KapHesm24Z+Fgb5DyoFpBqbZgJB9jmnWur9M83MC1hlYZ2CdDdw6a1Xx2E4xHJh9hsE+e4Yp2GdPQKB3bJ+dWkfT5j4g7EHYg7AftrDnqI2w3zwYnCDX2QqZMszv/nK2wfy+iPmd6ULghWLMUuFoUJEpy6lKwLU8SIqEJSNBMO0PwrR2g2oYXWHAbUyX7CB0SYUnNjhivLFaBhSNkMZrTai3Yixw7bFcoLYLxKE0+K+3m/80m97fFQfic8kF821gvs2Q8Nz1fJtC2in3yJ+hm3IjvnyBbspYIxMQd1o5bxhPyrGTyHukpY7cIeDHrbGcdzR++Ofk6uMbM7mtHvxw+3kym95WnafKA/OpdMpyZsSQQUp6xIRQXHCpqEDecktjUAIBmrvlzA910OsGGD8al/79Uh6YTyRT1gqMnKlIMOdEIGxElC4gZoRFGJtoYV5vayzLw3No338ys+BfTm/uZmE+D/7VuiFg5dcudGrvedSCqWMwdexpAf6iU8ckaRsp3jyAKDBEgSEKPPAocKuUr82DzTjwgcWCs90SPWdICEKUxEYyHqWgHGmOECKGyziW0ESPbexZ3g7eB0thQrkldSDyAJGHQcG348hDIak4UAkzIAh3m4pTiO3fH4LB9h+87d86S3xXrQEPAHgAwAMwbA9Au6HiB+NBA3MF4PxU8TKCrVJDtHVY0voS0VbI6YKcrgFi+aScLsgfh/zxseaPeyWTrk8lFtRQRlSMSTlDPHgfiXNxLANE+sP2kR4+RyZkljw2p0PKgc8XfL4DQnbHPl/IZIRMxpFmMpaRDtEjb4ZsiH6yITg1JP3PUWck1VJzoQXiihIdrcKjmWjSH3KPNBiq8ZVvXvv6VKkOvU5pl0W9kYFISrAM3hGrDI0uehIVRYxqA5pIa02kdudWsvWXqTPXWw9/s39P9ypUBzmVTjk0B00dEZ4Ka7FBinNuHSFCpmviJKeA5vPRfDufXqf7zKZXlYL4wsy2H5fKr0+mE+RnQn7mkIDcdX4mSdfaWkaRkJxRKaJzmFQ6tgiMh7H0PO2RI9duUFrsKt3kZ3Prr9Pf9Pz60z/MZtPZfP18cWg+j1iQtfmsv1a+kLU59KxNJU/N2tzLO4H0TUjfhPTNYadv8lYT1T6sf3JFrcHlbObLNy3nLorAsdCCOWSJowIhwaxnwletzUchxzHpL2eT5rMAdrFSmIBuRRvIgXgmIAdiMNjtOAeiEO9WjwgG71bf3i3wAoAXYHgov2ztZuthfttKDZj+YPqD6T9s07/KPWlh+ldtaVc/5ONz76vbpx82m978EuJicL4AkvMFRBu0pkLaILGPHnvDfbQmWiUs1m4sGmmP8/nq4y9NsVOY2D6PWNmW5soapDSyzhCvhIsCJeZImOaOBor1WIDdX4+yI9Jke69e3s8X05vVRbnTJs8n2Fr/1LS1/pk7OKCQgkIKCunAFdJWrUQasJKBKaXZodGFyG7Sn58UZPc3k92tM0iOrg3yG+Q3yO+By2/ZhfzeaQ8wMAme7Qqmg2SGceENDZEE49IjooMhVgqr41hC9bInAf5raeIXp+OzyaB8fnU1C1fpS+QdPjKpi1ZipnWwnDgUXSDCEmswdjSasfSEUbw/pbGWWu2YVmG47YJk4NXsMYEEDKNvZhjprgyjrdMDphGYRmAaDds0Eu3S7LcO/Y+T398vZu8n/z08f2Y2yM6RMtxQKUIwSGutYtJMDXeKMeftaHok9xhkZ0dyyg+ApjBZfSKVQAGFsPqAUd2ZBqrap3XWnhhQOkHpBKVz4ErnyQmer9Ovn/onpnEahzln1Kh04rThMnhtE3aE1MhTzEZT4tmjxtk8U/EBMYUJ5lNIBLom6JoDhnR3uuZZKZzr4wKKJiiaoGgOXNGkpyqab2fh6k31JZ6WqklJVNFZjImJlHCiqbOcRhoINyFJ8LFI6R5VzdrJOccwU5hkPo1IoG6CujlgUHenbvJz1M2HAwMKJyicoHAOW+E8vXQ9HfM7Mwvvp/czF1aUeUqKp/cREaVQUNoRzKNwghilsDFcCeHG0ohmmKXrNdgpTFafRyxQREERHTC4B1K6/ujggEIKCikopMNWSE/3gP7n/TRRICzM01JEY1BYUEoVwQbhwJHFinpqjRTGsTiWeWLD9IBuYaYwGX0akUDxBMVzwKAeiAf04cCAwgkKJyicw1Y4JTpV4XwXbqafK8MyvJiZf4T509I7CeYsKi5wEtSeI8cEQ9QEKkTgHCk8FnHdowO0dlsbQqcwSX0WrUALBS10wNjuzv1JztFC988NKKOgjIIyOmxlVIhTldH3i9mHL3fhw/Qvs+vBKaI82+2LBhaMQc7h4AzljjtLmUnYSiKbGTcSid2fHlq50I+iZi04P/4UFuld9zdpieBXqy8RVJrM7oJmOb00nXEakaoGJnAVJTI0ECW0SwzAWIzHgnJC+jO3cGM1a5c5Fgbtk+kEZhaYWQPGdRdmViY/kDMkBCFKYiMZj1JQjjRHCBHDZSQjAXh/7Jrl2dDmwc/h+q7EOYvtqJNDbpDS4MSWkQuSaSUJYihaj5gXEjM7lur9HhWNBsR6N50uHltYhYH4dEJtwq7qHIfXtvYCzi5wdoGza+DOLn2qs+tDouCH6cupDy+up+6JVZ7woATx2tDoOSZCMKGscJgZYbFnDPo5thfQrLEl8Ag5pYnoM0gF/gDwBwwY2t2FXfE5WujesQFFFBRRUEQHroiePG5pddh/TvhInOppqaEoYOeZJ4pgFayygSmpnRbSS6U5gbqTjvxETXBTmKQ+nVCggoIKOmBgd1d/ctZ4m51DAwooKKCggA5bAZUneEI3yUhrRrK+fKIzuxXnTAbknKBEO45JQFxrxYjAWAYymjaQqj/Z3cTRdxRDpcnvToi2luEYnehHOnIDEOgg0EGgD1ugqxPa6tUfexjiPWyR3pdEhyHex4d4I0+FDFpp5rRQkUji00mlKiHRUkTkSCCXFIv+1MgmfQobcK7CwNsV2XJoL8Rm6nGaN5hM39xkOrHh49GjBEYTGE1gNA3baJInhOE3B//VzPxzU5O5/PybcHs/OINJQR30sx51V6iDbi/OL10H7bVGOmistFNSEa6t1CyJnWgl8zqOxUYjPZb7N8mmOMInS0N5ByQD06zXVBSwzb6dbZbRWTAyUqPEzXVMdoO1yCIVglXBcqnFWJy8PVZJ12qiyUiIk6v79Wo7V8WB+gQK5RAsmbGCUxVxoNhyg7xBTCnvCWKa+dHoI70h+MhkmxeVFe9m6Q3z7ceFlv2fR6wcrqlmUvBoAzXcW0WNcjFiEp1lmLrRWJM94rqZH2fzxPq6PESfSKYcljk1JP3PJdxKqqXmQgvEVdKto1VYj2VWW39YlvluIzU+yc1rX5/60bjFdPalOIB3Srusp8QYx4lVSBOMeQxUeu+N10Jj54kfC+r78weqWta0qzn+8LsLd8tHr28/m+uJ33k5faG0VrKMHt5WHPwvQ8RN5e2JZQ9ZVw2E/iD0B6G/YYf+1AlDOOoO/SYMMch5xNkuyIoHnNRZZrAIlAjrY4xOkOCYjEix0fgheoyLNBkxcRxEhcn3jqgG0RGIjgwd6ZePjpSR0dGf3wIyOk6A+aUzOjRlXhrHvKLUahxl4uIxekkqn7MPY+m70KOnudbDdKiNarkM/GQ6gdcNvG5PC+oX9bphdOKcsWNmAHjewPMGnrdhe97kGZXKFc2Sxvhy9fuGN/82W5/sOBZCKEKQ5CFIGzmTmDuTgKRCAthIBH2fA5naFD0+wk5hEv08YoF7DdxrAwf45d1rLiY2bRgPUnNpBPKYcc2EkU746KQYCdB7ZOCyZWrtg1HxwhTYxfQ8am1SHs6seN4TDWBygckFJtfATa4zuj2m16sPhrdJQmxlhA/O9BI508tKIlyMhqvguUlwitgFtyzAwCIoOhbB3WOuQxtl6yCGChPg3RANTDEwxcYE9JNMMaiigyq6wfrSoIpuQLiGKrpGiIYquuFjGarooIpuKKiHfJ4nBf8L5/OcOXjggK0LvmXwLYNvecy+5Yfk7zWLuQrL7O+B+ZZZto7OEYwct45pzAxPj5POi4Uk6Qo7Mxrfshymy+0ghgoT8N0QDXzL4FseE9DBtzwEvwX4lgfhWwbPBHgmhof3oXsmajUl8EyAZwI8EwP3TKhOPBM7ZekDc0zonGMiUq29UULIYIN3gRLnKy9FEEqnQziWMvn+xD1XzY7eHnD+a2builRkzyRXVpVVMokXKrGghjKiYkz8APHgfSTOxbH4InrM59TnbFbRkxe7oxwkBvXJzSEx6FslBpXSpqrHkAn0qWrPuC/dpwoCJhAwGQLOLx4w8ZwhIQhREhvJeJSCcqQ5QogYLiMZCdD7C5iwfLLi5kGhEZKW1IFxYjBObEjo7XacWJCySjMiyAXJtJIEMRStR8wLiZkNgOC2dmEDYn1t8liw4+N0QkGQGoLUTwvrFw5So86C1FvGKcSoIUYNMeqBx6jZ6THqiiO+vb6/mlSh4uVvHFx8Ops4L4w2VkqmAhOEVK3VMOKJXNwmHVbIOBJJ32c/zHwo6jh8CpPqZ9MLvL/g/R04xi/v/UXMBiFZMtF8QMgR5FikITIthJOUQlfM1j602gzwFe9Z//nhc/rIq8n8rlJDSnQBn0AiGCkDI2UGB+QzRsqsurmK81wHj7UacBuA2wDcBsN2Gyh6utvg7Wxy+8gn/3z+y2Q+PP9BdoAtoVUOmfSUMcJoVNZ56lw6hlJSxjEei8zuMQk4n7HdAkeFSfHuCAceBfAoDB3sMMb2qVljkB58AswvnR4MmTuQuQOZO08Oz5C586SwfuHMHX6e+y1jC4AfDvxw4Icbth9OoNZ+uDdmcvvD7+knzZeMZGAOt+wUJe+JUdYiHhUyUnltnQoqmWUakyD9WPwPffnbfi1NFFfnankGHvD/8bmdL2bGLbZORHaigEZRWcUEZtIRwtK5lIgzrqSIKLGzkSBQq/5yDWoZS5ZlFYbaEygEfRxgwMvQYHyRPg5QPQnVk0PgxidXTxbis+ovogY+qwH7rA6fA6wUkthqZ4nGBgvLglJOaIK8kIxB/mNrrWSfT/1ibq/u03f52dz663SjveuSO6idRau1J7YC5wmO2B3FHTyu4HEFj+vAPa7iJI9r9eCH28+T2fS2itEPzu+aTXTEGpmAuNPKecN4ZMpJ5D3SUkfu0FgKbCjvTzrnOwgdhk1pkvlUOoHXALwGA8Jxx16DQsIQ3xrBEIW4WBQCanahZvep1+wW4ruFfMMnhfKL5htWv+JEL9eeig6+LvB1ga9r2L4udiS7cPWnen06G5xHKz2Tc2lFhQ3mkkQesOMeYxE50VQTgiMezdBs0Z/wJvv7uouOwqTwEWqAe+qbG/fgnrqYewqMezDun7xxzyXWhJPgLYvBIcuD0MQ5bAOKAsNIkbYYprUtKtY3eTub/j2tvroqDrttSJNNosIes4gMMV57EQxVkTuJORY0MKnG4pD6hgXd+4lBbz/dPezT8k+hE3FOJ1QOz9ELxZilwtGgIlOWU5UU4MSKJUXCAg9uzYPzQZzNg+Lg25guObQmrhu0tSxBU3JGpYhJWyDUGSkC44EBWtty31qVLi12lW6yYSxrozp9+ofZbDqbr58vDsLnESuHayGp8MQGlwBurJZJ/zVCJhVDE+qtGAsX7q9EoX4u+e5N6rqfzH+aTe/vykP2meSCEC6U3zwtxPdffiMNV5qGxNeJU04xozyyigWqqdeEIDgHbTXt/eZtz19XlvznSVIky+3c2JAq62QD0aCkZjusAikFkFIAKQUDTymQzVMKfjQu/ftlcJkFNJtYwI2KHFnEDRGeMimYMhJHHDxTfjReAN6jKN2nVi1GSpOkjYiSDRaUkQHTH04hAQYSYIbpSIUEmIskwKyMFN3OSFnzZrBVwFYBW2XYtko1VCVnqxzpErLl0BiYAZMt9kdIC04V0pgY4xwihriARdWXh1pjxtKJh/UYx9z3ejUHTmFi+AxKQcvLPiOY0PKyEZwv0PJSIuusxEzrZA0Rh6ILJDFnazB2NJqx9MDujzuLWmLtjUtY6iebWVLLi5L7pXVBsmz9gKdCBq00c8ncj0QSn5Q1qoJkliIiAeNtMV6bHNRoYlrROO+IbDCEC4ZwDQ/d5wzhWo3+RsddX00VePCHgT8M/GHD9ofJI+0A2nTNHZhHLBvS10kyG8aFNzREEoxLj4gOhlgprI5jiUeJnkR0cWOHcGKZrxer8M/zq6tZuEpfAtqhV5DT/amF0A+9r37oxccW+uKkEFroKbSwMncapCM3Pyhg8IDBAwbPsA2eKrenjcGzVeT+cnpzN90qc39K9g5yzDFmHffpuBETWdXyxAsrKOEI2bG07xE9imnWvD3CPnJKk9NnkAqSSiGpdEBQhlGBw0Yw1CoPuFZ5ZXLh9ibXQfkAFhdYXGBxDdvikuRki2vN016Y+Zp1Dc7owiRndYXAnbJBK+lxOnSIECGjoiLRTegk30ci3uWw+uy8NO5TWP1r7GbZDzMzKTBb9Uxy5XRXI4m1iU1aR3HEymAcMEVVabRCVvCxgBv351Koz8FssFvlhgC6IFkO5C4iFFlI75NSCOdjNFxKhKnFVmMxlopq2R/Iq24Rx25SOqpPolG235+zSNKAotOIY8kkFsRhZBDlhgRpRwJjJlB/msj+HrXTYwtD9JnUAh/as/7SasCHNmAfWiYaQpmXxjGvKE26SZQYyxi9JFVtpA9jScTpseqgdlD1oWT6crWVk+mUTSvDwlLPk7aCHA1a4agVw5Qmjk64ZWOpifyGnpPjEnjLu1YeqM8kV7Z23WqlTZSUSlU9diZxbuswYxHH9N6RYLtHTq1bb9absPg09aWC+1x6ZdGddPCEbuFNZJFQEp2J1MggGSPaxbGkGvVY6bsvX4/v1ttZFaZYfCkU3x1QLItwp5F3LiknhDLGlKNaciSRDEwoA/0a+kB4MpXmC3O7AISfSrHslCbuIvFWYB608NQI4kOUrhqBE3zSVwDh59qStfv16W59+T4sFmnteXG4PplOWc9IjD5pJCgpIk5Eg6z0xmiHUcIzIgTyRFvz67OMo4Kr8Loj3Cabjp2VTffI1Q4JdZBQBwl1w06o0/TchLq9jIj0htULQ53OoHNJdpRrwYiw2EvjveDYamSRFEJGKawZS2wbI9mbfJcniKljkCpM0l+ChNlEJZUsNeaQtdESgjgKiCEvmOQhJGYCPuXWOm6DHJzazLL/mpm7tGapwO+Mbjm0cyMDkZRgGbwjVhkaXfQkKoqSmmHGknv6rWPdq336ZerM9dbD32w1vH75RHHoPplO4J/oMdYN/okB+CeKz+3APbJvSO4YTHIHBAchODjq4KBUHnshRMCRIiS1xQJLn7QXaoXGiADC2yJ8vyf58f169eXW3Exc0VlMXZENUvUgVW+wIIdUvaeEbkjV+yapestQOMa8i1j4ES88BMghQA4B8mEHyOX5AfJta39gwfDEtjPR8EIqvbHusc08VHoPo9K7EL8xVz12sQXH8VAcx4U0C6PfENxNUxGgWdgp5ILmBM9Ifzl60J2gIaov0Z2gkLZgtD/PGbQF+wZtwaCBftcohgb6xzDcbQP9QgpVe2wTA4Wqp6kVUKg6QDRDIuipYbleEkEx9phFZIjx2otgqEr8XGKeNOjApBpL68Yesyv2iZXZttWfUkdSnUyorIO6jClrPeIZhqw1RvSFhqwJrzFmXKanRWAKE2mdU4Q7oS0OIgKmW2JatmA963umZza8aPOoUJR3SzwoMYQSw8FB/CIlhoU0Sef9BRehS3oHWO+/SzqUZ337lGcoz7po70ZDKJFEGC8iFiRW07ksjs5wwYWsciQB4e0U9nP3q2A/Yqe0y6E+qTZIYUeMUVEpVOk4LGpElKIxEAV8/WzU76abr5ZILx1+ptxAfae0g/JEKE8cLNIvW55InEWBhKAcowgTK4XSXCoSnVBES0B3W139vN0qWI/pkHJQkDts6xQKci85O8N4p5Dk2GmMtLRcMCNM1JxbuxwlDQi/vHW6u18Fc/VOabfpyN5NFfrXZBqoOIeKc6g4H3bFueqy4nybqQys9jxt5b8yIXNKPCfSes2xpSpi4Vm03nnjHDN6LI3BaI/5q7UncPcmaemrqhbvaxFTwRL9fIJBfnY65ZChPXyk95KhHaQ02BmCXJBMK0kQQ4mlI+aFxMyOxcFMe6zbbUAtYOVnEepIWh8RWkXEHJeCWo91SKqJig47RuRYWDjDgwL01w4vAOgTCAU1vFDDOyAgQw3vsBEMNbwNGfIlanhR0oqFZD5BOSDkkubMIg2RaSGcpHQsIbz+LES23+Z7dZPr+6vJ7frPD5/TR15N5neVN6/AqphTSJQPQxcxUrHHIB0MVDw7VtfzQEXCSAzOBR6IccxZFSOjiCsapdcSYTgDLc9AFSM5uoFtciQLLYG8GB2hChiqgJ/GEYAq4CeLe6gCPtE27aIKOGjqiPBVT2FskOKcW1e1Ga56DDvJIfmuAzTfzqfXoUoTu5qF+fyFmW0/LlV5P5lO0A5+mZQEzeCHCOoLNoMvpF9Df0M8oF3Dk2zXUEjfeGgbPzSoX6ZtvEmqt7ABCRNY+leHiDyVVCtng3Jjyabq0YvScd5zaSjvnH6bWYyo6yqYrzeBehioh4F6mGHXw0hxdj3MXsejoRXCEBjC+IxQ1J/eCkMY22ivlxvCWEgDPSz6wza00OuhSUGbFnowivHiruW6m8Aoxj5GMRYyu47Q/jJUYXbd8RRVmF03cF8a1L30XPdSSPwahpkPFM6XjF/DZK+usQ2TvRqi+iKTvSAPFPJABxSHhmkwjXx4kF70pLAO6UUjZeuQXtRLehE0Urg0mqGRQjM0wzD0AaIZWu2dGm3ssNXeqke06iQ7bieiCWlxkBYHaXHDTotTHafFbbOWgSXIyVx+XCEjClmPifAwo/D0JPi+ZhSW0nu0v8wL6D16alSkMaEggt2nwwEi2EOJYIMzDZxp43GmQUfHrhVu6Oh4tt7dc0fHQipX+su3g7qVgdWtFJLX0R+Xh7SOAad1rDsNXCCWAs0GIKoCUZVvT6yGURV8blTl1ZdbczNx2xPbBxdQ0bmAilQeeyFEwJEiJLXFAkuPnKE2yX40lsmbmPfnWhb7MxVOhFFhwr4rskEF67Meu2tABes3qGC1ijIjZJBEYxyM9jJEl7g4UdRV7ZhHAmM16GGy21ynXGx3Rzgo2YaS7QEBu+OSbShrvXQCB5S11gP5MmWthSRwQAuCoaIaWuifnW0HwZCnhPj+a1yp1UqbKCmVqnrsDPPSOsxYxDG9dyTnoEedRZ9lLBUH+bPplW3VKKXBzhDkgmRaSYIYitYj5oXEzAK6z9bIs5XJkFJ9AqEeQte0i9B1jfscotYQtYao9bCj1pKdG7UedLgaU2iQ/4wQaJA/UOF9wQb5ZdhblHCwuIaK7otaXNAc/9JO47qbQHP8PprjF5KTgSEnY/Aw7ycno5BcOpgGMShswzSIobuBIbWo59QiSMWAVIxBadUwDWK43BnS5pqiGqZBPAk8wzSIZnCGaRCnO/T6MwEhU+5JZsrBNIhe2PqhFJly3SEwDeJJohka2DVDM0yDGCCaYRpEf3GZI9MgRBdpoJD/CfmfkP85BGI17FrUaf7nNlsZWCaoyiWCUuISqEgIyiU5jomVQmkuFUlSXhEtRyLWRY/5FuflfpUs2LujHEyBgCkQA0Q4TIF4EqYZRK4HE7kGJxo40cbjRIMpEB2jGaZAnA30vqdAFJLhP2hHMiT495fgX0g5Yn8OFihGHFAxYiG5S/1xc0hdGnDq0rptTOfxwq+/GSKHEDmEyOHAI4e0y8jhlho5sMAhywUOC6lbxQgKV4ck2WEIxKn11xIcEkMHdz8OCQgXQrhwrOFC6Eb7DVI7oBvtWYR6cCvwrt0KDwIBvArgVQCvwsC9Cvpcr0J6Zv3Er1Mf/mqu75PEuLlLZJsNzrcgcr4FroRgFDsVpSJakHQUBQrICxKEdOMJKvQXM6uaHXeJpsKEe9fkg3gxjAsZLNgvGi+mPIaEbuFNUrYIJdGZSI1M1hoj2kUB6G7rbGuUp7jLmmaVLF58KRTfHVAsi3CnkXeOI04oSxaEozqZEBLJwIQyBtxrPSA8mRXzhbldAMJPpRg4kMGBPFR4w9DK88PakM/2lBB/2Xw2jLtwPGcMXnA/g/sZ3M8Ddz/L7tzPD482vVwH5nzG2dFoXmPMuExPi8AUJtI6pwh3QlscRByLBtBfPpBs0QP4OJYKE/3dEu8h1qy7Ffl7NwKBDwIfBP6wBb4UZwv8Pa/o0KQ8gQmoz0iPg5dgAmorL9YFJ6CWEWTDur9hNhBmG1iYDaagXjwKUXcTmILaxxTUQorrYCjkoBANQyGHHiiGoZBHMQxDIU9AMAyFHCicYSjkE+LOMBSyKaphKOSTwDMMhWwGZxgKeTqaIRPtSWEdhkKOlK3v3gSGQsJQyCeKZuhn3wzNMBRygGiGoZCnRhs7HwqpOsmQ24loQlocpMVBWtyw0+JUx2lx26xlYAlyMpcfZ7xTSHLsdCKWtFwwI0zUnFvLqHVjCUGz/mS7PDchpmDx3intYDgkDIccIMZhOOSTMNEggj2YCDY408CZNh5nGgyH7FrhhuGQZ+vdPQ+HLKRyBepWhgv5C9etlJLXAWkdTwn0Fx6Yd4FYytdfDVEViKpAVGXYURVcfcMTwyqrX5SI6SdL7rN0D2z6Ve6/+Hr+djb5nMj18NTgwi40F3axyhLviCfBMsSjtIbGiJn0DmGfdIWRqAe4v7RPjGhzhe5srBWmN/RL3GwqkiKIYUdsYFYGzoMxKhLhFcUsCkRGcnD669r1qA389k0ebeXmUcHpoufSCwrC+6ykhXrwS9WDr2w+hs6y+c6UFWATgk0INuHAbUKC+rMJp4lEi+CfqlVYkZEJz71jyDDDk0nInSXRWO1iHIty26tVuL+vl0VbYapD3+QFyxAsw8EeBrAMwTIcF6LPswxJv5bhvrQA2xBsQ7ANB24b4tPHkbRlEPf2euKeqGHIiRE6yKgF5s5w4QPmCXvGChWtU2PRbXs1DFs0pzoXaoWpDb3SFkxCMAkHexLAJASTcFyIPsskpOeNozpPVIA9CPYg2INDtwd1P/bgXyfziZ1cL629J2kRUpeOgpFEWWUNp5JojhNhq3ZcnAUPCaQnWITsQlZLLdgK0xt6pi5YhWAVDvYsgFUIVuG4EH1eoBD3ZxXWCAuwC8EuBLuwMLuwAV94M/WTOKmmkQzMLsTZFFIWaUiHMihBDDE4JGuQaOKTlkuriT9jEf/oCdmFrcBWmObQM3UvqXO0+CKgc4DOATrH0HUO3JnO8SYsPk392JoYUGGQUul8KoMVRYqoiATWIjjiFddjGdnTow+6Ev2Xx1hhKkY/RAWPM3icB3sEwOMMHudxIfq8PCTaqfXXVEiA1QdWH1h9Q7f6aA9W39NuU8CQV0yjSDURTEpqhHZGcuYilybGsfiY+7T7WvTfPgdlhSkJfZEVbD+w/QZ7CMD2A9tvXIg+z/bjPdl+0I8ArD+w/p6a9dddr7qDnOEpNyJgDkViqBTeK2EIc8Q5ooRMot5GxMcyN7NP0++MDmqNIVaYgtALTcHoA6NvsCcAjD4w+saF6POMvm570TWUEWDxgcUHFt/ALT5CLmzx/XZ7/eXH2fTm5f1slsiwKU97itYfqLWg1o5XrRVEcRE98sxggokm0RsXKWWSaK3wWNKZ+1NrMdrX2S7NTAs7Dv0TGMxCMAsHdQTO6zzAejALsycKTEQwEcFEHLiJiC9tIj75bnTKamIIUUox7RQxGkdjGXMy8uBoGIvq3GdYsHPNDrrQ9UZVCA2CD2WwZwBCg2ADjgvR54UG+7ABoe0cWH5g+T1By6+7YsC3s2qhxZexNYEhIiCvsDGEEWEolj5IiqOVSiIkwfQ7wfQ7o2qtDcoK0xL6IisYf2D8DfYQgPEHxt+4ED2kYsDmYgKsP7D+wPobuvXHe7H+nnYzGCeM0TFIrDVSxnsedGDRRc5oOqlcjkTo9zqIav+IXgxohekKPVIWrECwAgd7DsAKBCtwXIg+zwqUvVmB0BQG7ECwA5+aHdhd/meGNzzltjCaRCEUYSRYx7xSIRgZFOFWCCKdGYtG+0TyP1uArDA1oSeqgvEHxt9gzwAYf2D8jQvRQ8r/bCwlwPIDyw8sv4FbfpXxdWHLD9rDPDXhD6rtUBWBi6q2ViMvnZdEW+a8QC5h3EXBdHSRohhHgu7+VNvEeLu3xqFBzG7Au38Sg3kI5uGgDsF5LWJEL+YhNIkBUxFMxadsKuLLm4pPvk1MDEhEnogWpdKOqqRBE4QFdloq5YwYifjvM0x4Af0OGsX0SFcIFYI/ZbCnAEKFYAuOC9HnhQr7sQWhWQxYgGABPjkLUMiTDcDVn5/Ddfr44Cw6kbPoMPZJF0WGGK+9CIaqyJ3EPMnvwKTiIxHiWKH+lNR9cjUGTmGy/HRCZY0ujIzUCCutY5Il1iKLVAhWBculFmOZcNmjWlrLp5LgiJOr+/VqO1fFAfkECuUQjBxzjFnHfVKAiInMBhS9sIISjpAdi5etPwRz1pzRvJze3E0L5slnkCqHaW5kIJISLIN3xCpDo4ueREVRUmCNB0y3xTSu5TnGfQoff5k6c7318Df793Sv5RPlAfpUOmU5NBaWeo44Ro4GrXDUimFKPfGEW2ZGgmbVH5pb9Pbb3POrXVUeqM8kVw7b3hjHE4dOhjLGPAYqvffJOhQau4TvsViEojdsq1oPzK52+MPvLtwtH72+/WyuJ37n5fSF0lqLMHt4W3GIvwwR145hpc/yC2/bpuDoBUcvOHqH7eitpGdrR++nu/Xl4Py7OuffRUgLTpMwxyTJdYeIIS4k7ZVoTK0xo+nu3WMOAj2ie+1dlxurPYNS2bwDnZDrTESBe0SFEiIilKQK1TSBW6KRQFro/jy8xzZqnwMWBuTW9MnGJ2L0OqE3IdiJpAtZmSwu7TDijCJCID7RFr3iLGN4W2YXBuvuCJfDe+QuEm8F5kELT40gPkTpEtpl8MqNxVf2DT2/eW70PiwWae15cfA+mU45NFPNpODRBmq4t4oa5WLEJDrLkjlr3EjQzPpDczOzdfPE+ro8MJ9IphyWJbLOSsy0DpYTh6ILJFmG1mDsaDTAmVtrIrXEetikD/+cXK2TSD++vJ8vpjeri3nJOkgHJINoxjMK0YynhPpLRTMyfkBPhQxaaea0UJFI4rF1VAXJbDI7xzLloUdeLxowrjX2NqxrfVk0v++IbDmsBykNdoYgl9CtlSSIoWg9Yl4kbccGwHpbHb0Bsd5Np4viPSqnE2oTiUYnRqIfzFgIQEMAGgLQww5AV0Lw9AD0V0fVwALRKts6ogw3MOYcHMFDk8qXcAS7mBiiYTxIzaURyGPGNRNGOuGjk1Ck0RrNtZXdmSKaBxP4hbkqD9PnUQtKNaBUY3iYvkSpRiE9eHos1YAePMPpwVNIeKM/dEN440mGNyCUDaHsb436S4eyIYQHIbxB4LyHEJ7GDDlqhaaeR4UYoxYRzGjltTeaY8B6S6zL/RT23U1bLZFeOvxMyZDvmHqbYJ86N9i3cVVC0A+CfhD0G3bQDyN8QtTv+v5qsiLq+uELMw/plfeLe2vTm3YvV+8ZXGAw21PeYUGQJSqdT2ecE0KpSB123Etjgh9LOR/pr0JV7StoHSKrMMF/SVJmi6aY8c4TabxW3FIfVLL8ghbYGmq9H0uZSX/67yNiZTbyh8/ps5s7/3b78lNw/3g93+ai5vZFqPasvPNwITJm/R5MsyQPvJKSUmmRTaobclEzyi03Yiw+7h79HrVxtp1de1Dgfrv9aWVjvAvz6f3MhY1mVhTsO6DYpgc9oScafacIGbALwS4Eu3DoduEpfeePcYP0MH38/ib97OnsCVuHFgdPWfAi+oB59NShqD0lIkiT7MPROIL7sw51CxXuNHwVphxcnqBgKYKl+NROBViKIzgLYCl+S0vx1K60p4sasBfBXgR7cej24iXiiOnhX24niydsKSKrrEMa25hsRKptoqBCMiCOVMTp/2MR/k8tjliPrMLUgkuSEqxDsA6f3HkA6/DpnwWwDscYR6wTMmAXgl0IduHQ7ULahV24Ger41rh/pDfPN2xh2JYhy1mGiXgUWZ4kvWA4GsdUCI5LRkTkUWA6EsFPexxp1qhz/KnYKkwpuCwxYdAwDBoeIuovNWgYPB7g8Rgi3sHjMYKzAB6Pb+nx4F15PBqpTuDzAJ8H+DwG7vPAvAufx4qXpY/85XYSJ8G/vTYu1D/7FP0fGlEutTAsMkwjpjjpyOmncCulEsKOJYeaod70AIz2j+jFgFaYvtAjZXOas2HccOlUNJEo57y0PNjondA0/ZfDkM62J0a20gNX+7BJUgx+dYf/mpm7El0lndIuO9wQW6GVTxIXKZosRRK19lUbJuOp8ng0rRj6sxfrxf9h6+ftbFr1tf2wUc5eTWbl9WvviGo5pCtvUAxacWaRcZwRbZSxNoFeyMC1BaS35e/77txje7bZrLdm8enFl3chPZ58rj5cPVEc5Lsm38ZnUtnG3fhMWitY4D8B/wn4T4btP9Gnl563iVEMzFlCsnOKyogfMgggPjEV4ZsEELFIR4AjjpGjSV3GUSuGKfXEE27ZWNqq9zjtvlGuz+49v+5acZg/l1wbNRifV0rb/DiB0gtKLyi9w1Z6zymgXXGCNcd5HtOvq059YmkHlNqnpPkaqqyKCisWmAjESeKQilYrEyNDZiwxD9zjMKEWVZ9tkVWYJnBJUmYHUcTotYnImehEEl1WemO0w4gziggZy6HoTwMWZ6l0BZ+A7gjXUQlhu2MGmjFoxqAZD1sz1qfMpa9hBr/dPvd+iwt8mA5YJ86mzklLSEU2GqmwnhKV1GNpXVKHI3csjCYjQvenEzcaxt4aVIUpAxeiYk4TZkkURWVssggtQixSHRjnSURVw1uQGEtgpL/2Sqx+MPBq0367vf6yXur34O6rjy/3sTikn0gliGpAVGOokD4/qgH+CvBXDB3l3fsr8KnzMlvqQeCqAFcFuCoG7qpQ7V0Vbeb1blpNDMxZwbN9jhiJwbnAAzGOOatiTEKfKxql1xKNpc5P0P6cFftzn7uCVWG6wMXomFOFhaTCExscMd5YLQOKRlR5nZpQbwUZyXHoL5Hzkd1Sc5N30+lin0HOf5pN7++KA/255MqaeTSwYAxyDgdnKHfcWcpMUjO4S3/H4ozrsVJvn0Ptal4fkl708cc1yj7+FBb79ZV/mV0XB/BOaJZDeZDSYGcIckEyrSRBDEXrEfNCYmYDoLwtB29ArDqWVBy0TydUDs/eGMeJVcmswZjHQGUyAZNCIjR2nnjox9VaP6+1l5OZHCdX9+vVfvjdhbvlo9e3n831xO+8nL5QWisZuA9vKw7rlyHiQ5IROs1p194aALcduO3AbTdst92yEqdDv93btU/uw/SNf7jYvFopoD/cfp7MpreV2jk4Z142G59Qh4XW6ZxylVRe75ByBGHhAsWcIz0SXYH2pyxg1KTlcGdgK0yL6Jm6OTWbaxSVVUxgJh0hLDEjiTjjSoqIEg8fydHp7+SwWoa4a+i/MZPbH35Pkmdeog59AoU2CjLDnSvIbY4SaM2gNYPWPHSt+YSK1bb8obrYetPgtOVs6NsqhBR2xBgVlUKVc41FjYhSNAaiRpPSiXuT+fVNJ9t4ZZYHMhoXitMGOqVd1qEsOffRWBYpSmhHlMggRTIbk5qrTSWbRgF70R/sdZM647NZa2HnoR+i5g5KId4UcKaM48AMyJkSkyTxRgkhgw0+nRfivHUsmUFKJwMITk43WVSPzR5ofp7JompOrnwWFfPSOOYVpVbjKDGWMXpJqFHOB8B2a2zXd6o/kDZRroFwMp0e+jqf2LrjTCULnIXgLARn4bCdheqEMeAHcjZfzcw/l2zgjbkbnD9Q5PyBPGmskSKvpEZKKq4YIYlYUnrqEB7N/J4euzg3KudshKPCZH13hMsONOGcyYCcE5RoxzEJiGudYC+SThvIWBzguMfC79qRHAc26uX9fDG92VyWq9h2QzSofIHKl2HD/NKVL1C7CLWLw/O6dVS7CC1qoEXNIFDeZYsaqPrqDe9Q9TX4qi/Ez/RPH7aDwQcNPmjwQQ/bB13JgY580Ml6Wp38sPg09fMXU58Erw+Dc0dn20hbEzFTgTGc/lOdQ0k1VTbgaGIQUYxFBeivM5PcbwvbBaQKUwEuQkNwUoOTeuC4v7yTGtx34L4bq/uuEHdGfyUH4M4YvDtjY7J15M44oDyBZwM8G+DZGLZnA5MGrGDF41Zd56vH64e/mPni7VLG3NxMFunHPX5mzQLYn+6WH3n/ZZ6o9ghUwBSAKTx5psBrodUE/t+UfBQr6ROTiNoxluBmtA4MVRQkVlsZN2yCnMwmKoZQEanSISp9YnFzvbpcvQ4sAlgEsIgRsIgm42yasQhgD8AegD2MjD2QBn3BmrGHd/MFcAjgEMAhRsYhTu0c+JhhvDDzkF55v7i3Nr1p9xK4BnAN4Brj4RryQlwjPdzUuUxnwDuAdwDvGB3vuJTGkR7+5XayAK4BXAO4xui4xonNih5zjZfTm7vpPDEI4/6R3jzfsA/gG8A3gG+MjW/wE4vIHvONVRJZ+khSMuIk+LfXxoX6Z4GHAA8BHjIaHoIb6B7bUZQfPqffsslPfRFixUPSxeT26u1s6sJ8DpwBOANwhjFwhgZ+0Mec4YG4z+PyR1VXiTksVYnq48AdgDsAdxgBd2iZ5r3HHVaaw7IUJnGH9P6KtMAcgDkAcxgDc2iZuVnLHB50hzV3AN0B2AOwB2AP++wBTAtgD8AeRsQe2laQ7rGH325XFfb7PYXXE4+ATQCbADYxBjaBzmQTP4XF29n078EtPmxI9GoyAz0CGAQwiFEwCH0+g9hwhrdm8enFl3chPZ58rj5cPQGcAjgFcIoRcIozgxlLTlHFMd6F+fR+5pa1pcAcgDkAcxgBcyAnZUhtMYeq8d9DKuXqTS9Xvxh4BPAI4BEj4BH0vJrRFctY8YjKf/kpuH+8nm+37De3L0LFR4BjAMcAjjECjnFmpehOGvYy1bLiDskEqZ3zAVwDuAZwjRFwDXpin+06rvHb7XPvt9jFhykwDGAYwDDGxDB0gwrRbd/F6s/DEBdgA8AGgA08fTZw0nyOvet9pkD/NFvT/vsHqv3VzCYmrTjfZg4cmAMwh6fNHJg6SK+tYzAo0iFpCTJBS4SYio4gRLzkIhJpnEt4W5KO9sBXD4822SIdwn97eMtACMiRFlIH7KXiLOqKlkFRaw1F2gqPlgRklydgtfxxAuZY8DclI0YOU0Y8cdSl42wkj1QZJ51ARkeCNobtqe6w48PnQV6BvAJ5BfIK5BXIq87kFelsNsmB8UV1tKreNrm9AmEFwgqEFQgrEFbnE7AR9g4z4G/r+zPaGZuQqKRWiHAvmJIxBiWpcpypjahiDUXV4WG8+6WUf5ldg5gCMQViCsQUiCkQU92Iqaah6uNiaj2u/iqAnAI5BXIK5BTIKZBTncmpplXlB+TUq5n5546gehNu7x9LKcT/VtHk5f18Mb3ZfHgnTsVAVoGsAllVqKwSzWTVES7yTUkpDUeYUWKRoZyZwHT0GFlJjXWOkbBJDSDdMdyNA2urQB94LvBc4LnAc4HnbvHc5h1ad/Kv3k2ni9XDTLYwcFngssBlgcsCl23cWeaAZluR9aewWDeTmQOrBVYLrBZYLbDaGidCg/qCfHTxNsyWfUCvwosKS26WPgosF1gusFxgucByL8JyGyZ0AMsFlgssF1gusFyK+kn1Bo4LHBc4LnBc4Li48YyRA4GyXJ8CYLPAZoHNApsFNtt4JOQBxbZqjrwqr5+vo2XAbYHbArcFbgvctsaNcGYp3tvZ5PaRevt8/stkDmwX2C6wXWC7wHZPZLt1PRAzdQ/LhohvzB2wXWC7wHaB7QLb7Y7tntR6FtgusF1gu8B2ge2yE0dZHU5dWCm7YfFp6ucvpj7xYQ/lZ8CBgQMDBwYOfIEE3d0fDxW/wHKB5QLLBZaby2M4keUuf83H595X3yH9utn05pcQ66JpbJtIy48BowVGC4wWGG3FaGtPZTse8k0JyT3FwmCraWAmsViLEVdM2oAC8unRJiv3xJb3Kzb74+T394vZ+8l/16mywF+BvwJ/Bf5aNn89S419nchT75oF5grMFZgrMNeymeuJXcFWzPXtLFy9qb4JsFdgr8Begb0Ce91lr+e5YBN7vTOz8H56P3PhQBdxYLPAZoHNApstms2ep8X+5/00kSgsDLBXYK/AXoG9Anvd02JP7PS1Yq/vws30c6W+hhcz849Q18YWuCxwWeCywGWL5rKb338al32/mH34chc+TOt7KAKHBQ4LHBY4bNkc9sRpuisO+yGR+MO0qvN6cT114IsFJgtMFpgsMNl9JivPZ7I/JwBNbq+AxQKLBRYLLBZY7B6Lbd0ycWuK2Pbjn8P1XZjVsFnyN/v1XcBggcECgwUGm36oaMRgD3CPb0pCapwNQUjhBJHUBImY5oQjLrmignY1Jbf56EZgscBigcUOhnTAYvtisW2n2KzTX6fOLKazj68ms+DSg/SRnRfWHJb86W75qe/n2y8CewX2Oib2ephHPOB/UITTRlFjkRcoBi8dlV4T5ZylyGMrTOiNudLjhDvAOL7tQcVeJ+BFq2mU0SmHfYyS6IiIkVzGtnlatZy1ouTrRaW9TmfAWoG1AmsF1gqsdcNa1Tms9V1w97P55HMA7RVYLLBYYLHAYh+zWHwWi30/ub26DhU9gbECYwXGCowVGGvbjKx6xrp9td93G/gq8FXgq8BXS+SrqiVbfTub/j0Z/6urff65jx/zjALjBMYJjHNojHM5TappV6f1yV/9jERNP1nNMpne3Exv95/90VzPw8PlPoMIy2l/e58BRQv4BfCLQfOLfhLf8XHCHWEg35SOOJFNsoC5phppx4w2EgtikRZMYGzWfLf6Hhfgu2nFquyo2gQzuZ0DCwYWDCwYWDCw4BoWzJqWHrViwUvzP/jXt8B7gfcC7wXeC7y3jve2DJC34r2/ThfAfoH9AvsF9gvst579tsyub8Z+P8zuwekLbBfYLrBdYLt1bLdtuehjtrt+9NNsen8HHBY4LHBY4LDAYb9yWNEgkekXc3t1b67Cz+bWX1fJTJ/uDjLcazOvgmjzhdn85K8vvp6/nU0+J2qCzgscGTgycGTgyHUcuYHO2yVHniYKLoIHngw8GXgy8GTgyXU8ucF4lg558r29njhgyMCQgSEDQwaGXMeQG6RDdMWQ/zqZT+zkOpEMWDKwZGDJwJKBJdex5AYpEi1Y8puw+DT14EIGVjwcjgKsGFjxk2DFDWrlOmHF4DsGZgzMGJgxMONM4XK38byDzBicxsCJgRMDJwZOfIgTywate87mxL/dXn/5cTa9eXk/myVSbDzLwJWBKwNXBq4MXPmRs6IPrgwxPODFwIuBFwMv7tNx/HY2vQuzRzSBKB4wY2DGwIyBGeeZMeuNGUMcD9gxsGNgx8COe/NTZNgxRPKAFwMvBl4MvPhgJI/2woshlgd8eRD0Ar4MfPkp8GXRD1+GaB5wY+DGwI2BG2e5MWnAjRt1zzw4+Re4LHBZ4LLAZUvmsk0mrGd03h+WFFh1oFg9fjm9vg7usFIL/BX4K/BX4K9NCLfPMb4p4SJyhBApnIwWESwdQ9Rayl3kBgu5mbCMumaowEaBjQIbBTZaFhvF5/Xj2bDRdVM04KTASYGTAictkZOSC3BSMPKBpwJPBZ5aKk/FDWbJH+epr77cmpuJW9X8gooK7BTYKbDTItnpef3Q1+x0m4+CggocFTgqcNRSOSrqnKMCHwU+CnwU+GhZfLSbMNSmEgA4KXBS4KTASUvkpN2EoXY5KVj5wFOBpwJPLZWnogZNXbZLpNZM9N10CnF8YKDAQIGBls1AdYPB6DX8c/XnSFkpsE5gncA6gXWOlHU21z0TAePk6n5mNlX5X6/WnBP/yW0/+whH5hkFBgoM9GkzUE4P0usY/r8p/SQPiipFZRBOS6wZod5JS6jykRkjNu490pAdPBD0rbkKFXHezqYuzOfT2ccXZh4ePQs8AngE8IhR8IgmaX67BP2QftvHH+9vly6qj69m/39719rcNs6r/1GbOPc9n3Jp2sxJtt44u+dLZjqKRCc6tS2PJOdtdsb//SV1cSRZokACUlIF+2FrKTYAQtRDEAAB5z/ya6u5HGKihRuxWDE+MD4wPgwCH0bQLQUAH0SWtqZUxxDBEMEQMQyIAGQR6CBC/l3I4SfbjDOlADeUP40YIRghGCEGgRC7J1iEiKs2xN/hjAGCAYIBYhgAATi7rQOI68DxxrPVo7+IztOBMjgwODA4DAIcRoCulTpwGIf+do2c0+jajxglGCUYJQaCEmgvRFyKYyhvBG8yGCEYIYaCELvG6RBlhFC6lCiRbTDYP8nIwMjwsZEhGc39qecpGeTowmB+Laa8q2BkYGQYBjLsWDomU2S49H9N4nDi/ysYEhgSGBIGAQk4Y2EciqUTikmwCl3BiVCMDIwMg0GGHctARYoMf60CqRkRO4wIjAiMCINAhF3L7OkUEW7FPHhWRoI4C52fgj2ODAwMDMMABkhHymZgmMTh3ctS3AUcoGRQYFAYCihACts2g8Kd1OxdcB544mwWuOxXYFxgXBgGLkAaB7Thwjc5bn/xyKjAqMCoMAxUQHkbx6F4vFGSMCIwIjAiDAMRUJHJK6kVuXlgPGA8YDwYBB6M9qCldJOjk8nn7GNe8i2rCfctns/Sy/TvDBIMEgwSgwAJcG2GVpBggGCAYIAYGkAcAoIS6T+qiJOqDVt9qZw/dvklN3jJldIB4eGi0i8dV/7/hXVPoHv4SeLzUhX1L79csUw+XS2enZnvlf48dkJnLuRwN1/7UQ+pzh8jfmK8JHa2JBoFlM4d90ncXweuM0s/vk7y7w//L9z4zyC+DFYLj2c1z+o3ntUn2MZr1eZBPId5Dvc9h5GFEhvroPFc5rnc81w+hh6dLZvRpSuevTx738pGhgZPbGrW8oTmCd23aWGcRLjRX2Ua/1/oLJci5KnMU/mtsNnYTG6Zy9FW022e1jyt+0Zo4+Mfuf7yG9k1T2Gewm+EzHt2mz7L2Mn+p2Xi7Ji8RFKDnF3AE36A2QW1Uwsy/d9UfXu7x0eee3gwPXH39+V0c05OxP6O0uDo4eThaJpnHyFruzc6PBkaGBoYGn5naNiza2ZvaUrsfQqzx8JYwVgxPKzYP27Ul2bqv6nqdo4eRjuOODna2dk/nrqjnZ2Rd3RwOB0dOa4r55vpqSdo3J+hgKGAoeBdqQ4KBdR+YUYERgRGhN8YEcy7QhlHihgcGBwYHN6V6qDmgnF1Vn3AjZGAkYCR4F2pDogE2DCENtmPYYFhgWHhXakOunuA+hNIQhCjT8vEQ8kowSgxQJQ4bNRX48R/U8WdOMd7zsOOd7gzFd6Ru3fknYyOXfdhb8fbfTh0RL6JgHoYoOEHhgGGAYaBd6M4IAzsHfZpKnBdJYaKwUPFsOsqWfgcYMFKxgbGBsaG3xsbRsZtp43DlgwTDBMME783TOxANx3AACZjAmMCY8LvjQm7fZ3A5FKjOHBYpwIKZaapJxSKWaLrKFHlQaIA+WqnM3PuLIuaPkj+LAVJvnt0qK729ypKP71Smo6Cmbg/9Tx5M+kLKC3B+dxZeNl5cDVjMiFefizkQ06cdKakIiWw1PXGxswpjaRelk/L85kTRalB+mqISh2kb2MTq6y8rbiVr+GNuMueN0B+BFH7kewfbDPdFOiN7jdK29zTPgFzYohnUH1dy8xuExTMNQUS35ai/RjUabEqx3EYPPsScrLqyDqBQT9HSFczIXPym/iPVj4YAcTs1Sgguv8ukblwQztzzQghJD7cZnQXOn4c3U+enFB42Tt9HTz6bvIHrdgW1OxlV1+oLJAZui6XOin1v0MgQHX0Od1s1Ar1ffVtZ5bdKRLQ4ACKLmJubBsgZb5nTgRZSMzoIORteq45n3zVgshsTAsxb6ove85LvuCPoYiiMycsfgYgsTVJxChGAJaT+GXm/yu8wj3tMKxpImZRdZEo1PDOfqA+X0nLeRwEMyMLsI2UvdSHx82sTCqP64ZDx4P0XamTIfmYsk9uGL4rMJKIURw1s9wslEs1mYWX+6LV5q59LDjChHZ7W1FaI7u9nRj5s2hmttnGnzmPFs8CSth+RMe1jgOcp0I30G74IbCwHnZL8vzjzFZy9yoXk2cR3p+Gj8+lO1oYpCCPGB1gWpXZ554f+AipWCBGub3yt4hwK6bwARJQJ1+rNdxLV6CtLh0P+3EeQbUsd4KLaBqE81yMuyChWrivGystH8R4t/cMUDleb4CeLjUn0j1vqGylx0fJ8ZvcGM3kv9leSf7mSxgGYZTdN9zzGtAl3cVsZR2r7er2j412MUCaiLlYu0iVeaZmYfL//xUvmw8bTyJsKtIyQoy41ozXCnIhps5qFm/Jox0vJRvEaE+MxahEq81G3QU7auugURxHfrFyTMDcOjCjjkCg2pUbwL3VO4ulTG2zAjhniVcAjxcZC8Qoa7etcBFaHyARA8I4Y7sANyJ+CszijHCifSBIwVE3kTNE9XEXs6XN/sKMOmJsELDe/ETaVN+XIvdHzIKF2Fxqh0jHpONVsF6Iqzhx33/JEgdAY+6EXcc2Xr04m090Nh6cEWLEEABsESQq0tSMmZoVwp8HQZN6USb+4jFfBCbCCd0n0ETviiPCvwxY3g1MPCtyCESu9ZCW2am9rVrbXs+0wiYqnna3u2XT8djT7NbmruMZfQ2DlTbXAEuZOlLWen7aPFIGIIlAfN2LmuYjyg2m52fRlPk8WFTvXjozlV6QXWoxn54ZAvV1MwcojD8Td2rvLbfgTlrcv10J3fJF6EM3+WByqRBuLLyrBUwR3TBEaKDW62sj0J9BDFVCZzwRmFDrGzaS6S5cASGBnBcC0XUm6bYs2af2JQpDljpKC2J797KUFuZqbh6lNSSPeFa6rWIje9gqjCWNyMDVrQ3jMFDJMemVNg3XgAp1ZCrjMglWoSsSZArCJPhSumMemYLS7eh9KfO98EOhvJm+iMDDIiGPGJ1unSmzV9ZF6k4JQvjwSOhTx8Jr+d8KdxVG/rOweYy0fDryr5blSD0GSuvwp0lAHTE2nWFY4V68ggWf8MR7wZjSFdCnRkKePEKctHhKPmcfr51Irj+PSWq3H0u1bt+xiBDbsSGfpVtiKIbqTKBI16vXS4tZakKcPJqoY64+fovns/Qy/btFNNGcBfm72CYCeIQU5BGjq7ei2tjfRjF4gEQcyL2KKdsvz1LeHPvOxFQJJC/kaiUtYFdEkYVXEUyZfF0vct6cUD6dJqeF1ZVknoe+LNZ1I+odIWaFe6rX81A4seQuv68sDGvEhBHvCEtqmW8Um3HXPzYK8m8yOtCkpCDfkdVSYf99kUwacVFfv8jaajFlQ55D0yDGVxFn/oL8GHQkNzP6p0nDgDpLWCNAznnsxE9nL7dJgYNn9WN1wzxL2J5TP8iaSKJwT+WiJ5uApGAFDbI2EKfO5W9irhotp2SUUpMvnaelNcxz+W14IOLv9U7HVIbvi9lLFvf/JdyV+lEiljYCb0cQMQKdPZj+k/C48KOlKkzSckDfghpC9voYf5EbLO3BiA5CXp0dt+k0DnEZmFKi9he/ruyqjJEbyi9Exc/tuYA4utQraRtf1ZHly+LZD4PFvA2WaBh0NsKaAkm5p/OlUCXJfoRQBtR5QwYloIzzhkxoU9u0Ot75315vAXLCSdlQ52maiYHI07Rm1P3zzfYPm0Nphgc1SNlQ+3kaxTDYlGEpU+eQQzlD4wF0TBBPD4aDleNMRnW7gBQ7e98224HmOxTvmxmbzvAUIAY0B5yWEbW3fMM2d2Fn/t2gHGzZ3DX3lptz6AxxtiX46sdPqwd1P4IPk45JZ2/rthBbdyjeVjM2iJwhvRGdf9AmDEFJIHasemXlH9q3e4aEOlu3NoibZbJAioZZUkTMDf3rmPsj22IrRmQ68xCkzUyT/DtVkU8Vtl3El2EwvxZTvb2AotvZ7rLI93wVxcE8vYClsaBpU8coW3lDjVYC6tR+2Frul/6vSRxO/H/1LkE7gtR+2FqGV/K9DTy9+BbUELLr92NFbuNQPN4oz69Weit6vSCY5Ld0wjxpriUEg6Pby/P4axXEYi5ih+h5FOhRZ/TX8rsV8+BZKUychc5PfcQaRZb6xFktW4kjKsv+Lvg71FbQtCaJGEVt1LSWpTrjdBecS1BJ6ohrB4KgihgLfK1KuX4Tjucv9GUNrWlSZ4dXeOZt5LNVN7uEWSsk9Dvb3+v4Q60WIg4dW2W5BBeh85/c7ZecHb8RixXaKmuh3lkkqpl77tJszXGgYdCx5ZALoDZaX0WcpR3olyoU3Z4Q5WtW61s5SAqhTDJEaaTf2/ji0uug5GhZmGnoU+f8tfPP34e24VGQR7xtkE1Zzl4l/GwyIVqTidCkqXOlGliPQ3+xVRXhNLr2I4tcKRseiF0JAKxvHH/x5ZfUaNSWAGNOrFsLXjEzyBKxJmk/ilFVZek/7VUOW36I8HNWrZMiYUhjHdDvEc+9CnfXzuJxpQ60ZJVWK9ewc8r2RAl31C1MgeYziizhXrTKdvy0zE96qML+QQQJUWCoIsZSPVKl4ZoSKBTFNaqzb0YYEcerrjXtjCt1DOUX0j9Akpk64EaY8wKQ5pWYUc6LIWVC+8SIM3AfTsaDMBsfIEOwiGInN5aMsvHNiRNG1k2ZA/NCKNkQeo3axbh4kdR9N62fCniYRBwId0LtEkAHhyZNmOtixtoyu86eSa+YWhTCrteFNQ8E8hjYVJkM8k5248/AE0l3BmVt+S2dEag5IcZc3ZWYSLL51G6v0vLpdd0ch4FkGr90sm5Wife6bpaZd7ZuNrOxH+3uTtvOtCDHVkEtRTZfzat/vIrGof+cdIUE1JbrVw6Mvtp2vxg5g1iyUn3pQBrrVxKMzgxAy1TS1cPMd4EK61EMjLYMFjUjMf/xI//BnyUsQfrqVZC31BhAwJvA86e+fnHuWRB7jZ0Y7GWqIqXmIg7t++GP0I+BFQ2XzwTd+5IAoSPE8tMoIRzNe2GPwSQDTyxMPlUIQKU6n6/CUCojR1gIkPctC2JWkYtquOr1JMDbYFO+g0Cid08SYN6+aso9kYhmBnpvQrzN+6aR0QDH+xEAM5cMfIdQCRFY3r80iNnVgbCmeN6XCISZyRoRoX5Ce5qIXB+QC+dpCWh5a0yKMM9Hz2qS1szSJ3LakrQfxTFoR7VV8DM5ufy0nMSrhwcRVi7b64p2yRWBOqC53yaV/JhnMgYhWCPd837rOSI//r3w457nSD1XhC5ANuyWVHkK0Nhxf6pz8Ll4cG10yrdzi3lLsJSY/Il8OlNfeOOZ44r6u+3K6VEIxMwxeMPTgoRZ+Ob74vxJuD+voiJtZ3EmVGaxUQdCIo79IEmpBHNSqFhxl+udcb5Ql1wRugAt9jVSfV+cel6BrjrnBlJDNwwRGoAYa5ss581r2Xyn3bztjGXXUQiNTOOM+l1w420u8r8aZJn3LEjHUQhTOdVF4UvoKASaf8f5QppzbwnlG0fb8IyOByLjArJFbz5vlIqQuF6js8B7OW8pk9AJO9vR1x2ROb3KT8EFYaSONyRnn6PSsY1dNbjj2sIi58Fi6j+ush7EX365Ypl6xRbPzsz3Sn+WK4OUU66Om69pUbcTfgjVbVXpKavuVjjeXOQlb1h/21Ov9mhfmiqfm4vy81Us5uMgmLHiNhOv9iRXqjjVqGlW+Pj9QdXMT25sFFh/NG/r969jSon8GcSXwWrhgZRGxwOjqNrmQSnnyZMTqjDGfBmKKBJe7vJQR5vL6vrw863+5GNZoNIVq65lBjarbsP/zHlkNeZqrC9iVk5QvQ4eH9XhqqY294kmh9CLvbGcTBPP4eqhs1bk/Nol6q2tLWGj3u0+56xhpWGzPs6sszVVP01W5Zq2gScrdE3XK5SVuSZtTcr6XBO3SEutyAFWRyJoQMWzbU3ZFIrV2bwF1qlzuwMVa3JN3/OKlbqmblPEKl1b9OuwctOaVbvTEkPkcHz0R23c9ITfkNoIbL3aajqvsP7W5l1fWGnN0dfKzqS+uH4afR1wwVza6uJD1hS/SHS12hmX1oSF1FmbFtpsLNvO2mx2ixsj+X7idOQmv9zk902b/PLrTNg/gAGyOcWurNGtTgWsOuh+rKFVAitwDenSwGpao1sAsA5r02FNWw+wGtckNf9Zj7V2DLbPwMfW6GDSikn6MvArVhtsxzWCYKXWJsZZ95tgfa5peluwImuzQDDtNFil6076WbBeLdf47R4SrErLNV7XtIKVWnvEz6AuI2uwtr5Ae0VIVlytRxVelJIVuO62JhUrGOy4ARYnYo2uuyuDxMpd56ncn2PhPn3e/7RMDipNXqJYzD+HSZGgT3PvUyxVqgZ1oAYlB5AMcE9d1J9X2D4Gd+1Esco8UQex/VjlH27d0VamomSDSIWgO5LamAhBxQIxSppzomapjYbkEaMjO7gJ7odqyQGRBMI1rze64JrXXPOaa16b6YNrXoODiu3H1jM/yJmYKhnlhdyPjsPAFZG+VQKSMmKFrC/gVHsUPykgnV5J5gk5X2jHRUEdMTadIVnhnur1XJrByoUgv5+fNQJ35zUn3pHVVst8o9iMu/6xUZB/k9GBJiUFefvRabc3W8UvkkkjLHLISdkgnmVtPmmTGHIDn9Wayo/8RRd+qH+aNAwQz7O+NlmzADnnsRM/nb3cCvnZf1Y/Vje0j5SYUz/ImkiicO9WRMEqdEV+WooCWRuII0ZGWJrGrCStDQ+EFcz9O7h/R1EXH75/x359adfMfZP8A8oTNKODiT1wzTyumfd+lck187hmni1pTIhLZVukIa69T2HGUl5n1v4/Tuir4txRMdQ1Koa6Et20xc0r17AEcnuihPYs9mSBbfccEA8+QvFeEGcgRyiyklbNeKAWG2lPF9Fgv4AGSdz7I0eCh1LkhqqMRuPwSOjzbuCdwB+XCuFSIa8rIZcKGcDrzHWUKBMJ949qrKqdgx/KiDpfRXEwz5VZ2mnt7haMq90EGwnr9IEj0GbUqaNfAO7VynJm0S9jBh97l9BaaL+sRhXfVpnGqbNCn9eBotubtdtYgo/I2m2gz9b8x9yLYZrGNb5p1jQR4xigB5W2pppZBNyGR8eeUeDRnffcV/xjeIA/dv90wxWrbKCDjDIa+pj9G5fz5p0+bKZwOe83dJxwOW92Q7GPnn307KPnldv0deZu8lzWnOt0DEijnG/1sSIpXL+l67DrQV3Ydb8Ydk06vjWmt+7uJOskJC6Vto479bwr1Wo2vgyD+bWY6m0mFF3E2Q2Iuzzle+n/msThxP9Xf4jDjiBiBHDNXc2XsxbnpA01hOwQcyXlNg7F440Tu9pzjnb0Oo7+bvgtnVBMQAcZcXR7eR5/rYJYSIByiJ5HgR7ieUAceCm/WzEPnpXCxFno/NSf+0aRpV7Xa9lW23SaresAkohRQPxWKcs7uQ1Wh/I8cTYLXP0bgqBKHX/WcP0mkkOX5vFnCE3Mftl+ag2/A2zWVnjbWhr9eHj1TBftpL2tY0B6AC84uIufX2tkWi4MLXQ5Laj5hUA+MN5lcMSHvubmYY5Co0/LZO/9OatVEbiqs1kpP7YAQQfNEJ1t4SdFMvcXfihUX3lfRKU/WNTCMSNPDUi17FV25FWsploQwodHQh+Rk6JzaJf53wp3FUaqPIvFY6Tlg3iecDkm0viZCaV1+NMkoI4Ym86ZVuFevIKl1+CJYyBqdLIFUdsFgUtuJPV5r/5IetYKIC2zlF7phm5CBbGomQnLS1fqbtzfmhepzOmuQvL2fPX1Ris60eNR/dHEVPUVSveqdnOwqN69dGaR2FxqoZCeGSKiq5t0QGEkhqkdo4ovO2mGb7sSuuWL0IcO5mByJcAnvKsFTBHdMERoQGeRGAn0ZxBDldAZT4RlVF8exkSmu3AFhARyXtS+zUZZsk9fw2ClTTRHkbUfze4OqLVNgxiK7HnWY7H6x6toHPrPcs6BnnC/cmD0VX1OlHIGcqWWLylQY/1KgtGZQQMqU0lXDzPfBSqsRzEw2qqCPZWY//iR/+DPEpYgffUqiL3GTgx6mFZFSRMVcNjVD3+EfgwSfeDymWBVXxIgdIQA00YJ4djUC3sMJlX3ZGj5vi9mLypx5HwVhlIZOV5AYKlvWRCzilxUQwzvSYC3waa88ycSvXuSAPP2gVprmItoZm72JsTbvG8aGQ1wvB8BMHPJoK82VEIElvcvDWJ2dSCsKZ73JQLCP1KbeNnmyIBlQ2NJI6IPnTk+OVCx7tiryhpuChGmMjeX90pzzD5I+YmtQ55GMhgdHzWkTBjyBnDOnDbtwyIgjgg/YJnDJiYpG8RzNHAxZWJcvEjqvpvu4gAPk4gDYowGtk0mQZG15VFneyaEJpKZEEYmkinpXrEmN0k7wZoq8V6xpsy8M6xpZkOdXP/7FXfb1+WRZDzTf2BdgWzIYXJ4+XguH8+tmRd4M5X3Q2sq05hVuaa3xVmpte23rE1+1ueaenvBKl3T7GNYkZZr0fbWiVVpuRbp9mqsVC7rleuhdBJw95NbVHjNaZvdUlPC5GK/Nsm3/GBLV9oNqTkxQgdk+URp3pNKvkquiKIgvD9zIrF118gBacmB+uybpqbYBfcxeR3eW/cxGfbR+GGXeuBODMHv3Ylh4N1chtZdiKvHvbfqcVzBjCuYcQUzrmD2e1Uw+/0rR/7OVTs/clfzVhHAI6Qgj3CtWbmE2CvJDaW4LYXBTOGGUqTq5PKC3ALJkDJhXrARZ26BZEOR1xpu/fN+NErkXWZtcsnx9slGt6nm+dZs3hjv31mZtUmMGFuIVZrk9Khffr79cnpx86WpWG7yeVTdRKb/pAWndUNu+aG9rbVXdYAUCV86qja09lAV7PeI6dqqMp6C6dHsnTytbDuNbM86cYyVy9tr3l7z9npYrzNbQPT9TXZruiw1tA9g/fMKxSsUr1C8QjXA6TqVMj0d8uPJiZ7yrdbowTk4ODw48Padk4NDd3o8mk6P9o+8XVf+J3ZGyffkT311VmXhzH64jvvkLx5/RC9RLOY/nuU8S7j4f4z+Z/1foEQXMg== \ No newline at end of file diff --git a/docs/tech/1.configuration/readme.md b/docs/tech/1.configuration/readme.md index ec73123e..4df519d0 100644 --- a/docs/tech/1.configuration/readme.md +++ b/docs/tech/1.configuration/readme.md @@ -24,7 +24,6 @@ Let's look at an example of a real configuration in more detail: class: \BumbleDocGen\LanguageHandler\Php\PhpHandler settings: file_source_base_url: 'https://github.com/bumble-tech/bumble-doc-gen/blob/master' - async_source_loading_enabled: true source_locators: - class: \BumbleDocGen\Core\Parser\SourceLocator\RecursiveDirectoriesSourceLocator arguments: @@ -224,4 +223,4 @@ The inheritance algorithm is as follows: scalar types can be overwritten by each

      -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
      Last modified date: Sat Oct 28 11:03:31 2023 +0300
      Page content update date: Mon Nov 13 2023
      Made with Bumble Documentation Generator
      \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
      Last modified date: Sat Oct 28 11:03:31 2023 +0300
      Page content update date: Tue Nov 14 2023
      Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/2.parser/entity.md b/docs/tech/2.parser/entity.md index 03791d0d..1c61c288 100644 --- a/docs/tech/2.parser/entity.md +++ b/docs/tech/2.parser/entity.md @@ -123,4 +123,4 @@ These classes are a convenient wrapper for accessing data in templates:

      -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
      Last modified date: Sat Oct 28 11:03:31 2023 +0300
      Page content update date: Mon Nov 13 2023
      Made with Bumble Documentation Generator
      \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
      Last modified date: Sat Oct 28 11:03:31 2023 +0300
      Page content update date: Tue Nov 14 2023
      Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/2.parser/entityFilterCondition.md b/docs/tech/2.parser/entityFilterCondition.md index d1f3e5d3..5565d404 100644 --- a/docs/tech/2.parser/entityFilterCondition.md +++ b/docs/tech/2.parser/entityFilterCondition.md @@ -78,4 +78,4 @@ Filter condition for working with entities PHP language handler:

      -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
      Last modified date: Sat Oct 28 11:03:31 2023 +0300
      Page content update date: Mon Nov 13 2023
      Made with Bumble Documentation Generator
      \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
      Last modified date: Sat Oct 28 11:03:31 2023 +0300
      Page content update date: Tue Nov 14 2023
      Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/2.parser/readme.md b/docs/tech/2.parser/readme.md index 590af902..3aa8da07 100644 --- a/docs/tech/2.parser/readme.md +++ b/docs/tech/2.parser/readme.md @@ -41,4 +41,4 @@ In this section, we show how the parser works and what components it consists of

      -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
      Last modified date: Sat Oct 28 11:03:31 2023 +0300
      Page content update date: Mon Nov 13 2023
      Made with Bumble Documentation Generator
      \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
      Last modified date: Sat Oct 28 11:03:31 2023 +0300
      Page content update date: Tue Nov 14 2023
      Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/2.parser/sourceLocator.md b/docs/tech/2.parser/sourceLocator.md index f8db26f0..1119fc1c 100644 --- a/docs/tech/2.parser/sourceLocator.md +++ b/docs/tech/2.parser/sourceLocator.md @@ -25,4 +25,4 @@ You can create your own source locators or use any existing ones. All source loc

      -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
      Last modified date: Tue Nov 14 00:49:39 2023 +0300
      Page content update date: Mon Nov 13 2023
      Made with Bumble Documentation Generator
      \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
      Last modified date: Tue Nov 14 00:49:39 2023 +0300
      Page content update date: Tue Nov 14 2023
      Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/3.renderer/01_templates.md b/docs/tech/3.renderer/01_templates.md index 09e17358..6445dffc 100644 --- a/docs/tech/3.renderer/01_templates.md +++ b/docs/tech/3.renderer/01_templates.md @@ -101,4 +101,4 @@ Result after starting the documentation generation process:

      -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
      Last modified date: Fri Oct 13 18:40:45 2023 +0300
      Page content update date: Mon Nov 13 2023
      Made with Bumble Documentation Generator
      \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
      Last modified date: Fri Oct 13 18:40:45 2023 +0300
      Page content update date: Tue Nov 14 2023
      Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/3.renderer/02_breadcrumbs.md b/docs/tech/3.renderer/02_breadcrumbs.md index d25f0b72..2160a142 100644 --- a/docs/tech/3.renderer/02_breadcrumbs.md +++ b/docs/tech/3.renderer/02_breadcrumbs.md @@ -51,4 +51,4 @@ Here is an example of the result of the `generatePageBreadcrumbs` function:

      -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
      Last modified date: Sat Oct 28 11:03:31 2023 +0300
      Page content update date: Mon Nov 13 2023
      Made with Bumble Documentation Generator
      \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
      Last modified date: Sat Oct 28 11:03:31 2023 +0300
      Page content update date: Tue Nov 14 2023
      Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/3.renderer/03_documentStructure.md b/docs/tech/3.renderer/03_documentStructure.md index c27f328a..b4761e7c 100644 --- a/docs/tech/3.renderer/03_documentStructure.md +++ b/docs/tech/3.renderer/03_documentStructure.md @@ -19,4 +19,4 @@ plugins:

      -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
      Last modified date: Fri Oct 13 18:40:45 2023 +0300
      Page content update date: Mon Nov 13 2023
      Made with Bumble Documentation Generator
      \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
      Last modified date: Fri Oct 13 18:40:45 2023 +0300
      Page content update date: Tue Nov 14 2023
      Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/3.renderer/04_twigCustomFilters.md b/docs/tech/3.renderer/04_twigCustomFilters.md index 200c98d0..73e5db73 100644 --- a/docs/tech/3.renderer/04_twigCustomFilters.md +++ b/docs/tech/3.renderer/04_twigCustomFilters.md @@ -274,4 +274,4 @@ Here is a list of filters available by default:

      -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
      Last modified date: Tue Nov 14 00:49:39 2023 +0300
      Page content update date: Mon Nov 13 2023
      Made with Bumble Documentation Generator
      \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
      Last modified date: Tue Nov 14 00:49:39 2023 +0300
      Page content update date: Tue Nov 14 2023
      Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/3.renderer/05_twigCustomFunctions.md b/docs/tech/3.renderer/05_twigCustomFunctions.md index 3c026399..29d78c0f 100644 --- a/docs/tech/3.renderer/05_twigCustomFunctions.md +++ b/docs/tech/3.renderer/05_twigCustomFunctions.md @@ -385,4 +385,4 @@ Here is a list of functions available by default:

      -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
      Last modified date: Sat Oct 28 11:03:31 2023 +0300
      Page content update date: Mon Nov 13 2023
      Made with Bumble Documentation Generator
      \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
      Last modified date: Sat Oct 28 11:03:31 2023 +0300
      Page content update date: Tue Nov 14 2023
      Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/3.renderer/readme.md b/docs/tech/3.renderer/readme.md index eabca055..f7b1617f 100644 --- a/docs/tech/3.renderer/readme.md +++ b/docs/tech/3.renderer/readme.md @@ -60,4 +60,4 @@ This process is presented in the form of a diagram below.

      -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
      Last modified date: Sat Sep 2 21:01:47 2023 +0300
      Page content update date: Mon Nov 13 2023
      Made with Bumble Documentation Generator
      \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
      Last modified date: Sat Sep 2 21:01:47 2023 +0300
      Page content update date: Tue Nov 14 2023
      Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/3.renderer/templatesDynamicBlocks.md b/docs/tech/3.renderer/templatesDynamicBlocks.md index f123586b..304a599c 100644 --- a/docs/tech/3.renderer/templatesDynamicBlocks.md +++ b/docs/tech/3.renderer/templatesDynamicBlocks.md @@ -26,4 +26,4 @@ You can use the built-in functions and filters or add your own, so you can imple

      -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
      Last modified date: Sat Sep 2 21:01:47 2023 +0300
      Page content update date: Mon Nov 13 2023
      Made with Bumble Documentation Generator
      \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
      Last modified date: Sat Sep 2 21:01:47 2023 +0300
      Page content update date: Tue Nov 14 2023
      Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/3.renderer/templatesLinking.md b/docs/tech/3.renderer/templatesLinking.md index d76c856b..4f2ff70e 100644 --- a/docs/tech/3.renderer/templatesLinking.md +++ b/docs/tech/3.renderer/templatesLinking.md @@ -27,4 +27,4 @@ You can also implement your own functions for relinking if necessary.

      -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
      Last modified date: Sat Oct 28 11:03:31 2023 +0300
      Page content update date: Mon Nov 13 2023
      Made with Bumble Documentation Generator
      \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
      Last modified date: Sat Oct 28 11:03:31 2023 +0300
      Page content update date: Tue Nov 14 2023
      Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/3.renderer/templatesVariables.md b/docs/tech/3.renderer/templatesVariables.md index dc1d6885..2009974d 100644 --- a/docs/tech/3.renderer/templatesVariables.md +++ b/docs/tech/3.renderer/templatesVariables.md @@ -11,4 +11,4 @@ There are several variables available in each processed template.

      -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
      Last modified date: Sat Oct 28 11:03:31 2023 +0300
      Page content update date: Mon Nov 13 2023
      Made with Bumble Documentation Generator
      \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
      Last modified date: Sat Oct 28 11:03:31 2023 +0300
      Page content update date: Tue Nov 14 2023
      Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/4.pluginSystem/readme.md b/docs/tech/4.pluginSystem/readme.md index dc0df8eb..f550cfc7 100644 --- a/docs/tech/4.pluginSystem/readme.md +++ b/docs/tech/4.pluginSystem/readme.md @@ -190,4 +190,4 @@ plugins:

      -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
      Last modified date: Mon Nov 13 19:35:15 2023 +0300
      Page content update date: Mon Nov 13 2023
      Made with Bumble Documentation Generator
      \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
      Last modified date: Mon Nov 13 19:35:15 2023 +0300
      Page content update date: Tue Nov 14 2023
      Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/classes/PhpHandlerSettings.md b/docs/tech/classes/PhpHandlerSettings.md index 1ad4c83d..2a10613e 100644 --- a/docs/tech/classes/PhpHandlerSettings.md +++ b/docs/tech/classes/PhpHandlerSettings.md @@ -33,9 +33,6 @@ final class PhpHandlerSettings

      Methods:

        -
      1. - asyncSourceLoadingEnabled -
      2. getClassConstantEntityFilter
      3. @@ -121,34 +118,6 @@ public function __construct(\BumbleDocGen\Core\Configuration\ConfigurationParame - -
        -
        - - - -```php -public function asyncSourceLoadingEnabled(): bool; -``` - - - -Parameters: not specified - -Return value: bool - - -Throws: - -

        @@ -224,7 +193,7 @@ public function getClassEntityFilter(): \BumbleDocGen\Core\Parser\FilterConditio ```php @@ -258,7 +227,7 @@ public function getCustomTwigFilters(): \BumbleDocGen\Core\Renderer\Twig\Filter\ ```php diff --git a/docs/tech/map.md b/docs/tech/map.md index fa60ef5e..f593a2d2 100644 --- a/docs/tech/map.md +++ b/docs/tech/map.md @@ -250,4 +250,4 @@ Directory layout ( only documented files shown ):

        -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
        Last modified date: Sat Sep 2 21:01:47 2023 +0300
        Page content update date: Mon Nov 13 2023
        Made with Bumble Documentation Generator
        \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
        Last modified date: Sat Sep 2 21:01:47 2023 +0300
        Page content update date: Tue Nov 14 2023
        Made with Bumble Documentation Generator
        \ No newline at end of file diff --git a/docs/tech/readme.md b/docs/tech/readme.md index 6920a72e..1c59e254 100644 --- a/docs/tech/readme.md +++ b/docs/tech/readme.md @@ -44,4 +44,4 @@ After that, the process of parsing the project code according to the configurati

        -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
        Last modified date: Thu Oct 5 17:42:06 2023 +0300
        Page content update date: Mon Nov 13 2023
        Made with Bumble Documentation Generator
        \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
        Last modified date: Thu Oct 5 17:42:06 2023 +0300
        Page content update date: Tue Nov 14 2023
        Made with Bumble Documentation Generator \ No newline at end of file diff --git a/src/LanguageHandler/Php/PhpHandlerSettings.php b/src/LanguageHandler/Php/PhpHandlerSettings.php index 51897008..87e53c73 100644 --- a/src/LanguageHandler/Php/PhpHandlerSettings.php +++ b/src/LanguageHandler/Php/PhpHandlerSettings.php @@ -154,22 +154,6 @@ public function getFileSourceBaseUrl(): ?string return $fileSourceBaseUrl; } - /** - * @throws InvalidConfigurationParameterException - */ - public function asyncSourceLoadingEnabled(): bool - { - try { - return $this->localObjectCache->getMethodCachedResult(__METHOD__, ''); - } catch (ObjectNotFoundException) { - } - $asyncSourceLoadingEnabled = $this->parameterBag->validateAndGetBooleanValue( - $this->getSettingsKey('async_source_loading_enabled') - ); - $this->localObjectCache->cacheMethodResult(__METHOD__, '', $asyncSourceLoadingEnabled); - return $asyncSourceLoadingEnabled; - } - /** * @throws DependencyException * @throws InvalidConfigurationParameterException diff --git a/src/LanguageHandler/Php/phpHandlerDefaultSettings.yaml b/src/LanguageHandler/Php/phpHandlerDefaultSettings.yaml index 377187e2..bad68008 100644 --- a/src/LanguageHandler/Php/phpHandlerDefaultSettings.yaml +++ b/src/LanguageHandler/Php/phpHandlerDefaultSettings.yaml @@ -31,7 +31,6 @@ language_handlers: custom_twig_filters: file_source_base_url: null - async_source_loading_enabled: false plugins: - class: \BumbleDocGen\LanguageHandler\Php\Plugin\CorePlugin\BasePhpStubber\BasePhpStubberPlugin - class: \BumbleDocGen\LanguageHandler\Php\Plugin\CorePlugin\BasePhpStubber\PhpDocumentorStubberPlugin From 3bfb4f21e02c55055e911af7b8347b37452b3f57 Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Tue, 14 Nov 2023 18:44:35 +0300 Subject: [PATCH 061/210] Adding class map loader config --- docs/shared_c.cache | 2 +- docs/tech/classes/ComposerHelper.md | 17 ++- .../tech/classes/ConfigurationParameterBag.md | 64 ++++++++- docs/tech/classes/PhpHandlerSettings.md | 128 +++++++++++++++++- .../ConfigurationParameterBag.php | 30 ++++ .../Php/Parser/ComposerHelper.php | 27 +++- .../Php/PhpHandlerSettings.php | 66 +++++++++ .../Php/phpHandlerDefaultSettings.yaml | 5 + 8 files changed, 322 insertions(+), 17 deletions(-) diff --git a/docs/shared_c.cache b/docs/shared_c.cache index e500cfa8..3549bf08 100644 --- a/docs/shared_c.cache +++ b/docs/shared_c.cache @@ -1 +1 @@ -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 \ No newline at end of file +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 \ No newline at end of file diff --git a/docs/tech/classes/ComposerHelper.md b/docs/tech/classes/ComposerHelper.md index 8a019504..c118bcf9 100644 --- a/docs/tech/classes/ComposerHelper.md +++ b/docs/tech/classes/ComposerHelper.md @@ -2,7 +2,7 @@ BumbleDocGen / Technical description of the project / Class map / ComposerHelper

        - ComposerHelper class: + ComposerHelper class:

        @@ -57,11 +57,11 @@ final class ComposerHelper ```php -public function __construct(\BumbleDocGen\Core\Configuration\Configuration $configuration); +public function __construct(\BumbleDocGen\Core\Configuration\Configuration $configuration, \BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings $phpHandlerSettings); ``` @@ -81,6 +81,11 @@ public function __construct(\BumbleDocGen\Core\Configuration\Configuration $conf $configuration \BumbleDocGen\Core\Configuration\Configuration - + + + $phpHandlerSettings + \BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings + - @@ -94,7 +99,7 @@ public function __construct(\BumbleDocGen\Core\Configuration\Configuration $conf ```php @@ -122,7 +127,7 @@ public function getComposerClassLoader(): \Composer\Autoload\ClassLoader; ```php @@ -160,7 +165,7 @@ public function getComposerPackageDataByClassName(string $className): null|array ```php diff --git a/docs/tech/classes/ConfigurationParameterBag.md b/docs/tech/classes/ConfigurationParameterBag.md index 608d358e..b47b5e0e 100644 --- a/docs/tech/classes/ConfigurationParameterBag.md +++ b/docs/tech/classes/ConfigurationParameterBag.md @@ -84,6 +84,9 @@ final class ConfigurationParameterBag
      4. validateAndGetFilePathValue
      5. +
      6. + validateAndGetStringListValue +
      7. validateAndGetStringValue
      8. @@ -610,7 +613,7 @@ public function set(string $name, mixed $value): void; ```php @@ -772,7 +775,7 @@ public function validateAndGetClassValue(string $parameterName, string $classInt ```php @@ -822,7 +825,7 @@ public function validateAndGetDirectoryPathValue(string $parameterName, bool $nu ```php @@ -863,6 +866,61 @@ public function validateAndGetFilePathValue(string $parameterName, array $fileEx Return value: null | string +Throws: + + + +
        +
        + + + +```php +public function validateAndGetStringListValue(string $parameterName, bool $associative = true, bool $nullable = true): array; +``` + + + +Parameters: + + + + + + + + + + + + + + + + + + + + + + + + + + +
        NameTypeDescription
        $parameterNamestring-
        $associativebool-
        $nullablebool-
        + +Return value: array + + Throws:
      @@ -190,10 +202,66 @@ public function getClassEntityFilter(): \BumbleDocGen\Core\Parser\FilterConditio
      + + +```php +public function getComposerConfigFile(): null|string; +``` + + + +Parameters: not specified + +Return value: null | string + + +Throws: + + +
      +
      +
      + + + +```php +public function getComposerInstalledFile(): null|string; +``` + + + +Parameters: not specified + +Return value: null | string + + +Throws: + + +
      +
      +
      + ```php @@ -227,7 +295,7 @@ public function getCustomTwigFilters(): \BumbleDocGen\Core\Renderer\Twig\Filter\ ```php @@ -384,6 +452,62 @@ public function getPropertyEntityFilter(): \BumbleDocGen\Core\Parser\FilterCondi +
      +
      +
      + + + +```php +public function getPsr4Map(): array; +``` + + + +Parameters: not specified + +Return value: array + + +Throws: + + +
      +
      +
      + + + +```php +public function getUseComposerAutoload(): bool; +``` + + + +Parameters: not specified + +Return value: bool + + +Throws: + +

      diff --git a/src/Core/Configuration/ConfigurationParameterBag.php b/src/Core/Configuration/ConfigurationParameterBag.php index 95a0eabc..0a70f1b5 100644 --- a/src/Core/Configuration/ConfigurationParameterBag.php +++ b/src/Core/Configuration/ConfigurationParameterBag.php @@ -235,6 +235,36 @@ public function validateAndGetClassListValue( return $preparedValues; } + /** + * @throws InvalidConfigurationParameterException + */ + public function validateAndGetStringListValue( + string $parameterName, + bool $associative = true, + bool $nullable = true + ): array { + $values = $this->get($parameterName); + if (is_null($values) && $nullable) { + $values = []; + } + if (!is_array($values)) { + throw new InvalidConfigurationParameterException("Parameter `{$parameterName}` must be an array"); + } + foreach ($values as $i => $value) { + if (($associative && !is_string($i)) || (!$associative && is_string($i))) { + throw new InvalidConfigurationParameterException( + "Configuration parameter `{$parameterName}[\"{$i}\"]` contains an incorrect key value" + ); + } + if (!is_string($value)) { + throw new InvalidConfigurationParameterException( + "Configuration parameter `{$parameterName}[{$i}]` contains an incorrect value" + ); + } + } + return $values; + } + /** * @throws InvalidConfigurationParameterException */ diff --git a/src/LanguageHandler/Php/Parser/ComposerHelper.php b/src/LanguageHandler/Php/Parser/ComposerHelper.php index 096939d1..4225eb04 100644 --- a/src/LanguageHandler/Php/Parser/ComposerHelper.php +++ b/src/LanguageHandler/Php/Parser/ComposerHelper.php @@ -6,6 +6,7 @@ use BumbleDocGen\Core\Configuration\Configuration; use BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException; +use BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings; use Composer\Autoload\ClassLoader; final class ComposerHelper @@ -13,8 +14,10 @@ final class ComposerHelper private array $packages = []; private ?ClassLoader $classLoader = null; - public function __construct(private Configuration $configuration) - { + public function __construct( + private Configuration $configuration, + private PhpHandlerSettings $phpHandlerSettings + ) { } /** @@ -28,8 +31,19 @@ public function getComposerClassLoader(): ClassLoader $classLoader = new ClassLoader(); $projectRoot = $this->configuration->getProjectRoot(); - $composerJsonPath = "{$projectRoot}/composer.json"; - if (!file_exists($composerJsonPath) || !is_readable($composerJsonPath)) { + + $psr4Map = $this->phpHandlerSettings->getPsr4Map(); + foreach ($psr4Map as $namespace => $path) { + $path = "{$projectRoot}/{$path}"; + $classLoader->addPsr4($namespace, "{$projectRoot}/{$path}"); + } + + if (!$this->phpHandlerSettings->getUseComposerAutoload()) { + return $classLoader; + } + + $composerJsonPath = $this->phpHandlerSettings->getComposerConfigFile(); + if (!$composerJsonPath || !file_exists($composerJsonPath) || !is_readable($composerJsonPath)) { return $classLoader; } @@ -66,7 +80,10 @@ public function getComposerPackages(): array if ($this->packages) { return $this->packages; } - $installedJsonFile = realpath($this->configuration->getProjectRoot() . '/vendor/composer/installed.json'); + $installedJsonFile = $this->phpHandlerSettings->getComposerInstalledFile(); + if (!$installedJsonFile) { + return $this->packages; + } $installedPackagesData = json_decode(file_get_contents($installedJsonFile), true); foreach ($installedPackagesData['packages'] as $package) { if (!isset($package['source']['url'])) { diff --git a/src/LanguageHandler/Php/PhpHandlerSettings.php b/src/LanguageHandler/Php/PhpHandlerSettings.php index 87e53c73..e20a95d3 100644 --- a/src/LanguageHandler/Php/PhpHandlerSettings.php +++ b/src/LanguageHandler/Php/PhpHandlerSettings.php @@ -154,6 +154,72 @@ public function getFileSourceBaseUrl(): ?string return $fileSourceBaseUrl; } + /** + * @throws InvalidConfigurationParameterException + */ + public function getUseComposerAutoload(): bool + { + try { + return $this->localObjectCache->getMethodCachedResult(__METHOD__, ''); + } catch (ObjectNotFoundException) { + } + $useComposerAutoload = $this->parameterBag->validateAndGetBooleanValue( + $this->getSettingsKey('use_composer_autoload') + ); + $this->localObjectCache->cacheMethodResult(__METHOD__, '', $useComposerAutoload); + return $useComposerAutoload; + } + + /** + * @throws InvalidConfigurationParameterException + */ + public function getComposerConfigFile(): ?string + { + try { + return $this->localObjectCache->getMethodCachedResult(__METHOD__, ''); + } catch (ObjectNotFoundException) { + } + $composerConfigFile = $this->parameterBag->validateAndGetFilePathValue( + $this->getSettingsKey('composer_config_file'), + ['json'] + ); + $this->localObjectCache->cacheMethodResult(__METHOD__, '', $composerConfigFile); + return $composerConfigFile; + } + + /** + * @throws InvalidConfigurationParameterException + */ + public function getComposerInstalledFile(): ?string + { + try { + return $this->localObjectCache->getMethodCachedResult(__METHOD__, ''); + } catch (ObjectNotFoundException) { + } + $composerInstalledFile = $this->parameterBag->validateAndGetFilePathValue( + $this->getSettingsKey('composer_installed_file'), + ['json'] + ); + $this->localObjectCache->cacheMethodResult(__METHOD__, '', $composerInstalledFile); + return $composerInstalledFile; + } + + /** + * @throws InvalidConfigurationParameterException + */ + public function getPsr4Map(): array + { + try { + return $this->localObjectCache->getMethodCachedResult(__METHOD__, ''); + } catch (ObjectNotFoundException) { + } + $psr4 = $this->parameterBag->validateAndGetStringListValue( + $this->getSettingsKey('psr4_map'), + ); + $this->localObjectCache->cacheMethodResult(__METHOD__, '', $psr4); + return $psr4; + } + /** * @throws DependencyException * @throws InvalidConfigurationParameterException diff --git a/src/LanguageHandler/Php/phpHandlerDefaultSettings.yaml b/src/LanguageHandler/Php/phpHandlerDefaultSettings.yaml index bad68008..d80e7e1f 100644 --- a/src/LanguageHandler/Php/phpHandlerDefaultSettings.yaml +++ b/src/LanguageHandler/Php/phpHandlerDefaultSettings.yaml @@ -31,6 +31,11 @@ language_handlers: custom_twig_filters: file_source_base_url: null + + use_composer_autoload: true # whether to use composer to load the class map or not + composer_config_file: "%project_root%/composer.json" + composer_installed_file: "%project_root%/vendor/composer/installed.json" + psr4_map: # same as in composer plugins: - class: \BumbleDocGen\LanguageHandler\Php\Plugin\CorePlugin\BasePhpStubber\BasePhpStubberPlugin - class: \BumbleDocGen\LanguageHandler\Php\Plugin\CorePlugin\BasePhpStubber\PhpDocumentorStubberPlugin From 85a9311130a9a1148d23e58c832980b29c31fd36 Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Tue, 14 Nov 2023 19:57:26 +0300 Subject: [PATCH 062/210] Changing entities namespaces --- src/AI/Generators/DocBlocksGenerator.php | 2 +- src/LanguageHandler/Php/Parser/Entity/BaseEntity.php | 3 +++ .../Parser/Entity/Cache/CacheablePhpEntityFactory.php | 8 ++++---- src/LanguageHandler/Php/Parser/Entity/ClassEntity.php | 10 ++++++++-- .../Php/Parser/Entity/ClassEntityCollection.php | 2 +- .../Parser/Entity/{ => Constant}/ConstantEntity.php | 7 +++++-- .../Entity/{ => Constant}/ConstantEntityCollection.php | 3 ++- .../Parser/Entity/{ => Method}/DynamicMethodEntity.php | 3 ++- .../Php/Parser/Entity/{ => Method}/MethodEntity.php | 7 +++++-- .../Entity/{ => Method}/MethodEntityCollection.php | 3 ++- .../Entity/{ => Method}/MethodEntityInterface.php | 3 ++- .../Parser/Entity/{ => Property}/PropertyEntity.php | 7 +++++-- .../Entity/{ => Property}/PropertyEntityCollection.php | 3 ++- .../VisibilityCondition.php | 2 +- .../OnlyFromCurrentClassCondition.php | 2 +- .../MethodFilterCondition/VisibilityCondition.php | 2 +- .../OnlyFromCurrentClassCondition.php | 2 +- .../PropertyFilterCondition/VisibilityCondition.php | 2 +- .../{Entity => }/PhpParser/NodeValueCompiler.php | 8 ++++---- .../Parser/{Entity => }/PhpParser/PhpParserHelper.php | 2 +- .../IsPrivateConditionTest.php | 2 +- .../IsProtectedConditionTest.php | 2 +- .../IsPublicConditionTest.php | 2 +- .../VisibilityConditionTest.php | 2 +- .../MethodFilterCondition/IsPrivateConditionTest.php | 2 +- .../MethodFilterCondition/IsProtectedConditionTest.php | 2 +- .../MethodFilterCondition/IsPublicConditionTest.php | 2 +- .../MethodFilterCondition/VisibilityConditionTest.php | 2 +- .../PropertyFilterCondition/IsPrivateConditionTest.php | 2 +- .../IsProtectedConditionTest.php | 2 +- .../PropertyFilterCondition/IsPublicConditionTest.php | 2 +- .../VisibilityConditionTest.php | 2 +- 32 files changed, 64 insertions(+), 41 deletions(-) rename src/LanguageHandler/Php/Parser/Entity/{ => Constant}/ConstantEntity.php (94%) rename src/LanguageHandler/Php/Parser/Entity/{ => Constant}/ConstantEntityCollection.php (95%) rename src/LanguageHandler/Php/Parser/Entity/{ => Method}/DynamicMethodEntity.php (98%) rename src/LanguageHandler/Php/Parser/Entity/{ => Method}/MethodEntity.php (98%) rename src/LanguageHandler/Php/Parser/Entity/{ => Method}/MethodEntityCollection.php (97%) rename src/LanguageHandler/Php/Parser/Entity/{ => Method}/MethodEntityInterface.php (88%) rename src/LanguageHandler/Php/Parser/Entity/{ => Property}/PropertyEntity.php (97%) rename src/LanguageHandler/Php/Parser/Entity/{ => Property}/PropertyEntityCollection.php (95%) rename src/LanguageHandler/Php/Parser/{Entity => }/PhpParser/NodeValueCompiler.php (96%) rename src/LanguageHandler/Php/Parser/{Entity => }/PhpParser/PhpParserHelper.php (88%) diff --git a/src/AI/Generators/DocBlocksGenerator.php b/src/AI/Generators/DocBlocksGenerator.php index 8376a2e1..0262c0aa 100644 --- a/src/AI/Generators/DocBlocksGenerator.php +++ b/src/AI/Generators/DocBlocksGenerator.php @@ -8,7 +8,7 @@ use BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException; use BumbleDocGen\Core\Parser\Entity\RootEntityInterface; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\MethodEntity; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Method\MethodEntity; use BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper; use DI\DependencyException; use DI\NotFoundException; diff --git a/src/LanguageHandler/Php/Parser/Entity/BaseEntity.php b/src/LanguageHandler/Php/Parser/Entity/BaseEntity.php index ce76c3e2..4201b78f 100644 --- a/src/LanguageHandler/Php/Parser/Entity/BaseEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/BaseEntity.php @@ -16,6 +16,9 @@ use BumbleDocGen\Core\Parser\Entity\RootEntityInterface; use BumbleDocGen\Core\Renderer\RendererHelper; use BumbleDocGen\Core\Renderer\Twig\Function\GetDocumentedEntityUrl; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Constant\ConstantEntity; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Method\MethodEntity; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Property\PropertyEntity; use BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper; use BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings; use BumbleDocGen\LanguageHandler\Php\Plugin\Event\Entity\OnCheckIsClassEntityCanBeLoad; diff --git a/src/LanguageHandler/Php/Parser/Entity/Cache/CacheablePhpEntityFactory.php b/src/LanguageHandler/Php/Parser/Entity/Cache/CacheablePhpEntityFactory.php index 0f08b623..65012650 100644 --- a/src/LanguageHandler/Php/Parser/Entity/Cache/CacheablePhpEntityFactory.php +++ b/src/LanguageHandler/Php/Parser/Entity/Cache/CacheablePhpEntityFactory.php @@ -9,10 +9,10 @@ use BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityWrapperFactory; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ConstantEntity; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\DynamicMethodEntity; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\MethodEntity; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\PropertyEntity; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Constant\ConstantEntity; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Method\DynamicMethodEntity; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Method\MethodEntity; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Property\PropertyEntity; use DI\Container; use DI\DependencyException; use DI\NotFoundException; diff --git a/src/LanguageHandler/Php/Parser/Entity/ClassEntity.php b/src/LanguageHandler/Php/Parser/Entity/ClassEntity.php index 8fb0f826..bdb10f8a 100644 --- a/src/LanguageHandler/Php/Parser/Entity/ClassEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/ClassEntity.php @@ -14,9 +14,15 @@ use BumbleDocGen\Core\Renderer\EntityDocRenderer\EntityDocRendererInterface; use BumbleDocGen\Core\Renderer\Twig\Filter\PrepareSourceLink; use BumbleDocGen\LanguageHandler\Php\Parser\ComposerHelper; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpParser\NodeValueCompiler; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpParser\PhpParserHelper; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Constant\ConstantEntity; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Constant\ConstantEntityCollection; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Method\MethodEntity; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Method\MethodEntityCollection; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Property\PropertyEntity; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Property\PropertyEntityCollection; use BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper; +use BumbleDocGen\LanguageHandler\Php\Parser\PhpParser\NodeValueCompiler; +use BumbleDocGen\LanguageHandler\Php\Parser\PhpParser\PhpParserHelper; use BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings; use DI\Attribute\Inject; use DI\Container; diff --git a/src/LanguageHandler/Php/Parser/Entity/ClassEntityCollection.php b/src/LanguageHandler/Php/Parser/Entity/ClassEntityCollection.php index e2c7a6dd..8fa9b2d3 100644 --- a/src/LanguageHandler/Php/Parser/Entity/ClassEntityCollection.php +++ b/src/LanguageHandler/Php/Parser/Entity/ClassEntityCollection.php @@ -11,8 +11,8 @@ use BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException; use BumbleDocGen\Core\Parser\Entity\LoggableRootEntityCollection; use BumbleDocGen\Core\Plugin\PluginEventDispatcher; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpParser\PhpParserHelper; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Cache\CacheablePhpEntityFactory; +use BumbleDocGen\LanguageHandler\Php\Parser\PhpParser\PhpParserHelper; use BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings; use BumbleDocGen\LanguageHandler\Php\Plugin\Event\Parser\AfterLoadingClassEntityCollection; use BumbleDocGen\LanguageHandler\Php\Plugin\Event\Parser\OnAddClassEntityToCollection; diff --git a/src/LanguageHandler/Php/Parser/Entity/ConstantEntity.php b/src/LanguageHandler/Php/Parser/Entity/Constant/ConstantEntity.php similarity index 94% rename from src/LanguageHandler/Php/Parser/Entity/ConstantEntity.php rename to src/LanguageHandler/Php/Parser/Entity/Constant/ConstantEntity.php index 386d128d..9f4d45dc 100644 --- a/src/LanguageHandler/Php/Parser/Entity/ConstantEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/Constant/ConstantEntity.php @@ -2,14 +2,17 @@ declare(strict_types=1); -namespace BumbleDocGen\LanguageHandler\Php\Parser\Entity; +namespace BumbleDocGen\LanguageHandler\Php\Parser\Entity\Constant; use BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache; use BumbleDocGen\Core\Configuration\Configuration; use BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException; use BumbleDocGen\Core\Parser\Entity\Cache\CacheableMethod; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpParser\NodeValueCompiler; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection; use BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper; +use BumbleDocGen\LanguageHandler\Php\Parser\PhpParser\NodeValueCompiler; use BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings; use phpDocumentor\Reflection\DocBlock; use PhpParser\ConstExprEvaluationException; diff --git a/src/LanguageHandler/Php/Parser/Entity/ConstantEntityCollection.php b/src/LanguageHandler/Php/Parser/Entity/Constant/ConstantEntityCollection.php similarity index 95% rename from src/LanguageHandler/Php/Parser/Entity/ConstantEntityCollection.php rename to src/LanguageHandler/Php/Parser/Entity/Constant/ConstantEntityCollection.php index 94d1ea44..30fffbcb 100644 --- a/src/LanguageHandler/Php/Parser/Entity/ConstantEntityCollection.php +++ b/src/LanguageHandler/Php/Parser/Entity/Constant/ConstantEntityCollection.php @@ -2,11 +2,12 @@ declare(strict_types=1); -namespace BumbleDocGen\LanguageHandler\Php\Parser\Entity; +namespace BumbleDocGen\LanguageHandler\Php\Parser\Entity\Constant; use BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException; use BumbleDocGen\Core\Parser\Entity\BaseEntityCollection; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Cache\CacheablePhpEntityFactory; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity; use BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings; use DI\DependencyException; use DI\NotFoundException; diff --git a/src/LanguageHandler/Php/Parser/Entity/DynamicMethodEntity.php b/src/LanguageHandler/Php/Parser/Entity/Method/DynamicMethodEntity.php similarity index 98% rename from src/LanguageHandler/Php/Parser/Entity/DynamicMethodEntity.php rename to src/LanguageHandler/Php/Parser/Entity/Method/DynamicMethodEntity.php index b2d72faa..db0f2410 100644 --- a/src/LanguageHandler/Php/Parser/Entity/DynamicMethodEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/Method/DynamicMethodEntity.php @@ -2,11 +2,12 @@ declare(strict_types=1); -namespace BumbleDocGen\LanguageHandler\Php\Parser\Entity; +namespace BumbleDocGen\LanguageHandler\Php\Parser\Entity\Method; use BumbleDocGen\Core\Configuration\Configuration; use BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException; use BumbleDocGen\Core\Parser\Entity\RootEntityCollection; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity; use BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper; use phpDocumentor\Reflection\DocBlock\Tags\Method; diff --git a/src/LanguageHandler/Php/Parser/Entity/MethodEntity.php b/src/LanguageHandler/Php/Parser/Entity/Method/MethodEntity.php similarity index 98% rename from src/LanguageHandler/Php/Parser/Entity/MethodEntity.php rename to src/LanguageHandler/Php/Parser/Entity/Method/MethodEntity.php index 7df2fab3..e6a86677 100644 --- a/src/LanguageHandler/Php/Parser/Entity/MethodEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/Method/MethodEntity.php @@ -2,15 +2,18 @@ declare(strict_types=1); -namespace BumbleDocGen\LanguageHandler\Php\Parser\Entity; +namespace BumbleDocGen\LanguageHandler\Php\Parser\Entity\Method; use BumbleDocGen\Core\Cache\LocalCache\Exception\ObjectNotFoundException; use BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache; use BumbleDocGen\Core\Configuration\Configuration; use BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException; use BumbleDocGen\Core\Parser\Entity\Cache\CacheableMethod; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpParser\NodeValueCompiler; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection; use BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper; +use BumbleDocGen\LanguageHandler\Php\Parser\PhpParser\NodeValueCompiler; use BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings; use DI\DependencyException; use DI\NotFoundException; diff --git a/src/LanguageHandler/Php/Parser/Entity/MethodEntityCollection.php b/src/LanguageHandler/Php/Parser/Entity/Method/MethodEntityCollection.php similarity index 97% rename from src/LanguageHandler/Php/Parser/Entity/MethodEntityCollection.php rename to src/LanguageHandler/Php/Parser/Entity/Method/MethodEntityCollection.php index fed5d31a..f980ee91 100644 --- a/src/LanguageHandler/Php/Parser/Entity/MethodEntityCollection.php +++ b/src/LanguageHandler/Php/Parser/Entity/Method/MethodEntityCollection.php @@ -2,11 +2,12 @@ declare(strict_types=1); -namespace BumbleDocGen\LanguageHandler\Php\Parser\Entity; +namespace BumbleDocGen\LanguageHandler\Php\Parser\Entity\Method; use BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException; use BumbleDocGen\Core\Parser\Entity\BaseEntityCollection; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Cache\CacheablePhpEntityFactory; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity; use BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings; use DI\DependencyException; use DI\NotFoundException; diff --git a/src/LanguageHandler/Php/Parser/Entity/MethodEntityInterface.php b/src/LanguageHandler/Php/Parser/Entity/Method/MethodEntityInterface.php similarity index 88% rename from src/LanguageHandler/Php/Parser/Entity/MethodEntityInterface.php rename to src/LanguageHandler/Php/Parser/Entity/Method/MethodEntityInterface.php index 19bbbc29..ff5953f8 100644 --- a/src/LanguageHandler/Php/Parser/Entity/MethodEntityInterface.php +++ b/src/LanguageHandler/Php/Parser/Entity/Method/MethodEntityInterface.php @@ -2,9 +2,10 @@ declare(strict_types=1); -namespace BumbleDocGen\LanguageHandler\Php\Parser\Entity; +namespace BumbleDocGen\LanguageHandler\Php\Parser\Entity\Method; use BumbleDocGen\Core\Parser\Entity\EntityInterface; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity; interface MethodEntityInterface extends EntityInterface { diff --git a/src/LanguageHandler/Php/Parser/Entity/PropertyEntity.php b/src/LanguageHandler/Php/Parser/Entity/Property/PropertyEntity.php similarity index 97% rename from src/LanguageHandler/Php/Parser/Entity/PropertyEntity.php rename to src/LanguageHandler/Php/Parser/Entity/Property/PropertyEntity.php index 0b257050..fcb778aa 100644 --- a/src/LanguageHandler/Php/Parser/Entity/PropertyEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/Property/PropertyEntity.php @@ -2,15 +2,18 @@ declare(strict_types=1); -namespace BumbleDocGen\LanguageHandler\Php\Parser\Entity; +namespace BumbleDocGen\LanguageHandler\Php\Parser\Entity\Property; use BumbleDocGen\Core\Cache\LocalCache\Exception\ObjectNotFoundException; use BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache; use BumbleDocGen\Core\Configuration\Configuration; use BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException; use BumbleDocGen\Core\Parser\Entity\Cache\CacheableMethod; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpParser\NodeValueCompiler; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection; use BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper; +use BumbleDocGen\LanguageHandler\Php\Parser\PhpParser\NodeValueCompiler; use BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings; use DI\DependencyException; use DI\NotFoundException; diff --git a/src/LanguageHandler/Php/Parser/Entity/PropertyEntityCollection.php b/src/LanguageHandler/Php/Parser/Entity/Property/PropertyEntityCollection.php similarity index 95% rename from src/LanguageHandler/Php/Parser/Entity/PropertyEntityCollection.php rename to src/LanguageHandler/Php/Parser/Entity/Property/PropertyEntityCollection.php index 66cc2ae1..206b4c7d 100644 --- a/src/LanguageHandler/Php/Parser/Entity/PropertyEntityCollection.php +++ b/src/LanguageHandler/Php/Parser/Entity/Property/PropertyEntityCollection.php @@ -2,11 +2,12 @@ declare(strict_types=1); -namespace BumbleDocGen\LanguageHandler\Php\Parser\Entity; +namespace BumbleDocGen\LanguageHandler\Php\Parser\Entity\Property; use BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException; use BumbleDocGen\Core\Parser\Entity\BaseEntityCollection; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Cache\CacheablePhpEntityFactory; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity; use BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings; use DI\DependencyException; use DI\NotFoundException; diff --git a/src/LanguageHandler/Php/Parser/FilterCondition/ClassConstantFilterCondition/VisibilityCondition.php b/src/LanguageHandler/Php/Parser/FilterCondition/ClassConstantFilterCondition/VisibilityCondition.php index 35769a5e..9d7a9e76 100644 --- a/src/LanguageHandler/Php/Parser/FilterCondition/ClassConstantFilterCondition/VisibilityCondition.php +++ b/src/LanguageHandler/Php/Parser/FilterCondition/ClassConstantFilterCondition/VisibilityCondition.php @@ -6,7 +6,7 @@ use BumbleDocGen\Core\Parser\Entity\EntityInterface; use BumbleDocGen\Core\Parser\FilterCondition\ConditionInterface; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ConstantEntity; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Constant\ConstantEntity; use BumbleDocGen\LanguageHandler\Php\Parser\FilterCondition\ClassFilterCondition\VisibilityConditionModifier; /** diff --git a/src/LanguageHandler/Php/Parser/FilterCondition/MethodFilterCondition/OnlyFromCurrentClassCondition.php b/src/LanguageHandler/Php/Parser/FilterCondition/MethodFilterCondition/OnlyFromCurrentClassCondition.php index 83020988..fbea22d9 100644 --- a/src/LanguageHandler/Php/Parser/FilterCondition/MethodFilterCondition/OnlyFromCurrentClassCondition.php +++ b/src/LanguageHandler/Php/Parser/FilterCondition/MethodFilterCondition/OnlyFromCurrentClassCondition.php @@ -6,7 +6,7 @@ use BumbleDocGen\Core\Parser\Entity\EntityInterface; use BumbleDocGen\Core\Parser\FilterCondition\ConditionInterface; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\MethodEntity; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Method\MethodEntity; /** * Only methods that belong to the current class (not parent) diff --git a/src/LanguageHandler/Php/Parser/FilterCondition/MethodFilterCondition/VisibilityCondition.php b/src/LanguageHandler/Php/Parser/FilterCondition/MethodFilterCondition/VisibilityCondition.php index 375b1b3f..62ee6762 100644 --- a/src/LanguageHandler/Php/Parser/FilterCondition/MethodFilterCondition/VisibilityCondition.php +++ b/src/LanguageHandler/Php/Parser/FilterCondition/MethodFilterCondition/VisibilityCondition.php @@ -6,7 +6,7 @@ use BumbleDocGen\Core\Parser\Entity\EntityInterface; use BumbleDocGen\Core\Parser\FilterCondition\ConditionInterface; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\MethodEntity; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Method\MethodEntity; use BumbleDocGen\LanguageHandler\Php\Parser\FilterCondition\ClassFilterCondition\VisibilityConditionModifier; /** diff --git a/src/LanguageHandler/Php/Parser/FilterCondition/PropertyFilterCondition/OnlyFromCurrentClassCondition.php b/src/LanguageHandler/Php/Parser/FilterCondition/PropertyFilterCondition/OnlyFromCurrentClassCondition.php index da0a037b..579e86e0 100644 --- a/src/LanguageHandler/Php/Parser/FilterCondition/PropertyFilterCondition/OnlyFromCurrentClassCondition.php +++ b/src/LanguageHandler/Php/Parser/FilterCondition/PropertyFilterCondition/OnlyFromCurrentClassCondition.php @@ -6,7 +6,7 @@ use BumbleDocGen\Core\Parser\Entity\EntityInterface; use BumbleDocGen\Core\Parser\FilterCondition\ConditionInterface; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\PropertyEntity; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Property\PropertyEntity; /** * Only properties that belong to the current class (not parent) diff --git a/src/LanguageHandler/Php/Parser/FilterCondition/PropertyFilterCondition/VisibilityCondition.php b/src/LanguageHandler/Php/Parser/FilterCondition/PropertyFilterCondition/VisibilityCondition.php index 52caf60c..218df687 100644 --- a/src/LanguageHandler/Php/Parser/FilterCondition/PropertyFilterCondition/VisibilityCondition.php +++ b/src/LanguageHandler/Php/Parser/FilterCondition/PropertyFilterCondition/VisibilityCondition.php @@ -6,7 +6,7 @@ use BumbleDocGen\Core\Parser\Entity\EntityInterface; use BumbleDocGen\Core\Parser\FilterCondition\ConditionInterface; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\PropertyEntity; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Property\PropertyEntity; use BumbleDocGen\LanguageHandler\Php\Parser\FilterCondition\ClassFilterCondition\VisibilityConditionModifier; /** diff --git a/src/LanguageHandler/Php/Parser/Entity/PhpParser/NodeValueCompiler.php b/src/LanguageHandler/Php/Parser/PhpParser/NodeValueCompiler.php similarity index 96% rename from src/LanguageHandler/Php/Parser/Entity/PhpParser/NodeValueCompiler.php rename to src/LanguageHandler/Php/Parser/PhpParser/NodeValueCompiler.php index c4f3f38e..849139dc 100644 --- a/src/LanguageHandler/Php/Parser/Entity/PhpParser/NodeValueCompiler.php +++ b/src/LanguageHandler/Php/Parser/PhpParser/NodeValueCompiler.php @@ -2,13 +2,13 @@ declare(strict_types=1); -namespace BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpParser; +namespace BumbleDocGen\LanguageHandler\Php\Parser\PhpParser; use BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ConstantEntity; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\MethodEntity; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\PropertyEntity; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Constant\ConstantEntity; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Method\MethodEntity; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Property\PropertyEntity; use DI\DependencyException; use DI\NotFoundException; use PhpParser\ConstExprEvaluationException; diff --git a/src/LanguageHandler/Php/Parser/Entity/PhpParser/PhpParserHelper.php b/src/LanguageHandler/Php/Parser/PhpParser/PhpParserHelper.php similarity index 88% rename from src/LanguageHandler/Php/Parser/Entity/PhpParser/PhpParserHelper.php rename to src/LanguageHandler/Php/Parser/PhpParser/PhpParserHelper.php index 07e9a9c6..556ab048 100644 --- a/src/LanguageHandler/Php/Parser/Entity/PhpParser/PhpParserHelper.php +++ b/src/LanguageHandler/Php/Parser/PhpParser/PhpParserHelper.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpParser; +namespace BumbleDocGen\LanguageHandler\Php\Parser\PhpParser; use PhpParser\Lexer\Emulative; use PhpParser\Parser; diff --git a/tests/Unit/LanguageHandler/Php/Parser/FilterCondition/ClassConstantFilterCondition/IsPrivateConditionTest.php b/tests/Unit/LanguageHandler/Php/Parser/FilterCondition/ClassConstantFilterCondition/IsPrivateConditionTest.php index c3ac0106..3139da9a 100644 --- a/tests/Unit/LanguageHandler/Php/Parser/FilterCondition/ClassConstantFilterCondition/IsPrivateConditionTest.php +++ b/tests/Unit/LanguageHandler/Php/Parser/FilterCondition/ClassConstantFilterCondition/IsPrivateConditionTest.php @@ -4,7 +4,7 @@ namespace Test\Unit\LanguageHandler\Php\Parser\FilterCondition\ClassConstantFilterCondition; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ConstantEntity; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Constant\ConstantEntity; use BumbleDocGen\LanguageHandler\Php\Parser\FilterCondition\ClassConstantFilterCondition\IsPrivateCondition; use PHPUnit\Framework\TestCase; diff --git a/tests/Unit/LanguageHandler/Php/Parser/FilterCondition/ClassConstantFilterCondition/IsProtectedConditionTest.php b/tests/Unit/LanguageHandler/Php/Parser/FilterCondition/ClassConstantFilterCondition/IsProtectedConditionTest.php index b61df59d..558382da 100644 --- a/tests/Unit/LanguageHandler/Php/Parser/FilterCondition/ClassConstantFilterCondition/IsProtectedConditionTest.php +++ b/tests/Unit/LanguageHandler/Php/Parser/FilterCondition/ClassConstantFilterCondition/IsProtectedConditionTest.php @@ -4,7 +4,7 @@ namespace Test\Unit\LanguageHandler\Php\Parser\FilterCondition\ClassConstantFilterCondition; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ConstantEntity; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Constant\ConstantEntity; use BumbleDocGen\LanguageHandler\Php\Parser\FilterCondition\ClassConstantFilterCondition\IsProtectedCondition; use PHPUnit\Framework\TestCase; diff --git a/tests/Unit/LanguageHandler/Php/Parser/FilterCondition/ClassConstantFilterCondition/IsPublicConditionTest.php b/tests/Unit/LanguageHandler/Php/Parser/FilterCondition/ClassConstantFilterCondition/IsPublicConditionTest.php index 2113270d..11411785 100644 --- a/tests/Unit/LanguageHandler/Php/Parser/FilterCondition/ClassConstantFilterCondition/IsPublicConditionTest.php +++ b/tests/Unit/LanguageHandler/Php/Parser/FilterCondition/ClassConstantFilterCondition/IsPublicConditionTest.php @@ -4,7 +4,7 @@ namespace Test\Unit\LanguageHandler\Php\Parser\FilterCondition\ClassConstantFilterCondition; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ConstantEntity; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Constant\ConstantEntity; use BumbleDocGen\LanguageHandler\Php\Parser\FilterCondition\ClassConstantFilterCondition\IsPublicCondition; use PHPUnit\Framework\TestCase; diff --git a/tests/Unit/LanguageHandler/Php/Parser/FilterCondition/ClassConstantFilterCondition/VisibilityConditionTest.php b/tests/Unit/LanguageHandler/Php/Parser/FilterCondition/ClassConstantFilterCondition/VisibilityConditionTest.php index b27ff9d0..de03f4ae 100644 --- a/tests/Unit/LanguageHandler/Php/Parser/FilterCondition/ClassConstantFilterCondition/VisibilityConditionTest.php +++ b/tests/Unit/LanguageHandler/Php/Parser/FilterCondition/ClassConstantFilterCondition/VisibilityConditionTest.php @@ -4,7 +4,7 @@ namespace Test\Unit\LanguageHandler\Php\Parser\FilterCondition\ClassConstantFilterCondition; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ConstantEntity; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Constant\ConstantEntity; use BumbleDocGen\LanguageHandler\Php\Parser\FilterCondition\ClassConstantFilterCondition\VisibilityCondition; use BumbleDocGen\LanguageHandler\Php\Parser\FilterCondition\ClassFilterCondition\VisibilityConditionModifier; use PHPUnit\Framework\TestCase; diff --git a/tests/Unit/LanguageHandler/Php/Parser/FilterCondition/MethodFilterCondition/IsPrivateConditionTest.php b/tests/Unit/LanguageHandler/Php/Parser/FilterCondition/MethodFilterCondition/IsPrivateConditionTest.php index 8a3c6f25..f82c52ce 100644 --- a/tests/Unit/LanguageHandler/Php/Parser/FilterCondition/MethodFilterCondition/IsPrivateConditionTest.php +++ b/tests/Unit/LanguageHandler/Php/Parser/FilterCondition/MethodFilterCondition/IsPrivateConditionTest.php @@ -4,7 +4,7 @@ namespace Test\Unit\LanguageHandler\Php\Parser\FilterCondition\MethodFilterCondition; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\MethodEntity; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Method\MethodEntity; use BumbleDocGen\LanguageHandler\Php\Parser\FilterCondition\MethodFilterCondition\IsPrivateCondition; use PHPUnit\Framework\TestCase; diff --git a/tests/Unit/LanguageHandler/Php/Parser/FilterCondition/MethodFilterCondition/IsProtectedConditionTest.php b/tests/Unit/LanguageHandler/Php/Parser/FilterCondition/MethodFilterCondition/IsProtectedConditionTest.php index 5e47b81b..608e5648 100644 --- a/tests/Unit/LanguageHandler/Php/Parser/FilterCondition/MethodFilterCondition/IsProtectedConditionTest.php +++ b/tests/Unit/LanguageHandler/Php/Parser/FilterCondition/MethodFilterCondition/IsProtectedConditionTest.php @@ -4,7 +4,7 @@ namespace Test\Unit\LanguageHandler\Php\Parser\FilterCondition\MethodFilterCondition; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\MethodEntity; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Method\MethodEntity; use BumbleDocGen\LanguageHandler\Php\Parser\FilterCondition\MethodFilterCondition\IsProtectedCondition; use PHPUnit\Framework\TestCase; diff --git a/tests/Unit/LanguageHandler/Php/Parser/FilterCondition/MethodFilterCondition/IsPublicConditionTest.php b/tests/Unit/LanguageHandler/Php/Parser/FilterCondition/MethodFilterCondition/IsPublicConditionTest.php index e0ecc979..352dcffb 100644 --- a/tests/Unit/LanguageHandler/Php/Parser/FilterCondition/MethodFilterCondition/IsPublicConditionTest.php +++ b/tests/Unit/LanguageHandler/Php/Parser/FilterCondition/MethodFilterCondition/IsPublicConditionTest.php @@ -4,7 +4,7 @@ namespace Test\Unit\LanguageHandler\Php\Parser\FilterCondition\MethodFilterCondition; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\MethodEntity; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Method\MethodEntity; use BumbleDocGen\LanguageHandler\Php\Parser\FilterCondition\MethodFilterCondition\IsPublicCondition; use PHPUnit\Framework\TestCase; diff --git a/tests/Unit/LanguageHandler/Php/Parser/FilterCondition/MethodFilterCondition/VisibilityConditionTest.php b/tests/Unit/LanguageHandler/Php/Parser/FilterCondition/MethodFilterCondition/VisibilityConditionTest.php index c06e80b6..f94ccc40 100644 --- a/tests/Unit/LanguageHandler/Php/Parser/FilterCondition/MethodFilterCondition/VisibilityConditionTest.php +++ b/tests/Unit/LanguageHandler/Php/Parser/FilterCondition/MethodFilterCondition/VisibilityConditionTest.php @@ -4,7 +4,7 @@ namespace Test\Unit\LanguageHandler\Php\Parser\FilterCondition\MethodFilterCondition; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\MethodEntity; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Method\MethodEntity; use BumbleDocGen\LanguageHandler\Php\Parser\FilterCondition\ClassFilterCondition\VisibilityConditionModifier; use BumbleDocGen\LanguageHandler\Php\Parser\FilterCondition\MethodFilterCondition\VisibilityCondition; use PHPUnit\Framework\TestCase; diff --git a/tests/Unit/LanguageHandler/Php/Parser/FilterCondition/PropertyFilterCondition/IsPrivateConditionTest.php b/tests/Unit/LanguageHandler/Php/Parser/FilterCondition/PropertyFilterCondition/IsPrivateConditionTest.php index 71f42f02..66106c01 100644 --- a/tests/Unit/LanguageHandler/Php/Parser/FilterCondition/PropertyFilterCondition/IsPrivateConditionTest.php +++ b/tests/Unit/LanguageHandler/Php/Parser/FilterCondition/PropertyFilterCondition/IsPrivateConditionTest.php @@ -4,7 +4,7 @@ namespace Test\Unit\LanguageHandler\Php\Parser\FilterCondition\PropertyFilterCondition; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\PropertyEntity; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Property\PropertyEntity; use BumbleDocGen\LanguageHandler\Php\Parser\FilterCondition\PropertyFilterCondition\IsPrivateCondition; use PHPUnit\Framework\TestCase; diff --git a/tests/Unit/LanguageHandler/Php/Parser/FilterCondition/PropertyFilterCondition/IsProtectedConditionTest.php b/tests/Unit/LanguageHandler/Php/Parser/FilterCondition/PropertyFilterCondition/IsProtectedConditionTest.php index 3b68678f..01f319c5 100644 --- a/tests/Unit/LanguageHandler/Php/Parser/FilterCondition/PropertyFilterCondition/IsProtectedConditionTest.php +++ b/tests/Unit/LanguageHandler/Php/Parser/FilterCondition/PropertyFilterCondition/IsProtectedConditionTest.php @@ -4,7 +4,7 @@ namespace Test\Unit\LanguageHandler\Php\Parser\FilterCondition\PropertyFilterCondition; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\PropertyEntity; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Property\PropertyEntity; use BumbleDocGen\LanguageHandler\Php\Parser\FilterCondition\PropertyFilterCondition\IsProtectedCondition; use PHPUnit\Framework\TestCase; diff --git a/tests/Unit/LanguageHandler/Php/Parser/FilterCondition/PropertyFilterCondition/IsPublicConditionTest.php b/tests/Unit/LanguageHandler/Php/Parser/FilterCondition/PropertyFilterCondition/IsPublicConditionTest.php index 2132a9ac..61146608 100644 --- a/tests/Unit/LanguageHandler/Php/Parser/FilterCondition/PropertyFilterCondition/IsPublicConditionTest.php +++ b/tests/Unit/LanguageHandler/Php/Parser/FilterCondition/PropertyFilterCondition/IsPublicConditionTest.php @@ -4,7 +4,7 @@ namespace Test\Unit\LanguageHandler\Php\Parser\FilterCondition\PropertyFilterCondition; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\PropertyEntity; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Property\PropertyEntity; use BumbleDocGen\LanguageHandler\Php\Parser\FilterCondition\PropertyFilterCondition\IsPublicCondition; use PHPUnit\Framework\TestCase; diff --git a/tests/Unit/LanguageHandler/Php/Parser/FilterCondition/PropertyFilterCondition/VisibilityConditionTest.php b/tests/Unit/LanguageHandler/Php/Parser/FilterCondition/PropertyFilterCondition/VisibilityConditionTest.php index 31f9ebcc..e2d6e9a3 100644 --- a/tests/Unit/LanguageHandler/Php/Parser/FilterCondition/PropertyFilterCondition/VisibilityConditionTest.php +++ b/tests/Unit/LanguageHandler/Php/Parser/FilterCondition/PropertyFilterCondition/VisibilityConditionTest.php @@ -4,7 +4,7 @@ namespace Test\Unit\LanguageHandler\Php\Parser\FilterCondition\PropertyFilterCondition; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\PropertyEntity; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Property\PropertyEntity; use BumbleDocGen\LanguageHandler\Php\Parser\FilterCondition\ClassFilterCondition\VisibilityConditionModifier; use BumbleDocGen\LanguageHandler\Php\Parser\FilterCondition\PropertyFilterCondition\VisibilityCondition; use PHPUnit\Framework\TestCase; From 99daea2b5d658ee85f574b5b48891b47123ed870 Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Mon, 20 Nov 2023 16:58:04 +0300 Subject: [PATCH 063/210] Using different entities for different class types --- .../TwigFilterClassParserPlugin.php | 6 +- .../TwigFunctionClassParserPlugin.php | 6 +- ...ndEntitiesClassesByCollectionClassName.php | 11 +- src/AI/Generators/DocBlocksGenerator.php | 6 +- src/AI/Generators/ReadmeTemplateGenerator.php | 6 +- src/DocGenerator.php | 16 +- .../Php/Parser/Entity/BaseEntity.php | 33 +- .../Cache/CacheablePhpEntityFactory.php | 49 +- .../Php/Parser/Entity/ClassEntity.php | 1143 +---------------- .../Parser/Entity/ClassEntityCollection.php | 40 +- .../Php/Parser/Entity/ClassLikeEntity.php | 1049 +++++++++++++++ .../Parser/Entity/Constant/ConstantEntity.php | 8 +- .../Constant/ConstantEntityCollection.php | 4 +- .../Php/Parser/Entity/EnumEntity.php | 71 + .../Php/Parser/Entity/InterfaceEntity.php | 28 + .../Entity/Method/DynamicMethodEntity.php | 8 +- .../Php/Parser/Entity/Method/MethodEntity.php | 8 +- .../Entity/Method/MethodEntityCollection.php | 4 +- .../Entity/Method/MethodEntityInterface.php | 4 +- .../Parser/Entity/Property/PropertyEntity.php | 8 +- .../Property/PropertyEntityCollection.php | 4 +- .../Php/Parser/Entity/TraitEntity.php | 29 + .../Php/Parser/ParserHelper.php | 10 +- .../Parser/PhpParser/NodeValueCompiler.php | 18 +- .../Entity/OnCheckIsClassEntityCanBeLoad.php | 6 +- .../Parser/OnAddClassEntityToCollection.php | 6 +- .../PhpClassToMd/PhpClassToMdDocRenderer.php | 4 +- .../Renderer/Twig/Function/DrawClassMap.php | 4 +- 28 files changed, 1345 insertions(+), 1244 deletions(-) create mode 100644 src/LanguageHandler/Php/Parser/Entity/ClassLikeEntity.php create mode 100644 src/LanguageHandler/Php/Parser/Entity/EnumEntity.php create mode 100644 src/LanguageHandler/Php/Parser/Entity/InterfaceEntity.php create mode 100644 src/LanguageHandler/Php/Parser/Entity/TraitEntity.php diff --git a/selfdoc/Plugin/TwigFilterClassParser/TwigFilterClassParserPlugin.php b/selfdoc/Plugin/TwigFilterClassParser/TwigFilterClassParserPlugin.php index 23330990..30e02dad 100644 --- a/selfdoc/Plugin/TwigFilterClassParser/TwigFilterClassParserPlugin.php +++ b/selfdoc/Plugin/TwigFilterClassParser/TwigFilterClassParserPlugin.php @@ -10,7 +10,7 @@ use BumbleDocGen\Core\Plugin\PluginInterface; use BumbleDocGen\Core\Renderer\Context\RendererContext; use BumbleDocGen\Core\Renderer\Twig\Filter\CustomFilterInterface; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection; use BumbleDocGen\LanguageHandler\Php\Plugin\Event\Parser\AfterLoadingClassEntityCollection; use BumbleDocGen\LanguageHandler\Php\Renderer\EntityDocRenderer\PhpClassToMd\PhpClassToMdDocRenderer; @@ -52,7 +52,7 @@ public function onLoadEntityDocPluginContentEvent(OnLoadEntityDocPluginContent $ } $entity = $event->getEntity(); - if (!is_a($entity, ClassEntity::class) || !$this->isCustomTwigFilter($event->getEntity())) { + if (!is_a($entity, ClassLikeEntity::class) || !$this->isCustomTwigFilter($event->getEntity())) { return; } @@ -87,7 +87,7 @@ public function afterLoadingClassEntityCollection(AfterLoadingClassEntityCollect /** * @throws InvalidConfigurationParameterException */ - private function isCustomTwigFilter(ClassEntity $classEntity): bool + private function isCustomTwigFilter(ClassLikeEntity $classEntity): bool { foreach (self::TWIG_FILTER_DIR_NAMES as $dirName) { if (!$classEntity->entityDataCanBeLoaded()) { diff --git a/selfdoc/Plugin/TwigFunctionClassParser/TwigFunctionClassParserPlugin.php b/selfdoc/Plugin/TwigFunctionClassParser/TwigFunctionClassParserPlugin.php index 7a8a1f5e..99bce11e 100644 --- a/selfdoc/Plugin/TwigFunctionClassParser/TwigFunctionClassParserPlugin.php +++ b/selfdoc/Plugin/TwigFunctionClassParser/TwigFunctionClassParserPlugin.php @@ -10,7 +10,7 @@ use BumbleDocGen\Core\Plugin\PluginInterface; use BumbleDocGen\Core\Renderer\Context\RendererContext; use BumbleDocGen\Core\Renderer\Twig\Function\CustomFunctionInterface; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection; use BumbleDocGen\LanguageHandler\Php\Plugin\Event\Parser\AfterLoadingClassEntityCollection; use BumbleDocGen\LanguageHandler\Php\Renderer\EntityDocRenderer\PhpClassToMd\PhpClassToMdDocRenderer; @@ -50,7 +50,7 @@ public function onLoadEntityDocPluginContentEvent(OnLoadEntityDocPluginContent $ } $entity = $event->getEntity(); - if (!is_a($entity, ClassEntity::class) || !$this->isCustomTwigFunction($event->getEntity())) { + if (!is_a($entity, ClassLikeEntity::class) || !$this->isCustomTwigFunction($event->getEntity())) { return; } @@ -85,7 +85,7 @@ public function afterLoadingClassEntityCollection(AfterLoadingClassEntityCollect /** * @throws InvalidConfigurationParameterException */ - private function isCustomTwigFunction(ClassEntity $classEntity): bool + private function isCustomTwigFunction(ClassLikeEntity $classEntity): bool { foreach (self::TWIG_FUNCTION_DIR_NAMES as $dirName) { if ($classEntity->implementsInterface(CustomFunctionInterface::class) && str_starts_with($classEntity->getFileName(), $dirName)) { diff --git a/selfdoc/Twig/CustomFunction/FindEntitiesClassesByCollectionClassName.php b/selfdoc/Twig/CustomFunction/FindEntitiesClassesByCollectionClassName.php index e11f8c17..cb888f3b 100644 --- a/selfdoc/Twig/CustomFunction/FindEntitiesClassesByCollectionClassName.php +++ b/selfdoc/Twig/CustomFunction/FindEntitiesClassesByCollectionClassName.php @@ -7,7 +7,7 @@ use BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException; use BumbleDocGen\Core\Parser\Entity\RootEntityCollectionsGroup; use BumbleDocGen\Core\Renderer\Twig\Function\CustomFunctionInterface; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection; use DI\DependencyException; use DI\NotFoundException; @@ -19,7 +19,7 @@ public function __construct(private RootEntityCollectionsGroup $rootEntityCollec } /** - * @return ClassEntity[] + * @return ClassLikeEntity[] * @throws DependencyException * @throws NotFoundException * @throws InvalidConfigurationParameterException @@ -29,13 +29,16 @@ public function __invoke(string $collectionName): array $classEntityCollection = $this->rootEntityCollectionsGroup->get(ClassEntityCollection::NAME); /** - * @var ClassEntity $findCollectionEntity + * @var ClassLikeEntity $findCollectionEntity */ $findCollectionEntity = $classEntityCollection->findEntity($collectionName); $addMethodEntity = $findCollectionEntity->getMethodEntity('add'); + if (!$addMethodEntity) { + return []; + } $firstParam = $addMethodEntity->getParameters()[0]; /** - * @var ClassEntity $firstParamEntity + * @var ClassLikeEntity $firstParamEntity */ $firstParamEntity = $classEntityCollection->findEntity($firstParam['type']); diff --git a/src/AI/Generators/DocBlocksGenerator.php b/src/AI/Generators/DocBlocksGenerator.php index 0262c0aa..0ca22094 100644 --- a/src/AI/Generators/DocBlocksGenerator.php +++ b/src/AI/Generators/DocBlocksGenerator.php @@ -7,7 +7,7 @@ use BumbleDocGen\AI\ProviderInterface; use BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException; use BumbleDocGen\Core\Parser\Entity\RootEntityInterface; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Method\MethodEntity; use BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper; use DI\DependencyException; @@ -31,7 +31,7 @@ public function __construct( */ public function hasMethodsWithoutDocBlocks(RootEntityInterface $rootEntity): bool { - if (!is_a($rootEntity, ClassEntity::class)) { + if (!is_a($rootEntity, ClassLikeEntity::class)) { throw new \InvalidArgumentException('Currently we can only work PHP class entities'); } foreach ($rootEntity->getMethodEntityCollection() as $method) { @@ -54,7 +54,7 @@ public function generateDocBlocksForMethodsWithoutIt( RootEntityInterface $rootEntity, int $mode = self::MODE_READ_ONLY_SIGNATURES, ): array { - if (!is_a($rootEntity, ClassEntity::class)) { + if (!is_a($rootEntity, ClassLikeEntity::class)) { throw new \InvalidArgumentException('Currently we can only work PHP class entities'); } diff --git a/src/AI/Generators/ReadmeTemplateGenerator.php b/src/AI/Generators/ReadmeTemplateGenerator.php index e2bc03e2..7251b8e6 100644 --- a/src/AI/Generators/ReadmeTemplateGenerator.php +++ b/src/AI/Generators/ReadmeTemplateGenerator.php @@ -7,7 +7,7 @@ use BumbleDocGen\AI\ProviderInterface; use BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException; use BumbleDocGen\Core\Parser\Entity\RootEntityCollection; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection; use DI\DependencyException; use DI\NotFoundException; @@ -22,7 +22,7 @@ public function __construct( /** * @param RootEntityCollection $rootEntityCollection - * @param ClassEntity[] $entryPoints + * @param ClassLikeEntity[] $entryPoints * @param string|null $composerJsonFile * @param string|null $additionalPrompt * @return string @@ -41,7 +41,7 @@ public function generateReadmeFileContent( } $namespacesList = array_map( - fn(ClassEntity $e) => $e->getNamespaceName(), + fn(ClassLikeEntity $e) => $e->getNamespaceName(), iterator_to_array($rootEntityCollection) ); diff --git a/src/DocGenerator.php b/src/DocGenerator.php index 1b176cbf..967aa23d 100644 --- a/src/DocGenerator.php +++ b/src/DocGenerator.php @@ -11,12 +11,14 @@ use BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException; use BumbleDocGen\Core\Logger\Handler\GenerationErrorsHandler; use BumbleDocGen\Core\Parser\Entity\RootEntityCollectionsGroup; +use BumbleDocGen\Core\Parser\Entity\RootEntityInterface; use BumbleDocGen\Core\Parser\ProjectParser; use BumbleDocGen\Core\Plugin\PluginEventDispatcher; use BumbleDocGen\Core\Renderer\Renderer; use BumbleDocGen\Core\Renderer\Twig\Filter\AddIndentFromLeft; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\InterfaceEntity; use BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper; use DI\DependencyException; use DI\NotFoundException; @@ -99,7 +101,7 @@ public function addDocBlocks( &$alreadyProcessedEntities ): Generator { foreach ($entitiesCollection as $classEntity) { - /**@var ClassEntity $classEntity */ + /**@var ClassLikeEntity $classEntity */ if ( !$classEntity->entityDataCanBeLoaded() || array_key_exists( $classEntity->getName(), @@ -122,7 +124,7 @@ public function addDocBlocks( }; foreach ($getEntities($entitiesCollection) as $entity) { - /**@var ClassEntity $entity */ + /**@var ClassLikeEntity $entity */ if (!$missingDocBlocksGenerator->hasMethodsWithoutDocBlocks($entity)) { $this->logger->notice("Skipping `{$entity->getName()}`class. All methods are already documented"); } @@ -256,6 +258,14 @@ public function generate(): void try { $this->parser->parse(); +//RootEntityInterface + $in = $this->rootEntityCollectionsGroup->get(ClassEntityCollection::NAME)->get(RootEntityInterface::class); + /* var_dump($in->getParentClassNames()); + + $r = new \ReflectionClass(RootEntityInterface::class); + var_dump($r->getParentClass()); + die();*/ + $this->renderer->run(); } catch (Exception $e) { $this->logger->critical( diff --git a/src/LanguageHandler/Php/Parser/Entity/BaseEntity.php b/src/LanguageHandler/Php/Parser/Entity/BaseEntity.php index 4201b78f..dba3ebb2 100644 --- a/src/LanguageHandler/Php/Parser/Entity/BaseEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/BaseEntity.php @@ -13,7 +13,6 @@ use BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait; use BumbleDocGen\Core\Parser\Entity\Cache\CacheableMethod; use BumbleDocGen\Core\Parser\Entity\EntityInterface; -use BumbleDocGen\Core\Parser\Entity\RootEntityInterface; use BumbleDocGen\Core\Renderer\RendererHelper; use BumbleDocGen\Core\Renderer\Twig\Function\GetDocumentedEntityUrl; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Constant\ConstantEntity; @@ -47,11 +46,11 @@ protected function __construct( */ abstract public function getAst(): \PhpParser\Node\Stmt; - abstract public function getImplementingClass(): ClassEntity; + abstract public function getImplementingClass(): ClassLikeEntity; abstract protected function getDocCommentRecursive(): string; - abstract public function getDocCommentEntity(): ClassEntity|MethodEntity|PropertyEntity|ConstantEntity; + abstract public function getDocCommentEntity(): ClassLikeEntity|MethodEntity|PropertyEntity|ConstantEntity; abstract public function getDescription(): string; @@ -147,22 +146,6 @@ public function getObjectId(): string return $this->getName(); } - protected function prettyVarExport(mixed $expression): string - { - $export = var_export($expression, true); - $patterns = [ - "/array \(/" => '[', - "/^([ ]*)\)(,?)$/m" => '$1]$2', - "/=>[ ]?\n[ ]+\[/" => '=> [', - "/([ ]*)(\'[^\']+\') => ([\[\'])/" => '$1$2 => $3', - ]; - return str_replace( - PHP_EOL, - ' ', - preg_replace(array_keys($patterns), array_values($patterns), $export) - ); - } - public function isInternal(): bool { $docBlock = $this->getDocBlock(); @@ -194,7 +177,7 @@ public function hasDescriptionLinks(): bool $docBlock = $this->getDocBlock(); $getDocCommentEntity = $this->getDocCommentEntity(); - if (is_a($getDocCommentEntity, ClassEntity::class)) { + if (is_a($getDocCommentEntity, ClassLikeEntity::class)) { $docCommentImplementingClass = $getDocCommentEntity; } elseif (method_exists($getDocCommentEntity, 'getImplementingClass')) { $docCommentImplementingClass = $getDocCommentEntity->getImplementingClass(); @@ -288,7 +271,7 @@ public function hasDescriptionLinks(): bool 'description' => $description, ]; } else { - $currentClassEntity = is_a($docCommentImplementingClass, ClassEntity::class) ? $docCommentImplementingClass : $docCommentImplementingClass->getRootEntity(); + $currentClassEntity = is_a($docCommentImplementingClass, ClassLikeEntity::class) ? $docCommentImplementingClass : $docCommentImplementingClass->getRootEntity(); $className = $this->parserHelper->parseFullClassName( $name, $currentClassEntity @@ -490,9 +473,9 @@ public function getDocNote(): string return (string)$docComment?->getReformattedText(); } - public function getCurrentRootEntity(): ?RootEntityInterface + public function getCurrentRootEntity(): ?ClassLikeEntity { - if (is_a($this, RootEntityInterface::class)) { + if (is_a($this, ClassLikeEntity::class)) { return $this; } elseif (method_exists($this, 'getRootEntity')) { return $this->getRootEntity(); @@ -507,6 +490,7 @@ protected function getEntityDependenciesCacheKey(): string /** * @throws InvalidArgumentException + * @throws InvalidConfigurationParameterException */ final public function getCachedEntityDependencies(): array { @@ -525,6 +509,7 @@ final public function getCachedEntityDependencies(): array /** * @throws InvalidArgumentException + * @throws InvalidConfigurationParameterException */ final public function reloadEntityDependenciesCache(): array { @@ -613,7 +598,7 @@ final public function entityCacheIsOutdated(): bool $rootEntityResult = $this->localObjectCache->getMethodCachedResult(__METHOD__, $entityName); if (!$rootEntityResult) { return false; - } elseif (is_a($this, ClassEntity::class)) { + } elseif (is_a($this, ClassLikeEntity::class)) { return true; } return $this->isSubEntityFileCacheIsOutdated(__METHOD__); diff --git a/src/LanguageHandler/Php/Parser/Entity/Cache/CacheablePhpEntityFactory.php b/src/LanguageHandler/Php/Parser/Entity/Cache/CacheablePhpEntityFactory.php index 65012650..bb8c4d32 100644 --- a/src/LanguageHandler/Php/Parser/Entity/Cache/CacheablePhpEntityFactory.php +++ b/src/LanguageHandler/Php/Parser/Entity/Cache/CacheablePhpEntityFactory.php @@ -6,13 +6,19 @@ use BumbleDocGen\Core\Cache\LocalCache\Exception\ObjectNotFoundException; use BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache; +use BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException; use BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityWrapperFactory; +use BumbleDocGen\LanguageHandler\Php\Parser\ComposerHelper; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Constant\ConstantEntity; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\EnumEntity; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\InterfaceEntity; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Method\DynamicMethodEntity; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Method\MethodEntity; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Property\PropertyEntity; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\TraitEntity; use DI\Container; use DI\DependencyException; use DI\NotFoundException; @@ -22,6 +28,7 @@ final class CacheablePhpEntityFactory { public function __construct( private CacheableEntityWrapperFactory $cacheableEntityWrapperFactory, + private ComposerHelper $composerHelper, private LocalObjectCache $localObjectCache, private Container $diContainer ) { @@ -32,7 +39,7 @@ public function __construct( * @throws NotFoundException */ public function createPropertyEntity( - ClassEntity $classEntity, + ClassLikeEntity $classEntity, string $propertyName, string $implementingClassName ): PropertyEntity { @@ -56,7 +63,7 @@ public function createPropertyEntity( * @throws NotFoundException */ public function createConstantEntity( - ClassEntity $classEntity, + ClassLikeEntity $classEntity, string $constantName, string $implementingClassName, bool $reloadCache = false @@ -82,7 +89,7 @@ public function createConstantEntity( * @throws NotFoundException */ public function createMethodEntity( - ClassEntity $classEntity, + ClassLikeEntity $classEntity, string $methodName, string $implementingClassName ): MethodEntity { @@ -106,7 +113,7 @@ public function createMethodEntity( * @throws NotFoundException */ public function createDynamicMethodEntity( - ClassEntity $classEntity, + ClassLikeEntity $classEntity, Method $annotationMethod ): DynamicMethodEntity { $objectId = "{$classEntity->getName()}:{$annotationMethod->getMethodName()}"; @@ -126,19 +133,39 @@ public function createDynamicMethodEntity( /** * @throws DependencyException * @throws NotFoundException + * @throws InvalidConfigurationParameterException */ - public function createClassEntity( + public function createClassLikeEntity( ClassEntityCollection $classEntityCollection, string $className, ?string $relativeFileName = null - ): ClassEntity { + ): ClassLikeEntity { $className = ltrim(str_replace('\\\\', '\\', $className), '\\'); $objectId = md5($className); try { return $this->localObjectCache->getMethodCachedResult(__METHOD__, $objectId); } catch (ObjectNotFoundException) { } - $wrapperClassName = $this->getOrCreateEntityClassWrapper(ClassEntity::class); + + $fileName = $this->composerHelper->getComposerClassLoader()->findFile($className); + $entityClassName = ClassEntity::class; + if ($fileName) { + $shortClassNameLS = mb_strtolower(array_reverse(explode('\\', $className))[0]); + preg_match( + '/^(\s+)?(interface|trait|((final|abstract)\s+)?class|enum)(\s+)(' . $shortClassNameLS . ')/m', + mb_strtolower(file_get_contents($fileName)), + $matches + ); + $entityClassName = match ($matches[2] ?? '') { + 'interface' => InterfaceEntity::class, + 'trait' => TraitEntity::class, + 'enum' => EnumEntity::class, + default => ClassEntity::class + }; + } + + $wrapperClassName = $this->getOrCreateEntityClassWrapper($entityClassName); + /** @var ClassLikeEntity $classEntity */ $classEntity = $this->diContainer->make($wrapperClassName, [ 'classEntityCollection' => $classEntityCollection, 'className' => $className, @@ -157,10 +184,10 @@ public function createSubClassEntity( ClassEntityCollection $classEntityCollection, string $className, ?string $relativeFileName - ): ClassEntity { - if (!is_a($subClassEntity, ClassEntity::class, true)) { - throw new \Exception( - 'The class must inherit from `BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity`' + ): ClassLikeEntity { + if (!is_a($subClassEntity, ClassLikeEntity::class, true)) { + throw new \RuntimeException( + 'The class must inherit from `' . ClassEntity::class . '`' ); } $className = ltrim(str_replace('\\\\', '\\', $className), '\\'); diff --git a/src/LanguageHandler/Php/Parser/Entity/ClassEntity.php b/src/LanguageHandler/Php/Parser/Entity/ClassEntity.php index bdb10f8a..364e18a6 100644 --- a/src/LanguageHandler/Php/Parser/Entity/ClassEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/ClassEntity.php @@ -4,438 +4,33 @@ namespace BumbleDocGen\LanguageHandler\Php\Parser\Entity; -use BumbleDocGen\Core\Cache\LocalCache\Exception\ObjectNotFoundException; -use BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache; -use BumbleDocGen\Core\Configuration\Configuration; use BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException; use BumbleDocGen\Core\Parser\Entity\Cache\CacheableMethod; -use BumbleDocGen\Core\Parser\Entity\RootEntityInterface; -use BumbleDocGen\Core\Renderer\Context\DocumentTransformableEntityInterface; -use BumbleDocGen\Core\Renderer\EntityDocRenderer\EntityDocRendererInterface; -use BumbleDocGen\Core\Renderer\Twig\Filter\PrepareSourceLink; -use BumbleDocGen\LanguageHandler\Php\Parser\ComposerHelper; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Constant\ConstantEntity; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Constant\ConstantEntityCollection; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Method\MethodEntity; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Method\MethodEntityCollection; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Property\PropertyEntity; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Property\PropertyEntityCollection; -use BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper; -use BumbleDocGen\LanguageHandler\Php\Parser\PhpParser\NodeValueCompiler; -use BumbleDocGen\LanguageHandler\Php\Parser\PhpParser\PhpParserHelper; -use BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings; -use DI\Attribute\Inject; -use DI\Container; -use DI\DependencyException; -use DI\NotFoundException; -use phpDocumentor\Reflection\DocBlock; -use PhpParser\ConstExprEvaluationException; -use PhpParser\Node; -use PhpParser\Node\Stmt\Class_ as ClassNode; -use PhpParser\Node\Stmt\ClassConst as ConstNode; -use PhpParser\Node\Stmt\ClassMethod as MethodNode; -use PhpParser\Node\Stmt\Enum_ as EnumNode; -use PhpParser\Node\Stmt\EnumCase as EnumCaseNode; -use PhpParser\Node\Stmt\Interface_ as InterfaceNode; -use PhpParser\Node\Stmt\Namespace_ as NamespaceNode; -use PhpParser\Node\Stmt\Property as PropertyNode; -use PhpParser\Node\Stmt\Trait_ as TraitNode; -use PhpParser\NodeTraverser; -use PhpParser\NodeVisitor\NameResolver; -use Psr\Log\LoggerInterface; -/** - * Class entity - */ -class ClassEntity extends BaseEntity implements DocumentTransformableEntityInterface, RootEntityInterface +class ClassEntity extends ClassLikeEntity { - #[Inject] private Container $diContainer; - - private array $pluginsData = []; - private bool $relativeFileNameLoaded = false; - private bool $isClassLoad = false; - - public function __construct( - private Configuration $configuration, - private PhpHandlerSettings $phpHandlerSettings, - private ClassEntityCollection $classEntityCollection, - private ParserHelper $parserHelper, - private ComposerHelper $composerHelper, - private PhpParserHelper $phpParserHelper, - private LocalObjectCache $localObjectCache, - private LoggerInterface $logger, - private string $className, - private ?string $relativeFileName, - ) { - parent::__construct( - $configuration, - $localObjectCache, - $parserHelper, - $logger - ); - if ($relativeFileName) { - $this->relativeFileNameLoaded = true; - } - } - - public static function isEntityNameValid(string $entityName): bool - { - return ParserHelper::isCorrectClassName($entityName); - } - - public function getObjectId(): string + public function isClass(): bool { - return $this->className; - } - - public function isExternalLibraryEntity(): bool - { - return !is_null($this->composerHelper->getComposerPackageDataByClassName($this->getName())); - } - - public function getPhpHandlerSettings(): PhpHandlerSettings - { - return $this->phpHandlerSettings; - } - - public function getRootEntityCollection(): ClassEntityCollection - { - return $this->classEntityCollection; + return true; } /** - * {@inheritDoc} * @throws InvalidConfigurationParameterException - * @throws \Exception */ - public function getEntityDependencies(): array - { - $fileDependencies = []; - if ($this->isClassLoad()) { - $parentClassNames = $this->getParentClassNames(); - $traitClassNames = $this->getTraitsNames(); - $interfaceNames = $this->getInterfaceNames(); - - $classNames = array_unique(array_merge($parentClassNames, $traitClassNames, $interfaceNames)); - $classNames = array_filter( - $classNames, - function (string $className): bool { - return !$this->composerHelper->getComposerPackageDataByClassName($className) && !$this->parserHelper->isBuiltInClass($className); - } - ); - - $reflections = array_map(fn(string $className) => $this->getRootEntityCollection()->getLoadedOrCreateNew($className), $classNames); - $reflections[] = $this; - foreach ($reflections as $reflectionClass) { - $relativeFileName = $reflectionClass->getRelativeFileName(); - if ($relativeFileName) { - $fileName = $this->configuration->getProjectRoot() . '/' . $relativeFileName; - $fileDependencies[$relativeFileName] = md5_file($fileName); - } - } - } - return $fileDependencies; - } - - /** - * @throws NotFoundException - * @throws DependencyException - * @throws InvalidConfigurationParameterException - */ - public function getDocBlock(): DocBlock - { - $classEntity = $this->getDocCommentEntity(); - return $this->parserHelper->getDocBlock($classEntity, $this->getDocCommentRecursive()); - } - - /** - * Checking if class file is in git repository - */ - public function isInGit(): bool - { - try { - if (!$this->getFileName()) { - return false; - } - $filesInGit = $this->parserHelper->getFilesInGit(); - $fileName = ltrim($this->getFileName(), DIRECTORY_SEPARATOR); - return isset($filesInGit[$fileName]); - } catch (\Exception) { - } - return false; - } - - /** - * @throws InvalidConfigurationParameterException - */ - public function documentCreationAllowed(): bool - { - return !$this->configuration->isCheckFileInGitBeforeCreatingDocEnabled() || $this->isInGit(); - } - - /** - * @throws NotFoundException - * @throws DependencyException - * @throws InvalidConfigurationParameterException - */ - public function getDocCommentEntity(): ClassEntity - { - $objectId = $this->getObjectId(); - try { - return $this->localObjectCache->getMethodCachedResult(__METHOD__, $objectId); - } catch (ObjectNotFoundException) { - } - $docComment = $this->getDocComment(); - $classEntity = $this; - if (!$docComment || str_contains(mb_strtolower($docComment), '@inheritdoc')) { - $parentReflectionClass = $this->getParentClass(); - if ($parentReflectionClass && $parentReflectionClass->entityDataCanBeLoaded()) { - $classEntity = $parentReflectionClass->getDocCommentEntity(); - } - } - $this->localObjectCache->cacheMethodResult(__METHOD__, $objectId, $classEntity); - return $classEntity; - } - - /** - * @throws NotFoundException - * @throws DependencyException - * @throws InvalidConfigurationParameterException - */ - protected function getDocCommentRecursive(): string - { - return $this->getDocCommentEntity()->getDocComment() ?: ' '; - } - - public function loadPluginData(string $pluginKey, array $data): void - { - $this->pluginsData[$pluginKey] = $data; - } - - public function getPluginData(string $pluginKey): ?array - { - return $this->pluginsData[$pluginKey] ?? null; - } - - public function setCustomAst(TraitNode|EnumNode|InterfaceNode|ClassNode|null $customAst): void - { - $objectId = $this->getObjectId(); - $this->isClassLoad = true; - $this->localObjectCache->cacheMethodResult(__CLASS__ . '::getAst', $objectId, $customAst); - } - /** - * @throws \RuntimeException - * @throws InvalidConfigurationParameterException - */ - public function getAst(): ClassNode|InterfaceNode|TraitNode|EnumNode - { - $objectId = $this->getObjectId(); - try { - return $this->localObjectCache->getMethodCachedResult(__METHOD__, $objectId); - } catch (ObjectNotFoundException) { - } - - $ast = null; - $nodes = $this->phpParserHelper->phpParser()->parse($this->getFileContent()); - $nodeTraverser = new NodeTraverser(); - $nodeTraverser->addVisitor(new NameResolver()); - $nodes = $nodeTraverser->traverse($nodes); - foreach ($nodes as $node) { - if (in_array(get_class($node), [ClassNode::class, InterfaceNode::class, TraitNode::class, EnumNode::class])) { - $className = $node->name->toString(); - if ($className === $this->getName()) { - $ast = $node; - break; - } - } elseif (!$node instanceof NamespaceNode) { - continue; - } - $namespaceName = $node->name->toString(); - foreach ($node->stmts as $subNode) { - if (!in_array(get_class($subNode), [ClassNode::class, InterfaceNode::class, TraitNode::class, EnumNode::class])) { - continue; - } - $className = "{$namespaceName}\\{$subNode->name->toString()}"; - if ($className === $this->getName()) { - $ast = $subNode; - break 2; - } - } - } - - if (!$ast) { - throw new \RuntimeException("Entity `{$this->getName()}` not found"); - } - $this->isClassLoad = true; - $this->localObjectCache->cacheMethodResult(__METHOD__, $objectId, $ast); - return $ast; - } - - public function getImplementingClass(): ClassEntity - { - return $this; - } - - public function getName(): string - { - return $this->className; - } - - /** - * @internal - */ - public function isClassLoad(): bool - { - if (!$this->isClassLoad) { - try { - $this->isClassLoad = ParserHelper::isCorrectClassName($this->getName()) && $this->getRelativeFileName(); - } catch (\Exception) { - $this->isClassLoad = false; - } - } - return $this->isClassLoad; - } - - /** - * @throws InvalidConfigurationParameterException - */ - #[CacheableMethod] public function entityDataCanBeLoaded(): bool + #[CacheableMethod] public function isInstantiable(): bool { - if (!$this->isCurrentEntityCanBeLoad()) { - $this->logger->notice("Class `{$this->getName()}` loading skipped by plugin"); + if ($this->isAbstract()) { return false; } - return !$this->isExternalLibraryEntity() && $this->isEntityFileCanBeLoad(); - } - - public function getShortName(): string - { - $nameParts = explode('\\', $this->getName()); - return end($nameParts); - } - - #[CacheableMethod] public function getNamespaceName(): string - { - $namespaceParts = explode('\\', $this->getName()); - if (count($namespaceParts) < 2) { - return ''; - } - array_pop($namespaceParts); - return implode('\\', $namespaceParts); - } - - /** - * @throws InvalidConfigurationParameterException - */ - public function getRelativeFileName(bool $loadIfEmpty = true): ?string - { - if (!$this->relativeFileNameLoaded && $loadIfEmpty) { - $this->relativeFileNameLoaded = true; - $fileName = $this->composerHelper->getComposerClassLoader()->findFile($this->getName()); - $projectRoot = $this->configuration->getProjectRoot(); - if (!$fileName || !str_starts_with($fileName, $projectRoot)) { - return null; - } - $this->relativeFileName = str_replace( - [$projectRoot, '//'], - ['', '/'], - $fileName - ); - } - return $this->relativeFileName; - } - - /** - * {@inheritDoc} - * @throws InvalidConfigurationParameterException - */ - public function getFileName(): ?string - { - return $this->getRelativeFileName(); - } - - /** - * @throws InvalidConfigurationParameterException - */ - public function getFullFileName(): ?string - { - $fileName = $this->getFileName(); - if (!$fileName) { - return $fileName; - } - return "{$this->configuration->getProjectRoot()}{$fileName}"; - } - - /** - * @throws InvalidConfigurationParameterException - */ - #[CacheableMethod] public function getStartLine(): int - { - return $this->getAst()->getStartLine(); - } - - /** - * @throws InvalidConfigurationParameterException - */ - #[CacheableMethod] public function getEndLine(): int - { - return $this->getAst()->getEndLine(); - } - - /** - * @throws InvalidConfigurationParameterException - */ - #[CacheableMethod] public function getModifiersString(): string - { - $modifiersString = []; - if (!$this->isInterface() && !$this->isEnum() && !$this->isTrait() && $this->getAst()->isFinal()) { - $modifiersString[] = 'final'; - } - - $isInterface = $this->isInterface(); - if ($isInterface) { - $modifiersString[] = 'interface'; - return implode(' ', $modifiersString); - } elseif ($this->isAbstract()) { - $modifiersString[] = 'abstract'; - } - - if ($this->isTrait()) { - $modifiersString[] = 'trait'; - } elseif ($this->isEnum()) { - $modifiersString[] = 'enum'; - } else { - $modifiersString[] = 'class'; - } - - return implode(' ', $modifiersString); - } - - /** - * @return ClassEntity[] $trait - * @throws InvalidConfigurationParameterException - */ - public function getTraits(): array - { - $traits = []; - foreach ($this->getTraitsNames() as $traitsName) { - $traits[] = $this->classEntityCollection->getLoadedOrCreateNew($traitsName); - } - return $traits; + return $this->getAst()->getMethod('__construct')?->isPublic() ?? true; } /** - * @return ClassEntity[] - * * @throws InvalidConfigurationParameterException */ - public function getInterfacesEntities(): array + #[CacheableMethod] public function isAbstract(): bool { - $interfacesEntities = []; - foreach ($this->getInterfaceNames() as $interfaceClassName) { - $interfacesEntities[] = $this->getRootEntityCollection()->getLoadedOrCreateNew($interfaceClassName); - } - return $interfacesEntities; + return $this->getAst()->isAbstract(); } /** @@ -448,87 +43,15 @@ public function getInterfacesEntities(): array if (!$this->entityDataCanBeLoaded()) { return []; } - if ($this->isInterface()) { - return $this->getInterfaceNames(); - } else { - try { - $parentClass = $this->getParentClass(); - if ($name = $parentClass?->getName()) { - return array_unique(array_merge(["\\{$name}"], $parentClass->getParentClassNames())); - } - } catch (\Exception $e) { - $this->logger->warning($e->getMessage()); - } - } - return []; - } - - /** - * @return ClassEntity[] - * @throws InvalidConfigurationParameterException - */ - public function getParentClassEntities(): array - { - return array_map( - fn(string $className) => $this->getRootEntityCollection()->getLoadedOrCreateNew($className), - $this->getParentClassNames() - ); - } - - /** - * @return string[] - * - * @throws InvalidConfigurationParameterException - */ - #[CacheableMethod] public function getInterfaceNames(): array - { - if (!$this->entityDataCanBeLoaded()) { - return []; - } - - if ($this->isTrait()) { - return []; - } - $objectId = $this->getObjectId(); try { - return $this->localObjectCache->getMethodCachedResult(__METHOD__, $objectId); - } catch (ObjectNotFoundException) { - } - - $interfaceNames = []; - - $node = $this->getAst(); - $nodes = $node instanceof InterfaceNode ? $node->extends : $node->implements; - $interfaces = array_map(static fn($n) => $n->toString(), $nodes ?? []); - foreach ($interfaces as $interfaceName) { - if ($interfaceName === $this->getName()) { - continue; - } - $parentInterfaceNames = []; - try { - $interfaceEntity = $this->getRootEntityCollection()->getLoadedOrCreateNew($interfaceName); - if ($interfaceEntity->entityDataCanBeLoaded()) { - $parentInterfaceNames = $interfaceEntity->getInterfaceNames(); - } - } catch (\Exception $e) { - $this->logger->error($e->getMessage()); - } - $interfaceNames = array_merge($interfaceNames, ["\\{$interfaceName}"], $parentInterfaceNames); - } - if (!$this->isInterface() && $parentClass = $this->getParentClass()) { - $parentInterfaceNames = []; - try { - if ($parentClass->entityDataCanBeLoaded()) { - $parentInterfaceNames = $parentClass->getInterfaceNames(); - } - } catch (\Exception $e) { - $this->logger->error($e->getMessage()); + $parentClass = $this->getParentClass(); + if ($name = $parentClass?->getName()) { + return array_unique(array_merge(["\\{$name}"], $parentClass->getParentClassNames())); } - $interfaceNames = array_merge($interfaceNames, $parentInterfaceNames); + } catch (\Exception $e) { + $this->logger->warning($e->getMessage()); } - $interfaceNames = array_unique($interfaceNames); - $this->localObjectCache->cacheMethodResult(__METHOD__, $objectId, $interfaceNames); - return $interfaceNames; + return []; } /** @@ -536,10 +59,10 @@ public function getParentClassEntities(): array */ #[CacheableMethod] public function getParentClassName(): ?string { - if (!$this->entityDataCanBeLoaded() || $this->isEnum()) { + if (!$this->entityDataCanBeLoaded()) { return null; } - if (!$this->isInterface() && !$this->isTrait() && $parentClassName = $this->getAst()->extends?->toString()) { + if ($parentClassName = $this->getAst()->extends?->toString()) { return '\\' . $parentClassName; } return null; @@ -548,7 +71,7 @@ public function getParentClassEntities(): array /** * @throws InvalidConfigurationParameterException */ - public function getParentClass(): ?ClassEntity + public function getParentClass(): ?ClassLikeEntity { $parentClassName = $this->getParentClassName(); if (!$parentClassName) { @@ -560,632 +83,16 @@ public function getParentClass(): ?ClassEntity /** * @throws InvalidConfigurationParameterException */ - #[CacheableMethod] public function getTraitsNames(): array - { - if (!$this->entityDataCanBeLoaded()) { - return []; - } - $traitsNames = []; - /**@var Node\Stmt\TraitUse[] $traitsNodes * */ - $traitsNodes = array_filter($this->getAst()->stmts, static fn(Node\Stmt $stmt): bool => $stmt instanceof Node\Stmt\TraitUse); - foreach ($traitsNodes as $node) { - foreach ($node->traits as $traitNode) { - $traitsNames[] = $traitNode->toString(); - } - } - return $traitsNames; - } - - /** - * @throws InvalidConfigurationParameterException - */ - public function hasTraits(): bool - { - return count($this->getTraitsNames()) > 0; - } - - /** - * @throws NotFoundException - * @throws DependencyException - * @throws InvalidConfigurationParameterException - */ - public function getConstantEntityCollection(): ConstantEntityCollection - { - $objectId = $this->getObjectId(); - try { - return $this->localObjectCache->getMethodCachedResult(__METHOD__, $objectId); - } catch (ObjectNotFoundException) { - } - $constantEntityCollection = $this->diContainer->make(ConstantEntityCollection::class, [ - 'classEntity' => $this - ]); - $constantEntityCollection->loadConstantEntities(); - $this->localObjectCache->cacheMethodResult(__METHOD__, $objectId, $constantEntityCollection); - return $constantEntityCollection; - } - - /** - * @throws NotFoundException - * @throws DependencyException - * @throws InvalidConfigurationParameterException - */ - public function getConstantEntity(string $constantName, bool $unsafe = true): ?ConstantEntity - { - $constantEntityCollection = $this->getConstantEntityCollection(); - if ($unsafe) { - return $constantEntityCollection->unsafeGet($constantName); - } - return $constantEntityCollection->get($constantName); - } - - /** - * @throws DependencyException - * @throws InvalidConfigurationParameterException - * @throws NotFoundException - */ - public function getPropertyEntityCollection(): PropertyEntityCollection - { - $objectId = $this->getObjectId(); - try { - return $this->localObjectCache->getMethodCachedResult(__METHOD__, $objectId); - } catch (ObjectNotFoundException) { - } - $propertyEntityCollection = $this->diContainer->make(PropertyEntityCollection::class, [ - 'classEntity' => $this - ]); - $propertyEntityCollection->loadPropertyEntities(); - $this->localObjectCache->cacheMethodResult(__METHOD__, $objectId, $propertyEntityCollection); - return $propertyEntityCollection; - } - - /** - * @throws NotFoundException - * @throws DependencyException - * @throws InvalidConfigurationParameterException - */ - public function getPropertyEntity(string $propertyName, bool $unsafe = true): ?PropertyEntity - { - $propertyEntityCollection = $this->getPropertyEntityCollection(); - if ($unsafe) { - return $propertyEntityCollection->unsafeGet($propertyName); - } - return $propertyEntityCollection->get($propertyName); - } - - /** - * @throws DependencyException - * @throws InvalidConfigurationParameterException - * @throws NotFoundException - */ - public function getMethodEntityCollection(): MethodEntityCollection - { - $objectId = $this->getObjectId(); - try { - return $this->localObjectCache->getMethodCachedResult(__METHOD__, $objectId); - } catch (ObjectNotFoundException) { - } - $methodEntityCollection = $this->diContainer->make(MethodEntityCollection::class, [ - 'classEntity' => $this - ]); - $methodEntityCollection->loadMethodEntities(); - $this->localObjectCache->cacheMethodResult(__METHOD__, $objectId, $methodEntityCollection); - return $methodEntityCollection; - } - - /** - * @throws NotFoundException - * @throws DependencyException - * @throws InvalidConfigurationParameterException - */ - public function getMethodEntity(string $methodName, bool $unsafe = true): ?MethodEntity - { - $methodEntityCollection = $this->getMethodEntityCollection(); - if ($unsafe) { - return $methodEntityCollection->unsafeGet($methodName); - } - return $methodEntityCollection->get($methodName); - } - - /** - * @throws NotFoundException - * @throws DependencyException - * @throws InvalidConfigurationParameterException - */ - public function getDescription(): string - { - $docBlock = $this->getDocBlock(); - return $docBlock->getSummary(); - } - - /** - * @throws InvalidConfigurationParameterException - */ - #[CacheableMethod] public function isEnum(): bool - { - return $this->getAst() instanceof EnumNode; - } - - /** - * @throws InvalidConfigurationParameterException - * @throws ConstExprEvaluationException - */ - #[CacheableMethod] public function getCasesNames(): array - { - return array_keys($this->getEnumCases()); - } - - /** - * @throws InvalidConfigurationParameterException - * @throws ConstExprEvaluationException - */ - #[CacheableMethod] public function getEnumCases(): array - { - if (!$this->entityDataCanBeLoaded() || !$this->isEnum()) { - return []; - } - - $enumCases = []; - /** @var EnumCaseNode[] $enumCaseNodes */ - $enumCaseNodes = array_filter( - $this->getAst()->stmts, - static fn(Node\Stmt $stmt): bool => $stmt instanceof EnumCaseNode, - ); - - foreach ($enumCaseNodes as $enumCaseNode) { - $enumCases[$enumCaseNode->name->toString()] = $enumCaseNode->expr ? NodeValueCompiler::compile($enumCaseNode->expr, $this) : null; - } - return $enumCases; - } - - /** - * @throws InvalidConfigurationParameterException - * @throws ConstExprEvaluationException - */ - #[CacheableMethod] public function getEnumCaseValue(string $name): mixed - { - return $this->getEnumCases()[$name] ?? null; - } - /** - * Returns the absolute path to a file if it can be retrieved and if the file is in the project directory - * @throws InvalidConfigurationParameterException - */ - public function getAbsoluteFileName(): ?string - { - $relativeFileName = $this->getRelativeFileName(); - return $relativeFileName ? $this->configuration->getProjectRoot() . $relativeFileName : null; - } - - /** - * @throws InvalidConfigurationParameterException - */ - public function getFileContent(): string - { - $objectId = $this->getObjectId(); - try { - return $this->localObjectCache->getMethodCachedResult(__METHOD__, $objectId); - } catch (ObjectNotFoundException) { - } - $fileContent = $this->getAbsoluteFileName() ? file_get_contents($this->getAbsoluteFileName()) : ''; - $this->localObjectCache->cacheMethodResult(__METHOD__, $objectId, $fileContent); - return $fileContent; - } - - /** - * @throws InvalidConfigurationParameterException - */ - #[CacheableMethod] public function getMethodsData( - bool $onlyFromCurrentClassAndTraits = false, - int $flags = MethodEntity::VISIBILITY_MODIFIERS_FLAG_ANY - ): array { - if (!$this->entityDataCanBeLoaded()) { - return []; - } - $methods = []; - /** @var MethodNode[] $methodNodes */ - $methodNodes = array_filter( - $this->getAst()->stmts, - static fn(Node\Stmt $stmt): bool => $stmt instanceof MethodNode, - ); - array_walk($methodNodes, fn(MethodNode $stmt) => $stmt->flags = $stmt->flags ?: MethodEntity::MODIFIERS_FLAG_IS_PUBLIC); - foreach ($methodNodes as $methodNode) { - if (($methodNode->flags & $flags) === 0) { - continue; - } - $methods[$methodNode->name->toString()] = $this->getName(); - } - - $flags &= ~ MethodEntity::MODIFIERS_FLAG_IS_PRIVATE; - foreach ($this->getTraits() as $traitEntity) { - if (!$traitEntity->entityDataCanBeLoaded()) { - continue; - } - foreach ($traitEntity->getMethodsData(true, $flags) as $name => $methodsData) { - if (array_key_exists($name, $methods)) { - continue; - } - $methods[$name] = $methodsData; - } - } - - if (!$onlyFromCurrentClassAndTraits) { - foreach ($this->getParentClassEntities() as $parentClassEntity) { - if (!$parentClassEntity->entityDataCanBeLoaded()) { - continue; - } - foreach ($parentClassEntity->getMethodsData(true, $flags) as $name => $methodsData) { - if (array_key_exists($name, $methods)) { - continue; - } - $methods[$name] = $methodsData; - } - } - - foreach ($this->getInterfacesEntities() as $interfacesEntity) { - if (!$interfacesEntity->entityDataCanBeLoaded()) { - continue; - } - foreach ($interfacesEntity->getMethodsData(true, $flags) as $name => $methodsData) { - if (array_key_exists($name, $methods)) { - continue; - } - $methods[$name] = $methodsData; - } - } - } - - return $methods; - } - - /** - * @throws InvalidConfigurationParameterException - */ - #[CacheableMethod] public function getPropertiesData( - bool $onlyFromCurrentClassAndTraits = false, - int $flags = PropertyEntity::VISIBILITY_MODIFIERS_FLAG_ANY - ): array { - if (!$this->entityDataCanBeLoaded()) { - return []; - } - $properties = []; - /** @var PropertyNode[] $propertyNodes */ - $propertyNodes = array_filter( - $this->getAst()->stmts, - static fn(Node\Stmt $stmt): bool => $stmt instanceof PropertyNode, - ); - array_walk($propertyNodes, fn(PropertyNode $stmt) => $stmt->flags = $stmt->flags ?: PropertyEntity::MODIFIERS_FLAG_IS_PUBLIC); - foreach ($propertyNodes as $node) { - if (($node->flags & $flags) === 0) { - continue; - } - foreach ($node->props as $propertyNode) { - $properties[$propertyNode->name->toString()] = $this->getName(); - } - } - - $flags &= ~ PropertyEntity::MODIFIERS_FLAG_IS_PRIVATE; - foreach ($this->getTraits() as $traitEntity) { - foreach ($traitEntity->getPropertiesData(true, $flags) as $name => $propertyData) { - if (!$traitEntity->entityDataCanBeLoaded()) { - continue; - } - if (array_key_exists($name, $properties)) { - continue; - } - $properties[$name] = $propertyData; - } - } - if (!$onlyFromCurrentClassAndTraits) { - foreach ($this->getParentClassEntities() as $parentClassEntity) { - if (!$parentClassEntity->entityDataCanBeLoaded()) { - continue; - } - foreach ($parentClassEntity->getPropertiesData(true, $flags) as $name => $propertyData) { - if (array_key_exists($name, $properties)) { - continue; - } - $properties[$name] = $propertyData; - } - } - } - return $properties; - } - - /** - * @throws InvalidConfigurationParameterException - */ - #[CacheableMethod] public function getConstantsData( - bool $onlyFromCurrentClassAndTraits = false, - int $flags = ConstantEntity::VISIBILITY_MODIFIERS_FLAG_ANY - ): array { - if (!$this->entityDataCanBeLoaded()) { - return []; - } - $constants = []; - /** @var ConstNode[] $constNodes */ - $constNodes = array_filter( - $this->getAst()->stmts, - static fn(Node\Stmt $stmt): bool => $stmt instanceof ConstNode, - ); - array_walk($constNodes, fn(ConstNode $stmt) => $stmt->flags = $stmt->flags ?: ConstantEntity::MODIFIERS_FLAG_IS_PUBLIC); - foreach ($constNodes as $constNode) { - if (($constNode->flags & $flags) === 0) { - continue; - } - foreach ($constNode->consts as $constant) { - $constants[$constant->name->toString()] = $this->getName(); - } - } - - $flags &= ~ ConstantEntity::MODIFIERS_FLAG_IS_PRIVATE; - foreach ($this->getTraits() as $traitEntity) { - if (!$traitEntity->entityDataCanBeLoaded()) { - continue; - } - foreach ($traitEntity->getConstantsData(true, $flags) as $name => $constantsData) { - if (array_key_exists($name, $constants)) { - continue; - } - $constants[$name] = $constantsData; - } - } - - if (!$onlyFromCurrentClassAndTraits) { - foreach ($this->getParentClassEntities() as $parentClassEntity) { - if (!$parentClassEntity->entityDataCanBeLoaded()) { - continue; - } - foreach ($parentClassEntity->getConstantsData(true, $flags) as $name => $constantsData) { - if (array_key_exists($name, $constants)) { - continue; - } - $constants[$name] = $constantsData; - } - } - - foreach ($this->getInterfacesEntities() as $interfacesEntity) { - if (!$interfacesEntity->entityDataCanBeLoaded()) { - continue; - } - foreach ($interfacesEntity->getConstantsData(true, $flags) as $name => $constantsData) { - if (array_key_exists($name, $constants)) { - continue; - } - $constants[$name] = $constantsData; - } - } - } - return $constants; - } - - /** - * @throws InvalidConfigurationParameterException - */ - #[CacheableMethod] public function isInstantiable(): bool - { - if ($this->isAbstract()) { - return false; - } - - if ($this->isInterface()) { - return false; - } - - if ($this->isTrait()) { - return false; - } - - return $this->getAst()->getMethod('__construct')?->isPublic() ?? true; - } - - /** - * @throws InvalidConfigurationParameterException - */ - #[CacheableMethod] public function isAbstract(): bool - { - $ast = $this->getAst(); - if (!method_exists($ast, 'isAbstract')) { - return false; - } - return $ast->isAbstract(); - } - - /** - * @throws InvalidConfigurationParameterException - */ - #[CacheableMethod] public function isInterface(): bool - { - return $this->getAst() instanceof InterfaceNode; - } - - /** - * @throws \RuntimeException - * @throws InvalidConfigurationParameterException - */ - #[CacheableMethod] public function isTrait(): bool - { - return $this->getAst() instanceof TraitNode; - } - - /** - * @throws InvalidConfigurationParameterException - */ - public function hasMethod(string $method): bool - { - return array_key_exists($method, $this->getMethodsData()); - } - - /** - * @throws InvalidConfigurationParameterException - */ - public function hasProperty(string $property): bool - { - return array_key_exists($property, $this->getPropertiesData()); - } - - /** - * @throws InvalidConfigurationParameterException - */ - public function hasConstant(string $constantName): bool - { - return array_key_exists($constantName, $this->getConstantsData(true)); - } - - /** - * @throws InvalidConfigurationParameterException - */ - public function isSubclassOf(string $className): bool - { - $className = ltrim(str_replace('\\\\', '\\', $className), '\\'); - - $parentClassNames = $this->getParentClassNames(); - $interfacesNames = $this->getInterfaceNames(); - $allClasses = array_map( - fn($interface) => ltrim($interface, '\\'), - array_merge($parentClassNames, $interfacesNames) - ); - return in_array($className, $allClasses); - } - - /** - * @throws ConstExprEvaluationException - * @throws InvalidConfigurationParameterException - */ - #[CacheableMethod] public function getConstant(string $name): string|array|int|bool|null|float - { - // todo return constant entity - foreach ($this->getAst()->getConstants() as $node) { - foreach ($node->consts as $constantNode) { - if ($name === $constantNode->name->toString()) { - return NodeValueCompiler::compile($constantNode->value, $this); - } - } - } - return null; - } - - /** - * @throws NotFoundException - * @throws DependencyException - * @throws InvalidConfigurationParameterException - * @throws ConstExprEvaluationException - */ - #[CacheableMethod] public function getConstantValue(string $name): string|array|int|bool|null|float - { - - return $this->getConstantEntity($name)->getValue(); - } - - /** - * @throws InvalidConfigurationParameterException - */ - public function implementsInterface(string $interfaceName): bool - { - $interfaceName = ltrim(str_replace('\\\\', '\\', $interfaceName), '\\'); - $interfaces = array_map( - fn($interface) => ltrim($interface, '\\'), - $this->getInterfaceNames() - ); - return in_array($interfaceName, $interfaces); - } - - /** - * @throws InvalidConfigurationParameterException - */ - public function hasParentClass(string $parentClassName): bool - { - $parentClassName = ltrim(str_replace('\\\\', '\\', $parentClassName), '\\'); - $parentClassNames = array_map( - fn($interface) => ltrim($interface, '\\'), - $this->getParentClassNames() - ); - return in_array($parentClassName, $parentClassNames); - } - - /** - * @throws NotFoundException - * @throws DependencyException - * @throws InvalidConfigurationParameterException - * @throws ConstExprEvaluationException - */ - #[CacheableMethod] public function getConstants(): array - { - $constants = []; - foreach ($this->getConstantsData(true) as $name => $data) { - $constants[$name] = $this->getConstantValue($name); - } - return $constants; - } - - /** - * @throws InvalidConfigurationParameterException - * @throws \Exception - */ - public function getDocRender(): EntityDocRendererInterface - { - $objectId = $this->getObjectId(); - try { - return $this->localObjectCache->getMethodCachedResult(__METHOD__, $objectId); - } catch (ObjectNotFoundException) { - } - $docRenderer = $this->getPhpHandlerSettings()->getEntityDocRenderersCollection()->getFirstMatchingRender($this); - if (!$docRenderer) { - throw new \Exception( - "Renderer for file `{$this->getName()}` not found" - ); - } - $this->localObjectCache->cacheMethodResult(__METHOD__, $objectId, $docRenderer); - return $docRenderer; - } - - /** - * @throws DependencyException - * @throws NotFoundException - * @throws InvalidConfigurationParameterException - */ - public function cursorToDocAttributeLinkFragment(string $cursor, bool $isForDocument = true): string + #[CacheableMethod] public function getModifiersString(): string { - if ( - !$cursor || !preg_match( - '/^(((\$)(([a-zA-Z_])([a-zA-Z_0-9]+)))|(([a-zA-Z_])([a-zA-Z_0-9]+))|((([a-zA-Z_])([a-zA-Z_0-9]+))\(\)))$/', - $cursor, - $matches, - PREG_UNMATCHED_AS_NULL - ) - ) { - return ''; - } - - $prefix = null; - if ($attributeName = $matches[7]) { - // is constant - $prefix = 'q'; - if (!array_key_exists($matches[7], $this->getConstantsData())) { - if (array_key_exists($matches[7], $this->getMethodsData())) { - // is method - $prefix = 'm'; - } elseif (array_key_exists($matches[7], $this->getPropertiesData())) { - // is property - $prefix = 'p'; - } - } - } elseif ($attributeName = $matches[4]) { - // is property - $prefix = 'p'; - } elseif ($attributeName = $matches[11]) { - // is method - $prefix = 'm'; + $modifiersString = []; + if ($this->getAst()->isFinal()) { + $modifiersString[] = 'final'; + } elseif ($this->isAbstract()) { + $modifiersString[] = 'abstract'; } - if ($isForDocument) { - $prepareSourceLink = new PrepareSourceLink(); - return "#{$prefix}{$prepareSourceLink($attributeName)}"; - } - $line = match ($prefix) { - 'm' => $this->getMethodEntity($attributeName)?->getStartLine(), - 'p' => $this->getPropertyEntity($attributeName)?->getStartLine(), - 'q' => $this->getConstantEntity($attributeName)?->getStartLine(), - default => 0, - }; - return $line ? "#L{$line}" : ''; + $modifiersString[] = 'class'; + return implode(' ', $modifiersString); } } diff --git a/src/LanguageHandler/Php/Parser/Entity/ClassEntityCollection.php b/src/LanguageHandler/Php/Parser/Entity/ClassEntityCollection.php index 8fa9b2d3..ae8988fb 100644 --- a/src/LanguageHandler/Php/Parser/Entity/ClassEntityCollection.php +++ b/src/LanguageHandler/Php/Parser/Entity/ClassEntityCollection.php @@ -113,7 +113,7 @@ public function loadClassEntities(): void continue; } $className = $subNode->name->toString(); - $classEntity = $this->cacheablePhpEntityFactory->createClassEntity( + $classEntity = $this->cacheablePhpEntityFactory->createClassLikeEntity( $this, "{$namespaceName}\\{$className}", $relativeFileName @@ -148,7 +148,7 @@ public function loadClassEntities(): void /** * @throws InvalidConfigurationParameterException */ - public function add(ClassEntity $classEntity, bool $reload = false): ClassEntityCollection + public function add(ClassLikeEntity $classEntity, bool $reload = false): ClassEntityCollection { $className = $classEntity->getName(); if (!isset($this->entities[$className]) || $reload || isset($this->entitiesNotHandledByPlugins[$className])) { @@ -168,13 +168,14 @@ protected function prepareObjectName(string $objectName): string /** * @throws DependencyException * @throws NotFoundException + * @throws InvalidConfigurationParameterException */ - public function internalGetLoadedOrCreateNew(string $objectName, bool $withAddClassEntityToCollectionEvent = false): ClassEntity + public function internalGetLoadedOrCreateNew(string $objectName, bool $withAddClassEntityToCollectionEvent = false): ClassLikeEntity { $classEntity = $this->get($objectName); if (!$classEntity) { $objectName = ltrim($objectName, '\\'); - $classEntity = $this->cacheablePhpEntityFactory->createClassEntity( + $classEntity = $this->cacheablePhpEntityFactory->createClassLikeEntity( $this, $objectName ); @@ -191,7 +192,7 @@ public function internalGetLoadedOrCreateNew(string $objectName, bool $withAddCl return $classEntity; } - public function getEntityByClassName(string $className, bool $createIfNotExists = true): ?ClassEntity + public function getEntityByClassName(string $className, bool $createIfNotExists = true): ?ClassLikeEntity { return $createIfNotExists ? $this->getLoadedOrCreateNew($className) : $this->get($className); } @@ -212,7 +213,7 @@ public function filterByInterfaces(array $interfaces): ClassEntityCollection $interfaces ); foreach ($classEntityCollection as $objectId => $classEntity) { - /**@var ClassEntity $classEntity */ + /**@var ClassLikeEntity $classEntity */ $entityInterfaces = array_map( fn($interface) => ltrim($interface, '\\'), $classEntity->getInterfaceNames() @@ -238,7 +239,7 @@ public function filterByParentClassNames(array $parentClassNames): ClassEntityCo $parentClassNames ); foreach ($classEntityCollection as $objectId => $classEntity) { - /**@var ClassEntity $classEntity */ + /**@var ClassLikeEntity $classEntity */ $entityParentClassNames = array_map( fn($parentClassName) => ltrim($parentClassName, '\\'), $classEntity->getParentClassNames() @@ -258,7 +259,7 @@ public function filterByPaths(array $paths): ClassEntityCollection $classEntityCollection = $this->cloneForFiltration(); foreach ($classEntityCollection as $objectId => $classEntity) { $needToKeep = false; - /**@var ClassEntity $classEntity */ + /**@var ClassLikeEntity $classEntity */ foreach ($paths as $path) { if (str_starts_with($classEntity->getFileName(), $path)) { $needToKeep = true; @@ -275,7 +276,7 @@ public function filterByNameRegularExpression(string $regexPattern): ClassEntity { $classEntityCollection = $this->cloneForFiltration(); foreach ($classEntityCollection as $objectId => $classEntity) { - /**@var ClassEntity $classEntity */ + /**@var ClassLikeEntity $classEntity */ if (!preg_match($regexPattern, $classEntity->getShortName())) { $classEntityCollection->remove($objectId); } @@ -283,14 +284,11 @@ public function filterByNameRegularExpression(string $regexPattern): ClassEntity return $classEntityCollection; } - /** - * @throws InvalidConfigurationParameterException - */ public function getOnlyInstantiable(): ClassEntityCollection { $classEntityCollection = $this->cloneForFiltration(); foreach ($classEntityCollection as $objectId => $classEntity) { - /**@var ClassEntity $classEntity */ + /**@var ClassLikeEntity $classEntity */ if (!$classEntity->isInstantiable()) { $classEntityCollection->remove($objectId); } @@ -298,14 +296,11 @@ public function getOnlyInstantiable(): ClassEntityCollection return $classEntityCollection; } - /** - * @throws InvalidConfigurationParameterException - */ public function getOnlyInterfaces(): ClassEntityCollection { $classEntityCollection = $this->cloneForFiltration(); foreach ($classEntityCollection as $objectId => $classEntity) { - /**@var ClassEntity $classEntity */ + /**@var ClassLikeEntity $classEntity */ if (!$classEntity->isInterface()) { $classEntityCollection->remove($objectId); } @@ -313,14 +308,11 @@ public function getOnlyInterfaces(): ClassEntityCollection return $classEntityCollection; } - /** - * @throws InvalidConfigurationParameterException - */ public function getOnlyTraits(): ClassEntityCollection { $classEntityCollection = $this->cloneForFiltration(); foreach ($classEntityCollection as $objectId => $classEntity) { - /**@var ClassEntity $classEntity */ + /**@var ClassLikeEntity $classEntity */ if (!$classEntity->isTrait()) { $classEntityCollection->remove($objectId); } @@ -335,7 +327,7 @@ public function getOnlyAbstractClasses(): ClassEntityCollection { $classEntityCollection = $this->cloneForFiltration(); foreach ($classEntityCollection as $objectId => $classEntity) { - /**@var ClassEntity $classEntity */ + /**@var ClassLikeEntity $classEntity */ if (!$classEntity->isAbstract() || $classEntity->isInterface()) { $classEntityCollection->remove($objectId); } @@ -351,7 +343,7 @@ public function getOnlyAbstractClasses(): ClassEntityCollection * * @param bool $useUnsafeKeys Whether to use search keys that can be used to find several entities * - * @return ClassEntity|null + * @return ClassLikeEntity|null * * @example * $classEntityCollection->findEntity('App'); // class name @@ -363,7 +355,7 @@ public function getOnlyAbstractClasses(): ClassEntityCollection * $classEntityCollection->findEntity('/Users/someuser/Desktop/projects/bumble-doc-gen/BumbleDocGen/Console/App.php'); // absolute path * $classEntityCollection->findEntity('https://github.com/bumble-tech/bumble-doc-gen/blob/master/BumbleDocGen/Console/App.php'); // source link */ - public function internalFindEntity(string $search, bool $useUnsafeKeys = true): ?ClassEntity + public function internalFindEntity(string $search, bool $useUnsafeKeys = true): ?ClassLikeEntity { if (preg_match('/^((self|parent):|(\$(.*)->))/', $search)) { return null; diff --git a/src/LanguageHandler/Php/Parser/Entity/ClassLikeEntity.php b/src/LanguageHandler/Php/Parser/Entity/ClassLikeEntity.php new file mode 100644 index 00000000..4a832ab3 --- /dev/null +++ b/src/LanguageHandler/Php/Parser/Entity/ClassLikeEntity.php @@ -0,0 +1,1049 @@ +relativeFileNameLoaded = true; + } + } + + public static function isEntityNameValid(string $entityName): bool + { + return ParserHelper::isCorrectClassName($entityName); + } + + public function isClass(): bool + { + return false; + } + + public function isInterface(): bool + { + return false; + } + + public function isTrait(): bool + { + return false; + } + + public function isEnum(): bool + { + return false; + } + + public function getObjectId(): string + { + return $this->className; + } + + public function isExternalLibraryEntity(): bool + { + return !is_null($this->composerHelper->getComposerPackageDataByClassName($this->getName())); + } + + public function getPhpHandlerSettings(): PhpHandlerSettings + { + return $this->phpHandlerSettings; + } + + final public function getRootEntityCollection(): ClassEntityCollection + { + return $this->classEntityCollection; + } + + /** + * {@inheritDoc} + * @throws InvalidConfigurationParameterException + * @throws \Exception + */ + public function getEntityDependencies(): array + { + $fileDependencies = []; + if ($this->isClassLoad()) { + $parentClassNames = $this->getParentClassNames(); + $traitClassNames = $this->getTraitsNames(); + $interfaceNames = $this->getInterfaceNames(); + + $classNames = array_unique(array_merge($parentClassNames, $traitClassNames, $interfaceNames)); + $classNames = array_filter( + $classNames, + function (string $className): bool { + return !$this->composerHelper->getComposerPackageDataByClassName($className) && !$this->parserHelper->isBuiltInClass($className); + } + ); + + $reflections = array_map(fn(string $className) => $this->getRootEntityCollection()->getLoadedOrCreateNew($className), $classNames); + $reflections[] = $this; + foreach ($reflections as $reflectionClass) { + $relativeFileName = $reflectionClass->getRelativeFileName(); + if ($relativeFileName) { + $fileName = $this->configuration->getProjectRoot() . '/' . $relativeFileName; + $fileDependencies[$relativeFileName] = md5_file($fileName); + } + } + } + return $fileDependencies; + } + + /** + * @throws NotFoundException + * @throws DependencyException + * @throws InvalidConfigurationParameterException + */ + public function getDocBlock(): DocBlock + { + $classEntity = $this->getDocCommentEntity(); + return $this->parserHelper->getDocBlock($classEntity, $this->getDocCommentRecursive()); + } + + /** + * Checking if class file is in git repository + */ + final public function isInGit(): bool + { + try { + if (!$this->getFileName()) { + return false; + } + $filesInGit = $this->parserHelper->getFilesInGit(); + $fileName = ltrim($this->getFileName(), DIRECTORY_SEPARATOR); + return isset($filesInGit[$fileName]); + } catch (\Exception) { + } + return false; + } + + /** + * @throws InvalidConfigurationParameterException + */ + public function documentCreationAllowed(): bool + { + return !$this->configuration->isCheckFileInGitBeforeCreatingDocEnabled() || $this->isInGit(); + } + + /** + * @throws NotFoundException + * @throws DependencyException + * @throws InvalidConfigurationParameterException + */ + public function getDocCommentEntity(): ClassLikeEntity + { + $objectId = $this->getObjectId(); + try { + return $this->localObjectCache->getMethodCachedResult(__METHOD__, $objectId); + } catch (ObjectNotFoundException) { + } + $docComment = $this->getDocComment(); + $classEntity = $this; + if (!$docComment || str_contains(mb_strtolower($docComment), '@inheritdoc')) { + $parentReflectionClass = $this->getParentClass(); + if ($parentReflectionClass && $parentReflectionClass->entityDataCanBeLoaded()) { + $classEntity = $parentReflectionClass->getDocCommentEntity(); + } + } + $this->localObjectCache->cacheMethodResult(__METHOD__, $objectId, $classEntity); + return $classEntity; + } + + /** + * @throws NotFoundException + * @throws DependencyException + * @throws InvalidConfigurationParameterException + */ + protected function getDocCommentRecursive(): string + { + return $this->getDocCommentEntity()->getDocComment() ?: ' '; + } + + final public function loadPluginData(string $pluginKey, array $data): void + { + $this->pluginsData[$pluginKey] = $data; + } + + final public function getPluginData(string $pluginKey): ?array + { + return $this->pluginsData[$pluginKey] ?? null; + } + + final public function setCustomAst(TraitNode|EnumNode|InterfaceNode|ClassNode|null $customAst): void + { + $objectId = $this->getObjectId(); + $this->isClassLoad = true; + $this->localObjectCache->cacheMethodResult(__CLASS__ . '::getAst', $objectId, $customAst); + } + /** + * @throws \RuntimeException + * @throws InvalidConfigurationParameterException + */ + final public function getAst(): ClassNode|InterfaceNode|TraitNode|EnumNode + { + $objectId = $this->getObjectId(); + try { + return $this->localObjectCache->getMethodCachedResult(__METHOD__, $objectId); + } catch (ObjectNotFoundException) { + } + + $ast = null; + $nodes = $this->phpParserHelper->phpParser()->parse($this->getFileContent()); + $nodeTraverser = new NodeTraverser(); + $nodeTraverser->addVisitor(new NameResolver()); + $nodes = $nodeTraverser->traverse($nodes); + foreach ($nodes as $node) { + if (in_array(get_class($node), [ClassNode::class, InterfaceNode::class, TraitNode::class, EnumNode::class])) { + $className = $node->name->toString(); + if ($className === $this->getName()) { + $ast = $node; + break; + } + } elseif (!$node instanceof NamespaceNode) { + continue; + } + $namespaceName = $node->name->toString(); + foreach ($node->stmts as $subNode) { + if (!in_array(get_class($subNode), [ClassNode::class, InterfaceNode::class, TraitNode::class, EnumNode::class])) { + continue; + } + $className = "{$namespaceName}\\{$subNode->name->toString()}"; + if ($className === $this->getName()) { + $ast = $subNode; + break 2; + } + } + } + + if (!$ast) { + throw new \RuntimeException("Entity `{$this->getName()}` not found"); + } + $this->isClassLoad = true; + $this->localObjectCache->cacheMethodResult(__METHOD__, $objectId, $ast); + return $ast; + } + + public function getImplementingClass(): ClassLikeEntity + { + return $this; + } + + public function getName(): string + { + return $this->className; + } + + /** + * @internal + */ + public function isClassLoad(): bool + { + if (!$this->isClassLoad) { + try { + $this->isClassLoad = ParserHelper::isCorrectClassName($this->getName()) && $this->getRelativeFileName(); + } catch (\Exception) { + $this->isClassLoad = false; + } + } + return $this->isClassLoad; + } + + /** + * @throws InvalidConfigurationParameterException + */ + #[CacheableMethod] public function entityDataCanBeLoaded(): bool + { + if (!$this->isCurrentEntityCanBeLoad()) { + $this->logger->notice("Class `{$this->getName()}` loading skipped by plugin"); + return false; + } + return !$this->isExternalLibraryEntity() && $this->isEntityFileCanBeLoad(); + } + + public function getShortName(): string + { + $nameParts = explode('\\', $this->getName()); + return end($nameParts); + } + + #[CacheableMethod] public function getNamespaceName(): string + { + $namespaceParts = explode('\\', $this->getName()); + if (count($namespaceParts) < 2) { + return ''; + } + array_pop($namespaceParts); + return implode('\\', $namespaceParts); + } + + /** + * @throws InvalidConfigurationParameterException + */ + public function getRelativeFileName(bool $loadIfEmpty = true): ?string + { + if (!$this->relativeFileNameLoaded && $loadIfEmpty) { + $this->relativeFileNameLoaded = true; + $fileName = $this->composerHelper->getComposerClassLoader()->findFile($this->getName()); + $projectRoot = $this->configuration->getProjectRoot(); + if (!$fileName || !str_starts_with($fileName, $projectRoot)) { + return null; + } + $this->relativeFileName = str_replace( + [$projectRoot, '//'], + ['', '/'], + $fileName + ); + } + return $this->relativeFileName; + } + + /** + * {@inheritDoc} + * @throws InvalidConfigurationParameterException + */ + public function getFileName(): ?string + { + return $this->getRelativeFileName(); + } + + /** + * @throws InvalidConfigurationParameterException + */ + public function getFullFileName(): ?string + { + $fileName = $this->getFileName(); + if (!$fileName) { + return $fileName; + } + return "{$this->configuration->getProjectRoot()}{$fileName}"; + } + + public function isInstantiable(): bool + { + return false; + } + + public function isAbstract(): bool + { + return false; + } + + /** + * @throws InvalidConfigurationParameterException + */ + #[CacheableMethod] public function getStartLine(): int + { + return $this->getAst()->getStartLine(); + } + + /** + * @throws InvalidConfigurationParameterException + */ + #[CacheableMethod] public function getEndLine(): int + { + return $this->getAst()->getEndLine(); + } + + /** + * @return ClassLikeEntity[] $trait + * @throws InvalidConfigurationParameterException + */ + public function getTraits(): array + { + $traits = []; + foreach ($this->getTraitsNames() as $traitsName) { + $traits[] = $this->classEntityCollection->getLoadedOrCreateNew($traitsName); + } + return $traits; + } + + /** + * @return ClassLikeEntity[] + * + * @throws InvalidConfigurationParameterException + */ + public function getInterfacesEntities(): array + { + $interfacesEntities = []; + foreach ($this->getInterfaceNames() as $interfaceClassName) { + $interfacesEntities[] = $this->getRootEntityCollection()->getLoadedOrCreateNew($interfaceClassName); + } + return $interfacesEntities; + } + + public function getParentClassNames(): array + { + return []; + } + + /** + * @return ClassLikeEntity[] + * @throws InvalidConfigurationParameterException + */ + public function getParentClassEntities(): array + { + return array_map( + fn(string $className) => $this->getRootEntityCollection()->getLoadedOrCreateNew($className), + $this->getParentClassNames() + ); + } + + /** + * @return string[] + * + * @throws InvalidConfigurationParameterException + */ + #[CacheableMethod] public function getInterfaceNames(): array + { + if (!$this->entityDataCanBeLoaded()) { + return []; + } + + $objectId = $this->getObjectId(); + try { + return $this->localObjectCache->getMethodCachedResult(__METHOD__, $objectId); + } catch (ObjectNotFoundException) { + } + + $interfaceNames = []; + + $node = $this->getAst(); + $nodes = $node instanceof InterfaceNode ? $node->extends : $node->implements; + $interfaces = array_map(static fn($n) => $n->toString(), $nodes ?? []); + foreach ($interfaces as $interfaceName) { + if ($interfaceName === $this->getName()) { + continue; + } + $parentInterfaceNames = []; + try { + $interfaceEntity = $this->getRootEntityCollection()->getLoadedOrCreateNew($interfaceName); + if ($interfaceEntity->entityDataCanBeLoaded()) { + $parentInterfaceNames = $interfaceEntity->getInterfaceNames(); + } + } catch (\Exception $e) { + $this->logger->error($e->getMessage()); + } + $interfaceNames = array_merge($interfaceNames, ["\\{$interfaceName}"], $parentInterfaceNames); + } + if (!$this->isInterface() && $parentClass = $this->getParentClass()) { + $parentInterfaceNames = []; + try { + if ($parentClass->entityDataCanBeLoaded()) { + $parentInterfaceNames = $parentClass->getInterfaceNames(); + } + } catch (\Exception $e) { + $this->logger->error($e->getMessage()); + } + $interfaceNames = array_merge($interfaceNames, $parentInterfaceNames); + } + $interfaceNames = array_unique($interfaceNames); + $this->localObjectCache->cacheMethodResult(__METHOD__, $objectId, $interfaceNames); + return $interfaceNames; + } + + public function getParentClassName(): ?string + { + return null; + } + + public function getParentClass(): ?ClassLikeEntity + { + return null; + } + + /** + * @throws InvalidConfigurationParameterException + */ + #[CacheableMethod] public function getTraitsNames(): array + { + if (!$this->entityDataCanBeLoaded()) { + return []; + } + $traitsNames = []; + /**@var Node\Stmt\TraitUse[] $traitsNodes * */ + $traitsNodes = array_filter($this->getAst()->stmts, static fn(Node\Stmt $stmt): bool => $stmt instanceof Node\Stmt\TraitUse); + foreach ($traitsNodes as $node) { + foreach ($node->traits as $traitNode) { + $traitsNames[] = $traitNode->toString(); + } + } + return $traitsNames; + } + + /** + * @throws InvalidConfigurationParameterException + */ + public function hasTraits(): bool + { + return count($this->getTraitsNames()) > 0; + } + + /** + * @throws NotFoundException + * @throws DependencyException + * @throws InvalidConfigurationParameterException + */ + public function getConstantEntityCollection(): ConstantEntityCollection + { + $objectId = $this->getObjectId(); + try { + return $this->localObjectCache->getMethodCachedResult(__METHOD__, $objectId); + } catch (ObjectNotFoundException) { + } + $constantEntityCollection = $this->diContainer->make(ConstantEntityCollection::class, [ + 'classEntity' => $this + ]); + $constantEntityCollection->loadConstantEntities(); + $this->localObjectCache->cacheMethodResult(__METHOD__, $objectId, $constantEntityCollection); + return $constantEntityCollection; + } + + /** + * @throws NotFoundException + * @throws DependencyException + * @throws InvalidConfigurationParameterException + */ + public function getConstantEntity(string $constantName, bool $unsafe = true): ?ConstantEntity + { + $constantEntityCollection = $this->getConstantEntityCollection(); + if ($unsafe) { + return $constantEntityCollection->unsafeGet($constantName); + } + return $constantEntityCollection->get($constantName); + } + + /** + * @throws DependencyException + * @throws InvalidConfigurationParameterException + * @throws NotFoundException + */ + public function getPropertyEntityCollection(): PropertyEntityCollection + { + $objectId = $this->getObjectId(); + try { + return $this->localObjectCache->getMethodCachedResult(__METHOD__, $objectId); + } catch (ObjectNotFoundException) { + } + $propertyEntityCollection = $this->diContainer->make(PropertyEntityCollection::class, [ + 'classEntity' => $this + ]); + $propertyEntityCollection->loadPropertyEntities(); + $this->localObjectCache->cacheMethodResult(__METHOD__, $objectId, $propertyEntityCollection); + return $propertyEntityCollection; + } + + /** + * @throws NotFoundException + * @throws DependencyException + * @throws InvalidConfigurationParameterException + */ + public function getPropertyEntity(string $propertyName, bool $unsafe = true): ?PropertyEntity + { + $propertyEntityCollection = $this->getPropertyEntityCollection(); + if ($unsafe) { + return $propertyEntityCollection->unsafeGet($propertyName); + } + return $propertyEntityCollection->get($propertyName); + } + + /** + * @throws DependencyException + * @throws InvalidConfigurationParameterException + * @throws NotFoundException + */ + public function getMethodEntityCollection(): MethodEntityCollection + { + $objectId = $this->getObjectId(); + try { + return $this->localObjectCache->getMethodCachedResult(__METHOD__, $objectId); + } catch (ObjectNotFoundException) { + } + $methodEntityCollection = $this->diContainer->make(MethodEntityCollection::class, [ + 'classEntity' => $this + ]); + $methodEntityCollection->loadMethodEntities(); + $this->localObjectCache->cacheMethodResult(__METHOD__, $objectId, $methodEntityCollection); + return $methodEntityCollection; + } + + /** + * @throws NotFoundException + * @throws DependencyException + * @throws InvalidConfigurationParameterException + */ + public function getMethodEntity(string $methodName, bool $unsafe = true): ?MethodEntity + { + $methodEntityCollection = $this->getMethodEntityCollection(); + if ($unsafe) { + return $methodEntityCollection->unsafeGet($methodName); + } + return $methodEntityCollection->get($methodName); + } + + /** + * @throws NotFoundException + * @throws DependencyException + * @throws InvalidConfigurationParameterException + */ + public function getDescription(): string + { + $docBlock = $this->getDocBlock(); + return $docBlock->getSummary(); + } + + /** + * Returns the absolute path to a file if it can be retrieved and if the file is in the project directory + * @throws InvalidConfigurationParameterException + */ + public function getAbsoluteFileName(): ?string + { + $relativeFileName = $this->getRelativeFileName(); + return $relativeFileName ? $this->configuration->getProjectRoot() . $relativeFileName : null; + } + + /** + * @throws InvalidConfigurationParameterException + */ + public function getFileContent(): string + { + $objectId = $this->getObjectId(); + try { + return $this->localObjectCache->getMethodCachedResult(__METHOD__, $objectId); + } catch (ObjectNotFoundException) { + } + $fileContent = $this->getAbsoluteFileName() ? file_get_contents($this->getAbsoluteFileName()) : ''; + $this->localObjectCache->cacheMethodResult(__METHOD__, $objectId, $fileContent); + return $fileContent; + } + + /** + * @throws InvalidConfigurationParameterException + */ + #[CacheableMethod] public function getMethodsData( + bool $onlyFromCurrentClassAndTraits = false, + int $flags = MethodEntity::VISIBILITY_MODIFIERS_FLAG_ANY + ): array { + if (!$this->entityDataCanBeLoaded()) { + return []; + } + $methods = []; + /** @var MethodNode[] $methodNodes */ + $methodNodes = array_filter( + $this->getAst()->stmts, + static fn(Node\Stmt $stmt): bool => $stmt instanceof MethodNode, + ); + array_walk($methodNodes, fn(MethodNode $stmt) => $stmt->flags = $stmt->flags ?: MethodEntity::MODIFIERS_FLAG_IS_PUBLIC); + foreach ($methodNodes as $methodNode) { + if (($methodNode->flags & $flags) === 0) { + continue; + } + $methods[$methodNode->name->toString()] = $this->getName(); + } + + $flags &= ~ MethodEntity::MODIFIERS_FLAG_IS_PRIVATE; + foreach ($this->getTraits() as $traitEntity) { + if (!$traitEntity->entityDataCanBeLoaded()) { + continue; + } + foreach ($traitEntity->getMethodsData(true, $flags) as $name => $methodsData) { + if (array_key_exists($name, $methods)) { + continue; + } + $methods[$name] = $methodsData; + } + } + + if (!$onlyFromCurrentClassAndTraits) { + foreach ($this->getParentClassEntities() as $parentClassEntity) { + if (!$parentClassEntity->entityDataCanBeLoaded()) { + continue; + } + foreach ($parentClassEntity->getMethodsData(true, $flags) as $name => $methodsData) { + if (array_key_exists($name, $methods)) { + continue; + } + $methods[$name] = $methodsData; + } + } + + foreach ($this->getInterfacesEntities() as $interfacesEntity) { + if (!$interfacesEntity->entityDataCanBeLoaded()) { + continue; + } + foreach ($interfacesEntity->getMethodsData(true, $flags) as $name => $methodsData) { + if (array_key_exists($name, $methods)) { + continue; + } + $methods[$name] = $methodsData; + } + } + } + + return $methods; + } + + /** + * @throws InvalidConfigurationParameterException + */ + #[CacheableMethod] public function getPropertiesData( + bool $onlyFromCurrentClassAndTraits = false, + int $flags = PropertyEntity::VISIBILITY_MODIFIERS_FLAG_ANY + ): array { + if (!$this->entityDataCanBeLoaded()) { + return []; + } + $properties = []; + /** @var PropertyNode[] $propertyNodes */ + $propertyNodes = array_filter( + $this->getAst()->stmts, + static fn(Node\Stmt $stmt): bool => $stmt instanceof PropertyNode, + ); + array_walk($propertyNodes, fn(PropertyNode $stmt) => $stmt->flags = $stmt->flags ?: PropertyEntity::MODIFIERS_FLAG_IS_PUBLIC); + foreach ($propertyNodes as $node) { + if (($node->flags & $flags) === 0) { + continue; + } + foreach ($node->props as $propertyNode) { + $properties[$propertyNode->name->toString()] = $this->getName(); + } + } + + $flags &= ~ PropertyEntity::MODIFIERS_FLAG_IS_PRIVATE; + foreach ($this->getTraits() as $traitEntity) { + foreach ($traitEntity->getPropertiesData(true, $flags) as $name => $propertyData) { + if (!$traitEntity->entityDataCanBeLoaded()) { + continue; + } + if (array_key_exists($name, $properties)) { + continue; + } + $properties[$name] = $propertyData; + } + } + if (!$onlyFromCurrentClassAndTraits) { + foreach ($this->getParentClassEntities() as $parentClassEntity) { + if (!$parentClassEntity->entityDataCanBeLoaded()) { + continue; + } + foreach ($parentClassEntity->getPropertiesData(true, $flags) as $name => $propertyData) { + if (array_key_exists($name, $properties)) { + continue; + } + $properties[$name] = $propertyData; + } + } + } + return $properties; + } + + /** + * @throws InvalidConfigurationParameterException + */ + #[CacheableMethod] public function getConstantsData( + bool $onlyFromCurrentClassAndTraits = false, + int $flags = ConstantEntity::VISIBILITY_MODIFIERS_FLAG_ANY + ): array { + if (!$this->entityDataCanBeLoaded()) { + return []; + } + $constants = []; + /** @var ConstNode[] $constNodes */ + $constNodes = array_filter( + $this->getAst()->stmts, + static fn(Node\Stmt $stmt): bool => $stmt instanceof ConstNode, + ); + array_walk($constNodes, fn(ConstNode $stmt) => $stmt->flags = $stmt->flags ?: ConstantEntity::MODIFIERS_FLAG_IS_PUBLIC); + foreach ($constNodes as $constNode) { + if (($constNode->flags & $flags) === 0) { + continue; + } + foreach ($constNode->consts as $constant) { + $constants[$constant->name->toString()] = $this->getName(); + } + } + + $flags &= ~ ConstantEntity::MODIFIERS_FLAG_IS_PRIVATE; + foreach ($this->getTraits() as $traitEntity) { + if (!$traitEntity->entityDataCanBeLoaded()) { + continue; + } + foreach ($traitEntity->getConstantsData(true, $flags) as $name => $constantsData) { + if (array_key_exists($name, $constants)) { + continue; + } + $constants[$name] = $constantsData; + } + } + + if (!$onlyFromCurrentClassAndTraits) { + foreach ($this->getParentClassEntities() as $parentClassEntity) { + if (!$parentClassEntity->entityDataCanBeLoaded()) { + continue; + } + foreach ($parentClassEntity->getConstantsData(true, $flags) as $name => $constantsData) { + if (array_key_exists($name, $constants)) { + continue; + } + $constants[$name] = $constantsData; + } + } + + foreach ($this->getInterfacesEntities() as $interfacesEntity) { + if (!$interfacesEntity->entityDataCanBeLoaded()) { + continue; + } + foreach ($interfacesEntity->getConstantsData(true, $flags) as $name => $constantsData) { + if (array_key_exists($name, $constants)) { + continue; + } + $constants[$name] = $constantsData; + } + } + } + return $constants; + } + + /** + * @throws InvalidConfigurationParameterException + */ + public function hasMethod(string $method): bool + { + return array_key_exists($method, $this->getMethodsData()); + } + + /** + * @throws InvalidConfigurationParameterException + */ + public function hasProperty(string $property): bool + { + return array_key_exists($property, $this->getPropertiesData()); + } + + /** + * @throws InvalidConfigurationParameterException + */ + public function hasConstant(string $constantName): bool + { + return array_key_exists($constantName, $this->getConstantsData(true)); + } + + /** + * @throws InvalidConfigurationParameterException + */ + public function isSubclassOf(string $className): bool + { + $className = ltrim(str_replace('\\\\', '\\', $className), '\\'); + + $parentClassNames = $this->getParentClassNames(); + $interfacesNames = $this->getInterfaceNames(); + $allClasses = array_map( + fn($interface) => ltrim($interface, '\\'), + array_merge($parentClassNames, $interfacesNames) + ); + return in_array($className, $allClasses); + } + + /** + * @throws ConstExprEvaluationException + * @throws InvalidConfigurationParameterException + */ + #[CacheableMethod] public function getConstant(string $name): string|array|int|bool|null|float + { + // todo return constant entity + foreach ($this->getAst()->getConstants() as $node) { + foreach ($node->consts as $constantNode) { + if ($name === $constantNode->name->toString()) { + return NodeValueCompiler::compile($constantNode->value, $this); + } + } + } + return null; + } + + /** + * @throws NotFoundException + * @throws DependencyException + * @throws InvalidConfigurationParameterException + * @throws ConstExprEvaluationException + */ + #[CacheableMethod] public function getConstantValue(string $name): string|array|int|bool|null|float + { + + return $this->getConstantEntity($name)->getValue(); + } + + /** + * @throws InvalidConfigurationParameterException + */ + public function implementsInterface(string $interfaceName): bool + { + $interfaceName = ltrim(str_replace('\\\\', '\\', $interfaceName), '\\'); + $interfaces = array_map( + fn($interface) => ltrim($interface, '\\'), + $this->getInterfaceNames() + ); + return in_array($interfaceName, $interfaces); + } + + public function hasParentClass(string $parentClassName): bool + { + $parentClassName = ltrim(str_replace('\\\\', '\\', $parentClassName), '\\'); + $parentClassNames = array_map( + fn($interface) => ltrim($interface, '\\'), + $this->getParentClassNames() + ); + return in_array($parentClassName, $parentClassNames); + } + + /** + * @throws NotFoundException + * @throws DependencyException + * @throws InvalidConfigurationParameterException + * @throws ConstExprEvaluationException + */ + #[CacheableMethod] public function getConstants(): array + { + $constants = []; + foreach ($this->getConstantsData(true) as $name => $data) { + $constants[$name] = $this->getConstantValue($name); + } + return $constants; + } + + /** + * @throws InvalidConfigurationParameterException + * @throws \Exception + */ + public function getDocRender(): EntityDocRendererInterface + { + $objectId = $this->getObjectId(); + try { + return $this->localObjectCache->getMethodCachedResult(__METHOD__, $objectId); + } catch (ObjectNotFoundException) { + } + $docRenderer = $this->getPhpHandlerSettings()->getEntityDocRenderersCollection()->getFirstMatchingRender($this); + if (!$docRenderer) { + throw new \Exception( + "Renderer for file `{$this->getName()}` not found" + ); + } + $this->localObjectCache->cacheMethodResult(__METHOD__, $objectId, $docRenderer); + return $docRenderer; + } + + /** + * @throws DependencyException + * @throws NotFoundException + * @throws InvalidConfigurationParameterException + */ + public function cursorToDocAttributeLinkFragment(string $cursor, bool $isForDocument = true): string + { + if ( + !$cursor || !preg_match( + '/^(((\$)(([a-zA-Z_])([a-zA-Z_0-9]+)))|(([a-zA-Z_])([a-zA-Z_0-9]+))|((([a-zA-Z_])([a-zA-Z_0-9]+))\(\)))$/', + $cursor, + $matches, + PREG_UNMATCHED_AS_NULL + ) + ) { + return ''; + } + + $prefix = null; + if ($attributeName = $matches[7]) { + // is constant + $prefix = 'q'; + if (!array_key_exists($matches[7], $this->getConstantsData())) { + if (array_key_exists($matches[7], $this->getMethodsData())) { + // is method + $prefix = 'm'; + } elseif (array_key_exists($matches[7], $this->getPropertiesData())) { + // is property + $prefix = 'p'; + } + } + } elseif ($attributeName = $matches[4]) { + // is property + $prefix = 'p'; + } elseif ($attributeName = $matches[11]) { + // is method + $prefix = 'm'; + } + + if ($isForDocument) { + $prepareSourceLink = new PrepareSourceLink(); + return "#{$prefix}{$prepareSourceLink($attributeName)}"; + } + $line = match ($prefix) { + 'm' => $this->getMethodEntity($attributeName)?->getStartLine(), + 'p' => $this->getPropertyEntity($attributeName)?->getStartLine(), + 'q' => $this->getConstantEntity($attributeName)?->getStartLine(), + default => 0, + }; + return $line ? "#L{$line}" : ''; + } +} diff --git a/src/LanguageHandler/Php/Parser/Entity/Constant/ConstantEntity.php b/src/LanguageHandler/Php/Parser/Entity/Constant/ConstantEntity.php index 9f4d45dc..6a717f7e 100644 --- a/src/LanguageHandler/Php/Parser/Entity/Constant/ConstantEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/Constant/ConstantEntity.php @@ -9,7 +9,7 @@ use BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException; use BumbleDocGen\Core\Parser\Entity\Cache\CacheableMethod; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection; use BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper; use BumbleDocGen\LanguageHandler\Php\Parser\PhpParser\NodeValueCompiler; @@ -55,7 +55,7 @@ class ConstantEntity extends BaseEntity public function __construct( Configuration $configuration, - private ClassEntity $classEntity, + private ClassLikeEntity $classEntity, private ParserHelper $parserHelper, LocalObjectCache $localObjectCache, LoggerInterface $logger, @@ -89,7 +89,7 @@ public function getDocBlock(): DocBlock return $this->parserHelper->getDocBlock($classEntity, $this->getDocCommentRecursive()); } - public function getRootEntity(): ClassEntity + public function getRootEntity(): ClassLikeEntity { return $this->classEntity; } @@ -122,7 +122,7 @@ public function getImplementingClassName(): string return $this->implementingClassName; } - public function getImplementingClass(): ClassEntity + public function getImplementingClass(): ClassLikeEntity { return $this->getRootEntityCollection()->getLoadedOrCreateNew($this->getImplementingClassName()); } diff --git a/src/LanguageHandler/Php/Parser/Entity/Constant/ConstantEntityCollection.php b/src/LanguageHandler/Php/Parser/Entity/Constant/ConstantEntityCollection.php index 30fffbcb..d14abbae 100644 --- a/src/LanguageHandler/Php/Parser/Entity/Constant/ConstantEntityCollection.php +++ b/src/LanguageHandler/Php/Parser/Entity/Constant/ConstantEntityCollection.php @@ -7,7 +7,7 @@ use BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException; use BumbleDocGen\Core\Parser\Entity\BaseEntityCollection; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Cache\CacheablePhpEntityFactory; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; use BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings; use DI\DependencyException; use DI\NotFoundException; @@ -15,7 +15,7 @@ final class ConstantEntityCollection extends BaseEntityCollection { public function __construct( - private ClassEntity $classEntity, + private ClassLikeEntity $classEntity, private PhpHandlerSettings $phpHandlerSettings, private CacheablePhpEntityFactory $cacheablePhpEntityFactory ) { diff --git a/src/LanguageHandler/Php/Parser/Entity/EnumEntity.php b/src/LanguageHandler/Php/Parser/Entity/EnumEntity.php new file mode 100644 index 00000000..bc913b6d --- /dev/null +++ b/src/LanguageHandler/Php/Parser/Entity/EnumEntity.php @@ -0,0 +1,71 @@ +entityDataCanBeLoaded()) { + return []; + } + + $enumCases = []; + /** @var EnumCaseNode[] $enumCaseNodes */ + $enumCaseNodes = array_filter( + $this->getAst()->stmts, + static fn(Stmt $stmt): bool => $stmt instanceof EnumCaseNode, + ); + + foreach ($enumCaseNodes as $enumCaseNode) { + $enumCases[$enumCaseNode->name->toString()] = $enumCaseNode->expr ? NodeValueCompiler::compile($enumCaseNode->expr, $this) : null; + } + return $enumCases; + } + + /** + * @throws InvalidConfigurationParameterException + * @throws ConstExprEvaluationException + */ + public function getCasesNames(): array + { + return array_keys($this->getEnumCases()); + } + + /** + * @throws InvalidConfigurationParameterException + * @throws ConstExprEvaluationException + */ + public function getEnumCaseValue(string $name): mixed + { + return $this->getEnumCases()[$name] ?? null; + } + + public function getModifiersString(): string + { + return 'enum'; + } +} diff --git a/src/LanguageHandler/Php/Parser/Entity/InterfaceEntity.php b/src/LanguageHandler/Php/Parser/Entity/InterfaceEntity.php new file mode 100644 index 00000000..edd0baa5 --- /dev/null +++ b/src/LanguageHandler/Php/Parser/Entity/InterfaceEntity.php @@ -0,0 +1,28 @@ +classEntity; } @@ -176,7 +176,7 @@ public function isInitialization(): bool return $this->isStatic() && in_array($this->getReturnType(), $initializationReturnTypes); } - public function getImplementingClass(): ClassEntity + public function getImplementingClass(): ClassLikeEntity { return $this->classEntity; } diff --git a/src/LanguageHandler/Php/Parser/Entity/Method/MethodEntity.php b/src/LanguageHandler/Php/Parser/Entity/Method/MethodEntity.php index e6a86677..020187dd 100644 --- a/src/LanguageHandler/Php/Parser/Entity/Method/MethodEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/Method/MethodEntity.php @@ -10,7 +10,7 @@ use BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException; use BumbleDocGen\Core\Parser\Entity\Cache\CacheableMethod; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection; use BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper; use BumbleDocGen\LanguageHandler\Php\Parser\PhpParser\NodeValueCompiler; @@ -56,7 +56,7 @@ class MethodEntity extends BaseEntity implements MethodEntityInterface public function __construct( private Configuration $configuration, - private ClassEntity $classEntity, + private ClassLikeEntity $classEntity, private ParserHelper $parserHelper, private Standard $astPrinter, private LocalObjectCache $localObjectCache, @@ -87,7 +87,7 @@ public function getAst(): ClassMethod return $this->ast; } - public function getRootEntity(): ClassEntity + public function getRootEntity(): ClassLikeEntity { return $this->classEntity; } @@ -117,7 +117,7 @@ public function getDocBlock(bool $recursive = true): DocBlock return $this->parserHelper->getDocBlock($classEntity, $this->getDocComment(), $this->getDocCommentLine()); } - public function getImplementingClass(): ClassEntity + public function getImplementingClass(): ClassLikeEntity { return $this->getRootEntityCollection()->getLoadedOrCreateNew($this->getImplementingClassName()); } diff --git a/src/LanguageHandler/Php/Parser/Entity/Method/MethodEntityCollection.php b/src/LanguageHandler/Php/Parser/Entity/Method/MethodEntityCollection.php index f980ee91..1193ad71 100644 --- a/src/LanguageHandler/Php/Parser/Entity/Method/MethodEntityCollection.php +++ b/src/LanguageHandler/Php/Parser/Entity/Method/MethodEntityCollection.php @@ -7,7 +7,7 @@ use BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException; use BumbleDocGen\Core\Parser\Entity\BaseEntityCollection; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Cache\CacheablePhpEntityFactory; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; use BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings; use DI\DependencyException; use DI\NotFoundException; @@ -20,7 +20,7 @@ final class MethodEntityCollection extends BaseEntityCollection { public function __construct( - private ClassEntity $classEntity, + private ClassLikeEntity $classEntity, private PhpHandlerSettings $phpHandlerSettings, private CacheablePhpEntityFactory $cacheablePhpEntityFactory, private LoggerInterface $logger diff --git a/src/LanguageHandler/Php/Parser/Entity/Method/MethodEntityInterface.php b/src/LanguageHandler/Php/Parser/Entity/Method/MethodEntityInterface.php index ff5953f8..0d2e1cf7 100644 --- a/src/LanguageHandler/Php/Parser/Entity/Method/MethodEntityInterface.php +++ b/src/LanguageHandler/Php/Parser/Entity/Method/MethodEntityInterface.php @@ -5,7 +5,7 @@ namespace BumbleDocGen\LanguageHandler\Php\Parser\Entity\Method; use BumbleDocGen\Core\Parser\Entity\EntityInterface; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; interface MethodEntityInterface extends EntityInterface { @@ -45,5 +45,5 @@ public function getFirstReturnValue(): mixed; public function getBodyCode(): string; - public function getImplementingClass(): ClassEntity; + public function getImplementingClass(): ClassLikeEntity; } diff --git a/src/LanguageHandler/Php/Parser/Entity/Property/PropertyEntity.php b/src/LanguageHandler/Php/Parser/Entity/Property/PropertyEntity.php index fcb778aa..41383347 100644 --- a/src/LanguageHandler/Php/Parser/Entity/Property/PropertyEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/Property/PropertyEntity.php @@ -10,7 +10,7 @@ use BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException; use BumbleDocGen\Core\Parser\Entity\Cache\CacheableMethod; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection; use BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper; use BumbleDocGen\LanguageHandler\Php\Parser\PhpParser\NodeValueCompiler; @@ -61,7 +61,7 @@ class PropertyEntity extends BaseEntity public function __construct( Configuration $configuration, - private ClassEntity $classEntity, + private ClassLikeEntity $classEntity, private ParserHelper $parserHelper, private Standard $astPrinter, private LocalObjectCache $localObjectCache, @@ -77,7 +77,7 @@ public function __construct( ); } - public function getRootEntity(): ClassEntity + public function getRootEntity(): ClassLikeEntity { return $this->classEntity; } @@ -215,7 +215,7 @@ public function getImplementingClassName(): string return $this->implementingClassName; } - public function getImplementingClass(): ClassEntity + public function getImplementingClass(): ClassLikeEntity { return $this->getRootEntityCollection()->getLoadedOrCreateNew($this->getImplementingClassName()); } diff --git a/src/LanguageHandler/Php/Parser/Entity/Property/PropertyEntityCollection.php b/src/LanguageHandler/Php/Parser/Entity/Property/PropertyEntityCollection.php index 206b4c7d..640ab4e5 100644 --- a/src/LanguageHandler/Php/Parser/Entity/Property/PropertyEntityCollection.php +++ b/src/LanguageHandler/Php/Parser/Entity/Property/PropertyEntityCollection.php @@ -7,7 +7,7 @@ use BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException; use BumbleDocGen\Core\Parser\Entity\BaseEntityCollection; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Cache\CacheablePhpEntityFactory; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; use BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings; use DI\DependencyException; use DI\NotFoundException; @@ -15,7 +15,7 @@ final class PropertyEntityCollection extends BaseEntityCollection { public function __construct( - private ClassEntity $classEntity, + private ClassLikeEntity $classEntity, private PhpHandlerSettings $phpHandlerSettings, private CacheablePhpEntityFactory $cacheablePhpEntityFactory ) { diff --git a/src/LanguageHandler/Php/Parser/Entity/TraitEntity.php b/src/LanguageHandler/Php/Parser/Entity/TraitEntity.php new file mode 100644 index 00000000..b05c61fe --- /dev/null +++ b/src/LanguageHandler/Php/Parser/Entity/TraitEntity.php @@ -0,0 +1,29 @@ +getAbsoluteFileName(); if (!$fileName) { @@ -261,7 +261,7 @@ public function getUsesListByClassEntity(ClassEntity $classEntity, bool $extende */ public function parseFullClassName( string $searchClassName, - ClassEntity $parentClassEntity, + ClassLikeEntity $parentClassEntity, bool $extended = true ): string { $classNameParts = explode('::', $searchClassName); @@ -334,7 +334,7 @@ private function getDocBlockFactory(): DocBlockFactory /** * @throws InvalidConfigurationParameterException */ - public function getDocBlock(ClassEntity $classEntity, string $docComment, ?int $lineNumber = null): DocBlock + public function getDocBlock(ClassLikeEntity $classEntity, string $docComment, ?int $lineNumber = null): DocBlock { $docComment = $docComment ?: ' '; $cacheKey = md5("{$classEntity->getName()}{$docComment}{$lineNumber}"); @@ -365,7 +365,7 @@ public function getDocBlock(ClassEntity $classEntity, string $docComment, ?int $ /** * @throws InvalidConfigurationParameterException */ - public function getDocBlockContext(ClassEntity $classEntity): Context + public function getDocBlockContext(ClassLikeEntity $classEntity): Context { try { return $this->localObjectCache->getMethodCachedResult(__METHOD__, $classEntity->getName()); diff --git a/src/LanguageHandler/Php/Parser/PhpParser/NodeValueCompiler.php b/src/LanguageHandler/Php/Parser/PhpParser/NodeValueCompiler.php index 849139dc..2f9cd561 100644 --- a/src/LanguageHandler/Php/Parser/PhpParser/NodeValueCompiler.php +++ b/src/LanguageHandler/Php/Parser/PhpParser/NodeValueCompiler.php @@ -5,7 +5,7 @@ namespace BumbleDocGen\LanguageHandler\Php\Parser\PhpParser; use BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Constant\ConstantEntity; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Method\MethodEntity; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Property\PropertyEntity; @@ -29,7 +29,7 @@ private function __construct() */ public static function compile( Node\Stmt\Expression|Node $node, - MethodEntity|PropertyEntity|ConstantEntity|ClassEntity $entity + MethodEntity|PropertyEntity|ConstantEntity|ClassLikeEntity $entity ): mixed { if (is_a($node, \PhpParser\Node\Expr\Array_::class)) { $compiledValue = []; @@ -49,7 +49,7 @@ public static function compile( Node\Expr\ClassConstFetch::class => self::getClassConstantValue($node, $entity), Node\Scalar\MagicConst\Dir::class => dirname($entity->getRelativeFileName()), Node\Scalar\MagicConst\File::class => $entity->getRelativeFileName(), - Node\Scalar\MagicConst\Class_::class => is_a($entity, ClassEntity::class) ? $entity->getName() : $entity->getRootEntity()->getName(), + Node\Scalar\MagicConst\Class_::class => is_a($entity, ClassLikeEntity::class) ? $entity->getName() : $entity->getRootEntity()->getName(), Node\Scalar\MagicConst\Line::class => $node->getLine(), Node\Scalar\MagicConst\Namespace_::class => $entity->getNamespaceName(), Node\Scalar\MagicConst\Method::class => is_a($entity, MethodEntity::class) ? $entity->getRootEntity()->getName() . '::' . $entity->getName() : '', @@ -93,7 +93,7 @@ private static function getFuncCallValue(Node\Expr\FuncCall $node): mixed */ private static function getStaticCallValue( Node\Expr\StaticCall $node, - MethodEntity|PropertyEntity|ConstantEntity|ClassEntity $entity + MethodEntity|PropertyEntity|ConstantEntity|ClassLikeEntity $entity ): mixed { $className = self::resolveClassName($node->class->toString(), $entity); if ($entity->getName() !== $className) { @@ -117,7 +117,7 @@ private static function getStaticCallValue( */ private static function getStaticPropertyValue( Node\Expr\StaticPropertyFetch $node, - MethodEntity|PropertyEntity|ConstantEntity|ClassEntity $entity + MethodEntity|PropertyEntity|ConstantEntity|ClassLikeEntity $entity ): mixed { $className = self::resolveClassName($node->class->toString(), $entity); if ($entity->getName() !== $className) { @@ -137,13 +137,13 @@ private static function getStaticPropertyValue( */ private static function getClassConstantValue( Node\Expr\ClassConstFetch $node, - MethodEntity|PropertyEntity|ConstantEntity|ClassEntity $entity + MethodEntity|PropertyEntity|ConstantEntity|ClassLikeEntity $entity ): mixed { $className = self::resolveClassName($node->class->toString(), $entity); $constantName = $node->name->toString(); - if (!$entity instanceof ClassEntity) { + if (!$entity instanceof ClassLikeEntity) { $entity = $entity->getRootEntity(); } if ($entity->getName() !== $className) { @@ -170,13 +170,13 @@ private static function getClassConstantValue( */ private static function resolveClassName( string $className, - MethodEntity|PropertyEntity|ConstantEntity|ClassEntity $entity + MethodEntity|PropertyEntity|ConstantEntity|ClassLikeEntity $entity ): string { if ($className !== 'self' && $className !== 'static' && $className !== 'parent') { return $className; } $classEntity = $entity; - if (!$entity instanceof ClassEntity) { + if (!$entity instanceof ClassLikeEntity) { $classEntity = $entity->getRootEntity(); } return $className === 'parent' ? $classEntity->getParentClassName() : $classEntity->getName(); diff --git a/src/LanguageHandler/Php/Plugin/Event/Entity/OnCheckIsClassEntityCanBeLoad.php b/src/LanguageHandler/Php/Plugin/Event/Entity/OnCheckIsClassEntityCanBeLoad.php index 9c2244ea..09fdeb6e 100644 --- a/src/LanguageHandler/Php/Plugin/Event/Entity/OnCheckIsClassEntityCanBeLoad.php +++ b/src/LanguageHandler/Php/Plugin/Event/Entity/OnCheckIsClassEntityCanBeLoad.php @@ -4,18 +4,18 @@ namespace BumbleDocGen\LanguageHandler\Php\Plugin\Event\Entity; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; use Symfony\Contracts\EventDispatcher\Event; final class OnCheckIsClassEntityCanBeLoad extends Event { public bool $classCanBeLoad = true; - public function __construct(private ClassEntity $entity) + public function __construct(private ClassLikeEntity $entity) { } - public function getEntity(): ClassEntity + public function getEntity(): ClassLikeEntity { return $this->entity; } diff --git a/src/LanguageHandler/Php/Plugin/Event/Parser/OnAddClassEntityToCollection.php b/src/LanguageHandler/Php/Plugin/Event/Parser/OnAddClassEntityToCollection.php index d6410ebf..2a952d64 100644 --- a/src/LanguageHandler/Php/Plugin/Event/Parser/OnAddClassEntityToCollection.php +++ b/src/LanguageHandler/Php/Plugin/Event/Parser/OnAddClassEntityToCollection.php @@ -5,7 +5,7 @@ namespace BumbleDocGen\LanguageHandler\Php\Plugin\Event\Parser; use BumbleDocGen\Core\Plugin\OnlySingleExecutionEvent; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection; use Symfony\Contracts\EventDispatcher\Event; @@ -15,7 +15,7 @@ final class OnAddClassEntityToCollection extends Event implements OnlySingleExecutionEvent { public function __construct( - private ClassEntity $classEntity, + private ClassLikeEntity $classEntity, private ClassEntityCollection $classEntityCollection ) { } @@ -30,7 +30,7 @@ public function getClassEntityCollection(): ClassEntityCollection return $this->classEntityCollection; } - public function getRootEntity(): ClassEntity + public function getRootEntity(): ClassLikeEntity { return $this->classEntity; } diff --git a/src/LanguageHandler/Php/Renderer/EntityDocRenderer/PhpClassToMd/PhpClassToMdDocRenderer.php b/src/LanguageHandler/Php/Renderer/EntityDocRenderer/PhpClassToMd/PhpClassToMdDocRenderer.php index 5c1ffca3..908297ff 100644 --- a/src/LanguageHandler/Php/Renderer/EntityDocRenderer/PhpClassToMd/PhpClassToMdDocRenderer.php +++ b/src/LanguageHandler/Php/Renderer/EntityDocRenderer/PhpClassToMd/PhpClassToMdDocRenderer.php @@ -7,7 +7,7 @@ use BumbleDocGen\Core\Parser\Entity\RootEntityInterface; use BumbleDocGen\Core\Renderer\Context\DocumentedEntityWrapper; use BumbleDocGen\Core\Renderer\EntityDocRenderer\EntityDocRendererInterface; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; use Twig\Error\LoaderError; use Twig\Error\RuntimeError; use Twig\Error\SyntaxError; @@ -38,7 +38,7 @@ public function getDocFileNamespace(): string public function isAvailableForEntity(RootEntityInterface $entity): bool { - return is_a($entity, ClassEntity::class); + return is_a($entity, ClassLikeEntity::class); } /** diff --git a/src/LanguageHandler/Php/Renderer/Twig/Function/DrawClassMap.php b/src/LanguageHandler/Php/Renderer/Twig/Function/DrawClassMap.php index be02d219..3d8cdb0e 100644 --- a/src/LanguageHandler/Php/Renderer/Twig/Function/DrawClassMap.php +++ b/src/LanguageHandler/Php/Renderer/Twig/Function/DrawClassMap.php @@ -8,7 +8,7 @@ use BumbleDocGen\Core\Parser\Entity\RootEntityCollectionsGroup; use BumbleDocGen\Core\Renderer\Twig\Function\CustomFunctionInterface; use BumbleDocGen\Core\Renderer\Twig\Function\GetDocumentedEntityUrl; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection; use DI\DependencyException; use DI\NotFoundException; @@ -66,7 +66,7 @@ public function __invoke( /** * @throws InvalidConfigurationParameterException */ - protected function appendClassToDirectoryStructure(array $directoryStructure, ClassEntity $classEntity): array + protected function appendClassToDirectoryStructure(array $directoryStructure, ClassLikeEntity $classEntity): array { $entityCollection = $this->rootEntityCollectionsGroup->get(ClassEntityCollection::NAME); $this->fileClassmap[$classEntity->getFileName()] = call_user_func_array( From dd00cc7abc8f4896237c12909fc15407563e4e56 Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Mon, 20 Nov 2023 17:04:24 +0300 Subject: [PATCH 064/210] Moving sub entities to a new namespace --- src/AI/Generators/DocBlocksGenerator.php | 2 +- src/LanguageHandler/Php/Parser/Entity/BaseEntity.php | 6 +++--- .../Entity/Cache/CacheablePhpEntityFactory.php | 10 +++++----- .../Php/Parser/Entity/ClassLikeEntity.php | 12 ++++++------ .../{ => SubEntity}/Constant/ConstantEntity.php | 4 ++-- .../Constant/ConstantEntityCollection.php | 2 +- .../{ => SubEntity}/Method/DynamicMethodEntity.php | 2 +- .../Entity/{ => SubEntity}/Method/MethodEntity.php | 4 ++-- .../Method/MethodEntityCollection.php | 2 +- .../{ => SubEntity}/Method/MethodEntityInterface.php | 2 +- .../{ => SubEntity}/Property/PropertyEntity.php | 4 ++-- .../Property/PropertyEntityCollection.php | 2 +- .../VisibilityCondition.php | 2 +- .../OnlyFromCurrentClassCondition.php | 2 +- .../MethodFilterCondition/VisibilityCondition.php | 2 +- .../OnlyFromCurrentClassCondition.php | 2 +- .../PropertyFilterCondition/VisibilityCondition.php | 2 +- .../Php/Parser/PhpParser/NodeValueCompiler.php | 6 +++--- .../IsPrivateConditionTest.php | 2 +- .../IsProtectedConditionTest.php | 2 +- .../IsPublicConditionTest.php | 2 +- .../VisibilityConditionTest.php | 2 +- .../MethodFilterCondition/IsPrivateConditionTest.php | 2 +- .../IsProtectedConditionTest.php | 2 +- .../MethodFilterCondition/IsPublicConditionTest.php | 2 +- .../VisibilityConditionTest.php | 2 +- .../IsPrivateConditionTest.php | 2 +- .../IsProtectedConditionTest.php | 2 +- .../IsPublicConditionTest.php | 2 +- .../VisibilityConditionTest.php | 2 +- 30 files changed, 46 insertions(+), 46 deletions(-) rename src/LanguageHandler/Php/Parser/Entity/{ => SubEntity}/Constant/ConstantEntity.php (98%) rename src/LanguageHandler/Php/Parser/Entity/{ => SubEntity}/Constant/ConstantEntityCollection.php (97%) rename src/LanguageHandler/Php/Parser/Entity/{ => SubEntity}/Method/DynamicMethodEntity.php (98%) rename src/LanguageHandler/Php/Parser/Entity/{ => SubEntity}/Method/MethodEntity.php (99%) rename src/LanguageHandler/Php/Parser/Entity/{ => SubEntity}/Method/MethodEntityCollection.php (98%) rename src/LanguageHandler/Php/Parser/Entity/{ => SubEntity}/Method/MethodEntityInterface.php (93%) rename src/LanguageHandler/Php/Parser/Entity/{ => SubEntity}/Property/PropertyEntity.php (99%) rename src/LanguageHandler/Php/Parser/Entity/{ => SubEntity}/Property/PropertyEntityCollection.php (97%) diff --git a/src/AI/Generators/DocBlocksGenerator.php b/src/AI/Generators/DocBlocksGenerator.php index 0ca22094..f3965204 100644 --- a/src/AI/Generators/DocBlocksGenerator.php +++ b/src/AI/Generators/DocBlocksGenerator.php @@ -8,7 +8,7 @@ use BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException; use BumbleDocGen\Core\Parser\Entity\RootEntityInterface; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Method\MethodEntity; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntity; use BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper; use DI\DependencyException; use DI\NotFoundException; diff --git a/src/LanguageHandler/Php/Parser/Entity/BaseEntity.php b/src/LanguageHandler/Php/Parser/Entity/BaseEntity.php index dba3ebb2..bb733f14 100644 --- a/src/LanguageHandler/Php/Parser/Entity/BaseEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/BaseEntity.php @@ -15,9 +15,9 @@ use BumbleDocGen\Core\Parser\Entity\EntityInterface; use BumbleDocGen\Core\Renderer\RendererHelper; use BumbleDocGen\Core\Renderer\Twig\Function\GetDocumentedEntityUrl; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Constant\ConstantEntity; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Method\MethodEntity; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Property\PropertyEntity; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Constant\ConstantEntity; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntity; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntity; use BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper; use BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings; use BumbleDocGen\LanguageHandler\Php\Plugin\Event\Entity\OnCheckIsClassEntityCanBeLoad; diff --git a/src/LanguageHandler/Php/Parser/Entity/Cache/CacheablePhpEntityFactory.php b/src/LanguageHandler/Php/Parser/Entity/Cache/CacheablePhpEntityFactory.php index bb8c4d32..02e59666 100644 --- a/src/LanguageHandler/Php/Parser/Entity/Cache/CacheablePhpEntityFactory.php +++ b/src/LanguageHandler/Php/Parser/Entity/Cache/CacheablePhpEntityFactory.php @@ -10,14 +10,14 @@ use BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityWrapperFactory; use BumbleDocGen\LanguageHandler\Php\Parser\ComposerHelper; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Constant\ConstantEntity; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\EnumEntity; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\InterfaceEntity; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Method\DynamicMethodEntity; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Method\MethodEntity; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Property\PropertyEntity; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Constant\ConstantEntity; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\DynamicMethodEntity; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntity; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntity; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\TraitEntity; use DI\Container; use DI\DependencyException; diff --git a/src/LanguageHandler/Php/Parser/Entity/ClassLikeEntity.php b/src/LanguageHandler/Php/Parser/Entity/ClassLikeEntity.php index 4a832ab3..b7bddfed 100644 --- a/src/LanguageHandler/Php/Parser/Entity/ClassLikeEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/ClassLikeEntity.php @@ -14,12 +14,12 @@ use BumbleDocGen\Core\Renderer\EntityDocRenderer\EntityDocRendererInterface; use BumbleDocGen\Core\Renderer\Twig\Filter\PrepareSourceLink; use BumbleDocGen\LanguageHandler\Php\Parser\ComposerHelper; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Constant\ConstantEntity; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Constant\ConstantEntityCollection; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Method\MethodEntity; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Method\MethodEntityCollection; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Property\PropertyEntity; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Property\PropertyEntityCollection; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Constant\ConstantEntity; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Constant\ConstantEntityCollection; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntity; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntityCollection; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntity; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntityCollection; use BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper; use BumbleDocGen\LanguageHandler\Php\Parser\PhpParser\NodeValueCompiler; use BumbleDocGen\LanguageHandler\Php\Parser\PhpParser\PhpParserHelper; diff --git a/src/LanguageHandler/Php/Parser/Entity/Constant/ConstantEntity.php b/src/LanguageHandler/Php/Parser/Entity/SubEntity/Constant/ConstantEntity.php similarity index 98% rename from src/LanguageHandler/Php/Parser/Entity/Constant/ConstantEntity.php rename to src/LanguageHandler/Php/Parser/Entity/SubEntity/Constant/ConstantEntity.php index 6a717f7e..65214481 100644 --- a/src/LanguageHandler/Php/Parser/Entity/Constant/ConstantEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/SubEntity/Constant/ConstantEntity.php @@ -2,15 +2,15 @@ declare(strict_types=1); -namespace BumbleDocGen\LanguageHandler\Php\Parser\Entity\Constant; +namespace BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Constant; use BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache; use BumbleDocGen\Core\Configuration\Configuration; use BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException; use BumbleDocGen\Core\Parser\Entity\Cache\CacheableMethod; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; use BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper; use BumbleDocGen\LanguageHandler\Php\Parser\PhpParser\NodeValueCompiler; use BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings; diff --git a/src/LanguageHandler/Php/Parser/Entity/Constant/ConstantEntityCollection.php b/src/LanguageHandler/Php/Parser/Entity/SubEntity/Constant/ConstantEntityCollection.php similarity index 97% rename from src/LanguageHandler/Php/Parser/Entity/Constant/ConstantEntityCollection.php rename to src/LanguageHandler/Php/Parser/Entity/SubEntity/Constant/ConstantEntityCollection.php index d14abbae..b51a104d 100644 --- a/src/LanguageHandler/Php/Parser/Entity/Constant/ConstantEntityCollection.php +++ b/src/LanguageHandler/Php/Parser/Entity/SubEntity/Constant/ConstantEntityCollection.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace BumbleDocGen\LanguageHandler\Php\Parser\Entity\Constant; +namespace BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Constant; use BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException; use BumbleDocGen\Core\Parser\Entity\BaseEntityCollection; diff --git a/src/LanguageHandler/Php/Parser/Entity/Method/DynamicMethodEntity.php b/src/LanguageHandler/Php/Parser/Entity/SubEntity/Method/DynamicMethodEntity.php similarity index 98% rename from src/LanguageHandler/Php/Parser/Entity/Method/DynamicMethodEntity.php rename to src/LanguageHandler/Php/Parser/Entity/SubEntity/Method/DynamicMethodEntity.php index 8ec35dc6..de14244f 100644 --- a/src/LanguageHandler/Php/Parser/Entity/Method/DynamicMethodEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/SubEntity/Method/DynamicMethodEntity.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace BumbleDocGen\LanguageHandler\Php\Parser\Entity\Method; +namespace BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method; use BumbleDocGen\Core\Configuration\Configuration; use BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException; diff --git a/src/LanguageHandler/Php/Parser/Entity/Method/MethodEntity.php b/src/LanguageHandler/Php/Parser/Entity/SubEntity/Method/MethodEntity.php similarity index 99% rename from src/LanguageHandler/Php/Parser/Entity/Method/MethodEntity.php rename to src/LanguageHandler/Php/Parser/Entity/SubEntity/Method/MethodEntity.php index 020187dd..5937761d 100644 --- a/src/LanguageHandler/Php/Parser/Entity/Method/MethodEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/SubEntity/Method/MethodEntity.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace BumbleDocGen\LanguageHandler\Php\Parser\Entity\Method; +namespace BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method; use BumbleDocGen\Core\Cache\LocalCache\Exception\ObjectNotFoundException; use BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache; @@ -10,8 +10,8 @@ use BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException; use BumbleDocGen\Core\Parser\Entity\Cache\CacheableMethod; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; use BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper; use BumbleDocGen\LanguageHandler\Php\Parser\PhpParser\NodeValueCompiler; use BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings; diff --git a/src/LanguageHandler/Php/Parser/Entity/Method/MethodEntityCollection.php b/src/LanguageHandler/Php/Parser/Entity/SubEntity/Method/MethodEntityCollection.php similarity index 98% rename from src/LanguageHandler/Php/Parser/Entity/Method/MethodEntityCollection.php rename to src/LanguageHandler/Php/Parser/Entity/SubEntity/Method/MethodEntityCollection.php index 1193ad71..d60ca2f0 100644 --- a/src/LanguageHandler/Php/Parser/Entity/Method/MethodEntityCollection.php +++ b/src/LanguageHandler/Php/Parser/Entity/SubEntity/Method/MethodEntityCollection.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace BumbleDocGen\LanguageHandler\Php\Parser\Entity\Method; +namespace BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method; use BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException; use BumbleDocGen\Core\Parser\Entity\BaseEntityCollection; diff --git a/src/LanguageHandler/Php/Parser/Entity/Method/MethodEntityInterface.php b/src/LanguageHandler/Php/Parser/Entity/SubEntity/Method/MethodEntityInterface.php similarity index 93% rename from src/LanguageHandler/Php/Parser/Entity/Method/MethodEntityInterface.php rename to src/LanguageHandler/Php/Parser/Entity/SubEntity/Method/MethodEntityInterface.php index 0d2e1cf7..aa50fea1 100644 --- a/src/LanguageHandler/Php/Parser/Entity/Method/MethodEntityInterface.php +++ b/src/LanguageHandler/Php/Parser/Entity/SubEntity/Method/MethodEntityInterface.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace BumbleDocGen\LanguageHandler\Php\Parser\Entity\Method; +namespace BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method; use BumbleDocGen\Core\Parser\Entity\EntityInterface; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; diff --git a/src/LanguageHandler/Php/Parser/Entity/Property/PropertyEntity.php b/src/LanguageHandler/Php/Parser/Entity/SubEntity/Property/PropertyEntity.php similarity index 99% rename from src/LanguageHandler/Php/Parser/Entity/Property/PropertyEntity.php rename to src/LanguageHandler/Php/Parser/Entity/SubEntity/Property/PropertyEntity.php index 41383347..8f4587ab 100644 --- a/src/LanguageHandler/Php/Parser/Entity/Property/PropertyEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/SubEntity/Property/PropertyEntity.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace BumbleDocGen\LanguageHandler\Php\Parser\Entity\Property; +namespace BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property; use BumbleDocGen\Core\Cache\LocalCache\Exception\ObjectNotFoundException; use BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache; @@ -10,8 +10,8 @@ use BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException; use BumbleDocGen\Core\Parser\Entity\Cache\CacheableMethod; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; use BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper; use BumbleDocGen\LanguageHandler\Php\Parser\PhpParser\NodeValueCompiler; use BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings; diff --git a/src/LanguageHandler/Php/Parser/Entity/Property/PropertyEntityCollection.php b/src/LanguageHandler/Php/Parser/Entity/SubEntity/Property/PropertyEntityCollection.php similarity index 97% rename from src/LanguageHandler/Php/Parser/Entity/Property/PropertyEntityCollection.php rename to src/LanguageHandler/Php/Parser/Entity/SubEntity/Property/PropertyEntityCollection.php index 640ab4e5..52f15425 100644 --- a/src/LanguageHandler/Php/Parser/Entity/Property/PropertyEntityCollection.php +++ b/src/LanguageHandler/Php/Parser/Entity/SubEntity/Property/PropertyEntityCollection.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace BumbleDocGen\LanguageHandler\Php\Parser\Entity\Property; +namespace BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property; use BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException; use BumbleDocGen\Core\Parser\Entity\BaseEntityCollection; diff --git a/src/LanguageHandler/Php/Parser/FilterCondition/ClassConstantFilterCondition/VisibilityCondition.php b/src/LanguageHandler/Php/Parser/FilterCondition/ClassConstantFilterCondition/VisibilityCondition.php index 9d7a9e76..3fc10ff3 100644 --- a/src/LanguageHandler/Php/Parser/FilterCondition/ClassConstantFilterCondition/VisibilityCondition.php +++ b/src/LanguageHandler/Php/Parser/FilterCondition/ClassConstantFilterCondition/VisibilityCondition.php @@ -6,7 +6,7 @@ use BumbleDocGen\Core\Parser\Entity\EntityInterface; use BumbleDocGen\Core\Parser\FilterCondition\ConditionInterface; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Constant\ConstantEntity; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Constant\ConstantEntity; use BumbleDocGen\LanguageHandler\Php\Parser\FilterCondition\ClassFilterCondition\VisibilityConditionModifier; /** diff --git a/src/LanguageHandler/Php/Parser/FilterCondition/MethodFilterCondition/OnlyFromCurrentClassCondition.php b/src/LanguageHandler/Php/Parser/FilterCondition/MethodFilterCondition/OnlyFromCurrentClassCondition.php index fbea22d9..af01d159 100644 --- a/src/LanguageHandler/Php/Parser/FilterCondition/MethodFilterCondition/OnlyFromCurrentClassCondition.php +++ b/src/LanguageHandler/Php/Parser/FilterCondition/MethodFilterCondition/OnlyFromCurrentClassCondition.php @@ -6,7 +6,7 @@ use BumbleDocGen\Core\Parser\Entity\EntityInterface; use BumbleDocGen\Core\Parser\FilterCondition\ConditionInterface; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Method\MethodEntity; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntity; /** * Only methods that belong to the current class (not parent) diff --git a/src/LanguageHandler/Php/Parser/FilterCondition/MethodFilterCondition/VisibilityCondition.php b/src/LanguageHandler/Php/Parser/FilterCondition/MethodFilterCondition/VisibilityCondition.php index 62ee6762..7177f361 100644 --- a/src/LanguageHandler/Php/Parser/FilterCondition/MethodFilterCondition/VisibilityCondition.php +++ b/src/LanguageHandler/Php/Parser/FilterCondition/MethodFilterCondition/VisibilityCondition.php @@ -6,7 +6,7 @@ use BumbleDocGen\Core\Parser\Entity\EntityInterface; use BumbleDocGen\Core\Parser\FilterCondition\ConditionInterface; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Method\MethodEntity; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntity; use BumbleDocGen\LanguageHandler\Php\Parser\FilterCondition\ClassFilterCondition\VisibilityConditionModifier; /** diff --git a/src/LanguageHandler/Php/Parser/FilterCondition/PropertyFilterCondition/OnlyFromCurrentClassCondition.php b/src/LanguageHandler/Php/Parser/FilterCondition/PropertyFilterCondition/OnlyFromCurrentClassCondition.php index 579e86e0..95cddf68 100644 --- a/src/LanguageHandler/Php/Parser/FilterCondition/PropertyFilterCondition/OnlyFromCurrentClassCondition.php +++ b/src/LanguageHandler/Php/Parser/FilterCondition/PropertyFilterCondition/OnlyFromCurrentClassCondition.php @@ -6,7 +6,7 @@ use BumbleDocGen\Core\Parser\Entity\EntityInterface; use BumbleDocGen\Core\Parser\FilterCondition\ConditionInterface; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Property\PropertyEntity; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntity; /** * Only properties that belong to the current class (not parent) diff --git a/src/LanguageHandler/Php/Parser/FilterCondition/PropertyFilterCondition/VisibilityCondition.php b/src/LanguageHandler/Php/Parser/FilterCondition/PropertyFilterCondition/VisibilityCondition.php index 218df687..bf56157f 100644 --- a/src/LanguageHandler/Php/Parser/FilterCondition/PropertyFilterCondition/VisibilityCondition.php +++ b/src/LanguageHandler/Php/Parser/FilterCondition/PropertyFilterCondition/VisibilityCondition.php @@ -6,7 +6,7 @@ use BumbleDocGen\Core\Parser\Entity\EntityInterface; use BumbleDocGen\Core\Parser\FilterCondition\ConditionInterface; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Property\PropertyEntity; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntity; use BumbleDocGen\LanguageHandler\Php\Parser\FilterCondition\ClassFilterCondition\VisibilityConditionModifier; /** diff --git a/src/LanguageHandler/Php/Parser/PhpParser/NodeValueCompiler.php b/src/LanguageHandler/Php/Parser/PhpParser/NodeValueCompiler.php index 2f9cd561..c0d8f20f 100644 --- a/src/LanguageHandler/Php/Parser/PhpParser/NodeValueCompiler.php +++ b/src/LanguageHandler/Php/Parser/PhpParser/NodeValueCompiler.php @@ -6,9 +6,9 @@ use BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Constant\ConstantEntity; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Method\MethodEntity; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Property\PropertyEntity; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Constant\ConstantEntity; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntity; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntity; use DI\DependencyException; use DI\NotFoundException; use PhpParser\ConstExprEvaluationException; diff --git a/tests/Unit/LanguageHandler/Php/Parser/FilterCondition/ClassConstantFilterCondition/IsPrivateConditionTest.php b/tests/Unit/LanguageHandler/Php/Parser/FilterCondition/ClassConstantFilterCondition/IsPrivateConditionTest.php index 3139da9a..0b8563bb 100644 --- a/tests/Unit/LanguageHandler/Php/Parser/FilterCondition/ClassConstantFilterCondition/IsPrivateConditionTest.php +++ b/tests/Unit/LanguageHandler/Php/Parser/FilterCondition/ClassConstantFilterCondition/IsPrivateConditionTest.php @@ -4,7 +4,7 @@ namespace Test\Unit\LanguageHandler\Php\Parser\FilterCondition\ClassConstantFilterCondition; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Constant\ConstantEntity; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Constant\ConstantEntity; use BumbleDocGen\LanguageHandler\Php\Parser\FilterCondition\ClassConstantFilterCondition\IsPrivateCondition; use PHPUnit\Framework\TestCase; diff --git a/tests/Unit/LanguageHandler/Php/Parser/FilterCondition/ClassConstantFilterCondition/IsProtectedConditionTest.php b/tests/Unit/LanguageHandler/Php/Parser/FilterCondition/ClassConstantFilterCondition/IsProtectedConditionTest.php index 558382da..25a60361 100644 --- a/tests/Unit/LanguageHandler/Php/Parser/FilterCondition/ClassConstantFilterCondition/IsProtectedConditionTest.php +++ b/tests/Unit/LanguageHandler/Php/Parser/FilterCondition/ClassConstantFilterCondition/IsProtectedConditionTest.php @@ -4,7 +4,7 @@ namespace Test\Unit\LanguageHandler\Php\Parser\FilterCondition\ClassConstantFilterCondition; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Constant\ConstantEntity; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Constant\ConstantEntity; use BumbleDocGen\LanguageHandler\Php\Parser\FilterCondition\ClassConstantFilterCondition\IsProtectedCondition; use PHPUnit\Framework\TestCase; diff --git a/tests/Unit/LanguageHandler/Php/Parser/FilterCondition/ClassConstantFilterCondition/IsPublicConditionTest.php b/tests/Unit/LanguageHandler/Php/Parser/FilterCondition/ClassConstantFilterCondition/IsPublicConditionTest.php index 11411785..ab0d4560 100644 --- a/tests/Unit/LanguageHandler/Php/Parser/FilterCondition/ClassConstantFilterCondition/IsPublicConditionTest.php +++ b/tests/Unit/LanguageHandler/Php/Parser/FilterCondition/ClassConstantFilterCondition/IsPublicConditionTest.php @@ -4,7 +4,7 @@ namespace Test\Unit\LanguageHandler\Php\Parser\FilterCondition\ClassConstantFilterCondition; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Constant\ConstantEntity; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Constant\ConstantEntity; use BumbleDocGen\LanguageHandler\Php\Parser\FilterCondition\ClassConstantFilterCondition\IsPublicCondition; use PHPUnit\Framework\TestCase; diff --git a/tests/Unit/LanguageHandler/Php/Parser/FilterCondition/ClassConstantFilterCondition/VisibilityConditionTest.php b/tests/Unit/LanguageHandler/Php/Parser/FilterCondition/ClassConstantFilterCondition/VisibilityConditionTest.php index de03f4ae..a8afbe4b 100644 --- a/tests/Unit/LanguageHandler/Php/Parser/FilterCondition/ClassConstantFilterCondition/VisibilityConditionTest.php +++ b/tests/Unit/LanguageHandler/Php/Parser/FilterCondition/ClassConstantFilterCondition/VisibilityConditionTest.php @@ -4,7 +4,7 @@ namespace Test\Unit\LanguageHandler\Php\Parser\FilterCondition\ClassConstantFilterCondition; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Constant\ConstantEntity; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Constant\ConstantEntity; use BumbleDocGen\LanguageHandler\Php\Parser\FilterCondition\ClassConstantFilterCondition\VisibilityCondition; use BumbleDocGen\LanguageHandler\Php\Parser\FilterCondition\ClassFilterCondition\VisibilityConditionModifier; use PHPUnit\Framework\TestCase; diff --git a/tests/Unit/LanguageHandler/Php/Parser/FilterCondition/MethodFilterCondition/IsPrivateConditionTest.php b/tests/Unit/LanguageHandler/Php/Parser/FilterCondition/MethodFilterCondition/IsPrivateConditionTest.php index f82c52ce..bfa7894d 100644 --- a/tests/Unit/LanguageHandler/Php/Parser/FilterCondition/MethodFilterCondition/IsPrivateConditionTest.php +++ b/tests/Unit/LanguageHandler/Php/Parser/FilterCondition/MethodFilterCondition/IsPrivateConditionTest.php @@ -4,7 +4,7 @@ namespace Test\Unit\LanguageHandler\Php\Parser\FilterCondition\MethodFilterCondition; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Method\MethodEntity; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntity; use BumbleDocGen\LanguageHandler\Php\Parser\FilterCondition\MethodFilterCondition\IsPrivateCondition; use PHPUnit\Framework\TestCase; diff --git a/tests/Unit/LanguageHandler/Php/Parser/FilterCondition/MethodFilterCondition/IsProtectedConditionTest.php b/tests/Unit/LanguageHandler/Php/Parser/FilterCondition/MethodFilterCondition/IsProtectedConditionTest.php index 608e5648..7ebe7216 100644 --- a/tests/Unit/LanguageHandler/Php/Parser/FilterCondition/MethodFilterCondition/IsProtectedConditionTest.php +++ b/tests/Unit/LanguageHandler/Php/Parser/FilterCondition/MethodFilterCondition/IsProtectedConditionTest.php @@ -4,7 +4,7 @@ namespace Test\Unit\LanguageHandler\Php\Parser\FilterCondition\MethodFilterCondition; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Method\MethodEntity; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntity; use BumbleDocGen\LanguageHandler\Php\Parser\FilterCondition\MethodFilterCondition\IsProtectedCondition; use PHPUnit\Framework\TestCase; diff --git a/tests/Unit/LanguageHandler/Php/Parser/FilterCondition/MethodFilterCondition/IsPublicConditionTest.php b/tests/Unit/LanguageHandler/Php/Parser/FilterCondition/MethodFilterCondition/IsPublicConditionTest.php index 352dcffb..37c28a1c 100644 --- a/tests/Unit/LanguageHandler/Php/Parser/FilterCondition/MethodFilterCondition/IsPublicConditionTest.php +++ b/tests/Unit/LanguageHandler/Php/Parser/FilterCondition/MethodFilterCondition/IsPublicConditionTest.php @@ -4,7 +4,7 @@ namespace Test\Unit\LanguageHandler\Php\Parser\FilterCondition\MethodFilterCondition; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Method\MethodEntity; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntity; use BumbleDocGen\LanguageHandler\Php\Parser\FilterCondition\MethodFilterCondition\IsPublicCondition; use PHPUnit\Framework\TestCase; diff --git a/tests/Unit/LanguageHandler/Php/Parser/FilterCondition/MethodFilterCondition/VisibilityConditionTest.php b/tests/Unit/LanguageHandler/Php/Parser/FilterCondition/MethodFilterCondition/VisibilityConditionTest.php index f94ccc40..6d5fe34f 100644 --- a/tests/Unit/LanguageHandler/Php/Parser/FilterCondition/MethodFilterCondition/VisibilityConditionTest.php +++ b/tests/Unit/LanguageHandler/Php/Parser/FilterCondition/MethodFilterCondition/VisibilityConditionTest.php @@ -4,7 +4,7 @@ namespace Test\Unit\LanguageHandler\Php\Parser\FilterCondition\MethodFilterCondition; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Method\MethodEntity; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntity; use BumbleDocGen\LanguageHandler\Php\Parser\FilterCondition\ClassFilterCondition\VisibilityConditionModifier; use BumbleDocGen\LanguageHandler\Php\Parser\FilterCondition\MethodFilterCondition\VisibilityCondition; use PHPUnit\Framework\TestCase; diff --git a/tests/Unit/LanguageHandler/Php/Parser/FilterCondition/PropertyFilterCondition/IsPrivateConditionTest.php b/tests/Unit/LanguageHandler/Php/Parser/FilterCondition/PropertyFilterCondition/IsPrivateConditionTest.php index 66106c01..9c3f908e 100644 --- a/tests/Unit/LanguageHandler/Php/Parser/FilterCondition/PropertyFilterCondition/IsPrivateConditionTest.php +++ b/tests/Unit/LanguageHandler/Php/Parser/FilterCondition/PropertyFilterCondition/IsPrivateConditionTest.php @@ -4,7 +4,7 @@ namespace Test\Unit\LanguageHandler\Php\Parser\FilterCondition\PropertyFilterCondition; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Property\PropertyEntity; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntity; use BumbleDocGen\LanguageHandler\Php\Parser\FilterCondition\PropertyFilterCondition\IsPrivateCondition; use PHPUnit\Framework\TestCase; diff --git a/tests/Unit/LanguageHandler/Php/Parser/FilterCondition/PropertyFilterCondition/IsProtectedConditionTest.php b/tests/Unit/LanguageHandler/Php/Parser/FilterCondition/PropertyFilterCondition/IsProtectedConditionTest.php index 01f319c5..191db71a 100644 --- a/tests/Unit/LanguageHandler/Php/Parser/FilterCondition/PropertyFilterCondition/IsProtectedConditionTest.php +++ b/tests/Unit/LanguageHandler/Php/Parser/FilterCondition/PropertyFilterCondition/IsProtectedConditionTest.php @@ -4,7 +4,7 @@ namespace Test\Unit\LanguageHandler\Php\Parser\FilterCondition\PropertyFilterCondition; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Property\PropertyEntity; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntity; use BumbleDocGen\LanguageHandler\Php\Parser\FilterCondition\PropertyFilterCondition\IsProtectedCondition; use PHPUnit\Framework\TestCase; diff --git a/tests/Unit/LanguageHandler/Php/Parser/FilterCondition/PropertyFilterCondition/IsPublicConditionTest.php b/tests/Unit/LanguageHandler/Php/Parser/FilterCondition/PropertyFilterCondition/IsPublicConditionTest.php index 61146608..b66419bd 100644 --- a/tests/Unit/LanguageHandler/Php/Parser/FilterCondition/PropertyFilterCondition/IsPublicConditionTest.php +++ b/tests/Unit/LanguageHandler/Php/Parser/FilterCondition/PropertyFilterCondition/IsPublicConditionTest.php @@ -4,7 +4,7 @@ namespace Test\Unit\LanguageHandler\Php\Parser\FilterCondition\PropertyFilterCondition; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Property\PropertyEntity; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntity; use BumbleDocGen\LanguageHandler\Php\Parser\FilterCondition\PropertyFilterCondition\IsPublicCondition; use PHPUnit\Framework\TestCase; diff --git a/tests/Unit/LanguageHandler/Php/Parser/FilterCondition/PropertyFilterCondition/VisibilityConditionTest.php b/tests/Unit/LanguageHandler/Php/Parser/FilterCondition/PropertyFilterCondition/VisibilityConditionTest.php index e2d6e9a3..b83893f3 100644 --- a/tests/Unit/LanguageHandler/Php/Parser/FilterCondition/PropertyFilterCondition/VisibilityConditionTest.php +++ b/tests/Unit/LanguageHandler/Php/Parser/FilterCondition/PropertyFilterCondition/VisibilityConditionTest.php @@ -4,7 +4,7 @@ namespace Test\Unit\LanguageHandler\Php\Parser\FilterCondition\PropertyFilterCondition; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Property\PropertyEntity; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntity; use BumbleDocGen\LanguageHandler\Php\Parser\FilterCondition\ClassFilterCondition\VisibilityConditionModifier; use BumbleDocGen\LanguageHandler\Php\Parser\FilterCondition\PropertyFilterCondition\VisibilityCondition; use PHPUnit\Framework\TestCase; From 48a06836411799d3ee735344aeba4d33e36dd860 Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Mon, 20 Nov 2023 17:30:23 +0300 Subject: [PATCH 065/210] Adding relativeFileName getter --- src/Core/Parser/Entity/EntityInterface.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Core/Parser/Entity/EntityInterface.php b/src/Core/Parser/Entity/EntityInterface.php index 7fe45cac..087c5e0c 100644 --- a/src/Core/Parser/Entity/EntityInterface.php +++ b/src/Core/Parser/Entity/EntityInterface.php @@ -22,6 +22,8 @@ public function getShortName(): string; */ public function getFileName(): ?string; + public function getRelativeFileName(): ?string; + /** * Returns the absolute path to a file if it can be retrieved and if the file is in the project directory */ From 2033d5dfd601a349a360f63877089a29a33d734b Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Mon, 20 Nov 2023 17:31:04 +0300 Subject: [PATCH 066/210] Optimizing collection filtering methods --- .../Parser/Entity/ClassEntityCollection.php | 109 ++++++++++-------- 1 file changed, 61 insertions(+), 48 deletions(-) diff --git a/src/LanguageHandler/Php/Parser/Entity/ClassEntityCollection.php b/src/LanguageHandler/Php/Parser/Entity/ClassEntityCollection.php index ae8988fb..12fffb7b 100644 --- a/src/LanguageHandler/Php/Parser/Entity/ClassEntityCollection.php +++ b/src/LanguageHandler/Php/Parser/Entity/ClassEntityCollection.php @@ -10,6 +10,7 @@ use BumbleDocGen\Core\Configuration\Configuration; use BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException; use BumbleDocGen\Core\Parser\Entity\LoggableRootEntityCollection; +use BumbleDocGen\Core\Parser\Entity\RootEntityInterface; use BumbleDocGen\Core\Plugin\PluginEventDispatcher; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Cache\CacheablePhpEntityFactory; use BumbleDocGen\LanguageHandler\Php\Parser\PhpParser\PhpParserHelper; @@ -198,13 +199,15 @@ public function getEntityByClassName(string $className, bool $createIfNotExists } /** + * Retrieving all entities that implement the specified interfaces. Filtering is only available for ClassLikeEntity. + * * @param string[] $interfaces * * @throws InvalidConfigurationParameterException */ public function filterByInterfaces(array $interfaces): ClassEntityCollection { - $classEntityCollection = $this->cloneForFiltration(); + $entitiesCollection = $this->cloneForFiltration(); $interfaces = array_map( fn($interface) => ltrim( str_replace('\\\\', '\\', $interface), @@ -212,25 +215,30 @@ public function filterByInterfaces(array $interfaces): ClassEntityCollection ), $interfaces ); - foreach ($classEntityCollection as $objectId => $classEntity) { - /**@var ClassLikeEntity $classEntity */ + foreach ($entitiesCollection as $objectId => $entity) { + if (!is_a($entity, ClassLikeEntity::class)) { + $entitiesCollection->remove($objectId); + continue; + } $entityInterfaces = array_map( fn($interface) => ltrim($interface, '\\'), - $classEntity->getInterfaceNames() + $entity->getInterfaceNames() ); if (!array_intersect($interfaces, $entityInterfaces)) { - $classEntityCollection->remove($objectId); + $entitiesCollection->remove($objectId); } } - return $classEntityCollection; + return $entitiesCollection; } /** + * Retrieving all entities that inherit from the specified classes. Filtering is only available for ClassLikeEntity. + * * @throws InvalidConfigurationParameterException */ public function filterByParentClassNames(array $parentClassNames): ClassEntityCollection { - $classEntityCollection = $this->cloneForFiltration(); + $entitiesCollection = $this->cloneForFiltration(); $parentClassNames = array_map( fn($parentClassName) => ltrim( str_replace('\\\\', '\\', $parentClassName), @@ -238,86 +246,92 @@ public function filterByParentClassNames(array $parentClassNames): ClassEntityCo ), $parentClassNames ); - foreach ($classEntityCollection as $objectId => $classEntity) { - /**@var ClassLikeEntity $classEntity */ + foreach ($entitiesCollection as $objectId => $entity) { + if (!is_a($entity, ClassLikeEntity::class)) { + $entitiesCollection->remove($objectId); + continue; + } + $entityParentClassNames = array_map( fn($parentClassName) => ltrim($parentClassName, '\\'), - $classEntity->getParentClassNames() + $entity->getParentClassNames() ); if (!array_intersect($parentClassNames, $entityParentClassNames)) { - $classEntityCollection->remove($objectId); + $entitiesCollection->remove($objectId); } } - return $classEntityCollection; + return $entitiesCollection; } /** + * Filtering entities by relative files paths (from project_root) of the project + * * @throws InvalidConfigurationParameterException */ public function filterByPaths(array $paths): ClassEntityCollection { - $classEntityCollection = $this->cloneForFiltration(); - foreach ($classEntityCollection as $objectId => $classEntity) { + $entitiesCollection = $this->cloneForFiltration(); + foreach ($entitiesCollection as $objectId => $entity) { $needToKeep = false; - /**@var ClassLikeEntity $classEntity */ + /**@var RootEntityInterface $entity */ foreach ($paths as $path) { - if (str_starts_with($classEntity->getFileName(), $path)) { + if (str_starts_with($entity->getRelativeFileName(), $path)) { $needToKeep = true; } } if (!$needToKeep) { - $classEntityCollection->remove($objectId); + $entitiesCollection->remove($objectId); } } - return $classEntityCollection; + return $entitiesCollection; } public function filterByNameRegularExpression(string $regexPattern): ClassEntityCollection { - $classEntityCollection = $this->cloneForFiltration(); - foreach ($classEntityCollection as $objectId => $classEntity) { - /**@var ClassLikeEntity $classEntity */ - if (!preg_match($regexPattern, $classEntity->getShortName())) { - $classEntityCollection->remove($objectId); + $entitiesCollection = $this->cloneForFiltration(); + foreach ($entitiesCollection as $objectId => $entity) { + /**@var RootEntityInterface $entity */ + if (!preg_match($regexPattern, $entity->getShortName())) { + $entitiesCollection->remove($objectId); } } - return $classEntityCollection; + return $entitiesCollection; } + /** + * Retrieving only instantiable entities. Filtering is only available for ClassLikeEntity. + */ public function getOnlyInstantiable(): ClassEntityCollection { - $classEntityCollection = $this->cloneForFiltration(); - foreach ($classEntityCollection as $objectId => $classEntity) { - /**@var ClassLikeEntity $classEntity */ - if (!$classEntity->isInstantiable()) { - $classEntityCollection->remove($objectId); + $entitiesCollection = $this->cloneForFiltration(); + foreach ($entitiesCollection as $objectId => $entity) { + if (!is_a($entity, ClassLikeEntity::class) || !$entity->isInstantiable()) { + $entitiesCollection->remove($objectId); } } - return $classEntityCollection; + return $entitiesCollection; } public function getOnlyInterfaces(): ClassEntityCollection { - $classEntityCollection = $this->cloneForFiltration(); - foreach ($classEntityCollection as $objectId => $classEntity) { - /**@var ClassLikeEntity $classEntity */ - if (!$classEntity->isInterface()) { - $classEntityCollection->remove($objectId); + $entitiesCollection = $this->cloneForFiltration(); + foreach ($entitiesCollection as $objectId => $entity) { + if (!is_a($entity, InterfaceEntity::class)) { + $entitiesCollection->remove($objectId); } } - return $classEntityCollection; + return $entitiesCollection; } public function getOnlyTraits(): ClassEntityCollection { - $classEntityCollection = $this->cloneForFiltration(); - foreach ($classEntityCollection as $objectId => $classEntity) { - /**@var ClassLikeEntity $classEntity */ - if (!$classEntity->isTrait()) { - $classEntityCollection->remove($objectId); + $entitiesCollection = $this->cloneForFiltration(); + foreach ($entitiesCollection as $objectId => $entity) { + if (!is_a($entity, TraitEntity::class)) { + $entitiesCollection->remove($objectId); } } - return $classEntityCollection; + return $entitiesCollection; } /** @@ -325,14 +339,13 @@ public function getOnlyTraits(): ClassEntityCollection */ public function getOnlyAbstractClasses(): ClassEntityCollection { - $classEntityCollection = $this->cloneForFiltration(); - foreach ($classEntityCollection as $objectId => $classEntity) { - /**@var ClassLikeEntity $classEntity */ - if (!$classEntity->isAbstract() || $classEntity->isInterface()) { - $classEntityCollection->remove($objectId); + $entitiesCollection = $this->cloneForFiltration(); + foreach ($entitiesCollection as $objectId => $entity) { + if (!is_a($entity, ClassEntity::class) || !$entity->isAbstract()) { + $entitiesCollection->remove($objectId); } } - return $classEntityCollection; + return $entitiesCollection; } /** From e9617721f79400620f5ca568bcec0a32d4dcee23 Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Mon, 20 Nov 2023 17:49:30 +0300 Subject: [PATCH 067/210] Refactor methods to get filenames --- .../TwigFilterClassParserPlugin.php | 2 +- .../TwigFunctionClassParserPlugin.php | 4 +-- .../templates/tech/2.parser/entity.md.twig | 4 +-- .../tech/4.pluginSystem/readme.md.twig | 2 +- src/Core/Parser/Entity/EntityInterface.php | 5 ---- src/DocGenerator.php | 4 +-- .../Php/Parser/Entity/BaseEntity.php | 6 ++--- .../Parser/Entity/ClassEntityCollection.php | 8 +++--- .../Php/Parser/Entity/ClassLikeEntity.php | 25 ++----------------- .../SubEntity/Constant/ConstantEntity.php | 4 +-- .../SubEntity/Method/DynamicMethodEntity.php | 6 ++--- .../Entity/SubEntity/Method/MethodEntity.php | 4 +-- .../Method/MethodEntityInterface.php | 2 -- .../SubEntity/Property/PropertyEntity.php | 4 +-- .../PhpClassToMd/templates/_constants.md.twig | 4 +-- .../Renderer/Twig/Function/DrawClassMap.php | 4 +-- 16 files changed, 29 insertions(+), 59 deletions(-) diff --git a/selfdoc/Plugin/TwigFilterClassParser/TwigFilterClassParserPlugin.php b/selfdoc/Plugin/TwigFilterClassParser/TwigFilterClassParserPlugin.php index 30e02dad..b341f4f4 100644 --- a/selfdoc/Plugin/TwigFilterClassParser/TwigFilterClassParserPlugin.php +++ b/selfdoc/Plugin/TwigFilterClassParser/TwigFilterClassParserPlugin.php @@ -93,7 +93,7 @@ private function isCustomTwigFilter(ClassLikeEntity $classEntity): bool if (!$classEntity->entityDataCanBeLoaded()) { continue; } - if (str_starts_with($classEntity->getFileName(), $dirName) && $classEntity->implementsInterface(CustomFilterInterface::class)) { + if (str_starts_with($classEntity->getRelativeFileName(), $dirName) && $classEntity->implementsInterface(CustomFilterInterface::class)) { return true; } } diff --git a/selfdoc/Plugin/TwigFunctionClassParser/TwigFunctionClassParserPlugin.php b/selfdoc/Plugin/TwigFunctionClassParser/TwigFunctionClassParserPlugin.php index 99bce11e..cd5d7c8b 100644 --- a/selfdoc/Plugin/TwigFunctionClassParser/TwigFunctionClassParserPlugin.php +++ b/selfdoc/Plugin/TwigFunctionClassParser/TwigFunctionClassParserPlugin.php @@ -88,7 +88,7 @@ public function afterLoadingClassEntityCollection(AfterLoadingClassEntityCollect private function isCustomTwigFunction(ClassLikeEntity $classEntity): bool { foreach (self::TWIG_FUNCTION_DIR_NAMES as $dirName) { - if ($classEntity->implementsInterface(CustomFunctionInterface::class) && str_starts_with($classEntity->getFileName(), $dirName)) { + if ($classEntity->implementsInterface(CustomFunctionInterface::class) && str_starts_with($classEntity->getRelativeFileName(), $dirName)) { return true; } } @@ -130,7 +130,7 @@ private function getFunctionData(ClassEntityCollection $classEntityCollection, s return null; } $entity = $classEntityCollection->getEntityByClassName($className); - if (str_starts_with($entity->getFileName(), '/selfdoc')) { + if (str_starts_with($entity->getRelativeFileName(), '/selfdoc')) { return null; } diff --git a/selfdoc/templates/tech/2.parser/entity.md.twig b/selfdoc/templates/tech/2.parser/entity.md.twig index a992b09b..c70c0e6d 100644 --- a/selfdoc/templates/tech/2.parser/entity.md.twig +++ b/selfdoc/templates/tech/2.parser/entity.md.twig @@ -54,7 +54,7 @@ The root collections ([a]RootEntityCollection[/a]), which are directly accessibl .filterByParentClassNames(['BumbleDocGen\\Core\\Parser\\Entity\\RootEntityCollection']) .getOnlyInstantiable() %} - {% set match = entityCollection.getFileName() | preg_match('/(\\/LanguageHandler\\/)([\\s\\S]*?)(?=\\/)/i') %} + {% set match = entityCollection.getRelativeFileName() | preg_match('/(\\/LanguageHandler\\/)([\\s\\S]*?)(?=\\/)/i') %} {{ drawDocumentedEntityLink(entityCollection) }} {{ entityCollection.getMethodEntity('getEntityCollectionName').getFirstReturnValue() }} @@ -81,7 +81,7 @@ These classes are a convenient wrapper for accessing data in templates: .filterByParentClassNames(['BumbleDocGen\\Core\\Parser\\Entity\\BaseEntityCollection']) .getOnlyInstantiable() %} - {% set match = entityCollection.getFileName() | preg_match('/(\\/LanguageHandler\\/)([\\s\\S]*?)(?=\\/)/i') %} + {% set match = entityCollection.getRelativeFileName() | preg_match('/(\\/LanguageHandler\\/)([\\s\\S]*?)(?=\\/)/i') %} {% set entitiesClasses = findEntitiesClassesByCollectionClassName(entityCollection.getName()) %} {% for entityClass in entitiesClasses %} diff --git a/selfdoc/templates/tech/4.pluginSystem/readme.md.twig b/selfdoc/templates/tech/4.pluginSystem/readme.md.twig index 241faa28..c69bcea4 100644 --- a/selfdoc/templates/tech/4.pluginSystem/readme.md.twig +++ b/selfdoc/templates/tech/4.pluginSystem/readme.md.twig @@ -37,7 +37,7 @@ Plugins for any programming languages work regardless of which language handler .filterByInterfaces(['BumbleDocGen\\Core\\Plugin\\PluginInterface']) .getOnlyInstantiable() %} -{% set match = pluginEntity.getFileName() | preg_match('/(\\/LanguageHandler\\/)([\\s\\S]*?)(?=\\/)/i') %} +{% set match = pluginEntity.getRelativeFileName() | preg_match('/(\\/LanguageHandler\\/)([\\s\\S]*?)(?=\\/)/i') %} {{ drawDocumentedEntityLink(pluginEntity) }} {% if match[2] %}{{ match[2] | upper }}{% else %}any{% endif %} diff --git a/src/Core/Parser/Entity/EntityInterface.php b/src/Core/Parser/Entity/EntityInterface.php index 087c5e0c..eb10fa6f 100644 --- a/src/Core/Parser/Entity/EntityInterface.php +++ b/src/Core/Parser/Entity/EntityInterface.php @@ -17,11 +17,6 @@ public function getName(): string; public function getShortName(): string; - /** - * Returns the relative path to a file if it can be retrieved and if the file is in the project directory - */ - public function getFileName(): ?string; - public function getRelativeFileName(): ?string; /** diff --git a/src/DocGenerator.php b/src/DocGenerator.php index 967aa23d..b603695c 100644 --- a/src/DocGenerator.php +++ b/src/DocGenerator.php @@ -144,7 +144,7 @@ public function addDocBlocks( )->getLocation()?->getLineNumber() : null; $lineNumber = $lineNumber ?: $methodEntity->getStartLine(); - foreach (file($entity->getFullFileName(), FILE_IGNORE_NEW_LINES) as $line => $lineContent) { + foreach (file($entity->getAbsoluteFileName(), FILE_IGNORE_NEW_LINES) as $line => $lineContent) { if ($line + 1 === $lineNumber) { $classFileLines[$line] = "[%docBlock%{$method}%]{$lineContent}"; break; @@ -156,7 +156,7 @@ public function addDocBlocks( $classFileContent = implode("\n", $classFileLines); $classFileContent = preg_replace(array_keys($toReplace), $toReplace, $classFileContent); - file_put_contents($entity->getFullFileName(), $classFileContent); + file_put_contents($entity->getAbsoluteFileName(), $classFileContent); $this->logger->notice("DocBlocks added"); } } diff --git a/src/LanguageHandler/Php/Parser/Entity/BaseEntity.php b/src/LanguageHandler/Php/Parser/Entity/BaseEntity.php index bb733f14..cce0046b 100644 --- a/src/LanguageHandler/Php/Parser/Entity/BaseEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/BaseEntity.php @@ -54,8 +54,6 @@ abstract public function getDocCommentEntity(): ClassLikeEntity|MethodEntity|Pro abstract public function getDescription(): string; - abstract public function getFileName(): ?string; - #[CacheableMethod] abstract public function getStartLine(): int; abstract public function getDocBlock(): DocBlock; @@ -86,7 +84,7 @@ final public function isEntityFileCanBeLoad(): bool */ public function getAbsoluteFileName(): ?string { - $relativeFileName = $this->getFileName(); + $relativeFileName = $this->getRelativeFileName(); return $relativeFileName ? $this->configuration->getProjectRoot() . $relativeFileName : null; } @@ -128,7 +126,7 @@ protected function prepareTypeString(string $type): string */ public function getFileSourceLink(bool $withLine = true): ?string { - $fileName = $this->getFileName(); + $fileName = $this->getRelativeFileName(); if (!$fileName) { return null; } diff --git a/src/LanguageHandler/Php/Parser/Entity/ClassEntityCollection.php b/src/LanguageHandler/Php/Parser/Entity/ClassEntityCollection.php index 12fffb7b..eda7df19 100644 --- a/src/LanguageHandler/Php/Parser/Entity/ClassEntityCollection.php +++ b/src/LanguageHandler/Php/Parser/Entity/ClassEntityCollection.php @@ -153,7 +153,7 @@ public function add(ClassLikeEntity $classEntity, bool $reload = false): ClassEn { $className = $classEntity->getName(); if (!isset($this->entities[$className]) || $reload || isset($this->entitiesNotHandledByPlugins[$className])) { - $this->logger->info("Parsing {$classEntity->getFileName()} file"); + $this->logger->info("Parsing {$classEntity->getRelativeFileName()} file"); $this->pluginEventDispatcher->dispatch(new OnAddClassEntityToCollection($classEntity, $this)); $this->entities[$className] = $classEntity; unset($this->entitiesNotHandledByPlugins[$className]); @@ -390,12 +390,12 @@ public function internalFindEntity(string $search, bool $useUnsafeKeys = true): $duplicates = []; foreach ($this->entities as $entity) { $index[$entity->getName()] = $entity; - if ($entity->entityDataCanBeLoaded() && $entity->getFileName()) { - $index[$entity->getFileName()] = $entity; + if ($entity->entityDataCanBeLoaded() && $entity->getRelativeFileName()) { + $index[$entity->getRelativeFileName()] = $entity; $index[$entity->getAbsoluteFileName()] = $entity; $index[$entity->getFileSourceLink(false)] = $entity; - $shortFileName = array_reverse(explode('/', $entity->getFileName()))[0]; + $shortFileName = array_reverse(explode('/', $entity->getRelativeFileName()))[0]; if (!isset($index[$shortFileName])) { $index[$shortFileName] = $entity; } else { diff --git a/src/LanguageHandler/Php/Parser/Entity/ClassLikeEntity.php b/src/LanguageHandler/Php/Parser/Entity/ClassLikeEntity.php index b7bddfed..4c88db22 100644 --- a/src/LanguageHandler/Php/Parser/Entity/ClassLikeEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/ClassLikeEntity.php @@ -170,11 +170,11 @@ public function getDocBlock(): DocBlock final public function isInGit(): bool { try { - if (!$this->getFileName()) { + if (!$this->getRelativeFileName()) { return false; } $filesInGit = $this->parserHelper->getFilesInGit(); - $fileName = ltrim($this->getFileName(), DIRECTORY_SEPARATOR); + $fileName = ltrim($this->getRelativeFileName(), DIRECTORY_SEPARATOR); return isset($filesInGit[$fileName]); } catch (\Exception) { } @@ -361,27 +361,6 @@ public function getRelativeFileName(bool $loadIfEmpty = true): ?string return $this->relativeFileName; } - /** - * {@inheritDoc} - * @throws InvalidConfigurationParameterException - */ - public function getFileName(): ?string - { - return $this->getRelativeFileName(); - } - - /** - * @throws InvalidConfigurationParameterException - */ - public function getFullFileName(): ?string - { - $fileName = $this->getFileName(); - if (!$fileName) { - return $fileName; - } - return "{$this->configuration->getProjectRoot()}{$fileName}"; - } - public function isInstantiable(): bool { return false; diff --git a/src/LanguageHandler/Php/Parser/Entity/SubEntity/Constant/ConstantEntity.php b/src/LanguageHandler/Php/Parser/Entity/SubEntity/Constant/ConstantEntity.php index 65214481..e1f5cced 100644 --- a/src/LanguageHandler/Php/Parser/Entity/SubEntity/Constant/ConstantEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/SubEntity/Constant/ConstantEntity.php @@ -161,9 +161,9 @@ public function getNamespaceName(): string /** * @throws InvalidConfigurationParameterException */ - public function getFileName(): ?string + public function getRelativeFileName(): ?string { - return $this->getImplementingClass()->getFileName(); + return $this->getImplementingClass()->getRelativeFileName(); } /** diff --git a/src/LanguageHandler/Php/Parser/Entity/SubEntity/Method/DynamicMethodEntity.php b/src/LanguageHandler/Php/Parser/Entity/SubEntity/Method/DynamicMethodEntity.php index de14244f..48c6357f 100644 --- a/src/LanguageHandler/Php/Parser/Entity/SubEntity/Method/DynamicMethodEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/SubEntity/Method/DynamicMethodEntity.php @@ -56,9 +56,9 @@ public function getCallMethod(): MethodEntity * @throws InvalidConfigurationParameterException * @throws \Exception */ - public function getFileName(): ?string + public function getRelativeFileName(): ?string { - return $this->getImplementingClass()->getFileName(); + return $this->getImplementingClass()->getRelativeFileName(); } /** @@ -236,7 +236,7 @@ public function getRootEntityCollection(): RootEntityCollection */ public function getAbsoluteFileName(): ?string { - $relativeFileName = $this->getFileName(); + $relativeFileName = $this->getRelativeFileName(); return $relativeFileName ? $this->configuration->getProjectRoot() . $relativeFileName : null; } diff --git a/src/LanguageHandler/Php/Parser/Entity/SubEntity/Method/MethodEntity.php b/src/LanguageHandler/Php/Parser/Entity/SubEntity/Method/MethodEntity.php index 5937761d..22cc6d73 100644 --- a/src/LanguageHandler/Php/Parser/Entity/SubEntity/Method/MethodEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/SubEntity/Method/MethodEntity.php @@ -265,9 +265,9 @@ public function isConstructor(): bool /** * @throws InvalidConfigurationParameterException */ - public function getFileName(): ?string + public function getRelativeFileName(): ?string { - return $this->getImplementingClass()->getFileName(); + return $this->getImplementingClass()->getRelativeFileName(); } /** diff --git a/src/LanguageHandler/Php/Parser/Entity/SubEntity/Method/MethodEntityInterface.php b/src/LanguageHandler/Php/Parser/Entity/SubEntity/Method/MethodEntityInterface.php index aa50fea1..0c595093 100644 --- a/src/LanguageHandler/Php/Parser/Entity/SubEntity/Method/MethodEntityInterface.php +++ b/src/LanguageHandler/Php/Parser/Entity/SubEntity/Method/MethodEntityInterface.php @@ -11,8 +11,6 @@ interface MethodEntityInterface extends EntityInterface { public function getName(): string; - public function getFileName(): ?string; - public function getStartLine(): int; public function getStartColumn(): int; diff --git a/src/LanguageHandler/Php/Parser/Entity/SubEntity/Property/PropertyEntity.php b/src/LanguageHandler/Php/Parser/Entity/SubEntity/Property/PropertyEntity.php index 8f4587ab..7caec8dd 100644 --- a/src/LanguageHandler/Php/Parser/Entity/SubEntity/Property/PropertyEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/SubEntity/Property/PropertyEntity.php @@ -223,9 +223,9 @@ public function getImplementingClass(): ClassLikeEntity /** * @throws InvalidConfigurationParameterException */ - public function getFileName(): ?string + public function getRelativeFileName(): ?string { - return $this->getImplementingClass()->getFileName(); + return $this->getImplementingClass()->getRelativeFileName(); } /** diff --git a/src/LanguageHandler/Php/Renderer/EntityDocRenderer/PhpClassToMd/templates/_constants.md.twig b/src/LanguageHandler/Php/Renderer/EntityDocRenderer/PhpClassToMd/templates/_constants.md.twig index e76fd632..947906f3 100644 --- a/src/LanguageHandler/Php/Renderer/EntityDocRenderer/PhpClassToMd/templates/_constants.md.twig +++ b/src/LanguageHandler/Php/Renderer/EntityDocRenderer/PhpClassToMd/templates/_constants.md.twig @@ -4,8 +4,8 @@ {% for constantEntity in classEntity.getConstantEntityCollection() %}
    5. # - {{ constantEntity.getName() }} {% if constantEntity.isInternal() %}:warning: Is internal {% endif %} {% if constantEntity.isDeprecated() %}:no_entry: Deprecated {% endif %} {% if constantEntity.getFileName() %} - | source + {{ constantEntity.getName() }} {% if constantEntity.isInternal() %}:warning: Is internal {% endif %} {% if constantEntity.isDeprecated() %}:no_entry: Deprecated {% endif %} {% if constantEntity.getRelativeFileName() %} + | source code {% endif %}
    6. {% endfor %} diff --git a/src/LanguageHandler/Php/Renderer/Twig/Function/DrawClassMap.php b/src/LanguageHandler/Php/Renderer/Twig/Function/DrawClassMap.php index 3d8cdb0e..dcccee1f 100644 --- a/src/LanguageHandler/Php/Renderer/Twig/Function/DrawClassMap.php +++ b/src/LanguageHandler/Php/Renderer/Twig/Function/DrawClassMap.php @@ -69,14 +69,14 @@ public function __invoke( protected function appendClassToDirectoryStructure(array $directoryStructure, ClassLikeEntity $classEntity): array { $entityCollection = $this->rootEntityCollectionsGroup->get(ClassEntityCollection::NAME); - $this->fileClassmap[$classEntity->getFileName()] = call_user_func_array( + $this->fileClassmap[$classEntity->getRelativeFileName()] = call_user_func_array( callback: $this->getDocumentedEntityUrlFunction, args: [ $entityCollection, $classEntity->getName() ] ); - $fileName = ltrim($classEntity->getFileName(), DIRECTORY_SEPARATOR); + $fileName = ltrim($classEntity->getRelativeFileName(), DIRECTORY_SEPARATOR); $pathParts = array_reverse(explode(DIRECTORY_SEPARATOR, $fileName)); $tmpStructure = [array_shift($pathParts)]; $prevKey = ''; From c9cf6bf49c0194304acbdc777c6546e9b48de9d6 Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Mon, 20 Nov 2023 19:06:43 +0300 Subject: [PATCH 068/210] Renaming method to check whether the entity can be loaded or not --- .../TwigFilterClassParserPlugin.php | 2 +- .../OperationsCollection.php | 4 +-- .../SingleEntitySearchOperation.php | 2 +- .../Entity/LoggableRootEntityCollection.php | 2 +- .../Parser/Entity/RootEntityCollection.php | 4 +-- .../Parser/Entity/RootEntityInterface.php | 2 +- src/Core/Renderer/RendererIteratorFactory.php | 2 +- .../Renderer/Twig/Filter/StrTypeToUrl.php | 2 +- .../Twig/Function/GetDocumentedEntityUrl.php | 2 +- src/DocGenerator.php | 2 +- .../Php/Parser/Entity/BaseEntity.php | 2 +- .../Php/Parser/Entity/ClassEntity.php | 4 +-- .../Parser/Entity/ClassEntityCollection.php | 2 +- .../Php/Parser/Entity/ClassLikeEntity.php | 34 +++++++++---------- .../Php/Parser/Entity/EnumEntity.php | 2 +- .../Entity/SubEntity/Method/MethodEntity.php | 4 +-- .../SubEntity/Property/PropertyEntity.php | 4 +-- .../Parser/PhpParser/NodeValueCompiler.php | 6 ++-- .../EntityDocRendererHelper.php | 6 ++-- .../Renderer/Twig/Function/DrawClassMap.php | 2 +- .../Twig/Function/GetClassMethodsBodyCode.php | 2 +- 21 files changed, 46 insertions(+), 46 deletions(-) diff --git a/selfdoc/Plugin/TwigFilterClassParser/TwigFilterClassParserPlugin.php b/selfdoc/Plugin/TwigFilterClassParser/TwigFilterClassParserPlugin.php index b341f4f4..eb59d012 100644 --- a/selfdoc/Plugin/TwigFilterClassParser/TwigFilterClassParserPlugin.php +++ b/selfdoc/Plugin/TwigFilterClassParser/TwigFilterClassParserPlugin.php @@ -90,7 +90,7 @@ public function afterLoadingClassEntityCollection(AfterLoadingClassEntityCollect private function isCustomTwigFilter(ClassLikeEntity $classEntity): bool { foreach (self::TWIG_FILTER_DIR_NAMES as $dirName) { - if (!$classEntity->entityDataCanBeLoaded()) { + if (!$classEntity->isEntityDataCanBeLoaded()) { continue; } if (str_starts_with($classEntity->getRelativeFileName(), $dirName) && $classEntity->implementsInterface(CustomFilterInterface::class)) { diff --git a/src/Core/Parser/Entity/CollectionLogOperation/OperationsCollection.php b/src/Core/Parser/Entity/CollectionLogOperation/OperationsCollection.php index 82425637..f681f903 100644 --- a/src/Core/Parser/Entity/CollectionLogOperation/OperationsCollection.php +++ b/src/Core/Parser/Entity/CollectionLogOperation/OperationsCollection.php @@ -95,10 +95,10 @@ private function checkIsFoundEntitiesCacheOutdatedRecursive( } $entityName = $entity?->getName(); - $entityName = $entityName && $entity?->entityDataCanBeLoaded() ? $entityName : null; + $entityName = $entityName && $entity?->isEntityDataCanBeLoaded() ? $entityName : null; if ($operation->getEntityName() !== $entityName) { return true; - } elseif ($entity?->entityCacheIsOutdated() && $entity?->entityDataCanBeLoaded()) { + } elseif ($entity?->entityCacheIsOutdated() && $entity?->isEntityDataCanBeLoaded()) { return true; } } elseif ($operation instanceof IterateEntitiesOperation) { diff --git a/src/Core/Parser/Entity/CollectionLogOperation/SingleEntitySearchOperation.php b/src/Core/Parser/Entity/CollectionLogOperation/SingleEntitySearchOperation.php index ad8a17df..be2a1c4e 100644 --- a/src/Core/Parser/Entity/CollectionLogOperation/SingleEntitySearchOperation.php +++ b/src/Core/Parser/Entity/CollectionLogOperation/SingleEntitySearchOperation.php @@ -17,7 +17,7 @@ public function __construct( private array $args, ?RootEntityInterface $entity ) { - if ($entity?->entityDataCanBeLoaded()) { + if ($entity?->isEntityDataCanBeLoaded()) { $this->entityName = $entity->getObjectId(); } } diff --git a/src/Core/Parser/Entity/LoggableRootEntityCollection.php b/src/Core/Parser/Entity/LoggableRootEntityCollection.php index c1a4dbd5..ef626af1 100644 --- a/src/Core/Parser/Entity/LoggableRootEntityCollection.php +++ b/src/Core/Parser/Entity/LoggableRootEntityCollection.php @@ -73,7 +73,7 @@ final protected function cloneForFiltration(bool $onlyLoaded = true): static $clone->callerNameToSkipLogging = $backtrace[1]['function']; if ($onlyLoaded) { foreach ($clone->entities as $objectId => $rootEntity) { - if (!$rootEntity->entityDataCanBeLoaded()) { + if (!$rootEntity->isEntityDataCanBeLoaded()) { $clone->remove($objectId); } } diff --git a/src/Core/Parser/Entity/RootEntityCollection.php b/src/Core/Parser/Entity/RootEntityCollection.php index 9d0a45a9..7056d0f3 100644 --- a/src/Core/Parser/Entity/RootEntityCollection.php +++ b/src/Core/Parser/Entity/RootEntityCollection.php @@ -27,7 +27,7 @@ abstract public function getEntityCollectionName(): string; /** * @warning The entity obtained as a result of executing this method may not be available for loading - * @see RootEntityInterface::entityDataCanBeLoaded() + * @see RootEntityInterface::isEntityDataCanBeLoaded() */ abstract public function getLoadedOrCreateNew(string $objectName, bool $withAddClassEntityToCollectionEvent = false): RootEntityInterface; @@ -53,7 +53,7 @@ public function updateEntitiesCache(): void if (!is_a($entity, CacheableEntityInterface::class)) { continue; } - if ($entity->entityDataCanBeLoaded() && $entity->entityCacheIsOutdated()) { + if ($entity->isEntityDataCanBeLoaded() && $entity->entityCacheIsOutdated()) { $this->logger->info("Preparing {$entity->getName()} dependencies cache"); $entity->reloadEntityDependenciesCache(); } diff --git a/src/Core/Parser/Entity/RootEntityInterface.php b/src/Core/Parser/Entity/RootEntityInterface.php index babd4697..ab557beb 100644 --- a/src/Core/Parser/Entity/RootEntityInterface.php +++ b/src/Core/Parser/Entity/RootEntityInterface.php @@ -18,7 +18,7 @@ public static function isEntityNameValid(string $entityName): bool; /** * Checking if it is possible to get the entity data */ - public function entityDataCanBeLoaded(): bool; + public function isEntityDataCanBeLoaded(): bool; /** * The entity is loaded from a third party library and should not be treated the same as a standard one diff --git a/src/Core/Renderer/RendererIteratorFactory.php b/src/Core/Renderer/RendererIteratorFactory.php index 907112ba..5fb902de 100644 --- a/src/Core/Renderer/RendererIteratorFactory.php +++ b/src/Core/Renderer/RendererIteratorFactory.php @@ -147,7 +147,7 @@ public function getDocumentedEntityWrappersWithOutdatedCache(): \Generator $skippedCount = 0; foreach ($pb->iterate($this->documentedEntityWrappersCollection) as $entityWrapper) { $pb->setStepDescription("Processing `{$entityWrapper->getEntityName()}` entity"); - if (!$entityWrapper->getDocumentTransformableEntity()->entityDataCanBeLoaded()) { + if (!$entityWrapper->getDocumentTransformableEntity()->isEntityDataCanBeLoaded()) { continue; } diff --git a/src/Core/Renderer/Twig/Filter/StrTypeToUrl.php b/src/Core/Renderer/Twig/Filter/StrTypeToUrl.php index 1f9678b3..2d34c540 100644 --- a/src/Core/Renderer/Twig/Filter/StrTypeToUrl.php +++ b/src/Core/Renderer/Twig/Filter/StrTypeToUrl.php @@ -64,7 +64,7 @@ public function __invoke( } try { $entityOfLink = $rootEntityCollection->getLoadedOrCreateNew($type); - if (!$entityOfLink->isExternalLibraryEntity() && $entityOfLink->entityDataCanBeLoaded()) { + if (!$entityOfLink->isExternalLibraryEntity() && $entityOfLink->isEntityDataCanBeLoaded()) { if ($entityOfLink->getAbsoluteFileName()) { $link = $getDocumentedEntityUrlFunction($rootEntityCollection, $type, '', $createDocument); diff --git a/src/Core/Renderer/Twig/Function/GetDocumentedEntityUrl.php b/src/Core/Renderer/Twig/Function/GetDocumentedEntityUrl.php index 573a4637..2e21853f 100644 --- a/src/Core/Renderer/Twig/Function/GetDocumentedEntityUrl.php +++ b/src/Core/Renderer/Twig/Function/GetDocumentedEntityUrl.php @@ -83,7 +83,7 @@ public function __invoke(RootEntityCollection $rootEntityCollection, string $ent return $preloadResourceLink; } $entity = $rootEntityCollection->getLoadedOrCreateNew($entityName); - if ($entity->entityDataCanBeLoaded()) { + if ($entity->isEntityDataCanBeLoaded()) { if (!$entity->documentCreationAllowed()) { return self::DEFAULT_URL; } elseif ($createDocument && is_a($entity, DocumentTransformableEntityInterface::class)) { diff --git a/src/DocGenerator.php b/src/DocGenerator.php index b603695c..3cd801cd 100644 --- a/src/DocGenerator.php +++ b/src/DocGenerator.php @@ -103,7 +103,7 @@ public function addDocBlocks( foreach ($entitiesCollection as $classEntity) { /**@var ClassLikeEntity $classEntity */ if ( - !$classEntity->entityDataCanBeLoaded() || array_key_exists( + !$classEntity->isEntityDataCanBeLoaded() || array_key_exists( $classEntity->getName(), $alreadyProcessedEntities ) diff --git a/src/LanguageHandler/Php/Parser/Entity/BaseEntity.php b/src/LanguageHandler/Php/Parser/Entity/BaseEntity.php index cce0046b..d7e076cf 100644 --- a/src/LanguageHandler/Php/Parser/Entity/BaseEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/BaseEntity.php @@ -107,7 +107,7 @@ protected function prepareTypeString(string $type): string $types[$k] = "\\{$t}"; } elseif ( ParserHelper::isCorrectClassName($t) && - $this->getRootEntityCollection()->getLoadedOrCreateNew($t)->entityDataCanBeLoaded() + $this->getRootEntityCollection()->getLoadedOrCreateNew($t)->isEntityDataCanBeLoaded() ) { $types[$k] = "\\{$t}"; } diff --git a/src/LanguageHandler/Php/Parser/Entity/ClassEntity.php b/src/LanguageHandler/Php/Parser/Entity/ClassEntity.php index 364e18a6..bac4b5e2 100644 --- a/src/LanguageHandler/Php/Parser/Entity/ClassEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/ClassEntity.php @@ -40,7 +40,7 @@ public function isClass(): bool */ #[CacheableMethod] public function getParentClassNames(): array { - if (!$this->entityDataCanBeLoaded()) { + if (!$this->isEntityDataCanBeLoaded()) { return []; } try { @@ -59,7 +59,7 @@ public function isClass(): bool */ #[CacheableMethod] public function getParentClassName(): ?string { - if (!$this->entityDataCanBeLoaded()) { + if (!$this->isEntityDataCanBeLoaded()) { return null; } if ($parentClassName = $this->getAst()->extends?->toString()) { diff --git a/src/LanguageHandler/Php/Parser/Entity/ClassEntityCollection.php b/src/LanguageHandler/Php/Parser/Entity/ClassEntityCollection.php index eda7df19..d7eb76c5 100644 --- a/src/LanguageHandler/Php/Parser/Entity/ClassEntityCollection.php +++ b/src/LanguageHandler/Php/Parser/Entity/ClassEntityCollection.php @@ -390,7 +390,7 @@ public function internalFindEntity(string $search, bool $useUnsafeKeys = true): $duplicates = []; foreach ($this->entities as $entity) { $index[$entity->getName()] = $entity; - if ($entity->entityDataCanBeLoaded() && $entity->getRelativeFileName()) { + if ($entity->isEntityDataCanBeLoaded() && $entity->getRelativeFileName()) { $index[$entity->getRelativeFileName()] = $entity; $index[$entity->getAbsoluteFileName()] = $entity; $index[$entity->getFileSourceLink(false)] = $entity; diff --git a/src/LanguageHandler/Php/Parser/Entity/ClassLikeEntity.php b/src/LanguageHandler/Php/Parser/Entity/ClassLikeEntity.php index 4c88db22..f48decec 100644 --- a/src/LanguageHandler/Php/Parser/Entity/ClassLikeEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/ClassLikeEntity.php @@ -205,7 +205,7 @@ public function getDocCommentEntity(): ClassLikeEntity $classEntity = $this; if (!$docComment || str_contains(mb_strtolower($docComment), '@inheritdoc')) { $parentReflectionClass = $this->getParentClass(); - if ($parentReflectionClass && $parentReflectionClass->entityDataCanBeLoaded()) { + if ($parentReflectionClass && $parentReflectionClass->isEntityDataCanBeLoaded()) { $classEntity = $parentReflectionClass->getDocCommentEntity(); } } @@ -315,7 +315,7 @@ public function isClassLoad(): bool /** * @throws InvalidConfigurationParameterException */ - #[CacheableMethod] public function entityDataCanBeLoaded(): bool + #[CacheableMethod] public function isEntityDataCanBeLoaded(): bool { if (!$this->isCurrentEntityCanBeLoad()) { $this->logger->notice("Class `{$this->getName()}` loading skipped by plugin"); @@ -438,7 +438,7 @@ public function getParentClassEntities(): array */ #[CacheableMethod] public function getInterfaceNames(): array { - if (!$this->entityDataCanBeLoaded()) { + if (!$this->isEntityDataCanBeLoaded()) { return []; } @@ -460,7 +460,7 @@ public function getParentClassEntities(): array $parentInterfaceNames = []; try { $interfaceEntity = $this->getRootEntityCollection()->getLoadedOrCreateNew($interfaceName); - if ($interfaceEntity->entityDataCanBeLoaded()) { + if ($interfaceEntity->isEntityDataCanBeLoaded()) { $parentInterfaceNames = $interfaceEntity->getInterfaceNames(); } } catch (\Exception $e) { @@ -471,7 +471,7 @@ public function getParentClassEntities(): array if (!$this->isInterface() && $parentClass = $this->getParentClass()) { $parentInterfaceNames = []; try { - if ($parentClass->entityDataCanBeLoaded()) { + if ($parentClass->isEntityDataCanBeLoaded()) { $parentInterfaceNames = $parentClass->getInterfaceNames(); } } catch (\Exception $e) { @@ -499,7 +499,7 @@ public function getParentClass(): ?ClassLikeEntity */ #[CacheableMethod] public function getTraitsNames(): array { - if (!$this->entityDataCanBeLoaded()) { + if (!$this->isEntityDataCanBeLoaded()) { return []; } $traitsNames = []; @@ -666,7 +666,7 @@ public function getFileContent(): string bool $onlyFromCurrentClassAndTraits = false, int $flags = MethodEntity::VISIBILITY_MODIFIERS_FLAG_ANY ): array { - if (!$this->entityDataCanBeLoaded()) { + if (!$this->isEntityDataCanBeLoaded()) { return []; } $methods = []; @@ -685,7 +685,7 @@ public function getFileContent(): string $flags &= ~ MethodEntity::MODIFIERS_FLAG_IS_PRIVATE; foreach ($this->getTraits() as $traitEntity) { - if (!$traitEntity->entityDataCanBeLoaded()) { + if (!$traitEntity->isEntityDataCanBeLoaded()) { continue; } foreach ($traitEntity->getMethodsData(true, $flags) as $name => $methodsData) { @@ -698,7 +698,7 @@ public function getFileContent(): string if (!$onlyFromCurrentClassAndTraits) { foreach ($this->getParentClassEntities() as $parentClassEntity) { - if (!$parentClassEntity->entityDataCanBeLoaded()) { + if (!$parentClassEntity->isEntityDataCanBeLoaded()) { continue; } foreach ($parentClassEntity->getMethodsData(true, $flags) as $name => $methodsData) { @@ -710,7 +710,7 @@ public function getFileContent(): string } foreach ($this->getInterfacesEntities() as $interfacesEntity) { - if (!$interfacesEntity->entityDataCanBeLoaded()) { + if (!$interfacesEntity->isEntityDataCanBeLoaded()) { continue; } foreach ($interfacesEntity->getMethodsData(true, $flags) as $name => $methodsData) { @@ -732,7 +732,7 @@ public function getFileContent(): string bool $onlyFromCurrentClassAndTraits = false, int $flags = PropertyEntity::VISIBILITY_MODIFIERS_FLAG_ANY ): array { - if (!$this->entityDataCanBeLoaded()) { + if (!$this->isEntityDataCanBeLoaded()) { return []; } $properties = []; @@ -754,7 +754,7 @@ public function getFileContent(): string $flags &= ~ PropertyEntity::MODIFIERS_FLAG_IS_PRIVATE; foreach ($this->getTraits() as $traitEntity) { foreach ($traitEntity->getPropertiesData(true, $flags) as $name => $propertyData) { - if (!$traitEntity->entityDataCanBeLoaded()) { + if (!$traitEntity->isEntityDataCanBeLoaded()) { continue; } if (array_key_exists($name, $properties)) { @@ -765,7 +765,7 @@ public function getFileContent(): string } if (!$onlyFromCurrentClassAndTraits) { foreach ($this->getParentClassEntities() as $parentClassEntity) { - if (!$parentClassEntity->entityDataCanBeLoaded()) { + if (!$parentClassEntity->isEntityDataCanBeLoaded()) { continue; } foreach ($parentClassEntity->getPropertiesData(true, $flags) as $name => $propertyData) { @@ -786,7 +786,7 @@ public function getFileContent(): string bool $onlyFromCurrentClassAndTraits = false, int $flags = ConstantEntity::VISIBILITY_MODIFIERS_FLAG_ANY ): array { - if (!$this->entityDataCanBeLoaded()) { + if (!$this->isEntityDataCanBeLoaded()) { return []; } $constants = []; @@ -807,7 +807,7 @@ public function getFileContent(): string $flags &= ~ ConstantEntity::MODIFIERS_FLAG_IS_PRIVATE; foreach ($this->getTraits() as $traitEntity) { - if (!$traitEntity->entityDataCanBeLoaded()) { + if (!$traitEntity->isEntityDataCanBeLoaded()) { continue; } foreach ($traitEntity->getConstantsData(true, $flags) as $name => $constantsData) { @@ -820,7 +820,7 @@ public function getFileContent(): string if (!$onlyFromCurrentClassAndTraits) { foreach ($this->getParentClassEntities() as $parentClassEntity) { - if (!$parentClassEntity->entityDataCanBeLoaded()) { + if (!$parentClassEntity->isEntityDataCanBeLoaded()) { continue; } foreach ($parentClassEntity->getConstantsData(true, $flags) as $name => $constantsData) { @@ -832,7 +832,7 @@ public function getFileContent(): string } foreach ($this->getInterfacesEntities() as $interfacesEntity) { - if (!$interfacesEntity->entityDataCanBeLoaded()) { + if (!$interfacesEntity->isEntityDataCanBeLoaded()) { continue; } foreach ($interfacesEntity->getConstantsData(true, $flags) as $name => $constantsData) { diff --git a/src/LanguageHandler/Php/Parser/Entity/EnumEntity.php b/src/LanguageHandler/Php/Parser/Entity/EnumEntity.php index bc913b6d..71dac173 100644 --- a/src/LanguageHandler/Php/Parser/Entity/EnumEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/EnumEntity.php @@ -29,7 +29,7 @@ public function getInterfaceNames(): array */ #[CacheableMethod] public function getEnumCases(): array { - if (!$this->entityDataCanBeLoaded()) { + if (!$this->isEntityDataCanBeLoaded()) { return []; } diff --git a/src/LanguageHandler/Php/Parser/Entity/SubEntity/Method/MethodEntity.php b/src/LanguageHandler/Php/Parser/Entity/SubEntity/Method/MethodEntity.php index 22cc6d73..27226d72 100644 --- a/src/LanguageHandler/Php/Parser/Entity/SubEntity/Method/MethodEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/SubEntity/Method/MethodEntity.php @@ -157,12 +157,12 @@ public function getDocCommentEntity(): MethodEntity $implementingClass = $this->getImplementingClass(); $parentClass = $this->getImplementingClass()->getParentClass(); $methodName = $this->getName(); - if ($parentClass && $parentClass->entityDataCanBeLoaded() && $parentClass->hasMethod($methodName)) { + if ($parentClass && $parentClass->isEntityDataCanBeLoaded() && $parentClass->hasMethod($methodName)) { $parentReflectionMethod = $parentClass->getMethodEntity($methodName); $reflectionMethod = $parentReflectionMethod->getDocCommentEntity(); } else { foreach ($implementingClass->getInterfacesEntities() as $interface) { - if ($interface->entityDataCanBeLoaded() && $interface->hasMethod($methodName)) { + if ($interface->isEntityDataCanBeLoaded() && $interface->hasMethod($methodName)) { $reflectionMethod = $interface->getMethodEntity($methodName); break; } diff --git a/src/LanguageHandler/Php/Parser/Entity/SubEntity/Property/PropertyEntity.php b/src/LanguageHandler/Php/Parser/Entity/SubEntity/Property/PropertyEntity.php index 7caec8dd..19518a67 100644 --- a/src/LanguageHandler/Php/Parser/Entity/SubEntity/Property/PropertyEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/SubEntity/Property/PropertyEntity.php @@ -162,12 +162,12 @@ public function getDocCommentEntity(): PropertyEntity $implementingClass = $this->getImplementingClass(); $parentClass = $this->getImplementingClass()->getParentClass(); $propertyName = $this->getName(); - if ($parentClass && $parentClass->entityDataCanBeLoaded() && $parentClass->hasProperty($propertyName)) { + if ($parentClass && $parentClass->isEntityDataCanBeLoaded() && $parentClass->hasProperty($propertyName)) { $parentReflectionProperty = $parentClass->getPropertyEntity($propertyName); $reflectionProperty = $parentReflectionProperty->getDocCommentEntity(); } else { foreach ($implementingClass->getInterfacesEntities() as $interface) { - if ($interface->entityDataCanBeLoaded() && $interface->hasProperty($propertyName)) { + if ($interface->isEntityDataCanBeLoaded() && $interface->hasProperty($propertyName)) { $reflectionProperty = $interface->getPropertyEntity($propertyName); break; } diff --git a/src/LanguageHandler/Php/Parser/PhpParser/NodeValueCompiler.php b/src/LanguageHandler/Php/Parser/PhpParser/NodeValueCompiler.php index c0d8f20f..d457a3a5 100644 --- a/src/LanguageHandler/Php/Parser/PhpParser/NodeValueCompiler.php +++ b/src/LanguageHandler/Php/Parser/PhpParser/NodeValueCompiler.php @@ -99,7 +99,7 @@ private static function getStaticCallValue( if ($entity->getName() !== $className) { $entity = $entity->getRootEntityCollection()->getLoadedOrCreateNew($className); } - if (!$entity->entityDataCanBeLoaded()) { + if (!$entity->isEntityDataCanBeLoaded()) { throw new \RuntimeException('Entity cannot be loaded'); } $methodEntity = $entity->getMethodEntity($node->name->toString()); @@ -123,7 +123,7 @@ private static function getStaticPropertyValue( if ($entity->getName() !== $className) { $entity = $entity->getRootEntityCollection()->getLoadedOrCreateNew($className); } - if (!$entity->entityDataCanBeLoaded()) { + if (!$entity->isEntityDataCanBeLoaded()) { throw new \RuntimeException('Entity cannot be loaded'); } return $entity->getPropertyEntity($node->name->toString())->getDefaultValue(); @@ -158,7 +158,7 @@ private static function getClassConstantValue( return $className; } - if (!$entity->entityDataCanBeLoaded()) { + if (!$entity->isEntityDataCanBeLoaded()) { throw new \RuntimeException('Entity cannot be loaded'); } diff --git a/src/LanguageHandler/Php/Renderer/EntityDocRenderer/EntityDocRendererHelper.php b/src/LanguageHandler/Php/Renderer/EntityDocRenderer/EntityDocRendererHelper.php index 913730d0..01d877fc 100644 --- a/src/LanguageHandler/Php/Renderer/EntityDocRenderer/EntityDocRendererHelper.php +++ b/src/LanguageHandler/Php/Renderer/EntityDocRenderer/EntityDocRendererHelper.php @@ -52,7 +52,7 @@ public function getEntityDataByLink( if ($needToUseDefaultEntity) { $defaultEntity = $rootEntityCollection->getLoadedOrCreateNew($defaultEntityName); $cursorTmpName = str_replace(['$', '(', ')'], '', $className); - if (!$defaultEntity->entityDataCanBeLoaded()) { + if (!$defaultEntity->isEntityDataCanBeLoaded()) { $entity = $defaultEntity; $classData[1] = ''; } elseif ( @@ -67,12 +67,12 @@ public function getEntityDataByLink( if (!$entity) { $nextEntity = $rootEntityCollection->getLoadedOrCreateNew($className); - if ($nextEntity->entityDataCanBeLoaded() && $nextEntity->documentCreationAllowed()) { + if ($nextEntity->isEntityDataCanBeLoaded() && $nextEntity->documentCreationAllowed()) { $entity = $nextEntity; } } - if ($entity && $entity->entityDataCanBeLoaded()) { + if ($entity && $entity->isEntityDataCanBeLoaded()) { $cursor = ''; if ($classData[1] ?? null) { $cursorTarget = str_replace(['$', '(', ')'], '', $classData[1]); diff --git a/src/LanguageHandler/Php/Renderer/Twig/Function/DrawClassMap.php b/src/LanguageHandler/Php/Renderer/Twig/Function/DrawClassMap.php index dcccee1f..46b730de 100644 --- a/src/LanguageHandler/Php/Renderer/Twig/Function/DrawClassMap.php +++ b/src/LanguageHandler/Php/Renderer/Twig/Function/DrawClassMap.php @@ -99,7 +99,7 @@ public function getDirectoryStructure(ClassEntityCollection ...$classEntityColle $entities = []; foreach ($classEntityCollections as $classEntityCollection) { foreach ($classEntityCollection as $classEntity) { - if (!$classEntity->entityDataCanBeLoaded()) { + if (!$classEntity->isEntityDataCanBeLoaded()) { continue; } $entities[$classEntity->getName()] = $classEntity; diff --git a/src/LanguageHandler/Php/Renderer/Twig/Function/GetClassMethodsBodyCode.php b/src/LanguageHandler/Php/Renderer/Twig/Function/GetClassMethodsBodyCode.php index 7941f557..0294d703 100644 --- a/src/LanguageHandler/Php/Renderer/Twig/Function/GetClassMethodsBodyCode.php +++ b/src/LanguageHandler/Php/Renderer/Twig/Function/GetClassMethodsBodyCode.php @@ -53,7 +53,7 @@ public function __invoke(string $className, array $methodsNames): ?string return null; } $classEntity = $classEntityCollection->getLoadedOrCreateNew($className); - if ($classEntity->entityDataCanBeLoaded()) { + if ($classEntity->isEntityDataCanBeLoaded()) { $methodsCode = []; $methodEntityCollection = $classEntity->getMethodEntityCollection(); $addIndentFromLeft = new AddIndentFromLeft(); From 92eb78360e65af807df4bfe622eafe06bfaacbee Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Mon, 20 Nov 2023 19:09:51 +0300 Subject: [PATCH 069/210] Renaming method to check can entity be documented or not --- .../Renderer/Context/DocumentTransformableEntityInterface.php | 2 +- src/Core/Renderer/Twig/Function/GetDocumentedEntityUrl.php | 2 +- src/LanguageHandler/Php/Parser/Entity/ClassLikeEntity.php | 2 +- .../Php/Renderer/EntityDocRenderer/EntityDocRendererHelper.php | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Core/Renderer/Context/DocumentTransformableEntityInterface.php b/src/Core/Renderer/Context/DocumentTransformableEntityInterface.php index 4032e497..4699ef01 100644 --- a/src/Core/Renderer/Context/DocumentTransformableEntityInterface.php +++ b/src/Core/Renderer/Context/DocumentTransformableEntityInterface.php @@ -16,7 +16,7 @@ public function getRootEntityCollection(): RootEntityCollection; public function getName(): string; - public function documentCreationAllowed(): bool; + public function isDocumentCreationAllowed(): bool; public function getShortName(): string; diff --git a/src/Core/Renderer/Twig/Function/GetDocumentedEntityUrl.php b/src/Core/Renderer/Twig/Function/GetDocumentedEntityUrl.php index 2e21853f..11e2f2cc 100644 --- a/src/Core/Renderer/Twig/Function/GetDocumentedEntityUrl.php +++ b/src/Core/Renderer/Twig/Function/GetDocumentedEntityUrl.php @@ -84,7 +84,7 @@ public function __invoke(RootEntityCollection $rootEntityCollection, string $ent } $entity = $rootEntityCollection->getLoadedOrCreateNew($entityName); if ($entity->isEntityDataCanBeLoaded()) { - if (!$entity->documentCreationAllowed()) { + if (!$entity->isDocumentCreationAllowed()) { return self::DEFAULT_URL; } elseif ($createDocument && is_a($entity, DocumentTransformableEntityInterface::class)) { $documentedEntity = $this->documentedEntityWrappersCollection->createAndAddDocumentedEntityWrapper($entity); diff --git a/src/LanguageHandler/Php/Parser/Entity/ClassLikeEntity.php b/src/LanguageHandler/Php/Parser/Entity/ClassLikeEntity.php index f48decec..4ef5c10e 100644 --- a/src/LanguageHandler/Php/Parser/Entity/ClassLikeEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/ClassLikeEntity.php @@ -184,7 +184,7 @@ final public function isInGit(): bool /** * @throws InvalidConfigurationParameterException */ - public function documentCreationAllowed(): bool + public function isDocumentCreationAllowed(): bool { return !$this->configuration->isCheckFileInGitBeforeCreatingDocEnabled() || $this->isInGit(); } diff --git a/src/LanguageHandler/Php/Renderer/EntityDocRenderer/EntityDocRendererHelper.php b/src/LanguageHandler/Php/Renderer/EntityDocRenderer/EntityDocRendererHelper.php index 01d877fc..d6bb7671 100644 --- a/src/LanguageHandler/Php/Renderer/EntityDocRenderer/EntityDocRendererHelper.php +++ b/src/LanguageHandler/Php/Renderer/EntityDocRenderer/EntityDocRendererHelper.php @@ -67,7 +67,7 @@ public function getEntityDataByLink( if (!$entity) { $nextEntity = $rootEntityCollection->getLoadedOrCreateNew($className); - if ($nextEntity->isEntityDataCanBeLoaded() && $nextEntity->documentCreationAllowed()) { + if ($nextEntity->isEntityDataCanBeLoaded() && $nextEntity->isDocumentCreationAllowed()) { $entity = $nextEntity; } } From 0f157f50dd513a51c0713315b1d9d837103d0317 Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Mon, 20 Nov 2023 19:18:48 +0300 Subject: [PATCH 070/210] Changing phpEntities key --- demo/demo1/templates/classMap/index.md.twig | 4 ++-- .../classListExample/index.md.twig | 4 ++-- demo/demo4-config-array/templates/README.md.twig | 2 +- .../templates/tech/1.configuration/readme.md.twig | 2 +- selfdoc/templates/tech/2.parser/entity.md.twig | 14 +++++++------- .../tech/2.parser/entityFilterCondition.md.twig | 2 +- .../templates/tech/2.parser/sourceLocator.md.twig | 2 +- .../templates/tech/3.renderer/01_templates.md.twig | 4 ++-- .../tech/3.renderer/04_twigCustomFilters.md.twig | 6 +++--- .../tech/3.renderer/05_twigCustomFunctions.md.twig | 6 +++--- .../tech/3.renderer/templatesDynamicBlocks.md.twig | 4 ++-- .../tech/3.renderer/templatesVariables.md.twig | 2 +- .../templates/tech/4.pluginSystem/readme.md.twig | 4 ++-- selfdoc/templates/tech/map.md.twig | 2 +- .../Twig/Function/GetDocumentedEntityUrl.php | 6 +++--- .../Twig/Function/PrintEntityCollectionAsList.php | 4 ++-- .../Php/Parser/Entity/ClassEntityCollection.php | 2 +- .../templates/__structure/classes.md.twig | 4 ++-- .../templates/__structure/interfaces.md.twig | 2 +- .../templates/__structure/map.md.twig | 2 +- .../templates/__structure/traits.md.twig | 2 +- 21 files changed, 40 insertions(+), 40 deletions(-) diff --git a/demo/demo1/templates/classMap/index.md.twig b/demo/demo1/templates/classMap/index.md.twig index aefc1de6..d284f4dd 100644 --- a/demo/demo1/templates/classMap/index.md.twig +++ b/demo/demo1/templates/classMap/index.md.twig @@ -3,8 +3,8 @@ {{ "Class map epample" | textToHeading('H1') }} -{{ "{{ drawClassMap( phpClassEntityCollection ) }}" | textToCodeBlock('twig') }} +{{ "{{ drawClassMap( phpEntities ) }}" | textToCodeBlock('twig') }} **The result of the function execution:** -{{ drawClassMap( phpClassEntityCollection ) }} +{{ drawClassMap( phpEntities ) }} diff --git a/demo/demo1/templates/sectionWithSubsections/classListExample/index.md.twig b/demo/demo1/templates/sectionWithSubsections/classListExample/index.md.twig index b5be60c4..7d0fd007 100644 --- a/demo/demo1/templates/sectionWithSubsections/classListExample/index.md.twig +++ b/demo/demo1/templates/sectionWithSubsections/classListExample/index.md.twig @@ -5,6 +5,6 @@ **List of classes filtered by the directory where they are located.** -{{ "{{ printEntityCollectionAsList( phpClassEntityCollection.filterByPaths(['/annotations']) ) }}" | textToCodeBlock('twig') }} +{{ "{{ printEntityCollectionAsList( phpEntities.filterByPaths(['/annotations']) ) }}" | textToCodeBlock('twig') }} -{{ printEntityCollectionAsList( phpClassEntityCollection.filterByPaths(['/annotations']) ) }} +{{ printEntityCollectionAsList( phpEntities.filterByPaths(['/annotations']) ) }} diff --git a/demo/demo4-config-array/templates/README.md.twig b/demo/demo4-config-array/templates/README.md.twig index f370c324..1de2e14a 100644 --- a/demo/demo4-config-array/templates/README.md.twig +++ b/demo/demo4-config-array/templates/README.md.twig @@ -2,7 +2,7 @@ {{ "Demo 5" | textToHeading('H1') }} -{{ printEntityCollectionAsList( phpClassEntityCollection.filterByPaths(['/annotations']) ) }} +{{ printEntityCollectionAsList( phpEntities.filterByPaths(['/annotations']) ) }} To update this documentation, run the following command: diff --git a/selfdoc/templates/tech/1.configuration/readme.md.twig b/selfdoc/templates/tech/1.configuration/readme.md.twig index 74618163..c511b32d 100644 --- a/selfdoc/templates/tech/1.configuration/readme.md.twig +++ b/selfdoc/templates/tech/1.configuration/readme.md.twig @@ -37,7 +37,7 @@ The inheritance algorithm is as follows: scalar types can be overwritten by each {{ "Configuration parameters" | textToHeading('H2') }} -{% set parameters = getConfigParametersDescription(phpClassEntityCollection, '%WORKING_DIR%/src/Core/Configuration/defaultConfiguration.yaml') %} +{% set parameters = getConfigParametersDescription(phpEntities, '%WORKING_DIR%/src/Core/Configuration/defaultConfiguration.yaml') %} diff --git a/selfdoc/templates/tech/2.parser/entity.md.twig b/selfdoc/templates/tech/2.parser/entity.md.twig index c70c0e6d..d4f50cda 100644 --- a/selfdoc/templates/tech/2.parser/entity.md.twig +++ b/selfdoc/templates/tech/2.parser/entity.md.twig @@ -13,25 +13,25 @@ Entities are always handled through collections. Collections are the result of t * Passing a collection to a function: -{{ "{{ printEntityCollectionAsList(phpClassEntityCollection) }}" | textToCodeBlock('twig') }} +{{ "{{ printEntityCollectionAsList(phpEntities) }}" | textToCodeBlock('twig') }} * Filtering a collection and passing it to a function: -{{ "{{ printEntityCollectionAsList(phpClassEntityCollection.filterByInterfaces(['BumbleDocGen\\Core\\Parser\\Entity\\EntityInterface'])) }}" | textToCodeBlock('twig') }} +{{ "{{ printEntityCollectionAsList(phpEntities.filterByInterfaces(['BumbleDocGen\\Core\\Parser\\Entity\\EntityInterface'])) }}" | textToCodeBlock('twig') }} * Saving a filtered collection to a variable: -{{ "{{ {% set filteredCollection = phpClassEntityCollection.getOnlyInstantiable() %} }}" | textToCodeBlock('twig') }} +{{ "{{ {% set filteredCollection = phpEntities.getOnlyInstantiable() %} }}" | textToCodeBlock('twig') }} * Using a collection in a for loop: -{{ "{% for someClassEntity in phpClassEntityCollection %} +{{ "{% for someClassEntity in phpEntities %} * {{ someClassEntity.getName() }} {% endfor %}" | textToCodeBlock('twig') }} * Output of all methods of all found entities in `className::methodName()` format: -{{ "{% for someClassEntity in phpClassEntityCollection %} +{{ "{% for someClassEntity in phpEntities %} {% for methodEntity in someClassEntity.getMethodEntityCollection() %} * {{ someClassEntity.getName() }}::{{ methodEntity.getName() }}() {% endfor %} @@ -50,7 +50,7 @@ The root collections ([a]RootEntityCollection[/a]), which are directly accessibl - {% for entityCollection in phpClassEntityCollection + {% for entityCollection in phpEntities .filterByParentClassNames(['BumbleDocGen\\Core\\Parser\\Entity\\RootEntityCollection']) .getOnlyInstantiable() %} @@ -77,7 +77,7 @@ These classes are a convenient wrapper for accessing data in templates: -{% for entityCollection in phpClassEntityCollection +{% for entityCollection in phpEntities .filterByParentClassNames(['BumbleDocGen\\Core\\Parser\\Entity\\BaseEntityCollection']) .getOnlyInstantiable() %} diff --git a/selfdoc/templates/tech/2.parser/entityFilterCondition.md.twig b/selfdoc/templates/tech/2.parser/entityFilterCondition.md.twig index 61ebe320..7563ff9e 100644 --- a/selfdoc/templates/tech/2.parser/entityFilterCondition.md.twig +++ b/selfdoc/templates/tech/2.parser/entityFilterCondition.md.twig @@ -67,7 +67,7 @@ language_handlers: {{ "Available filters" | textToHeading('H2') }} -{% set filterConditions = phpClassEntityCollection.filterByInterfaces(['BumbleDocGen\\Core\\Parser\\FilterCondition\\ConditionInterface']).getOnlyInstantiable() %} +{% set filterConditions = phpEntities.filterByInterfaces(['BumbleDocGen\\Core\\Parser\\FilterCondition\\ConditionInterface']).getOnlyInstantiable() %} Common filtering conditions that are available for any entity: diff --git a/selfdoc/templates/tech/2.parser/sourceLocator.md.twig b/selfdoc/templates/tech/2.parser/sourceLocator.md.twig index dfbb5a49..d83566e1 100644 --- a/selfdoc/templates/tech/2.parser/sourceLocator.md.twig +++ b/selfdoc/templates/tech/2.parser/sourceLocator.md.twig @@ -20,7 +20,7 @@ You can create your own source locators or use any existing ones. All source loc {{ "Built-in source locators" | textToHeading('H2') }} {{ printEntityCollectionAsList( - phpClassEntityCollection + phpEntities .filterByInterfaces(['BumbleDocGen\\Core\\Parser\\SourceLocator\\SourceLocatorInterface']) .filterByPaths(['/src/Core/Parser']) .getOnlyInstantiable() diff --git a/selfdoc/templates/tech/3.renderer/01_templates.md.twig b/selfdoc/templates/tech/3.renderer/01_templates.md.twig index 40e1adf1..c06668d9 100644 --- a/selfdoc/templates/tech/3.renderer/01_templates.md.twig +++ b/selfdoc/templates/tech/3.renderer/01_templates.md.twig @@ -28,7 +28,7 @@ Some static text... Dynamic block: -{\{ printEntityCollectionAsList(phpClassEntityCollection.filterByInterfaces(['\\\\BumbleDocGen\\\\Core\\\\Parser\\\\SourceLocator\\\\SourceLocatorInterface']).getOnlyInstantiable()) }\} +{\{ printEntityCollectionAsList(phpEntities.filterByInterfaces(['\\\\BumbleDocGen\\\\Core\\\\Parser\\\\SourceLocator\\\\SourceLocatorInterface']).getOnlyInstantiable()) }\} More static text... " | textToCodeBlock('twig') }} @@ -63,7 +63,7 @@ Output method description as a dynamic block: Dynamic block: -{\{ phpClassEntityCollection +{\{ phpEntities .get('\\\\BumbleDocGen\\\\LanguageHandler\\\\LanguageHandlerInterface') .getMethodEntity('getLanguageKey') .getDescription() diff --git a/selfdoc/templates/tech/3.renderer/04_twigCustomFilters.md.twig b/selfdoc/templates/tech/3.renderer/04_twigCustomFilters.md.twig index d760db7a..07e1519a 100644 --- a/selfdoc/templates/tech/3.renderer/04_twigCustomFilters.md.twig +++ b/selfdoc/templates/tech/3.renderer/04_twigCustomFilters.md.twig @@ -55,7 +55,7 @@ Here is a list of filters available by default: - {% for filter in phpClassEntityCollection.filterByPaths([ + {% for filter in phpEntities.filterByPaths([ '/src/Core/Renderer/Twig/Filter', '/src/LanguageHandler/Php/Renderer/Twig/Filter' ]) @@ -69,7 +69,7 @@ Here is a list of filters available by default: {% if loop.index == 1 %} {% set rowspan = paramsCount * 2 - 1 %} {% if rowspan == 1 %} @@ -80,7 +80,7 @@ Here is a list of filters available by default: ${{ parameter.name }} {% endif %} diff --git a/selfdoc/templates/tech/3.renderer/05_twigCustomFunctions.md.twig b/selfdoc/templates/tech/3.renderer/05_twigCustomFunctions.md.twig index e4807e11..ec4842c6 100644 --- a/selfdoc/templates/tech/3.renderer/05_twigCustomFunctions.md.twig +++ b/selfdoc/templates/tech/3.renderer/05_twigCustomFunctions.md.twig @@ -53,7 +53,7 @@ Here is a list of functions available by default: - {% for function in phpClassEntityCollection.filterByPaths([ + {% for function in phpEntities.filterByPaths([ '/src/Core/Renderer/Twig/Function', '/src/LanguageHandler/Php/Renderer/Twig/Function' ]) @@ -67,7 +67,7 @@ Here is a list of functions available by default: {% if loop.index == 1 %} diff --git a/selfdoc/templates/tech/3.renderer/templatesDynamicBlocks.md.twig b/selfdoc/templates/tech/3.renderer/templatesDynamicBlocks.md.twig index b11b96f7..65c091b5 100644 --- a/selfdoc/templates/tech/3.renderer/templatesDynamicBlocks.md.twig +++ b/selfdoc/templates/tech/3.renderer/templatesDynamicBlocks.md.twig @@ -9,11 +9,11 @@ There are several ways to create dynamic blocks in templates. * First of all, these are custom twig functions and filters. You can use the built-in functions and filters or add your own, so you can implement any logic for generating dynamically changing content. -{{ "{\{ printEntityCollectionAsList(phpClassEntityCollection.filterByInterfaces(['\\\\BumbleDocGen\\\\Core\\\\Parser\\\\SourceLocator\\\\SourceLocatorInterface']).getOnlyInstantiable()) }\}" | textToCodeBlock('twig') }} +{{ "{\{ printEntityCollectionAsList(phpEntities.filterByInterfaces(['\\\\BumbleDocGen\\\\Core\\\\Parser\\\\SourceLocator\\\\SourceLocatorInterface']).getOnlyInstantiable()) }\}" | textToCodeBlock('twig') }} * The second way is to output data from variables directly to the template. For example, you can display a list of classes or methods of documented code according to certain rules. -{{ "{% for entity in phpClassEntityCollection.filterByInterfaces(['\\\\BumbleDocGen\\\\Core\\\\Parser\\\\SourceLocator\\\\SourceLocatorInterface']).getOnlyInstantiable() %} +{{ "{% for entity in phpEntities.filterByInterfaces(['\\\\BumbleDocGen\\\\Core\\\\Parser\\\\SourceLocator\\\\SourceLocatorInterface']).getOnlyInstantiable() %} * {{ entity.getName() }} {% endfor %} " | textToCodeBlock('twig') }} diff --git a/selfdoc/templates/tech/3.renderer/templatesVariables.md.twig b/selfdoc/templates/tech/3.renderer/templatesVariables.md.twig index 6094aa13..e285dc7d 100644 --- a/selfdoc/templates/tech/3.renderer/templatesVariables.md.twig +++ b/selfdoc/templates/tech/3.renderer/templatesVariables.md.twig @@ -8,4 +8,4 @@ There are several variables available in each processed template. 1) Firstly, these are built-in twig variables, for example `_self`, which returns the path to the processed template. -2) Secondly, variables with collections of processed programming languages are available in the template (see [a]LanguageHandlerInterface[/a]). For example, when processing a PHP project collection, a collection [a]ClassEntityCollection[/a] will be available in the template under the name phpClassEntityCollection +2) Secondly, variables with collections of processed programming languages are available in the template (see [a]LanguageHandlerInterface[/a]). For example, when processing a PHP project collection, a collection [a]ClassEntityCollection[/a] will be available in the template under the name phpEntities diff --git a/selfdoc/templates/tech/4.pluginSystem/readme.md.twig b/selfdoc/templates/tech/4.pluginSystem/readme.md.twig index c69bcea4..eb3cd1b9 100644 --- a/selfdoc/templates/tech/4.pluginSystem/readme.md.twig +++ b/selfdoc/templates/tech/4.pluginSystem/readme.md.twig @@ -29,7 +29,7 @@ Plugins for any programming languages work regardless of which language handler -{% for pluginEntity in phpClassEntityCollection +{% for pluginEntity in phpEntities .filterByPaths([ '/src/Core', '/src/LanguageHandler', @@ -55,7 +55,7 @@ Plugins for any programming languages work regardless of which language handler {{ "Default events" | textToHeading('H2') }} -{{ printEntityCollectionAsList( phpClassEntityCollection +{{ printEntityCollectionAsList( phpEntities .filterByPaths([ '/src/Core', '/src/LanguageHandler', diff --git a/selfdoc/templates/tech/map.md.twig b/selfdoc/templates/tech/map.md.twig index ff9ed9a4..23ebf204 100644 --- a/selfdoc/templates/tech/map.md.twig +++ b/selfdoc/templates/tech/map.md.twig @@ -4,4 +4,4 @@ Directory layout ( only documented files shown ): -{{ drawClassMap( phpClassEntityCollection.filterByPaths(['/src']) ) }} \ No newline at end of file +{{ drawClassMap( phpEntities.filterByPaths(['/src']) ) }} \ No newline at end of file diff --git a/src/Core/Renderer/Twig/Function/GetDocumentedEntityUrl.php b/src/Core/Renderer/Twig/Function/GetDocumentedEntityUrl.php index 11e2f2cc..925b6e5f 100644 --- a/src/Core/Renderer/Twig/Function/GetDocumentedEntityUrl.php +++ b/src/Core/Renderer/Twig/Function/GetDocumentedEntityUrl.php @@ -25,13 +25,13 @@ * @see DocumentedEntityWrappersCollection * @see RendererContext::$entityWrappersCollection * - * @example {{ getDocumentedEntityUrl(phpClassEntityCollection, '\\BumbleDocGen\\Renderer\\Twig\\MainExtension', 'getFunctions') }} + * @example {{ getDocumentedEntityUrl(phpEntities, '\\BumbleDocGen\\Renderer\\Twig\\MainExtension', 'getFunctions') }} * The function returns a reference to the documented entity, anchored to the getFunctions method * - * @example {{ getDocumentedEntityUrl(phpClassEntityCollection, '\\BumbleDocGen\\Renderer\\Twig\\MainExtension') }} + * @example {{ getDocumentedEntityUrl(phpEntities, '\\BumbleDocGen\\Renderer\\Twig\\MainExtension') }} * The function returns a reference to the documented entity MainExtension * - * @example {{ getDocumentedEntityUrl(phpClassEntityCollection, '\\BumbleDocGen\\Renderer\\Twig\\MainExtension', '', false) }} + * @example {{ getDocumentedEntityUrl(phpEntities, '\\BumbleDocGen\\Renderer\\Twig\\MainExtension', '', false) }} * The function returns a link to the file MainExtension */ final class GetDocumentedEntityUrl implements CustomFunctionInterface diff --git a/src/Core/Renderer/Twig/Function/PrintEntityCollectionAsList.php b/src/Core/Renderer/Twig/Function/PrintEntityCollectionAsList.php index d97dd85a..6b0a70ed 100644 --- a/src/Core/Renderer/Twig/Function/PrintEntityCollectionAsList.php +++ b/src/Core/Renderer/Twig/Function/PrintEntityCollectionAsList.php @@ -12,10 +12,10 @@ * * @note This function initiates the creation of documents for the displayed entities * - * @example {{ printEntityCollectionAsList(phpClassEntityCollection.filterByInterfaces(['ScriptFramework\\ScriptInterface', 'ScriptFramework\\TestScriptInterface'])) }} + * @example {{ printEntityCollectionAsList(phpEntities.filterByInterfaces(['ScriptFramework\\ScriptInterface', 'ScriptFramework\\TestScriptInterface'])) }} * The function will output a list of PHP classes that match the ScriptFramework\ScriptInterface and ScriptFramework\TestScriptInterface interfaces * - * @example {{ printEntityCollectionAsList(phpClassEntityCollection) }} + * @example {{ printEntityCollectionAsList(phpEntities) }} * The function will list all documented PHP classes */ final class PrintEntityCollectionAsList implements CustomFunctionInterface diff --git a/src/LanguageHandler/Php/Parser/Entity/ClassEntityCollection.php b/src/LanguageHandler/Php/Parser/Entity/ClassEntityCollection.php index d7eb76c5..df17d005 100644 --- a/src/LanguageHandler/Php/Parser/Entity/ClassEntityCollection.php +++ b/src/LanguageHandler/Php/Parser/Entity/ClassEntityCollection.php @@ -37,7 +37,7 @@ final class ClassEntityCollection extends LoggableRootEntityCollection { private const PHP_FILE_TEMPLATE = '/\.php$/'; - public const NAME = 'phpClassEntityCollection'; + public const NAME = 'phpEntities'; private array $entitiesNotHandledByPlugins = []; diff --git a/src/LanguageHandler/Php/Plugin/CorePlugin/EntityDocUnifiedPlace/templates/__structure/classes.md.twig b/src/LanguageHandler/Php/Plugin/CorePlugin/EntityDocUnifiedPlace/templates/__structure/classes.md.twig index 2d5fcba1..d2f3f103 100644 --- a/src/LanguageHandler/Php/Plugin/CorePlugin/EntityDocUnifiedPlace/templates/__structure/classes.md.twig +++ b/src/LanguageHandler/Php/Plugin/CorePlugin/EntityDocUnifiedPlace/templates/__structure/classes.md.twig @@ -7,11 +7,11 @@
      PL Description
      PL Description
      1 %}rowspan="{{ rowspan }}"{% endif %}> - {{ twigFilterData.name }}
      + {{ twigFilterData.name }}
      {% if filter.isInternal() %}:warning: For internal use
      {% endif %}{{ filter.getDescription() | removeLineBrakes }}{% if filter.getDocNote() %}
      :warning: {{ filter.getDocNote() }}
      {% endif %}
      - {{ parameter.type | strTypeToUrl(phpClassEntityCollection, true) }} + {{ parameter.type | strTypeToUrl(phpEntities, true) }} {{ parameter.description | removeLineBrakes }}
      - {{ twigFunctionData.name }}
      + {{ twigFunctionData.name }}
      {% if function.isInternal() %}:warning: For internal use
      {% endif %} {{ function.getDescription() | removeLineBrakes }} {% if function.getDocNote() %}
      :warning: {{ function.getDocNote() }}
      {% endif %} @@ -77,7 +77,7 @@ Here is a list of functions available by default: ${{ parameter.name }}
      - {{ parameter.type | strTypeToUrl(phpClassEntityCollection, true, true) }} + {{ parameter.type | strTypeToUrl(phpEntities, true, true) }} {{ parameter.description | removeLineBrakes }}
      Handles events Description
      -{% for abstractClassEntity in phpClassEntityCollection.getOnlyAbstractClasses() %} +{% for abstractClassEntity in phpEntities.getOnlyAbstractClasses() %} {% endfor %} -{% for classEntity in phpClassEntityCollection.getOnlyInstantiable() %} +{% for classEntity in phpEntities.getOnlyInstantiable() %} {% endfor %}
      NameNamespace
      Abstract classes
      [a x-title='{{ classEntity.getShortName() }}']{{ abstractClassEntity.getName() }}[/a]{{ abstractClassEntity.getNamespaceName() }}
      Classes
      [a x-title='{{ classEntity.getShortName() }}']{{ classEntity.getName() }}[/a]{{ classEntity.getNamespaceName() }}
      \ No newline at end of file diff --git a/src/LanguageHandler/Php/Plugin/CorePlugin/EntityDocUnifiedPlace/templates/__structure/interfaces.md.twig b/src/LanguageHandler/Php/Plugin/CorePlugin/EntityDocUnifiedPlace/templates/__structure/interfaces.md.twig index 437bee78..1c90347c 100644 --- a/src/LanguageHandler/Php/Plugin/CorePlugin/EntityDocUnifiedPlace/templates/__structure/interfaces.md.twig +++ b/src/LanguageHandler/Php/Plugin/CorePlugin/EntityDocUnifiedPlace/templates/__structure/interfaces.md.twig @@ -6,7 +6,7 @@ -{% for interfaceEntity in phpClassEntityCollection.getOnlyInterfaces() %} +{% for interfaceEntity in phpEntities.getOnlyInterfaces() %} {% endfor %}
      NameNamespace
      [a x-title='{{ interfaceEntity.getShortName() }}']{{ interfaceEntity.getName() }}[/a]{{ interfaceEntity.getNamespaceName() }}
      \ No newline at end of file diff --git a/src/LanguageHandler/Php/Plugin/CorePlugin/EntityDocUnifiedPlace/templates/__structure/map.md.twig b/src/LanguageHandler/Php/Plugin/CorePlugin/EntityDocUnifiedPlace/templates/__structure/map.md.twig index 7d2885f2..310f6542 100644 --- a/src/LanguageHandler/Php/Plugin/CorePlugin/EntityDocUnifiedPlace/templates/__structure/map.md.twig +++ b/src/LanguageHandler/Php/Plugin/CorePlugin/EntityDocUnifiedPlace/templates/__structure/map.md.twig @@ -4,4 +4,4 @@ {{ "Entities map" | textToHeading('H1') }} -{{ drawClassMap( phpClassEntityCollection ) }} \ No newline at end of file +{{ drawClassMap( phpEntities ) }} \ No newline at end of file diff --git a/src/LanguageHandler/Php/Plugin/CorePlugin/EntityDocUnifiedPlace/templates/__structure/traits.md.twig b/src/LanguageHandler/Php/Plugin/CorePlugin/EntityDocUnifiedPlace/templates/__structure/traits.md.twig index 73428e7c..bec445e4 100644 --- a/src/LanguageHandler/Php/Plugin/CorePlugin/EntityDocUnifiedPlace/templates/__structure/traits.md.twig +++ b/src/LanguageHandler/Php/Plugin/CorePlugin/EntityDocUnifiedPlace/templates/__structure/traits.md.twig @@ -6,7 +6,7 @@ -{% for traitEntity in phpClassEntityCollection.getOnlyTraits() %} +{% for traitEntity in phpEntities.getOnlyTraits() %} {% endfor %}
      NameNamespace
      [a x-title='{{ traitEntity.getShortName() }}']{{ traitEntity.getName() }}[/a]{{ traitEntity.getNamespaceName() }}
      \ No newline at end of file From 9632f50b8fa0a3a9bbeaa232b96b48e3f0371564 Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Mon, 20 Nov 2023 19:34:29 +0300 Subject: [PATCH 071/210] Renaming entities collections --- .../TwigFilterClassParserPlugin.php | 4 ++-- .../TwigFunctionClassParserPlugin.php | 4 ++-- .../FindEntitiesClassesByCollectionClassName.php | 10 +++++----- .../Parser/Entity/RootEntityCollectionsGroup.php | 4 ++-- .../Entity/Cache/CacheablePhpEntityFactory.php | 8 ++++---- .../Php/Parser/Entity/ClassEntityCollection.php | 16 ++++++++-------- .../Php/Parser/Entity/ClassLikeEntity.php | 6 +++--- src/LanguageHandler/Php/PhpHandler.php | 8 ++++---- .../Parser/AfterLoadingClassEntityCollection.php | 4 ++-- .../Parser/OnAddClassEntityToCollection.php | 6 +++--- .../Php/Renderer/Twig/Function/DrawClassMap.php | 16 ++++++++-------- .../Twig/Function/GetClassMethodsBodyCode.php | 6 +++--- 12 files changed, 46 insertions(+), 46 deletions(-) diff --git a/selfdoc/Plugin/TwigFilterClassParser/TwigFilterClassParserPlugin.php b/selfdoc/Plugin/TwigFilterClassParser/TwigFilterClassParserPlugin.php index eb59d012..ca65cfde 100644 --- a/selfdoc/Plugin/TwigFilterClassParser/TwigFilterClassParserPlugin.php +++ b/selfdoc/Plugin/TwigFilterClassParser/TwigFilterClassParserPlugin.php @@ -126,7 +126,7 @@ private function getAllUsedFilters(): array * @throws NotFoundException * @throws InvalidConfigurationParameterException */ - private function getFilterData(ClassEntityCollection $classEntityCollection, string $className): ?array + private function getFilterData(ClassEntityCollection $entityCollection, string $className): ?array { static $filtersData = []; if (!array_key_exists($className, $filtersData)) { @@ -136,7 +136,7 @@ private function getFilterData(ClassEntityCollection $classEntityCollection, str } $functionData['name'] = $filters[$className]; - $entity = $classEntityCollection->getEntityByClassName($className); + $entity = $entityCollection->getEntityByClassName($className); $method = $entity->getMethodEntityCollection()->get('__invoke'); $functionData['parameters'] = $method->getParameters(); $filtersData[$className] = $functionData; diff --git a/selfdoc/Plugin/TwigFunctionClassParser/TwigFunctionClassParserPlugin.php b/selfdoc/Plugin/TwigFunctionClassParser/TwigFunctionClassParserPlugin.php index cd5d7c8b..5e1b90db 100644 --- a/selfdoc/Plugin/TwigFunctionClassParser/TwigFunctionClassParserPlugin.php +++ b/selfdoc/Plugin/TwigFunctionClassParser/TwigFunctionClassParserPlugin.php @@ -121,7 +121,7 @@ private function getAllUsedFunctions(): array * @throws NotFoundException * @throws InvalidConfigurationParameterException */ - private function getFunctionData(ClassEntityCollection $classEntityCollection, string $className): ?array + private function getFunctionData(ClassEntityCollection $entityCollection, string $className): ?array { static $functionsData = []; if (!array_key_exists($className, $functionsData)) { @@ -129,7 +129,7 @@ private function getFunctionData(ClassEntityCollection $classEntityCollection, s if (!isset($functions[$className])) { return null; } - $entity = $classEntityCollection->getEntityByClassName($className); + $entity = $entityCollection->getEntityByClassName($className); if (str_starts_with($entity->getRelativeFileName(), '/selfdoc')) { return null; } diff --git a/selfdoc/Twig/CustomFunction/FindEntitiesClassesByCollectionClassName.php b/selfdoc/Twig/CustomFunction/FindEntitiesClassesByCollectionClassName.php index cb888f3b..f69da6e6 100644 --- a/selfdoc/Twig/CustomFunction/FindEntitiesClassesByCollectionClassName.php +++ b/selfdoc/Twig/CustomFunction/FindEntitiesClassesByCollectionClassName.php @@ -26,12 +26,12 @@ public function __construct(private RootEntityCollectionsGroup $rootEntityCollec */ public function __invoke(string $collectionName): array { - $classEntityCollection = $this->rootEntityCollectionsGroup->get(ClassEntityCollection::NAME); + $entityCollection = $this->rootEntityCollectionsGroup->get(ClassEntityCollection::NAME); /** * @var ClassLikeEntity $findCollectionEntity */ - $findCollectionEntity = $classEntityCollection->findEntity($collectionName); + $findCollectionEntity = $entityCollection->findEntity($collectionName); $addMethodEntity = $findCollectionEntity->getMethodEntity('add'); if (!$addMethodEntity) { return []; @@ -40,14 +40,14 @@ public function __invoke(string $collectionName): array /** * @var ClassLikeEntity $firstParamEntity */ - $firstParamEntity = $classEntityCollection->findEntity($firstParam['type']); + $firstParamEntity = $entityCollection->findEntity($firstParam['type']); if ($firstParamEntity->isInterface()) { - return iterator_to_array($classEntityCollection->filterByInterfaces([$firstParamEntity->getName()])); + return iterator_to_array($entityCollection->filterByInterfaces([$firstParamEntity->getName()])); } elseif ($firstParamEntity->isInstantiable()) { return [$firstParamEntity]; } - return iterator_to_array($classEntityCollection->filterByParentClassNames([$firstParamEntity->getName()])); + return iterator_to_array($entityCollection->filterByParentClassNames([$firstParamEntity->getName()])); } public static function getName(): string diff --git a/src/Core/Parser/Entity/RootEntityCollectionsGroup.php b/src/Core/Parser/Entity/RootEntityCollectionsGroup.php index eb1a9b48..e99d0a05 100644 --- a/src/Core/Parser/Entity/RootEntityCollectionsGroup.php +++ b/src/Core/Parser/Entity/RootEntityCollectionsGroup.php @@ -64,9 +64,9 @@ public function getOperationsLogWithoutDuplicates(): array return $operationsLog; } - public function isFoundEntitiesOperationsLogCacheOutdated(array $classEntityCollectionOperationsLog): bool + public function isFoundEntitiesOperationsLogCacheOutdated(array $entityCollectionOperationsLog): bool { - foreach ($classEntityCollectionOperationsLog as $collectionName => $operationsLog) { + foreach ($entityCollectionOperationsLog as $collectionName => $operationsLog) { $collection = $this->get($collectionName); if (!$collection || $operationsLog->isFoundEntitiesCacheOutdated($this->get($collectionName))) { return true; diff --git a/src/LanguageHandler/Php/Parser/Entity/Cache/CacheablePhpEntityFactory.php b/src/LanguageHandler/Php/Parser/Entity/Cache/CacheablePhpEntityFactory.php index 02e59666..021e4e86 100644 --- a/src/LanguageHandler/Php/Parser/Entity/Cache/CacheablePhpEntityFactory.php +++ b/src/LanguageHandler/Php/Parser/Entity/Cache/CacheablePhpEntityFactory.php @@ -136,7 +136,7 @@ public function createDynamicMethodEntity( * @throws InvalidConfigurationParameterException */ public function createClassLikeEntity( - ClassEntityCollection $classEntityCollection, + ClassEntityCollection $entityCollection, string $className, ?string $relativeFileName = null ): ClassLikeEntity { @@ -167,7 +167,7 @@ public function createClassLikeEntity( $wrapperClassName = $this->getOrCreateEntityClassWrapper($entityClassName); /** @var ClassLikeEntity $classEntity */ $classEntity = $this->diContainer->make($wrapperClassName, [ - 'classEntityCollection' => $classEntityCollection, + 'entityCollection' => $entityCollection, 'className' => $className, 'relativeFileName' => $relativeFileName ]); @@ -181,7 +181,7 @@ public function createClassLikeEntity( */ public function createSubClassEntity( string $subClassEntity, - ClassEntityCollection $classEntityCollection, + ClassEntityCollection $entityCollection, string $className, ?string $relativeFileName ): ClassLikeEntity { @@ -198,7 +198,7 @@ public function createSubClassEntity( } $wrapperClassName = $this->getOrCreateEntityClassWrapper($subClassEntity); $classEntity = $this->diContainer->make($wrapperClassName, [ - 'classEntityCollection' => $classEntityCollection, + 'entityCollection' => $entityCollection, 'className' => $className, 'relativeFileName' => $relativeFileName ]); diff --git a/src/LanguageHandler/Php/Parser/Entity/ClassEntityCollection.php b/src/LanguageHandler/Php/Parser/Entity/ClassEntityCollection.php index df17d005..b2205713 100644 --- a/src/LanguageHandler/Php/Parser/Entity/ClassEntityCollection.php +++ b/src/LanguageHandler/Php/Parser/Entity/ClassEntityCollection.php @@ -359,14 +359,14 @@ public function getOnlyAbstractClasses(): ClassEntityCollection * @return ClassLikeEntity|null * * @example - * $classEntityCollection->findEntity('App'); // class name - * $classEntityCollection->findEntity('BumbleDocGen\Console\App'); // class with namespace - * $classEntityCollection->findEntity('\BumbleDocGen\Console\App'); // class with namespace - * $classEntityCollection->findEntity('\BumbleDocGen\Console\App::test()'); // class with namespace and optional part - * $classEntityCollection->findEntity('App.php'); // filename - * $classEntityCollection->findEntity('/BumbleDocGen/Console/App.php'); // relative path - * $classEntityCollection->findEntity('/Users/someuser/Desktop/projects/bumble-doc-gen/BumbleDocGen/Console/App.php'); // absolute path - * $classEntityCollection->findEntity('https://github.com/bumble-tech/bumble-doc-gen/blob/master/BumbleDocGen/Console/App.php'); // source link + * $entityCollection->findEntity('App'); // class name + * $entityCollection->findEntity('BumbleDocGen\Console\App'); // class with namespace + * $entityCollection->findEntity('\BumbleDocGen\Console\App'); // class with namespace + * $entityCollection->findEntity('\BumbleDocGen\Console\App::test()'); // class with namespace and optional part + * $entityCollection->findEntity('App.php'); // filename + * $entityCollection->findEntity('/BumbleDocGen/Console/App.php'); // relative path + * $entityCollection->findEntity('/Users/someuser/Desktop/projects/bumble-doc-gen/BumbleDocGen/Console/App.php'); // absolute path + * $entityCollection->findEntity('https://github.com/bumble-tech/bumble-doc-gen/blob/master/BumbleDocGen/Console/App.php'); // source link */ public function internalFindEntity(string $search, bool $useUnsafeKeys = true): ?ClassLikeEntity { diff --git a/src/LanguageHandler/Php/Parser/Entity/ClassLikeEntity.php b/src/LanguageHandler/Php/Parser/Entity/ClassLikeEntity.php index 4ef5c10e..6fe58c78 100644 --- a/src/LanguageHandler/Php/Parser/Entity/ClassLikeEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/ClassLikeEntity.php @@ -54,7 +54,7 @@ abstract class ClassLikeEntity extends BaseEntity implements DocumentTransformab public function __construct( private Configuration $configuration, private PhpHandlerSettings $phpHandlerSettings, - private ClassEntityCollection $classEntityCollection, + private ClassEntityCollection $entityCollection, private ParserHelper $parserHelper, private ComposerHelper $composerHelper, private PhpParserHelper $phpParserHelper, @@ -116,7 +116,7 @@ public function getPhpHandlerSettings(): PhpHandlerSettings final public function getRootEntityCollection(): ClassEntityCollection { - return $this->classEntityCollection; + return $this->entityCollection; } /** @@ -395,7 +395,7 @@ public function getTraits(): array { $traits = []; foreach ($this->getTraitsNames() as $traitsName) { - $traits[] = $this->classEntityCollection->getLoadedOrCreateNew($traitsName); + $traits[] = $this->entityCollection->getLoadedOrCreateNew($traitsName); } return $traits; } diff --git a/src/LanguageHandler/Php/PhpHandler.php b/src/LanguageHandler/Php/PhpHandler.php index 87e5e736..8f36ff87 100644 --- a/src/LanguageHandler/Php/PhpHandler.php +++ b/src/LanguageHandler/Php/PhpHandler.php @@ -16,7 +16,7 @@ final class PhpHandler implements LanguageHandlerInterface { - public function __construct(private ClassEntityCollection $classEntityCollection, private PhpHandlerSettings $phpHandlerSettings) + public function __construct(private ClassEntityCollection $entityCollection, private PhpHandlerSettings $phpHandlerSettings) { } @@ -33,10 +33,10 @@ public static function getLanguageKey(): string */ public function getEntityCollection(): RootEntityCollection { - if ($this->classEntityCollection->isEmpty()) { - $this->classEntityCollection->loadClassEntities(); + if ($this->entityCollection->isEmpty()) { + $this->entityCollection->loadClassEntities(); } - return $this->classEntityCollection; + return $this->entityCollection; } /** diff --git a/src/LanguageHandler/Php/Plugin/Event/Parser/AfterLoadingClassEntityCollection.php b/src/LanguageHandler/Php/Plugin/Event/Parser/AfterLoadingClassEntityCollection.php index afc72322..d9c76ef5 100644 --- a/src/LanguageHandler/Php/Plugin/Event/Parser/AfterLoadingClassEntityCollection.php +++ b/src/LanguageHandler/Php/Plugin/Event/Parser/AfterLoadingClassEntityCollection.php @@ -12,12 +12,12 @@ */ final class AfterLoadingClassEntityCollection extends Event { - public function __construct(private ClassEntityCollection $classEntityCollection) + public function __construct(private ClassEntityCollection $entityCollection) { } public function getClassEntityCollection(): ClassEntityCollection { - return $this->classEntityCollection; + return $this->entityCollection; } } diff --git a/src/LanguageHandler/Php/Plugin/Event/Parser/OnAddClassEntityToCollection.php b/src/LanguageHandler/Php/Plugin/Event/Parser/OnAddClassEntityToCollection.php index 2a952d64..d48780d2 100644 --- a/src/LanguageHandler/Php/Plugin/Event/Parser/OnAddClassEntityToCollection.php +++ b/src/LanguageHandler/Php/Plugin/Event/Parser/OnAddClassEntityToCollection.php @@ -16,18 +16,18 @@ final class OnAddClassEntityToCollection extends Event implements OnlySingleExec { public function __construct( private ClassLikeEntity $classEntity, - private ClassEntityCollection $classEntityCollection + private ClassEntityCollection $entityCollection ) { } public function getUniqueExecutionId(): string { - return "{$this->classEntity->getName()}{$this->classEntityCollection->getEntityCollectionName()}"; + return "{$this->classEntity->getName()}{$this->entityCollection->getEntityCollectionName()}"; } public function getClassEntityCollection(): ClassEntityCollection { - return $this->classEntityCollection; + return $this->entityCollection; } public function getRootEntity(): ClassLikeEntity diff --git a/src/LanguageHandler/Php/Renderer/Twig/Function/DrawClassMap.php b/src/LanguageHandler/Php/Renderer/Twig/Function/DrawClassMap.php index 46b730de..a24c7aec 100644 --- a/src/LanguageHandler/Php/Renderer/Twig/Function/DrawClassMap.php +++ b/src/LanguageHandler/Php/Renderer/Twig/Function/DrawClassMap.php @@ -18,8 +18,8 @@ * * @note This function initiates the creation of documents for the displayed entities * - * @example {{ drawClassMap(classEntityCollection.filterByPaths(['/src/Renderer'])) }} - * @example {{ drawClassMap(classEntityCollection) }} + * @example {{ drawClassMap(phpEntities.filterByPaths(['/src/Renderer'])) }} + * @example {{ drawClassMap(phpEntities) }} */ final class DrawClassMap implements CustomFunctionInterface { @@ -46,7 +46,7 @@ public static function getOptions(): array /** - * @param ClassEntityCollection ...$classEntityCollections + * @param ClassEntityCollection ...$entityCollections * The collection of entities for which the class map will be generated * @return string * @@ -55,10 +55,10 @@ public static function getOptions(): array * @throws InvalidConfigurationParameterException */ public function __invoke( - ClassEntityCollection ...$classEntityCollections, + ClassEntityCollection ...$entityCollections, ): string { $structure = $this->convertDirectoryStructureToFormattedString( - $this->getDirectoryStructure(...$classEntityCollections), + $this->getDirectoryStructure(...$entityCollections), ); return "
      {$structure}
      "; } @@ -94,11 +94,11 @@ protected function appendClassToDirectoryStructure(array $directoryStructure, Cl * @throws DependencyException * @throws InvalidConfigurationParameterException */ - public function getDirectoryStructure(ClassEntityCollection ...$classEntityCollections): array + public function getDirectoryStructure(ClassEntityCollection ...$entityCollections): array { $entities = []; - foreach ($classEntityCollections as $classEntityCollection) { - foreach ($classEntityCollection as $classEntity) { + foreach ($entityCollections as $entityCollection) { + foreach ($entityCollection as $classEntity) { if (!$classEntity->isEntityDataCanBeLoaded()) { continue; } diff --git a/src/LanguageHandler/Php/Renderer/Twig/Function/GetClassMethodsBodyCode.php b/src/LanguageHandler/Php/Renderer/Twig/Function/GetClassMethodsBodyCode.php index 0294d703..f7fe707b 100644 --- a/src/LanguageHandler/Php/Renderer/Twig/Function/GetClassMethodsBodyCode.php +++ b/src/LanguageHandler/Php/Renderer/Twig/Function/GetClassMethodsBodyCode.php @@ -48,11 +48,11 @@ public static function getOptions(): array */ public function __invoke(string $className, array $methodsNames): ?string { - $classEntityCollection = $this->rootEntityCollectionsGroup->get(ClassEntityCollection::NAME); - if (!is_a($classEntityCollection, ClassEntityCollection::class)) { + $entityCollection = $this->rootEntityCollectionsGroup->get(ClassEntityCollection::NAME); + if (!is_a($entityCollection, ClassEntityCollection::class)) { return null; } - $classEntity = $classEntityCollection->getLoadedOrCreateNew($className); + $classEntity = $entityCollection->getLoadedOrCreateNew($className); if ($classEntity->isEntityDataCanBeLoaded()) { $methodsCode = []; $methodEntityCollection = $classEntity->getMethodEntityCollection(); From d7a21cfb08953bb3b4edc7231f48addf15c2ac82 Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Mon, 20 Nov 2023 20:20:29 +0300 Subject: [PATCH 072/210] Renaming root collections --- .../TwigFilterClassParserPlugin.php | 6 +-- .../TwigFunctionClassParserPlugin.php | 6 +-- ...ndEntitiesClassesByCollectionClassName.php | 12 +++--- .../PrintClassCollectionAsGroupedTable.php | 6 +-- .../templates/tech/2.parser/entity.md.twig | 18 ++++----- src/AI/Generators/ReadmeTemplateGenerator.php | 4 +- .../Entity/RootEntityCollectionsGroup.php | 4 +- src/DocGenerator.php | 10 ++--- .../Php/Parser/Entity/BaseEntity.php | 2 +- .../Cache/CacheablePhpEntityFactory.php | 10 ++--- .../Php/Parser/Entity/ClassLikeEntity.php | 8 ++-- ...llection.php => PhpEntitiesCollection.php} | 38 +++++++++---------- .../SubEntity/Constant/ConstantEntity.php | 4 +- .../Entity/SubEntity/Method/MethodEntity.php | 4 +- .../SubEntity/Property/PropertyEntity.php | 4 +- src/LanguageHandler/Php/PhpHandler.php | 10 ++--- .../AfterLoadingClassEntityCollection.php | 8 ++-- .../Parser/OnAddClassEntityToCollection.php | 10 ++--- .../EntityDocRendererHelper.php | 10 ++--- .../Renderer/Twig/Function/DrawClassMap.php | 22 +++++------ .../Twig/Function/GetClassMethodsBodyCode.php | 8 ++-- .../ValueToClassTransformerTest.php | 3 -- 22 files changed, 102 insertions(+), 105 deletions(-) rename src/LanguageHandler/Php/Parser/Entity/{ClassEntityCollection.php => PhpEntitiesCollection.php} (92%) diff --git a/selfdoc/Plugin/TwigFilterClassParser/TwigFilterClassParserPlugin.php b/selfdoc/Plugin/TwigFilterClassParser/TwigFilterClassParserPlugin.php index ca65cfde..5a37133a 100644 --- a/selfdoc/Plugin/TwigFilterClassParser/TwigFilterClassParserPlugin.php +++ b/selfdoc/Plugin/TwigFilterClassParser/TwigFilterClassParserPlugin.php @@ -11,7 +11,7 @@ use BumbleDocGen\Core\Renderer\Context\RendererContext; use BumbleDocGen\Core\Renderer\Twig\Filter\CustomFilterInterface; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; use BumbleDocGen\LanguageHandler\Php\Plugin\Event\Parser\AfterLoadingClassEntityCollection; use BumbleDocGen\LanguageHandler\Php\Renderer\EntityDocRenderer\PhpClassToMd\PhpClassToMdDocRenderer; use DI\DependencyException; @@ -126,7 +126,7 @@ private function getAllUsedFilters(): array * @throws NotFoundException * @throws InvalidConfigurationParameterException */ - private function getFilterData(ClassEntityCollection $entityCollection, string $className): ?array + private function getFilterData(PhpEntitiesCollection $entitiesCollection, string $className): ?array { static $filtersData = []; if (!array_key_exists($className, $filtersData)) { @@ -136,7 +136,7 @@ private function getFilterData(ClassEntityCollection $entityCollection, string $ } $functionData['name'] = $filters[$className]; - $entity = $entityCollection->getEntityByClassName($className); + $entity = $entitiesCollection->getEntityByClassName($className); $method = $entity->getMethodEntityCollection()->get('__invoke'); $functionData['parameters'] = $method->getParameters(); $filtersData[$className] = $functionData; diff --git a/selfdoc/Plugin/TwigFunctionClassParser/TwigFunctionClassParserPlugin.php b/selfdoc/Plugin/TwigFunctionClassParser/TwigFunctionClassParserPlugin.php index 5e1b90db..bd84f850 100644 --- a/selfdoc/Plugin/TwigFunctionClassParser/TwigFunctionClassParserPlugin.php +++ b/selfdoc/Plugin/TwigFunctionClassParser/TwigFunctionClassParserPlugin.php @@ -11,7 +11,7 @@ use BumbleDocGen\Core\Renderer\Context\RendererContext; use BumbleDocGen\Core\Renderer\Twig\Function\CustomFunctionInterface; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; use BumbleDocGen\LanguageHandler\Php\Plugin\Event\Parser\AfterLoadingClassEntityCollection; use BumbleDocGen\LanguageHandler\Php\Renderer\EntityDocRenderer\PhpClassToMd\PhpClassToMdDocRenderer; use DI\DependencyException; @@ -121,7 +121,7 @@ private function getAllUsedFunctions(): array * @throws NotFoundException * @throws InvalidConfigurationParameterException */ - private function getFunctionData(ClassEntityCollection $entityCollection, string $className): ?array + private function getFunctionData(PhpEntitiesCollection $entitiesCollection, string $className): ?array { static $functionsData = []; if (!array_key_exists($className, $functionsData)) { @@ -129,7 +129,7 @@ private function getFunctionData(ClassEntityCollection $entityCollection, string if (!isset($functions[$className])) { return null; } - $entity = $entityCollection->getEntityByClassName($className); + $entity = $entitiesCollection->getEntityByClassName($className); if (str_starts_with($entity->getRelativeFileName(), '/selfdoc')) { return null; } diff --git a/selfdoc/Twig/CustomFunction/FindEntitiesClassesByCollectionClassName.php b/selfdoc/Twig/CustomFunction/FindEntitiesClassesByCollectionClassName.php index f69da6e6..3fdf743b 100644 --- a/selfdoc/Twig/CustomFunction/FindEntitiesClassesByCollectionClassName.php +++ b/selfdoc/Twig/CustomFunction/FindEntitiesClassesByCollectionClassName.php @@ -8,7 +8,7 @@ use BumbleDocGen\Core\Parser\Entity\RootEntityCollectionsGroup; use BumbleDocGen\Core\Renderer\Twig\Function\CustomFunctionInterface; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; use DI\DependencyException; use DI\NotFoundException; @@ -26,12 +26,12 @@ public function __construct(private RootEntityCollectionsGroup $rootEntityCollec */ public function __invoke(string $collectionName): array { - $entityCollection = $this->rootEntityCollectionsGroup->get(ClassEntityCollection::NAME); + $entitiesCollection = $this->rootEntityCollectionsGroup->get(PhpEntitiesCollection::NAME); /** * @var ClassLikeEntity $findCollectionEntity */ - $findCollectionEntity = $entityCollection->findEntity($collectionName); + $findCollectionEntity = $entitiesCollection->findEntity($collectionName); $addMethodEntity = $findCollectionEntity->getMethodEntity('add'); if (!$addMethodEntity) { return []; @@ -40,14 +40,14 @@ public function __invoke(string $collectionName): array /** * @var ClassLikeEntity $firstParamEntity */ - $firstParamEntity = $entityCollection->findEntity($firstParam['type']); + $firstParamEntity = $entitiesCollection->findEntity($firstParam['type']); if ($firstParamEntity->isInterface()) { - return iterator_to_array($entityCollection->filterByInterfaces([$firstParamEntity->getName()])); + return iterator_to_array($entitiesCollection->filterByInterfaces([$firstParamEntity->getName()])); } elseif ($firstParamEntity->isInstantiable()) { return [$firstParamEntity]; } - return iterator_to_array($entityCollection->filterByParentClassNames([$firstParamEntity->getName()])); + return iterator_to_array($entitiesCollection->filterByParentClassNames([$firstParamEntity->getName()])); } public static function getName(): string diff --git a/selfdoc/Twig/CustomFunction/PrintClassCollectionAsGroupedTable.php b/selfdoc/Twig/CustomFunction/PrintClassCollectionAsGroupedTable.php index e8ffcc31..165ee93c 100644 --- a/selfdoc/Twig/CustomFunction/PrintClassCollectionAsGroupedTable.php +++ b/selfdoc/Twig/CustomFunction/PrintClassCollectionAsGroupedTable.php @@ -7,7 +7,7 @@ use BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException; use BumbleDocGen\Core\Renderer\Twig\Function\CustomFunctionInterface; use BumbleDocGen\Core\Renderer\Twig\Function\GetDocumentedEntityUrl; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; use DI\DependencyException; use DI\NotFoundException; @@ -34,7 +34,7 @@ public static function getOptions(): array * @throws DependencyException * @throws InvalidConfigurationParameterException */ - public function __invoke(ClassEntityCollection $rootEntityCollection): string + public function __invoke(PhpEntitiesCollection $rootEntityCollection): string { $groups = $this->groupEntities($rootEntityCollection); $getDocumentedEntityUrlFunction = $this->getDocumentedEntityUrlFunction; @@ -55,7 +55,7 @@ public function __invoke(ClassEntityCollection $rootEntityCollection): string return " {$table} "; } - private function groupEntities(ClassEntityCollection $rootEntityCollection): array + private function groupEntities(PhpEntitiesCollection $rootEntityCollection): array { $notUniquePart = null; foreach ($rootEntityCollection as $entity) { diff --git a/selfdoc/templates/tech/2.parser/entity.md.twig b/selfdoc/templates/tech/2.parser/entity.md.twig index d4f50cda..9d898a75 100644 --- a/selfdoc/templates/tech/2.parser/entity.md.twig +++ b/selfdoc/templates/tech/2.parser/entity.md.twig @@ -50,16 +50,16 @@ The root collections ([a]RootEntityCollection[/a]), which are directly accessibl PL Description - {% for entityCollection in phpEntities + {% for entitiesCollection in phpEntities .filterByParentClassNames(['BumbleDocGen\\Core\\Parser\\Entity\\RootEntityCollection']) .getOnlyInstantiable() %} - {% set match = entityCollection.getRelativeFileName() | preg_match('/(\\/LanguageHandler\\/)([\\s\\S]*?)(?=\\/)/i') %} + {% set match = entitiesCollection.getRelativeFileName() | preg_match('/(\\/LanguageHandler\\/)([\\s\\S]*?)(?=\\/)/i') %} - {{ drawDocumentedEntityLink(entityCollection) }} - {{ entityCollection.getMethodEntity('getEntityCollectionName').getFirstReturnValue() }} + {{ drawDocumentedEntityLink(entitiesCollection) }} + {{ entitiesCollection.getMethodEntity('getEntityCollectionName').getFirstReturnValue() }} {{ match[2] | upper }} - {{ entityCollection.getDescription() }} + {{ entitiesCollection.getDescription() }} {% endfor %} @@ -77,16 +77,16 @@ These classes are a convenient wrapper for accessing data in templates: PL Description -{% for entityCollection in phpEntities +{% for entitiesCollection in phpEntities .filterByParentClassNames(['BumbleDocGen\\Core\\Parser\\Entity\\BaseEntityCollection']) .getOnlyInstantiable() %} - {% set match = entityCollection.getRelativeFileName() | preg_match('/(\\/LanguageHandler\\/)([\\s\\S]*?)(?=\\/)/i') %} - {% set entitiesClasses = findEntitiesClassesByCollectionClassName(entityCollection.getName()) %} + {% set match = entitiesCollection.getRelativeFileName() | preg_match('/(\\/LanguageHandler\\/)([\\s\\S]*?)(?=\\/)/i') %} + {% set entitiesClasses = findEntitiesClassesByCollectionClassName(entitiesCollection.getName()) %} {% for entityClass in entitiesClasses %} {{ drawDocumentedEntityLink(entityClass) }} - {{ drawDocumentedEntityLink(entityCollection) }} + {{ drawDocumentedEntityLink(entitiesCollection) }} {% if entityClass.implementsInterface('BumbleDocGen\\Core\\Parser\\Entity\\RootEntityInterface') %}yes{% else %}no{% endif %} {{ match[2] | upper }} {{ entityClass.getDescription() }} diff --git a/src/AI/Generators/ReadmeTemplateGenerator.php b/src/AI/Generators/ReadmeTemplateGenerator.php index 7251b8e6..4cc42a4a 100644 --- a/src/AI/Generators/ReadmeTemplateGenerator.php +++ b/src/AI/Generators/ReadmeTemplateGenerator.php @@ -8,7 +8,7 @@ use BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException; use BumbleDocGen\Core\Parser\Entity\RootEntityCollection; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; use DI\DependencyException; use DI\NotFoundException; @@ -36,7 +36,7 @@ public function generateReadmeFileContent( ?string $composerJsonFile = null, ?string $additionalPrompt = null, ): string { - if (!is_a($rootEntityCollection, ClassEntityCollection::class)) { + if (!is_a($rootEntityCollection, PhpEntitiesCollection::class)) { throw new \InvalidArgumentException('Currently we can only work with collections of PHP entities'); } diff --git a/src/Core/Parser/Entity/RootEntityCollectionsGroup.php b/src/Core/Parser/Entity/RootEntityCollectionsGroup.php index e99d0a05..68b5215b 100644 --- a/src/Core/Parser/Entity/RootEntityCollectionsGroup.php +++ b/src/Core/Parser/Entity/RootEntityCollectionsGroup.php @@ -64,9 +64,9 @@ public function getOperationsLogWithoutDuplicates(): array return $operationsLog; } - public function isFoundEntitiesOperationsLogCacheOutdated(array $entityCollectionOperationsLog): bool + public function isFoundEntitiesOperationsLogCacheOutdated(array $entitiesCollectionOperationsLog): bool { - foreach ($entityCollectionOperationsLog as $collectionName => $operationsLog) { + foreach ($entitiesCollectionOperationsLog as $collectionName => $operationsLog) { $collection = $this->get($collectionName); if (!$collection || $operationsLog->isFoundEntitiesCacheOutdated($this->get($collectionName))) { return true; diff --git a/src/DocGenerator.php b/src/DocGenerator.php index 3cd801cd..fde4781d 100644 --- a/src/DocGenerator.php +++ b/src/DocGenerator.php @@ -17,7 +17,7 @@ use BumbleDocGen\Core\Renderer\Renderer; use BumbleDocGen\Core\Renderer\Twig\Filter\AddIndentFromLeft; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\InterfaceEntity; use BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper; use DI\DependencyException; @@ -92,11 +92,11 @@ public function addDocBlocks( } $this->parser->parse(); - $entitiesCollection = $this->rootEntityCollectionsGroup->get(ClassEntityCollection::NAME); + $entitiesCollection = $this->rootEntityCollectionsGroup->get(PhpEntitiesCollection::NAME); $missingDocBlocksGenerator = new DocBlocksGenerator($aiProvider, $this->parserHelper); $alreadyProcessedEntities = []; - $getEntities = function (ClassEntityCollection|array $entitiesCollection) use ( + $getEntities = function (PhpEntitiesCollection|array $entitiesCollection) use ( &$getEntities, &$alreadyProcessedEntities ): Generator { @@ -171,7 +171,7 @@ public function generateReadmeTemplate( ): void { $this->io->note("Project analysis"); $this->parser->parse(); - $entitiesCollection = $this->rootEntityCollectionsGroup->get(ClassEntityCollection::NAME); + $entitiesCollection = $this->rootEntityCollectionsGroup->get(PhpEntitiesCollection::NAME); $finder = new Finder(); $finder @@ -259,7 +259,7 @@ public function generate(): void try { $this->parser->parse(); //RootEntityInterface - $in = $this->rootEntityCollectionsGroup->get(ClassEntityCollection::NAME)->get(RootEntityInterface::class); + $in = $this->rootEntityCollectionsGroup->get(PhpEntitiesCollection::NAME)->get(RootEntityInterface::class); /* var_dump($in->getParentClassNames()); $r = new \ReflectionClass(RootEntityInterface::class); diff --git a/src/LanguageHandler/Php/Parser/Entity/BaseEntity.php b/src/LanguageHandler/Php/Parser/Entity/BaseEntity.php index d7e076cf..13e6f6e7 100644 --- a/src/LanguageHandler/Php/Parser/Entity/BaseEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/BaseEntity.php @@ -58,7 +58,7 @@ abstract public function getDescription(): string; abstract public function getDocBlock(): DocBlock; - abstract public function getRootEntityCollection(): ClassEntityCollection; + abstract public function getRootEntityCollection(): PhpEntitiesCollection; abstract public function getPhpHandlerSettings(): PhpHandlerSettings; diff --git a/src/LanguageHandler/Php/Parser/Entity/Cache/CacheablePhpEntityFactory.php b/src/LanguageHandler/Php/Parser/Entity/Cache/CacheablePhpEntityFactory.php index 021e4e86..669bb604 100644 --- a/src/LanguageHandler/Php/Parser/Entity/Cache/CacheablePhpEntityFactory.php +++ b/src/LanguageHandler/Php/Parser/Entity/Cache/CacheablePhpEntityFactory.php @@ -10,7 +10,7 @@ use BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityWrapperFactory; use BumbleDocGen\LanguageHandler\Php\Parser\ComposerHelper; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\EnumEntity; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\InterfaceEntity; @@ -136,7 +136,7 @@ public function createDynamicMethodEntity( * @throws InvalidConfigurationParameterException */ public function createClassLikeEntity( - ClassEntityCollection $entityCollection, + PhpEntitiesCollection $entitiesCollection, string $className, ?string $relativeFileName = null ): ClassLikeEntity { @@ -167,7 +167,7 @@ public function createClassLikeEntity( $wrapperClassName = $this->getOrCreateEntityClassWrapper($entityClassName); /** @var ClassLikeEntity $classEntity */ $classEntity = $this->diContainer->make($wrapperClassName, [ - 'entityCollection' => $entityCollection, + 'entitiesCollection' => $entitiesCollection, 'className' => $className, 'relativeFileName' => $relativeFileName ]); @@ -181,7 +181,7 @@ public function createClassLikeEntity( */ public function createSubClassEntity( string $subClassEntity, - ClassEntityCollection $entityCollection, + PhpEntitiesCollection $entitiesCollection, string $className, ?string $relativeFileName ): ClassLikeEntity { @@ -198,7 +198,7 @@ public function createSubClassEntity( } $wrapperClassName = $this->getOrCreateEntityClassWrapper($subClassEntity); $classEntity = $this->diContainer->make($wrapperClassName, [ - 'entityCollection' => $entityCollection, + 'entitiesCollection' => $entitiesCollection, 'className' => $className, 'relativeFileName' => $relativeFileName ]); diff --git a/src/LanguageHandler/Php/Parser/Entity/ClassLikeEntity.php b/src/LanguageHandler/Php/Parser/Entity/ClassLikeEntity.php index 6fe58c78..8c972345 100644 --- a/src/LanguageHandler/Php/Parser/Entity/ClassLikeEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/ClassLikeEntity.php @@ -54,7 +54,7 @@ abstract class ClassLikeEntity extends BaseEntity implements DocumentTransformab public function __construct( private Configuration $configuration, private PhpHandlerSettings $phpHandlerSettings, - private ClassEntityCollection $entityCollection, + private PhpEntitiesCollection $entitiesCollection, private ParserHelper $parserHelper, private ComposerHelper $composerHelper, private PhpParserHelper $phpParserHelper, @@ -114,9 +114,9 @@ public function getPhpHandlerSettings(): PhpHandlerSettings return $this->phpHandlerSettings; } - final public function getRootEntityCollection(): ClassEntityCollection + final public function getRootEntityCollection(): PhpEntitiesCollection { - return $this->entityCollection; + return $this->entitiesCollection; } /** @@ -395,7 +395,7 @@ public function getTraits(): array { $traits = []; foreach ($this->getTraitsNames() as $traitsName) { - $traits[] = $this->entityCollection->getLoadedOrCreateNew($traitsName); + $traits[] = $this->entitiesCollection->getLoadedOrCreateNew($traitsName); } return $traits; } diff --git a/src/LanguageHandler/Php/Parser/Entity/ClassEntityCollection.php b/src/LanguageHandler/Php/Parser/Entity/PhpEntitiesCollection.php similarity index 92% rename from src/LanguageHandler/Php/Parser/Entity/ClassEntityCollection.php rename to src/LanguageHandler/Php/Parser/Entity/PhpEntitiesCollection.php index b2205713..d16a61bd 100644 --- a/src/LanguageHandler/Php/Parser/Entity/ClassEntityCollection.php +++ b/src/LanguageHandler/Php/Parser/Entity/PhpEntitiesCollection.php @@ -32,9 +32,9 @@ use Symfony\Component\Console\Style\OutputStyle; /** - * Collection of PHP class entities + * Collection of class entities */ -final class ClassEntityCollection extends LoggableRootEntityCollection +final class PhpEntitiesCollection extends LoggableRootEntityCollection { private const PHP_FILE_TEMPLATE = '/\.php$/'; public const NAME = 'phpEntities'; @@ -149,7 +149,7 @@ public function loadClassEntities(): void /** * @throws InvalidConfigurationParameterException */ - public function add(ClassLikeEntity $classEntity, bool $reload = false): ClassEntityCollection + public function add(ClassLikeEntity $classEntity, bool $reload = false): PhpEntitiesCollection { $className = $classEntity->getName(); if (!isset($this->entities[$className]) || $reload || isset($this->entitiesNotHandledByPlugins[$className])) { @@ -205,7 +205,7 @@ public function getEntityByClassName(string $className, bool $createIfNotExists * * @throws InvalidConfigurationParameterException */ - public function filterByInterfaces(array $interfaces): ClassEntityCollection + public function filterByInterfaces(array $interfaces): PhpEntitiesCollection { $entitiesCollection = $this->cloneForFiltration(); $interfaces = array_map( @@ -236,7 +236,7 @@ public function filterByInterfaces(array $interfaces): ClassEntityCollection * * @throws InvalidConfigurationParameterException */ - public function filterByParentClassNames(array $parentClassNames): ClassEntityCollection + public function filterByParentClassNames(array $parentClassNames): PhpEntitiesCollection { $entitiesCollection = $this->cloneForFiltration(); $parentClassNames = array_map( @@ -268,7 +268,7 @@ public function filterByParentClassNames(array $parentClassNames): ClassEntityCo * * @throws InvalidConfigurationParameterException */ - public function filterByPaths(array $paths): ClassEntityCollection + public function filterByPaths(array $paths): PhpEntitiesCollection { $entitiesCollection = $this->cloneForFiltration(); foreach ($entitiesCollection as $objectId => $entity) { @@ -286,7 +286,7 @@ public function filterByPaths(array $paths): ClassEntityCollection return $entitiesCollection; } - public function filterByNameRegularExpression(string $regexPattern): ClassEntityCollection + public function filterByNameRegularExpression(string $regexPattern): PhpEntitiesCollection { $entitiesCollection = $this->cloneForFiltration(); foreach ($entitiesCollection as $objectId => $entity) { @@ -301,7 +301,7 @@ public function filterByNameRegularExpression(string $regexPattern): ClassEntity /** * Retrieving only instantiable entities. Filtering is only available for ClassLikeEntity. */ - public function getOnlyInstantiable(): ClassEntityCollection + public function getOnlyInstantiable(): PhpEntitiesCollection { $entitiesCollection = $this->cloneForFiltration(); foreach ($entitiesCollection as $objectId => $entity) { @@ -312,7 +312,7 @@ public function getOnlyInstantiable(): ClassEntityCollection return $entitiesCollection; } - public function getOnlyInterfaces(): ClassEntityCollection + public function getOnlyInterfaces(): PhpEntitiesCollection { $entitiesCollection = $this->cloneForFiltration(); foreach ($entitiesCollection as $objectId => $entity) { @@ -323,7 +323,7 @@ public function getOnlyInterfaces(): ClassEntityCollection return $entitiesCollection; } - public function getOnlyTraits(): ClassEntityCollection + public function getOnlyTraits(): PhpEntitiesCollection { $entitiesCollection = $this->cloneForFiltration(); foreach ($entitiesCollection as $objectId => $entity) { @@ -337,7 +337,7 @@ public function getOnlyTraits(): ClassEntityCollection /** * @throws InvalidConfigurationParameterException */ - public function getOnlyAbstractClasses(): ClassEntityCollection + public function getOnlyAbstractClasses(): PhpEntitiesCollection { $entitiesCollection = $this->cloneForFiltration(); foreach ($entitiesCollection as $objectId => $entity) { @@ -359,14 +359,14 @@ public function getOnlyAbstractClasses(): ClassEntityCollection * @return ClassLikeEntity|null * * @example - * $entityCollection->findEntity('App'); // class name - * $entityCollection->findEntity('BumbleDocGen\Console\App'); // class with namespace - * $entityCollection->findEntity('\BumbleDocGen\Console\App'); // class with namespace - * $entityCollection->findEntity('\BumbleDocGen\Console\App::test()'); // class with namespace and optional part - * $entityCollection->findEntity('App.php'); // filename - * $entityCollection->findEntity('/BumbleDocGen/Console/App.php'); // relative path - * $entityCollection->findEntity('/Users/someuser/Desktop/projects/bumble-doc-gen/BumbleDocGen/Console/App.php'); // absolute path - * $entityCollection->findEntity('https://github.com/bumble-tech/bumble-doc-gen/blob/master/BumbleDocGen/Console/App.php'); // source link + * $entitiesCollection->findEntity('App'); // class name + * $entitiesCollection->findEntity('BumbleDocGen\Console\App'); // class with namespace + * $entitiesCollection->findEntity('\BumbleDocGen\Console\App'); // class with namespace + * $entitiesCollection->findEntity('\BumbleDocGen\Console\App::test()'); // class with namespace and optional part + * $entitiesCollection->findEntity('App.php'); // filename + * $entitiesCollection->findEntity('/BumbleDocGen/Console/App.php'); // relative path + * $entitiesCollection->findEntity('/Users/someuser/Desktop/projects/bumble-doc-gen/BumbleDocGen/Console/App.php'); // absolute path + * $entitiesCollection->findEntity('https://github.com/bumble-tech/bumble-doc-gen/blob/master/BumbleDocGen/Console/App.php'); // source link */ public function internalFindEntity(string $search, bool $useUnsafeKeys = true): ?ClassLikeEntity { diff --git a/src/LanguageHandler/Php/Parser/Entity/SubEntity/Constant/ConstantEntity.php b/src/LanguageHandler/Php/Parser/Entity/SubEntity/Constant/ConstantEntity.php index e1f5cced..cddb999b 100644 --- a/src/LanguageHandler/Php/Parser/Entity/SubEntity/Constant/ConstantEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/SubEntity/Constant/ConstantEntity.php @@ -9,7 +9,7 @@ use BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException; use BumbleDocGen\Core\Parser\Entity\Cache\CacheableMethod; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; use BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper; use BumbleDocGen\LanguageHandler\Php\Parser\PhpParser\NodeValueCompiler; @@ -75,7 +75,7 @@ public function getPhpHandlerSettings(): PhpHandlerSettings return $this->classEntity->getPhpHandlerSettings(); } - public function getRootEntityCollection(): ClassEntityCollection + public function getRootEntityCollection(): PhpEntitiesCollection { return $this->classEntity->getRootEntityCollection(); } diff --git a/src/LanguageHandler/Php/Parser/Entity/SubEntity/Method/MethodEntity.php b/src/LanguageHandler/Php/Parser/Entity/SubEntity/Method/MethodEntity.php index 27226d72..c55a8416 100644 --- a/src/LanguageHandler/Php/Parser/Entity/SubEntity/Method/MethodEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/SubEntity/Method/MethodEntity.php @@ -10,7 +10,7 @@ use BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException; use BumbleDocGen\Core\Parser\Entity\Cache\CacheableMethod; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; use BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper; use BumbleDocGen\LanguageHandler\Php\Parser\PhpParser\NodeValueCompiler; @@ -97,7 +97,7 @@ public function getPhpHandlerSettings(): PhpHandlerSettings return $this->classEntity->getPhpHandlerSettings(); } - public function getRootEntityCollection(): ClassEntityCollection + public function getRootEntityCollection(): PhpEntitiesCollection { return $this->getRootEntity()->getRootEntityCollection(); } diff --git a/src/LanguageHandler/Php/Parser/Entity/SubEntity/Property/PropertyEntity.php b/src/LanguageHandler/Php/Parser/Entity/SubEntity/Property/PropertyEntity.php index 19518a67..f83aef84 100644 --- a/src/LanguageHandler/Php/Parser/Entity/SubEntity/Property/PropertyEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/SubEntity/Property/PropertyEntity.php @@ -10,7 +10,7 @@ use BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException; use BumbleDocGen\Core\Parser\Entity\Cache\CacheableMethod; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; use BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper; use BumbleDocGen\LanguageHandler\Php\Parser\PhpParser\NodeValueCompiler; @@ -124,7 +124,7 @@ public function getAst(): Property return $this->ast; } - public function getRootEntityCollection(): ClassEntityCollection + public function getRootEntityCollection(): PhpEntitiesCollection { return $this->getRootEntity()->getRootEntityCollection(); } diff --git a/src/LanguageHandler/Php/PhpHandler.php b/src/LanguageHandler/Php/PhpHandler.php index 8f36ff87..21a072ce 100644 --- a/src/LanguageHandler/Php/PhpHandler.php +++ b/src/LanguageHandler/Php/PhpHandler.php @@ -10,13 +10,13 @@ use BumbleDocGen\Core\Renderer\Twig\Filter\CustomFiltersCollection; use BumbleDocGen\Core\Renderer\Twig\Function\CustomFunctionsCollection; use BumbleDocGen\LanguageHandler\LanguageHandlerInterface; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; use DI\DependencyException; use DI\NotFoundException; final class PhpHandler implements LanguageHandlerInterface { - public function __construct(private ClassEntityCollection $entityCollection, private PhpHandlerSettings $phpHandlerSettings) + public function __construct(private PhpEntitiesCollection $entitiesCollection, private PhpHandlerSettings $phpHandlerSettings) { } @@ -33,10 +33,10 @@ public static function getLanguageKey(): string */ public function getEntityCollection(): RootEntityCollection { - if ($this->entityCollection->isEmpty()) { - $this->entityCollection->loadClassEntities(); + if ($this->entitiesCollection->isEmpty()) { + $this->entitiesCollection->loadClassEntities(); } - return $this->entityCollection; + return $this->entitiesCollection; } /** diff --git a/src/LanguageHandler/Php/Plugin/Event/Parser/AfterLoadingClassEntityCollection.php b/src/LanguageHandler/Php/Plugin/Event/Parser/AfterLoadingClassEntityCollection.php index d9c76ef5..7df602ec 100644 --- a/src/LanguageHandler/Php/Plugin/Event/Parser/AfterLoadingClassEntityCollection.php +++ b/src/LanguageHandler/Php/Plugin/Event/Parser/AfterLoadingClassEntityCollection.php @@ -4,7 +4,7 @@ namespace BumbleDocGen\LanguageHandler\Php\Plugin\Event\Parser; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; use Symfony\Contracts\EventDispatcher\Event; /** @@ -12,12 +12,12 @@ */ final class AfterLoadingClassEntityCollection extends Event { - public function __construct(private ClassEntityCollection $entityCollection) + public function __construct(private PhpEntitiesCollection $entitiesCollection) { } - public function getClassEntityCollection(): ClassEntityCollection + public function getClassEntityCollection(): PhpEntitiesCollection { - return $this->entityCollection; + return $this->entitiesCollection; } } diff --git a/src/LanguageHandler/Php/Plugin/Event/Parser/OnAddClassEntityToCollection.php b/src/LanguageHandler/Php/Plugin/Event/Parser/OnAddClassEntityToCollection.php index d48780d2..d0160422 100644 --- a/src/LanguageHandler/Php/Plugin/Event/Parser/OnAddClassEntityToCollection.php +++ b/src/LanguageHandler/Php/Plugin/Event/Parser/OnAddClassEntityToCollection.php @@ -6,7 +6,7 @@ use BumbleDocGen\Core\Plugin\OnlySingleExecutionEvent; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; use Symfony\Contracts\EventDispatcher\Event; /** @@ -16,18 +16,18 @@ final class OnAddClassEntityToCollection extends Event implements OnlySingleExec { public function __construct( private ClassLikeEntity $classEntity, - private ClassEntityCollection $entityCollection + private PhpEntitiesCollection $entitiesCollection ) { } public function getUniqueExecutionId(): string { - return "{$this->classEntity->getName()}{$this->entityCollection->getEntityCollectionName()}"; + return "{$this->classEntity->getName()}{$this->entitiesCollection->getEntityCollectionName()}"; } - public function getClassEntityCollection(): ClassEntityCollection + public function getClassEntityCollection(): PhpEntitiesCollection { - return $this->entityCollection; + return $this->entitiesCollection; } public function getRootEntity(): ClassLikeEntity diff --git a/src/LanguageHandler/Php/Renderer/EntityDocRenderer/EntityDocRendererHelper.php b/src/LanguageHandler/Php/Renderer/EntityDocRenderer/EntityDocRendererHelper.php index d6bb7671..b7ac9827 100644 --- a/src/LanguageHandler/Php/Renderer/EntityDocRenderer/EntityDocRendererHelper.php +++ b/src/LanguageHandler/Php/Renderer/EntityDocRenderer/EntityDocRendererHelper.php @@ -8,7 +8,7 @@ use BumbleDocGen\Core\Parser\Entity\RootEntityCollection; use BumbleDocGen\Core\Parser\Entity\RootEntityCollectionsGroup; use BumbleDocGen\Core\Renderer\Twig\Function\GetDocumentedEntityUrl; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; final class EntityDocRendererHelper { @@ -31,7 +31,7 @@ public function getEntityDataByLink( ?string $defaultEntityName = null, bool $useUnsafeKeys = true ): array { - if (!is_a($rootEntityCollection, ClassEntityCollection::class)) { + if (!is_a($rootEntityCollection, PhpEntitiesCollection::class)) { return []; } @@ -112,13 +112,13 @@ public function getEntityUrlDataByLink( ?string $defaultEntityClassName = null, bool $createDocument = true ): array { - $entityCollection = $this->rootEntityCollectionsGroup->get(ClassEntityCollection::NAME); - $data = self::getEntityDataByLink($linkString, $entityCollection, $defaultEntityClassName); + $entitiesCollection = $this->rootEntityCollectionsGroup->get(PhpEntitiesCollection::NAME); + $data = self::getEntityDataByLink($linkString, $entitiesCollection, $defaultEntityClassName); if ($data['entityName'] ?? null) { $data['url'] = call_user_func_array( $this->getDocumentedEntityUrlFunction, [ - $entityCollection, + $entitiesCollection, $data['entityName'], $data['cursor'], $createDocument diff --git a/src/LanguageHandler/Php/Renderer/Twig/Function/DrawClassMap.php b/src/LanguageHandler/Php/Renderer/Twig/Function/DrawClassMap.php index a24c7aec..e7af807b 100644 --- a/src/LanguageHandler/Php/Renderer/Twig/Function/DrawClassMap.php +++ b/src/LanguageHandler/Php/Renderer/Twig/Function/DrawClassMap.php @@ -9,7 +9,7 @@ use BumbleDocGen\Core\Renderer\Twig\Function\CustomFunctionInterface; use BumbleDocGen\Core\Renderer\Twig\Function\GetDocumentedEntityUrl; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; use DI\DependencyException; use DI\NotFoundException; @@ -46,7 +46,7 @@ public static function getOptions(): array /** - * @param ClassEntityCollection ...$entityCollections + * @param PhpEntitiesCollection ...$entitiesCollections * The collection of entities for which the class map will be generated * @return string * @@ -55,10 +55,10 @@ public static function getOptions(): array * @throws InvalidConfigurationParameterException */ public function __invoke( - ClassEntityCollection ...$entityCollections, + PhpEntitiesCollection ...$entitiesCollections, ): string { $structure = $this->convertDirectoryStructureToFormattedString( - $this->getDirectoryStructure(...$entityCollections), + $this->getDirectoryStructure(...$entitiesCollections), ); return "
      {$structure}
      "; } @@ -68,11 +68,11 @@ public function __invoke( */ protected function appendClassToDirectoryStructure(array $directoryStructure, ClassLikeEntity $classEntity): array { - $entityCollection = $this->rootEntityCollectionsGroup->get(ClassEntityCollection::NAME); + $entitiesCollection = $this->rootEntityCollectionsGroup->get(PhpEntitiesCollection::NAME); $this->fileClassmap[$classEntity->getRelativeFileName()] = call_user_func_array( callback: $this->getDocumentedEntityUrlFunction, args: [ - $entityCollection, + $entitiesCollection, $classEntity->getName() ] ); @@ -94,11 +94,11 @@ protected function appendClassToDirectoryStructure(array $directoryStructure, Cl * @throws DependencyException * @throws InvalidConfigurationParameterException */ - public function getDirectoryStructure(ClassEntityCollection ...$entityCollections): array + public function getDirectoryStructure(PhpEntitiesCollection ...$entitiesCollections): array { $entities = []; - foreach ($entityCollections as $entityCollection) { - foreach ($entityCollection as $classEntity) { + foreach ($entitiesCollections as $entitiesCollection) { + foreach ($entitiesCollection as $classEntity) { if (!$classEntity->isEntityDataCanBeLoaded()) { continue; } @@ -134,7 +134,7 @@ public function convertDirectoryStructureToFormattedString( string $prefix = '│', string $path = '/' ): string { - $entityCollection = $this->rootEntityCollectionsGroup->get(ClassEntityCollection::NAME); + $entitiesCollection = $this->rootEntityCollectionsGroup->get(PhpEntitiesCollection::NAME); $formattedString = ''; $elementsCount = count($structure); $i = 0; @@ -152,7 +152,7 @@ public function convertDirectoryStructureToFormattedString( } else { $filepath = "{$path}{$line}"; $filepath = $this->fileClassmap[$filepath] ?? $filepath; - $classEntity = $entityCollection->findEntity("{$path}{$line}"); + $classEntity = $entitiesCollection->findEntity("{$path}{$line}"); if ($description = $classEntity?->getDescription() ?: '') { $description = str_replace(["\r\n", "\r", "\n", "\t", ' '], ' ', strip_tags($description)); $description = mb_strimwidth($description, 0, 100, "..."); diff --git a/src/LanguageHandler/Php/Renderer/Twig/Function/GetClassMethodsBodyCode.php b/src/LanguageHandler/Php/Renderer/Twig/Function/GetClassMethodsBodyCode.php index f7fe707b..0ee34411 100644 --- a/src/LanguageHandler/Php/Renderer/Twig/Function/GetClassMethodsBodyCode.php +++ b/src/LanguageHandler/Php/Renderer/Twig/Function/GetClassMethodsBodyCode.php @@ -8,7 +8,7 @@ use BumbleDocGen\Core\Parser\Entity\RootEntityCollectionsGroup; use BumbleDocGen\Core\Renderer\Twig\Filter\AddIndentFromLeft; use BumbleDocGen\Core\Renderer\Twig\Function\CustomFunctionInterface; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; use DI\DependencyException; use DI\NotFoundException; @@ -48,11 +48,11 @@ public static function getOptions(): array */ public function __invoke(string $className, array $methodsNames): ?string { - $entityCollection = $this->rootEntityCollectionsGroup->get(ClassEntityCollection::NAME); - if (!is_a($entityCollection, ClassEntityCollection::class)) { + $entitiesCollection = $this->rootEntityCollectionsGroup->get(PhpEntitiesCollection::NAME); + if (!is_a($entitiesCollection, PhpEntitiesCollection::class)) { return null; } - $classEntity = $entityCollection->getLoadedOrCreateNew($className); + $classEntity = $entitiesCollection->getLoadedOrCreateNew($className); if ($classEntity->isEntityDataCanBeLoaded()) { $methodsCode = []; $methodEntityCollection = $classEntity->getMethodEntityCollection(); diff --git a/tests/Unit/Core/Configuration/ValueTransformer/ValueToClassTransformerTest.php b/tests/Unit/Core/Configuration/ValueTransformer/ValueToClassTransformerTest.php index 06713476..86faf079 100644 --- a/tests/Unit/Core/Configuration/ValueTransformer/ValueToClassTransformerTest.php +++ b/tests/Unit/Core/Configuration/ValueTransformer/ValueToClassTransformerTest.php @@ -9,9 +9,6 @@ use BumbleDocGen\Core\Configuration\ConfigurationParameterBag; use BumbleDocGen\Core\Configuration\ValueTransformer\ValueToClassTransformer; use BumbleDocGen\DocGeneratorFactory; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection; -use BumbleDocGen\LanguageHandler\Php\PhpHandler; -use BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings; use DI\Container; use Exception; use PHPUnit\Framework\TestCase; From 9e30dc510436b16870bade6c353dcab1d7093277 Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Mon, 20 Nov 2023 20:31:30 +0300 Subject: [PATCH 073/210] Fixing link --- selfdoc/templates/tech/3.renderer/templatesVariables.md.twig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/selfdoc/templates/tech/3.renderer/templatesVariables.md.twig b/selfdoc/templates/tech/3.renderer/templatesVariables.md.twig index e285dc7d..943683f1 100644 --- a/selfdoc/templates/tech/3.renderer/templatesVariables.md.twig +++ b/selfdoc/templates/tech/3.renderer/templatesVariables.md.twig @@ -8,4 +8,4 @@ There are several variables available in each processed template. 1) Firstly, these are built-in twig variables, for example `_self`, which returns the path to the processed template. -2) Secondly, variables with collections of processed programming languages are available in the template (see [a]LanguageHandlerInterface[/a]). For example, when processing a PHP project collection, a collection [a]ClassEntityCollection[/a] will be available in the template under the name phpEntities +2) Secondly, variables with collections of processed programming languages are available in the template (see [a]LanguageHandlerInterface[/a]). For example, when processing a PHP project collection, a collection [a]PhpEntitiesCollection[/a] will be available in the template under the name phpEntities From 0bd9a8bc7a61fe7d4bf1248fd3f43d62ffff1e4e Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Mon, 20 Nov 2023 20:35:45 +0300 Subject: [PATCH 074/210] Adding descriptions --- src/LanguageHandler/Php/Parser/Entity/ClassEntity.php | 5 +++++ src/LanguageHandler/Php/Parser/Entity/EnumEntity.php | 5 +++++ src/LanguageHandler/Php/Parser/Entity/InterfaceEntity.php | 5 +++++ .../Php/Parser/Entity/PhpEntitiesCollection.php | 4 ++-- src/LanguageHandler/Php/Parser/Entity/TraitEntity.php | 5 +++++ 5 files changed, 22 insertions(+), 2 deletions(-) diff --git a/src/LanguageHandler/Php/Parser/Entity/ClassEntity.php b/src/LanguageHandler/Php/Parser/Entity/ClassEntity.php index bac4b5e2..a989e28a 100644 --- a/src/LanguageHandler/Php/Parser/Entity/ClassEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/ClassEntity.php @@ -7,6 +7,11 @@ use BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException; use BumbleDocGen\Core\Parser\Entity\Cache\CacheableMethod; +/** + * PHP Class + * + * @see https://www.php.net/manual/en/language.oop5.php + */ class ClassEntity extends ClassLikeEntity { public function isClass(): bool diff --git a/src/LanguageHandler/Php/Parser/Entity/EnumEntity.php b/src/LanguageHandler/Php/Parser/Entity/EnumEntity.php index 71dac173..3c73a5e3 100644 --- a/src/LanguageHandler/Php/Parser/Entity/EnumEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/EnumEntity.php @@ -11,6 +11,11 @@ use PhpParser\Node\Stmt; use PhpParser\Node\Stmt\EnumCase as EnumCaseNode; +/** + * Enumeration + * + * @see https://www.php.net/manual/en/language.enumerations.php + */ class EnumEntity extends ClassLikeEntity { public function isEnum(): bool diff --git a/src/LanguageHandler/Php/Parser/Entity/InterfaceEntity.php b/src/LanguageHandler/Php/Parser/Entity/InterfaceEntity.php index edd0baa5..4ab77841 100644 --- a/src/LanguageHandler/Php/Parser/Entity/InterfaceEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/InterfaceEntity.php @@ -4,6 +4,11 @@ namespace BumbleDocGen\LanguageHandler\Php\Parser\Entity; +/** + * Object interface + * + * @see https://www.php.net/manual/en/language.oop5.interfaces.php + */ class InterfaceEntity extends ClassLikeEntity { public function isInterface(): bool diff --git a/src/LanguageHandler/Php/Parser/Entity/PhpEntitiesCollection.php b/src/LanguageHandler/Php/Parser/Entity/PhpEntitiesCollection.php index d16a61bd..ce73d844 100644 --- a/src/LanguageHandler/Php/Parser/Entity/PhpEntitiesCollection.php +++ b/src/LanguageHandler/Php/Parser/Entity/PhpEntitiesCollection.php @@ -32,7 +32,7 @@ use Symfony\Component\Console\Style\OutputStyle; /** - * Collection of class entities + * Collection of php root entities */ final class PhpEntitiesCollection extends LoggableRootEntityCollection { @@ -439,7 +439,7 @@ public function internalFindEntity(string $search, bool $useUnsafeKeys = true): if (array_key_exists($foundKey, $duplicates)) { if ($useUnsafeKeys) { $this->logger->warning( - "ClassEntityCollection:findEntity: Key `{$foundKey}` refers to multiple entities. Use a unique search key to avoid mistakes" + "PhpEntityCollection:findEntity: Key `{$foundKey}` refers to multiple entities. Use a unique search key to avoid mistakes" ); } else { return null; diff --git a/src/LanguageHandler/Php/Parser/Entity/TraitEntity.php b/src/LanguageHandler/Php/Parser/Entity/TraitEntity.php index b05c61fe..d845e3c4 100644 --- a/src/LanguageHandler/Php/Parser/Entity/TraitEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/TraitEntity.php @@ -4,6 +4,11 @@ namespace BumbleDocGen\LanguageHandler\Php\Parser\Entity; +/** + * Trait + * + * @see https://www.php.net/manual/en/language.oop5.traits.php + */ class TraitEntity extends ClassLikeEntity { public function isTrait(): bool From 1246c6ac380c3f4b9c47e0ab90a46aca7be0122f Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Mon, 20 Nov 2023 22:37:56 +0300 Subject: [PATCH 075/210] Adding new features for working with class methods --- .../Php/Parser/Entity/ClassLikeEntity.php | 136 ++++++++++++------ 1 file changed, 91 insertions(+), 45 deletions(-) diff --git a/src/LanguageHandler/Php/Parser/Entity/ClassLikeEntity.php b/src/LanguageHandler/Php/Parser/Entity/ClassLikeEntity.php index 8c972345..31dd1ad4 100644 --- a/src/LanguageHandler/Php/Parser/Entity/ClassLikeEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/ClassLikeEntity.php @@ -589,40 +589,6 @@ public function getPropertyEntity(string $propertyName, bool $unsafe = true): ?P return $propertyEntityCollection->get($propertyName); } - /** - * @throws DependencyException - * @throws InvalidConfigurationParameterException - * @throws NotFoundException - */ - public function getMethodEntityCollection(): MethodEntityCollection - { - $objectId = $this->getObjectId(); - try { - return $this->localObjectCache->getMethodCachedResult(__METHOD__, $objectId); - } catch (ObjectNotFoundException) { - } - $methodEntityCollection = $this->diContainer->make(MethodEntityCollection::class, [ - 'classEntity' => $this - ]); - $methodEntityCollection->loadMethodEntities(); - $this->localObjectCache->cacheMethodResult(__METHOD__, $objectId, $methodEntityCollection); - return $methodEntityCollection; - } - - /** - * @throws NotFoundException - * @throws DependencyException - * @throws InvalidConfigurationParameterException - */ - public function getMethodEntity(string $methodName, bool $unsafe = true): ?MethodEntity - { - $methodEntityCollection = $this->getMethodEntityCollection(); - if ($unsafe) { - return $methodEntityCollection->unsafeGet($methodName); - } - return $methodEntityCollection->get($methodName); - } - /** * @throws NotFoundException * @throws DependencyException @@ -636,6 +602,7 @@ public function getDescription(): string /** * Returns the absolute path to a file if it can be retrieved and if the file is in the project directory + * * @throws InvalidConfigurationParameterException */ public function getAbsoluteFileName(): ?string @@ -660,6 +627,12 @@ public function getFileContent(): string } /** + * Get a list of all methods available in the current class according to filters and the classes where they are implemented + * + * @return array + * + * @internal + * * @throws InvalidConfigurationParameterException */ #[CacheableMethod] public function getMethodsData( @@ -725,6 +698,88 @@ public function getFileContent(): string return $methods; } + /** + * Get a collection of methods entities + * + * @see PhpHandlerSettings::getMethodEntityFilter() + * + * @throws DependencyException + * @throws InvalidConfigurationParameterException + * @throws NotFoundException + */ + public function getMethodEntityCollection(): MethodEntityCollection + { + $objectId = $this->getObjectId(); + try { + return $this->localObjectCache->getMethodCachedResult(__METHOD__, $objectId); + } catch (ObjectNotFoundException) { + } + $methodEntityCollection = $this->diContainer->make(MethodEntityCollection::class, [ + 'classEntity' => $this + ]); + $methodEntityCollection->loadMethodEntities(); + $this->localObjectCache->cacheMethodResult(__METHOD__, $objectId, $methodEntityCollection); + return $methodEntityCollection; + } + + /** + * Get all methods that are available according to the configuration as an array + * + * @return MethodEntity[] + * + * @see self::getMethodEntityCollection() + * @see PhpHandlerSettings::getMethodEntityFilter() + * + * @throws DependencyException + * @throws InvalidConfigurationParameterException + * @throws NotFoundException + */ + public function getMethods(): array + { + $methodEntityCollection = $this->getMethodEntityCollection(); + return iterator_to_array($methodEntityCollection); + } + + /** + * Check if a method exists in a class + * + * @param string $methodName The name of the method whose entity you want to check + * @param bool $unsafe Check all methods, not just the methods allowed in the configuration + * + * @return bool The method exists + * + * @throws DependencyException + * @throws InvalidConfigurationParameterException + * @throws NotFoundException + */ + public function hasMethod(string $methodName, bool $unsafe = false): bool + { + $methodEntityCollection = $this->getMethodEntityCollection(); + if ($unsafe) { + return array_key_exists($methodName, $this->getMethodsData()); + } + return $methodEntityCollection->has($methodName); + } + + /** + * Get the method entity by its name + * + * @param string $methodName The name of the method whose entity you want to get + * @param bool $unsafe Check all methods, not just the methods allowed in the configuration + * + * @throws DependencyException + * @throws InvalidConfigurationParameterException + * @throws NotFoundException + */ + public function getMethod(string $methodName, bool $unsafe = false): ?MethodEntity + { + $methodEntityCollection = $this->getMethodEntityCollection(); + if ($unsafe) { + return $methodEntityCollection->unsafeGet($methodName); + } + return $methodEntityCollection->get($methodName); + } + /** * @throws InvalidConfigurationParameterException */ @@ -846,14 +901,6 @@ public function getFileContent(): string return $constants; } - /** - * @throws InvalidConfigurationParameterException - */ - public function hasMethod(string $method): bool - { - return array_key_exists($method, $this->getMethodsData()); - } - /** * @throws InvalidConfigurationParameterException */ @@ -911,7 +958,6 @@ public function isSubclassOf(string $className): bool */ #[CacheableMethod] public function getConstantValue(string $name): string|array|int|bool|null|float { - return $this->getConstantEntity($name)->getValue(); } @@ -997,7 +1043,7 @@ public function cursorToDocAttributeLinkFragment(string $cursor, bool $isForDocu // is constant $prefix = 'q'; if (!array_key_exists($matches[7], $this->getConstantsData())) { - if (array_key_exists($matches[7], $this->getMethodsData())) { + if ($this->hasMethod($matches[7], true)) { // is method $prefix = 'm'; } elseif (array_key_exists($matches[7], $this->getPropertiesData())) { @@ -1018,7 +1064,7 @@ public function cursorToDocAttributeLinkFragment(string $cursor, bool $isForDocu return "#{$prefix}{$prepareSourceLink($attributeName)}"; } $line = match ($prefix) { - 'm' => $this->getMethodEntity($attributeName)?->getStartLine(), + 'm' => $this->getMethod($attributeName, true)?->getStartLine(), 'p' => $this->getPropertyEntity($attributeName)?->getStartLine(), 'q' => $this->getConstantEntity($attributeName)?->getStartLine(), default => 0, From 2b6264bce82aca27773ce551c568c91903648f2c Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Mon, 20 Nov 2023 22:38:04 +0300 Subject: [PATCH 076/210] Adding new features for working with class methods --- src/LanguageHandler/Php/Parser/PhpParser/NodeValueCompiler.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/LanguageHandler/Php/Parser/PhpParser/NodeValueCompiler.php b/src/LanguageHandler/Php/Parser/PhpParser/NodeValueCompiler.php index d457a3a5..2793e8c6 100644 --- a/src/LanguageHandler/Php/Parser/PhpParser/NodeValueCompiler.php +++ b/src/LanguageHandler/Php/Parser/PhpParser/NodeValueCompiler.php @@ -102,7 +102,7 @@ private static function getStaticCallValue( if (!$entity->isEntityDataCanBeLoaded()) { throw new \RuntimeException('Entity cannot be loaded'); } - $methodEntity = $entity->getMethodEntity($node->name->toString()); + $methodEntity = $entity->getMethod($node->name->toString(), true); if (!$methodEntity) { return null; } From 0ac85f4c2deee1e6b36cde75c15d669830343c76 Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Mon, 20 Nov 2023 23:05:39 +0300 Subject: [PATCH 077/210] Adding new features for working with class methods --- .../CustomFunction/FindEntitiesClassesByCollectionClassName.php | 2 +- selfdoc/templates/tech/2.parser/entity.md.twig | 2 +- selfdoc/templates/tech/3.renderer/01_templates.md.twig | 2 +- selfdoc/templates/tech/4.pluginSystem/readme.md.twig | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/selfdoc/Twig/CustomFunction/FindEntitiesClassesByCollectionClassName.php b/selfdoc/Twig/CustomFunction/FindEntitiesClassesByCollectionClassName.php index 3fdf743b..11edd934 100644 --- a/selfdoc/Twig/CustomFunction/FindEntitiesClassesByCollectionClassName.php +++ b/selfdoc/Twig/CustomFunction/FindEntitiesClassesByCollectionClassName.php @@ -32,7 +32,7 @@ public function __invoke(string $collectionName): array * @var ClassLikeEntity $findCollectionEntity */ $findCollectionEntity = $entitiesCollection->findEntity($collectionName); - $addMethodEntity = $findCollectionEntity->getMethodEntity('add'); + $addMethodEntity = $findCollectionEntity->getMethod('add', true); if (!$addMethodEntity) { return []; } diff --git a/selfdoc/templates/tech/2.parser/entity.md.twig b/selfdoc/templates/tech/2.parser/entity.md.twig index 9d898a75..9a46b49e 100644 --- a/selfdoc/templates/tech/2.parser/entity.md.twig +++ b/selfdoc/templates/tech/2.parser/entity.md.twig @@ -57,7 +57,7 @@ The root collections ([a]RootEntityCollection[/a]), which are directly accessibl {% set match = entitiesCollection.getRelativeFileName() | preg_match('/(\\/LanguageHandler\\/)([\\s\\S]*?)(?=\\/)/i') %} {{ drawDocumentedEntityLink(entitiesCollection) }} - {{ entitiesCollection.getMethodEntity('getEntityCollectionName').getFirstReturnValue() }} + {{ entitiesCollection.getMethod('getEntityCollectionName', true).getFirstReturnValue() }} {{ match[2] | upper }} {{ entitiesCollection.getDescription() }} diff --git a/selfdoc/templates/tech/3.renderer/01_templates.md.twig b/selfdoc/templates/tech/3.renderer/01_templates.md.twig index c06668d9..0c56bd5d 100644 --- a/selfdoc/templates/tech/3.renderer/01_templates.md.twig +++ b/selfdoc/templates/tech/3.renderer/01_templates.md.twig @@ -65,7 +65,7 @@ Dynamic block: {\{ phpEntities .get('\\\\BumbleDocGen\\\\LanguageHandler\\\\LanguageHandlerInterface') - .getMethodEntity('getLanguageKey') + .getMethod('getLanguageKey') .getDescription() }\} diff --git a/selfdoc/templates/tech/4.pluginSystem/readme.md.twig b/selfdoc/templates/tech/4.pluginSystem/readme.md.twig index eb3cd1b9..143a7074 100644 --- a/selfdoc/templates/tech/4.pluginSystem/readme.md.twig +++ b/selfdoc/templates/tech/4.pluginSystem/readme.md.twig @@ -43,7 +43,7 @@ Plugins for any programming languages work regardless of which language handler {% if match[2] %}{{ match[2] | upper }}{% else %}any{% endif %}
        - {% for key in pluginEntity.getMethodEntity('getSubscribedEvents').getFirstReturnValue() | keys %} + {% for key in pluginEntity.getMethod('getSubscribedEvents', true).getFirstReturnValue() | keys %}
      • [a]{{ key }}|short_form[/a]
      • {% endfor %}
      From efe619a3e3f0fda0f5d478b2d2e7e76d7026d521 Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Mon, 20 Nov 2023 23:05:54 +0300 Subject: [PATCH 078/210] Adding description --- .../SubEntity/Method/DynamicMethodEntity.php | 73 ++++++++++++++++++- .../Entity/SubEntity/Method/MethodEntity.php | 59 +++++++++++++-- .../Method/MethodEntityCollection.php | 38 +++++++++- .../Method/MethodEntityInterface.php | 70 +++++++++++++++++- 4 files changed, 228 insertions(+), 12 deletions(-) diff --git a/src/LanguageHandler/Php/Parser/Entity/SubEntity/Method/DynamicMethodEntity.php b/src/LanguageHandler/Php/Parser/Entity/SubEntity/Method/DynamicMethodEntity.php index 48c6357f..aafb6b0a 100644 --- a/src/LanguageHandler/Php/Parser/Entity/SubEntity/Method/DynamicMethodEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/SubEntity/Method/DynamicMethodEntity.php @@ -29,11 +29,17 @@ public function getRootEntity(): ClassLikeEntity return $this->classEntity; } + /** + * @inheritDoc + */ public function getName(): string { return $this->annotationMethod->getMethodName(); } + /** + * @inheritDoc + */ public function isStatic(): bool { return $this->annotationMethod->isStatic(); @@ -45,9 +51,9 @@ public function isStatic(): bool public function getCallMethod(): MethodEntity { if ($this->isStatic()) { - $callMethod = $this->classEntity->getMethodEntity('__callStatic'); + $callMethod = $this->classEntity->getMethod('__callStatic', true); } else { - $callMethod = $this->classEntity->getMethodEntity('__call'); + $callMethod = $this->classEntity->getMethod('__call', true); } return $callMethod; } @@ -62,6 +68,8 @@ public function getRelativeFileName(): ?string } /** + * @inheritDoc + * * @throws \Exception */ public function getStartLine(): int @@ -71,6 +79,8 @@ public function getStartLine(): int } /** + * @inheritDoc + * * @throws \Exception */ public function getStartColumn(): int @@ -80,6 +90,8 @@ public function getStartColumn(): int } /** + * @inheritDoc + * * @throws \Exception */ public function getEndLine(): int @@ -88,6 +100,9 @@ public function getEndLine(): int return $callMethod->getEndLine(); } + /** + * @inheritDoc + */ public function getModifiersString(): string { $modifiersString = []; @@ -100,6 +115,8 @@ public function getModifiersString(): string } /** + * @inheritDoc + * * @throws InvalidConfigurationParameterException */ public function getReturnType(): string @@ -120,6 +137,9 @@ public function getReturnType(): string return $returnType; } + /** + * @inheritDoc + */ public function getParameters(): array { $parameters = []; @@ -137,6 +157,9 @@ public function getParameters(): array return $parameters; } + /** + * @inheritDoc + */ public function getParametersString(): string { $parameters = []; @@ -148,6 +171,8 @@ public function getParametersString(): string } /** + * @inheritDoc + * * @throws \Exception */ public function getImplementingClassName(): string @@ -155,12 +180,27 @@ public function getImplementingClassName(): string return $this->getImplementingClass()->getName(); } + /** + * @inheritDoc + * + * @throws \Exception + */ + public function isImplementedInParentClass(): bool + { + return $this->getImplementingClassName() !== $this->classEntity->getName(); + } + + /** + * @inheritDoc + */ public function getDescription(): string { return (string)$this->annotationMethod->getDescription(); } /** + * @inheritDoc + * * @throws InvalidConfigurationParameterException * @throws \Exception */ @@ -176,6 +216,9 @@ public function isInitialization(): bool return $this->isStatic() && in_array($this->getReturnType(), $initializationReturnTypes); } + /** + * @inheritDoc + */ public function getImplementingClass(): ClassLikeEntity { return $this->classEntity; @@ -191,31 +234,49 @@ public function getNamespaceName(): string return $this->getRootEntity()->getNamespaceName(); } + /** + * @inheritDoc + */ public function isPublic(): bool { return true; } + /** + * @inheritDoc + */ public function isProtected(): bool { return false; } + /** + * @inheritDoc + */ public function isPrivate(): bool { return false; } + /** + * @inheritDoc + */ public function isDynamic(): bool { return true; } + /** + * @inheritDoc + */ public function getFirstReturnValue(): mixed { return null; } + /** + * @inheritDoc + */ public function getBodyCode(): string { return ''; @@ -226,12 +287,17 @@ public function getObjectId(): string return "{$this->getRootEntity()->getName()}:{$this->getName()}"; } + /** + * @inheritDoc + */ public function getRootEntityCollection(): RootEntityCollection { return $this->getRootEntity()->getRootEntityCollection(); } /** + * @inheritDoc + * * @throws InvalidConfigurationParameterException */ public function getAbsoluteFileName(): ?string @@ -240,6 +306,9 @@ public function getAbsoluteFileName(): ?string return $relativeFileName ? $this->configuration->getProjectRoot() . $relativeFileName : null; } + /** + * @internal + */ public function entityCacheIsOutdated(): bool { return false; diff --git a/src/LanguageHandler/Php/Parser/Entity/SubEntity/Method/MethodEntity.php b/src/LanguageHandler/Php/Parser/Entity/SubEntity/Method/MethodEntity.php index c55a8416..bae5ce24 100644 --- a/src/LanguageHandler/Php/Parser/Entity/SubEntity/Method/MethodEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/SubEntity/Method/MethodEntity.php @@ -73,6 +73,8 @@ public function __construct( } /** + * @inheritDoc + * * @throws InvalidConfigurationParameterException */ public function getAst(): ClassMethod @@ -117,6 +119,9 @@ public function getDocBlock(bool $recursive = true): DocBlock return $this->parserHelper->getDocBlock($classEntity, $this->getDocComment(), $this->getDocCommentLine()); } + /** + * @inheritDoc + */ public function getImplementingClass(): ClassLikeEntity { return $this->getRootEntityCollection()->getLoadedOrCreateNew($this->getImplementingClassName()); @@ -127,9 +132,6 @@ public function getShortName(): string return $this->getName(); } - /** - * @throws InvalidConfigurationParameterException - */ public function getNamespaceName(): string { return $this->getRootEntity()->getNamespaceName(); @@ -150,7 +152,7 @@ public function getDocCommentEntity(): MethodEntity $docComment = $this->getDocComment(); $reflectionMethod = $this; if ($reflectionMethod->isImplementedInParentClass()) { - $reflectionMethod = $reflectionMethod->getImplementingClass()->getMethodEntity($this->getName()); + $reflectionMethod = $reflectionMethod->getImplementingClass()->getMethod($this->getName(), true); } if (!$docComment || str_contains(mb_strtolower($docComment), '@inheritdoc')) { @@ -158,12 +160,12 @@ public function getDocCommentEntity(): MethodEntity $parentClass = $this->getImplementingClass()->getParentClass(); $methodName = $this->getName(); if ($parentClass && $parentClass->isEntityDataCanBeLoaded() && $parentClass->hasMethod($methodName)) { - $parentReflectionMethod = $parentClass->getMethodEntity($methodName); + $parentReflectionMethod = $parentClass->getMethod($methodName, true); $reflectionMethod = $parentReflectionMethod->getDocCommentEntity(); } else { foreach ($implementingClass->getInterfacesEntities() as $interface) { if ($interface->isEntityDataCanBeLoaded() && $interface->hasMethod($methodName)) { - $reflectionMethod = $interface->getMethodEntity($methodName); + $reflectionMethod = $interface->getMethod($methodName, true); break; } } @@ -190,11 +192,11 @@ public function getPrototype(): ?MethodEntity $parentClass = $this->getImplementingClass()->getParentClass(); $methodName = $this->getName(); if ($parentClass && $parentClass->hasMethod($methodName)) { - $prototype = $parentClass->getMethodEntity($methodName); + $prototype = $parentClass->getMethod($methodName, true); } else { foreach ($implementingClass->getInterfacesEntities() as $interface) { if ($interface->hasMethod($methodName)) { - $prototype = $interface->getMethodEntity($methodName); + $prototype = $interface->getMethod($methodName, true); break; } } @@ -252,6 +254,9 @@ public function getSignature(): string return "{$this->getModifiersString()} {$this->getName()}({$this->getParametersString()})" . (!$this->isConstructor() ? ": {$this->getReturnType()}" : ''); } + /** + * @inheritDoc + */ public function getName(): string { return $this->methodName; @@ -263,6 +268,8 @@ public function isConstructor(): bool } /** + * @inheritDoc + * * @throws InvalidConfigurationParameterException */ public function getRelativeFileName(): ?string @@ -271,6 +278,8 @@ public function getRelativeFileName(): ?string } /** + * @inheritDoc + * * @throws InvalidConfigurationParameterException */ public function getModifiersString(): string @@ -294,6 +303,8 @@ public function getModifiersString(): string } /** + * @inheritDoc + * * @throws NotFoundException * @throws DependencyException * @throws InvalidConfigurationParameterException @@ -352,6 +363,8 @@ private function isArrayAnnotationType(string $annotationType): bool } /** + * @inheritDoc + * * @throws NotFoundException * @throws DependencyException * @throws InvalidConfigurationParameterException @@ -427,6 +440,8 @@ private function isArrayAnnotationType(string $annotationType): bool } /** + * @inheritDoc + * * @throws NotFoundException * @throws InvalidConfigurationParameterException * @throws DependencyException @@ -442,17 +457,25 @@ public function getParametersString(): string return implode(', ', $parameters); } + /** + * @inheritDoc + */ public function isImplementedInParentClass(): bool { return $this->getImplementingClassName() !== $this->classEntity->getName(); } + /** + * @inheritDoc + */ public function getImplementingClassName(): string { return $this->implementingClassName; } /** + * @inheritDoc + * * @throws NotFoundException * @throws DependencyException * @throws InvalidConfigurationParameterException @@ -464,6 +487,8 @@ public function getDescription(): string } /** + * @inheritDoc + * * @throws DependencyException * @throws NotFoundException * @throws InvalidConfigurationParameterException @@ -493,6 +518,8 @@ public function isDynamic(): bool } /** + * @inheritDoc + * * @throws InvalidConfigurationParameterException */ #[CacheableMethod] public function isPublic(): bool @@ -501,6 +528,8 @@ public function isDynamic(): bool } /** + * @inheritDoc + * * @throws InvalidConfigurationParameterException */ #[CacheableMethod] public function isStatic(): bool @@ -509,6 +538,8 @@ public function isDynamic(): bool } /** + * @inheritDoc + * * @throws InvalidConfigurationParameterException */ #[CacheableMethod] public function isProtected(): bool @@ -517,6 +548,8 @@ public function isDynamic(): bool } /** + * @inheritDoc + * * @throws InvalidConfigurationParameterException */ #[CacheableMethod] public function isPrivate(): bool @@ -525,6 +558,8 @@ public function isDynamic(): bool } /** + * @inheritDoc + * * @throws InvalidConfigurationParameterException */ #[CacheableMethod] public function getStartLine(): int @@ -533,6 +568,8 @@ public function isDynamic(): bool } /** + * @inheritDoc + * * @throws InvalidConfigurationParameterException */ #[CacheableMethod] public function getStartColumn(): int @@ -541,6 +578,8 @@ public function isDynamic(): bool } /** + * @inheritDoc + * * @throws InvalidConfigurationParameterException */ #[CacheableMethod] public function getEndLine(): int @@ -549,6 +588,8 @@ public function isDynamic(): bool } /** + * @inheritDoc + * * @throws InvalidConfigurationParameterException * @throws ConstExprEvaluationException */ @@ -564,6 +605,8 @@ public function isDynamic(): bool } /** + * @inheritDoc + * * @throws InvalidConfigurationParameterException */ #[CacheableMethod] public function getBodyCode(): string diff --git a/src/LanguageHandler/Php/Parser/Entity/SubEntity/Method/MethodEntityCollection.php b/src/LanguageHandler/Php/Parser/Entity/SubEntity/Method/MethodEntityCollection.php index d60ca2f0..539343c6 100644 --- a/src/LanguageHandler/Php/Parser/Entity/SubEntity/Method/MethodEntityCollection.php +++ b/src/LanguageHandler/Php/Parser/Entity/SubEntity/Method/MethodEntityCollection.php @@ -15,10 +15,14 @@ use Psr\Log\LoggerInterface; /** + * Collection of PHP class method entities + * * @implements \IteratorAggregate */ final class MethodEntityCollection extends BaseEntityCollection { + private array $unsafeEntities = []; + public function __construct( private ClassLikeEntity $classEntity, private PhpHandlerSettings $phpHandlerSettings, @@ -28,6 +32,10 @@ public function __construct( } /** + * Load method entities into the collection according to the project configuration + * + * @see PhpHandlerSettings::getMethodEntityFilter() + * * @throws DependencyException * @throws NotFoundException * @throws InvalidConfigurationParameterException @@ -61,6 +69,12 @@ public function loadMethodEntities(): void } } + /** + * Add an entity to a collection + * + * @param MethodEntityInterface $methodEntity Entity to be added to the collection + * @param bool $reload Replace an entity with a new one if one has already been loaded previously + */ public function add(MethodEntityInterface $methodEntity, bool $reload = false): MethodEntityCollection { $methodName = $methodEntity->getName(); @@ -70,12 +84,21 @@ public function add(MethodEntityInterface $methodEntity, bool $reload = false): return $this; } + /** + * Get the loaded method entity if it exists + * + * @param string $objectName Method entity name + */ public function get(string $objectName): ?MethodEntity { return $this->entities[$objectName] ?? null; } /** + * Get the method entity if it exists. If the method exists but has not been loaded into the collection, a new entity object will be created + * + * @param string $objectName Method entity name + * * @throws NotFoundException * @throws DependencyException * @throws InvalidConfigurationParameterException @@ -84,18 +107,26 @@ public function unsafeGet(string $objectName): ?MethodEntity { $methodEntity = $this->get($objectName); if (!$methodEntity) { + if (array_key_exists($objectName, $this->unsafeEntities)) { + return $this->unsafeEntities[$objectName]; + } + $methodImplementingClass = $this->classEntity->getMethodsData()[$objectName] ?? null; if (!is_null($methodImplementingClass)) { - return $this->cacheablePhpEntityFactory->createMethodEntity( + $methodEntity = $this->cacheablePhpEntityFactory->createMethodEntity( $this->classEntity, $objectName, $methodImplementingClass ); + $this->unsafeEntities[$objectName] = $methodEntity; } } return $methodEntity; } + /** + * Get a copy of the collection containing only those methods that are initialization methods + */ public function getInitializations(): MethodEntityCollection { $methodEntityCollection = clone $this; @@ -109,9 +140,13 @@ public function getInitializations(): MethodEntityCollection $this->logger->warning($e->getMessage()); } } + $methodEntityCollection->unsafeEntities = []; return $methodEntityCollection; } + /** + * Get a copy of the collection containing only those methods that are not initialization methods + */ public function getAllExceptInitializations(): MethodEntityCollection { $methodEntityCollection = clone $this; @@ -125,6 +160,7 @@ public function getAllExceptInitializations(): MethodEntityCollection $this->logger->warning($e->getMessage()); } } + $methodEntityCollection->unsafeEntities = []; return $methodEntityCollection; } } diff --git a/src/LanguageHandler/Php/Parser/Entity/SubEntity/Method/MethodEntityInterface.php b/src/LanguageHandler/Php/Parser/Entity/SubEntity/Method/MethodEntityInterface.php index 0c595093..4099f231 100644 --- a/src/LanguageHandler/Php/Parser/Entity/SubEntity/Method/MethodEntityInterface.php +++ b/src/LanguageHandler/Php/Parser/Entity/SubEntity/Method/MethodEntityInterface.php @@ -9,39 +9,107 @@ interface MethodEntityInterface extends EntityInterface { + /** + * Get method name + */ public function getName(): string; + /** + * Get the line number of the beginning of the method code in a file + */ public function getStartLine(): int; + /** + * Get the column number of the beginning of the method code in a file + */ public function getStartColumn(): int; + /** + * Get the line number of the end of a method's code in a file + */ public function getEndLine(): int; + /** + * Get a text representation of method modifiers + */ public function getModifiersString(): string; + /** + * Get the return type of method + */ public function getReturnType(): string; + /** + * Get a list of method parameters + * + * @return string[] + */ public function getParameters(): array; + /** + * Get a list of method parameters as a string + */ public function getParametersString(): string; + /** + * Get the name of the class in which this method is implemented + */ public function getImplementingClassName(): string; + /** + * Get the ClassLike entity in which this method was implemented + */ + public function getImplementingClass(): ClassLikeEntity; + + /** + * Get a description of this method + */ public function getDescription(): string; + /** + * Check if a method is an initialization method + */ public function isInitialization(): bool; + /** + * Check if a method is a public method + */ public function isPublic(): bool; + /** + * Check if a method is a protected method + */ public function isProtected(): bool; + /** + * Check if a method is a private method + */ public function isPrivate(): bool; + /** + * Check if a method is a dynamic method, that is, implementable using __call or __callStatic + */ public function isDynamic(): bool; + /** + * Get the compiled first return value of a method (if possible) + * + * @return mixed compiled value + */ public function getFirstReturnValue(): mixed; + /** + * Get the code for this method + */ public function getBodyCode(): string; - public function getImplementingClass(): ClassLikeEntity; + /** + * Check if this method is static + */ + public function isStatic(): bool; + + /** + * Check if this method is implemented in the parent class + */ + public function isImplementedInParentClass(): bool; } From 5f0b3d630ce0b26572a6b4f61b6fceafe43a9eca Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Mon, 20 Nov 2023 23:08:53 +0300 Subject: [PATCH 079/210] Renaming method to check entity cache --- .../Entity/Cache/CacheableEntityInterface.php | 2 +- .../Entity/Cache/CacheableEntityTrait.php | 2 +- .../Cache/CacheableEntityWrapperTrait.php | 2 +- .../OperationsCollection.php | 6 ++--- src/Core/Parser/Entity/EntityInterface.php | 2 +- .../Parser/Entity/RootEntityCollection.php | 2 +- .../DocumentTransformableEntityInterface.php | 2 +- src/Core/Renderer/RendererIteratorFactory.php | 2 +- .../Php/Parser/Entity/BaseEntity.php | 24 +++++++++---------- .../Parser/Entity/PhpEntitiesCollection.php | 2 +- .../SubEntity/Method/DynamicMethodEntity.php | 2 +- 11 files changed, 24 insertions(+), 24 deletions(-) diff --git a/src/Core/Parser/Entity/Cache/CacheableEntityInterface.php b/src/Core/Parser/Entity/Cache/CacheableEntityInterface.php index db46a416..aedad61a 100644 --- a/src/Core/Parser/Entity/Cache/CacheableEntityInterface.php +++ b/src/Core/Parser/Entity/Cache/CacheableEntityInterface.php @@ -10,7 +10,7 @@ public function getObjectId(): string; public function getCacheKey(): string; - public function entityCacheIsOutdated(): bool; + public function isEntityCacheOutdated(): bool; public function isEntityFileCanBeLoad(): bool; diff --git a/src/Core/Parser/Entity/Cache/CacheableEntityTrait.php b/src/Core/Parser/Entity/Cache/CacheableEntityTrait.php index e39e7aa5..8991314b 100644 --- a/src/Core/Parser/Entity/Cache/CacheableEntityTrait.php +++ b/src/Core/Parser/Entity/Cache/CacheableEntityTrait.php @@ -29,7 +29,7 @@ public function getCacheKey(): string return $this->entityCacheKey; } - abstract public function entityCacheIsOutdated(): bool; + abstract public function isEntityCacheOutdated(): bool; /** * @throws InvalidArgumentException diff --git a/src/Core/Parser/Entity/Cache/CacheableEntityWrapperTrait.php b/src/Core/Parser/Entity/Cache/CacheableEntityWrapperTrait.php index 03bda662..40ddb172 100644 --- a/src/Core/Parser/Entity/Cache/CacheableEntityWrapperTrait.php +++ b/src/Core/Parser/Entity/Cache/CacheableEntityWrapperTrait.php @@ -39,7 +39,7 @@ final protected function getWrappedMethodResult( $funcArgs ); - if ($this->hasEntityCacheValue($cacheKey) && !$this->entityCacheIsOutdated()) { + if ($this->hasEntityCacheValue($cacheKey) && !$this->isEntityCacheOutdated()) { $methodReturnValue = $this->getEntityCacheValue($cacheKey); } else { $errorsBeforeGenerationCount = count($this->generationErrorsHandler->getRecords()); diff --git a/src/Core/Parser/Entity/CollectionLogOperation/OperationsCollection.php b/src/Core/Parser/Entity/CollectionLogOperation/OperationsCollection.php index f681f903..e222ef16 100644 --- a/src/Core/Parser/Entity/CollectionLogOperation/OperationsCollection.php +++ b/src/Core/Parser/Entity/CollectionLogOperation/OperationsCollection.php @@ -87,7 +87,7 @@ private function checkIsFoundEntitiesCacheOutdatedRecursive( foreach ($operationsCollection->operations as $operation) { if ($operation instanceof SingleEntitySearchOperation) { $entity = $operation->call($rootEntityCollection); - if (is_null($operation->getEntityName()) && (is_null($entity) || $entity->entityCacheIsOutdated())) { + if (is_null($operation->getEntityName()) && (is_null($entity) || $entity->isEntityCacheOutdated())) { continue; } if ($entity && !$entity::isEntityNameValid($entity?->getName())) { @@ -98,7 +98,7 @@ private function checkIsFoundEntitiesCacheOutdatedRecursive( $entityName = $entityName && $entity?->isEntityDataCanBeLoaded() ? $entityName : null; if ($operation->getEntityName() !== $entityName) { return true; - } elseif ($entity?->entityCacheIsOutdated() && $entity?->isEntityDataCanBeLoaded()) { + } elseif ($entity?->isEntityCacheOutdated() && $entity?->isEntityDataCanBeLoaded()) { return true; } } elseif ($operation instanceof IterateEntitiesOperation) { @@ -108,7 +108,7 @@ private function checkIsFoundEntitiesCacheOutdatedRecursive( return true; } foreach ($entities as $entity) { - if (!array_key_exists($entity->getName(), $entitiesData) || $entity->entityCacheIsOutdated()) { + if (!array_key_exists($entity->getName(), $entitiesData) || $entity->isEntityCacheOutdated()) { return true; } } diff --git a/src/Core/Parser/Entity/EntityInterface.php b/src/Core/Parser/Entity/EntityInterface.php index eb10fa6f..0e5d417f 100644 --- a/src/Core/Parser/Entity/EntityInterface.php +++ b/src/Core/Parser/Entity/EntityInterface.php @@ -24,5 +24,5 @@ public function getRelativeFileName(): ?string; */ public function getAbsoluteFileName(): ?string; - public function entityCacheIsOutdated(): bool; + public function isEntityCacheOutdated(): bool; } diff --git a/src/Core/Parser/Entity/RootEntityCollection.php b/src/Core/Parser/Entity/RootEntityCollection.php index 7056d0f3..eca64313 100644 --- a/src/Core/Parser/Entity/RootEntityCollection.php +++ b/src/Core/Parser/Entity/RootEntityCollection.php @@ -53,7 +53,7 @@ public function updateEntitiesCache(): void if (!is_a($entity, CacheableEntityInterface::class)) { continue; } - if ($entity->isEntityDataCanBeLoaded() && $entity->entityCacheIsOutdated()) { + if ($entity->isEntityDataCanBeLoaded() && $entity->isEntityCacheOutdated()) { $this->logger->info("Preparing {$entity->getName()} dependencies cache"); $entity->reloadEntityDependenciesCache(); } diff --git a/src/Core/Renderer/Context/DocumentTransformableEntityInterface.php b/src/Core/Renderer/Context/DocumentTransformableEntityInterface.php index 4699ef01..a964b24e 100644 --- a/src/Core/Renderer/Context/DocumentTransformableEntityInterface.php +++ b/src/Core/Renderer/Context/DocumentTransformableEntityInterface.php @@ -20,7 +20,7 @@ public function isDocumentCreationAllowed(): bool; public function getShortName(): string; - public function entityCacheIsOutdated(): bool; + public function isEntityCacheOutdated(): bool; public function getDocRender(): EntityDocRendererInterface; diff --git a/src/Core/Renderer/RendererIteratorFactory.php b/src/Core/Renderer/RendererIteratorFactory.php index 5fb902de..1a1224ac 100644 --- a/src/Core/Renderer/RendererIteratorFactory.php +++ b/src/Core/Renderer/RendererIteratorFactory.php @@ -165,7 +165,7 @@ public function getDocumentedEntityWrappersWithOutdatedCache(): \Generator !$this->isGeneratedEntityDocumentExists($entityWrapper) || $this->isInternalCachingVersionChanged() || $this->isConfigurationVersionChanged() || - $entityWrapper->getDocumentTransformableEntity()->entityCacheIsOutdated() || + $entityWrapper->getDocumentTransformableEntity()->isEntityCacheOutdated() || $this->isFilesDependenciesCacheOutdated($filesDependenciesKey) || $this->isEntityRelationsCacheOutdated($entityWrapper) || $this->isEntitiesOperationsLogCacheOutdated($entityWrapper->getEntityName()) diff --git a/src/LanguageHandler/Php/Parser/Entity/BaseEntity.php b/src/LanguageHandler/Php/Parser/Entity/BaseEntity.php index 13e6f6e7..1e187b51 100644 --- a/src/LanguageHandler/Php/Parser/Entity/BaseEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/BaseEntity.php @@ -559,9 +559,9 @@ private function isSubEntityFileCacheIsOutdated(string $dependenciesCacheKey): b $this->localObjectCache->cacheMethodResult(__METHOD__, '', $dependenciesChecks); } } - $entityCacheIsOutdated = $dependenciesChecks[$relativeFileName]; - $this->localObjectCache->cacheMethodResult(__METHOD__, $key, $entityCacheIsOutdated); - return $entityCacheIsOutdated; + $isEntityCacheOutdated = $dependenciesChecks[$relativeFileName]; + $this->localObjectCache->cacheMethodResult(__METHOD__, $key, $isEntityCacheOutdated); + return $isEntityCacheOutdated; } protected function isCurrentEntityCanBeLoad(): bool @@ -585,7 +585,7 @@ protected function isCurrentEntityCanBeLoad(): bool * @throws InvalidConfigurationParameterException * @throws InvalidArgumentException */ - final public function entityCacheIsOutdated(): bool + final public function isEntityCacheOutdated(): bool { $entity = $this->getCurrentRootEntity(); $entityName = $entity?->getName(); @@ -616,23 +616,23 @@ final public function entityCacheIsOutdated(): bool $cachedDependencies = $this->getCachedEntityDependencies(); if (!$cachedDependencies) { - $entityCacheIsOutdated = true; + $isEntityCacheOutdated = true; $this->logger->warning("Unable to load {$entityName} entity dependencies"); } else { - $entityCacheIsOutdated = false; + $isEntityCacheOutdated = false; $projectRoot = $this->configuration->getProjectRoot(); foreach ($cachedDependencies as $relativeFileName => $hashFile) { $filePath = "{$projectRoot}{$relativeFileName}"; if (array_key_exists($filePath, $dependenciesChecks)) { if ($dependenciesChecks[$filePath]) { - $entityCacheIsOutdated = true; + $isEntityCacheOutdated = true; break; } continue; } if (!file_exists($filePath) || md5_file($filePath) !== $hashFile) { - $entityCacheIsOutdated = true; + $isEntityCacheOutdated = true; $dependenciesChecks[$filePath] = true; break; } else { @@ -641,17 +641,17 @@ final public function entityCacheIsOutdated(): bool } } - if (!$entityCacheIsOutdated) { + if (!$isEntityCacheOutdated) { $localDependencies = $this->getEntityCacheValue($this->getEntityDependenciesCacheKey()) ?? []; if (!$localDependencies && $cachedDependencies) { $this->addEntityValueToCache($this->getEntityDependenciesCacheKey(), $cachedDependencies); } elseif (ksort($localDependencies) !== ksort($cachedDependencies)) { - $entityCacheIsOutdated = true; + $isEntityCacheOutdated = true; } } $this->localObjectCache->cacheMethodResult(__METHOD__, '', $dependenciesChecks); - $this->localObjectCache->cacheMethodResult(__METHOD__, $entityName, $entityCacheIsOutdated); - return $entityCacheIsOutdated; + $this->localObjectCache->cacheMethodResult(__METHOD__, $entityName, $isEntityCacheOutdated); + return $isEntityCacheOutdated; } } diff --git a/src/LanguageHandler/Php/Parser/Entity/PhpEntitiesCollection.php b/src/LanguageHandler/Php/Parser/Entity/PhpEntitiesCollection.php index ce73d844..bb764dba 100644 --- a/src/LanguageHandler/Php/Parser/Entity/PhpEntitiesCollection.php +++ b/src/LanguageHandler/Php/Parser/Entity/PhpEntitiesCollection.php @@ -120,7 +120,7 @@ public function loadClassEntities(): void $relativeFileName ); - if ($classEntity->entityCacheIsOutdated()) { + if ($classEntity->isEntityCacheOutdated()) { $classEntity->setCustomAst($subNode); } diff --git a/src/LanguageHandler/Php/Parser/Entity/SubEntity/Method/DynamicMethodEntity.php b/src/LanguageHandler/Php/Parser/Entity/SubEntity/Method/DynamicMethodEntity.php index aafb6b0a..f49ecb66 100644 --- a/src/LanguageHandler/Php/Parser/Entity/SubEntity/Method/DynamicMethodEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/SubEntity/Method/DynamicMethodEntity.php @@ -309,7 +309,7 @@ public function getAbsoluteFileName(): ?string /** * @internal */ - public function entityCacheIsOutdated(): bool + public function isEntityCacheOutdated(): bool { return false; } From 92dfb3da968c02f8d11e64018beb7c3b3c3d5f8f Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Mon, 20 Nov 2023 23:09:14 +0300 Subject: [PATCH 080/210] Fixing check cache bug --- .../Parser/Entity/SubEntity/Method/DynamicMethodEntity.php | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/LanguageHandler/Php/Parser/Entity/SubEntity/Method/DynamicMethodEntity.php b/src/LanguageHandler/Php/Parser/Entity/SubEntity/Method/DynamicMethodEntity.php index f49ecb66..22162ebc 100644 --- a/src/LanguageHandler/Php/Parser/Entity/SubEntity/Method/DynamicMethodEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/SubEntity/Method/DynamicMethodEntity.php @@ -10,6 +10,7 @@ use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; use BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper; use phpDocumentor\Reflection\DocBlock\Tags\Method; +use Psr\Cache\InvalidArgumentException; /** * Method obtained by parsing the "method" annotation @@ -308,9 +309,12 @@ public function getAbsoluteFileName(): ?string /** * @internal + * + * @throws InvalidArgumentException + * @throws InvalidConfigurationParameterException */ public function isEntityCacheOutdated(): bool { - return false; + return $this->getImplementingClass()->isEntityCacheOutdated(); } } From 0f17c1abb087ba8ce484b277182c60e38f77f1c4 Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Mon, 20 Nov 2023 23:17:47 +0300 Subject: [PATCH 081/210] Removing method duplicate --- .../Php/Parser/Entity/ClassLikeEntity.php | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/src/LanguageHandler/Php/Parser/Entity/ClassLikeEntity.php b/src/LanguageHandler/Php/Parser/Entity/ClassLikeEntity.php index 31dd1ad4..a7817c8f 100644 --- a/src/LanguageHandler/Php/Parser/Entity/ClassLikeEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/ClassLikeEntity.php @@ -600,17 +600,6 @@ public function getDescription(): string return $docBlock->getSummary(); } - /** - * Returns the absolute path to a file if it can be retrieved and if the file is in the project directory - * - * @throws InvalidConfigurationParameterException - */ - public function getAbsoluteFileName(): ?string - { - $relativeFileName = $this->getRelativeFileName(); - return $relativeFileName ? $this->configuration->getProjectRoot() . $relativeFileName : null; - } - /** * @throws InvalidConfigurationParameterException */ From 5ba98cefc27b54be858aa9c65c2420000c16f55c Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Tue, 21 Nov 2023 01:13:54 +0300 Subject: [PATCH 082/210] Marking API methods --- .../Php/Parser/Entity/BaseEntity.php | 55 ++++++++++++++++++- 1 file changed, 53 insertions(+), 2 deletions(-) diff --git a/src/LanguageHandler/Php/Parser/Entity/BaseEntity.php b/src/LanguageHandler/Php/Parser/Entity/BaseEntity.php index 1e187b51..658ab7f1 100644 --- a/src/LanguageHandler/Php/Parser/Entity/BaseEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/BaseEntity.php @@ -32,6 +32,7 @@ abstract class BaseEntity implements CacheableEntityInterface, EntityInterface #[Inject] private GetDocumentedEntityUrl $documentedEntityUrlFunction; #[Inject] private RendererHelper $rendererHelper; + #[Inject] private GenerationErrorsHandler $generationErrorsHandler; protected function __construct( private Configuration $configuration, @@ -42,27 +43,43 @@ protected function __construct( } /** + * @api + * * @throws InvalidConfigurationParameterException */ abstract public function getAst(): \PhpParser\Node\Stmt; + /** + * @api + */ abstract public function getImplementingClass(): ClassLikeEntity; abstract protected function getDocCommentRecursive(): string; abstract public function getDocCommentEntity(): ClassLikeEntity|MethodEntity|PropertyEntity|ConstantEntity; + /** + * @api + */ abstract public function getDescription(): string; - #[CacheableMethod] abstract public function getStartLine(): int; + /** + * @api + */ + abstract public function getStartLine(): int; abstract public function getDocBlock(): DocBlock; + /** + * @api + */ abstract public function getRootEntityCollection(): PhpEntitiesCollection; abstract public function getPhpHandlerSettings(): PhpHandlerSettings; /** + * @api + * * @throws InvalidConfigurationParameterException */ public function getRelativeFileName(): ?string @@ -80,6 +97,9 @@ final public function isEntityFileCanBeLoad(): bool /** * Returns the absolute path to a file if it can be retrieved and if the file is in the project directory + * + * @api + * * @throws InvalidConfigurationParameterException */ public function getAbsoluteFileName(): ?string @@ -135,6 +155,8 @@ public function getFileSourceLink(bool $withLine = true): ?string /** * Get entity unique ID + * + * @api */ public function getObjectId(): string { @@ -144,6 +166,9 @@ public function getObjectId(): string return $this->getName(); } + /** + * @api + */ public function isInternal(): bool { $docBlock = $this->getDocBlock(); @@ -151,6 +176,9 @@ public function isInternal(): bool return (bool)$internalBlock; } + /** + * @api + */ public function isDeprecated(): bool { $docBlock = $this->getDocBlock(); @@ -159,6 +187,8 @@ public function isDeprecated(): bool } /** + * @api + * * @throws \Exception */ public function hasDescriptionLinks(): bool @@ -303,6 +333,9 @@ public function hasDescriptionLinks(): bool /** * Get parsed links from description and doc blocks `see` and `link` + * + * @api + * * @throws InvalidConfigurationParameterException * @throws \Exception */ @@ -312,6 +345,9 @@ public function getDescriptionLinks(): array return $this->fillInLinkDataWithUrls($linksData); } + /** + * @api + */ public function hasThrows(): bool { $docBlock = $this->getDocBlock(); @@ -357,6 +393,8 @@ public function hasThrows(): bool /** * Get parsed throws from `throws` doc block * + * @api + * * @throws InvalidConfigurationParameterException */ public function getThrows(): array @@ -420,6 +458,9 @@ private function fillInLinkDataWithUrls(array $linkData): array return $linkData; } + /** + * @api + */ public function hasExamples(): bool { $docBlock = $this->getDocBlock(); @@ -429,6 +470,8 @@ public function hasExamples(): bool /** * Get parsed examples from `examples` doc block * + * @api + * * @return array */ public function getExamples(): array @@ -447,6 +490,8 @@ public function getExamples(): array /** * Get first example from @examples doc block + * + * @api */ public function getFirstExample(): string { @@ -454,6 +499,9 @@ public function getFirstExample(): string return $examples[0]['example'] ?? ''; } + /** + * @api + */ public function getDocNote(): string { $docBlock = $this->getDocBlock(); @@ -503,7 +551,6 @@ final public function getCachedEntityDependencies(): array } return $entityDependencies; } - #[Inject] private GenerationErrorsHandler $generationErrorsHandler; /** * @throws InvalidArgumentException @@ -528,6 +575,8 @@ final public function reloadEntityDependenciesCache(): array } /** + * @internal + * * @throws InvalidConfigurationParameterException * @throws InvalidArgumentException */ @@ -582,6 +631,8 @@ protected function isCurrentEntityCanBeLoad(): bool } /** + * @inheritDoc + * * @throws InvalidConfigurationParameterException * @throws InvalidArgumentException */ From 50011385f89342e55e845ecf352114716cb8c264 Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Tue, 21 Nov 2023 01:15:07 +0300 Subject: [PATCH 083/210] Removing duplicate method --- .../Php/Parser/Entity/SubEntity/Method/MethodEntity.php | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/LanguageHandler/Php/Parser/Entity/SubEntity/Method/MethodEntity.php b/src/LanguageHandler/Php/Parser/Entity/SubEntity/Method/MethodEntity.php index bae5ce24..7901e85e 100644 --- a/src/LanguageHandler/Php/Parser/Entity/SubEntity/Method/MethodEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/SubEntity/Method/MethodEntity.php @@ -617,10 +617,4 @@ public function isDynamic(): bool } return $this->astPrinter->prettyPrint($stmts); } - - #[CacheableMethod] public function getDocComment(): string - { - $docComment = $this->getAst()->getDocComment(); - return (string)$docComment?->getReformattedText(); - } } From 20e52f09d2210be2a39e3150e73d920a5f4ef40c Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Tue, 21 Nov 2023 01:41:12 +0300 Subject: [PATCH 084/210] Moving method to work with doc block to the base entity --- .../Php/Parser/Entity/BaseEntity.php | 44 ++++++++++++++++-- .../Php/Parser/Entity/ClassLikeEntity.php | 21 --------- .../SubEntity/Constant/ConstantEntity.php | 17 ------- .../Entity/SubEntity/Method/MethodEntity.php | 46 ------------------- .../SubEntity/Property/PropertyEntity.php | 28 ----------- 5 files changed, 39 insertions(+), 117 deletions(-) diff --git a/src/LanguageHandler/Php/Parser/Entity/BaseEntity.php b/src/LanguageHandler/Php/Parser/Entity/BaseEntity.php index 658ab7f1..7ac484c9 100644 --- a/src/LanguageHandler/Php/Parser/Entity/BaseEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/BaseEntity.php @@ -54,8 +54,6 @@ abstract public function getAst(): \PhpParser\Node\Stmt; */ abstract public function getImplementingClass(): ClassLikeEntity; - abstract protected function getDocCommentRecursive(): string; - abstract public function getDocCommentEntity(): ClassLikeEntity|MethodEntity|PropertyEntity|ConstantEntity; /** @@ -68,8 +66,6 @@ abstract public function getDescription(): string; */ abstract public function getStartLine(): int; - abstract public function getDocBlock(): DocBlock; - /** * @api */ @@ -168,6 +164,32 @@ public function getObjectId(): string /** * @api + * + * @throws InvalidConfigurationParameterException + */ + #[CacheableMethod] public function getDocCommentLine(): ?int + { + $entity = $this->getDocCommentEntity(); + return $entity->getAst()->getDocComment()?->getStartLine(); + } + + /** + * @throws InvalidConfigurationParameterException + */ + public function getDocBlock(): DocBlock + { + $docCommentEntity = $this->getDocCommentEntity(); + return $this->parserHelper->getDocBlock( + $docCommentEntity->getImplementingClass(), + $docCommentEntity->getDocComment() ?: ' ', + $this->getDocCommentLine() + ); + } + + /** + * @api + * + * @throws InvalidConfigurationParameterException */ public function isInternal(): bool { @@ -178,6 +200,8 @@ public function isInternal(): bool /** * @api + * + * @throws InvalidConfigurationParameterException */ public function isDeprecated(): bool { @@ -347,6 +371,8 @@ public function getDescriptionLinks(): array /** * @api + * + * @throws InvalidConfigurationParameterException */ public function hasThrows(): bool { @@ -460,6 +486,8 @@ private function fillInLinkDataWithUrls(array $linkData): array /** * @api + * + * @throws InvalidConfigurationParameterException */ public function hasExamples(): bool { @@ -470,9 +498,11 @@ public function hasExamples(): bool /** * Get parsed examples from `examples` doc block * + * @return array + * * @api * - * @return array + * @throws InvalidConfigurationParameterException */ public function getExamples(): array { @@ -492,6 +522,8 @@ public function getExamples(): array * Get first example from @examples doc block * * @api + * + * @throws InvalidConfigurationParameterException */ public function getFirstExample(): string { @@ -501,6 +533,8 @@ public function getFirstExample(): string /** * @api + * + * @throws InvalidConfigurationParameterException */ public function getDocNote(): string { diff --git a/src/LanguageHandler/Php/Parser/Entity/ClassLikeEntity.php b/src/LanguageHandler/Php/Parser/Entity/ClassLikeEntity.php index a7817c8f..b8e10c08 100644 --- a/src/LanguageHandler/Php/Parser/Entity/ClassLikeEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/ClassLikeEntity.php @@ -153,17 +153,6 @@ function (string $className): bool { return $fileDependencies; } - /** - * @throws NotFoundException - * @throws DependencyException - * @throws InvalidConfigurationParameterException - */ - public function getDocBlock(): DocBlock - { - $classEntity = $this->getDocCommentEntity(); - return $this->parserHelper->getDocBlock($classEntity, $this->getDocCommentRecursive()); - } - /** * Checking if class file is in git repository */ @@ -213,16 +202,6 @@ public function getDocCommentEntity(): ClassLikeEntity return $classEntity; } - /** - * @throws NotFoundException - * @throws DependencyException - * @throws InvalidConfigurationParameterException - */ - protected function getDocCommentRecursive(): string - { - return $this->getDocCommentEntity()->getDocComment() ?: ' '; - } - final public function loadPluginData(string $pluginKey, array $data): void { $this->pluginsData[$pluginKey] = $data; diff --git a/src/LanguageHandler/Php/Parser/Entity/SubEntity/Constant/ConstantEntity.php b/src/LanguageHandler/Php/Parser/Entity/SubEntity/Constant/ConstantEntity.php index cddb999b..3219051b 100644 --- a/src/LanguageHandler/Php/Parser/Entity/SubEntity/Constant/ConstantEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/SubEntity/Constant/ConstantEntity.php @@ -80,15 +80,6 @@ public function getRootEntityCollection(): PhpEntitiesCollection return $this->classEntity->getRootEntityCollection(); } - /** - * @throws InvalidConfigurationParameterException - */ - public function getDocBlock(): DocBlock - { - $classEntity = $this->getDocCommentEntity()->getImplementingClass(); - return $this->parserHelper->getDocBlock($classEntity, $this->getDocCommentRecursive()); - } - public function getRootEntity(): ClassLikeEntity { return $this->classEntity; @@ -132,14 +123,6 @@ public function getDocCommentEntity(): ConstantEntity return $this; } - /** - * @throws InvalidConfigurationParameterException - */ - protected function getDocCommentRecursive(): string - { - return $this->getDocCommentEntity()->getDocComment() ?: ' '; - } - public function getName(): string { return $this->constantName; diff --git a/src/LanguageHandler/Php/Parser/Entity/SubEntity/Method/MethodEntity.php b/src/LanguageHandler/Php/Parser/Entity/SubEntity/Method/MethodEntity.php index 7901e85e..5c86929d 100644 --- a/src/LanguageHandler/Php/Parser/Entity/SubEntity/Method/MethodEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/SubEntity/Method/MethodEntity.php @@ -104,21 +104,6 @@ public function getRootEntityCollection(): PhpEntitiesCollection return $this->getRootEntity()->getRootEntityCollection(); } - /** - * @throws DependencyException - * @throws NotFoundException - * @throws InvalidConfigurationParameterException - */ - public function getDocBlock(bool $recursive = true): DocBlock - { - if ($recursive) { - $classEntity = $this->getDocCommentEntity()->getImplementingClass(); - return $this->parserHelper->getDocBlock($classEntity, $this->getDocCommentRecursive(), $this->getDocCommentLineRecursive()); - } - $classEntity = $this->getImplementingClass(); - return $this->parserHelper->getDocBlock($classEntity, $this->getDocComment(), $this->getDocCommentLine()); - } - /** * @inheritDoc */ @@ -205,37 +190,6 @@ public function getPrototype(): ?MethodEntity return $prototype; } - /** - * @throws NotFoundException - * @throws DependencyException - * @throws InvalidConfigurationParameterException - */ - public function getDocCommentRecursive(): string - { - $objectId = $this->getObjectId(); - try { - return $this->localObjectCache->getMethodCachedResult(__METHOD__, $objectId); - } catch (ObjectNotFoundException) { - } - $docComment = $this->getDocCommentEntity()->getDocComment() ?: ' '; - $this->localObjectCache->cacheMethodResult(__METHOD__, $objectId, $docComment); - return $docComment; - } - - /** - * @throws DependencyException - * @throws NotFoundException - * @throws InvalidConfigurationParameterException - */ - #[CacheableMethod] public function getDocCommentLineRecursive(): ?int - { - $methodEntity = $this->getDocCommentEntity(); - if ($methodEntity->getDocCommentRecursive()) { - return $methodEntity->getAst()->getDocComment()?->getStartLine(); - } - return null; - } - /** * @throws InvalidConfigurationParameterException */ diff --git a/src/LanguageHandler/Php/Parser/Entity/SubEntity/Property/PropertyEntity.php b/src/LanguageHandler/Php/Parser/Entity/SubEntity/Property/PropertyEntity.php index f83aef84..be1caa88 100644 --- a/src/LanguageHandler/Php/Parser/Entity/SubEntity/Property/PropertyEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/SubEntity/Property/PropertyEntity.php @@ -129,17 +129,6 @@ public function getRootEntityCollection(): PhpEntitiesCollection return $this->getRootEntity()->getRootEntityCollection(); } - /** - * @throws DependencyException - * @throws NotFoundException - * @throws InvalidConfigurationParameterException - */ - public function getDocBlock(): DocBlock - { - $classEntity = $this->getDocCommentEntity()->getImplementingClass(); - return $this->parserHelper->getDocBlock($classEntity, $this->getDocCommentRecursive()); - } - /** * @throws DependencyException * @throws NotFoundException @@ -178,23 +167,6 @@ public function getDocCommentEntity(): PropertyEntity return $reflectionProperty; } - /** - * @throws NotFoundException - * @throws DependencyException - * @throws InvalidConfigurationParameterException - */ - protected function getDocCommentRecursive(): string - { - $objectId = $this->getObjectId(); - try { - return $this->localObjectCache->getMethodCachedResult(__METHOD__, $objectId); - } catch (ObjectNotFoundException) { - } - $docComment = $this->getDocCommentEntity()->getDocComment() ?: ' '; - $this->localObjectCache->cacheMethodResult(__METHOD__, $objectId, $docComment); - return $docComment; - } - public function getName(): string { return $this->propertyName; From 4db778dc64f9b2aaf3d967e7238aab20bc68d1eb Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Tue, 21 Nov 2023 01:45:28 +0300 Subject: [PATCH 085/210] Moving method to get description to the base entity --- .../Php/Parser/Entity/BaseEntity.php | 26 ++++++++++++------- .../Php/Parser/Entity/ClassLikeEntity.php | 11 -------- .../SubEntity/Constant/ConstantEntity.php | 9 ------- .../Entity/SubEntity/Method/MethodEntity.php | 13 ---------- .../SubEntity/Property/PropertyEntity.php | 11 -------- 5 files changed, 16 insertions(+), 54 deletions(-) diff --git a/src/LanguageHandler/Php/Parser/Entity/BaseEntity.php b/src/LanguageHandler/Php/Parser/Entity/BaseEntity.php index 7ac484c9..7b23b160 100644 --- a/src/LanguageHandler/Php/Parser/Entity/BaseEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/BaseEntity.php @@ -56,11 +56,6 @@ abstract public function getImplementingClass(): ClassLikeEntity; abstract public function getDocCommentEntity(): ClassLikeEntity|MethodEntity|PropertyEntity|ConstantEntity; - /** - * @api - */ - abstract public function getDescription(): string; - /** * @api */ @@ -83,6 +78,19 @@ public function getRelativeFileName(): ?string return $this->getCurrentRootEntity()->getRelativeFileName(); } + /** + * Returns the absolute path to a file if it can be retrieved and if the file is in the project directory + * + * @api + * + * @throws InvalidConfigurationParameterException + */ + public function getAbsoluteFileName(): ?string + { + $relativeFileName = $this->getRelativeFileName(); + return $relativeFileName ? $this->configuration->getProjectRoot() . $relativeFileName : null; + } + /** * @throws InvalidConfigurationParameterException */ @@ -92,16 +100,14 @@ final public function isEntityFileCanBeLoad(): bool } /** - * Returns the absolute path to a file if it can be retrieved and if the file is in the project directory - * * @api * * @throws InvalidConfigurationParameterException */ - public function getAbsoluteFileName(): ?string + public function getDescription(): string { - $relativeFileName = $this->getRelativeFileName(); - return $relativeFileName ? $this->configuration->getProjectRoot() . $relativeFileName : null; + $docBlock = $this->getDocBlock(); + return trim($docBlock->getSummary()); } protected function prepareTypeString(string $type): string diff --git a/src/LanguageHandler/Php/Parser/Entity/ClassLikeEntity.php b/src/LanguageHandler/Php/Parser/Entity/ClassLikeEntity.php index b8e10c08..fea36694 100644 --- a/src/LanguageHandler/Php/Parser/Entity/ClassLikeEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/ClassLikeEntity.php @@ -568,17 +568,6 @@ public function getPropertyEntity(string $propertyName, bool $unsafe = true): ?P return $propertyEntityCollection->get($propertyName); } - /** - * @throws NotFoundException - * @throws DependencyException - * @throws InvalidConfigurationParameterException - */ - public function getDescription(): string - { - $docBlock = $this->getDocBlock(); - return $docBlock->getSummary(); - } - /** * @throws InvalidConfigurationParameterException */ diff --git a/src/LanguageHandler/Php/Parser/Entity/SubEntity/Constant/ConstantEntity.php b/src/LanguageHandler/Php/Parser/Entity/SubEntity/Constant/ConstantEntity.php index 3219051b..15265292 100644 --- a/src/LanguageHandler/Php/Parser/Entity/SubEntity/Constant/ConstantEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/SubEntity/Constant/ConstantEntity.php @@ -149,15 +149,6 @@ public function getRelativeFileName(): ?string return $this->getImplementingClass()->getRelativeFileName(); } - /** - * @throws InvalidConfigurationParameterException - */ - public function getDescription(): string - { - $docBlock = $this->getDocBlock(); - return $docBlock->getSummary(); - } - /** * @throws InvalidConfigurationParameterException */ diff --git a/src/LanguageHandler/Php/Parser/Entity/SubEntity/Method/MethodEntity.php b/src/LanguageHandler/Php/Parser/Entity/SubEntity/Method/MethodEntity.php index 5c86929d..f580f4eb 100644 --- a/src/LanguageHandler/Php/Parser/Entity/SubEntity/Method/MethodEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/SubEntity/Method/MethodEntity.php @@ -427,19 +427,6 @@ public function getImplementingClassName(): string return $this->implementingClassName; } - /** - * @inheritDoc - * - * @throws NotFoundException - * @throws DependencyException - * @throws InvalidConfigurationParameterException - */ - public function getDescription(): string - { - $docBlock = $this->getDocBlock(); - return trim($docBlock->getSummary()); - } - /** * @inheritDoc * diff --git a/src/LanguageHandler/Php/Parser/Entity/SubEntity/Property/PropertyEntity.php b/src/LanguageHandler/Php/Parser/Entity/SubEntity/Property/PropertyEntity.php index be1caa88..4da49dc4 100644 --- a/src/LanguageHandler/Php/Parser/Entity/SubEntity/Property/PropertyEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/SubEntity/Property/PropertyEntity.php @@ -260,17 +260,6 @@ public function isImplementedInParentClass(): bool return $this->getImplementingClassName() !== $this->classEntity->getName(); } - /** - * @throws NotFoundException - * @throws DependencyException - * @throws InvalidConfigurationParameterException - */ - public function getDescription(): string - { - $docBlock = $this->getDocBlock(); - return trim($docBlock->getSummary()); - } - /** * @throws InvalidConfigurationParameterException */ From 0a9d173c7b2e94acc4922d4d76cc499502a2e6fa Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Tue, 21 Nov 2023 01:48:00 +0300 Subject: [PATCH 086/210] Removing old code --- src/LanguageHandler/Php/Parser/Entity/BaseEntity.php | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/LanguageHandler/Php/Parser/Entity/BaseEntity.php b/src/LanguageHandler/Php/Parser/Entity/BaseEntity.php index 7b23b160..b5406ed4 100644 --- a/src/LanguageHandler/Php/Parser/Entity/BaseEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/BaseEntity.php @@ -237,10 +237,8 @@ public function hasDescriptionLinks(): bool if (is_a($getDocCommentEntity, ClassLikeEntity::class)) { $docCommentImplementingClass = $getDocCommentEntity; - } elseif (method_exists($getDocCommentEntity, 'getImplementingClass')) { - $docCommentImplementingClass = $getDocCommentEntity->getImplementingClass(); } else { - $docCommentImplementingClass = $getDocCommentEntity; + $docCommentImplementingClass = $getDocCommentEntity->getImplementingClass(); } foreach ($docBlock->getTagsByName('see') as $seeBlock) { From 0daa0c941d585e64dcc4992f1aded84219961a99 Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Tue, 21 Nov 2023 02:01:08 +0300 Subject: [PATCH 087/210] Removing old code --- src/LanguageHandler/Php/Parser/Entity/BaseEntity.php | 10 +++++----- .../Entity/SubEntity/Constant/ConstantEntity.php | 1 - .../Parser/Entity/SubEntity/Method/MethodEntity.php | 1 - .../Entity/SubEntity/Property/PropertyEntity.php | 1 - 4 files changed, 5 insertions(+), 8 deletions(-) diff --git a/src/LanguageHandler/Php/Parser/Entity/BaseEntity.php b/src/LanguageHandler/Php/Parser/Entity/BaseEntity.php index b5406ed4..0be824f0 100644 --- a/src/LanguageHandler/Php/Parser/Entity/BaseEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/BaseEntity.php @@ -54,8 +54,6 @@ abstract public function getAst(): \PhpParser\Node\Stmt; */ abstract public function getImplementingClass(): ClassLikeEntity; - abstract public function getDocCommentEntity(): ClassLikeEntity|MethodEntity|PropertyEntity|ConstantEntity; - /** * @api */ @@ -68,6 +66,8 @@ abstract public function getRootEntityCollection(): PhpEntitiesCollection; abstract public function getPhpHandlerSettings(): PhpHandlerSettings; + abstract public function getDocCommentEntity(): ClassLikeEntity|MethodEntity|PropertyEntity|ConstantEntity; + /** * @api * @@ -212,8 +212,8 @@ public function isInternal(): bool public function isDeprecated(): bool { $docBlock = $this->getDocBlock(); - $internalBlock = $docBlock->getTagsByName('deprecated')[0] ?? null; - return (bool)$internalBlock; + $deprecatedBlock = $docBlock->getTagsByName('deprecated')[0] ?? null; + return (bool)$deprecatedBlock; } /** @@ -620,7 +620,7 @@ final public function reloadEntityDependenciesCache(): array */ private function isSubEntityFileCacheIsOutdated(string $dependenciesCacheKey): bool { - if (!method_exists($this, 'getImplementingClassName') || !method_exists($this, 'getImplementingClass')) { + if (!method_exists($this, 'getImplementingClassName')) { return true; } $key = $this->getImplementingClassName(); diff --git a/src/LanguageHandler/Php/Parser/Entity/SubEntity/Constant/ConstantEntity.php b/src/LanguageHandler/Php/Parser/Entity/SubEntity/Constant/ConstantEntity.php index 15265292..fdf67692 100644 --- a/src/LanguageHandler/Php/Parser/Entity/SubEntity/Constant/ConstantEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/SubEntity/Constant/ConstantEntity.php @@ -14,7 +14,6 @@ use BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper; use BumbleDocGen\LanguageHandler\Php\Parser\PhpParser\NodeValueCompiler; use BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings; -use phpDocumentor\Reflection\DocBlock; use PhpParser\ConstExprEvaluationException; use PhpParser\Node\Stmt\ClassConst; use Psr\Log\LoggerInterface; diff --git a/src/LanguageHandler/Php/Parser/Entity/SubEntity/Method/MethodEntity.php b/src/LanguageHandler/Php/Parser/Entity/SubEntity/Method/MethodEntity.php index f580f4eb..31eb0bf0 100644 --- a/src/LanguageHandler/Php/Parser/Entity/SubEntity/Method/MethodEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/SubEntity/Method/MethodEntity.php @@ -17,7 +17,6 @@ use BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings; use DI\DependencyException; use DI\NotFoundException; -use phpDocumentor\Reflection\DocBlock; use phpDocumentor\Reflection\DocBlock\Tags\InvalidTag; use phpDocumentor\Reflection\DocBlock\Tags\Param; use PhpParser\ConstExprEvaluationException; diff --git a/src/LanguageHandler/Php/Parser/Entity/SubEntity/Property/PropertyEntity.php b/src/LanguageHandler/Php/Parser/Entity/SubEntity/Property/PropertyEntity.php index 4da49dc4..29cc2f09 100644 --- a/src/LanguageHandler/Php/Parser/Entity/SubEntity/Property/PropertyEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/SubEntity/Property/PropertyEntity.php @@ -17,7 +17,6 @@ use BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings; use DI\DependencyException; use DI\NotFoundException; -use phpDocumentor\Reflection\DocBlock; use PhpParser\ConstExprEvaluationException; use PhpParser\Node; use PhpParser\Node\Stmt\Property; From 942efba661fbb7dfcdac5bd149e78c4c74ab0e9b Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Tue, 21 Nov 2023 02:08:27 +0300 Subject: [PATCH 088/210] Removing old method to get php handler settings --- src/LanguageHandler/Php/Parser/Entity/BaseEntity.php | 5 ++--- src/LanguageHandler/Php/Parser/Entity/ClassLikeEntity.php | 8 +------- .../Parser/Entity/SubEntity/Constant/ConstantEntity.php | 5 ----- .../Php/Parser/Entity/SubEntity/Method/MethodEntity.php | 5 ----- .../Parser/Entity/SubEntity/Property/PropertyEntity.php | 5 ----- 5 files changed, 3 insertions(+), 25 deletions(-) diff --git a/src/LanguageHandler/Php/Parser/Entity/BaseEntity.php b/src/LanguageHandler/Php/Parser/Entity/BaseEntity.php index 0be824f0..0c946a49 100644 --- a/src/LanguageHandler/Php/Parser/Entity/BaseEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/BaseEntity.php @@ -33,6 +33,7 @@ abstract class BaseEntity implements CacheableEntityInterface, EntityInterface #[Inject] private GetDocumentedEntityUrl $documentedEntityUrlFunction; #[Inject] private RendererHelper $rendererHelper; #[Inject] private GenerationErrorsHandler $generationErrorsHandler; + #[Inject] private PhpHandlerSettings $phpHandlerSettings; protected function __construct( private Configuration $configuration, @@ -64,8 +65,6 @@ abstract public function getStartLine(): int; */ abstract public function getRootEntityCollection(): PhpEntitiesCollection; - abstract public function getPhpHandlerSettings(): PhpHandlerSettings; - abstract public function getDocCommentEntity(): ClassLikeEntity|MethodEntity|PropertyEntity|ConstantEntity; /** @@ -152,7 +151,7 @@ public function getFileSourceLink(bool $withLine = true): ?string if (!$fileName) { return null; } - return $this->getPhpHandlerSettings()->getFileSourceBaseUrl() . $fileName . ($withLine ? "#L{$this->getStartLine()}" : ''); + return $this->phpHandlerSettings->getFileSourceBaseUrl() . $fileName . ($withLine ? "#L{$this->getStartLine()}" : ''); } /** diff --git a/src/LanguageHandler/Php/Parser/Entity/ClassLikeEntity.php b/src/LanguageHandler/Php/Parser/Entity/ClassLikeEntity.php index fea36694..24e01978 100644 --- a/src/LanguageHandler/Php/Parser/Entity/ClassLikeEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/ClassLikeEntity.php @@ -28,7 +28,6 @@ use DI\Container; use DI\DependencyException; use DI\NotFoundException; -use phpDocumentor\Reflection\DocBlock; use PhpParser\ConstExprEvaluationException; use PhpParser\Node; use PhpParser\Node\Stmt\Class_ as ClassNode; @@ -109,11 +108,6 @@ public function isExternalLibraryEntity(): bool return !is_null($this->composerHelper->getComposerPackageDataByClassName($this->getName())); } - public function getPhpHandlerSettings(): PhpHandlerSettings - { - return $this->phpHandlerSettings; - } - final public function getRootEntityCollection(): PhpEntitiesCollection { return $this->entitiesCollection; @@ -967,7 +961,7 @@ public function getDocRender(): EntityDocRendererInterface return $this->localObjectCache->getMethodCachedResult(__METHOD__, $objectId); } catch (ObjectNotFoundException) { } - $docRenderer = $this->getPhpHandlerSettings()->getEntityDocRenderersCollection()->getFirstMatchingRender($this); + $docRenderer = $this->phpHandlerSettings->getEntityDocRenderersCollection()->getFirstMatchingRender($this); if (!$docRenderer) { throw new \Exception( "Renderer for file `{$this->getName()}` not found" diff --git a/src/LanguageHandler/Php/Parser/Entity/SubEntity/Constant/ConstantEntity.php b/src/LanguageHandler/Php/Parser/Entity/SubEntity/Constant/ConstantEntity.php index fdf67692..32b5a9d9 100644 --- a/src/LanguageHandler/Php/Parser/Entity/SubEntity/Constant/ConstantEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/SubEntity/Constant/ConstantEntity.php @@ -69,11 +69,6 @@ public function __construct( ); } - public function getPhpHandlerSettings(): PhpHandlerSettings - { - return $this->classEntity->getPhpHandlerSettings(); - } - public function getRootEntityCollection(): PhpEntitiesCollection { return $this->classEntity->getRootEntityCollection(); diff --git a/src/LanguageHandler/Php/Parser/Entity/SubEntity/Method/MethodEntity.php b/src/LanguageHandler/Php/Parser/Entity/SubEntity/Method/MethodEntity.php index 31eb0bf0..060efece 100644 --- a/src/LanguageHandler/Php/Parser/Entity/SubEntity/Method/MethodEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/SubEntity/Method/MethodEntity.php @@ -93,11 +93,6 @@ public function getRootEntity(): ClassLikeEntity return $this->classEntity; } - public function getPhpHandlerSettings(): PhpHandlerSettings - { - return $this->classEntity->getPhpHandlerSettings(); - } - public function getRootEntityCollection(): PhpEntitiesCollection { return $this->getRootEntity()->getRootEntityCollection(); diff --git a/src/LanguageHandler/Php/Parser/Entity/SubEntity/Property/PropertyEntity.php b/src/LanguageHandler/Php/Parser/Entity/SubEntity/Property/PropertyEntity.php index 29cc2f09..d77d2294 100644 --- a/src/LanguageHandler/Php/Parser/Entity/SubEntity/Property/PropertyEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/SubEntity/Property/PropertyEntity.php @@ -81,11 +81,6 @@ public function getRootEntity(): ClassLikeEntity return $this->classEntity; } - public function getPhpHandlerSettings(): PhpHandlerSettings - { - return $this->classEntity->getPhpHandlerSettings(); - } - /** * @throws InvalidConfigurationParameterException */ From a3a1433c3b7bbb4109f3efd014a040d95df097ad Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Tue, 21 Nov 2023 16:13:32 +0300 Subject: [PATCH 089/210] Refactor class constants --- .../Php/Parser/Entity/BaseEntity.php | 17 +- .../Cache/CacheablePhpEntityFactory.php | 8 +- .../Php/Parser/Entity/ClassLikeEntity.php | 326 +++++++++++------- .../ClassConstantEntitiesCollection.php} | 26 +- .../ClassConstantEntity.php} | 69 +++- .../VisibilityCondition.php | 4 +- .../Parser/PhpParser/NodeValueCompiler.php | 12 +- .../PhpClassToMd/templates/_constants.md.twig | 4 +- 8 files changed, 297 insertions(+), 169 deletions(-) rename src/LanguageHandler/Php/Parser/Entity/SubEntity/{Constant/ConstantEntityCollection.php => ClassConstant/ClassConstantEntitiesCollection.php} (82%) rename src/LanguageHandler/Php/Parser/Entity/SubEntity/{Constant/ConstantEntity.php => ClassConstant/ClassConstantEntity.php} (81%) diff --git a/src/LanguageHandler/Php/Parser/Entity/BaseEntity.php b/src/LanguageHandler/Php/Parser/Entity/BaseEntity.php index 0c946a49..86090ec4 100644 --- a/src/LanguageHandler/Php/Parser/Entity/BaseEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/BaseEntity.php @@ -15,7 +15,7 @@ use BumbleDocGen\Core\Parser\Entity\EntityInterface; use BumbleDocGen\Core\Renderer\RendererHelper; use BumbleDocGen\Core\Renderer\Twig\Function\GetDocumentedEntityUrl; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Constant\ConstantEntity; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntity; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntity; use BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper; @@ -44,6 +44,8 @@ protected function __construct( } /** + * Get AST for this entity + * * @api * * @throws InvalidConfigurationParameterException @@ -51,21 +53,32 @@ protected function __construct( abstract public function getAst(): \PhpParser\Node\Stmt; /** + * Get the class like entity in which the current entity was implemented + * * @api */ abstract public function getImplementingClass(): ClassLikeEntity; /** + * Get the line number of the beginning of the entity code in a file + * * @api */ abstract public function getStartLine(): int; /** + * Get the collection of root entities to which this entity belongs + * * @api */ abstract public function getRootEntityCollection(): PhpEntitiesCollection; - abstract public function getDocCommentEntity(): ClassLikeEntity|MethodEntity|PropertyEntity|ConstantEntity; + /** + * Link to an entity where docBlock is implemented for this entity + * + * @internal + */ + abstract public function getDocCommentEntity(): ClassLikeEntity|MethodEntity|PropertyEntity|ClassConstantEntity; /** * @api diff --git a/src/LanguageHandler/Php/Parser/Entity/Cache/CacheablePhpEntityFactory.php b/src/LanguageHandler/Php/Parser/Entity/Cache/CacheablePhpEntityFactory.php index 669bb604..1bdf4980 100644 --- a/src/LanguageHandler/Php/Parser/Entity/Cache/CacheablePhpEntityFactory.php +++ b/src/LanguageHandler/Php/Parser/Entity/Cache/CacheablePhpEntityFactory.php @@ -14,7 +14,7 @@ use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\EnumEntity; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\InterfaceEntity; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Constant\ConstantEntity; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\DynamicMethodEntity; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntity; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntity; @@ -62,18 +62,18 @@ public function createPropertyEntity( * @throws DependencyException * @throws NotFoundException */ - public function createConstantEntity( + public function createClassConstantEntity( ClassLikeEntity $classEntity, string $constantName, string $implementingClassName, bool $reloadCache = false - ): ConstantEntity { + ): ClassConstantEntity { $objectId = "{$classEntity->getName()}:{$constantName}"; try { return $this->localObjectCache->getMethodCachedResult(__METHOD__, $objectId); } catch (ObjectNotFoundException) { } - $wrapperClassName = $this->getOrCreateEntityClassWrapper(ConstantEntity::class); + $wrapperClassName = $this->getOrCreateEntityClassWrapper(ClassConstantEntity::class); $constantEntity = $this->diContainer->make($wrapperClassName, [ 'classEntity' => $classEntity, 'constantName' => $constantName, diff --git a/src/LanguageHandler/Php/Parser/Entity/ClassLikeEntity.php b/src/LanguageHandler/Php/Parser/Entity/ClassLikeEntity.php index 24e01978..333e159d 100644 --- a/src/LanguageHandler/Php/Parser/Entity/ClassLikeEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/ClassLikeEntity.php @@ -14,8 +14,8 @@ use BumbleDocGen\Core\Renderer\EntityDocRenderer\EntityDocRendererInterface; use BumbleDocGen\Core\Renderer\Twig\Filter\PrepareSourceLink; use BumbleDocGen\LanguageHandler\Php\Parser\ComposerHelper; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Constant\ConstantEntity; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Constant\ConstantEntityCollection; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntitiesCollection; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntity; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntityCollection; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntity; @@ -495,37 +495,214 @@ public function hasTraits(): bool } /** + * Get a list of all constants available in the current class according to filters and the classes where they are implemented + * + * @internal + * + * @param bool $onlyFromCurrentClassAndTraits Get data only for constants from the current class + * @param int $flags Get data only for constants corresponding to the visibility modifiers passed in this value + * + * @return array + * + * @throws InvalidConfigurationParameterException + */ + #[CacheableMethod] public function getConstantsData( + bool $onlyFromCurrentClassAndTraits = false, + int $flags = ClassConstantEntity::VISIBILITY_MODIFIERS_FLAG_ANY + ): array { + if (!$this->isEntityDataCanBeLoaded()) { + return []; + } + $constants = []; + /** @var ConstNode[] $constNodes */ + $constNodes = array_filter( + $this->getAst()->stmts, + static fn(Node\Stmt $stmt): bool => $stmt instanceof ConstNode, + ); + array_walk($constNodes, fn(ConstNode $stmt) => $stmt->flags = $stmt->flags ?: ClassConstantEntity::MODIFIERS_FLAG_IS_PUBLIC); + foreach ($constNodes as $constNode) { + if (($constNode->flags & $flags) === 0) { + continue; + } + foreach ($constNode->consts as $constant) { + $constants[$constant->name->toString()] = $this->getName(); + } + } + + $flags &= ~ ClassConstantEntity::MODIFIERS_FLAG_IS_PRIVATE; + foreach ($this->getTraits() as $traitEntity) { + if (!$traitEntity->isEntityDataCanBeLoaded()) { + continue; + } + foreach ($traitEntity->getConstantsData(true, $flags) as $name => $constantsData) { + if (array_key_exists($name, $constants)) { + continue; + } + $constants[$name] = $constantsData; + } + } + + if (!$onlyFromCurrentClassAndTraits) { + foreach ($this->getParentClassEntities() as $parentClassEntity) { + if (!$parentClassEntity->isEntityDataCanBeLoaded()) { + continue; + } + foreach ($parentClassEntity->getConstantsData(true, $flags) as $name => $constantsData) { + if (array_key_exists($name, $constants)) { + continue; + } + $constants[$name] = $constantsData; + } + } + + foreach ($this->getInterfacesEntities() as $interfacesEntity) { + if (!$interfacesEntity->isEntityDataCanBeLoaded()) { + continue; + } + foreach ($interfacesEntity->getConstantsData(true, $flags) as $name => $constantsData) { + if (array_key_exists($name, $constants)) { + continue; + } + $constants[$name] = $constantsData; + } + } + } + return $constants; + } + + /** + * Get a collection of constants entities + * + * @api + * + * @see PhpHandlerSettings::getClassConstantEntityFilter() + * * @throws NotFoundException * @throws DependencyException * @throws InvalidConfigurationParameterException */ - public function getConstantEntityCollection(): ConstantEntityCollection + public function getConstantEntitiesCollection(): ClassConstantEntitiesCollection { $objectId = $this->getObjectId(); try { return $this->localObjectCache->getMethodCachedResult(__METHOD__, $objectId); } catch (ObjectNotFoundException) { } - $constantEntityCollection = $this->diContainer->make(ConstantEntityCollection::class, [ + $constantEntitiesCollection = $this->diContainer->make(ClassConstantEntitiesCollection::class, [ 'classEntity' => $this ]); - $constantEntityCollection->loadConstantEntities(); - $this->localObjectCache->cacheMethodResult(__METHOD__, $objectId, $constantEntityCollection); - return $constantEntityCollection; + $constantEntitiesCollection->loadConstantEntities(); + $this->localObjectCache->cacheMethodResult(__METHOD__, $objectId, $constantEntitiesCollection); + return $constantEntitiesCollection; + } + + /** + * Get all constants that are available according to the configuration as an array + * + * @return ClassConstantEntity[] + * + * @see self::getConstantEntitiesCollection() + * @see PhpHandlerSettings::getClassConstantEntityFilter() + * + * @api + * + * @throws DependencyException + * @throws InvalidConfigurationParameterException + * @throws NotFoundException + */ + public function getConstants(): array + { + $constantEntitiesCollection = $this->getConstantEntitiesCollection(); + return iterator_to_array($constantEntitiesCollection); + } + + /** + * Check if a constant exists in a class + * + * @param string $constantName The name of the class whose entity you want to check + * @param bool $unsafe Check all constants, not just the constants allowed in the configuration + * + * @return bool The constant exists + * + * @api + * + * @throws DependencyException + * @throws NotFoundException + * @throws InvalidConfigurationParameterException + */ + public function hasConstant(string $constantName, bool $unsafe = false): bool + { + $constantEntitiesCollection = $this->getConstantEntitiesCollection(); + if ($unsafe) { + return array_key_exists($constantName, $this->getConstantsData()); + } + return $constantEntitiesCollection->has($constantName); } /** + * Get the method entity by its name + * + * @param string $constantName The name of the constant whose entity you want to get + * @param bool $unsafe Check all constants, not just the constants allowed in the configuration + * + * @api + * * @throws NotFoundException * @throws DependencyException * @throws InvalidConfigurationParameterException */ - public function getConstantEntity(string $constantName, bool $unsafe = true): ?ConstantEntity + public function getConstant(string $constantName, bool $unsafe = false): ?ClassConstantEntity { - $constantEntityCollection = $this->getConstantEntityCollection(); + $constantEntitiesCollection = $this->getConstantEntitiesCollection(); if ($unsafe) { - return $constantEntityCollection->unsafeGet($constantName); + return $constantEntitiesCollection->unsafeGet($constantName); + } + return $constantEntitiesCollection->get($constantName); + } + + /** + * Get the compiled value of a constant + * + * @param string $constantName The name of the constant for which you need to get the value + * + * @return string|array|int|bool|float|null Compiled constant value + * + * @api + * + * @throws ConstExprEvaluationException + * @throws DependencyException + * @throws InvalidConfigurationParameterException + * @throws NotFoundException + */ + #[CacheableMethod] public function getConstantValue(string $constantName): string|array|int|bool|null|float + { + return $this->getConstant($constantName, true)->getValue(); + } + + /** + * Get class constant compiled values according to filters + * + * @param bool $onlyFromCurrentClassAndTraits Get values only for constants from the current class + * @param int $flags Get values only for constants corresponding to the visibility modifiers passed in this value + * + * @return array + * + * @api + * + * @throws NotFoundException + * @throws DependencyException + * @throws InvalidConfigurationParameterException + * @throws ConstExprEvaluationException + */ + #[CacheableMethod] public function getConstantsValues( + bool $onlyFromCurrentClassAndTraits = false, + int $flags = ClassConstantEntity::VISIBILITY_MODIFIERS_FLAG_ANY + ): array { + $constants = []; + foreach ($this->getConstantsData($onlyFromCurrentClassAndTraits, $flags) as $constantName => $implementingClassName) { + $constants[$constantName] = $this->getConstantValue($constantName); } - return $constantEntityCollection->get($constantName); + return $constants; } /** @@ -580,10 +757,13 @@ public function getFileContent(): string /** * Get a list of all methods available in the current class according to filters and the classes where they are implemented * - * @return array - * * @internal * + * @param bool $onlyFromCurrentClassAndTraits Get data only for methods from the current class + * @param int $flags Get data only for methods corresponding to the visibility modifiers passed in this value + * + * @return array + * * @throws InvalidConfigurationParameterException */ #[CacheableMethod] public function getMethodsData( @@ -785,73 +965,6 @@ public function getMethod(string $methodName, bool $unsafe = false): ?MethodEnti return $properties; } - /** - * @throws InvalidConfigurationParameterException - */ - #[CacheableMethod] public function getConstantsData( - bool $onlyFromCurrentClassAndTraits = false, - int $flags = ConstantEntity::VISIBILITY_MODIFIERS_FLAG_ANY - ): array { - if (!$this->isEntityDataCanBeLoaded()) { - return []; - } - $constants = []; - /** @var ConstNode[] $constNodes */ - $constNodes = array_filter( - $this->getAst()->stmts, - static fn(Node\Stmt $stmt): bool => $stmt instanceof ConstNode, - ); - array_walk($constNodes, fn(ConstNode $stmt) => $stmt->flags = $stmt->flags ?: ConstantEntity::MODIFIERS_FLAG_IS_PUBLIC); - foreach ($constNodes as $constNode) { - if (($constNode->flags & $flags) === 0) { - continue; - } - foreach ($constNode->consts as $constant) { - $constants[$constant->name->toString()] = $this->getName(); - } - } - - $flags &= ~ ConstantEntity::MODIFIERS_FLAG_IS_PRIVATE; - foreach ($this->getTraits() as $traitEntity) { - if (!$traitEntity->isEntityDataCanBeLoaded()) { - continue; - } - foreach ($traitEntity->getConstantsData(true, $flags) as $name => $constantsData) { - if (array_key_exists($name, $constants)) { - continue; - } - $constants[$name] = $constantsData; - } - } - - if (!$onlyFromCurrentClassAndTraits) { - foreach ($this->getParentClassEntities() as $parentClassEntity) { - if (!$parentClassEntity->isEntityDataCanBeLoaded()) { - continue; - } - foreach ($parentClassEntity->getConstantsData(true, $flags) as $name => $constantsData) { - if (array_key_exists($name, $constants)) { - continue; - } - $constants[$name] = $constantsData; - } - } - - foreach ($this->getInterfacesEntities() as $interfacesEntity) { - if (!$interfacesEntity->isEntityDataCanBeLoaded()) { - continue; - } - foreach ($interfacesEntity->getConstantsData(true, $flags) as $name => $constantsData) { - if (array_key_exists($name, $constants)) { - continue; - } - $constants[$name] = $constantsData; - } - } - } - return $constants; - } - /** * @throws InvalidConfigurationParameterException */ @@ -860,14 +973,6 @@ public function hasProperty(string $property): bool return array_key_exists($property, $this->getPropertiesData()); } - /** - * @throws InvalidConfigurationParameterException - */ - public function hasConstant(string $constantName): bool - { - return array_key_exists($constantName, $this->getConstantsData(true)); - } - /** * @throws InvalidConfigurationParameterException */ @@ -884,34 +989,6 @@ public function isSubclassOf(string $className): bool return in_array($className, $allClasses); } - /** - * @throws ConstExprEvaluationException - * @throws InvalidConfigurationParameterException - */ - #[CacheableMethod] public function getConstant(string $name): string|array|int|bool|null|float - { - // todo return constant entity - foreach ($this->getAst()->getConstants() as $node) { - foreach ($node->consts as $constantNode) { - if ($name === $constantNode->name->toString()) { - return NodeValueCompiler::compile($constantNode->value, $this); - } - } - } - return null; - } - - /** - * @throws NotFoundException - * @throws DependencyException - * @throws InvalidConfigurationParameterException - * @throws ConstExprEvaluationException - */ - #[CacheableMethod] public function getConstantValue(string $name): string|array|int|bool|null|float - { - return $this->getConstantEntity($name)->getValue(); - } - /** * @throws InvalidConfigurationParameterException */ @@ -935,21 +1012,6 @@ public function hasParentClass(string $parentClassName): bool return in_array($parentClassName, $parentClassNames); } - /** - * @throws NotFoundException - * @throws DependencyException - * @throws InvalidConfigurationParameterException - * @throws ConstExprEvaluationException - */ - #[CacheableMethod] public function getConstants(): array - { - $constants = []; - foreach ($this->getConstantsData(true) as $name => $data) { - $constants[$name] = $this->getConstantValue($name); - } - return $constants; - } - /** * @throws InvalidConfigurationParameterException * @throws \Exception @@ -1017,7 +1079,7 @@ public function cursorToDocAttributeLinkFragment(string $cursor, bool $isForDocu $line = match ($prefix) { 'm' => $this->getMethod($attributeName, true)?->getStartLine(), 'p' => $this->getPropertyEntity($attributeName)?->getStartLine(), - 'q' => $this->getConstantEntity($attributeName)?->getStartLine(), + 'q' => $this->getConstant($attributeName, true)?->getStartLine(), default => 0, }; return $line ? "#L{$line}" : ''; diff --git a/src/LanguageHandler/Php/Parser/Entity/SubEntity/Constant/ConstantEntityCollection.php b/src/LanguageHandler/Php/Parser/Entity/SubEntity/ClassConstant/ClassConstantEntitiesCollection.php similarity index 82% rename from src/LanguageHandler/Php/Parser/Entity/SubEntity/Constant/ConstantEntityCollection.php rename to src/LanguageHandler/Php/Parser/Entity/SubEntity/ClassConstant/ClassConstantEntitiesCollection.php index b51a104d..307eb85d 100644 --- a/src/LanguageHandler/Php/Parser/Entity/SubEntity/Constant/ConstantEntityCollection.php +++ b/src/LanguageHandler/Php/Parser/Entity/SubEntity/ClassConstant/ClassConstantEntitiesCollection.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Constant; +namespace BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant; use BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException; use BumbleDocGen\Core\Parser\Entity\BaseEntityCollection; @@ -12,7 +12,7 @@ use DI\DependencyException; use DI\NotFoundException; -final class ConstantEntityCollection extends BaseEntityCollection +final class ClassConstantEntitiesCollection extends BaseEntityCollection { public function __construct( private ClassLikeEntity $classEntity, @@ -22,6 +22,9 @@ public function __construct( } /** + * + * @internal + * * @throws NotFoundException * @throws DependencyException * @throws InvalidConfigurationParameterException @@ -30,7 +33,7 @@ public function loadConstantEntities(): void { $classConstantEntityFilter = $this->phpHandlerSettings->getClassConstantEntityFilter(); foreach ($this->classEntity->getConstantsData() as $name => $constantImplementingClass) { - $constantEntity = $this->cacheablePhpEntityFactory->createConstantEntity( + $constantEntity = $this->cacheablePhpEntityFactory->createClassConstantEntity( $this->classEntity, $name, $constantImplementingClass @@ -41,7 +44,10 @@ public function loadConstantEntities(): void } } - public function add(ConstantEntity $constantEntity, bool $reload = false): ConstantEntityCollection + /** + * @api + */ + public function add(ClassConstantEntity $constantEntity, bool $reload = false): ClassConstantEntitiesCollection { $constantName = $constantEntity->getName(); if (!isset($this->entities[$constantName]) || $reload) { @@ -50,23 +56,29 @@ public function add(ConstantEntity $constantEntity, bool $reload = false): Const return $this; } - public function get(string $objectName): ?ConstantEntity + /** + * @api + */ + public function get(string $objectName): ?ClassConstantEntity { return $this->entities[$objectName] ?? null; } /** + * + * @api + * * @throws NotFoundException * @throws DependencyException * @throws InvalidConfigurationParameterException */ - public function unsafeGet(string $constantName): ?ConstantEntity + public function unsafeGet(string $constantName): ?ClassConstantEntity { $constantEntity = $this->get($constantName); if (!$constantEntity) { $constantsImplementingClass = $this->classEntity->getConstantsData()[$constantName] ?? null; if (!is_null($constantsImplementingClass)) { - return $this->cacheablePhpEntityFactory->createConstantEntity( + return $this->cacheablePhpEntityFactory->createClassConstantEntity( $this->classEntity, $constantName, $constantsImplementingClass diff --git a/src/LanguageHandler/Php/Parser/Entity/SubEntity/Constant/ConstantEntity.php b/src/LanguageHandler/Php/Parser/Entity/SubEntity/ClassConstant/ClassConstantEntity.php similarity index 81% rename from src/LanguageHandler/Php/Parser/Entity/SubEntity/Constant/ConstantEntity.php rename to src/LanguageHandler/Php/Parser/Entity/SubEntity/ClassConstant/ClassConstantEntity.php index 32b5a9d9..59e2a776 100644 --- a/src/LanguageHandler/Php/Parser/Entity/SubEntity/Constant/ConstantEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/SubEntity/ClassConstant/ClassConstantEntity.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Constant; +namespace BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant; use BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache; use BumbleDocGen\Core\Configuration\Configuration; @@ -13,7 +13,6 @@ use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; use BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper; use BumbleDocGen\LanguageHandler\Php\Parser\PhpParser\NodeValueCompiler; -use BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings; use PhpParser\ConstExprEvaluationException; use PhpParser\Node\Stmt\ClassConst; use Psr\Log\LoggerInterface; @@ -21,7 +20,7 @@ /** * Class constant entity */ -class ConstantEntity extends BaseEntity +class ClassConstantEntity extends BaseEntity { /** * Indicates that the constant is public. @@ -55,7 +54,7 @@ class ConstantEntity extends BaseEntity public function __construct( Configuration $configuration, private ClassLikeEntity $classEntity, - private ParserHelper $parserHelper, + ParserHelper $parserHelper, LocalObjectCache $localObjectCache, LoggerInterface $logger, private string $constantName, @@ -69,17 +68,25 @@ public function __construct( ); } + /** + * @inheritDoc + */ public function getRootEntityCollection(): PhpEntitiesCollection { return $this->classEntity->getRootEntityCollection(); } + /** + * Get the class like entity where this constant was obtained + */ public function getRootEntity(): ClassLikeEntity { return $this->classEntity; } /** + * @inheritDoc + * * @throws InvalidConfigurationParameterException */ public function getAst(): ClassConst @@ -107,28 +114,44 @@ public function getImplementingClassName(): string return $this->implementingClassName; } + /** + * @inheritDoc + */ public function getImplementingClass(): ClassLikeEntity { return $this->getRootEntityCollection()->getLoadedOrCreateNew($this->getImplementingClassName()); } - public function getDocCommentEntity(): ConstantEntity + /** + * @inheritDoc + */ + public function getDocCommentEntity(): ClassConstantEntity { return $this; } + /** + * Constant name + */ public function getName(): string { return $this->constantName; } + /** + * Constant short name + * + * @see self::getName() + */ public function getShortName(): string { return $this->getName(); } /** - * @throws InvalidConfigurationParameterException + * Get the name of the namespace where the current class is implemented + * + * @api */ public function getNamespaceName(): string { @@ -136,14 +159,10 @@ public function getNamespaceName(): string } /** - * @throws InvalidConfigurationParameterException - */ - public function getRelativeFileName(): ?string - { - return $this->getImplementingClass()->getRelativeFileName(); - } - - /** + * Check if a constant is a public constant + * + * @api + * * @throws InvalidConfigurationParameterException */ #[CacheableMethod] public function isPublic(): bool @@ -152,6 +171,10 @@ public function getRelativeFileName(): ?string } /** + * Check if a constant is a protected constant + * + * @api + * * @throws InvalidConfigurationParameterException */ #[CacheableMethod] public function isProtected(): bool @@ -160,6 +183,10 @@ public function getRelativeFileName(): ?string } /** + * Check if a constant is a private constant + * + * @api + * * @throws InvalidConfigurationParameterException */ #[CacheableMethod] public function isPrivate(): bool @@ -168,6 +195,10 @@ public function getRelativeFileName(): ?string } /** + * Get the line number of the beginning of the constant code in a file + * + * @api + * * @throws InvalidConfigurationParameterException */ #[CacheableMethod] public function getStartLine(): int @@ -176,6 +207,10 @@ public function getRelativeFileName(): ?string } /** + * Get the line number of the end of a constant's code in a file + * + * @api + * * @throws InvalidConfigurationParameterException */ #[CacheableMethod] public function getEndLine(): int @@ -184,6 +219,12 @@ public function getRelativeFileName(): ?string } /** + * Get the compiled value of a constant + * + * @api + * + * @return string|array|int|bool|null|float Compiled constant value + * * @throws ConstExprEvaluationException * @throws InvalidConfigurationParameterException */ diff --git a/src/LanguageHandler/Php/Parser/FilterCondition/ClassConstantFilterCondition/VisibilityCondition.php b/src/LanguageHandler/Php/Parser/FilterCondition/ClassConstantFilterCondition/VisibilityCondition.php index 3fc10ff3..a6a30bce 100644 --- a/src/LanguageHandler/Php/Parser/FilterCondition/ClassConstantFilterCondition/VisibilityCondition.php +++ b/src/LanguageHandler/Php/Parser/FilterCondition/ClassConstantFilterCondition/VisibilityCondition.php @@ -6,7 +6,7 @@ use BumbleDocGen\Core\Parser\Entity\EntityInterface; use BumbleDocGen\Core\Parser\FilterCondition\ConditionInterface; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Constant\ConstantEntity; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity; use BumbleDocGen\LanguageHandler\Php\Parser\FilterCondition\ClassFilterCondition\VisibilityConditionModifier; /** @@ -23,7 +23,7 @@ public function __construct(string ...$visibilityModifiers) public function canAddToCollection(EntityInterface $entity): bool { - if (!$entity instanceof ConstantEntity) { + if (!$entity instanceof ClassConstantEntity) { return false; } foreach ($this->visibilityModifiers as $visibilityModifier) { diff --git a/src/LanguageHandler/Php/Parser/PhpParser/NodeValueCompiler.php b/src/LanguageHandler/Php/Parser/PhpParser/NodeValueCompiler.php index 2793e8c6..67c16e19 100644 --- a/src/LanguageHandler/Php/Parser/PhpParser/NodeValueCompiler.php +++ b/src/LanguageHandler/Php/Parser/PhpParser/NodeValueCompiler.php @@ -6,7 +6,7 @@ use BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Constant\ConstantEntity; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntity; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntity; use DI\DependencyException; @@ -29,7 +29,7 @@ private function __construct() */ public static function compile( Node\Stmt\Expression|Node $node, - MethodEntity|PropertyEntity|ConstantEntity|ClassLikeEntity $entity + MethodEntity|PropertyEntity|ClassConstantEntity|ClassLikeEntity $entity ): mixed { if (is_a($node, \PhpParser\Node\Expr\Array_::class)) { $compiledValue = []; @@ -93,7 +93,7 @@ private static function getFuncCallValue(Node\Expr\FuncCall $node): mixed */ private static function getStaticCallValue( Node\Expr\StaticCall $node, - MethodEntity|PropertyEntity|ConstantEntity|ClassLikeEntity $entity + MethodEntity|PropertyEntity|ClassConstantEntity|ClassLikeEntity $entity ): mixed { $className = self::resolveClassName($node->class->toString(), $entity); if ($entity->getName() !== $className) { @@ -117,7 +117,7 @@ private static function getStaticCallValue( */ private static function getStaticPropertyValue( Node\Expr\StaticPropertyFetch $node, - MethodEntity|PropertyEntity|ConstantEntity|ClassLikeEntity $entity + MethodEntity|PropertyEntity|ClassConstantEntity|ClassLikeEntity $entity ): mixed { $className = self::resolveClassName($node->class->toString(), $entity); if ($entity->getName() !== $className) { @@ -137,7 +137,7 @@ private static function getStaticPropertyValue( */ private static function getClassConstantValue( Node\Expr\ClassConstFetch $node, - MethodEntity|PropertyEntity|ConstantEntity|ClassLikeEntity $entity + MethodEntity|PropertyEntity|ClassConstantEntity|ClassLikeEntity $entity ): mixed { $className = self::resolveClassName($node->class->toString(), $entity); @@ -170,7 +170,7 @@ private static function getClassConstantValue( */ private static function resolveClassName( string $className, - MethodEntity|PropertyEntity|ConstantEntity|ClassLikeEntity $entity + MethodEntity|PropertyEntity|ClassConstantEntity|ClassLikeEntity $entity ): string { if ($className !== 'self' && $className !== 'static' && $className !== 'parent') { return $className; diff --git a/src/LanguageHandler/Php/Renderer/EntityDocRenderer/PhpClassToMd/templates/_constants.md.twig b/src/LanguageHandler/Php/Renderer/EntityDocRenderer/PhpClassToMd/templates/_constants.md.twig index 947906f3..4229f14c 100644 --- a/src/LanguageHandler/Php/Renderer/EntityDocRenderer/PhpClassToMd/templates/_constants.md.twig +++ b/src/LanguageHandler/Php/Renderer/EntityDocRenderer/PhpClassToMd/templates/_constants.md.twig @@ -1,7 +1,7 @@ -{% if not classEntity.getConstantEntityCollection().isEmpty() %} +{% if not classEntity.getConstantEntitiesCollection().isEmpty() %}

      Constants:

        - {% for constantEntity in classEntity.getConstantEntityCollection() %} + {% for constantEntity in classEntity.getConstantEntitiesCollection() %}
      • # {{ constantEntity.getName() }} {% if constantEntity.isInternal() %}:warning: Is internal {% endif %} {% if constantEntity.isDeprecated() %}:no_entry: Deprecated {% endif %} {% if constantEntity.getRelativeFileName() %} From a51c03d50b062fe97cdcdf5a007050387a1d3e14 Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Tue, 21 Nov 2023 16:24:59 +0300 Subject: [PATCH 090/210] Refactor method entities --- .../TwigFilterClassParserPlugin.php | 2 +- .../TwigFunctionClassParserPlugin.php | 2 +- .../templates/tech/2.parser/entity.md.twig | 2 +- src/AI/Generators/DocBlocksGenerator.php | 4 +-- src/AI/Generators/ReadmeTemplateGenerator.php | 2 +- src/DocGenerator.php | 11 +----- .../Php/Parser/Entity/ClassLikeEntity.php | 36 +++++++++++-------- ...ction.php => MethodEntitiesCollection.php} | 24 ++++++------- .../templates/_method_details.md.twig | 4 +-- .../PhpClassToMd/templates/_methods.md.twig | 4 +-- .../PhpClassToMd/templates/class.md.twig | 6 ++-- .../Twig/Function/GetClassMethodsBodyCode.php | 4 +-- .../IsPrivateConditionTest.php | 6 ++-- .../IsProtectedConditionTest.php | 6 ++-- .../IsPublicConditionTest.php | 6 ++-- .../VisibilityConditionTest.php | 6 ++-- 16 files changed, 62 insertions(+), 63 deletions(-) rename src/LanguageHandler/Php/Parser/Entity/SubEntity/Method/{MethodEntityCollection.php => MethodEntitiesCollection.php} (88%) diff --git a/selfdoc/Plugin/TwigFilterClassParser/TwigFilterClassParserPlugin.php b/selfdoc/Plugin/TwigFilterClassParser/TwigFilterClassParserPlugin.php index 5a37133a..4441d0b2 100644 --- a/selfdoc/Plugin/TwigFilterClassParser/TwigFilterClassParserPlugin.php +++ b/selfdoc/Plugin/TwigFilterClassParser/TwigFilterClassParserPlugin.php @@ -137,7 +137,7 @@ private function getFilterData(PhpEntitiesCollection $entitiesCollection, string $functionData['name'] = $filters[$className]; $entity = $entitiesCollection->getEntityByClassName($className); - $method = $entity->getMethodEntityCollection()->get('__invoke'); + $method = $entity->getMethodEntitiesCollection()->get('__invoke'); $functionData['parameters'] = $method->getParameters(); $filtersData[$className] = $functionData; } diff --git a/selfdoc/Plugin/TwigFunctionClassParser/TwigFunctionClassParserPlugin.php b/selfdoc/Plugin/TwigFunctionClassParser/TwigFunctionClassParserPlugin.php index bd84f850..da8b6b49 100644 --- a/selfdoc/Plugin/TwigFunctionClassParser/TwigFunctionClassParserPlugin.php +++ b/selfdoc/Plugin/TwigFunctionClassParser/TwigFunctionClassParserPlugin.php @@ -135,7 +135,7 @@ private function getFunctionData(PhpEntitiesCollection $entitiesCollection, stri } $functionData['name'] = $functions[$className]; - $method = $entity->getMethodEntityCollection()->get('__invoke'); + $method = $entity->getMethodEntitiesCollection()->get('__invoke'); $functionData['parameters'] = $method->getParameters(); $functionsData[$className] = $functionData; } diff --git a/selfdoc/templates/tech/2.parser/entity.md.twig b/selfdoc/templates/tech/2.parser/entity.md.twig index 9a46b49e..3087854f 100644 --- a/selfdoc/templates/tech/2.parser/entity.md.twig +++ b/selfdoc/templates/tech/2.parser/entity.md.twig @@ -32,7 +32,7 @@ Entities are always handled through collections. Collections are the result of t * Output of all methods of all found entities in `className::methodName()` format: {{ "{% for someClassEntity in phpEntities %} - {% for methodEntity in someClassEntity.getMethodEntityCollection() %} + {% for methodEntity in someClassEntity.getMethodEntitiesCollection() %} * {{ someClassEntity.getName() }}::{{ methodEntity.getName() }}() {% endfor %} {% endfor %}" | textToCodeBlock('twig') }} diff --git a/src/AI/Generators/DocBlocksGenerator.php b/src/AI/Generators/DocBlocksGenerator.php index f3965204..861fba32 100644 --- a/src/AI/Generators/DocBlocksGenerator.php +++ b/src/AI/Generators/DocBlocksGenerator.php @@ -34,7 +34,7 @@ public function hasMethodsWithoutDocBlocks(RootEntityInterface $rootEntity): boo if (!is_a($rootEntity, ClassLikeEntity::class)) { throw new \InvalidArgumentException('Currently we can only work PHP class entities'); } - foreach ($rootEntity->getMethodEntityCollection() as $method) { + foreach ($rootEntity->getMethodEntitiesCollection() as $method) { /** @var MethodEntity $method */ if ($method->getDocComment() || $method->isConstructor()) { continue; @@ -62,7 +62,7 @@ public function generateDocBlocksForMethodsWithoutIt( $newThrowsDockBlocks = []; $toRequest = []; - foreach ($rootEntity->getMethodEntityCollection() as $method) { + foreach ($rootEntity->getMethodEntitiesCollection() as $method) { /** @var MethodEntity $method */ if ($method->isConstructor() || $method->isImplementedInParentClass()) { continue; diff --git a/src/AI/Generators/ReadmeTemplateGenerator.php b/src/AI/Generators/ReadmeTemplateGenerator.php index 4cc42a4a..0873626a 100644 --- a/src/AI/Generators/ReadmeTemplateGenerator.php +++ b/src/AI/Generators/ReadmeTemplateGenerator.php @@ -56,7 +56,7 @@ public function generateReadmeFileContent( $entryPointsSignatures = []; foreach ($entryPoints as $entryPoint) { $methodsSignatures = []; - foreach ($entryPoint->getMethodEntityCollection() as $method) { + foreach ($entryPoint->getMethodEntitiesCollection() as $method) { $methodsSignatures[] = $method->getSignature(); } diff --git a/src/DocGenerator.php b/src/DocGenerator.php index fde4781d..854e3ece 100644 --- a/src/DocGenerator.php +++ b/src/DocGenerator.php @@ -18,7 +18,6 @@ use BumbleDocGen\Core\Renderer\Twig\Filter\AddIndentFromLeft; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\InterfaceEntity; use BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper; use DI\DependencyException; use DI\NotFoundException; @@ -138,7 +137,7 @@ public function addDocBlocks( $toReplace = []; $classFileLines = explode("\n", $classFileContent); foreach ($newBocBlocks as $method => $docBlock) { - $methodEntity = $entity->getMethodEntity($method); + $methodEntity = $entity->getMethod($method, true); $lineNumber = $docCommentLine = $methodEntity->getDocComment() ? $methodEntity->getDocBlock( false )->getLocation()?->getLineNumber() : null; @@ -258,14 +257,6 @@ public function generate(): void try { $this->parser->parse(); -//RootEntityInterface - $in = $this->rootEntityCollectionsGroup->get(PhpEntitiesCollection::NAME)->get(RootEntityInterface::class); - /* var_dump($in->getParentClassNames()); - - $r = new \ReflectionClass(RootEntityInterface::class); - var_dump($r->getParentClass()); - die();*/ - $this->renderer->run(); } catch (Exception $e) { $this->logger->critical( diff --git a/src/LanguageHandler/Php/Parser/Entity/ClassLikeEntity.php b/src/LanguageHandler/Php/Parser/Entity/ClassLikeEntity.php index 333e159d..1618f91e 100644 --- a/src/LanguageHandler/Php/Parser/Entity/ClassLikeEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/ClassLikeEntity.php @@ -17,7 +17,7 @@ use BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntitiesCollection; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntity; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntityCollection; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntitiesCollection; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntity; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntityCollection; use BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper; @@ -832,33 +832,37 @@ public function getFileContent(): string /** * Get a collection of methods entities * + * @api + * * @see PhpHandlerSettings::getMethodEntityFilter() * * @throws DependencyException * @throws InvalidConfigurationParameterException * @throws NotFoundException */ - public function getMethodEntityCollection(): MethodEntityCollection + public function getMethodEntitiesCollection(): MethodEntitiesCollection { $objectId = $this->getObjectId(); try { return $this->localObjectCache->getMethodCachedResult(__METHOD__, $objectId); } catch (ObjectNotFoundException) { } - $methodEntityCollection = $this->diContainer->make(MethodEntityCollection::class, [ + $methodEntitiesCollection = $this->diContainer->make(MethodEntitiesCollection::class, [ 'classEntity' => $this ]); - $methodEntityCollection->loadMethodEntities(); - $this->localObjectCache->cacheMethodResult(__METHOD__, $objectId, $methodEntityCollection); - return $methodEntityCollection; + $methodEntitiesCollection->loadMethodEntities(); + $this->localObjectCache->cacheMethodResult(__METHOD__, $objectId, $methodEntitiesCollection); + return $methodEntitiesCollection; } /** * Get all methods that are available according to the configuration as an array * + * @api + * * @return MethodEntity[] * - * @see self::getMethodEntityCollection() + * @see self::getMethodEntitiesCollection() * @see PhpHandlerSettings::getMethodEntityFilter() * * @throws DependencyException @@ -867,13 +871,15 @@ public function getMethodEntityCollection(): MethodEntityCollection */ public function getMethods(): array { - $methodEntityCollection = $this->getMethodEntityCollection(); - return iterator_to_array($methodEntityCollection); + $methodEntitiesCollection = $this->getMethodEntitiesCollection(); + return iterator_to_array($methodEntitiesCollection); } /** * Check if a method exists in a class * + * @api + * * @param string $methodName The name of the method whose entity you want to check * @param bool $unsafe Check all methods, not just the methods allowed in the configuration * @@ -885,16 +891,18 @@ public function getMethods(): array */ public function hasMethod(string $methodName, bool $unsafe = false): bool { - $methodEntityCollection = $this->getMethodEntityCollection(); + $methodEntitiesCollection = $this->getMethodEntitiesCollection(); if ($unsafe) { return array_key_exists($methodName, $this->getMethodsData()); } - return $methodEntityCollection->has($methodName); + return $methodEntitiesCollection->has($methodName); } /** * Get the method entity by its name * + * @api + * * @param string $methodName The name of the method whose entity you want to get * @param bool $unsafe Check all methods, not just the methods allowed in the configuration * @@ -904,11 +912,11 @@ public function hasMethod(string $methodName, bool $unsafe = false): bool */ public function getMethod(string $methodName, bool $unsafe = false): ?MethodEntity { - $methodEntityCollection = $this->getMethodEntityCollection(); + $methodEntitiesCollection = $this->getMethodEntitiesCollection(); if ($unsafe) { - return $methodEntityCollection->unsafeGet($methodName); + return $methodEntitiesCollection->unsafeGet($methodName); } - return $methodEntityCollection->get($methodName); + return $methodEntitiesCollection->get($methodName); } /** diff --git a/src/LanguageHandler/Php/Parser/Entity/SubEntity/Method/MethodEntityCollection.php b/src/LanguageHandler/Php/Parser/Entity/SubEntity/Method/MethodEntitiesCollection.php similarity index 88% rename from src/LanguageHandler/Php/Parser/Entity/SubEntity/Method/MethodEntityCollection.php rename to src/LanguageHandler/Php/Parser/Entity/SubEntity/Method/MethodEntitiesCollection.php index 539343c6..eb0202b8 100644 --- a/src/LanguageHandler/Php/Parser/Entity/SubEntity/Method/MethodEntityCollection.php +++ b/src/LanguageHandler/Php/Parser/Entity/SubEntity/Method/MethodEntitiesCollection.php @@ -19,7 +19,7 @@ * * @implements \IteratorAggregate */ -final class MethodEntityCollection extends BaseEntityCollection +final class MethodEntitiesCollection extends BaseEntityCollection { private array $unsafeEntities = []; @@ -75,7 +75,7 @@ public function loadMethodEntities(): void * @param MethodEntityInterface $methodEntity Entity to be added to the collection * @param bool $reload Replace an entity with a new one if one has already been loaded previously */ - public function add(MethodEntityInterface $methodEntity, bool $reload = false): MethodEntityCollection + public function add(MethodEntityInterface $methodEntity, bool $reload = false): MethodEntitiesCollection { $methodName = $methodEntity->getName(); if (!isset($this->entities[$methodName]) || $reload) { @@ -127,40 +127,40 @@ public function unsafeGet(string $objectName): ?MethodEntity /** * Get a copy of the collection containing only those methods that are initialization methods */ - public function getInitializations(): MethodEntityCollection + public function getInitializations(): MethodEntitiesCollection { - $methodEntityCollection = clone $this; + $methodEntitiesCollection = clone $this; foreach ($this as $objectId => $methodEntity) { try { /**@var MethodEntity $methodEntity */ if (!$methodEntity->isInitialization()) { - $methodEntityCollection->remove($objectId); + $methodEntitiesCollection->remove($objectId); } } catch (\Exception $e) { $this->logger->warning($e->getMessage()); } } - $methodEntityCollection->unsafeEntities = []; - return $methodEntityCollection; + $methodEntitiesCollection->unsafeEntities = []; + return $methodEntitiesCollection; } /** * Get a copy of the collection containing only those methods that are not initialization methods */ - public function getAllExceptInitializations(): MethodEntityCollection + public function getAllExceptInitializations(): MethodEntitiesCollection { - $methodEntityCollection = clone $this; + $methodEntitiesCollection = clone $this; foreach ($this as $objectId => $methodEntity) { try { /**@var MethodEntity $methodEntity */ if ($methodEntity->isInitialization()) { - $methodEntityCollection->remove($objectId); + $methodEntitiesCollection->remove($objectId); } } catch (\Exception $e) { $this->logger->warning($e->getMessage()); } } - $methodEntityCollection->unsafeEntities = []; - return $methodEntityCollection; + $methodEntitiesCollection->unsafeEntities = []; + return $methodEntitiesCollection; } } diff --git a/src/LanguageHandler/Php/Renderer/EntityDocRenderer/PhpClassToMd/templates/_method_details.md.twig b/src/LanguageHandler/Php/Renderer/EntityDocRenderer/PhpClassToMd/templates/_method_details.md.twig index 6c445bfc..ce1a5da2 100644 --- a/src/LanguageHandler/Php/Renderer/EntityDocRenderer/PhpClassToMd/templates/_method_details.md.twig +++ b/src/LanguageHandler/Php/Renderer/EntityDocRenderer/PhpClassToMd/templates/_method_details.md.twig @@ -1,7 +1,7 @@ -{% if not methodEntityCollection.isEmpty() %} +{% if not methodEntitiesCollection.isEmpty() %}

        Method details:

        -{% for methodEntity in methodEntityCollection %} +{% for methodEntity in methodEntitiesCollection %}
          diff --git a/src/LanguageHandler/Php/Renderer/EntityDocRenderer/PhpClassToMd/templates/_methods.md.twig b/src/LanguageHandler/Php/Renderer/EntityDocRenderer/PhpClassToMd/templates/_methods.md.twig index e91249c3..aba10500 100644 --- a/src/LanguageHandler/Php/Renderer/EntityDocRenderer/PhpClassToMd/templates/_methods.md.twig +++ b/src/LanguageHandler/Php/Renderer/EntityDocRenderer/PhpClassToMd/templates/_methods.md.twig @@ -1,8 +1,8 @@ -{% if not methodEntityCollection.isEmpty() %} +{% if not methodEntitiesCollection.isEmpty() %}

          {{ blockName }}:

            -{% for methodEntity in methodEntityCollection %} +{% for methodEntity in methodEntitiesCollection %}
          1. {% if methodEntity.isDeprecated() %}{{ methodEntity.getName() }}{% else %}{{ methodEntity.getName() }}{% endif %} {% if methodEntity.getDescription() %}- {{ methodEntity.getDescription() | removeLineBrakes | raw }}{% endif %} diff --git a/src/LanguageHandler/Php/Renderer/EntityDocRenderer/PhpClassToMd/templates/class.md.twig b/src/LanguageHandler/Php/Renderer/EntityDocRenderer/PhpClassToMd/templates/class.md.twig index 540e0be3..de49e276 100644 --- a/src/LanguageHandler/Php/Renderer/EntityDocRenderer/PhpClassToMd/templates/class.md.twig +++ b/src/LanguageHandler/Php/Renderer/EntityDocRenderer/PhpClassToMd/templates/class.md.twig @@ -14,9 +14,9 @@ {% include '_enumCases.md.twig' with {'classEntity': classEntity} only %} -{% include '_methods.md.twig' with {'blockName': 'Initialization methods', 'methodEntityCollection': classEntity.getMethodEntityCollection().getInitializations()} only %} +{% include '_methods.md.twig' with {'blockName': 'Initialization methods', 'methodEntitiesCollection': classEntity.getMethodEntitiesCollection().getInitializations()} only %} -{% include '_methods.md.twig' with {'blockName': 'Methods', 'methodEntityCollection': classEntity.getMethodEntityCollection().getAllExceptInitializations()} only %} +{% include '_methods.md.twig' with {'blockName': 'Methods', 'methodEntitiesCollection': classEntity.getMethodEntitiesCollection().getAllExceptInitializations()} only %} {% include '_traits.md.twig' with {'classEntity': classEntity} only %} @@ -28,4 +28,4 @@ {% include '_property_details.md.twig' with {'classEntity': classEntity} only %} -{% include '_method_details.md.twig' with {'methodEntityCollection': classEntity.getMethodEntityCollection()} only %} +{% include '_method_details.md.twig' with {'methodEntitiesCollection': classEntity.getMethodEntitiesCollection()} only %} diff --git a/src/LanguageHandler/Php/Renderer/Twig/Function/GetClassMethodsBodyCode.php b/src/LanguageHandler/Php/Renderer/Twig/Function/GetClassMethodsBodyCode.php index 0ee34411..fec47426 100644 --- a/src/LanguageHandler/Php/Renderer/Twig/Function/GetClassMethodsBodyCode.php +++ b/src/LanguageHandler/Php/Renderer/Twig/Function/GetClassMethodsBodyCode.php @@ -55,10 +55,10 @@ public function __invoke(string $className, array $methodsNames): ?string $classEntity = $entitiesCollection->getLoadedOrCreateNew($className); if ($classEntity->isEntityDataCanBeLoaded()) { $methodsCode = []; - $methodEntityCollection = $classEntity->getMethodEntityCollection(); + $methodEntitiesCollection = $classEntity->getMethodEntitiesCollection(); $addIndentFromLeft = new AddIndentFromLeft(); foreach ($methodsNames as $methodName) { - $method = $methodEntityCollection->unsafeGet($methodName); + $method = $methodEntitiesCollection->unsafeGet($methodName); if ($method) { $bodyCode = "{$method->getModifiersString()} {$method->getName()}({$method->getParametersString()}): {$method->getReturnType()}\n"; $bodyCode .= "{\n"; diff --git a/tests/Unit/LanguageHandler/Php/Parser/FilterCondition/ClassConstantFilterCondition/IsPrivateConditionTest.php b/tests/Unit/LanguageHandler/Php/Parser/FilterCondition/ClassConstantFilterCondition/IsPrivateConditionTest.php index 0b8563bb..333b4c5b 100644 --- a/tests/Unit/LanguageHandler/Php/Parser/FilterCondition/ClassConstantFilterCondition/IsPrivateConditionTest.php +++ b/tests/Unit/LanguageHandler/Php/Parser/FilterCondition/ClassConstantFilterCondition/IsPrivateConditionTest.php @@ -4,7 +4,7 @@ namespace Test\Unit\LanguageHandler\Php\Parser\FilterCondition\ClassConstantFilterCondition; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Constant\ConstantEntity; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity; use BumbleDocGen\LanguageHandler\Php\Parser\FilterCondition\ClassConstantFilterCondition\IsPrivateCondition; use PHPUnit\Framework\TestCase; @@ -20,8 +20,8 @@ public static function setUpBeforeClass(): void */ public function testCanAddToCollection(bool $isPrivateMethodsResult, bool $expectedResult): void { - $entityStub = $this->createStub(ConstantEntity::class); - foreach (get_class_methods(ConstantEntity::class) as $classMethod) { + $entityStub = $this->createStub(ClassConstantEntity::class); + foreach (get_class_methods(ClassConstantEntity::class) as $classMethod) { if ( !in_array($classMethod, [ '__construct', diff --git a/tests/Unit/LanguageHandler/Php/Parser/FilterCondition/ClassConstantFilterCondition/IsProtectedConditionTest.php b/tests/Unit/LanguageHandler/Php/Parser/FilterCondition/ClassConstantFilterCondition/IsProtectedConditionTest.php index 25a60361..60db2c5b 100644 --- a/tests/Unit/LanguageHandler/Php/Parser/FilterCondition/ClassConstantFilterCondition/IsProtectedConditionTest.php +++ b/tests/Unit/LanguageHandler/Php/Parser/FilterCondition/ClassConstantFilterCondition/IsProtectedConditionTest.php @@ -4,7 +4,7 @@ namespace Test\Unit\LanguageHandler\Php\Parser\FilterCondition\ClassConstantFilterCondition; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Constant\ConstantEntity; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity; use BumbleDocGen\LanguageHandler\Php\Parser\FilterCondition\ClassConstantFilterCondition\IsProtectedCondition; use PHPUnit\Framework\TestCase; @@ -20,8 +20,8 @@ public static function setUpBeforeClass(): void */ public function testCanAddToCollection(bool $isProtectedMethodsResult, bool $expectedResult): void { - $entityStub = $this->createStub(ConstantEntity::class); - foreach (get_class_methods(ConstantEntity::class) as $classMethod) { + $entityStub = $this->createStub(ClassConstantEntity::class); + foreach (get_class_methods(ClassConstantEntity::class) as $classMethod) { if ( !in_array($classMethod, [ '__construct', diff --git a/tests/Unit/LanguageHandler/Php/Parser/FilterCondition/ClassConstantFilterCondition/IsPublicConditionTest.php b/tests/Unit/LanguageHandler/Php/Parser/FilterCondition/ClassConstantFilterCondition/IsPublicConditionTest.php index ab0d4560..7e8f73d7 100644 --- a/tests/Unit/LanguageHandler/Php/Parser/FilterCondition/ClassConstantFilterCondition/IsPublicConditionTest.php +++ b/tests/Unit/LanguageHandler/Php/Parser/FilterCondition/ClassConstantFilterCondition/IsPublicConditionTest.php @@ -4,7 +4,7 @@ namespace Test\Unit\LanguageHandler\Php\Parser\FilterCondition\ClassConstantFilterCondition; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Constant\ConstantEntity; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity; use BumbleDocGen\LanguageHandler\Php\Parser\FilterCondition\ClassConstantFilterCondition\IsPublicCondition; use PHPUnit\Framework\TestCase; @@ -20,8 +20,8 @@ public static function setUpBeforeClass(): void */ public function testCanAddToCollection(bool $isPublicMethodsResult, bool $expectedResult): void { - $entityStub = $this->createStub(ConstantEntity::class); - foreach (get_class_methods(ConstantEntity::class) as $classMethod) { + $entityStub = $this->createStub(ClassConstantEntity::class); + foreach (get_class_methods(ClassConstantEntity::class) as $classMethod) { if ( !in_array($classMethod, [ '__construct', diff --git a/tests/Unit/LanguageHandler/Php/Parser/FilterCondition/ClassConstantFilterCondition/VisibilityConditionTest.php b/tests/Unit/LanguageHandler/Php/Parser/FilterCondition/ClassConstantFilterCondition/VisibilityConditionTest.php index a8afbe4b..b2869a60 100644 --- a/tests/Unit/LanguageHandler/Php/Parser/FilterCondition/ClassConstantFilterCondition/VisibilityConditionTest.php +++ b/tests/Unit/LanguageHandler/Php/Parser/FilterCondition/ClassConstantFilterCondition/VisibilityConditionTest.php @@ -4,7 +4,7 @@ namespace Test\Unit\LanguageHandler\Php\Parser\FilterCondition\ClassConstantFilterCondition; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Constant\ConstantEntity; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity; use BumbleDocGen\LanguageHandler\Php\Parser\FilterCondition\ClassConstantFilterCondition\VisibilityCondition; use BumbleDocGen\LanguageHandler\Php\Parser\FilterCondition\ClassFilterCondition\VisibilityConditionModifier; use PHPUnit\Framework\TestCase; @@ -21,8 +21,8 @@ public static function setUpBeforeClass(): void */ public function testCanAddToCollection(array $visibilityModifiers, array $methodsStubs, bool $expectedResult): void { - $entityStub = $this->createStub(ConstantEntity::class); - foreach (get_class_methods(ConstantEntity::class) as $classMethod) { + $entityStub = $this->createStub(ClassConstantEntity::class); + foreach (get_class_methods(ClassConstantEntity::class) as $classMethod) { if ( !in_array($classMethod, [ '__construct', From f93a92e7010ad792c0d1c5e4e3e9b586135df46c Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Tue, 21 Nov 2023 16:25:10 +0300 Subject: [PATCH 091/210] Adding doc comment --- src/Core/Parser/Entity/Cache/CacheableEntityInterface.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/Core/Parser/Entity/Cache/CacheableEntityInterface.php b/src/Core/Parser/Entity/Cache/CacheableEntityInterface.php index aedad61a..dacb8fa6 100644 --- a/src/Core/Parser/Entity/Cache/CacheableEntityInterface.php +++ b/src/Core/Parser/Entity/Cache/CacheableEntityInterface.php @@ -10,6 +10,11 @@ public function getObjectId(): string; public function getCacheKey(): string; + /** + * Checking if the entity cache is out of date + * + * @internal + */ public function isEntityCacheOutdated(): bool; public function isEntityFileCanBeLoad(): bool; From c485026315a97bcb80b2dcb7f054ce978c1f2119 Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Tue, 21 Nov 2023 16:33:14 +0300 Subject: [PATCH 092/210] Removing old code --- .../Php/Parser/Entity/SubEntity/Method/MethodEntity.php | 1 - .../Php/Parser/Entity/SubEntity/Property/PropertyEntity.php | 1 - 2 files changed, 2 deletions(-) diff --git a/src/LanguageHandler/Php/Parser/Entity/SubEntity/Method/MethodEntity.php b/src/LanguageHandler/Php/Parser/Entity/SubEntity/Method/MethodEntity.php index 060efece..484a0cd0 100644 --- a/src/LanguageHandler/Php/Parser/Entity/SubEntity/Method/MethodEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/SubEntity/Method/MethodEntity.php @@ -14,7 +14,6 @@ use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; use BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper; use BumbleDocGen\LanguageHandler\Php\Parser\PhpParser\NodeValueCompiler; -use BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings; use DI\DependencyException; use DI\NotFoundException; use phpDocumentor\Reflection\DocBlock\Tags\InvalidTag; diff --git a/src/LanguageHandler/Php/Parser/Entity/SubEntity/Property/PropertyEntity.php b/src/LanguageHandler/Php/Parser/Entity/SubEntity/Property/PropertyEntity.php index d77d2294..dcbabf1a 100644 --- a/src/LanguageHandler/Php/Parser/Entity/SubEntity/Property/PropertyEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/SubEntity/Property/PropertyEntity.php @@ -14,7 +14,6 @@ use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; use BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper; use BumbleDocGen\LanguageHandler\Php\Parser\PhpParser\NodeValueCompiler; -use BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings; use DI\DependencyException; use DI\NotFoundException; use PhpParser\ConstExprEvaluationException; From 3552d139749ea067cadf1a157dfa9c3e6da7fee8 Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Tue, 21 Nov 2023 17:32:40 +0300 Subject: [PATCH 093/210] Refactor methods --- src/AI/Generators/DocBlocksGenerator.php | 6 +- .../SubEntity/Method/DynamicMethodEntity.php | 16 ++++ .../Method/MethodEntitiesCollection.php | 12 +++ .../Entity/SubEntity/Method/MethodEntity.php | 76 ++++++++++--------- .../Method/MethodEntityInterface.php | 54 +++++++++++++ 5 files changed, 127 insertions(+), 37 deletions(-) diff --git a/src/AI/Generators/DocBlocksGenerator.php b/src/AI/Generators/DocBlocksGenerator.php index 861fba32..c88a54c7 100644 --- a/src/AI/Generators/DocBlocksGenerator.php +++ b/src/AI/Generators/DocBlocksGenerator.php @@ -87,8 +87,8 @@ public function generateDocBlocksForMethodsWithoutIt( } if ($method->getDocComment() && $method->getDescription()) { - $prototype = $method->getPrototype(); - $prototypeDocComment = $prototype?->getDocComment(); + $parentMethod = $method->getParentMethod(); + $prototypeDocComment = $parentMethod?->getDocComment(); if ($prototypeDocComment && !str_contains(strtolower($method->getDocComment()), '@inheritdoc')) { if (isset($newThrowsDockBlocks[$method->getName()])) { $methodsDockBlocks[$method->getName()] = str_replace( @@ -119,7 +119,7 @@ public function generateDocBlocksForMethodsWithoutIt( "/**\n * [insert]", $method->getDocComment() ); - } elseif (strlen($method->getDocCommentRecursive()) > 1) { + } elseif (strlen($method->getDescription()) > 1) { if ($method->getDescription()) { if (isset($newThrowsDockBlocks[$method->getName()])) { $methodsDockBlocks[$method->getName()] = $this->createDocBlockText(['[throws]', '{@inheritDoc}']); diff --git a/src/LanguageHandler/Php/Parser/Entity/SubEntity/Method/DynamicMethodEntity.php b/src/LanguageHandler/Php/Parser/Entity/SubEntity/Method/DynamicMethodEntity.php index 22162ebc..47613218 100644 --- a/src/LanguageHandler/Php/Parser/Entity/SubEntity/Method/DynamicMethodEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/SubEntity/Method/DynamicMethodEntity.php @@ -38,6 +38,16 @@ public function getName(): string return $this->annotationMethod->getMethodName(); } + /** + * @inheritDoc + * + * @throws InvalidConfigurationParameterException + */ + public function getSignature(): string + { + return "{$this->getModifiersString()} {$this->getName()}({$this->getParametersString()}): {$this->getReturnType()}"; + } + /** * @inheritDoc */ @@ -225,11 +235,17 @@ public function getImplementingClass(): ClassLikeEntity return $this->classEntity; } + /** + * @inheritDoc + */ public function getShortName(): string { return $this->getName(); } + /** + * @inheritDoc + */ public function getNamespaceName(): string { return $this->getRootEntity()->getNamespaceName(); diff --git a/src/LanguageHandler/Php/Parser/Entity/SubEntity/Method/MethodEntitiesCollection.php b/src/LanguageHandler/Php/Parser/Entity/SubEntity/Method/MethodEntitiesCollection.php index eb0202b8..d9448be0 100644 --- a/src/LanguageHandler/Php/Parser/Entity/SubEntity/Method/MethodEntitiesCollection.php +++ b/src/LanguageHandler/Php/Parser/Entity/SubEntity/Method/MethodEntitiesCollection.php @@ -34,6 +34,8 @@ public function __construct( /** * Load method entities into the collection according to the project configuration * + * @internal + * * @see PhpHandlerSettings::getMethodEntityFilter() * * @throws DependencyException @@ -72,6 +74,8 @@ public function loadMethodEntities(): void /** * Add an entity to a collection * + * @api + * * @param MethodEntityInterface $methodEntity Entity to be added to the collection * @param bool $reload Replace an entity with a new one if one has already been loaded previously */ @@ -87,6 +91,8 @@ public function add(MethodEntityInterface $methodEntity, bool $reload = false): /** * Get the loaded method entity if it exists * + * @api + * * @param string $objectName Method entity name */ public function get(string $objectName): ?MethodEntity @@ -97,6 +103,8 @@ public function get(string $objectName): ?MethodEntity /** * Get the method entity if it exists. If the method exists but has not been loaded into the collection, a new entity object will be created * + * @api + * * @param string $objectName Method entity name * * @throws NotFoundException @@ -126,6 +134,8 @@ public function unsafeGet(string $objectName): ?MethodEntity /** * Get a copy of the collection containing only those methods that are initialization methods + * + * @api */ public function getInitializations(): MethodEntitiesCollection { @@ -146,6 +156,8 @@ public function getInitializations(): MethodEntitiesCollection /** * Get a copy of the collection containing only those methods that are not initialization methods + * + * @api */ public function getAllExceptInitializations(): MethodEntitiesCollection { diff --git a/src/LanguageHandler/Php/Parser/Entity/SubEntity/Method/MethodEntity.php b/src/LanguageHandler/Php/Parser/Entity/SubEntity/Method/MethodEntity.php index 484a0cd0..b215746e 100644 --- a/src/LanguageHandler/Php/Parser/Entity/SubEntity/Method/MethodEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/SubEntity/Method/MethodEntity.php @@ -55,7 +55,7 @@ class MethodEntity extends BaseEntity implements MethodEntityInterface public function __construct( private Configuration $configuration, private ClassLikeEntity $classEntity, - private ParserHelper $parserHelper, + ParserHelper $parserHelper, private Standard $astPrinter, private LocalObjectCache $localObjectCache, private LoggerInterface $logger, @@ -92,6 +92,9 @@ public function getRootEntity(): ClassLikeEntity return $this->classEntity; } + /** + * @inheritDoc + */ public function getRootEntityCollection(): PhpEntitiesCollection { return $this->getRootEntity()->getRootEntityCollection(); @@ -105,17 +108,33 @@ public function getImplementingClass(): ClassLikeEntity return $this->getRootEntityCollection()->getLoadedOrCreateNew($this->getImplementingClassName()); } + /** + * @inheritDoc + */ + public function getName(): string + { + return $this->methodName; + } + + /** + * @inheritDoc + */ public function getShortName(): string { return $this->getName(); } + /** + * @inheritDoc + */ public function getNamespaceName(): string { return $this->getRootEntity()->getNamespaceName(); } /** + * @inheritDoc + * * @throws DependencyException * @throws NotFoundException * @throws InvalidConfigurationParameterException @@ -154,33 +173,25 @@ public function getDocCommentEntity(): MethodEntity } /** + * Get the parent method for this method + * + * @api + * * @throws DependencyException * @throws NotFoundException * @throws InvalidConfigurationParameterException */ - public function getPrototype(): ?MethodEntity + public function getParentMethod(): ?MethodEntity { $objectId = $this->getObjectId(); try { return $this->localObjectCache->getMethodCachedResult(__METHOD__, $objectId); } catch (ObjectNotFoundException) { } - $prototype = null; - $implementingClass = $this->getImplementingClass(); $parentClass = $this->getImplementingClass()->getParentClass(); - $methodName = $this->getName(); - if ($parentClass && $parentClass->hasMethod($methodName)) { - $prototype = $parentClass->getMethod($methodName, true); - } else { - foreach ($implementingClass->getInterfacesEntities() as $interface) { - if ($interface->hasMethod($methodName)) { - $prototype = $interface->getMethod($methodName, true); - break; - } - } - } - $this->localObjectCache->cacheMethodResult(__METHOD__, $objectId, $prototype); - return $prototype; + $parentMethod = $parentClass->getMethod($this->getName(), true); + $this->localObjectCache->cacheMethodResult(__METHOD__, $objectId, $parentMethod); + return $parentMethod; } /** @@ -192,6 +203,8 @@ public function getPrototype(): ?MethodEntity } /** + * @inheritDoc + * * @throws DependencyException * @throws NotFoundException * @throws InvalidConfigurationParameterException @@ -202,13 +215,10 @@ public function getSignature(): string } /** - * @inheritDoc + * Checking that a method is a constructor + * + * @api */ - public function getName(): string - { - return $this->methodName; - } - public function isConstructor(): bool { return $this->getName() === '__construct'; @@ -303,17 +313,9 @@ public static function parseAnnotationParams(array $params): array return $paramsFromDoc; } - private function isArrayAnnotationType(string $annotationType): bool - { - return preg_match('/^([a-zA-Z\\_]+)(\[\])$/', $annotationType) || - preg_match('/^(array)(<|{)(.*)(>|})$/', $annotationType); - } - /** * @inheritDoc * - * @throws NotFoundException - * @throws DependencyException * @throws InvalidConfigurationParameterException * @throws \Exception */ @@ -322,6 +324,11 @@ private function isArrayAnnotationType(string $annotationType): bool $parameters = []; $docBlock = $this->getDocBlock(); + $isArrayAnnotationType = function (string $annotationType): bool { + return preg_match('/^([a-zA-Z\\_]+)(\[\])$/', $annotationType) || + preg_match('/^(array)(<|{)(.*)(>|})$/', $annotationType); + }; + /** * @var Param[] $params */ @@ -359,7 +366,7 @@ private function isArrayAnnotationType(string $annotationType): bool } $type = $type ?: 'mixed'; $expectedType = $type; - if ($type === 'array' && $this->isArrayAnnotationType($annotationType)) { + if ($type === 'array' && $isArrayAnnotationType($annotationType)) { $expectedType = $annotationType; } @@ -389,9 +396,7 @@ private function isArrayAnnotationType(string $annotationType): bool /** * @inheritDoc * - * @throws NotFoundException * @throws InvalidConfigurationParameterException - * @throws DependencyException */ public function getParametersString(): string { @@ -446,6 +451,9 @@ public function isInitialization(): bool return $this->isStatic() && in_array($this->getReturnType(), $initializationReturnTypes); } + /** + * @inheritDoc + */ public function isDynamic(): bool { return false; diff --git a/src/LanguageHandler/Php/Parser/Entity/SubEntity/Method/MethodEntityInterface.php b/src/LanguageHandler/Php/Parser/Entity/SubEntity/Method/MethodEntityInterface.php index 4099f231..07b48568 100644 --- a/src/LanguageHandler/Php/Parser/Entity/SubEntity/Method/MethodEntityInterface.php +++ b/src/LanguageHandler/Php/Parser/Entity/SubEntity/Method/MethodEntityInterface.php @@ -11,105 +11,159 @@ interface MethodEntityInterface extends EntityInterface { /** * Get method name + * + * @api */ public function getName(): string; + /** + * Namespace of the class that contains this method + * + * @api + */ + public function getNamespaceName(): string; + /** * Get the line number of the beginning of the method code in a file + * + * @api */ public function getStartLine(): int; /** * Get the column number of the beginning of the method code in a file + * + * @api */ public function getStartColumn(): int; /** * Get the line number of the end of a method's code in a file + * + * @api */ public function getEndLine(): int; /** * Get a text representation of method modifiers + * + * @api */ public function getModifiersString(): string; /** * Get the return type of method + * + * @api */ public function getReturnType(): string; /** * Get a list of method parameters * + * @api + * * @return string[] */ public function getParameters(): array; /** * Get a list of method parameters as a string + * + * @api */ public function getParametersString(): string; /** * Get the name of the class in which this method is implemented + * + * @api */ public function getImplementingClassName(): string; /** * Get the ClassLike entity in which this method was implemented + * + * @api */ public function getImplementingClass(): ClassLikeEntity; /** * Get a description of this method + * + * @api */ public function getDescription(): string; /** * Check if a method is an initialization method + * + * @api */ public function isInitialization(): bool; /** * Check if a method is a public method + * + * @api */ public function isPublic(): bool; /** * Check if a method is a protected method + * + * @api */ public function isProtected(): bool; /** * Check if a method is a private method + * + * @api */ public function isPrivate(): bool; /** * Check if a method is a dynamic method, that is, implementable using __call or __callStatic + * + * @api */ public function isDynamic(): bool; /** * Get the compiled first return value of a method (if possible) * + * @api + * * @return mixed compiled value */ public function getFirstReturnValue(): mixed; /** * Get the code for this method + * + * @api */ public function getBodyCode(): string; /** * Check if this method is static + * + * @api */ public function isStatic(): bool; /** * Check if this method is implemented in the parent class + * + * @api */ public function isImplementedInParentClass(): bool; + + /** + * Get the method signature as a string + * + * @api + */ + public function getSignature(): string; } From f8287a9f39689d9e0bfd21d8222488f7c090251d Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Wed, 22 Nov 2023 01:10:31 +0300 Subject: [PATCH 094/210] Adding descriptions --- .../Entity/Cache/CacheableEntityInterface.php | 31 ++++++++++-- src/Core/Parser/Entity/EntityInterface.php | 31 ++++++++++++ .../Php/Parser/Entity/BaseEntity.php | 48 +++++++++++++++++-- .../SubEntity/Method/DynamicMethodEntity.php | 7 +++ .../Method/MethodEntityInterface.php | 7 --- 5 files changed, 110 insertions(+), 14 deletions(-) diff --git a/src/Core/Parser/Entity/Cache/CacheableEntityInterface.php b/src/Core/Parser/Entity/Cache/CacheableEntityInterface.php index dacb8fa6..ec4a68c4 100644 --- a/src/Core/Parser/Entity/Cache/CacheableEntityInterface.php +++ b/src/Core/Parser/Entity/Cache/CacheableEntityInterface.php @@ -4,10 +4,15 @@ namespace BumbleDocGen\Core\Parser\Entity\Cache; -interface CacheableEntityInterface -{ - public function getObjectId(): string; +use BumbleDocGen\Core\Parser\Entity\EntityInterface; +interface CacheableEntityInterface extends EntityInterface +{ + /** + * Get the cache key + * + * @internal + */ public function getCacheKey(): string; /** @@ -17,11 +22,31 @@ public function getCacheKey(): string; */ public function isEntityCacheOutdated(): bool; + /** + * Checking if the current entity file can be loaded + * + * @internal + */ public function isEntityFileCanBeLoad(): bool; + /** + * Checking if the local entity cache is out of date + * + * @internal + */ public function isEntityDataCacheOutdated(): bool; + /** + * Update entity dependency cache + * + * @internal + */ public function reloadEntityDependenciesCache(): array; + /** + * Delete current entity cache that was not used the last time documentation was generated + * + * @internal + */ public function removeNotUsedEntityDataCache(): void; } diff --git a/src/Core/Parser/Entity/EntityInterface.php b/src/Core/Parser/Entity/EntityInterface.php index 0e5d417f..6ea59b30 100644 --- a/src/Core/Parser/Entity/EntityInterface.php +++ b/src/Core/Parser/Entity/EntityInterface.php @@ -4,25 +4,56 @@ namespace BumbleDocGen\Core\Parser\Entity; +use BumbleDocGen\Core\Configuration\Configuration; + interface EntityInterface { + /** + * Entity object ID + * + * @api + */ public function getObjectId(): string; /** * Get parent collection of entities + * + * @api */ public function getRootEntityCollection(): RootEntityCollection; + /** + * Full name of the entity + * + * @api + */ public function getName(): string; + /** + * Short name of the entity + * + * @api + */ public function getShortName(): string; + /** + * File name relative to project_root configuration parameter + * + * @api + * + * @see Configuration::getProjectRoot() + */ public function getRelativeFileName(): ?string; /** * Returns the absolute path to a file if it can be retrieved and if the file is in the project directory + * + * @api */ public function getAbsoluteFileName(): ?string; + /** + * @internal + */ public function isEntityCacheOutdated(): bool; } diff --git a/src/LanguageHandler/Php/Parser/Entity/BaseEntity.php b/src/LanguageHandler/Php/Parser/Entity/BaseEntity.php index 86090ec4..00f308db 100644 --- a/src/LanguageHandler/Php/Parser/Entity/BaseEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/BaseEntity.php @@ -12,7 +12,6 @@ use BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityInterface; use BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait; use BumbleDocGen\Core\Parser\Entity\Cache\CacheableMethod; -use BumbleDocGen\Core\Parser\Entity\EntityInterface; use BumbleDocGen\Core\Renderer\RendererHelper; use BumbleDocGen\Core\Renderer\Twig\Function\GetDocumentedEntityUrl; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity; @@ -26,7 +25,7 @@ use Psr\Cache\InvalidArgumentException; use Psr\Log\LoggerInterface; -abstract class BaseEntity implements CacheableEntityInterface, EntityInterface +abstract class BaseEntity implements CacheableEntityInterface { use CacheableEntityTrait; @@ -81,7 +80,7 @@ abstract public function getRootEntityCollection(): PhpEntitiesCollection; abstract public function getDocCommentEntity(): ClassLikeEntity|MethodEntity|PropertyEntity|ClassConstantEntity; /** - * @api + * @inheritDoc * * @throws InvalidConfigurationParameterException */ @@ -104,6 +103,10 @@ public function getAbsoluteFileName(): ?string } /** + * Checking if entity data can be retrieved + * + * @api + * * @throws InvalidConfigurationParameterException */ final public function isEntityFileCanBeLoad(): bool @@ -112,6 +115,8 @@ final public function isEntityFileCanBeLoad(): bool } /** + * Get entity description + * * @api * * @throws InvalidConfigurationParameterException @@ -156,6 +161,8 @@ protected function prepareTypeString(string $type): string } /** + * @internal + * * @throws InvalidConfigurationParameterException */ public function getFileSourceLink(bool $withLine = true): ?string @@ -181,6 +188,8 @@ public function getObjectId(): string } /** + * Get the code line number where the dockBlock of the current entity begins + * * @api * * @throws InvalidConfigurationParameterException @@ -192,6 +201,10 @@ public function getObjectId(): string } /** + * Get DocBlock for current entity + * + * @internal + * * @throws InvalidConfigurationParameterException */ public function getDocBlock(): DocBlock @@ -205,6 +218,8 @@ public function getDocBlock(): DocBlock } /** + * Checking if an entity has `internal` docBlock + * * @api * * @throws InvalidConfigurationParameterException @@ -217,6 +232,8 @@ public function isInternal(): bool } /** + * Checking if an entity has `deprecated` docBlock + * * @api * * @throws InvalidConfigurationParameterException @@ -229,6 +246,8 @@ public function isDeprecated(): bool } /** + * Checking if an entity has links in its description + * * @api * * @throws \Exception @@ -386,6 +405,8 @@ public function getDescriptionLinks(): array } /** + * Checking if an entity has `throws` docBlock + * * @api * * @throws InvalidConfigurationParameterException @@ -501,6 +522,8 @@ private function fillInLinkDataWithUrls(array $linkData): array } /** + * Checking if an entity has `example` docBlock + * * @api * * @throws InvalidConfigurationParameterException @@ -535,7 +558,7 @@ public function getExamples(): array } /** - * Get first example from @examples doc block + * Get first example from `examples` doc block * * @api * @@ -548,6 +571,8 @@ public function getFirstExample(): string } /** + * Get the note annotation value + * * @api * * @throws InvalidConfigurationParameterException @@ -561,6 +586,8 @@ public function getDocNote(): string /** * Get the doc comment of an entity * + * @api + * * @throws InvalidConfigurationParameterException */ #[CacheableMethod] public function getDocComment(): string @@ -569,6 +596,9 @@ public function getDocNote(): string return (string)$docComment?->getReformattedText(); } + /** + * @internal + */ public function getCurrentRootEntity(): ?ClassLikeEntity { if (is_a($this, ClassLikeEntity::class)) { @@ -579,12 +609,17 @@ public function getCurrentRootEntity(): ?ClassLikeEntity return null; } + /** + * @internal + */ protected function getEntityDependenciesCacheKey(): string { return "__internalEntityDependencies{$this->getCacheKey()}"; } /** + * @internal + * * @throws InvalidArgumentException * @throws InvalidConfigurationParameterException */ @@ -603,6 +638,8 @@ final public function getCachedEntityDependencies(): array } /** + * @inheritDoc + * * @throws InvalidArgumentException * @throws InvalidConfigurationParameterException */ @@ -663,6 +700,9 @@ private function isSubEntityFileCacheIsOutdated(string $dependenciesCacheKey): b return $isEntityCacheOutdated; } + /** + * @internal + */ protected function isCurrentEntityCanBeLoad(): bool { $classEntity = $this->getCurrentRootEntity(); diff --git a/src/LanguageHandler/Php/Parser/Entity/SubEntity/Method/DynamicMethodEntity.php b/src/LanguageHandler/Php/Parser/Entity/SubEntity/Method/DynamicMethodEntity.php index 47613218..4fa02465 100644 --- a/src/LanguageHandler/Php/Parser/Entity/SubEntity/Method/DynamicMethodEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/SubEntity/Method/DynamicMethodEntity.php @@ -25,6 +25,9 @@ public function __construct( ) { } + /** + * Get the class like entity where this method was obtained + */ public function getRootEntity(): ClassLikeEntity { return $this->classEntity; @@ -57,6 +60,8 @@ public function isStatic(): bool } /** + * Get the entity of the magic method that will be called instead of the current virtual one + * * @throws \Exception */ public function getCallMethod(): MethodEntity @@ -70,6 +75,8 @@ public function getCallMethod(): MethodEntity } /** + * @inheritDoc + * * @throws InvalidConfigurationParameterException * @throws \Exception */ diff --git a/src/LanguageHandler/Php/Parser/Entity/SubEntity/Method/MethodEntityInterface.php b/src/LanguageHandler/Php/Parser/Entity/SubEntity/Method/MethodEntityInterface.php index 07b48568..0335a956 100644 --- a/src/LanguageHandler/Php/Parser/Entity/SubEntity/Method/MethodEntityInterface.php +++ b/src/LanguageHandler/Php/Parser/Entity/SubEntity/Method/MethodEntityInterface.php @@ -9,13 +9,6 @@ interface MethodEntityInterface extends EntityInterface { - /** - * Get method name - * - * @api - */ - public function getName(): string; - /** * Namespace of the class that contains this method * From 09ee4d5e74eee63865b4b9b73b776b5c8b017b6c Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Wed, 22 Nov 2023 01:14:19 +0300 Subject: [PATCH 095/210] Removing old code --- .../Entity/SubEntity/Method/MethodEntity.php | 37 +++++++------------ 1 file changed, 14 insertions(+), 23 deletions(-) diff --git a/src/LanguageHandler/Php/Parser/Entity/SubEntity/Method/MethodEntity.php b/src/LanguageHandler/Php/Parser/Entity/SubEntity/Method/MethodEntity.php index b215746e..c78be4ae 100644 --- a/src/LanguageHandler/Php/Parser/Entity/SubEntity/Method/MethodEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/SubEntity/Method/MethodEntity.php @@ -291,28 +291,6 @@ public function getModifiersString(): string return $this->prepareTypeString($typeString); } - /** - * @param Param[] $params - */ - public static function parseAnnotationParams(array $params): array - { - $paramsFromDoc = []; - foreach ($params as $param) { - try { - if (method_exists($param, 'getVariableName')) { - $paramsFromDoc[$param->getVariableName()] = [ - 'name' => (string)$param->getVariableName(), - 'type' => (string)$param->getType(), - 'description' => (string)$param->getDescription(), - 'defaultValue' => null, - ]; - } - } catch (\Exception) { - } - } - return $paramsFromDoc; - } - /** * @inheritDoc * @@ -333,7 +311,20 @@ public static function parseAnnotationParams(array $params): array * @var Param[] $params */ $params = $docBlock->getTagsByName('param'); - $typesFromDoc = self::parseAnnotationParams($params); + $typesFromDoc = []; + foreach ($params as $param) { + try { + if (method_exists($param, 'getVariableName')) { + $typesFromDoc[$param->getVariableName()] = [ + 'name' => (string)$param->getVariableName(), + 'type' => (string)$param->getType(), + 'description' => (string)$param->getDescription(), + 'defaultValue' => null, + ]; + } + } catch (\Exception) { + } + } try { /** @var \PhpParser\Node\Param[] $params */ $params = $this->getAst()->getParams(); From 0d95b526badefe2a9fc00b54f19d3d6410947952 Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Wed, 22 Nov 2023 13:04:18 +0300 Subject: [PATCH 096/210] Refactor properties --- .../Php/Parser/Entity/ClassLikeEntity.php | 242 ++++++++++++------ ...ion.php => PropertyEntitiesCollection.php} | 32 ++- .../SubEntity/Property/PropertyEntity.php | 78 +++++- .../Parser/PhpParser/NodeValueCompiler.php | 2 +- .../templates/_properties.md.twig | 4 +- .../templates/_property_details.md.twig | 4 +- 6 files changed, 265 insertions(+), 97 deletions(-) rename src/LanguageHandler/Php/Parser/Entity/SubEntity/Property/{PropertyEntityCollection.php => PropertyEntitiesCollection.php} (72%) diff --git a/src/LanguageHandler/Php/Parser/Entity/ClassLikeEntity.php b/src/LanguageHandler/Php/Parser/Entity/ClassLikeEntity.php index 1618f91e..d9443a1c 100644 --- a/src/LanguageHandler/Php/Parser/Entity/ClassLikeEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/ClassLikeEntity.php @@ -19,7 +19,7 @@ use BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntity; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntitiesCollection; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntity; -use BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntityCollection; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntitiesCollection; use BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper; use BumbleDocGen\LanguageHandler\Php\Parser\PhpParser\NodeValueCompiler; use BumbleDocGen\LanguageHandler\Php\Parser\PhpParser\PhpParserHelper; @@ -495,7 +495,7 @@ public function hasTraits(): bool } /** - * Get a list of all constants available in the current class according to filters and the classes where they are implemented + * Get a list of all constants and classes where they are implemented * * @internal * @@ -571,7 +571,7 @@ public function hasTraits(): bool } /** - * Get a collection of constants entities + * Get a collection of constant entities * * @api * @@ -620,7 +620,7 @@ public function getConstants(): array * Check if a constant exists in a class * * @param string $constantName The name of the class whose entity you want to check - * @param bool $unsafe Check all constants, not just the constants allowed in the configuration + * @param bool $unsafe Check all constants, not just the constants allowed in the configuration (@see PhpHandlerSettings::getClassConstantEntityFilter()) * * @return bool The constant exists * @@ -643,7 +643,7 @@ public function hasConstant(string $constantName, bool $unsafe = false): bool * Get the method entity by its name * * @param string $constantName The name of the constant whose entity you want to get - * @param bool $unsafe Check all constants, not just the constants allowed in the configuration + * @param bool $unsafe Check all constants, not just the constants allowed in the configuration (@see PhpHandlerSettings::getClassConstantEntityFilter()) * * @api * @@ -674,7 +674,7 @@ public function getConstant(string $constantName, bool $unsafe = false): ?ClassC * @throws InvalidConfigurationParameterException * @throws NotFoundException */ - #[CacheableMethod] public function getConstantValue(string $constantName): string|array|int|bool|null|float + public function getConstantValue(string $constantName): string|array|int|bool|null|float { return $this->getConstant($constantName, true)->getValue(); } @@ -694,7 +694,7 @@ public function getConstant(string $constantName, bool $unsafe = false): ?ClassC * @throws InvalidConfigurationParameterException * @throws ConstExprEvaluationException */ - #[CacheableMethod] public function getConstantsValues( + public function getConstantsValues( bool $onlyFromCurrentClassAndTraits = false, int $flags = ClassConstantEntity::VISIBILITY_MODIFIERS_FLAG_ANY ): array { @@ -706,37 +706,175 @@ public function getConstant(string $constantName, bool $unsafe = false): ?ClassC } /** + * Get a list of all properties and classes where they are implemented + * + * @param bool $onlyFromCurrentClassAndTraits Get data only for properties from the current class + * @param int $flags Get data only for properties corresponding to the visibility modifiers passed in this value + * + * @return array + * + * @internal + * + * @throws InvalidConfigurationParameterException + */ + #[CacheableMethod] public function getPropertiesData( + bool $onlyFromCurrentClassAndTraits = false, + int $flags = PropertyEntity::VISIBILITY_MODIFIERS_FLAG_ANY + ): array { + if (!$this->isEntityDataCanBeLoaded()) { + return []; + } + $properties = []; + /** @var PropertyNode[] $propertyNodes */ + $propertyNodes = array_filter( + $this->getAst()->stmts, + static fn(Node\Stmt $stmt): bool => $stmt instanceof PropertyNode, + ); + array_walk($propertyNodes, fn(PropertyNode $stmt) => $stmt->flags = $stmt->flags ?: PropertyEntity::MODIFIERS_FLAG_IS_PUBLIC); + foreach ($propertyNodes as $node) { + if (($node->flags & $flags) === 0) { + continue; + } + foreach ($node->props as $propertyNode) { + $properties[$propertyNode->name->toString()] = $this->getName(); + } + } + + $flags &= ~ PropertyEntity::MODIFIERS_FLAG_IS_PRIVATE; + foreach ($this->getTraits() as $traitEntity) { + foreach ($traitEntity->getPropertiesData(true, $flags) as $name => $propertyData) { + if (!$traitEntity->isEntityDataCanBeLoaded()) { + continue; + } + if (array_key_exists($name, $properties)) { + continue; + } + $properties[$name] = $propertyData; + } + } + if (!$onlyFromCurrentClassAndTraits) { + foreach ($this->getParentClassEntities() as $parentClassEntity) { + if (!$parentClassEntity->isEntityDataCanBeLoaded()) { + continue; + } + foreach ($parentClassEntity->getPropertiesData(true, $flags) as $name => $propertyData) { + if (array_key_exists($name, $properties)) { + continue; + } + $properties[$name] = $propertyData; + } + } + } + return $properties; + } + + /** + * Get a collection of property entities + * + * @api + * + * @see PhpHandlerSettings::getPropertyEntityFilter() + * * @throws DependencyException * @throws InvalidConfigurationParameterException * @throws NotFoundException */ - public function getPropertyEntityCollection(): PropertyEntityCollection + public function getPropertyEntitiesCollection(): PropertyEntitiesCollection { $objectId = $this->getObjectId(); try { return $this->localObjectCache->getMethodCachedResult(__METHOD__, $objectId); } catch (ObjectNotFoundException) { } - $propertyEntityCollection = $this->diContainer->make(PropertyEntityCollection::class, [ + $propertyEntitiesCollection = $this->diContainer->make(PropertyEntitiesCollection::class, [ 'classEntity' => $this ]); - $propertyEntityCollection->loadPropertyEntities(); - $this->localObjectCache->cacheMethodResult(__METHOD__, $objectId, $propertyEntityCollection); - return $propertyEntityCollection; + $propertyEntitiesCollection->loadPropertyEntities(); + $this->localObjectCache->cacheMethodResult(__METHOD__, $objectId, $propertyEntitiesCollection); + return $propertyEntitiesCollection; } /** + * Get all properties that are available according to the configuration as an array + * + * @return PropertyEntity[] + * + * @api + * + * @see self::getPropertyEntitiesCollection() + * @see PhpHandlerSettings::getPropertyEntityFilter() + * + * @throws DependencyException + * @throws InvalidConfigurationParameterException * @throws NotFoundException + */ + public function getProperties(): array + { + $propertyEntitiesCollection = $this->getPropertyEntitiesCollection(); + return iterator_to_array($propertyEntitiesCollection); + } + + /** + * Check if a property exists in a class + * + * @param string $propertyName The name of the property whose entity you want to check + * @param bool $unsafe Check all properties, not just the properties allowed in the configuration (@see PhpHandlerSettings::getPropertyEntityFilter()) + * + * @return bool The property exists + * + * @api + * + * @throws DependencyException + * @throws InvalidConfigurationParameterException + * @throws NotFoundException + */ + public function hasProperty(string $propertyName, bool $unsafe = false): bool + { + $propertyEntitiesCollection = $this->getPropertyEntitiesCollection(); + if ($unsafe) { + return array_key_exists($propertyName, $this->getPropertiesData()); + } + return $propertyEntitiesCollection->has($propertyName); + } + + /** + * Get the property entity by its name + * + * @param string $propertyName The name of the property whose entity you want to get + * @param bool $unsafe Check all properties, not just the properties allowed in the configuration (@see PhpHandlerSettings::getPropertyEntityFilter()) + * + * @api + * * @throws DependencyException * @throws InvalidConfigurationParameterException + * @throws NotFoundException */ - public function getPropertyEntity(string $propertyName, bool $unsafe = true): ?PropertyEntity + public function getProperty(string $propertyName, bool $unsafe = false): ?PropertyEntity { - $propertyEntityCollection = $this->getPropertyEntityCollection(); + $propertyEntitiesCollection = $this->getPropertyEntitiesCollection(); if ($unsafe) { - return $propertyEntityCollection->unsafeGet($propertyName); + return $propertyEntitiesCollection->unsafeGet($propertyName); } - return $propertyEntityCollection->get($propertyName); + return $propertyEntitiesCollection->get($propertyName); + } + + /** + * Get the compiled value of a property + * + * @param string $propertyName The name of the property for which you need to get the value + * + * @return string|array|int|bool|float|null Compiled property value + * + * @api + * + * @throws ConstExprEvaluationException + * @throws DependencyException + * @throws InvalidConfigurationParameterException + * @throws NotFoundException + */ + public function getPropertyDefaultValue(string $propertyName): string|array|int|bool|null|float + { + return $this->getProperty($propertyName, true)->getDefaultValue(); } /** @@ -755,7 +893,7 @@ public function getFileContent(): string } /** - * Get a list of all methods available in the current class according to filters and the classes where they are implemented + * Get a list of all methods and classes where they are implemented * * @internal * @@ -830,7 +968,7 @@ public function getFileContent(): string } /** - * Get a collection of methods entities + * Get a collection of method entities * * @api * @@ -881,7 +1019,7 @@ public function getMethods(): array * @api * * @param string $methodName The name of the method whose entity you want to check - * @param bool $unsafe Check all methods, not just the methods allowed in the configuration + * @param bool $unsafe Check all methods, not just the methods allowed in the configuration (@see PhpHandlerSettings::getMethodEntityFilter()) * * @return bool The method exists * @@ -904,7 +1042,7 @@ public function hasMethod(string $methodName, bool $unsafe = false): bool * @api * * @param string $methodName The name of the method whose entity you want to get - * @param bool $unsafe Check all methods, not just the methods allowed in the configuration + * @param bool $unsafe Check all methods, not just the methods allowed in the configuration (@see PhpHandlerSettings::getMethodEntityFilter()) * * @throws DependencyException * @throws InvalidConfigurationParameterException @@ -919,68 +1057,6 @@ public function getMethod(string $methodName, bool $unsafe = false): ?MethodEnti return $methodEntitiesCollection->get($methodName); } - /** - * @throws InvalidConfigurationParameterException - */ - #[CacheableMethod] public function getPropertiesData( - bool $onlyFromCurrentClassAndTraits = false, - int $flags = PropertyEntity::VISIBILITY_MODIFIERS_FLAG_ANY - ): array { - if (!$this->isEntityDataCanBeLoaded()) { - return []; - } - $properties = []; - /** @var PropertyNode[] $propertyNodes */ - $propertyNodes = array_filter( - $this->getAst()->stmts, - static fn(Node\Stmt $stmt): bool => $stmt instanceof PropertyNode, - ); - array_walk($propertyNodes, fn(PropertyNode $stmt) => $stmt->flags = $stmt->flags ?: PropertyEntity::MODIFIERS_FLAG_IS_PUBLIC); - foreach ($propertyNodes as $node) { - if (($node->flags & $flags) === 0) { - continue; - } - foreach ($node->props as $propertyNode) { - $properties[$propertyNode->name->toString()] = $this->getName(); - } - } - - $flags &= ~ PropertyEntity::MODIFIERS_FLAG_IS_PRIVATE; - foreach ($this->getTraits() as $traitEntity) { - foreach ($traitEntity->getPropertiesData(true, $flags) as $name => $propertyData) { - if (!$traitEntity->isEntityDataCanBeLoaded()) { - continue; - } - if (array_key_exists($name, $properties)) { - continue; - } - $properties[$name] = $propertyData; - } - } - if (!$onlyFromCurrentClassAndTraits) { - foreach ($this->getParentClassEntities() as $parentClassEntity) { - if (!$parentClassEntity->isEntityDataCanBeLoaded()) { - continue; - } - foreach ($parentClassEntity->getPropertiesData(true, $flags) as $name => $propertyData) { - if (array_key_exists($name, $properties)) { - continue; - } - $properties[$name] = $propertyData; - } - } - } - return $properties; - } - - /** - * @throws InvalidConfigurationParameterException - */ - public function hasProperty(string $property): bool - { - return array_key_exists($property, $this->getPropertiesData()); - } - /** * @throws InvalidConfigurationParameterException */ @@ -1086,7 +1162,7 @@ public function cursorToDocAttributeLinkFragment(string $cursor, bool $isForDocu } $line = match ($prefix) { 'm' => $this->getMethod($attributeName, true)?->getStartLine(), - 'p' => $this->getPropertyEntity($attributeName)?->getStartLine(), + 'p' => $this->getProperty($attributeName, true)?->getStartLine(), 'q' => $this->getConstant($attributeName, true)?->getStartLine(), default => 0, }; diff --git a/src/LanguageHandler/Php/Parser/Entity/SubEntity/Property/PropertyEntityCollection.php b/src/LanguageHandler/Php/Parser/Entity/SubEntity/Property/PropertyEntitiesCollection.php similarity index 72% rename from src/LanguageHandler/Php/Parser/Entity/SubEntity/Property/PropertyEntityCollection.php rename to src/LanguageHandler/Php/Parser/Entity/SubEntity/Property/PropertyEntitiesCollection.php index 52f15425..61dd026d 100644 --- a/src/LanguageHandler/Php/Parser/Entity/SubEntity/Property/PropertyEntityCollection.php +++ b/src/LanguageHandler/Php/Parser/Entity/SubEntity/Property/PropertyEntitiesCollection.php @@ -12,7 +12,7 @@ use DI\DependencyException; use DI\NotFoundException; -final class PropertyEntityCollection extends BaseEntityCollection +final class PropertyEntitiesCollection extends BaseEntityCollection { public function __construct( private ClassLikeEntity $classEntity, @@ -22,6 +22,12 @@ public function __construct( } /** + * Load property entities into the collection according to the project configuration + * + * @internal + * + * @see PhpHandlerSettings::getPropertyEntityFilter() + * * @throws DependencyException * @throws InvalidConfigurationParameterException * @throws NotFoundException @@ -41,7 +47,15 @@ public function loadPropertyEntities(): void } } - public function add(PropertyEntity $propertyEntity, bool $reload = false): PropertyEntityCollection + /** + * Add an entity to a collection + * + * @api + * + * @param PropertyEntity $propertyEntity Entity to be added to the collection + * @param bool $reload Replace an entity with a new one if one has already been loaded previously + */ + public function add(PropertyEntity $propertyEntity, bool $reload = false): PropertyEntitiesCollection { $propertyName = $propertyEntity->getName(); if (!isset($this->entities[$propertyName]) || $reload) { @@ -50,12 +64,26 @@ public function add(PropertyEntity $propertyEntity, bool $reload = false): Prope return $this; } + /** + * Get the loaded property entity if it exists + * + * @api + * + * @param string $objectName Property entity name + */ public function get(string $objectName): ?PropertyEntity { return $this->entities[$objectName] ?? null; } /** + * Get the property entity if it exists. If the property exists but has not been loaded into the collection, a new entity object will be created + * + * @param string $objectName Property entity name + * + * @api + * + * @throws DependencyException * @throws NotFoundException * @throws InvalidConfigurationParameterException */ diff --git a/src/LanguageHandler/Php/Parser/Entity/SubEntity/Property/PropertyEntity.php b/src/LanguageHandler/Php/Parser/Entity/SubEntity/Property/PropertyEntity.php index dcbabf1a..06b1b2a7 100644 --- a/src/LanguageHandler/Php/Parser/Entity/SubEntity/Property/PropertyEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/SubEntity/Property/PropertyEntity.php @@ -53,15 +53,13 @@ class PropertyEntity extends BaseEntity self::MODIFIERS_FLAG_IS_PROTECTED | self::MODIFIERS_FLAG_IS_PRIVATE; - private ?Property $ast = null; private ?int $nodePosition = null; public function __construct( Configuration $configuration, private ClassLikeEntity $classEntity, - private ParserHelper $parserHelper, - private Standard $astPrinter, + ParserHelper $parserHelper, private LocalObjectCache $localObjectCache, private LoggerInterface $logger, private string $propertyName, @@ -81,6 +79,8 @@ public function getRootEntity(): ClassLikeEntity } /** + * @inheritDoc + * * @throws InvalidConfigurationParameterException */ public function getAst(): Property @@ -117,12 +117,17 @@ public function getAst(): Property return $this->ast; } + /** + * @inheritDoc + */ public function getRootEntityCollection(): PhpEntitiesCollection { return $this->getRootEntity()->getRootEntityCollection(); } /** + * @inheritDoc + * * @throws DependencyException * @throws NotFoundException * @throws InvalidConfigurationParameterException @@ -137,7 +142,7 @@ public function getDocCommentEntity(): PropertyEntity $docComment = $this->getDocComment(); $reflectionProperty = $this; if ($reflectionProperty->isImplementedInParentClass()) { - $reflectionProperty = $reflectionProperty->getImplementingClass()->getPropertyEntity($this->getName()); + $reflectionProperty = $reflectionProperty->getImplementingClass()->getProperty($this->getName(), true); } if (!$docComment || str_contains(mb_strtolower($docComment), '@inheritdoc')) { @@ -145,12 +150,12 @@ public function getDocCommentEntity(): PropertyEntity $parentClass = $this->getImplementingClass()->getParentClass(); $propertyName = $this->getName(); if ($parentClass && $parentClass->isEntityDataCanBeLoaded() && $parentClass->hasProperty($propertyName)) { - $parentReflectionProperty = $parentClass->getPropertyEntity($propertyName); + $parentReflectionProperty = $parentClass->getProperty($propertyName, true); $reflectionProperty = $parentReflectionProperty->getDocCommentEntity(); } else { foreach ($implementingClass->getInterfacesEntities() as $interface) { if ($interface->isEntityDataCanBeLoaded() && $interface->hasProperty($propertyName)) { - $reflectionProperty = $interface->getPropertyEntity($propertyName); + $reflectionProperty = $interface->getProperty($propertyName, true); break; } } @@ -160,32 +165,53 @@ public function getDocCommentEntity(): PropertyEntity return $reflectionProperty; } + /** + * @inheritDoc + */ public function getName(): string { return $this->propertyName; } + /** + * @inheritDoc + */ public function getShortName(): string { return $this->getName(); } + /** + * Namespace of the class that contains this property + * + * @api + */ public function getNamespaceName(): string { return $this->getRootEntity()->getNamespaceName(); } + /** + * Get the name of the class in which this property is implemented + * + * @api + */ public function getImplementingClassName(): string { return $this->implementingClassName; } + /** + * @inheritDoc + */ public function getImplementingClass(): ClassLikeEntity { return $this->getRootEntityCollection()->getLoadedOrCreateNew($this->getImplementingClassName()); } /** + * @inheritDoc + * * @throws InvalidConfigurationParameterException */ public function getRelativeFileName(): ?string @@ -194,6 +220,10 @@ public function getRelativeFileName(): ?string } /** + * Get current property type + * + * @api + * * @throws NotFoundException * @throws DependencyException * @throws InvalidConfigurationParameterException @@ -202,7 +232,8 @@ public function getRelativeFileName(): ?string { $type = $this->getAst()->type; if ($type) { - $typeString = $this->astPrinter->prettyPrint([$type]); + $astPrinter = new Standard(); + $typeString = $astPrinter->prettyPrint([$type]); $typeString = str_replace('?', 'null|', $typeString); } else { $typeString = 'mixed'; @@ -223,6 +254,10 @@ public function getRelativeFileName(): ?string } /** + * Get a text representation of property modifiers + * + * @api + * * @throws DependencyException * @throws NotFoundException * @throws InvalidConfigurationParameterException @@ -248,12 +283,21 @@ public function getRelativeFileName(): ?string return implode(' ', $modifiersString); } + /** + * Check if this property is implemented in the parent class + * + * @api + */ public function isImplementedInParentClass(): bool { return $this->getImplementingClassName() !== $this->classEntity->getName(); } /** + * Check if a property is a public property + * + * @api + * * @throws InvalidConfigurationParameterException */ #[CacheableMethod] public function isPublic(): bool @@ -262,6 +306,10 @@ public function isImplementedInParentClass(): bool } /** + * Check if a protected is a public protected + * + * @api + * * @throws InvalidConfigurationParameterException */ #[CacheableMethod] public function isProtected(): bool @@ -270,6 +318,10 @@ public function isImplementedInParentClass(): bool } /** + * Check if a private is a public private + * + * @api + * * @throws InvalidConfigurationParameterException */ #[CacheableMethod] public function isPrivate(): bool @@ -278,6 +330,8 @@ public function isImplementedInParentClass(): bool } /** + * @inheritDoc + * * @throws InvalidConfigurationParameterException */ #[CacheableMethod] public function getStartLine(): int @@ -289,6 +343,10 @@ public function isImplementedInParentClass(): bool } /** + * Get the line number of the end of a property's code in a file + * + * @api + * * @throws InvalidConfigurationParameterException */ #[CacheableMethod] public function getEndLine(): int @@ -300,6 +358,12 @@ public function isImplementedInParentClass(): bool } /** + * Get the compiled default value of a property + * + * @api + * + * @return string|array|int|bool|null|float Compiled property default value + * * @throws ConstExprEvaluationException * @throws InvalidConfigurationParameterException */ diff --git a/src/LanguageHandler/Php/Parser/PhpParser/NodeValueCompiler.php b/src/LanguageHandler/Php/Parser/PhpParser/NodeValueCompiler.php index 67c16e19..db038ea3 100644 --- a/src/LanguageHandler/Php/Parser/PhpParser/NodeValueCompiler.php +++ b/src/LanguageHandler/Php/Parser/PhpParser/NodeValueCompiler.php @@ -126,7 +126,7 @@ private static function getStaticPropertyValue( if (!$entity->isEntityDataCanBeLoaded()) { throw new \RuntimeException('Entity cannot be loaded'); } - return $entity->getPropertyEntity($node->name->toString())->getDefaultValue(); + return $entity->getPropertyDefaultValue($node->name->toString()); } /** diff --git a/src/LanguageHandler/Php/Renderer/EntityDocRenderer/PhpClassToMd/templates/_properties.md.twig b/src/LanguageHandler/Php/Renderer/EntityDocRenderer/PhpClassToMd/templates/_properties.md.twig index 47084b92..50cee9ca 100644 --- a/src/LanguageHandler/Php/Renderer/EntityDocRenderer/PhpClassToMd/templates/_properties.md.twig +++ b/src/LanguageHandler/Php/Renderer/EntityDocRenderer/PhpClassToMd/templates/_properties.md.twig @@ -1,8 +1,8 @@ -{% if not classEntity.getPropertyEntityCollection().isEmpty() %} +{% if not classEntity.getPropertyEntitiesCollection().isEmpty() %}

            Properties:

              - {% for propertyEntity in classEntity.getPropertyEntityCollection() %} + {% for propertyEntity in classEntity.getPropertyEntitiesCollection() %}
            1. {{ propertyEntity.getName() }} {% if propertyEntity.getDescription() %}- {{ propertyEntity.getDescription() | removeLineBrakes }}{% endif %}
            2. diff --git a/src/LanguageHandler/Php/Renderer/EntityDocRenderer/PhpClassToMd/templates/_property_details.md.twig b/src/LanguageHandler/Php/Renderer/EntityDocRenderer/PhpClassToMd/templates/_property_details.md.twig index 8542e0a9..2ad9272a 100644 --- a/src/LanguageHandler/Php/Renderer/EntityDocRenderer/PhpClassToMd/templates/_property_details.md.twig +++ b/src/LanguageHandler/Php/Renderer/EntityDocRenderer/PhpClassToMd/templates/_property_details.md.twig @@ -1,7 +1,7 @@ -{% if not classEntity.getPropertyEntityCollection().isEmpty() %} +{% if not classEntity.getPropertyEntitiesCollection().isEmpty() %}

              Property details:

              -{% for propertyEntity in classEntity.getPropertyEntityCollection() %} +{% for propertyEntity in classEntity.getPropertyEntitiesCollection() %} * # ${{ propertyEntity.getName() }} From 1d5494d6f070cd32358fc742687ae5210c06edfa Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Thu, 23 Nov 2023 00:50:24 +0300 Subject: [PATCH 097/210] Adding dock blocks --- .../Entity/Cache/CacheableEntityTrait.php | 19 ++ .../Php/Parser/Entity/BaseEntity.php | 2 +- .../Php/Parser/Entity/ClassEntity.php | 15 +- .../Php/Parser/Entity/ClassLikeEntity.php | 256 ++++++++++++++---- .../Php/Parser/Entity/EnumEntity.php | 17 ++ .../Php/Parser/Entity/InterfaceEntity.php | 12 + .../Php/Parser/Entity/TraitEntity.php | 12 + 7 files changed, 280 insertions(+), 53 deletions(-) diff --git a/src/Core/Parser/Entity/Cache/CacheableEntityTrait.php b/src/Core/Parser/Entity/Cache/CacheableEntityTrait.php index 8991314b..2af3d2cf 100644 --- a/src/Core/Parser/Entity/Cache/CacheableEntityTrait.php +++ b/src/Core/Parser/Entity/Cache/CacheableEntityTrait.php @@ -17,6 +17,9 @@ trait CacheableEntityTrait private string $entityCacheKey = ''; private bool $isCacheChanged = false; + /** + * @internal + */ public function getCacheKey(): string { if (!$this->entityCacheKey) { @@ -29,9 +32,14 @@ public function getCacheKey(): string return $this->entityCacheKey; } + /** + * @internal + */ abstract public function isEntityCacheOutdated(): bool; /** + * @internal + * * @throws InvalidArgumentException */ protected function getEntityCacheValue(string $key): mixed @@ -40,6 +48,8 @@ protected function getEntityCacheValue(string $key): mixed } /** + * @internal + * * @throws InvalidArgumentException */ protected function hasEntityCacheValue(string $key): bool @@ -49,6 +59,8 @@ protected function hasEntityCacheValue(string $key): bool } /** + * @internal + * * @throws InvalidArgumentException */ protected function addEntityValueToCache(string $key, mixed $value, int $cacheExpiresAfter = 604800): void @@ -62,6 +74,9 @@ protected function addEntityValueToCache(string $key, mixed $value, int $cacheEx ); } + /** + * @internal + */ public function removeEntityValueFromCache(string $key): void { $this->isCacheChanged = true; @@ -72,6 +87,8 @@ public function removeEntityValueFromCache(string $key): void } /** + * @internal + * * @throws InvalidArgumentException */ public function isEntityDataCacheOutdated(): bool @@ -92,6 +109,8 @@ public function isEntityDataCacheOutdated(): bool } /** + * @internal + * * @throws InvalidArgumentException */ public function removeNotUsedEntityDataCache(): void diff --git a/src/LanguageHandler/Php/Parser/Entity/BaseEntity.php b/src/LanguageHandler/Php/Parser/Entity/BaseEntity.php index 00f308db..2cd5ed71 100644 --- a/src/LanguageHandler/Php/Parser/Entity/BaseEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/BaseEntity.php @@ -683,7 +683,7 @@ private function isSubEntityFileCacheIsOutdated(string $dependenciesCacheKey): b return false; } $implementingClass = $this->getImplementingClass(); - $relativeFileName = $implementingClass->getRelativeFileName(false); + $relativeFileName = $implementingClass->getRelativeFileName(); if (!isset($dependenciesChecks[$relativeFileName])) { $dependenciesChecks[$relativeFileName] = true; $cachedEntityDependencies = $this->getCachedEntityDependencies(); diff --git a/src/LanguageHandler/Php/Parser/Entity/ClassEntity.php b/src/LanguageHandler/Php/Parser/Entity/ClassEntity.php index a989e28a..affb485e 100644 --- a/src/LanguageHandler/Php/Parser/Entity/ClassEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/ClassEntity.php @@ -14,12 +14,17 @@ */ class ClassEntity extends ClassLikeEntity { + /** + * @inheritDoc + */ public function isClass(): bool { return true; } /** + * @inheritDoc + * * @throws InvalidConfigurationParameterException */ #[CacheableMethod] public function isInstantiable(): bool @@ -31,6 +36,8 @@ public function isClass(): bool } /** + * @inheritDoc + * * @throws InvalidConfigurationParameterException */ #[CacheableMethod] public function isAbstract(): bool @@ -39,7 +46,7 @@ public function isClass(): bool } /** - * @return string[] + * @inheritDoc * * @throws InvalidConfigurationParameterException */ @@ -60,6 +67,8 @@ public function isClass(): bool } /** + * @inheritDoc + * * @throws InvalidConfigurationParameterException */ #[CacheableMethod] public function getParentClassName(): ?string @@ -74,6 +83,8 @@ public function isClass(): bool } /** + * @inheritDoc + * * @throws InvalidConfigurationParameterException */ public function getParentClass(): ?ClassLikeEntity @@ -86,6 +97,8 @@ public function getParentClass(): ?ClassLikeEntity } /** + * @inheritDoc + * * @throws InvalidConfigurationParameterException */ #[CacheableMethod] public function getModifiersString(): string diff --git a/src/LanguageHandler/Php/Parser/Entity/ClassLikeEntity.php b/src/LanguageHandler/Php/Parser/Entity/ClassLikeEntity.php index d9443a1c..47547fd0 100644 --- a/src/LanguageHandler/Php/Parser/Entity/ClassLikeEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/ClassLikeEntity.php @@ -21,7 +21,6 @@ use BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntity; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntitiesCollection; use BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper; -use BumbleDocGen\LanguageHandler\Php\Parser\PhpParser\NodeValueCompiler; use BumbleDocGen\LanguageHandler\Php\Parser\PhpParser\PhpParserHelper; use BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings; use DI\Attribute\Inject; @@ -73,48 +72,88 @@ public function __construct( } } + /** + * Get entity modifiers as a string + */ + abstract public function getModifiersString(): string; + + /** + * Check if the name is a valid name for ClassLikeEntity + */ public static function isEntityNameValid(string $entityName): bool { return ParserHelper::isCorrectClassName($entityName); } + /** + * Check if an entity is a Class + * + * @api + */ public function isClass(): bool { return false; } + /** + * Check if an entity is an Interface + * + * @api + */ public function isInterface(): bool { return false; } + /** + * Check if an entity is a Trait + * + * @api + */ public function isTrait(): bool { return false; } + /** + * Check if an entity is an Enum + * + * @api + */ public function isEnum(): bool { return false; } + /** + * @inheritDoc + */ public function getObjectId(): string { return $this->className; } + /** + * Check if a given entity is an entity from a third party library (connected via composer) + * + * @internal + */ public function isExternalLibraryEntity(): bool { return !is_null($this->composerHelper->getComposerPackageDataByClassName($this->getName())); } + /** + * @inheritDoc + */ final public function getRootEntityCollection(): PhpEntitiesCollection { return $this->entitiesCollection; } /** - * {@inheritDoc} + * @inheritDoc + * * @throws InvalidConfigurationParameterException * @throws \Exception */ @@ -149,6 +188,8 @@ function (string $className): bool { /** * Checking if class file is in git repository + * + * @internal */ final public function isInGit(): bool { @@ -165,19 +206,23 @@ final public function isInGit(): bool } /** + * @internal + * * @throws InvalidConfigurationParameterException */ - public function isDocumentCreationAllowed(): bool + final public function isDocumentCreationAllowed(): bool { return !$this->configuration->isCheckFileInGitBeforeCreatingDocEnabled() || $this->isInGit(); } /** + * @inheritDoc + * * @throws NotFoundException * @throws DependencyException * @throws InvalidConfigurationParameterException */ - public function getDocCommentEntity(): ClassLikeEntity + final public function getDocCommentEntity(): ClassLikeEntity { $objectId = $this->getObjectId(); try { @@ -196,16 +241,25 @@ public function getDocCommentEntity(): ClassLikeEntity return $classEntity; } + /** + * @internal + */ final public function loadPluginData(string $pluginKey, array $data): void { $this->pluginsData[$pluginKey] = $data; } + /** + * @internal + */ final public function getPluginData(string $pluginKey): ?array { return $this->pluginsData[$pluginKey] ?? null; } + /** + * @internal + */ final public function setCustomAst(TraitNode|EnumNode|InterfaceNode|ClassNode|null $customAst): void { $objectId = $this->getObjectId(); @@ -213,6 +267,8 @@ final public function setCustomAst(TraitNode|EnumNode|InterfaceNode|ClassNode|nu $this->localObjectCache->cacheMethodResult(__CLASS__ . '::getAst', $objectId, $customAst); } /** + * @inheritDoc + * * @throws \RuntimeException * @throws InvalidConfigurationParameterException */ @@ -260,20 +316,10 @@ final public function getAst(): ClassNode|InterfaceNode|TraitNode|EnumNode return $ast; } - public function getImplementingClass(): ClassLikeEntity - { - return $this; - } - - public function getName(): string - { - return $this->className; - } - /** * @internal */ - public function isClassLoad(): bool + final public function isClassLoad(): bool { if (!$this->isClassLoad) { try { @@ -297,13 +343,37 @@ public function isClassLoad(): bool return !$this->isExternalLibraryEntity() && $this->isEntityFileCanBeLoad(); } - public function getShortName(): string + /** + * @inheritDoc + */ + final public function getImplementingClass(): ClassLikeEntity + { + return $this; + } + + /** + * @inheritDoc + */ + final public function getName(): string + { + return $this->className; + } + + /** + * @inheritDoc + */ + final public function getShortName(): string { $nameParts = explode('\\', $this->getName()); return end($nameParts); } - #[CacheableMethod] public function getNamespaceName(): string + /** + * Get the entity namespace name + * + * @api + */ + final public function getNamespaceName(): string { $namespaceParts = explode('\\', $this->getName()); if (count($namespaceParts) < 2) { @@ -314,11 +384,13 @@ public function getShortName(): string } /** + * @inheritDoc + * * @throws InvalidConfigurationParameterException */ - public function getRelativeFileName(bool $loadIfEmpty = true): ?string + public function getRelativeFileName(): ?string { - if (!$this->relativeFileNameLoaded && $loadIfEmpty) { + if (!$this->relativeFileNameLoaded) { $this->relativeFileNameLoaded = true; $fileName = $this->composerHelper->getComposerClassLoader()->findFile($this->getName()); $projectRoot = $this->configuration->getProjectRoot(); @@ -334,17 +406,31 @@ public function getRelativeFileName(bool $loadIfEmpty = true): ?string return $this->relativeFileName; } + /** + * Check that an entity is instantiable + * + * @api + */ public function isInstantiable(): bool { return false; } + /** + * Check that an entity is abstract + * + * @api + */ public function isAbstract(): bool { return false; } /** + * Get the line number of the start of a class code in a file + * + * @api + * * @throws InvalidConfigurationParameterException */ #[CacheableMethod] public function getStartLine(): int @@ -353,6 +439,10 @@ public function isAbstract(): bool } /** + * Get the line number of the end of a class code in a file + * + * @api + * * @throws InvalidConfigurationParameterException */ #[CacheableMethod] public function getEndLine(): int @@ -361,40 +451,23 @@ public function isAbstract(): bool } /** - * @return ClassLikeEntity[] $trait - * @throws InvalidConfigurationParameterException - */ - public function getTraits(): array - { - $traits = []; - foreach ($this->getTraitsNames() as $traitsName) { - $traits[] = $this->entitiesCollection->getLoadedOrCreateNew($traitsName); - } - return $traits; - } - - /** - * @return ClassLikeEntity[] + * Get a list of entity names of parent classes * - * @throws InvalidConfigurationParameterException + * @api + * + * @return string[] */ - public function getInterfacesEntities(): array - { - $interfacesEntities = []; - foreach ($this->getInterfaceNames() as $interfaceClassName) { - $interfacesEntities[] = $this->getRootEntityCollection()->getLoadedOrCreateNew($interfaceClassName); - } - return $interfacesEntities; - } - public function getParentClassNames(): array { return []; } /** + * Get a list of parent class entities + * + * @api + * * @return ClassLikeEntity[] - * @throws InvalidConfigurationParameterException */ public function getParentClassEntities(): array { @@ -405,8 +478,32 @@ public function getParentClassEntities(): array } /** + * Get the name of the parent class entity if it exists + * + * @api + */ + public function getParentClassName(): ?string + { + return null; + } + + /** + * Get the entity of the parent class if it exists + * + * @api + */ + public function getParentClass(): ?ClassLikeEntity + { + return null; + } + + /** + * Get a list of class interface names + * * @return string[] * + * @api + * * @throws InvalidConfigurationParameterException */ #[CacheableMethod] public function getInterfaceNames(): array @@ -457,17 +554,31 @@ public function getParentClassEntities(): array return $interfaceNames; } - public function getParentClassName(): ?string - { - return null; - } - - public function getParentClass(): ?ClassLikeEntity + /** + * Get a list of interface entities that the current class implements + * + * @return InterfaceEntity[] + * + * @api + * + * @throws InvalidConfigurationParameterException + */ + public function getInterfacesEntities(): array { - return null; + $interfacesEntities = []; + foreach ($this->getInterfaceNames() as $interfaceClassName) { + $interfacesEntities[] = $this->getRootEntityCollection()->getLoadedOrCreateNew($interfaceClassName); + } + return $interfacesEntities; } /** + * Get a list of class traits names + * + * @api + * + * @return string[] + * * @throws InvalidConfigurationParameterException */ #[CacheableMethod] public function getTraitsNames(): array @@ -487,6 +598,28 @@ public function getParentClass(): ?ClassLikeEntity } /** + * Get a list of trait entities of the current class + * + * @api + * + * @return TraitEntity[] + * + * @throws InvalidConfigurationParameterException + */ + public function getTraits(): array + { + $traits = []; + foreach ($this->getTraitsNames() as $traitsName) { + $traits[] = $this->entitiesCollection->getLoadedOrCreateNew($traitsName); + } + return $traits; + } + + /** + * Check if the class contains traits + * + * @api + * * @throws InvalidConfigurationParameterException */ public function hasTraits(): bool @@ -1058,7 +1191,11 @@ public function getMethod(string $methodName, bool $unsafe = false): ?MethodEnti } /** + * Whether the given class is a subclass of the specified class + * * @throws InvalidConfigurationParameterException + * + * @api */ public function isSubclassOf(string $className): bool { @@ -1074,7 +1211,13 @@ public function isSubclassOf(string $className): bool } /** + * Check if a class implements an interface + * + * @param string $interfaceName Name of the required interface in the interface chain + * * @throws InvalidConfigurationParameterException + * + * @api */ public function implementsInterface(string $interfaceName): bool { @@ -1086,6 +1229,13 @@ public function implementsInterface(string $interfaceName): bool return in_array($interfaceName, $interfaces); } + /** + * Check if a certain parent class exists in a chain of parent classes + * + * @param string $parentClassName Searched parent class + * + * @api + */ public function hasParentClass(string $parentClassName): bool { $parentClassName = ltrim(str_replace('\\\\', '\\', $parentClassName), '\\'); @@ -1097,6 +1247,8 @@ public function hasParentClass(string $parentClassName): bool } /** + * @internal + * * @throws InvalidConfigurationParameterException * @throws \Exception */ @@ -1118,6 +1270,8 @@ public function getDocRender(): EntityDocRendererInterface } /** + * @internal + * * @throws DependencyException * @throws NotFoundException * @throws InvalidConfigurationParameterException diff --git a/src/LanguageHandler/Php/Parser/Entity/EnumEntity.php b/src/LanguageHandler/Php/Parser/Entity/EnumEntity.php index 3c73a5e3..b06680ba 100644 --- a/src/LanguageHandler/Php/Parser/Entity/EnumEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/EnumEntity.php @@ -18,17 +18,25 @@ */ class EnumEntity extends ClassLikeEntity { + /** + * @inheritDoc + */ public function isEnum(): bool { return true; } + /** + * @inheritDoc + */ public function getInterfaceNames(): array { return []; } /** + * Get enum cases values + * * @throws InvalidConfigurationParameterException * @throws ConstExprEvaluationException */ @@ -52,6 +60,10 @@ public function getInterfaceNames(): array } /** + * Get enum cases names + * + * @return string[] + * * @throws InvalidConfigurationParameterException * @throws ConstExprEvaluationException */ @@ -61,6 +73,8 @@ public function getCasesNames(): array } /** + * Get enum case value + * * @throws InvalidConfigurationParameterException * @throws ConstExprEvaluationException */ @@ -69,6 +83,9 @@ public function getEnumCaseValue(string $name): mixed return $this->getEnumCases()[$name] ?? null; } + /** + * @inheritDoc + */ public function getModifiersString(): string { return 'enum'; diff --git a/src/LanguageHandler/Php/Parser/Entity/InterfaceEntity.php b/src/LanguageHandler/Php/Parser/Entity/InterfaceEntity.php index 4ab77841..29bb8028 100644 --- a/src/LanguageHandler/Php/Parser/Entity/InterfaceEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/InterfaceEntity.php @@ -11,21 +11,33 @@ */ class InterfaceEntity extends ClassLikeEntity { + /** + * @inheritDoc + */ public function isInterface(): bool { return true; } + /** + * @inheritDoc + */ public function isAbstract(): bool { return true; } + /** + * @inheritDoc + */ public function getModifiersString(): string { return 'interface'; } + /** + * @inheritDoc + */ public function getTraitsNames(): array { return []; diff --git a/src/LanguageHandler/Php/Parser/Entity/TraitEntity.php b/src/LanguageHandler/Php/Parser/Entity/TraitEntity.php index d845e3c4..7ccfed07 100644 --- a/src/LanguageHandler/Php/Parser/Entity/TraitEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/TraitEntity.php @@ -11,21 +11,33 @@ */ class TraitEntity extends ClassLikeEntity { + /** + * @inheritDoc + */ public function isTrait(): bool { return true; } + /** + * @inheritDoc + */ public function getInterfaceNames(): array { return []; } + /** + * @inheritDoc + */ public function getModifiersString(): string { return 'trait'; } + /** + * @inheritDoc + */ public function isSubclassOf(string $className): bool { // traits have no parent classes or interfaces From 671da5c1a79b80013b7ed047260950a9ce43936b Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Thu, 23 Nov 2023 00:50:36 +0300 Subject: [PATCH 098/210] Removing old code --- .../Php/Parser/ParserHelper.php | 65 +++++++++---------- 1 file changed, 30 insertions(+), 35 deletions(-) diff --git a/src/LanguageHandler/Php/Parser/ParserHelper.php b/src/LanguageHandler/Php/Parser/ParserHelper.php index 07f5ad67..e4c022a5 100644 --- a/src/LanguageHandler/Php/Parser/ParserHelper.php +++ b/src/LanguageHandler/Php/Parser/ParserHelper.php @@ -159,21 +159,6 @@ public function __construct( ) { } - public static function getBuiltInClassNames(): array - { - static $classNames = []; - if (!$classNames) { - $builtInClassNames = array_merge(self::$predefinedClassesInterfaces, get_declared_classes()); - foreach ($builtInClassNames as $className) { - if (str_starts_with(ltrim($className, '\\'), 'Composer')) { - break; - } - $classNames[$className] = $className; - } - } - return $classNames; - } - public static function isBuiltInClass(string $className): bool { $className = ltrim(str_replace('\\\\', '\\', $className), '\\'); @@ -190,20 +175,15 @@ public static function isBuiltInType(string $name): bool return false; } - private static function checkIsClassName(string $name): bool - { - return (bool)preg_match( - '/^(?=_*[A-z]+)[A-z0-9]+$/', - $name - ); - } - public static function isCorrectClassName(string $className, bool $checkBuiltIns = true): bool { if (self::isBuiltInType($className) || ($checkBuiltIns && self::isBuiltInClass($className))) { return false; } - return self::checkIsClassName($className); + return (bool)preg_match( + '/^(?=_*[A-z]+)[A-z0-9]+$/', + $className + ); } /** @@ -320,17 +300,6 @@ public function getFilesInGit(): array return $gitFiles; } - private function getDocBlockFactory(): DocBlockFactory - { - try { - return $this->localObjectCache->getMethodCachedResult(__METHOD__, ''); - } catch (ObjectNotFoundException) { - } - $docBlockFactory = DocBlockFactory::createInstance(); - $this->localObjectCache->cacheMethodResult(__METHOD__, '', $docBlockFactory); - return $docBlockFactory; - } - /** * @throws InvalidConfigurationParameterException */ @@ -400,4 +369,30 @@ public function getDocBlockContext(ClassLikeEntity $classEntity): Context $this->localObjectCache->cacheMethodResult(__METHOD__, $classEntity->getName(), $context); return $context; } + + private static function getBuiltInClassNames(): array + { + static $classNames = []; + if (!$classNames) { + $builtInClassNames = array_merge(self::$predefinedClassesInterfaces, get_declared_classes()); + foreach ($builtInClassNames as $className) { + if (str_starts_with(ltrim($className, '\\'), 'Composer')) { + break; + } + $classNames[$className] = $className; + } + } + return $classNames; + } + + private function getDocBlockFactory(): DocBlockFactory + { + try { + return $this->localObjectCache->getMethodCachedResult(__METHOD__, ''); + } catch (ObjectNotFoundException) { + } + $docBlockFactory = DocBlockFactory::createInstance(); + $this->localObjectCache->cacheMethodResult(__METHOD__, '', $docBlockFactory); + return $docBlockFactory; + } } From 39ae3c00c11689d28fae3c9c0967b4aff50327e2 Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Thu, 23 Nov 2023 12:42:50 +0300 Subject: [PATCH 099/210] Adding class name normalizer --- .../Parser/Entity/RootEntityInterface.php | 2 ++ src/DocGenerator.php | 1 - .../Cache/CacheablePhpEntityFactory.php | 4 ++-- .../Php/Parser/Entity/ClassLikeEntity.php | 23 +++++++++++++------ .../Parser/Entity/PhpEntitiesCollection.php | 2 +- .../Php/Parser/ParserHelper.php | 2 +- 6 files changed, 22 insertions(+), 12 deletions(-) diff --git a/src/Core/Parser/Entity/RootEntityInterface.php b/src/Core/Parser/Entity/RootEntityInterface.php index ab557beb..0ef42a80 100644 --- a/src/Core/Parser/Entity/RootEntityInterface.php +++ b/src/Core/Parser/Entity/RootEntityInterface.php @@ -10,6 +10,8 @@ */ interface RootEntityInterface extends EntityInterface { + public static function normalizeClassName(string $name): string; + /** * Check if entity name is valid */ diff --git a/src/DocGenerator.php b/src/DocGenerator.php index 854e3ece..6c8b234b 100644 --- a/src/DocGenerator.php +++ b/src/DocGenerator.php @@ -11,7 +11,6 @@ use BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException; use BumbleDocGen\Core\Logger\Handler\GenerationErrorsHandler; use BumbleDocGen\Core\Parser\Entity\RootEntityCollectionsGroup; -use BumbleDocGen\Core\Parser\Entity\RootEntityInterface; use BumbleDocGen\Core\Parser\ProjectParser; use BumbleDocGen\Core\Plugin\PluginEventDispatcher; use BumbleDocGen\Core\Renderer\Renderer; diff --git a/src/LanguageHandler/Php/Parser/Entity/Cache/CacheablePhpEntityFactory.php b/src/LanguageHandler/Php/Parser/Entity/Cache/CacheablePhpEntityFactory.php index 1bdf4980..3a2932d9 100644 --- a/src/LanguageHandler/Php/Parser/Entity/Cache/CacheablePhpEntityFactory.php +++ b/src/LanguageHandler/Php/Parser/Entity/Cache/CacheablePhpEntityFactory.php @@ -140,7 +140,7 @@ public function createClassLikeEntity( string $className, ?string $relativeFileName = null ): ClassLikeEntity { - $className = ltrim(str_replace('\\\\', '\\', $className), '\\'); + $className = ClassLikeEntity::normalizeClassName($className); $objectId = md5($className); try { return $this->localObjectCache->getMethodCachedResult(__METHOD__, $objectId); @@ -190,7 +190,7 @@ public function createSubClassEntity( 'The class must inherit from `' . ClassEntity::class . '`' ); } - $className = ltrim(str_replace('\\\\', '\\', $className), '\\'); + $className = ClassLikeEntity::normalizeClassName($className); $objectId = md5($className); try { return $this->localObjectCache->getMethodCachedResult(__METHOD__, $objectId); diff --git a/src/LanguageHandler/Php/Parser/Entity/ClassLikeEntity.php b/src/LanguageHandler/Php/Parser/Entity/ClassLikeEntity.php index 47547fd0..6fd549a6 100644 --- a/src/LanguageHandler/Php/Parser/Entity/ClassLikeEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/ClassLikeEntity.php @@ -61,15 +61,17 @@ public function __construct( private string $className, private ?string $relativeFileName, ) { + $this->className = self::normalizeClassName($this->className); + if ($relativeFileName) { + $this->relativeFileNameLoaded = true; + } + parent::__construct( $configuration, $localObjectCache, $parserHelper, $logger ); - if ($relativeFileName) { - $this->relativeFileNameLoaded = true; - } } /** @@ -85,6 +87,14 @@ public static function isEntityNameValid(string $entityName): bool return ParserHelper::isCorrectClassName($entityName); } + /** + * @api + */ + final public static function normalizeClassName(string $name): string + { + return ltrim(str_replace('\\\\', '\\', $name), '\\'); + } + /** * Check if an entity is a Class * @@ -1199,8 +1209,7 @@ public function getMethod(string $methodName, bool $unsafe = false): ?MethodEnti */ public function isSubclassOf(string $className): bool { - $className = ltrim(str_replace('\\\\', '\\', $className), '\\'); - + $className = ClassLikeEntity::normalizeClassName($className); $parentClassNames = $this->getParentClassNames(); $interfacesNames = $this->getInterfaceNames(); $allClasses = array_map( @@ -1221,7 +1230,7 @@ public function isSubclassOf(string $className): bool */ public function implementsInterface(string $interfaceName): bool { - $interfaceName = ltrim(str_replace('\\\\', '\\', $interfaceName), '\\'); + $interfaceName = ClassLikeEntity::normalizeClassName($interfaceName); $interfaces = array_map( fn($interface) => ltrim($interface, '\\'), $this->getInterfaceNames() @@ -1238,7 +1247,7 @@ public function implementsInterface(string $interfaceName): bool */ public function hasParentClass(string $parentClassName): bool { - $parentClassName = ltrim(str_replace('\\\\', '\\', $parentClassName), '\\'); + $parentClassName = ClassLikeEntity::normalizeClassName($parentClassName); $parentClassNames = array_map( fn($interface) => ltrim($interface, '\\'), $this->getParentClassNames() diff --git a/src/LanguageHandler/Php/Parser/Entity/PhpEntitiesCollection.php b/src/LanguageHandler/Php/Parser/Entity/PhpEntitiesCollection.php index bb764dba..8e10323f 100644 --- a/src/LanguageHandler/Php/Parser/Entity/PhpEntitiesCollection.php +++ b/src/LanguageHandler/Php/Parser/Entity/PhpEntitiesCollection.php @@ -163,7 +163,7 @@ public function add(ClassLikeEntity $classEntity, bool $reload = false): PhpEnti protected function prepareObjectName(string $objectName): string { - return ltrim(str_replace('\\\\', '\\', $objectName), '\\'); + return ClassLikeEntity::normalizeClassName($objectName); } /** diff --git a/src/LanguageHandler/Php/Parser/ParserHelper.php b/src/LanguageHandler/Php/Parser/ParserHelper.php index e4c022a5..2533a74c 100644 --- a/src/LanguageHandler/Php/Parser/ParserHelper.php +++ b/src/LanguageHandler/Php/Parser/ParserHelper.php @@ -161,7 +161,7 @@ public function __construct( public static function isBuiltInClass(string $className): bool { - $className = ltrim(str_replace('\\\\', '\\', $className), '\\'); + $className = ClassLikeEntity::normalizeClassName($className); return array_key_exists($className, self::getBuiltInClassNames()); } From 69e4253667b17e45833a4ff96955e26039896994 Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Thu, 23 Nov 2023 17:26:49 +0300 Subject: [PATCH 100/210] Using class name normalizer --- .../Php/Parser/Entity/ClassEntity.php | 7 ++-- .../Php/Parser/Entity/ClassLikeEntity.php | 19 +++-------- .../Parser/Entity/PhpEntitiesCollection.php | 33 +++++-------------- 3 files changed, 15 insertions(+), 44 deletions(-) diff --git a/src/LanguageHandler/Php/Parser/Entity/ClassEntity.php b/src/LanguageHandler/Php/Parser/Entity/ClassEntity.php index affb485e..6fbaec65 100644 --- a/src/LanguageHandler/Php/Parser/Entity/ClassEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/ClassEntity.php @@ -58,7 +58,7 @@ public function isClass(): bool try { $parentClass = $this->getParentClass(); if ($name = $parentClass?->getName()) { - return array_unique(array_merge(["\\{$name}"], $parentClass->getParentClassNames())); + return array_unique(array_merge([$name], $parentClass->getParentClassNames())); } } catch (\Exception $e) { $this->logger->warning($e->getMessage()); @@ -76,10 +76,7 @@ public function isClass(): bool if (!$this->isEntityDataCanBeLoaded()) { return null; } - if ($parentClassName = $this->getAst()->extends?->toString()) { - return '\\' . $parentClassName; - } - return null; + return $this->getAst()->extends?->toString(); } /** diff --git a/src/LanguageHandler/Php/Parser/Entity/ClassLikeEntity.php b/src/LanguageHandler/Php/Parser/Entity/ClassLikeEntity.php index 6fd549a6..086c4a29 100644 --- a/src/LanguageHandler/Php/Parser/Entity/ClassLikeEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/ClassLikeEntity.php @@ -546,7 +546,7 @@ public function getParentClass(): ?ClassLikeEntity } catch (\Exception $e) { $this->logger->error($e->getMessage()); } - $interfaceNames = array_merge($interfaceNames, ["\\{$interfaceName}"], $parentInterfaceNames); + $interfaceNames = array_merge($interfaceNames, [$interfaceName], $parentInterfaceNames); } if (!$this->isInterface() && $parentClass = $this->getParentClass()) { $parentInterfaceNames = []; @@ -1212,10 +1212,7 @@ public function isSubclassOf(string $className): bool $className = ClassLikeEntity::normalizeClassName($className); $parentClassNames = $this->getParentClassNames(); $interfacesNames = $this->getInterfaceNames(); - $allClasses = array_map( - fn($interface) => ltrim($interface, '\\'), - array_merge($parentClassNames, $interfacesNames) - ); + $allClasses = array_merge($parentClassNames, $interfacesNames); return in_array($className, $allClasses); } @@ -1231,11 +1228,7 @@ public function isSubclassOf(string $className): bool public function implementsInterface(string $interfaceName): bool { $interfaceName = ClassLikeEntity::normalizeClassName($interfaceName); - $interfaces = array_map( - fn($interface) => ltrim($interface, '\\'), - $this->getInterfaceNames() - ); - return in_array($interfaceName, $interfaces); + return in_array($interfaceName, $this->getInterfaceNames()); } /** @@ -1248,11 +1241,7 @@ public function implementsInterface(string $interfaceName): bool public function hasParentClass(string $parentClassName): bool { $parentClassName = ClassLikeEntity::normalizeClassName($parentClassName); - $parentClassNames = array_map( - fn($interface) => ltrim($interface, '\\'), - $this->getParentClassNames() - ); - return in_array($parentClassName, $parentClassNames); + return in_array($parentClassName, $this->getParentClassNames()); } /** diff --git a/src/LanguageHandler/Php/Parser/Entity/PhpEntitiesCollection.php b/src/LanguageHandler/Php/Parser/Entity/PhpEntitiesCollection.php index 8e10323f..af8bd361 100644 --- a/src/LanguageHandler/Php/Parser/Entity/PhpEntitiesCollection.php +++ b/src/LanguageHandler/Php/Parser/Entity/PhpEntitiesCollection.php @@ -175,7 +175,6 @@ public function internalGetLoadedOrCreateNew(string $objectName, bool $withAddCl { $classEntity = $this->get($objectName); if (!$classEntity) { - $objectName = ltrim($objectName, '\\'); $classEntity = $this->cacheablePhpEntityFactory->createClassLikeEntity( $this, $objectName @@ -209,10 +208,7 @@ public function filterByInterfaces(array $interfaces): PhpEntitiesCollection { $entitiesCollection = $this->cloneForFiltration(); $interfaces = array_map( - fn($interface) => ltrim( - str_replace('\\\\', '\\', $interface), - '\\' - ), + fn($interface) => ClassLikeEntity::normalizeClassName($interface), $interfaces ); foreach ($entitiesCollection as $objectId => $entity) { @@ -220,11 +216,7 @@ public function filterByInterfaces(array $interfaces): PhpEntitiesCollection $entitiesCollection->remove($objectId); continue; } - $entityInterfaces = array_map( - fn($interface) => ltrim($interface, '\\'), - $entity->getInterfaceNames() - ); - if (!array_intersect($interfaces, $entityInterfaces)) { + if (!array_intersect($interfaces, $entity->getInterfaceNames())) { $entitiesCollection->remove($objectId); } } @@ -240,10 +232,7 @@ public function filterByParentClassNames(array $parentClassNames): PhpEntitiesCo { $entitiesCollection = $this->cloneForFiltration(); $parentClassNames = array_map( - fn($parentClassName) => ltrim( - str_replace('\\\\', '\\', $parentClassName), - '\\' - ), + fn($parentClassName) => ClassLikeEntity::normalizeClassName($parentClassName), $parentClassNames ); foreach ($entitiesCollection as $objectId => $entity) { @@ -251,12 +240,7 @@ public function filterByParentClassNames(array $parentClassNames): PhpEntitiesCo $entitiesCollection->remove($objectId); continue; } - - $entityParentClassNames = array_map( - fn($parentClassName) => ltrim($parentClassName, '\\'), - $entity->getParentClassNames() - ); - if (!array_intersect($parentClassNames, $entityParentClassNames)) { + if (!array_intersect($parentClassNames, $entity->getParentClassNames())) { $entitiesCollection->remove($objectId); } } @@ -364,9 +348,9 @@ public function getOnlyAbstractClasses(): PhpEntitiesCollection * $entitiesCollection->findEntity('\BumbleDocGen\Console\App'); // class with namespace * $entitiesCollection->findEntity('\BumbleDocGen\Console\App::test()'); // class with namespace and optional part * $entitiesCollection->findEntity('App.php'); // filename - * $entitiesCollection->findEntity('/BumbleDocGen/Console/App.php'); // relative path - * $entitiesCollection->findEntity('/Users/someuser/Desktop/projects/bumble-doc-gen/BumbleDocGen/Console/App.php'); // absolute path - * $entitiesCollection->findEntity('https://github.com/bumble-tech/bumble-doc-gen/blob/master/BumbleDocGen/Console/App.php'); // source link + * $entitiesCollection->findEntity('/src/Console/App.php'); // relative path + * $entitiesCollection->findEntity('/Users/someuser/Desktop/projects/bumble-doc-gen/src/Console/App.php'); // absolute path + * $entitiesCollection->findEntity('https://github.com/bumble-tech/bumble-doc-gen/blob/master/src/Console/App.php'); // source link */ public function internalFindEntity(string $search, bool $useUnsafeKeys = true): ?ClassLikeEntity { @@ -418,11 +402,12 @@ public function internalFindEntity(string $search, bool $useUnsafeKeys = true): $entity = null; $foundKey = null; - $search = ltrim($search, '\\'); + $search = ClassEntity::normalizeClassName($search); if (array_key_exists($search, $index)) { $entity = $index[$search]; $foundKey = $search; } else { + $search = preg_replace('#^(((http(s?)):\/\/)(.*)(blob\/([^/]+)))(.*)#', '$8', $search); $preparedSearch = preg_replace('/^(((http(s?))::)?([^-:]+))((::|->)(.*))/', '$1', $search); if (array_key_exists($preparedSearch, $index)) { $entity = $index[$preparedSearch]; From 5b0f505379434a51411a6f404a349e336d2a6838 Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Thu, 23 Nov 2023 22:55:22 +0300 Subject: [PATCH 101/210] Fixing the display of names of parent classes and interfaces --- .../PhpClassToMd/templates/_classMainInfo.md.twig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/LanguageHandler/Php/Renderer/EntityDocRenderer/PhpClassToMd/templates/_classMainInfo.md.twig b/src/LanguageHandler/Php/Renderer/EntityDocRenderer/PhpClassToMd/templates/_classMainInfo.md.twig index 0cc0ce13..30e6a61f 100644 --- a/src/LanguageHandler/Php/Renderer/EntityDocRenderer/PhpClassToMd/templates/_classMainInfo.md.twig +++ b/src/LanguageHandler/Php/Renderer/EntityDocRenderer/PhpClassToMd/templates/_classMainInfo.md.twig @@ -6,7 +6,7 @@ namespace {{ classEntity.getNamespaceName() }}; {% endif %} -{{ classEntity.getModifiersString() }} {{ classEntity.getShortName() }}{% if classEntity.isInterface() and classEntity.getInterfaceNames() %} extends {{ classEntity.getInterfaceNames() | implode(', ') }}{% else %}{% if classEntity.getParentClassName() %} extends {{ classEntity.getParentClassName() }}{% endif %}{% if classEntity.getInterfaceNames() %} implements {{ classEntity.getInterfaceNames() | implode(', ') }}{% endif %}{% endif %} +{{ classEntity.getModifiersString() }} {{ classEntity.getShortName() }}{% if classEntity.isInterface() and classEntity.getInterfaceNames() %} extends \{{ classEntity.getInterfaceNames() | implode(', \\') }}{% else %}{% if classEntity.getParentClassName() %} extends \{{ classEntity.getParentClassName() }}{% endif %}{% if classEntity.getInterfaceNames() %} implements \{{ classEntity.getInterfaceNames() | implode(', \\') }}{% endif %}{% endif %} ``` From c33561b08fa25cbdc9f012f63c29a41ce96ddb01 Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Thu, 23 Nov 2023 23:57:55 +0300 Subject: [PATCH 102/210] Renaming event --- .../TwigFilterClassParserPlugin.php | 10 +++++----- .../TwigFunctionClassParserPlugin.php | 10 +++++----- .../Php/Parser/Entity/PhpEntitiesCollection.php | 4 ++-- ...ction.php => AfterLoadingPhpEntitiesCollection.php} | 6 +++--- 4 files changed, 15 insertions(+), 15 deletions(-) rename src/LanguageHandler/Php/Plugin/Event/Parser/{AfterLoadingClassEntityCollection.php => AfterLoadingPhpEntitiesCollection.php} (75%) diff --git a/selfdoc/Plugin/TwigFilterClassParser/TwigFilterClassParserPlugin.php b/selfdoc/Plugin/TwigFilterClassParser/TwigFilterClassParserPlugin.php index 4441d0b2..89f4e5cd 100644 --- a/selfdoc/Plugin/TwigFilterClassParser/TwigFilterClassParserPlugin.php +++ b/selfdoc/Plugin/TwigFilterClassParser/TwigFilterClassParserPlugin.php @@ -12,7 +12,7 @@ use BumbleDocGen\Core\Renderer\Twig\Filter\CustomFilterInterface; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; -use BumbleDocGen\LanguageHandler\Php\Plugin\Event\Parser\AfterLoadingClassEntityCollection; +use BumbleDocGen\LanguageHandler\Php\Plugin\Event\Parser\AfterLoadingPhpEntitiesCollection; use BumbleDocGen\LanguageHandler\Php\Renderer\EntityDocRenderer\PhpClassToMd\PhpClassToMdDocRenderer; use DI\DependencyException; use DI\NotFoundException; @@ -35,7 +35,7 @@ public function __construct( public static function getSubscribedEvents(): array { return [ - AfterLoadingClassEntityCollection::class => 'afterLoadingClassEntityCollection', + AfterLoadingPhpEntitiesCollection::class => 'afterLoadingClassEntityCollection', OnLoadEntityDocPluginContent::class => 'onLoadEntityDocPluginContentEvent', ]; } @@ -72,13 +72,13 @@ public function onLoadEntityDocPluginContentEvent(OnLoadEntityDocPluginContent $ * @throws DependencyException * @throws InvalidConfigurationParameterException */ - public function afterLoadingClassEntityCollection(AfterLoadingClassEntityCollection $event): void + public function afterLoadingClassEntityCollection(AfterLoadingPhpEntitiesCollection $event): void { - foreach ($event->getClassEntityCollection() as $classEntity) { + foreach ($event->getPhpEntitiesCollection() as $classEntity) { if ($this->isCustomTwigFilter($classEntity)) { $classEntity->loadPluginData( self::PLUGIN_KEY, - $this->getFilterData($event->getClassEntityCollection(), $classEntity->getName()) ?? [] + $this->getFilterData($event->getPhpEntitiesCollection(), $classEntity->getName()) ?? [] ); } } diff --git a/selfdoc/Plugin/TwigFunctionClassParser/TwigFunctionClassParserPlugin.php b/selfdoc/Plugin/TwigFunctionClassParser/TwigFunctionClassParserPlugin.php index da8b6b49..5ad4fdc9 100644 --- a/selfdoc/Plugin/TwigFunctionClassParser/TwigFunctionClassParserPlugin.php +++ b/selfdoc/Plugin/TwigFunctionClassParser/TwigFunctionClassParserPlugin.php @@ -12,7 +12,7 @@ use BumbleDocGen\Core\Renderer\Twig\Function\CustomFunctionInterface; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; -use BumbleDocGen\LanguageHandler\Php\Plugin\Event\Parser\AfterLoadingClassEntityCollection; +use BumbleDocGen\LanguageHandler\Php\Plugin\Event\Parser\AfterLoadingPhpEntitiesCollection; use BumbleDocGen\LanguageHandler\Php\Renderer\EntityDocRenderer\PhpClassToMd\PhpClassToMdDocRenderer; use DI\DependencyException; use DI\NotFoundException; @@ -35,7 +35,7 @@ public function __construct( public static function getSubscribedEvents(): array { return [ - AfterLoadingClassEntityCollection::class => 'afterLoadingClassEntityCollection', + AfterLoadingPhpEntitiesCollection::class => 'afterLoadingClassEntityCollection', OnLoadEntityDocPluginContent::class => 'onLoadEntityDocPluginContentEvent', ]; } @@ -70,13 +70,13 @@ public function onLoadEntityDocPluginContentEvent(OnLoadEntityDocPluginContent $ * @throws DependencyException * @throws InvalidConfigurationParameterException */ - public function afterLoadingClassEntityCollection(AfterLoadingClassEntityCollection $event): void + public function afterLoadingClassEntityCollection(AfterLoadingPhpEntitiesCollection $event): void { - foreach ($event->getClassEntityCollection() as $classEntity) { + foreach ($event->getPhpEntitiesCollection() as $classEntity) { if ($this->isCustomTwigFunction($classEntity) && $classEntity->isInstantiable()) { $classEntity->loadPluginData( self::PLUGIN_KEY, - $this->getFunctionData($event->getClassEntityCollection(), $classEntity->getName()) ?? [] + $this->getFunctionData($event->getPhpEntitiesCollection(), $classEntity->getName()) ?? [] ); } } diff --git a/src/LanguageHandler/Php/Parser/Entity/PhpEntitiesCollection.php b/src/LanguageHandler/Php/Parser/Entity/PhpEntitiesCollection.php index af8bd361..45c0a768 100644 --- a/src/LanguageHandler/Php/Parser/Entity/PhpEntitiesCollection.php +++ b/src/LanguageHandler/Php/Parser/Entity/PhpEntitiesCollection.php @@ -15,7 +15,7 @@ use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Cache\CacheablePhpEntityFactory; use BumbleDocGen\LanguageHandler\Php\Parser\PhpParser\PhpParserHelper; use BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings; -use BumbleDocGen\LanguageHandler\Php\Plugin\Event\Parser\AfterLoadingClassEntityCollection; +use BumbleDocGen\LanguageHandler\Php\Plugin\Event\Parser\AfterLoadingPhpEntitiesCollection; use BumbleDocGen\LanguageHandler\Php\Plugin\Event\Parser\OnAddClassEntityToCollection; use BumbleDocGen\LanguageHandler\Php\Renderer\EntityDocRenderer\EntityDocRendererHelper; use DI\DependencyException; @@ -131,7 +131,7 @@ public function loadClassEntities(): void } } } - $this->pluginEventDispatcher->dispatch(new AfterLoadingClassEntityCollection($this)); + $this->pluginEventDispatcher->dispatch(new AfterLoadingPhpEntitiesCollection($this)); $allFilesCount = count($allFiles); $skipped = $allFilesCount - $addedFilesCount; diff --git a/src/LanguageHandler/Php/Plugin/Event/Parser/AfterLoadingClassEntityCollection.php b/src/LanguageHandler/Php/Plugin/Event/Parser/AfterLoadingPhpEntitiesCollection.php similarity index 75% rename from src/LanguageHandler/Php/Plugin/Event/Parser/AfterLoadingClassEntityCollection.php rename to src/LanguageHandler/Php/Plugin/Event/Parser/AfterLoadingPhpEntitiesCollection.php index 7df602ec..52a16ad1 100644 --- a/src/LanguageHandler/Php/Plugin/Event/Parser/AfterLoadingClassEntityCollection.php +++ b/src/LanguageHandler/Php/Plugin/Event/Parser/AfterLoadingPhpEntitiesCollection.php @@ -8,15 +8,15 @@ use Symfony\Contracts\EventDispatcher\Event; /** - * The event is called after the initial creation of a collection of class entities + * The event is called after the initial creation of a collection of PHP entities */ -final class AfterLoadingClassEntityCollection extends Event +final class AfterLoadingPhpEntitiesCollection extends Event { public function __construct(private PhpEntitiesCollection $entitiesCollection) { } - public function getClassEntityCollection(): PhpEntitiesCollection + public function getPhpEntitiesCollection(): PhpEntitiesCollection { return $this->entitiesCollection; } From f2a2d5bafc2971cb2cb9bdfc9aab052f26fa7a04 Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Fri, 24 Nov 2023 00:20:57 +0300 Subject: [PATCH 103/210] Updating plugin system --- .../TwigFilterClassParserPlugin.php | 2 +- .../TwigFunctionClassParserPlugin.php | 2 +- .../Php/Parser/Entity/ClassLikeEntity.php | 23 +++++++++++++------ 3 files changed, 18 insertions(+), 9 deletions(-) diff --git a/selfdoc/Plugin/TwigFilterClassParser/TwigFilterClassParserPlugin.php b/selfdoc/Plugin/TwigFilterClassParser/TwigFilterClassParserPlugin.php index 89f4e5cd..2ff68d13 100644 --- a/selfdoc/Plugin/TwigFilterClassParser/TwigFilterClassParserPlugin.php +++ b/selfdoc/Plugin/TwigFilterClassParser/TwigFilterClassParserPlugin.php @@ -76,7 +76,7 @@ public function afterLoadingClassEntityCollection(AfterLoadingPhpEntitiesCollect { foreach ($event->getPhpEntitiesCollection() as $classEntity) { if ($this->isCustomTwigFilter($classEntity)) { - $classEntity->loadPluginData( + $classEntity->addPluginData( self::PLUGIN_KEY, $this->getFilterData($event->getPhpEntitiesCollection(), $classEntity->getName()) ?? [] ); diff --git a/selfdoc/Plugin/TwigFunctionClassParser/TwigFunctionClassParserPlugin.php b/selfdoc/Plugin/TwigFunctionClassParser/TwigFunctionClassParserPlugin.php index 5ad4fdc9..83ee155b 100644 --- a/selfdoc/Plugin/TwigFunctionClassParser/TwigFunctionClassParserPlugin.php +++ b/selfdoc/Plugin/TwigFunctionClassParser/TwigFunctionClassParserPlugin.php @@ -74,7 +74,7 @@ public function afterLoadingClassEntityCollection(AfterLoadingPhpEntitiesCollect { foreach ($event->getPhpEntitiesCollection() as $classEntity) { if ($this->isCustomTwigFunction($classEntity) && $classEntity->isInstantiable()) { - $classEntity->loadPluginData( + $classEntity->addPluginData( self::PLUGIN_KEY, $this->getFunctionData($event->getPhpEntitiesCollection(), $classEntity->getName()) ?? [] ); diff --git a/src/LanguageHandler/Php/Parser/Entity/ClassLikeEntity.php b/src/LanguageHandler/Php/Parser/Entity/ClassLikeEntity.php index 086c4a29..48011c30 100644 --- a/src/LanguageHandler/Php/Parser/Entity/ClassLikeEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/ClassLikeEntity.php @@ -45,7 +45,6 @@ abstract class ClassLikeEntity extends BaseEntity implements DocumentTransformab { #[Inject] private Container $diContainer; - private array $pluginsData = []; private bool $relativeFileNameLoaded = false; private bool $isClassLoad = false; @@ -252,19 +251,29 @@ final public function getDocCommentEntity(): ClassLikeEntity } /** - * @internal + * Add information to aт entity object */ - final public function loadPluginData(string $pluginKey, array $data): void + final public function addPluginData(string $pluginKey, mixed $data): void { - $this->pluginsData[$pluginKey] = $data; + $objectId = $this->getObjectId(); + $cacheKey = "{$objectId}::{$pluginKey}"; + $this->localObjectCache->cacheMethodResult(__CLASS__ . '::getPluginData', $cacheKey, $data); } /** - * @internal + * Get additional information added using the plugin + * + * @api */ - final public function getPluginData(string $pluginKey): ?array + final public function getPluginData(string $pluginKey): mixed { - return $this->pluginsData[$pluginKey] ?? null; + $objectId = $this->getObjectId(); + $cacheKey = "{$objectId}::{$pluginKey}"; + try { + return $this->localObjectCache->getMethodCachedResult(__METHOD__, $cacheKey); + } catch (ObjectNotFoundException) { + } + return null; } /** From 7a09167513e695b2d8a956e811bbb61338df1038 Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Fri, 24 Nov 2023 00:28:04 +0300 Subject: [PATCH 104/210] Renaming event --- src/LanguageHandler/Php/Parser/Entity/BaseEntity.php | 4 ++-- .../CorePlugin/BasePhpStubber/BasePhpStubberPlugin.php | 6 +++--- .../BasePhpStubber/PhpDocumentorStubberPlugin.php | 6 +++--- .../CorePlugin/BasePhpStubber/PhpUnitStubberPlugin.php | 6 +++--- .../CorePlugin/ComposerPackagesStubber/StubberPlugin.php | 6 +++--- ...lassEntityCanBeLoad.php => OnCheckIsEntityCanBeLoad.php} | 2 +- 6 files changed, 15 insertions(+), 15 deletions(-) rename src/LanguageHandler/Php/Plugin/Event/Entity/{OnCheckIsClassEntityCanBeLoad.php => OnCheckIsEntityCanBeLoad.php} (91%) diff --git a/src/LanguageHandler/Php/Parser/Entity/BaseEntity.php b/src/LanguageHandler/Php/Parser/Entity/BaseEntity.php index 2cd5ed71..c82acd37 100644 --- a/src/LanguageHandler/Php/Parser/Entity/BaseEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/BaseEntity.php @@ -19,7 +19,7 @@ use BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntity; use BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper; use BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings; -use BumbleDocGen\LanguageHandler\Php\Plugin\Event\Entity\OnCheckIsClassEntityCanBeLoad; +use BumbleDocGen\LanguageHandler\Php\Plugin\Event\Entity\OnCheckIsEntityCanBeLoad; use DI\Attribute\Inject; use phpDocumentor\Reflection\DocBlock; use Psr\Cache\InvalidArgumentException; @@ -714,7 +714,7 @@ protected function isCurrentEntityCanBeLoad(): bool } catch (ObjectNotFoundException) { } $entityCanBeLoad = $this->getRootEntityCollection()->getPluginEventDispatcher()->dispatch( - new OnCheckIsClassEntityCanBeLoad($this->getCurrentRootEntity()) + new OnCheckIsEntityCanBeLoad($this->getCurrentRootEntity()) )->isClassCanBeLoad(); $this->localObjectCache->cacheMethodResult(__METHOD__, $classEntity->getObjectId(), $entityCanBeLoad); return $entityCanBeLoad; diff --git a/src/LanguageHandler/Php/Plugin/CorePlugin/BasePhpStubber/BasePhpStubberPlugin.php b/src/LanguageHandler/Php/Plugin/CorePlugin/BasePhpStubber/BasePhpStubberPlugin.php index 06619934..e5729c80 100644 --- a/src/LanguageHandler/Php/Plugin/CorePlugin/BasePhpStubber/BasePhpStubberPlugin.php +++ b/src/LanguageHandler/Php/Plugin/CorePlugin/BasePhpStubber/BasePhpStubberPlugin.php @@ -7,7 +7,7 @@ use BumbleDocGen\Core\Plugin\Event\Renderer\OnGettingResourceLink; use BumbleDocGen\Core\Plugin\PluginInterface; use BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper; -use BumbleDocGen\LanguageHandler\Php\Plugin\Event\Entity\OnCheckIsClassEntityCanBeLoad; +use BumbleDocGen\LanguageHandler\Php\Plugin\Event\Entity\OnCheckIsEntityCanBeLoad; /** * Adding links to type documentation and documentation of built-in PHP classes @@ -147,7 +147,7 @@ public static function getSubscribedEvents(): array { return [ OnGettingResourceLink::class => 'onGettingResourceLink', - OnCheckIsClassEntityCanBeLoad::class => 'onCheckIsClassEntityCanBeLoad', + OnCheckIsEntityCanBeLoad::class => 'onCheckIsClassEntityCanBeLoad', ]; } @@ -166,7 +166,7 @@ final public function onGettingResourceLink(OnGettingResourceLink $event): void } } - final public function onCheckIsClassEntityCanBeLoad(OnCheckIsClassEntityCanBeLoad $event): void + final public function onCheckIsClassEntityCanBeLoad(OnCheckIsEntityCanBeLoad $event): void { $entityName = $event->getEntity()->getName(); $entityName = explode('::', $entityName)[0]; diff --git a/src/LanguageHandler/Php/Plugin/CorePlugin/BasePhpStubber/PhpDocumentorStubberPlugin.php b/src/LanguageHandler/Php/Plugin/CorePlugin/BasePhpStubber/PhpDocumentorStubberPlugin.php index 930f34aa..9ac7fdad 100644 --- a/src/LanguageHandler/Php/Plugin/CorePlugin/BasePhpStubber/PhpDocumentorStubberPlugin.php +++ b/src/LanguageHandler/Php/Plugin/CorePlugin/BasePhpStubber/PhpDocumentorStubberPlugin.php @@ -6,7 +6,7 @@ use BumbleDocGen\Core\Plugin\Event\Renderer\OnGettingResourceLink; use BumbleDocGen\Core\Plugin\PluginInterface; -use BumbleDocGen\LanguageHandler\Php\Plugin\Event\Entity\OnCheckIsClassEntityCanBeLoad; +use BumbleDocGen\LanguageHandler\Php\Plugin\Event\Entity\OnCheckIsEntityCanBeLoad; use phpDocumentor\Reflection\DocBlock; use phpDocumentor\Reflection\DocBlockFactory; use phpDocumentor\Reflection\DocBlockFactoryInterface; @@ -26,7 +26,7 @@ public static function getSubscribedEvents(): array { return [ OnGettingResourceLink::class => 'onGettingResourceLink', - OnCheckIsClassEntityCanBeLoad::class => 'onCheckIsClassEntityCanBeLoad', + OnCheckIsEntityCanBeLoad::class => 'onCheckIsClassEntityCanBeLoad', ]; } @@ -70,7 +70,7 @@ final public function onGettingResourceLink(OnGettingResourceLink $event): void } } - final public function onCheckIsClassEntityCanBeLoad(OnCheckIsClassEntityCanBeLoad $event): void + final public function onCheckIsClassEntityCanBeLoad(OnCheckIsEntityCanBeLoad $event): void { if ( str_starts_with($event->getEntity()->getName(), 'phpDocumentor\\') || diff --git a/src/LanguageHandler/Php/Plugin/CorePlugin/BasePhpStubber/PhpUnitStubberPlugin.php b/src/LanguageHandler/Php/Plugin/CorePlugin/BasePhpStubber/PhpUnitStubberPlugin.php index e64a32a9..730c14f7 100644 --- a/src/LanguageHandler/Php/Plugin/CorePlugin/BasePhpStubber/PhpUnitStubberPlugin.php +++ b/src/LanguageHandler/Php/Plugin/CorePlugin/BasePhpStubber/PhpUnitStubberPlugin.php @@ -6,7 +6,7 @@ use BumbleDocGen\Core\Plugin\Event\Renderer\OnGettingResourceLink; use BumbleDocGen\Core\Plugin\PluginInterface; -use BumbleDocGen\LanguageHandler\Php\Plugin\Event\Entity\OnCheckIsClassEntityCanBeLoad; +use BumbleDocGen\LanguageHandler\Php\Plugin\Event\Entity\OnCheckIsEntityCanBeLoad; /** * Adding links to the documentation of PHP classes in the \PHPUnit namespace @@ -17,7 +17,7 @@ public static function getSubscribedEvents(): array { return [ OnGettingResourceLink::class => 'onGettingResourceLink', - OnCheckIsClassEntityCanBeLoad::class => 'onCheckIsClassEntityCanBeLoad', + OnCheckIsEntityCanBeLoad::class => 'onCheckIsClassEntityCanBeLoad', ]; } @@ -36,7 +36,7 @@ final public function onGettingResourceLink(OnGettingResourceLink $event): void } } - final public function onCheckIsClassEntityCanBeLoad(OnCheckIsClassEntityCanBeLoad $event): void + final public function onCheckIsClassEntityCanBeLoad(OnCheckIsEntityCanBeLoad $event): void { if ( str_starts_with($event->getEntity()->getName(), 'PHPUnit\\') || diff --git a/src/LanguageHandler/Php/Plugin/CorePlugin/ComposerPackagesStubber/StubberPlugin.php b/src/LanguageHandler/Php/Plugin/CorePlugin/ComposerPackagesStubber/StubberPlugin.php index 051a00fa..1776cc19 100644 --- a/src/LanguageHandler/Php/Plugin/CorePlugin/ComposerPackagesStubber/StubberPlugin.php +++ b/src/LanguageHandler/Php/Plugin/CorePlugin/ComposerPackagesStubber/StubberPlugin.php @@ -7,7 +7,7 @@ use BumbleDocGen\Core\Plugin\Event\Renderer\OnGettingResourceLink; use BumbleDocGen\Core\Plugin\PluginInterface; use BumbleDocGen\LanguageHandler\Php\Parser\ComposerHelper; -use BumbleDocGen\LanguageHandler\Php\Plugin\Event\Entity\OnCheckIsClassEntityCanBeLoad; +use BumbleDocGen\LanguageHandler\Php\Plugin\Event\Entity\OnCheckIsEntityCanBeLoad; /** * The plugin allows you to automatically provide links to github repositories for documented classes from libraries included in composer @@ -24,7 +24,7 @@ public static function getSubscribedEvents(): array { return [ OnGettingResourceLink::class => 'onGettingResourceLink', - OnCheckIsClassEntityCanBeLoad::class => 'onCheckIsClassEntityCanBeLoad', + OnCheckIsEntityCanBeLoad::class => 'onCheckIsClassEntityCanBeLoad', ]; } @@ -57,7 +57,7 @@ final public function onGettingResourceLink(OnGettingResourceLink $event): void /** * @throws \Exception */ - final public function onCheckIsClassEntityCanBeLoad(OnCheckIsClassEntityCanBeLoad $event): void + final public function onCheckIsClassEntityCanBeLoad(OnCheckIsEntityCanBeLoad $event): void { if ($this->composerHelper->getComposerPackageDataByClassName($event->getEntity()->getName())) { $event->disableClassLoading(); diff --git a/src/LanguageHandler/Php/Plugin/Event/Entity/OnCheckIsClassEntityCanBeLoad.php b/src/LanguageHandler/Php/Plugin/Event/Entity/OnCheckIsEntityCanBeLoad.php similarity index 91% rename from src/LanguageHandler/Php/Plugin/Event/Entity/OnCheckIsClassEntityCanBeLoad.php rename to src/LanguageHandler/Php/Plugin/Event/Entity/OnCheckIsEntityCanBeLoad.php index 09fdeb6e..4a978171 100644 --- a/src/LanguageHandler/Php/Plugin/Event/Entity/OnCheckIsClassEntityCanBeLoad.php +++ b/src/LanguageHandler/Php/Plugin/Event/Entity/OnCheckIsEntityCanBeLoad.php @@ -7,7 +7,7 @@ use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; use Symfony\Contracts\EventDispatcher\Event; -final class OnCheckIsClassEntityCanBeLoad extends Event +final class OnCheckIsEntityCanBeLoad extends Event { public bool $classCanBeLoad = true; From 78dbac42e8fe660c2674fd293085f846e8b07e0c Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Sat, 25 Nov 2023 01:04:15 +0300 Subject: [PATCH 105/210] Changing doc block links getters --- .../Php/Parser/Entity/BaseEntity.php | 168 ++++++++++-------- .../Php/Parser/Entity/ClassLikeEntity.php | 11 +- .../Php/Parser/Entity/Data/DocBlockLink.php | 16 ++ 3 files changed, 114 insertions(+), 81 deletions(-) create mode 100644 src/LanguageHandler/Php/Parser/Entity/Data/DocBlockLink.php diff --git a/src/LanguageHandler/Php/Parser/Entity/BaseEntity.php b/src/LanguageHandler/Php/Parser/Entity/BaseEntity.php index c82acd37..3a97c56b 100644 --- a/src/LanguageHandler/Php/Parser/Entity/BaseEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/BaseEntity.php @@ -14,6 +14,7 @@ use BumbleDocGen\Core\Parser\Entity\Cache\CacheableMethod; use BumbleDocGen\Core\Renderer\RendererHelper; use BumbleDocGen\Core\Renderer\Twig\Function\GetDocumentedEntityUrl; +use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Data\DocBlockLink; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntity; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntity; @@ -188,7 +189,7 @@ public function getObjectId(): string } /** - * Get the code line number where the dockBlock of the current entity begins + * Get the code line number where the docBlock of the current entity begins * * @api * @@ -254,13 +255,15 @@ public function isDeprecated(): bool */ public function hasDescriptionLinks(): bool { - return count($this->getDescriptionLinksData()) > 0; + return count($this->getDescriptionDockBlockLinks()) > 0; } /** + * @return DocBlockLink[] + * * @throws \Exception */ - #[CacheableMethod] protected function getDescriptionLinksData(): array + #[CacheableMethod] protected function getDescriptionDockBlockLinks(): array { $links = []; $docBlock = $this->getDocBlock(); @@ -280,17 +283,17 @@ public function hasDescriptionLinks(): bool $name = (string)$seeBlock->getReference(); $description = (string)$seeBlock->getDescription(); if (filter_var($name, FILTER_VALIDATE_URL)) { - $links[] = [ - 'url' => $name, - 'name' => $name, - 'description' => $description, - ]; + $links[] = new DocBlockLink( + name: $name, + description: $description, + url: $name, + ); } elseif ($url = $this->rendererHelper->getPreloadResourceLink($name)) { - $links[] = [ - 'url' => $url, - 'name' => $name, - 'description' => $description, - ]; + $links[] = new DocBlockLink( + name: $name, + description: $description, + url: $url + ); } elseif (str_starts_with($name, '\\')) { if (!str_contains($name, '::')) { // tmp hack to fix methods declared as global functions @@ -330,12 +333,11 @@ public function hasDescriptionLinks(): bool '$this->' ], "{$docCommentImplementingClass->getShortName()}::", $name); - $links[] = [ - 'className' => $name, - 'url' => null, - 'name' => $name, - 'description' => $description, - ]; + $links[] = new DocBlockLink( + name: $name, + description: $description, + className: $name, + ); } } catch (\Exception $e) { $this->logger->error($e->getMessage()); @@ -346,17 +348,16 @@ public function hasDescriptionLinks(): bool if (preg_match_all('/(\@see )(.*?)( |}|])/', $description . ' ', $matches)) { foreach ($matches[2] as $name) { if (filter_var($name, FILTER_VALIDATE_URL)) { - $links[] = [ - 'url' => $name, - 'name' => $name, - 'description' => '', - ]; + $links[] = new DocBlockLink( + name: $name, + url: $name, + ); } elseif ($url = $this->rendererHelper->getPreloadResourceLink($name)) { - $links[] = [ - 'url' => $url, - 'name' => $name, - 'description' => $description, - ]; + $links[] = new DocBlockLink( + name: $name, + description: $description, + url: $url, + ); } else { $currentClassEntity = is_a($docCommentImplementingClass, ClassLikeEntity::class) ? $docCommentImplementingClass : $docCommentImplementingClass->getRootEntity(); $className = $this->parserHelper->parseFullClassName( @@ -364,12 +365,11 @@ public function hasDescriptionLinks(): bool $currentClassEntity ); - $links[] = [ - 'className' => $className, - 'url' => null, - 'name' => $className, - 'description' => $description, - ]; + $links[] = new DocBlockLink( + name: $className, + description: $description, + className: $className, + ); } } } @@ -380,11 +380,11 @@ public function hasDescriptionLinks(): bool } $description = (string)$linkBlock->getDescription(); $url = $linkBlock->getLink(); - $links[] = [ - 'url' => $url, - 'name' => $url, - 'description' => $description, - ]; + $links[] = new DocBlockLink( + name: $url, + description: $description, + url: $url, + ); } return $links; @@ -393,15 +393,17 @@ public function hasDescriptionLinks(): bool /** * Get parsed links from description and doc blocks `see` and `link` * - * @api + * @return DocBlockLink[] * * @throws InvalidConfigurationParameterException * @throws \Exception + *@api + * */ public function getDescriptionLinks(): array { - $linksData = $this->getDescriptionLinksData(); - return $this->fillInLinkDataWithUrls($linksData); + $linksData = $this->getDescriptionDockBlockLinks(); + return $this->getPreparedDocBlockLinks($linksData); } /** @@ -418,9 +420,11 @@ public function hasThrows(): bool } /** + * @return DocBlockLink[] + * * @throws InvalidConfigurationParameterException */ - #[CacheableMethod] protected function getThrowsData(): array + #[CacheableMethod] public function getThrowsDockBlockLinks(): array { $throws = []; $implementingClassEntity = $this->getDocCommentEntity()->getRootEntity(); @@ -430,22 +434,22 @@ public function hasThrows(): bool $names = explode('|', (string)$throwBlock->getType()); foreach ($names as $name) { if ($url = $this->rendererHelper->getPreloadResourceLink($name)) { - $throws[] = [ - 'url' => $url, - 'name' => $name, - 'description' => (string)$throwBlock->getDescription(), - ]; + $throws[] = new DocBlockLink( + name: $name, + description: (string)$throwBlock->getDescription(), + url: $url, + ); continue; } $className = $this->parserHelper->parseFullClassName( $name, $implementingClassEntity ); - $throwData = [ - 'className' => $className, - 'name' => $className, - 'description' => (string)$throwBlock->getDescription(), - ]; + $throwData = new DocBlockLink( + name: $className, + description: (string)$throwBlock->getDescription(), + className: $className, + ); $throws[] = $throwData; } } @@ -456,38 +460,48 @@ public function hasThrows(): bool /** * Get parsed throws from `throws` doc block * - * @api + * @return DocBlockLink[] * * @throws InvalidConfigurationParameterException + *@api + * */ public function getThrows(): array { - $throwsData = $this->getThrowsData(); - return $this->fillInLinkDataWithUrls($throwsData); + $throwsData = $this->getThrowsDockBlockLinks(); + return $this->getPreparedDocBlockLinks($throwsData); } /** + * @param DocBlockLink[] $docBlockLinks + * + * @return DocBlockLink[] + * * @throws InvalidConfigurationParameterException */ - private function fillInLinkDataWithUrls(array $linkData): array + private function getPreparedDocBlockLinks(array $docBlockLinks): array { - foreach ($linkData as $key => $data) { - if (!isset($data['url'])) { - $linkData[$key]['url'] = null; - } else { + $preparedDocBlockLinksLinks = []; + foreach ($docBlockLinks as $data) { + if ($data->url) { + $preparedDocBlockLinksLinks[] = $data; continue; } - if (($data['className'] ?? null)) { + + $className = $data->className; + $name = $data->name; + $url = null; + if ($data->className) { $entityData = $this->getRootEntityCollection()->getEntityLinkData( - $data['className'], + $data->className, $this->getImplementingClass()->getName(), false ); - if (!$entityData['entityName'] && !str_contains($data['className'], '\\')) { + if (!$entityData['entityName'] && !str_contains($data->className, '\\')) { try { - $data['className'] = $this->getDocCommentEntity()->getCurrentRootEntity()->getNamespaceName() . "\\{$data['className']}"; + $className = $this->getDocCommentEntity()->getCurrentRootEntity()->getNamespaceName() . "\\{$data->className}"; $entityData = $this->getRootEntityCollection()->getEntityLinkData( - $data['className'], + $className, $this->getDocCommentEntity()->getCurrentRootEntity()->getName(), false ); @@ -497,7 +511,7 @@ private function fillInLinkDataWithUrls(array $linkData): array } if ($entityData['entityName']) { - $linkData[$key]['url'] = call_user_func_array( + $url = call_user_func_array( callback: $this->documentedEntityUrlFunction, args: [ $this->getRootEntityCollection(), @@ -506,19 +520,23 @@ private function fillInLinkDataWithUrls(array $linkData): array ] ); } else { - $preloadResourceLink = $this->rendererHelper->getPreloadResourceLink($data['className']); + $preloadResourceLink = $this->rendererHelper->getPreloadResourceLink($data->className); if ($preloadResourceLink) { - $linkData[$key]['url'] = $preloadResourceLink; + $url = $preloadResourceLink; } else { - $linkData[$key]['url'] = null; - $this->logger->warning("Unable to get URL data for entity `{$data['className']}`"); + $this->logger->warning("Unable to get URL data for entity `{$data->className}`"); } } - $linkData[$key]['name'] = $entityData['title']; - unset($data['className']); + $name = $entityData['title']; } + $preparedDocBlockLinksLinks[] = new DocBlockLink( + name: $name, + description: $data->description, + className: $className, + url: $url + ); } - return $linkData; + return $preparedDocBlockLinksLinks; } /** diff --git a/src/LanguageHandler/Php/Parser/Entity/ClassLikeEntity.php b/src/LanguageHandler/Php/Parser/Entity/ClassLikeEntity.php index 48011c30..f0bea04f 100644 --- a/src/LanguageHandler/Php/Parser/Entity/ClassLikeEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/ClassLikeEntity.php @@ -491,7 +491,7 @@ public function getParentClassNames(): array public function getParentClassEntities(): array { return array_map( - fn(string $className) => $this->getRootEntityCollection()->getLoadedOrCreateNew($className), + fn(string $className): ClassLikeEntity => $this->getRootEntityCollection()->getLoadedOrCreateNew($className), $this->getParentClassNames() ); } @@ -627,11 +627,10 @@ public function getInterfacesEntities(): array */ public function getTraits(): array { - $traits = []; - foreach ($this->getTraitsNames() as $traitsName) { - $traits[] = $this->entitiesCollection->getLoadedOrCreateNew($traitsName); - } - return $traits; + return array_map( + fn(string $className): TraitEntity => $this->getRootEntityCollection()->getLoadedOrCreateNew($className), + $this->getTraitsNames() + ); } /** diff --git a/src/LanguageHandler/Php/Parser/Entity/Data/DocBlockLink.php b/src/LanguageHandler/Php/Parser/Entity/Data/DocBlockLink.php new file mode 100644 index 00000000..4b28eb9a --- /dev/null +++ b/src/LanguageHandler/Php/Parser/Entity/Data/DocBlockLink.php @@ -0,0 +1,16 @@ + Date: Sat, 25 Nov 2023 01:10:49 +0300 Subject: [PATCH 106/210] Fixing methods names --- src/LanguageHandler/Php/Parser/Entity/BaseEntity.php | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/LanguageHandler/Php/Parser/Entity/BaseEntity.php b/src/LanguageHandler/Php/Parser/Entity/BaseEntity.php index 3a97c56b..b5612e8c 100644 --- a/src/LanguageHandler/Php/Parser/Entity/BaseEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/BaseEntity.php @@ -255,7 +255,7 @@ public function isDeprecated(): bool */ public function hasDescriptionLinks(): bool { - return count($this->getDescriptionDockBlockLinks()) > 0; + return count($this->getDescriptionDocBlockLinks()) > 0; } /** @@ -263,7 +263,7 @@ public function hasDescriptionLinks(): bool * * @throws \Exception */ - #[CacheableMethod] protected function getDescriptionDockBlockLinks(): array + #[CacheableMethod] protected function getDescriptionDocBlockLinks(): array { $links = []; $docBlock = $this->getDocBlock(); @@ -402,7 +402,7 @@ className: $className, */ public function getDescriptionLinks(): array { - $linksData = $this->getDescriptionDockBlockLinks(); + $linksData = $this->getDescriptionDocBlockLinks(); return $this->getPreparedDocBlockLinks($linksData); } @@ -424,7 +424,7 @@ public function hasThrows(): bool * * @throws InvalidConfigurationParameterException */ - #[CacheableMethod] public function getThrowsDockBlockLinks(): array + #[CacheableMethod] public function getThrowsDocBlockLinks(): array { $throws = []; $implementingClassEntity = $this->getDocCommentEntity()->getRootEntity(); @@ -468,7 +468,7 @@ className: $className, */ public function getThrows(): array { - $throwsData = $this->getThrowsDockBlockLinks(); + $throwsData = $this->getThrowsDocBlockLinks(); return $this->getPreparedDocBlockLinks($throwsData); } From d4a39d55f8a1b07574dea9e8d41b8c056e6264aa Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Sat, 25 Nov 2023 01:20:23 +0300 Subject: [PATCH 107/210] Renaming event --- .../Php/Parser/Entity/BaseEntity.php | 6 ++-- .../BasePhpStubber/BasePhpStubberPlugin.php | 10 +++--- .../PhpDocumentorStubberPlugin.php | 8 ++--- .../BasePhpStubber/PhpUnitStubberPlugin.php | 8 ++--- .../ComposerPackagesStubber/StubberPlugin.php | 8 ++--- .../Event/Entity/OnCheckIsEntityCanBeLoad.php | 32 ------------------- .../Entity/OnCheckIsEntityCanBeLoaded.php | 32 +++++++++++++++++++ 7 files changed, 52 insertions(+), 52 deletions(-) delete mode 100644 src/LanguageHandler/Php/Plugin/Event/Entity/OnCheckIsEntityCanBeLoad.php create mode 100644 src/LanguageHandler/Php/Plugin/Event/Entity/OnCheckIsEntityCanBeLoaded.php diff --git a/src/LanguageHandler/Php/Parser/Entity/BaseEntity.php b/src/LanguageHandler/Php/Parser/Entity/BaseEntity.php index b5612e8c..f8c5c980 100644 --- a/src/LanguageHandler/Php/Parser/Entity/BaseEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/BaseEntity.php @@ -20,7 +20,7 @@ use BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntity; use BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper; use BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings; -use BumbleDocGen\LanguageHandler\Php\Plugin\Event\Entity\OnCheckIsEntityCanBeLoad; +use BumbleDocGen\LanguageHandler\Php\Plugin\Event\Entity\OnCheckIsEntityCanBeLoaded; use DI\Attribute\Inject; use phpDocumentor\Reflection\DocBlock; use Psr\Cache\InvalidArgumentException; @@ -732,8 +732,8 @@ protected function isCurrentEntityCanBeLoad(): bool } catch (ObjectNotFoundException) { } $entityCanBeLoad = $this->getRootEntityCollection()->getPluginEventDispatcher()->dispatch( - new OnCheckIsEntityCanBeLoad($this->getCurrentRootEntity()) - )->isClassCanBeLoad(); + new OnCheckIsEntityCanBeLoaded($this->getCurrentRootEntity()) + )->isEntityCanBeLoaded(); $this->localObjectCache->cacheMethodResult(__METHOD__, $classEntity->getObjectId(), $entityCanBeLoad); return $entityCanBeLoad; } diff --git a/src/LanguageHandler/Php/Plugin/CorePlugin/BasePhpStubber/BasePhpStubberPlugin.php b/src/LanguageHandler/Php/Plugin/CorePlugin/BasePhpStubber/BasePhpStubberPlugin.php index e5729c80..bab34dc5 100644 --- a/src/LanguageHandler/Php/Plugin/CorePlugin/BasePhpStubber/BasePhpStubberPlugin.php +++ b/src/LanguageHandler/Php/Plugin/CorePlugin/BasePhpStubber/BasePhpStubberPlugin.php @@ -7,7 +7,7 @@ use BumbleDocGen\Core\Plugin\Event\Renderer\OnGettingResourceLink; use BumbleDocGen\Core\Plugin\PluginInterface; use BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper; -use BumbleDocGen\LanguageHandler\Php\Plugin\Event\Entity\OnCheckIsEntityCanBeLoad; +use BumbleDocGen\LanguageHandler\Php\Plugin\Event\Entity\OnCheckIsEntityCanBeLoaded; /** * Adding links to type documentation and documentation of built-in PHP classes @@ -147,7 +147,7 @@ public static function getSubscribedEvents(): array { return [ OnGettingResourceLink::class => 'onGettingResourceLink', - OnCheckIsEntityCanBeLoad::class => 'onCheckIsClassEntityCanBeLoad', + OnCheckIsEntityCanBeLoaded::class => 'onCheckIsEntityCanBeLoaded', ]; } @@ -166,7 +166,7 @@ final public function onGettingResourceLink(OnGettingResourceLink $event): void } } - final public function onCheckIsClassEntityCanBeLoad(OnCheckIsEntityCanBeLoad $event): void + final public function onCheckIsEntityCanBeLoaded(OnCheckIsEntityCanBeLoaded $event): void { $entityName = $event->getEntity()->getName(); $entityName = explode('::', $entityName)[0]; @@ -174,11 +174,11 @@ final public function onCheckIsClassEntityCanBeLoad(OnCheckIsEntityCanBeLoad $ev $entityName = 'array'; } if (!ParserHelper::isCorrectClassName($entityName)) { - $event->disableClassLoading(); + $event->disableEntityLoading(); return; } if (array_key_exists($entityName, self::$builtInUrls) || array_key_exists("\\{$entityName}", self::$builtInUrls)) { - $event->disableClassLoading(); + $event->disableEntityLoading(); } } } diff --git a/src/LanguageHandler/Php/Plugin/CorePlugin/BasePhpStubber/PhpDocumentorStubberPlugin.php b/src/LanguageHandler/Php/Plugin/CorePlugin/BasePhpStubber/PhpDocumentorStubberPlugin.php index 9ac7fdad..93affeaf 100644 --- a/src/LanguageHandler/Php/Plugin/CorePlugin/BasePhpStubber/PhpDocumentorStubberPlugin.php +++ b/src/LanguageHandler/Php/Plugin/CorePlugin/BasePhpStubber/PhpDocumentorStubberPlugin.php @@ -6,7 +6,7 @@ use BumbleDocGen\Core\Plugin\Event\Renderer\OnGettingResourceLink; use BumbleDocGen\Core\Plugin\PluginInterface; -use BumbleDocGen\LanguageHandler\Php\Plugin\Event\Entity\OnCheckIsEntityCanBeLoad; +use BumbleDocGen\LanguageHandler\Php\Plugin\Event\Entity\OnCheckIsEntityCanBeLoaded; use phpDocumentor\Reflection\DocBlock; use phpDocumentor\Reflection\DocBlockFactory; use phpDocumentor\Reflection\DocBlockFactoryInterface; @@ -26,7 +26,7 @@ public static function getSubscribedEvents(): array { return [ OnGettingResourceLink::class => 'onGettingResourceLink', - OnCheckIsEntityCanBeLoad::class => 'onCheckIsClassEntityCanBeLoad', + OnCheckIsEntityCanBeLoaded::class => 'onCheckIsEntityCanBeLoaded', ]; } @@ -70,13 +70,13 @@ final public function onGettingResourceLink(OnGettingResourceLink $event): void } } - final public function onCheckIsClassEntityCanBeLoad(OnCheckIsEntityCanBeLoad $event): void + final public function onCheckIsEntityCanBeLoaded(OnCheckIsEntityCanBeLoaded $event): void { if ( str_starts_with($event->getEntity()->getName(), 'phpDocumentor\\') || str_starts_with($event->getEntity()->getName(), '\\phpDocumentor\\') ) { - $event->disableClassLoading(); + $event->disableEntityLoading(); } } } diff --git a/src/LanguageHandler/Php/Plugin/CorePlugin/BasePhpStubber/PhpUnitStubberPlugin.php b/src/LanguageHandler/Php/Plugin/CorePlugin/BasePhpStubber/PhpUnitStubberPlugin.php index 730c14f7..8eacc036 100644 --- a/src/LanguageHandler/Php/Plugin/CorePlugin/BasePhpStubber/PhpUnitStubberPlugin.php +++ b/src/LanguageHandler/Php/Plugin/CorePlugin/BasePhpStubber/PhpUnitStubberPlugin.php @@ -6,7 +6,7 @@ use BumbleDocGen\Core\Plugin\Event\Renderer\OnGettingResourceLink; use BumbleDocGen\Core\Plugin\PluginInterface; -use BumbleDocGen\LanguageHandler\Php\Plugin\Event\Entity\OnCheckIsEntityCanBeLoad; +use BumbleDocGen\LanguageHandler\Php\Plugin\Event\Entity\OnCheckIsEntityCanBeLoaded; /** * Adding links to the documentation of PHP classes in the \PHPUnit namespace @@ -17,7 +17,7 @@ public static function getSubscribedEvents(): array { return [ OnGettingResourceLink::class => 'onGettingResourceLink', - OnCheckIsEntityCanBeLoad::class => 'onCheckIsClassEntityCanBeLoad', + OnCheckIsEntityCanBeLoaded::class => 'onCheckIsEntityCanBeLoaded', ]; } @@ -36,13 +36,13 @@ final public function onGettingResourceLink(OnGettingResourceLink $event): void } } - final public function onCheckIsClassEntityCanBeLoad(OnCheckIsEntityCanBeLoad $event): void + final public function onCheckIsEntityCanBeLoaded(OnCheckIsEntityCanBeLoaded $event): void { if ( str_starts_with($event->getEntity()->getName(), 'PHPUnit\\') || str_starts_with($event->getEntity()->getName(), '\\PHPUnit\\') ) { - $event->disableClassLoading(); + $event->disableEntityLoading(); } } } diff --git a/src/LanguageHandler/Php/Plugin/CorePlugin/ComposerPackagesStubber/StubberPlugin.php b/src/LanguageHandler/Php/Plugin/CorePlugin/ComposerPackagesStubber/StubberPlugin.php index 1776cc19..a896c048 100644 --- a/src/LanguageHandler/Php/Plugin/CorePlugin/ComposerPackagesStubber/StubberPlugin.php +++ b/src/LanguageHandler/Php/Plugin/CorePlugin/ComposerPackagesStubber/StubberPlugin.php @@ -7,7 +7,7 @@ use BumbleDocGen\Core\Plugin\Event\Renderer\OnGettingResourceLink; use BumbleDocGen\Core\Plugin\PluginInterface; use BumbleDocGen\LanguageHandler\Php\Parser\ComposerHelper; -use BumbleDocGen\LanguageHandler\Php\Plugin\Event\Entity\OnCheckIsEntityCanBeLoad; +use BumbleDocGen\LanguageHandler\Php\Plugin\Event\Entity\OnCheckIsEntityCanBeLoaded; /** * The plugin allows you to automatically provide links to github repositories for documented classes from libraries included in composer @@ -24,7 +24,7 @@ public static function getSubscribedEvents(): array { return [ OnGettingResourceLink::class => 'onGettingResourceLink', - OnCheckIsEntityCanBeLoad::class => 'onCheckIsClassEntityCanBeLoad', + OnCheckIsEntityCanBeLoaded::class => 'onCheckIsEntityCanBeLoaded', ]; } @@ -57,10 +57,10 @@ final public function onGettingResourceLink(OnGettingResourceLink $event): void /** * @throws \Exception */ - final public function onCheckIsClassEntityCanBeLoad(OnCheckIsEntityCanBeLoad $event): void + final public function onCheckIsEntityCanBeLoaded(OnCheckIsEntityCanBeLoaded $event): void { if ($this->composerHelper->getComposerPackageDataByClassName($event->getEntity()->getName())) { - $event->disableClassLoading(); + $event->disableEntityLoading(); } } } diff --git a/src/LanguageHandler/Php/Plugin/Event/Entity/OnCheckIsEntityCanBeLoad.php b/src/LanguageHandler/Php/Plugin/Event/Entity/OnCheckIsEntityCanBeLoad.php deleted file mode 100644 index 4a978171..00000000 --- a/src/LanguageHandler/Php/Plugin/Event/Entity/OnCheckIsEntityCanBeLoad.php +++ /dev/null @@ -1,32 +0,0 @@ -entity; - } - - public function disableClassLoading(): void - { - $this->classCanBeLoad = false; - } - - public function isClassCanBeLoad(): bool - { - return $this->classCanBeLoad; - } -} diff --git a/src/LanguageHandler/Php/Plugin/Event/Entity/OnCheckIsEntityCanBeLoaded.php b/src/LanguageHandler/Php/Plugin/Event/Entity/OnCheckIsEntityCanBeLoaded.php new file mode 100644 index 00000000..57f1a2dc --- /dev/null +++ b/src/LanguageHandler/Php/Plugin/Event/Entity/OnCheckIsEntityCanBeLoaded.php @@ -0,0 +1,32 @@ +entity; + } + + public function disableEntityLoading(): void + { + $this->isEntityCanBeLoaded = false; + } + + public function isEntityCanBeLoaded(): bool + { + return $this->isEntityCanBeLoaded; + } +} From 663bb34286bee86705e8a8a1d1bdfac852dac71c Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Sun, 26 Nov 2023 14:22:07 +0300 Subject: [PATCH 108/210] Optimizing adding entities to a collection --- .../Cache/CacheablePhpEntityFactory.php | 48 +++++++++++++------ .../Parser/Entity/PhpEntitiesCollection.php | 46 ++++++++++++------ 2 files changed, 65 insertions(+), 29 deletions(-) diff --git a/src/LanguageHandler/Php/Parser/Entity/Cache/CacheablePhpEntityFactory.php b/src/LanguageHandler/Php/Parser/Entity/Cache/CacheablePhpEntityFactory.php index 3a2932d9..52edfcf0 100644 --- a/src/LanguageHandler/Php/Parser/Entity/Cache/CacheablePhpEntityFactory.php +++ b/src/LanguageHandler/Php/Parser/Entity/Cache/CacheablePhpEntityFactory.php @@ -138,7 +138,8 @@ public function createDynamicMethodEntity( public function createClassLikeEntity( PhpEntitiesCollection $entitiesCollection, string $className, - ?string $relativeFileName = null + ?string $relativeFileName = null, + ?string $entityClassName = null ): ClassLikeEntity { $className = ClassLikeEntity::normalizeClassName($className); $objectId = md5($className); @@ -147,21 +148,38 @@ public function createClassLikeEntity( } catch (ObjectNotFoundException) { } - $fileName = $this->composerHelper->getComposerClassLoader()->findFile($className); - $entityClassName = ClassEntity::class; - if ($fileName) { - $shortClassNameLS = mb_strtolower(array_reverse(explode('\\', $className))[0]); - preg_match( - '/^(\s+)?(interface|trait|((final|abstract)\s+)?class|enum)(\s+)(' . $shortClassNameLS . ')/m', - mb_strtolower(file_get_contents($fileName)), - $matches + if (!$entityClassName) { + $fileName = $this->composerHelper->getComposerClassLoader()->findFile($className); + $entityClassName = ClassEntity::class; + if ($fileName) { + $shortClassNameLS = mb_strtolower(array_reverse(explode('\\', $className))[0]); + preg_match( + '/^(\s+)?(interface|trait|((final|abstract)\s+)?class|enum)(\s+)(' . $shortClassNameLS . ')/m', + mb_strtolower(file_get_contents($fileName)), + $matches + ); + $entityClassName = match ($matches[2] ?? '') { + 'interface' => InterfaceEntity::class, + 'trait' => TraitEntity::class, + 'enum' => EnumEntity::class, + default => ClassEntity::class + }; + } + } else { + $entityClassName = ClassLikeEntity::normalizeClassName($entityClassName); + } + + if ( + !in_array($entityClassName, [ + InterfaceEntity::class, + TraitEntity::class, + EnumEntity::class, + ClassEntity::class + ]) && !is_a($entityClassName, ClassLikeEntity::class, true) + ) { + throw new \RuntimeException( + 'The $entityClassName parameter must contain the name of the class that is a subclass of ' . ClassLikeEntity::class ); - $entityClassName = match ($matches[2] ?? '') { - 'interface' => InterfaceEntity::class, - 'trait' => TraitEntity::class, - 'enum' => EnumEntity::class, - default => ClassEntity::class - }; } $wrapperClassName = $this->getOrCreateEntityClassWrapper($entityClassName); diff --git a/src/LanguageHandler/Php/Parser/Entity/PhpEntitiesCollection.php b/src/LanguageHandler/Php/Parser/Entity/PhpEntitiesCollection.php index 45c0a768..4c1afcda 100644 --- a/src/LanguageHandler/Php/Parser/Entity/PhpEntitiesCollection.php +++ b/src/LanguageHandler/Php/Parser/Entity/PhpEntitiesCollection.php @@ -21,6 +21,7 @@ use DI\DependencyException; use DI\NotFoundException; use PhpParser\Node\Stmt\Class_ as ClassNode; +use PhpParser\Node\Stmt\ClassLike; use PhpParser\Node\Stmt\Enum_ as EnumNode; use PhpParser\Node\Stmt\Interface_ as InterfaceNode; use PhpParser\Node\Stmt\Namespace_; @@ -84,12 +85,13 @@ public function loadClassEntities(): void ->getCommonFinder() ->files() ); - $addedFilesCount = 0; $nodeTraverser = new NodeTraverser(); $nodeTraverser->addVisitor(new NameResolver()); $phpParser = $this->phpParserHelper->phpParser(); + $addedEntitiesCount = 0; + $allEntitiesCount = 0; foreach ($pb->iterate($allFiles) as $file) { if (!preg_match(self::PHP_FILE_TEMPLATE, $file->getPathName())) { continue; @@ -105,28 +107,43 @@ public function loadClassEntities(): void $relativeFileName = str_replace($this->configuration->getProjectRoot(), '', $pathName); $pb->setStepDescription("Processing `{$relativeFileName}` file"); foreach ($nodes as $node) { - if (!$node instanceof Namespace_) { - continue; + $classStmts = []; + $namespaceName = ''; + if ($node instanceof ClassLike) { + $classStmts = [$node]; + } elseif ($node instanceof Namespace_) { + $namespaceName = $node->name->toString(); + $classStmts = $node->stmts; } - $namespaceName = $node->name->toString(); - foreach ($node->stmts as $subNode) { - if (!in_array(get_class($subNode), [ClassNode::class, InterfaceNode::class, TraitNode::class, EnumNode::class])) { + + foreach ($classStmts as $subNode) { + $entityClassName = match (get_class($subNode)) { + ClassNode::class => ClassEntity::class, + InterfaceNode::class => InterfaceEntity::class, + TraitNode::class => TraitEntity::class, + EnumNode::class => EnumEntity::class, + default => null + }; + + if (is_null($entityClassName)) { continue; } $className = $subNode->name->toString(); $classEntity = $this->cacheablePhpEntityFactory->createClassLikeEntity( - $this, - "{$namespaceName}\\{$className}", - $relativeFileName + entitiesCollection: $this, + className: $namespaceName ? "{$namespaceName}\\{$className}" : $className, + relativeFileName: $relativeFileName, + entityClassName: $entityClassName ); if ($classEntity->isEntityCacheOutdated()) { $classEntity->setCustomAst($subNode); } + ++$allEntitiesCount; if ($classEntityFilter->canAddToCollection($classEntity)) { $this->add($classEntity); - ++$addedFilesCount; + ++$addedEntitiesCount; } } } @@ -134,13 +151,14 @@ public function loadClassEntities(): void $this->pluginEventDispatcher->dispatch(new AfterLoadingPhpEntitiesCollection($this)); $allFilesCount = count($allFiles); - $skipped = $allFilesCount - $addedFilesCount; + $skipped = $allEntitiesCount - $addedEntitiesCount; $totalAddedEntities = count($this->entities); - $addedByPlugins = $totalAddedEntities - $addedFilesCount; + $addedByPlugins = $totalAddedEntities - $allEntitiesCount; $this->io->table([], [ - ['Processed files:', "{$addedFilesCount}"], - ['Skipped files:', "{$skipped}"], + ['Processed files:', "{$allFilesCount}"], + ['Processed entities:', "{$allEntitiesCount}"], + ['Skipped entities:', "{$skipped}"], ['Entities added by plugins:', "{$addedByPlugins}"], ['Total added entities:', "{$totalAddedEntities}"], ]); From 77f174696bda1f97cc6ffec2c5fc78c3a8abf919 Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Sun, 26 Nov 2023 14:24:40 +0300 Subject: [PATCH 109/210] Removing old method --- .../Cache/CacheablePhpEntityFactory.php | 31 ------------------- 1 file changed, 31 deletions(-) diff --git a/src/LanguageHandler/Php/Parser/Entity/Cache/CacheablePhpEntityFactory.php b/src/LanguageHandler/Php/Parser/Entity/Cache/CacheablePhpEntityFactory.php index 52edfcf0..1e223d94 100644 --- a/src/LanguageHandler/Php/Parser/Entity/Cache/CacheablePhpEntityFactory.php +++ b/src/LanguageHandler/Php/Parser/Entity/Cache/CacheablePhpEntityFactory.php @@ -193,37 +193,6 @@ public function createClassLikeEntity( return $classEntity; } - /** - * @throws DependencyException - * @throws NotFoundException - */ - public function createSubClassEntity( - string $subClassEntity, - PhpEntitiesCollection $entitiesCollection, - string $className, - ?string $relativeFileName - ): ClassLikeEntity { - if (!is_a($subClassEntity, ClassLikeEntity::class, true)) { - throw new \RuntimeException( - 'The class must inherit from `' . ClassEntity::class . '`' - ); - } - $className = ClassLikeEntity::normalizeClassName($className); - $objectId = md5($className); - try { - return $this->localObjectCache->getMethodCachedResult(__METHOD__, $objectId); - } catch (ObjectNotFoundException) { - } - $wrapperClassName = $this->getOrCreateEntityClassWrapper($subClassEntity); - $classEntity = $this->diContainer->make($wrapperClassName, [ - 'entitiesCollection' => $entitiesCollection, - 'className' => $className, - 'relativeFileName' => $relativeFileName - ]); - $this->localObjectCache->cacheMethodResult(__METHOD__, $objectId, $classEntity); - return $classEntity; - } - private function getOrCreateEntityClassWrapper(string $entityClassName): string { try { From 5b8009711d1c6b13c755e184464e2552611a83eb Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Sun, 26 Nov 2023 14:33:51 +0300 Subject: [PATCH 110/210] Adding description --- .../Cache/CacheablePhpEntityFactory.php | 138 ++++++++++-------- 1 file changed, 75 insertions(+), 63 deletions(-) diff --git a/src/LanguageHandler/Php/Parser/Entity/Cache/CacheablePhpEntityFactory.php b/src/LanguageHandler/Php/Parser/Entity/Cache/CacheablePhpEntityFactory.php index 1e223d94..60cc2059 100644 --- a/src/LanguageHandler/Php/Parser/Entity/Cache/CacheablePhpEntityFactory.php +++ b/src/LanguageHandler/Php/Parser/Entity/Cache/CacheablePhpEntityFactory.php @@ -35,6 +35,75 @@ public function __construct( } /** + * Create a child entity ClassLikeEntity in which the CacheableMethod attributes will be processed to cache the results of the methods + * + * @api + * + * @throws DependencyException + * @throws NotFoundException + * @throws InvalidConfigurationParameterException + */ + public function createClassLikeEntity( + PhpEntitiesCollection $entitiesCollection, + string $className, + ?string $relativeFileName = null, + ?string $entityClassName = null + ): ClassLikeEntity { + $className = ClassLikeEntity::normalizeClassName($className); + $objectId = md5($className); + try { + return $this->localObjectCache->getMethodCachedResult(__METHOD__, $objectId); + } catch (ObjectNotFoundException) { + } + + if (!$entityClassName) { + $fileName = $this->composerHelper->getComposerClassLoader()->findFile($className); + $entityClassName = ClassEntity::class; + if ($fileName) { + $shortClassNameLS = mb_strtolower(array_reverse(explode('\\', $className))[0]); + preg_match( + '/^(\s+)?(interface|trait|((final|abstract)\s+)?class|enum)(\s+)(' . $shortClassNameLS . ')/m', + mb_strtolower(file_get_contents($fileName)), + $matches + ); + $entityClassName = match ($matches[2] ?? '') { + 'interface' => InterfaceEntity::class, + 'trait' => TraitEntity::class, + 'enum' => EnumEntity::class, + default => ClassEntity::class + }; + } + } else { + $entityClassName = ClassLikeEntity::normalizeClassName($entityClassName); + } + + if ( + !in_array($entityClassName, [ + InterfaceEntity::class, + TraitEntity::class, + EnumEntity::class, + ClassEntity::class + ]) && !is_a($entityClassName, ClassLikeEntity::class, true) + ) { + throw new \RuntimeException( + 'The $entityClassName parameter must contain the name of the class that is a subclass of ' . ClassLikeEntity::class + ); + } + + $wrapperClassName = $this->getOrCreateEntityClassWrapper($entityClassName); + /** @var ClassLikeEntity $classEntity */ + $classEntity = $this->diContainer->make($wrapperClassName, [ + 'entitiesCollection' => $entitiesCollection, + 'className' => $className, + 'relativeFileName' => $relativeFileName + ]); + $this->localObjectCache->cacheMethodResult(__METHOD__, $objectId, $classEntity); + return $classEntity; + } + + /** + * @internal + * * @throws DependencyException * @throws NotFoundException */ @@ -59,6 +128,8 @@ public function createPropertyEntity( } /** + * @internal + * * @throws DependencyException * @throws NotFoundException */ @@ -85,6 +156,8 @@ public function createClassConstantEntity( } /** + * @internal + * * @throws DependencyException * @throws NotFoundException */ @@ -109,6 +182,8 @@ public function createMethodEntity( } /** + * @internal + * * @throws DependencyException * @throws NotFoundException */ @@ -130,69 +205,6 @@ public function createDynamicMethodEntity( return $methodEntity; } - /** - * @throws DependencyException - * @throws NotFoundException - * @throws InvalidConfigurationParameterException - */ - public function createClassLikeEntity( - PhpEntitiesCollection $entitiesCollection, - string $className, - ?string $relativeFileName = null, - ?string $entityClassName = null - ): ClassLikeEntity { - $className = ClassLikeEntity::normalizeClassName($className); - $objectId = md5($className); - try { - return $this->localObjectCache->getMethodCachedResult(__METHOD__, $objectId); - } catch (ObjectNotFoundException) { - } - - if (!$entityClassName) { - $fileName = $this->composerHelper->getComposerClassLoader()->findFile($className); - $entityClassName = ClassEntity::class; - if ($fileName) { - $shortClassNameLS = mb_strtolower(array_reverse(explode('\\', $className))[0]); - preg_match( - '/^(\s+)?(interface|trait|((final|abstract)\s+)?class|enum)(\s+)(' . $shortClassNameLS . ')/m', - mb_strtolower(file_get_contents($fileName)), - $matches - ); - $entityClassName = match ($matches[2] ?? '') { - 'interface' => InterfaceEntity::class, - 'trait' => TraitEntity::class, - 'enum' => EnumEntity::class, - default => ClassEntity::class - }; - } - } else { - $entityClassName = ClassLikeEntity::normalizeClassName($entityClassName); - } - - if ( - !in_array($entityClassName, [ - InterfaceEntity::class, - TraitEntity::class, - EnumEntity::class, - ClassEntity::class - ]) && !is_a($entityClassName, ClassLikeEntity::class, true) - ) { - throw new \RuntimeException( - 'The $entityClassName parameter must contain the name of the class that is a subclass of ' . ClassLikeEntity::class - ); - } - - $wrapperClassName = $this->getOrCreateEntityClassWrapper($entityClassName); - /** @var ClassLikeEntity $classEntity */ - $classEntity = $this->diContainer->make($wrapperClassName, [ - 'entitiesCollection' => $entitiesCollection, - 'className' => $className, - 'relativeFileName' => $relativeFileName - ]); - $this->localObjectCache->cacheMethodResult(__METHOD__, $objectId, $classEntity); - return $classEntity; - } - private function getOrCreateEntityClassWrapper(string $entityClassName): string { try { From 5e4d1af230cb739788b18155cc1312b7c44bf532 Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Sun, 26 Nov 2023 14:34:16 +0300 Subject: [PATCH 111/210] Refactor methods to get entities --- .../Php/Parser/Entity/ClassLikeEntity.php | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/LanguageHandler/Php/Parser/Entity/ClassLikeEntity.php b/src/LanguageHandler/Php/Parser/Entity/ClassLikeEntity.php index f0bea04f..450d9f47 100644 --- a/src/LanguageHandler/Php/Parser/Entity/ClassLikeEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/ClassLikeEntity.php @@ -584,11 +584,10 @@ public function getParentClass(): ?ClassLikeEntity */ public function getInterfacesEntities(): array { - $interfacesEntities = []; - foreach ($this->getInterfaceNames() as $interfaceClassName) { - $interfacesEntities[] = $this->getRootEntityCollection()->getLoadedOrCreateNew($interfaceClassName); - } - return $interfacesEntities; + return array_map( + fn(string $className): ClassLikeEntity => $this->getRootEntityCollection()->getLoadedOrCreateNew($className), + $this->getInterfaceNames() + ); } /** @@ -628,7 +627,7 @@ public function getInterfacesEntities(): array public function getTraits(): array { return array_map( - fn(string $className): TraitEntity => $this->getRootEntityCollection()->getLoadedOrCreateNew($className), + fn(string $className): ClassLikeEntity => $this->getRootEntityCollection()->getLoadedOrCreateNew($className), $this->getTraitsNames() ); } From c50693989a71eab80e1b2d90d6434c309aed448a Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Sun, 26 Nov 2023 14:46:28 +0300 Subject: [PATCH 112/210] Check to see if a class is an attribute --- .../Php/Parser/Entity/ClassEntity.php | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/LanguageHandler/Php/Parser/Entity/ClassEntity.php b/src/LanguageHandler/Php/Parser/Entity/ClassEntity.php index 6fbaec65..d065a9e5 100644 --- a/src/LanguageHandler/Php/Parser/Entity/ClassEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/ClassEntity.php @@ -45,6 +45,25 @@ public function isClass(): bool return $this->getAst()->isAbstract(); } + /** + * Check if a class is an attribute + * + * @api + * + * @throws InvalidConfigurationParameterException + */ + #[CacheableMethod] public function isAttribute(): bool + { + foreach ($this->getAst()->attrGroups as $attrGroup) { + foreach ($attrGroup->attrs as $attr) { + if ($attr->name->toString() === 'Attribute') { + return true; + } + } + } + return false; + } + /** * @inheritDoc * From f7c052f92ba244a26480fa75729cbb181b06d184 Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Sun, 26 Nov 2023 19:29:06 +0300 Subject: [PATCH 113/210] Adding generic annotations --- src/Core/Parser/Entity/RootEntityCollection.php | 17 +++++++++++++++++ .../Php/Parser/Entity/PhpEntitiesCollection.php | 3 +++ 2 files changed, 20 insertions(+) diff --git a/src/Core/Parser/Entity/RootEntityCollection.php b/src/Core/Parser/Entity/RootEntityCollection.php index eca64313..d18bcb57 100644 --- a/src/Core/Parser/Entity/RootEntityCollection.php +++ b/src/Core/Parser/Entity/RootEntityCollection.php @@ -10,6 +10,9 @@ use Psr\Cache\InvalidArgumentException; use Psr\Log\LoggerInterface; +/** + * @template T + */ abstract class RootEntityCollection extends BaseEntityCollection { #[Inject] private EntityCacheStorageHelper $entityCacheStorageHelper; @@ -18,6 +21,10 @@ abstract class RootEntityCollection extends BaseEntityCollection /** @var RootEntityInterface[] */ protected array $entities = []; + /** + * @param class-string $objectName + * @return null|T + */ public function get(string $objectName): ?RootEntityInterface { return $this->entities[$objectName] ?? null; @@ -27,10 +34,18 @@ abstract public function getEntityCollectionName(): string; /** * @warning The entity obtained as a result of executing this method may not be available for loading + * * @see RootEntityInterface::isEntityDataCanBeLoaded() + * + * @param class-string $objectName + * + * @return T */ abstract public function getLoadedOrCreateNew(string $objectName, bool $withAddClassEntityToCollectionEvent = false): RootEntityInterface; + /** + * @return null|T + */ abstract public function findEntity(string $search, bool $useUnsafeKeys = true): ?RootEntityInterface; /** @@ -38,7 +53,9 @@ abstract public function findEntity(string $search, bool $useUnsafeKeys = true): * @param string|null $defaultEntityName Entity name to use if the link does not contain a valid or existing entity name, * but only a cursor on an entity element * @param bool $useUnsafeKeys + * * @return array + * * @todo return object instead array */ abstract public function getEntityLinkData(string $rawLink, ?string $defaultEntityName = null, bool $useUnsafeKeys = true): array; diff --git a/src/LanguageHandler/Php/Parser/Entity/PhpEntitiesCollection.php b/src/LanguageHandler/Php/Parser/Entity/PhpEntitiesCollection.php index 4c1afcda..cdf0ced2 100644 --- a/src/LanguageHandler/Php/Parser/Entity/PhpEntitiesCollection.php +++ b/src/LanguageHandler/Php/Parser/Entity/PhpEntitiesCollection.php @@ -10,6 +10,7 @@ use BumbleDocGen\Core\Configuration\Configuration; use BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException; use BumbleDocGen\Core\Parser\Entity\LoggableRootEntityCollection; +use BumbleDocGen\Core\Parser\Entity\RootEntityCollection; use BumbleDocGen\Core\Parser\Entity\RootEntityInterface; use BumbleDocGen\Core\Plugin\PluginEventDispatcher; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Cache\CacheablePhpEntityFactory; @@ -34,6 +35,8 @@ /** * Collection of php root entities + * + * @implements RootEntityCollection */ final class PhpEntitiesCollection extends LoggableRootEntityCollection { From c4a923fa7ae20829fd5e3e2187bebdfc85b26475 Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Tue, 28 Nov 2023 15:49:11 +0300 Subject: [PATCH 114/210] Make it possible to pass objects to the configuration --- src/Core/Configuration/ConfigurationParameterBag.php | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/Core/Configuration/ConfigurationParameterBag.php b/src/Core/Configuration/ConfigurationParameterBag.php index 0a70f1b5..08e8c793 100644 --- a/src/Core/Configuration/ConfigurationParameterBag.php +++ b/src/Core/Configuration/ConfigurationParameterBag.php @@ -186,7 +186,11 @@ public function validateAndGetClassValue( string $classInterfaceName ): object { $value = $this->get($parameterName); - $valueObject = $this->valueToClassTransformer->transform($value); + if (is_object($value)) { + $valueObject = $value; + } else { + $valueObject = $this->valueToClassTransformer->transform($value); + } if (is_null($valueObject)) { throw new InvalidConfigurationParameterException( "Configuration parameter `{$parameterName}` contains an incorrect value" @@ -219,7 +223,11 @@ public function validateAndGetClassListValue( throw new InvalidConfigurationParameterException("Parameter `{$parameterName}` must be an array"); } foreach ($values as $i => $value) { - $valueObject = $this->valueToClassTransformer->transform($value); + if (is_object($value)) { + $valueObject = $value; + } else { + $valueObject = $this->valueToClassTransformer->transform($value); + } if (is_null($valueObject)) { throw new InvalidConfigurationParameterException( "Configuration parameter `{$parameterName}[{$i}]` contains an incorrect value" From 0981214f80adfe61918351a8ae524776cd15b5d0 Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Tue, 28 Nov 2023 15:50:56 +0300 Subject: [PATCH 115/210] Adding a way to disable caching: it is no longer necessary to specify the path to the cache file --- src/Core/Cache/EntityCacheItemPool.php | 46 ++++++++++++++++++++---- src/Core/Configuration/Configuration.php | 22 ++++++------ 2 files changed, 52 insertions(+), 16 deletions(-) diff --git a/src/Core/Cache/EntityCacheItemPool.php b/src/Core/Cache/EntityCacheItemPool.php index 72067175..124b5fc1 100644 --- a/src/Core/Cache/EntityCacheItemPool.php +++ b/src/Core/Cache/EntityCacheItemPool.php @@ -9,10 +9,14 @@ use Psr\Cache\CacheItemInterface; use Psr\Cache\CacheItemPoolInterface; use Symfony\Component\Cache\Adapter\FilesystemAdapter; +use Symfony\Component\Cache\CacheItem; +/** + * @internal + */ final class EntityCacheItemPool implements CacheItemPoolInterface { - private CacheItemPoolInterface $cacheItemPool; + private ?CacheItemPoolInterface $cacheItemPool = null; /** * @throws InvalidConfigurationParameterException @@ -21,55 +25,85 @@ public function __construct( Configuration $configuration ) { $entityNamespaceKey = md5($configuration->getOutputDir()); - $this->cacheItemPool = new FilesystemAdapter( - "entity_{$entityNamespaceKey}", - 604800, - $configuration->getCacheDir() - ); + if ($configuration->getCacheDir()) { + $this->cacheItemPool = new FilesystemAdapter( + "entity_{$entityNamespaceKey}", + 604800, + $configuration->getCacheDir() + ); + } } public function getItem(string $key): CacheItemInterface { + if (!$this->cacheItemPool) { + return new CacheItem(); + } return $this->cacheItemPool->getItem($key); } public function getItems(array $keys = []): iterable { + if (!$this->cacheItemPool) { + return []; + } return $this->cacheItemPool->getItems($keys); } public function hasItem(string $key): bool { + if (!$this->cacheItemPool) { + return false; + } + return $this->cacheItemPool->hasItem($key); } public function clear(): bool { + if (!$this->cacheItemPool) { + return false; + } return $this->cacheItemPool->clear(); } public function deleteItem(string $key): bool { + if (!$this->cacheItemPool) { + return false; + } return $this->cacheItemPool->deleteItem($key); } public function deleteItems(array $keys): bool { + if (!$this->cacheItemPool) { + return false; + } return $this->cacheItemPool->deleteItems($keys); } public function save(CacheItemInterface $item): bool { + if (!$this->cacheItemPool) { + return false; + } return $this->cacheItemPool->save($item); } public function saveDeferred(CacheItemInterface $item): bool { + if (!$this->cacheItemPool) { + return false; + } return $this->cacheItemPool->saveDeferred($item); } public function commit(): bool { + if (!$this->cacheItemPool) { + return false; + } return $this->cacheItemPool->commit(); } } diff --git a/src/Core/Configuration/Configuration.php b/src/Core/Configuration/Configuration.php index f538d02c..048132fa 100644 --- a/src/Core/Configuration/Configuration.php +++ b/src/Core/Configuration/Configuration.php @@ -201,17 +201,19 @@ public function getCacheDir(): ?string } $cacheDir = $this->parameterBag->validateAndGetStringValue('cache_dir'); - $parentDir = dirname($cacheDir); - if (!is_dir($parentDir)) { - throw new InvalidConfigurationParameterException( - "`cache_dir` cannot be created because parent directory `{$parentDir}` does not exist" - ); - } - if (!file_exists($cacheDir)) { - $this->logger->notice("Creating `{$cacheDir}` directory"); - mkdir($cacheDir); + if ($cacheDir) { + $parentDir = dirname($cacheDir); + if (!is_dir($parentDir)) { + throw new InvalidConfigurationParameterException( + "`cache_dir` cannot be created because parent directory `{$parentDir}` does not exist" + ); + } + if (!file_exists($cacheDir)) { + $this->logger->notice("Creating `{$cacheDir}` directory"); + mkdir($cacheDir); + } + $cacheDir = realpath($cacheDir); } - $cacheDir = realpath($cacheDir); $this->localObjectCache->cacheMethodResult(__METHOD__, '', $cacheDir); return $cacheDir; } From 430b1419fa798a965ec2602845d612f9d2089a19 Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Tue, 28 Nov 2023 15:58:49 +0300 Subject: [PATCH 116/210] Adding a method to display entities as an array --- src/Core/Parser/Entity/RootEntityCollection.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/Core/Parser/Entity/RootEntityCollection.php b/src/Core/Parser/Entity/RootEntityCollection.php index d18bcb57..21b82858 100644 --- a/src/Core/Parser/Entity/RootEntityCollection.php +++ b/src/Core/Parser/Entity/RootEntityCollection.php @@ -85,4 +85,9 @@ public function updateEntitiesCache(): void $this->entityCacheStorageHelper->saveCache(); } } + + public function toArray(): array + { + return $this->entities; + } } From a552609915b3939b0a110c0fd3114cc39b8a5d6b Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Tue, 28 Nov 2023 16:07:57 +0300 Subject: [PATCH 117/210] Changing parsing method --- .../Parser/Entity/RootEntityCollection.php | 6 +++-- src/Core/Parser/ProjectParser.php | 22 +++++++++++++++++- src/LanguageHandler/Php/PhpHandler.php | 23 ++++++++----------- 3 files changed, 35 insertions(+), 16 deletions(-) diff --git a/src/Core/Parser/Entity/RootEntityCollection.php b/src/Core/Parser/Entity/RootEntityCollection.php index 21b82858..149912c8 100644 --- a/src/Core/Parser/Entity/RootEntityCollection.php +++ b/src/Core/Parser/Entity/RootEntityCollection.php @@ -21,6 +21,10 @@ abstract class RootEntityCollection extends BaseEntityCollection /** @var RootEntityInterface[] */ protected array $entities = []; + abstract public function loadEntitiesByConfiguration(): void; + + abstract public function getEntityCollectionName(): string; + /** * @param class-string $objectName * @return null|T @@ -30,8 +34,6 @@ public function get(string $objectName): ?RootEntityInterface return $this->entities[$objectName] ?? null; } - abstract public function getEntityCollectionName(): string; - /** * @warning The entity obtained as a result of executing this method may not be available for loading * diff --git a/src/Core/Parser/ProjectParser.php b/src/Core/Parser/ProjectParser.php index 7c2519d0..97a3d7e7 100644 --- a/src/Core/Parser/ProjectParser.php +++ b/src/Core/Parser/ProjectParser.php @@ -6,6 +6,7 @@ use BumbleDocGen\Core\Configuration\Configuration; use BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException; +use BumbleDocGen\Core\Parser\Entity\RootEntityCollection; use BumbleDocGen\Core\Parser\Entity\RootEntityCollectionsGroup; use BumbleDocGen\Core\Plugin\Event\Parser\BeforeParsingProcess; use BumbleDocGen\Core\Plugin\PluginEventDispatcher; @@ -25,6 +26,8 @@ public function __construct( } /** + * @api + * * @throws DependencyException * @throws InvalidConfigurationParameterException * @throws NotFoundException @@ -33,8 +36,25 @@ public function parse(): RootEntityCollectionsGroup { $this->pluginEventDispatcher->dispatch(new BeforeParsingProcess()); foreach ($this->configuration->getLanguageHandlersCollection() as $languageHandler) { - $this->rootEntityCollectionsGroup->add($languageHandler->getEntityCollection()); + $collection = $languageHandler->getEntityCollection(); + $collection->loadEntitiesByConfiguration(); + $this->rootEntityCollectionsGroup->add($collection); } return $this->rootEntityCollectionsGroup; } + + /** + * @api + * + * @throws DependencyException + * @throws NotFoundException + * @throws InvalidConfigurationParameterException + */ + public function getEntityCollectionForPL(string $plHandlerClassName): ?RootEntityCollection + { + return $this->configuration + ->getLanguageHandlersCollection() + ->get($plHandlerClassName) + ?->getEntityCollection(); + } } diff --git a/src/LanguageHandler/Php/PhpHandler.php b/src/LanguageHandler/Php/PhpHandler.php index 21a072ce..f7ccb542 100644 --- a/src/LanguageHandler/Php/PhpHandler.php +++ b/src/LanguageHandler/Php/PhpHandler.php @@ -5,7 +5,6 @@ namespace BumbleDocGen\LanguageHandler\Php; use BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException; -use BumbleDocGen\Core\Parser\Entity\RootEntityCollection; use BumbleDocGen\Core\Renderer\Context\RendererContext; use BumbleDocGen\Core\Renderer\Twig\Filter\CustomFiltersCollection; use BumbleDocGen\Core\Renderer\Twig\Function\CustomFunctionsCollection; @@ -16,8 +15,10 @@ final class PhpHandler implements LanguageHandlerInterface { - public function __construct(private PhpEntitiesCollection $entitiesCollection, private PhpHandlerSettings $phpHandlerSettings) - { + public function __construct( + private PhpEntitiesCollection $entitiesCollection, + private PhpHandlerSettings $phpHandlerSettings + ) { } public static function getLanguageKey(): string @@ -25,17 +26,13 @@ public static function getLanguageKey(): string return 'php'; } - /** - * @throws NotFoundException - * @throws DependencyException - * @throws InvalidConfigurationParameterException - * @throws \Psr\Cache\InvalidArgumentException - */ - public function getEntityCollection(): RootEntityCollection + public function getPhpHandlerSettings(): PhpHandlerSettings + { + return $this->phpHandlerSettings; + } + + public function getEntityCollection(): PhpEntitiesCollection { - if ($this->entitiesCollection->isEmpty()) { - $this->entitiesCollection->loadClassEntities(); - } return $this->entitiesCollection; } From 5f19454665ee63201c3eba72829546eb0e195b40 Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Wed, 29 Nov 2023 10:36:02 +0300 Subject: [PATCH 118/210] Changing dependencies --- src/LanguageHandler/Php/Parser/Entity/BaseEntity.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/LanguageHandler/Php/Parser/Entity/BaseEntity.php b/src/LanguageHandler/Php/Parser/Entity/BaseEntity.php index f8c5c980..56624c59 100644 --- a/src/LanguageHandler/Php/Parser/Entity/BaseEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/BaseEntity.php @@ -12,6 +12,7 @@ use BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityInterface; use BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait; use BumbleDocGen\Core\Parser\Entity\Cache\CacheableMethod; +use BumbleDocGen\Core\Plugin\PluginEventDispatcher; use BumbleDocGen\Core\Renderer\RendererHelper; use BumbleDocGen\Core\Renderer\Twig\Function\GetDocumentedEntityUrl; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Data\DocBlockLink; @@ -30,6 +31,7 @@ abstract class BaseEntity implements CacheableEntityInterface { use CacheableEntityTrait; + #[Inject] private PluginEventDispatcher $pluginEventDispatcher; #[Inject] private GetDocumentedEntityUrl $documentedEntityUrlFunction; #[Inject] private RendererHelper $rendererHelper; #[Inject] private GenerationErrorsHandler $generationErrorsHandler; @@ -731,7 +733,7 @@ protected function isCurrentEntityCanBeLoad(): bool return $this->localObjectCache->getMethodCachedResult(__METHOD__, $classEntity->getObjectId()); } catch (ObjectNotFoundException) { } - $entityCanBeLoad = $this->getRootEntityCollection()->getPluginEventDispatcher()->dispatch( + $entityCanBeLoad = $this->pluginEventDispatcher->dispatch( new OnCheckIsEntityCanBeLoaded($this->getCurrentRootEntity()) )->isEntityCanBeLoaded(); $this->localObjectCache->cacheMethodResult(__METHOD__, $classEntity->getObjectId(), $entityCanBeLoad); From dd5eb72489fbf4b2723cdee17e23eb2c64a69040 Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Wed, 29 Nov 2023 10:36:42 +0300 Subject: [PATCH 119/210] Adding method to load entities --- .../Parser/Entity/PhpEntitiesCollection.php | 49 +++++++++++++------ 1 file changed, 33 insertions(+), 16 deletions(-) diff --git a/src/LanguageHandler/Php/Parser/Entity/PhpEntitiesCollection.php b/src/LanguageHandler/Php/Parser/Entity/PhpEntitiesCollection.php index cdf0ced2..3c45315f 100644 --- a/src/LanguageHandler/Php/Parser/Entity/PhpEntitiesCollection.php +++ b/src/LanguageHandler/Php/Parser/Entity/PhpEntitiesCollection.php @@ -12,6 +12,8 @@ use BumbleDocGen\Core\Parser\Entity\LoggableRootEntityCollection; use BumbleDocGen\Core\Parser\Entity\RootEntityCollection; use BumbleDocGen\Core\Parser\Entity\RootEntityInterface; +use BumbleDocGen\Core\Parser\FilterCondition\ConditionInterface; +use BumbleDocGen\Core\Parser\SourceLocator\SourceLocatorsCollection; use BumbleDocGen\Core\Plugin\PluginEventDispatcher; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Cache\CacheablePhpEntityFactory; use BumbleDocGen\LanguageHandler\Php\Parser\PhpParser\PhpParserHelper; @@ -71,23 +73,39 @@ public function getEntityCollectionName(): string } /** + * Load entities into a collection by configuration + * + * @internal + * + * @throws NotFoundException * @throws InvalidArgumentException * @throws DependencyException - * @throws NotFoundException * @throws InvalidConfigurationParameterException */ - public function loadClassEntities(): void + public function loadEntitiesByConfiguration(): void { + $this->loadEntities( + $this->configuration->getSourceLocators(), + $this->phpHandlerSettings->getClassEntityFilter() + ); + } + + /** + * Load entities into a collection + * + * @api + * + * @throws InvalidArgumentException + * @throws DependencyException + * @throws NotFoundException + * @throws InvalidConfigurationParameterException + */ + public function loadEntities( + SourceLocatorsCollection $sourceLocatorsCollection, + ?ConditionInterface $filters = null + ): void { $pb = $this->progressBarFactory->createStylizedProgressBar(); $pb->setName('Loading PHP entities'); - $classEntityFilter = $this->phpHandlerSettings->getClassEntityFilter(); - - $allFiles = iterator_to_array( - $this->configuration - ->getSourceLocators() - ->getCommonFinder() - ->files() - ); $nodeTraverser = new NodeTraverser(); $nodeTraverser->addVisitor(new NameResolver()); @@ -95,7 +113,9 @@ public function loadClassEntities(): void $addedEntitiesCount = 0; $allEntitiesCount = 0; - foreach ($pb->iterate($allFiles) as $file) { + + $allFiles = iterator_to_array($sourceLocatorsCollection->getCommonFinder()->files()); + foreach ($allFiles ? $pb->iterate($allFiles) : [] as $file) { if (!preg_match(self::PHP_FILE_TEMPLATE, $file->getPathName())) { continue; } @@ -139,12 +159,8 @@ className: $namespaceName ? "{$namespaceName}\\{$className}" : $className, entityClassName: $entityClassName ); - if ($classEntity->isEntityCacheOutdated()) { - $classEntity->setCustomAst($subNode); - } - ++$allEntitiesCount; - if ($classEntityFilter->canAddToCollection($classEntity)) { + if (!$filters || $filters->canAddToCollection($classEntity)) { $this->add($classEntity); ++$addedEntitiesCount; } @@ -457,6 +473,7 @@ public function internalFindEntity(string $search, bool $useUnsafeKeys = true): /** * @inheritDoc + * * @throws InvalidConfigurationParameterException */ public function getEntityLinkData( From d21c1e710c138d749ed19bc2a6f58a12191a8051 Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Wed, 29 Nov 2023 10:37:07 +0300 Subject: [PATCH 120/210] Adding base reflection API config --- .../Configuration/ReflectionApiConfig.php | 40 +++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 src/Core/Configuration/ReflectionApiConfig.php diff --git a/src/Core/Configuration/ReflectionApiConfig.php b/src/Core/Configuration/ReflectionApiConfig.php new file mode 100644 index 00000000..2b655991 --- /dev/null +++ b/src/Core/Configuration/ReflectionApiConfig.php @@ -0,0 +1,40 @@ +cacheDir; + } + + final public function setProjectRoot(string $projectRoot): void + { + $this->projectRoot = $projectRoot; + } + + final public function getProjectRoot(): string + { + return $this->projectRoot; + } + + final public function setCacheDir(?string $cacheDir): void + { + $this->cacheDir = $cacheDir; + } + + /** + * @return class-string + */ + abstract public function getLanguageHandlerClassName(): string; + + abstract public function toConfigArray(): array; +} From 9df381087cff99cba2dee2f1764e97c9d77950bb Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Wed, 29 Nov 2023 10:37:31 +0300 Subject: [PATCH 121/210] Adding reflection API --- src/DocGeneratorFactory.php | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/src/DocGeneratorFactory.php b/src/DocGeneratorFactory.php index e32a2201..28243085 100644 --- a/src/DocGeneratorFactory.php +++ b/src/DocGeneratorFactory.php @@ -6,6 +6,9 @@ use BumbleDocGen\Core\Configuration\Configuration; use BumbleDocGen\Core\Configuration\ConfigurationParameterBag; +use BumbleDocGen\Core\Configuration\ReflectionApiConfig; +use BumbleDocGen\Core\Parser\Entity\RootEntityCollection; +use BumbleDocGen\Core\Parser\ProjectParser; use DI\Container; use DI\ContainerBuilder; use DI\DependencyException; @@ -100,6 +103,28 @@ public function createConfiguration(string ...$configurationFiles): Configuratio } } + /** + * @throws DependencyException + * @throws NotFoundException + * @throws \Exception + */ + public function getRootEntityReflections(ReflectionApiConfig $reflectionApiConfig): RootEntityCollection + { + $diContainer = $this->buildDiContainer(); + $logger = $diContainer->get(LoggerInterface::class); + try { + /** @var ConfigurationParameterBag $configurationParameterBag */ + $configurationParameterBag = $diContainer->get(ConfigurationParameterBag::class); + $configurationParameterBag->loadFromArray($reflectionApiConfig->toConfigArray()); + return $diContainer->get(ProjectParser::class)->getEntityCollectionForPL( + $reflectionApiConfig->getLanguageHandlerClassName() + ); + } catch (\Exception $e) { + $logger->error("{$e->getMessage()} ( {$e->getFile()}:{$e->getLine()} )"); + throw new \RuntimeException($e->getMessage()); + } + } + /** * @throws \Exception */ From 3825613cc52e157286a50b3c42ff27bddfebb5ea Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Wed, 29 Nov 2023 10:45:22 +0300 Subject: [PATCH 122/210] Using composer vendor dir instead of installed json path --- src/LanguageHandler/Php/Parser/ComposerHelper.php | 5 +++-- src/LanguageHandler/Php/PhpHandlerSettings.php | 11 +++++------ .../Php/phpHandlerDefaultSettings.yaml | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/LanguageHandler/Php/Parser/ComposerHelper.php b/src/LanguageHandler/Php/Parser/ComposerHelper.php index 4225eb04..a1cf5209 100644 --- a/src/LanguageHandler/Php/Parser/ComposerHelper.php +++ b/src/LanguageHandler/Php/Parser/ComposerHelper.php @@ -80,10 +80,11 @@ public function getComposerPackages(): array if ($this->packages) { return $this->packages; } - $installedJsonFile = $this->phpHandlerSettings->getComposerInstalledFile(); - if (!$installedJsonFile) { + $composerVendorDir = $this->phpHandlerSettings->getComposerVendorDir(); + if (!$composerVendorDir) { return $this->packages; } + $installedJsonFile = "{$composerVendorDir}/composer/installed.json"; $installedPackagesData = json_decode(file_get_contents($installedJsonFile), true); foreach ($installedPackagesData['packages'] as $package) { if (!isset($package['source']['url'])) { diff --git a/src/LanguageHandler/Php/PhpHandlerSettings.php b/src/LanguageHandler/Php/PhpHandlerSettings.php index e20a95d3..10cd084b 100644 --- a/src/LanguageHandler/Php/PhpHandlerSettings.php +++ b/src/LanguageHandler/Php/PhpHandlerSettings.php @@ -190,18 +190,17 @@ public function getComposerConfigFile(): ?string /** * @throws InvalidConfigurationParameterException */ - public function getComposerInstalledFile(): ?string + public function getComposerVendorDir(): ?string { try { return $this->localObjectCache->getMethodCachedResult(__METHOD__, ''); } catch (ObjectNotFoundException) { } - $composerInstalledFile = $this->parameterBag->validateAndGetFilePathValue( - $this->getSettingsKey('composer_installed_file'), - ['json'] + $composerVendorDir = $this->parameterBag->validateAndGetDirectoryPathValue( + $this->getSettingsKey('composer_vendor_dir'), ); - $this->localObjectCache->cacheMethodResult(__METHOD__, '', $composerInstalledFile); - return $composerInstalledFile; + $this->localObjectCache->cacheMethodResult(__METHOD__, '', $composerVendorDir); + return $composerVendorDir; } /** diff --git a/src/LanguageHandler/Php/phpHandlerDefaultSettings.yaml b/src/LanguageHandler/Php/phpHandlerDefaultSettings.yaml index d80e7e1f..9bcab8a7 100644 --- a/src/LanguageHandler/Php/phpHandlerDefaultSettings.yaml +++ b/src/LanguageHandler/Php/phpHandlerDefaultSettings.yaml @@ -34,7 +34,7 @@ language_handlers: use_composer_autoload: true # whether to use composer to load the class map or not composer_config_file: "%project_root%/composer.json" - composer_installed_file: "%project_root%/vendor/composer/installed.json" + composer_vendor_dir: "%project_root%/vendor" psr4_map: # same as in composer plugins: - class: \BumbleDocGen\LanguageHandler\Php\Plugin\CorePlugin\BasePhpStubber\BasePhpStubberPlugin From 1b84129d02090b99ee0d402f662181fe211e482a Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Wed, 29 Nov 2023 10:46:09 +0300 Subject: [PATCH 123/210] Adding php reflection API config --- .../Php/PhpReflectionApiConfig.php | 134 ++++++++++++++++++ 1 file changed, 134 insertions(+) create mode 100644 src/LanguageHandler/Php/PhpReflectionApiConfig.php diff --git a/src/LanguageHandler/Php/PhpReflectionApiConfig.php b/src/LanguageHandler/Php/PhpReflectionApiConfig.php new file mode 100644 index 00000000..48ad0bb8 --- /dev/null +++ b/src/LanguageHandler/Php/PhpReflectionApiConfig.php @@ -0,0 +1,134 @@ +classFilter = new TrueCondition(); + $this->classConstantFilter = new TrueCondition(); + $this->methodFilter = new TrueCondition(); + $this->propertyFilter = new TrueCondition(); + } + + public static function create(): self + { + return new self(); + } + + public function getLanguageHandlerClassName(): string + { + return PhpHandler::class; + } + + /** + * @throws DependencyException + * @throws NotFoundException + * @throws InvalidConfigurationParameterException + */ + public static function createByConfiguration(Configuration $configuration): self + { + $phpHandler = $configuration->getLanguageHandlersCollection()->get(PhpHandler::class); + if (!$phpHandler) { + throw new \RuntimeException(); + } + $phpHandlerSettings = $phpHandler->getPhpHandlerSettings(); + + $self = new self(); + $self->projectRoot = $configuration->getProjectRoot(); + $self->cacheDir = $configuration->getCacheDir(); + $self->useComposerAutoload = $phpHandlerSettings->getUseComposerAutoload(); + $self->composerConfigFile = $phpHandlerSettings->getComposerConfigFile(); + $self->composerVendorDir = $phpHandlerSettings->getComposerVendorDir(); + $self->psr4Map = $phpHandlerSettings->getPsr4Map(); + return $self; + } + + public function setClassFilter(ConditionInterface $classFilter): void + { + $this->classFilter = $classFilter; + } + + public function setClassConstantFilter(ConditionInterface $classConstantFilter): void + { + $this->classConstantFilter = $classConstantFilter; + } + + public function setPropertyFilter(ConditionInterface $propertyFilter): void + { + $this->propertyFilter = $propertyFilter; + } + + public function setMethodFilter(ConditionInterface $methodFilter): void + { + $this->methodFilter = $methodFilter; + } + + public function useComposerAutoload(): void + { + $this->useComposerAutoload = true; + } + + public function disableComposerAutoload(): void + { + $this->useComposerAutoload = false; + } + + public function setComposerConfigFile(string $composerConfigFile): void + { + $this->composerConfigFile = $composerConfigFile; + } + + public function setComposerVendorPath(string $composerInstalledFile): void + { + $this->composerVendorDir = $composerInstalledFile; + } + + public function setPsr4Map(array $psr4Map): void + { + $this->psr4Map = $psr4Map; + } + + public function toConfigArray(): array + { + return [ + 'project_root' => $this->getProjectRoot(), + 'cache_dir' => $this->getCacheDir(), + 'language_handlers' => [ + 'php' => [ + 'class' => $this->getLanguageHandlerClassName(), + 'settings' => [ + 'use_composer_autoload' => $this->useComposerAutoload, + 'composer_config_file' => $this->composerConfigFile, + 'composer_vendor_dir' => $this->composerVendorDir, + 'psr4_map' => $this->psr4Map, + 'class_filter' => $this->classFilter, + 'class_constant_filter' => $this->classConstantFilter, + 'method_filter' => $this->methodFilter, + 'property_filter' => $this->propertyFilter + ] + ] + ] + ]; + } +} From f850eabf8d538e47df1025b895e1f3b7a6858252 Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Wed, 29 Nov 2023 11:11:32 +0300 Subject: [PATCH 124/210] Fixing entities counters --- src/LanguageHandler/Php/Parser/Entity/PhpEntitiesCollection.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/LanguageHandler/Php/Parser/Entity/PhpEntitiesCollection.php b/src/LanguageHandler/Php/Parser/Entity/PhpEntitiesCollection.php index 3c45315f..e067bce7 100644 --- a/src/LanguageHandler/Php/Parser/Entity/PhpEntitiesCollection.php +++ b/src/LanguageHandler/Php/Parser/Entity/PhpEntitiesCollection.php @@ -172,7 +172,7 @@ className: $namespaceName ? "{$namespaceName}\\{$className}" : $className, $allFilesCount = count($allFiles); $skipped = $allEntitiesCount - $addedEntitiesCount; $totalAddedEntities = count($this->entities); - $addedByPlugins = $totalAddedEntities - $allEntitiesCount; + $addedByPlugins = $totalAddedEntities - $addedEntitiesCount; $this->io->table([], [ ['Processed files:', "{$allFilesCount}"], From 569f4315c25b56b3b414e4caed485a8d89823799 Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Wed, 29 Nov 2023 11:54:40 +0300 Subject: [PATCH 125/210] Changing loading entities algo --- .../templates/tech/2.parser/readme.md.twig | 3 +- .../CollectionGroupLoadEntitiesResult.php | 44 +++++++++++++++++++ .../Entity/CollectionLoadEntitiesResult.php | 42 ++++++++++++++++++ .../Parser/Entity/RootEntityCollection.php | 9 +++- .../Entity/RootEntityCollectionsGroup.php | 13 ++++++ src/Core/Parser/ProjectParser.php | 15 ++++--- src/DocGenerator.php | 15 +++++-- .../Parser/Entity/PhpEntitiesCollection.php | 23 +++++----- 8 files changed, 140 insertions(+), 24 deletions(-) create mode 100644 src/Core/Parser/Entity/CollectionGroupLoadEntitiesResult.php create mode 100644 src/Core/Parser/Entity/CollectionLoadEntitiesResult.php diff --git a/selfdoc/templates/tech/2.parser/readme.md.twig b/selfdoc/templates/tech/2.parser/readme.md.twig index 76ee1214..f78752a1 100644 --- a/selfdoc/templates/tech/2.parser/readme.md.twig +++ b/selfdoc/templates/tech/2.parser/readme.md.twig @@ -19,7 +19,8 @@ In this section, we show how the parser works and what components it consists of {{ "$parser = new ProjectParser($configuration, $rootEntityCollectionsGroup); // Parsing the project and filling RootEntityCollectionsGroup with data -$rootEntityCollectionsGroup = $this->parser->parse();" | textToCodeBlock('php') }} +$this->parser->parse(); +$rootEntityCollectionsGroup = $this->parser->getRootEntityCollectionsGroup();" | textToCodeBlock('php') }} {{ "How it works" | textToHeading('H2') }} diff --git a/src/Core/Parser/Entity/CollectionGroupLoadEntitiesResult.php b/src/Core/Parser/Entity/CollectionGroupLoadEntitiesResult.php new file mode 100644 index 00000000..16463f8e --- /dev/null +++ b/src/Core/Parser/Entity/CollectionGroupLoadEntitiesResult.php @@ -0,0 +1,44 @@ +, CollectionLoadEntitiesResult> + */ + private array $collectionLoadEntitiesResults = []; + + public function addResult(string $collectionName, CollectionLoadEntitiesResult $collectionLoadEntitiesResult): void + { + $this->collectionLoadEntitiesResults[$collectionName] = $collectionLoadEntitiesResult; + } + + public function getSummary(): CollectionLoadEntitiesResult + { + $processedFilesCount = 0; + $processedEntitiesCount = 0; + $skippedEntitiesCount = 0; + $entitiesAddedByPluginsCount = 0; + $totalAddedEntities = 0; + foreach ($this->collectionLoadEntitiesResults as $collectionLoadEntitiesResult) { + $processedFilesCount += $collectionLoadEntitiesResult->getProcessedFilesCount(); + $processedEntitiesCount += $collectionLoadEntitiesResult->getProcessedEntitiesCount(); + $skippedEntitiesCount += $collectionLoadEntitiesResult->getSkippedEntitiesCount(); + $entitiesAddedByPluginsCount += $collectionLoadEntitiesResult->getEntitiesAddedByPluginsCount(); + $totalAddedEntities += $collectionLoadEntitiesResult->getTotalAddedEntities(); + } + + return new CollectionLoadEntitiesResult( + $processedFilesCount, + $processedEntitiesCount, + $skippedEntitiesCount, + $entitiesAddedByPluginsCount, + $totalAddedEntities + ); + } +} diff --git a/src/Core/Parser/Entity/CollectionLoadEntitiesResult.php b/src/Core/Parser/Entity/CollectionLoadEntitiesResult.php new file mode 100644 index 00000000..d0a14680 --- /dev/null +++ b/src/Core/Parser/Entity/CollectionLoadEntitiesResult.php @@ -0,0 +1,42 @@ +entitiesAddedByPluginsCount; + } + + public function getProcessedEntitiesCount(): int + { + return $this->processedEntitiesCount; + } + + public function getProcessedFilesCount(): int + { + return $this->processedFilesCount; + } + + public function getSkippedEntitiesCount(): int + { + return $this->skippedEntitiesCount; + } + + public function getTotalAddedEntities(): int + { + return $this->totalAddedEntities; + } +} diff --git a/src/Core/Parser/Entity/RootEntityCollection.php b/src/Core/Parser/Entity/RootEntityCollection.php index 149912c8..7ea95316 100644 --- a/src/Core/Parser/Entity/RootEntityCollection.php +++ b/src/Core/Parser/Entity/RootEntityCollection.php @@ -6,6 +6,8 @@ use BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityInterface; use BumbleDocGen\Core\Parser\Entity\Cache\EntityCacheStorageHelper; +use BumbleDocGen\Core\Parser\FilterCondition\ConditionInterface; +use BumbleDocGen\Core\Parser\SourceLocator\SourceLocatorsCollection; use DI\Attribute\Inject; use Psr\Cache\InvalidArgumentException; use Psr\Log\LoggerInterface; @@ -21,7 +23,12 @@ abstract class RootEntityCollection extends BaseEntityCollection /** @var RootEntityInterface[] */ protected array $entities = []; - abstract public function loadEntitiesByConfiguration(): void; + abstract public function loadEntitiesByConfiguration(): CollectionLoadEntitiesResult; + + abstract public function loadEntities( + SourceLocatorsCollection $sourceLocatorsCollection, + ?ConditionInterface $filters = null + ): CollectionLoadEntitiesResult; abstract public function getEntityCollectionName(): string; diff --git a/src/Core/Parser/Entity/RootEntityCollectionsGroup.php b/src/Core/Parser/Entity/RootEntityCollectionsGroup.php index 68b5215b..154dd971 100644 --- a/src/Core/Parser/Entity/RootEntityCollectionsGroup.php +++ b/src/Core/Parser/Entity/RootEntityCollectionsGroup.php @@ -4,6 +4,7 @@ namespace BumbleDocGen\Core\Parser\Entity; +use BumbleDocGen\LanguageHandler\LanguageHandlersCollection; use Psr\Cache\InvalidArgumentException; final class RootEntityCollectionsGroup implements \IteratorAggregate @@ -18,6 +19,18 @@ public function getIterator(): \Generator yield from $this->rootEntityCollections; } + public function loadByLanguageHandlers(LanguageHandlersCollection $languageHandlersCollection): CollectionGroupLoadEntitiesResult + { + $collectionGroupLoadEntitiesResult = new CollectionGroupLoadEntitiesResult(); + foreach ($languageHandlersCollection as $languageHandler) { + $collection = $languageHandler->getEntityCollection(); + $loadResult = $collection->loadEntitiesByConfiguration(); + $collectionGroupLoadEntitiesResult->addResult($languageHandler::class, $loadResult); + $this->add($collection); + } + return $collectionGroupLoadEntitiesResult; + } + public function add(RootEntityCollection $rootEntityCollection): void { $this->rootEntityCollections[$rootEntityCollection->getEntityCollectionName()] = $rootEntityCollection; diff --git a/src/Core/Parser/ProjectParser.php b/src/Core/Parser/ProjectParser.php index 97a3d7e7..12e599ae 100644 --- a/src/Core/Parser/ProjectParser.php +++ b/src/Core/Parser/ProjectParser.php @@ -6,6 +6,7 @@ use BumbleDocGen\Core\Configuration\Configuration; use BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException; +use BumbleDocGen\Core\Parser\Entity\CollectionGroupLoadEntitiesResult; use BumbleDocGen\Core\Parser\Entity\RootEntityCollection; use BumbleDocGen\Core\Parser\Entity\RootEntityCollectionsGroup; use BumbleDocGen\Core\Plugin\Event\Parser\BeforeParsingProcess; @@ -32,14 +33,16 @@ public function __construct( * @throws InvalidConfigurationParameterException * @throws NotFoundException */ - public function parse(): RootEntityCollectionsGroup + public function parse(): CollectionGroupLoadEntitiesResult { $this->pluginEventDispatcher->dispatch(new BeforeParsingProcess()); - foreach ($this->configuration->getLanguageHandlersCollection() as $languageHandler) { - $collection = $languageHandler->getEntityCollection(); - $collection->loadEntitiesByConfiguration(); - $this->rootEntityCollectionsGroup->add($collection); - } + return $this->rootEntityCollectionsGroup->loadByLanguageHandlers( + $this->configuration->getLanguageHandlersCollection() + ); + } + + public function getRootEntityCollectionsGroup(): RootEntityCollectionsGroup + { return $this->rootEntityCollectionsGroup; } diff --git a/src/DocGenerator.php b/src/DocGenerator.php index 6c8b234b..dbdfd435 100644 --- a/src/DocGenerator.php +++ b/src/DocGenerator.php @@ -137,9 +137,7 @@ public function addDocBlocks( $classFileLines = explode("\n", $classFileContent); foreach ($newBocBlocks as $method => $docBlock) { $methodEntity = $entity->getMethod($method, true); - $lineNumber = $docCommentLine = $methodEntity->getDocComment() ? $methodEntity->getDocBlock( - false - )->getLocation()?->getLineNumber() : null; + $lineNumber = $docCommentLine = $methodEntity->getDocComment() ? $methodEntity->getDocBlock()->getLocation()?->getLineNumber() : null; $lineNumber = $lineNumber ?: $methodEntity->getStartLine(); foreach (file($entity->getAbsoluteFileName(), FILE_IGNORE_NEW_LINES) as $line => $lineContent) { @@ -255,7 +253,16 @@ public function generate(): void $memory = memory_get_usage(true); try { - $this->parser->parse(); + $result = $this->parser->parse(); + $resSummary = $result->getSummary(); + $this->io->table([], [ + ['Processed files:', "{$resSummary->getProcessedFilesCount()}"], + ['Processed entities:', "{$resSummary->getProcessedEntitiesCount()}"], + ['Skipped entities:', "{$resSummary->getSkippedEntitiesCount()}"], + ['Entities added by plugins:', "{$resSummary->getEntitiesAddedByPluginsCount()}"], + ['Total added entities:', "{$resSummary->getTotalAddedEntities()}"], + ]); + $this->renderer->run(); } catch (Exception $e) { $this->logger->critical( diff --git a/src/LanguageHandler/Php/Parser/Entity/PhpEntitiesCollection.php b/src/LanguageHandler/Php/Parser/Entity/PhpEntitiesCollection.php index e067bce7..5df051c4 100644 --- a/src/LanguageHandler/Php/Parser/Entity/PhpEntitiesCollection.php +++ b/src/LanguageHandler/Php/Parser/Entity/PhpEntitiesCollection.php @@ -9,6 +9,7 @@ use BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache; use BumbleDocGen\Core\Configuration\Configuration; use BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException; +use BumbleDocGen\Core\Parser\Entity\CollectionLoadEntitiesResult; use BumbleDocGen\Core\Parser\Entity\LoggableRootEntityCollection; use BumbleDocGen\Core\Parser\Entity\RootEntityCollection; use BumbleDocGen\Core\Parser\Entity\RootEntityInterface; @@ -33,7 +34,6 @@ use PhpParser\NodeVisitor\NameResolver; use Psr\Cache\InvalidArgumentException; use Psr\Log\LoggerInterface; -use Symfony\Component\Console\Style\OutputStyle; /** * Collection of php root entities @@ -56,7 +56,6 @@ public function __construct( private PhpParserHelper $phpParserHelper, private LocalObjectCache $localObjectCache, private ProgressBarFactory $progressBarFactory, - private OutputStyle $io, private LoggerInterface $logger, ) { parent::__construct(); @@ -82,9 +81,9 @@ public function getEntityCollectionName(): string * @throws DependencyException * @throws InvalidConfigurationParameterException */ - public function loadEntitiesByConfiguration(): void + public function loadEntitiesByConfiguration(): CollectionLoadEntitiesResult { - $this->loadEntities( + return $this->loadEntities( $this->configuration->getSourceLocators(), $this->phpHandlerSettings->getClassEntityFilter() ); @@ -103,7 +102,7 @@ public function loadEntitiesByConfiguration(): void public function loadEntities( SourceLocatorsCollection $sourceLocatorsCollection, ?ConditionInterface $filters = null - ): void { + ): CollectionLoadEntitiesResult { $pb = $this->progressBarFactory->createStylizedProgressBar(); $pb->setName('Loading PHP entities'); @@ -174,13 +173,13 @@ className: $namespaceName ? "{$namespaceName}\\{$className}" : $className, $totalAddedEntities = count($this->entities); $addedByPlugins = $totalAddedEntities - $addedEntitiesCount; - $this->io->table([], [ - ['Processed files:', "{$allFilesCount}"], - ['Processed entities:', "{$allEntitiesCount}"], - ['Skipped entities:', "{$skipped}"], - ['Entities added by plugins:', "{$addedByPlugins}"], - ['Total added entities:', "{$totalAddedEntities}"], - ]); + return new CollectionLoadEntitiesResult( + processedFilesCount: $allFilesCount, + processedEntitiesCount: $allEntitiesCount, + skippedEntitiesCount: $skipped, + entitiesAddedByPluginsCount: $addedByPlugins, + totalAddedEntities: $totalAddedEntities + ); } /** From 2b43b57589e8b91c255a89db005045d14da21728 Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Wed, 29 Nov 2023 20:25:58 +0300 Subject: [PATCH 126/210] Changing the logic of the progress bar --- .../ProgressBar/StylizedProgressBar.php | 8 +++++++- .../EntitiesLoaderProgressBarInterface.php | 14 ++++++++++++++ .../Parser/Entity/RootEntityCollection.php | 5 +++-- .../Entity/RootEntityCollectionsGroup.php | 8 +++++--- src/Core/Parser/ProjectParser.php | 6 ++++-- src/DocGenerator.php | 6 +++++- .../Parser/Entity/PhpEntitiesCollection.php | 18 +++++++++--------- 7 files changed, 47 insertions(+), 18 deletions(-) create mode 100644 src/Core/Parser/Entity/EntitiesLoaderProgressBarInterface.php diff --git a/src/Console/ProgressBar/StylizedProgressBar.php b/src/Console/ProgressBar/StylizedProgressBar.php index 493b6458..a22e004d 100644 --- a/src/Console/ProgressBar/StylizedProgressBar.php +++ b/src/Console/ProgressBar/StylizedProgressBar.php @@ -4,10 +4,11 @@ namespace BumbleDocGen\Console\ProgressBar; +use BumbleDocGen\Core\Parser\Entity\EntitiesLoaderProgressBarInterface; use Symfony\Component\Console\Helper\ProgressBar; use Symfony\Component\Console\Style\OutputStyle; -final class StylizedProgressBar +final class StylizedProgressBar implements EntitiesLoaderProgressBarInterface { private ProgressBar $progressBar; private string $name = ''; @@ -56,6 +57,11 @@ public function setStepDescription(string $stepDescription): void public function iterate(iterable $iterable, ?int $max = null): \Generator { + $lastIterationNumber = is_countable($iterable) ? \count($iterable) : 0; + if (!$lastIterationNumber) { + return; + } + $i = 0; foreach ($this->progressBar->iterate($iterable, $max) as $key => $item) { $lastIterationNumber = is_countable($iterable) ? \count($iterable) : 0; diff --git a/src/Core/Parser/Entity/EntitiesLoaderProgressBarInterface.php b/src/Core/Parser/Entity/EntitiesLoaderProgressBarInterface.php new file mode 100644 index 00000000..33c5e2e6 --- /dev/null +++ b/src/Core/Parser/Entity/EntitiesLoaderProgressBarInterface.php @@ -0,0 +1,14 @@ +rootEntityCollections; } - public function loadByLanguageHandlers(LanguageHandlersCollection $languageHandlersCollection): CollectionGroupLoadEntitiesResult - { + public function loadByLanguageHandlers( + LanguageHandlersCollection $languageHandlersCollection, + ?EntitiesLoaderProgressBarInterface $progressBar = null + ): CollectionGroupLoadEntitiesResult { $collectionGroupLoadEntitiesResult = new CollectionGroupLoadEntitiesResult(); foreach ($languageHandlersCollection as $languageHandler) { $collection = $languageHandler->getEntityCollection(); - $loadResult = $collection->loadEntitiesByConfiguration(); + $loadResult = $collection->loadEntitiesByConfiguration($progressBar); $collectionGroupLoadEntitiesResult->addResult($languageHandler::class, $loadResult); $this->add($collection); } diff --git a/src/Core/Parser/ProjectParser.php b/src/Core/Parser/ProjectParser.php index 12e599ae..2d3e6616 100644 --- a/src/Core/Parser/ProjectParser.php +++ b/src/Core/Parser/ProjectParser.php @@ -7,6 +7,7 @@ use BumbleDocGen\Core\Configuration\Configuration; use BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException; use BumbleDocGen\Core\Parser\Entity\CollectionGroupLoadEntitiesResult; +use BumbleDocGen\Core\Parser\Entity\EntitiesLoaderProgressBarInterface; use BumbleDocGen\Core\Parser\Entity\RootEntityCollection; use BumbleDocGen\Core\Parser\Entity\RootEntityCollectionsGroup; use BumbleDocGen\Core\Plugin\Event\Parser\BeforeParsingProcess; @@ -33,11 +34,12 @@ public function __construct( * @throws InvalidConfigurationParameterException * @throws NotFoundException */ - public function parse(): CollectionGroupLoadEntitiesResult + public function parse(?EntitiesLoaderProgressBarInterface $progressBar = null): CollectionGroupLoadEntitiesResult { $this->pluginEventDispatcher->dispatch(new BeforeParsingProcess()); return $this->rootEntityCollectionsGroup->loadByLanguageHandlers( - $this->configuration->getLanguageHandlersCollection() + $this->configuration->getLanguageHandlersCollection(), + $progressBar ); } diff --git a/src/DocGenerator.php b/src/DocGenerator.php index dbdfd435..8f4daa96 100644 --- a/src/DocGenerator.php +++ b/src/DocGenerator.php @@ -7,6 +7,7 @@ use BumbleDocGen\AI\Generators\DocBlocksGenerator; use BumbleDocGen\AI\Generators\ReadmeTemplateGenerator; use BumbleDocGen\AI\ProviderInterface; +use BumbleDocGen\Console\ProgressBar\ProgressBarFactory; use BumbleDocGen\Core\Configuration\Configuration; use BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException; use BumbleDocGen\Core\Logger\Handler\GenerationErrorsHandler; @@ -52,6 +53,7 @@ public function __construct( private Renderer $renderer, private GenerationErrorsHandler $generationErrorsHandler, private RootEntityCollectionsGroup $rootEntityCollectionsGroup, + private ProgressBarFactory $progressBarFactory, private Logger $logger ) { if (file_exists(self::LOG_FILE_NAME)) { @@ -253,7 +255,9 @@ public function generate(): void $memory = memory_get_usage(true); try { - $result = $this->parser->parse(); + $pb = $this->progressBarFactory->createStylizedProgressBar(); + $result = $this->parser->parse($pb); + $resSummary = $result->getSummary(); $this->io->table([], [ ['Processed files:', "{$resSummary->getProcessedFilesCount()}"], diff --git a/src/LanguageHandler/Php/Parser/Entity/PhpEntitiesCollection.php b/src/LanguageHandler/Php/Parser/Entity/PhpEntitiesCollection.php index 5df051c4..0a1f9dc6 100644 --- a/src/LanguageHandler/Php/Parser/Entity/PhpEntitiesCollection.php +++ b/src/LanguageHandler/Php/Parser/Entity/PhpEntitiesCollection.php @@ -4,12 +4,12 @@ namespace BumbleDocGen\LanguageHandler\Php\Parser\Entity; -use BumbleDocGen\Console\ProgressBar\ProgressBarFactory; use BumbleDocGen\Core\Cache\LocalCache\Exception\ObjectNotFoundException; use BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache; use BumbleDocGen\Core\Configuration\Configuration; use BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException; use BumbleDocGen\Core\Parser\Entity\CollectionLoadEntitiesResult; +use BumbleDocGen\Core\Parser\Entity\EntitiesLoaderProgressBarInterface; use BumbleDocGen\Core\Parser\Entity\LoggableRootEntityCollection; use BumbleDocGen\Core\Parser\Entity\RootEntityCollection; use BumbleDocGen\Core\Parser\Entity\RootEntityInterface; @@ -55,7 +55,6 @@ public function __construct( private EntityDocRendererHelper $docRendererHelper, private PhpParserHelper $phpParserHelper, private LocalObjectCache $localObjectCache, - private ProgressBarFactory $progressBarFactory, private LoggerInterface $logger, ) { parent::__construct(); @@ -81,11 +80,12 @@ public function getEntityCollectionName(): string * @throws DependencyException * @throws InvalidConfigurationParameterException */ - public function loadEntitiesByConfiguration(): CollectionLoadEntitiesResult + public function loadEntitiesByConfiguration(?EntitiesLoaderProgressBarInterface $progressBar = null): CollectionLoadEntitiesResult { return $this->loadEntities( $this->configuration->getSourceLocators(), - $this->phpHandlerSettings->getClassEntityFilter() + $this->phpHandlerSettings->getClassEntityFilter(), + $progressBar ); } @@ -101,10 +101,10 @@ public function loadEntitiesByConfiguration(): CollectionLoadEntitiesResult */ public function loadEntities( SourceLocatorsCollection $sourceLocatorsCollection, - ?ConditionInterface $filters = null + ?ConditionInterface $filters = null, + ?EntitiesLoaderProgressBarInterface $progressBar = null ): CollectionLoadEntitiesResult { - $pb = $this->progressBarFactory->createStylizedProgressBar(); - $pb->setName('Loading PHP entities'); + $progressBar?->setName('Loading PHP entities'); $nodeTraverser = new NodeTraverser(); $nodeTraverser->addVisitor(new NameResolver()); @@ -114,7 +114,7 @@ public function loadEntities( $allEntitiesCount = 0; $allFiles = iterator_to_array($sourceLocatorsCollection->getCommonFinder()->files()); - foreach ($allFiles ? $pb->iterate($allFiles) : [] as $file) { + foreach ($progressBar ? $progressBar->iterate($allFiles) : $allFiles as $file) { if (!preg_match(self::PHP_FILE_TEMPLATE, $file->getPathName())) { continue; } @@ -127,7 +127,7 @@ public function loadEntities( } $nodes = $nodeTraverser->traverse($nodes); $relativeFileName = str_replace($this->configuration->getProjectRoot(), '', $pathName); - $pb->setStepDescription("Processing `{$relativeFileName}` file"); + $progressBar?->setStepDescription("Processing `{$relativeFileName}` file"); foreach ($nodes as $node) { $classStmts = []; $namespaceName = ''; From efeaba1ce8768c6b513c53a0809eef14226dfc60 Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Wed, 29 Nov 2023 20:27:06 +0300 Subject: [PATCH 127/210] Adding reflection API demo --- demo/demo6-reflection-api/demoScript.php | 94 ++++++++++++++++++++++++ 1 file changed, 94 insertions(+) create mode 100644 demo/demo6-reflection-api/demoScript.php diff --git a/demo/demo6-reflection-api/demoScript.php b/demo/demo6-reflection-api/demoScript.php new file mode 100644 index 00000000..293c8c64 --- /dev/null +++ b/demo/demo6-reflection-api/demoScript.php @@ -0,0 +1,94 @@ +#!/usr/bin/env php +getRootEntityReflections($reflectionApiConfig); + + // Initially, the data in the collection is not loaded + assert(0 === count(iterator_to_array($entitiesCollection))); + + // The get method will not return the entity because the collection is still empty + $filename = $entitiesCollection->get(ProjectParser::class)?->getAbsoluteFileName(); + assert(is_null($filename)); + + // But there is a special method that can load an entity according to psr4/psr0 from the project’s composer configuration file + $filename = $entitiesCollection->getLoadedOrCreateNew(ProjectParser::class)?->getAbsoluteFileName(); + assert(!is_null($filename)); + + $sourceLocators = SourceLocatorsCollection::create( + new RecursiveDirectoriesSourceLocator([dirname(__DIR__, 2) . '/src']), + new DirectoriesSourceLocator([__DIR__]) + ); + + // We can populate the collection with data + $entitiesCollection->loadEntities( + $sourceLocators, // Source locators are needed so that we can determine all the files that will be traversed to fill the collection with data + new FileTextContainsCondition('class ProjectParser') // We can define special filters according to which entities will be loaded + ); + + // According to the specified resource locators and filters, only 1 entity was found + assert(1 === count(iterator_to_array($entitiesCollection))); + + // Now this entity is found using the get method + $filename = $entitiesCollection->get(ProjectParser::class)?->getAbsoluteFileName(); + assert(!is_null($filename)); + + // Load all entities without any filtering + $entitiesCollection->loadEntities($sourceLocators); + + // There are now more than just 1 entity + assert(1 < count(iterator_to_array($entitiesCollection))); + + /** ================================================= **/ + + $entitiesToDisplayExample = $entitiesCollection + ->filterByInterfaces([ + \BumbleDocGen\Core\Parser\Entity\EntityInterface::class + ]) + ->filterByPaths([ + '/src/LanguageHandler/Php/Parser/Entity/SubEntity/Property', + '/src/LanguageHandler/Php/Parser/Entity/SubEntity/Method' + ]) + ->getOnlyInstantiable() + ->toArray(); + + $apiConfigEntity = $entitiesCollection->findEntity('ReflectionApiConfig.php'); + if ($apiConfigEntity) { + $entitiesToDisplayExample[] = $apiConfigEntity; + } + + $trueCondition = $entitiesCollection->findEntity('TrueCondition'); + if ($trueCondition) { + $entitiesToDisplayExample[] = $trueCondition; + } + + foreach ($entitiesToDisplayExample as $entity) { + echo "================================================\n\n"; + echo "Class: {$entity->getName()}\n"; + $parentClassName = $entity->getParentClass()?->getName() ?: '-'; + echo "Parent class: {$parentClassName}\n"; + echo "File name: {$entity->getAbsoluteFileName()}\n"; + echo "Methods count: " . count($entity->getMethods()) . "\n"; + echo "Methods: " . implode(' | ', array_map(fn(MethodEntityInterface $method): string=>$method->getName(), $entity->getMethods())) . "\n"; + echo "Properties count: " . count($entity->getProperties()) . "\n"; + echo "Constants count: " . count($entity->getConstants()) . "\n\n"; + } +} catch (Exception | \Psr\Cache\InvalidArgumentException $e) { + die($e->getMessage()); +} From 9b68adfed6a7f7291c79e2faf21641189df861ab Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Fri, 15 Dec 2023 21:22:59 +0300 Subject: [PATCH 128/210] Adding method to check API doc block --- .../2.parser/reflectionApi/readme.md.twig | 51 +++++++++++++++++++ .../Php/Parser/Entity/BaseEntity.php | 14 +++++ 2 files changed, 65 insertions(+) create mode 100644 selfdoc/templates/tech/2.parser/reflectionApi/readme.md.twig diff --git a/selfdoc/templates/tech/2.parser/reflectionApi/readme.md.twig b/selfdoc/templates/tech/2.parser/reflectionApi/readme.md.twig new file mode 100644 index 00000000..795b2da0 --- /dev/null +++ b/selfdoc/templates/tech/2.parser/reflectionApi/readme.md.twig @@ -0,0 +1,51 @@ +{% set title = 'Reflection API' %} +{{ generatePageBreadcrumbs(title, _self) }} + +{{ "Reflection API" | textToHeading('H1') }} + +The documentation generator has a convenient Reflection API for analyzing the source code of the project being documented. +You can use the Reflection API both in documentation templates and simply in your code where necessary. + +**See:** +1) **[a]Reflection API for PHP[/a]** +2) **[Demo](/demo/demo6-reflection-api/demoScript.php)** + +{{ "Example" | textToHeading('H3') }} + +{{ '// Create a Reflection API config object. This example shows the config for parsing PHP code +$reflectionApiConfig = PhpReflectionApiConfig::create(); + +/** @var PhpEntitiesCollection $entitiesCollection*/ +$entitiesCollection = (new \BumbleDocGen\DocGeneratorFactory())->getRootEntityReflections($reflectionApiConfig); + +// By default the collection is empty. You can populate the collection with data +$entitiesCollection->loadEntities( + $sourceLocators, // Source locators are needed so that we can determine all the files that will be traversed to fill the collection with data + $filter // We can define special filters according to which entities will be loaded +); + +// And now you can use Reflection API +$filename = $entitiesCollection->get(\'SomeClassName\')?->getAbsoluteFileName(); +' | textToCodeBlock('php') }} + +{{ "Example 2 - Working with the Reflection API through a default parsing mechanism" | textToHeading('H3') }} + +{{ '// Create a documentation generator object +$docGen = (new \BumbleDocGen\DocGeneratorFactory())->create($configFile); + +// Next we get a group of entity collections (according to the configuration) +$entityCollectionsGroup = $docGen->parseAndGetRootEntityCollectionsGroup(); + +// Next, we can get a specific collection, for example for PHP entities +$entitiesCollection = $entityCollectionsGroup->get(PhpEntitiesCollection::class); + +// And now you can use Reflection API +$filename = $entitiesCollection->get(\'SomeClassName\')?->getAbsoluteFileName(); +' | textToCodeBlock('php') }} + +This method is used in the documentation generation process. +The only difference with the first example is that the first option is more convenient to use as a separate tool. + +The settings for which entities will be available to the reflector in this case are taken from the configuration file or configuration array, depending on the method of creating the documentation generator instance. + +In addition, [a]RootEntityCollectionsGroup[/a] is always available through DI, for example when you implement some twig function or plugin. diff --git a/src/LanguageHandler/Php/Parser/Entity/BaseEntity.php b/src/LanguageHandler/Php/Parser/Entity/BaseEntity.php index 56624c59..b101e7b4 100644 --- a/src/LanguageHandler/Php/Parser/Entity/BaseEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/BaseEntity.php @@ -234,6 +234,20 @@ public function isInternal(): bool return (bool)$internalBlock; } + /** + * Checking if an entity has `api` docBlock + * + * @api + * + * @throws InvalidConfigurationParameterException + */ + public function isApi(): bool + { + $docBlock = $this->getDocBlock(); + $internalBlock = $docBlock->getTagsByName('api')[0] ?? null; + return (bool)$internalBlock; + } + /** * Checking if an entity has `deprecated` docBlock * From e075764474d83bdb14b5d0773040c6d367d0eb17 Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Fri, 15 Dec 2023 21:26:08 +0300 Subject: [PATCH 129/210] Adding function to display API methods --- .../Twig/Function/DisplayClassApiMethods.php | 69 +++++++++++++++++++ .../Php/phpHandlerDefaultSettings.yaml | 1 + 2 files changed, 70 insertions(+) create mode 100644 src/LanguageHandler/Php/Renderer/Twig/Function/DisplayClassApiMethods.php diff --git a/src/LanguageHandler/Php/Renderer/Twig/Function/DisplayClassApiMethods.php b/src/LanguageHandler/Php/Renderer/Twig/Function/DisplayClassApiMethods.php new file mode 100644 index 00000000..dc60f6bf --- /dev/null +++ b/src/LanguageHandler/Php/Renderer/Twig/Function/DisplayClassApiMethods.php @@ -0,0 +1,69 @@ +rootEntityCollectionsGroup->get(PhpEntitiesCollection::NAME); + if (!$entitiesCollection) { + return null; + } + $classEntity = $entitiesCollection->getLoadedOrCreateNew($className); + if ($classEntity->isEntityDataCanBeLoaded()) { + $apiMethods = []; + foreach ($classEntity->getMethods() as $method) { + if ($method->isApi()) { + $description = $method->getDescription(); + $entityDocUrl = call_user_func_array($this->getDocumentedEntityUrlFunction, [ + $entitiesCollection, + $classEntity->getName(), + $method->getName() + ]); + $apiMethods[] = "- [#]({$entityDocUrl}) `{$method->getName()}()`" . ($description ? ": {$description}" : ''); + } + } + return implode("\n", $apiMethods); + } + return null; + } +} diff --git a/src/LanguageHandler/Php/phpHandlerDefaultSettings.yaml b/src/LanguageHandler/Php/phpHandlerDefaultSettings.yaml index 9bcab8a7..5f4bc695 100644 --- a/src/LanguageHandler/Php/phpHandlerDefaultSettings.yaml +++ b/src/LanguageHandler/Php/phpHandlerDefaultSettings.yaml @@ -25,6 +25,7 @@ language_handlers: - class: \BumbleDocGen\LanguageHandler\Php\Renderer\EntityDocRenderer\PhpClassToMd\PhpClassToMdDocRenderer custom_twig_functions: + - class: \BumbleDocGen\LanguageHandler\Php\Renderer\Twig\Function\DisplayClassApiMethods - class: \BumbleDocGen\LanguageHandler\Php\Renderer\Twig\Function\DrawClassMap - class: \BumbleDocGen\LanguageHandler\Php\Renderer\Twig\Function\GetClassMethodsBodyCode From 1526cc0d96a154a83c00d7095deeb155899694b7 Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Fri, 15 Dec 2023 21:27:10 +0300 Subject: [PATCH 130/210] Adding reflection API documentation --- selfdoc/templates/README.md.twig | 2 +- .../php/phpClassConstantReflectionApi.md.twig | 21 ++++++++++ .../php/phpClassMethodReflectionApi.md.twig | 21 ++++++++++ .../php/phpClassPropertyReflectionApi.md.twig | 21 ++++++++++ .../php/phpClassReflectionApi.md.twig | 25 ++++++++++++ .../php/phpEnumReflectionApi.md.twig | 23 +++++++++++ .../php/phpInterfaceReflectionApi.md.twig | 23 +++++++++++ .../php/phpTraitReflectionApi.md.twig | 23 +++++++++++ .../2.parser/reflectionApi/php/readme.md.twig | 38 +++++++++++++++++++ 9 files changed, 196 insertions(+), 1 deletion(-) create mode 100644 selfdoc/templates/tech/2.parser/reflectionApi/php/phpClassConstantReflectionApi.md.twig create mode 100644 selfdoc/templates/tech/2.parser/reflectionApi/php/phpClassMethodReflectionApi.md.twig create mode 100644 selfdoc/templates/tech/2.parser/reflectionApi/php/phpClassPropertyReflectionApi.md.twig create mode 100644 selfdoc/templates/tech/2.parser/reflectionApi/php/phpClassReflectionApi.md.twig create mode 100644 selfdoc/templates/tech/2.parser/reflectionApi/php/phpEnumReflectionApi.md.twig create mode 100644 selfdoc/templates/tech/2.parser/reflectionApi/php/phpInterfaceReflectionApi.md.twig create mode 100644 selfdoc/templates/tech/2.parser/reflectionApi/php/phpTraitReflectionApi.md.twig create mode 100644 selfdoc/templates/tech/2.parser/reflectionApi/php/readme.md.twig diff --git a/selfdoc/templates/README.md.twig b/selfdoc/templates/README.md.twig index f715be6f..24153aa8 100644 --- a/selfdoc/templates/README.md.twig +++ b/selfdoc/templates/README.md.twig @@ -18,7 +18,7 @@ Add the BumbleDocGen to the `composer.json` file of your project using the follo {{ "Core Features" | textToHeading('H2') }} - 🔍 [a x-title="Parsing"]Parser[/a]: - BumbleDocGen scans your project by parsing PHP files, extracting comments, and providing detailed models of your code. + BumbleDocGen analyzes your code and provides a convenient [a]Reflection API[/a]. - ✍️ [a x-title="Rendering"]Renderer[/a]: BumbleDocGen generates markdown content using templates and fills them with data obtained from parsing your code. diff --git a/selfdoc/templates/tech/2.parser/reflectionApi/php/phpClassConstantReflectionApi.md.twig b/selfdoc/templates/tech/2.parser/reflectionApi/php/phpClassConstantReflectionApi.md.twig new file mode 100644 index 00000000..d9797766 --- /dev/null +++ b/selfdoc/templates/tech/2.parser/reflectionApi/php/phpClassConstantReflectionApi.md.twig @@ -0,0 +1,21 @@ +{% set title = 'PHP class constant reflection API' %} +{{ generatePageBreadcrumbs(title, _self) }} +{% set prevPage = 'Reflection API for PHP' %} + +{{ "PHP class constant reflection API" | textToHeading('H1') }} + +Class constant reflection entity class: [a]ClassConstantEntity[/a]. + +**Example of creating class constant reflection:** + +```php +$entitiesCollection = (new \BumbleDocGen\DocGeneratorFactory())->getRootEntityReflections($reflectionApiConfig); + +$classReflection = $entitiesCollection->getLoadedOrCreateNew('SomeClassName'); + +$constantReflection = $classReflection->getConstant('constantName'); +``` + +**Class constant reflection API methods:** + +{{ displayClassApiMethods('\\BumbleDocGen\\LanguageHandler\\Php\\Parser\\Entity\\SubEntity\\ClassConstant\\ClassConstantEntity') }} \ No newline at end of file diff --git a/selfdoc/templates/tech/2.parser/reflectionApi/php/phpClassMethodReflectionApi.md.twig b/selfdoc/templates/tech/2.parser/reflectionApi/php/phpClassMethodReflectionApi.md.twig new file mode 100644 index 00000000..e5e91bb1 --- /dev/null +++ b/selfdoc/templates/tech/2.parser/reflectionApi/php/phpClassMethodReflectionApi.md.twig @@ -0,0 +1,21 @@ +{% set title = 'PHP class method reflection API' %} +{{ generatePageBreadcrumbs(title, _self) }} +{% set prevPage = 'Reflection API for PHP' %} + +{{ "PHP class method reflection API" | textToHeading('H1') }} + +Method reflection entity class: [a]MethodEntity[/a]. + +**Example of creating class method reflection:** + +```php +$entitiesCollection = (new \BumbleDocGen\DocGeneratorFactory())->getRootEntityReflections($reflectionApiConfig); + +$classReflection = $entitiesCollection->getLoadedOrCreateNew('SomeClassName'); + +$methodReflection = $classReflection->getMethod('methodName'); +``` + +**Class method reflection API methods:** + +{{ displayClassApiMethods('\\BumbleDocGen\\LanguageHandler\\Php\\Parser\\Entity\\SubEntity\\Method\\MethodEntity') }} \ No newline at end of file diff --git a/selfdoc/templates/tech/2.parser/reflectionApi/php/phpClassPropertyReflectionApi.md.twig b/selfdoc/templates/tech/2.parser/reflectionApi/php/phpClassPropertyReflectionApi.md.twig new file mode 100644 index 00000000..5422a661 --- /dev/null +++ b/selfdoc/templates/tech/2.parser/reflectionApi/php/phpClassPropertyReflectionApi.md.twig @@ -0,0 +1,21 @@ +{% set title = 'PHP class property reflection API' %} +{{ generatePageBreadcrumbs(title, _self) }} +{% set prevPage = 'Reflection API for PHP' %} + +{{ "PHP class property reflection API" | textToHeading('H1') }} + +Property reflection entity class: [a]PropertyEntity[/a]. + +**Example of creating class property reflection:** + +```php +$entitiesCollection = (new \BumbleDocGen\DocGeneratorFactory())->getRootEntityReflections($reflectionApiConfig); + +$classReflection = $entitiesCollection->getLoadedOrCreateNew('SomeClassName'); + +$propertyReflection = $classReflection->getProperty('propertyName'); +``` + +**Class property reflection API methods:** + +{{ displayClassApiMethods('\\BumbleDocGen\\LanguageHandler\\Php\\Parser\\Entity\\SubEntity\\Property\\PropertyEntity') }} \ No newline at end of file diff --git a/selfdoc/templates/tech/2.parser/reflectionApi/php/phpClassReflectionApi.md.twig b/selfdoc/templates/tech/2.parser/reflectionApi/php/phpClassReflectionApi.md.twig new file mode 100644 index 00000000..c5234b9c --- /dev/null +++ b/selfdoc/templates/tech/2.parser/reflectionApi/php/phpClassReflectionApi.md.twig @@ -0,0 +1,25 @@ +{% set title = 'PHP class reflection API' %} +{{ generatePageBreadcrumbs(title, _self) }} +{% set prevPage = 'Reflection API for PHP' %} + +{{ "PHP class reflection API" | textToHeading('H1') }} + +PHP class reflection [a]ClassEntity[/a] inherits from [a]ClassLikeEntity[/a]. + +**Source class formats:** + +1) `class ` +2) `abstract class ` +3) `final class ` + +**Example of creating class reflection:** + +```php +$entitiesCollection = (new \BumbleDocGen\DocGeneratorFactory())->getRootEntityReflections($reflectionApiConfig); + +$classReflection = $entitiesCollection->getLoadedOrCreateNew('SomeClassName'); // or get() +``` + +**Class reflection API methods:** + +{{ displayClassApiMethods('\\BumbleDocGen\\LanguageHandler\\Php\\Parser\\Entity\\ClassEntity') }} diff --git a/selfdoc/templates/tech/2.parser/reflectionApi/php/phpEnumReflectionApi.md.twig b/selfdoc/templates/tech/2.parser/reflectionApi/php/phpEnumReflectionApi.md.twig new file mode 100644 index 00000000..f4fec3e4 --- /dev/null +++ b/selfdoc/templates/tech/2.parser/reflectionApi/php/phpEnumReflectionApi.md.twig @@ -0,0 +1,23 @@ +{% set title = 'PHP enum reflection API' %} +{{ generatePageBreadcrumbs(title, _self) }} +{% set prevPage = 'Reflection API for PHP' %} + +{{ "PHP enum reflection API" | textToHeading('H1') }} + +PHP enum reflection [a]EnumEntity[/a] inherits from [a]ClassLikeEntity[/a]. + +**Source enum formats:** + +1) `enum ` + +**Example of creating enum reflection:** + +```php +$entitiesCollection = (new \BumbleDocGen\DocGeneratorFactory())->getRootEntityReflections($reflectionApiConfig); + +$enumReflection = $entitiesCollection->getLoadedOrCreateNew('SomeEnumName'); // or get() +``` + +**Enum reflection API methods:** + +{{ displayClassApiMethods('\\BumbleDocGen\\LanguageHandler\\Php\\Parser\\Entity\\EnumEntity') }} \ No newline at end of file diff --git a/selfdoc/templates/tech/2.parser/reflectionApi/php/phpInterfaceReflectionApi.md.twig b/selfdoc/templates/tech/2.parser/reflectionApi/php/phpInterfaceReflectionApi.md.twig new file mode 100644 index 00000000..5729e999 --- /dev/null +++ b/selfdoc/templates/tech/2.parser/reflectionApi/php/phpInterfaceReflectionApi.md.twig @@ -0,0 +1,23 @@ +{% set title = 'PHP interface reflection API' %} +{{ generatePageBreadcrumbs(title, _self) }} +{% set prevPage = 'Reflection API for PHP' %} + +{{ "PHP interface reflection API" | textToHeading('H1') }} + +PHP interface reflection [a]InterfaceEntity[/a] inherits from [a]ClassLikeEntity[/a]. + +**Source interface formats:** + +1) `interface ` + +**Example of creating interface reflection:** + +```php +$entitiesCollection = (new \BumbleDocGen\DocGeneratorFactory())->getRootEntityReflections($reflectionApiConfig); + +$interfaceReflection = $entitiesCollection->getLoadedOrCreateNew('SomeInterfaceName'); // or get() +``` + +**Interface reflection API methods:** + +{{ displayClassApiMethods('\\BumbleDocGen\\LanguageHandler\\Php\\Parser\\Entity\\InterfaceEntity') }} \ No newline at end of file diff --git a/selfdoc/templates/tech/2.parser/reflectionApi/php/phpTraitReflectionApi.md.twig b/selfdoc/templates/tech/2.parser/reflectionApi/php/phpTraitReflectionApi.md.twig new file mode 100644 index 00000000..d7b2631e --- /dev/null +++ b/selfdoc/templates/tech/2.parser/reflectionApi/php/phpTraitReflectionApi.md.twig @@ -0,0 +1,23 @@ +{% set title = 'PHP trait reflection API' %} +{{ generatePageBreadcrumbs(title, _self) }} +{% set prevPage = 'Reflection API for PHP' %} + +{{ "PHP trait reflection API" | textToHeading('H1') }} + +PHP trait reflection [a]TraitEntity[/a] inherits from [a]ClassLikeEntity[/a]. + +**Source trait formats:** + +1) `trait ` + +**Example of creating trait reflection:** + +```php +$entitiesCollection = (new \BumbleDocGen\DocGeneratorFactory())->getRootEntityReflections($reflectionApiConfig); + +$traitReflection = $entitiesCollection->getLoadedOrCreateNew('SomeTraitName'); // or get() +``` + +**Trait reflection API methods:** + +{{ displayClassApiMethods('\\BumbleDocGen\\LanguageHandler\\Php\\Parser\\Entity\\TraitEntity') }} \ No newline at end of file diff --git a/selfdoc/templates/tech/2.parser/reflectionApi/php/readme.md.twig b/selfdoc/templates/tech/2.parser/reflectionApi/php/readme.md.twig new file mode 100644 index 00000000..adfa07d0 --- /dev/null +++ b/selfdoc/templates/tech/2.parser/reflectionApi/php/readme.md.twig @@ -0,0 +1,38 @@ +{% set title = 'Reflection API for PHP' %} +{{ generatePageBreadcrumbs(title, _self) }} + +{{ "Reflection API for PHP" | textToHeading('H1') }} + +The tool we implemented partially replicates the [standard PHP reflection API](https://www.php.net/manual/en/book.reflection.php), but it has some additional capabilities. +In addition, our Reflection API is available for use in every documentation template, plugin, twig function, etc. at `BumbleDocGen`. + +{{ "Class like reflections" | textToHeading('H2') }} + +Using our PHP reflection API you can get information about project entities. +Below is information about the available methods for working with each entity type: + +1) [a x-title="Class reflection"]PHP class reflection API[/a] +2) [a x-title="Trait reflection"]PHP trait reflection API[/a] +3) [a x-title="Interface reflection"]PHP interface reflection API[/a] +4) [a x-title="Enum reflection"]PHP enum reflection API[/a] + +**Usage example:** + +```php +$entitiesCollection = (new \BumbleDocGen\DocGeneratorFactory())->getRootEntityReflections($reflectionApiConfig); + +$classReflection = $entitiesCollection->getLoadedOrCreateNew('SomeClassName'); // or get() + +$entityName = $classReflection->getName(); +$entityDescription = $classReflection->getDescription(); +$entityClassCodeStartLine = $classReflection->getStartLine(); +// ... etc. +``` + +{{ "Class like sub entities reflections" | textToHeading('H2') }} + +PHP classes contain methods, properties and constants. Below is information about these child entities: + +1) [a x-title="Class method reflection"]PHP class method reflection API[/a] +2) [a x-title="Class property reflection"]PHP class property reflection API[/a] +3) [a x-title="Class constant reflection"]PHP class constant reflection API[/a] \ No newline at end of file From 765f135e6140468c5e413cff288f3bfb910b203e Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Fri, 15 Dec 2023 21:35:40 +0300 Subject: [PATCH 131/210] Adding examples --- .../2.parser/reflectionApi/php/readme.md.twig | 20 ++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/selfdoc/templates/tech/2.parser/reflectionApi/php/readme.md.twig b/selfdoc/templates/tech/2.parser/reflectionApi/php/readme.md.twig index adfa07d0..d30c0d86 100644 --- a/selfdoc/templates/tech/2.parser/reflectionApi/php/readme.md.twig +++ b/selfdoc/templates/tech/2.parser/reflectionApi/php/readme.md.twig @@ -26,6 +26,7 @@ $classReflection = $entitiesCollection->getLoadedOrCreateNew('SomeClassName'); / $entityName = $classReflection->getName(); $entityDescription = $classReflection->getDescription(); $entityClassCodeStartLine = $classReflection->getStartLine(); + // ... etc. ``` @@ -35,4 +36,21 @@ PHP classes contain methods, properties and constants. Below is information abou 1) [a x-title="Class method reflection"]PHP class method reflection API[/a] 2) [a x-title="Class property reflection"]PHP class property reflection API[/a] -3) [a x-title="Class constant reflection"]PHP class constant reflection API[/a] \ No newline at end of file +3) [a x-title="Class constant reflection"]PHP class constant reflection API[/a] + +**Usage example:** + +```php +$entitiesCollection = (new \BumbleDocGen\DocGeneratorFactory())->getRootEntityReflections($reflectionApiConfig); + +$classReflection = $entitiesCollection->getLoadedOrCreateNew('SomeClassName'); + +$propertyReflection = $classReflection->getProperty('propertyName'); +$propertyName = $methodReflection->getName(); + +$methodReflection = $classReflection->getMethod('methodName'); +$methodName = $methodReflection->getName(); +$firstMethodReturnValue = $methodReflection->getFirstReturnValue(); + +// ... etc. +``` \ No newline at end of file From 4a557f7ee7c7a0d6ba4fb94148f98a16e253cdfd Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Fri, 15 Dec 2023 22:06:54 +0300 Subject: [PATCH 132/210] Adding reflection API documentation --- docs/README.md | 4 +- docs/classes/DocGenerator.md | 19 +- docs/classes/DocGeneratorFactory.md | 68 +- docs/shared_c.cache | 2 +- .../1.configuration/classes/Configuration.md | 20 +- .../classes/GetDocumentedEntityUrl.md | 6 +- .../classes/PrintEntityCollectionAsList.md | 4 +- docs/tech/1.configuration/readme.md | 2 +- ....md => ClassConstantEntitiesCollection.md} | 36 +- ...nstantEntity.md => ClassConstantEntity.md} | 507 ++- .../2.parser/classes/ClassConstantEntity_2.md | 1505 +++++++ docs/tech/2.parser/classes/ClassEntity.md | 1726 ++++---- docs/tech/2.parser/classes/ClassLikeEntity.md | 3317 +++++++++++++++ docs/tech/2.parser/classes/Configuration.md | 735 ++++ .../2.parser/classes/DynamicMethodEntity.md | 382 +- docs/tech/2.parser/classes/EntityInterface.md | 106 +- docs/tech/2.parser/classes/EnumEntity.md | 3562 +++++++++++++++++ docs/tech/2.parser/classes/InterfaceEntity.md | 3441 ++++++++++++++++ ...lection.md => MethodEntitiesCollection.md} | 88 +- docs/tech/2.parser/classes/MethodEntity.md | 852 ++-- ...Collection.md => PhpEntitiesCollection.md} | 292 +- .../2.parser/classes/PhpHandlerSettings.md | 514 +++ docs/tech/2.parser/classes/ProjectParser.md | 107 +- ...ction.md => PropertyEntitiesCollection.md} | 69 +- docs/tech/2.parser/classes/PropertyEntity.md | 527 +-- .../2.parser/classes/RootEntityCollection.md | 132 +- .../2.parser/classes/RootEntityInterface.md | 231 +- docs/tech/2.parser/classes/TraitEntity.md | 3441 ++++++++++++++++ docs/tech/2.parser/entity.md | 55 +- docs/tech/2.parser/entityFilterCondition.md | 2 +- docs/tech/2.parser/readme.md | 7 +- .../classes/RootEntityCollectionsGroup.md | 336 ++ .../php/classes/ClassConstantEntity.md | 1505 +++++++ .../php/classes/ClassConstantEntity_2.md | 1505 +++++++ .../reflectionApi/php/classes/ClassEntity.md | 3466 ++++++++++++++++ .../php/classes/ClassLikeEntity.md | 3317 +++++++++++++++ .../php/classes/ClassLikeEntity_2.md | 3317 +++++++++++++++ .../php/classes/ClassLikeEntity_3.md | 3317 +++++++++++++++ .../php/classes/ClassLikeEntity_4.md | 3317 +++++++++++++++ .../php/classes/ClassLikeEntity_5.md | 3317 +++++++++++++++ .../php/classes/Configuration.md | 735 ++++ .../reflectionApi/php/classes/EnumEntity.md | 3562 +++++++++++++++++ .../php/classes/InterfaceEntity.md | 3441 ++++++++++++++++ .../InvalidConfigurationParameterException.md | 34 + .../reflectionApi/php/classes/MethodEntity.md | 1780 ++++++++ .../php/classes/PhpHandlerSettings.md | 514 +++ .../php/classes/PropertyEntity.md | 1588 ++++++++ .../reflectionApi/php/classes/TraitEntity.md | 3441 ++++++++++++++++ .../php/phpClassConstantReflectionApi.md | 50 + .../php/phpClassMethodReflectionApi.md | 65 + .../php/phpClassPropertyReflectionApi.md | 56 + .../php/phpClassReflectionApi.md | 89 + .../reflectionApi/php/phpEnumReflectionApi.md | 85 + .../php/phpInterfaceReflectionApi.md | 85 + .../php/phpTraitReflectionApi.md | 85 + .../tech/2.parser/reflectionApi/php/readme.md | 58 + docs/tech/2.parser/reflectionApi/readme.md | 61 + docs/tech/2.parser/sourceLocator.md | 2 +- docs/tech/3.renderer/01_templates.md | 8 +- docs/tech/3.renderer/02_breadcrumbs.md | 2 +- docs/tech/3.renderer/03_documentStructure.md | 2 +- docs/tech/3.renderer/04_twigCustomFilters.md | 2 +- .../tech/3.renderer/05_twigCustomFunctions.md | 22 +- docs/tech/3.renderer/classes/Configuration.md | 735 ++++ .../classes/DisplayClassApiMethods.md | 209 + docs/tech/3.renderer/classes/DrawClassMap.md | 16 +- .../classes/GetDocumentedEntityUrl.md | 6 +- .../classes/GetDocumentedEntityUrl_2.md | 6 +- .../classes/GetDocumentedEntityUrl_3.md | 6 +- ...Collection.md => PhpEntitiesCollection.md} | 292 +- ...ection_2.md => PhpEntitiesCollection_2.md} | 292 +- .../classes/PrintEntityCollectionAsList.md | 4 +- .../classes/RootEntityCollection.md | 132 +- .../3.renderer/classes/RootEntityInterface.md | 231 +- .../classes/RootEntityInterface_2.md | 231 +- docs/tech/3.renderer/readme.md | 2 +- .../tech/3.renderer/templatesDynamicBlocks.md | 6 +- docs/tech/3.renderer/templatesLinking.md | 2 +- docs/tech/3.renderer/templatesVariables.md | 4 +- ...d => AfterLoadingPhpEntitiesCollection.md} | 28 +- .../classes/BasePhpStubberPlugin.md | 10 +- .../classes/OnAddClassEntityToCollection.md | 16 +- ...eLoad.md => OnCheckIsEntityCanBeLoaded.md} | 48 +- .../classes/PhpDocumentorStubberPlugin.md | 10 +- .../classes/PhpUnitStubberPlugin.md | 10 +- .../4.pluginSystem/classes/StubberPlugin.md | 10 +- docs/tech/4.pluginSystem/readme.md | 12 +- ...d => AfterLoadingPhpEntitiesCollection.md} | 28 +- docs/tech/classes/BaseEntity.md | 423 +- docs/tech/classes/BasePhpStubberPlugin.md | 10 +- docs/tech/classes/CacheableEntityInterface.md | 190 +- docs/tech/classes/CacheableEntityTrait.md | 30 +- .../classes/CacheableEntityWrapperTrait.md | 30 +- .../tech/classes/CacheablePhpEntityFactory.md | 161 +- ....md => ClassConstantEntitiesCollection.md} | 36 +- ...nstantEntity.md => ClassConstantEntity.md} | 507 ++- docs/tech/classes/ClassConstantEntity_2.md | 1505 +++++++ docs/tech/classes/ClassEntity.md | 1726 ++++---- docs/tech/classes/ClassLikeEntity.md | 3317 +++++++++++++++ docs/tech/classes/ClassLikeEntity_2.md | 3317 +++++++++++++++ .../CollectionGroupLoadEntitiesResult.md | 110 + .../classes/CollectionLoadEntitiesResult.md | 224 ++ docs/tech/classes/ComposerHelper.md | 2 +- docs/tech/classes/Configuration.md | 20 +- .../tech/classes/ConfigurationParameterBag.md | 10 +- docs/tech/classes/Configuration_2.md | 20 +- docs/tech/classes/DisplayClassApiMethods.md | 209 + docs/tech/classes/DocBlockLink.md | 95 + docs/tech/classes/DocGenerator.md | 19 +- docs/tech/classes/DocGeneratorFactory.md | 68 +- .../DocumentTransformableEntityInterface.md | 70 +- docs/tech/classes/DrawClassMap.md | 16 +- docs/tech/classes/DynamicMethodEntity.md | 382 +- .../EntitiesLoaderProgressBarInterface.md | 168 + docs/tech/classes/EntityCacheItemPool.md | 24 +- docs/tech/classes/EntityInterface.md | 106 +- docs/tech/classes/EnumEntity.md | 3562 +++++++++++++++++ docs/tech/classes/GetDocumentedEntityUrl.md | 6 +- docs/tech/classes/GetDocumentedEntityUrl_2.md | 6 +- docs/tech/classes/InterfaceEntity.md | 3441 ++++++++++++++++ .../classes/LoggableRootEntityCollection.md | 130 +- ...lection.md => MethodEntitiesCollection.md} | 88 +- docs/tech/classes/MethodEntity.md | 852 ++-- docs/tech/classes/MethodEntityInterface.md | 328 +- docs/tech/classes/NodeValueCompiler.md | 10 +- .../classes/OnAddClassEntityToCollection.md | 16 +- ...eLoad.md => OnCheckIsEntityCanBeLoaded.md} | 48 +- docs/tech/classes/ParserHelper.md | 58 +- .../classes/PhpDocumentorStubberPlugin.md | 10 +- ...Collection.md => PhpEntitiesCollection.md} | 292 +- docs/tech/classes/PhpHandler.md | 58 +- docs/tech/classes/PhpHandlerSettings.md | 14 +- docs/tech/classes/PhpHandlerSettings_2.md | 514 +++ docs/tech/classes/PhpParserHelper.md | 6 +- docs/tech/classes/PhpReflectionApiConfig.md | 643 +++ docs/tech/classes/PhpUnitStubberPlugin.md | 10 +- .../classes/PrintEntityCollectionAsList.md | 4 +- docs/tech/classes/ProjectParser.md | 107 +- ...ction.md => PropertyEntitiesCollection.md} | 69 +- docs/tech/classes/PropertyEntity.md | 527 +-- docs/tech/classes/ReflectionApiConfig.md | 218 + docs/tech/classes/RootEntityCollection.md | 132 +- .../classes/RootEntityCollectionsGroup.md | 68 +- docs/tech/classes/RootEntityInterface.md | 231 +- docs/tech/classes/RootEntityInterface_2.md | 231 +- docs/tech/classes/StubberPlugin.md | 10 +- docs/tech/classes/StylizedProgressBar.md | 20 +- docs/tech/classes/TraitEntity.md | 3441 ++++++++++++++++ docs/tech/map.md | 52 +- docs/tech/readme.md | 2 +- 150 files changed, 85298 insertions(+), 5970 deletions(-) rename docs/tech/2.parser/classes/{ConstantEntityCollection.md => ClassConstantEntitiesCollection.md} (76%) rename docs/tech/2.parser/classes/{ConstantEntity.md => ClassConstantEntity.md} (69%) create mode 100644 docs/tech/2.parser/classes/ClassConstantEntity_2.md create mode 100644 docs/tech/2.parser/classes/ClassLikeEntity.md create mode 100644 docs/tech/2.parser/classes/Configuration.md create mode 100644 docs/tech/2.parser/classes/EnumEntity.md create mode 100644 docs/tech/2.parser/classes/InterfaceEntity.md rename docs/tech/2.parser/classes/{MethodEntityCollection.md => MethodEntitiesCollection.md} (66%) rename docs/tech/2.parser/classes/{ClassEntityCollection.md => PhpEntitiesCollection.md} (72%) create mode 100644 docs/tech/2.parser/classes/PhpHandlerSettings.md rename docs/tech/2.parser/classes/{PropertyEntityCollection.md => PropertyEntitiesCollection.md} (68%) create mode 100644 docs/tech/2.parser/classes/TraitEntity.md create mode 100644 docs/tech/2.parser/reflectionApi/classes/RootEntityCollectionsGroup.md create mode 100644 docs/tech/2.parser/reflectionApi/php/classes/ClassConstantEntity.md create mode 100644 docs/tech/2.parser/reflectionApi/php/classes/ClassConstantEntity_2.md create mode 100644 docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md create mode 100644 docs/tech/2.parser/reflectionApi/php/classes/ClassLikeEntity.md create mode 100644 docs/tech/2.parser/reflectionApi/php/classes/ClassLikeEntity_2.md create mode 100644 docs/tech/2.parser/reflectionApi/php/classes/ClassLikeEntity_3.md create mode 100644 docs/tech/2.parser/reflectionApi/php/classes/ClassLikeEntity_4.md create mode 100644 docs/tech/2.parser/reflectionApi/php/classes/ClassLikeEntity_5.md create mode 100644 docs/tech/2.parser/reflectionApi/php/classes/Configuration.md create mode 100644 docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md create mode 100644 docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md create mode 100644 docs/tech/2.parser/reflectionApi/php/classes/InvalidConfigurationParameterException.md create mode 100644 docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md create mode 100644 docs/tech/2.parser/reflectionApi/php/classes/PhpHandlerSettings.md create mode 100644 docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md create mode 100644 docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md create mode 100644 docs/tech/2.parser/reflectionApi/php/phpClassConstantReflectionApi.md create mode 100644 docs/tech/2.parser/reflectionApi/php/phpClassMethodReflectionApi.md create mode 100644 docs/tech/2.parser/reflectionApi/php/phpClassPropertyReflectionApi.md create mode 100644 docs/tech/2.parser/reflectionApi/php/phpClassReflectionApi.md create mode 100644 docs/tech/2.parser/reflectionApi/php/phpEnumReflectionApi.md create mode 100644 docs/tech/2.parser/reflectionApi/php/phpInterfaceReflectionApi.md create mode 100644 docs/tech/2.parser/reflectionApi/php/phpTraitReflectionApi.md create mode 100644 docs/tech/2.parser/reflectionApi/php/readme.md create mode 100644 docs/tech/2.parser/reflectionApi/readme.md create mode 100644 docs/tech/3.renderer/classes/Configuration.md create mode 100644 docs/tech/3.renderer/classes/DisplayClassApiMethods.md rename docs/tech/3.renderer/classes/{ClassEntityCollection.md => PhpEntitiesCollection.md} (72%) rename docs/tech/3.renderer/classes/{ClassEntityCollection_2.md => PhpEntitiesCollection_2.md} (72%) rename docs/tech/4.pluginSystem/classes/{AfterLoadingClassEntityCollection.md => AfterLoadingPhpEntitiesCollection.md} (59%) rename docs/tech/4.pluginSystem/classes/{OnCheckIsClassEntityCanBeLoad.md => OnCheckIsEntityCanBeLoaded.md} (61%) rename docs/tech/classes/{AfterLoadingClassEntityCollection.md => AfterLoadingPhpEntitiesCollection.md} (60%) rename docs/tech/classes/{ConstantEntityCollection.md => ClassConstantEntitiesCollection.md} (76%) rename docs/tech/classes/{ConstantEntity.md => ClassConstantEntity.md} (70%) create mode 100644 docs/tech/classes/ClassConstantEntity_2.md create mode 100644 docs/tech/classes/ClassLikeEntity.md create mode 100644 docs/tech/classes/ClassLikeEntity_2.md create mode 100644 docs/tech/classes/CollectionGroupLoadEntitiesResult.md create mode 100644 docs/tech/classes/CollectionLoadEntitiesResult.md create mode 100644 docs/tech/classes/DisplayClassApiMethods.md create mode 100644 docs/tech/classes/DocBlockLink.md create mode 100644 docs/tech/classes/EntitiesLoaderProgressBarInterface.md create mode 100644 docs/tech/classes/EnumEntity.md create mode 100644 docs/tech/classes/InterfaceEntity.md rename docs/tech/classes/{MethodEntityCollection.md => MethodEntitiesCollection.md} (66%) rename docs/tech/classes/{OnCheckIsClassEntityCanBeLoad.md => OnCheckIsEntityCanBeLoaded.md} (61%) rename docs/tech/classes/{ClassEntityCollection.md => PhpEntitiesCollection.md} (71%) create mode 100644 docs/tech/classes/PhpHandlerSettings_2.md create mode 100644 docs/tech/classes/PhpReflectionApiConfig.md rename docs/tech/classes/{PropertyEntityCollection.md => PropertyEntitiesCollection.md} (69%) create mode 100644 docs/tech/classes/ReflectionApiConfig.md create mode 100644 docs/tech/classes/TraitEntity.md diff --git a/docs/README.md b/docs/README.md index 3527e780..4bd6c833 100644 --- a/docs/README.md +++ b/docs/README.md @@ -20,7 +20,7 @@ Add the BumbleDocGen to the `composer.json` file of your project using the follo

              Core Features

              - 🔍 Parsing: - BumbleDocGen scans your project by parsing PHP files, extracting comments, and providing detailed models of your code. + BumbleDocGen analyzes your code and provides a convenient Reflection API. - ✍️ Rendering: BumbleDocGen generates markdown content using templates and fills them with data obtained from parsing your code. @@ -95,4 +95,4 @@ To update this documentation, run the following command:

              -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
              Last modified date: Sat Oct 28 11:03:31 2023 +0300
              Page content update date: Tue Nov 14 2023
              Made with Bumble Documentation Generator
              \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
              Last modified date: Fri Dec 15 21:27:10 2023 +0300
              Page content update date: Fri Dec 15 2023
              Made with Bumble Documentation Generator
        \ No newline at end of file diff --git a/docs/classes/DocGenerator.md b/docs/classes/DocGenerator.md index a750e965..83af3f1f 100644 --- a/docs/classes/DocGenerator.md +++ b/docs/classes/DocGenerator.md @@ -2,7 +2,7 @@ BumbleDocGen / DocGenerator

        - DocGenerator class: + DocGenerator class:

        @@ -52,11 +52,11 @@ final class DocGenerator @@ -71,11 +71,11 @@ final class DocGenerator ```php -public function __construct(\Symfony\Component\Console\Style\OutputStyle $io, \BumbleDocGen\Core\Configuration\Configuration $configuration, \BumbleDocGen\Core\Plugin\PluginEventDispatcher $pluginEventDispatcher, \BumbleDocGen\Core\Parser\ProjectParser $parser, \BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper $parserHelper, \BumbleDocGen\Core\Renderer\Renderer $renderer, \BumbleDocGen\Core\Logger\Handler\GenerationErrorsHandler $generationErrorsHandler, \BumbleDocGen\Core\Parser\Entity\RootEntityCollectionsGroup $rootEntityCollectionsGroup, \Monolog\Logger $logger); +public function __construct(\Symfony\Component\Console\Style\OutputStyle $io, \BumbleDocGen\Core\Configuration\Configuration $configuration, \BumbleDocGen\Core\Plugin\PluginEventDispatcher $pluginEventDispatcher, \BumbleDocGen\Core\Parser\ProjectParser $parser, \BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper $parserHelper, \BumbleDocGen\Core\Renderer\Renderer $renderer, \BumbleDocGen\Core\Logger\Handler\GenerationErrorsHandler $generationErrorsHandler, \BumbleDocGen\Core\Parser\Entity\RootEntityCollectionsGroup $rootEntityCollectionsGroup, \BumbleDocGen\Console\ProgressBar\ProgressBarFactory $progressBarFactory, \Monolog\Logger $logger); ``` @@ -130,6 +130,11 @@ public function __construct(\Symfony\Component\Console\Style\OutputStyle $io, \B $rootEntityCollectionsGroup \BumbleDocGen\Core\Parser\Entity\RootEntityCollectionsGroup - + + + $progressBarFactory + \BumbleDocGen\Console\ProgressBar\ProgressBarFactory + - $logger @@ -161,7 +166,7 @@ public function __construct(\Symfony\Component\Console\Style\OutputStyle $io, \B ```php @@ -297,7 +302,7 @@ public function generateReadmeTemplate(\BumbleDocGen\AI\ProviderInterface $aiPro ```php diff --git a/docs/classes/DocGeneratorFactory.md b/docs/classes/DocGeneratorFactory.md index f6249e31..d6658754 100644 --- a/docs/classes/DocGeneratorFactory.md +++ b/docs/classes/DocGeneratorFactory.md @@ -2,7 +2,7 @@ BumbleDocGen / DocGeneratorFactory

        - DocGeneratorFactory class: + DocGeneratorFactory class:

        @@ -42,6 +42,9 @@ final class DocGeneratorFactory
      • createConfiguration
      • +
      • + getRootEntityReflections +
      • setCustomConfigurationParameters
      • @@ -63,7 +66,7 @@ final class DocGeneratorFactory ```php @@ -100,7 +103,7 @@ public function __construct(string $diConfig = __DIR__ . '/di-config.php'); ```php @@ -151,7 +154,7 @@ public function create(string|null ...$configurationFiles): \BumbleDocGen\DocGen ```php @@ -202,7 +205,7 @@ public function createByConfigArray(array $config): \BumbleDocGen\DocGenerator; ```php @@ -233,6 +236,57 @@ public function createConfiguration(string ...$configurationFiles): \BumbleDocGe Return value: \BumbleDocGen\Core\Configuration\Configuration +Throws: + + + +
        +
        + + + +```php +public function getRootEntityReflections(\BumbleDocGen\Core\Configuration\ReflectionApiConfig $reflectionApiConfig): \BumbleDocGen\Core\Parser\Entity\RootEntityCollection; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
        NameTypeDescription
        $reflectionApiConfig\BumbleDocGen\Core\Configuration\ReflectionApiConfig-
        + +Return value: \BumbleDocGen\Core\Parser\Entity\RootEntityCollection + + Throws:
        • @@ -253,7 +307,7 @@ public function createConfiguration(string ...$configurationFiles): \BumbleDocGe ```php @@ -291,7 +345,7 @@ public function setCustomConfigurationParameters(array $customConfigurationParam ```php diff --git a/docs/shared_c.cache b/docs/shared_c.cache index 3549bf08..0274c397 100644 --- a/docs/shared_c.cache +++ b/docs/shared_c.cache @@ -1 +1 @@ -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 \ No newline at end of file +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 \ No newline at end of file diff --git a/docs/tech/1.configuration/classes/Configuration.md b/docs/tech/1.configuration/classes/Configuration.md index 74a5c34a..18e12cc5 100644 --- a/docs/tech/1.configuration/classes/Configuration.md +++ b/docs/tech/1.configuration/classes/Configuration.md @@ -159,7 +159,7 @@ public function __construct(\BumbleDocGen\Core\Configuration\ConfigurationParame ```php @@ -242,7 +242,7 @@ public function getConfigurationVersion(): string; ```php @@ -263,7 +263,7 @@ public function getDocGenLibDir(): string; ```php @@ -291,7 +291,7 @@ public function getGitClientPath(): string; ```php @@ -426,7 +426,7 @@ public function getOutputDirBaseUrl(): string; ```php @@ -584,7 +584,7 @@ public function getTemplatesDir(): string; ```php @@ -618,7 +618,7 @@ public function getTwigFilters(): \BumbleDocGen\Core\Renderer\Twig\Filter\Custom ```php @@ -652,7 +652,7 @@ public function getTwigFunctions(): \BumbleDocGen\Core\Renderer\Twig\Function\Cu ```php @@ -680,7 +680,7 @@ public function getWorkingDir(): string; ```php @@ -708,7 +708,7 @@ public function isCheckFileInGitBeforeCreatingDocEnabled(): bool; ```php diff --git a/docs/tech/1.configuration/classes/GetDocumentedEntityUrl.md b/docs/tech/1.configuration/classes/GetDocumentedEntityUrl.md index be83aba3..7dc519c2 100644 --- a/docs/tech/1.configuration/classes/GetDocumentedEntityUrl.md +++ b/docs/tech/1.configuration/classes/GetDocumentedEntityUrl.md @@ -32,19 +32,19 @@ See: Examples of using: ```php -{{ getDocumentedEntityUrl(phpClassEntityCollection, '\\BumbleDocGen\\Renderer\\Twig\\MainExtension', 'getFunctions') }} +{{ getDocumentedEntityUrl(phpEntities, '\\BumbleDocGen\\Renderer\\Twig\\MainExtension', 'getFunctions') }} The function returns a reference to the documented entity, anchored to the getFunctions method ``` ```php -{{ getDocumentedEntityUrl(phpClassEntityCollection, '\\BumbleDocGen\\Renderer\\Twig\\MainExtension') }} +{{ getDocumentedEntityUrl(phpEntities, '\\BumbleDocGen\\Renderer\\Twig\\MainExtension') }} The function returns a reference to the documented entity MainExtension ``` ```php -{{ getDocumentedEntityUrl(phpClassEntityCollection, '\\BumbleDocGen\\Renderer\\Twig\\MainExtension', '', false) }} +{{ getDocumentedEntityUrl(phpEntities, '\\BumbleDocGen\\Renderer\\Twig\\MainExtension', '', false) }} The function returns a link to the file MainExtension ``` diff --git a/docs/tech/1.configuration/classes/PrintEntityCollectionAsList.md b/docs/tech/1.configuration/classes/PrintEntityCollectionAsList.md index 78e19920..a7e315ef 100644 --- a/docs/tech/1.configuration/classes/PrintEntityCollectionAsList.md +++ b/docs/tech/1.configuration/classes/PrintEntityCollectionAsList.md @@ -21,13 +21,13 @@ final class PrintEntityCollectionAsList implements \BumbleDocGen\Core\Renderer\T Examples of using: ```php -{{ printEntityCollectionAsList(phpClassEntityCollection.filterByInterfaces(['ScriptFramework\\ScriptInterface', 'ScriptFramework\\TestScriptInterface'])) }} +{{ printEntityCollectionAsList(phpEntities.filterByInterfaces(['ScriptFramework\\ScriptInterface', 'ScriptFramework\\TestScriptInterface'])) }} The function will output a list of PHP classes that match the ScriptFramework\ScriptInterface and ScriptFramework\TestScriptInterface interfaces ``` ```php -{{ printEntityCollectionAsList(phpClassEntityCollection) }} +{{ printEntityCollectionAsList(phpEntities) }} The function will list all documented PHP classes ``` diff --git a/docs/tech/1.configuration/readme.md b/docs/tech/1.configuration/readme.md index 4df519d0..442a80c8 100644 --- a/docs/tech/1.configuration/readme.md +++ b/docs/tech/1.configuration/readme.md @@ -223,4 +223,4 @@ The inheritance algorithm is as follows: scalar types can be overwritten by each

          -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
          Last modified date: Sat Oct 28 11:03:31 2023 +0300
          Page content update date: Tue Nov 14 2023
          Made with Bumble Documentation Generator
          \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
          Last modified date: Mon Nov 20 19:18:48 2023 +0300
          Page content update date: Fri Dec 15 2023
          Made with Bumble Documentation Generator
        \ No newline at end of file diff --git a/docs/tech/2.parser/classes/ConstantEntityCollection.md b/docs/tech/2.parser/classes/ClassConstantEntitiesCollection.md similarity index 76% rename from docs/tech/2.parser/classes/ConstantEntityCollection.md rename to docs/tech/2.parser/classes/ClassConstantEntitiesCollection.md index 74b4a756..1e040b9a 100644 --- a/docs/tech/2.parser/classes/ConstantEntityCollection.md +++ b/docs/tech/2.parser/classes/ClassConstantEntitiesCollection.md @@ -1,8 +1,8 @@ - BumbleDocGen / Technical description of the project / Parser / Entities and entities collections / ConstantEntityCollection
        + BumbleDocGen / Technical description of the project / Parser / Entities and entities collections / ClassConstantEntitiesCollection

        - ConstantEntityCollection class: + ClassConstantEntitiesCollection class:

        @@ -10,9 +10,9 @@ ```php -namespace BumbleDocGen\LanguageHandler\Php\Parser\Entity; +namespace BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant; -final class ConstantEntityCollection extends \BumbleDocGen\Core\Parser\Entity\BaseEntityCollection implements \IteratorAggregate +final class ClassConstantEntitiesCollection extends \BumbleDocGen\Core\Parser\Entity\BaseEntityCollection implements \IteratorAggregate ``` @@ -72,11 +72,11 @@ final class ConstantEntityCollection extends \BumbleDocGen\Core\Parser\Entity\Ba ```php -public function __construct(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity $classEntity, \BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings $phpHandlerSettings, \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Cache\CacheablePhpEntityFactory $cacheablePhpEntityFactory); +public function __construct(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity $classEntity, \BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings $phpHandlerSettings, \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Cache\CacheablePhpEntityFactory $cacheablePhpEntityFactory); ``` @@ -94,7 +94,7 @@ public function __construct(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\Clas $classEntity - \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity + \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - @@ -119,11 +119,11 @@ public function __construct(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\Clas ```php -public function add(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ConstantEntity $constantEntity, bool $reload = false): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ConstantEntityCollection; +public function add(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity $constantEntity, bool $reload = false): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntitiesCollection; ``` @@ -141,7 +141,7 @@ public function add(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ConstantEnti $constantEntity - \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ConstantEntity + \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity - @@ -152,7 +152,7 @@ public function add(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ConstantEnti -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ConstantEntityCollection +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntitiesCollection @@ -162,11 +162,11 @@ public function add(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ConstantEnti ```php -public function get(string $objectName): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ConstantEntity; +public function get(string $objectName): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity; ``` @@ -190,7 +190,7 @@ public function get(string $objectName): null|\BumbleDocGen\LanguageHandler\Php\ -Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ConstantEntity +Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity @@ -286,7 +286,7 @@ public function isEmpty(): bool; ```php @@ -360,11 +360,11 @@ public function remove(string $objectName): void; ```php -public function unsafeGet(string $constantName): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ConstantEntity; +public function unsafeGet(string $constantName): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity; ``` @@ -388,7 +388,7 @@ public function unsafeGet(string $constantName): null|\BumbleDocGen\LanguageHand -Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ConstantEntity +Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity Throws: diff --git a/docs/tech/2.parser/classes/ConstantEntity.md b/docs/tech/2.parser/classes/ClassConstantEntity.md similarity index 69% rename from docs/tech/2.parser/classes/ConstantEntity.md rename to docs/tech/2.parser/classes/ClassConstantEntity.md index 0b30824f..5c16d285 100644 --- a/docs/tech/2.parser/classes/ConstantEntity.md +++ b/docs/tech/2.parser/classes/ClassConstantEntity.md @@ -1,8 +1,8 @@ - BumbleDocGen / Technical description of the project / Parser / Entities and entities collections / ConstantEntity
        + BumbleDocGen / Technical description of the project / Parser / Entities and entities collections / ClassConstantEntity

        - ConstantEntity class: + ClassConstantEntity class:

        @@ -10,9 +10,9 @@ ```php -namespace BumbleDocGen\LanguageHandler\Php\Parser\Entity; +namespace BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant; -class ConstantEntity extends \BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity implements \BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityInterface, \BumbleDocGen\Core\Parser\Entity\EntityInterface +class ClassConstantEntity extends \BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity implements \BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityInterface, \BumbleDocGen\Core\Parser\Entity\EntityInterface ```
        Class constant entity
        @@ -33,15 +33,12 @@ class ConstantEntity extends \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Bas

        Methods:

          -
        1. - entityCacheIsOutdated -
        2. getAbsoluteFileName - Returns the absolute path to a file if it can be retrieved and if the file is in the project directory
        3. getAst -
        4. + - Get AST for this entity
        5. getCacheKey
        6. @@ -53,109 +50,115 @@ class ConstantEntity extends \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Bas
        7. getDescription -
        8. + - Get entity description
        9. getDescriptionLinks - Get parsed links from description and doc blocks `see` and `link`
        10. getDocBlock -
        11. + - Get DocBlock for current entity
        12. getDocComment - Get the doc comment of an entity
        13. getDocCommentEntity -
        14. + - Link to an entity where docBlock is implemented for this entity +
        15. + getDocCommentLine + - Get the code line number where the docBlock of the current entity begins
        16. getDocNote -
        17. + - Get the note annotation value
        18. getEndLine -
        19. + - Get the line number of the end of a constant's code in a file
        20. getExamples - Get parsed examples from `examples` doc block
        21. -
        22. - getFileName -
        23. getFileSourceLink
        24. getFirstExample - - Get first example from @examples doc block
        25. + - Get first example from `examples` doc block
        26. getImplementingClass -
        27. + - Get the class like entity in which the current entity was implemented
        28. getImplementingClassName
        29. getName -
        30. + - Constant name
        31. getNamespaceName -
        32. + - Get the name of the namespace where the current class is implemented
        33. getObjectId - Get entity unique ID
        34. -
        35. - getPhpHandlerSettings -
        36. getRelativeFileName -
        37. + - File name relative to project_root configuration parameter
        38. getRootEntity -
        39. + - Get the class like entity where this constant was obtained
        40. getRootEntityCollection - - Get parent collection of entities
        41. + - Get the collection of root entities to which this entity belongs
        42. getShortName -
        43. + - Constant short name
        44. getStartLine -
        45. + - Get the line number of the beginning of the constant code in a file
        46. getThrows - Get parsed throws from `throws` doc block
        47. - getValue + getThrowsDocBlockLinks
        48. +
        49. + getValue + - Get the compiled value of a constant
        50. hasDescriptionLinks -
        51. + - Checking if an entity has links in its description
        52. hasExamples -
        53. + - Checking if an entity has `example` docBlock
        54. hasThrows -
        55. + - Checking if an entity has `throws` docBlock +
        56. + isApi + - Checking if an entity has `api` docBlock
        57. isDeprecated -
        58. + - Checking if an entity has `deprecated` docBlock +
        59. + isEntityCacheOutdated + - Checking if the entity cache is out of date
        60. isEntityDataCacheOutdated
        61. isEntityFileCanBeLoad -
        62. + - Checking if entity data can be retrieved
        63. isInternal -
        64. + - Checking if an entity has `internal` docBlock
        65. isPrivate -
        66. + - Check if a constant is a private constant
        67. isProtected -
        68. + - Check if a constant is a protected constant
        69. isPublic -
        70. + - Check if a constant is a public constant
        71. reloadEntityDependenciesCache -
        72. + - Update entity dependency cache
        73. removeEntityValueFromCache
        74. @@ -169,19 +172,19 @@ class ConstantEntity extends \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Bas @@ -196,11 +199,11 @@ class ConstantEntity extends \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Bas ```php -public function __construct(\BumbleDocGen\Core\Configuration\Configuration $configuration, \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity $classEntity, \BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper $parserHelper, \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache $localObjectCache, \Psr\Log\LoggerInterface $logger, string $constantName, string $implementingClassName); +public function __construct(\BumbleDocGen\Core\Configuration\Configuration $configuration, \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity $classEntity, \BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper $parserHelper, \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache $localObjectCache, \Psr\Log\LoggerInterface $logger, string $constantName, string $implementingClassName); ``` @@ -223,7 +226,7 @@ public function __construct(\BumbleDocGen\Core\Configuration\Configuration $conf $classEntity - \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity + \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - @@ -256,39 +259,6 @@ public function __construct(\BumbleDocGen\Core\Configuration\Configuration $conf - -
          -
          - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function entityCacheIsOutdated(): bool; -``` - - - -Parameters: not specified - -Return value: bool - - -Throws: - -

          @@ -296,7 +266,7 @@ public function entityCacheIsOutdated(): bool; ```php @@ -326,14 +296,14 @@ public function getAbsoluteFileName(): null|string; ```php public function getAst(): \PhpParser\Node\Stmt\ClassConst; ``` - +
          Get AST for this entity
          Parameters: not specified @@ -354,7 +324,7 @@ public function getAst(): \PhpParser\Node\Stmt\ClassConst; ```php @@ -377,7 +347,7 @@ public function getCacheKey(): string; ```php @@ -398,6 +368,9 @@ public function getCachedEntityDependencies(): array;
        75. \Psr\Cache\InvalidArgumentException
        76. +
        77. + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
        78. +
      @@ -407,20 +380,20 @@ public function getCachedEntityDependencies(): array; ```php // Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity -public function getCurrentRootEntity(): null|\BumbleDocGen\Core\Parser\Entity\RootEntityInterface; +public function getCurrentRootEntity(): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; ``` Parameters: not specified -Return value: null | \BumbleDocGen\Core\Parser\Entity\RootEntityInterface +Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity @@ -430,14 +403,16 @@ public function getCurrentRootEntity(): null|\BumbleDocGen\Core\Parser\Entity\Ro ```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + public function getDescription(): string; ``` - +
      Get entity description
      Parameters: not specified @@ -458,7 +433,7 @@ public function getDescription(): string; ```php @@ -491,14 +466,16 @@ public function getDescriptionLinks(): array; ```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + public function getDocBlock(): \phpDocumentor\Reflection\DocBlock; ``` - +
      Get DocBlock for current entity
      Parameters: not specified @@ -519,7 +496,7 @@ public function getDocBlock(): \phpDocumentor\Reflection\DocBlock; ```php @@ -549,19 +526,49 @@ public function getDocComment(): string; ```php -public function getDocCommentEntity(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ConstantEntity; +public function getDocCommentEntity(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity; ``` +
      Link to an entity where docBlock is implemented for this entity
      + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity + + + +
      +
      + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDocCommentLine(): null|int; +``` + +
      Get the code line number where the docBlock of the current entity begins
      Parameters: not specified -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ConstantEntity +Return value: null | int + +Throws: +

      @@ -570,7 +577,7 @@ public function getDocCommentEntity(): \BumbleDocGen\LanguageHandler\Php\Parser\ ```php @@ -579,13 +586,20 @@ public function getDocCommentEntity(): \BumbleDocGen\LanguageHandler\Php\Parser\ public function getDocNote(): string; ``` - +
      Get the note annotation value
      Parameters: not specified Return value: string +Throws: + +
      @@ -593,14 +607,14 @@ public function getDocNote(): string; ```php public function getEndLine(): int; ``` - +
      Get the line number of the end of a constant's code in a file
      Parameters: not specified @@ -621,7 +635,7 @@ public function getEndLine(): int; ```php @@ -637,27 +651,6 @@ public function getExamples(): array; Return value: array -
      -
      -
      - - - -```php -public function getFileName(): null|string; -``` - - - -Parameters: not specified - -Return value: null | string - - Throws:
      • @@ -672,7 +665,7 @@ public function getFileName(): null|string; ```php @@ -719,7 +712,7 @@ public function getFileSourceLink(bool $withLine = true): null|string; ```php @@ -728,13 +721,20 @@ public function getFileSourceLink(bool $withLine = true): null|string; public function getFirstExample(): string; ``` -
        Get first example from @examples doc block
        +
        Get first example from `examples` doc block
        Parameters: not specified Return value: string +Throws: + +

      @@ -742,18 +742,18 @@ public function getFirstExample(): string; ```php -public function getImplementingClass(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity; +public function getImplementingClass(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; ``` - +
      Get the class like entity in which the current entity was implemented
      Parameters: not specified -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity
      @@ -763,7 +763,7 @@ public function getImplementingClass(): \BumbleDocGen\LanguageHandler\Php\Parser ```php @@ -784,14 +784,14 @@ public function getImplementingClassName(): string; ```php public function getName(): string; ``` - +
      Constant name
      Parameters: not specified @@ -805,27 +805,20 @@ public function getName(): string; ```php public function getNamespaceName(): string; ``` - +
      Get the name of the namespace where the current class is implemented
      Parameters: not specified Return value: string -Throws: - -
      @@ -833,7 +826,7 @@ public function getNamespaceName(): string; ```php @@ -849,27 +842,6 @@ public function getObjectId(): string; Return value: string -
      -
      -
      - - - -```php -public function getPhpHandlerSettings(): \BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings; -``` - - - -Parameters: not specified - -Return value: \BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings - -

      @@ -877,7 +849,7 @@ public function getPhpHandlerSettings(): \BumbleDocGen\LanguageHandler\Php\PhpHa ```php @@ -886,20 +858,19 @@ public function getPhpHandlerSettings(): \BumbleDocGen\LanguageHandler\Php\PhpHa public function getRelativeFileName(): null|string; ``` - +
      File name relative to project_root configuration parameter
      Parameters: not specified Return value: null | string -Throws: -

      @@ -907,18 +878,18 @@ public function getRelativeFileName(): null|string; ```php -public function getRootEntity(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity; +public function getRootEntity(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; ``` - +
      Get the class like entity where this constant was obtained
      Parameters: not specified -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity
      @@ -928,18 +899,18 @@ public function getRootEntity(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity ```php -public function getRootEntityCollection(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection; +public function getRootEntityCollection(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; ``` -
      Get parent collection of entities
      +
      Get the collection of root entities to which this entity belongs
      Parameters: not specified -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection @@ -949,20 +920,26 @@ public function getRootEntityCollection(): \BumbleDocGen\LanguageHandler\Php\Par ```php public function getShortName(): string; ``` - +
      Constant short name
      Parameters: not specified Return value: string + +See: +
      @@ -970,14 +947,14 @@ public function getShortName(): string; ```php public function getStartLine(): int; ``` - +
      Get the line number of the beginning of the constant code in a file
      Parameters: not specified @@ -998,7 +975,7 @@ public function getStartLine(): int; ```php @@ -1014,6 +991,36 @@ public function getThrows(): array; Return value: array +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getThrowsDocBlockLinks(): array; +``` + + + +Parameters: not specified + +Return value: array + + Throws:
      • @@ -1028,14 +1035,14 @@ public function getThrows(): array; ```php public function getValue(): string|array|int|bool|null|float; ``` - +
        Get the compiled value of a constant
        Parameters: not specified @@ -1059,7 +1066,7 @@ public function getValue(): string|array|int|bool|null|float; ```php @@ -1068,7 +1075,7 @@ public function getValue(): string|array|int|bool|null|float; public function hasDescriptionLinks(): bool; ``` - +
        Checking if an entity has links in its description
        Parameters: not specified @@ -1089,7 +1096,7 @@ public function hasDescriptionLinks(): bool; ```php @@ -1098,13 +1105,20 @@ public function hasDescriptionLinks(): bool; public function hasExamples(): bool; ``` - +
        Checking if an entity has `example` docBlock
        Parameters: not specified Return value: bool +Throws: + +

      @@ -1112,7 +1126,7 @@ public function hasExamples(): bool; ```php @@ -1121,13 +1135,50 @@ public function hasExamples(): bool; public function hasThrows(): bool; ``` +
      Checking if an entity has `throws` docBlock
      + +Parameters: not specified + +Return value: bool +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function isApi(): bool; +``` + +
      Checking if an entity has `api` docBlock
      + Parameters: not specified Return value: bool +Throws: + +

      @@ -1135,7 +1186,7 @@ public function hasThrows(): bool; ```php @@ -1144,7 +1195,37 @@ public function hasThrows(): bool; public function isDeprecated(): bool; ``` +
      Checking if an entity has `deprecated` docBlock
      + +Parameters: not specified + +Return value: bool + + +Throws: + + +
      +
      +
      + +
        +
      • # + isEntityCacheOutdated + :warning: Is internal | source code
      • +
      + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity +public function isEntityCacheOutdated(): bool; +``` + +
      Checking if the entity cache is out of date
      Parameters: not specified @@ -1158,7 +1239,7 @@ public function isDeprecated(): bool; ```php @@ -1188,7 +1269,7 @@ public function isEntityDataCacheOutdated(): bool; ```php @@ -1197,7 +1278,7 @@ public function isEntityDataCacheOutdated(): bool; public function isEntityFileCanBeLoad(): bool; ``` - +
      Checking if entity data can be retrieved
      Parameters: not specified @@ -1218,7 +1299,7 @@ public function isEntityFileCanBeLoad(): bool; ```php @@ -1227,13 +1308,20 @@ public function isEntityFileCanBeLoad(): bool; public function isInternal(): bool; ``` - +
      Checking if an entity has `internal` docBlock
      Parameters: not specified Return value: bool +Throws: + +

      @@ -1241,14 +1329,14 @@ public function isInternal(): bool; ```php public function isPrivate(): bool; ``` - +
      Check if a constant is a private constant
      Parameters: not specified @@ -1269,14 +1357,14 @@ public function isPrivate(): bool; ```php public function isProtected(): bool; ``` - +
      Check if a constant is a protected constant
      Parameters: not specified @@ -1297,14 +1385,14 @@ public function isProtected(): bool; ```php public function isPublic(): bool; ``` - +
      Check if a constant is a public constant
      Parameters: not specified @@ -1325,7 +1413,7 @@ public function isPublic(): bool; ```php @@ -1334,20 +1422,13 @@ public function isPublic(): bool; public function reloadEntityDependenciesCache(): array; ``` - +
      Update entity dependency cache
      Parameters: not specified Return value: array -Throws: - -

      @@ -1355,7 +1436,7 @@ public function reloadEntityDependenciesCache(): array; ```php @@ -1395,7 +1476,7 @@ public function removeEntityValueFromCache(string $key): void; ```php diff --git a/docs/tech/2.parser/classes/ClassConstantEntity_2.md b/docs/tech/2.parser/classes/ClassConstantEntity_2.md new file mode 100644 index 00000000..662f4451 --- /dev/null +++ b/docs/tech/2.parser/classes/ClassConstantEntity_2.md @@ -0,0 +1,1505 @@ + + BumbleDocGen / Technical description of the project / Parser / ClassConstantEntity
      + +

      + ClassConstantEntity class: +

      + + + + + +```php +namespace BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant; + +class ClassConstantEntity extends \BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity implements \BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityInterface, \BumbleDocGen\Core\Parser\Entity\EntityInterface +``` + +
      Class constant entity
      + + + + + + +

      Initialization methods:

      + +
        +
      1. + __construct +
      2. +
      + +

      Methods:

      + +
        +
      1. + getAbsoluteFileName + - Returns the absolute path to a file if it can be retrieved and if the file is in the project directory
      2. +
      3. + getAst + - Get AST for this entity
      4. +
      5. + getCacheKey +
      6. +
      7. + getCachedEntityDependencies +
      8. +
      9. + getCurrentRootEntity +
      10. +
      11. + getDescription + - Get entity description
      12. +
      13. + getDescriptionLinks + - Get parsed links from description and doc blocks `see` and `link`
      14. +
      15. + getDocBlock + - Get DocBlock for current entity
      16. +
      17. + getDocComment + - Get the doc comment of an entity
      18. +
      19. + getDocCommentEntity + - Link to an entity where docBlock is implemented for this entity
      20. +
      21. + getDocCommentLine + - Get the code line number where the docBlock of the current entity begins
      22. +
      23. + getDocNote + - Get the note annotation value
      24. +
      25. + getEndLine + - Get the line number of the end of a constant's code in a file
      26. +
      27. + getExamples + - Get parsed examples from `examples` doc block
      28. +
      29. + getFileSourceLink +
      30. +
      31. + getFirstExample + - Get first example from `examples` doc block
      32. +
      33. + getImplementingClass + - Get the class like entity in which the current entity was implemented
      34. +
      35. + getImplementingClassName +
      36. +
      37. + getName + - Constant name
      38. +
      39. + getNamespaceName + - Get the name of the namespace where the current class is implemented
      40. +
      41. + getObjectId + - Get entity unique ID
      42. +
      43. + getRelativeFileName + - File name relative to project_root configuration parameter
      44. +
      45. + getRootEntity + - Get the class like entity where this constant was obtained
      46. +
      47. + getRootEntityCollection + - Get the collection of root entities to which this entity belongs
      48. +
      49. + getShortName + - Constant short name
      50. +
      51. + getStartLine + - Get the line number of the beginning of the constant code in a file
      52. +
      53. + getThrows + - Get parsed throws from `throws` doc block
      54. +
      55. + getThrowsDocBlockLinks +
      56. +
      57. + getValue + - Get the compiled value of a constant
      58. +
      59. + hasDescriptionLinks + - Checking if an entity has links in its description
      60. +
      61. + hasExamples + - Checking if an entity has `example` docBlock
      62. +
      63. + hasThrows + - Checking if an entity has `throws` docBlock
      64. +
      65. + isApi + - Checking if an entity has `api` docBlock
      66. +
      67. + isDeprecated + - Checking if an entity has `deprecated` docBlock
      68. +
      69. + isEntityCacheOutdated + - Checking if the entity cache is out of date
      70. +
      71. + isEntityDataCacheOutdated +
      72. +
      73. + isEntityFileCanBeLoad + - Checking if entity data can be retrieved
      74. +
      75. + isInternal + - Checking if an entity has `internal` docBlock
      76. +
      77. + isPrivate + - Check if a constant is a private constant
      78. +
      79. + isProtected + - Check if a constant is a protected constant
      80. +
      81. + isPublic + - Check if a constant is a public constant
      82. +
      83. + reloadEntityDependenciesCache + - Update entity dependency cache
      84. +
      85. + removeEntityValueFromCache +
      86. +
      87. + removeNotUsedEntityDataCache +
      88. +
      + + +

      Constants:

      + + + + + + +

      Method details:

      + +
      + + + +```php +public function __construct(\BumbleDocGen\Core\Configuration\Configuration $configuration, \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity $classEntity, \BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper $parserHelper, \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache $localObjectCache, \Psr\Log\LoggerInterface $logger, string $constantName, string $implementingClassName); +``` + + + +Parameters: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $configuration\BumbleDocGen\Core\Configuration\Configuration-
      $classEntity\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity-
      $parserHelper\BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper-
      $localObjectCache\BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache-
      $logger\Psr\Log\LoggerInterface-
      $constantNamestring-
      $implementingClassNamestring-
      + + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getAbsoluteFileName(): null|string; +``` + +
      Returns the absolute path to a file if it can be retrieved and if the file is in the project directory
      + +Parameters: not specified + +Return value: null | string + + +Throws: + + +
      +
      +
      + + + +```php +public function getAst(): \PhpParser\Node\Stmt\ClassConst; +``` + +
      Get AST for this entity
      + +Parameters: not specified + +Return value: \PhpParser\Node\Stmt\ClassConst + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait + +public function getCacheKey(): string; +``` + + + +Parameters: not specified + +Return value: string + + +
      +
      +
      + +
        +
      • # + getCachedEntityDependencies + :warning: Is internal | source code
      • +
      + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getCachedEntityDependencies(): array; +``` + + + +Parameters: not specified + +Return value: array + + +Throws: + + +
      +
      +
      + +
        +
      • # + getCurrentRootEntity + :warning: Is internal | source code
      • +
      + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getCurrentRootEntity(): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; +``` + + + +Parameters: not specified + +Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDescription(): string; +``` + +
      Get entity description
      + +Parameters: not specified + +Return value: string + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDescriptionLinks(): array; +``` + +
      Get parsed links from description and doc blocks `see` and `link`
      + +Parameters: not specified + +Return value: array + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDocBlock(): \phpDocumentor\Reflection\DocBlock; +``` + +
      Get DocBlock for current entity
      + +Parameters: not specified + +Return value: \phpDocumentor\Reflection\DocBlock + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDocComment(): string; +``` + +
      Get the doc comment of an entity
      + +Parameters: not specified + +Return value: string + + +Throws: + + +
      +
      +
      + +
        +
      • # + getDocCommentEntity + :warning: Is internal | source code
      • +
      + +```php +public function getDocCommentEntity(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity; +``` + +
      Link to an entity where docBlock is implemented for this entity
      + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDocCommentLine(): null|int; +``` + +
      Get the code line number where the docBlock of the current entity begins
      + +Parameters: not specified + +Return value: null | int + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDocNote(): string; +``` + +
      Get the note annotation value
      + +Parameters: not specified + +Return value: string + + +Throws: + + +
      +
      +
      + + + +```php +public function getEndLine(): int; +``` + +
      Get the line number of the end of a constant's code in a file
      + +Parameters: not specified + +Return value: int + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getExamples(): array; +``` + +
      Get parsed examples from `examples` doc block
      + +Parameters: not specified + +Return value: array + + +Throws: + + +
      +
      +
      + +
        +
      • # + getFileSourceLink + :warning: Is internal | source code
      • +
      + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getFileSourceLink(bool $withLine = true): null|string; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $withLinebool-
      + +Return value: null | string + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getFirstExample(): string; +``` + +
      Get first example from `examples` doc block
      + +Parameters: not specified + +Return value: string + + +Throws: + + +
      +
      +
      + + + +```php +public function getImplementingClass(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; +``` + +
      Get the class like entity in which the current entity was implemented
      + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + + +
      +
      +
      + + + +```php +public function getImplementingClassName(): string; +``` + + + +Parameters: not specified + +Return value: string + + +
      +
      +
      + + + +```php +public function getName(): string; +``` + +
      Constant name
      + +Parameters: not specified + +Return value: string + + +
      +
      +
      + + + +```php +public function getNamespaceName(): string; +``` + +
      Get the name of the namespace where the current class is implemented
      + +Parameters: not specified + +Return value: string + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getObjectId(): string; +``` + +
      Get entity unique ID
      + +Parameters: not specified + +Return value: string + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getRelativeFileName(): null|string; +``` + +
      File name relative to project_root configuration parameter
      + +Parameters: not specified + +Return value: null | string + + + +See: + +
      +
      +
      + + + +```php +public function getRootEntity(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; +``` + +
      Get the class like entity where this constant was obtained
      + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + + +
      +
      +
      + + + +```php +public function getRootEntityCollection(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; +``` + +
      Get the collection of root entities to which this entity belongs
      + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection + + +
      +
      +
      + + + +```php +public function getShortName(): string; +``` + +
      Constant short name
      + +Parameters: not specified + +Return value: string + + + +See: + +
      +
      +
      + + + +```php +public function getStartLine(): int; +``` + +
      Get the line number of the beginning of the constant code in a file
      + +Parameters: not specified + +Return value: int + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getThrows(): array; +``` + +
      Get parsed throws from `throws` doc block
      + +Parameters: not specified + +Return value: array + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getThrowsDocBlockLinks(): array; +``` + + + +Parameters: not specified + +Return value: array + + +Throws: + + +
      +
      +
      + + + +```php +public function getValue(): string|array|int|bool|null|float; +``` + +
      Get the compiled value of a constant
      + +Parameters: not specified + +Return value: string | array | int | bool | null | float + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function hasDescriptionLinks(): bool; +``` + +
      Checking if an entity has links in its description
      + +Parameters: not specified + +Return value: bool + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function hasExamples(): bool; +``` + +
      Checking if an entity has `example` docBlock
      + +Parameters: not specified + +Return value: bool + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function hasThrows(): bool; +``` + +
      Checking if an entity has `throws` docBlock
      + +Parameters: not specified + +Return value: bool + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function isApi(): bool; +``` + +
      Checking if an entity has `api` docBlock
      + +Parameters: not specified + +Return value: bool + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function isDeprecated(): bool; +``` + +
      Checking if an entity has `deprecated` docBlock
      + +Parameters: not specified + +Return value: bool + + +Throws: + + +
      +
      +
      + +
        +
      • # + isEntityCacheOutdated + :warning: Is internal | source code
      • +
      + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function isEntityCacheOutdated(): bool; +``` + +
      Checking if the entity cache is out of date
      + +Parameters: not specified + +Return value: bool + + +
      +
      +
      + +
        +
      • # + isEntityDataCacheOutdated + :warning: Is internal | source code
      • +
      + +```php +// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait + +public function isEntityDataCacheOutdated(): bool; +``` + + + +Parameters: not specified + +Return value: bool + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function isEntityFileCanBeLoad(): bool; +``` + +
      Checking if entity data can be retrieved
      + +Parameters: not specified + +Return value: bool + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function isInternal(): bool; +``` + +
      Checking if an entity has `internal` docBlock
      + +Parameters: not specified + +Return value: bool + + +Throws: + + +
      +
      +
      + + + +```php +public function isPrivate(): bool; +``` + +
      Check if a constant is a private constant
      + +Parameters: not specified + +Return value: bool + + +Throws: + + +
      +
      +
      + + + +```php +public function isProtected(): bool; +``` + +
      Check if a constant is a protected constant
      + +Parameters: not specified + +Return value: bool + + +Throws: + + +
      +
      +
      + + + +```php +public function isPublic(): bool; +``` + +
      Check if a constant is a public constant
      + +Parameters: not specified + +Return value: bool + + +Throws: + + +
      +
      +
      + +
        +
      • # + reloadEntityDependenciesCache + :warning: Is internal | source code
      • +
      + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function reloadEntityDependenciesCache(): array; +``` + +
      Update entity dependency cache
      + +Parameters: not specified + +Return value: array + + +
      +
      +
      + +
        +
      • # + removeEntityValueFromCache + :warning: Is internal | source code
      • +
      + +```php +// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait + +public function removeEntityValueFromCache(string $key): void; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $keystring-
      + +Return value: void + + +
      +
      +
      + +
        +
      • # + removeNotUsedEntityDataCache + :warning: Is internal | source code
      • +
      + +```php +// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait + +public function removeNotUsedEntityDataCache(): void; +``` + + + +Parameters: not specified + +Return value: void + + +Throws: + + +
      +
      + + \ No newline at end of file diff --git a/docs/tech/2.parser/classes/ClassEntity.md b/docs/tech/2.parser/classes/ClassEntity.md index 23ea2164..5872a965 100644 --- a/docs/tech/2.parser/classes/ClassEntity.md +++ b/docs/tech/2.parser/classes/ClassEntity.md @@ -2,7 +2,7 @@ BumbleDocGen / Technical description of the project / Parser / Entities and entities collections / ClassEntity

      - ClassEntity class: + ClassEntity class:

      @@ -12,10 +12,16 @@ ```php namespace BumbleDocGen\LanguageHandler\Php\Parser\Entity; -class ClassEntity extends \BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity implements \BumbleDocGen\Core\Renderer\Context\DocumentTransformableEntityInterface, \BumbleDocGen\Core\Parser\Entity\RootEntityInterface, \BumbleDocGen\Core\Parser\Entity\EntityInterface, \BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityInterface +class ClassEntity extends \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity implements \BumbleDocGen\Core\Renderer\Context\DocumentTransformableEntityInterface, \BumbleDocGen\Core\Parser\Entity\RootEntityInterface, \BumbleDocGen\Core\Parser\Entity\EntityInterface, \BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityInterface ``` -
      Class entity
      +
      PHP Class
      + +See: + @@ -34,257 +40,266 @@ class ClassEntity extends \BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEn
      1. - cursorToDocAttributeLinkFragment -
      2. -
      3. - documentCreationAllowed -
      4. + addPluginData + - Add information to aт entity object
      5. - entityCacheIsOutdated -
      6. -
      7. - entityDataCanBeLoaded + cursorToDocAttributeLinkFragment
      8. getAbsoluteFileName - Returns the absolute path to a file if it can be retrieved and if the file is in the project directory
      9. getAst -
      10. + - Get AST for this entity
      11. getCacheKey
      12. getCachedEntityDependencies
      13. -
      14. - getCasesNames -
      15. getConstant -
      16. -
      17. - getConstantEntity -
      18. + - Get the method entity by its name
      19. - getConstantEntityCollection -
      20. + getConstantEntitiesCollection + - Get a collection of constant entities
      21. getConstantValue -
      22. + - Get the compiled value of a constant
      23. getConstants -
      24. + - Get all constants that are available according to the configuration as an array
      25. getConstantsData -
      26. + - Get a list of all constants and classes where they are implemented +
      27. + getConstantsValues + - Get class constant compiled values according to filters
      28. getCurrentRootEntity
      29. getDescription -
      30. + - Get entity description
      31. getDescriptionLinks - Get parsed links from description and doc blocks `see` and `link`
      32. getDocBlock -
      33. + - Get DocBlock for current entity
      34. getDocComment - Get the doc comment of an entity
      35. getDocCommentEntity -
      36. + - Link to an entity where docBlock is implemented for this entity +
      37. + getDocCommentLine + - Get the code line number where the docBlock of the current entity begins
      38. getDocNote -
      39. + - Get the note annotation value
      40. getDocRender
      41. getEndLine -
      42. + - Get the line number of the end of a class code in a file
      43. getEntityDependencies
      44. -
      45. - getEnumCaseValue -
      46. -
      47. - getEnumCases -
      48. getExamples - Get parsed examples from `examples` doc block
      49. getFileContent
      50. -
      51. - getFileName - - Returns the relative path to a file if it can be retrieved and if the file is in the project directory
      52. getFileSourceLink
      53. getFirstExample - - Get first example from @examples doc block
      54. -
      55. - getFullFileName -
      56. + - Get first example from `examples` doc block
      57. getImplementingClass -
      58. + - Get the class like entity in which the current entity was implemented
      59. getInterfaceNames -
      60. + - Get a list of class interface names
      61. getInterfacesEntities -
      62. + - Get a list of interface entities that the current class implements
      63. - getMethodEntity -
      64. + getMethod + - Get the method entity by its name
      65. - getMethodEntityCollection -
      66. + getMethodEntitiesCollection + - Get a collection of method entities +
      67. + getMethods + - Get all methods that are available according to the configuration as an array
      68. getMethodsData -
      69. + - Get a list of all methods and classes where they are implemented
      70. getModifiersString -
      71. + - Get entity modifiers as a string
      72. getName -
      73. + - Full name of the entity
      74. getNamespaceName -
      75. + - Get the entity namespace name
      76. getObjectId - Get entity unique ID
      77. getParentClass -
      78. + - Get the entity of the parent class if it exists
      79. getParentClassEntities -
      80. + - Get a list of parent class entities
      81. getParentClassName -
      82. + - Get the name of the parent class entity if it exists
      83. getParentClassNames -
      84. -
      85. - getPhpHandlerSettings -
      86. + - Get a list of entity names of parent classes
      87. getPluginData -
      88. + - Get additional information added using the plugin +
      89. + getProperties + - Get all properties that are available according to the configuration as an array
      90. getPropertiesData -
      91. + - Get a list of all properties and classes where they are implemented
      92. - getPropertyEntity -
      93. + getProperty + - Get the property entity by its name
      94. - getPropertyEntityCollection -
      95. + getPropertyDefaultValue + - Get the compiled value of a property +
      96. + getPropertyEntitiesCollection + - Get a collection of property entities
      97. getRelativeFileName -
      98. + - File name relative to project_root configuration parameter
      99. getRootEntityCollection - - Get parent collection of entities
      100. + - Get the collection of root entities to which this entity belongs
      101. getShortName -
      102. + - Short name of the entity
      103. getStartLine -
      104. + - Get the line number of the start of a class code in a file
      105. getThrows - Get parsed throws from `throws` doc block
      106. - getTraits + getThrowsDocBlockLinks
      107. +
      108. + getTraits + - Get a list of trait entities of the current class
      109. getTraitsNames -
      110. + - Get a list of class traits names
      111. hasConstant -
      112. + - Check if a constant exists in a class
      113. hasDescriptionLinks -
      114. + - Checking if an entity has links in its description
      115. hasExamples -
      116. + - Checking if an entity has `example` docBlock
      117. hasMethod -
      118. + - Check if a method exists in a class
      119. hasParentClass -
      120. + - Check if a certain parent class exists in a chain of parent classes
      121. hasProperty -
      122. + - Check if a property exists in a class
      123. hasThrows -
      124. + - Checking if an entity has `throws` docBlock
      125. hasTraits -
      126. + - Check if the class contains traits
      127. implementsInterface -
      128. + - Check if a class implements an interface
      129. isAbstract -
      130. + - Check that an entity is abstract +
      131. + isApi + - Checking if an entity has `api` docBlock
      132. +
      133. + isAttribute + - Check if a class is an attribute
      134. +
      135. + isClass + - Check if an entity is a Class
      136. isClassLoad
      137. isDeprecated + - Checking if an entity has `deprecated` docBlock
      138. +
      139. + isDocumentCreationAllowed
      140. +
      141. + isEntityCacheOutdated + - Checking if the entity cache is out of date
      142. isEntityDataCacheOutdated
      143. - isEntityFileCanBeLoad + isEntityDataCanBeLoaded
      144. +
      145. + isEntityFileCanBeLoad + - Checking if entity data can be retrieved
      146. isEntityNameValid - - Check if entity name is valid
      147. + - Check if the name is a valid name for ClassLikeEntity
      148. isEnum -
      149. + - Check if an entity is an Enum
      150. isExternalLibraryEntity - - The entity is loaded from a third party library and should not be treated the same as a standard one
      151. + - Check if a given entity is an entity from a third party library (connected via composer)
      152. isInGit - Checking if class file is in git repository
      153. isInstantiable -
      154. + - Check that an entity is instantiable
      155. isInterface -
      156. + - Check if an entity is an Interface
      157. isInternal -
      158. + - Checking if an entity has `internal` docBlock
      159. isSubclassOf -
      160. + - Whether the given class is a subclass of the specified class
      161. isTrait -
      162. + - Check if an entity is a Trait
      163. - loadPluginData + normalizeClassName
      164. reloadEntityDependenciesCache -
      165. + - Update entity dependency cache
      166. removeEntityValueFromCache
      167. @@ -309,11 +324,13 @@ class ClassEntity extends \BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEn ```php -public function __construct(\BumbleDocGen\Core\Configuration\Configuration $configuration, \BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings $phpHandlerSettings, \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection $classEntityCollection, \BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper $parserHelper, \BumbleDocGen\LanguageHandler\Php\Parser\ComposerHelper $composerHelper, \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpParser\PhpParserHelper $phpParserHelper, \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache $localObjectCache, \Psr\Log\LoggerInterface $logger, string $className, string|null $relativeFileName); +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function __construct(\BumbleDocGen\Core\Configuration\Configuration $configuration, \BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings $phpHandlerSettings, \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection $entitiesCollection, \BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper $parserHelper, \BumbleDocGen\LanguageHandler\Php\Parser\ComposerHelper $composerHelper, \BumbleDocGen\LanguageHandler\Php\Parser\PhpParser\PhpParserHelper $phpParserHelper, \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache $localObjectCache, \Psr\Log\LoggerInterface $logger, string $className, string|null $relativeFileName); ``` @@ -340,8 +357,8 @@ public function __construct(\BumbleDocGen\Core\Configuration\Configuration $conf - - $classEntityCollection - \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection + $entitiesCollection + \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection - @@ -356,7 +373,7 @@ public function __construct(\BumbleDocGen\Core\Configuration\Configuration $conf $phpParserHelper - \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpParser\PhpParserHelper + \BumbleDocGen\LanguageHandler\Php\Parser\PhpParser\PhpParserHelper - @@ -389,16 +406,18 @@ public function __construct(\BumbleDocGen\Core\Configuration\Configuration $conf
        ```php -public function cursorToDocAttributeLinkFragment(string $cursor, bool $isForDocument = true): string; -``` +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity +public function addPluginData(string $pluginKey, mixed $data): void; +``` +
        Add information to aт entity object
        Parameters: @@ -412,118 +431,74 @@ public function cursorToDocAttributeLinkFragment(string $cursor, bool $isForDocu - $cursor + $pluginKey string - - $isForDocument - bool + $data + mixed - -Return value: string - - -Throws: - - -
        -
        -
        - - - -```php -public function documentCreationAllowed(): bool; -``` - - - -Parameters: not specified - -Return value: bool - - -Throws: -

          -
        • # - entityCacheIsOutdated - | source code
        • +
        • # + cursorToDocAttributeLinkFragment + :warning: Is internal | source code
        ```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity -public function entityCacheIsOutdated(): bool; +public function cursorToDocAttributeLinkFragment(string $cursor, bool $isForDocument = true): string; ``` -Parameters: not specified +Parameters: -Return value: bool + + + + + + + + + + + + + + + + + + + + +
        NameTypeDescription
        $cursorstring-
        $isForDocumentbool-
        + +Return value: string Throws: - -
        -
        -
        - - - -```php -public function entityDataCanBeLoaded(): bool; -``` - - - -Parameters: not specified - -Return value: bool - + \DI\NotFoundException -Throws: -
        -
        -
        - - - -```php -public function getCasesNames(): array; -``` - - - -Parameters: not specified - -Return value: array - - -Throws: -
        @@ -679,62 +627,16 @@ public function getCasesNames(): array; ```php -public function getConstant(string $name): string|array|int|bool|null|float; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
        NameTypeDescription
        $namestring-
        +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity -Return value: string | array | int | bool | null | float - - -Throws: - - -
      -
      -
      - - - -```php -public function getConstantEntity(string $constantName, bool $unsafe = true): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ConstantEntity; +public function getConstant(string $constantName, bool $unsafe = false): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity; ``` - +
      Get the method entity by its name
      Parameters: @@ -750,17 +652,17 @@ public function getConstantEntity(string $constantName, bool $unsafe = true): nu $constantName string - - + The name of the constant whose entity you want to get $unsafe bool - - + Check all constants, not just the constants allowed in the configuration (@see PhpHandlerSettings::getClassConstantEntityFilter()) -Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ConstantEntity +Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity Throws: @@ -781,20 +683,22 @@ public function getConstantEntity(string $constantName, bool $unsafe = true): nu
      ```php -public function getConstantEntityCollection(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ConstantEntityCollection; -``` +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity +public function getConstantEntitiesCollection(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntitiesCollection; +``` +
      Get a collection of constant entities
      Parameters: not specified -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ConstantEntityCollection +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntitiesCollection Throws: @@ -810,6 +714,12 @@ public function getConstantEntityCollection(): \BumbleDocGen\LanguageHandler\Php + +See: +

      @@ -817,14 +727,16 @@ public function getConstantEntityCollection(): \BumbleDocGen\LanguageHandler\Php ```php -public function getConstantValue(string $name): string|array|int|bool|null|float; -``` +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity +public function getConstantValue(string $constantName): string|array|int|bool|null|float; +``` +
      Get the compiled value of a constant
      Parameters: @@ -838,9 +750,9 @@ public function getConstantValue(string $name): string|array|int|bool|null|float - $name + $constantName string - - + The name of the constant for which you need to get the value @@ -850,9 +762,45 @@ public function getConstantValue(string $name): string|array|int|bool|null|float Throws: + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getConstants(): array; +``` + +
      Get all constants that are available according to the configuration as an array
      + +Parameters: not specified + +Return value: array + + +Throws: + + +See: +

      ```php -public function getConstants(): array; +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getConstantsData(bool $onlyFromCurrentClassAndTraits = false, int $flags = \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity::VISIBILITY_MODIFIERS_FLAG_ANY): array; ``` +
      Get a list of all constants and classes where they are implemented
      +Parameters: -Parameters: not specified + + + + + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $onlyFromCurrentClassAndTraitsboolGet data only for constants from the current class
      $flagsintGet data only for constants corresponding to the visibility modifiers passed in this value
      Return value: array Throws:
      @@ -906,16 +877,18 @@ public function getConstants(): array;
      ```php -public function getConstantsData(bool $onlyFromCurrentClassAndTraits = false, int $flags = \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ConstantEntity::VISIBILITY_MODIFIERS_FLAG_ANY): array; -``` +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity +public function getConstantsValues(bool $onlyFromCurrentClassAndTraits = false, int $flags = \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity::VISIBILITY_MODIFIERS_FLAG_ANY): array; +``` +
      Get class constant compiled values according to filters
      Parameters: @@ -931,12 +904,12 @@ public function getConstantsData(bool $onlyFromCurrentClassAndTraits = false, in $onlyFromCurrentClassAndTraits bool - - + Get values only for constants from the current class $flags int - - + Get values only for constants corresponding to the visibility modifiers passed in this value @@ -946,9 +919,18 @@ public function getConstantsData(bool $onlyFromCurrentClassAndTraits = false, in Throws:
      @@ -958,20 +940,20 @@ public function getConstantsData(bool $onlyFromCurrentClassAndTraits = false, in ```php // Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity -public function getCurrentRootEntity(): null|\BumbleDocGen\Core\Parser\Entity\RootEntityInterface; +public function getCurrentRootEntity(): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; ``` Parameters: not specified -Return value: null | \BumbleDocGen\Core\Parser\Entity\RootEntityInterface +Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity
      @@ -981,14 +963,16 @@ public function getCurrentRootEntity(): null|\BumbleDocGen\Core\Parser\Entity\Ro ```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + public function getDescription(): string; ``` - +
      Get entity description
      Parameters: not specified @@ -997,12 +981,6 @@ public function getDescription(): string; Throws: - -
      -
      - - - -```php -public function getFileName(): null|string; -``` - -
      Returns the relative path to a file if it can be retrieved and if the file is in the project directory
      - -Parameters: not specified - -Return value: null | string - -

      @@ -1400,7 +1315,7 @@ public function getFileName(): null|string; ```php @@ -1447,7 +1362,7 @@ public function getFileSourceLink(bool $withLine = true): null|string; ```php @@ -1456,34 +1371,13 @@ public function getFileSourceLink(bool $withLine = true): null|string; public function getFirstExample(): string; ``` -
      Get first example from @examples doc block
      +
      Get first example from `examples` doc block
      Parameters: not specified Return value: string -
      -
      -
      - - - -```php -public function getFullFileName(): null|string; -``` - - - -Parameters: not specified - -Return value: null | string - - Throws:
      @@ -1519,14 +1415,16 @@ public function getImplementingClass(): \BumbleDocGen\LanguageHandler\Php\Parser ```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + public function getInterfaceNames(): array; ``` - +
      Get a list of class interface names
      Parameters: not specified @@ -1547,14 +1445,16 @@ public function getInterfaceNames(): array; ```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + public function getInterfacesEntities(): array; ``` - +
      Get a list of interface entities that the current class implements
      Parameters: not specified @@ -1573,16 +1473,18 @@ public function getInterfacesEntities(): array;
      ```php -public function getMethodEntity(string $methodName, bool $unsafe = true): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\MethodEntity; -``` +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity +public function getMethod(string $methodName, bool $unsafe = false): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntity; +``` +
      Get the method entity by its name
      Parameters: @@ -1598,51 +1500,95 @@ public function getMethodEntity(string $methodName, bool $unsafe = true): null|\ $methodName string - - + The name of the method whose entity you want to get $unsafe bool - - + Check all methods, not just the methods allowed in the configuration (@see PhpHandlerSettings::getMethodEntityFilter()) -Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\MethodEntity +Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntity + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getMethodEntitiesCollection(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntitiesCollection; +``` + +
      Get a collection of method entities
      + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntitiesCollection Throws: + +See: +

      ```php -public function getMethodEntityCollection(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\MethodEntityCollection; -``` +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity +public function getMethods(): array; +``` +
      Get all methods that are available according to the configuration as an array
      Parameters: not specified -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\MethodEntityCollection +Return value: array Throws: @@ -1658,6 +1604,14 @@ public function getMethodEntityCollection(): \BumbleDocGen\LanguageHandler\Php\P + +See: +

      @@ -1665,14 +1619,16 @@ public function getMethodEntityCollection(): \BumbleDocGen\LanguageHandler\Php\P ```php -public function getMethodsData(bool $onlyFromCurrentClassAndTraits = false, int $flags = \BumbleDocGen\LanguageHandler\Php\Parser\Entity\MethodEntity::VISIBILITY_MODIFIERS_FLAG_ANY): array; -``` +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity +public function getMethodsData(bool $onlyFromCurrentClassAndTraits = false, int $flags = \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntity::VISIBILITY_MODIFIERS_FLAG_ANY): array; +``` +
      Get a list of all methods and classes where they are implemented
      Parameters: @@ -1688,12 +1644,12 @@ public function getMethodsData(bool $onlyFromCurrentClassAndTraits = false, int $onlyFromCurrentClassAndTraits bool - - + Get data only for methods from the current class $flags int - - + Get data only for methods corresponding to the visibility modifiers passed in this value @@ -1715,27 +1671,20 @@ public function getMethodsData(bool $onlyFromCurrentClassAndTraits = false, int ```php public function getModifiersString(): string; ``` - +
      Get entity modifiers as a string
      Parameters: not specified Return value: string -Throws: - -

      @@ -1743,14 +1692,16 @@ public function getModifiersString(): string; ```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + public function getName(): string; ``` - +
      Full name of the entity
      Parameters: not specified @@ -1764,14 +1715,16 @@ public function getName(): string; ```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + public function getNamespaceName(): string; ``` - +
      Get the entity namespace name
      Parameters: not specified @@ -1785,10 +1738,12 @@ public function getNamespaceName(): string; ```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + public function getObjectId(): string; ``` @@ -1806,26 +1761,19 @@ public function getObjectId(): string; ```php -public function getParentClass(): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity; +public function getParentClass(): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; ``` - +
      Get the entity of the parent class if it exists
      Parameters: not specified -Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity - - -Throws: -

      @@ -1834,27 +1782,22 @@ public function getParentClass(): null|\BumbleDocGen\LanguageHandler\Php\Parser\ ```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + public function getParentClassEntities(): array; ``` - +
      Get a list of parent class entities
      Parameters: not specified Return value: array -Throws: - -
      @@ -1862,27 +1805,20 @@ public function getParentClassEntities(): array; ```php public function getParentClassName(): null|string; ``` - +
      Get the name of the parent class entity if it exists
      Parameters: not specified Return value: null | string -Throws: - -

      @@ -1890,63 +1826,121 @@ public function getParentClassName(): null|string; ```php public function getParentClassNames(): array; ``` - +
      Get a list of entity names of parent classes
      Parameters: not specified Return value: array -Throws: -
      +
      +
      + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getPluginData(string $pluginKey): mixed; +``` + +
      Get additional information added using the plugin
      + +Parameters: + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $pluginKeystring-
      + +Return value: mixed + +

      ```php -public function getPhpHandlerSettings(): \BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings; -``` +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity +public function getProperties(): array; +``` +
      Get all properties that are available according to the configuration as an array
      Parameters: not specified -Return value: \BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings +Return value: array + + +Throws: + +See: +

      ```php -public function getPluginData(string $pluginKey): null|array; -``` +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity +public function getPropertiesData(bool $onlyFromCurrentClassAndTraits = false, int $flags = \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntity::VISIBILITY_MODIFIERS_FLAG_ANY): array; +``` +
      Get a list of all properties and classes where they are implemented
      Parameters: @@ -1960,31 +1954,45 @@ public function getPluginData(string $pluginKey): null|array; - $pluginKey - string - - + $onlyFromCurrentClassAndTraits + bool + Get data only for properties from the current class + + + $flags + int + Get data only for properties corresponding to the visibility modifiers passed in this value -Return value: null | array +Return value: array + + +Throws: +

      ```php -public function getPropertiesData(bool $onlyFromCurrentClassAndTraits = false, int $flags = \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PropertyEntity::VISIBILITY_MODIFIERS_FLAG_ANY): array; -``` +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity +public function getProperty(string $propertyName, bool $unsafe = false): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntity; +``` +
      Get the property entity by its name
      Parameters: @@ -1998,26 +2006,32 @@ public function getPropertiesData(bool $onlyFromCurrentClassAndTraits = false, i - $onlyFromCurrentClassAndTraits - bool - - + $propertyName + string + The name of the property whose entity you want to get - $flags - int - - + $unsafe + bool + Check all properties, not just the properties allowed in the configuration (@see PhpHandlerSettings::getPropertyEntityFilter()) -Return value: array +Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntity Throws:
      @@ -2025,16 +2039,18 @@ public function getPropertiesData(bool $onlyFromCurrentClassAndTraits = false, i
      ```php -public function getPropertyEntity(string $propertyName, bool $unsafe = true): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\PropertyEntity; -``` +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity +public function getPropertyDefaultValue(string $propertyName): string|array|int|bool|null|float; +``` +
      Get the compiled value of a property
      Parameters: @@ -2050,23 +2066,18 @@ public function getPropertyEntity(string $propertyName, bool $unsafe = true): nu $propertyName string - - - - - $unsafe - bool - - + The name of the property for which you need to get the value -Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PropertyEntity +Return value: string | array | int | bool | null | float Throws:
      @@ -2081,20 +2095,22 @@ public function getPropertyEntity(string $propertyName, bool $unsafe = true): nu
      ```php -public function getPropertyEntityCollection(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PropertyEntityCollection; -``` +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity +public function getPropertyEntitiesCollection(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntitiesCollection; +``` +
      Get a collection of property entities
      Parameters: not specified -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PropertyEntityCollection +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntitiesCollection Throws: @@ -2110,6 +2126,12 @@ public function getPropertyEntityCollection(): \BumbleDocGen\LanguageHandler\Php + +See: +

      @@ -2117,44 +2139,28 @@ public function getPropertyEntityCollection(): \BumbleDocGen\LanguageHandler\Php ```php -public function getRelativeFileName(bool $loadIfEmpty = true): null|string; -``` - +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity +public function getRelativeFileName(): null|string; +``` -Parameters: +
      File name relative to project_root configuration parameter
      - - - - - - - - - - - - - - - -
      NameTypeDescription
      $loadIfEmptybool-
      +Parameters: not specified Return value: null | string -Throws: -

      @@ -2162,18 +2168,20 @@ public function getRelativeFileName(bool $loadIfEmpty = true): null|string; ```php -public function getRootEntityCollection(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection; +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getRootEntityCollection(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; ``` -
      Get parent collection of entities
      +
      Get the collection of root entities to which this entity belongs
      Parameters: not specified -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection
      @@ -2183,14 +2191,16 @@ public function getRootEntityCollection(): \BumbleDocGen\LanguageHandler\Php\Par ```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + public function getShortName(): string; ``` - +
      Short name of the entity
      Parameters: not specified @@ -2204,14 +2214,16 @@ public function getShortName(): string; ```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + public function getStartLine(): int; ``` - +
      Get the line number of the start of a class code in a file
      Parameters: not specified @@ -2232,7 +2244,7 @@ public function getStartLine(): int; ```php @@ -2248,6 +2260,36 @@ public function getThrows(): array; Return value: array +Throws: + + + +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getThrowsDocBlockLinks(): array; +``` + + + +Parameters: not specified + +Return value: array + + Throws:
      • @@ -2262,14 +2304,16 @@ public function getThrows(): array; ```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + public function getTraits(): array; ``` - +
        Get a list of trait entities of the current class
        Parameters: not specified @@ -2290,14 +2334,16 @@ public function getTraits(): array; ```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + public function getTraitsNames(): array; ``` - +
        Get a list of class traits names
        Parameters: not specified @@ -2318,14 +2364,16 @@ public function getTraitsNames(): array; ```php -public function hasConstant(string $constantName): bool; -``` +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity +public function hasConstant(string $constantName, bool $unsafe = false): bool; +``` +
        Check if a constant exists in a class
        Parameters: @@ -2341,7 +2389,12 @@ public function hasConstant(string $constantName): bool; $constantName string - - + The name of the class whose entity you want to check + + + $unsafe + bool + Check all constants, not just the constants allowed in the configuration (@see PhpHandlerSettings::getClassConstantEntityFilter()) @@ -2351,6 +2404,12 @@ public function hasConstant(string $constantName): bool; Throws:

      @@ -2416,14 +2482,16 @@ public function hasExamples(): bool; ```php -public function hasMethod(string $method): bool; -``` +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity +public function hasMethod(string $methodName, bool $unsafe = false): bool; +``` +
      Check if a method exists in a class
      Parameters: @@ -2437,9 +2505,14 @@ public function hasMethod(string $method): bool; - $method + $methodName string - - + The name of the method whose entity you want to check + + + $unsafe + bool + Check all methods, not just the methods allowed in the configuration (@see PhpHandlerSettings::getMethodEntityFilter()) @@ -2449,9 +2522,15 @@ public function hasMethod(string $method): bool; Throws:
      @@ -2461,14 +2540,16 @@ public function hasMethod(string $method): bool; ```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + public function hasParentClass(string $parentClassName): bool; ``` - +
      Check if a certain parent class exists in a chain of parent classes
      Parameters: @@ -2484,7 +2565,7 @@ public function hasParentClass(string $parentClassName): bool; $parentClassName string - - + Searched parent class @@ -2492,13 +2573,6 @@ public function hasParentClass(string $parentClassName): bool; Return value: bool -Throws: - -
      @@ -2506,14 +2580,16 @@ public function hasParentClass(string $parentClassName): bool; ```php -public function hasProperty(string $property): bool; -``` +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity +public function hasProperty(string $propertyName, bool $unsafe = false): bool; +``` +
      Check if a property exists in a class
      Parameters: @@ -2527,9 +2603,14 @@ public function hasProperty(string $property): bool; - $property + $propertyName string - - + The name of the property whose entity you want to check + + + $unsafe + bool + Check all properties, not just the properties allowed in the configuration (@see PhpHandlerSettings::getPropertyEntityFilter()) @@ -2539,9 +2620,15 @@ public function hasProperty(string $property): bool; Throws:
      @@ -2551,7 +2638,7 @@ public function hasProperty(string $property): bool; ```php @@ -2560,13 +2647,20 @@ public function hasProperty(string $property): bool; public function hasThrows(): bool; ``` - +
      Checking if an entity has `throws` docBlock
      Parameters: not specified Return value: bool +Throws: + +
      @@ -2574,14 +2668,16 @@ public function hasThrows(): bool; ```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + public function hasTraits(): bool; ``` - +
      Check if the class contains traits
      Parameters: not specified @@ -2602,14 +2698,16 @@ public function hasTraits(): bool; ```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + public function implementsInterface(string $interfaceName): bool; ``` - +
      Check if a class implements an interface
      Parameters: @@ -2625,7 +2723,7 @@ public function implementsInterface(string $interfaceName): bool; $interfaceName string - - + Name of the required interface in the interface chain @@ -2647,14 +2745,65 @@ public function implementsInterface(string $interfaceName): bool; ```php public function isAbstract(): bool; ``` +
      Check that an entity is abstract
      + +Parameters: not specified + +Return value: bool + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function isApi(): bool; +``` + +
      Checking if an entity has `api` docBlock
      + +Parameters: not specified + +Return value: bool + + +Throws: + + +
      +
      +
      + + + +```php +public function isAttribute(): bool; +``` +
      Check if a class is an attribute
      Parameters: not specified @@ -2668,6 +2817,27 @@ public function isAbstract(): bool; +
      +
      +
      + + + +```php +public function isClass(): bool; +``` + +
      Check if an entity is a Class
      + +Parameters: not specified + +Return value: bool + +

      @@ -2675,10 +2845,12 @@ public function isAbstract(): bool; ```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + public function isClassLoad(): bool; ``` @@ -2696,7 +2868,7 @@ public function isClassLoad(): bool; ```php @@ -2705,7 +2877,67 @@ public function isClassLoad(): bool; public function isDeprecated(): bool; ``` +
      Checking if an entity has `deprecated` docBlock
      + +Parameters: not specified + +Return value: bool + + +Throws: + + +
      +
      +
      + +
        +
      • # + isDocumentCreationAllowed + :warning: Is internal | source code
      • +
      + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function isDocumentCreationAllowed(): bool; +``` + + + +Parameters: not specified + +Return value: bool + + +Throws: + + +
      +
      +
      + +
        +
      • # + isEntityCacheOutdated + :warning: Is internal | source code
      • +
      + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function isEntityCacheOutdated(): bool; +``` +
      Checking if the entity cache is out of date
      Parameters: not specified @@ -2719,7 +2951,7 @@ public function isDeprecated(): bool; ```php @@ -2746,10 +2978,40 @@ public function isEntityDataCacheOutdated(): bool;
      + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function isEntityDataCanBeLoaded(): bool; +``` + + + +Parameters: not specified + +Return value: bool + + +Throws: + + +
      +
      +
      + ```php @@ -2758,7 +3020,7 @@ public function isEntityDataCacheOutdated(): bool; public function isEntityFileCanBeLoad(): bool; ``` - +
      Checking if entity data can be retrieved
      Parameters: not specified @@ -2779,14 +3041,16 @@ public function isEntityFileCanBeLoad(): bool; ```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + public static function isEntityNameValid(string $entityName): bool; ``` -
      Check if entity name is valid
      +
      Check if the name is a valid name for ClassLikeEntity
      Parameters: @@ -2817,27 +3081,22 @@ public static function isEntityNameValid(string $entityName): bool; ```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + public function isEnum(): bool; ``` - +
      Check if an entity is an Enum
      Parameters: not specified Return value: bool -Throws: - -

      @@ -2845,14 +3104,16 @@ public function isEnum(): bool; ```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + public function isExternalLibraryEntity(): bool; ``` -
      The entity is loaded from a third party library and should not be treated the same as a standard one
      +
      Check if a given entity is an entity from a third party library (connected via composer)
      Parameters: not specified @@ -2866,10 +3127,12 @@ public function isExternalLibraryEntity(): bool; ```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + public function isInGit(): bool; ``` @@ -2887,27 +3150,20 @@ public function isInGit(): bool; ```php public function isInstantiable(): bool; ``` - +
      Check that an entity is instantiable
      Parameters: not specified Return value: bool -Throws: - -

      @@ -2915,27 +3171,22 @@ public function isInstantiable(): bool; ```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + public function isInterface(): bool; ``` - +
      Check if an entity is an Interface
      Parameters: not specified Return value: bool -Throws: - -

      @@ -2943,7 +3194,7 @@ public function isInterface(): bool; ```php @@ -2952,13 +3203,20 @@ public function isInterface(): bool; public function isInternal(): bool; ``` - +
      Checking if an entity has `internal` docBlock
      Parameters: not specified Return value: bool +Throws: + +

      @@ -2966,14 +3224,16 @@ public function isInternal(): bool; ```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + public function isSubclassOf(string $className): bool; ``` - +
      Whether the given class is a subclass of the specified class
      Parameters: @@ -3011,42 +3271,36 @@ public function isSubclassOf(string $className): bool; ```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + public function isTrait(): bool; ``` - +
      Check if an entity is a Trait
      Parameters: not specified Return value: bool -Throws: - -

      ```php -public function loadPluginData(string $pluginKey, array $data): void; +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public static function normalizeClassName(string $name): string; ``` @@ -3063,19 +3317,14 @@ public function loadPluginData(string $pluginKey, array $data): void; - $pluginKey + $name string - - - - $data - array - - -Return value: void +Return value: string
      @@ -3085,7 +3334,7 @@ public function loadPluginData(string $pluginKey, array $data): void; ```php @@ -3094,20 +3343,13 @@ public function loadPluginData(string $pluginKey, array $data): void; public function reloadEntityDependenciesCache(): array; ``` - +
      Update entity dependency cache
      Parameters: not specified Return value: array -Throws: - -

      @@ -3115,7 +3357,7 @@ public function reloadEntityDependenciesCache(): array; ```php @@ -3155,7 +3397,7 @@ public function removeEntityValueFromCache(string $key): void; ```php @@ -3185,10 +3427,12 @@ public function removeNotUsedEntityDataCache(): void; ```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + public function setCustomAst(\PhpParser\Node\Stmt\Trait_|\PhpParser\Node\Stmt\Enum_|\PhpParser\Node\Stmt\Interface_|\PhpParser\Node\Stmt\Class_|null $customAst): void; ``` diff --git a/docs/tech/2.parser/classes/ClassLikeEntity.md b/docs/tech/2.parser/classes/ClassLikeEntity.md new file mode 100644 index 00000000..aff034fd --- /dev/null +++ b/docs/tech/2.parser/classes/ClassLikeEntity.md @@ -0,0 +1,3317 @@ + + BumbleDocGen / Technical description of the project / Parser / ClassLikeEntity
      + +

      + ClassLikeEntity class: +

      + + + + + +```php +namespace BumbleDocGen\LanguageHandler\Php\Parser\Entity; + +abstract class ClassLikeEntity extends \BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity implements \BumbleDocGen\Core\Renderer\Context\DocumentTransformableEntityInterface, \BumbleDocGen\Core\Parser\Entity\RootEntityInterface, \BumbleDocGen\Core\Parser\Entity\EntityInterface, \BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityInterface +``` + + + + + + + + +

      Initialization methods:

      + +
        +
      1. + __construct +
      2. +
      + +

      Methods:

      + +
        +
      1. + addPluginData + - Add information to aт entity object
      2. +
      3. + cursorToDocAttributeLinkFragment +
      4. +
      5. + getAbsoluteFileName + - Returns the absolute path to a file if it can be retrieved and if the file is in the project directory
      6. +
      7. + getAst + - Get AST for this entity
      8. +
      9. + getCacheKey +
      10. +
      11. + getCachedEntityDependencies +
      12. +
      13. + getConstant + - Get the method entity by its name
      14. +
      15. + getConstantEntitiesCollection + - Get a collection of constant entities
      16. +
      17. + getConstantValue + - Get the compiled value of a constant
      18. +
      19. + getConstants + - Get all constants that are available according to the configuration as an array
      20. +
      21. + getConstantsData + - Get a list of all constants and classes where they are implemented
      22. +
      23. + getConstantsValues + - Get class constant compiled values according to filters
      24. +
      25. + getCurrentRootEntity +
      26. +
      27. + getDescription + - Get entity description
      28. +
      29. + getDescriptionLinks + - Get parsed links from description and doc blocks `see` and `link`
      30. +
      31. + getDocBlock + - Get DocBlock for current entity
      32. +
      33. + getDocComment + - Get the doc comment of an entity
      34. +
      35. + getDocCommentEntity + - Link to an entity where docBlock is implemented for this entity
      36. +
      37. + getDocCommentLine + - Get the code line number where the docBlock of the current entity begins
      38. +
      39. + getDocNote + - Get the note annotation value
      40. +
      41. + getDocRender +
      42. +
      43. + getEndLine + - Get the line number of the end of a class code in a file
      44. +
      45. + getEntityDependencies +
      46. +
      47. + getExamples + - Get parsed examples from `examples` doc block
      48. +
      49. + getFileContent +
      50. +
      51. + getFileSourceLink +
      52. +
      53. + getFirstExample + - Get first example from `examples` doc block
      54. +
      55. + getImplementingClass + - Get the class like entity in which the current entity was implemented
      56. +
      57. + getInterfaceNames + - Get a list of class interface names
      58. +
      59. + getInterfacesEntities + - Get a list of interface entities that the current class implements
      60. +
      61. + getMethod + - Get the method entity by its name
      62. +
      63. + getMethodEntitiesCollection + - Get a collection of method entities
      64. +
      65. + getMethods + - Get all methods that are available according to the configuration as an array
      66. +
      67. + getMethodsData + - Get a list of all methods and classes where they are implemented
      68. +
      69. + getModifiersString + - Get entity modifiers as a string
      70. +
      71. + getName + - Full name of the entity
      72. +
      73. + getNamespaceName + - Get the entity namespace name
      74. +
      75. + getObjectId + - Get entity unique ID
      76. +
      77. + getParentClass + - Get the entity of the parent class if it exists
      78. +
      79. + getParentClassEntities + - Get a list of parent class entities
      80. +
      81. + getParentClassName + - Get the name of the parent class entity if it exists
      82. +
      83. + getParentClassNames + - Get a list of entity names of parent classes
      84. +
      85. + getPluginData + - Get additional information added using the plugin
      86. +
      87. + getProperties + - Get all properties that are available according to the configuration as an array
      88. +
      89. + getPropertiesData + - Get a list of all properties and classes where they are implemented
      90. +
      91. + getProperty + - Get the property entity by its name
      92. +
      93. + getPropertyDefaultValue + - Get the compiled value of a property
      94. +
      95. + getPropertyEntitiesCollection + - Get a collection of property entities
      96. +
      97. + getRelativeFileName + - File name relative to project_root configuration parameter
      98. +
      99. + getRootEntityCollection + - Get the collection of root entities to which this entity belongs
      100. +
      101. + getShortName + - Short name of the entity
      102. +
      103. + getStartLine + - Get the line number of the start of a class code in a file
      104. +
      105. + getThrows + - Get parsed throws from `throws` doc block
      106. +
      107. + getThrowsDocBlockLinks +
      108. +
      109. + getTraits + - Get a list of trait entities of the current class
      110. +
      111. + getTraitsNames + - Get a list of class traits names
      112. +
      113. + hasConstant + - Check if a constant exists in a class
      114. +
      115. + hasDescriptionLinks + - Checking if an entity has links in its description
      116. +
      117. + hasExamples + - Checking if an entity has `example` docBlock
      118. +
      119. + hasMethod + - Check if a method exists in a class
      120. +
      121. + hasParentClass + - Check if a certain parent class exists in a chain of parent classes
      122. +
      123. + hasProperty + - Check if a property exists in a class
      124. +
      125. + hasThrows + - Checking if an entity has `throws` docBlock
      126. +
      127. + hasTraits + - Check if the class contains traits
      128. +
      129. + implementsInterface + - Check if a class implements an interface
      130. +
      131. + isAbstract + - Check that an entity is abstract
      132. +
      133. + isApi + - Checking if an entity has `api` docBlock
      134. +
      135. + isClass + - Check if an entity is a Class
      136. +
      137. + isClassLoad +
      138. +
      139. + isDeprecated + - Checking if an entity has `deprecated` docBlock
      140. +
      141. + isDocumentCreationAllowed +
      142. +
      143. + isEntityCacheOutdated + - Checking if the entity cache is out of date
      144. +
      145. + isEntityDataCacheOutdated +
      146. +
      147. + isEntityDataCanBeLoaded +
      148. +
      149. + isEntityFileCanBeLoad + - Checking if entity data can be retrieved
      150. +
      151. + isEntityNameValid + - Check if the name is a valid name for ClassLikeEntity
      152. +
      153. + isEnum + - Check if an entity is an Enum
      154. +
      155. + isExternalLibraryEntity + - Check if a given entity is an entity from a third party library (connected via composer)
      156. +
      157. + isInGit + - Checking if class file is in git repository
      158. +
      159. + isInstantiable + - Check that an entity is instantiable
      160. +
      161. + isInterface + - Check if an entity is an Interface
      162. +
      163. + isInternal + - Checking if an entity has `internal` docBlock
      164. +
      165. + isSubclassOf + - Whether the given class is a subclass of the specified class
      166. +
      167. + isTrait + - Check if an entity is a Trait
      168. +
      169. + normalizeClassName +
      170. +
      171. + reloadEntityDependenciesCache + - Update entity dependency cache
      172. +
      173. + removeEntityValueFromCache +
      174. +
      175. + removeNotUsedEntityDataCache +
      176. +
      177. + setCustomAst +
      178. +
      + + + + + + + +

      Method details:

      + +
      + + + +```php +public function __construct(\BumbleDocGen\Core\Configuration\Configuration $configuration, \BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings $phpHandlerSettings, \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection $entitiesCollection, \BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper $parserHelper, \BumbleDocGen\LanguageHandler\Php\Parser\ComposerHelper $composerHelper, \BumbleDocGen\LanguageHandler\Php\Parser\PhpParser\PhpParserHelper $phpParserHelper, \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache $localObjectCache, \Psr\Log\LoggerInterface $logger, string $className, string|null $relativeFileName); +``` + + + +Parameters: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $configuration\BumbleDocGen\Core\Configuration\Configuration-
      $phpHandlerSettings\BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings-
      $entitiesCollection\BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection-
      $parserHelper\BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper-
      $composerHelper\BumbleDocGen\LanguageHandler\Php\Parser\ComposerHelper-
      $phpParserHelper\BumbleDocGen\LanguageHandler\Php\Parser\PhpParser\PhpParserHelper-
      $localObjectCache\BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache-
      $logger\Psr\Log\LoggerInterface-
      $classNamestring-
      $relativeFileNamestring | null-
      + + + +
      +
      +
      + + + +```php +public function addPluginData(string $pluginKey, mixed $data): void; +``` + +
      Add information to aт entity object
      + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $pluginKeystring-
      $datamixed-
      + +Return value: void + + +
      +
      +
      + +
        +
      • # + cursorToDocAttributeLinkFragment + :warning: Is internal | source code
      • +
      + +```php +public function cursorToDocAttributeLinkFragment(string $cursor, bool $isForDocument = true): string; +``` + + + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $cursorstring-
      $isForDocumentbool-
      + +Return value: string + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getAbsoluteFileName(): null|string; +``` + +
      Returns the absolute path to a file if it can be retrieved and if the file is in the project directory
      + +Parameters: not specified + +Return value: null | string + + +Throws: + + +
      +
      +
      + + + +```php +public function getAst(): \PhpParser\Node\Stmt\Class_|\PhpParser\Node\Stmt\Interface_|\PhpParser\Node\Stmt\Trait_|\PhpParser\Node\Stmt\Enum_; +``` + +
      Get AST for this entity
      + +Parameters: not specified + +Return value: \PhpParser\Node\Stmt\Class_ | \PhpParser\Node\Stmt\Interface_ | \PhpParser\Node\Stmt\Trait_ | \PhpParser\Node\Stmt\Enum_ + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait + +public function getCacheKey(): string; +``` + + + +Parameters: not specified + +Return value: string + + +
      +
      +
      + +
        +
      • # + getCachedEntityDependencies + :warning: Is internal | source code
      • +
      + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getCachedEntityDependencies(): array; +``` + + + +Parameters: not specified + +Return value: array + + +Throws: + + +
      +
      +
      + + + +```php +public function getConstant(string $constantName, bool $unsafe = false): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity; +``` + +
      Get the method entity by its name
      + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $constantNamestringThe name of the constant whose entity you want to get
      $unsafeboolCheck all constants, not just the constants allowed in the configuration (@see PhpHandlerSettings::getClassConstantEntityFilter())
      + +Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity + + +Throws: + + +
      +
      +
      + + + +```php +public function getConstantEntitiesCollection(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntitiesCollection; +``` + +
      Get a collection of constant entities
      + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntitiesCollection + + +Throws: + + + +See: + +
      +
      +
      + + + +```php +public function getConstantValue(string $constantName): string|array|int|bool|null|float; +``` + +
      Get the compiled value of a constant
      + +Parameters: + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $constantNamestringThe name of the constant for which you need to get the value
      + +Return value: string | array | int | bool | null | float + + +Throws: + + +
      +
      +
      + + + +```php +public function getConstants(): array; +``` + +
      Get all constants that are available according to the configuration as an array
      + +Parameters: not specified + +Return value: array + + +Throws: + + + +See: + +
      +
      +
      + +
        +
      • # + getConstantsData + :warning: Is internal | source code
      • +
      + +```php +public function getConstantsData(bool $onlyFromCurrentClassAndTraits = false, int $flags = \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity::VISIBILITY_MODIFIERS_FLAG_ANY): array; +``` + +
      Get a list of all constants and classes where they are implemented
      + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $onlyFromCurrentClassAndTraitsboolGet data only for constants from the current class
      $flagsintGet data only for constants corresponding to the visibility modifiers passed in this value
      + +Return value: array + + +Throws: + + +
      +
      +
      + + + +```php +public function getConstantsValues(bool $onlyFromCurrentClassAndTraits = false, int $flags = \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity::VISIBILITY_MODIFIERS_FLAG_ANY): array; +``` + +
      Get class constant compiled values according to filters
      + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $onlyFromCurrentClassAndTraitsboolGet values only for constants from the current class
      $flagsintGet values only for constants corresponding to the visibility modifiers passed in this value
      + +Return value: array + + +Throws: + + +
      +
      +
      + +
        +
      • # + getCurrentRootEntity + :warning: Is internal | source code
      • +
      + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getCurrentRootEntity(): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; +``` + + + +Parameters: not specified + +Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDescription(): string; +``` + +
      Get entity description
      + +Parameters: not specified + +Return value: string + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDescriptionLinks(): array; +``` + +
      Get parsed links from description and doc blocks `see` and `link`
      + +Parameters: not specified + +Return value: array + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDocBlock(): \phpDocumentor\Reflection\DocBlock; +``` + +
      Get DocBlock for current entity
      + +Parameters: not specified + +Return value: \phpDocumentor\Reflection\DocBlock + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDocComment(): string; +``` + +
      Get the doc comment of an entity
      + +Parameters: not specified + +Return value: string + + +Throws: + + +
      +
      +
      + +
        +
      • # + getDocCommentEntity + :warning: Is internal | source code
      • +
      + +```php +public function getDocCommentEntity(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; +``` + +
      Link to an entity where docBlock is implemented for this entity
      + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDocCommentLine(): null|int; +``` + +
      Get the code line number where the docBlock of the current entity begins
      + +Parameters: not specified + +Return value: null | int + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDocNote(): string; +``` + +
      Get the note annotation value
      + +Parameters: not specified + +Return value: string + + +Throws: + + +
      +
      +
      + + + +```php +public function getDocRender(): \BumbleDocGen\Core\Renderer\EntityDocRenderer\EntityDocRendererInterface; +``` + + + +Parameters: not specified + +Return value: \BumbleDocGen\Core\Renderer\EntityDocRenderer\EntityDocRendererInterface + + +Throws: + + +
      +
      +
      + + + +```php +public function getEndLine(): int; +``` + +
      Get the line number of the end of a class code in a file
      + +Parameters: not specified + +Return value: int + + +Throws: + + +
      +
      +
      + + + +```php +public function getEntityDependencies(): array; +``` + + + +Parameters: not specified + +Return value: array + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getExamples(): array; +``` + +
      Get parsed examples from `examples` doc block
      + +Parameters: not specified + +Return value: array + + +Throws: + + +
      +
      +
      + + + +```php +public function getFileContent(): string; +``` + + + +Parameters: not specified + +Return value: string + + +Throws: + + +
      +
      +
      + +
        +
      • # + getFileSourceLink + :warning: Is internal | source code
      • +
      + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getFileSourceLink(bool $withLine = true): null|string; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $withLinebool-
      + +Return value: null | string + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getFirstExample(): string; +``` + +
      Get first example from `examples` doc block
      + +Parameters: not specified + +Return value: string + + +Throws: + + +
      +
      +
      + + + +```php +public function getImplementingClass(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; +``` + +
      Get the class like entity in which the current entity was implemented
      + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + + +
      +
      +
      + + + +```php +public function getInterfaceNames(): array; +``` + +
      Get a list of class interface names
      + +Parameters: not specified + +Return value: array + + +Throws: + + +
      +
      +
      + + + +```php +public function getInterfacesEntities(): array; +``` + +
      Get a list of interface entities that the current class implements
      + +Parameters: not specified + +Return value: array + + +Throws: + + +
      +
      +
      + + + +```php +public function getMethod(string $methodName, bool $unsafe = false): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntity; +``` + +
      Get the method entity by its name
      + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $methodNamestringThe name of the method whose entity you want to get
      $unsafeboolCheck all methods, not just the methods allowed in the configuration (@see PhpHandlerSettings::getMethodEntityFilter())
      + +Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntity + + +Throws: + + +
      +
      +
      + + + +```php +public function getMethodEntitiesCollection(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntitiesCollection; +``` + +
      Get a collection of method entities
      + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntitiesCollection + + +Throws: + + + +See: + +
      +
      +
      + + + +```php +public function getMethods(): array; +``` + +
      Get all methods that are available according to the configuration as an array
      + +Parameters: not specified + +Return value: array + + +Throws: + + + +See: + +
      +
      +
      + +
        +
      • # + getMethodsData + :warning: Is internal | source code
      • +
      + +```php +public function getMethodsData(bool $onlyFromCurrentClassAndTraits = false, int $flags = \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntity::VISIBILITY_MODIFIERS_FLAG_ANY): array; +``` + +
      Get a list of all methods and classes where they are implemented
      + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $onlyFromCurrentClassAndTraitsboolGet data only for methods from the current class
      $flagsintGet data only for methods corresponding to the visibility modifiers passed in this value
      + +Return value: array + + +Throws: + + +
      +
      +
      + + + +```php +public function getModifiersString(): string; +``` + +
      Get entity modifiers as a string
      + +Parameters: not specified + +Return value: string + + +
      +
      +
      + + + +```php +public function getName(): string; +``` + +
      Full name of the entity
      + +Parameters: not specified + +Return value: string + + +
      +
      +
      + + + +```php +public function getNamespaceName(): string; +``` + +
      Get the entity namespace name
      + +Parameters: not specified + +Return value: string + + +
      +
      +
      + + + +```php +public function getObjectId(): string; +``` + +
      Get entity unique ID
      + +Parameters: not specified + +Return value: string + + +
      +
      +
      + + + +```php +public function getParentClass(): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; +``` + +
      Get the entity of the parent class if it exists
      + +Parameters: not specified + +Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + + +
      +
      +
      + + + +```php +public function getParentClassEntities(): array; +``` + +
      Get a list of parent class entities
      + +Parameters: not specified + +Return value: array + + +
      +
      +
      + + + +```php +public function getParentClassName(): null|string; +``` + +
      Get the name of the parent class entity if it exists
      + +Parameters: not specified + +Return value: null | string + + +
      +
      +
      + + + +```php +public function getParentClassNames(): array; +``` + +
      Get a list of entity names of parent classes
      + +Parameters: not specified + +Return value: array + + +
      +
      +
      + + + +```php +public function getPluginData(string $pluginKey): mixed; +``` + +
      Get additional information added using the plugin
      + +Parameters: + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $pluginKeystring-
      + +Return value: mixed + + +
      +
      +
      + + + +```php +public function getProperties(): array; +``` + +
      Get all properties that are available according to the configuration as an array
      + +Parameters: not specified + +Return value: array + + +Throws: + + + +See: + +
      +
      +
      + +
        +
      • # + getPropertiesData + :warning: Is internal | source code
      • +
      + +```php +public function getPropertiesData(bool $onlyFromCurrentClassAndTraits = false, int $flags = \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntity::VISIBILITY_MODIFIERS_FLAG_ANY): array; +``` + +
      Get a list of all properties and classes where they are implemented
      + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $onlyFromCurrentClassAndTraitsboolGet data only for properties from the current class
      $flagsintGet data only for properties corresponding to the visibility modifiers passed in this value
      + +Return value: array + + +Throws: + + +
      +
      +
      + + + +```php +public function getProperty(string $propertyName, bool $unsafe = false): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntity; +``` + +
      Get the property entity by its name
      + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $propertyNamestringThe name of the property whose entity you want to get
      $unsafeboolCheck all properties, not just the properties allowed in the configuration (@see PhpHandlerSettings::getPropertyEntityFilter())
      + +Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntity + + +Throws: + + +
      +
      +
      + + + +```php +public function getPropertyDefaultValue(string $propertyName): string|array|int|bool|null|float; +``` + +
      Get the compiled value of a property
      + +Parameters: + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $propertyNamestringThe name of the property for which you need to get the value
      + +Return value: string | array | int | bool | null | float + + +Throws: + + +
      +
      +
      + + + +```php +public function getPropertyEntitiesCollection(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntitiesCollection; +``` + +
      Get a collection of property entities
      + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntitiesCollection + + +Throws: + + + +See: + +
      +
      +
      + + + +```php +public function getRelativeFileName(): null|string; +``` + +
      File name relative to project_root configuration parameter
      + +Parameters: not specified + +Return value: null | string + + + +See: + +
      +
      +
      + + + +```php +public function getRootEntityCollection(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; +``` + +
      Get the collection of root entities to which this entity belongs
      + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection + + +
      +
      +
      + + + +```php +public function getShortName(): string; +``` + +
      Short name of the entity
      + +Parameters: not specified + +Return value: string + + +
      +
      +
      + + + +```php +public function getStartLine(): int; +``` + +
      Get the line number of the start of a class code in a file
      + +Parameters: not specified + +Return value: int + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getThrows(): array; +``` + +
      Get parsed throws from `throws` doc block
      + +Parameters: not specified + +Return value: array + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getThrowsDocBlockLinks(): array; +``` + + + +Parameters: not specified + +Return value: array + + +Throws: + + +
      +
      +
      + + + +```php +public function getTraits(): array; +``` + +
      Get a list of trait entities of the current class
      + +Parameters: not specified + +Return value: array + + +Throws: + + +
      +
      +
      + + + +```php +public function getTraitsNames(): array; +``` + +
      Get a list of class traits names
      + +Parameters: not specified + +Return value: array + + +Throws: + + +
      +
      +
      + + + +```php +public function hasConstant(string $constantName, bool $unsafe = false): bool; +``` + +
      Check if a constant exists in a class
      + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $constantNamestringThe name of the class whose entity you want to check
      $unsafeboolCheck all constants, not just the constants allowed in the configuration (@see PhpHandlerSettings::getClassConstantEntityFilter())
      + +Return value: bool + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function hasDescriptionLinks(): bool; +``` + +
      Checking if an entity has links in its description
      + +Parameters: not specified + +Return value: bool + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function hasExamples(): bool; +``` + +
      Checking if an entity has `example` docBlock
      + +Parameters: not specified + +Return value: bool + + +Throws: + + +
      +
      +
      + + + +```php +public function hasMethod(string $methodName, bool $unsafe = false): bool; +``` + +
      Check if a method exists in a class
      + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $methodNamestringThe name of the method whose entity you want to check
      $unsafeboolCheck all methods, not just the methods allowed in the configuration (@see PhpHandlerSettings::getMethodEntityFilter())
      + +Return value: bool + + +Throws: + + +
      +
      +
      + + + +```php +public function hasParentClass(string $parentClassName): bool; +``` + +
      Check if a certain parent class exists in a chain of parent classes
      + +Parameters: + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $parentClassNamestringSearched parent class
      + +Return value: bool + + +
      +
      +
      + + + +```php +public function hasProperty(string $propertyName, bool $unsafe = false): bool; +``` + +
      Check if a property exists in a class
      + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $propertyNamestringThe name of the property whose entity you want to check
      $unsafeboolCheck all properties, not just the properties allowed in the configuration (@see PhpHandlerSettings::getPropertyEntityFilter())
      + +Return value: bool + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function hasThrows(): bool; +``` + +
      Checking if an entity has `throws` docBlock
      + +Parameters: not specified + +Return value: bool + + +Throws: + + +
      +
      +
      + + + +```php +public function hasTraits(): bool; +``` + +
      Check if the class contains traits
      + +Parameters: not specified + +Return value: bool + + +Throws: + + +
      +
      +
      + + + +```php +public function implementsInterface(string $interfaceName): bool; +``` + +
      Check if a class implements an interface
      + +Parameters: + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $interfaceNamestringName of the required interface in the interface chain
      + +Return value: bool + + +Throws: + + +
      +
      +
      + + + +```php +public function isAbstract(): bool; +``` + +
      Check that an entity is abstract
      + +Parameters: not specified + +Return value: bool + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function isApi(): bool; +``` + +
      Checking if an entity has `api` docBlock
      + +Parameters: not specified + +Return value: bool + + +Throws: + + +
      +
      +
      + + + +```php +public function isClass(): bool; +``` + +
      Check if an entity is a Class
      + +Parameters: not specified + +Return value: bool + + +
      +
      +
      + + + +```php +public function isClassLoad(): bool; +``` + + + +Parameters: not specified + +Return value: bool + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function isDeprecated(): bool; +``` + +
      Checking if an entity has `deprecated` docBlock
      + +Parameters: not specified + +Return value: bool + + +Throws: + + +
      +
      +
      + +
        +
      • # + isDocumentCreationAllowed + :warning: Is internal | source code
      • +
      + +```php +public function isDocumentCreationAllowed(): bool; +``` + + + +Parameters: not specified + +Return value: bool + + +Throws: + + +
      +
      +
      + +
        +
      • # + isEntityCacheOutdated + :warning: Is internal | source code
      • +
      + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function isEntityCacheOutdated(): bool; +``` + +
      Checking if the entity cache is out of date
      + +Parameters: not specified + +Return value: bool + + +
      +
      +
      + +
        +
      • # + isEntityDataCacheOutdated + :warning: Is internal | source code
      • +
      + +```php +// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait + +public function isEntityDataCacheOutdated(): bool; +``` + + + +Parameters: not specified + +Return value: bool + + +Throws: + + +
      +
      +
      + + + +```php +public function isEntityDataCanBeLoaded(): bool; +``` + + + +Parameters: not specified + +Return value: bool + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function isEntityFileCanBeLoad(): bool; +``` + +
      Checking if entity data can be retrieved
      + +Parameters: not specified + +Return value: bool + + +Throws: + + +
      +
      +
      + + + +```php +public static function isEntityNameValid(string $entityName): bool; +``` + +
      Check if the name is a valid name for ClassLikeEntity
      + +Parameters: + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $entityNamestring-
      + +Return value: bool + + +
      +
      +
      + + + +```php +public function isEnum(): bool; +``` + +
      Check if an entity is an Enum
      + +Parameters: not specified + +Return value: bool + + +
      +
      +
      + +
        +
      • # + isExternalLibraryEntity + :warning: Is internal | source code
      • +
      + +```php +public function isExternalLibraryEntity(): bool; +``` + +
      Check if a given entity is an entity from a third party library (connected via composer)
      + +Parameters: not specified + +Return value: bool + + +
      +
      +
      + + + +```php +public function isInGit(): bool; +``` + +
      Checking if class file is in git repository
      + +Parameters: not specified + +Return value: bool + + +
      +
      +
      + + + +```php +public function isInstantiable(): bool; +``` + +
      Check that an entity is instantiable
      + +Parameters: not specified + +Return value: bool + + +
      +
      +
      + + + +```php +public function isInterface(): bool; +``` + +
      Check if an entity is an Interface
      + +Parameters: not specified + +Return value: bool + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function isInternal(): bool; +``` + +
      Checking if an entity has `internal` docBlock
      + +Parameters: not specified + +Return value: bool + + +Throws: + + +
      +
      +
      + + + +```php +public function isSubclassOf(string $className): bool; +``` + +
      Whether the given class is a subclass of the specified class
      + +Parameters: + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $classNamestring-
      + +Return value: bool + + +Throws: + + +
      +
      +
      + + + +```php +public function isTrait(): bool; +``` + +
      Check if an entity is a Trait
      + +Parameters: not specified + +Return value: bool + + +
      +
      +
      + + + +```php +public static function normalizeClassName(string $name): string; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $namestring-
      + +Return value: string + + +
      +
      +
      + +
        +
      • # + reloadEntityDependenciesCache + :warning: Is internal | source code
      • +
      + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function reloadEntityDependenciesCache(): array; +``` + +
      Update entity dependency cache
      + +Parameters: not specified + +Return value: array + + +
      +
      +
      + +
        +
      • # + removeEntityValueFromCache + :warning: Is internal | source code
      • +
      + +```php +// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait + +public function removeEntityValueFromCache(string $key): void; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $keystring-
      + +Return value: void + + +
      +
      +
      + +
        +
      • # + removeNotUsedEntityDataCache + :warning: Is internal | source code
      • +
      + +```php +// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait + +public function removeNotUsedEntityDataCache(): void; +``` + + + +Parameters: not specified + +Return value: void + + +Throws: + + +
      +
      +
      + + + +```php +public function setCustomAst(\PhpParser\Node\Stmt\Trait_|\PhpParser\Node\Stmt\Enum_|\PhpParser\Node\Stmt\Interface_|\PhpParser\Node\Stmt\Class_|null $customAst): void; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $customAst\PhpParser\Node\Stmt\Trait_ | \PhpParser\Node\Stmt\Enum_ | \PhpParser\Node\Stmt\Interface_ | \PhpParser\Node\Stmt\Class_ | null-
      + +Return value: void + + +
      +
      + + \ No newline at end of file diff --git a/docs/tech/2.parser/classes/Configuration.md b/docs/tech/2.parser/classes/Configuration.md new file mode 100644 index 00000000..778606a4 --- /dev/null +++ b/docs/tech/2.parser/classes/Configuration.md @@ -0,0 +1,735 @@ + + BumbleDocGen / Technical description of the project / Parser / Configuration
      + +

      + Configuration class: +

      + + + + + +```php +namespace BumbleDocGen\Core\Configuration; + +final class Configuration +``` + +
      Configuration project documentation
      + + + + + + +

      Initialization methods:

      + +
        +
      1. + __construct +
      2. +
      + +

      Methods:

      + +
        +
      1. + getAdditionalConsoleCommands +
      2. +
      3. + getCacheDir +
      4. +
      5. + getConfigurationVersion +
      6. +
      7. + getDocGenLibDir +
      8. +
      9. + getGitClientPath +
      10. +
      11. + getIfExists +
      12. +
      13. + getLanguageHandlersCollection +
      14. +
      15. + getOutputDir +
      16. +
      17. + getOutputDirBaseUrl +
      18. +
      19. + getPageLinkProcessor +
      20. +
      21. + getPlugins +
      22. +
      23. + getProjectRoot +
      24. +
      25. + getSourceLocators +
      26. +
      27. + getTemplatesDir +
      28. +
      29. + getTwigFilters +
      30. +
      31. + getTwigFunctions +
      32. +
      33. + getWorkingDir +
      34. +
      35. + isCheckFileInGitBeforeCreatingDocEnabled +
      36. +
      37. + useSharedCache +
      38. +
      + + +

      Constants:

      + + + + + + +

      Method details:

      + +
      + + + +```php +public function __construct(\BumbleDocGen\Core\Configuration\ConfigurationParameterBag $parameterBag, \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache $localObjectCache, \Psr\Log\LoggerInterface $logger); +``` + + + +Parameters: + + + + + + + + + + + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $parameterBag\BumbleDocGen\Core\Configuration\ConfigurationParameterBag-
      $localObjectCache\BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache-
      $logger\Psr\Log\LoggerInterface-
      + + + +
      +
      +
      + + + +```php +public function getAdditionalConsoleCommands(): \BumbleDocGen\Console\Command\AdditionalCommandCollection; +``` + + + +Parameters: not specified + +Return value: \BumbleDocGen\Console\Command\AdditionalCommandCollection + + +Throws: + + +
      +
      +
      + + + +```php +public function getCacheDir(): null|string; +``` + + + +Parameters: not specified + +Return value: null | string + + +Throws: + + +
      +
      +
      + + + +```php +public function getConfigurationVersion(): string; +``` + + + +Parameters: not specified + +Return value: string + + +
      +
      +
      + + + +```php +public function getDocGenLibDir(): string; +``` + + + +Parameters: not specified + +Return value: string + + +
      +
      +
      + + + +```php +public function getGitClientPath(): string; +``` + + + +Parameters: not specified + +Return value: string + + +Throws: + + +
      +
      +
      + + + +```php +public function getIfExists(mixed $key): null|string; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $keymixed-
      + +Return value: null | string + + +Throws: + + +
      +
      +
      + + + +```php +public function getLanguageHandlersCollection(): \BumbleDocGen\LanguageHandler\LanguageHandlersCollection; +``` + + + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\LanguageHandlersCollection + + +Throws: + + +
      +
      +
      + + + +```php +public function getOutputDir(): string; +``` + + + +Parameters: not specified + +Return value: string + + +Throws: + + +
      +
      +
      + + + +```php +public function getOutputDirBaseUrl(): string; +``` + + + +Parameters: not specified + +Return value: string + + +Throws: + + +
      +
      +
      + + + +```php +public function getPageLinkProcessor(): \BumbleDocGen\Core\Renderer\PageLinkProcessor\PageLinkProcessorInterface; +``` + + + +Parameters: not specified + +Return value: \BumbleDocGen\Core\Renderer\PageLinkProcessor\PageLinkProcessorInterface + + +Throws: + + +
      +
      +
      + + + +```php +public function getPlugins(): \BumbleDocGen\Core\Plugin\PluginsCollection; +``` + + + +Parameters: not specified + +Return value: \BumbleDocGen\Core\Plugin\PluginsCollection + + +Throws: + + +
      +
      +
      + + + +```php +public function getProjectRoot(): string; +``` + + + +Parameters: not specified + +Return value: string + + +Throws: + + +
      +
      +
      + + + +```php +public function getSourceLocators(): \BumbleDocGen\Core\Parser\SourceLocator\SourceLocatorsCollection; +``` + + + +Parameters: not specified + +Return value: \BumbleDocGen\Core\Parser\SourceLocator\SourceLocatorsCollection + + +Throws: + + +
      +
      +
      + + + +```php +public function getTemplatesDir(): string; +``` + + + +Parameters: not specified + +Return value: string + + +Throws: + + +
      +
      +
      + + + +```php +public function getTwigFilters(): \BumbleDocGen\Core\Renderer\Twig\Filter\CustomFiltersCollection; +``` + + + +Parameters: not specified + +Return value: \BumbleDocGen\Core\Renderer\Twig\Filter\CustomFiltersCollection + + +Throws: + + +
      +
      +
      + + + +```php +public function getTwigFunctions(): \BumbleDocGen\Core\Renderer\Twig\Function\CustomFunctionsCollection; +``` + + + +Parameters: not specified + +Return value: \BumbleDocGen\Core\Renderer\Twig\Function\CustomFunctionsCollection + + +Throws: + + +
      +
      +
      + + + +```php +public function getWorkingDir(): string; +``` + + + +Parameters: not specified + +Return value: string + + +Throws: + + +
      +
      +
      + +
        +
      • # + isCheckFileInGitBeforeCreatingDocEnabled + | source code
      • +
      + +```php +public function isCheckFileInGitBeforeCreatingDocEnabled(): bool; +``` + + + +Parameters: not specified + +Return value: bool + + +Throws: + + +
      +
      +
      + + + +```php +public function useSharedCache(): bool; +``` + + + +Parameters: not specified + +Return value: bool + + +Throws: + + +
      +
      + + \ No newline at end of file diff --git a/docs/tech/2.parser/classes/DynamicMethodEntity.md b/docs/tech/2.parser/classes/DynamicMethodEntity.md index a9681d93..454baf21 100644 --- a/docs/tech/2.parser/classes/DynamicMethodEntity.md +++ b/docs/tech/2.parser/classes/DynamicMethodEntity.md @@ -2,7 +2,7 @@ BumbleDocGen / Technical description of the project / Parser / Entities and entities collections / DynamicMethodEntity

      - DynamicMethodEntity class: + DynamicMethodEntity class:

      @@ -10,9 +10,9 @@ ```php -namespace BumbleDocGen\LanguageHandler\Php\Parser\Entity; +namespace BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method; -class DynamicMethodEntity implements \BumbleDocGen\LanguageHandler\Php\Parser\Entity\MethodEntityInterface, \BumbleDocGen\Core\Parser\Entity\EntityInterface +class DynamicMethodEntity implements \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntityInterface, \BumbleDocGen\Core\Parser\Entity\EntityInterface ```
      Method obtained by parsing the "method" annotation
      @@ -33,90 +33,96 @@ class DynamicMethodEntity implements \BumbleDocGen\LanguageHandler\Php\Parser\En

      Methods:

        -
      1. - entityCacheIsOutdated -
      2. getAbsoluteFileName -
      3. + - Returns the absolute path to a file if it can be retrieved and if the file is in the project directory
      4. getBodyCode -
      5. + - Get the code for this method
      6. getCallMethod -
      7. + - Get the entity of the magic method that will be called instead of the current virtual one
      8. getDescription -
      9. + - Get a description of this method
      10. getEndLine -
      11. -
      12. - getFileName -
      13. + - Get the line number of the end of a method's code in a file
      14. getFirstReturnValue -
      15. + - Get the compiled first return value of a method (if possible)
      16. getImplementingClass -
      17. + - Get the ClassLike entity in which this method was implemented
      18. getImplementingClassName -
      19. + - Get the name of the class in which this method is implemented
      20. getModifiersString -
      21. + - Get a text representation of method modifiers
      22. getName -
      23. + - Full name of the entity
      24. getNamespaceName -
      25. + - Namespace of the class that contains this method
      26. getObjectId -
      27. + - Entity object ID
      28. getParameters -
      29. + - Get a list of method parameters
      30. getParametersString -
      31. + - Get a list of method parameters as a string +
      32. + getRelativeFileName + - File name relative to project_root configuration parameter
      33. getReturnType -
      34. + - Get the return type of method
      35. getRootEntity -
      36. + - Get the class like entity where this method was obtained
      37. getRootEntityCollection - Get parent collection of entities
      38. getShortName -
      39. + - Short name of the entity +
      40. + getSignature + - Get the method signature as a string
      41. getStartColumn -
      42. + - Get the column number of the beginning of the method code in a file
      43. getStartLine -
      44. + - Get the line number of the beginning of the method code in a file
      45. isDynamic + - Check if a method is a dynamic method, that is, implementable using __call or __callStatic
      46. +
      47. + isEntityCacheOutdated
      48. +
      49. + isImplementedInParentClass + - Check if this method is implemented in the parent class
      50. isInitialization -
      51. + - Check if a method is an initialization method
      52. isPrivate -
      53. + - Check if a method is a private method
      54. isProtected -
      55. + - Check if a method is a protected method
      56. isPublic -
      57. + - Check if a method is a public method
      58. isStatic -
      59. + - Check if this method is static
      @@ -132,11 +138,11 @@ class DynamicMethodEntity implements \BumbleDocGen\LanguageHandler\Php\Parser\En ```php -public function __construct(\BumbleDocGen\Core\Configuration\Configuration $configuration, \BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper $parserHelper, \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity $classEntity, \phpDocumentor\Reflection\DocBlock\Tags\Method $annotationMethod); +public function __construct(\BumbleDocGen\Core\Configuration\Configuration $configuration, \BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper $parserHelper, \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity $classEntity, \phpDocumentor\Reflection\DocBlock\Tags\Method $annotationMethod); ``` @@ -164,7 +170,7 @@ public function __construct(\BumbleDocGen\Core\Configuration\Configuration $conf $classEntity - \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity + \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - @@ -177,27 +183,6 @@ public function __construct(\BumbleDocGen\Core\Configuration\Configuration $conf -
      -
      -
      - - - -```php -public function entityCacheIsOutdated(): bool; -``` - - - -Parameters: not specified - -Return value: bool - -

      @@ -205,27 +190,20 @@ public function entityCacheIsOutdated(): bool; ```php public function getAbsoluteFileName(): null|string; ``` - +
      Returns the absolute path to a file if it can be retrieved and if the file is in the project directory
      Parameters: not specified Return value: null | string -Throws: - -

      @@ -233,14 +211,14 @@ public function getAbsoluteFileName(): null|string; ```php public function getBodyCode(): string; ``` - +
      Get the code for this method
      Parameters: not specified @@ -254,18 +232,18 @@ public function getBodyCode(): string; ```php -public function getCallMethod(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\MethodEntity; +public function getCallMethod(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntity; ``` - +
      Get the entity of the magic method that will be called instead of the current virtual one
      Parameters: not specified -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\MethodEntity +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntity Throws: @@ -282,14 +260,14 @@ public function getCallMethod(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity ```php public function getDescription(): string; ``` - +
      Get a description of this method
      Parameters: not specified @@ -303,58 +281,20 @@ public function getDescription(): string; ```php public function getEndLine(): int; ``` - +
      Get the line number of the end of a method's code in a file
      Parameters: not specified Return value: int -Throws: - - -
      -
      -
      - - - -```php -public function getFileName(): null|string; -``` - - - -Parameters: not specified - -Return value: null | string - - -Throws: - -

      @@ -362,14 +302,14 @@ public function getFileName(): null|string; ```php public function getFirstReturnValue(): mixed; ``` - +
      Get the compiled first return value of a method (if possible)
      Parameters: not specified @@ -383,18 +323,18 @@ public function getFirstReturnValue(): mixed; ```php -public function getImplementingClass(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity; +public function getImplementingClass(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; ``` - +
      Get the ClassLike entity in which this method was implemented
      Parameters: not specified -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity
      @@ -404,27 +344,20 @@ public function getImplementingClass(): \BumbleDocGen\LanguageHandler\Php\Parser ```php public function getImplementingClassName(): string; ``` - +
      Get the name of the class in which this method is implemented
      Parameters: not specified Return value: string -Throws: - -
      @@ -432,14 +365,14 @@ public function getImplementingClassName(): string; ```php public function getModifiersString(): string; ``` - +
      Get a text representation of method modifiers
      Parameters: not specified @@ -453,14 +386,14 @@ public function getModifiersString(): string; ```php public function getName(): string; ``` - +
      Full name of the entity
      Parameters: not specified @@ -474,14 +407,14 @@ public function getName(): string; ```php public function getNamespaceName(): string; ``` - +
      Namespace of the class that contains this method
      Parameters: not specified @@ -495,14 +428,14 @@ public function getNamespaceName(): string; ```php public function getObjectId(): string; ``` - +
      Entity object ID
      Parameters: not specified @@ -516,14 +449,14 @@ public function getObjectId(): string; ```php public function getParameters(): array; ``` - +
      Get a list of method parameters
      Parameters: not specified @@ -537,14 +470,14 @@ public function getParameters(): array; ```php public function getParametersString(): string; ``` - +
      Get a list of method parameters as a string
      Parameters: not specified @@ -556,29 +489,49 @@ public function getParametersString(): string;
      ```php -public function getReturnType(): string; +public function getRelativeFileName(): null|string; ``` - +
      File name relative to project_root configuration parameter
      Parameters: not specified -Return value: string +Return value: null | string -Throws: + +See: +
      +
      +
      + +```php +public function getReturnType(): string; +``` + +
      Get the return type of method
      + +Parameters: not specified + +Return value: string + +

      @@ -586,18 +539,18 @@ public function getReturnType(): string; ```php -public function getRootEntity(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity; +public function getRootEntity(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; ``` - +
      Get the class like entity where this method was obtained
      Parameters: not specified -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity
      @@ -607,7 +560,7 @@ public function getRootEntity(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity ```php @@ -628,15 +581,36 @@ public function getRootEntityCollection(): \BumbleDocGen\Core\Parser\Entity\Root ```php public function getShortName(): string; ``` +
      Short name of the entity
      + +Parameters: not specified + +Return value: string +
      +
      +
      + + + +```php +public function getSignature(): string; +``` + +
      Get the method signature as a string
      + Parameters: not specified Return value: string @@ -649,27 +623,20 @@ public function getShortName(): string; ```php public function getStartColumn(): int; ``` - +
      Get the column number of the beginning of the method code in a file
      Parameters: not specified Return value: int -Throws: - -

      @@ -677,27 +644,20 @@ public function getStartColumn(): int; ```php public function getStartLine(): int; ``` - +
      Get the line number of the beginning of the method code in a file
      Parameters: not specified Return value: int -Throws: - -

      @@ -705,14 +665,14 @@ public function getStartLine(): int; ```php public function isDynamic(): bool; ``` - +
      Check if a method is a dynamic method, that is, implementable using __call or __callStatic
      Parameters: not specified @@ -724,13 +684,13 @@ public function isDynamic(): bool;
      ```php -public function isInitialization(): bool; +public function isEntityCacheOutdated(): bool; ``` @@ -743,13 +703,55 @@ public function isInitialization(): bool; Throws: + +
      +
      +
      + + + +```php +public function isImplementedInParentClass(): bool; +``` +
      Check if this method is implemented in the parent class
      + +Parameters: not specified + +Return value: bool + + +
      +
      +
      + + +```php +public function isInitialization(): bool; +``` + +
      Check if a method is an initialization method
      + +Parameters: not specified + +Return value: bool + +

      @@ -757,14 +759,14 @@ public function isInitialization(): bool; ```php public function isPrivate(): bool; ``` - +
      Check if a method is a private method
      Parameters: not specified @@ -778,14 +780,14 @@ public function isPrivate(): bool; ```php public function isProtected(): bool; ``` - +
      Check if a method is a protected method
      Parameters: not specified @@ -799,14 +801,14 @@ public function isProtected(): bool; ```php public function isPublic(): bool; ``` - +
      Check if a method is a public method
      Parameters: not specified @@ -820,14 +822,14 @@ public function isPublic(): bool; ```php public function isStatic(): bool; ``` - +
      Check if this method is static
      Parameters: not specified diff --git a/docs/tech/2.parser/classes/EntityInterface.md b/docs/tech/2.parser/classes/EntityInterface.md index 09600f53..6709f42b 100644 --- a/docs/tech/2.parser/classes/EntityInterface.md +++ b/docs/tech/2.parser/classes/EntityInterface.md @@ -2,7 +2,7 @@ BumbleDocGen / Technical description of the project / Parser / Entities and entities collections / EntityInterface

      - EntityInterface class: + EntityInterface class:

      @@ -26,26 +26,26 @@ interface EntityInterface

      Methods:

        -
      1. - entityCacheIsOutdated -
      2. getAbsoluteFileName - Returns the absolute path to a file if it can be retrieved and if the file is in the project directory
      3. -
      4. - getFileName - - Returns the relative path to a file if it can be retrieved and if the file is in the project directory
      5. getName -
      6. + - Full name of the entity
      7. getObjectId -
      8. + - Entity object ID +
      9. + getRelativeFileName + - File name relative to project_root configuration parameter
      10. getRootEntityCollection - Get parent collection of entities
      11. getShortName + - Short name of the entity
      12. +
      13. + isEntityCacheOutdated
      @@ -59,31 +59,10 @@ interface EntityInterface
      - - -```php -public function entityCacheIsOutdated(): bool; -``` - - - -Parameters: not specified - -Return value: bool - - -
      -
      -
      - ```php @@ -102,20 +81,20 @@ public function getAbsoluteFileName(): null|string;
      ```php -public function getFileName(): null|string; +public function getName(): string; ``` -
      Returns the relative path to a file if it can be retrieved and if the file is in the project directory
      +
      Full name of the entity
      Parameters: not specified -Return value: null | string +Return value: string
      @@ -123,16 +102,16 @@ public function getFileName(): null|string;
      ```php -public function getName(): string; +public function getObjectId(): string; ``` - +
      Entity object ID
      Parameters: not specified @@ -144,22 +123,28 @@ public function getName(): string;
      ```php -public function getObjectId(): string; +public function getRelativeFileName(): null|string; ``` - +
      File name relative to project_root configuration parameter
      Parameters: not specified -Return value: string +Return value: null | string + +See: +

      @@ -167,7 +152,7 @@ public function getObjectId(): string; ```php @@ -188,20 +173,41 @@ public function getRootEntityCollection(): \BumbleDocGen\Core\Parser\Entity\Root ```php public function getShortName(): string; ``` - +
      Short name of the entity
      Parameters: not specified Return value: string +
      +
      +
      + +
        +
      • # + isEntityCacheOutdated + :warning: Is internal | source code
      • +
      + +```php +public function isEntityCacheOutdated(): bool; +``` + + + +Parameters: not specified + +Return value: bool + +

      diff --git a/docs/tech/2.parser/classes/EnumEntity.md b/docs/tech/2.parser/classes/EnumEntity.md new file mode 100644 index 00000000..806c870a --- /dev/null +++ b/docs/tech/2.parser/classes/EnumEntity.md @@ -0,0 +1,3562 @@ + + BumbleDocGen / Technical description of the project / Parser / Entities and entities collections / EnumEntity
      + +

      + EnumEntity class: +

      + + + + + +```php +namespace BumbleDocGen\LanguageHandler\Php\Parser\Entity; + +class EnumEntity extends \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity implements \BumbleDocGen\Core\Renderer\Context\DocumentTransformableEntityInterface, \BumbleDocGen\Core\Parser\Entity\RootEntityInterface, \BumbleDocGen\Core\Parser\Entity\EntityInterface, \BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityInterface +``` + +
      Enumeration
      + +See: + + + + + + + +

      Initialization methods:

      + +
        +
      1. + __construct +
      2. +
      + +

      Methods:

      + +
        +
      1. + addPluginData + - Add information to aт entity object
      2. +
      3. + cursorToDocAttributeLinkFragment +
      4. +
      5. + getAbsoluteFileName + - Returns the absolute path to a file if it can be retrieved and if the file is in the project directory
      6. +
      7. + getAst + - Get AST for this entity
      8. +
      9. + getCacheKey +
      10. +
      11. + getCachedEntityDependencies +
      12. +
      13. + getCasesNames + - Get enum cases names
      14. +
      15. + getConstant + - Get the method entity by its name
      16. +
      17. + getConstantEntitiesCollection + - Get a collection of constant entities
      18. +
      19. + getConstantValue + - Get the compiled value of a constant
      20. +
      21. + getConstants + - Get all constants that are available according to the configuration as an array
      22. +
      23. + getConstantsData + - Get a list of all constants and classes where they are implemented
      24. +
      25. + getConstantsValues + - Get class constant compiled values according to filters
      26. +
      27. + getCurrentRootEntity +
      28. +
      29. + getDescription + - Get entity description
      30. +
      31. + getDescriptionLinks + - Get parsed links from description and doc blocks `see` and `link`
      32. +
      33. + getDocBlock + - Get DocBlock for current entity
      34. +
      35. + getDocComment + - Get the doc comment of an entity
      36. +
      37. + getDocCommentEntity + - Link to an entity where docBlock is implemented for this entity
      38. +
      39. + getDocCommentLine + - Get the code line number where the docBlock of the current entity begins
      40. +
      41. + getDocNote + - Get the note annotation value
      42. +
      43. + getDocRender +
      44. +
      45. + getEndLine + - Get the line number of the end of a class code in a file
      46. +
      47. + getEntityDependencies +
      48. +
      49. + getEnumCaseValue + - Get enum case value
      50. +
      51. + getEnumCases + - Get enum cases values
      52. +
      53. + getExamples + - Get parsed examples from `examples` doc block
      54. +
      55. + getFileContent +
      56. +
      57. + getFileSourceLink +
      58. +
      59. + getFirstExample + - Get first example from `examples` doc block
      60. +
      61. + getImplementingClass + - Get the class like entity in which the current entity was implemented
      62. +
      63. + getInterfaceNames + - Get a list of class interface names
      64. +
      65. + getInterfacesEntities + - Get a list of interface entities that the current class implements
      66. +
      67. + getMethod + - Get the method entity by its name
      68. +
      69. + getMethodEntitiesCollection + - Get a collection of method entities
      70. +
      71. + getMethods + - Get all methods that are available according to the configuration as an array
      72. +
      73. + getMethodsData + - Get a list of all methods and classes where they are implemented
      74. +
      75. + getModifiersString + - Get entity modifiers as a string
      76. +
      77. + getName + - Full name of the entity
      78. +
      79. + getNamespaceName + - Get the entity namespace name
      80. +
      81. + getObjectId + - Get entity unique ID
      82. +
      83. + getParentClass + - Get the entity of the parent class if it exists
      84. +
      85. + getParentClassEntities + - Get a list of parent class entities
      86. +
      87. + getParentClassName + - Get the name of the parent class entity if it exists
      88. +
      89. + getParentClassNames + - Get a list of entity names of parent classes
      90. +
      91. + getPluginData + - Get additional information added using the plugin
      92. +
      93. + getProperties + - Get all properties that are available according to the configuration as an array
      94. +
      95. + getPropertiesData + - Get a list of all properties and classes where they are implemented
      96. +
      97. + getProperty + - Get the property entity by its name
      98. +
      99. + getPropertyDefaultValue + - Get the compiled value of a property
      100. +
      101. + getPropertyEntitiesCollection + - Get a collection of property entities
      102. +
      103. + getRelativeFileName + - File name relative to project_root configuration parameter
      104. +
      105. + getRootEntityCollection + - Get the collection of root entities to which this entity belongs
      106. +
      107. + getShortName + - Short name of the entity
      108. +
      109. + getStartLine + - Get the line number of the start of a class code in a file
      110. +
      111. + getThrows + - Get parsed throws from `throws` doc block
      112. +
      113. + getThrowsDocBlockLinks +
      114. +
      115. + getTraits + - Get a list of trait entities of the current class
      116. +
      117. + getTraitsNames + - Get a list of class traits names
      118. +
      119. + hasConstant + - Check if a constant exists in a class
      120. +
      121. + hasDescriptionLinks + - Checking if an entity has links in its description
      122. +
      123. + hasExamples + - Checking if an entity has `example` docBlock
      124. +
      125. + hasMethod + - Check if a method exists in a class
      126. +
      127. + hasParentClass + - Check if a certain parent class exists in a chain of parent classes
      128. +
      129. + hasProperty + - Check if a property exists in a class
      130. +
      131. + hasThrows + - Checking if an entity has `throws` docBlock
      132. +
      133. + hasTraits + - Check if the class contains traits
      134. +
      135. + implementsInterface + - Check if a class implements an interface
      136. +
      137. + isAbstract + - Check that an entity is abstract
      138. +
      139. + isApi + - Checking if an entity has `api` docBlock
      140. +
      141. + isClass + - Check if an entity is a Class
      142. +
      143. + isClassLoad +
      144. +
      145. + isDeprecated + - Checking if an entity has `deprecated` docBlock
      146. +
      147. + isDocumentCreationAllowed +
      148. +
      149. + isEntityCacheOutdated + - Checking if the entity cache is out of date
      150. +
      151. + isEntityDataCacheOutdated +
      152. +
      153. + isEntityDataCanBeLoaded +
      154. +
      155. + isEntityFileCanBeLoad + - Checking if entity data can be retrieved
      156. +
      157. + isEntityNameValid + - Check if the name is a valid name for ClassLikeEntity
      158. +
      159. + isEnum + - Check if an entity is an Enum
      160. +
      161. + isExternalLibraryEntity + - Check if a given entity is an entity from a third party library (connected via composer)
      162. +
      163. + isInGit + - Checking if class file is in git repository
      164. +
      165. + isInstantiable + - Check that an entity is instantiable
      166. +
      167. + isInterface + - Check if an entity is an Interface
      168. +
      169. + isInternal + - Checking if an entity has `internal` docBlock
      170. +
      171. + isSubclassOf + - Whether the given class is a subclass of the specified class
      172. +
      173. + isTrait + - Check if an entity is a Trait
      174. +
      175. + normalizeClassName +
      176. +
      177. + reloadEntityDependenciesCache + - Update entity dependency cache
      178. +
      179. + removeEntityValueFromCache +
      180. +
      181. + removeNotUsedEntityDataCache +
      182. +
      183. + setCustomAst +
      184. +
      + + + + + + + +

      Method details:

      + +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function __construct(\BumbleDocGen\Core\Configuration\Configuration $configuration, \BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings $phpHandlerSettings, \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection $entitiesCollection, \BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper $parserHelper, \BumbleDocGen\LanguageHandler\Php\Parser\ComposerHelper $composerHelper, \BumbleDocGen\LanguageHandler\Php\Parser\PhpParser\PhpParserHelper $phpParserHelper, \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache $localObjectCache, \Psr\Log\LoggerInterface $logger, string $className, string|null $relativeFileName); +``` + + + +Parameters: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $configuration\BumbleDocGen\Core\Configuration\Configuration-
      $phpHandlerSettings\BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings-
      $entitiesCollection\BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection-
      $parserHelper\BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper-
      $composerHelper\BumbleDocGen\LanguageHandler\Php\Parser\ComposerHelper-
      $phpParserHelper\BumbleDocGen\LanguageHandler\Php\Parser\PhpParser\PhpParserHelper-
      $localObjectCache\BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache-
      $logger\Psr\Log\LoggerInterface-
      $classNamestring-
      $relativeFileNamestring | null-
      + + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function addPluginData(string $pluginKey, mixed $data): void; +``` + +
      Add information to aт entity object
      + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $pluginKeystring-
      $datamixed-
      + +Return value: void + + +
      +
      +
      + +
        +
      • # + cursorToDocAttributeLinkFragment + :warning: Is internal | source code
      • +
      + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function cursorToDocAttributeLinkFragment(string $cursor, bool $isForDocument = true): string; +``` + + + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $cursorstring-
      $isForDocumentbool-
      + +Return value: string + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getAbsoluteFileName(): null|string; +``` + +
      Returns the absolute path to a file if it can be retrieved and if the file is in the project directory
      + +Parameters: not specified + +Return value: null | string + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getAst(): \PhpParser\Node\Stmt\Class_|\PhpParser\Node\Stmt\Interface_|\PhpParser\Node\Stmt\Trait_|\PhpParser\Node\Stmt\Enum_; +``` + +
      Get AST for this entity
      + +Parameters: not specified + +Return value: \PhpParser\Node\Stmt\Class_ | \PhpParser\Node\Stmt\Interface_ | \PhpParser\Node\Stmt\Trait_ | \PhpParser\Node\Stmt\Enum_ + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait + +public function getCacheKey(): string; +``` + + + +Parameters: not specified + +Return value: string + + +
      +
      +
      + +
        +
      • # + getCachedEntityDependencies + :warning: Is internal | source code
      • +
      + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getCachedEntityDependencies(): array; +``` + + + +Parameters: not specified + +Return value: array + + +Throws: + + +
      +
      +
      + + + +```php +public function getCasesNames(): array; +``` + +
      Get enum cases names
      + +Parameters: not specified + +Return value: array + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getConstant(string $constantName, bool $unsafe = false): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity; +``` + +
      Get the method entity by its name
      + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $constantNamestringThe name of the constant whose entity you want to get
      $unsafeboolCheck all constants, not just the constants allowed in the configuration (@see PhpHandlerSettings::getClassConstantEntityFilter())
      + +Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getConstantEntitiesCollection(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntitiesCollection; +``` + +
      Get a collection of constant entities
      + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntitiesCollection + + +Throws: + + + +See: + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getConstantValue(string $constantName): string|array|int|bool|null|float; +``` + +
      Get the compiled value of a constant
      + +Parameters: + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $constantNamestringThe name of the constant for which you need to get the value
      + +Return value: string | array | int | bool | null | float + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getConstants(): array; +``` + +
      Get all constants that are available according to the configuration as an array
      + +Parameters: not specified + +Return value: array + + +Throws: + + + +See: + +
      +
      +
      + +
        +
      • # + getConstantsData + :warning: Is internal | source code
      • +
      + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getConstantsData(bool $onlyFromCurrentClassAndTraits = false, int $flags = \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity::VISIBILITY_MODIFIERS_FLAG_ANY): array; +``` + +
      Get a list of all constants and classes where they are implemented
      + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $onlyFromCurrentClassAndTraitsboolGet data only for constants from the current class
      $flagsintGet data only for constants corresponding to the visibility modifiers passed in this value
      + +Return value: array + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getConstantsValues(bool $onlyFromCurrentClassAndTraits = false, int $flags = \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity::VISIBILITY_MODIFIERS_FLAG_ANY): array; +``` + +
      Get class constant compiled values according to filters
      + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $onlyFromCurrentClassAndTraitsboolGet values only for constants from the current class
      $flagsintGet values only for constants corresponding to the visibility modifiers passed in this value
      + +Return value: array + + +Throws: + + +
      +
      +
      + +
        +
      • # + getCurrentRootEntity + :warning: Is internal | source code
      • +
      + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getCurrentRootEntity(): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; +``` + + + +Parameters: not specified + +Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDescription(): string; +``` + +
      Get entity description
      + +Parameters: not specified + +Return value: string + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDescriptionLinks(): array; +``` + +
      Get parsed links from description and doc blocks `see` and `link`
      + +Parameters: not specified + +Return value: array + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDocBlock(): \phpDocumentor\Reflection\DocBlock; +``` + +
      Get DocBlock for current entity
      + +Parameters: not specified + +Return value: \phpDocumentor\Reflection\DocBlock + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDocComment(): string; +``` + +
      Get the doc comment of an entity
      + +Parameters: not specified + +Return value: string + + +Throws: + + +
      +
      +
      + +
        +
      • # + getDocCommentEntity + :warning: Is internal | source code
      • +
      + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getDocCommentEntity(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; +``` + +
      Link to an entity where docBlock is implemented for this entity
      + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDocCommentLine(): null|int; +``` + +
      Get the code line number where the docBlock of the current entity begins
      + +Parameters: not specified + +Return value: null | int + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDocNote(): string; +``` + +
      Get the note annotation value
      + +Parameters: not specified + +Return value: string + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getDocRender(): \BumbleDocGen\Core\Renderer\EntityDocRenderer\EntityDocRendererInterface; +``` + + + +Parameters: not specified + +Return value: \BumbleDocGen\Core\Renderer\EntityDocRenderer\EntityDocRendererInterface + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getEndLine(): int; +``` + +
      Get the line number of the end of a class code in a file
      + +Parameters: not specified + +Return value: int + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getEntityDependencies(): array; +``` + + + +Parameters: not specified + +Return value: array + + +
      +
      +
      + + + +```php +public function getEnumCaseValue(string $name): mixed; +``` + +
      Get enum case value
      + +Parameters: + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $namestring-
      + +Return value: mixed + + +Throws: + + +
      +
      +
      + + + +```php +public function getEnumCases(): array; +``` + +
      Get enum cases values
      + +Parameters: not specified + +Return value: array + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getExamples(): array; +``` + +
      Get parsed examples from `examples` doc block
      + +Parameters: not specified + +Return value: array + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getFileContent(): string; +``` + + + +Parameters: not specified + +Return value: string + + +Throws: + + +
      +
      +
      + +
        +
      • # + getFileSourceLink + :warning: Is internal | source code
      • +
      + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getFileSourceLink(bool $withLine = true): null|string; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $withLinebool-
      + +Return value: null | string + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getFirstExample(): string; +``` + +
      Get first example from `examples` doc block
      + +Parameters: not specified + +Return value: string + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getImplementingClass(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; +``` + +
      Get the class like entity in which the current entity was implemented
      + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + + +
      +
      +
      + + + +```php +public function getInterfaceNames(): array; +``` + +
      Get a list of class interface names
      + +Parameters: not specified + +Return value: array + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getInterfacesEntities(): array; +``` + +
      Get a list of interface entities that the current class implements
      + +Parameters: not specified + +Return value: array + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getMethod(string $methodName, bool $unsafe = false): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntity; +``` + +
      Get the method entity by its name
      + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $methodNamestringThe name of the method whose entity you want to get
      $unsafeboolCheck all methods, not just the methods allowed in the configuration (@see PhpHandlerSettings::getMethodEntityFilter())
      + +Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntity + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getMethodEntitiesCollection(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntitiesCollection; +``` + +
      Get a collection of method entities
      + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntitiesCollection + + +Throws: + + + +See: + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getMethods(): array; +``` + +
      Get all methods that are available according to the configuration as an array
      + +Parameters: not specified + +Return value: array + + +Throws: + + + +See: + +
      +
      +
      + +
        +
      • # + getMethodsData + :warning: Is internal | source code
      • +
      + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getMethodsData(bool $onlyFromCurrentClassAndTraits = false, int $flags = \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntity::VISIBILITY_MODIFIERS_FLAG_ANY): array; +``` + +
      Get a list of all methods and classes where they are implemented
      + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $onlyFromCurrentClassAndTraitsboolGet data only for methods from the current class
      $flagsintGet data only for methods corresponding to the visibility modifiers passed in this value
      + +Return value: array + + +Throws: + + +
      +
      +
      + + + +```php +public function getModifiersString(): string; +``` + +
      Get entity modifiers as a string
      + +Parameters: not specified + +Return value: string + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getName(): string; +``` + +
      Full name of the entity
      + +Parameters: not specified + +Return value: string + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getNamespaceName(): string; +``` + +
      Get the entity namespace name
      + +Parameters: not specified + +Return value: string + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getObjectId(): string; +``` + +
      Get entity unique ID
      + +Parameters: not specified + +Return value: string + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getParentClass(): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; +``` + +
      Get the entity of the parent class if it exists
      + +Parameters: not specified + +Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getParentClassEntities(): array; +``` + +
      Get a list of parent class entities
      + +Parameters: not specified + +Return value: array + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getParentClassName(): null|string; +``` + +
      Get the name of the parent class entity if it exists
      + +Parameters: not specified + +Return value: null | string + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getParentClassNames(): array; +``` + +
      Get a list of entity names of parent classes
      + +Parameters: not specified + +Return value: array + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getPluginData(string $pluginKey): mixed; +``` + +
      Get additional information added using the plugin
      + +Parameters: + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $pluginKeystring-
      + +Return value: mixed + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getProperties(): array; +``` + +
      Get all properties that are available according to the configuration as an array
      + +Parameters: not specified + +Return value: array + + +Throws: + + + +See: + +
      +
      +
      + +
        +
      • # + getPropertiesData + :warning: Is internal | source code
      • +
      + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getPropertiesData(bool $onlyFromCurrentClassAndTraits = false, int $flags = \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntity::VISIBILITY_MODIFIERS_FLAG_ANY): array; +``` + +
      Get a list of all properties and classes where they are implemented
      + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $onlyFromCurrentClassAndTraitsboolGet data only for properties from the current class
      $flagsintGet data only for properties corresponding to the visibility modifiers passed in this value
      + +Return value: array + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getProperty(string $propertyName, bool $unsafe = false): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntity; +``` + +
      Get the property entity by its name
      + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $propertyNamestringThe name of the property whose entity you want to get
      $unsafeboolCheck all properties, not just the properties allowed in the configuration (@see PhpHandlerSettings::getPropertyEntityFilter())
      + +Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntity + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getPropertyDefaultValue(string $propertyName): string|array|int|bool|null|float; +``` + +
      Get the compiled value of a property
      + +Parameters: + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $propertyNamestringThe name of the property for which you need to get the value
      + +Return value: string | array | int | bool | null | float + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getPropertyEntitiesCollection(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntitiesCollection; +``` + +
      Get a collection of property entities
      + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntitiesCollection + + +Throws: + + + +See: + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getRelativeFileName(): null|string; +``` + +
      File name relative to project_root configuration parameter
      + +Parameters: not specified + +Return value: null | string + + + +See: + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getRootEntityCollection(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; +``` + +
      Get the collection of root entities to which this entity belongs
      + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getShortName(): string; +``` + +
      Short name of the entity
      + +Parameters: not specified + +Return value: string + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getStartLine(): int; +``` + +
      Get the line number of the start of a class code in a file
      + +Parameters: not specified + +Return value: int + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getThrows(): array; +``` + +
      Get parsed throws from `throws` doc block
      + +Parameters: not specified + +Return value: array + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getThrowsDocBlockLinks(): array; +``` + + + +Parameters: not specified + +Return value: array + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getTraits(): array; +``` + +
      Get a list of trait entities of the current class
      + +Parameters: not specified + +Return value: array + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getTraitsNames(): array; +``` + +
      Get a list of class traits names
      + +Parameters: not specified + +Return value: array + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function hasConstant(string $constantName, bool $unsafe = false): bool; +``` + +
      Check if a constant exists in a class
      + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $constantNamestringThe name of the class whose entity you want to check
      $unsafeboolCheck all constants, not just the constants allowed in the configuration (@see PhpHandlerSettings::getClassConstantEntityFilter())
      + +Return value: bool + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function hasDescriptionLinks(): bool; +``` + +
      Checking if an entity has links in its description
      + +Parameters: not specified + +Return value: bool + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function hasExamples(): bool; +``` + +
      Checking if an entity has `example` docBlock
      + +Parameters: not specified + +Return value: bool + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function hasMethod(string $methodName, bool $unsafe = false): bool; +``` + +
      Check if a method exists in a class
      + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $methodNamestringThe name of the method whose entity you want to check
      $unsafeboolCheck all methods, not just the methods allowed in the configuration (@see PhpHandlerSettings::getMethodEntityFilter())
      + +Return value: bool + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function hasParentClass(string $parentClassName): bool; +``` + +
      Check if a certain parent class exists in a chain of parent classes
      + +Parameters: + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $parentClassNamestringSearched parent class
      + +Return value: bool + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function hasProperty(string $propertyName, bool $unsafe = false): bool; +``` + +
      Check if a property exists in a class
      + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $propertyNamestringThe name of the property whose entity you want to check
      $unsafeboolCheck all properties, not just the properties allowed in the configuration (@see PhpHandlerSettings::getPropertyEntityFilter())
      + +Return value: bool + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function hasThrows(): bool; +``` + +
      Checking if an entity has `throws` docBlock
      + +Parameters: not specified + +Return value: bool + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function hasTraits(): bool; +``` + +
      Check if the class contains traits
      + +Parameters: not specified + +Return value: bool + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function implementsInterface(string $interfaceName): bool; +``` + +
      Check if a class implements an interface
      + +Parameters: + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $interfaceNamestringName of the required interface in the interface chain
      + +Return value: bool + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function isAbstract(): bool; +``` + +
      Check that an entity is abstract
      + +Parameters: not specified + +Return value: bool + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function isApi(): bool; +``` + +
      Checking if an entity has `api` docBlock
      + +Parameters: not specified + +Return value: bool + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function isClass(): bool; +``` + +
      Check if an entity is a Class
      + +Parameters: not specified + +Return value: bool + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function isClassLoad(): bool; +``` + + + +Parameters: not specified + +Return value: bool + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function isDeprecated(): bool; +``` + +
      Checking if an entity has `deprecated` docBlock
      + +Parameters: not specified + +Return value: bool + + +Throws: + + +
      +
      +
      + +
        +
      • # + isDocumentCreationAllowed + :warning: Is internal | source code
      • +
      + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function isDocumentCreationAllowed(): bool; +``` + + + +Parameters: not specified + +Return value: bool + + +Throws: + + +
      +
      +
      + +
        +
      • # + isEntityCacheOutdated + :warning: Is internal | source code
      • +
      + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function isEntityCacheOutdated(): bool; +``` + +
      Checking if the entity cache is out of date
      + +Parameters: not specified + +Return value: bool + + +
      +
      +
      + +
        +
      • # + isEntityDataCacheOutdated + :warning: Is internal | source code
      • +
      + +```php +// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait + +public function isEntityDataCacheOutdated(): bool; +``` + + + +Parameters: not specified + +Return value: bool + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function isEntityDataCanBeLoaded(): bool; +``` + + + +Parameters: not specified + +Return value: bool + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function isEntityFileCanBeLoad(): bool; +``` + +
      Checking if entity data can be retrieved
      + +Parameters: not specified + +Return value: bool + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public static function isEntityNameValid(string $entityName): bool; +``` + +
      Check if the name is a valid name for ClassLikeEntity
      + +Parameters: + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $entityNamestring-
      + +Return value: bool + + +
      +
      +
      + + + +```php +public function isEnum(): bool; +``` + +
      Check if an entity is an Enum
      + +Parameters: not specified + +Return value: bool + + +
      +
      +
      + +
        +
      • # + isExternalLibraryEntity + :warning: Is internal | source code
      • +
      + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function isExternalLibraryEntity(): bool; +``` + +
      Check if a given entity is an entity from a third party library (connected via composer)
      + +Parameters: not specified + +Return value: bool + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function isInGit(): bool; +``` + +
      Checking if class file is in git repository
      + +Parameters: not specified + +Return value: bool + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function isInstantiable(): bool; +``` + +
      Check that an entity is instantiable
      + +Parameters: not specified + +Return value: bool + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function isInterface(): bool; +``` + +
      Check if an entity is an Interface
      + +Parameters: not specified + +Return value: bool + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function isInternal(): bool; +``` + +
      Checking if an entity has `internal` docBlock
      + +Parameters: not specified + +Return value: bool + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function isSubclassOf(string $className): bool; +``` + +
      Whether the given class is a subclass of the specified class
      + +Parameters: + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $classNamestring-
      + +Return value: bool + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function isTrait(): bool; +``` + +
      Check if an entity is a Trait
      + +Parameters: not specified + +Return value: bool + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public static function normalizeClassName(string $name): string; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $namestring-
      + +Return value: string + + +
      +
      +
      + +
        +
      • # + reloadEntityDependenciesCache + :warning: Is internal | source code
      • +
      + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function reloadEntityDependenciesCache(): array; +``` + +
      Update entity dependency cache
      + +Parameters: not specified + +Return value: array + + +
      +
      +
      + +
        +
      • # + removeEntityValueFromCache + :warning: Is internal | source code
      • +
      + +```php +// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait + +public function removeEntityValueFromCache(string $key): void; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $keystring-
      + +Return value: void + + +
      +
      +
      + +
        +
      • # + removeNotUsedEntityDataCache + :warning: Is internal | source code
      • +
      + +```php +// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait + +public function removeNotUsedEntityDataCache(): void; +``` + + + +Parameters: not specified + +Return value: void + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function setCustomAst(\PhpParser\Node\Stmt\Trait_|\PhpParser\Node\Stmt\Enum_|\PhpParser\Node\Stmt\Interface_|\PhpParser\Node\Stmt\Class_|null $customAst): void; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $customAst\PhpParser\Node\Stmt\Trait_ | \PhpParser\Node\Stmt\Enum_ | \PhpParser\Node\Stmt\Interface_ | \PhpParser\Node\Stmt\Class_ | null-
      + +Return value: void + + +
      +
      + + \ No newline at end of file diff --git a/docs/tech/2.parser/classes/InterfaceEntity.md b/docs/tech/2.parser/classes/InterfaceEntity.md new file mode 100644 index 00000000..ed8b2aef --- /dev/null +++ b/docs/tech/2.parser/classes/InterfaceEntity.md @@ -0,0 +1,3441 @@ + + BumbleDocGen / Technical description of the project / Parser / Entities and entities collections / InterfaceEntity
      + +

      + InterfaceEntity class: +

      + + + + + +```php +namespace BumbleDocGen\LanguageHandler\Php\Parser\Entity; + +class InterfaceEntity extends \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity implements \BumbleDocGen\Core\Renderer\Context\DocumentTransformableEntityInterface, \BumbleDocGen\Core\Parser\Entity\RootEntityInterface, \BumbleDocGen\Core\Parser\Entity\EntityInterface, \BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityInterface +``` + +
      Object interface
      + +See: + + + + + + + +

      Initialization methods:

      + +
        +
      1. + __construct +
      2. +
      + +

      Methods:

      + +
        +
      1. + addPluginData + - Add information to aт entity object
      2. +
      3. + cursorToDocAttributeLinkFragment +
      4. +
      5. + getAbsoluteFileName + - Returns the absolute path to a file if it can be retrieved and if the file is in the project directory
      6. +
      7. + getAst + - Get AST for this entity
      8. +
      9. + getCacheKey +
      10. +
      11. + getCachedEntityDependencies +
      12. +
      13. + getConstant + - Get the method entity by its name
      14. +
      15. + getConstantEntitiesCollection + - Get a collection of constant entities
      16. +
      17. + getConstantValue + - Get the compiled value of a constant
      18. +
      19. + getConstants + - Get all constants that are available according to the configuration as an array
      20. +
      21. + getConstantsData + - Get a list of all constants and classes where they are implemented
      22. +
      23. + getConstantsValues + - Get class constant compiled values according to filters
      24. +
      25. + getCurrentRootEntity +
      26. +
      27. + getDescription + - Get entity description
      28. +
      29. + getDescriptionLinks + - Get parsed links from description and doc blocks `see` and `link`
      30. +
      31. + getDocBlock + - Get DocBlock for current entity
      32. +
      33. + getDocComment + - Get the doc comment of an entity
      34. +
      35. + getDocCommentEntity + - Link to an entity where docBlock is implemented for this entity
      36. +
      37. + getDocCommentLine + - Get the code line number where the docBlock of the current entity begins
      38. +
      39. + getDocNote + - Get the note annotation value
      40. +
      41. + getDocRender +
      42. +
      43. + getEndLine + - Get the line number of the end of a class code in a file
      44. +
      45. + getEntityDependencies +
      46. +
      47. + getExamples + - Get parsed examples from `examples` doc block
      48. +
      49. + getFileContent +
      50. +
      51. + getFileSourceLink +
      52. +
      53. + getFirstExample + - Get first example from `examples` doc block
      54. +
      55. + getImplementingClass + - Get the class like entity in which the current entity was implemented
      56. +
      57. + getInterfaceNames + - Get a list of class interface names
      58. +
      59. + getInterfacesEntities + - Get a list of interface entities that the current class implements
      60. +
      61. + getMethod + - Get the method entity by its name
      62. +
      63. + getMethodEntitiesCollection + - Get a collection of method entities
      64. +
      65. + getMethods + - Get all methods that are available according to the configuration as an array
      66. +
      67. + getMethodsData + - Get a list of all methods and classes where they are implemented
      68. +
      69. + getModifiersString + - Get entity modifiers as a string
      70. +
      71. + getName + - Full name of the entity
      72. +
      73. + getNamespaceName + - Get the entity namespace name
      74. +
      75. + getObjectId + - Get entity unique ID
      76. +
      77. + getParentClass + - Get the entity of the parent class if it exists
      78. +
      79. + getParentClassEntities + - Get a list of parent class entities
      80. +
      81. + getParentClassName + - Get the name of the parent class entity if it exists
      82. +
      83. + getParentClassNames + - Get a list of entity names of parent classes
      84. +
      85. + getPluginData + - Get additional information added using the plugin
      86. +
      87. + getProperties + - Get all properties that are available according to the configuration as an array
      88. +
      89. + getPropertiesData + - Get a list of all properties and classes where they are implemented
      90. +
      91. + getProperty + - Get the property entity by its name
      92. +
      93. + getPropertyDefaultValue + - Get the compiled value of a property
      94. +
      95. + getPropertyEntitiesCollection + - Get a collection of property entities
      96. +
      97. + getRelativeFileName + - File name relative to project_root configuration parameter
      98. +
      99. + getRootEntityCollection + - Get the collection of root entities to which this entity belongs
      100. +
      101. + getShortName + - Short name of the entity
      102. +
      103. + getStartLine + - Get the line number of the start of a class code in a file
      104. +
      105. + getThrows + - Get parsed throws from `throws` doc block
      106. +
      107. + getThrowsDocBlockLinks +
      108. +
      109. + getTraits + - Get a list of trait entities of the current class
      110. +
      111. + getTraitsNames + - Get a list of class traits names
      112. +
      113. + hasConstant + - Check if a constant exists in a class
      114. +
      115. + hasDescriptionLinks + - Checking if an entity has links in its description
      116. +
      117. + hasExamples + - Checking if an entity has `example` docBlock
      118. +
      119. + hasMethod + - Check if a method exists in a class
      120. +
      121. + hasParentClass + - Check if a certain parent class exists in a chain of parent classes
      122. +
      123. + hasProperty + - Check if a property exists in a class
      124. +
      125. + hasThrows + - Checking if an entity has `throws` docBlock
      126. +
      127. + hasTraits + - Check if the class contains traits
      128. +
      129. + implementsInterface + - Check if a class implements an interface
      130. +
      131. + isAbstract + - Check that an entity is abstract
      132. +
      133. + isApi + - Checking if an entity has `api` docBlock
      134. +
      135. + isClass + - Check if an entity is a Class
      136. +
      137. + isClassLoad +
      138. +
      139. + isDeprecated + - Checking if an entity has `deprecated` docBlock
      140. +
      141. + isDocumentCreationAllowed +
      142. +
      143. + isEntityCacheOutdated + - Checking if the entity cache is out of date
      144. +
      145. + isEntityDataCacheOutdated +
      146. +
      147. + isEntityDataCanBeLoaded +
      148. +
      149. + isEntityFileCanBeLoad + - Checking if entity data can be retrieved
      150. +
      151. + isEntityNameValid + - Check if the name is a valid name for ClassLikeEntity
      152. +
      153. + isEnum + - Check if an entity is an Enum
      154. +
      155. + isExternalLibraryEntity + - Check if a given entity is an entity from a third party library (connected via composer)
      156. +
      157. + isInGit + - Checking if class file is in git repository
      158. +
      159. + isInstantiable + - Check that an entity is instantiable
      160. +
      161. + isInterface + - Check if an entity is an Interface
      162. +
      163. + isInternal + - Checking if an entity has `internal` docBlock
      164. +
      165. + isSubclassOf + - Whether the given class is a subclass of the specified class
      166. +
      167. + isTrait + - Check if an entity is a Trait
      168. +
      169. + normalizeClassName +
      170. +
      171. + reloadEntityDependenciesCache + - Update entity dependency cache
      172. +
      173. + removeEntityValueFromCache +
      174. +
      175. + removeNotUsedEntityDataCache +
      176. +
      177. + setCustomAst +
      178. +
      + + + + + + + +

      Method details:

      + +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function __construct(\BumbleDocGen\Core\Configuration\Configuration $configuration, \BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings $phpHandlerSettings, \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection $entitiesCollection, \BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper $parserHelper, \BumbleDocGen\LanguageHandler\Php\Parser\ComposerHelper $composerHelper, \BumbleDocGen\LanguageHandler\Php\Parser\PhpParser\PhpParserHelper $phpParserHelper, \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache $localObjectCache, \Psr\Log\LoggerInterface $logger, string $className, string|null $relativeFileName); +``` + + + +Parameters: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $configuration\BumbleDocGen\Core\Configuration\Configuration-
      $phpHandlerSettings\BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings-
      $entitiesCollection\BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection-
      $parserHelper\BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper-
      $composerHelper\BumbleDocGen\LanguageHandler\Php\Parser\ComposerHelper-
      $phpParserHelper\BumbleDocGen\LanguageHandler\Php\Parser\PhpParser\PhpParserHelper-
      $localObjectCache\BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache-
      $logger\Psr\Log\LoggerInterface-
      $classNamestring-
      $relativeFileNamestring | null-
      + + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function addPluginData(string $pluginKey, mixed $data): void; +``` + +
      Add information to aт entity object
      + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $pluginKeystring-
      $datamixed-
      + +Return value: void + + +
      +
      +
      + +
        +
      • # + cursorToDocAttributeLinkFragment + :warning: Is internal | source code
      • +
      + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function cursorToDocAttributeLinkFragment(string $cursor, bool $isForDocument = true): string; +``` + + + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $cursorstring-
      $isForDocumentbool-
      + +Return value: string + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getAbsoluteFileName(): null|string; +``` + +
      Returns the absolute path to a file if it can be retrieved and if the file is in the project directory
      + +Parameters: not specified + +Return value: null | string + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getAst(): \PhpParser\Node\Stmt\Class_|\PhpParser\Node\Stmt\Interface_|\PhpParser\Node\Stmt\Trait_|\PhpParser\Node\Stmt\Enum_; +``` + +
      Get AST for this entity
      + +Parameters: not specified + +Return value: \PhpParser\Node\Stmt\Class_ | \PhpParser\Node\Stmt\Interface_ | \PhpParser\Node\Stmt\Trait_ | \PhpParser\Node\Stmt\Enum_ + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait + +public function getCacheKey(): string; +``` + + + +Parameters: not specified + +Return value: string + + +
      +
      +
      + +
        +
      • # + getCachedEntityDependencies + :warning: Is internal | source code
      • +
      + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getCachedEntityDependencies(): array; +``` + + + +Parameters: not specified + +Return value: array + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getConstant(string $constantName, bool $unsafe = false): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity; +``` + +
      Get the method entity by its name
      + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $constantNamestringThe name of the constant whose entity you want to get
      $unsafeboolCheck all constants, not just the constants allowed in the configuration (@see PhpHandlerSettings::getClassConstantEntityFilter())
      + +Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getConstantEntitiesCollection(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntitiesCollection; +``` + +
      Get a collection of constant entities
      + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntitiesCollection + + +Throws: + + + +See: + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getConstantValue(string $constantName): string|array|int|bool|null|float; +``` + +
      Get the compiled value of a constant
      + +Parameters: + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $constantNamestringThe name of the constant for which you need to get the value
      + +Return value: string | array | int | bool | null | float + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getConstants(): array; +``` + +
      Get all constants that are available according to the configuration as an array
      + +Parameters: not specified + +Return value: array + + +Throws: + + + +See: + +
      +
      +
      + +
        +
      • # + getConstantsData + :warning: Is internal | source code
      • +
      + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getConstantsData(bool $onlyFromCurrentClassAndTraits = false, int $flags = \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity::VISIBILITY_MODIFIERS_FLAG_ANY): array; +``` + +
      Get a list of all constants and classes where they are implemented
      + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $onlyFromCurrentClassAndTraitsboolGet data only for constants from the current class
      $flagsintGet data only for constants corresponding to the visibility modifiers passed in this value
      + +Return value: array + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getConstantsValues(bool $onlyFromCurrentClassAndTraits = false, int $flags = \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity::VISIBILITY_MODIFIERS_FLAG_ANY): array; +``` + +
      Get class constant compiled values according to filters
      + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $onlyFromCurrentClassAndTraitsboolGet values only for constants from the current class
      $flagsintGet values only for constants corresponding to the visibility modifiers passed in this value
      + +Return value: array + + +Throws: + + +
      +
      +
      + +
        +
      • # + getCurrentRootEntity + :warning: Is internal | source code
      • +
      + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getCurrentRootEntity(): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; +``` + + + +Parameters: not specified + +Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDescription(): string; +``` + +
      Get entity description
      + +Parameters: not specified + +Return value: string + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDescriptionLinks(): array; +``` + +
      Get parsed links from description and doc blocks `see` and `link`
      + +Parameters: not specified + +Return value: array + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDocBlock(): \phpDocumentor\Reflection\DocBlock; +``` + +
      Get DocBlock for current entity
      + +Parameters: not specified + +Return value: \phpDocumentor\Reflection\DocBlock + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDocComment(): string; +``` + +
      Get the doc comment of an entity
      + +Parameters: not specified + +Return value: string + + +Throws: + + +
      +
      +
      + +
        +
      • # + getDocCommentEntity + :warning: Is internal | source code
      • +
      + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getDocCommentEntity(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; +``` + +
      Link to an entity where docBlock is implemented for this entity
      + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDocCommentLine(): null|int; +``` + +
      Get the code line number where the docBlock of the current entity begins
      + +Parameters: not specified + +Return value: null | int + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDocNote(): string; +``` + +
      Get the note annotation value
      + +Parameters: not specified + +Return value: string + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getDocRender(): \BumbleDocGen\Core\Renderer\EntityDocRenderer\EntityDocRendererInterface; +``` + + + +Parameters: not specified + +Return value: \BumbleDocGen\Core\Renderer\EntityDocRenderer\EntityDocRendererInterface + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getEndLine(): int; +``` + +
      Get the line number of the end of a class code in a file
      + +Parameters: not specified + +Return value: int + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getEntityDependencies(): array; +``` + + + +Parameters: not specified + +Return value: array + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getExamples(): array; +``` + +
      Get parsed examples from `examples` doc block
      + +Parameters: not specified + +Return value: array + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getFileContent(): string; +``` + + + +Parameters: not specified + +Return value: string + + +Throws: + + +
      +
      +
      + +
        +
      • # + getFileSourceLink + :warning: Is internal | source code
      • +
      + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getFileSourceLink(bool $withLine = true): null|string; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $withLinebool-
      + +Return value: null | string + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getFirstExample(): string; +``` + +
      Get first example from `examples` doc block
      + +Parameters: not specified + +Return value: string + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getImplementingClass(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; +``` + +
      Get the class like entity in which the current entity was implemented
      + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getInterfaceNames(): array; +``` + +
      Get a list of class interface names
      + +Parameters: not specified + +Return value: array + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getInterfacesEntities(): array; +``` + +
      Get a list of interface entities that the current class implements
      + +Parameters: not specified + +Return value: array + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getMethod(string $methodName, bool $unsafe = false): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntity; +``` + +
      Get the method entity by its name
      + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $methodNamestringThe name of the method whose entity you want to get
      $unsafeboolCheck all methods, not just the methods allowed in the configuration (@see PhpHandlerSettings::getMethodEntityFilter())
      + +Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntity + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getMethodEntitiesCollection(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntitiesCollection; +``` + +
      Get a collection of method entities
      + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntitiesCollection + + +Throws: + + + +See: + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getMethods(): array; +``` + +
      Get all methods that are available according to the configuration as an array
      + +Parameters: not specified + +Return value: array + + +Throws: + + + +See: + +
      +
      +
      + +
        +
      • # + getMethodsData + :warning: Is internal | source code
      • +
      + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getMethodsData(bool $onlyFromCurrentClassAndTraits = false, int $flags = \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntity::VISIBILITY_MODIFIERS_FLAG_ANY): array; +``` + +
      Get a list of all methods and classes where they are implemented
      + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $onlyFromCurrentClassAndTraitsboolGet data only for methods from the current class
      $flagsintGet data only for methods corresponding to the visibility modifiers passed in this value
      + +Return value: array + + +Throws: + + +
      +
      +
      + + + +```php +public function getModifiersString(): string; +``` + +
      Get entity modifiers as a string
      + +Parameters: not specified + +Return value: string + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getName(): string; +``` + +
      Full name of the entity
      + +Parameters: not specified + +Return value: string + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getNamespaceName(): string; +``` + +
      Get the entity namespace name
      + +Parameters: not specified + +Return value: string + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getObjectId(): string; +``` + +
      Get entity unique ID
      + +Parameters: not specified + +Return value: string + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getParentClass(): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; +``` + +
      Get the entity of the parent class if it exists
      + +Parameters: not specified + +Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getParentClassEntities(): array; +``` + +
      Get a list of parent class entities
      + +Parameters: not specified + +Return value: array + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getParentClassName(): null|string; +``` + +
      Get the name of the parent class entity if it exists
      + +Parameters: not specified + +Return value: null | string + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getParentClassNames(): array; +``` + +
      Get a list of entity names of parent classes
      + +Parameters: not specified + +Return value: array + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getPluginData(string $pluginKey): mixed; +``` + +
      Get additional information added using the plugin
      + +Parameters: + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $pluginKeystring-
      + +Return value: mixed + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getProperties(): array; +``` + +
      Get all properties that are available according to the configuration as an array
      + +Parameters: not specified + +Return value: array + + +Throws: + + + +See: + +
      +
      +
      + +
        +
      • # + getPropertiesData + :warning: Is internal | source code
      • +
      + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getPropertiesData(bool $onlyFromCurrentClassAndTraits = false, int $flags = \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntity::VISIBILITY_MODIFIERS_FLAG_ANY): array; +``` + +
      Get a list of all properties and classes where they are implemented
      + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $onlyFromCurrentClassAndTraitsboolGet data only for properties from the current class
      $flagsintGet data only for properties corresponding to the visibility modifiers passed in this value
      + +Return value: array + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getProperty(string $propertyName, bool $unsafe = false): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntity; +``` + +
      Get the property entity by its name
      + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $propertyNamestringThe name of the property whose entity you want to get
      $unsafeboolCheck all properties, not just the properties allowed in the configuration (@see PhpHandlerSettings::getPropertyEntityFilter())
      + +Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntity + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getPropertyDefaultValue(string $propertyName): string|array|int|bool|null|float; +``` + +
      Get the compiled value of a property
      + +Parameters: + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $propertyNamestringThe name of the property for which you need to get the value
      + +Return value: string | array | int | bool | null | float + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getPropertyEntitiesCollection(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntitiesCollection; +``` + +
      Get a collection of property entities
      + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntitiesCollection + + +Throws: + + + +See: + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getRelativeFileName(): null|string; +``` + +
      File name relative to project_root configuration parameter
      + +Parameters: not specified + +Return value: null | string + + + +See: + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getRootEntityCollection(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; +``` + +
      Get the collection of root entities to which this entity belongs
      + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getShortName(): string; +``` + +
      Short name of the entity
      + +Parameters: not specified + +Return value: string + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getStartLine(): int; +``` + +
      Get the line number of the start of a class code in a file
      + +Parameters: not specified + +Return value: int + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getThrows(): array; +``` + +
      Get parsed throws from `throws` doc block
      + +Parameters: not specified + +Return value: array + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getThrowsDocBlockLinks(): array; +``` + + + +Parameters: not specified + +Return value: array + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getTraits(): array; +``` + +
      Get a list of trait entities of the current class
      + +Parameters: not specified + +Return value: array + + +Throws: + + +
      +
      +
      + + + +```php +public function getTraitsNames(): array; +``` + +
      Get a list of class traits names
      + +Parameters: not specified + +Return value: array + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function hasConstant(string $constantName, bool $unsafe = false): bool; +``` + +
      Check if a constant exists in a class
      + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $constantNamestringThe name of the class whose entity you want to check
      $unsafeboolCheck all constants, not just the constants allowed in the configuration (@see PhpHandlerSettings::getClassConstantEntityFilter())
      + +Return value: bool + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function hasDescriptionLinks(): bool; +``` + +
      Checking if an entity has links in its description
      + +Parameters: not specified + +Return value: bool + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function hasExamples(): bool; +``` + +
      Checking if an entity has `example` docBlock
      + +Parameters: not specified + +Return value: bool + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function hasMethod(string $methodName, bool $unsafe = false): bool; +``` + +
      Check if a method exists in a class
      + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $methodNamestringThe name of the method whose entity you want to check
      $unsafeboolCheck all methods, not just the methods allowed in the configuration (@see PhpHandlerSettings::getMethodEntityFilter())
      + +Return value: bool + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function hasParentClass(string $parentClassName): bool; +``` + +
      Check if a certain parent class exists in a chain of parent classes
      + +Parameters: + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $parentClassNamestringSearched parent class
      + +Return value: bool + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function hasProperty(string $propertyName, bool $unsafe = false): bool; +``` + +
      Check if a property exists in a class
      + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $propertyNamestringThe name of the property whose entity you want to check
      $unsafeboolCheck all properties, not just the properties allowed in the configuration (@see PhpHandlerSettings::getPropertyEntityFilter())
      + +Return value: bool + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function hasThrows(): bool; +``` + +
      Checking if an entity has `throws` docBlock
      + +Parameters: not specified + +Return value: bool + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function hasTraits(): bool; +``` + +
      Check if the class contains traits
      + +Parameters: not specified + +Return value: bool + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function implementsInterface(string $interfaceName): bool; +``` + +
      Check if a class implements an interface
      + +Parameters: + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $interfaceNamestringName of the required interface in the interface chain
      + +Return value: bool + + +Throws: + + +
      +
      +
      + + + +```php +public function isAbstract(): bool; +``` + +
      Check that an entity is abstract
      + +Parameters: not specified + +Return value: bool + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function isApi(): bool; +``` + +
      Checking if an entity has `api` docBlock
      + +Parameters: not specified + +Return value: bool + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function isClass(): bool; +``` + +
      Check if an entity is a Class
      + +Parameters: not specified + +Return value: bool + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function isClassLoad(): bool; +``` + + + +Parameters: not specified + +Return value: bool + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function isDeprecated(): bool; +``` + +
      Checking if an entity has `deprecated` docBlock
      + +Parameters: not specified + +Return value: bool + + +Throws: + + +
      +
      +
      + +
        +
      • # + isDocumentCreationAllowed + :warning: Is internal | source code
      • +
      + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function isDocumentCreationAllowed(): bool; +``` + + + +Parameters: not specified + +Return value: bool + + +Throws: + + +
      +
      +
      + +
        +
      • # + isEntityCacheOutdated + :warning: Is internal | source code
      • +
      + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function isEntityCacheOutdated(): bool; +``` + +
      Checking if the entity cache is out of date
      + +Parameters: not specified + +Return value: bool + + +
      +
      +
      + +
        +
      • # + isEntityDataCacheOutdated + :warning: Is internal | source code
      • +
      + +```php +// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait + +public function isEntityDataCacheOutdated(): bool; +``` + + + +Parameters: not specified + +Return value: bool + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function isEntityDataCanBeLoaded(): bool; +``` + + + +Parameters: not specified + +Return value: bool + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function isEntityFileCanBeLoad(): bool; +``` + +
      Checking if entity data can be retrieved
      + +Parameters: not specified + +Return value: bool + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public static function isEntityNameValid(string $entityName): bool; +``` + +
      Check if the name is a valid name for ClassLikeEntity
      + +Parameters: + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $entityNamestring-
      + +Return value: bool + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function isEnum(): bool; +``` + +
      Check if an entity is an Enum
      + +Parameters: not specified + +Return value: bool + + +
      +
      +
      + +
        +
      • # + isExternalLibraryEntity + :warning: Is internal | source code
      • +
      + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function isExternalLibraryEntity(): bool; +``` + +
      Check if a given entity is an entity from a third party library (connected via composer)
      + +Parameters: not specified + +Return value: bool + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function isInGit(): bool; +``` + +
      Checking if class file is in git repository
      + +Parameters: not specified + +Return value: bool + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function isInstantiable(): bool; +``` + +
      Check that an entity is instantiable
      + +Parameters: not specified + +Return value: bool + + +
      +
      +
      + + + +```php +public function isInterface(): bool; +``` + +
      Check if an entity is an Interface
      + +Parameters: not specified + +Return value: bool + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function isInternal(): bool; +``` + +
      Checking if an entity has `internal` docBlock
      + +Parameters: not specified + +Return value: bool + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function isSubclassOf(string $className): bool; +``` + +
      Whether the given class is a subclass of the specified class
      + +Parameters: + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $classNamestring-
      + +Return value: bool + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function isTrait(): bool; +``` + +
      Check if an entity is a Trait
      + +Parameters: not specified + +Return value: bool + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public static function normalizeClassName(string $name): string; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $namestring-
      + +Return value: string + + +
      +
      +
      + +
        +
      • # + reloadEntityDependenciesCache + :warning: Is internal | source code
      • +
      + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function reloadEntityDependenciesCache(): array; +``` + +
      Update entity dependency cache
      + +Parameters: not specified + +Return value: array + + +
      +
      +
      + +
        +
      • # + removeEntityValueFromCache + :warning: Is internal | source code
      • +
      + +```php +// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait + +public function removeEntityValueFromCache(string $key): void; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $keystring-
      + +Return value: void + + +
      +
      +
      + +
        +
      • # + removeNotUsedEntityDataCache + :warning: Is internal | source code
      • +
      + +```php +// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait + +public function removeNotUsedEntityDataCache(): void; +``` + + + +Parameters: not specified + +Return value: void + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function setCustomAst(\PhpParser\Node\Stmt\Trait_|\PhpParser\Node\Stmt\Enum_|\PhpParser\Node\Stmt\Interface_|\PhpParser\Node\Stmt\Class_|null $customAst): void; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $customAst\PhpParser\Node\Stmt\Trait_ | \PhpParser\Node\Stmt\Enum_ | \PhpParser\Node\Stmt\Interface_ | \PhpParser\Node\Stmt\Class_ | null-
      + +Return value: void + + +
      +
      + + \ No newline at end of file diff --git a/docs/tech/2.parser/classes/MethodEntityCollection.md b/docs/tech/2.parser/classes/MethodEntitiesCollection.md similarity index 66% rename from docs/tech/2.parser/classes/MethodEntityCollection.md rename to docs/tech/2.parser/classes/MethodEntitiesCollection.md index 155d2cf3..4d88bd7f 100644 --- a/docs/tech/2.parser/classes/MethodEntityCollection.md +++ b/docs/tech/2.parser/classes/MethodEntitiesCollection.md @@ -1,8 +1,8 @@ - BumbleDocGen / Technical description of the project / Parser / Entities and entities collections / MethodEntityCollection
      + BumbleDocGen / Technical description of the project / Parser / Entities and entities collections / MethodEntitiesCollection

      - MethodEntityCollection class: + MethodEntitiesCollection class:

      @@ -10,12 +10,12 @@ ```php -namespace BumbleDocGen\LanguageHandler\Php\Parser\Entity; +namespace BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method; -final class MethodEntityCollection extends \BumbleDocGen\Core\Parser\Entity\BaseEntityCollection implements \IteratorAggregate +final class MethodEntitiesCollection extends \BumbleDocGen\Core\Parser\Entity\BaseEntityCollection implements \IteratorAggregate ``` - +
      Collection of PHP class method entities
      @@ -35,16 +35,16 @@ final class MethodEntityCollection extends \BumbleDocGen\Core\Parser\Entity\Base
      1. add -
      2. + - Add an entity to a collection
      3. get -
      4. + - Get the loaded method entity if it exists
      5. getAllExceptInitializations -
      6. + - Get a copy of the collection containing only those methods that are not initialization methods
      7. getInitializations -
      8. + - Get a copy of the collection containing only those methods that are initialization methods
      9. getIterator
      10. @@ -56,13 +56,13 @@ final class MethodEntityCollection extends \BumbleDocGen\Core\Parser\Entity\Base
      11. loadMethodEntities -
      12. + - Load method entities into the collection according to the project configuration
      13. remove
      14. unsafeGet -
      15. + - Get the method entity if it exists. If the method exists but has not been loaded into the collection, a new entity object will be created
      @@ -78,11 +78,11 @@ final class MethodEntityCollection extends \BumbleDocGen\Core\Parser\Entity\Base ```php -public function __construct(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity $classEntity, \BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings $phpHandlerSettings, \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Cache\CacheablePhpEntityFactory $cacheablePhpEntityFactory, \Psr\Log\LoggerInterface $logger); +public function __construct(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity $classEntity, \BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings $phpHandlerSettings, \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Cache\CacheablePhpEntityFactory $cacheablePhpEntityFactory, \Psr\Log\LoggerInterface $logger); ``` @@ -100,7 +100,7 @@ public function __construct(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\Clas $classEntity - \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity + \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - @@ -130,14 +130,14 @@ public function __construct(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\Clas ```php -public function add(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\MethodEntityInterface $methodEntity, bool $reload = false): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\MethodEntityCollection; +public function add(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntityInterface $methodEntity, bool $reload = false): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntitiesCollection; ``` - +
      Add an entity to a collection
      Parameters: @@ -152,18 +152,18 @@ public function add(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\MethodEntity $methodEntity - \BumbleDocGen\LanguageHandler\Php\Parser\Entity\MethodEntityInterface - - + \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntityInterface + Entity to be added to the collection $reload bool - - + Replace an entity with a new one if one has already been loaded previously -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\MethodEntityCollection +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntitiesCollection
      @@ -173,14 +173,14 @@ public function add(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\MethodEntity ```php -public function get(string $objectName): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\MethodEntity; +public function get(string $objectName): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntity; ``` - +
      Get the loaded method entity if it exists
      Parameters: @@ -196,12 +196,12 @@ public function get(string $objectName): null|\BumbleDocGen\LanguageHandler\Php\ $objectName string - - + Method entity name -Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\MethodEntity +Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntity
      @@ -211,18 +211,18 @@ public function get(string $objectName): null|\BumbleDocGen\LanguageHandler\Php\ ```php -public function getAllExceptInitializations(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\MethodEntityCollection; +public function getAllExceptInitializations(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntitiesCollection; ``` - +
      Get a copy of the collection containing only those methods that are not initialization methods
      Parameters: not specified -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\MethodEntityCollection +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntitiesCollection
      @@ -232,18 +232,18 @@ public function getAllExceptInitializations(): \BumbleDocGen\LanguageHandler\Php ```php -public function getInitializations(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\MethodEntityCollection; +public function getInitializations(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntitiesCollection; ``` - +
      Get a copy of the collection containing only those methods that are initialization methods
      Parameters: not specified -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\MethodEntityCollection +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntitiesCollection
      @@ -339,14 +339,14 @@ public function isEmpty(): bool; ```php public function loadMethodEntities(): void; ``` - +
      Load method entities into the collection according to the project configuration
      Parameters: not specified @@ -366,6 +366,12 @@ public function loadMethodEntities(): void; + +See: +
      @@ -413,14 +419,14 @@ public function remove(string $objectName): void; ```php -public function unsafeGet(string $objectName): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\MethodEntity; +public function unsafeGet(string $objectName): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntity; ``` - +
      Get the method entity if it exists. If the method exists but has not been loaded into the collection, a new entity object will be created
      Parameters: @@ -436,12 +442,12 @@ public function unsafeGet(string $objectName): null|\BumbleDocGen\LanguageHandle $objectName string - - + Method entity name -Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\MethodEntity +Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntity Throws: diff --git a/docs/tech/2.parser/classes/MethodEntity.md b/docs/tech/2.parser/classes/MethodEntity.md index e3ad1405..56e1b600 100644 --- a/docs/tech/2.parser/classes/MethodEntity.md +++ b/docs/tech/2.parser/classes/MethodEntity.md @@ -2,7 +2,7 @@ BumbleDocGen / Technical description of the project / Parser / Entities and entities collections / MethodEntity

      - MethodEntity class: + MethodEntity class:

      @@ -10,9 +10,9 @@ ```php -namespace BumbleDocGen\LanguageHandler\Php\Parser\Entity; +namespace BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method; -class MethodEntity extends \BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity implements \BumbleDocGen\LanguageHandler\Php\Parser\Entity\MethodEntityInterface, \BumbleDocGen\Core\Parser\Entity\EntityInterface, \BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityInterface +class MethodEntity extends \BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity implements \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntityInterface, \BumbleDocGen\Core\Parser\Entity\EntityInterface, \BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityInterface ```
      Class method entity
      @@ -33,18 +33,15 @@ class MethodEntity extends \BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseE

      Methods:

        -
      1. - entityCacheIsOutdated -
      2. getAbsoluteFileName - Returns the absolute path to a file if it can be retrieved and if the file is in the project directory
      3. getAst -
      4. + - Get AST for this entity
      5. getBodyCode -
      6. + - Get the code for this method
      7. getCacheKey
      8. @@ -56,157 +53,151 @@ class MethodEntity extends \BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseE
      9. getDescription -
      10. + - Get entity description
      11. getDescriptionLinks - Get parsed links from description and doc blocks `see` and `link`
      12. getDocBlock -
      13. + - Get DocBlock for current entity
      14. getDocComment - Get the doc comment of an entity
      15. getDocCommentEntity -
      16. + - Link to an entity where docBlock is implemented for this entity
      17. getDocCommentLine
      18. -
      19. - getDocCommentLineRecursive -
      20. -
      21. - getDocCommentRecursive -
      22. getDocNote -
      23. + - Get the note annotation value
      24. getEndLine -
      25. + - Get the line number of the end of a method's code in a file
      26. getExamples - Get parsed examples from `examples` doc block
      27. -
      28. - getFileName -
      29. getFileSourceLink
      30. getFirstExample - - Get first example from @examples doc block
      31. + - Get first example from `examples` doc block
      32. getFirstReturnValue -
      33. + - Get the compiled first return value of a method (if possible)
      34. getImplementingClass -
      35. + - Get the class like entity in which the current entity was implemented
      36. getImplementingClassName -
      37. + - Get the name of the class in which this method is implemented
      38. getModifiersString -
      39. + - Get a text representation of method modifiers
      40. getName -
      41. + - Full name of the entity
      42. getNamespaceName -
      43. + - Namespace of the class that contains this method
      44. getObjectId - Get entity unique ID
      45. getParameters -
      46. + - Get a list of method parameters
      47. getParametersString -
      48. -
      49. - getPhpHandlerSettings -
      50. + - Get a list of method parameters as a string
      51. - getPrototype -
      52. + getParentMethod + - Get the parent method for this method
      53. getRelativeFileName -
      54. + - File name relative to project_root configuration parameter
      55. getReturnType -
      56. + - Get the return type of method
      57. getRootEntity
      58. getRootEntityCollection - - Get parent collection of entities
      59. + - Get the collection of root entities to which this entity belongs
      60. getShortName -
      61. + - Short name of the entity
      62. getSignature -
      63. + - Get the method signature as a string
      64. getStartColumn -
      65. + - Get the column number of the beginning of the method code in a file
      66. getStartLine -
      67. + - Get the line number of the beginning of the entity code in a file
      68. getThrows - Get parsed throws from `throws` doc block
      69. - hasDescriptionLinks + getThrowsDocBlockLinks
      70. +
      71. + hasDescriptionLinks + - Checking if an entity has links in its description
      72. hasExamples -
      73. + - Checking if an entity has `example` docBlock
      74. hasThrows -
      75. + - Checking if an entity has `throws` docBlock +
      76. + isApi + - Checking if an entity has `api` docBlock
      77. isConstructor -
      78. + - Checking that a method is a constructor
      79. isDeprecated -
      80. + - Checking if an entity has `deprecated` docBlock
      81. isDynamic -
      82. + - Check if a method is a dynamic method, that is, implementable using __call or __callStatic +
      83. + isEntityCacheOutdated + - Checking if the entity cache is out of date
      84. isEntityDataCacheOutdated
      85. isEntityFileCanBeLoad -
      86. + - Checking if entity data can be retrieved
      87. isImplementedInParentClass -
      88. + - Check if this method is implemented in the parent class
      89. isInitialization -
      90. + - Check if a method is an initialization method
      91. isInternal -
      92. + - Checking if an entity has `internal` docBlock
      93. isPrivate -
      94. + - Check if a method is a private method
      95. isProtected -
      96. + - Check if a method is a protected method
      97. isPublic -
      98. + - Check if a method is a public method
      99. isStatic -
      100. -
      101. - parseAnnotationParams -
      102. + - Check if this method is static
      103. reloadEntityDependenciesCache -
      104. + - Update entity dependency cache
      105. removeEntityValueFromCache
      106. @@ -220,19 +211,19 @@ class MethodEntity extends \BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseE @@ -247,11 +238,11 @@ class MethodEntity extends \BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseE ```php -public function __construct(\BumbleDocGen\Core\Configuration\Configuration $configuration, \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity $classEntity, \BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper $parserHelper, \PhpParser\PrettyPrinter\Standard $astPrinter, \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache $localObjectCache, \Psr\Log\LoggerInterface $logger, string $methodName, string $implementingClassName); +public function __construct(\BumbleDocGen\Core\Configuration\Configuration $configuration, \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity $classEntity, \BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper $parserHelper, \PhpParser\PrettyPrinter\Standard $astPrinter, \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache $localObjectCache, \Psr\Log\LoggerInterface $logger, string $methodName, string $implementingClassName); ``` @@ -274,7 +265,7 @@ public function __construct(\BumbleDocGen\Core\Configuration\Configuration $conf $classEntity - \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity + \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - @@ -312,39 +303,6 @@ public function __construct(\BumbleDocGen\Core\Configuration\Configuration $conf -
      -
      -
      - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function entityCacheIsOutdated(): bool; -``` - - - -Parameters: not specified - -Return value: bool - - -Throws: - -

      @@ -352,7 +310,7 @@ public function entityCacheIsOutdated(): bool; ```php @@ -382,14 +340,14 @@ public function getAbsoluteFileName(): null|string; ```php public function getAst(): \PhpParser\Node\Stmt\ClassMethod; ``` - +
      Get AST for this entity
      Parameters: not specified @@ -410,27 +368,20 @@ public function getAst(): \PhpParser\Node\Stmt\ClassMethod; ```php public function getBodyCode(): string; ``` - +
      Get the code for this method
      Parameters: not specified Return value: string -Throws: - -

      @@ -438,7 +389,7 @@ public function getBodyCode(): string; ```php @@ -461,7 +412,7 @@ public function getCacheKey(): string; ```php @@ -482,6 +433,9 @@ public function getCachedEntityDependencies(): array;
    7. \Psr\Cache\InvalidArgumentException
    8. +
    9. + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    10. +
      @@ -491,20 +445,20 @@ public function getCachedEntityDependencies(): array; ```php // Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity -public function getCurrentRootEntity(): null|\BumbleDocGen\Core\Parser\Entity\RootEntityInterface; +public function getCurrentRootEntity(): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; ``` Parameters: not specified -Return value: null | \BumbleDocGen\Core\Parser\Entity\RootEntityInterface +Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity @@ -514,14 +468,16 @@ public function getCurrentRootEntity(): null|\BumbleDocGen\Core\Parser\Entity\Ro ```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + public function getDescription(): string; ``` - +
      Get entity description
      Parameters: not specified @@ -530,12 +486,6 @@ public function getDescription(): string; Throws: + +See: +
      @@ -360,14 +366,14 @@ public function remove(string $objectName): void; ```php -public function unsafeGet(string $objectName): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\PropertyEntity; +public function unsafeGet(string $objectName): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntity; ``` - +
      Get the property entity if it exists. If the property exists but has not been loaded into the collection, a new entity object will be created
      Parameters: @@ -383,16 +389,19 @@ public function unsafeGet(string $objectName): null|\BumbleDocGen\LanguageHandle $objectName string - - + Property entity name -Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PropertyEntity +Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntity Throws:
      -
      -
      - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function entityCacheIsOutdated(): bool; -``` - - - -Parameters: not specified - -Return value: bool - - -Throws: - -

      @@ -310,7 +275,7 @@ public function entityCacheIsOutdated(): bool; ```php @@ -340,14 +305,14 @@ public function getAbsoluteFileName(): null|string; ```php public function getAst(): \PhpParser\Node\Stmt\Property; ``` - +
      Get AST for this entity
      Parameters: not specified @@ -368,7 +333,7 @@ public function getAst(): \PhpParser\Node\Stmt\Property; ```php @@ -391,7 +356,7 @@ public function getCacheKey(): string; ```php @@ -412,6 +377,9 @@ public function getCachedEntityDependencies(): array;
    11. \Psr\Cache\InvalidArgumentException
    12. +
    13. + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    14. +
      @@ -421,20 +389,20 @@ public function getCachedEntityDependencies(): array; ```php // Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity -public function getCurrentRootEntity(): null|\BumbleDocGen\Core\Parser\Entity\RootEntityInterface; +public function getCurrentRootEntity(): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; ``` Parameters: not specified -Return value: null | \BumbleDocGen\Core\Parser\Entity\RootEntityInterface +Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity @@ -444,14 +412,14 @@ public function getCurrentRootEntity(): null|\BumbleDocGen\Core\Parser\Entity\Ro ```php public function getDefaultValue(): string|array|int|bool|null|float; ``` - +
      Get the compiled default value of a property
      Parameters: not specified @@ -475,14 +443,16 @@ public function getDefaultValue(): string|array|int|bool|null|float; ```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + public function getDescription(): string; ``` - +
      Get entity description
      Parameters: not specified @@ -491,12 +461,6 @@ public function getDescription(): string; Throws:

    Methods:

      -
    1. - entityCacheIsOutdated -
    2. -
    3. - entityDataCanBeLoaded - - Checking if it is possible to get the entity data
    4. getAbsoluteFileName - Returns the absolute path to a file if it can be retrieved and if the file is in the project directory
    5. @@ -42,24 +36,30 @@ their entities need to correspond to the same interfaces
    6. getFileContent
    7. -
    8. - getFileName - - Returns the relative path to a file if it can be retrieved and if the file is in the project directory
    9. getFileSourceLink
    10. getName -
    11. + - Full name of the entity
    12. getObjectId -
    13. + - Entity object ID +
    14. + getRelativeFileName + - File name relative to project_root configuration parameter
    15. getRootEntityCollection - Get parent collection of entities
    16. getShortName + - Short name of the entity
    17. +
    18. + isEntityCacheOutdated
    19. +
    20. + isEntityDataCanBeLoaded + - Checking if it is possible to get the entity data
    21. isEntityNameValid - Check if entity name is valid
    22. @@ -69,6 +69,9 @@ their entities need to correspond to the same interfaces
    23. isInGit - The entity file is in the git repository
    24. +
    25. + normalizeClassName +
    @@ -81,54 +84,10 @@ their entities need to correspond to the same interfaces
    - - -```php -// Implemented in BumbleDocGen\Core\Parser\Entity\EntityInterface - -public function entityCacheIsOutdated(): bool; -``` - - - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - - - -```php -public function entityDataCanBeLoaded(): bool; -``` - -
    Checking if it is possible to get the entity data
    - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - ```php @@ -151,7 +110,7 @@ public function getAbsoluteFileName(): null|string; ```php @@ -172,7 +131,7 @@ public function getEntityDependencies(): array; ```php @@ -186,29 +145,6 @@ public function getFileContent(): string; Return value: string -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\Core\Parser\Entity\EntityInterface - -public function getFileName(): null|string; -``` - -
    Returns the relative path to a file if it can be retrieved and if the file is in the project directory
    - -Parameters: not specified - -Return value: null | string - -

    @@ -216,7 +152,7 @@ public function getFileName(): null|string; ```php @@ -254,7 +190,7 @@ public function getFileSourceLink(bool $withLine = true): null|string; ```php @@ -263,7 +199,7 @@ public function getFileSourceLink(bool $withLine = true): null|string; public function getName(): string; ``` - +
    Full name of the entity
    Parameters: not specified @@ -277,7 +213,7 @@ public function getName(): string; ```php @@ -286,7 +222,7 @@ public function getName(): string; public function getObjectId(): string; ``` - +
    Entity object ID
    Parameters: not specified @@ -297,10 +233,39 @@ public function getObjectId(): string;
    + + +```php +// Implemented in BumbleDocGen\Core\Parser\Entity\EntityInterface + +public function getRelativeFileName(): null|string; +``` + +
    File name relative to project_root configuration parameter
    + +Parameters: not specified + +Return value: null | string + + + +See: + +
    +
    +
    + ```php @@ -323,7 +288,7 @@ public function getRootEntityCollection(): \BumbleDocGen\Core\Parser\Entity\Root ```php @@ -332,13 +297,57 @@ public function getRootEntityCollection(): \BumbleDocGen\Core\Parser\Entity\Root public function getShortName(): string; ``` - +
    Short name of the entity
    Parameters: not specified Return value: string +
    +
    +
    + +
      +
    • # + isEntityCacheOutdated + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\Core\Parser\Entity\EntityInterface + +public function isEntityCacheOutdated(): bool; +``` + + + +Parameters: not specified + +Return value: bool + + +
    +
    +
    + + + +```php +public function isEntityDataCanBeLoaded(): bool; +``` + +
    Checking if it is possible to get the entity data
    + +Parameters: not specified + +Return value: bool + +

    @@ -346,7 +355,7 @@ public function getShortName(): string; ```php @@ -384,7 +393,7 @@ public static function isEntityNameValid(string $entityName): bool; ```php @@ -405,7 +414,7 @@ public function isExternalLibraryEntity(): bool; ```php @@ -419,6 +428,44 @@ public function isInGit(): bool; Return value: bool +
    +
    +
    + + + +```php +public static function normalizeClassName(string $name): string; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $namestring-
    + +Return value: string + +

    diff --git a/docs/tech/2.parser/classes/TraitEntity.md b/docs/tech/2.parser/classes/TraitEntity.md new file mode 100644 index 00000000..62f9f6b6 --- /dev/null +++ b/docs/tech/2.parser/classes/TraitEntity.md @@ -0,0 +1,3441 @@ + + BumbleDocGen / Technical description of the project / Parser / Entities and entities collections / TraitEntity
    + +

    + TraitEntity class: +

    + + + + + +```php +namespace BumbleDocGen\LanguageHandler\Php\Parser\Entity; + +class TraitEntity extends \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity implements \BumbleDocGen\Core\Renderer\Context\DocumentTransformableEntityInterface, \BumbleDocGen\Core\Parser\Entity\RootEntityInterface, \BumbleDocGen\Core\Parser\Entity\EntityInterface, \BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityInterface +``` + +
    Trait
    + +See: + + + + + + + +

    Initialization methods:

    + +
      +
    1. + __construct +
    2. +
    + +

    Methods:

    + +
      +
    1. + addPluginData + - Add information to aт entity object
    2. +
    3. + cursorToDocAttributeLinkFragment +
    4. +
    5. + getAbsoluteFileName + - Returns the absolute path to a file if it can be retrieved and if the file is in the project directory
    6. +
    7. + getAst + - Get AST for this entity
    8. +
    9. + getCacheKey +
    10. +
    11. + getCachedEntityDependencies +
    12. +
    13. + getConstant + - Get the method entity by its name
    14. +
    15. + getConstantEntitiesCollection + - Get a collection of constant entities
    16. +
    17. + getConstantValue + - Get the compiled value of a constant
    18. +
    19. + getConstants + - Get all constants that are available according to the configuration as an array
    20. +
    21. + getConstantsData + - Get a list of all constants and classes where they are implemented
    22. +
    23. + getConstantsValues + - Get class constant compiled values according to filters
    24. +
    25. + getCurrentRootEntity +
    26. +
    27. + getDescription + - Get entity description
    28. +
    29. + getDescriptionLinks + - Get parsed links from description and doc blocks `see` and `link`
    30. +
    31. + getDocBlock + - Get DocBlock for current entity
    32. +
    33. + getDocComment + - Get the doc comment of an entity
    34. +
    35. + getDocCommentEntity + - Link to an entity where docBlock is implemented for this entity
    36. +
    37. + getDocCommentLine + - Get the code line number where the docBlock of the current entity begins
    38. +
    39. + getDocNote + - Get the note annotation value
    40. +
    41. + getDocRender +
    42. +
    43. + getEndLine + - Get the line number of the end of a class code in a file
    44. +
    45. + getEntityDependencies +
    46. +
    47. + getExamples + - Get parsed examples from `examples` doc block
    48. +
    49. + getFileContent +
    50. +
    51. + getFileSourceLink +
    52. +
    53. + getFirstExample + - Get first example from `examples` doc block
    54. +
    55. + getImplementingClass + - Get the class like entity in which the current entity was implemented
    56. +
    57. + getInterfaceNames + - Get a list of class interface names
    58. +
    59. + getInterfacesEntities + - Get a list of interface entities that the current class implements
    60. +
    61. + getMethod + - Get the method entity by its name
    62. +
    63. + getMethodEntitiesCollection + - Get a collection of method entities
    64. +
    65. + getMethods + - Get all methods that are available according to the configuration as an array
    66. +
    67. + getMethodsData + - Get a list of all methods and classes where they are implemented
    68. +
    69. + getModifiersString + - Get entity modifiers as a string
    70. +
    71. + getName + - Full name of the entity
    72. +
    73. + getNamespaceName + - Get the entity namespace name
    74. +
    75. + getObjectId + - Get entity unique ID
    76. +
    77. + getParentClass + - Get the entity of the parent class if it exists
    78. +
    79. + getParentClassEntities + - Get a list of parent class entities
    80. +
    81. + getParentClassName + - Get the name of the parent class entity if it exists
    82. +
    83. + getParentClassNames + - Get a list of entity names of parent classes
    84. +
    85. + getPluginData + - Get additional information added using the plugin
    86. +
    87. + getProperties + - Get all properties that are available according to the configuration as an array
    88. +
    89. + getPropertiesData + - Get a list of all properties and classes where they are implemented
    90. +
    91. + getProperty + - Get the property entity by its name
    92. +
    93. + getPropertyDefaultValue + - Get the compiled value of a property
    94. +
    95. + getPropertyEntitiesCollection + - Get a collection of property entities
    96. +
    97. + getRelativeFileName + - File name relative to project_root configuration parameter
    98. +
    99. + getRootEntityCollection + - Get the collection of root entities to which this entity belongs
    100. +
    101. + getShortName + - Short name of the entity
    102. +
    103. + getStartLine + - Get the line number of the start of a class code in a file
    104. +
    105. + getThrows + - Get parsed throws from `throws` doc block
    106. +
    107. + getThrowsDocBlockLinks +
    108. +
    109. + getTraits + - Get a list of trait entities of the current class
    110. +
    111. + getTraitsNames + - Get a list of class traits names
    112. +
    113. + hasConstant + - Check if a constant exists in a class
    114. +
    115. + hasDescriptionLinks + - Checking if an entity has links in its description
    116. +
    117. + hasExamples + - Checking if an entity has `example` docBlock
    118. +
    119. + hasMethod + - Check if a method exists in a class
    120. +
    121. + hasParentClass + - Check if a certain parent class exists in a chain of parent classes
    122. +
    123. + hasProperty + - Check if a property exists in a class
    124. +
    125. + hasThrows + - Checking if an entity has `throws` docBlock
    126. +
    127. + hasTraits + - Check if the class contains traits
    128. +
    129. + implementsInterface + - Check if a class implements an interface
    130. +
    131. + isAbstract + - Check that an entity is abstract
    132. +
    133. + isApi + - Checking if an entity has `api` docBlock
    134. +
    135. + isClass + - Check if an entity is a Class
    136. +
    137. + isClassLoad +
    138. +
    139. + isDeprecated + - Checking if an entity has `deprecated` docBlock
    140. +
    141. + isDocumentCreationAllowed +
    142. +
    143. + isEntityCacheOutdated + - Checking if the entity cache is out of date
    144. +
    145. + isEntityDataCacheOutdated +
    146. +
    147. + isEntityDataCanBeLoaded +
    148. +
    149. + isEntityFileCanBeLoad + - Checking if entity data can be retrieved
    150. +
    151. + isEntityNameValid + - Check if the name is a valid name for ClassLikeEntity
    152. +
    153. + isEnum + - Check if an entity is an Enum
    154. +
    155. + isExternalLibraryEntity + - Check if a given entity is an entity from a third party library (connected via composer)
    156. +
    157. + isInGit + - Checking if class file is in git repository
    158. +
    159. + isInstantiable + - Check that an entity is instantiable
    160. +
    161. + isInterface + - Check if an entity is an Interface
    162. +
    163. + isInternal + - Checking if an entity has `internal` docBlock
    164. +
    165. + isSubclassOf + - Whether the given class is a subclass of the specified class
    166. +
    167. + isTrait + - Check if an entity is a Trait
    168. +
    169. + normalizeClassName +
    170. +
    171. + reloadEntityDependenciesCache + - Update entity dependency cache
    172. +
    173. + removeEntityValueFromCache +
    174. +
    175. + removeNotUsedEntityDataCache +
    176. +
    177. + setCustomAst +
    178. +
    + + + + + + + +

    Method details:

    + +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function __construct(\BumbleDocGen\Core\Configuration\Configuration $configuration, \BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings $phpHandlerSettings, \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection $entitiesCollection, \BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper $parserHelper, \BumbleDocGen\LanguageHandler\Php\Parser\ComposerHelper $composerHelper, \BumbleDocGen\LanguageHandler\Php\Parser\PhpParser\PhpParserHelper $phpParserHelper, \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache $localObjectCache, \Psr\Log\LoggerInterface $logger, string $className, string|null $relativeFileName); +``` + + + +Parameters: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $configuration\BumbleDocGen\Core\Configuration\Configuration-
    $phpHandlerSettings\BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings-
    $entitiesCollection\BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection-
    $parserHelper\BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper-
    $composerHelper\BumbleDocGen\LanguageHandler\Php\Parser\ComposerHelper-
    $phpParserHelper\BumbleDocGen\LanguageHandler\Php\Parser\PhpParser\PhpParserHelper-
    $localObjectCache\BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache-
    $logger\Psr\Log\LoggerInterface-
    $classNamestring-
    $relativeFileNamestring | null-
    + + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function addPluginData(string $pluginKey, mixed $data): void; +``` + +
    Add information to aт entity object
    + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $pluginKeystring-
    $datamixed-
    + +Return value: void + + +
    +
    +
    + +
      +
    • # + cursorToDocAttributeLinkFragment + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function cursorToDocAttributeLinkFragment(string $cursor, bool $isForDocument = true): string; +``` + + + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $cursorstring-
    $isForDocumentbool-
    + +Return value: string + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getAbsoluteFileName(): null|string; +``` + +
    Returns the absolute path to a file if it can be retrieved and if the file is in the project directory
    + +Parameters: not specified + +Return value: null | string + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getAst(): \PhpParser\Node\Stmt\Class_|\PhpParser\Node\Stmt\Interface_|\PhpParser\Node\Stmt\Trait_|\PhpParser\Node\Stmt\Enum_; +``` + +
    Get AST for this entity
    + +Parameters: not specified + +Return value: \PhpParser\Node\Stmt\Class_ | \PhpParser\Node\Stmt\Interface_ | \PhpParser\Node\Stmt\Trait_ | \PhpParser\Node\Stmt\Enum_ + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait + +public function getCacheKey(): string; +``` + + + +Parameters: not specified + +Return value: string + + +
    +
    +
    + +
      +
    • # + getCachedEntityDependencies + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getCachedEntityDependencies(): array; +``` + + + +Parameters: not specified + +Return value: array + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getConstant(string $constantName, bool $unsafe = false): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity; +``` + +
    Get the method entity by its name
    + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $constantNamestringThe name of the constant whose entity you want to get
    $unsafeboolCheck all constants, not just the constants allowed in the configuration (@see PhpHandlerSettings::getClassConstantEntityFilter())
    + +Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getConstantEntitiesCollection(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntitiesCollection; +``` + +
    Get a collection of constant entities
    + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntitiesCollection + + +Throws: + + + +See: + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getConstantValue(string $constantName): string|array|int|bool|null|float; +``` + +
    Get the compiled value of a constant
    + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $constantNamestringThe name of the constant for which you need to get the value
    + +Return value: string | array | int | bool | null | float + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getConstants(): array; +``` + +
    Get all constants that are available according to the configuration as an array
    + +Parameters: not specified + +Return value: array + + +Throws: + + + +See: + +
    +
    +
    + +
      +
    • # + getConstantsData + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getConstantsData(bool $onlyFromCurrentClassAndTraits = false, int $flags = \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity::VISIBILITY_MODIFIERS_FLAG_ANY): array; +``` + +
    Get a list of all constants and classes where they are implemented
    + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $onlyFromCurrentClassAndTraitsboolGet data only for constants from the current class
    $flagsintGet data only for constants corresponding to the visibility modifiers passed in this value
    + +Return value: array + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getConstantsValues(bool $onlyFromCurrentClassAndTraits = false, int $flags = \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity::VISIBILITY_MODIFIERS_FLAG_ANY): array; +``` + +
    Get class constant compiled values according to filters
    + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $onlyFromCurrentClassAndTraitsboolGet values only for constants from the current class
    $flagsintGet values only for constants corresponding to the visibility modifiers passed in this value
    + +Return value: array + + +Throws: + + +
    +
    +
    + +
      +
    • # + getCurrentRootEntity + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getCurrentRootEntity(): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; +``` + + + +Parameters: not specified + +Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDescription(): string; +``` + +
    Get entity description
    + +Parameters: not specified + +Return value: string + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDescriptionLinks(): array; +``` + +
    Get parsed links from description and doc blocks `see` and `link`
    + +Parameters: not specified + +Return value: array + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDocBlock(): \phpDocumentor\Reflection\DocBlock; +``` + +
    Get DocBlock for current entity
    + +Parameters: not specified + +Return value: \phpDocumentor\Reflection\DocBlock + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDocComment(): string; +``` + +
    Get the doc comment of an entity
    + +Parameters: not specified + +Return value: string + + +Throws: + + +
    +
    +
    + +
      +
    • # + getDocCommentEntity + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getDocCommentEntity(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; +``` + +
    Link to an entity where docBlock is implemented for this entity
    + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDocCommentLine(): null|int; +``` + +
    Get the code line number where the docBlock of the current entity begins
    + +Parameters: not specified + +Return value: null | int + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDocNote(): string; +``` + +
    Get the note annotation value
    + +Parameters: not specified + +Return value: string + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getDocRender(): \BumbleDocGen\Core\Renderer\EntityDocRenderer\EntityDocRendererInterface; +``` + + + +Parameters: not specified + +Return value: \BumbleDocGen\Core\Renderer\EntityDocRenderer\EntityDocRendererInterface + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getEndLine(): int; +``` + +
    Get the line number of the end of a class code in a file
    + +Parameters: not specified + +Return value: int + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getEntityDependencies(): array; +``` + + + +Parameters: not specified + +Return value: array + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getExamples(): array; +``` + +
    Get parsed examples from `examples` doc block
    + +Parameters: not specified + +Return value: array + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getFileContent(): string; +``` + + + +Parameters: not specified + +Return value: string + + +Throws: + + +
    +
    +
    + +
      +
    • # + getFileSourceLink + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getFileSourceLink(bool $withLine = true): null|string; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $withLinebool-
    + +Return value: null | string + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getFirstExample(): string; +``` + +
    Get first example from `examples` doc block
    + +Parameters: not specified + +Return value: string + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getImplementingClass(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; +``` + +
    Get the class like entity in which the current entity was implemented
    + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + + +
    +
    +
    + + + +```php +public function getInterfaceNames(): array; +``` + +
    Get a list of class interface names
    + +Parameters: not specified + +Return value: array + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getInterfacesEntities(): array; +``` + +
    Get a list of interface entities that the current class implements
    + +Parameters: not specified + +Return value: array + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getMethod(string $methodName, bool $unsafe = false): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntity; +``` + +
    Get the method entity by its name
    + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $methodNamestringThe name of the method whose entity you want to get
    $unsafeboolCheck all methods, not just the methods allowed in the configuration (@see PhpHandlerSettings::getMethodEntityFilter())
    + +Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntity + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getMethodEntitiesCollection(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntitiesCollection; +``` + +
    Get a collection of method entities
    + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntitiesCollection + + +Throws: + + + +See: + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getMethods(): array; +``` + +
    Get all methods that are available according to the configuration as an array
    + +Parameters: not specified + +Return value: array + + +Throws: + + + +See: + +
    +
    +
    + +
      +
    • # + getMethodsData + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getMethodsData(bool $onlyFromCurrentClassAndTraits = false, int $flags = \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntity::VISIBILITY_MODIFIERS_FLAG_ANY): array; +``` + +
    Get a list of all methods and classes where they are implemented
    + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $onlyFromCurrentClassAndTraitsboolGet data only for methods from the current class
    $flagsintGet data only for methods corresponding to the visibility modifiers passed in this value
    + +Return value: array + + +Throws: + + +
    +
    +
    + + + +```php +public function getModifiersString(): string; +``` + +
    Get entity modifiers as a string
    + +Parameters: not specified + +Return value: string + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getName(): string; +``` + +
    Full name of the entity
    + +Parameters: not specified + +Return value: string + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getNamespaceName(): string; +``` + +
    Get the entity namespace name
    + +Parameters: not specified + +Return value: string + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getObjectId(): string; +``` + +
    Get entity unique ID
    + +Parameters: not specified + +Return value: string + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getParentClass(): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; +``` + +
    Get the entity of the parent class if it exists
    + +Parameters: not specified + +Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getParentClassEntities(): array; +``` + +
    Get a list of parent class entities
    + +Parameters: not specified + +Return value: array + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getParentClassName(): null|string; +``` + +
    Get the name of the parent class entity if it exists
    + +Parameters: not specified + +Return value: null | string + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getParentClassNames(): array; +``` + +
    Get a list of entity names of parent classes
    + +Parameters: not specified + +Return value: array + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getPluginData(string $pluginKey): mixed; +``` + +
    Get additional information added using the plugin
    + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $pluginKeystring-
    + +Return value: mixed + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getProperties(): array; +``` + +
    Get all properties that are available according to the configuration as an array
    + +Parameters: not specified + +Return value: array + + +Throws: + + + +See: + +
    +
    +
    + +
      +
    • # + getPropertiesData + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getPropertiesData(bool $onlyFromCurrentClassAndTraits = false, int $flags = \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntity::VISIBILITY_MODIFIERS_FLAG_ANY): array; +``` + +
    Get a list of all properties and classes where they are implemented
    + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $onlyFromCurrentClassAndTraitsboolGet data only for properties from the current class
    $flagsintGet data only for properties corresponding to the visibility modifiers passed in this value
    + +Return value: array + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getProperty(string $propertyName, bool $unsafe = false): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntity; +``` + +
    Get the property entity by its name
    + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $propertyNamestringThe name of the property whose entity you want to get
    $unsafeboolCheck all properties, not just the properties allowed in the configuration (@see PhpHandlerSettings::getPropertyEntityFilter())
    + +Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntity + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getPropertyDefaultValue(string $propertyName): string|array|int|bool|null|float; +``` + +
    Get the compiled value of a property
    + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $propertyNamestringThe name of the property for which you need to get the value
    + +Return value: string | array | int | bool | null | float + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getPropertyEntitiesCollection(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntitiesCollection; +``` + +
    Get a collection of property entities
    + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntitiesCollection + + +Throws: + + + +See: + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getRelativeFileName(): null|string; +``` + +
    File name relative to project_root configuration parameter
    + +Parameters: not specified + +Return value: null | string + + + +See: + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getRootEntityCollection(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; +``` + +
    Get the collection of root entities to which this entity belongs
    + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getShortName(): string; +``` + +
    Short name of the entity
    + +Parameters: not specified + +Return value: string + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getStartLine(): int; +``` + +
    Get the line number of the start of a class code in a file
    + +Parameters: not specified + +Return value: int + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getThrows(): array; +``` + +
    Get parsed throws from `throws` doc block
    + +Parameters: not specified + +Return value: array + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getThrowsDocBlockLinks(): array; +``` + + + +Parameters: not specified + +Return value: array + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getTraits(): array; +``` + +
    Get a list of trait entities of the current class
    + +Parameters: not specified + +Return value: array + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getTraitsNames(): array; +``` + +
    Get a list of class traits names
    + +Parameters: not specified + +Return value: array + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function hasConstant(string $constantName, bool $unsafe = false): bool; +``` + +
    Check if a constant exists in a class
    + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $constantNamestringThe name of the class whose entity you want to check
    $unsafeboolCheck all constants, not just the constants allowed in the configuration (@see PhpHandlerSettings::getClassConstantEntityFilter())
    + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function hasDescriptionLinks(): bool; +``` + +
    Checking if an entity has links in its description
    + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function hasExamples(): bool; +``` + +
    Checking if an entity has `example` docBlock
    + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function hasMethod(string $methodName, bool $unsafe = false): bool; +``` + +
    Check if a method exists in a class
    + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $methodNamestringThe name of the method whose entity you want to check
    $unsafeboolCheck all methods, not just the methods allowed in the configuration (@see PhpHandlerSettings::getMethodEntityFilter())
    + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function hasParentClass(string $parentClassName): bool; +``` + +
    Check if a certain parent class exists in a chain of parent classes
    + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $parentClassNamestringSearched parent class
    + +Return value: bool + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function hasProperty(string $propertyName, bool $unsafe = false): bool; +``` + +
    Check if a property exists in a class
    + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $propertyNamestringThe name of the property whose entity you want to check
    $unsafeboolCheck all properties, not just the properties allowed in the configuration (@see PhpHandlerSettings::getPropertyEntityFilter())
    + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function hasThrows(): bool; +``` + +
    Checking if an entity has `throws` docBlock
    + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function hasTraits(): bool; +``` + +
    Check if the class contains traits
    + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function implementsInterface(string $interfaceName): bool; +``` + +
    Check if a class implements an interface
    + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $interfaceNamestringName of the required interface in the interface chain
    + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function isAbstract(): bool; +``` + +
    Check that an entity is abstract
    + +Parameters: not specified + +Return value: bool + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function isApi(): bool; +``` + +
    Checking if an entity has `api` docBlock
    + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function isClass(): bool; +``` + +
    Check if an entity is a Class
    + +Parameters: not specified + +Return value: bool + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function isClassLoad(): bool; +``` + + + +Parameters: not specified + +Return value: bool + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function isDeprecated(): bool; +``` + +
    Checking if an entity has `deprecated` docBlock
    + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + +
      +
    • # + isDocumentCreationAllowed + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function isDocumentCreationAllowed(): bool; +``` + + + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + +
      +
    • # + isEntityCacheOutdated + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function isEntityCacheOutdated(): bool; +``` + +
    Checking if the entity cache is out of date
    + +Parameters: not specified + +Return value: bool + + +
    +
    +
    + +
      +
    • # + isEntityDataCacheOutdated + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait + +public function isEntityDataCacheOutdated(): bool; +``` + + + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function isEntityDataCanBeLoaded(): bool; +``` + + + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function isEntityFileCanBeLoad(): bool; +``` + +
    Checking if entity data can be retrieved
    + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public static function isEntityNameValid(string $entityName): bool; +``` + +
    Check if the name is a valid name for ClassLikeEntity
    + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $entityNamestring-
    + +Return value: bool + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function isEnum(): bool; +``` + +
    Check if an entity is an Enum
    + +Parameters: not specified + +Return value: bool + + +
    +
    +
    + +
      +
    • # + isExternalLibraryEntity + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function isExternalLibraryEntity(): bool; +``` + +
    Check if a given entity is an entity from a third party library (connected via composer)
    + +Parameters: not specified + +Return value: bool + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function isInGit(): bool; +``` + +
    Checking if class file is in git repository
    + +Parameters: not specified + +Return value: bool + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function isInstantiable(): bool; +``` + +
    Check that an entity is instantiable
    + +Parameters: not specified + +Return value: bool + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function isInterface(): bool; +``` + +
    Check if an entity is an Interface
    + +Parameters: not specified + +Return value: bool + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function isInternal(): bool; +``` + +
    Checking if an entity has `internal` docBlock
    + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +public function isSubclassOf(string $className): bool; +``` + +
    Whether the given class is a subclass of the specified class
    + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $classNamestring-
    + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +public function isTrait(): bool; +``` + +
    Check if an entity is a Trait
    + +Parameters: not specified + +Return value: bool + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public static function normalizeClassName(string $name): string; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $namestring-
    + +Return value: string + + +
    +
    +
    + +
      +
    • # + reloadEntityDependenciesCache + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function reloadEntityDependenciesCache(): array; +``` + +
    Update entity dependency cache
    + +Parameters: not specified + +Return value: array + + +
    +
    +
    + +
      +
    • # + removeEntityValueFromCache + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait + +public function removeEntityValueFromCache(string $key): void; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $keystring-
    + +Return value: void + + +
    +
    +
    + +
      +
    • # + removeNotUsedEntityDataCache + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait + +public function removeNotUsedEntityDataCache(): void; +``` + + + +Parameters: not specified + +Return value: void + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function setCustomAst(\PhpParser\Node\Stmt\Trait_|\PhpParser\Node\Stmt\Enum_|\PhpParser\Node\Stmt\Interface_|\PhpParser\Node\Stmt\Class_|null $customAst): void; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $customAst\PhpParser\Node\Stmt\Trait_ | \PhpParser\Node\Stmt\Enum_ | \PhpParser\Node\Stmt\Interface_ | \PhpParser\Node\Stmt\Class_ | null-
    + +Return value: void + + +
    +
    + + \ No newline at end of file diff --git a/docs/tech/2.parser/entity.md b/docs/tech/2.parser/entity.md index 1c61c288..4552e011 100644 --- a/docs/tech/2.parser/entity.md +++ b/docs/tech/2.parser/entity.md @@ -12,28 +12,28 @@ Entities are always handled through collections. Collections are the result of t * Passing a collection to a function: ```twig - {{ printEntityCollectionAsList(phpClassEntityCollection) }} + {{ printEntityCollectionAsList(phpEntities) }} ``` * Filtering a collection and passing it to a function: ```twig - {{ printEntityCollectionAsList(phpClassEntityCollection.filterByInterfaces(['BumbleDocGen\Core\Parser\Entity\EntityInterface'])) }} + {{ printEntityCollectionAsList(phpEntities.filterByInterfaces(['BumbleDocGen\Core\Parser\Entity\EntityInterface'])) }} ``` * Saving a filtered collection to a variable: ```twig - {{ {% set filteredCollection = phpClassEntityCollection.getOnlyInstantiable() %} }} + {{ {% set filteredCollection = phpEntities.getOnlyInstantiable() %} }} ``` * Using a collection in a for loop: ```twig - {% for someClassEntity in phpClassEntityCollection %} + {% for someClassEntity in phpEntities %} * {{ someClassEntity.getName() }} {% endfor %} ``` @@ -42,8 +42,8 @@ Entities are always handled through collections. Collections are the result of t * Output of all methods of all found entities in `className::methodName()` format: ```twig - {% for someClassEntity in phpClassEntityCollection %} - {% for methodEntity in someClassEntity.getMethodEntityCollection() %} + {% for someClassEntity in phpEntities %} + {% for methodEntity in someClassEntity.getMethodEntitiesCollection() %} * {{ someClassEntity.getName() }}::{{ methodEntity.getName() }}() {% endfor %} {% endfor %} @@ -64,10 +64,10 @@ The root collections (BumbleDocGen / Technical description of the project / Parser / Reflection API / RootEntityCollectionsGroup
    + +

    + RootEntityCollectionsGroup class: +

    + + + + + +```php +namespace BumbleDocGen\Core\Parser\Entity; + +final class RootEntityCollectionsGroup implements \IteratorAggregate +``` + + + + + + + + + +

    Methods:

    + +
      +
    1. + add +
    2. +
    3. + clearOperationsLog +
    4. +
    5. + get +
    6. +
    7. + getIterator +
    8. +
    9. + getOperationsLog +
    10. +
    11. + getOperationsLogWithoutDuplicates +
    12. +
    13. + isFoundEntitiesOperationsLogCacheOutdated +
    14. +
    15. + loadByLanguageHandlers +
    16. +
    17. + updateAllEntitiesCache +
    18. +
    + + + + + + + +

    Method details:

    + +
    + + + +```php +public function add(\BumbleDocGen\Core\Parser\Entity\RootEntityCollection $rootEntityCollection): void; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $rootEntityCollection\BumbleDocGen\Core\Parser\Entity\RootEntityCollection-
    + +Return value: void + + +
    +
    +
    + + + +```php +public function clearOperationsLog(): void; +``` + + + +Parameters: not specified + +Return value: void + + +
    +
    +
    + + + +```php +public function get(string $collectionName): null|\BumbleDocGen\Core\Parser\Entity\RootEntityCollection; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $collectionNamestring-
    + +Return value: null | \BumbleDocGen\Core\Parser\Entity\RootEntityCollection + + +
    +
    +
    + + + +```php +public function getIterator(): \Generator; +``` + + + +Parameters: not specified + +Return value: \Generator + + +
    +
    +
    + + + +```php +public function getOperationsLog(): array; +``` + + + +Parameters: not specified + +Return value: array + + +
    +
    +
    + + + +```php +public function getOperationsLogWithoutDuplicates(): array; +``` + + + +Parameters: not specified + +Return value: array + + +
    +
    +
    + +
      +
    • # + isFoundEntitiesOperationsLogCacheOutdated + | source code
    • +
    + +```php +public function isFoundEntitiesOperationsLogCacheOutdated(array $entitiesCollectionOperationsLog): bool; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $entitiesCollectionOperationsLogarray-
    + +Return value: bool + + +
    +
    +
    + + + +```php +public function loadByLanguageHandlers(\BumbleDocGen\LanguageHandler\LanguageHandlersCollection $languageHandlersCollection, \BumbleDocGen\Core\Parser\Entity\EntitiesLoaderProgressBarInterface|null $progressBar = null): \BumbleDocGen\Core\Parser\Entity\CollectionGroupLoadEntitiesResult; +``` + + + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $languageHandlersCollection\BumbleDocGen\LanguageHandler\LanguageHandlersCollection-
    $progressBar\BumbleDocGen\Core\Parser\Entity\EntitiesLoaderProgressBarInterface | null-
    + +Return value: \BumbleDocGen\Core\Parser\Entity\CollectionGroupLoadEntitiesResult + + +
    +
    +
    + + + +```php +public function updateAllEntitiesCache(): void; +``` + + + +Parameters: not specified + +Return value: void + + +Throws: + + +
    +
    + + \ No newline at end of file diff --git a/docs/tech/2.parser/reflectionApi/php/classes/ClassConstantEntity.md b/docs/tech/2.parser/reflectionApi/php/classes/ClassConstantEntity.md new file mode 100644 index 00000000..7ec2ffc8 --- /dev/null +++ b/docs/tech/2.parser/reflectionApi/php/classes/ClassConstantEntity.md @@ -0,0 +1,1505 @@ + + BumbleDocGen / Technical description of the project / Parser / Reflection API / Reflection API for PHP / PHP class constant reflection API / ClassConstantEntity
    + +

    + ClassConstantEntity class: +

    + + + + + +```php +namespace BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant; + +class ClassConstantEntity extends \BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity implements \BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityInterface, \BumbleDocGen\Core\Parser\Entity\EntityInterface +``` + +
    Class constant entity
    + + + + + + +

    Initialization methods:

    + +
      +
    1. + __construct +
    2. +
    + +

    Methods:

    + +
      +
    1. + getAbsoluteFileName + - Returns the absolute path to a file if it can be retrieved and if the file is in the project directory
    2. +
    3. + getAst + - Get AST for this entity
    4. +
    5. + getCacheKey +
    6. +
    7. + getCachedEntityDependencies +
    8. +
    9. + getCurrentRootEntity +
    10. +
    11. + getDescription + - Get entity description
    12. +
    13. + getDescriptionLinks + - Get parsed links from description and doc blocks `see` and `link`
    14. +
    15. + getDocBlock + - Get DocBlock for current entity
    16. +
    17. + getDocComment + - Get the doc comment of an entity
    18. +
    19. + getDocCommentEntity + - Link to an entity where docBlock is implemented for this entity
    20. +
    21. + getDocCommentLine + - Get the code line number where the docBlock of the current entity begins
    22. +
    23. + getDocNote + - Get the note annotation value
    24. +
    25. + getEndLine + - Get the line number of the end of a constant's code in a file
    26. +
    27. + getExamples + - Get parsed examples from `examples` doc block
    28. +
    29. + getFileSourceLink +
    30. +
    31. + getFirstExample + - Get first example from `examples` doc block
    32. +
    33. + getImplementingClass + - Get the class like entity in which the current entity was implemented
    34. +
    35. + getImplementingClassName +
    36. +
    37. + getName + - Constant name
    38. +
    39. + getNamespaceName + - Get the name of the namespace where the current class is implemented
    40. +
    41. + getObjectId + - Get entity unique ID
    42. +
    43. + getRelativeFileName + - File name relative to project_root configuration parameter
    44. +
    45. + getRootEntity + - Get the class like entity where this constant was obtained
    46. +
    47. + getRootEntityCollection + - Get the collection of root entities to which this entity belongs
    48. +
    49. + getShortName + - Constant short name
    50. +
    51. + getStartLine + - Get the line number of the beginning of the constant code in a file
    52. +
    53. + getThrows + - Get parsed throws from `throws` doc block
    54. +
    55. + getThrowsDocBlockLinks +
    56. +
    57. + getValue + - Get the compiled value of a constant
    58. +
    59. + hasDescriptionLinks + - Checking if an entity has links in its description
    60. +
    61. + hasExamples + - Checking if an entity has `example` docBlock
    62. +
    63. + hasThrows + - Checking if an entity has `throws` docBlock
    64. +
    65. + isApi + - Checking if an entity has `api` docBlock
    66. +
    67. + isDeprecated + - Checking if an entity has `deprecated` docBlock
    68. +
    69. + isEntityCacheOutdated + - Checking if the entity cache is out of date
    70. +
    71. + isEntityDataCacheOutdated +
    72. +
    73. + isEntityFileCanBeLoad + - Checking if entity data can be retrieved
    74. +
    75. + isInternal + - Checking if an entity has `internal` docBlock
    76. +
    77. + isPrivate + - Check if a constant is a private constant
    78. +
    79. + isProtected + - Check if a constant is a protected constant
    80. +
    81. + isPublic + - Check if a constant is a public constant
    82. +
    83. + reloadEntityDependenciesCache + - Update entity dependency cache
    84. +
    85. + removeEntityValueFromCache +
    86. +
    87. + removeNotUsedEntityDataCache +
    88. +
    + + +

    Constants:

    + + + + + + +

    Method details:

    + +
    + + + +```php +public function __construct(\BumbleDocGen\Core\Configuration\Configuration $configuration, \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity $classEntity, \BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper $parserHelper, \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache $localObjectCache, \Psr\Log\LoggerInterface $logger, string $constantName, string $implementingClassName); +``` + + + +Parameters: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $configuration\BumbleDocGen\Core\Configuration\Configuration-
    $classEntity\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity-
    $parserHelper\BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper-
    $localObjectCache\BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache-
    $logger\Psr\Log\LoggerInterface-
    $constantNamestring-
    $implementingClassNamestring-
    + + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getAbsoluteFileName(): null|string; +``` + +
    Returns the absolute path to a file if it can be retrieved and if the file is in the project directory
    + +Parameters: not specified + +Return value: null | string + + +Throws: + + +
    +
    +
    + + + +```php +public function getAst(): \PhpParser\Node\Stmt\ClassConst; +``` + +
    Get AST for this entity
    + +Parameters: not specified + +Return value: \PhpParser\Node\Stmt\ClassConst + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait + +public function getCacheKey(): string; +``` + + + +Parameters: not specified + +Return value: string + + +
    +
    +
    + +
      +
    • # + getCachedEntityDependencies + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getCachedEntityDependencies(): array; +``` + + + +Parameters: not specified + +Return value: array + + +Throws: + + +
    +
    +
    + +
      +
    • # + getCurrentRootEntity + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getCurrentRootEntity(): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; +``` + + + +Parameters: not specified + +Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDescription(): string; +``` + +
    Get entity description
    + +Parameters: not specified + +Return value: string + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDescriptionLinks(): array; +``` + +
    Get parsed links from description and doc blocks `see` and `link`
    + +Parameters: not specified + +Return value: array + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDocBlock(): \phpDocumentor\Reflection\DocBlock; +``` + +
    Get DocBlock for current entity
    + +Parameters: not specified + +Return value: \phpDocumentor\Reflection\DocBlock + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDocComment(): string; +``` + +
    Get the doc comment of an entity
    + +Parameters: not specified + +Return value: string + + +Throws: + + +
    +
    +
    + +
      +
    • # + getDocCommentEntity + :warning: Is internal | source code
    • +
    + +```php +public function getDocCommentEntity(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity; +``` + +
    Link to an entity where docBlock is implemented for this entity
    + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDocCommentLine(): null|int; +``` + +
    Get the code line number where the docBlock of the current entity begins
    + +Parameters: not specified + +Return value: null | int + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDocNote(): string; +``` + +
    Get the note annotation value
    + +Parameters: not specified + +Return value: string + + +Throws: + + +
    +
    +
    + + + +```php +public function getEndLine(): int; +``` + +
    Get the line number of the end of a constant's code in a file
    + +Parameters: not specified + +Return value: int + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getExamples(): array; +``` + +
    Get parsed examples from `examples` doc block
    + +Parameters: not specified + +Return value: array + + +Throws: + + +
    +
    +
    + +
      +
    • # + getFileSourceLink + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getFileSourceLink(bool $withLine = true): null|string; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $withLinebool-
    + +Return value: null | string + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getFirstExample(): string; +``` + +
    Get first example from `examples` doc block
    + +Parameters: not specified + +Return value: string + + +Throws: + + +
    +
    +
    + + + +```php +public function getImplementingClass(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; +``` + +
    Get the class like entity in which the current entity was implemented
    + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + + +
    +
    +
    + + + +```php +public function getImplementingClassName(): string; +``` + + + +Parameters: not specified + +Return value: string + + +
    +
    +
    + + + +```php +public function getName(): string; +``` + +
    Constant name
    + +Parameters: not specified + +Return value: string + + +
    +
    +
    + + + +```php +public function getNamespaceName(): string; +``` + +
    Get the name of the namespace where the current class is implemented
    + +Parameters: not specified + +Return value: string + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getObjectId(): string; +``` + +
    Get entity unique ID
    + +Parameters: not specified + +Return value: string + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getRelativeFileName(): null|string; +``` + +
    File name relative to project_root configuration parameter
    + +Parameters: not specified + +Return value: null | string + + + +See: + +
    +
    +
    + + + +```php +public function getRootEntity(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; +``` + +
    Get the class like entity where this constant was obtained
    + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + + +
    +
    +
    + + + +```php +public function getRootEntityCollection(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; +``` + +
    Get the collection of root entities to which this entity belongs
    + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection + + +
    +
    +
    + + + +```php +public function getShortName(): string; +``` + +
    Constant short name
    + +Parameters: not specified + +Return value: string + + + +See: + +
    +
    +
    + + + +```php +public function getStartLine(): int; +``` + +
    Get the line number of the beginning of the constant code in a file
    + +Parameters: not specified + +Return value: int + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getThrows(): array; +``` + +
    Get parsed throws from `throws` doc block
    + +Parameters: not specified + +Return value: array + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getThrowsDocBlockLinks(): array; +``` + + + +Parameters: not specified + +Return value: array + + +Throws: + + +
    +
    +
    + + + +```php +public function getValue(): string|array|int|bool|null|float; +``` + +
    Get the compiled value of a constant
    + +Parameters: not specified + +Return value: string | array | int | bool | null | float + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function hasDescriptionLinks(): bool; +``` + +
    Checking if an entity has links in its description
    + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function hasExamples(): bool; +``` + +
    Checking if an entity has `example` docBlock
    + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function hasThrows(): bool; +``` + +
    Checking if an entity has `throws` docBlock
    + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function isApi(): bool; +``` + +
    Checking if an entity has `api` docBlock
    + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function isDeprecated(): bool; +``` + +
    Checking if an entity has `deprecated` docBlock
    + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + +
      +
    • # + isEntityCacheOutdated + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function isEntityCacheOutdated(): bool; +``` + +
    Checking if the entity cache is out of date
    + +Parameters: not specified + +Return value: bool + + +
    +
    +
    + +
      +
    • # + isEntityDataCacheOutdated + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait + +public function isEntityDataCacheOutdated(): bool; +``` + + + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function isEntityFileCanBeLoad(): bool; +``` + +
    Checking if entity data can be retrieved
    + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function isInternal(): bool; +``` + +
    Checking if an entity has `internal` docBlock
    + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +public function isPrivate(): bool; +``` + +
    Check if a constant is a private constant
    + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +public function isProtected(): bool; +``` + +
    Check if a constant is a protected constant
    + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +public function isPublic(): bool; +``` + +
    Check if a constant is a public constant
    + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + +
      +
    • # + reloadEntityDependenciesCache + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function reloadEntityDependenciesCache(): array; +``` + +
    Update entity dependency cache
    + +Parameters: not specified + +Return value: array + + +
    +
    +
    + +
      +
    • # + removeEntityValueFromCache + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait + +public function removeEntityValueFromCache(string $key): void; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $keystring-
    + +Return value: void + + +
    +
    +
    + +
      +
    • # + removeNotUsedEntityDataCache + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait + +public function removeNotUsedEntityDataCache(): void; +``` + + + +Parameters: not specified + +Return value: void + + +Throws: + + +
    +
    + + \ No newline at end of file diff --git a/docs/tech/2.parser/reflectionApi/php/classes/ClassConstantEntity_2.md b/docs/tech/2.parser/reflectionApi/php/classes/ClassConstantEntity_2.md new file mode 100644 index 00000000..c010e147 --- /dev/null +++ b/docs/tech/2.parser/reflectionApi/php/classes/ClassConstantEntity_2.md @@ -0,0 +1,1505 @@ + + BumbleDocGen / Technical description of the project / Parser / Reflection API / Reflection API for PHP / ClassConstantEntity
    + +

    + ClassConstantEntity class: +

    + + + + + +```php +namespace BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant; + +class ClassConstantEntity extends \BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity implements \BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityInterface, \BumbleDocGen\Core\Parser\Entity\EntityInterface +``` + +
    Class constant entity
    + + + + + + +

    Initialization methods:

    + +
      +
    1. + __construct +
    2. +
    + +

    Methods:

    + +
      +
    1. + getAbsoluteFileName + - Returns the absolute path to a file if it can be retrieved and if the file is in the project directory
    2. +
    3. + getAst + - Get AST for this entity
    4. +
    5. + getCacheKey +
    6. +
    7. + getCachedEntityDependencies +
    8. +
    9. + getCurrentRootEntity +
    10. +
    11. + getDescription + - Get entity description
    12. +
    13. + getDescriptionLinks + - Get parsed links from description and doc blocks `see` and `link`
    14. +
    15. + getDocBlock + - Get DocBlock for current entity
    16. +
    17. + getDocComment + - Get the doc comment of an entity
    18. +
    19. + getDocCommentEntity + - Link to an entity where docBlock is implemented for this entity
    20. +
    21. + getDocCommentLine + - Get the code line number where the docBlock of the current entity begins
    22. +
    23. + getDocNote + - Get the note annotation value
    24. +
    25. + getEndLine + - Get the line number of the end of a constant's code in a file
    26. +
    27. + getExamples + - Get parsed examples from `examples` doc block
    28. +
    29. + getFileSourceLink +
    30. +
    31. + getFirstExample + - Get first example from `examples` doc block
    32. +
    33. + getImplementingClass + - Get the class like entity in which the current entity was implemented
    34. +
    35. + getImplementingClassName +
    36. +
    37. + getName + - Constant name
    38. +
    39. + getNamespaceName + - Get the name of the namespace where the current class is implemented
    40. +
    41. + getObjectId + - Get entity unique ID
    42. +
    43. + getRelativeFileName + - File name relative to project_root configuration parameter
    44. +
    45. + getRootEntity + - Get the class like entity where this constant was obtained
    46. +
    47. + getRootEntityCollection + - Get the collection of root entities to which this entity belongs
    48. +
    49. + getShortName + - Constant short name
    50. +
    51. + getStartLine + - Get the line number of the beginning of the constant code in a file
    52. +
    53. + getThrows + - Get parsed throws from `throws` doc block
    54. +
    55. + getThrowsDocBlockLinks +
    56. +
    57. + getValue + - Get the compiled value of a constant
    58. +
    59. + hasDescriptionLinks + - Checking if an entity has links in its description
    60. +
    61. + hasExamples + - Checking if an entity has `example` docBlock
    62. +
    63. + hasThrows + - Checking if an entity has `throws` docBlock
    64. +
    65. + isApi + - Checking if an entity has `api` docBlock
    66. +
    67. + isDeprecated + - Checking if an entity has `deprecated` docBlock
    68. +
    69. + isEntityCacheOutdated + - Checking if the entity cache is out of date
    70. +
    71. + isEntityDataCacheOutdated +
    72. +
    73. + isEntityFileCanBeLoad + - Checking if entity data can be retrieved
    74. +
    75. + isInternal + - Checking if an entity has `internal` docBlock
    76. +
    77. + isPrivate + - Check if a constant is a private constant
    78. +
    79. + isProtected + - Check if a constant is a protected constant
    80. +
    81. + isPublic + - Check if a constant is a public constant
    82. +
    83. + reloadEntityDependenciesCache + - Update entity dependency cache
    84. +
    85. + removeEntityValueFromCache +
    86. +
    87. + removeNotUsedEntityDataCache +
    88. +
    + + +

    Constants:

    + + + + + + +

    Method details:

    + +
    + + + +```php +public function __construct(\BumbleDocGen\Core\Configuration\Configuration $configuration, \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity $classEntity, \BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper $parserHelper, \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache $localObjectCache, \Psr\Log\LoggerInterface $logger, string $constantName, string $implementingClassName); +``` + + + +Parameters: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $configuration\BumbleDocGen\Core\Configuration\Configuration-
    $classEntity\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity-
    $parserHelper\BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper-
    $localObjectCache\BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache-
    $logger\Psr\Log\LoggerInterface-
    $constantNamestring-
    $implementingClassNamestring-
    + + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getAbsoluteFileName(): null|string; +``` + +
    Returns the absolute path to a file if it can be retrieved and if the file is in the project directory
    + +Parameters: not specified + +Return value: null | string + + +Throws: + + +
    +
    +
    + + + +```php +public function getAst(): \PhpParser\Node\Stmt\ClassConst; +``` + +
    Get AST for this entity
    + +Parameters: not specified + +Return value: \PhpParser\Node\Stmt\ClassConst + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait + +public function getCacheKey(): string; +``` + + + +Parameters: not specified + +Return value: string + + +
    +
    +
    + +
      +
    • # + getCachedEntityDependencies + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getCachedEntityDependencies(): array; +``` + + + +Parameters: not specified + +Return value: array + + +Throws: + + +
    +
    +
    + +
      +
    • # + getCurrentRootEntity + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getCurrentRootEntity(): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; +``` + + + +Parameters: not specified + +Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDescription(): string; +``` + +
    Get entity description
    + +Parameters: not specified + +Return value: string + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDescriptionLinks(): array; +``` + +
    Get parsed links from description and doc blocks `see` and `link`
    + +Parameters: not specified + +Return value: array + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDocBlock(): \phpDocumentor\Reflection\DocBlock; +``` + +
    Get DocBlock for current entity
    + +Parameters: not specified + +Return value: \phpDocumentor\Reflection\DocBlock + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDocComment(): string; +``` + +
    Get the doc comment of an entity
    + +Parameters: not specified + +Return value: string + + +Throws: + + +
    +
    +
    + +
      +
    • # + getDocCommentEntity + :warning: Is internal | source code
    • +
    + +```php +public function getDocCommentEntity(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity; +``` + +
    Link to an entity where docBlock is implemented for this entity
    + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDocCommentLine(): null|int; +``` + +
    Get the code line number where the docBlock of the current entity begins
    + +Parameters: not specified + +Return value: null | int + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDocNote(): string; +``` + +
    Get the note annotation value
    + +Parameters: not specified + +Return value: string + + +Throws: + + +
    +
    +
    + + + +```php +public function getEndLine(): int; +``` + +
    Get the line number of the end of a constant's code in a file
    + +Parameters: not specified + +Return value: int + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getExamples(): array; +``` + +
    Get parsed examples from `examples` doc block
    + +Parameters: not specified + +Return value: array + + +Throws: + + +
    +
    +
    + +
      +
    • # + getFileSourceLink + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getFileSourceLink(bool $withLine = true): null|string; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $withLinebool-
    + +Return value: null | string + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getFirstExample(): string; +``` + +
    Get first example from `examples` doc block
    + +Parameters: not specified + +Return value: string + + +Throws: + + +
    +
    +
    + + + +```php +public function getImplementingClass(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; +``` + +
    Get the class like entity in which the current entity was implemented
    + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + + +
    +
    +
    + + + +```php +public function getImplementingClassName(): string; +``` + + + +Parameters: not specified + +Return value: string + + +
    +
    +
    + + + +```php +public function getName(): string; +``` + +
    Constant name
    + +Parameters: not specified + +Return value: string + + +
    +
    +
    + + + +```php +public function getNamespaceName(): string; +``` + +
    Get the name of the namespace where the current class is implemented
    + +Parameters: not specified + +Return value: string + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getObjectId(): string; +``` + +
    Get entity unique ID
    + +Parameters: not specified + +Return value: string + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getRelativeFileName(): null|string; +``` + +
    File name relative to project_root configuration parameter
    + +Parameters: not specified + +Return value: null | string + + + +See: + +
    +
    +
    + + + +```php +public function getRootEntity(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; +``` + +
    Get the class like entity where this constant was obtained
    + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + + +
    +
    +
    + + + +```php +public function getRootEntityCollection(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; +``` + +
    Get the collection of root entities to which this entity belongs
    + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection + + +
    +
    +
    + + + +```php +public function getShortName(): string; +``` + +
    Constant short name
    + +Parameters: not specified + +Return value: string + + + +See: + +
    +
    +
    + + + +```php +public function getStartLine(): int; +``` + +
    Get the line number of the beginning of the constant code in a file
    + +Parameters: not specified + +Return value: int + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getThrows(): array; +``` + +
    Get parsed throws from `throws` doc block
    + +Parameters: not specified + +Return value: array + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getThrowsDocBlockLinks(): array; +``` + + + +Parameters: not specified + +Return value: array + + +Throws: + + +
    +
    +
    + + + +```php +public function getValue(): string|array|int|bool|null|float; +``` + +
    Get the compiled value of a constant
    + +Parameters: not specified + +Return value: string | array | int | bool | null | float + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function hasDescriptionLinks(): bool; +``` + +
    Checking if an entity has links in its description
    + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function hasExamples(): bool; +``` + +
    Checking if an entity has `example` docBlock
    + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function hasThrows(): bool; +``` + +
    Checking if an entity has `throws` docBlock
    + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function isApi(): bool; +``` + +
    Checking if an entity has `api` docBlock
    + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function isDeprecated(): bool; +``` + +
    Checking if an entity has `deprecated` docBlock
    + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + +
      +
    • # + isEntityCacheOutdated + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function isEntityCacheOutdated(): bool; +``` + +
    Checking if the entity cache is out of date
    + +Parameters: not specified + +Return value: bool + + +
    +
    +
    + +
      +
    • # + isEntityDataCacheOutdated + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait + +public function isEntityDataCacheOutdated(): bool; +``` + + + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function isEntityFileCanBeLoad(): bool; +``` + +
    Checking if entity data can be retrieved
    + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function isInternal(): bool; +``` + +
    Checking if an entity has `internal` docBlock
    + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +public function isPrivate(): bool; +``` + +
    Check if a constant is a private constant
    + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +public function isProtected(): bool; +``` + +
    Check if a constant is a protected constant
    + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +public function isPublic(): bool; +``` + +
    Check if a constant is a public constant
    + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + +
      +
    • # + reloadEntityDependenciesCache + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function reloadEntityDependenciesCache(): array; +``` + +
    Update entity dependency cache
    + +Parameters: not specified + +Return value: array + + +
    +
    +
    + +
      +
    • # + removeEntityValueFromCache + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait + +public function removeEntityValueFromCache(string $key): void; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $keystring-
    + +Return value: void + + +
    +
    +
    + +
      +
    • # + removeNotUsedEntityDataCache + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait + +public function removeNotUsedEntityDataCache(): void; +``` + + + +Parameters: not specified + +Return value: void + + +Throws: + + +
    +
    + + \ No newline at end of file diff --git a/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md b/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md new file mode 100644 index 00000000..995114f9 --- /dev/null +++ b/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md @@ -0,0 +1,3466 @@ + + BumbleDocGen / Technical description of the project / Parser / Reflection API / Reflection API for PHP / PHP class reflection API / ClassEntity
    + +

    + ClassEntity class: +

    + + + + + +```php +namespace BumbleDocGen\LanguageHandler\Php\Parser\Entity; + +class ClassEntity extends \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity implements \BumbleDocGen\Core\Renderer\Context\DocumentTransformableEntityInterface, \BumbleDocGen\Core\Parser\Entity\RootEntityInterface, \BumbleDocGen\Core\Parser\Entity\EntityInterface, \BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityInterface +``` + +
    PHP Class
    + +See: + + + + + + + +

    Initialization methods:

    + +
      +
    1. + __construct +
    2. +
    + +

    Methods:

    + +
      +
    1. + addPluginData + - Add information to aт entity object
    2. +
    3. + cursorToDocAttributeLinkFragment +
    4. +
    5. + getAbsoluteFileName + - Returns the absolute path to a file if it can be retrieved and if the file is in the project directory
    6. +
    7. + getAst + - Get AST for this entity
    8. +
    9. + getCacheKey +
    10. +
    11. + getCachedEntityDependencies +
    12. +
    13. + getConstant + - Get the method entity by its name
    14. +
    15. + getConstantEntitiesCollection + - Get a collection of constant entities
    16. +
    17. + getConstantValue + - Get the compiled value of a constant
    18. +
    19. + getConstants + - Get all constants that are available according to the configuration as an array
    20. +
    21. + getConstantsData + - Get a list of all constants and classes where they are implemented
    22. +
    23. + getConstantsValues + - Get class constant compiled values according to filters
    24. +
    25. + getCurrentRootEntity +
    26. +
    27. + getDescription + - Get entity description
    28. +
    29. + getDescriptionLinks + - Get parsed links from description and doc blocks `see` and `link`
    30. +
    31. + getDocBlock + - Get DocBlock for current entity
    32. +
    33. + getDocComment + - Get the doc comment of an entity
    34. +
    35. + getDocCommentEntity + - Link to an entity where docBlock is implemented for this entity
    36. +
    37. + getDocCommentLine + - Get the code line number where the docBlock of the current entity begins
    38. +
    39. + getDocNote + - Get the note annotation value
    40. +
    41. + getDocRender +
    42. +
    43. + getEndLine + - Get the line number of the end of a class code in a file
    44. +
    45. + getEntityDependencies +
    46. +
    47. + getExamples + - Get parsed examples from `examples` doc block
    48. +
    49. + getFileContent +
    50. +
    51. + getFileSourceLink +
    52. +
    53. + getFirstExample + - Get first example from `examples` doc block
    54. +
    55. + getImplementingClass + - Get the class like entity in which the current entity was implemented
    56. +
    57. + getInterfaceNames + - Get a list of class interface names
    58. +
    59. + getInterfacesEntities + - Get a list of interface entities that the current class implements
    60. +
    61. + getMethod + - Get the method entity by its name
    62. +
    63. + getMethodEntitiesCollection + - Get a collection of method entities
    64. +
    65. + getMethods + - Get all methods that are available according to the configuration as an array
    66. +
    67. + getMethodsData + - Get a list of all methods and classes where they are implemented
    68. +
    69. + getModifiersString + - Get entity modifiers as a string
    70. +
    71. + getName + - Full name of the entity
    72. +
    73. + getNamespaceName + - Get the entity namespace name
    74. +
    75. + getObjectId + - Get entity unique ID
    76. +
    77. + getParentClass + - Get the entity of the parent class if it exists
    78. +
    79. + getParentClassEntities + - Get a list of parent class entities
    80. +
    81. + getParentClassName + - Get the name of the parent class entity if it exists
    82. +
    83. + getParentClassNames + - Get a list of entity names of parent classes
    84. +
    85. + getPluginData + - Get additional information added using the plugin
    86. +
    87. + getProperties + - Get all properties that are available according to the configuration as an array
    88. +
    89. + getPropertiesData + - Get a list of all properties and classes where they are implemented
    90. +
    91. + getProperty + - Get the property entity by its name
    92. +
    93. + getPropertyDefaultValue + - Get the compiled value of a property
    94. +
    95. + getPropertyEntitiesCollection + - Get a collection of property entities
    96. +
    97. + getRelativeFileName + - File name relative to project_root configuration parameter
    98. +
    99. + getRootEntityCollection + - Get the collection of root entities to which this entity belongs
    100. +
    101. + getShortName + - Short name of the entity
    102. +
    103. + getStartLine + - Get the line number of the start of a class code in a file
    104. +
    105. + getThrows + - Get parsed throws from `throws` doc block
    106. +
    107. + getThrowsDocBlockLinks +
    108. +
    109. + getTraits + - Get a list of trait entities of the current class
    110. +
    111. + getTraitsNames + - Get a list of class traits names
    112. +
    113. + hasConstant + - Check if a constant exists in a class
    114. +
    115. + hasDescriptionLinks + - Checking if an entity has links in its description
    116. +
    117. + hasExamples + - Checking if an entity has `example` docBlock
    118. +
    119. + hasMethod + - Check if a method exists in a class
    120. +
    121. + hasParentClass + - Check if a certain parent class exists in a chain of parent classes
    122. +
    123. + hasProperty + - Check if a property exists in a class
    124. +
    125. + hasThrows + - Checking if an entity has `throws` docBlock
    126. +
    127. + hasTraits + - Check if the class contains traits
    128. +
    129. + implementsInterface + - Check if a class implements an interface
    130. +
    131. + isAbstract + - Check that an entity is abstract
    132. +
    133. + isApi + - Checking if an entity has `api` docBlock
    134. +
    135. + isAttribute + - Check if a class is an attribute
    136. +
    137. + isClass + - Check if an entity is a Class
    138. +
    139. + isClassLoad +
    140. +
    141. + isDeprecated + - Checking if an entity has `deprecated` docBlock
    142. +
    143. + isDocumentCreationAllowed +
    144. +
    145. + isEntityCacheOutdated + - Checking if the entity cache is out of date
    146. +
    147. + isEntityDataCacheOutdated +
    148. +
    149. + isEntityDataCanBeLoaded +
    150. +
    151. + isEntityFileCanBeLoad + - Checking if entity data can be retrieved
    152. +
    153. + isEntityNameValid + - Check if the name is a valid name for ClassLikeEntity
    154. +
    155. + isEnum + - Check if an entity is an Enum
    156. +
    157. + isExternalLibraryEntity + - Check if a given entity is an entity from a third party library (connected via composer)
    158. +
    159. + isInGit + - Checking if class file is in git repository
    160. +
    161. + isInstantiable + - Check that an entity is instantiable
    162. +
    163. + isInterface + - Check if an entity is an Interface
    164. +
    165. + isInternal + - Checking if an entity has `internal` docBlock
    166. +
    167. + isSubclassOf + - Whether the given class is a subclass of the specified class
    168. +
    169. + isTrait + - Check if an entity is a Trait
    170. +
    171. + normalizeClassName +
    172. +
    173. + reloadEntityDependenciesCache + - Update entity dependency cache
    174. +
    175. + removeEntityValueFromCache +
    176. +
    177. + removeNotUsedEntityDataCache +
    178. +
    179. + setCustomAst +
    180. +
    + + + + + + + +

    Method details:

    + +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function __construct(\BumbleDocGen\Core\Configuration\Configuration $configuration, \BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings $phpHandlerSettings, \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection $entitiesCollection, \BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper $parserHelper, \BumbleDocGen\LanguageHandler\Php\Parser\ComposerHelper $composerHelper, \BumbleDocGen\LanguageHandler\Php\Parser\PhpParser\PhpParserHelper $phpParserHelper, \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache $localObjectCache, \Psr\Log\LoggerInterface $logger, string $className, string|null $relativeFileName); +``` + + + +Parameters: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $configuration\BumbleDocGen\Core\Configuration\Configuration-
    $phpHandlerSettings\BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings-
    $entitiesCollection\BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection-
    $parserHelper\BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper-
    $composerHelper\BumbleDocGen\LanguageHandler\Php\Parser\ComposerHelper-
    $phpParserHelper\BumbleDocGen\LanguageHandler\Php\Parser\PhpParser\PhpParserHelper-
    $localObjectCache\BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache-
    $logger\Psr\Log\LoggerInterface-
    $classNamestring-
    $relativeFileNamestring | null-
    + + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function addPluginData(string $pluginKey, mixed $data): void; +``` + +
    Add information to aт entity object
    + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $pluginKeystring-
    $datamixed-
    + +Return value: void + + +
    +
    +
    + +
      +
    • # + cursorToDocAttributeLinkFragment + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function cursorToDocAttributeLinkFragment(string $cursor, bool $isForDocument = true): string; +``` + + + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $cursorstring-
    $isForDocumentbool-
    + +Return value: string + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getAbsoluteFileName(): null|string; +``` + +
    Returns the absolute path to a file if it can be retrieved and if the file is in the project directory
    + +Parameters: not specified + +Return value: null | string + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getAst(): \PhpParser\Node\Stmt\Class_|\PhpParser\Node\Stmt\Interface_|\PhpParser\Node\Stmt\Trait_|\PhpParser\Node\Stmt\Enum_; +``` + +
    Get AST for this entity
    + +Parameters: not specified + +Return value: \PhpParser\Node\Stmt\Class_ | \PhpParser\Node\Stmt\Interface_ | \PhpParser\Node\Stmt\Trait_ | \PhpParser\Node\Stmt\Enum_ + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait + +public function getCacheKey(): string; +``` + + + +Parameters: not specified + +Return value: string + + +
    +
    +
    + +
      +
    • # + getCachedEntityDependencies + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getCachedEntityDependencies(): array; +``` + + + +Parameters: not specified + +Return value: array + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getConstant(string $constantName, bool $unsafe = false): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity; +``` + +
    Get the method entity by its name
    + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $constantNamestringThe name of the constant whose entity you want to get
    $unsafeboolCheck all constants, not just the constants allowed in the configuration (@see PhpHandlerSettings::getClassConstantEntityFilter())
    + +Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getConstantEntitiesCollection(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntitiesCollection; +``` + +
    Get a collection of constant entities
    + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntitiesCollection + + +Throws: + + + +See: + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getConstantValue(string $constantName): string|array|int|bool|null|float; +``` + +
    Get the compiled value of a constant
    + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $constantNamestringThe name of the constant for which you need to get the value
    + +Return value: string | array | int | bool | null | float + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getConstants(): array; +``` + +
    Get all constants that are available according to the configuration as an array
    + +Parameters: not specified + +Return value: array + + +Throws: + + + +See: + +
    +
    +
    + +
      +
    • # + getConstantsData + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getConstantsData(bool $onlyFromCurrentClassAndTraits = false, int $flags = \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity::VISIBILITY_MODIFIERS_FLAG_ANY): array; +``` + +
    Get a list of all constants and classes where they are implemented
    + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $onlyFromCurrentClassAndTraitsboolGet data only for constants from the current class
    $flagsintGet data only for constants corresponding to the visibility modifiers passed in this value
    + +Return value: array + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getConstantsValues(bool $onlyFromCurrentClassAndTraits = false, int $flags = \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity::VISIBILITY_MODIFIERS_FLAG_ANY): array; +``` + +
    Get class constant compiled values according to filters
    + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $onlyFromCurrentClassAndTraitsboolGet values only for constants from the current class
    $flagsintGet values only for constants corresponding to the visibility modifiers passed in this value
    + +Return value: array + + +Throws: + + +
    +
    +
    + +
      +
    • # + getCurrentRootEntity + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getCurrentRootEntity(): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; +``` + + + +Parameters: not specified + +Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDescription(): string; +``` + +
    Get entity description
    + +Parameters: not specified + +Return value: string + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDescriptionLinks(): array; +``` + +
    Get parsed links from description and doc blocks `see` and `link`
    + +Parameters: not specified + +Return value: array + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDocBlock(): \phpDocumentor\Reflection\DocBlock; +``` + +
    Get DocBlock for current entity
    + +Parameters: not specified + +Return value: \phpDocumentor\Reflection\DocBlock + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDocComment(): string; +``` + +
    Get the doc comment of an entity
    + +Parameters: not specified + +Return value: string + + +Throws: + + +
    +
    +
    + +
      +
    • # + getDocCommentEntity + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getDocCommentEntity(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; +``` + +
    Link to an entity where docBlock is implemented for this entity
    + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDocCommentLine(): null|int; +``` + +
    Get the code line number where the docBlock of the current entity begins
    + +Parameters: not specified + +Return value: null | int + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDocNote(): string; +``` + +
    Get the note annotation value
    + +Parameters: not specified + +Return value: string + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getDocRender(): \BumbleDocGen\Core\Renderer\EntityDocRenderer\EntityDocRendererInterface; +``` + + + +Parameters: not specified + +Return value: \BumbleDocGen\Core\Renderer\EntityDocRenderer\EntityDocRendererInterface + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getEndLine(): int; +``` + +
    Get the line number of the end of a class code in a file
    + +Parameters: not specified + +Return value: int + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getEntityDependencies(): array; +``` + + + +Parameters: not specified + +Return value: array + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getExamples(): array; +``` + +
    Get parsed examples from `examples` doc block
    + +Parameters: not specified + +Return value: array + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getFileContent(): string; +``` + + + +Parameters: not specified + +Return value: string + + +Throws: + + +
    +
    +
    + +
      +
    • # + getFileSourceLink + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getFileSourceLink(bool $withLine = true): null|string; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $withLinebool-
    + +Return value: null | string + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getFirstExample(): string; +``` + +
    Get first example from `examples` doc block
    + +Parameters: not specified + +Return value: string + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getImplementingClass(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; +``` + +
    Get the class like entity in which the current entity was implemented
    + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getInterfaceNames(): array; +``` + +
    Get a list of class interface names
    + +Parameters: not specified + +Return value: array + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getInterfacesEntities(): array; +``` + +
    Get a list of interface entities that the current class implements
    + +Parameters: not specified + +Return value: array + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getMethod(string $methodName, bool $unsafe = false): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntity; +``` + +
    Get the method entity by its name
    + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $methodNamestringThe name of the method whose entity you want to get
    $unsafeboolCheck all methods, not just the methods allowed in the configuration (@see PhpHandlerSettings::getMethodEntityFilter())
    + +Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntity + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getMethodEntitiesCollection(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntitiesCollection; +``` + +
    Get a collection of method entities
    + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntitiesCollection + + +Throws: + + + +See: + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getMethods(): array; +``` + +
    Get all methods that are available according to the configuration as an array
    + +Parameters: not specified + +Return value: array + + +Throws: + + + +See: + +
    +
    +
    + +
      +
    • # + getMethodsData + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getMethodsData(bool $onlyFromCurrentClassAndTraits = false, int $flags = \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntity::VISIBILITY_MODIFIERS_FLAG_ANY): array; +``` + +
    Get a list of all methods and classes where they are implemented
    + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $onlyFromCurrentClassAndTraitsboolGet data only for methods from the current class
    $flagsintGet data only for methods corresponding to the visibility modifiers passed in this value
    + +Return value: array + + +Throws: + + +
    +
    +
    + + + +```php +public function getModifiersString(): string; +``` + +
    Get entity modifiers as a string
    + +Parameters: not specified + +Return value: string + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getName(): string; +``` + +
    Full name of the entity
    + +Parameters: not specified + +Return value: string + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getNamespaceName(): string; +``` + +
    Get the entity namespace name
    + +Parameters: not specified + +Return value: string + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getObjectId(): string; +``` + +
    Get entity unique ID
    + +Parameters: not specified + +Return value: string + + +
    +
    +
    + + + +```php +public function getParentClass(): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; +``` + +
    Get the entity of the parent class if it exists
    + +Parameters: not specified + +Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getParentClassEntities(): array; +``` + +
    Get a list of parent class entities
    + +Parameters: not specified + +Return value: array + + +
    +
    +
    + + + +```php +public function getParentClassName(): null|string; +``` + +
    Get the name of the parent class entity if it exists
    + +Parameters: not specified + +Return value: null | string + + +
    +
    +
    + + + +```php +public function getParentClassNames(): array; +``` + +
    Get a list of entity names of parent classes
    + +Parameters: not specified + +Return value: array + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getPluginData(string $pluginKey): mixed; +``` + +
    Get additional information added using the plugin
    + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $pluginKeystring-
    + +Return value: mixed + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getProperties(): array; +``` + +
    Get all properties that are available according to the configuration as an array
    + +Parameters: not specified + +Return value: array + + +Throws: + + + +See: + +
    +
    +
    + +
      +
    • # + getPropertiesData + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getPropertiesData(bool $onlyFromCurrentClassAndTraits = false, int $flags = \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntity::VISIBILITY_MODIFIERS_FLAG_ANY): array; +``` + +
    Get a list of all properties and classes where they are implemented
    + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $onlyFromCurrentClassAndTraitsboolGet data only for properties from the current class
    $flagsintGet data only for properties corresponding to the visibility modifiers passed in this value
    + +Return value: array + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getProperty(string $propertyName, bool $unsafe = false): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntity; +``` + +
    Get the property entity by its name
    + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $propertyNamestringThe name of the property whose entity you want to get
    $unsafeboolCheck all properties, not just the properties allowed in the configuration (@see PhpHandlerSettings::getPropertyEntityFilter())
    + +Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntity + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getPropertyDefaultValue(string $propertyName): string|array|int|bool|null|float; +``` + +
    Get the compiled value of a property
    + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $propertyNamestringThe name of the property for which you need to get the value
    + +Return value: string | array | int | bool | null | float + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getPropertyEntitiesCollection(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntitiesCollection; +``` + +
    Get a collection of property entities
    + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntitiesCollection + + +Throws: + + + +See: + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getRelativeFileName(): null|string; +``` + +
    File name relative to project_root configuration parameter
    + +Parameters: not specified + +Return value: null | string + + + +See: + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getRootEntityCollection(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; +``` + +
    Get the collection of root entities to which this entity belongs
    + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getShortName(): string; +``` + +
    Short name of the entity
    + +Parameters: not specified + +Return value: string + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getStartLine(): int; +``` + +
    Get the line number of the start of a class code in a file
    + +Parameters: not specified + +Return value: int + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getThrows(): array; +``` + +
    Get parsed throws from `throws` doc block
    + +Parameters: not specified + +Return value: array + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getThrowsDocBlockLinks(): array; +``` + + + +Parameters: not specified + +Return value: array + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getTraits(): array; +``` + +
    Get a list of trait entities of the current class
    + +Parameters: not specified + +Return value: array + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getTraitsNames(): array; +``` + +
    Get a list of class traits names
    + +Parameters: not specified + +Return value: array + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function hasConstant(string $constantName, bool $unsafe = false): bool; +``` + +
    Check if a constant exists in a class
    + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $constantNamestringThe name of the class whose entity you want to check
    $unsafeboolCheck all constants, not just the constants allowed in the configuration (@see PhpHandlerSettings::getClassConstantEntityFilter())
    + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function hasDescriptionLinks(): bool; +``` + +
    Checking if an entity has links in its description
    + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function hasExamples(): bool; +``` + +
    Checking if an entity has `example` docBlock
    + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function hasMethod(string $methodName, bool $unsafe = false): bool; +``` + +
    Check if a method exists in a class
    + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $methodNamestringThe name of the method whose entity you want to check
    $unsafeboolCheck all methods, not just the methods allowed in the configuration (@see PhpHandlerSettings::getMethodEntityFilter())
    + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function hasParentClass(string $parentClassName): bool; +``` + +
    Check if a certain parent class exists in a chain of parent classes
    + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $parentClassNamestringSearched parent class
    + +Return value: bool + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function hasProperty(string $propertyName, bool $unsafe = false): bool; +``` + +
    Check if a property exists in a class
    + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $propertyNamestringThe name of the property whose entity you want to check
    $unsafeboolCheck all properties, not just the properties allowed in the configuration (@see PhpHandlerSettings::getPropertyEntityFilter())
    + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function hasThrows(): bool; +``` + +
    Checking if an entity has `throws` docBlock
    + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function hasTraits(): bool; +``` + +
    Check if the class contains traits
    + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function implementsInterface(string $interfaceName): bool; +``` + +
    Check if a class implements an interface
    + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $interfaceNamestringName of the required interface in the interface chain
    + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +public function isAbstract(): bool; +``` + +
    Check that an entity is abstract
    + +Parameters: not specified + +Return value: bool + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function isApi(): bool; +``` + +
    Checking if an entity has `api` docBlock
    + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +public function isAttribute(): bool; +``` + +
    Check if a class is an attribute
    + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +public function isClass(): bool; +``` + +
    Check if an entity is a Class
    + +Parameters: not specified + +Return value: bool + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function isClassLoad(): bool; +``` + + + +Parameters: not specified + +Return value: bool + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function isDeprecated(): bool; +``` + +
    Checking if an entity has `deprecated` docBlock
    + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + +
      +
    • # + isDocumentCreationAllowed + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function isDocumentCreationAllowed(): bool; +``` + + + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + +
      +
    • # + isEntityCacheOutdated + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function isEntityCacheOutdated(): bool; +``` + +
    Checking if the entity cache is out of date
    + +Parameters: not specified + +Return value: bool + + +
    +
    +
    + +
      +
    • # + isEntityDataCacheOutdated + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait + +public function isEntityDataCacheOutdated(): bool; +``` + + + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function isEntityDataCanBeLoaded(): bool; +``` + + + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function isEntityFileCanBeLoad(): bool; +``` + +
    Checking if entity data can be retrieved
    + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public static function isEntityNameValid(string $entityName): bool; +``` + +
    Check if the name is a valid name for ClassLikeEntity
    + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $entityNamestring-
    + +Return value: bool + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function isEnum(): bool; +``` + +
    Check if an entity is an Enum
    + +Parameters: not specified + +Return value: bool + + +
    +
    +
    + +
      +
    • # + isExternalLibraryEntity + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function isExternalLibraryEntity(): bool; +``` + +
    Check if a given entity is an entity from a third party library (connected via composer)
    + +Parameters: not specified + +Return value: bool + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function isInGit(): bool; +``` + +
    Checking if class file is in git repository
    + +Parameters: not specified + +Return value: bool + + +
    +
    +
    + + + +```php +public function isInstantiable(): bool; +``` + +
    Check that an entity is instantiable
    + +Parameters: not specified + +Return value: bool + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function isInterface(): bool; +``` + +
    Check if an entity is an Interface
    + +Parameters: not specified + +Return value: bool + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function isInternal(): bool; +``` + +
    Checking if an entity has `internal` docBlock
    + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function isSubclassOf(string $className): bool; +``` + +
    Whether the given class is a subclass of the specified class
    + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $classNamestring-
    + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function isTrait(): bool; +``` + +
    Check if an entity is a Trait
    + +Parameters: not specified + +Return value: bool + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public static function normalizeClassName(string $name): string; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $namestring-
    + +Return value: string + + +
    +
    +
    + +
      +
    • # + reloadEntityDependenciesCache + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function reloadEntityDependenciesCache(): array; +``` + +
    Update entity dependency cache
    + +Parameters: not specified + +Return value: array + + +
    +
    +
    + +
      +
    • # + removeEntityValueFromCache + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait + +public function removeEntityValueFromCache(string $key): void; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $keystring-
    + +Return value: void + + +
    +
    +
    + +
      +
    • # + removeNotUsedEntityDataCache + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait + +public function removeNotUsedEntityDataCache(): void; +``` + + + +Parameters: not specified + +Return value: void + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function setCustomAst(\PhpParser\Node\Stmt\Trait_|\PhpParser\Node\Stmt\Enum_|\PhpParser\Node\Stmt\Interface_|\PhpParser\Node\Stmt\Class_|null $customAst): void; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $customAst\PhpParser\Node\Stmt\Trait_ | \PhpParser\Node\Stmt\Enum_ | \PhpParser\Node\Stmt\Interface_ | \PhpParser\Node\Stmt\Class_ | null-
    + +Return value: void + + +
    +
    + + \ No newline at end of file diff --git a/docs/tech/2.parser/reflectionApi/php/classes/ClassLikeEntity.md b/docs/tech/2.parser/reflectionApi/php/classes/ClassLikeEntity.md new file mode 100644 index 00000000..2688e1dd --- /dev/null +++ b/docs/tech/2.parser/reflectionApi/php/classes/ClassLikeEntity.md @@ -0,0 +1,3317 @@ + + BumbleDocGen / Technical description of the project / Parser / Reflection API / Reflection API for PHP / PHP trait reflection API / ClassLikeEntity
    + +

    + ClassLikeEntity class: +

    + + + + + +```php +namespace BumbleDocGen\LanguageHandler\Php\Parser\Entity; + +abstract class ClassLikeEntity extends \BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity implements \BumbleDocGen\Core\Renderer\Context\DocumentTransformableEntityInterface, \BumbleDocGen\Core\Parser\Entity\RootEntityInterface, \BumbleDocGen\Core\Parser\Entity\EntityInterface, \BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityInterface +``` + + + + + + + + +

    Initialization methods:

    + +
      +
    1. + __construct +
    2. +
    + +

    Methods:

    + +
      +
    1. + addPluginData + - Add information to aт entity object
    2. +
    3. + cursorToDocAttributeLinkFragment +
    4. +
    5. + getAbsoluteFileName + - Returns the absolute path to a file if it can be retrieved and if the file is in the project directory
    6. +
    7. + getAst + - Get AST for this entity
    8. +
    9. + getCacheKey +
    10. +
    11. + getCachedEntityDependencies +
    12. +
    13. + getConstant + - Get the method entity by its name
    14. +
    15. + getConstantEntitiesCollection + - Get a collection of constant entities
    16. +
    17. + getConstantValue + - Get the compiled value of a constant
    18. +
    19. + getConstants + - Get all constants that are available according to the configuration as an array
    20. +
    21. + getConstantsData + - Get a list of all constants and classes where they are implemented
    22. +
    23. + getConstantsValues + - Get class constant compiled values according to filters
    24. +
    25. + getCurrentRootEntity +
    26. +
    27. + getDescription + - Get entity description
    28. +
    29. + getDescriptionLinks + - Get parsed links from description and doc blocks `see` and `link`
    30. +
    31. + getDocBlock + - Get DocBlock for current entity
    32. +
    33. + getDocComment + - Get the doc comment of an entity
    34. +
    35. + getDocCommentEntity + - Link to an entity where docBlock is implemented for this entity
    36. +
    37. + getDocCommentLine + - Get the code line number where the docBlock of the current entity begins
    38. +
    39. + getDocNote + - Get the note annotation value
    40. +
    41. + getDocRender +
    42. +
    43. + getEndLine + - Get the line number of the end of a class code in a file
    44. +
    45. + getEntityDependencies +
    46. +
    47. + getExamples + - Get parsed examples from `examples` doc block
    48. +
    49. + getFileContent +
    50. +
    51. + getFileSourceLink +
    52. +
    53. + getFirstExample + - Get first example from `examples` doc block
    54. +
    55. + getImplementingClass + - Get the class like entity in which the current entity was implemented
    56. +
    57. + getInterfaceNames + - Get a list of class interface names
    58. +
    59. + getInterfacesEntities + - Get a list of interface entities that the current class implements
    60. +
    61. + getMethod + - Get the method entity by its name
    62. +
    63. + getMethodEntitiesCollection + - Get a collection of method entities
    64. +
    65. + getMethods + - Get all methods that are available according to the configuration as an array
    66. +
    67. + getMethodsData + - Get a list of all methods and classes where they are implemented
    68. +
    69. + getModifiersString + - Get entity modifiers as a string
    70. +
    71. + getName + - Full name of the entity
    72. +
    73. + getNamespaceName + - Get the entity namespace name
    74. +
    75. + getObjectId + - Get entity unique ID
    76. +
    77. + getParentClass + - Get the entity of the parent class if it exists
    78. +
    79. + getParentClassEntities + - Get a list of parent class entities
    80. +
    81. + getParentClassName + - Get the name of the parent class entity if it exists
    82. +
    83. + getParentClassNames + - Get a list of entity names of parent classes
    84. +
    85. + getPluginData + - Get additional information added using the plugin
    86. +
    87. + getProperties + - Get all properties that are available according to the configuration as an array
    88. +
    89. + getPropertiesData + - Get a list of all properties and classes where they are implemented
    90. +
    91. + getProperty + - Get the property entity by its name
    92. +
    93. + getPropertyDefaultValue + - Get the compiled value of a property
    94. +
    95. + getPropertyEntitiesCollection + - Get a collection of property entities
    96. +
    97. + getRelativeFileName + - File name relative to project_root configuration parameter
    98. +
    99. + getRootEntityCollection + - Get the collection of root entities to which this entity belongs
    100. +
    101. + getShortName + - Short name of the entity
    102. +
    103. + getStartLine + - Get the line number of the start of a class code in a file
    104. +
    105. + getThrows + - Get parsed throws from `throws` doc block
    106. +
    107. + getThrowsDocBlockLinks +
    108. +
    109. + getTraits + - Get a list of trait entities of the current class
    110. +
    111. + getTraitsNames + - Get a list of class traits names
    112. +
    113. + hasConstant + - Check if a constant exists in a class
    114. +
    115. + hasDescriptionLinks + - Checking if an entity has links in its description
    116. +
    117. + hasExamples + - Checking if an entity has `example` docBlock
    118. +
    119. + hasMethod + - Check if a method exists in a class
    120. +
    121. + hasParentClass + - Check if a certain parent class exists in a chain of parent classes
    122. +
    123. + hasProperty + - Check if a property exists in a class
    124. +
    125. + hasThrows + - Checking if an entity has `throws` docBlock
    126. +
    127. + hasTraits + - Check if the class contains traits
    128. +
    129. + implementsInterface + - Check if a class implements an interface
    130. +
    131. + isAbstract + - Check that an entity is abstract
    132. +
    133. + isApi + - Checking if an entity has `api` docBlock
    134. +
    135. + isClass + - Check if an entity is a Class
    136. +
    137. + isClassLoad +
    138. +
    139. + isDeprecated + - Checking if an entity has `deprecated` docBlock
    140. +
    141. + isDocumentCreationAllowed +
    142. +
    143. + isEntityCacheOutdated + - Checking if the entity cache is out of date
    144. +
    145. + isEntityDataCacheOutdated +
    146. +
    147. + isEntityDataCanBeLoaded +
    148. +
    149. + isEntityFileCanBeLoad + - Checking if entity data can be retrieved
    150. +
    151. + isEntityNameValid + - Check if the name is a valid name for ClassLikeEntity
    152. +
    153. + isEnum + - Check if an entity is an Enum
    154. +
    155. + isExternalLibraryEntity + - Check if a given entity is an entity from a third party library (connected via composer)
    156. +
    157. + isInGit + - Checking if class file is in git repository
    158. +
    159. + isInstantiable + - Check that an entity is instantiable
    160. +
    161. + isInterface + - Check if an entity is an Interface
    162. +
    163. + isInternal + - Checking if an entity has `internal` docBlock
    164. +
    165. + isSubclassOf + - Whether the given class is a subclass of the specified class
    166. +
    167. + isTrait + - Check if an entity is a Trait
    168. +
    169. + normalizeClassName +
    170. +
    171. + reloadEntityDependenciesCache + - Update entity dependency cache
    172. +
    173. + removeEntityValueFromCache +
    174. +
    175. + removeNotUsedEntityDataCache +
    176. +
    177. + setCustomAst +
    178. +
    + + + + + + + +

    Method details:

    + +
    + + + +```php +public function __construct(\BumbleDocGen\Core\Configuration\Configuration $configuration, \BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings $phpHandlerSettings, \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection $entitiesCollection, \BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper $parserHelper, \BumbleDocGen\LanguageHandler\Php\Parser\ComposerHelper $composerHelper, \BumbleDocGen\LanguageHandler\Php\Parser\PhpParser\PhpParserHelper $phpParserHelper, \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache $localObjectCache, \Psr\Log\LoggerInterface $logger, string $className, string|null $relativeFileName); +``` + + + +Parameters: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $configuration\BumbleDocGen\Core\Configuration\Configuration-
    $phpHandlerSettings\BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings-
    $entitiesCollection\BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection-
    $parserHelper\BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper-
    $composerHelper\BumbleDocGen\LanguageHandler\Php\Parser\ComposerHelper-
    $phpParserHelper\BumbleDocGen\LanguageHandler\Php\Parser\PhpParser\PhpParserHelper-
    $localObjectCache\BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache-
    $logger\Psr\Log\LoggerInterface-
    $classNamestring-
    $relativeFileNamestring | null-
    + + + +
    +
    +
    + + + +```php +public function addPluginData(string $pluginKey, mixed $data): void; +``` + +
    Add information to aт entity object
    + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $pluginKeystring-
    $datamixed-
    + +Return value: void + + +
    +
    +
    + +
      +
    • # + cursorToDocAttributeLinkFragment + :warning: Is internal | source code
    • +
    + +```php +public function cursorToDocAttributeLinkFragment(string $cursor, bool $isForDocument = true): string; +``` + + + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $cursorstring-
    $isForDocumentbool-
    + +Return value: string + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getAbsoluteFileName(): null|string; +``` + +
    Returns the absolute path to a file if it can be retrieved and if the file is in the project directory
    + +Parameters: not specified + +Return value: null | string + + +Throws: + + +
    +
    +
    + + + +```php +public function getAst(): \PhpParser\Node\Stmt\Class_|\PhpParser\Node\Stmt\Interface_|\PhpParser\Node\Stmt\Trait_|\PhpParser\Node\Stmt\Enum_; +``` + +
    Get AST for this entity
    + +Parameters: not specified + +Return value: \PhpParser\Node\Stmt\Class_ | \PhpParser\Node\Stmt\Interface_ | \PhpParser\Node\Stmt\Trait_ | \PhpParser\Node\Stmt\Enum_ + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait + +public function getCacheKey(): string; +``` + + + +Parameters: not specified + +Return value: string + + +
    +
    +
    + +
      +
    • # + getCachedEntityDependencies + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getCachedEntityDependencies(): array; +``` + + + +Parameters: not specified + +Return value: array + + +Throws: + + +
    +
    +
    + + + +```php +public function getConstant(string $constantName, bool $unsafe = false): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity; +``` + +
    Get the method entity by its name
    + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $constantNamestringThe name of the constant whose entity you want to get
    $unsafeboolCheck all constants, not just the constants allowed in the configuration (@see PhpHandlerSettings::getClassConstantEntityFilter())
    + +Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity + + +Throws: + + +
    +
    +
    + + + +```php +public function getConstantEntitiesCollection(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntitiesCollection; +``` + +
    Get a collection of constant entities
    + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntitiesCollection + + +Throws: + + + +See: + +
    +
    +
    + + + +```php +public function getConstantValue(string $constantName): string|array|int|bool|null|float; +``` + +
    Get the compiled value of a constant
    + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $constantNamestringThe name of the constant for which you need to get the value
    + +Return value: string | array | int | bool | null | float + + +Throws: + + +
    +
    +
    + + + +```php +public function getConstants(): array; +``` + +
    Get all constants that are available according to the configuration as an array
    + +Parameters: not specified + +Return value: array + + +Throws: + + + +See: + +
    +
    +
    + +
      +
    • # + getConstantsData + :warning: Is internal | source code
    • +
    + +```php +public function getConstantsData(bool $onlyFromCurrentClassAndTraits = false, int $flags = \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity::VISIBILITY_MODIFIERS_FLAG_ANY): array; +``` + +
    Get a list of all constants and classes where they are implemented
    + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $onlyFromCurrentClassAndTraitsboolGet data only for constants from the current class
    $flagsintGet data only for constants corresponding to the visibility modifiers passed in this value
    + +Return value: array + + +Throws: + + +
    +
    +
    + + + +```php +public function getConstantsValues(bool $onlyFromCurrentClassAndTraits = false, int $flags = \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity::VISIBILITY_MODIFIERS_FLAG_ANY): array; +``` + +
    Get class constant compiled values according to filters
    + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $onlyFromCurrentClassAndTraitsboolGet values only for constants from the current class
    $flagsintGet values only for constants corresponding to the visibility modifiers passed in this value
    + +Return value: array + + +Throws: + + +
    +
    +
    + +
      +
    • # + getCurrentRootEntity + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getCurrentRootEntity(): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; +``` + + + +Parameters: not specified + +Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDescription(): string; +``` + +
    Get entity description
    + +Parameters: not specified + +Return value: string + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDescriptionLinks(): array; +``` + +
    Get parsed links from description and doc blocks `see` and `link`
    + +Parameters: not specified + +Return value: array + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDocBlock(): \phpDocumentor\Reflection\DocBlock; +``` + +
    Get DocBlock for current entity
    + +Parameters: not specified + +Return value: \phpDocumentor\Reflection\DocBlock + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDocComment(): string; +``` + +
    Get the doc comment of an entity
    + +Parameters: not specified + +Return value: string + + +Throws: + + +
    +
    +
    + +
      +
    • # + getDocCommentEntity + :warning: Is internal | source code
    • +
    + +```php +public function getDocCommentEntity(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; +``` + +
    Link to an entity where docBlock is implemented for this entity
    + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDocCommentLine(): null|int; +``` + +
    Get the code line number where the docBlock of the current entity begins
    + +Parameters: not specified + +Return value: null | int + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDocNote(): string; +``` + +
    Get the note annotation value
    + +Parameters: not specified + +Return value: string + + +Throws: + + +
    +
    +
    + + + +```php +public function getDocRender(): \BumbleDocGen\Core\Renderer\EntityDocRenderer\EntityDocRendererInterface; +``` + + + +Parameters: not specified + +Return value: \BumbleDocGen\Core\Renderer\EntityDocRenderer\EntityDocRendererInterface + + +Throws: + + +
    +
    +
    + + + +```php +public function getEndLine(): int; +``` + +
    Get the line number of the end of a class code in a file
    + +Parameters: not specified + +Return value: int + + +Throws: + + +
    +
    +
    + + + +```php +public function getEntityDependencies(): array; +``` + + + +Parameters: not specified + +Return value: array + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getExamples(): array; +``` + +
    Get parsed examples from `examples` doc block
    + +Parameters: not specified + +Return value: array + + +Throws: + + +
    +
    +
    + + + +```php +public function getFileContent(): string; +``` + + + +Parameters: not specified + +Return value: string + + +Throws: + + +
    +
    +
    + +
      +
    • # + getFileSourceLink + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getFileSourceLink(bool $withLine = true): null|string; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $withLinebool-
    + +Return value: null | string + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getFirstExample(): string; +``` + +
    Get first example from `examples` doc block
    + +Parameters: not specified + +Return value: string + + +Throws: + + +
    +
    +
    + + + +```php +public function getImplementingClass(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; +``` + +
    Get the class like entity in which the current entity was implemented
    + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + + +
    +
    +
    + + + +```php +public function getInterfaceNames(): array; +``` + +
    Get a list of class interface names
    + +Parameters: not specified + +Return value: array + + +Throws: + + +
    +
    +
    + + + +```php +public function getInterfacesEntities(): array; +``` + +
    Get a list of interface entities that the current class implements
    + +Parameters: not specified + +Return value: array + + +Throws: + + +
    +
    +
    + + + +```php +public function getMethod(string $methodName, bool $unsafe = false): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntity; +``` + +
    Get the method entity by its name
    + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $methodNamestringThe name of the method whose entity you want to get
    $unsafeboolCheck all methods, not just the methods allowed in the configuration (@see PhpHandlerSettings::getMethodEntityFilter())
    + +Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntity + + +Throws: + + +
    +
    +
    + + + +```php +public function getMethodEntitiesCollection(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntitiesCollection; +``` + +
    Get a collection of method entities
    + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntitiesCollection + + +Throws: + + + +See: + +
    +
    +
    + + + +```php +public function getMethods(): array; +``` + +
    Get all methods that are available according to the configuration as an array
    + +Parameters: not specified + +Return value: array + + +Throws: + + + +See: + +
    +
    +
    + +
      +
    • # + getMethodsData + :warning: Is internal | source code
    • +
    + +```php +public function getMethodsData(bool $onlyFromCurrentClassAndTraits = false, int $flags = \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntity::VISIBILITY_MODIFIERS_FLAG_ANY): array; +``` + +
    Get a list of all methods and classes where they are implemented
    + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $onlyFromCurrentClassAndTraitsboolGet data only for methods from the current class
    $flagsintGet data only for methods corresponding to the visibility modifiers passed in this value
    + +Return value: array + + +Throws: + + +
    +
    +
    + + + +```php +public function getModifiersString(): string; +``` + +
    Get entity modifiers as a string
    + +Parameters: not specified + +Return value: string + + +
    +
    +
    + + + +```php +public function getName(): string; +``` + +
    Full name of the entity
    + +Parameters: not specified + +Return value: string + + +
    +
    +
    + + + +```php +public function getNamespaceName(): string; +``` + +
    Get the entity namespace name
    + +Parameters: not specified + +Return value: string + + +
    +
    +
    + + + +```php +public function getObjectId(): string; +``` + +
    Get entity unique ID
    + +Parameters: not specified + +Return value: string + + +
    +
    +
    + + + +```php +public function getParentClass(): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; +``` + +
    Get the entity of the parent class if it exists
    + +Parameters: not specified + +Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + + +
    +
    +
    + + + +```php +public function getParentClassEntities(): array; +``` + +
    Get a list of parent class entities
    + +Parameters: not specified + +Return value: array + + +
    +
    +
    + + + +```php +public function getParentClassName(): null|string; +``` + +
    Get the name of the parent class entity if it exists
    + +Parameters: not specified + +Return value: null | string + + +
    +
    +
    + + + +```php +public function getParentClassNames(): array; +``` + +
    Get a list of entity names of parent classes
    + +Parameters: not specified + +Return value: array + + +
    +
    +
    + + + +```php +public function getPluginData(string $pluginKey): mixed; +``` + +
    Get additional information added using the plugin
    + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $pluginKeystring-
    + +Return value: mixed + + +
    +
    +
    + + + +```php +public function getProperties(): array; +``` + +
    Get all properties that are available according to the configuration as an array
    + +Parameters: not specified + +Return value: array + + +Throws: + + + +See: + +
    +
    +
    + +
      +
    • # + getPropertiesData + :warning: Is internal | source code
    • +
    + +```php +public function getPropertiesData(bool $onlyFromCurrentClassAndTraits = false, int $flags = \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntity::VISIBILITY_MODIFIERS_FLAG_ANY): array; +``` + +
    Get a list of all properties and classes where they are implemented
    + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $onlyFromCurrentClassAndTraitsboolGet data only for properties from the current class
    $flagsintGet data only for properties corresponding to the visibility modifiers passed in this value
    + +Return value: array + + +Throws: + + +
    +
    +
    + + + +```php +public function getProperty(string $propertyName, bool $unsafe = false): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntity; +``` + +
    Get the property entity by its name
    + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $propertyNamestringThe name of the property whose entity you want to get
    $unsafeboolCheck all properties, not just the properties allowed in the configuration (@see PhpHandlerSettings::getPropertyEntityFilter())
    + +Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntity + + +Throws: + + +
    +
    +
    + + + +```php +public function getPropertyDefaultValue(string $propertyName): string|array|int|bool|null|float; +``` + +
    Get the compiled value of a property
    + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $propertyNamestringThe name of the property for which you need to get the value
    + +Return value: string | array | int | bool | null | float + + +Throws: + + +
    +
    +
    + + + +```php +public function getPropertyEntitiesCollection(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntitiesCollection; +``` + +
    Get a collection of property entities
    + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntitiesCollection + + +Throws: + + + +See: + +
    +
    +
    + + + +```php +public function getRelativeFileName(): null|string; +``` + +
    File name relative to project_root configuration parameter
    + +Parameters: not specified + +Return value: null | string + + + +See: + +
    +
    +
    + + + +```php +public function getRootEntityCollection(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; +``` + +
    Get the collection of root entities to which this entity belongs
    + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection + + +
    +
    +
    + + + +```php +public function getShortName(): string; +``` + +
    Short name of the entity
    + +Parameters: not specified + +Return value: string + + +
    +
    +
    + + + +```php +public function getStartLine(): int; +``` + +
    Get the line number of the start of a class code in a file
    + +Parameters: not specified + +Return value: int + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getThrows(): array; +``` + +
    Get parsed throws from `throws` doc block
    + +Parameters: not specified + +Return value: array + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getThrowsDocBlockLinks(): array; +``` + + + +Parameters: not specified + +Return value: array + + +Throws: + + +
    +
    +
    + + + +```php +public function getTraits(): array; +``` + +
    Get a list of trait entities of the current class
    + +Parameters: not specified + +Return value: array + + +Throws: + + +
    +
    +
    + + + +```php +public function getTraitsNames(): array; +``` + +
    Get a list of class traits names
    + +Parameters: not specified + +Return value: array + + +Throws: + + +
    +
    +
    + + + +```php +public function hasConstant(string $constantName, bool $unsafe = false): bool; +``` + +
    Check if a constant exists in a class
    + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $constantNamestringThe name of the class whose entity you want to check
    $unsafeboolCheck all constants, not just the constants allowed in the configuration (@see PhpHandlerSettings::getClassConstantEntityFilter())
    + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function hasDescriptionLinks(): bool; +``` + +
    Checking if an entity has links in its description
    + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function hasExamples(): bool; +``` + +
    Checking if an entity has `example` docBlock
    + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +public function hasMethod(string $methodName, bool $unsafe = false): bool; +``` + +
    Check if a method exists in a class
    + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $methodNamestringThe name of the method whose entity you want to check
    $unsafeboolCheck all methods, not just the methods allowed in the configuration (@see PhpHandlerSettings::getMethodEntityFilter())
    + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +public function hasParentClass(string $parentClassName): bool; +``` + +
    Check if a certain parent class exists in a chain of parent classes
    + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $parentClassNamestringSearched parent class
    + +Return value: bool + + +
    +
    +
    + + + +```php +public function hasProperty(string $propertyName, bool $unsafe = false): bool; +``` + +
    Check if a property exists in a class
    + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $propertyNamestringThe name of the property whose entity you want to check
    $unsafeboolCheck all properties, not just the properties allowed in the configuration (@see PhpHandlerSettings::getPropertyEntityFilter())
    + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function hasThrows(): bool; +``` + +
    Checking if an entity has `throws` docBlock
    + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +public function hasTraits(): bool; +``` + +
    Check if the class contains traits
    + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +public function implementsInterface(string $interfaceName): bool; +``` + +
    Check if a class implements an interface
    + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $interfaceNamestringName of the required interface in the interface chain
    + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +public function isAbstract(): bool; +``` + +
    Check that an entity is abstract
    + +Parameters: not specified + +Return value: bool + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function isApi(): bool; +``` + +
    Checking if an entity has `api` docBlock
    + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +public function isClass(): bool; +``` + +
    Check if an entity is a Class
    + +Parameters: not specified + +Return value: bool + + +
    +
    +
    + + + +```php +public function isClassLoad(): bool; +``` + + + +Parameters: not specified + +Return value: bool + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function isDeprecated(): bool; +``` + +
    Checking if an entity has `deprecated` docBlock
    + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + +
      +
    • # + isDocumentCreationAllowed + :warning: Is internal | source code
    • +
    + +```php +public function isDocumentCreationAllowed(): bool; +``` + + + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + +
      +
    • # + isEntityCacheOutdated + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function isEntityCacheOutdated(): bool; +``` + +
    Checking if the entity cache is out of date
    + +Parameters: not specified + +Return value: bool + + +
    +
    +
    + +
      +
    • # + isEntityDataCacheOutdated + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait + +public function isEntityDataCacheOutdated(): bool; +``` + + + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +public function isEntityDataCanBeLoaded(): bool; +``` + + + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function isEntityFileCanBeLoad(): bool; +``` + +
    Checking if entity data can be retrieved
    + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +public static function isEntityNameValid(string $entityName): bool; +``` + +
    Check if the name is a valid name for ClassLikeEntity
    + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $entityNamestring-
    + +Return value: bool + + +
    +
    +
    + + + +```php +public function isEnum(): bool; +``` + +
    Check if an entity is an Enum
    + +Parameters: not specified + +Return value: bool + + +
    +
    +
    + +
      +
    • # + isExternalLibraryEntity + :warning: Is internal | source code
    • +
    + +```php +public function isExternalLibraryEntity(): bool; +``` + +
    Check if a given entity is an entity from a third party library (connected via composer)
    + +Parameters: not specified + +Return value: bool + + +
    +
    +
    + + + +```php +public function isInGit(): bool; +``` + +
    Checking if class file is in git repository
    + +Parameters: not specified + +Return value: bool + + +
    +
    +
    + + + +```php +public function isInstantiable(): bool; +``` + +
    Check that an entity is instantiable
    + +Parameters: not specified + +Return value: bool + + +
    +
    +
    + + + +```php +public function isInterface(): bool; +``` + +
    Check if an entity is an Interface
    + +Parameters: not specified + +Return value: bool + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function isInternal(): bool; +``` + +
    Checking if an entity has `internal` docBlock
    + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +public function isSubclassOf(string $className): bool; +``` + +
    Whether the given class is a subclass of the specified class
    + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $classNamestring-
    + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +public function isTrait(): bool; +``` + +
    Check if an entity is a Trait
    + +Parameters: not specified + +Return value: bool + + +
    +
    +
    + + + +```php +public static function normalizeClassName(string $name): string; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $namestring-
    + +Return value: string + + +
    +
    +
    + +
      +
    • # + reloadEntityDependenciesCache + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function reloadEntityDependenciesCache(): array; +``` + +
    Update entity dependency cache
    + +Parameters: not specified + +Return value: array + + +
    +
    +
    + +
      +
    • # + removeEntityValueFromCache + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait + +public function removeEntityValueFromCache(string $key): void; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $keystring-
    + +Return value: void + + +
    +
    +
    + +
      +
    • # + removeNotUsedEntityDataCache + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait + +public function removeNotUsedEntityDataCache(): void; +``` + + + +Parameters: not specified + +Return value: void + + +Throws: + + +
    +
    +
    + + + +```php +public function setCustomAst(\PhpParser\Node\Stmt\Trait_|\PhpParser\Node\Stmt\Enum_|\PhpParser\Node\Stmt\Interface_|\PhpParser\Node\Stmt\Class_|null $customAst): void; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $customAst\PhpParser\Node\Stmt\Trait_ | \PhpParser\Node\Stmt\Enum_ | \PhpParser\Node\Stmt\Interface_ | \PhpParser\Node\Stmt\Class_ | null-
    + +Return value: void + + +
    +
    + + \ No newline at end of file diff --git a/docs/tech/2.parser/reflectionApi/php/classes/ClassLikeEntity_2.md b/docs/tech/2.parser/reflectionApi/php/classes/ClassLikeEntity_2.md new file mode 100644 index 00000000..d5a81c5c --- /dev/null +++ b/docs/tech/2.parser/reflectionApi/php/classes/ClassLikeEntity_2.md @@ -0,0 +1,3317 @@ + + BumbleDocGen / Technical description of the project / Parser / Reflection API / Reflection API for PHP / PHP interface reflection API / ClassLikeEntity
    + +

    + ClassLikeEntity class: +

    + + + + + +```php +namespace BumbleDocGen\LanguageHandler\Php\Parser\Entity; + +abstract class ClassLikeEntity extends \BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity implements \BumbleDocGen\Core\Renderer\Context\DocumentTransformableEntityInterface, \BumbleDocGen\Core\Parser\Entity\RootEntityInterface, \BumbleDocGen\Core\Parser\Entity\EntityInterface, \BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityInterface +``` + + + + + + + + +

    Initialization methods:

    + +
      +
    1. + __construct +
    2. +
    + +

    Methods:

    + +
      +
    1. + addPluginData + - Add information to aт entity object
    2. +
    3. + cursorToDocAttributeLinkFragment +
    4. +
    5. + getAbsoluteFileName + - Returns the absolute path to a file if it can be retrieved and if the file is in the project directory
    6. +
    7. + getAst + - Get AST for this entity
    8. +
    9. + getCacheKey +
    10. +
    11. + getCachedEntityDependencies +
    12. +
    13. + getConstant + - Get the method entity by its name
    14. +
    15. + getConstantEntitiesCollection + - Get a collection of constant entities
    16. +
    17. + getConstantValue + - Get the compiled value of a constant
    18. +
    19. + getConstants + - Get all constants that are available according to the configuration as an array
    20. +
    21. + getConstantsData + - Get a list of all constants and classes where they are implemented
    22. +
    23. + getConstantsValues + - Get class constant compiled values according to filters
    24. +
    25. + getCurrentRootEntity +
    26. +
    27. + getDescription + - Get entity description
    28. +
    29. + getDescriptionLinks + - Get parsed links from description and doc blocks `see` and `link`
    30. +
    31. + getDocBlock + - Get DocBlock for current entity
    32. +
    33. + getDocComment + - Get the doc comment of an entity
    34. +
    35. + getDocCommentEntity + - Link to an entity where docBlock is implemented for this entity
    36. +
    37. + getDocCommentLine + - Get the code line number where the docBlock of the current entity begins
    38. +
    39. + getDocNote + - Get the note annotation value
    40. +
    41. + getDocRender +
    42. +
    43. + getEndLine + - Get the line number of the end of a class code in a file
    44. +
    45. + getEntityDependencies +
    46. +
    47. + getExamples + - Get parsed examples from `examples` doc block
    48. +
    49. + getFileContent +
    50. +
    51. + getFileSourceLink +
    52. +
    53. + getFirstExample + - Get first example from `examples` doc block
    54. +
    55. + getImplementingClass + - Get the class like entity in which the current entity was implemented
    56. +
    57. + getInterfaceNames + - Get a list of class interface names
    58. +
    59. + getInterfacesEntities + - Get a list of interface entities that the current class implements
    60. +
    61. + getMethod + - Get the method entity by its name
    62. +
    63. + getMethodEntitiesCollection + - Get a collection of method entities
    64. +
    65. + getMethods + - Get all methods that are available according to the configuration as an array
    66. +
    67. + getMethodsData + - Get a list of all methods and classes where they are implemented
    68. +
    69. + getModifiersString + - Get entity modifiers as a string
    70. +
    71. + getName + - Full name of the entity
    72. +
    73. + getNamespaceName + - Get the entity namespace name
    74. +
    75. + getObjectId + - Get entity unique ID
    76. +
    77. + getParentClass + - Get the entity of the parent class if it exists
    78. +
    79. + getParentClassEntities + - Get a list of parent class entities
    80. +
    81. + getParentClassName + - Get the name of the parent class entity if it exists
    82. +
    83. + getParentClassNames + - Get a list of entity names of parent classes
    84. +
    85. + getPluginData + - Get additional information added using the plugin
    86. +
    87. + getProperties + - Get all properties that are available according to the configuration as an array
    88. +
    89. + getPropertiesData + - Get a list of all properties and classes where they are implemented
    90. +
    91. + getProperty + - Get the property entity by its name
    92. +
    93. + getPropertyDefaultValue + - Get the compiled value of a property
    94. +
    95. + getPropertyEntitiesCollection + - Get a collection of property entities
    96. +
    97. + getRelativeFileName + - File name relative to project_root configuration parameter
    98. +
    99. + getRootEntityCollection + - Get the collection of root entities to which this entity belongs
    100. +
    101. + getShortName + - Short name of the entity
    102. +
    103. + getStartLine + - Get the line number of the start of a class code in a file
    104. +
    105. + getThrows + - Get parsed throws from `throws` doc block
    106. +
    107. + getThrowsDocBlockLinks +
    108. +
    109. + getTraits + - Get a list of trait entities of the current class
    110. +
    111. + getTraitsNames + - Get a list of class traits names
    112. +
    113. + hasConstant + - Check if a constant exists in a class
    114. +
    115. + hasDescriptionLinks + - Checking if an entity has links in its description
    116. +
    117. + hasExamples + - Checking if an entity has `example` docBlock
    118. +
    119. + hasMethod + - Check if a method exists in a class
    120. +
    121. + hasParentClass + - Check if a certain parent class exists in a chain of parent classes
    122. +
    123. + hasProperty + - Check if a property exists in a class
    124. +
    125. + hasThrows + - Checking if an entity has `throws` docBlock
    126. +
    127. + hasTraits + - Check if the class contains traits
    128. +
    129. + implementsInterface + - Check if a class implements an interface
    130. +
    131. + isAbstract + - Check that an entity is abstract
    132. +
    133. + isApi + - Checking if an entity has `api` docBlock
    134. +
    135. + isClass + - Check if an entity is a Class
    136. +
    137. + isClassLoad +
    138. +
    139. + isDeprecated + - Checking if an entity has `deprecated` docBlock
    140. +
    141. + isDocumentCreationAllowed +
    142. +
    143. + isEntityCacheOutdated + - Checking if the entity cache is out of date
    144. +
    145. + isEntityDataCacheOutdated +
    146. +
    147. + isEntityDataCanBeLoaded +
    148. +
    149. + isEntityFileCanBeLoad + - Checking if entity data can be retrieved
    150. +
    151. + isEntityNameValid + - Check if the name is a valid name for ClassLikeEntity
    152. +
    153. + isEnum + - Check if an entity is an Enum
    154. +
    155. + isExternalLibraryEntity + - Check if a given entity is an entity from a third party library (connected via composer)
    156. +
    157. + isInGit + - Checking if class file is in git repository
    158. +
    159. + isInstantiable + - Check that an entity is instantiable
    160. +
    161. + isInterface + - Check if an entity is an Interface
    162. +
    163. + isInternal + - Checking if an entity has `internal` docBlock
    164. +
    165. + isSubclassOf + - Whether the given class is a subclass of the specified class
    166. +
    167. + isTrait + - Check if an entity is a Trait
    168. +
    169. + normalizeClassName +
    170. +
    171. + reloadEntityDependenciesCache + - Update entity dependency cache
    172. +
    173. + removeEntityValueFromCache +
    174. +
    175. + removeNotUsedEntityDataCache +
    176. +
    177. + setCustomAst +
    178. +
    + + + + + + + +

    Method details:

    + +
    + + + +```php +public function __construct(\BumbleDocGen\Core\Configuration\Configuration $configuration, \BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings $phpHandlerSettings, \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection $entitiesCollection, \BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper $parserHelper, \BumbleDocGen\LanguageHandler\Php\Parser\ComposerHelper $composerHelper, \BumbleDocGen\LanguageHandler\Php\Parser\PhpParser\PhpParserHelper $phpParserHelper, \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache $localObjectCache, \Psr\Log\LoggerInterface $logger, string $className, string|null $relativeFileName); +``` + + + +Parameters: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $configuration\BumbleDocGen\Core\Configuration\Configuration-
    $phpHandlerSettings\BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings-
    $entitiesCollection\BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection-
    $parserHelper\BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper-
    $composerHelper\BumbleDocGen\LanguageHandler\Php\Parser\ComposerHelper-
    $phpParserHelper\BumbleDocGen\LanguageHandler\Php\Parser\PhpParser\PhpParserHelper-
    $localObjectCache\BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache-
    $logger\Psr\Log\LoggerInterface-
    $classNamestring-
    $relativeFileNamestring | null-
    + + + +
    +
    +
    + + + +```php +public function addPluginData(string $pluginKey, mixed $data): void; +``` + +
    Add information to aт entity object
    + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $pluginKeystring-
    $datamixed-
    + +Return value: void + + +
    +
    +
    + +
      +
    • # + cursorToDocAttributeLinkFragment + :warning: Is internal | source code
    • +
    + +```php +public function cursorToDocAttributeLinkFragment(string $cursor, bool $isForDocument = true): string; +``` + + + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $cursorstring-
    $isForDocumentbool-
    + +Return value: string + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getAbsoluteFileName(): null|string; +``` + +
    Returns the absolute path to a file if it can be retrieved and if the file is in the project directory
    + +Parameters: not specified + +Return value: null | string + + +Throws: + + +
    +
    +
    + + + +```php +public function getAst(): \PhpParser\Node\Stmt\Class_|\PhpParser\Node\Stmt\Interface_|\PhpParser\Node\Stmt\Trait_|\PhpParser\Node\Stmt\Enum_; +``` + +
    Get AST for this entity
    + +Parameters: not specified + +Return value: \PhpParser\Node\Stmt\Class_ | \PhpParser\Node\Stmt\Interface_ | \PhpParser\Node\Stmt\Trait_ | \PhpParser\Node\Stmt\Enum_ + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait + +public function getCacheKey(): string; +``` + + + +Parameters: not specified + +Return value: string + + +
    +
    +
    + +
      +
    • # + getCachedEntityDependencies + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getCachedEntityDependencies(): array; +``` + + + +Parameters: not specified + +Return value: array + + +Throws: + + +
    +
    +
    + + + +```php +public function getConstant(string $constantName, bool $unsafe = false): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity; +``` + +
    Get the method entity by its name
    + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $constantNamestringThe name of the constant whose entity you want to get
    $unsafeboolCheck all constants, not just the constants allowed in the configuration (@see PhpHandlerSettings::getClassConstantEntityFilter())
    + +Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity + + +Throws: + + +
    +
    +
    + + + +```php +public function getConstantEntitiesCollection(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntitiesCollection; +``` + +
    Get a collection of constant entities
    + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntitiesCollection + + +Throws: + + + +See: + +
    +
    +
    + + + +```php +public function getConstantValue(string $constantName): string|array|int|bool|null|float; +``` + +
    Get the compiled value of a constant
    + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $constantNamestringThe name of the constant for which you need to get the value
    + +Return value: string | array | int | bool | null | float + + +Throws: + + +
    +
    +
    + + + +```php +public function getConstants(): array; +``` + +
    Get all constants that are available according to the configuration as an array
    + +Parameters: not specified + +Return value: array + + +Throws: + + + +See: + +
    +
    +
    + +
      +
    • # + getConstantsData + :warning: Is internal | source code
    • +
    + +```php +public function getConstantsData(bool $onlyFromCurrentClassAndTraits = false, int $flags = \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity::VISIBILITY_MODIFIERS_FLAG_ANY): array; +``` + +
    Get a list of all constants and classes where they are implemented
    + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $onlyFromCurrentClassAndTraitsboolGet data only for constants from the current class
    $flagsintGet data only for constants corresponding to the visibility modifiers passed in this value
    + +Return value: array + + +Throws: + + +
    +
    +
    + + + +```php +public function getConstantsValues(bool $onlyFromCurrentClassAndTraits = false, int $flags = \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity::VISIBILITY_MODIFIERS_FLAG_ANY): array; +``` + +
    Get class constant compiled values according to filters
    + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $onlyFromCurrentClassAndTraitsboolGet values only for constants from the current class
    $flagsintGet values only for constants corresponding to the visibility modifiers passed in this value
    + +Return value: array + + +Throws: + + +
    +
    +
    + +
      +
    • # + getCurrentRootEntity + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getCurrentRootEntity(): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; +``` + + + +Parameters: not specified + +Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDescription(): string; +``` + +
    Get entity description
    + +Parameters: not specified + +Return value: string + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDescriptionLinks(): array; +``` + +
    Get parsed links from description and doc blocks `see` and `link`
    + +Parameters: not specified + +Return value: array + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDocBlock(): \phpDocumentor\Reflection\DocBlock; +``` + +
    Get DocBlock for current entity
    + +Parameters: not specified + +Return value: \phpDocumentor\Reflection\DocBlock + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDocComment(): string; +``` + +
    Get the doc comment of an entity
    + +Parameters: not specified + +Return value: string + + +Throws: + + +
    +
    +
    + +
      +
    • # + getDocCommentEntity + :warning: Is internal | source code
    • +
    + +```php +public function getDocCommentEntity(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; +``` + +
    Link to an entity where docBlock is implemented for this entity
    + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDocCommentLine(): null|int; +``` + +
    Get the code line number where the docBlock of the current entity begins
    + +Parameters: not specified + +Return value: null | int + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDocNote(): string; +``` + +
    Get the note annotation value
    + +Parameters: not specified + +Return value: string + + +Throws: + + +
    +
    +
    + + + +```php +public function getDocRender(): \BumbleDocGen\Core\Renderer\EntityDocRenderer\EntityDocRendererInterface; +``` + + + +Parameters: not specified + +Return value: \BumbleDocGen\Core\Renderer\EntityDocRenderer\EntityDocRendererInterface + + +Throws: + + +
    +
    +
    + + + +```php +public function getEndLine(): int; +``` + +
    Get the line number of the end of a class code in a file
    + +Parameters: not specified + +Return value: int + + +Throws: + + +
    +
    +
    + + + +```php +public function getEntityDependencies(): array; +``` + + + +Parameters: not specified + +Return value: array + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getExamples(): array; +``` + +
    Get parsed examples from `examples` doc block
    + +Parameters: not specified + +Return value: array + + +Throws: + + +
    +
    +
    + + + +```php +public function getFileContent(): string; +``` + + + +Parameters: not specified + +Return value: string + + +Throws: + + +
    +
    +
    + +
      +
    • # + getFileSourceLink + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getFileSourceLink(bool $withLine = true): null|string; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $withLinebool-
    + +Return value: null | string + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getFirstExample(): string; +``` + +
    Get first example from `examples` doc block
    + +Parameters: not specified + +Return value: string + + +Throws: + + +
    +
    +
    + + + +```php +public function getImplementingClass(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; +``` + +
    Get the class like entity in which the current entity was implemented
    + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + + +
    +
    +
    + + + +```php +public function getInterfaceNames(): array; +``` + +
    Get a list of class interface names
    + +Parameters: not specified + +Return value: array + + +Throws: + + +
    +
    +
    + + + +```php +public function getInterfacesEntities(): array; +``` + +
    Get a list of interface entities that the current class implements
    + +Parameters: not specified + +Return value: array + + +Throws: + + +
    +
    +
    + + + +```php +public function getMethod(string $methodName, bool $unsafe = false): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntity; +``` + +
    Get the method entity by its name
    + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $methodNamestringThe name of the method whose entity you want to get
    $unsafeboolCheck all methods, not just the methods allowed in the configuration (@see PhpHandlerSettings::getMethodEntityFilter())
    + +Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntity + + +Throws: + + +
    +
    +
    + + + +```php +public function getMethodEntitiesCollection(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntitiesCollection; +``` + +
    Get a collection of method entities
    + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntitiesCollection + + +Throws: + + + +See: + +
    +
    +
    + + + +```php +public function getMethods(): array; +``` + +
    Get all methods that are available according to the configuration as an array
    + +Parameters: not specified + +Return value: array + + +Throws: + + + +See: + +
    +
    +
    + +
      +
    • # + getMethodsData + :warning: Is internal | source code
    • +
    + +```php +public function getMethodsData(bool $onlyFromCurrentClassAndTraits = false, int $flags = \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntity::VISIBILITY_MODIFIERS_FLAG_ANY): array; +``` + +
    Get a list of all methods and classes where they are implemented
    + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $onlyFromCurrentClassAndTraitsboolGet data only for methods from the current class
    $flagsintGet data only for methods corresponding to the visibility modifiers passed in this value
    + +Return value: array + + +Throws: + + +
    +
    +
    + + + +```php +public function getModifiersString(): string; +``` + +
    Get entity modifiers as a string
    + +Parameters: not specified + +Return value: string + + +
    +
    +
    + + + +```php +public function getName(): string; +``` + +
    Full name of the entity
    + +Parameters: not specified + +Return value: string + + +
    +
    +
    + + + +```php +public function getNamespaceName(): string; +``` + +
    Get the entity namespace name
    + +Parameters: not specified + +Return value: string + + +
    +
    +
    + + + +```php +public function getObjectId(): string; +``` + +
    Get entity unique ID
    + +Parameters: not specified + +Return value: string + + +
    +
    +
    + + + +```php +public function getParentClass(): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; +``` + +
    Get the entity of the parent class if it exists
    + +Parameters: not specified + +Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + + +
    +
    +
    + + + +```php +public function getParentClassEntities(): array; +``` + +
    Get a list of parent class entities
    + +Parameters: not specified + +Return value: array + + +
    +
    +
    + + + +```php +public function getParentClassName(): null|string; +``` + +
    Get the name of the parent class entity if it exists
    + +Parameters: not specified + +Return value: null | string + + +
    +
    +
    + + + +```php +public function getParentClassNames(): array; +``` + +
    Get a list of entity names of parent classes
    + +Parameters: not specified + +Return value: array + + +
    +
    +
    + + + +```php +public function getPluginData(string $pluginKey): mixed; +``` + +
    Get additional information added using the plugin
    + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $pluginKeystring-
    + +Return value: mixed + + +
    +
    +
    + + + +```php +public function getProperties(): array; +``` + +
    Get all properties that are available according to the configuration as an array
    + +Parameters: not specified + +Return value: array + + +Throws: + + + +See: + +
    +
    +
    + +
      +
    • # + getPropertiesData + :warning: Is internal | source code
    • +
    + +```php +public function getPropertiesData(bool $onlyFromCurrentClassAndTraits = false, int $flags = \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntity::VISIBILITY_MODIFIERS_FLAG_ANY): array; +``` + +
    Get a list of all properties and classes where they are implemented
    + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $onlyFromCurrentClassAndTraitsboolGet data only for properties from the current class
    $flagsintGet data only for properties corresponding to the visibility modifiers passed in this value
    + +Return value: array + + +Throws: + + +
    +
    +
    + + + +```php +public function getProperty(string $propertyName, bool $unsafe = false): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntity; +``` + +
    Get the property entity by its name
    + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $propertyNamestringThe name of the property whose entity you want to get
    $unsafeboolCheck all properties, not just the properties allowed in the configuration (@see PhpHandlerSettings::getPropertyEntityFilter())
    + +Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntity + + +Throws: + + +
    +
    +
    + + + +```php +public function getPropertyDefaultValue(string $propertyName): string|array|int|bool|null|float; +``` + +
    Get the compiled value of a property
    + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $propertyNamestringThe name of the property for which you need to get the value
    + +Return value: string | array | int | bool | null | float + + +Throws: + + +
    +
    +
    + + + +```php +public function getPropertyEntitiesCollection(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntitiesCollection; +``` + +
    Get a collection of property entities
    + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntitiesCollection + + +Throws: + + + +See: + +
    +
    +
    + + + +```php +public function getRelativeFileName(): null|string; +``` + +
    File name relative to project_root configuration parameter
    + +Parameters: not specified + +Return value: null | string + + + +See: + +
    +
    +
    + + + +```php +public function getRootEntityCollection(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; +``` + +
    Get the collection of root entities to which this entity belongs
    + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection + + +
    +
    +
    + + + +```php +public function getShortName(): string; +``` + +
    Short name of the entity
    + +Parameters: not specified + +Return value: string + + +
    +
    +
    + + + +```php +public function getStartLine(): int; +``` + +
    Get the line number of the start of a class code in a file
    + +Parameters: not specified + +Return value: int + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getThrows(): array; +``` + +
    Get parsed throws from `throws` doc block
    + +Parameters: not specified + +Return value: array + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getThrowsDocBlockLinks(): array; +``` + + + +Parameters: not specified + +Return value: array + + +Throws: + + +
    +
    +
    + + + +```php +public function getTraits(): array; +``` + +
    Get a list of trait entities of the current class
    + +Parameters: not specified + +Return value: array + + +Throws: + + +
    +
    +
    + + + +```php +public function getTraitsNames(): array; +``` + +
    Get a list of class traits names
    + +Parameters: not specified + +Return value: array + + +Throws: + + +
    +
    +
    + + + +```php +public function hasConstant(string $constantName, bool $unsafe = false): bool; +``` + +
    Check if a constant exists in a class
    + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $constantNamestringThe name of the class whose entity you want to check
    $unsafeboolCheck all constants, not just the constants allowed in the configuration (@see PhpHandlerSettings::getClassConstantEntityFilter())
    + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function hasDescriptionLinks(): bool; +``` + +
    Checking if an entity has links in its description
    + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function hasExamples(): bool; +``` + +
    Checking if an entity has `example` docBlock
    + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +public function hasMethod(string $methodName, bool $unsafe = false): bool; +``` + +
    Check if a method exists in a class
    + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $methodNamestringThe name of the method whose entity you want to check
    $unsafeboolCheck all methods, not just the methods allowed in the configuration (@see PhpHandlerSettings::getMethodEntityFilter())
    + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +public function hasParentClass(string $parentClassName): bool; +``` + +
    Check if a certain parent class exists in a chain of parent classes
    + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $parentClassNamestringSearched parent class
    + +Return value: bool + + +
    +
    +
    + + + +```php +public function hasProperty(string $propertyName, bool $unsafe = false): bool; +``` + +
    Check if a property exists in a class
    + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $propertyNamestringThe name of the property whose entity you want to check
    $unsafeboolCheck all properties, not just the properties allowed in the configuration (@see PhpHandlerSettings::getPropertyEntityFilter())
    + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function hasThrows(): bool; +``` + +
    Checking if an entity has `throws` docBlock
    + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +public function hasTraits(): bool; +``` + +
    Check if the class contains traits
    + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +public function implementsInterface(string $interfaceName): bool; +``` + +
    Check if a class implements an interface
    + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $interfaceNamestringName of the required interface in the interface chain
    + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +public function isAbstract(): bool; +``` + +
    Check that an entity is abstract
    + +Parameters: not specified + +Return value: bool + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function isApi(): bool; +``` + +
    Checking if an entity has `api` docBlock
    + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +public function isClass(): bool; +``` + +
    Check if an entity is a Class
    + +Parameters: not specified + +Return value: bool + + +
    +
    +
    + + + +```php +public function isClassLoad(): bool; +``` + + + +Parameters: not specified + +Return value: bool + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function isDeprecated(): bool; +``` + +
    Checking if an entity has `deprecated` docBlock
    + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + +
      +
    • # + isDocumentCreationAllowed + :warning: Is internal | source code
    • +
    + +```php +public function isDocumentCreationAllowed(): bool; +``` + + + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + +
      +
    • # + isEntityCacheOutdated + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function isEntityCacheOutdated(): bool; +``` + +
    Checking if the entity cache is out of date
    + +Parameters: not specified + +Return value: bool + + +
    +
    +
    + +
      +
    • # + isEntityDataCacheOutdated + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait + +public function isEntityDataCacheOutdated(): bool; +``` + + + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +public function isEntityDataCanBeLoaded(): bool; +``` + + + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function isEntityFileCanBeLoad(): bool; +``` + +
    Checking if entity data can be retrieved
    + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +public static function isEntityNameValid(string $entityName): bool; +``` + +
    Check if the name is a valid name for ClassLikeEntity
    + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $entityNamestring-
    + +Return value: bool + + +
    +
    +
    + + + +```php +public function isEnum(): bool; +``` + +
    Check if an entity is an Enum
    + +Parameters: not specified + +Return value: bool + + +
    +
    +
    + +
      +
    • # + isExternalLibraryEntity + :warning: Is internal | source code
    • +
    + +```php +public function isExternalLibraryEntity(): bool; +``` + +
    Check if a given entity is an entity from a third party library (connected via composer)
    + +Parameters: not specified + +Return value: bool + + +
    +
    +
    + + + +```php +public function isInGit(): bool; +``` + +
    Checking if class file is in git repository
    + +Parameters: not specified + +Return value: bool + + +
    +
    +
    + + + +```php +public function isInstantiable(): bool; +``` + +
    Check that an entity is instantiable
    + +Parameters: not specified + +Return value: bool + + +
    +
    +
    + + + +```php +public function isInterface(): bool; +``` + +
    Check if an entity is an Interface
    + +Parameters: not specified + +Return value: bool + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function isInternal(): bool; +``` + +
    Checking if an entity has `internal` docBlock
    + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +public function isSubclassOf(string $className): bool; +``` + +
    Whether the given class is a subclass of the specified class
    + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $classNamestring-
    + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +public function isTrait(): bool; +``` + +
    Check if an entity is a Trait
    + +Parameters: not specified + +Return value: bool + + +
    +
    +
    + + + +```php +public static function normalizeClassName(string $name): string; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $namestring-
    + +Return value: string + + +
    +
    +
    + +
      +
    • # + reloadEntityDependenciesCache + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function reloadEntityDependenciesCache(): array; +``` + +
    Update entity dependency cache
    + +Parameters: not specified + +Return value: array + + +
    +
    +
    + +
      +
    • # + removeEntityValueFromCache + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait + +public function removeEntityValueFromCache(string $key): void; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $keystring-
    + +Return value: void + + +
    +
    +
    + +
      +
    • # + removeNotUsedEntityDataCache + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait + +public function removeNotUsedEntityDataCache(): void; +``` + + + +Parameters: not specified + +Return value: void + + +Throws: + + +
    +
    +
    + + + +```php +public function setCustomAst(\PhpParser\Node\Stmt\Trait_|\PhpParser\Node\Stmt\Enum_|\PhpParser\Node\Stmt\Interface_|\PhpParser\Node\Stmt\Class_|null $customAst): void; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $customAst\PhpParser\Node\Stmt\Trait_ | \PhpParser\Node\Stmt\Enum_ | \PhpParser\Node\Stmt\Interface_ | \PhpParser\Node\Stmt\Class_ | null-
    + +Return value: void + + +
    +
    + + \ No newline at end of file diff --git a/docs/tech/2.parser/reflectionApi/php/classes/ClassLikeEntity_3.md b/docs/tech/2.parser/reflectionApi/php/classes/ClassLikeEntity_3.md new file mode 100644 index 00000000..71fe7426 --- /dev/null +++ b/docs/tech/2.parser/reflectionApi/php/classes/ClassLikeEntity_3.md @@ -0,0 +1,3317 @@ + + BumbleDocGen / Technical description of the project / Parser / Reflection API / Reflection API for PHP / PHP enum reflection API / ClassLikeEntity
    + +

    + ClassLikeEntity class: +

    + + + + + +```php +namespace BumbleDocGen\LanguageHandler\Php\Parser\Entity; + +abstract class ClassLikeEntity extends \BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity implements \BumbleDocGen\Core\Renderer\Context\DocumentTransformableEntityInterface, \BumbleDocGen\Core\Parser\Entity\RootEntityInterface, \BumbleDocGen\Core\Parser\Entity\EntityInterface, \BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityInterface +``` + + + + + + + + +

    Initialization methods:

    + +
      +
    1. + __construct +
    2. +
    + +

    Methods:

    + +
      +
    1. + addPluginData + - Add information to aт entity object
    2. +
    3. + cursorToDocAttributeLinkFragment +
    4. +
    5. + getAbsoluteFileName + - Returns the absolute path to a file if it can be retrieved and if the file is in the project directory
    6. +
    7. + getAst + - Get AST for this entity
    8. +
    9. + getCacheKey +
    10. +
    11. + getCachedEntityDependencies +
    12. +
    13. + getConstant + - Get the method entity by its name
    14. +
    15. + getConstantEntitiesCollection + - Get a collection of constant entities
    16. +
    17. + getConstantValue + - Get the compiled value of a constant
    18. +
    19. + getConstants + - Get all constants that are available according to the configuration as an array
    20. +
    21. + getConstantsData + - Get a list of all constants and classes where they are implemented
    22. +
    23. + getConstantsValues + - Get class constant compiled values according to filters
    24. +
    25. + getCurrentRootEntity +
    26. +
    27. + getDescription + - Get entity description
    28. +
    29. + getDescriptionLinks + - Get parsed links from description and doc blocks `see` and `link`
    30. +
    31. + getDocBlock + - Get DocBlock for current entity
    32. +
    33. + getDocComment + - Get the doc comment of an entity
    34. +
    35. + getDocCommentEntity + - Link to an entity where docBlock is implemented for this entity
    36. +
    37. + getDocCommentLine + - Get the code line number where the docBlock of the current entity begins
    38. +
    39. + getDocNote + - Get the note annotation value
    40. +
    41. + getDocRender +
    42. +
    43. + getEndLine + - Get the line number of the end of a class code in a file
    44. +
    45. + getEntityDependencies +
    46. +
    47. + getExamples + - Get parsed examples from `examples` doc block
    48. +
    49. + getFileContent +
    50. +
    51. + getFileSourceLink +
    52. +
    53. + getFirstExample + - Get first example from `examples` doc block
    54. +
    55. + getImplementingClass + - Get the class like entity in which the current entity was implemented
    56. +
    57. + getInterfaceNames + - Get a list of class interface names
    58. +
    59. + getInterfacesEntities + - Get a list of interface entities that the current class implements
    60. +
    61. + getMethod + - Get the method entity by its name
    62. +
    63. + getMethodEntitiesCollection + - Get a collection of method entities
    64. +
    65. + getMethods + - Get all methods that are available according to the configuration as an array
    66. +
    67. + getMethodsData + - Get a list of all methods and classes where they are implemented
    68. +
    69. + getModifiersString + - Get entity modifiers as a string
    70. +
    71. + getName + - Full name of the entity
    72. +
    73. + getNamespaceName + - Get the entity namespace name
    74. +
    75. + getObjectId + - Get entity unique ID
    76. +
    77. + getParentClass + - Get the entity of the parent class if it exists
    78. +
    79. + getParentClassEntities + - Get a list of parent class entities
    80. +
    81. + getParentClassName + - Get the name of the parent class entity if it exists
    82. +
    83. + getParentClassNames + - Get a list of entity names of parent classes
    84. +
    85. + getPluginData + - Get additional information added using the plugin
    86. +
    87. + getProperties + - Get all properties that are available according to the configuration as an array
    88. +
    89. + getPropertiesData + - Get a list of all properties and classes where they are implemented
    90. +
    91. + getProperty + - Get the property entity by its name
    92. +
    93. + getPropertyDefaultValue + - Get the compiled value of a property
    94. +
    95. + getPropertyEntitiesCollection + - Get a collection of property entities
    96. +
    97. + getRelativeFileName + - File name relative to project_root configuration parameter
    98. +
    99. + getRootEntityCollection + - Get the collection of root entities to which this entity belongs
    100. +
    101. + getShortName + - Short name of the entity
    102. +
    103. + getStartLine + - Get the line number of the start of a class code in a file
    104. +
    105. + getThrows + - Get parsed throws from `throws` doc block
    106. +
    107. + getThrowsDocBlockLinks +
    108. +
    109. + getTraits + - Get a list of trait entities of the current class
    110. +
    111. + getTraitsNames + - Get a list of class traits names
    112. +
    113. + hasConstant + - Check if a constant exists in a class
    114. +
    115. + hasDescriptionLinks + - Checking if an entity has links in its description
    116. +
    117. + hasExamples + - Checking if an entity has `example` docBlock
    118. +
    119. + hasMethod + - Check if a method exists in a class
    120. +
    121. + hasParentClass + - Check if a certain parent class exists in a chain of parent classes
    122. +
    123. + hasProperty + - Check if a property exists in a class
    124. +
    125. + hasThrows + - Checking if an entity has `throws` docBlock
    126. +
    127. + hasTraits + - Check if the class contains traits
    128. +
    129. + implementsInterface + - Check if a class implements an interface
    130. +
    131. + isAbstract + - Check that an entity is abstract
    132. +
    133. + isApi + - Checking if an entity has `api` docBlock
    134. +
    135. + isClass + - Check if an entity is a Class
    136. +
    137. + isClassLoad +
    138. +
    139. + isDeprecated + - Checking if an entity has `deprecated` docBlock
    140. +
    141. + isDocumentCreationAllowed +
    142. +
    143. + isEntityCacheOutdated + - Checking if the entity cache is out of date
    144. +
    145. + isEntityDataCacheOutdated +
    146. +
    147. + isEntityDataCanBeLoaded +
    148. +
    149. + isEntityFileCanBeLoad + - Checking if entity data can be retrieved
    150. +
    151. + isEntityNameValid + - Check if the name is a valid name for ClassLikeEntity
    152. +
    153. + isEnum + - Check if an entity is an Enum
    154. +
    155. + isExternalLibraryEntity + - Check if a given entity is an entity from a third party library (connected via composer)
    156. +
    157. + isInGit + - Checking if class file is in git repository
    158. +
    159. + isInstantiable + - Check that an entity is instantiable
    160. +
    161. + isInterface + - Check if an entity is an Interface
    162. +
    163. + isInternal + - Checking if an entity has `internal` docBlock
    164. +
    165. + isSubclassOf + - Whether the given class is a subclass of the specified class
    166. +
    167. + isTrait + - Check if an entity is a Trait
    168. +
    169. + normalizeClassName +
    170. +
    171. + reloadEntityDependenciesCache + - Update entity dependency cache
    172. +
    173. + removeEntityValueFromCache +
    174. +
    175. + removeNotUsedEntityDataCache +
    176. +
    177. + setCustomAst +
    178. +
    + + + + + + + +

    Method details:

    + +
    + + + +```php +public function __construct(\BumbleDocGen\Core\Configuration\Configuration $configuration, \BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings $phpHandlerSettings, \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection $entitiesCollection, \BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper $parserHelper, \BumbleDocGen\LanguageHandler\Php\Parser\ComposerHelper $composerHelper, \BumbleDocGen\LanguageHandler\Php\Parser\PhpParser\PhpParserHelper $phpParserHelper, \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache $localObjectCache, \Psr\Log\LoggerInterface $logger, string $className, string|null $relativeFileName); +``` + + + +Parameters: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $configuration\BumbleDocGen\Core\Configuration\Configuration-
    $phpHandlerSettings\BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings-
    $entitiesCollection\BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection-
    $parserHelper\BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper-
    $composerHelper\BumbleDocGen\LanguageHandler\Php\Parser\ComposerHelper-
    $phpParserHelper\BumbleDocGen\LanguageHandler\Php\Parser\PhpParser\PhpParserHelper-
    $localObjectCache\BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache-
    $logger\Psr\Log\LoggerInterface-
    $classNamestring-
    $relativeFileNamestring | null-
    + + + +
    +
    +
    + + + +```php +public function addPluginData(string $pluginKey, mixed $data): void; +``` + +
    Add information to aт entity object
    + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $pluginKeystring-
    $datamixed-
    + +Return value: void + + +
    +
    +
    + +
      +
    • # + cursorToDocAttributeLinkFragment + :warning: Is internal | source code
    • +
    + +```php +public function cursorToDocAttributeLinkFragment(string $cursor, bool $isForDocument = true): string; +``` + + + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $cursorstring-
    $isForDocumentbool-
    + +Return value: string + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getAbsoluteFileName(): null|string; +``` + +
    Returns the absolute path to a file if it can be retrieved and if the file is in the project directory
    + +Parameters: not specified + +Return value: null | string + + +Throws: + + +
    +
    +
    + + + +```php +public function getAst(): \PhpParser\Node\Stmt\Class_|\PhpParser\Node\Stmt\Interface_|\PhpParser\Node\Stmt\Trait_|\PhpParser\Node\Stmt\Enum_; +``` + +
    Get AST for this entity
    + +Parameters: not specified + +Return value: \PhpParser\Node\Stmt\Class_ | \PhpParser\Node\Stmt\Interface_ | \PhpParser\Node\Stmt\Trait_ | \PhpParser\Node\Stmt\Enum_ + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait + +public function getCacheKey(): string; +``` + + + +Parameters: not specified + +Return value: string + + +
    +
    +
    + +
      +
    • # + getCachedEntityDependencies + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getCachedEntityDependencies(): array; +``` + + + +Parameters: not specified + +Return value: array + + +Throws: + + +
    +
    +
    + + + +```php +public function getConstant(string $constantName, bool $unsafe = false): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity; +``` + +
    Get the method entity by its name
    + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $constantNamestringThe name of the constant whose entity you want to get
    $unsafeboolCheck all constants, not just the constants allowed in the configuration (@see PhpHandlerSettings::getClassConstantEntityFilter())
    + +Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity + + +Throws: + + +
    +
    +
    + + + +```php +public function getConstantEntitiesCollection(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntitiesCollection; +``` + +
    Get a collection of constant entities
    + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntitiesCollection + + +Throws: + + + +See: + +
    +
    +
    + + + +```php +public function getConstantValue(string $constantName): string|array|int|bool|null|float; +``` + +
    Get the compiled value of a constant
    + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $constantNamestringThe name of the constant for which you need to get the value
    + +Return value: string | array | int | bool | null | float + + +Throws: + + +
    +
    +
    + + + +```php +public function getConstants(): array; +``` + +
    Get all constants that are available according to the configuration as an array
    + +Parameters: not specified + +Return value: array + + +Throws: + + + +See: + +
    +
    +
    + +
      +
    • # + getConstantsData + :warning: Is internal | source code
    • +
    + +```php +public function getConstantsData(bool $onlyFromCurrentClassAndTraits = false, int $flags = \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity::VISIBILITY_MODIFIERS_FLAG_ANY): array; +``` + +
    Get a list of all constants and classes where they are implemented
    + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $onlyFromCurrentClassAndTraitsboolGet data only for constants from the current class
    $flagsintGet data only for constants corresponding to the visibility modifiers passed in this value
    + +Return value: array + + +Throws: + + +
    +
    +
    + + + +```php +public function getConstantsValues(bool $onlyFromCurrentClassAndTraits = false, int $flags = \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity::VISIBILITY_MODIFIERS_FLAG_ANY): array; +``` + +
    Get class constant compiled values according to filters
    + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $onlyFromCurrentClassAndTraitsboolGet values only for constants from the current class
    $flagsintGet values only for constants corresponding to the visibility modifiers passed in this value
    + +Return value: array + + +Throws: + + +
    +
    +
    + +
      +
    • # + getCurrentRootEntity + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getCurrentRootEntity(): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; +``` + + + +Parameters: not specified + +Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDescription(): string; +``` + +
    Get entity description
    + +Parameters: not specified + +Return value: string + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDescriptionLinks(): array; +``` + +
    Get parsed links from description and doc blocks `see` and `link`
    + +Parameters: not specified + +Return value: array + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDocBlock(): \phpDocumentor\Reflection\DocBlock; +``` + +
    Get DocBlock for current entity
    + +Parameters: not specified + +Return value: \phpDocumentor\Reflection\DocBlock + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDocComment(): string; +``` + +
    Get the doc comment of an entity
    + +Parameters: not specified + +Return value: string + + +Throws: + + +
    +
    +
    + +
      +
    • # + getDocCommentEntity + :warning: Is internal | source code
    • +
    + +```php +public function getDocCommentEntity(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; +``` + +
    Link to an entity where docBlock is implemented for this entity
    + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDocCommentLine(): null|int; +``` + +
    Get the code line number where the docBlock of the current entity begins
    + +Parameters: not specified + +Return value: null | int + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDocNote(): string; +``` + +
    Get the note annotation value
    + +Parameters: not specified + +Return value: string + + +Throws: + + +
    +
    +
    + + + +```php +public function getDocRender(): \BumbleDocGen\Core\Renderer\EntityDocRenderer\EntityDocRendererInterface; +``` + + + +Parameters: not specified + +Return value: \BumbleDocGen\Core\Renderer\EntityDocRenderer\EntityDocRendererInterface + + +Throws: + + +
    +
    +
    + + + +```php +public function getEndLine(): int; +``` + +
    Get the line number of the end of a class code in a file
    + +Parameters: not specified + +Return value: int + + +Throws: + + +
    +
    +
    + + + +```php +public function getEntityDependencies(): array; +``` + + + +Parameters: not specified + +Return value: array + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getExamples(): array; +``` + +
    Get parsed examples from `examples` doc block
    + +Parameters: not specified + +Return value: array + + +Throws: + + +
    +
    +
    + + + +```php +public function getFileContent(): string; +``` + + + +Parameters: not specified + +Return value: string + + +Throws: + + +
    +
    +
    + +
      +
    • # + getFileSourceLink + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getFileSourceLink(bool $withLine = true): null|string; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $withLinebool-
    + +Return value: null | string + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getFirstExample(): string; +``` + +
    Get first example from `examples` doc block
    + +Parameters: not specified + +Return value: string + + +Throws: + + +
    +
    +
    + + + +```php +public function getImplementingClass(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; +``` + +
    Get the class like entity in which the current entity was implemented
    + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + + +
    +
    +
    + + + +```php +public function getInterfaceNames(): array; +``` + +
    Get a list of class interface names
    + +Parameters: not specified + +Return value: array + + +Throws: + + +
    +
    +
    + + + +```php +public function getInterfacesEntities(): array; +``` + +
    Get a list of interface entities that the current class implements
    + +Parameters: not specified + +Return value: array + + +Throws: + + +
    +
    +
    + + + +```php +public function getMethod(string $methodName, bool $unsafe = false): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntity; +``` + +
    Get the method entity by its name
    + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $methodNamestringThe name of the method whose entity you want to get
    $unsafeboolCheck all methods, not just the methods allowed in the configuration (@see PhpHandlerSettings::getMethodEntityFilter())
    + +Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntity + + +Throws: + + +
    +
    +
    + + + +```php +public function getMethodEntitiesCollection(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntitiesCollection; +``` + +
    Get a collection of method entities
    + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntitiesCollection + + +Throws: + + + +See: + +
    +
    +
    + + + +```php +public function getMethods(): array; +``` + +
    Get all methods that are available according to the configuration as an array
    + +Parameters: not specified + +Return value: array + + +Throws: + + + +See: + +
    +
    +
    + +
      +
    • # + getMethodsData + :warning: Is internal | source code
    • +
    + +```php +public function getMethodsData(bool $onlyFromCurrentClassAndTraits = false, int $flags = \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntity::VISIBILITY_MODIFIERS_FLAG_ANY): array; +``` + +
    Get a list of all methods and classes where they are implemented
    + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $onlyFromCurrentClassAndTraitsboolGet data only for methods from the current class
    $flagsintGet data only for methods corresponding to the visibility modifiers passed in this value
    + +Return value: array + + +Throws: + + +
    +
    +
    + + + +```php +public function getModifiersString(): string; +``` + +
    Get entity modifiers as a string
    + +Parameters: not specified + +Return value: string + + +
    +
    +
    + + + +```php +public function getName(): string; +``` + +
    Full name of the entity
    + +Parameters: not specified + +Return value: string + + +
    +
    +
    + + + +```php +public function getNamespaceName(): string; +``` + +
    Get the entity namespace name
    + +Parameters: not specified + +Return value: string + + +
    +
    +
    + + + +```php +public function getObjectId(): string; +``` + +
    Get entity unique ID
    + +Parameters: not specified + +Return value: string + + +
    +
    +
    + + + +```php +public function getParentClass(): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; +``` + +
    Get the entity of the parent class if it exists
    + +Parameters: not specified + +Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + + +
    +
    +
    + + + +```php +public function getParentClassEntities(): array; +``` + +
    Get a list of parent class entities
    + +Parameters: not specified + +Return value: array + + +
    +
    +
    + + + +```php +public function getParentClassName(): null|string; +``` + +
    Get the name of the parent class entity if it exists
    + +Parameters: not specified + +Return value: null | string + + +
    +
    +
    + + + +```php +public function getParentClassNames(): array; +``` + +
    Get a list of entity names of parent classes
    + +Parameters: not specified + +Return value: array + + +
    +
    +
    + + + +```php +public function getPluginData(string $pluginKey): mixed; +``` + +
    Get additional information added using the plugin
    + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $pluginKeystring-
    + +Return value: mixed + + +
    +
    +
    + + + +```php +public function getProperties(): array; +``` + +
    Get all properties that are available according to the configuration as an array
    + +Parameters: not specified + +Return value: array + + +Throws: + + + +See: + +
    +
    +
    + +
      +
    • # + getPropertiesData + :warning: Is internal | source code
    • +
    + +```php +public function getPropertiesData(bool $onlyFromCurrentClassAndTraits = false, int $flags = \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntity::VISIBILITY_MODIFIERS_FLAG_ANY): array; +``` + +
    Get a list of all properties and classes where they are implemented
    + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $onlyFromCurrentClassAndTraitsboolGet data only for properties from the current class
    $flagsintGet data only for properties corresponding to the visibility modifiers passed in this value
    + +Return value: array + + +Throws: + + +
    +
    +
    + + + +```php +public function getProperty(string $propertyName, bool $unsafe = false): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntity; +``` + +
    Get the property entity by its name
    + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $propertyNamestringThe name of the property whose entity you want to get
    $unsafeboolCheck all properties, not just the properties allowed in the configuration (@see PhpHandlerSettings::getPropertyEntityFilter())
    + +Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntity + + +Throws: + + +
    +
    +
    + + + +```php +public function getPropertyDefaultValue(string $propertyName): string|array|int|bool|null|float; +``` + +
    Get the compiled value of a property
    + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $propertyNamestringThe name of the property for which you need to get the value
    + +Return value: string | array | int | bool | null | float + + +Throws: + + +
    +
    +
    + + + +```php +public function getPropertyEntitiesCollection(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntitiesCollection; +``` + +
    Get a collection of property entities
    + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntitiesCollection + + +Throws: + + + +See: + +
    +
    +
    + + + +```php +public function getRelativeFileName(): null|string; +``` + +
    File name relative to project_root configuration parameter
    + +Parameters: not specified + +Return value: null | string + + + +See: + +
    +
    +
    + + + +```php +public function getRootEntityCollection(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; +``` + +
    Get the collection of root entities to which this entity belongs
    + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection + + +
    +
    +
    + + + +```php +public function getShortName(): string; +``` + +
    Short name of the entity
    + +Parameters: not specified + +Return value: string + + +
    +
    +
    + + + +```php +public function getStartLine(): int; +``` + +
    Get the line number of the start of a class code in a file
    + +Parameters: not specified + +Return value: int + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getThrows(): array; +``` + +
    Get parsed throws from `throws` doc block
    + +Parameters: not specified + +Return value: array + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getThrowsDocBlockLinks(): array; +``` + + + +Parameters: not specified + +Return value: array + + +Throws: + + +
    +
    +
    + + + +```php +public function getTraits(): array; +``` + +
    Get a list of trait entities of the current class
    + +Parameters: not specified + +Return value: array + + +Throws: + + +
    +
    +
    + + + +```php +public function getTraitsNames(): array; +``` + +
    Get a list of class traits names
    + +Parameters: not specified + +Return value: array + + +Throws: + + +
    +
    +
    + + + +```php +public function hasConstant(string $constantName, bool $unsafe = false): bool; +``` + +
    Check if a constant exists in a class
    + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $constantNamestringThe name of the class whose entity you want to check
    $unsafeboolCheck all constants, not just the constants allowed in the configuration (@see PhpHandlerSettings::getClassConstantEntityFilter())
    + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function hasDescriptionLinks(): bool; +``` + +
    Checking if an entity has links in its description
    + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function hasExamples(): bool; +``` + +
    Checking if an entity has `example` docBlock
    + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +public function hasMethod(string $methodName, bool $unsafe = false): bool; +``` + +
    Check if a method exists in a class
    + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $methodNamestringThe name of the method whose entity you want to check
    $unsafeboolCheck all methods, not just the methods allowed in the configuration (@see PhpHandlerSettings::getMethodEntityFilter())
    + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +public function hasParentClass(string $parentClassName): bool; +``` + +
    Check if a certain parent class exists in a chain of parent classes
    + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $parentClassNamestringSearched parent class
    + +Return value: bool + + +
    +
    +
    + + + +```php +public function hasProperty(string $propertyName, bool $unsafe = false): bool; +``` + +
    Check if a property exists in a class
    + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $propertyNamestringThe name of the property whose entity you want to check
    $unsafeboolCheck all properties, not just the properties allowed in the configuration (@see PhpHandlerSettings::getPropertyEntityFilter())
    + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function hasThrows(): bool; +``` + +
    Checking if an entity has `throws` docBlock
    + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +public function hasTraits(): bool; +``` + +
    Check if the class contains traits
    + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +public function implementsInterface(string $interfaceName): bool; +``` + +
    Check if a class implements an interface
    + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $interfaceNamestringName of the required interface in the interface chain
    + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +public function isAbstract(): bool; +``` + +
    Check that an entity is abstract
    + +Parameters: not specified + +Return value: bool + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function isApi(): bool; +``` + +
    Checking if an entity has `api` docBlock
    + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +public function isClass(): bool; +``` + +
    Check if an entity is a Class
    + +Parameters: not specified + +Return value: bool + + +
    +
    +
    + + + +```php +public function isClassLoad(): bool; +``` + + + +Parameters: not specified + +Return value: bool + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function isDeprecated(): bool; +``` + +
    Checking if an entity has `deprecated` docBlock
    + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + +
      +
    • # + isDocumentCreationAllowed + :warning: Is internal | source code
    • +
    + +```php +public function isDocumentCreationAllowed(): bool; +``` + + + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + +
      +
    • # + isEntityCacheOutdated + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function isEntityCacheOutdated(): bool; +``` + +
    Checking if the entity cache is out of date
    + +Parameters: not specified + +Return value: bool + + +
    +
    +
    + +
      +
    • # + isEntityDataCacheOutdated + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait + +public function isEntityDataCacheOutdated(): bool; +``` + + + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +public function isEntityDataCanBeLoaded(): bool; +``` + + + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function isEntityFileCanBeLoad(): bool; +``` + +
    Checking if entity data can be retrieved
    + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +public static function isEntityNameValid(string $entityName): bool; +``` + +
    Check if the name is a valid name for ClassLikeEntity
    + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $entityNamestring-
    + +Return value: bool + + +
    +
    +
    + + + +```php +public function isEnum(): bool; +``` + +
    Check if an entity is an Enum
    + +Parameters: not specified + +Return value: bool + + +
    +
    +
    + +
      +
    • # + isExternalLibraryEntity + :warning: Is internal | source code
    • +
    + +```php +public function isExternalLibraryEntity(): bool; +``` + +
    Check if a given entity is an entity from a third party library (connected via composer)
    + +Parameters: not specified + +Return value: bool + + +
    +
    +
    + + + +```php +public function isInGit(): bool; +``` + +
    Checking if class file is in git repository
    + +Parameters: not specified + +Return value: bool + + +
    +
    +
    + + + +```php +public function isInstantiable(): bool; +``` + +
    Check that an entity is instantiable
    + +Parameters: not specified + +Return value: bool + + +
    +
    +
    + + + +```php +public function isInterface(): bool; +``` + +
    Check if an entity is an Interface
    + +Parameters: not specified + +Return value: bool + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function isInternal(): bool; +``` + +
    Checking if an entity has `internal` docBlock
    + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +public function isSubclassOf(string $className): bool; +``` + +
    Whether the given class is a subclass of the specified class
    + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $classNamestring-
    + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +public function isTrait(): bool; +``` + +
    Check if an entity is a Trait
    + +Parameters: not specified + +Return value: bool + + +
    +
    +
    + + + +```php +public static function normalizeClassName(string $name): string; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $namestring-
    + +Return value: string + + +
    +
    +
    + +
      +
    • # + reloadEntityDependenciesCache + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function reloadEntityDependenciesCache(): array; +``` + +
    Update entity dependency cache
    + +Parameters: not specified + +Return value: array + + +
    +
    +
    + +
      +
    • # + removeEntityValueFromCache + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait + +public function removeEntityValueFromCache(string $key): void; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $keystring-
    + +Return value: void + + +
    +
    +
    + +
      +
    • # + removeNotUsedEntityDataCache + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait + +public function removeNotUsedEntityDataCache(): void; +``` + + + +Parameters: not specified + +Return value: void + + +Throws: + + +
    +
    +
    + + + +```php +public function setCustomAst(\PhpParser\Node\Stmt\Trait_|\PhpParser\Node\Stmt\Enum_|\PhpParser\Node\Stmt\Interface_|\PhpParser\Node\Stmt\Class_|null $customAst): void; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $customAst\PhpParser\Node\Stmt\Trait_ | \PhpParser\Node\Stmt\Enum_ | \PhpParser\Node\Stmt\Interface_ | \PhpParser\Node\Stmt\Class_ | null-
    + +Return value: void + + +
    +
    + + \ No newline at end of file diff --git a/docs/tech/2.parser/reflectionApi/php/classes/ClassLikeEntity_4.md b/docs/tech/2.parser/reflectionApi/php/classes/ClassLikeEntity_4.md new file mode 100644 index 00000000..f9fe4794 --- /dev/null +++ b/docs/tech/2.parser/reflectionApi/php/classes/ClassLikeEntity_4.md @@ -0,0 +1,3317 @@ + + BumbleDocGen / Technical description of the project / Parser / Reflection API / Reflection API for PHP / PHP class reflection API / ClassLikeEntity
    + +

    + ClassLikeEntity class: +

    + + + + + +```php +namespace BumbleDocGen\LanguageHandler\Php\Parser\Entity; + +abstract class ClassLikeEntity extends \BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity implements \BumbleDocGen\Core\Renderer\Context\DocumentTransformableEntityInterface, \BumbleDocGen\Core\Parser\Entity\RootEntityInterface, \BumbleDocGen\Core\Parser\Entity\EntityInterface, \BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityInterface +``` + + + + + + + + +

    Initialization methods:

    + +
      +
    1. + __construct +
    2. +
    + +

    Methods:

    + +
      +
    1. + addPluginData + - Add information to aт entity object
    2. +
    3. + cursorToDocAttributeLinkFragment +
    4. +
    5. + getAbsoluteFileName + - Returns the absolute path to a file if it can be retrieved and if the file is in the project directory
    6. +
    7. + getAst + - Get AST for this entity
    8. +
    9. + getCacheKey +
    10. +
    11. + getCachedEntityDependencies +
    12. +
    13. + getConstant + - Get the method entity by its name
    14. +
    15. + getConstantEntitiesCollection + - Get a collection of constant entities
    16. +
    17. + getConstantValue + - Get the compiled value of a constant
    18. +
    19. + getConstants + - Get all constants that are available according to the configuration as an array
    20. +
    21. + getConstantsData + - Get a list of all constants and classes where they are implemented
    22. +
    23. + getConstantsValues + - Get class constant compiled values according to filters
    24. +
    25. + getCurrentRootEntity +
    26. +
    27. + getDescription + - Get entity description
    28. +
    29. + getDescriptionLinks + - Get parsed links from description and doc blocks `see` and `link`
    30. +
    31. + getDocBlock + - Get DocBlock for current entity
    32. +
    33. + getDocComment + - Get the doc comment of an entity
    34. +
    35. + getDocCommentEntity + - Link to an entity where docBlock is implemented for this entity
    36. +
    37. + getDocCommentLine + - Get the code line number where the docBlock of the current entity begins
    38. +
    39. + getDocNote + - Get the note annotation value
    40. +
    41. + getDocRender +
    42. +
    43. + getEndLine + - Get the line number of the end of a class code in a file
    44. +
    45. + getEntityDependencies +
    46. +
    47. + getExamples + - Get parsed examples from `examples` doc block
    48. +
    49. + getFileContent +
    50. +
    51. + getFileSourceLink +
    52. +
    53. + getFirstExample + - Get first example from `examples` doc block
    54. +
    55. + getImplementingClass + - Get the class like entity in which the current entity was implemented
    56. +
    57. + getInterfaceNames + - Get a list of class interface names
    58. +
    59. + getInterfacesEntities + - Get a list of interface entities that the current class implements
    60. +
    61. + getMethod + - Get the method entity by its name
    62. +
    63. + getMethodEntitiesCollection + - Get a collection of method entities
    64. +
    65. + getMethods + - Get all methods that are available according to the configuration as an array
    66. +
    67. + getMethodsData + - Get a list of all methods and classes where they are implemented
    68. +
    69. + getModifiersString + - Get entity modifiers as a string
    70. +
    71. + getName + - Full name of the entity
    72. +
    73. + getNamespaceName + - Get the entity namespace name
    74. +
    75. + getObjectId + - Get entity unique ID
    76. +
    77. + getParentClass + - Get the entity of the parent class if it exists
    78. +
    79. + getParentClassEntities + - Get a list of parent class entities
    80. +
    81. + getParentClassName + - Get the name of the parent class entity if it exists
    82. +
    83. + getParentClassNames + - Get a list of entity names of parent classes
    84. +
    85. + getPluginData + - Get additional information added using the plugin
    86. +
    87. + getProperties + - Get all properties that are available according to the configuration as an array
    88. +
    89. + getPropertiesData + - Get a list of all properties and classes where they are implemented
    90. +
    91. + getProperty + - Get the property entity by its name
    92. +
    93. + getPropertyDefaultValue + - Get the compiled value of a property
    94. +
    95. + getPropertyEntitiesCollection + - Get a collection of property entities
    96. +
    97. + getRelativeFileName + - File name relative to project_root configuration parameter
    98. +
    99. + getRootEntityCollection + - Get the collection of root entities to which this entity belongs
    100. +
    101. + getShortName + - Short name of the entity
    102. +
    103. + getStartLine + - Get the line number of the start of a class code in a file
    104. +
    105. + getThrows + - Get parsed throws from `throws` doc block
    106. +
    107. + getThrowsDocBlockLinks +
    108. +
    109. + getTraits + - Get a list of trait entities of the current class
    110. +
    111. + getTraitsNames + - Get a list of class traits names
    112. +
    113. + hasConstant + - Check if a constant exists in a class
    114. +
    115. + hasDescriptionLinks + - Checking if an entity has links in its description
    116. +
    117. + hasExamples + - Checking if an entity has `example` docBlock
    118. +
    119. + hasMethod + - Check if a method exists in a class
    120. +
    121. + hasParentClass + - Check if a certain parent class exists in a chain of parent classes
    122. +
    123. + hasProperty + - Check if a property exists in a class
    124. +
    125. + hasThrows + - Checking if an entity has `throws` docBlock
    126. +
    127. + hasTraits + - Check if the class contains traits
    128. +
    129. + implementsInterface + - Check if a class implements an interface
    130. +
    131. + isAbstract + - Check that an entity is abstract
    132. +
    133. + isApi + - Checking if an entity has `api` docBlock
    134. +
    135. + isClass + - Check if an entity is a Class
    136. +
    137. + isClassLoad +
    138. +
    139. + isDeprecated + - Checking if an entity has `deprecated` docBlock
    140. +
    141. + isDocumentCreationAllowed +
    142. +
    143. + isEntityCacheOutdated + - Checking if the entity cache is out of date
    144. +
    145. + isEntityDataCacheOutdated +
    146. +
    147. + isEntityDataCanBeLoaded +
    148. +
    149. + isEntityFileCanBeLoad + - Checking if entity data can be retrieved
    150. +
    151. + isEntityNameValid + - Check if the name is a valid name for ClassLikeEntity
    152. +
    153. + isEnum + - Check if an entity is an Enum
    154. +
    155. + isExternalLibraryEntity + - Check if a given entity is an entity from a third party library (connected via composer)
    156. +
    157. + isInGit + - Checking if class file is in git repository
    158. +
    159. + isInstantiable + - Check that an entity is instantiable
    160. +
    161. + isInterface + - Check if an entity is an Interface
    162. +
    163. + isInternal + - Checking if an entity has `internal` docBlock
    164. +
    165. + isSubclassOf + - Whether the given class is a subclass of the specified class
    166. +
    167. + isTrait + - Check if an entity is a Trait
    168. +
    169. + normalizeClassName +
    170. +
    171. + reloadEntityDependenciesCache + - Update entity dependency cache
    172. +
    173. + removeEntityValueFromCache +
    174. +
    175. + removeNotUsedEntityDataCache +
    176. +
    177. + setCustomAst +
    178. +
    + + + + + + + +

    Method details:

    + +
    + + + +```php +public function __construct(\BumbleDocGen\Core\Configuration\Configuration $configuration, \BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings $phpHandlerSettings, \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection $entitiesCollection, \BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper $parserHelper, \BumbleDocGen\LanguageHandler\Php\Parser\ComposerHelper $composerHelper, \BumbleDocGen\LanguageHandler\Php\Parser\PhpParser\PhpParserHelper $phpParserHelper, \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache $localObjectCache, \Psr\Log\LoggerInterface $logger, string $className, string|null $relativeFileName); +``` + + + +Parameters: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $configuration\BumbleDocGen\Core\Configuration\Configuration-
    $phpHandlerSettings\BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings-
    $entitiesCollection\BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection-
    $parserHelper\BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper-
    $composerHelper\BumbleDocGen\LanguageHandler\Php\Parser\ComposerHelper-
    $phpParserHelper\BumbleDocGen\LanguageHandler\Php\Parser\PhpParser\PhpParserHelper-
    $localObjectCache\BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache-
    $logger\Psr\Log\LoggerInterface-
    $classNamestring-
    $relativeFileNamestring | null-
    + + + +
    +
    +
    + + + +```php +public function addPluginData(string $pluginKey, mixed $data): void; +``` + +
    Add information to aт entity object
    + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $pluginKeystring-
    $datamixed-
    + +Return value: void + + +
    +
    +
    + +
      +
    • # + cursorToDocAttributeLinkFragment + :warning: Is internal | source code
    • +
    + +```php +public function cursorToDocAttributeLinkFragment(string $cursor, bool $isForDocument = true): string; +``` + + + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $cursorstring-
    $isForDocumentbool-
    + +Return value: string + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getAbsoluteFileName(): null|string; +``` + +
    Returns the absolute path to a file if it can be retrieved and if the file is in the project directory
    + +Parameters: not specified + +Return value: null | string + + +Throws: + + +
    +
    +
    + + + +```php +public function getAst(): \PhpParser\Node\Stmt\Class_|\PhpParser\Node\Stmt\Interface_|\PhpParser\Node\Stmt\Trait_|\PhpParser\Node\Stmt\Enum_; +``` + +
    Get AST for this entity
    + +Parameters: not specified + +Return value: \PhpParser\Node\Stmt\Class_ | \PhpParser\Node\Stmt\Interface_ | \PhpParser\Node\Stmt\Trait_ | \PhpParser\Node\Stmt\Enum_ + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait + +public function getCacheKey(): string; +``` + + + +Parameters: not specified + +Return value: string + + +
    +
    +
    + +
      +
    • # + getCachedEntityDependencies + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getCachedEntityDependencies(): array; +``` + + + +Parameters: not specified + +Return value: array + + +Throws: + + +
    +
    +
    + + + +```php +public function getConstant(string $constantName, bool $unsafe = false): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity; +``` + +
    Get the method entity by its name
    + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $constantNamestringThe name of the constant whose entity you want to get
    $unsafeboolCheck all constants, not just the constants allowed in the configuration (@see PhpHandlerSettings::getClassConstantEntityFilter())
    + +Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity + + +Throws: + + +
    +
    +
    + + + +```php +public function getConstantEntitiesCollection(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntitiesCollection; +``` + +
    Get a collection of constant entities
    + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntitiesCollection + + +Throws: + + + +See: + +
    +
    +
    + + + +```php +public function getConstantValue(string $constantName): string|array|int|bool|null|float; +``` + +
    Get the compiled value of a constant
    + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $constantNamestringThe name of the constant for which you need to get the value
    + +Return value: string | array | int | bool | null | float + + +Throws: + + +
    +
    +
    + + + +```php +public function getConstants(): array; +``` + +
    Get all constants that are available according to the configuration as an array
    + +Parameters: not specified + +Return value: array + + +Throws: + + + +See: + +
    +
    +
    + +
      +
    • # + getConstantsData + :warning: Is internal | source code
    • +
    + +```php +public function getConstantsData(bool $onlyFromCurrentClassAndTraits = false, int $flags = \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity::VISIBILITY_MODIFIERS_FLAG_ANY): array; +``` + +
    Get a list of all constants and classes where they are implemented
    + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $onlyFromCurrentClassAndTraitsboolGet data only for constants from the current class
    $flagsintGet data only for constants corresponding to the visibility modifiers passed in this value
    + +Return value: array + + +Throws: + + +
    +
    +
    + + + +```php +public function getConstantsValues(bool $onlyFromCurrentClassAndTraits = false, int $flags = \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity::VISIBILITY_MODIFIERS_FLAG_ANY): array; +``` + +
    Get class constant compiled values according to filters
    + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $onlyFromCurrentClassAndTraitsboolGet values only for constants from the current class
    $flagsintGet values only for constants corresponding to the visibility modifiers passed in this value
    + +Return value: array + + +Throws: + + +
    +
    +
    + +
      +
    • # + getCurrentRootEntity + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getCurrentRootEntity(): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; +``` + + + +Parameters: not specified + +Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDescription(): string; +``` + +
    Get entity description
    + +Parameters: not specified + +Return value: string + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDescriptionLinks(): array; +``` + +
    Get parsed links from description and doc blocks `see` and `link`
    + +Parameters: not specified + +Return value: array + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDocBlock(): \phpDocumentor\Reflection\DocBlock; +``` + +
    Get DocBlock for current entity
    + +Parameters: not specified + +Return value: \phpDocumentor\Reflection\DocBlock + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDocComment(): string; +``` + +
    Get the doc comment of an entity
    + +Parameters: not specified + +Return value: string + + +Throws: + + +
    +
    +
    + +
      +
    • # + getDocCommentEntity + :warning: Is internal | source code
    • +
    + +```php +public function getDocCommentEntity(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; +``` + +
    Link to an entity where docBlock is implemented for this entity
    + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDocCommentLine(): null|int; +``` + +
    Get the code line number where the docBlock of the current entity begins
    + +Parameters: not specified + +Return value: null | int + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDocNote(): string; +``` + +
    Get the note annotation value
    + +Parameters: not specified + +Return value: string + + +Throws: + + +
    +
    +
    + + + +```php +public function getDocRender(): \BumbleDocGen\Core\Renderer\EntityDocRenderer\EntityDocRendererInterface; +``` + + + +Parameters: not specified + +Return value: \BumbleDocGen\Core\Renderer\EntityDocRenderer\EntityDocRendererInterface + + +Throws: + + +
    +
    +
    + + + +```php +public function getEndLine(): int; +``` + +
    Get the line number of the end of a class code in a file
    + +Parameters: not specified + +Return value: int + + +Throws: + + +
    +
    +
    + + + +```php +public function getEntityDependencies(): array; +``` + + + +Parameters: not specified + +Return value: array + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getExamples(): array; +``` + +
    Get parsed examples from `examples` doc block
    + +Parameters: not specified + +Return value: array + + +Throws: + + +
    +
    +
    + + + +```php +public function getFileContent(): string; +``` + + + +Parameters: not specified + +Return value: string + + +Throws: + + +
    +
    +
    + +
      +
    • # + getFileSourceLink + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getFileSourceLink(bool $withLine = true): null|string; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $withLinebool-
    + +Return value: null | string + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getFirstExample(): string; +``` + +
    Get first example from `examples` doc block
    + +Parameters: not specified + +Return value: string + + +Throws: + + +
    +
    +
    + + + +```php +public function getImplementingClass(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; +``` + +
    Get the class like entity in which the current entity was implemented
    + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + + +
    +
    +
    + + + +```php +public function getInterfaceNames(): array; +``` + +
    Get a list of class interface names
    + +Parameters: not specified + +Return value: array + + +Throws: + + +
    +
    +
    + + + +```php +public function getInterfacesEntities(): array; +``` + +
    Get a list of interface entities that the current class implements
    + +Parameters: not specified + +Return value: array + + +Throws: + + +
    +
    +
    + + + +```php +public function getMethod(string $methodName, bool $unsafe = false): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntity; +``` + +
    Get the method entity by its name
    + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $methodNamestringThe name of the method whose entity you want to get
    $unsafeboolCheck all methods, not just the methods allowed in the configuration (@see PhpHandlerSettings::getMethodEntityFilter())
    + +Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntity + + +Throws: + + +
    +
    +
    + + + +```php +public function getMethodEntitiesCollection(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntitiesCollection; +``` + +
    Get a collection of method entities
    + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntitiesCollection + + +Throws: + + + +See: + +
    +
    +
    + + + +```php +public function getMethods(): array; +``` + +
    Get all methods that are available according to the configuration as an array
    + +Parameters: not specified + +Return value: array + + +Throws: + + + +See: + +
    +
    +
    + +
      +
    • # + getMethodsData + :warning: Is internal | source code
    • +
    + +```php +public function getMethodsData(bool $onlyFromCurrentClassAndTraits = false, int $flags = \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntity::VISIBILITY_MODIFIERS_FLAG_ANY): array; +``` + +
    Get a list of all methods and classes where they are implemented
    + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $onlyFromCurrentClassAndTraitsboolGet data only for methods from the current class
    $flagsintGet data only for methods corresponding to the visibility modifiers passed in this value
    + +Return value: array + + +Throws: + + +
    +
    +
    + + + +```php +public function getModifiersString(): string; +``` + +
    Get entity modifiers as a string
    + +Parameters: not specified + +Return value: string + + +
    +
    +
    + + + +```php +public function getName(): string; +``` + +
    Full name of the entity
    + +Parameters: not specified + +Return value: string + + +
    +
    +
    + + + +```php +public function getNamespaceName(): string; +``` + +
    Get the entity namespace name
    + +Parameters: not specified + +Return value: string + + +
    +
    +
    + + + +```php +public function getObjectId(): string; +``` + +
    Get entity unique ID
    + +Parameters: not specified + +Return value: string + + +
    +
    +
    + + + +```php +public function getParentClass(): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; +``` + +
    Get the entity of the parent class if it exists
    + +Parameters: not specified + +Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + + +
    +
    +
    + + + +```php +public function getParentClassEntities(): array; +``` + +
    Get a list of parent class entities
    + +Parameters: not specified + +Return value: array + + +
    +
    +
    + + + +```php +public function getParentClassName(): null|string; +``` + +
    Get the name of the parent class entity if it exists
    + +Parameters: not specified + +Return value: null | string + + +
    +
    +
    + + + +```php +public function getParentClassNames(): array; +``` + +
    Get a list of entity names of parent classes
    + +Parameters: not specified + +Return value: array + + +
    +
    +
    + + + +```php +public function getPluginData(string $pluginKey): mixed; +``` + +
    Get additional information added using the plugin
    + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $pluginKeystring-
    + +Return value: mixed + + +
    +
    +
    + + + +```php +public function getProperties(): array; +``` + +
    Get all properties that are available according to the configuration as an array
    + +Parameters: not specified + +Return value: array + + +Throws: + + + +See: + +
    +
    +
    + +
      +
    • # + getPropertiesData + :warning: Is internal | source code
    • +
    + +```php +public function getPropertiesData(bool $onlyFromCurrentClassAndTraits = false, int $flags = \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntity::VISIBILITY_MODIFIERS_FLAG_ANY): array; +``` + +
    Get a list of all properties and classes where they are implemented
    + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $onlyFromCurrentClassAndTraitsboolGet data only for properties from the current class
    $flagsintGet data only for properties corresponding to the visibility modifiers passed in this value
    + +Return value: array + + +Throws: + + +
    +
    +
    + + + +```php +public function getProperty(string $propertyName, bool $unsafe = false): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntity; +``` + +
    Get the property entity by its name
    + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $propertyNamestringThe name of the property whose entity you want to get
    $unsafeboolCheck all properties, not just the properties allowed in the configuration (@see PhpHandlerSettings::getPropertyEntityFilter())
    + +Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntity + + +Throws: + + +
    +
    +
    + + + +```php +public function getPropertyDefaultValue(string $propertyName): string|array|int|bool|null|float; +``` + +
    Get the compiled value of a property
    + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $propertyNamestringThe name of the property for which you need to get the value
    + +Return value: string | array | int | bool | null | float + + +Throws: + + +
    +
    +
    + + + +```php +public function getPropertyEntitiesCollection(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntitiesCollection; +``` + +
    Get a collection of property entities
    + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntitiesCollection + + +Throws: + + + +See: + +
    +
    +
    + + + +```php +public function getRelativeFileName(): null|string; +``` + +
    File name relative to project_root configuration parameter
    + +Parameters: not specified + +Return value: null | string + + + +See: + +
    +
    +
    + + + +```php +public function getRootEntityCollection(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; +``` + +
    Get the collection of root entities to which this entity belongs
    + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection + + +
    +
    +
    + + + +```php +public function getShortName(): string; +``` + +
    Short name of the entity
    + +Parameters: not specified + +Return value: string + + +
    +
    +
    + + + +```php +public function getStartLine(): int; +``` + +
    Get the line number of the start of a class code in a file
    + +Parameters: not specified + +Return value: int + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getThrows(): array; +``` + +
    Get parsed throws from `throws` doc block
    + +Parameters: not specified + +Return value: array + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getThrowsDocBlockLinks(): array; +``` + + + +Parameters: not specified + +Return value: array + + +Throws: + + +
    +
    +
    + + + +```php +public function getTraits(): array; +``` + +
    Get a list of trait entities of the current class
    + +Parameters: not specified + +Return value: array + + +Throws: + + +
    +
    +
    + + + +```php +public function getTraitsNames(): array; +``` + +
    Get a list of class traits names
    + +Parameters: not specified + +Return value: array + + +Throws: + + +
    +
    +
    + + + +```php +public function hasConstant(string $constantName, bool $unsafe = false): bool; +``` + +
    Check if a constant exists in a class
    + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $constantNamestringThe name of the class whose entity you want to check
    $unsafeboolCheck all constants, not just the constants allowed in the configuration (@see PhpHandlerSettings::getClassConstantEntityFilter())
    + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function hasDescriptionLinks(): bool; +``` + +
    Checking if an entity has links in its description
    + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function hasExamples(): bool; +``` + +
    Checking if an entity has `example` docBlock
    + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +public function hasMethod(string $methodName, bool $unsafe = false): bool; +``` + +
    Check if a method exists in a class
    + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $methodNamestringThe name of the method whose entity you want to check
    $unsafeboolCheck all methods, not just the methods allowed in the configuration (@see PhpHandlerSettings::getMethodEntityFilter())
    + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +public function hasParentClass(string $parentClassName): bool; +``` + +
    Check if a certain parent class exists in a chain of parent classes
    + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $parentClassNamestringSearched parent class
    + +Return value: bool + + +
    +
    +
    + + + +```php +public function hasProperty(string $propertyName, bool $unsafe = false): bool; +``` + +
    Check if a property exists in a class
    + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $propertyNamestringThe name of the property whose entity you want to check
    $unsafeboolCheck all properties, not just the properties allowed in the configuration (@see PhpHandlerSettings::getPropertyEntityFilter())
    + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function hasThrows(): bool; +``` + +
    Checking if an entity has `throws` docBlock
    + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +public function hasTraits(): bool; +``` + +
    Check if the class contains traits
    + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +public function implementsInterface(string $interfaceName): bool; +``` + +
    Check if a class implements an interface
    + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $interfaceNamestringName of the required interface in the interface chain
    + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +public function isAbstract(): bool; +``` + +
    Check that an entity is abstract
    + +Parameters: not specified + +Return value: bool + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function isApi(): bool; +``` + +
    Checking if an entity has `api` docBlock
    + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +public function isClass(): bool; +``` + +
    Check if an entity is a Class
    + +Parameters: not specified + +Return value: bool + + +
    +
    +
    + + + +```php +public function isClassLoad(): bool; +``` + + + +Parameters: not specified + +Return value: bool + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function isDeprecated(): bool; +``` + +
    Checking if an entity has `deprecated` docBlock
    + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + +
      +
    • # + isDocumentCreationAllowed + :warning: Is internal | source code
    • +
    + +```php +public function isDocumentCreationAllowed(): bool; +``` + + + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + +
      +
    • # + isEntityCacheOutdated + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function isEntityCacheOutdated(): bool; +``` + +
    Checking if the entity cache is out of date
    + +Parameters: not specified + +Return value: bool + + +
    +
    +
    + +
      +
    • # + isEntityDataCacheOutdated + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait + +public function isEntityDataCacheOutdated(): bool; +``` + + + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +public function isEntityDataCanBeLoaded(): bool; +``` + + + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function isEntityFileCanBeLoad(): bool; +``` + +
    Checking if entity data can be retrieved
    + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +public static function isEntityNameValid(string $entityName): bool; +``` + +
    Check if the name is a valid name for ClassLikeEntity
    + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $entityNamestring-
    + +Return value: bool + + +
    +
    +
    + + + +```php +public function isEnum(): bool; +``` + +
    Check if an entity is an Enum
    + +Parameters: not specified + +Return value: bool + + +
    +
    +
    + +
      +
    • # + isExternalLibraryEntity + :warning: Is internal | source code
    • +
    + +```php +public function isExternalLibraryEntity(): bool; +``` + +
    Check if a given entity is an entity from a third party library (connected via composer)
    + +Parameters: not specified + +Return value: bool + + +
    +
    +
    + + + +```php +public function isInGit(): bool; +``` + +
    Checking if class file is in git repository
    + +Parameters: not specified + +Return value: bool + + +
    +
    +
    + + + +```php +public function isInstantiable(): bool; +``` + +
    Check that an entity is instantiable
    + +Parameters: not specified + +Return value: bool + + +
    +
    +
    + + + +```php +public function isInterface(): bool; +``` + +
    Check if an entity is an Interface
    + +Parameters: not specified + +Return value: bool + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function isInternal(): bool; +``` + +
    Checking if an entity has `internal` docBlock
    + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +public function isSubclassOf(string $className): bool; +``` + +
    Whether the given class is a subclass of the specified class
    + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $classNamestring-
    + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +public function isTrait(): bool; +``` + +
    Check if an entity is a Trait
    + +Parameters: not specified + +Return value: bool + + +
    +
    +
    + + + +```php +public static function normalizeClassName(string $name): string; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $namestring-
    + +Return value: string + + +
    +
    +
    + +
      +
    • # + reloadEntityDependenciesCache + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function reloadEntityDependenciesCache(): array; +``` + +
    Update entity dependency cache
    + +Parameters: not specified + +Return value: array + + +
    +
    +
    + +
      +
    • # + removeEntityValueFromCache + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait + +public function removeEntityValueFromCache(string $key): void; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $keystring-
    + +Return value: void + + +
    +
    +
    + +
      +
    • # + removeNotUsedEntityDataCache + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait + +public function removeNotUsedEntityDataCache(): void; +``` + + + +Parameters: not specified + +Return value: void + + +Throws: + + +
    +
    +
    + + + +```php +public function setCustomAst(\PhpParser\Node\Stmt\Trait_|\PhpParser\Node\Stmt\Enum_|\PhpParser\Node\Stmt\Interface_|\PhpParser\Node\Stmt\Class_|null $customAst): void; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $customAst\PhpParser\Node\Stmt\Trait_ | \PhpParser\Node\Stmt\Enum_ | \PhpParser\Node\Stmt\Interface_ | \PhpParser\Node\Stmt\Class_ | null-
    + +Return value: void + + +
    +
    + + \ No newline at end of file diff --git a/docs/tech/2.parser/reflectionApi/php/classes/ClassLikeEntity_5.md b/docs/tech/2.parser/reflectionApi/php/classes/ClassLikeEntity_5.md new file mode 100644 index 00000000..292cb50c --- /dev/null +++ b/docs/tech/2.parser/reflectionApi/php/classes/ClassLikeEntity_5.md @@ -0,0 +1,3317 @@ + + BumbleDocGen / Technical description of the project / Parser / Reflection API / Reflection API for PHP / ClassLikeEntity
    + +

    + ClassLikeEntity class: +

    + + + + + +```php +namespace BumbleDocGen\LanguageHandler\Php\Parser\Entity; + +abstract class ClassLikeEntity extends \BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity implements \BumbleDocGen\Core\Renderer\Context\DocumentTransformableEntityInterface, \BumbleDocGen\Core\Parser\Entity\RootEntityInterface, \BumbleDocGen\Core\Parser\Entity\EntityInterface, \BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityInterface +``` + + + + + + + + +

    Initialization methods:

    + +
      +
    1. + __construct +
    2. +
    + +

    Methods:

    + +
      +
    1. + addPluginData + - Add information to aт entity object
    2. +
    3. + cursorToDocAttributeLinkFragment +
    4. +
    5. + getAbsoluteFileName + - Returns the absolute path to a file if it can be retrieved and if the file is in the project directory
    6. +
    7. + getAst + - Get AST for this entity
    8. +
    9. + getCacheKey +
    10. +
    11. + getCachedEntityDependencies +
    12. +
    13. + getConstant + - Get the method entity by its name
    14. +
    15. + getConstantEntitiesCollection + - Get a collection of constant entities
    16. +
    17. + getConstantValue + - Get the compiled value of a constant
    18. +
    19. + getConstants + - Get all constants that are available according to the configuration as an array
    20. +
    21. + getConstantsData + - Get a list of all constants and classes where they are implemented
    22. +
    23. + getConstantsValues + - Get class constant compiled values according to filters
    24. +
    25. + getCurrentRootEntity +
    26. +
    27. + getDescription + - Get entity description
    28. +
    29. + getDescriptionLinks + - Get parsed links from description and doc blocks `see` and `link`
    30. +
    31. + getDocBlock + - Get DocBlock for current entity
    32. +
    33. + getDocComment + - Get the doc comment of an entity
    34. +
    35. + getDocCommentEntity + - Link to an entity where docBlock is implemented for this entity
    36. +
    37. + getDocCommentLine + - Get the code line number where the docBlock of the current entity begins
    38. +
    39. + getDocNote + - Get the note annotation value
    40. +
    41. + getDocRender +
    42. +
    43. + getEndLine + - Get the line number of the end of a class code in a file
    44. +
    45. + getEntityDependencies +
    46. +
    47. + getExamples + - Get parsed examples from `examples` doc block
    48. +
    49. + getFileContent +
    50. +
    51. + getFileSourceLink +
    52. +
    53. + getFirstExample + - Get first example from `examples` doc block
    54. +
    55. + getImplementingClass + - Get the class like entity in which the current entity was implemented
    56. +
    57. + getInterfaceNames + - Get a list of class interface names
    58. +
    59. + getInterfacesEntities + - Get a list of interface entities that the current class implements
    60. +
    61. + getMethod + - Get the method entity by its name
    62. +
    63. + getMethodEntitiesCollection + - Get a collection of method entities
    64. +
    65. + getMethods + - Get all methods that are available according to the configuration as an array
    66. +
    67. + getMethodsData + - Get a list of all methods and classes where they are implemented
    68. +
    69. + getModifiersString + - Get entity modifiers as a string
    70. +
    71. + getName + - Full name of the entity
    72. +
    73. + getNamespaceName + - Get the entity namespace name
    74. +
    75. + getObjectId + - Get entity unique ID
    76. +
    77. + getParentClass + - Get the entity of the parent class if it exists
    78. +
    79. + getParentClassEntities + - Get a list of parent class entities
    80. +
    81. + getParentClassName + - Get the name of the parent class entity if it exists
    82. +
    83. + getParentClassNames + - Get a list of entity names of parent classes
    84. +
    85. + getPluginData + - Get additional information added using the plugin
    86. +
    87. + getProperties + - Get all properties that are available according to the configuration as an array
    88. +
    89. + getPropertiesData + - Get a list of all properties and classes where they are implemented
    90. +
    91. + getProperty + - Get the property entity by its name
    92. +
    93. + getPropertyDefaultValue + - Get the compiled value of a property
    94. +
    95. + getPropertyEntitiesCollection + - Get a collection of property entities
    96. +
    97. + getRelativeFileName + - File name relative to project_root configuration parameter
    98. +
    99. + getRootEntityCollection + - Get the collection of root entities to which this entity belongs
    100. +
    101. + getShortName + - Short name of the entity
    102. +
    103. + getStartLine + - Get the line number of the start of a class code in a file
    104. +
    105. + getThrows + - Get parsed throws from `throws` doc block
    106. +
    107. + getThrowsDocBlockLinks +
    108. +
    109. + getTraits + - Get a list of trait entities of the current class
    110. +
    111. + getTraitsNames + - Get a list of class traits names
    112. +
    113. + hasConstant + - Check if a constant exists in a class
    114. +
    115. + hasDescriptionLinks + - Checking if an entity has links in its description
    116. +
    117. + hasExamples + - Checking if an entity has `example` docBlock
    118. +
    119. + hasMethod + - Check if a method exists in a class
    120. +
    121. + hasParentClass + - Check if a certain parent class exists in a chain of parent classes
    122. +
    123. + hasProperty + - Check if a property exists in a class
    124. +
    125. + hasThrows + - Checking if an entity has `throws` docBlock
    126. +
    127. + hasTraits + - Check if the class contains traits
    128. +
    129. + implementsInterface + - Check if a class implements an interface
    130. +
    131. + isAbstract + - Check that an entity is abstract
    132. +
    133. + isApi + - Checking if an entity has `api` docBlock
    134. +
    135. + isClass + - Check if an entity is a Class
    136. +
    137. + isClassLoad +
    138. +
    139. + isDeprecated + - Checking if an entity has `deprecated` docBlock
    140. +
    141. + isDocumentCreationAllowed +
    142. +
    143. + isEntityCacheOutdated + - Checking if the entity cache is out of date
    144. +
    145. + isEntityDataCacheOutdated +
    146. +
    147. + isEntityDataCanBeLoaded +
    148. +
    149. + isEntityFileCanBeLoad + - Checking if entity data can be retrieved
    150. +
    151. + isEntityNameValid + - Check if the name is a valid name for ClassLikeEntity
    152. +
    153. + isEnum + - Check if an entity is an Enum
    154. +
    155. + isExternalLibraryEntity + - Check if a given entity is an entity from a third party library (connected via composer)
    156. +
    157. + isInGit + - Checking if class file is in git repository
    158. +
    159. + isInstantiable + - Check that an entity is instantiable
    160. +
    161. + isInterface + - Check if an entity is an Interface
    162. +
    163. + isInternal + - Checking if an entity has `internal` docBlock
    164. +
    165. + isSubclassOf + - Whether the given class is a subclass of the specified class
    166. +
    167. + isTrait + - Check if an entity is a Trait
    168. +
    169. + normalizeClassName +
    170. +
    171. + reloadEntityDependenciesCache + - Update entity dependency cache
    172. +
    173. + removeEntityValueFromCache +
    174. +
    175. + removeNotUsedEntityDataCache +
    176. +
    177. + setCustomAst +
    178. +
    + + + + + + + +

    Method details:

    + +
    + + + +```php +public function __construct(\BumbleDocGen\Core\Configuration\Configuration $configuration, \BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings $phpHandlerSettings, \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection $entitiesCollection, \BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper $parserHelper, \BumbleDocGen\LanguageHandler\Php\Parser\ComposerHelper $composerHelper, \BumbleDocGen\LanguageHandler\Php\Parser\PhpParser\PhpParserHelper $phpParserHelper, \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache $localObjectCache, \Psr\Log\LoggerInterface $logger, string $className, string|null $relativeFileName); +``` + + + +Parameters: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $configuration\BumbleDocGen\Core\Configuration\Configuration-
    $phpHandlerSettings\BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings-
    $entitiesCollection\BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection-
    $parserHelper\BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper-
    $composerHelper\BumbleDocGen\LanguageHandler\Php\Parser\ComposerHelper-
    $phpParserHelper\BumbleDocGen\LanguageHandler\Php\Parser\PhpParser\PhpParserHelper-
    $localObjectCache\BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache-
    $logger\Psr\Log\LoggerInterface-
    $classNamestring-
    $relativeFileNamestring | null-
    + + + +
    +
    +
    + + + +```php +public function addPluginData(string $pluginKey, mixed $data): void; +``` + +
    Add information to aт entity object
    + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $pluginKeystring-
    $datamixed-
    + +Return value: void + + +
    +
    +
    + +
      +
    • # + cursorToDocAttributeLinkFragment + :warning: Is internal | source code
    • +
    + +```php +public function cursorToDocAttributeLinkFragment(string $cursor, bool $isForDocument = true): string; +``` + + + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $cursorstring-
    $isForDocumentbool-
    + +Return value: string + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getAbsoluteFileName(): null|string; +``` + +
    Returns the absolute path to a file if it can be retrieved and if the file is in the project directory
    + +Parameters: not specified + +Return value: null | string + + +Throws: + + +
    +
    +
    + + + +```php +public function getAst(): \PhpParser\Node\Stmt\Class_|\PhpParser\Node\Stmt\Interface_|\PhpParser\Node\Stmt\Trait_|\PhpParser\Node\Stmt\Enum_; +``` + +
    Get AST for this entity
    + +Parameters: not specified + +Return value: \PhpParser\Node\Stmt\Class_ | \PhpParser\Node\Stmt\Interface_ | \PhpParser\Node\Stmt\Trait_ | \PhpParser\Node\Stmt\Enum_ + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait + +public function getCacheKey(): string; +``` + + + +Parameters: not specified + +Return value: string + + +
    +
    +
    + +
      +
    • # + getCachedEntityDependencies + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getCachedEntityDependencies(): array; +``` + + + +Parameters: not specified + +Return value: array + + +Throws: + + +
    +
    +
    + + + +```php +public function getConstant(string $constantName, bool $unsafe = false): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity; +``` + +
    Get the method entity by its name
    + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $constantNamestringThe name of the constant whose entity you want to get
    $unsafeboolCheck all constants, not just the constants allowed in the configuration (@see PhpHandlerSettings::getClassConstantEntityFilter())
    + +Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity + + +Throws: + + +
    +
    +
    + + + +```php +public function getConstantEntitiesCollection(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntitiesCollection; +``` + +
    Get a collection of constant entities
    + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntitiesCollection + + +Throws: + + + +See: + +
    +
    +
    + + + +```php +public function getConstantValue(string $constantName): string|array|int|bool|null|float; +``` + +
    Get the compiled value of a constant
    + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $constantNamestringThe name of the constant for which you need to get the value
    + +Return value: string | array | int | bool | null | float + + +Throws: + + +
    +
    +
    + + + +```php +public function getConstants(): array; +``` + +
    Get all constants that are available according to the configuration as an array
    + +Parameters: not specified + +Return value: array + + +Throws: + + + +See: + +
    +
    +
    + +
      +
    • # + getConstantsData + :warning: Is internal | source code
    • +
    + +```php +public function getConstantsData(bool $onlyFromCurrentClassAndTraits = false, int $flags = \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity::VISIBILITY_MODIFIERS_FLAG_ANY): array; +``` + +
    Get a list of all constants and classes where they are implemented
    + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $onlyFromCurrentClassAndTraitsboolGet data only for constants from the current class
    $flagsintGet data only for constants corresponding to the visibility modifiers passed in this value
    + +Return value: array + + +Throws: + + +
    +
    +
    + + + +```php +public function getConstantsValues(bool $onlyFromCurrentClassAndTraits = false, int $flags = \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity::VISIBILITY_MODIFIERS_FLAG_ANY): array; +``` + +
    Get class constant compiled values according to filters
    + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $onlyFromCurrentClassAndTraitsboolGet values only for constants from the current class
    $flagsintGet values only for constants corresponding to the visibility modifiers passed in this value
    + +Return value: array + + +Throws: + + +
    +
    +
    + +
      +
    • # + getCurrentRootEntity + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getCurrentRootEntity(): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; +``` + + + +Parameters: not specified + +Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDescription(): string; +``` + +
    Get entity description
    + +Parameters: not specified + +Return value: string + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDescriptionLinks(): array; +``` + +
    Get parsed links from description and doc blocks `see` and `link`
    + +Parameters: not specified + +Return value: array + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDocBlock(): \phpDocumentor\Reflection\DocBlock; +``` + +
    Get DocBlock for current entity
    + +Parameters: not specified + +Return value: \phpDocumentor\Reflection\DocBlock + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDocComment(): string; +``` + +
    Get the doc comment of an entity
    + +Parameters: not specified + +Return value: string + + +Throws: + + +
    +
    +
    + +
      +
    • # + getDocCommentEntity + :warning: Is internal | source code
    • +
    + +```php +public function getDocCommentEntity(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; +``` + +
    Link to an entity where docBlock is implemented for this entity
    + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDocCommentLine(): null|int; +``` + +
    Get the code line number where the docBlock of the current entity begins
    + +Parameters: not specified + +Return value: null | int + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDocNote(): string; +``` + +
    Get the note annotation value
    + +Parameters: not specified + +Return value: string + + +Throws: + + +
    +
    +
    + + + +```php +public function getDocRender(): \BumbleDocGen\Core\Renderer\EntityDocRenderer\EntityDocRendererInterface; +``` + + + +Parameters: not specified + +Return value: \BumbleDocGen\Core\Renderer\EntityDocRenderer\EntityDocRendererInterface + + +Throws: + + +
    +
    +
    + + + +```php +public function getEndLine(): int; +``` + +
    Get the line number of the end of a class code in a file
    + +Parameters: not specified + +Return value: int + + +Throws: + + +
    +
    +
    + + + +```php +public function getEntityDependencies(): array; +``` + + + +Parameters: not specified + +Return value: array + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getExamples(): array; +``` + +
    Get parsed examples from `examples` doc block
    + +Parameters: not specified + +Return value: array + + +Throws: + + +
    +
    +
    + + + +```php +public function getFileContent(): string; +``` + + + +Parameters: not specified + +Return value: string + + +Throws: + + +
    +
    +
    + +
      +
    • # + getFileSourceLink + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getFileSourceLink(bool $withLine = true): null|string; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $withLinebool-
    + +Return value: null | string + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getFirstExample(): string; +``` + +
    Get first example from `examples` doc block
    + +Parameters: not specified + +Return value: string + + +Throws: + + +
    +
    +
    + + + +```php +public function getImplementingClass(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; +``` + +
    Get the class like entity in which the current entity was implemented
    + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + + +
    +
    +
    + + + +```php +public function getInterfaceNames(): array; +``` + +
    Get a list of class interface names
    + +Parameters: not specified + +Return value: array + + +Throws: + + +
    +
    +
    + + + +```php +public function getInterfacesEntities(): array; +``` + +
    Get a list of interface entities that the current class implements
    + +Parameters: not specified + +Return value: array + + +Throws: + + +
    +
    +
    + + + +```php +public function getMethod(string $methodName, bool $unsafe = false): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntity; +``` + +
    Get the method entity by its name
    + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $methodNamestringThe name of the method whose entity you want to get
    $unsafeboolCheck all methods, not just the methods allowed in the configuration (@see PhpHandlerSettings::getMethodEntityFilter())
    + +Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntity + + +Throws: + + +
    +
    +
    + + + +```php +public function getMethodEntitiesCollection(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntitiesCollection; +``` + +
    Get a collection of method entities
    + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntitiesCollection + + +Throws: + + + +See: + +
    +
    +
    + + + +```php +public function getMethods(): array; +``` + +
    Get all methods that are available according to the configuration as an array
    + +Parameters: not specified + +Return value: array + + +Throws: + + + +See: + +
    +
    +
    + +
      +
    • # + getMethodsData + :warning: Is internal | source code
    • +
    + +```php +public function getMethodsData(bool $onlyFromCurrentClassAndTraits = false, int $flags = \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntity::VISIBILITY_MODIFIERS_FLAG_ANY): array; +``` + +
    Get a list of all methods and classes where they are implemented
    + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $onlyFromCurrentClassAndTraitsboolGet data only for methods from the current class
    $flagsintGet data only for methods corresponding to the visibility modifiers passed in this value
    + +Return value: array + + +Throws: + + +
    +
    +
    + + + +```php +public function getModifiersString(): string; +``` + +
    Get entity modifiers as a string
    + +Parameters: not specified + +Return value: string + + +
    +
    +
    + + + +```php +public function getName(): string; +``` + +
    Full name of the entity
    + +Parameters: not specified + +Return value: string + + +
    +
    +
    + + + +```php +public function getNamespaceName(): string; +``` + +
    Get the entity namespace name
    + +Parameters: not specified + +Return value: string + + +
    +
    +
    + + + +```php +public function getObjectId(): string; +``` + +
    Get entity unique ID
    + +Parameters: not specified + +Return value: string + + +
    +
    +
    + + + +```php +public function getParentClass(): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; +``` + +
    Get the entity of the parent class if it exists
    + +Parameters: not specified + +Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + + +
    +
    +
    + + + +```php +public function getParentClassEntities(): array; +``` + +
    Get a list of parent class entities
    + +Parameters: not specified + +Return value: array + + +
    +
    +
    + + + +```php +public function getParentClassName(): null|string; +``` + +
    Get the name of the parent class entity if it exists
    + +Parameters: not specified + +Return value: null | string + + +
    +
    +
    + + + +```php +public function getParentClassNames(): array; +``` + +
    Get a list of entity names of parent classes
    + +Parameters: not specified + +Return value: array + + +
    +
    +
    + + + +```php +public function getPluginData(string $pluginKey): mixed; +``` + +
    Get additional information added using the plugin
    + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $pluginKeystring-
    + +Return value: mixed + + +
    +
    +
    + + + +```php +public function getProperties(): array; +``` + +
    Get all properties that are available according to the configuration as an array
    + +Parameters: not specified + +Return value: array + + +Throws: + + + +See: + +
    +
    +
    + +
      +
    • # + getPropertiesData + :warning: Is internal | source code
    • +
    + +```php +public function getPropertiesData(bool $onlyFromCurrentClassAndTraits = false, int $flags = \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntity::VISIBILITY_MODIFIERS_FLAG_ANY): array; +``` + +
    Get a list of all properties and classes where they are implemented
    + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $onlyFromCurrentClassAndTraitsboolGet data only for properties from the current class
    $flagsintGet data only for properties corresponding to the visibility modifiers passed in this value
    + +Return value: array + + +Throws: + + +
    +
    +
    + + + +```php +public function getProperty(string $propertyName, bool $unsafe = false): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntity; +``` + +
    Get the property entity by its name
    + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $propertyNamestringThe name of the property whose entity you want to get
    $unsafeboolCheck all properties, not just the properties allowed in the configuration (@see PhpHandlerSettings::getPropertyEntityFilter())
    + +Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntity + + +Throws: + + +
    +
    +
    + + + +```php +public function getPropertyDefaultValue(string $propertyName): string|array|int|bool|null|float; +``` + +
    Get the compiled value of a property
    + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $propertyNamestringThe name of the property for which you need to get the value
    + +Return value: string | array | int | bool | null | float + + +Throws: + + +
    +
    +
    + + + +```php +public function getPropertyEntitiesCollection(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntitiesCollection; +``` + +
    Get a collection of property entities
    + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntitiesCollection + + +Throws: + + + +See: + +
    +
    +
    + + + +```php +public function getRelativeFileName(): null|string; +``` + +
    File name relative to project_root configuration parameter
    + +Parameters: not specified + +Return value: null | string + + + +See: + +
    +
    +
    + + + +```php +public function getRootEntityCollection(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; +``` + +
    Get the collection of root entities to which this entity belongs
    + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection + + +
    +
    +
    + + + +```php +public function getShortName(): string; +``` + +
    Short name of the entity
    + +Parameters: not specified + +Return value: string + + +
    +
    +
    + + + +```php +public function getStartLine(): int; +``` + +
    Get the line number of the start of a class code in a file
    + +Parameters: not specified + +Return value: int + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getThrows(): array; +``` + +
    Get parsed throws from `throws` doc block
    + +Parameters: not specified + +Return value: array + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getThrowsDocBlockLinks(): array; +``` + + + +Parameters: not specified + +Return value: array + + +Throws: + + +
    +
    +
    + + + +```php +public function getTraits(): array; +``` + +
    Get a list of trait entities of the current class
    + +Parameters: not specified + +Return value: array + + +Throws: + + +
    +
    +
    + + + +```php +public function getTraitsNames(): array; +``` + +
    Get a list of class traits names
    + +Parameters: not specified + +Return value: array + + +Throws: + + +
    +
    +
    + + + +```php +public function hasConstant(string $constantName, bool $unsafe = false): bool; +``` + +
    Check if a constant exists in a class
    + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $constantNamestringThe name of the class whose entity you want to check
    $unsafeboolCheck all constants, not just the constants allowed in the configuration (@see PhpHandlerSettings::getClassConstantEntityFilter())
    + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function hasDescriptionLinks(): bool; +``` + +
    Checking if an entity has links in its description
    + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function hasExamples(): bool; +``` + +
    Checking if an entity has `example` docBlock
    + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +public function hasMethod(string $methodName, bool $unsafe = false): bool; +``` + +
    Check if a method exists in a class
    + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $methodNamestringThe name of the method whose entity you want to check
    $unsafeboolCheck all methods, not just the methods allowed in the configuration (@see PhpHandlerSettings::getMethodEntityFilter())
    + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +public function hasParentClass(string $parentClassName): bool; +``` + +
    Check if a certain parent class exists in a chain of parent classes
    + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $parentClassNamestringSearched parent class
    + +Return value: bool + + +
    +
    +
    + + + +```php +public function hasProperty(string $propertyName, bool $unsafe = false): bool; +``` + +
    Check if a property exists in a class
    + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $propertyNamestringThe name of the property whose entity you want to check
    $unsafeboolCheck all properties, not just the properties allowed in the configuration (@see PhpHandlerSettings::getPropertyEntityFilter())
    + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function hasThrows(): bool; +``` + +
    Checking if an entity has `throws` docBlock
    + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +public function hasTraits(): bool; +``` + +
    Check if the class contains traits
    + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +public function implementsInterface(string $interfaceName): bool; +``` + +
    Check if a class implements an interface
    + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $interfaceNamestringName of the required interface in the interface chain
    + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +public function isAbstract(): bool; +``` + +
    Check that an entity is abstract
    + +Parameters: not specified + +Return value: bool + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function isApi(): bool; +``` + +
    Checking if an entity has `api` docBlock
    + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +public function isClass(): bool; +``` + +
    Check if an entity is a Class
    + +Parameters: not specified + +Return value: bool + + +
    +
    +
    + + + +```php +public function isClassLoad(): bool; +``` + + + +Parameters: not specified + +Return value: bool + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function isDeprecated(): bool; +``` + +
    Checking if an entity has `deprecated` docBlock
    + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + +
      +
    • # + isDocumentCreationAllowed + :warning: Is internal | source code
    • +
    + +```php +public function isDocumentCreationAllowed(): bool; +``` + + + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + +
      +
    • # + isEntityCacheOutdated + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function isEntityCacheOutdated(): bool; +``` + +
    Checking if the entity cache is out of date
    + +Parameters: not specified + +Return value: bool + + +
    +
    +
    + +
      +
    • # + isEntityDataCacheOutdated + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait + +public function isEntityDataCacheOutdated(): bool; +``` + + + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +public function isEntityDataCanBeLoaded(): bool; +``` + + + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function isEntityFileCanBeLoad(): bool; +``` + +
    Checking if entity data can be retrieved
    + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +public static function isEntityNameValid(string $entityName): bool; +``` + +
    Check if the name is a valid name for ClassLikeEntity
    + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $entityNamestring-
    + +Return value: bool + + +
    +
    +
    + + + +```php +public function isEnum(): bool; +``` + +
    Check if an entity is an Enum
    + +Parameters: not specified + +Return value: bool + + +
    +
    +
    + +
      +
    • # + isExternalLibraryEntity + :warning: Is internal | source code
    • +
    + +```php +public function isExternalLibraryEntity(): bool; +``` + +
    Check if a given entity is an entity from a third party library (connected via composer)
    + +Parameters: not specified + +Return value: bool + + +
    +
    +
    + + + +```php +public function isInGit(): bool; +``` + +
    Checking if class file is in git repository
    + +Parameters: not specified + +Return value: bool + + +
    +
    +
    + + + +```php +public function isInstantiable(): bool; +``` + +
    Check that an entity is instantiable
    + +Parameters: not specified + +Return value: bool + + +
    +
    +
    + + + +```php +public function isInterface(): bool; +``` + +
    Check if an entity is an Interface
    + +Parameters: not specified + +Return value: bool + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function isInternal(): bool; +``` + +
    Checking if an entity has `internal` docBlock
    + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +public function isSubclassOf(string $className): bool; +``` + +
    Whether the given class is a subclass of the specified class
    + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $classNamestring-
    + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +public function isTrait(): bool; +``` + +
    Check if an entity is a Trait
    + +Parameters: not specified + +Return value: bool + + +
    +
    +
    + + + +```php +public static function normalizeClassName(string $name): string; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $namestring-
    + +Return value: string + + +
    +
    +
    + +
      +
    • # + reloadEntityDependenciesCache + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function reloadEntityDependenciesCache(): array; +``` + +
    Update entity dependency cache
    + +Parameters: not specified + +Return value: array + + +
    +
    +
    + +
      +
    • # + removeEntityValueFromCache + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait + +public function removeEntityValueFromCache(string $key): void; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $keystring-
    + +Return value: void + + +
    +
    +
    + +
      +
    • # + removeNotUsedEntityDataCache + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait + +public function removeNotUsedEntityDataCache(): void; +``` + + + +Parameters: not specified + +Return value: void + + +Throws: + + +
    +
    +
    + + + +```php +public function setCustomAst(\PhpParser\Node\Stmt\Trait_|\PhpParser\Node\Stmt\Enum_|\PhpParser\Node\Stmt\Interface_|\PhpParser\Node\Stmt\Class_|null $customAst): void; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $customAst\PhpParser\Node\Stmt\Trait_ | \PhpParser\Node\Stmt\Enum_ | \PhpParser\Node\Stmt\Interface_ | \PhpParser\Node\Stmt\Class_ | null-
    + +Return value: void + + +
    +
    + + \ No newline at end of file diff --git a/docs/tech/2.parser/reflectionApi/php/classes/Configuration.md b/docs/tech/2.parser/reflectionApi/php/classes/Configuration.md new file mode 100644 index 00000000..8ea3bbd0 --- /dev/null +++ b/docs/tech/2.parser/reflectionApi/php/classes/Configuration.md @@ -0,0 +1,735 @@ + + BumbleDocGen / Technical description of the project / Parser / Reflection API / Reflection API for PHP / Configuration
    + +

    + Configuration class: +

    + + + + + +```php +namespace BumbleDocGen\Core\Configuration; + +final class Configuration +``` + +
    Configuration project documentation
    + + + + + + +

    Initialization methods:

    + +
      +
    1. + __construct +
    2. +
    + +

    Methods:

    + +
      +
    1. + getAdditionalConsoleCommands +
    2. +
    3. + getCacheDir +
    4. +
    5. + getConfigurationVersion +
    6. +
    7. + getDocGenLibDir +
    8. +
    9. + getGitClientPath +
    10. +
    11. + getIfExists +
    12. +
    13. + getLanguageHandlersCollection +
    14. +
    15. + getOutputDir +
    16. +
    17. + getOutputDirBaseUrl +
    18. +
    19. + getPageLinkProcessor +
    20. +
    21. + getPlugins +
    22. +
    23. + getProjectRoot +
    24. +
    25. + getSourceLocators +
    26. +
    27. + getTemplatesDir +
    28. +
    29. + getTwigFilters +
    30. +
    31. + getTwigFunctions +
    32. +
    33. + getWorkingDir +
    34. +
    35. + isCheckFileInGitBeforeCreatingDocEnabled +
    36. +
    37. + useSharedCache +
    38. +
    + + +

    Constants:

    + + + + + + +

    Method details:

    + +
    + + + +```php +public function __construct(\BumbleDocGen\Core\Configuration\ConfigurationParameterBag $parameterBag, \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache $localObjectCache, \Psr\Log\LoggerInterface $logger); +``` + + + +Parameters: + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $parameterBag\BumbleDocGen\Core\Configuration\ConfigurationParameterBag-
    $localObjectCache\BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache-
    $logger\Psr\Log\LoggerInterface-
    + + + +
    +
    +
    + + + +```php +public function getAdditionalConsoleCommands(): \BumbleDocGen\Console\Command\AdditionalCommandCollection; +``` + + + +Parameters: not specified + +Return value: \BumbleDocGen\Console\Command\AdditionalCommandCollection + + +Throws: + + +
    +
    +
    + + + +```php +public function getCacheDir(): null|string; +``` + + + +Parameters: not specified + +Return value: null | string + + +Throws: + + +
    +
    +
    + + + +```php +public function getConfigurationVersion(): string; +``` + + + +Parameters: not specified + +Return value: string + + +
    +
    +
    + + + +```php +public function getDocGenLibDir(): string; +``` + + + +Parameters: not specified + +Return value: string + + +
    +
    +
    + + + +```php +public function getGitClientPath(): string; +``` + + + +Parameters: not specified + +Return value: string + + +Throws: + + +
    +
    +
    + + + +```php +public function getIfExists(mixed $key): null|string; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $keymixed-
    + +Return value: null | string + + +Throws: + + +
    +
    +
    + + + +```php +public function getLanguageHandlersCollection(): \BumbleDocGen\LanguageHandler\LanguageHandlersCollection; +``` + + + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\LanguageHandlersCollection + + +Throws: + + +
    +
    +
    + + + +```php +public function getOutputDir(): string; +``` + + + +Parameters: not specified + +Return value: string + + +Throws: + + +
    +
    +
    + + + +```php +public function getOutputDirBaseUrl(): string; +``` + + + +Parameters: not specified + +Return value: string + + +Throws: + + +
    +
    +
    + + + +```php +public function getPageLinkProcessor(): \BumbleDocGen\Core\Renderer\PageLinkProcessor\PageLinkProcessorInterface; +``` + + + +Parameters: not specified + +Return value: \BumbleDocGen\Core\Renderer\PageLinkProcessor\PageLinkProcessorInterface + + +Throws: + + +
    +
    +
    + + + +```php +public function getPlugins(): \BumbleDocGen\Core\Plugin\PluginsCollection; +``` + + + +Parameters: not specified + +Return value: \BumbleDocGen\Core\Plugin\PluginsCollection + + +Throws: + + +
    +
    +
    + + + +```php +public function getProjectRoot(): string; +``` + + + +Parameters: not specified + +Return value: string + + +Throws: + + +
    +
    +
    + + + +```php +public function getSourceLocators(): \BumbleDocGen\Core\Parser\SourceLocator\SourceLocatorsCollection; +``` + + + +Parameters: not specified + +Return value: \BumbleDocGen\Core\Parser\SourceLocator\SourceLocatorsCollection + + +Throws: + + +
    +
    +
    + + + +```php +public function getTemplatesDir(): string; +``` + + + +Parameters: not specified + +Return value: string + + +Throws: + + +
    +
    +
    + + + +```php +public function getTwigFilters(): \BumbleDocGen\Core\Renderer\Twig\Filter\CustomFiltersCollection; +``` + + + +Parameters: not specified + +Return value: \BumbleDocGen\Core\Renderer\Twig\Filter\CustomFiltersCollection + + +Throws: + + +
    +
    +
    + + + +```php +public function getTwigFunctions(): \BumbleDocGen\Core\Renderer\Twig\Function\CustomFunctionsCollection; +``` + + + +Parameters: not specified + +Return value: \BumbleDocGen\Core\Renderer\Twig\Function\CustomFunctionsCollection + + +Throws: + + +
    +
    +
    + + + +```php +public function getWorkingDir(): string; +``` + + + +Parameters: not specified + +Return value: string + + +Throws: + + +
    +
    +
    + +
      +
    • # + isCheckFileInGitBeforeCreatingDocEnabled + | source code
    • +
    + +```php +public function isCheckFileInGitBeforeCreatingDocEnabled(): bool; +``` + + + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +public function useSharedCache(): bool; +``` + + + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    + + \ No newline at end of file diff --git a/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md b/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md new file mode 100644 index 00000000..83c9a973 --- /dev/null +++ b/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md @@ -0,0 +1,3562 @@ + + BumbleDocGen / Technical description of the project / Parser / Reflection API / Reflection API for PHP / PHP enum reflection API / EnumEntity
    + +

    + EnumEntity class: +

    + + + + + +```php +namespace BumbleDocGen\LanguageHandler\Php\Parser\Entity; + +class EnumEntity extends \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity implements \BumbleDocGen\Core\Renderer\Context\DocumentTransformableEntityInterface, \BumbleDocGen\Core\Parser\Entity\RootEntityInterface, \BumbleDocGen\Core\Parser\Entity\EntityInterface, \BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityInterface +``` + +
    Enumeration
    + +See: + + + + + + + +

    Initialization methods:

    + +
      +
    1. + __construct +
    2. +
    + +

    Methods:

    + +
      +
    1. + addPluginData + - Add information to aт entity object
    2. +
    3. + cursorToDocAttributeLinkFragment +
    4. +
    5. + getAbsoluteFileName + - Returns the absolute path to a file if it can be retrieved and if the file is in the project directory
    6. +
    7. + getAst + - Get AST for this entity
    8. +
    9. + getCacheKey +
    10. +
    11. + getCachedEntityDependencies +
    12. +
    13. + getCasesNames + - Get enum cases names
    14. +
    15. + getConstant + - Get the method entity by its name
    16. +
    17. + getConstantEntitiesCollection + - Get a collection of constant entities
    18. +
    19. + getConstantValue + - Get the compiled value of a constant
    20. +
    21. + getConstants + - Get all constants that are available according to the configuration as an array
    22. +
    23. + getConstantsData + - Get a list of all constants and classes where they are implemented
    24. +
    25. + getConstantsValues + - Get class constant compiled values according to filters
    26. +
    27. + getCurrentRootEntity +
    28. +
    29. + getDescription + - Get entity description
    30. +
    31. + getDescriptionLinks + - Get parsed links from description and doc blocks `see` and `link`
    32. +
    33. + getDocBlock + - Get DocBlock for current entity
    34. +
    35. + getDocComment + - Get the doc comment of an entity
    36. +
    37. + getDocCommentEntity + - Link to an entity where docBlock is implemented for this entity
    38. +
    39. + getDocCommentLine + - Get the code line number where the docBlock of the current entity begins
    40. +
    41. + getDocNote + - Get the note annotation value
    42. +
    43. + getDocRender +
    44. +
    45. + getEndLine + - Get the line number of the end of a class code in a file
    46. +
    47. + getEntityDependencies +
    48. +
    49. + getEnumCaseValue + - Get enum case value
    50. +
    51. + getEnumCases + - Get enum cases values
    52. +
    53. + getExamples + - Get parsed examples from `examples` doc block
    54. +
    55. + getFileContent +
    56. +
    57. + getFileSourceLink +
    58. +
    59. + getFirstExample + - Get first example from `examples` doc block
    60. +
    61. + getImplementingClass + - Get the class like entity in which the current entity was implemented
    62. +
    63. + getInterfaceNames + - Get a list of class interface names
    64. +
    65. + getInterfacesEntities + - Get a list of interface entities that the current class implements
    66. +
    67. + getMethod + - Get the method entity by its name
    68. +
    69. + getMethodEntitiesCollection + - Get a collection of method entities
    70. +
    71. + getMethods + - Get all methods that are available according to the configuration as an array
    72. +
    73. + getMethodsData + - Get a list of all methods and classes where they are implemented
    74. +
    75. + getModifiersString + - Get entity modifiers as a string
    76. +
    77. + getName + - Full name of the entity
    78. +
    79. + getNamespaceName + - Get the entity namespace name
    80. +
    81. + getObjectId + - Get entity unique ID
    82. +
    83. + getParentClass + - Get the entity of the parent class if it exists
    84. +
    85. + getParentClassEntities + - Get a list of parent class entities
    86. +
    87. + getParentClassName + - Get the name of the parent class entity if it exists
    88. +
    89. + getParentClassNames + - Get a list of entity names of parent classes
    90. +
    91. + getPluginData + - Get additional information added using the plugin
    92. +
    93. + getProperties + - Get all properties that are available according to the configuration as an array
    94. +
    95. + getPropertiesData + - Get a list of all properties and classes where they are implemented
    96. +
    97. + getProperty + - Get the property entity by its name
    98. +
    99. + getPropertyDefaultValue + - Get the compiled value of a property
    100. +
    101. + getPropertyEntitiesCollection + - Get a collection of property entities
    102. +
    103. + getRelativeFileName + - File name relative to project_root configuration parameter
    104. +
    105. + getRootEntityCollection + - Get the collection of root entities to which this entity belongs
    106. +
    107. + getShortName + - Short name of the entity
    108. +
    109. + getStartLine + - Get the line number of the start of a class code in a file
    110. +
    111. + getThrows + - Get parsed throws from `throws` doc block
    112. +
    113. + getThrowsDocBlockLinks +
    114. +
    115. + getTraits + - Get a list of trait entities of the current class
    116. +
    117. + getTraitsNames + - Get a list of class traits names
    118. +
    119. + hasConstant + - Check if a constant exists in a class
    120. +
    121. + hasDescriptionLinks + - Checking if an entity has links in its description
    122. +
    123. + hasExamples + - Checking if an entity has `example` docBlock
    124. +
    125. + hasMethod + - Check if a method exists in a class
    126. +
    127. + hasParentClass + - Check if a certain parent class exists in a chain of parent classes
    128. +
    129. + hasProperty + - Check if a property exists in a class
    130. +
    131. + hasThrows + - Checking if an entity has `throws` docBlock
    132. +
    133. + hasTraits + - Check if the class contains traits
    134. +
    135. + implementsInterface + - Check if a class implements an interface
    136. +
    137. + isAbstract + - Check that an entity is abstract
    138. +
    139. + isApi + - Checking if an entity has `api` docBlock
    140. +
    141. + isClass + - Check if an entity is a Class
    142. +
    143. + isClassLoad +
    144. +
    145. + isDeprecated + - Checking if an entity has `deprecated` docBlock
    146. +
    147. + isDocumentCreationAllowed +
    148. +
    149. + isEntityCacheOutdated + - Checking if the entity cache is out of date
    150. +
    151. + isEntityDataCacheOutdated +
    152. +
    153. + isEntityDataCanBeLoaded +
    154. +
    155. + isEntityFileCanBeLoad + - Checking if entity data can be retrieved
    156. +
    157. + isEntityNameValid + - Check if the name is a valid name for ClassLikeEntity
    158. +
    159. + isEnum + - Check if an entity is an Enum
    160. +
    161. + isExternalLibraryEntity + - Check if a given entity is an entity from a third party library (connected via composer)
    162. +
    163. + isInGit + - Checking if class file is in git repository
    164. +
    165. + isInstantiable + - Check that an entity is instantiable
    166. +
    167. + isInterface + - Check if an entity is an Interface
    168. +
    169. + isInternal + - Checking if an entity has `internal` docBlock
    170. +
    171. + isSubclassOf + - Whether the given class is a subclass of the specified class
    172. +
    173. + isTrait + - Check if an entity is a Trait
    174. +
    175. + normalizeClassName +
    176. +
    177. + reloadEntityDependenciesCache + - Update entity dependency cache
    178. +
    179. + removeEntityValueFromCache +
    180. +
    181. + removeNotUsedEntityDataCache +
    182. +
    183. + setCustomAst +
    184. +
    + + + + + + + +

    Method details:

    + +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function __construct(\BumbleDocGen\Core\Configuration\Configuration $configuration, \BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings $phpHandlerSettings, \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection $entitiesCollection, \BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper $parserHelper, \BumbleDocGen\LanguageHandler\Php\Parser\ComposerHelper $composerHelper, \BumbleDocGen\LanguageHandler\Php\Parser\PhpParser\PhpParserHelper $phpParserHelper, \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache $localObjectCache, \Psr\Log\LoggerInterface $logger, string $className, string|null $relativeFileName); +``` + + + +Parameters: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $configuration\BumbleDocGen\Core\Configuration\Configuration-
    $phpHandlerSettings\BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings-
    $entitiesCollection\BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection-
    $parserHelper\BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper-
    $composerHelper\BumbleDocGen\LanguageHandler\Php\Parser\ComposerHelper-
    $phpParserHelper\BumbleDocGen\LanguageHandler\Php\Parser\PhpParser\PhpParserHelper-
    $localObjectCache\BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache-
    $logger\Psr\Log\LoggerInterface-
    $classNamestring-
    $relativeFileNamestring | null-
    + + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function addPluginData(string $pluginKey, mixed $data): void; +``` + +
    Add information to aт entity object
    + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $pluginKeystring-
    $datamixed-
    + +Return value: void + + +
    +
    +
    + +
      +
    • # + cursorToDocAttributeLinkFragment + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function cursorToDocAttributeLinkFragment(string $cursor, bool $isForDocument = true): string; +``` + + + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $cursorstring-
    $isForDocumentbool-
    + +Return value: string + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getAbsoluteFileName(): null|string; +``` + +
    Returns the absolute path to a file if it can be retrieved and if the file is in the project directory
    + +Parameters: not specified + +Return value: null | string + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getAst(): \PhpParser\Node\Stmt\Class_|\PhpParser\Node\Stmt\Interface_|\PhpParser\Node\Stmt\Trait_|\PhpParser\Node\Stmt\Enum_; +``` + +
    Get AST for this entity
    + +Parameters: not specified + +Return value: \PhpParser\Node\Stmt\Class_ | \PhpParser\Node\Stmt\Interface_ | \PhpParser\Node\Stmt\Trait_ | \PhpParser\Node\Stmt\Enum_ + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait + +public function getCacheKey(): string; +``` + + + +Parameters: not specified + +Return value: string + + +
    +
    +
    + +
      +
    • # + getCachedEntityDependencies + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getCachedEntityDependencies(): array; +``` + + + +Parameters: not specified + +Return value: array + + +Throws: + + +
    +
    +
    + + + +```php +public function getCasesNames(): array; +``` + +
    Get enum cases names
    + +Parameters: not specified + +Return value: array + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getConstant(string $constantName, bool $unsafe = false): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity; +``` + +
    Get the method entity by its name
    + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $constantNamestringThe name of the constant whose entity you want to get
    $unsafeboolCheck all constants, not just the constants allowed in the configuration (@see PhpHandlerSettings::getClassConstantEntityFilter())
    + +Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getConstantEntitiesCollection(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntitiesCollection; +``` + +
    Get a collection of constant entities
    + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntitiesCollection + + +Throws: + + + +See: + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getConstantValue(string $constantName): string|array|int|bool|null|float; +``` + +
    Get the compiled value of a constant
    + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $constantNamestringThe name of the constant for which you need to get the value
    + +Return value: string | array | int | bool | null | float + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getConstants(): array; +``` + +
    Get all constants that are available according to the configuration as an array
    + +Parameters: not specified + +Return value: array + + +Throws: + + + +See: + +
    +
    +
    + +
      +
    • # + getConstantsData + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getConstantsData(bool $onlyFromCurrentClassAndTraits = false, int $flags = \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity::VISIBILITY_MODIFIERS_FLAG_ANY): array; +``` + +
    Get a list of all constants and classes where they are implemented
    + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $onlyFromCurrentClassAndTraitsboolGet data only for constants from the current class
    $flagsintGet data only for constants corresponding to the visibility modifiers passed in this value
    + +Return value: array + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getConstantsValues(bool $onlyFromCurrentClassAndTraits = false, int $flags = \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity::VISIBILITY_MODIFIERS_FLAG_ANY): array; +``` + +
    Get class constant compiled values according to filters
    + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $onlyFromCurrentClassAndTraitsboolGet values only for constants from the current class
    $flagsintGet values only for constants corresponding to the visibility modifiers passed in this value
    + +Return value: array + + +Throws: + + +
    +
    +
    + +
      +
    • # + getCurrentRootEntity + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getCurrentRootEntity(): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; +``` + + + +Parameters: not specified + +Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDescription(): string; +``` + +
    Get entity description
    + +Parameters: not specified + +Return value: string + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDescriptionLinks(): array; +``` + +
    Get parsed links from description and doc blocks `see` and `link`
    + +Parameters: not specified + +Return value: array + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDocBlock(): \phpDocumentor\Reflection\DocBlock; +``` + +
    Get DocBlock for current entity
    + +Parameters: not specified + +Return value: \phpDocumentor\Reflection\DocBlock + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDocComment(): string; +``` + +
    Get the doc comment of an entity
    + +Parameters: not specified + +Return value: string + + +Throws: + + +
    +
    +
    + +
      +
    • # + getDocCommentEntity + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getDocCommentEntity(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; +``` + +
    Link to an entity where docBlock is implemented for this entity
    + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDocCommentLine(): null|int; +``` + +
    Get the code line number where the docBlock of the current entity begins
    + +Parameters: not specified + +Return value: null | int + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDocNote(): string; +``` + +
    Get the note annotation value
    + +Parameters: not specified + +Return value: string + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getDocRender(): \BumbleDocGen\Core\Renderer\EntityDocRenderer\EntityDocRendererInterface; +``` + + + +Parameters: not specified + +Return value: \BumbleDocGen\Core\Renderer\EntityDocRenderer\EntityDocRendererInterface + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getEndLine(): int; +``` + +
    Get the line number of the end of a class code in a file
    + +Parameters: not specified + +Return value: int + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getEntityDependencies(): array; +``` + + + +Parameters: not specified + +Return value: array + + +
    +
    +
    + + + +```php +public function getEnumCaseValue(string $name): mixed; +``` + +
    Get enum case value
    + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $namestring-
    + +Return value: mixed + + +Throws: + + +
    +
    +
    + + + +```php +public function getEnumCases(): array; +``` + +
    Get enum cases values
    + +Parameters: not specified + +Return value: array + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getExamples(): array; +``` + +
    Get parsed examples from `examples` doc block
    + +Parameters: not specified + +Return value: array + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getFileContent(): string; +``` + + + +Parameters: not specified + +Return value: string + + +Throws: + + +
    +
    +
    + +
      +
    • # + getFileSourceLink + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getFileSourceLink(bool $withLine = true): null|string; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $withLinebool-
    + +Return value: null | string + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getFirstExample(): string; +``` + +
    Get first example from `examples` doc block
    + +Parameters: not specified + +Return value: string + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getImplementingClass(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; +``` + +
    Get the class like entity in which the current entity was implemented
    + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + + +
    +
    +
    + + + +```php +public function getInterfaceNames(): array; +``` + +
    Get a list of class interface names
    + +Parameters: not specified + +Return value: array + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getInterfacesEntities(): array; +``` + +
    Get a list of interface entities that the current class implements
    + +Parameters: not specified + +Return value: array + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getMethod(string $methodName, bool $unsafe = false): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntity; +``` + +
    Get the method entity by its name
    + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $methodNamestringThe name of the method whose entity you want to get
    $unsafeboolCheck all methods, not just the methods allowed in the configuration (@see PhpHandlerSettings::getMethodEntityFilter())
    + +Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntity + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getMethodEntitiesCollection(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntitiesCollection; +``` + +
    Get a collection of method entities
    + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntitiesCollection + + +Throws: + + + +See: + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getMethods(): array; +``` + +
    Get all methods that are available according to the configuration as an array
    + +Parameters: not specified + +Return value: array + + +Throws: + + + +See: + +
    +
    +
    + +
      +
    • # + getMethodsData + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getMethodsData(bool $onlyFromCurrentClassAndTraits = false, int $flags = \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntity::VISIBILITY_MODIFIERS_FLAG_ANY): array; +``` + +
    Get a list of all methods and classes where they are implemented
    + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $onlyFromCurrentClassAndTraitsboolGet data only for methods from the current class
    $flagsintGet data only for methods corresponding to the visibility modifiers passed in this value
    + +Return value: array + + +Throws: + + +
    +
    +
    + + + +```php +public function getModifiersString(): string; +``` + +
    Get entity modifiers as a string
    + +Parameters: not specified + +Return value: string + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getName(): string; +``` + +
    Full name of the entity
    + +Parameters: not specified + +Return value: string + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getNamespaceName(): string; +``` + +
    Get the entity namespace name
    + +Parameters: not specified + +Return value: string + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getObjectId(): string; +``` + +
    Get entity unique ID
    + +Parameters: not specified + +Return value: string + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getParentClass(): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; +``` + +
    Get the entity of the parent class if it exists
    + +Parameters: not specified + +Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getParentClassEntities(): array; +``` + +
    Get a list of parent class entities
    + +Parameters: not specified + +Return value: array + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getParentClassName(): null|string; +``` + +
    Get the name of the parent class entity if it exists
    + +Parameters: not specified + +Return value: null | string + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getParentClassNames(): array; +``` + +
    Get a list of entity names of parent classes
    + +Parameters: not specified + +Return value: array + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getPluginData(string $pluginKey): mixed; +``` + +
    Get additional information added using the plugin
    + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $pluginKeystring-
    + +Return value: mixed + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getProperties(): array; +``` + +
    Get all properties that are available according to the configuration as an array
    + +Parameters: not specified + +Return value: array + + +Throws: + + + +See: + +
    +
    +
    + +
      +
    • # + getPropertiesData + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getPropertiesData(bool $onlyFromCurrentClassAndTraits = false, int $flags = \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntity::VISIBILITY_MODIFIERS_FLAG_ANY): array; +``` + +
    Get a list of all properties and classes where they are implemented
    + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $onlyFromCurrentClassAndTraitsboolGet data only for properties from the current class
    $flagsintGet data only for properties corresponding to the visibility modifiers passed in this value
    + +Return value: array + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getProperty(string $propertyName, bool $unsafe = false): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntity; +``` + +
    Get the property entity by its name
    + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $propertyNamestringThe name of the property whose entity you want to get
    $unsafeboolCheck all properties, not just the properties allowed in the configuration (@see PhpHandlerSettings::getPropertyEntityFilter())
    + +Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntity + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getPropertyDefaultValue(string $propertyName): string|array|int|bool|null|float; +``` + +
    Get the compiled value of a property
    + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $propertyNamestringThe name of the property for which you need to get the value
    + +Return value: string | array | int | bool | null | float + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getPropertyEntitiesCollection(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntitiesCollection; +``` + +
    Get a collection of property entities
    + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntitiesCollection + + +Throws: + + + +See: + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getRelativeFileName(): null|string; +``` + +
    File name relative to project_root configuration parameter
    + +Parameters: not specified + +Return value: null | string + + + +See: + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getRootEntityCollection(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; +``` + +
    Get the collection of root entities to which this entity belongs
    + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getShortName(): string; +``` + +
    Short name of the entity
    + +Parameters: not specified + +Return value: string + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getStartLine(): int; +``` + +
    Get the line number of the start of a class code in a file
    + +Parameters: not specified + +Return value: int + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getThrows(): array; +``` + +
    Get parsed throws from `throws` doc block
    + +Parameters: not specified + +Return value: array + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getThrowsDocBlockLinks(): array; +``` + + + +Parameters: not specified + +Return value: array + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getTraits(): array; +``` + +
    Get a list of trait entities of the current class
    + +Parameters: not specified + +Return value: array + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getTraitsNames(): array; +``` + +
    Get a list of class traits names
    + +Parameters: not specified + +Return value: array + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function hasConstant(string $constantName, bool $unsafe = false): bool; +``` + +
    Check if a constant exists in a class
    + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $constantNamestringThe name of the class whose entity you want to check
    $unsafeboolCheck all constants, not just the constants allowed in the configuration (@see PhpHandlerSettings::getClassConstantEntityFilter())
    + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function hasDescriptionLinks(): bool; +``` + +
    Checking if an entity has links in its description
    + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function hasExamples(): bool; +``` + +
    Checking if an entity has `example` docBlock
    + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function hasMethod(string $methodName, bool $unsafe = false): bool; +``` + +
    Check if a method exists in a class
    + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $methodNamestringThe name of the method whose entity you want to check
    $unsafeboolCheck all methods, not just the methods allowed in the configuration (@see PhpHandlerSettings::getMethodEntityFilter())
    + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function hasParentClass(string $parentClassName): bool; +``` + +
    Check if a certain parent class exists in a chain of parent classes
    + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $parentClassNamestringSearched parent class
    + +Return value: bool + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function hasProperty(string $propertyName, bool $unsafe = false): bool; +``` + +
    Check if a property exists in a class
    + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $propertyNamestringThe name of the property whose entity you want to check
    $unsafeboolCheck all properties, not just the properties allowed in the configuration (@see PhpHandlerSettings::getPropertyEntityFilter())
    + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function hasThrows(): bool; +``` + +
    Checking if an entity has `throws` docBlock
    + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function hasTraits(): bool; +``` + +
    Check if the class contains traits
    + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function implementsInterface(string $interfaceName): bool; +``` + +
    Check if a class implements an interface
    + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $interfaceNamestringName of the required interface in the interface chain
    + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function isAbstract(): bool; +``` + +
    Check that an entity is abstract
    + +Parameters: not specified + +Return value: bool + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function isApi(): bool; +``` + +
    Checking if an entity has `api` docBlock
    + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function isClass(): bool; +``` + +
    Check if an entity is a Class
    + +Parameters: not specified + +Return value: bool + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function isClassLoad(): bool; +``` + + + +Parameters: not specified + +Return value: bool + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function isDeprecated(): bool; +``` + +
    Checking if an entity has `deprecated` docBlock
    + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + +
      +
    • # + isDocumentCreationAllowed + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function isDocumentCreationAllowed(): bool; +``` + + + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + +
      +
    • # + isEntityCacheOutdated + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function isEntityCacheOutdated(): bool; +``` + +
    Checking if the entity cache is out of date
    + +Parameters: not specified + +Return value: bool + + +
    +
    +
    + +
      +
    • # + isEntityDataCacheOutdated + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait + +public function isEntityDataCacheOutdated(): bool; +``` + + + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function isEntityDataCanBeLoaded(): bool; +``` + + + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function isEntityFileCanBeLoad(): bool; +``` + +
    Checking if entity data can be retrieved
    + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public static function isEntityNameValid(string $entityName): bool; +``` + +
    Check if the name is a valid name for ClassLikeEntity
    + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $entityNamestring-
    + +Return value: bool + + +
    +
    +
    + + + +```php +public function isEnum(): bool; +``` + +
    Check if an entity is an Enum
    + +Parameters: not specified + +Return value: bool + + +
    +
    +
    + +
      +
    • # + isExternalLibraryEntity + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function isExternalLibraryEntity(): bool; +``` + +
    Check if a given entity is an entity from a third party library (connected via composer)
    + +Parameters: not specified + +Return value: bool + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function isInGit(): bool; +``` + +
    Checking if class file is in git repository
    + +Parameters: not specified + +Return value: bool + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function isInstantiable(): bool; +``` + +
    Check that an entity is instantiable
    + +Parameters: not specified + +Return value: bool + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function isInterface(): bool; +``` + +
    Check if an entity is an Interface
    + +Parameters: not specified + +Return value: bool + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function isInternal(): bool; +``` + +
    Checking if an entity has `internal` docBlock
    + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function isSubclassOf(string $className): bool; +``` + +
    Whether the given class is a subclass of the specified class
    + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $classNamestring-
    + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function isTrait(): bool; +``` + +
    Check if an entity is a Trait
    + +Parameters: not specified + +Return value: bool + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public static function normalizeClassName(string $name): string; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $namestring-
    + +Return value: string + + +
    +
    +
    + +
      +
    • # + reloadEntityDependenciesCache + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function reloadEntityDependenciesCache(): array; +``` + +
    Update entity dependency cache
    + +Parameters: not specified + +Return value: array + + +
    +
    +
    + +
      +
    • # + removeEntityValueFromCache + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait + +public function removeEntityValueFromCache(string $key): void; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $keystring-
    + +Return value: void + + +
    +
    +
    + +
      +
    • # + removeNotUsedEntityDataCache + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait + +public function removeNotUsedEntityDataCache(): void; +``` + + + +Parameters: not specified + +Return value: void + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function setCustomAst(\PhpParser\Node\Stmt\Trait_|\PhpParser\Node\Stmt\Enum_|\PhpParser\Node\Stmt\Interface_|\PhpParser\Node\Stmt\Class_|null $customAst): void; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $customAst\PhpParser\Node\Stmt\Trait_ | \PhpParser\Node\Stmt\Enum_ | \PhpParser\Node\Stmt\Interface_ | \PhpParser\Node\Stmt\Class_ | null-
    + +Return value: void + + +
    +
    + + \ No newline at end of file diff --git a/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md b/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md new file mode 100644 index 00000000..76ffa8c4 --- /dev/null +++ b/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md @@ -0,0 +1,3441 @@ + + BumbleDocGen / Technical description of the project / Parser / Reflection API / Reflection API for PHP / PHP interface reflection API / InterfaceEntity
    + +

    + InterfaceEntity class: +

    + + + + + +```php +namespace BumbleDocGen\LanguageHandler\Php\Parser\Entity; + +class InterfaceEntity extends \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity implements \BumbleDocGen\Core\Renderer\Context\DocumentTransformableEntityInterface, \BumbleDocGen\Core\Parser\Entity\RootEntityInterface, \BumbleDocGen\Core\Parser\Entity\EntityInterface, \BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityInterface +``` + +
    Object interface
    + +See: + + + + + + + +

    Initialization methods:

    + +
      +
    1. + __construct +
    2. +
    + +

    Methods:

    + +
      +
    1. + addPluginData + - Add information to aт entity object
    2. +
    3. + cursorToDocAttributeLinkFragment +
    4. +
    5. + getAbsoluteFileName + - Returns the absolute path to a file if it can be retrieved and if the file is in the project directory
    6. +
    7. + getAst + - Get AST for this entity
    8. +
    9. + getCacheKey +
    10. +
    11. + getCachedEntityDependencies +
    12. +
    13. + getConstant + - Get the method entity by its name
    14. +
    15. + getConstantEntitiesCollection + - Get a collection of constant entities
    16. +
    17. + getConstantValue + - Get the compiled value of a constant
    18. +
    19. + getConstants + - Get all constants that are available according to the configuration as an array
    20. +
    21. + getConstantsData + - Get a list of all constants and classes where they are implemented
    22. +
    23. + getConstantsValues + - Get class constant compiled values according to filters
    24. +
    25. + getCurrentRootEntity +
    26. +
    27. + getDescription + - Get entity description
    28. +
    29. + getDescriptionLinks + - Get parsed links from description and doc blocks `see` and `link`
    30. +
    31. + getDocBlock + - Get DocBlock for current entity
    32. +
    33. + getDocComment + - Get the doc comment of an entity
    34. +
    35. + getDocCommentEntity + - Link to an entity where docBlock is implemented for this entity
    36. +
    37. + getDocCommentLine + - Get the code line number where the docBlock of the current entity begins
    38. +
    39. + getDocNote + - Get the note annotation value
    40. +
    41. + getDocRender +
    42. +
    43. + getEndLine + - Get the line number of the end of a class code in a file
    44. +
    45. + getEntityDependencies +
    46. +
    47. + getExamples + - Get parsed examples from `examples` doc block
    48. +
    49. + getFileContent +
    50. +
    51. + getFileSourceLink +
    52. +
    53. + getFirstExample + - Get first example from `examples` doc block
    54. +
    55. + getImplementingClass + - Get the class like entity in which the current entity was implemented
    56. +
    57. + getInterfaceNames + - Get a list of class interface names
    58. +
    59. + getInterfacesEntities + - Get a list of interface entities that the current class implements
    60. +
    61. + getMethod + - Get the method entity by its name
    62. +
    63. + getMethodEntitiesCollection + - Get a collection of method entities
    64. +
    65. + getMethods + - Get all methods that are available according to the configuration as an array
    66. +
    67. + getMethodsData + - Get a list of all methods and classes where they are implemented
    68. +
    69. + getModifiersString + - Get entity modifiers as a string
    70. +
    71. + getName + - Full name of the entity
    72. +
    73. + getNamespaceName + - Get the entity namespace name
    74. +
    75. + getObjectId + - Get entity unique ID
    76. +
    77. + getParentClass + - Get the entity of the parent class if it exists
    78. +
    79. + getParentClassEntities + - Get a list of parent class entities
    80. +
    81. + getParentClassName + - Get the name of the parent class entity if it exists
    82. +
    83. + getParentClassNames + - Get a list of entity names of parent classes
    84. +
    85. + getPluginData + - Get additional information added using the plugin
    86. +
    87. + getProperties + - Get all properties that are available according to the configuration as an array
    88. +
    89. + getPropertiesData + - Get a list of all properties and classes where they are implemented
    90. +
    91. + getProperty + - Get the property entity by its name
    92. +
    93. + getPropertyDefaultValue + - Get the compiled value of a property
    94. +
    95. + getPropertyEntitiesCollection + - Get a collection of property entities
    96. +
    97. + getRelativeFileName + - File name relative to project_root configuration parameter
    98. +
    99. + getRootEntityCollection + - Get the collection of root entities to which this entity belongs
    100. +
    101. + getShortName + - Short name of the entity
    102. +
    103. + getStartLine + - Get the line number of the start of a class code in a file
    104. +
    105. + getThrows + - Get parsed throws from `throws` doc block
    106. +
    107. + getThrowsDocBlockLinks +
    108. +
    109. + getTraits + - Get a list of trait entities of the current class
    110. +
    111. + getTraitsNames + - Get a list of class traits names
    112. +
    113. + hasConstant + - Check if a constant exists in a class
    114. +
    115. + hasDescriptionLinks + - Checking if an entity has links in its description
    116. +
    117. + hasExamples + - Checking if an entity has `example` docBlock
    118. +
    119. + hasMethod + - Check if a method exists in a class
    120. +
    121. + hasParentClass + - Check if a certain parent class exists in a chain of parent classes
    122. +
    123. + hasProperty + - Check if a property exists in a class
    124. +
    125. + hasThrows + - Checking if an entity has `throws` docBlock
    126. +
    127. + hasTraits + - Check if the class contains traits
    128. +
    129. + implementsInterface + - Check if a class implements an interface
    130. +
    131. + isAbstract + - Check that an entity is abstract
    132. +
    133. + isApi + - Checking if an entity has `api` docBlock
    134. +
    135. + isClass + - Check if an entity is a Class
    136. +
    137. + isClassLoad +
    138. +
    139. + isDeprecated + - Checking if an entity has `deprecated` docBlock
    140. +
    141. + isDocumentCreationAllowed +
    142. +
    143. + isEntityCacheOutdated + - Checking if the entity cache is out of date
    144. +
    145. + isEntityDataCacheOutdated +
    146. +
    147. + isEntityDataCanBeLoaded +
    148. +
    149. + isEntityFileCanBeLoad + - Checking if entity data can be retrieved
    150. +
    151. + isEntityNameValid + - Check if the name is a valid name for ClassLikeEntity
    152. +
    153. + isEnum + - Check if an entity is an Enum
    154. +
    155. + isExternalLibraryEntity + - Check if a given entity is an entity from a third party library (connected via composer)
    156. +
    157. + isInGit + - Checking if class file is in git repository
    158. +
    159. + isInstantiable + - Check that an entity is instantiable
    160. +
    161. + isInterface + - Check if an entity is an Interface
    162. +
    163. + isInternal + - Checking if an entity has `internal` docBlock
    164. +
    165. + isSubclassOf + - Whether the given class is a subclass of the specified class
    166. +
    167. + isTrait + - Check if an entity is a Trait
    168. +
    169. + normalizeClassName +
    170. +
    171. + reloadEntityDependenciesCache + - Update entity dependency cache
    172. +
    173. + removeEntityValueFromCache +
    174. +
    175. + removeNotUsedEntityDataCache +
    176. +
    177. + setCustomAst +
    178. +
    + + + + + + + +

    Method details:

    + +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function __construct(\BumbleDocGen\Core\Configuration\Configuration $configuration, \BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings $phpHandlerSettings, \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection $entitiesCollection, \BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper $parserHelper, \BumbleDocGen\LanguageHandler\Php\Parser\ComposerHelper $composerHelper, \BumbleDocGen\LanguageHandler\Php\Parser\PhpParser\PhpParserHelper $phpParserHelper, \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache $localObjectCache, \Psr\Log\LoggerInterface $logger, string $className, string|null $relativeFileName); +``` + + + +Parameters: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $configuration\BumbleDocGen\Core\Configuration\Configuration-
    $phpHandlerSettings\BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings-
    $entitiesCollection\BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection-
    $parserHelper\BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper-
    $composerHelper\BumbleDocGen\LanguageHandler\Php\Parser\ComposerHelper-
    $phpParserHelper\BumbleDocGen\LanguageHandler\Php\Parser\PhpParser\PhpParserHelper-
    $localObjectCache\BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache-
    $logger\Psr\Log\LoggerInterface-
    $classNamestring-
    $relativeFileNamestring | null-
    + + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function addPluginData(string $pluginKey, mixed $data): void; +``` + +
    Add information to aт entity object
    + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $pluginKeystring-
    $datamixed-
    + +Return value: void + + +
    +
    +
    + +
      +
    • # + cursorToDocAttributeLinkFragment + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function cursorToDocAttributeLinkFragment(string $cursor, bool $isForDocument = true): string; +``` + + + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $cursorstring-
    $isForDocumentbool-
    + +Return value: string + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getAbsoluteFileName(): null|string; +``` + +
    Returns the absolute path to a file if it can be retrieved and if the file is in the project directory
    + +Parameters: not specified + +Return value: null | string + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getAst(): \PhpParser\Node\Stmt\Class_|\PhpParser\Node\Stmt\Interface_|\PhpParser\Node\Stmt\Trait_|\PhpParser\Node\Stmt\Enum_; +``` + +
    Get AST for this entity
    + +Parameters: not specified + +Return value: \PhpParser\Node\Stmt\Class_ | \PhpParser\Node\Stmt\Interface_ | \PhpParser\Node\Stmt\Trait_ | \PhpParser\Node\Stmt\Enum_ + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait + +public function getCacheKey(): string; +``` + + + +Parameters: not specified + +Return value: string + + +
    +
    +
    + +
      +
    • # + getCachedEntityDependencies + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getCachedEntityDependencies(): array; +``` + + + +Parameters: not specified + +Return value: array + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getConstant(string $constantName, bool $unsafe = false): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity; +``` + +
    Get the method entity by its name
    + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $constantNamestringThe name of the constant whose entity you want to get
    $unsafeboolCheck all constants, not just the constants allowed in the configuration (@see PhpHandlerSettings::getClassConstantEntityFilter())
    + +Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getConstantEntitiesCollection(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntitiesCollection; +``` + +
    Get a collection of constant entities
    + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntitiesCollection + + +Throws: + + + +See: + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getConstantValue(string $constantName): string|array|int|bool|null|float; +``` + +
    Get the compiled value of a constant
    + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $constantNamestringThe name of the constant for which you need to get the value
    + +Return value: string | array | int | bool | null | float + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getConstants(): array; +``` + +
    Get all constants that are available according to the configuration as an array
    + +Parameters: not specified + +Return value: array + + +Throws: + + + +See: + +
    +
    +
    + +
      +
    • # + getConstantsData + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getConstantsData(bool $onlyFromCurrentClassAndTraits = false, int $flags = \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity::VISIBILITY_MODIFIERS_FLAG_ANY): array; +``` + +
    Get a list of all constants and classes where they are implemented
    + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $onlyFromCurrentClassAndTraitsboolGet data only for constants from the current class
    $flagsintGet data only for constants corresponding to the visibility modifiers passed in this value
    + +Return value: array + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getConstantsValues(bool $onlyFromCurrentClassAndTraits = false, int $flags = \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity::VISIBILITY_MODIFIERS_FLAG_ANY): array; +``` + +
    Get class constant compiled values according to filters
    + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $onlyFromCurrentClassAndTraitsboolGet values only for constants from the current class
    $flagsintGet values only for constants corresponding to the visibility modifiers passed in this value
    + +Return value: array + + +Throws: + + +
    +
    +
    + +
      +
    • # + getCurrentRootEntity + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getCurrentRootEntity(): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; +``` + + + +Parameters: not specified + +Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDescription(): string; +``` + +
    Get entity description
    + +Parameters: not specified + +Return value: string + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDescriptionLinks(): array; +``` + +
    Get parsed links from description and doc blocks `see` and `link`
    + +Parameters: not specified + +Return value: array + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDocBlock(): \phpDocumentor\Reflection\DocBlock; +``` + +
    Get DocBlock for current entity
    + +Parameters: not specified + +Return value: \phpDocumentor\Reflection\DocBlock + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDocComment(): string; +``` + +
    Get the doc comment of an entity
    + +Parameters: not specified + +Return value: string + + +Throws: + + +
    +
    +
    + +
      +
    • # + getDocCommentEntity + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getDocCommentEntity(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; +``` + +
    Link to an entity where docBlock is implemented for this entity
    + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDocCommentLine(): null|int; +``` + +
    Get the code line number where the docBlock of the current entity begins
    + +Parameters: not specified + +Return value: null | int + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDocNote(): string; +``` + +
    Get the note annotation value
    + +Parameters: not specified + +Return value: string + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getDocRender(): \BumbleDocGen\Core\Renderer\EntityDocRenderer\EntityDocRendererInterface; +``` + + + +Parameters: not specified + +Return value: \BumbleDocGen\Core\Renderer\EntityDocRenderer\EntityDocRendererInterface + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getEndLine(): int; +``` + +
    Get the line number of the end of a class code in a file
    + +Parameters: not specified + +Return value: int + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getEntityDependencies(): array; +``` + + + +Parameters: not specified + +Return value: array + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getExamples(): array; +``` + +
    Get parsed examples from `examples` doc block
    + +Parameters: not specified + +Return value: array + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getFileContent(): string; +``` + + + +Parameters: not specified + +Return value: string + + +Throws: + + +
    +
    +
    + +
      +
    • # + getFileSourceLink + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getFileSourceLink(bool $withLine = true): null|string; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $withLinebool-
    + +Return value: null | string + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getFirstExample(): string; +``` + +
    Get first example from `examples` doc block
    + +Parameters: not specified + +Return value: string + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getImplementingClass(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; +``` + +
    Get the class like entity in which the current entity was implemented
    + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getInterfaceNames(): array; +``` + +
    Get a list of class interface names
    + +Parameters: not specified + +Return value: array + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getInterfacesEntities(): array; +``` + +
    Get a list of interface entities that the current class implements
    + +Parameters: not specified + +Return value: array + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getMethod(string $methodName, bool $unsafe = false): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntity; +``` + +
    Get the method entity by its name
    + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $methodNamestringThe name of the method whose entity you want to get
    $unsafeboolCheck all methods, not just the methods allowed in the configuration (@see PhpHandlerSettings::getMethodEntityFilter())
    + +Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntity + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getMethodEntitiesCollection(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntitiesCollection; +``` + +
    Get a collection of method entities
    + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntitiesCollection + + +Throws: + + + +See: + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getMethods(): array; +``` + +
    Get all methods that are available according to the configuration as an array
    + +Parameters: not specified + +Return value: array + + +Throws: + + + +See: + +
    +
    +
    + +
      +
    • # + getMethodsData + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getMethodsData(bool $onlyFromCurrentClassAndTraits = false, int $flags = \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntity::VISIBILITY_MODIFIERS_FLAG_ANY): array; +``` + +
    Get a list of all methods and classes where they are implemented
    + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $onlyFromCurrentClassAndTraitsboolGet data only for methods from the current class
    $flagsintGet data only for methods corresponding to the visibility modifiers passed in this value
    + +Return value: array + + +Throws: + + +
    +
    +
    + + + +```php +public function getModifiersString(): string; +``` + +
    Get entity modifiers as a string
    + +Parameters: not specified + +Return value: string + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getName(): string; +``` + +
    Full name of the entity
    + +Parameters: not specified + +Return value: string + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getNamespaceName(): string; +``` + +
    Get the entity namespace name
    + +Parameters: not specified + +Return value: string + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getObjectId(): string; +``` + +
    Get entity unique ID
    + +Parameters: not specified + +Return value: string + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getParentClass(): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; +``` + +
    Get the entity of the parent class if it exists
    + +Parameters: not specified + +Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getParentClassEntities(): array; +``` + +
    Get a list of parent class entities
    + +Parameters: not specified + +Return value: array + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getParentClassName(): null|string; +``` + +
    Get the name of the parent class entity if it exists
    + +Parameters: not specified + +Return value: null | string + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getParentClassNames(): array; +``` + +
    Get a list of entity names of parent classes
    + +Parameters: not specified + +Return value: array + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getPluginData(string $pluginKey): mixed; +``` + +
    Get additional information added using the plugin
    + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $pluginKeystring-
    + +Return value: mixed + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getProperties(): array; +``` + +
    Get all properties that are available according to the configuration as an array
    + +Parameters: not specified + +Return value: array + + +Throws: + + + +See: + +
    +
    +
    + +
      +
    • # + getPropertiesData + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getPropertiesData(bool $onlyFromCurrentClassAndTraits = false, int $flags = \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntity::VISIBILITY_MODIFIERS_FLAG_ANY): array; +``` + +
    Get a list of all properties and classes where they are implemented
    + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $onlyFromCurrentClassAndTraitsboolGet data only for properties from the current class
    $flagsintGet data only for properties corresponding to the visibility modifiers passed in this value
    + +Return value: array + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getProperty(string $propertyName, bool $unsafe = false): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntity; +``` + +
    Get the property entity by its name
    + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $propertyNamestringThe name of the property whose entity you want to get
    $unsafeboolCheck all properties, not just the properties allowed in the configuration (@see PhpHandlerSettings::getPropertyEntityFilter())
    + +Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntity + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getPropertyDefaultValue(string $propertyName): string|array|int|bool|null|float; +``` + +
    Get the compiled value of a property
    + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $propertyNamestringThe name of the property for which you need to get the value
    + +Return value: string | array | int | bool | null | float + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getPropertyEntitiesCollection(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntitiesCollection; +``` + +
    Get a collection of property entities
    + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntitiesCollection + + +Throws: + + + +See: + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getRelativeFileName(): null|string; +``` + +
    File name relative to project_root configuration parameter
    + +Parameters: not specified + +Return value: null | string + + + +See: + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getRootEntityCollection(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; +``` + +
    Get the collection of root entities to which this entity belongs
    + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getShortName(): string; +``` + +
    Short name of the entity
    + +Parameters: not specified + +Return value: string + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getStartLine(): int; +``` + +
    Get the line number of the start of a class code in a file
    + +Parameters: not specified + +Return value: int + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getThrows(): array; +``` + +
    Get parsed throws from `throws` doc block
    + +Parameters: not specified + +Return value: array + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getThrowsDocBlockLinks(): array; +``` + + + +Parameters: not specified + +Return value: array + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getTraits(): array; +``` + +
    Get a list of trait entities of the current class
    + +Parameters: not specified + +Return value: array + + +Throws: + + +
    +
    +
    + + + +```php +public function getTraitsNames(): array; +``` + +
    Get a list of class traits names
    + +Parameters: not specified + +Return value: array + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function hasConstant(string $constantName, bool $unsafe = false): bool; +``` + +
    Check if a constant exists in a class
    + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $constantNamestringThe name of the class whose entity you want to check
    $unsafeboolCheck all constants, not just the constants allowed in the configuration (@see PhpHandlerSettings::getClassConstantEntityFilter())
    + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function hasDescriptionLinks(): bool; +``` + +
    Checking if an entity has links in its description
    + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function hasExamples(): bool; +``` + +
    Checking if an entity has `example` docBlock
    + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function hasMethod(string $methodName, bool $unsafe = false): bool; +``` + +
    Check if a method exists in a class
    + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $methodNamestringThe name of the method whose entity you want to check
    $unsafeboolCheck all methods, not just the methods allowed in the configuration (@see PhpHandlerSettings::getMethodEntityFilter())
    + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function hasParentClass(string $parentClassName): bool; +``` + +
    Check if a certain parent class exists in a chain of parent classes
    + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $parentClassNamestringSearched parent class
    + +Return value: bool + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function hasProperty(string $propertyName, bool $unsafe = false): bool; +``` + +
    Check if a property exists in a class
    + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $propertyNamestringThe name of the property whose entity you want to check
    $unsafeboolCheck all properties, not just the properties allowed in the configuration (@see PhpHandlerSettings::getPropertyEntityFilter())
    + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function hasThrows(): bool; +``` + +
    Checking if an entity has `throws` docBlock
    + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function hasTraits(): bool; +``` + +
    Check if the class contains traits
    + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function implementsInterface(string $interfaceName): bool; +``` + +
    Check if a class implements an interface
    + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $interfaceNamestringName of the required interface in the interface chain
    + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +public function isAbstract(): bool; +``` + +
    Check that an entity is abstract
    + +Parameters: not specified + +Return value: bool + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function isApi(): bool; +``` + +
    Checking if an entity has `api` docBlock
    + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function isClass(): bool; +``` + +
    Check if an entity is a Class
    + +Parameters: not specified + +Return value: bool + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function isClassLoad(): bool; +``` + + + +Parameters: not specified + +Return value: bool + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function isDeprecated(): bool; +``` + +
    Checking if an entity has `deprecated` docBlock
    + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + +
      +
    • # + isDocumentCreationAllowed + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function isDocumentCreationAllowed(): bool; +``` + + + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + +
      +
    • # + isEntityCacheOutdated + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function isEntityCacheOutdated(): bool; +``` + +
    Checking if the entity cache is out of date
    + +Parameters: not specified + +Return value: bool + + +
    +
    +
    + +
      +
    • # + isEntityDataCacheOutdated + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait + +public function isEntityDataCacheOutdated(): bool; +``` + + + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function isEntityDataCanBeLoaded(): bool; +``` + + + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function isEntityFileCanBeLoad(): bool; +``` + +
    Checking if entity data can be retrieved
    + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public static function isEntityNameValid(string $entityName): bool; +``` + +
    Check if the name is a valid name for ClassLikeEntity
    + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $entityNamestring-
    + +Return value: bool + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function isEnum(): bool; +``` + +
    Check if an entity is an Enum
    + +Parameters: not specified + +Return value: bool + + +
    +
    +
    + +
      +
    • # + isExternalLibraryEntity + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function isExternalLibraryEntity(): bool; +``` + +
    Check if a given entity is an entity from a third party library (connected via composer)
    + +Parameters: not specified + +Return value: bool + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function isInGit(): bool; +``` + +
    Checking if class file is in git repository
    + +Parameters: not specified + +Return value: bool + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function isInstantiable(): bool; +``` + +
    Check that an entity is instantiable
    + +Parameters: not specified + +Return value: bool + + +
    +
    +
    + + + +```php +public function isInterface(): bool; +``` + +
    Check if an entity is an Interface
    + +Parameters: not specified + +Return value: bool + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function isInternal(): bool; +``` + +
    Checking if an entity has `internal` docBlock
    + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function isSubclassOf(string $className): bool; +``` + +
    Whether the given class is a subclass of the specified class
    + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $classNamestring-
    + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function isTrait(): bool; +``` + +
    Check if an entity is a Trait
    + +Parameters: not specified + +Return value: bool + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public static function normalizeClassName(string $name): string; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $namestring-
    + +Return value: string + + +
    +
    +
    + +
      +
    • # + reloadEntityDependenciesCache + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function reloadEntityDependenciesCache(): array; +``` + +
    Update entity dependency cache
    + +Parameters: not specified + +Return value: array + + +
    +
    +
    + +
      +
    • # + removeEntityValueFromCache + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait + +public function removeEntityValueFromCache(string $key): void; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $keystring-
    + +Return value: void + + +
    +
    +
    + +
      +
    • # + removeNotUsedEntityDataCache + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait + +public function removeNotUsedEntityDataCache(): void; +``` + + + +Parameters: not specified + +Return value: void + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function setCustomAst(\PhpParser\Node\Stmt\Trait_|\PhpParser\Node\Stmt\Enum_|\PhpParser\Node\Stmt\Interface_|\PhpParser\Node\Stmt\Class_|null $customAst): void; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $customAst\PhpParser\Node\Stmt\Trait_ | \PhpParser\Node\Stmt\Enum_ | \PhpParser\Node\Stmt\Interface_ | \PhpParser\Node\Stmt\Class_ | null-
    + +Return value: void + + +
    +
    + + \ No newline at end of file diff --git a/docs/tech/2.parser/reflectionApi/php/classes/InvalidConfigurationParameterException.md b/docs/tech/2.parser/reflectionApi/php/classes/InvalidConfigurationParameterException.md new file mode 100644 index 00000000..e87b8428 --- /dev/null +++ b/docs/tech/2.parser/reflectionApi/php/classes/InvalidConfigurationParameterException.md @@ -0,0 +1,34 @@ + + BumbleDocGen / Technical description of the project / Parser / Reflection API / Reflection API for PHP / InvalidConfigurationParameterException
    + +

    + InvalidConfigurationParameterException class: +

    + + + + + +```php +namespace BumbleDocGen\Core\Configuration\Exception; + +final class InvalidConfigurationParameterException extends \Exception +``` + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md b/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md new file mode 100644 index 00000000..a270dcaf --- /dev/null +++ b/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md @@ -0,0 +1,1780 @@ + + BumbleDocGen / Technical description of the project / Parser / Reflection API / Reflection API for PHP / PHP class method reflection API / MethodEntity
    + +

    + MethodEntity class: +

    + + + + + +```php +namespace BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method; + +class MethodEntity extends \BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity implements \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntityInterface, \BumbleDocGen\Core\Parser\Entity\EntityInterface, \BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityInterface +``` + +
    Class method entity
    + + + + + + +

    Initialization methods:

    + +
      +
    1. + __construct +
    2. +
    + +

    Methods:

    + +
      +
    1. + getAbsoluteFileName + - Returns the absolute path to a file if it can be retrieved and if the file is in the project directory
    2. +
    3. + getAst + - Get AST for this entity
    4. +
    5. + getBodyCode + - Get the code for this method
    6. +
    7. + getCacheKey +
    8. +
    9. + getCachedEntityDependencies +
    10. +
    11. + getCurrentRootEntity +
    12. +
    13. + getDescription + - Get entity description
    14. +
    15. + getDescriptionLinks + - Get parsed links from description and doc blocks `see` and `link`
    16. +
    17. + getDocBlock + - Get DocBlock for current entity
    18. +
    19. + getDocComment + - Get the doc comment of an entity
    20. +
    21. + getDocCommentEntity + - Link to an entity where docBlock is implemented for this entity
    22. +
    23. + getDocCommentLine +
    24. +
    25. + getDocNote + - Get the note annotation value
    26. +
    27. + getEndLine + - Get the line number of the end of a method's code in a file
    28. +
    29. + getExamples + - Get parsed examples from `examples` doc block
    30. +
    31. + getFileSourceLink +
    32. +
    33. + getFirstExample + - Get first example from `examples` doc block
    34. +
    35. + getFirstReturnValue + - Get the compiled first return value of a method (if possible)
    36. +
    37. + getImplementingClass + - Get the class like entity in which the current entity was implemented
    38. +
    39. + getImplementingClassName + - Get the name of the class in which this method is implemented
    40. +
    41. + getModifiersString + - Get a text representation of method modifiers
    42. +
    43. + getName + - Full name of the entity
    44. +
    45. + getNamespaceName + - Namespace of the class that contains this method
    46. +
    47. + getObjectId + - Get entity unique ID
    48. +
    49. + getParameters + - Get a list of method parameters
    50. +
    51. + getParametersString + - Get a list of method parameters as a string
    52. +
    53. + getParentMethod + - Get the parent method for this method
    54. +
    55. + getRelativeFileName + - File name relative to project_root configuration parameter
    56. +
    57. + getReturnType + - Get the return type of method
    58. +
    59. + getRootEntity +
    60. +
    61. + getRootEntityCollection + - Get the collection of root entities to which this entity belongs
    62. +
    63. + getShortName + - Short name of the entity
    64. +
    65. + getSignature + - Get the method signature as a string
    66. +
    67. + getStartColumn + - Get the column number of the beginning of the method code in a file
    68. +
    69. + getStartLine + - Get the line number of the beginning of the entity code in a file
    70. +
    71. + getThrows + - Get parsed throws from `throws` doc block
    72. +
    73. + getThrowsDocBlockLinks +
    74. +
    75. + hasDescriptionLinks + - Checking if an entity has links in its description
    76. +
    77. + hasExamples + - Checking if an entity has `example` docBlock
    78. +
    79. + hasThrows + - Checking if an entity has `throws` docBlock
    80. +
    81. + isApi + - Checking if an entity has `api` docBlock
    82. +
    83. + isConstructor + - Checking that a method is a constructor
    84. +
    85. + isDeprecated + - Checking if an entity has `deprecated` docBlock
    86. +
    87. + isDynamic + - Check if a method is a dynamic method, that is, implementable using __call or __callStatic
    88. +
    89. + isEntityCacheOutdated + - Checking if the entity cache is out of date
    90. +
    91. + isEntityDataCacheOutdated +
    92. +
    93. + isEntityFileCanBeLoad + - Checking if entity data can be retrieved
    94. +
    95. + isImplementedInParentClass + - Check if this method is implemented in the parent class
    96. +
    97. + isInitialization + - Check if a method is an initialization method
    98. +
    99. + isInternal + - Checking if an entity has `internal` docBlock
    100. +
    101. + isPrivate + - Check if a method is a private method
    102. +
    103. + isProtected + - Check if a method is a protected method
    104. +
    105. + isPublic + - Check if a method is a public method
    106. +
    107. + isStatic + - Check if this method is static
    108. +
    109. + reloadEntityDependenciesCache + - Update entity dependency cache
    110. +
    111. + removeEntityValueFromCache +
    112. +
    113. + removeNotUsedEntityDataCache +
    114. +
    + + +

    Constants:

    + + + + + + +

    Method details:

    + +
    + + + +```php +public function __construct(\BumbleDocGen\Core\Configuration\Configuration $configuration, \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity $classEntity, \BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper $parserHelper, \PhpParser\PrettyPrinter\Standard $astPrinter, \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache $localObjectCache, \Psr\Log\LoggerInterface $logger, string $methodName, string $implementingClassName); +``` + + + +Parameters: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $configuration\BumbleDocGen\Core\Configuration\Configuration-
    $classEntity\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity-
    $parserHelper\BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper-
    $astPrinter\PhpParser\PrettyPrinter\Standard-
    $localObjectCache\BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache-
    $logger\Psr\Log\LoggerInterface-
    $methodNamestring-
    $implementingClassNamestring-
    + + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getAbsoluteFileName(): null|string; +``` + +
    Returns the absolute path to a file if it can be retrieved and if the file is in the project directory
    + +Parameters: not specified + +Return value: null | string + + +Throws: + + +
    +
    +
    + + + +```php +public function getAst(): \PhpParser\Node\Stmt\ClassMethod; +``` + +
    Get AST for this entity
    + +Parameters: not specified + +Return value: \PhpParser\Node\Stmt\ClassMethod + + +Throws: + + +
    +
    +
    + + + +```php +public function getBodyCode(): string; +``` + +
    Get the code for this method
    + +Parameters: not specified + +Return value: string + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait + +public function getCacheKey(): string; +``` + + + +Parameters: not specified + +Return value: string + + +
    +
    +
    + +
      +
    • # + getCachedEntityDependencies + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getCachedEntityDependencies(): array; +``` + + + +Parameters: not specified + +Return value: array + + +Throws: + + +
    +
    +
    + +
      +
    • # + getCurrentRootEntity + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getCurrentRootEntity(): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; +``` + + + +Parameters: not specified + +Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDescription(): string; +``` + +
    Get entity description
    + +Parameters: not specified + +Return value: string + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDescriptionLinks(): array; +``` + +
    Get parsed links from description and doc blocks `see` and `link`
    + +Parameters: not specified + +Return value: array + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDocBlock(): \phpDocumentor\Reflection\DocBlock; +``` + +
    Get DocBlock for current entity
    + +Parameters: not specified + +Return value: \phpDocumentor\Reflection\DocBlock + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDocComment(): string; +``` + +
    Get the doc comment of an entity
    + +Parameters: not specified + +Return value: string + + +Throws: + + +
    +
    +
    + +
      +
    • # + getDocCommentEntity + :warning: Is internal | source code
    • +
    + +```php +public function getDocCommentEntity(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntity; +``` + +
    Link to an entity where docBlock is implemented for this entity
    + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntity + + +
    +
    +
    + + + +```php +public function getDocCommentLine(): null|int; +``` + + + +Parameters: not specified + +Return value: null | int + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDocNote(): string; +``` + +
    Get the note annotation value
    + +Parameters: not specified + +Return value: string + + +Throws: + + +
    +
    +
    + + + +```php +public function getEndLine(): int; +``` + +
    Get the line number of the end of a method's code in a file
    + +Parameters: not specified + +Return value: int + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getExamples(): array; +``` + +
    Get parsed examples from `examples` doc block
    + +Parameters: not specified + +Return value: array + + +Throws: + + +
    +
    +
    + +
      +
    • # + getFileSourceLink + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getFileSourceLink(bool $withLine = true): null|string; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $withLinebool-
    + +Return value: null | string + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getFirstExample(): string; +``` + +
    Get first example from `examples` doc block
    + +Parameters: not specified + +Return value: string + + +Throws: + + +
    +
    +
    + + + +```php +public function getFirstReturnValue(): mixed; +``` + +
    Get the compiled first return value of a method (if possible)
    + +Parameters: not specified + +Return value: mixed + + +
    +
    +
    + + + +```php +public function getImplementingClass(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; +``` + +
    Get the class like entity in which the current entity was implemented
    + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + + +
    +
    +
    + + + +```php +public function getImplementingClassName(): string; +``` + +
    Get the name of the class in which this method is implemented
    + +Parameters: not specified + +Return value: string + + +
    +
    +
    + + + +```php +public function getModifiersString(): string; +``` + +
    Get a text representation of method modifiers
    + +Parameters: not specified + +Return value: string + + +
    +
    +
    + + + +```php +public function getName(): string; +``` + +
    Full name of the entity
    + +Parameters: not specified + +Return value: string + + +
    +
    +
    + + + +```php +public function getNamespaceName(): string; +``` + +
    Namespace of the class that contains this method
    + +Parameters: not specified + +Return value: string + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getObjectId(): string; +``` + +
    Get entity unique ID
    + +Parameters: not specified + +Return value: string + + +
    +
    +
    + + + +```php +public function getParameters(): array; +``` + +
    Get a list of method parameters
    + +Parameters: not specified + +Return value: array + + +
    +
    +
    + + + +```php +public function getParametersString(): string; +``` + +
    Get a list of method parameters as a string
    + +Parameters: not specified + +Return value: string + + +
    +
    +
    + + + +```php +public function getParentMethod(): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntity; +``` + +
    Get the parent method for this method
    + +Parameters: not specified + +Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntity + + +Throws: + + +
    +
    +
    + + + +```php +public function getRelativeFileName(): null|string; +``` + +
    File name relative to project_root configuration parameter
    + +Parameters: not specified + +Return value: null | string + + + +See: + +
    +
    +
    + + + +```php +public function getReturnType(): string; +``` + +
    Get the return type of method
    + +Parameters: not specified + +Return value: string + + +
    +
    +
    + + + +```php +public function getRootEntity(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; +``` + + + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + + +
    +
    +
    + + + +```php +public function getRootEntityCollection(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; +``` + +
    Get the collection of root entities to which this entity belongs
    + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection + + +
    +
    +
    + + + +```php +public function getShortName(): string; +``` + +
    Short name of the entity
    + +Parameters: not specified + +Return value: string + + +
    +
    +
    + + + +```php +public function getSignature(): string; +``` + +
    Get the method signature as a string
    + +Parameters: not specified + +Return value: string + + +
    +
    +
    + + + +```php +public function getStartColumn(): int; +``` + +
    Get the column number of the beginning of the method code in a file
    + +Parameters: not specified + +Return value: int + + +
    +
    +
    + + + +```php +public function getStartLine(): int; +``` + +
    Get the line number of the beginning of the entity code in a file
    + +Parameters: not specified + +Return value: int + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getThrows(): array; +``` + +
    Get parsed throws from `throws` doc block
    + +Parameters: not specified + +Return value: array + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getThrowsDocBlockLinks(): array; +``` + + + +Parameters: not specified + +Return value: array + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function hasDescriptionLinks(): bool; +``` + +
    Checking if an entity has links in its description
    + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function hasExamples(): bool; +``` + +
    Checking if an entity has `example` docBlock
    + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function hasThrows(): bool; +``` + +
    Checking if an entity has `throws` docBlock
    + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function isApi(): bool; +``` + +
    Checking if an entity has `api` docBlock
    + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +public function isConstructor(): bool; +``` + +
    Checking that a method is a constructor
    + +Parameters: not specified + +Return value: bool + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function isDeprecated(): bool; +``` + +
    Checking if an entity has `deprecated` docBlock
    + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +public function isDynamic(): bool; +``` + +
    Check if a method is a dynamic method, that is, implementable using __call or __callStatic
    + +Parameters: not specified + +Return value: bool + + +
    +
    +
    + +
      +
    • # + isEntityCacheOutdated + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function isEntityCacheOutdated(): bool; +``` + +
    Checking if the entity cache is out of date
    + +Parameters: not specified + +Return value: bool + + +
    +
    +
    + +
      +
    • # + isEntityDataCacheOutdated + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait + +public function isEntityDataCacheOutdated(): bool; +``` + + + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function isEntityFileCanBeLoad(): bool; +``` + +
    Checking if entity data can be retrieved
    + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +public function isImplementedInParentClass(): bool; +``` + +
    Check if this method is implemented in the parent class
    + +Parameters: not specified + +Return value: bool + + +
    +
    +
    + + + +```php +public function isInitialization(): bool; +``` + +
    Check if a method is an initialization method
    + +Parameters: not specified + +Return value: bool + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function isInternal(): bool; +``` + +
    Checking if an entity has `internal` docBlock
    + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +public function isPrivate(): bool; +``` + +
    Check if a method is a private method
    + +Parameters: not specified + +Return value: bool + + +
    +
    +
    + + + +```php +public function isProtected(): bool; +``` + +
    Check if a method is a protected method
    + +Parameters: not specified + +Return value: bool + + +
    +
    +
    + + + +```php +public function isPublic(): bool; +``` + +
    Check if a method is a public method
    + +Parameters: not specified + +Return value: bool + + +
    +
    +
    + + + +```php +public function isStatic(): bool; +``` + +
    Check if this method is static
    + +Parameters: not specified + +Return value: bool + + +
    +
    +
    + +
      +
    • # + reloadEntityDependenciesCache + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function reloadEntityDependenciesCache(): array; +``` + +
    Update entity dependency cache
    + +Parameters: not specified + +Return value: array + + +
    +
    +
    + +
      +
    • # + removeEntityValueFromCache + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait + +public function removeEntityValueFromCache(string $key): void; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $keystring-
    + +Return value: void + + +
    +
    +
    + +
      +
    • # + removeNotUsedEntityDataCache + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait + +public function removeNotUsedEntityDataCache(): void; +``` + + + +Parameters: not specified + +Return value: void + + +Throws: + + +
    +
    + + \ No newline at end of file diff --git a/docs/tech/2.parser/reflectionApi/php/classes/PhpHandlerSettings.md b/docs/tech/2.parser/reflectionApi/php/classes/PhpHandlerSettings.md new file mode 100644 index 00000000..6ce8f0b4 --- /dev/null +++ b/docs/tech/2.parser/reflectionApi/php/classes/PhpHandlerSettings.md @@ -0,0 +1,514 @@ + + BumbleDocGen / Technical description of the project / Parser / Reflection API / Reflection API for PHP / PhpHandlerSettings
    + +

    + PhpHandlerSettings class: +

    + + + + + +```php +namespace BumbleDocGen\LanguageHandler\Php; + +final class PhpHandlerSettings +``` + + + + + + + + +

    Initialization methods:

    + +
      +
    1. + __construct +
    2. +
    + +

    Methods:

    + +
      +
    1. + getClassConstantEntityFilter +
    2. +
    3. + getClassEntityFilter +
    4. +
    5. + getComposerConfigFile +
    6. +
    7. + getComposerVendorDir +
    8. +
    9. + getCustomTwigFilters +
    10. +
    11. + getCustomTwigFunctions +
    12. +
    13. + getEntityDocRenderersCollection +
    14. +
    15. + getFileSourceBaseUrl +
    16. +
    17. + getMethodEntityFilter +
    18. +
    19. + getPropertyEntityFilter +
    20. +
    21. + getPsr4Map +
    22. +
    23. + getUseComposerAutoload +
    24. +
    + + +

    Constants:

    + + + + + + +

    Method details:

    + +
    + + + +```php +public function __construct(\BumbleDocGen\Core\Configuration\ConfigurationParameterBag $parameterBag, \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache $localObjectCache); +``` + + + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $parameterBag\BumbleDocGen\Core\Configuration\ConfigurationParameterBag-
    $localObjectCache\BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache-
    + + + +
    +
    +
    + + + +```php +public function getClassConstantEntityFilter(): \BumbleDocGen\Core\Parser\FilterCondition\ConditionInterface; +``` + + + +Parameters: not specified + +Return value: \BumbleDocGen\Core\Parser\FilterCondition\ConditionInterface + + +Throws: + + +
    +
    +
    + + + +```php +public function getClassEntityFilter(): \BumbleDocGen\Core\Parser\FilterCondition\ConditionInterface; +``` + + + +Parameters: not specified + +Return value: \BumbleDocGen\Core\Parser\FilterCondition\ConditionInterface + + +Throws: + + +
    +
    +
    + + + +```php +public function getComposerConfigFile(): null|string; +``` + + + +Parameters: not specified + +Return value: null | string + + +Throws: + + +
    +
    +
    + + + +```php +public function getComposerVendorDir(): null|string; +``` + + + +Parameters: not specified + +Return value: null | string + + +Throws: + + +
    +
    +
    + + + +```php +public function getCustomTwigFilters(): \BumbleDocGen\Core\Renderer\Twig\Filter\CustomFiltersCollection; +``` + + + +Parameters: not specified + +Return value: \BumbleDocGen\Core\Renderer\Twig\Filter\CustomFiltersCollection + + +Throws: + + +
    +
    +
    + + + +```php +public function getCustomTwigFunctions(): \BumbleDocGen\Core\Renderer\Twig\Function\CustomFunctionsCollection; +``` + + + +Parameters: not specified + +Return value: \BumbleDocGen\Core\Renderer\Twig\Function\CustomFunctionsCollection + + +Throws: + + +
    +
    +
    + + + +```php +public function getEntityDocRenderersCollection(): \BumbleDocGen\Core\Renderer\EntityDocRenderer\EntityDocRenderersCollection; +``` + + + +Parameters: not specified + +Return value: \BumbleDocGen\Core\Renderer\EntityDocRenderer\EntityDocRenderersCollection + + +Throws: + + +
    +
    +
    + + + +```php +public function getFileSourceBaseUrl(): null|string; +``` + + + +Parameters: not specified + +Return value: null | string + + +Throws: + + +
    +
    +
    + + + +```php +public function getMethodEntityFilter(): \BumbleDocGen\Core\Parser\FilterCondition\ConditionInterface; +``` + + + +Parameters: not specified + +Return value: \BumbleDocGen\Core\Parser\FilterCondition\ConditionInterface + + +Throws: + + +
    +
    +
    + + + +```php +public function getPropertyEntityFilter(): \BumbleDocGen\Core\Parser\FilterCondition\ConditionInterface; +``` + + + +Parameters: not specified + +Return value: \BumbleDocGen\Core\Parser\FilterCondition\ConditionInterface + + +Throws: + + +
    +
    +
    + + + +```php +public function getPsr4Map(): array; +``` + + + +Parameters: not specified + +Return value: array + + +Throws: + + +
    +
    +
    + + + +```php +public function getUseComposerAutoload(): bool; +``` + + + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    + + \ No newline at end of file diff --git a/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md b/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md new file mode 100644 index 00000000..24a7308e --- /dev/null +++ b/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md @@ -0,0 +1,1588 @@ + + BumbleDocGen / Technical description of the project / Parser / Reflection API / Reflection API for PHP / PHP class property reflection API / PropertyEntity
    + +

    + PropertyEntity class: +

    + + + + + +```php +namespace BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property; + +class PropertyEntity extends \BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity implements \BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityInterface, \BumbleDocGen\Core\Parser\Entity\EntityInterface +``` + +
    Class property entity
    + + + + + + +

    Initialization methods:

    + +
      +
    1. + __construct +
    2. +
    + +

    Methods:

    + +
      +
    1. + getAbsoluteFileName + - Returns the absolute path to a file if it can be retrieved and if the file is in the project directory
    2. +
    3. + getAst + - Get AST for this entity
    4. +
    5. + getCacheKey +
    6. +
    7. + getCachedEntityDependencies +
    8. +
    9. + getCurrentRootEntity +
    10. +
    11. + getDefaultValue + - Get the compiled default value of a property
    12. +
    13. + getDescription + - Get entity description
    14. +
    15. + getDescriptionLinks + - Get parsed links from description and doc blocks `see` and `link`
    16. +
    17. + getDocBlock + - Get DocBlock for current entity
    18. +
    19. + getDocComment + - Get the doc comment of an entity
    20. +
    21. + getDocCommentEntity + - Link to an entity where docBlock is implemented for this entity
    22. +
    23. + getDocCommentLine + - Get the code line number where the docBlock of the current entity begins
    24. +
    25. + getDocNote + - Get the note annotation value
    26. +
    27. + getEndLine + - Get the line number of the end of a property's code in a file
    28. +
    29. + getExamples + - Get parsed examples from `examples` doc block
    30. +
    31. + getFileSourceLink +
    32. +
    33. + getFirstExample + - Get first example from `examples` doc block
    34. +
    35. + getImplementingClass + - Get the class like entity in which the current entity was implemented
    36. +
    37. + getImplementingClassName + - Get the name of the class in which this property is implemented
    38. +
    39. + getModifiersString + - Get a text representation of property modifiers
    40. +
    41. + getName + - Full name of the entity
    42. +
    43. + getNamespaceName + - Namespace of the class that contains this property
    44. +
    45. + getObjectId + - Get entity unique ID
    46. +
    47. + getRelativeFileName + - File name relative to project_root configuration parameter
    48. +
    49. + getRootEntity +
    50. +
    51. + getRootEntityCollection + - Get the collection of root entities to which this entity belongs
    52. +
    53. + getShortName + - Short name of the entity
    54. +
    55. + getStartLine + - Get the line number of the beginning of the entity code in a file
    56. +
    57. + getThrows + - Get parsed throws from `throws` doc block
    58. +
    59. + getThrowsDocBlockLinks +
    60. +
    61. + getType + - Get current property type
    62. +
    63. + hasDescriptionLinks + - Checking if an entity has links in its description
    64. +
    65. + hasExamples + - Checking if an entity has `example` docBlock
    66. +
    67. + hasThrows + - Checking if an entity has `throws` docBlock
    68. +
    69. + isApi + - Checking if an entity has `api` docBlock
    70. +
    71. + isDeprecated + - Checking if an entity has `deprecated` docBlock
    72. +
    73. + isEntityCacheOutdated + - Checking if the entity cache is out of date
    74. +
    75. + isEntityDataCacheOutdated +
    76. +
    77. + isEntityFileCanBeLoad + - Checking if entity data can be retrieved
    78. +
    79. + isImplementedInParentClass + - Check if this property is implemented in the parent class
    80. +
    81. + isInternal + - Checking if an entity has `internal` docBlock
    82. +
    83. + isPrivate + - Check if a private is a public private
    84. +
    85. + isProtected + - Check if a protected is a public protected
    86. +
    87. + isPublic + - Check if a property is a public property
    88. +
    89. + reloadEntityDependenciesCache + - Update entity dependency cache
    90. +
    91. + removeEntityValueFromCache +
    92. +
    93. + removeNotUsedEntityDataCache +
    94. +
    + + +

    Constants:

    + + + + + + +

    Method details:

    + +
    + + + +```php +public function __construct(\BumbleDocGen\Core\Configuration\Configuration $configuration, \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity $classEntity, \BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper $parserHelper, \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache $localObjectCache, \Psr\Log\LoggerInterface $logger, string $propertyName, string $implementingClassName); +``` + + + +Parameters: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $configuration\BumbleDocGen\Core\Configuration\Configuration-
    $classEntity\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity-
    $parserHelper\BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper-
    $localObjectCache\BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache-
    $logger\Psr\Log\LoggerInterface-
    $propertyNamestring-
    $implementingClassNamestring-
    + + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getAbsoluteFileName(): null|string; +``` + +
    Returns the absolute path to a file if it can be retrieved and if the file is in the project directory
    + +Parameters: not specified + +Return value: null | string + + +Throws: + + +
    +
    +
    + + + +```php +public function getAst(): \PhpParser\Node\Stmt\Property; +``` + +
    Get AST for this entity
    + +Parameters: not specified + +Return value: \PhpParser\Node\Stmt\Property + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait + +public function getCacheKey(): string; +``` + + + +Parameters: not specified + +Return value: string + + +
    +
    +
    + +
      +
    • # + getCachedEntityDependencies + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getCachedEntityDependencies(): array; +``` + + + +Parameters: not specified + +Return value: array + + +Throws: + + +
    +
    +
    + +
      +
    • # + getCurrentRootEntity + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getCurrentRootEntity(): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; +``` + + + +Parameters: not specified + +Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + + +
    +
    +
    + + + +```php +public function getDefaultValue(): string|array|int|bool|null|float; +``` + +
    Get the compiled default value of a property
    + +Parameters: not specified + +Return value: string | array | int | bool | null | float + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDescription(): string; +``` + +
    Get entity description
    + +Parameters: not specified + +Return value: string + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDescriptionLinks(): array; +``` + +
    Get parsed links from description and doc blocks `see` and `link`
    + +Parameters: not specified + +Return value: array + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDocBlock(): \phpDocumentor\Reflection\DocBlock; +``` + +
    Get DocBlock for current entity
    + +Parameters: not specified + +Return value: \phpDocumentor\Reflection\DocBlock + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDocComment(): string; +``` + +
    Get the doc comment of an entity
    + +Parameters: not specified + +Return value: string + + +Throws: + + +
    +
    +
    + +
      +
    • # + getDocCommentEntity + :warning: Is internal | source code
    • +
    + +```php +public function getDocCommentEntity(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntity; +``` + +
    Link to an entity where docBlock is implemented for this entity
    + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntity + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDocCommentLine(): null|int; +``` + +
    Get the code line number where the docBlock of the current entity begins
    + +Parameters: not specified + +Return value: null | int + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDocNote(): string; +``` + +
    Get the note annotation value
    + +Parameters: not specified + +Return value: string + + +Throws: + + +
    +
    +
    + + + +```php +public function getEndLine(): int; +``` + +
    Get the line number of the end of a property's code in a file
    + +Parameters: not specified + +Return value: int + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getExamples(): array; +``` + +
    Get parsed examples from `examples` doc block
    + +Parameters: not specified + +Return value: array + + +Throws: + + +
    +
    +
    + +
      +
    • # + getFileSourceLink + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getFileSourceLink(bool $withLine = true): null|string; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $withLinebool-
    + +Return value: null | string + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getFirstExample(): string; +``` + +
    Get first example from `examples` doc block
    + +Parameters: not specified + +Return value: string + + +Throws: + + +
    +
    +
    + + + +```php +public function getImplementingClass(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; +``` + +
    Get the class like entity in which the current entity was implemented
    + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + + +
    +
    +
    + + + +```php +public function getImplementingClassName(): string; +``` + +
    Get the name of the class in which this property is implemented
    + +Parameters: not specified + +Return value: string + + +
    +
    +
    + + + +```php +public function getModifiersString(): string; +``` + +
    Get a text representation of property modifiers
    + +Parameters: not specified + +Return value: string + + +Throws: + + +
    +
    +
    + + + +```php +public function getName(): string; +``` + +
    Full name of the entity
    + +Parameters: not specified + +Return value: string + + +
    +
    +
    + + + +```php +public function getNamespaceName(): string; +``` + +
    Namespace of the class that contains this property
    + +Parameters: not specified + +Return value: string + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getObjectId(): string; +``` + +
    Get entity unique ID
    + +Parameters: not specified + +Return value: string + + +
    +
    +
    + + + +```php +public function getRelativeFileName(): null|string; +``` + +
    File name relative to project_root configuration parameter
    + +Parameters: not specified + +Return value: null | string + + + +See: + +
    +
    +
    + + + +```php +public function getRootEntity(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; +``` + + + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + + +
    +
    +
    + + + +```php +public function getRootEntityCollection(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; +``` + +
    Get the collection of root entities to which this entity belongs
    + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection + + +
    +
    +
    + + + +```php +public function getShortName(): string; +``` + +
    Short name of the entity
    + +Parameters: not specified + +Return value: string + + +
    +
    +
    + + + +```php +public function getStartLine(): int; +``` + +
    Get the line number of the beginning of the entity code in a file
    + +Parameters: not specified + +Return value: int + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getThrows(): array; +``` + +
    Get parsed throws from `throws` doc block
    + +Parameters: not specified + +Return value: array + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getThrowsDocBlockLinks(): array; +``` + + + +Parameters: not specified + +Return value: array + + +Throws: + + +
    +
    +
    + + + +```php +public function getType(): string; +``` + +
    Get current property type
    + +Parameters: not specified + +Return value: string + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function hasDescriptionLinks(): bool; +``` + +
    Checking if an entity has links in its description
    + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function hasExamples(): bool; +``` + +
    Checking if an entity has `example` docBlock
    + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function hasThrows(): bool; +``` + +
    Checking if an entity has `throws` docBlock
    + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function isApi(): bool; +``` + +
    Checking if an entity has `api` docBlock
    + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function isDeprecated(): bool; +``` + +
    Checking if an entity has `deprecated` docBlock
    + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + +
      +
    • # + isEntityCacheOutdated + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function isEntityCacheOutdated(): bool; +``` + +
    Checking if the entity cache is out of date
    + +Parameters: not specified + +Return value: bool + + +
    +
    +
    + +
      +
    • # + isEntityDataCacheOutdated + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait + +public function isEntityDataCacheOutdated(): bool; +``` + + + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function isEntityFileCanBeLoad(): bool; +``` + +
    Checking if entity data can be retrieved
    + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +public function isImplementedInParentClass(): bool; +``` + +
    Check if this property is implemented in the parent class
    + +Parameters: not specified + +Return value: bool + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function isInternal(): bool; +``` + +
    Checking if an entity has `internal` docBlock
    + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +public function isPrivate(): bool; +``` + +
    Check if a private is a public private
    + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +public function isProtected(): bool; +``` + +
    Check if a protected is a public protected
    + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +public function isPublic(): bool; +``` + +
    Check if a property is a public property
    + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + +
      +
    • # + reloadEntityDependenciesCache + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function reloadEntityDependenciesCache(): array; +``` + +
    Update entity dependency cache
    + +Parameters: not specified + +Return value: array + + +
    +
    +
    + +
      +
    • # + removeEntityValueFromCache + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait + +public function removeEntityValueFromCache(string $key): void; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $keystring-
    + +Return value: void + + +
    +
    +
    + +
      +
    • # + removeNotUsedEntityDataCache + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait + +public function removeNotUsedEntityDataCache(): void; +``` + + + +Parameters: not specified + +Return value: void + + +Throws: + + +
    +
    + + \ No newline at end of file diff --git a/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md b/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md new file mode 100644 index 00000000..f1cc36f2 --- /dev/null +++ b/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md @@ -0,0 +1,3441 @@ + + BumbleDocGen / Technical description of the project / Parser / Reflection API / Reflection API for PHP / PHP trait reflection API / TraitEntity
    + +

    + TraitEntity class: +

    + + + + + +```php +namespace BumbleDocGen\LanguageHandler\Php\Parser\Entity; + +class TraitEntity extends \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity implements \BumbleDocGen\Core\Renderer\Context\DocumentTransformableEntityInterface, \BumbleDocGen\Core\Parser\Entity\RootEntityInterface, \BumbleDocGen\Core\Parser\Entity\EntityInterface, \BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityInterface +``` + +
    Trait
    + +See: + + + + + + + +

    Initialization methods:

    + +
      +
    1. + __construct +
    2. +
    + +

    Methods:

    + +
      +
    1. + addPluginData + - Add information to aт entity object
    2. +
    3. + cursorToDocAttributeLinkFragment +
    4. +
    5. + getAbsoluteFileName + - Returns the absolute path to a file if it can be retrieved and if the file is in the project directory
    6. +
    7. + getAst + - Get AST for this entity
    8. +
    9. + getCacheKey +
    10. +
    11. + getCachedEntityDependencies +
    12. +
    13. + getConstant + - Get the method entity by its name
    14. +
    15. + getConstantEntitiesCollection + - Get a collection of constant entities
    16. +
    17. + getConstantValue + - Get the compiled value of a constant
    18. +
    19. + getConstants + - Get all constants that are available according to the configuration as an array
    20. +
    21. + getConstantsData + - Get a list of all constants and classes where they are implemented
    22. +
    23. + getConstantsValues + - Get class constant compiled values according to filters
    24. +
    25. + getCurrentRootEntity +
    26. +
    27. + getDescription + - Get entity description
    28. +
    29. + getDescriptionLinks + - Get parsed links from description and doc blocks `see` and `link`
    30. +
    31. + getDocBlock + - Get DocBlock for current entity
    32. +
    33. + getDocComment + - Get the doc comment of an entity
    34. +
    35. + getDocCommentEntity + - Link to an entity where docBlock is implemented for this entity
    36. +
    37. + getDocCommentLine + - Get the code line number where the docBlock of the current entity begins
    38. +
    39. + getDocNote + - Get the note annotation value
    40. +
    41. + getDocRender +
    42. +
    43. + getEndLine + - Get the line number of the end of a class code in a file
    44. +
    45. + getEntityDependencies +
    46. +
    47. + getExamples + - Get parsed examples from `examples` doc block
    48. +
    49. + getFileContent +
    50. +
    51. + getFileSourceLink +
    52. +
    53. + getFirstExample + - Get first example from `examples` doc block
    54. +
    55. + getImplementingClass + - Get the class like entity in which the current entity was implemented
    56. +
    57. + getInterfaceNames + - Get a list of class interface names
    58. +
    59. + getInterfacesEntities + - Get a list of interface entities that the current class implements
    60. +
    61. + getMethod + - Get the method entity by its name
    62. +
    63. + getMethodEntitiesCollection + - Get a collection of method entities
    64. +
    65. + getMethods + - Get all methods that are available according to the configuration as an array
    66. +
    67. + getMethodsData + - Get a list of all methods and classes where they are implemented
    68. +
    69. + getModifiersString + - Get entity modifiers as a string
    70. +
    71. + getName + - Full name of the entity
    72. +
    73. + getNamespaceName + - Get the entity namespace name
    74. +
    75. + getObjectId + - Get entity unique ID
    76. +
    77. + getParentClass + - Get the entity of the parent class if it exists
    78. +
    79. + getParentClassEntities + - Get a list of parent class entities
    80. +
    81. + getParentClassName + - Get the name of the parent class entity if it exists
    82. +
    83. + getParentClassNames + - Get a list of entity names of parent classes
    84. +
    85. + getPluginData + - Get additional information added using the plugin
    86. +
    87. + getProperties + - Get all properties that are available according to the configuration as an array
    88. +
    89. + getPropertiesData + - Get a list of all properties and classes where they are implemented
    90. +
    91. + getProperty + - Get the property entity by its name
    92. +
    93. + getPropertyDefaultValue + - Get the compiled value of a property
    94. +
    95. + getPropertyEntitiesCollection + - Get a collection of property entities
    96. +
    97. + getRelativeFileName + - File name relative to project_root configuration parameter
    98. +
    99. + getRootEntityCollection + - Get the collection of root entities to which this entity belongs
    100. +
    101. + getShortName + - Short name of the entity
    102. +
    103. + getStartLine + - Get the line number of the start of a class code in a file
    104. +
    105. + getThrows + - Get parsed throws from `throws` doc block
    106. +
    107. + getThrowsDocBlockLinks +
    108. +
    109. + getTraits + - Get a list of trait entities of the current class
    110. +
    111. + getTraitsNames + - Get a list of class traits names
    112. +
    113. + hasConstant + - Check if a constant exists in a class
    114. +
    115. + hasDescriptionLinks + - Checking if an entity has links in its description
    116. +
    117. + hasExamples + - Checking if an entity has `example` docBlock
    118. +
    119. + hasMethod + - Check if a method exists in a class
    120. +
    121. + hasParentClass + - Check if a certain parent class exists in a chain of parent classes
    122. +
    123. + hasProperty + - Check if a property exists in a class
    124. +
    125. + hasThrows + - Checking if an entity has `throws` docBlock
    126. +
    127. + hasTraits + - Check if the class contains traits
    128. +
    129. + implementsInterface + - Check if a class implements an interface
    130. +
    131. + isAbstract + - Check that an entity is abstract
    132. +
    133. + isApi + - Checking if an entity has `api` docBlock
    134. +
    135. + isClass + - Check if an entity is a Class
    136. +
    137. + isClassLoad +
    138. +
    139. + isDeprecated + - Checking if an entity has `deprecated` docBlock
    140. +
    141. + isDocumentCreationAllowed +
    142. +
    143. + isEntityCacheOutdated + - Checking if the entity cache is out of date
    144. +
    145. + isEntityDataCacheOutdated +
    146. +
    147. + isEntityDataCanBeLoaded +
    148. +
    149. + isEntityFileCanBeLoad + - Checking if entity data can be retrieved
    150. +
    151. + isEntityNameValid + - Check if the name is a valid name for ClassLikeEntity
    152. +
    153. + isEnum + - Check if an entity is an Enum
    154. +
    155. + isExternalLibraryEntity + - Check if a given entity is an entity from a third party library (connected via composer)
    156. +
    157. + isInGit + - Checking if class file is in git repository
    158. +
    159. + isInstantiable + - Check that an entity is instantiable
    160. +
    161. + isInterface + - Check if an entity is an Interface
    162. +
    163. + isInternal + - Checking if an entity has `internal` docBlock
    164. +
    165. + isSubclassOf + - Whether the given class is a subclass of the specified class
    166. +
    167. + isTrait + - Check if an entity is a Trait
    168. +
    169. + normalizeClassName +
    170. +
    171. + reloadEntityDependenciesCache + - Update entity dependency cache
    172. +
    173. + removeEntityValueFromCache +
    174. +
    175. + removeNotUsedEntityDataCache +
    176. +
    177. + setCustomAst +
    178. +
    + + + + + + + +

    Method details:

    + +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function __construct(\BumbleDocGen\Core\Configuration\Configuration $configuration, \BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings $phpHandlerSettings, \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection $entitiesCollection, \BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper $parserHelper, \BumbleDocGen\LanguageHandler\Php\Parser\ComposerHelper $composerHelper, \BumbleDocGen\LanguageHandler\Php\Parser\PhpParser\PhpParserHelper $phpParserHelper, \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache $localObjectCache, \Psr\Log\LoggerInterface $logger, string $className, string|null $relativeFileName); +``` + + + +Parameters: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $configuration\BumbleDocGen\Core\Configuration\Configuration-
    $phpHandlerSettings\BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings-
    $entitiesCollection\BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection-
    $parserHelper\BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper-
    $composerHelper\BumbleDocGen\LanguageHandler\Php\Parser\ComposerHelper-
    $phpParserHelper\BumbleDocGen\LanguageHandler\Php\Parser\PhpParser\PhpParserHelper-
    $localObjectCache\BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache-
    $logger\Psr\Log\LoggerInterface-
    $classNamestring-
    $relativeFileNamestring | null-
    + + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function addPluginData(string $pluginKey, mixed $data): void; +``` + +
    Add information to aт entity object
    + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $pluginKeystring-
    $datamixed-
    + +Return value: void + + +
    +
    +
    + +
      +
    • # + cursorToDocAttributeLinkFragment + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function cursorToDocAttributeLinkFragment(string $cursor, bool $isForDocument = true): string; +``` + + + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $cursorstring-
    $isForDocumentbool-
    + +Return value: string + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getAbsoluteFileName(): null|string; +``` + +
    Returns the absolute path to a file if it can be retrieved and if the file is in the project directory
    + +Parameters: not specified + +Return value: null | string + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getAst(): \PhpParser\Node\Stmt\Class_|\PhpParser\Node\Stmt\Interface_|\PhpParser\Node\Stmt\Trait_|\PhpParser\Node\Stmt\Enum_; +``` + +
    Get AST for this entity
    + +Parameters: not specified + +Return value: \PhpParser\Node\Stmt\Class_ | \PhpParser\Node\Stmt\Interface_ | \PhpParser\Node\Stmt\Trait_ | \PhpParser\Node\Stmt\Enum_ + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait + +public function getCacheKey(): string; +``` + + + +Parameters: not specified + +Return value: string + + +
    +
    +
    + +
      +
    • # + getCachedEntityDependencies + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getCachedEntityDependencies(): array; +``` + + + +Parameters: not specified + +Return value: array + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getConstant(string $constantName, bool $unsafe = false): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity; +``` + +
    Get the method entity by its name
    + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $constantNamestringThe name of the constant whose entity you want to get
    $unsafeboolCheck all constants, not just the constants allowed in the configuration (@see PhpHandlerSettings::getClassConstantEntityFilter())
    + +Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getConstantEntitiesCollection(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntitiesCollection; +``` + +
    Get a collection of constant entities
    + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntitiesCollection + + +Throws: + + + +See: + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getConstantValue(string $constantName): string|array|int|bool|null|float; +``` + +
    Get the compiled value of a constant
    + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $constantNamestringThe name of the constant for which you need to get the value
    + +Return value: string | array | int | bool | null | float + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getConstants(): array; +``` + +
    Get all constants that are available according to the configuration as an array
    + +Parameters: not specified + +Return value: array + + +Throws: + + + +See: + +
    +
    +
    + +
      +
    • # + getConstantsData + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getConstantsData(bool $onlyFromCurrentClassAndTraits = false, int $flags = \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity::VISIBILITY_MODIFIERS_FLAG_ANY): array; +``` + +
    Get a list of all constants and classes where they are implemented
    + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $onlyFromCurrentClassAndTraitsboolGet data only for constants from the current class
    $flagsintGet data only for constants corresponding to the visibility modifiers passed in this value
    + +Return value: array + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getConstantsValues(bool $onlyFromCurrentClassAndTraits = false, int $flags = \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity::VISIBILITY_MODIFIERS_FLAG_ANY): array; +``` + +
    Get class constant compiled values according to filters
    + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $onlyFromCurrentClassAndTraitsboolGet values only for constants from the current class
    $flagsintGet values only for constants corresponding to the visibility modifiers passed in this value
    + +Return value: array + + +Throws: + + +
    +
    +
    + +
      +
    • # + getCurrentRootEntity + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getCurrentRootEntity(): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; +``` + + + +Parameters: not specified + +Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDescription(): string; +``` + +
    Get entity description
    + +Parameters: not specified + +Return value: string + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDescriptionLinks(): array; +``` + +
    Get parsed links from description and doc blocks `see` and `link`
    + +Parameters: not specified + +Return value: array + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDocBlock(): \phpDocumentor\Reflection\DocBlock; +``` + +
    Get DocBlock for current entity
    + +Parameters: not specified + +Return value: \phpDocumentor\Reflection\DocBlock + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDocComment(): string; +``` + +
    Get the doc comment of an entity
    + +Parameters: not specified + +Return value: string + + +Throws: + + +
    +
    +
    + +
      +
    • # + getDocCommentEntity + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getDocCommentEntity(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; +``` + +
    Link to an entity where docBlock is implemented for this entity
    + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDocCommentLine(): null|int; +``` + +
    Get the code line number where the docBlock of the current entity begins
    + +Parameters: not specified + +Return value: null | int + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDocNote(): string; +``` + +
    Get the note annotation value
    + +Parameters: not specified + +Return value: string + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getDocRender(): \BumbleDocGen\Core\Renderer\EntityDocRenderer\EntityDocRendererInterface; +``` + + + +Parameters: not specified + +Return value: \BumbleDocGen\Core\Renderer\EntityDocRenderer\EntityDocRendererInterface + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getEndLine(): int; +``` + +
    Get the line number of the end of a class code in a file
    + +Parameters: not specified + +Return value: int + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getEntityDependencies(): array; +``` + + + +Parameters: not specified + +Return value: array + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getExamples(): array; +``` + +
    Get parsed examples from `examples` doc block
    + +Parameters: not specified + +Return value: array + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getFileContent(): string; +``` + + + +Parameters: not specified + +Return value: string + + +Throws: + + +
    +
    +
    + +
      +
    • # + getFileSourceLink + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getFileSourceLink(bool $withLine = true): null|string; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $withLinebool-
    + +Return value: null | string + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getFirstExample(): string; +``` + +
    Get first example from `examples` doc block
    + +Parameters: not specified + +Return value: string + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getImplementingClass(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; +``` + +
    Get the class like entity in which the current entity was implemented
    + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + + +
    +
    +
    + + + +```php +public function getInterfaceNames(): array; +``` + +
    Get a list of class interface names
    + +Parameters: not specified + +Return value: array + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getInterfacesEntities(): array; +``` + +
    Get a list of interface entities that the current class implements
    + +Parameters: not specified + +Return value: array + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getMethod(string $methodName, bool $unsafe = false): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntity; +``` + +
    Get the method entity by its name
    + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $methodNamestringThe name of the method whose entity you want to get
    $unsafeboolCheck all methods, not just the methods allowed in the configuration (@see PhpHandlerSettings::getMethodEntityFilter())
    + +Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntity + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getMethodEntitiesCollection(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntitiesCollection; +``` + +
    Get a collection of method entities
    + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntitiesCollection + + +Throws: + + + +See: + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getMethods(): array; +``` + +
    Get all methods that are available according to the configuration as an array
    + +Parameters: not specified + +Return value: array + + +Throws: + + + +See: + +
    +
    +
    + +
      +
    • # + getMethodsData + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getMethodsData(bool $onlyFromCurrentClassAndTraits = false, int $flags = \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntity::VISIBILITY_MODIFIERS_FLAG_ANY): array; +``` + +
    Get a list of all methods and classes where they are implemented
    + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $onlyFromCurrentClassAndTraitsboolGet data only for methods from the current class
    $flagsintGet data only for methods corresponding to the visibility modifiers passed in this value
    + +Return value: array + + +Throws: + + +
    +
    +
    + + + +```php +public function getModifiersString(): string; +``` + +
    Get entity modifiers as a string
    + +Parameters: not specified + +Return value: string + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getName(): string; +``` + +
    Full name of the entity
    + +Parameters: not specified + +Return value: string + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getNamespaceName(): string; +``` + +
    Get the entity namespace name
    + +Parameters: not specified + +Return value: string + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getObjectId(): string; +``` + +
    Get entity unique ID
    + +Parameters: not specified + +Return value: string + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getParentClass(): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; +``` + +
    Get the entity of the parent class if it exists
    + +Parameters: not specified + +Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getParentClassEntities(): array; +``` + +
    Get a list of parent class entities
    + +Parameters: not specified + +Return value: array + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getParentClassName(): null|string; +``` + +
    Get the name of the parent class entity if it exists
    + +Parameters: not specified + +Return value: null | string + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getParentClassNames(): array; +``` + +
    Get a list of entity names of parent classes
    + +Parameters: not specified + +Return value: array + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getPluginData(string $pluginKey): mixed; +``` + +
    Get additional information added using the plugin
    + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $pluginKeystring-
    + +Return value: mixed + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getProperties(): array; +``` + +
    Get all properties that are available according to the configuration as an array
    + +Parameters: not specified + +Return value: array + + +Throws: + + + +See: + +
    +
    +
    + +
      +
    • # + getPropertiesData + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getPropertiesData(bool $onlyFromCurrentClassAndTraits = false, int $flags = \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntity::VISIBILITY_MODIFIERS_FLAG_ANY): array; +``` + +
    Get a list of all properties and classes where they are implemented
    + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $onlyFromCurrentClassAndTraitsboolGet data only for properties from the current class
    $flagsintGet data only for properties corresponding to the visibility modifiers passed in this value
    + +Return value: array + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getProperty(string $propertyName, bool $unsafe = false): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntity; +``` + +
    Get the property entity by its name
    + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $propertyNamestringThe name of the property whose entity you want to get
    $unsafeboolCheck all properties, not just the properties allowed in the configuration (@see PhpHandlerSettings::getPropertyEntityFilter())
    + +Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntity + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getPropertyDefaultValue(string $propertyName): string|array|int|bool|null|float; +``` + +
    Get the compiled value of a property
    + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $propertyNamestringThe name of the property for which you need to get the value
    + +Return value: string | array | int | bool | null | float + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getPropertyEntitiesCollection(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntitiesCollection; +``` + +
    Get a collection of property entities
    + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntitiesCollection + + +Throws: + + + +See: + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getRelativeFileName(): null|string; +``` + +
    File name relative to project_root configuration parameter
    + +Parameters: not specified + +Return value: null | string + + + +See: + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getRootEntityCollection(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; +``` + +
    Get the collection of root entities to which this entity belongs
    + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getShortName(): string; +``` + +
    Short name of the entity
    + +Parameters: not specified + +Return value: string + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getStartLine(): int; +``` + +
    Get the line number of the start of a class code in a file
    + +Parameters: not specified + +Return value: int + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getThrows(): array; +``` + +
    Get parsed throws from `throws` doc block
    + +Parameters: not specified + +Return value: array + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getThrowsDocBlockLinks(): array; +``` + + + +Parameters: not specified + +Return value: array + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getTraits(): array; +``` + +
    Get a list of trait entities of the current class
    + +Parameters: not specified + +Return value: array + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getTraitsNames(): array; +``` + +
    Get a list of class traits names
    + +Parameters: not specified + +Return value: array + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function hasConstant(string $constantName, bool $unsafe = false): bool; +``` + +
    Check if a constant exists in a class
    + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $constantNamestringThe name of the class whose entity you want to check
    $unsafeboolCheck all constants, not just the constants allowed in the configuration (@see PhpHandlerSettings::getClassConstantEntityFilter())
    + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function hasDescriptionLinks(): bool; +``` + +
    Checking if an entity has links in its description
    + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function hasExamples(): bool; +``` + +
    Checking if an entity has `example` docBlock
    + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function hasMethod(string $methodName, bool $unsafe = false): bool; +``` + +
    Check if a method exists in a class
    + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $methodNamestringThe name of the method whose entity you want to check
    $unsafeboolCheck all methods, not just the methods allowed in the configuration (@see PhpHandlerSettings::getMethodEntityFilter())
    + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function hasParentClass(string $parentClassName): bool; +``` + +
    Check if a certain parent class exists in a chain of parent classes
    + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $parentClassNamestringSearched parent class
    + +Return value: bool + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function hasProperty(string $propertyName, bool $unsafe = false): bool; +``` + +
    Check if a property exists in a class
    + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $propertyNamestringThe name of the property whose entity you want to check
    $unsafeboolCheck all properties, not just the properties allowed in the configuration (@see PhpHandlerSettings::getPropertyEntityFilter())
    + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function hasThrows(): bool; +``` + +
    Checking if an entity has `throws` docBlock
    + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function hasTraits(): bool; +``` + +
    Check if the class contains traits
    + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function implementsInterface(string $interfaceName): bool; +``` + +
    Check if a class implements an interface
    + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $interfaceNamestringName of the required interface in the interface chain
    + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function isAbstract(): bool; +``` + +
    Check that an entity is abstract
    + +Parameters: not specified + +Return value: bool + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function isApi(): bool; +``` + +
    Checking if an entity has `api` docBlock
    + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function isClass(): bool; +``` + +
    Check if an entity is a Class
    + +Parameters: not specified + +Return value: bool + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function isClassLoad(): bool; +``` + + + +Parameters: not specified + +Return value: bool + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function isDeprecated(): bool; +``` + +
    Checking if an entity has `deprecated` docBlock
    + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + +
      +
    • # + isDocumentCreationAllowed + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function isDocumentCreationAllowed(): bool; +``` + + + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + +
      +
    • # + isEntityCacheOutdated + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function isEntityCacheOutdated(): bool; +``` + +
    Checking if the entity cache is out of date
    + +Parameters: not specified + +Return value: bool + + +
    +
    +
    + +
      +
    • # + isEntityDataCacheOutdated + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait + +public function isEntityDataCacheOutdated(): bool; +``` + + + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function isEntityDataCanBeLoaded(): bool; +``` + + + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function isEntityFileCanBeLoad(): bool; +``` + +
    Checking if entity data can be retrieved
    + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public static function isEntityNameValid(string $entityName): bool; +``` + +
    Check if the name is a valid name for ClassLikeEntity
    + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $entityNamestring-
    + +Return value: bool + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function isEnum(): bool; +``` + +
    Check if an entity is an Enum
    + +Parameters: not specified + +Return value: bool + + +
    +
    +
    + +
      +
    • # + isExternalLibraryEntity + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function isExternalLibraryEntity(): bool; +``` + +
    Check if a given entity is an entity from a third party library (connected via composer)
    + +Parameters: not specified + +Return value: bool + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function isInGit(): bool; +``` + +
    Checking if class file is in git repository
    + +Parameters: not specified + +Return value: bool + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function isInstantiable(): bool; +``` + +
    Check that an entity is instantiable
    + +Parameters: not specified + +Return value: bool + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function isInterface(): bool; +``` + +
    Check if an entity is an Interface
    + +Parameters: not specified + +Return value: bool + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function isInternal(): bool; +``` + +
    Checking if an entity has `internal` docBlock
    + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +public function isSubclassOf(string $className): bool; +``` + +
    Whether the given class is a subclass of the specified class
    + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $classNamestring-
    + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +public function isTrait(): bool; +``` + +
    Check if an entity is a Trait
    + +Parameters: not specified + +Return value: bool + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public static function normalizeClassName(string $name): string; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $namestring-
    + +Return value: string + + +
    +
    +
    + +
      +
    • # + reloadEntityDependenciesCache + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function reloadEntityDependenciesCache(): array; +``` + +
    Update entity dependency cache
    + +Parameters: not specified + +Return value: array + + +
    +
    +
    + +
      +
    • # + removeEntityValueFromCache + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait + +public function removeEntityValueFromCache(string $key): void; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $keystring-
    + +Return value: void + + +
    +
    +
    + +
      +
    • # + removeNotUsedEntityDataCache + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait + +public function removeNotUsedEntityDataCache(): void; +``` + + + +Parameters: not specified + +Return value: void + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function setCustomAst(\PhpParser\Node\Stmt\Trait_|\PhpParser\Node\Stmt\Enum_|\PhpParser\Node\Stmt\Interface_|\PhpParser\Node\Stmt\Class_|null $customAst): void; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $customAst\PhpParser\Node\Stmt\Trait_ | \PhpParser\Node\Stmt\Enum_ | \PhpParser\Node\Stmt\Interface_ | \PhpParser\Node\Stmt\Class_ | null-
    + +Return value: void + + +
    +
    + + \ No newline at end of file diff --git a/docs/tech/2.parser/reflectionApi/php/phpClassConstantReflectionApi.md b/docs/tech/2.parser/reflectionApi/php/phpClassConstantReflectionApi.md new file mode 100644 index 00000000..d5874365 --- /dev/null +++ b/docs/tech/2.parser/reflectionApi/php/phpClassConstantReflectionApi.md @@ -0,0 +1,50 @@ + BumbleDocGen / Technical description of the project / Parser / Reflection API / Reflection API for PHP / PHP class constant reflection API
    + +

    PHP class constant reflection API

    + +Class constant reflection entity class: ClassConstantEntity. + +**Example of creating class constant reflection:** + +```php +$entitiesCollection = (new \BumbleDocGen\DocGeneratorFactory())->getRootEntityReflections($reflectionApiConfig); + +$classReflection = $entitiesCollection->getLoadedOrCreateNew('SomeClassName'); + +$constantReflection = $classReflection->getConstant('constantName'); +``` + +**Class constant reflection API methods:** + +- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassConstantEntity.md#mgetabsolutefilename) `getAbsoluteFileName()`: Returns the absolute path to a file if it can be retrieved and if the file is in the project directory +- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassConstantEntity.md#mgetast) `getAst()`: Get AST for this entity +- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassConstantEntity.md#mgetdescription) `getDescription()`: Get entity description +- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassConstantEntity.md#mgetdescriptionlinks) `getDescriptionLinks()`: Get parsed links from description and doc blocks `see` and `link` +- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassConstantEntity.md#mgetdoccomment) `getDocComment()`: Get the doc comment of an entity +- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassConstantEntity.md#mgetdoccommentline) `getDocCommentLine()`: Get the code line number where the docBlock of the current entity begins +- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassConstantEntity.md#mgetdocnote) `getDocNote()`: Get the note annotation value +- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassConstantEntity.md#mgetendline) `getEndLine()`: Get the line number of the end of a constant's code in a file +- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassConstantEntity.md#mgetexamples) `getExamples()`: Get parsed examples from `examples` doc block +- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassConstantEntity.md#mgetfirstexample) `getFirstExample()`: Get first example from `examples` doc block +- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassConstantEntity.md#mgetimplementingclass) `getImplementingClass()`: Get the class like entity in which the current entity was implemented +- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassConstantEntity.md#mgetnamespacename) `getNamespaceName()`: Get the name of the namespace where the current class is implemented +- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassConstantEntity.md#mgetobjectid) `getObjectId()`: Get entity unique ID +- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassConstantEntity.md#mgetrelativefilename) `getRelativeFileName()`: File name relative to project_root configuration parameter +- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassConstantEntity.md#mgetrootentitycollection) `getRootEntityCollection()`: Get the collection of root entities to which this entity belongs +- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassConstantEntity.md#mgetstartline) `getStartLine()`: Get the line number of the beginning of the constant code in a file +- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassConstantEntity.md#mgetthrows) `getThrows()`: Get parsed throws from `throws` doc block +- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassConstantEntity.md#mgetvalue) `getValue()`: Get the compiled value of a constant +- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassConstantEntity.md#mhasdescriptionlinks) `hasDescriptionLinks()`: Checking if an entity has links in its description +- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassConstantEntity.md#mhasexamples) `hasExamples()`: Checking if an entity has `example` docBlock +- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassConstantEntity.md#mhasthrows) `hasThrows()`: Checking if an entity has `throws` docBlock +- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassConstantEntity.md#misapi) `isApi()`: Checking if an entity has `api` docBlock +- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassConstantEntity.md#misdeprecated) `isDeprecated()`: Checking if an entity has `deprecated` docBlock +- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassConstantEntity.md#misentityfilecanbeload) `isEntityFileCanBeLoad()`: Checking if entity data can be retrieved +- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassConstantEntity.md#misinternal) `isInternal()`: Checking if an entity has `internal` docBlock +- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassConstantEntity.md#misprivate) `isPrivate()`: Check if a constant is a private constant +- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassConstantEntity.md#misprotected) `isProtected()`: Check if a constant is a protected constant +- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassConstantEntity.md#mispublic) `isPublic()`: Check if a constant is a public constant + +
    +
    +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Fri Dec 15 21:27:10 2023 +0300
    Page content update date: Fri Dec 15 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file diff --git a/docs/tech/2.parser/reflectionApi/php/phpClassMethodReflectionApi.md b/docs/tech/2.parser/reflectionApi/php/phpClassMethodReflectionApi.md new file mode 100644 index 00000000..c6b60dcb --- /dev/null +++ b/docs/tech/2.parser/reflectionApi/php/phpClassMethodReflectionApi.md @@ -0,0 +1,65 @@ + BumbleDocGen / Technical description of the project / Parser / Reflection API / Reflection API for PHP / PHP class method reflection API
    + +

    PHP class method reflection API

    + +Method reflection entity class: MethodEntity. + +**Example of creating class method reflection:** + +```php +$entitiesCollection = (new \BumbleDocGen\DocGeneratorFactory())->getRootEntityReflections($reflectionApiConfig); + +$classReflection = $entitiesCollection->getLoadedOrCreateNew('SomeClassName'); + +$methodReflection = $classReflection->getMethod('methodName'); +``` + +**Class method reflection API methods:** + +- [#](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#mgetabsolutefilename) `getAbsoluteFileName()`: Returns the absolute path to a file if it can be retrieved and if the file is in the project directory +- [#](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#mgetast) `getAst()`: Get AST for this entity +- [#](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#mgetbodycode) `getBodyCode()`: Get the code for this method +- [#](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#mgetdescription) `getDescription()`: Get entity description +- [#](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#mgetdescriptionlinks) `getDescriptionLinks()`: Get parsed links from description and doc blocks `see` and `link` +- [#](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#mgetdoccomment) `getDocComment()`: Get the doc comment of an entity +- [#](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#mgetdocnote) `getDocNote()`: Get the note annotation value +- [#](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#mgetendline) `getEndLine()`: Get the line number of the end of a method's code in a file +- [#](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#mgetexamples) `getExamples()`: Get parsed examples from `examples` doc block +- [#](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#mgetfirstexample) `getFirstExample()`: Get first example from `examples` doc block +- [#](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#mgetfirstreturnvalue) `getFirstReturnValue()`: Get the compiled first return value of a method (if possible) +- [#](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#mgetimplementingclass) `getImplementingClass()`: Get the class like entity in which the current entity was implemented +- [#](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#mgetimplementingclassname) `getImplementingClassName()`: Get the name of the class in which this method is implemented +- [#](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#mgetmodifiersstring) `getModifiersString()`: Get a text representation of method modifiers +- [#](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#mgetname) `getName()`: Full name of the entity +- [#](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#mgetnamespacename) `getNamespaceName()`: Namespace of the class that contains this method +- [#](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#mgetobjectid) `getObjectId()`: Get entity unique ID +- [#](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#mgetparameters) `getParameters()`: Get a list of method parameters +- [#](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#mgetparametersstring) `getParametersString()`: Get a list of method parameters as a string +- [#](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#mgetparentmethod) `getParentMethod()`: Get the parent method for this method +- [#](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#mgetrelativefilename) `getRelativeFileName()`: File name relative to project_root configuration parameter +- [#](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#mgetreturntype) `getReturnType()`: Get the return type of method +- [#](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#mgetrootentitycollection) `getRootEntityCollection()`: Get the collection of root entities to which this entity belongs +- [#](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#mgetshortname) `getShortName()`: Short name of the entity +- [#](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#mgetsignature) `getSignature()`: Get the method signature as a string +- [#](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#mgetstartcolumn) `getStartColumn()`: Get the column number of the beginning of the method code in a file +- [#](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#mgetstartline) `getStartLine()`: Get the line number of the beginning of the entity code in a file +- [#](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#mgetthrows) `getThrows()`: Get parsed throws from `throws` doc block +- [#](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#mhasdescriptionlinks) `hasDescriptionLinks()`: Checking if an entity has links in its description +- [#](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#mhasexamples) `hasExamples()`: Checking if an entity has `example` docBlock +- [#](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#mhasthrows) `hasThrows()`: Checking if an entity has `throws` docBlock +- [#](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#misapi) `isApi()`: Checking if an entity has `api` docBlock +- [#](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#misconstructor) `isConstructor()`: Checking that a method is a constructor +- [#](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#misdeprecated) `isDeprecated()`: Checking if an entity has `deprecated` docBlock +- [#](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#misdynamic) `isDynamic()`: Check if a method is a dynamic method, that is, implementable using __call or __callStatic +- [#](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#misentityfilecanbeload) `isEntityFileCanBeLoad()`: Checking if entity data can be retrieved +- [#](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#misimplementedinparentclass) `isImplementedInParentClass()`: Check if this method is implemented in the parent class +- [#](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#misinitialization) `isInitialization()`: Check if a method is an initialization method +- [#](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#misinternal) `isInternal()`: Checking if an entity has `internal` docBlock +- [#](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#misprivate) `isPrivate()`: Check if a method is a private method +- [#](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#misprotected) `isProtected()`: Check if a method is a protected method +- [#](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#mispublic) `isPublic()`: Check if a method is a public method +- [#](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#misstatic) `isStatic()`: Check if this method is static + +
    +
    +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Fri Dec 15 21:27:10 2023 +0300
    Page content update date: Fri Dec 15 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file diff --git a/docs/tech/2.parser/reflectionApi/php/phpClassPropertyReflectionApi.md b/docs/tech/2.parser/reflectionApi/php/phpClassPropertyReflectionApi.md new file mode 100644 index 00000000..8eaff833 --- /dev/null +++ b/docs/tech/2.parser/reflectionApi/php/phpClassPropertyReflectionApi.md @@ -0,0 +1,56 @@ + BumbleDocGen / Technical description of the project / Parser / Reflection API / Reflection API for PHP / PHP class property reflection API
    + +

    PHP class property reflection API

    + +Property reflection entity class: PropertyEntity. + +**Example of creating class property reflection:** + +```php +$entitiesCollection = (new \BumbleDocGen\DocGeneratorFactory())->getRootEntityReflections($reflectionApiConfig); + +$classReflection = $entitiesCollection->getLoadedOrCreateNew('SomeClassName'); + +$propertyReflection = $classReflection->getProperty('propertyName'); +``` + +**Class property reflection API methods:** + +- [#](/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md#mgetabsolutefilename) `getAbsoluteFileName()`: Returns the absolute path to a file if it can be retrieved and if the file is in the project directory +- [#](/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md#mgetast) `getAst()`: Get AST for this entity +- [#](/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md#mgetdefaultvalue) `getDefaultValue()`: Get the compiled default value of a property +- [#](/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md#mgetdescription) `getDescription()`: Get entity description +- [#](/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md#mgetdescriptionlinks) `getDescriptionLinks()`: Get parsed links from description and doc blocks `see` and `link` +- [#](/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md#mgetdoccomment) `getDocComment()`: Get the doc comment of an entity +- [#](/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md#mgetdoccommentline) `getDocCommentLine()`: Get the code line number where the docBlock of the current entity begins +- [#](/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md#mgetdocnote) `getDocNote()`: Get the note annotation value +- [#](/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md#mgetendline) `getEndLine()`: Get the line number of the end of a property's code in a file +- [#](/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md#mgetexamples) `getExamples()`: Get parsed examples from `examples` doc block +- [#](/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md#mgetfirstexample) `getFirstExample()`: Get first example from `examples` doc block +- [#](/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md#mgetimplementingclass) `getImplementingClass()`: Get the class like entity in which the current entity was implemented +- [#](/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md#mgetimplementingclassname) `getImplementingClassName()`: Get the name of the class in which this property is implemented +- [#](/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md#mgetmodifiersstring) `getModifiersString()`: Get a text representation of property modifiers +- [#](/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md#mgetname) `getName()`: Full name of the entity +- [#](/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md#mgetnamespacename) `getNamespaceName()`: Namespace of the class that contains this property +- [#](/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md#mgetobjectid) `getObjectId()`: Get entity unique ID +- [#](/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md#mgetrelativefilename) `getRelativeFileName()`: File name relative to project_root configuration parameter +- [#](/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md#mgetrootentitycollection) `getRootEntityCollection()`: Get the collection of root entities to which this entity belongs +- [#](/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md#mgetshortname) `getShortName()`: Short name of the entity +- [#](/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md#mgetstartline) `getStartLine()`: Get the line number of the beginning of the entity code in a file +- [#](/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md#mgetthrows) `getThrows()`: Get parsed throws from `throws` doc block +- [#](/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md#mgettype) `getType()`: Get current property type +- [#](/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md#mhasdescriptionlinks) `hasDescriptionLinks()`: Checking if an entity has links in its description +- [#](/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md#mhasexamples) `hasExamples()`: Checking if an entity has `example` docBlock +- [#](/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md#mhasthrows) `hasThrows()`: Checking if an entity has `throws` docBlock +- [#](/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md#misapi) `isApi()`: Checking if an entity has `api` docBlock +- [#](/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md#misdeprecated) `isDeprecated()`: Checking if an entity has `deprecated` docBlock +- [#](/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md#misentityfilecanbeload) `isEntityFileCanBeLoad()`: Checking if entity data can be retrieved +- [#](/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md#misimplementedinparentclass) `isImplementedInParentClass()`: Check if this property is implemented in the parent class +- [#](/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md#misinternal) `isInternal()`: Checking if an entity has `internal` docBlock +- [#](/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md#misprivate) `isPrivate()`: Check if a private is a public private +- [#](/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md#misprotected) `isProtected()`: Check if a protected is a public protected +- [#](/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md#mispublic) `isPublic()`: Check if a property is a public property + +
    +
    +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Fri Dec 15 21:27:10 2023 +0300
    Page content update date: Fri Dec 15 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file diff --git a/docs/tech/2.parser/reflectionApi/php/phpClassReflectionApi.md b/docs/tech/2.parser/reflectionApi/php/phpClassReflectionApi.md new file mode 100644 index 00000000..7673934e --- /dev/null +++ b/docs/tech/2.parser/reflectionApi/php/phpClassReflectionApi.md @@ -0,0 +1,89 @@ + BumbleDocGen / Technical description of the project / Parser / Reflection API / Reflection API for PHP / PHP class reflection API
    + +

    PHP class reflection API

    + +PHP class reflection ClassEntity inherits from ClassLikeEntity. + +**Source class formats:** + +1) `class ` +2) `abstract class ` +3) `final class ` + +**Example of creating class reflection:** + +```php +$entitiesCollection = (new \BumbleDocGen\DocGeneratorFactory())->getRootEntityReflections($reflectionApiConfig); + +$classReflection = $entitiesCollection->getLoadedOrCreateNew('SomeClassName'); // or get() +``` + +**Class reflection API methods:** + +- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetabsolutefilename) `getAbsoluteFileName()`: Returns the absolute path to a file if it can be retrieved and if the file is in the project directory +- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetast) `getAst()`: Get AST for this entity +- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetconstant) `getConstant()`: Get the method entity by its name +- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetconstantentitiescollection) `getConstantEntitiesCollection()`: Get a collection of constant entities +- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetconstantvalue) `getConstantValue()`: Get the compiled value of a constant +- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetconstants) `getConstants()`: Get all constants that are available according to the configuration as an array +- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetconstantsvalues) `getConstantsValues()`: Get class constant compiled values according to filters +- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetdescription) `getDescription()`: Get entity description +- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetdescriptionlinks) `getDescriptionLinks()`: Get parsed links from description and doc blocks `see` and `link` +- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetdoccomment) `getDocComment()`: Get the doc comment of an entity +- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetdoccommentline) `getDocCommentLine()`: Get the code line number where the docBlock of the current entity begins +- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetdocnote) `getDocNote()`: Get the note annotation value +- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetendline) `getEndLine()`: Get the line number of the end of a class code in a file +- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetexamples) `getExamples()`: Get parsed examples from `examples` doc block +- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetfirstexample) `getFirstExample()`: Get first example from `examples` doc block +- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetimplementingclass) `getImplementingClass()`: Get the class like entity in which the current entity was implemented +- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetinterfacenames) `getInterfaceNames()`: Get a list of class interface names +- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetinterfacesentities) `getInterfacesEntities()`: Get a list of interface entities that the current class implements +- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetmethod) `getMethod()`: Get the method entity by its name +- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetmethodentitiescollection) `getMethodEntitiesCollection()`: Get a collection of method entities +- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetmethods) `getMethods()`: Get all methods that are available according to the configuration as an array +- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetname) `getName()`: Full name of the entity +- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetnamespacename) `getNamespaceName()`: Get the entity namespace name +- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetobjectid) `getObjectId()`: Get entity unique ID +- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetparentclass) `getParentClass()`: Get the entity of the parent class if it exists +- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetparentclassentities) `getParentClassEntities()`: Get a list of parent class entities +- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetparentclassname) `getParentClassName()`: Get the name of the parent class entity if it exists +- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetparentclassnames) `getParentClassNames()`: Get a list of entity names of parent classes +- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetplugindata) `getPluginData()`: Get additional information added using the plugin +- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetproperties) `getProperties()`: Get all properties that are available according to the configuration as an array +- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetproperty) `getProperty()`: Get the property entity by its name +- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetpropertydefaultvalue) `getPropertyDefaultValue()`: Get the compiled value of a property +- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetpropertyentitiescollection) `getPropertyEntitiesCollection()`: Get a collection of property entities +- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetrelativefilename) `getRelativeFileName()`: File name relative to project_root configuration parameter +- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetrootentitycollection) `getRootEntityCollection()`: Get the collection of root entities to which this entity belongs +- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetshortname) `getShortName()`: Short name of the entity +- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetstartline) `getStartLine()`: Get the line number of the start of a class code in a file +- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetthrows) `getThrows()`: Get parsed throws from `throws` doc block +- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgettraits) `getTraits()`: Get a list of trait entities of the current class +- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgettraitsnames) `getTraitsNames()`: Get a list of class traits names +- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mhasconstant) `hasConstant()`: Check if a constant exists in a class +- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mhasdescriptionlinks) `hasDescriptionLinks()`: Checking if an entity has links in its description +- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mhasexamples) `hasExamples()`: Checking if an entity has `example` docBlock +- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mhasmethod) `hasMethod()`: Check if a method exists in a class +- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mhasparentclass) `hasParentClass()`: Check if a certain parent class exists in a chain of parent classes +- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mhasproperty) `hasProperty()`: Check if a property exists in a class +- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mhasthrows) `hasThrows()`: Checking if an entity has `throws` docBlock +- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mhastraits) `hasTraits()`: Check if the class contains traits +- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mimplementsinterface) `implementsInterface()`: Check if a class implements an interface +- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#misabstract) `isAbstract()`: Check that an entity is abstract +- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#misapi) `isApi()`: Checking if an entity has `api` docBlock +- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#misattribute) `isAttribute()`: Check if a class is an attribute +- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#misclass) `isClass()`: Check if an entity is a Class +- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#misdeprecated) `isDeprecated()`: Checking if an entity has `deprecated` docBlock +- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#misentityfilecanbeload) `isEntityFileCanBeLoad()`: Checking if entity data can be retrieved +- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#misenum) `isEnum()`: Check if an entity is an Enum +- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#misinstantiable) `isInstantiable()`: Check that an entity is instantiable +- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#misinterface) `isInterface()`: Check if an entity is an Interface +- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#misinternal) `isInternal()`: Checking if an entity has `internal` docBlock +- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#missubclassof) `isSubclassOf()`: Whether the given class is a subclass of the specified class +- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mistrait) `isTrait()`: Check if an entity is a Trait +- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mnormalizeclassname) `normalizeClassName()` + + +
    +
    +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Fri Dec 15 21:27:10 2023 +0300
    Page content update date: Fri Dec 15 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file diff --git a/docs/tech/2.parser/reflectionApi/php/phpEnumReflectionApi.md b/docs/tech/2.parser/reflectionApi/php/phpEnumReflectionApi.md new file mode 100644 index 00000000..d74f54fc --- /dev/null +++ b/docs/tech/2.parser/reflectionApi/php/phpEnumReflectionApi.md @@ -0,0 +1,85 @@ + BumbleDocGen / Technical description of the project / Parser / Reflection API / Reflection API for PHP / PHP enum reflection API
    + +

    PHP enum reflection API

    + +PHP enum reflection EnumEntity inherits from ClassLikeEntity. + +**Source enum formats:** + +1) `enum ` + +**Example of creating enum reflection:** + +```php +$entitiesCollection = (new \BumbleDocGen\DocGeneratorFactory())->getRootEntityReflections($reflectionApiConfig); + +$enumReflection = $entitiesCollection->getLoadedOrCreateNew('SomeEnumName'); // or get() +``` + +**Enum reflection API methods:** + +- [#](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetabsolutefilename) `getAbsoluteFileName()`: Returns the absolute path to a file if it can be retrieved and if the file is in the project directory +- [#](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetast) `getAst()`: Get AST for this entity +- [#](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetconstant) `getConstant()`: Get the method entity by its name +- [#](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetconstantentitiescollection) `getConstantEntitiesCollection()`: Get a collection of constant entities +- [#](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetconstantvalue) `getConstantValue()`: Get the compiled value of a constant +- [#](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetconstants) `getConstants()`: Get all constants that are available according to the configuration as an array +- [#](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetconstantsvalues) `getConstantsValues()`: Get class constant compiled values according to filters +- [#](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetdescription) `getDescription()`: Get entity description +- [#](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetdescriptionlinks) `getDescriptionLinks()`: Get parsed links from description and doc blocks `see` and `link` +- [#](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetdoccomment) `getDocComment()`: Get the doc comment of an entity +- [#](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetdoccommentline) `getDocCommentLine()`: Get the code line number where the docBlock of the current entity begins +- [#](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetdocnote) `getDocNote()`: Get the note annotation value +- [#](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetendline) `getEndLine()`: Get the line number of the end of a class code in a file +- [#](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetexamples) `getExamples()`: Get parsed examples from `examples` doc block +- [#](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetfirstexample) `getFirstExample()`: Get first example from `examples` doc block +- [#](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetimplementingclass) `getImplementingClass()`: Get the class like entity in which the current entity was implemented +- [#](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetinterfacenames) `getInterfaceNames()`: Get a list of class interface names +- [#](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetinterfacesentities) `getInterfacesEntities()`: Get a list of interface entities that the current class implements +- [#](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetmethod) `getMethod()`: Get the method entity by its name +- [#](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetmethodentitiescollection) `getMethodEntitiesCollection()`: Get a collection of method entities +- [#](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetmethods) `getMethods()`: Get all methods that are available according to the configuration as an array +- [#](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetname) `getName()`: Full name of the entity +- [#](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetnamespacename) `getNamespaceName()`: Get the entity namespace name +- [#](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetobjectid) `getObjectId()`: Get entity unique ID +- [#](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetparentclass) `getParentClass()`: Get the entity of the parent class if it exists +- [#](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetparentclassentities) `getParentClassEntities()`: Get a list of parent class entities +- [#](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetparentclassname) `getParentClassName()`: Get the name of the parent class entity if it exists +- [#](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetparentclassnames) `getParentClassNames()`: Get a list of entity names of parent classes +- [#](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetplugindata) `getPluginData()`: Get additional information added using the plugin +- [#](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetproperties) `getProperties()`: Get all properties that are available according to the configuration as an array +- [#](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetproperty) `getProperty()`: Get the property entity by its name +- [#](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetpropertydefaultvalue) `getPropertyDefaultValue()`: Get the compiled value of a property +- [#](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetpropertyentitiescollection) `getPropertyEntitiesCollection()`: Get a collection of property entities +- [#](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetrelativefilename) `getRelativeFileName()`: File name relative to project_root configuration parameter +- [#](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetrootentitycollection) `getRootEntityCollection()`: Get the collection of root entities to which this entity belongs +- [#](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetshortname) `getShortName()`: Short name of the entity +- [#](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetstartline) `getStartLine()`: Get the line number of the start of a class code in a file +- [#](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetthrows) `getThrows()`: Get parsed throws from `throws` doc block +- [#](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgettraits) `getTraits()`: Get a list of trait entities of the current class +- [#](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgettraitsnames) `getTraitsNames()`: Get a list of class traits names +- [#](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mhasconstant) `hasConstant()`: Check if a constant exists in a class +- [#](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mhasdescriptionlinks) `hasDescriptionLinks()`: Checking if an entity has links in its description +- [#](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mhasexamples) `hasExamples()`: Checking if an entity has `example` docBlock +- [#](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mhasmethod) `hasMethod()`: Check if a method exists in a class +- [#](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mhasparentclass) `hasParentClass()`: Check if a certain parent class exists in a chain of parent classes +- [#](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mhasproperty) `hasProperty()`: Check if a property exists in a class +- [#](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mhasthrows) `hasThrows()`: Checking if an entity has `throws` docBlock +- [#](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mhastraits) `hasTraits()`: Check if the class contains traits +- [#](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mimplementsinterface) `implementsInterface()`: Check if a class implements an interface +- [#](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#misabstract) `isAbstract()`: Check that an entity is abstract +- [#](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#misapi) `isApi()`: Checking if an entity has `api` docBlock +- [#](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#misclass) `isClass()`: Check if an entity is a Class +- [#](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#misdeprecated) `isDeprecated()`: Checking if an entity has `deprecated` docBlock +- [#](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#misentityfilecanbeload) `isEntityFileCanBeLoad()`: Checking if entity data can be retrieved +- [#](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#misenum) `isEnum()`: Check if an entity is an Enum +- [#](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#misinstantiable) `isInstantiable()`: Check that an entity is instantiable +- [#](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#misinterface) `isInterface()`: Check if an entity is an Interface +- [#](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#misinternal) `isInternal()`: Checking if an entity has `internal` docBlock +- [#](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#missubclassof) `isSubclassOf()`: Whether the given class is a subclass of the specified class +- [#](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mistrait) `isTrait()`: Check if an entity is a Trait +- [#](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mnormalizeclassname) `normalizeClassName()` + +
    +
    +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Fri Dec 15 21:27:10 2023 +0300
    Page content update date: Fri Dec 15 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file diff --git a/docs/tech/2.parser/reflectionApi/php/phpInterfaceReflectionApi.md b/docs/tech/2.parser/reflectionApi/php/phpInterfaceReflectionApi.md new file mode 100644 index 00000000..1e5ff483 --- /dev/null +++ b/docs/tech/2.parser/reflectionApi/php/phpInterfaceReflectionApi.md @@ -0,0 +1,85 @@ + BumbleDocGen / Technical description of the project / Parser / Reflection API / Reflection API for PHP / PHP interface reflection API
    + +

    PHP interface reflection API

    + +PHP interface reflection InterfaceEntity inherits from ClassLikeEntity. + +**Source interface formats:** + +1) `interface ` + +**Example of creating interface reflection:** + +```php +$entitiesCollection = (new \BumbleDocGen\DocGeneratorFactory())->getRootEntityReflections($reflectionApiConfig); + +$interfaceReflection = $entitiesCollection->getLoadedOrCreateNew('SomeInterfaceName'); // or get() +``` + +**Interface reflection API methods:** + +- [#](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetabsolutefilename) `getAbsoluteFileName()`: Returns the absolute path to a file if it can be retrieved and if the file is in the project directory +- [#](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetast) `getAst()`: Get AST for this entity +- [#](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetconstant) `getConstant()`: Get the method entity by its name +- [#](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetconstantentitiescollection) `getConstantEntitiesCollection()`: Get a collection of constant entities +- [#](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetconstantvalue) `getConstantValue()`: Get the compiled value of a constant +- [#](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetconstants) `getConstants()`: Get all constants that are available according to the configuration as an array +- [#](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetconstantsvalues) `getConstantsValues()`: Get class constant compiled values according to filters +- [#](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetdescription) `getDescription()`: Get entity description +- [#](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetdescriptionlinks) `getDescriptionLinks()`: Get parsed links from description and doc blocks `see` and `link` +- [#](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetdoccomment) `getDocComment()`: Get the doc comment of an entity +- [#](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetdoccommentline) `getDocCommentLine()`: Get the code line number where the docBlock of the current entity begins +- [#](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetdocnote) `getDocNote()`: Get the note annotation value +- [#](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetendline) `getEndLine()`: Get the line number of the end of a class code in a file +- [#](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetexamples) `getExamples()`: Get parsed examples from `examples` doc block +- [#](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetfirstexample) `getFirstExample()`: Get first example from `examples` doc block +- [#](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetimplementingclass) `getImplementingClass()`: Get the class like entity in which the current entity was implemented +- [#](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetinterfacenames) `getInterfaceNames()`: Get a list of class interface names +- [#](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetinterfacesentities) `getInterfacesEntities()`: Get a list of interface entities that the current class implements +- [#](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetmethod) `getMethod()`: Get the method entity by its name +- [#](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetmethodentitiescollection) `getMethodEntitiesCollection()`: Get a collection of method entities +- [#](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetmethods) `getMethods()`: Get all methods that are available according to the configuration as an array +- [#](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetname) `getName()`: Full name of the entity +- [#](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetnamespacename) `getNamespaceName()`: Get the entity namespace name +- [#](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetobjectid) `getObjectId()`: Get entity unique ID +- [#](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetparentclass) `getParentClass()`: Get the entity of the parent class if it exists +- [#](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetparentclassentities) `getParentClassEntities()`: Get a list of parent class entities +- [#](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetparentclassname) `getParentClassName()`: Get the name of the parent class entity if it exists +- [#](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetparentclassnames) `getParentClassNames()`: Get a list of entity names of parent classes +- [#](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetplugindata) `getPluginData()`: Get additional information added using the plugin +- [#](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetproperties) `getProperties()`: Get all properties that are available according to the configuration as an array +- [#](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetproperty) `getProperty()`: Get the property entity by its name +- [#](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetpropertydefaultvalue) `getPropertyDefaultValue()`: Get the compiled value of a property +- [#](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetpropertyentitiescollection) `getPropertyEntitiesCollection()`: Get a collection of property entities +- [#](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetrelativefilename) `getRelativeFileName()`: File name relative to project_root configuration parameter +- [#](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetrootentitycollection) `getRootEntityCollection()`: Get the collection of root entities to which this entity belongs +- [#](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetshortname) `getShortName()`: Short name of the entity +- [#](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetstartline) `getStartLine()`: Get the line number of the start of a class code in a file +- [#](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetthrows) `getThrows()`: Get parsed throws from `throws` doc block +- [#](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgettraits) `getTraits()`: Get a list of trait entities of the current class +- [#](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgettraitsnames) `getTraitsNames()`: Get a list of class traits names +- [#](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mhasconstant) `hasConstant()`: Check if a constant exists in a class +- [#](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mhasdescriptionlinks) `hasDescriptionLinks()`: Checking if an entity has links in its description +- [#](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mhasexamples) `hasExamples()`: Checking if an entity has `example` docBlock +- [#](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mhasmethod) `hasMethod()`: Check if a method exists in a class +- [#](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mhasparentclass) `hasParentClass()`: Check if a certain parent class exists in a chain of parent classes +- [#](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mhasproperty) `hasProperty()`: Check if a property exists in a class +- [#](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mhasthrows) `hasThrows()`: Checking if an entity has `throws` docBlock +- [#](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mhastraits) `hasTraits()`: Check if the class contains traits +- [#](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mimplementsinterface) `implementsInterface()`: Check if a class implements an interface +- [#](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#misabstract) `isAbstract()`: Check that an entity is abstract +- [#](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#misapi) `isApi()`: Checking if an entity has `api` docBlock +- [#](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#misclass) `isClass()`: Check if an entity is a Class +- [#](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#misdeprecated) `isDeprecated()`: Checking if an entity has `deprecated` docBlock +- [#](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#misentityfilecanbeload) `isEntityFileCanBeLoad()`: Checking if entity data can be retrieved +- [#](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#misenum) `isEnum()`: Check if an entity is an Enum +- [#](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#misinstantiable) `isInstantiable()`: Check that an entity is instantiable +- [#](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#misinterface) `isInterface()`: Check if an entity is an Interface +- [#](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#misinternal) `isInternal()`: Checking if an entity has `internal` docBlock +- [#](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#missubclassof) `isSubclassOf()`: Whether the given class is a subclass of the specified class +- [#](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mistrait) `isTrait()`: Check if an entity is a Trait +- [#](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mnormalizeclassname) `normalizeClassName()` + +
    +
    +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Fri Dec 15 21:27:10 2023 +0300
    Page content update date: Fri Dec 15 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file diff --git a/docs/tech/2.parser/reflectionApi/php/phpTraitReflectionApi.md b/docs/tech/2.parser/reflectionApi/php/phpTraitReflectionApi.md new file mode 100644 index 00000000..c569cc7f --- /dev/null +++ b/docs/tech/2.parser/reflectionApi/php/phpTraitReflectionApi.md @@ -0,0 +1,85 @@ + BumbleDocGen / Technical description of the project / Parser / Reflection API / Reflection API for PHP / PHP trait reflection API
    + +

    PHP trait reflection API

    + +PHP trait reflection TraitEntity inherits from ClassLikeEntity. + +**Source trait formats:** + +1) `trait ` + +**Example of creating trait reflection:** + +```php +$entitiesCollection = (new \BumbleDocGen\DocGeneratorFactory())->getRootEntityReflections($reflectionApiConfig); + +$traitReflection = $entitiesCollection->getLoadedOrCreateNew('SomeTraitName'); // or get() +``` + +**Trait reflection API methods:** + +- [#](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetabsolutefilename) `getAbsoluteFileName()`: Returns the absolute path to a file if it can be retrieved and if the file is in the project directory +- [#](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetast) `getAst()`: Get AST for this entity +- [#](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetconstant) `getConstant()`: Get the method entity by its name +- [#](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetconstantentitiescollection) `getConstantEntitiesCollection()`: Get a collection of constant entities +- [#](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetconstantvalue) `getConstantValue()`: Get the compiled value of a constant +- [#](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetconstants) `getConstants()`: Get all constants that are available according to the configuration as an array +- [#](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetconstantsvalues) `getConstantsValues()`: Get class constant compiled values according to filters +- [#](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetdescription) `getDescription()`: Get entity description +- [#](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetdescriptionlinks) `getDescriptionLinks()`: Get parsed links from description and doc blocks `see` and `link` +- [#](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetdoccomment) `getDocComment()`: Get the doc comment of an entity +- [#](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetdoccommentline) `getDocCommentLine()`: Get the code line number where the docBlock of the current entity begins +- [#](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetdocnote) `getDocNote()`: Get the note annotation value +- [#](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetendline) `getEndLine()`: Get the line number of the end of a class code in a file +- [#](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetexamples) `getExamples()`: Get parsed examples from `examples` doc block +- [#](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetfirstexample) `getFirstExample()`: Get first example from `examples` doc block +- [#](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetimplementingclass) `getImplementingClass()`: Get the class like entity in which the current entity was implemented +- [#](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetinterfacenames) `getInterfaceNames()`: Get a list of class interface names +- [#](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetinterfacesentities) `getInterfacesEntities()`: Get a list of interface entities that the current class implements +- [#](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetmethod) `getMethod()`: Get the method entity by its name +- [#](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetmethodentitiescollection) `getMethodEntitiesCollection()`: Get a collection of method entities +- [#](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetmethods) `getMethods()`: Get all methods that are available according to the configuration as an array +- [#](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetname) `getName()`: Full name of the entity +- [#](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetnamespacename) `getNamespaceName()`: Get the entity namespace name +- [#](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetobjectid) `getObjectId()`: Get entity unique ID +- [#](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetparentclass) `getParentClass()`: Get the entity of the parent class if it exists +- [#](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetparentclassentities) `getParentClassEntities()`: Get a list of parent class entities +- [#](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetparentclassname) `getParentClassName()`: Get the name of the parent class entity if it exists +- [#](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetparentclassnames) `getParentClassNames()`: Get a list of entity names of parent classes +- [#](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetplugindata) `getPluginData()`: Get additional information added using the plugin +- [#](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetproperties) `getProperties()`: Get all properties that are available according to the configuration as an array +- [#](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetproperty) `getProperty()`: Get the property entity by its name +- [#](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetpropertydefaultvalue) `getPropertyDefaultValue()`: Get the compiled value of a property +- [#](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetpropertyentitiescollection) `getPropertyEntitiesCollection()`: Get a collection of property entities +- [#](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetrelativefilename) `getRelativeFileName()`: File name relative to project_root configuration parameter +- [#](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetrootentitycollection) `getRootEntityCollection()`: Get the collection of root entities to which this entity belongs +- [#](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetshortname) `getShortName()`: Short name of the entity +- [#](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetstartline) `getStartLine()`: Get the line number of the start of a class code in a file +- [#](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetthrows) `getThrows()`: Get parsed throws from `throws` doc block +- [#](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgettraits) `getTraits()`: Get a list of trait entities of the current class +- [#](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgettraitsnames) `getTraitsNames()`: Get a list of class traits names +- [#](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mhasconstant) `hasConstant()`: Check if a constant exists in a class +- [#](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mhasdescriptionlinks) `hasDescriptionLinks()`: Checking if an entity has links in its description +- [#](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mhasexamples) `hasExamples()`: Checking if an entity has `example` docBlock +- [#](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mhasmethod) `hasMethod()`: Check if a method exists in a class +- [#](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mhasparentclass) `hasParentClass()`: Check if a certain parent class exists in a chain of parent classes +- [#](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mhasproperty) `hasProperty()`: Check if a property exists in a class +- [#](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mhasthrows) `hasThrows()`: Checking if an entity has `throws` docBlock +- [#](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mhastraits) `hasTraits()`: Check if the class contains traits +- [#](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mimplementsinterface) `implementsInterface()`: Check if a class implements an interface +- [#](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#misabstract) `isAbstract()`: Check that an entity is abstract +- [#](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#misapi) `isApi()`: Checking if an entity has `api` docBlock +- [#](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#misclass) `isClass()`: Check if an entity is a Class +- [#](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#misdeprecated) `isDeprecated()`: Checking if an entity has `deprecated` docBlock +- [#](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#misentityfilecanbeload) `isEntityFileCanBeLoad()`: Checking if entity data can be retrieved +- [#](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#misenum) `isEnum()`: Check if an entity is an Enum +- [#](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#misinstantiable) `isInstantiable()`: Check that an entity is instantiable +- [#](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#misinterface) `isInterface()`: Check if an entity is an Interface +- [#](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#misinternal) `isInternal()`: Checking if an entity has `internal` docBlock +- [#](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#missubclassof) `isSubclassOf()`: Whether the given class is a subclass of the specified class +- [#](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mistrait) `isTrait()`: Check if an entity is a Trait +- [#](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mnormalizeclassname) `normalizeClassName()` + +
    +
    +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Fri Dec 15 21:27:10 2023 +0300
    Page content update date: Fri Dec 15 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file diff --git a/docs/tech/2.parser/reflectionApi/php/readme.md b/docs/tech/2.parser/reflectionApi/php/readme.md new file mode 100644 index 00000000..a77fbaa2 --- /dev/null +++ b/docs/tech/2.parser/reflectionApi/php/readme.md @@ -0,0 +1,58 @@ + BumbleDocGen / Technical description of the project / Parser / Reflection API / Reflection API for PHP
    + +

    Reflection API for PHP

    + +The tool we implemented partially replicates the [standard PHP reflection API](https://www.php.net/manual/en/book.reflection.php), but it has some additional capabilities. +In addition, our Reflection API is available for use in every documentation template, plugin, twig function, etc. at `BumbleDocGen`. + +

    Class like reflections

    + +Using our PHP reflection API you can get information about project entities. +Below is information about the available methods for working with each entity type: + +1) Class reflection +2) Trait reflection +3) Interface reflection +4) Enum reflection + +**Usage example:** + +```php +$entitiesCollection = (new \BumbleDocGen\DocGeneratorFactory())->getRootEntityReflections($reflectionApiConfig); + +$classReflection = $entitiesCollection->getLoadedOrCreateNew('SomeClassName'); // or get() + +$entityName = $classReflection->getName(); +$entityDescription = $classReflection->getDescription(); +$entityClassCodeStartLine = $classReflection->getStartLine(); +// ... etc. +``` + +

    Class like sub entities reflections

    + +PHP classes contain methods, properties and constants. Below is information about these child entities: + +1) Class method reflection +2) Class property reflection +3) Class constant reflection + +**Usage example:** + +```php +$entitiesCollection = (new \BumbleDocGen\DocGeneratorFactory())->getRootEntityReflections($reflectionApiConfig); + +$classReflection = $entitiesCollection->getLoadedOrCreateNew('SomeClassName'); + +$propertyReflection = $classReflection->getProperty('propertyName'); +$propertyName = $methodReflection->getName(); + +$methodReflection = $classReflection->getMethod('methodName'); +$methodName = $methodReflection->getName(); +$firstMethodReturnValue = $methodReflection->getFirstReturnValue(); + +// ... etc. +``` + +
    +
    +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Fri Dec 15 21:27:10 2023 +0300
    Page content update date: Fri Dec 15 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file diff --git a/docs/tech/2.parser/reflectionApi/readme.md b/docs/tech/2.parser/reflectionApi/readme.md new file mode 100644 index 00000000..0e6e0bab --- /dev/null +++ b/docs/tech/2.parser/reflectionApi/readme.md @@ -0,0 +1,61 @@ + BumbleDocGen / Technical description of the project / Parser / Reflection API
    + +

    Reflection API

    + +The documentation generator has a convenient Reflection API for analyzing the source code of the project being documented. +You can use the Reflection API both in documentation templates and simply in your code where necessary. + +**See:** +1) **Reflection API for PHP** +2) **[Demo](/demo/demo6-reflection-api/demoScript.php)** + +

    Example

    + +```php + // Create a Reflection API config object. This example shows the config for parsing PHP code + $reflectionApiConfig = PhpReflectionApiConfig::create(); + + /** @var PhpEntitiesCollection $entitiesCollection*/ + $entitiesCollection = (new BumbleDocGenDocGeneratorFactory())->getRootEntityReflections($reflectionApiConfig); + + // By default the collection is empty. You can populate the collection with data + $entitiesCollection->loadEntities( + $sourceLocators, // Source locators are needed so that we can determine all the files that will be traversed to fill the collection with data + $filter // We can define special filters according to which entities will be loaded + ); + + // And now you can use Reflection API + $filename = $entitiesCollection->get('SomeClassName')?->getAbsoluteFileName(); + +``` + + +

    Example 2 - Working with the Reflection API through a default parsing mechanism

    + +```php + // Create a documentation generator object + $docGen = (new BumbleDocGenDocGeneratorFactory())->create($configFile); + + // Next we get a group of entity collections (according to the configuration) + $entityCollectionsGroup = $docGen->parseAndGetRootEntityCollectionsGroup(); + + // Next, we can get a specific collection, for example for PHP entities + $entitiesCollection = $entityCollectionsGroup->get(PhpEntitiesCollection::class); + + // And now you can use Reflection API + $filename = $entitiesCollection->get('SomeClassName')?->getAbsoluteFileName(); + +``` + + +This method is used in the documentation generation process. +The only difference with the first example is that the first option is more convenient to use as a separate tool. + +The settings for which entities will be available to the reflector in this case are taken from the configuration file or configuration array, depending on the method of creating the documentation generator instance. + +In addition, RootEntityCollectionsGroup is always available through DI, for example when you implement some twig function or plugin. + + +
    +
    +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Fri Dec 15 21:22:59 2023 +0300
    Page content update date: Fri Dec 15 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file diff --git a/docs/tech/2.parser/sourceLocator.md b/docs/tech/2.parser/sourceLocator.md index 1119fc1c..b3e2d227 100644 --- a/docs/tech/2.parser/sourceLocator.md +++ b/docs/tech/2.parser/sourceLocator.md @@ -25,4 +25,4 @@ You can create your own source locators or use any existing ones. All source loc

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Tue Nov 14 00:49:39 2023 +0300
    Page content update date: Tue Nov 14 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Mon Nov 20 19:18:48 2023 +0300
    Page content update date: Fri Dec 15 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file diff --git a/docs/tech/3.renderer/01_templates.md b/docs/tech/3.renderer/01_templates.md index 6445dffc..8b8c75f9 100644 --- a/docs/tech/3.renderer/01_templates.md +++ b/docs/tech/3.renderer/01_templates.md @@ -31,7 +31,7 @@ After generating the documentation, this page will look exactly like a template. Dynamic block: - {{ printEntityCollectionAsList(phpClassEntityCollection.filterByInterfaces(['\\BumbleDocGen\\Core\\Parser\\SourceLocator\\SourceLocatorInterface']).getOnlyInstantiable()) }} + {{ printEntityCollectionAsList(phpEntities.filterByInterfaces(['\\BumbleDocGen\\Core\\Parser\\SourceLocator\\SourceLocatorInterface']).getOnlyInstantiable()) }} More static text... @@ -72,9 +72,9 @@ Output method description as a dynamic block: Dynamic block: - {{ phpClassEntityCollection + {{ phpEntities .get('\\BumbleDocGen\\LanguageHandler\\LanguageHandlerInterface') - .getMethodEntity('getLanguageKey') + .getMethod('getLanguageKey') .getDescription() }} @@ -101,4 +101,4 @@ Result after starting the documentation generation process:

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Fri Oct 13 18:40:45 2023 +0300
    Page content update date: Tue Nov 14 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Mon Nov 20 23:05:39 2023 +0300
    Page content update date: Fri Dec 15 2023
    Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/3.renderer/02_breadcrumbs.md b/docs/tech/3.renderer/02_breadcrumbs.md index 2160a142..58dfa71e 100644 --- a/docs/tech/3.renderer/02_breadcrumbs.md +++ b/docs/tech/3.renderer/02_breadcrumbs.md @@ -51,4 +51,4 @@ Here is an example of the result of the `generatePageBreadcrumbs` function:

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Oct 28 11:03:31 2023 +0300
    Page content update date: Tue Nov 14 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Oct 28 11:03:31 2023 +0300
    Page content update date: Fri Dec 15 2023
    Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/3.renderer/03_documentStructure.md b/docs/tech/3.renderer/03_documentStructure.md index b4761e7c..45466ad1 100644 --- a/docs/tech/3.renderer/03_documentStructure.md +++ b/docs/tech/3.renderer/03_documentStructure.md @@ -19,4 +19,4 @@ plugins:

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Fri Oct 13 18:40:45 2023 +0300
    Page content update date: Tue Nov 14 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Fri Oct 13 18:40:45 2023 +0300
    Page content update date: Fri Dec 15 2023
    Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/3.renderer/04_twigCustomFilters.md b/docs/tech/3.renderer/04_twigCustomFilters.md index 73e5db73..2eba8bb9 100644 --- a/docs/tech/3.renderer/04_twigCustomFilters.md +++ b/docs/tech/3.renderer/04_twigCustomFilters.md @@ -274,4 +274,4 @@ Here is a list of filters available by default:

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Tue Nov 14 00:49:39 2023 +0300
    Page content update date: Tue Nov 14 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Mon Nov 20 19:18:48 2023 +0300
    Page content update date: Fri Dec 15 2023
    Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/3.renderer/05_twigCustomFunctions.md b/docs/tech/3.renderer/05_twigCustomFunctions.md index 29d78c0f..7fb9be28 100644 --- a/docs/tech/3.renderer/05_twigCustomFunctions.md +++ b/docs/tech/3.renderer/05_twigCustomFunctions.md @@ -334,6 +334,22 @@ Here is a list of functions available by default:   + + + + displayClassApiMethods
    + Display all API methods of a class + + + $className + + + string + + Name of the class for which API methods need to be displayed + + +   @@ -341,10 +357,10 @@ Here is a list of functions available by default: Generate class map in HTML format
    :warning: This function initiates the creation of documents for the displayed entities
    - $classEntityCollections + $entitiesCollections - ClassEntityCollection + PhpEntitiesCollection The collection of entities for which the class map will be generated @@ -385,4 +401,4 @@ Here is a list of functions available by default:

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Oct 28 11:03:31 2023 +0300
    Page content update date: Tue Nov 14 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Mon Nov 20 19:18:48 2023 +0300
    Page content update date: Fri Dec 15 2023
    Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/3.renderer/classes/Configuration.md b/docs/tech/3.renderer/classes/Configuration.md new file mode 100644 index 00000000..d2e768d6 --- /dev/null +++ b/docs/tech/3.renderer/classes/Configuration.md @@ -0,0 +1,735 @@ + + BumbleDocGen / Technical description of the project / Renderer / Configuration
    + +

    + Configuration class: +

    + + + + + +```php +namespace BumbleDocGen\Core\Configuration; + +final class Configuration +``` + +
    Configuration project documentation
    + + + + + + +

    Initialization methods:

    + +
      +
    1. + __construct +
    2. +
    + +

    Methods:

    + +
      +
    1. + getAdditionalConsoleCommands +
    2. +
    3. + getCacheDir +
    4. +
    5. + getConfigurationVersion +
    6. +
    7. + getDocGenLibDir +
    8. +
    9. + getGitClientPath +
    10. +
    11. + getIfExists +
    12. +
    13. + getLanguageHandlersCollection +
    14. +
    15. + getOutputDir +
    16. +
    17. + getOutputDirBaseUrl +
    18. +
    19. + getPageLinkProcessor +
    20. +
    21. + getPlugins +
    22. +
    23. + getProjectRoot +
    24. +
    25. + getSourceLocators +
    26. +
    27. + getTemplatesDir +
    28. +
    29. + getTwigFilters +
    30. +
    31. + getTwigFunctions +
    32. +
    33. + getWorkingDir +
    34. +
    35. + isCheckFileInGitBeforeCreatingDocEnabled +
    36. +
    37. + useSharedCache +
    38. +
    + + +

    Constants:

    + + + + + + +

    Method details:

    + +
    + + + +```php +public function __construct(\BumbleDocGen\Core\Configuration\ConfigurationParameterBag $parameterBag, \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache $localObjectCache, \Psr\Log\LoggerInterface $logger); +``` + + + +Parameters: + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $parameterBag\BumbleDocGen\Core\Configuration\ConfigurationParameterBag-
    $localObjectCache\BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache-
    $logger\Psr\Log\LoggerInterface-
    + + + +
    +
    +
    + + + +```php +public function getAdditionalConsoleCommands(): \BumbleDocGen\Console\Command\AdditionalCommandCollection; +``` + + + +Parameters: not specified + +Return value: \BumbleDocGen\Console\Command\AdditionalCommandCollection + + +Throws: + + +
    +
    +
    + + + +```php +public function getCacheDir(): null|string; +``` + + + +Parameters: not specified + +Return value: null | string + + +Throws: + + +
    +
    +
    + + + +```php +public function getConfigurationVersion(): string; +``` + + + +Parameters: not specified + +Return value: string + + +
    +
    +
    + + + +```php +public function getDocGenLibDir(): string; +``` + + + +Parameters: not specified + +Return value: string + + +
    +
    +
    + + + +```php +public function getGitClientPath(): string; +``` + + + +Parameters: not specified + +Return value: string + + +Throws: + + +
    +
    +
    + + + +```php +public function getIfExists(mixed $key): null|string; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $keymixed-
    + +Return value: null | string + + +Throws: + + +
    +
    +
    + + + +```php +public function getLanguageHandlersCollection(): \BumbleDocGen\LanguageHandler\LanguageHandlersCollection; +``` + + + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\LanguageHandlersCollection + + +Throws: + + +
    +
    +
    + + + +```php +public function getOutputDir(): string; +``` + + + +Parameters: not specified + +Return value: string + + +Throws: + + +
    +
    +
    + + + +```php +public function getOutputDirBaseUrl(): string; +``` + + + +Parameters: not specified + +Return value: string + + +Throws: + + +
    +
    +
    + + + +```php +public function getPageLinkProcessor(): \BumbleDocGen\Core\Renderer\PageLinkProcessor\PageLinkProcessorInterface; +``` + + + +Parameters: not specified + +Return value: \BumbleDocGen\Core\Renderer\PageLinkProcessor\PageLinkProcessorInterface + + +Throws: + + +
    +
    +
    + + + +```php +public function getPlugins(): \BumbleDocGen\Core\Plugin\PluginsCollection; +``` + + + +Parameters: not specified + +Return value: \BumbleDocGen\Core\Plugin\PluginsCollection + + +Throws: + + +
    +
    +
    + + + +```php +public function getProjectRoot(): string; +``` + + + +Parameters: not specified + +Return value: string + + +Throws: + + +
    +
    +
    + + + +```php +public function getSourceLocators(): \BumbleDocGen\Core\Parser\SourceLocator\SourceLocatorsCollection; +``` + + + +Parameters: not specified + +Return value: \BumbleDocGen\Core\Parser\SourceLocator\SourceLocatorsCollection + + +Throws: + + +
    +
    +
    + + + +```php +public function getTemplatesDir(): string; +``` + + + +Parameters: not specified + +Return value: string + + +Throws: + + +
    +
    +
    + + + +```php +public function getTwigFilters(): \BumbleDocGen\Core\Renderer\Twig\Filter\CustomFiltersCollection; +``` + + + +Parameters: not specified + +Return value: \BumbleDocGen\Core\Renderer\Twig\Filter\CustomFiltersCollection + + +Throws: + + +
    +
    +
    + + + +```php +public function getTwigFunctions(): \BumbleDocGen\Core\Renderer\Twig\Function\CustomFunctionsCollection; +``` + + + +Parameters: not specified + +Return value: \BumbleDocGen\Core\Renderer\Twig\Function\CustomFunctionsCollection + + +Throws: + + +
    +
    +
    + + + +```php +public function getWorkingDir(): string; +``` + + + +Parameters: not specified + +Return value: string + + +Throws: + + +
    +
    +
    + +
      +
    • # + isCheckFileInGitBeforeCreatingDocEnabled + | source code
    • +
    + +```php +public function isCheckFileInGitBeforeCreatingDocEnabled(): bool; +``` + + + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +public function useSharedCache(): bool; +``` + + + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    + + \ No newline at end of file diff --git a/docs/tech/3.renderer/classes/DisplayClassApiMethods.md b/docs/tech/3.renderer/classes/DisplayClassApiMethods.md new file mode 100644 index 00000000..ba7189bd --- /dev/null +++ b/docs/tech/3.renderer/classes/DisplayClassApiMethods.md @@ -0,0 +1,209 @@ + + BumbleDocGen / Technical description of the project / Renderer / Template functions / DisplayClassApiMethods
    + +

    + DisplayClassApiMethods class: +

    + + + + + +```php +namespace BumbleDocGen\LanguageHandler\Php\Renderer\Twig\Function; + +final class DisplayClassApiMethods implements \BumbleDocGen\Core\Renderer\Twig\Function\CustomFunctionInterface +``` + +
    Display all API methods of a class
    + + +Examples of using: + +```php +{{ displayClassApiMethods('\\BumbleDocGen\\LanguageHandler\\Php\\Parser\\Entity\\ClassEntity') }} + +``` + + + + +

    Settings:

    + + + + + + +
    Function name:displayClassApiMethods
    + + + + +

    Initialization methods:

    + +
      +
    1. + __construct +
    2. +
    + +

    Methods:

    + +
      +
    1. + __invoke +
    2. +
    3. + getName +
    4. +
    5. + getOptions +
    6. +
    + + + + + + + +

    Method details:

    + +
    + + + +```php +public function __construct(\BumbleDocGen\Core\Parser\Entity\RootEntityCollectionsGroup $rootEntityCollectionsGroup, \BumbleDocGen\Core\Renderer\Twig\Function\GetDocumentedEntityUrl $getDocumentedEntityUrlFunction); +``` + + + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $rootEntityCollectionsGroup\BumbleDocGen\Core\Parser\Entity\RootEntityCollectionsGroup-
    $getDocumentedEntityUrlFunction\BumbleDocGen\Core\Renderer\Twig\Function\GetDocumentedEntityUrl-
    + + + +
    +
    +
    + + + +```php +public function __invoke(string $className): null|string; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $classNamestringName of the class for which API methods need to be displayed
    + +Return value: null | string + + +Throws: + + +
    +
    +
    + + + +```php +public static function getName(): string; +``` + + + +Parameters: not specified + +Return value: string + + +
    +
    +
    + + + +```php +public static function getOptions(): array; +``` + + + +Parameters: not specified + +Return value: array + + +
    +
    + + \ No newline at end of file diff --git a/docs/tech/3.renderer/classes/DrawClassMap.md b/docs/tech/3.renderer/classes/DrawClassMap.md index 13f09d6f..0025cafb 100644 --- a/docs/tech/3.renderer/classes/DrawClassMap.md +++ b/docs/tech/3.renderer/classes/DrawClassMap.md @@ -21,12 +21,12 @@ final class DrawClassMap implements \BumbleDocGen\Core\Renderer\Twig\Function\Cu Examples of using: ```php -{{ drawClassMap(classEntityCollection.filterByPaths(['/src/Renderer'])) }} +{{ drawClassMap(phpEntities.filterByPaths(['/src/Renderer'])) }} ``` ```php -{{ drawClassMap(classEntityCollection) }} +{{ drawClassMap(phpEntities) }} ``` @@ -132,7 +132,7 @@ public function __construct(\BumbleDocGen\Core\Renderer\Twig\Function\GetDocumen ```php -public function __invoke(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection ...$classEntityCollections): string; +public function __invoke(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection ...$entitiesCollections): string; ``` @@ -149,8 +149,8 @@ public function __invoke(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEn - $classEntityCollections (variadic) - \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection + $entitiesCollections (variadic) + \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection The collection of entities for which the class map will be generated @@ -231,7 +231,7 @@ public function convertDirectoryStructureToFormattedString(array $structure, str ```php -public function getDirectoryStructure(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection ...$classEntityCollections): array; +public function getDirectoryStructure(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection ...$entitiesCollections): array; ``` @@ -248,8 +248,8 @@ public function getDirectoryStructure(\BumbleDocGen\LanguageHandler\Php\Parser\E - $classEntityCollections (variadic) - \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection + $entitiesCollections (variadic) + \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection - diff --git a/docs/tech/3.renderer/classes/GetDocumentedEntityUrl.md b/docs/tech/3.renderer/classes/GetDocumentedEntityUrl.md index a442a0a4..a9924f6a 100644 --- a/docs/tech/3.renderer/classes/GetDocumentedEntityUrl.md +++ b/docs/tech/3.renderer/classes/GetDocumentedEntityUrl.md @@ -32,19 +32,19 @@ See: Examples of using: ```php -{{ getDocumentedEntityUrl(phpClassEntityCollection, '\\BumbleDocGen\\Renderer\\Twig\\MainExtension', 'getFunctions') }} +{{ getDocumentedEntityUrl(phpEntities, '\\BumbleDocGen\\Renderer\\Twig\\MainExtension', 'getFunctions') }} The function returns a reference to the documented entity, anchored to the getFunctions method ``` ```php -{{ getDocumentedEntityUrl(phpClassEntityCollection, '\\BumbleDocGen\\Renderer\\Twig\\MainExtension') }} +{{ getDocumentedEntityUrl(phpEntities, '\\BumbleDocGen\\Renderer\\Twig\\MainExtension') }} The function returns a reference to the documented entity MainExtension ``` ```php -{{ getDocumentedEntityUrl(phpClassEntityCollection, '\\BumbleDocGen\\Renderer\\Twig\\MainExtension', '', false) }} +{{ getDocumentedEntityUrl(phpEntities, '\\BumbleDocGen\\Renderer\\Twig\\MainExtension', '', false) }} The function returns a link to the file MainExtension ``` diff --git a/docs/tech/3.renderer/classes/GetDocumentedEntityUrl_2.md b/docs/tech/3.renderer/classes/GetDocumentedEntityUrl_2.md index c4e3639b..64e3cb1b 100644 --- a/docs/tech/3.renderer/classes/GetDocumentedEntityUrl_2.md +++ b/docs/tech/3.renderer/classes/GetDocumentedEntityUrl_2.md @@ -32,19 +32,19 @@ See: Examples of using: ```php -{{ getDocumentedEntityUrl(phpClassEntityCollection, '\\BumbleDocGen\\Renderer\\Twig\\MainExtension', 'getFunctions') }} +{{ getDocumentedEntityUrl(phpEntities, '\\BumbleDocGen\\Renderer\\Twig\\MainExtension', 'getFunctions') }} The function returns a reference to the documented entity, anchored to the getFunctions method ``` ```php -{{ getDocumentedEntityUrl(phpClassEntityCollection, '\\BumbleDocGen\\Renderer\\Twig\\MainExtension') }} +{{ getDocumentedEntityUrl(phpEntities, '\\BumbleDocGen\\Renderer\\Twig\\MainExtension') }} The function returns a reference to the documented entity MainExtension ``` ```php -{{ getDocumentedEntityUrl(phpClassEntityCollection, '\\BumbleDocGen\\Renderer\\Twig\\MainExtension', '', false) }} +{{ getDocumentedEntityUrl(phpEntities, '\\BumbleDocGen\\Renderer\\Twig\\MainExtension', '', false) }} The function returns a link to the file MainExtension ``` diff --git a/docs/tech/3.renderer/classes/GetDocumentedEntityUrl_3.md b/docs/tech/3.renderer/classes/GetDocumentedEntityUrl_3.md index 1e017ff7..41960113 100644 --- a/docs/tech/3.renderer/classes/GetDocumentedEntityUrl_3.md +++ b/docs/tech/3.renderer/classes/GetDocumentedEntityUrl_3.md @@ -32,19 +32,19 @@ See: Examples of using: ```php -{{ getDocumentedEntityUrl(phpClassEntityCollection, '\\BumbleDocGen\\Renderer\\Twig\\MainExtension', 'getFunctions') }} +{{ getDocumentedEntityUrl(phpEntities, '\\BumbleDocGen\\Renderer\\Twig\\MainExtension', 'getFunctions') }} The function returns a reference to the documented entity, anchored to the getFunctions method ``` ```php -{{ getDocumentedEntityUrl(phpClassEntityCollection, '\\BumbleDocGen\\Renderer\\Twig\\MainExtension') }} +{{ getDocumentedEntityUrl(phpEntities, '\\BumbleDocGen\\Renderer\\Twig\\MainExtension') }} The function returns a reference to the documented entity MainExtension ``` ```php -{{ getDocumentedEntityUrl(phpClassEntityCollection, '\\BumbleDocGen\\Renderer\\Twig\\MainExtension', '', false) }} +{{ getDocumentedEntityUrl(phpEntities, '\\BumbleDocGen\\Renderer\\Twig\\MainExtension', '', false) }} The function returns a link to the file MainExtension ``` diff --git a/docs/tech/3.renderer/classes/ClassEntityCollection.md b/docs/tech/3.renderer/classes/PhpEntitiesCollection.md similarity index 72% rename from docs/tech/3.renderer/classes/ClassEntityCollection.md rename to docs/tech/3.renderer/classes/PhpEntitiesCollection.md index 86747a3e..1cd3f55d 100644 --- a/docs/tech/3.renderer/classes/ClassEntityCollection.md +++ b/docs/tech/3.renderer/classes/PhpEntitiesCollection.md @@ -1,8 +1,8 @@ - BumbleDocGen / Technical description of the project / Renderer / How to create documentation templates? / Templates variables / ClassEntityCollection
    + BumbleDocGen / Technical description of the project / Renderer / How to create documentation templates? / Templates variables / PhpEntitiesCollection

    - ClassEntityCollection class: + PhpEntitiesCollection class:

    @@ -12,10 +12,10 @@ ```php namespace BumbleDocGen\LanguageHandler\Php\Parser\Entity; -final class ClassEntityCollection extends \BumbleDocGen\Core\Parser\Entity\LoggableRootEntityCollection implements \IteratorAggregate +final class PhpEntitiesCollection extends \BumbleDocGen\Core\Parser\Entity\LoggableRootEntityCollection implements \IteratorAggregate ``` -
    Collection of PHP class entities
    +
    Collection of php root entities
    @@ -41,16 +41,16 @@ final class ClassEntityCollection extends \BumbleDocGen\Core\Parser\Entity\Logga
  • filterByInterfaces -
  • + - Retrieving all entities that implement the specified interfaces. Filtering is only available for ClassLikeEntity.
  • filterByNameRegularExpression
  • filterByParentClassNames -
  • + - Retrieving all entities that inherit from the specified classes. Filtering is only available for ClassLikeEntity.
  • filterByPaths -
  • + - Filtering entities by relative files paths (from project_root) of the project
  • findEntity
  • @@ -77,7 +77,7 @@ final class ClassEntityCollection extends \BumbleDocGen\Core\Parser\Entity\Logga
  • getOnlyInstantiable -
  • + - Retrieving only instantiable entities. Filtering is only available for ClassLikeEntity.
  • getOnlyInterfaces
  • @@ -103,11 +103,17 @@ final class ClassEntityCollection extends \BumbleDocGen\Core\Parser\Entity\Logga isEmpty
  • - loadClassEntities -
  • + loadEntities + - Load entities into a collection +
  • + loadEntitiesByConfiguration + - Load entities into a collection by configuration
  • remove
  • +
  • + toArray +
  • updateEntitiesCache
  • @@ -118,7 +124,7 @@ final class ClassEntityCollection extends \BumbleDocGen\Core\Parser\Entity\Logga @@ -133,11 +139,11 @@ final class ClassEntityCollection extends \BumbleDocGen\Core\Parser\Entity\Logga ```php -public function __construct(\BumbleDocGen\Core\Configuration\Configuration $configuration, \BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings $phpHandlerSettings, \BumbleDocGen\Core\Plugin\PluginEventDispatcher $pluginEventDispatcher, \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Cache\CacheablePhpEntityFactory $cacheablePhpEntityFactory, \BumbleDocGen\LanguageHandler\Php\Renderer\EntityDocRenderer\EntityDocRendererHelper $docRendererHelper, \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpParser\PhpParserHelper $phpParserHelper, \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache $localObjectCache, \BumbleDocGen\Console\ProgressBar\ProgressBarFactory $progressBarFactory, \Symfony\Component\Console\Style\OutputStyle $io, \Psr\Log\LoggerInterface $logger); +public function __construct(\BumbleDocGen\Core\Configuration\Configuration $configuration, \BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings $phpHandlerSettings, \BumbleDocGen\Core\Plugin\PluginEventDispatcher $pluginEventDispatcher, \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Cache\CacheablePhpEntityFactory $cacheablePhpEntityFactory, \BumbleDocGen\LanguageHandler\Php\Renderer\EntityDocRenderer\EntityDocRendererHelper $docRendererHelper, \BumbleDocGen\LanguageHandler\Php\Parser\PhpParser\PhpParserHelper $phpParserHelper, \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache $localObjectCache, \Psr\Log\LoggerInterface $logger); ``` @@ -180,23 +186,13 @@ public function __construct(\BumbleDocGen\Core\Configuration\Configuration $conf $phpParserHelper - \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpParser\PhpParserHelper + \BumbleDocGen\LanguageHandler\Php\Parser\PhpParser\PhpParserHelper - $localObjectCache \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache - - - - $progressBarFactory - \BumbleDocGen\Console\ProgressBar\ProgressBarFactory - - - - - $io - \Symfony\Component\Console\Style\OutputStyle - - $logger @@ -215,11 +211,11 @@ public function __construct(\BumbleDocGen\Core\Configuration\Configuration $conf ```php -public function add(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity $classEntity, bool $reload = false): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection; +public function add(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity $classEntity, bool $reload = false): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; ``` @@ -237,7 +233,7 @@ public function add(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity $classEntity - \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity + \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - @@ -248,7 +244,7 @@ public function add(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection Throws: @@ -288,14 +284,14 @@ public function clearOperationsLogCollection(): void; ```php -public function filterByInterfaces(array $interfaces): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection; +public function filterByInterfaces(array $interfaces): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; ``` - +
    Retrieving all entities that implement the specified interfaces. Filtering is only available for ClassLikeEntity.
    Parameters: @@ -316,7 +312,7 @@ public function filterByInterfaces(array $interfaces): \BumbleDocGen\LanguageHan -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection Throws: @@ -333,11 +329,11 @@ public function filterByInterfaces(array $interfaces): \BumbleDocGen\LanguageHan ```php -public function filterByNameRegularExpression(string $regexPattern): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection; +public function filterByNameRegularExpression(string $regexPattern): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; ``` @@ -361,7 +357,7 @@ public function filterByNameRegularExpression(string $regexPattern): \BumbleDocG -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection @@ -371,14 +367,14 @@ public function filterByNameRegularExpression(string $regexPattern): \BumbleDocG ```php -public function filterByParentClassNames(array $parentClassNames): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection; +public function filterByParentClassNames(array $parentClassNames): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; ``` - +
    Retrieving all entities that inherit from the specified classes. Filtering is only available for ClassLikeEntity.
    Parameters: @@ -399,7 +395,7 @@ public function filterByParentClassNames(array $parentClassNames): \BumbleDocGen -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection Throws: @@ -416,14 +412,14 @@ public function filterByParentClassNames(array $parentClassNames): \BumbleDocGen ```php -public function filterByPaths(array $paths): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection; +public function filterByPaths(array $paths): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; ``` - +
    Filtering entities by relative files paths (from project_root) of the project
    Parameters: @@ -444,7 +440,7 @@ public function filterByPaths(array $paths): \BumbleDocGen\LanguageHandler\Php\P -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection Throws: @@ -546,11 +542,11 @@ public function get(string $objectName): null|\BumbleDocGen\Core\Parser\Entity\R ```php -public function getEntityByClassName(string $className, bool $createIfNotExists = true): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity; +public function getEntityByClassName(string $className, bool $createIfNotExists = true): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; ``` @@ -579,7 +575,7 @@ public function getEntityByClassName(string $className, bool $createIfNotExists -Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity +Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity @@ -589,7 +585,7 @@ public function getEntityByClassName(string $className, bool $createIfNotExists ```php @@ -610,7 +606,7 @@ public function getEntityCollectionName(): string; ```php @@ -724,7 +720,7 @@ public function getLoadedOrCreateNew(string $objectName, bool $withAddClassEntit See:
    @@ -733,18 +729,18 @@ public function getLoadedOrCreateNew(string $objectName, bool $withAddClassEntit ```php -public function getOnlyAbstractClasses(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection; +public function getOnlyAbstractClasses(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; ``` Parameters: not specified -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection Throws: @@ -761,26 +757,19 @@ public function getOnlyAbstractClasses(): \BumbleDocGen\LanguageHandler\Php\Pars ```php -public function getOnlyInstantiable(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection; +public function getOnlyInstantiable(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; ``` - +
    Retrieving only instantiable entities. Filtering is only available for ClassLikeEntity.
    Parameters: not specified -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection - - -Throws: -
    @@ -789,27 +778,20 @@ public function getOnlyInstantiable(): \BumbleDocGen\LanguageHandler\Php\Parser\ ```php -public function getOnlyInterfaces(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection; +public function getOnlyInterfaces(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; ``` Parameters: not specified -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection -Throws: - -
    @@ -817,27 +799,20 @@ public function getOnlyInterfaces(): \BumbleDocGen\LanguageHandler\Php\Parser\En ```php -public function getOnlyTraits(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection; +public function getOnlyTraits(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; ``` Parameters: not specified -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection -Throws: - -

    @@ -868,7 +843,7 @@ public function getOperationsLogCollection(): \BumbleDocGen\Core\Parser\Entity\C ```php @@ -929,11 +904,11 @@ public function has(string $objectName): bool; ```php -public function internalFindEntity(string $search, bool $useUnsafeKeys = true): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity; +public function internalFindEntity(string $search, bool $useUnsafeKeys = true): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; ``` @@ -964,7 +939,7 @@ public function internalFindEntity(string $search, bool $useUnsafeKeys = true): -Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity +Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity @@ -972,14 +947,14 @@ public function internalFindEntity(string $search, bool $useUnsafeKeys = true): Examples of using: ```php -$classEntityCollection->findEntity('App'); // class name -$classEntityCollection->findEntity('BumbleDocGen\Console\App'); // class with namespace -$classEntityCollection->findEntity('\BumbleDocGen\Console\App'); // class with namespace -$classEntityCollection->findEntity('\BumbleDocGen\Console\App::test()'); // class with namespace and optional part -$classEntityCollection->findEntity('App.php'); // filename -$classEntityCollection->findEntity('/BumbleDocGen/Console/App.php'); // relative path -$classEntityCollection->findEntity('/Users/someuser/Desktop/projects/bumble-doc-gen/BumbleDocGen/Console/App.php'); // absolute path -$classEntityCollection->findEntity('https://github.com/bumble-tech/bumble-doc-gen/blob/master/BumbleDocGen/Console/App.php'); // source link +$entitiesCollection->findEntity('App'); // class name +$entitiesCollection->findEntity('BumbleDocGen\Console\App'); // class with namespace +$entitiesCollection->findEntity('\BumbleDocGen\Console\App'); // class with namespace +$entitiesCollection->findEntity('\BumbleDocGen\Console\App::test()'); // class with namespace and optional part +$entitiesCollection->findEntity('App.php'); // filename +$entitiesCollection->findEntity('/src/Console/App.php'); // relative path +$entitiesCollection->findEntity('/Users/someuser/Desktop/projects/bumble-doc-gen/src/Console/App.php'); // absolute path +$entitiesCollection->findEntity('https://github.com/bumble-tech/bumble-doc-gen/blob/master/src/Console/App.php'); // source link ```
    @@ -989,11 +964,11 @@ $classEntityCollection->findEntity('https://github.com/bumble-tech/bumble-doc-ge ```php -public function internalGetLoadedOrCreateNew(string $objectName, bool $withAddClassEntityToCollectionEvent = false): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity; +public function internalGetLoadedOrCreateNew(string $objectName, bool $withAddClassEntityToCollectionEvent = false): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; ``` @@ -1022,7 +997,7 @@ public function internalGetLoadedOrCreateNew(string $objectName, bool $withAddCl -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity Throws: @@ -1033,6 +1008,9 @@ public function internalGetLoadedOrCreateNew(string $objectName, bool $withAddCl
  • \DI\NotFoundException
  • +
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + @@ -1063,20 +1041,47 @@ public function isEmpty(): bool;
    ```php -public function loadClassEntities(): void; +public function loadEntities(\BumbleDocGen\Core\Parser\SourceLocator\SourceLocatorsCollection $sourceLocatorsCollection, \BumbleDocGen\Core\Parser\FilterCondition\ConditionInterface|null $filters = null, \BumbleDocGen\Core\Parser\Entity\EntitiesLoaderProgressBarInterface|null $progressBar = null): \BumbleDocGen\Core\Parser\Entity\CollectionLoadEntitiesResult; ``` +
    Load entities into a collection
    +Parameters: -Parameters: not specified + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $sourceLocatorsCollection\BumbleDocGen\Core\Parser\SourceLocator\SourceLocatorsCollection-
    $filters\BumbleDocGen\Core\Parser\FilterCondition\ConditionInterface | null-
    $progressBar\BumbleDocGen\Core\Parser\Entity\EntitiesLoaderProgressBarInterface | null-
    -Return value: void +Return value: \BumbleDocGen\Core\Parser\Entity\CollectionLoadEntitiesResult Throws: @@ -1099,6 +1104,60 @@ public function loadClassEntities(): void;
    +
      +
    • # + loadEntitiesByConfiguration + :warning: Is internal | source code
    • +
    + +```php +public function loadEntitiesByConfiguration(\BumbleDocGen\Core\Parser\Entity\EntitiesLoaderProgressBarInterface|null $progressBar = null): \BumbleDocGen\Core\Parser\Entity\CollectionLoadEntitiesResult; +``` + +
    Load entities into a collection by configuration
    + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $progressBar\BumbleDocGen\Core\Parser\Entity\EntitiesLoaderProgressBarInterface | null-
    + +Return value: \BumbleDocGen\Core\Parser\Entity\CollectionLoadEntitiesResult + + +Throws: + + +
    +
    +
    +
    • # remove @@ -1135,6 +1194,29 @@ public function remove(string $objectName): void; Return value: void +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\Core\Parser\Entity\RootEntityCollection + +public function toArray(): array; +``` + + + +Parameters: not specified + +Return value: array + +

    @@ -1142,7 +1224,7 @@ public function remove(string $objectName): void; ```php diff --git a/docs/tech/3.renderer/classes/ClassEntityCollection_2.md b/docs/tech/3.renderer/classes/PhpEntitiesCollection_2.md similarity index 72% rename from docs/tech/3.renderer/classes/ClassEntityCollection_2.md rename to docs/tech/3.renderer/classes/PhpEntitiesCollection_2.md index a17ef76a..c9e44de5 100644 --- a/docs/tech/3.renderer/classes/ClassEntityCollection_2.md +++ b/docs/tech/3.renderer/classes/PhpEntitiesCollection_2.md @@ -1,8 +1,8 @@ - BumbleDocGen / Technical description of the project / Renderer / Template functions / ClassEntityCollection
    + BumbleDocGen / Technical description of the project / Renderer / Template functions / PhpEntitiesCollection

    - ClassEntityCollection class: + PhpEntitiesCollection class:

    @@ -12,10 +12,10 @@ ```php namespace BumbleDocGen\LanguageHandler\Php\Parser\Entity; -final class ClassEntityCollection extends \BumbleDocGen\Core\Parser\Entity\LoggableRootEntityCollection implements \IteratorAggregate +final class PhpEntitiesCollection extends \BumbleDocGen\Core\Parser\Entity\LoggableRootEntityCollection implements \IteratorAggregate ``` -
    Collection of PHP class entities
    +
    Collection of php root entities
    @@ -41,16 +41,16 @@ final class ClassEntityCollection extends \BumbleDocGen\Core\Parser\Entity\Logga
  • filterByInterfaces -
  • + - Retrieving all entities that implement the specified interfaces. Filtering is only available for ClassLikeEntity.
  • filterByNameRegularExpression
  • filterByParentClassNames -
  • + - Retrieving all entities that inherit from the specified classes. Filtering is only available for ClassLikeEntity.
  • filterByPaths -
  • + - Filtering entities by relative files paths (from project_root) of the project
  • findEntity
  • @@ -77,7 +77,7 @@ final class ClassEntityCollection extends \BumbleDocGen\Core\Parser\Entity\Logga
  • getOnlyInstantiable -
  • + - Retrieving only instantiable entities. Filtering is only available for ClassLikeEntity.
  • getOnlyInterfaces
  • @@ -103,11 +103,17 @@ final class ClassEntityCollection extends \BumbleDocGen\Core\Parser\Entity\Logga isEmpty
  • - loadClassEntities -
  • + loadEntities + - Load entities into a collection +
  • + loadEntitiesByConfiguration + - Load entities into a collection by configuration
  • remove
  • +
  • + toArray +
  • updateEntitiesCache
  • @@ -118,7 +124,7 @@ final class ClassEntityCollection extends \BumbleDocGen\Core\Parser\Entity\Logga @@ -133,11 +139,11 @@ final class ClassEntityCollection extends \BumbleDocGen\Core\Parser\Entity\Logga ```php -public function __construct(\BumbleDocGen\Core\Configuration\Configuration $configuration, \BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings $phpHandlerSettings, \BumbleDocGen\Core\Plugin\PluginEventDispatcher $pluginEventDispatcher, \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Cache\CacheablePhpEntityFactory $cacheablePhpEntityFactory, \BumbleDocGen\LanguageHandler\Php\Renderer\EntityDocRenderer\EntityDocRendererHelper $docRendererHelper, \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpParser\PhpParserHelper $phpParserHelper, \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache $localObjectCache, \BumbleDocGen\Console\ProgressBar\ProgressBarFactory $progressBarFactory, \Symfony\Component\Console\Style\OutputStyle $io, \Psr\Log\LoggerInterface $logger); +public function __construct(\BumbleDocGen\Core\Configuration\Configuration $configuration, \BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings $phpHandlerSettings, \BumbleDocGen\Core\Plugin\PluginEventDispatcher $pluginEventDispatcher, \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Cache\CacheablePhpEntityFactory $cacheablePhpEntityFactory, \BumbleDocGen\LanguageHandler\Php\Renderer\EntityDocRenderer\EntityDocRendererHelper $docRendererHelper, \BumbleDocGen\LanguageHandler\Php\Parser\PhpParser\PhpParserHelper $phpParserHelper, \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache $localObjectCache, \Psr\Log\LoggerInterface $logger); ``` @@ -180,23 +186,13 @@ public function __construct(\BumbleDocGen\Core\Configuration\Configuration $conf $phpParserHelper - \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpParser\PhpParserHelper + \BumbleDocGen\LanguageHandler\Php\Parser\PhpParser\PhpParserHelper - $localObjectCache \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache - - - - $progressBarFactory - \BumbleDocGen\Console\ProgressBar\ProgressBarFactory - - - - - $io - \Symfony\Component\Console\Style\OutputStyle - - $logger @@ -215,11 +211,11 @@ public function __construct(\BumbleDocGen\Core\Configuration\Configuration $conf ```php -public function add(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity $classEntity, bool $reload = false): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection; +public function add(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity $classEntity, bool $reload = false): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; ``` @@ -237,7 +233,7 @@ public function add(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity $classEntity - \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity + \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - @@ -248,7 +244,7 @@ public function add(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection Throws: @@ -288,14 +284,14 @@ public function clearOperationsLogCollection(): void; ```php -public function filterByInterfaces(array $interfaces): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection; +public function filterByInterfaces(array $interfaces): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; ``` - +
    Retrieving all entities that implement the specified interfaces. Filtering is only available for ClassLikeEntity.
    Parameters: @@ -316,7 +312,7 @@ public function filterByInterfaces(array $interfaces): \BumbleDocGen\LanguageHan -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection Throws: @@ -333,11 +329,11 @@ public function filterByInterfaces(array $interfaces): \BumbleDocGen\LanguageHan ```php -public function filterByNameRegularExpression(string $regexPattern): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection; +public function filterByNameRegularExpression(string $regexPattern): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; ``` @@ -361,7 +357,7 @@ public function filterByNameRegularExpression(string $regexPattern): \BumbleDocG -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection
    @@ -371,14 +367,14 @@ public function filterByNameRegularExpression(string $regexPattern): \BumbleDocG ```php -public function filterByParentClassNames(array $parentClassNames): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection; +public function filterByParentClassNames(array $parentClassNames): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; ``` - +
    Retrieving all entities that inherit from the specified classes. Filtering is only available for ClassLikeEntity.
    Parameters: @@ -399,7 +395,7 @@ public function filterByParentClassNames(array $parentClassNames): \BumbleDocGen -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection Throws: @@ -416,14 +412,14 @@ public function filterByParentClassNames(array $parentClassNames): \BumbleDocGen ```php -public function filterByPaths(array $paths): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection; +public function filterByPaths(array $paths): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; ``` - +
    Filtering entities by relative files paths (from project_root) of the project
    Parameters: @@ -444,7 +440,7 @@ public function filterByPaths(array $paths): \BumbleDocGen\LanguageHandler\Php\P -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection Throws: @@ -546,11 +542,11 @@ public function get(string $objectName): null|\BumbleDocGen\Core\Parser\Entity\R ```php -public function getEntityByClassName(string $className, bool $createIfNotExists = true): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity; +public function getEntityByClassName(string $className, bool $createIfNotExists = true): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; ``` @@ -579,7 +575,7 @@ public function getEntityByClassName(string $className, bool $createIfNotExists -Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity +Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity
    @@ -589,7 +585,7 @@ public function getEntityByClassName(string $className, bool $createIfNotExists ```php @@ -610,7 +606,7 @@ public function getEntityCollectionName(): string; ```php @@ -724,7 +720,7 @@ public function getLoadedOrCreateNew(string $objectName, bool $withAddClassEntit See:
    @@ -733,18 +729,18 @@ public function getLoadedOrCreateNew(string $objectName, bool $withAddClassEntit ```php -public function getOnlyAbstractClasses(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection; +public function getOnlyAbstractClasses(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; ``` Parameters: not specified -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection Throws: @@ -761,26 +757,19 @@ public function getOnlyAbstractClasses(): \BumbleDocGen\LanguageHandler\Php\Pars ```php -public function getOnlyInstantiable(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection; +public function getOnlyInstantiable(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; ``` - +
    Retrieving only instantiable entities. Filtering is only available for ClassLikeEntity.
    Parameters: not specified -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection - - -Throws: -
    @@ -789,27 +778,20 @@ public function getOnlyInstantiable(): \BumbleDocGen\LanguageHandler\Php\Parser\ ```php -public function getOnlyInterfaces(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection; +public function getOnlyInterfaces(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; ``` Parameters: not specified -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection -Throws: - -
    @@ -817,27 +799,20 @@ public function getOnlyInterfaces(): \BumbleDocGen\LanguageHandler\Php\Parser\En ```php -public function getOnlyTraits(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection; +public function getOnlyTraits(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; ``` Parameters: not specified -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection -Throws: - -

    @@ -868,7 +843,7 @@ public function getOperationsLogCollection(): \BumbleDocGen\Core\Parser\Entity\C ```php @@ -929,11 +904,11 @@ public function has(string $objectName): bool; ```php -public function internalFindEntity(string $search, bool $useUnsafeKeys = true): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity; +public function internalFindEntity(string $search, bool $useUnsafeKeys = true): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; ``` @@ -964,7 +939,7 @@ public function internalFindEntity(string $search, bool $useUnsafeKeys = true): -Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity +Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity @@ -972,14 +947,14 @@ public function internalFindEntity(string $search, bool $useUnsafeKeys = true): Examples of using: ```php -$classEntityCollection->findEntity('App'); // class name -$classEntityCollection->findEntity('BumbleDocGen\Console\App'); // class with namespace -$classEntityCollection->findEntity('\BumbleDocGen\Console\App'); // class with namespace -$classEntityCollection->findEntity('\BumbleDocGen\Console\App::test()'); // class with namespace and optional part -$classEntityCollection->findEntity('App.php'); // filename -$classEntityCollection->findEntity('/BumbleDocGen/Console/App.php'); // relative path -$classEntityCollection->findEntity('/Users/someuser/Desktop/projects/bumble-doc-gen/BumbleDocGen/Console/App.php'); // absolute path -$classEntityCollection->findEntity('https://github.com/bumble-tech/bumble-doc-gen/blob/master/BumbleDocGen/Console/App.php'); // source link +$entitiesCollection->findEntity('App'); // class name +$entitiesCollection->findEntity('BumbleDocGen\Console\App'); // class with namespace +$entitiesCollection->findEntity('\BumbleDocGen\Console\App'); // class with namespace +$entitiesCollection->findEntity('\BumbleDocGen\Console\App::test()'); // class with namespace and optional part +$entitiesCollection->findEntity('App.php'); // filename +$entitiesCollection->findEntity('/src/Console/App.php'); // relative path +$entitiesCollection->findEntity('/Users/someuser/Desktop/projects/bumble-doc-gen/src/Console/App.php'); // absolute path +$entitiesCollection->findEntity('https://github.com/bumble-tech/bumble-doc-gen/blob/master/src/Console/App.php'); // source link ```
    @@ -989,11 +964,11 @@ $classEntityCollection->findEntity('https://github.com/bumble-tech/bumble-doc-ge ```php -public function internalGetLoadedOrCreateNew(string $objectName, bool $withAddClassEntityToCollectionEvent = false): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity; +public function internalGetLoadedOrCreateNew(string $objectName, bool $withAddClassEntityToCollectionEvent = false): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; ``` @@ -1022,7 +997,7 @@ public function internalGetLoadedOrCreateNew(string $objectName, bool $withAddCl -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity Throws: @@ -1033,6 +1008,9 @@ public function internalGetLoadedOrCreateNew(string $objectName, bool $withAddCl
  • \DI\NotFoundException
  • +
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + @@ -1063,20 +1041,47 @@ public function isEmpty(): bool;
    ```php -public function loadClassEntities(): void; +public function loadEntities(\BumbleDocGen\Core\Parser\SourceLocator\SourceLocatorsCollection $sourceLocatorsCollection, \BumbleDocGen\Core\Parser\FilterCondition\ConditionInterface|null $filters = null, \BumbleDocGen\Core\Parser\Entity\EntitiesLoaderProgressBarInterface|null $progressBar = null): \BumbleDocGen\Core\Parser\Entity\CollectionLoadEntitiesResult; ``` +
    Load entities into a collection
    +Parameters: -Parameters: not specified + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $sourceLocatorsCollection\BumbleDocGen\Core\Parser\SourceLocator\SourceLocatorsCollection-
    $filters\BumbleDocGen\Core\Parser\FilterCondition\ConditionInterface | null-
    $progressBar\BumbleDocGen\Core\Parser\Entity\EntitiesLoaderProgressBarInterface | null-
    -Return value: void +Return value: \BumbleDocGen\Core\Parser\Entity\CollectionLoadEntitiesResult Throws: @@ -1099,6 +1104,60 @@ public function loadClassEntities(): void;
    +
      +
    • # + loadEntitiesByConfiguration + :warning: Is internal | source code
    • +
    + +```php +public function loadEntitiesByConfiguration(\BumbleDocGen\Core\Parser\Entity\EntitiesLoaderProgressBarInterface|null $progressBar = null): \BumbleDocGen\Core\Parser\Entity\CollectionLoadEntitiesResult; +``` + +
    Load entities into a collection by configuration
    + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $progressBar\BumbleDocGen\Core\Parser\Entity\EntitiesLoaderProgressBarInterface | null-
    + +Return value: \BumbleDocGen\Core\Parser\Entity\CollectionLoadEntitiesResult + + +Throws: + + +
    +
    +
    +
    • # remove @@ -1135,6 +1194,29 @@ public function remove(string $objectName): void; Return value: void +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\Core\Parser\Entity\RootEntityCollection + +public function toArray(): array; +``` + + + +Parameters: not specified + +Return value: array + +

    @@ -1142,7 +1224,7 @@ public function remove(string $objectName): void; ```php diff --git a/docs/tech/3.renderer/classes/PrintEntityCollectionAsList.md b/docs/tech/3.renderer/classes/PrintEntityCollectionAsList.md index a8086d43..3f73562b 100644 --- a/docs/tech/3.renderer/classes/PrintEntityCollectionAsList.md +++ b/docs/tech/3.renderer/classes/PrintEntityCollectionAsList.md @@ -21,13 +21,13 @@ final class PrintEntityCollectionAsList implements \BumbleDocGen\Core\Renderer\T Examples of using: ```php -{{ printEntityCollectionAsList(phpClassEntityCollection.filterByInterfaces(['ScriptFramework\\ScriptInterface', 'ScriptFramework\\TestScriptInterface'])) }} +{{ printEntityCollectionAsList(phpEntities.filterByInterfaces(['ScriptFramework\\ScriptInterface', 'ScriptFramework\\TestScriptInterface'])) }} The function will output a list of PHP classes that match the ScriptFramework\ScriptInterface and ScriptFramework\TestScriptInterface interfaces ``` ```php -{{ printEntityCollectionAsList(phpClassEntityCollection) }} +{{ printEntityCollectionAsList(phpEntities) }} The function will list all documented PHP classes ``` diff --git a/docs/tech/3.renderer/classes/RootEntityCollection.md b/docs/tech/3.renderer/classes/RootEntityCollection.md index 65ad08fd..a641442b 100644 --- a/docs/tech/3.renderer/classes/RootEntityCollection.md +++ b/docs/tech/3.renderer/classes/RootEntityCollection.md @@ -2,7 +2,7 @@ BumbleDocGen / Technical description of the project / Renderer / Template functions / RootEntityCollection

    - RootEntityCollection class: + RootEntityCollection class:

    @@ -50,9 +50,18 @@ abstract class RootEntityCollection extends \BumbleDocGen\Core\Parser\Entity\Bas
  • isEmpty
  • +
  • + loadEntities +
  • +
  • + loadEntitiesByConfiguration +
  • remove
  • +
  • + toArray +
  • updateEntitiesCache
  • @@ -71,7 +80,7 @@ abstract class RootEntityCollection extends \BumbleDocGen\Core\Parser\Entity\Bas ```php @@ -114,7 +123,7 @@ public function findEntity(string $search, bool $useUnsafeKeys = true): null|\Bu ```php @@ -152,7 +161,7 @@ public function get(string $objectName): null|\BumbleDocGen\Core\Parser\Entity\R ```php @@ -173,7 +182,7 @@ public function getEntityCollectionName(): string; ```php @@ -245,7 +254,7 @@ public function getIterator(): \Generator; ```php @@ -285,7 +294,7 @@ public function getLoadedOrCreateNew(string $objectName, bool $withAddClassEntit See:

    @@ -350,6 +359,92 @@ public function isEmpty(): bool; Return value: bool +
    +
    +
    + + + +```php +public function loadEntities(\BumbleDocGen\Core\Parser\SourceLocator\SourceLocatorsCollection $sourceLocatorsCollection, \BumbleDocGen\Core\Parser\FilterCondition\ConditionInterface|null $filters = null, \BumbleDocGen\Core\Parser\Entity\EntitiesLoaderProgressBarInterface|null $progressBar = null): \BumbleDocGen\Core\Parser\Entity\CollectionLoadEntitiesResult; +``` + + + +Parameters: + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $sourceLocatorsCollection\BumbleDocGen\Core\Parser\SourceLocator\SourceLocatorsCollection-
    $filters\BumbleDocGen\Core\Parser\FilterCondition\ConditionInterface | null-
    $progressBar\BumbleDocGen\Core\Parser\Entity\EntitiesLoaderProgressBarInterface | null-
    + +Return value: \BumbleDocGen\Core\Parser\Entity\CollectionLoadEntitiesResult + + +
    +
    +
    + + + +```php +public function loadEntitiesByConfiguration(\BumbleDocGen\Core\Parser\Entity\EntitiesLoaderProgressBarInterface|null $progressBar = null): \BumbleDocGen\Core\Parser\Entity\CollectionLoadEntitiesResult; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $progressBar\BumbleDocGen\Core\Parser\Entity\EntitiesLoaderProgressBarInterface | null-
    + +Return value: \BumbleDocGen\Core\Parser\Entity\CollectionLoadEntitiesResult + +

    @@ -390,6 +485,27 @@ public function remove(string $objectName): void; Return value: void +
    +
    +
    + + + +```php +public function toArray(): array; +``` + + + +Parameters: not specified + +Return value: array + +

    @@ -397,7 +513,7 @@ public function remove(string $objectName): void; ```php diff --git a/docs/tech/3.renderer/classes/RootEntityInterface.md b/docs/tech/3.renderer/classes/RootEntityInterface.md index 0e037014..03be8898 100644 --- a/docs/tech/3.renderer/classes/RootEntityInterface.md +++ b/docs/tech/3.renderer/classes/RootEntityInterface.md @@ -27,12 +27,6 @@ their entities need to correspond to the same interfaces

    Methods:

      -
    1. - entityCacheIsOutdated -
    2. -
    3. - entityDataCanBeLoaded - - Checking if it is possible to get the entity data
    4. getAbsoluteFileName - Returns the absolute path to a file if it can be retrieved and if the file is in the project directory
    5. @@ -42,24 +36,30 @@ their entities need to correspond to the same interfaces
    6. getFileContent
    7. -
    8. - getFileName - - Returns the relative path to a file if it can be retrieved and if the file is in the project directory
    9. getFileSourceLink
    10. getName -
    11. + - Full name of the entity
    12. getObjectId -
    13. + - Entity object ID +
    14. + getRelativeFileName + - File name relative to project_root configuration parameter
    15. getRootEntityCollection - Get parent collection of entities
    16. getShortName + - Short name of the entity
    17. +
    18. + isEntityCacheOutdated
    19. +
    20. + isEntityDataCanBeLoaded + - Checking if it is possible to get the entity data
    21. isEntityNameValid - Check if entity name is valid
    22. @@ -69,6 +69,9 @@ their entities need to correspond to the same interfaces
    23. isInGit - The entity file is in the git repository
    24. +
    25. + normalizeClassName +
    @@ -81,54 +84,10 @@ their entities need to correspond to the same interfaces
    - - -```php -// Implemented in BumbleDocGen\Core\Parser\Entity\EntityInterface - -public function entityCacheIsOutdated(): bool; -``` - - - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - - - -```php -public function entityDataCanBeLoaded(): bool; -``` - -
    Checking if it is possible to get the entity data
    - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - ```php @@ -151,7 +110,7 @@ public function getAbsoluteFileName(): null|string; ```php @@ -172,7 +131,7 @@ public function getEntityDependencies(): array; ```php @@ -186,29 +145,6 @@ public function getFileContent(): string; Return value: string -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\Core\Parser\Entity\EntityInterface - -public function getFileName(): null|string; -``` - -
    Returns the relative path to a file if it can be retrieved and if the file is in the project directory
    - -Parameters: not specified - -Return value: null | string - -

    @@ -216,7 +152,7 @@ public function getFileName(): null|string; ```php @@ -254,7 +190,7 @@ public function getFileSourceLink(bool $withLine = true): null|string; ```php @@ -263,7 +199,7 @@ public function getFileSourceLink(bool $withLine = true): null|string; public function getName(): string; ``` - +
    Full name of the entity
    Parameters: not specified @@ -277,7 +213,7 @@ public function getName(): string; ```php @@ -286,7 +222,7 @@ public function getName(): string; public function getObjectId(): string; ``` - +
    Entity object ID
    Parameters: not specified @@ -297,10 +233,39 @@ public function getObjectId(): string;
    + + +```php +// Implemented in BumbleDocGen\Core\Parser\Entity\EntityInterface + +public function getRelativeFileName(): null|string; +``` + +
    File name relative to project_root configuration parameter
    + +Parameters: not specified + +Return value: null | string + + + +See: + +
    +
    +
    + ```php @@ -323,7 +288,7 @@ public function getRootEntityCollection(): \BumbleDocGen\Core\Parser\Entity\Root ```php @@ -332,13 +297,57 @@ public function getRootEntityCollection(): \BumbleDocGen\Core\Parser\Entity\Root public function getShortName(): string; ``` - +
    Short name of the entity
    Parameters: not specified Return value: string +
    +
    +
    + +
      +
    • # + isEntityCacheOutdated + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\Core\Parser\Entity\EntityInterface + +public function isEntityCacheOutdated(): bool; +``` + + + +Parameters: not specified + +Return value: bool + + +
    +
    +
    + + + +```php +public function isEntityDataCanBeLoaded(): bool; +``` + +
    Checking if it is possible to get the entity data
    + +Parameters: not specified + +Return value: bool + +

    @@ -346,7 +355,7 @@ public function getShortName(): string; ```php @@ -384,7 +393,7 @@ public static function isEntityNameValid(string $entityName): bool; ```php @@ -405,7 +414,7 @@ public function isExternalLibraryEntity(): bool; ```php @@ -419,6 +428,44 @@ public function isInGit(): bool; Return value: bool +
    +
    +
    + + + +```php +public static function normalizeClassName(string $name): string; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $namestring-
    + +Return value: string + +

    diff --git a/docs/tech/3.renderer/classes/RootEntityInterface_2.md b/docs/tech/3.renderer/classes/RootEntityInterface_2.md index 28648ac9..0df09c9d 100644 --- a/docs/tech/3.renderer/classes/RootEntityInterface_2.md +++ b/docs/tech/3.renderer/classes/RootEntityInterface_2.md @@ -27,12 +27,6 @@ their entities need to correspond to the same interfaces

    Methods:

      -
    1. - entityCacheIsOutdated -
    2. -
    3. - entityDataCanBeLoaded - - Checking if it is possible to get the entity data
    4. getAbsoluteFileName - Returns the absolute path to a file if it can be retrieved and if the file is in the project directory
    5. @@ -42,24 +36,30 @@ their entities need to correspond to the same interfaces
    6. getFileContent
    7. -
    8. - getFileName - - Returns the relative path to a file if it can be retrieved and if the file is in the project directory
    9. getFileSourceLink
    10. getName -
    11. + - Full name of the entity
    12. getObjectId -
    13. + - Entity object ID +
    14. + getRelativeFileName + - File name relative to project_root configuration parameter
    15. getRootEntityCollection - Get parent collection of entities
    16. getShortName + - Short name of the entity
    17. +
    18. + isEntityCacheOutdated
    19. +
    20. + isEntityDataCanBeLoaded + - Checking if it is possible to get the entity data
    21. isEntityNameValid - Check if entity name is valid
    22. @@ -69,6 +69,9 @@ their entities need to correspond to the same interfaces
    23. isInGit - The entity file is in the git repository
    24. +
    25. + normalizeClassName +
    @@ -81,54 +84,10 @@ their entities need to correspond to the same interfaces
    - - -```php -// Implemented in BumbleDocGen\Core\Parser\Entity\EntityInterface - -public function entityCacheIsOutdated(): bool; -``` - - - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - - - -```php -public function entityDataCanBeLoaded(): bool; -``` - -
    Checking if it is possible to get the entity data
    - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - ```php @@ -151,7 +110,7 @@ public function getAbsoluteFileName(): null|string; ```php @@ -172,7 +131,7 @@ public function getEntityDependencies(): array; ```php @@ -186,29 +145,6 @@ public function getFileContent(): string; Return value: string -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\Core\Parser\Entity\EntityInterface - -public function getFileName(): null|string; -``` - -
    Returns the relative path to a file if it can be retrieved and if the file is in the project directory
    - -Parameters: not specified - -Return value: null | string - -

    @@ -216,7 +152,7 @@ public function getFileName(): null|string; ```php @@ -254,7 +190,7 @@ public function getFileSourceLink(bool $withLine = true): null|string; ```php @@ -263,7 +199,7 @@ public function getFileSourceLink(bool $withLine = true): null|string; public function getName(): string; ``` - +
    Full name of the entity
    Parameters: not specified @@ -277,7 +213,7 @@ public function getName(): string; ```php @@ -286,7 +222,7 @@ public function getName(): string; public function getObjectId(): string; ``` - +
    Entity object ID
    Parameters: not specified @@ -297,10 +233,39 @@ public function getObjectId(): string;
    + + +```php +// Implemented in BumbleDocGen\Core\Parser\Entity\EntityInterface + +public function getRelativeFileName(): null|string; +``` + +
    File name relative to project_root configuration parameter
    + +Parameters: not specified + +Return value: null | string + + + +See: + +
    +
    +
    + ```php @@ -323,7 +288,7 @@ public function getRootEntityCollection(): \BumbleDocGen\Core\Parser\Entity\Root ```php @@ -332,13 +297,57 @@ public function getRootEntityCollection(): \BumbleDocGen\Core\Parser\Entity\Root public function getShortName(): string; ``` - +
    Short name of the entity
    Parameters: not specified Return value: string +
    +
    +
    + +
      +
    • # + isEntityCacheOutdated + :warning: Is internal | source code
    • +
    + +```php +// Implemented in BumbleDocGen\Core\Parser\Entity\EntityInterface + +public function isEntityCacheOutdated(): bool; +``` + + + +Parameters: not specified + +Return value: bool + + +
    +
    +
    + + + +```php +public function isEntityDataCanBeLoaded(): bool; +``` + +
    Checking if it is possible to get the entity data
    + +Parameters: not specified + +Return value: bool + +

    @@ -346,7 +355,7 @@ public function getShortName(): string; ```php @@ -384,7 +393,7 @@ public static function isEntityNameValid(string $entityName): bool; ```php @@ -405,7 +414,7 @@ public function isExternalLibraryEntity(): bool; ```php @@ -419,6 +428,44 @@ public function isInGit(): bool; Return value: bool +
    +
    +
    + + + +```php +public static function normalizeClassName(string $name): string; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $namestring-
    + +Return value: string + +

    diff --git a/docs/tech/3.renderer/readme.md b/docs/tech/3.renderer/readme.md index f7b1617f..258fdd3a 100644 --- a/docs/tech/3.renderer/readme.md +++ b/docs/tech/3.renderer/readme.md @@ -60,4 +60,4 @@ This process is presented in the form of a diagram below.

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Sep 2 21:01:47 2023 +0300
    Page content update date: Tue Nov 14 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Sep 2 21:01:47 2023 +0300
    Page content update date: Fri Dec 15 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file diff --git a/docs/tech/3.renderer/templatesDynamicBlocks.md b/docs/tech/3.renderer/templatesDynamicBlocks.md index 304a599c..3df9d5dc 100644 --- a/docs/tech/3.renderer/templatesDynamicBlocks.md +++ b/docs/tech/3.renderer/templatesDynamicBlocks.md @@ -8,14 +8,14 @@ There are several ways to create dynamic blocks in templates. You can use the built-in functions and filters or add your own, so you can implement any logic for generating dynamically changing content. ```twig - {{ printEntityCollectionAsList(phpClassEntityCollection.filterByInterfaces(['\\BumbleDocGen\\Core\\Parser\\SourceLocator\\SourceLocatorInterface']).getOnlyInstantiable()) }} + {{ printEntityCollectionAsList(phpEntities.filterByInterfaces(['\\BumbleDocGen\\Core\\Parser\\SourceLocator\\SourceLocatorInterface']).getOnlyInstantiable()) }} ``` * The second way is to output data from variables directly to the template. For example, you can display a list of classes or methods of documented code according to certain rules. ```twig - {% for entity in phpClassEntityCollection.filterByInterfaces(['\\BumbleDocGen\\Core\\Parser\\SourceLocator\\SourceLocatorInterface']).getOnlyInstantiable() %} + {% for entity in phpEntities.filterByInterfaces(['\\BumbleDocGen\\Core\\Parser\\SourceLocator\\SourceLocatorInterface']).getOnlyInstantiable() %} * {{ entity.getName() }} {% endfor %} @@ -26,4 +26,4 @@ You can use the built-in functions and filters or add your own, so you can imple

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Sep 2 21:01:47 2023 +0300
    Page content update date: Tue Nov 14 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Mon Nov 20 19:18:48 2023 +0300
    Page content update date: Fri Dec 15 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file diff --git a/docs/tech/3.renderer/templatesLinking.md b/docs/tech/3.renderer/templatesLinking.md index 4f2ff70e..3b97dfab 100644 --- a/docs/tech/3.renderer/templatesLinking.md +++ b/docs/tech/3.renderer/templatesLinking.md @@ -27,4 +27,4 @@ You can also implement your own functions for relinking if necessary.

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Oct 28 11:03:31 2023 +0300
    Page content update date: Tue Nov 14 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Oct 28 11:03:31 2023 +0300
    Page content update date: Fri Dec 15 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file diff --git a/docs/tech/3.renderer/templatesVariables.md b/docs/tech/3.renderer/templatesVariables.md index 2009974d..4524717f 100644 --- a/docs/tech/3.renderer/templatesVariables.md +++ b/docs/tech/3.renderer/templatesVariables.md @@ -6,9 +6,9 @@ There are several variables available in each processed template. 1) Firstly, these are built-in twig variables, for example `_self`, which returns the path to the processed template. -2) Secondly, variables with collections of processed programming languages are available in the template (see LanguageHandlerInterface). For example, when processing a PHP project collection, a collection ClassEntityCollection will be available in the template under the name phpClassEntityCollection +2) Secondly, variables with collections of processed programming languages are available in the template (see LanguageHandlerInterface). For example, when processing a PHP project collection, a collection PhpEntitiesCollection will be available in the template under the name phpEntities

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Oct 28 11:03:31 2023 +0300
    Page content update date: Tue Nov 14 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Mon Nov 20 20:31:30 2023 +0300
    Page content update date: Fri Dec 15 2023
    Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/4.pluginSystem/classes/AfterLoadingClassEntityCollection.md b/docs/tech/4.pluginSystem/classes/AfterLoadingPhpEntitiesCollection.md similarity index 59% rename from docs/tech/4.pluginSystem/classes/AfterLoadingClassEntityCollection.md rename to docs/tech/4.pluginSystem/classes/AfterLoadingPhpEntitiesCollection.md index c93582ec..3e574f81 100644 --- a/docs/tech/4.pluginSystem/classes/AfterLoadingClassEntityCollection.md +++ b/docs/tech/4.pluginSystem/classes/AfterLoadingPhpEntitiesCollection.md @@ -1,8 +1,8 @@ - BumbleDocGen / Technical description of the project / Plugin system / AfterLoadingClassEntityCollection
    + BumbleDocGen / Technical description of the project / Plugin system / AfterLoadingPhpEntitiesCollection

    - AfterLoadingClassEntityCollection class: + AfterLoadingPhpEntitiesCollection class:

    @@ -12,10 +12,10 @@ ```php namespace BumbleDocGen\LanguageHandler\Php\Plugin\Event\Parser; -final class AfterLoadingClassEntityCollection extends \Symfony\Contracts\EventDispatcher\Event +final class AfterLoadingPhpEntitiesCollection extends \Symfony\Contracts\EventDispatcher\Event ``` -
    The event is called after the initial creation of a collection of class entities
    +
    The event is called after the initial creation of a collection of PHP entities
    @@ -34,7 +34,7 @@ final class AfterLoadingClassEntityCollection extends \Symfony\Contracts\EventDi
    1. - getClassEntityCollection + getPhpEntitiesCollection
    @@ -51,11 +51,11 @@ final class AfterLoadingClassEntityCollection extends \Symfony\Contracts\EventDi ```php -public function __construct(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection $classEntityCollection); +public function __construct(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection $entitiesCollection); ``` @@ -72,8 +72,8 @@ public function __construct(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\Clas - $classEntityCollection - \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection + $entitiesCollection + \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection - @@ -86,20 +86,20 @@ public function __construct(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\Clas
    ```php -public function getClassEntityCollection(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection; +public function getPhpEntitiesCollection(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; ``` Parameters: not specified -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection
    diff --git a/docs/tech/4.pluginSystem/classes/BasePhpStubberPlugin.md b/docs/tech/4.pluginSystem/classes/BasePhpStubberPlugin.md index 09f32fd4..1b67ebf2 100644 --- a/docs/tech/4.pluginSystem/classes/BasePhpStubberPlugin.md +++ b/docs/tech/4.pluginSystem/classes/BasePhpStubberPlugin.md @@ -30,7 +30,7 @@ final class BasePhpStubberPlugin implements \BumbleDocGen\Core\Plugin\PluginInte getSubscribedEvents
  • - onCheckIsClassEntityCanBeLoad + onCheckIsEntityCanBeLoaded
  • onGettingResourceLink @@ -69,13 +69,13 @@ public static function getSubscribedEvents(): array;
      -
    • # - onCheckIsClassEntityCanBeLoad +
    • # + onCheckIsEntityCanBeLoaded | source code
    ```php -public function onCheckIsClassEntityCanBeLoad(\BumbleDocGen\LanguageHandler\Php\Plugin\Event\Entity\OnCheckIsClassEntityCanBeLoad $event): void; +public function onCheckIsEntityCanBeLoaded(\BumbleDocGen\LanguageHandler\Php\Plugin\Event\Entity\OnCheckIsEntityCanBeLoaded $event): void; ``` @@ -93,7 +93,7 @@ public function onCheckIsClassEntityCanBeLoad(\BumbleDocGen\LanguageHandler\Php\ $event - \BumbleDocGen\LanguageHandler\Php\Plugin\Event\Entity\OnCheckIsClassEntityCanBeLoad + \BumbleDocGen\LanguageHandler\Php\Plugin\Event\Entity\OnCheckIsEntityCanBeLoaded - diff --git a/docs/tech/4.pluginSystem/classes/OnAddClassEntityToCollection.md b/docs/tech/4.pluginSystem/classes/OnAddClassEntityToCollection.md index 33448bd1..80e0d3d9 100644 --- a/docs/tech/4.pluginSystem/classes/OnAddClassEntityToCollection.md +++ b/docs/tech/4.pluginSystem/classes/OnAddClassEntityToCollection.md @@ -61,7 +61,7 @@ final class OnAddClassEntityToCollection extends \Symfony\Contracts\EventDispatc ```php -public function __construct(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity $classEntity, \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection $classEntityCollection); +public function __construct(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity $classEntity, \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection $entitiesCollection); ``` @@ -79,12 +79,12 @@ public function __construct(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\Clas $classEntity - \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity + \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - - $classEntityCollection - \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection + $entitiesCollection + \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection - @@ -103,14 +103,14 @@ public function __construct(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\Clas ```php -public function getClassEntityCollection(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection; +public function getClassEntityCollection(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; ``` Parameters: not specified -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection
    @@ -124,14 +124,14 @@ public function getClassEntityCollection(): \BumbleDocGen\LanguageHandler\Php\Pa ```php -public function getRootEntity(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity; +public function getRootEntity(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; ``` Parameters: not specified -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity diff --git a/docs/tech/4.pluginSystem/classes/OnCheckIsClassEntityCanBeLoad.md b/docs/tech/4.pluginSystem/classes/OnCheckIsEntityCanBeLoaded.md similarity index 61% rename from docs/tech/4.pluginSystem/classes/OnCheckIsClassEntityCanBeLoad.md rename to docs/tech/4.pluginSystem/classes/OnCheckIsEntityCanBeLoaded.md index 447ec34d..c322fe3d 100644 --- a/docs/tech/4.pluginSystem/classes/OnCheckIsClassEntityCanBeLoad.md +++ b/docs/tech/4.pluginSystem/classes/OnCheckIsEntityCanBeLoaded.md @@ -1,8 +1,8 @@ - BumbleDocGen / Technical description of the project / Plugin system / OnCheckIsClassEntityCanBeLoad
    + BumbleDocGen / Technical description of the project / Plugin system / OnCheckIsEntityCanBeLoaded

    - OnCheckIsClassEntityCanBeLoad class: + OnCheckIsEntityCanBeLoaded class:

    @@ -12,7 +12,7 @@ ```php namespace BumbleDocGen\LanguageHandler\Php\Plugin\Event\Entity; -final class OnCheckIsClassEntityCanBeLoad extends \Symfony\Contracts\EventDispatcher\Event +final class OnCheckIsEntityCanBeLoaded extends \Symfony\Contracts\EventDispatcher\Event ``` @@ -34,13 +34,13 @@ final class OnCheckIsClassEntityCanBeLoad extends \Symfony\Contracts\EventDispat
    1. - disableClassLoading + disableEntityLoading
    2. getEntity
    3. - isClassCanBeLoad + isEntityCanBeLoaded
    @@ -50,7 +50,7 @@ final class OnCheckIsClassEntityCanBeLoad extends \Symfony\Contracts\EventDispat
    1. - classCanBeLoad
    2. + isEntityCanBeLoaded
    @@ -58,11 +58,11 @@ final class OnCheckIsClassEntityCanBeLoad extends \Symfony\Contracts\EventDispat

    Property details:

    -* # - $classCanBeLoad - **|** source code +* # + $isEntityCanBeLoaded + **|** source code ```php -public bool $classCanBeLoad; +public bool $isEntityCanBeLoaded; ``` @@ -76,11 +76,11 @@ public bool $classCanBeLoad; ```php -public function __construct(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity $entity); +public function __construct(\BumbleDocGen\Core\Parser\Entity\RootEntityInterface $entity); ``` @@ -98,7 +98,7 @@ public function __construct(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\Clas $entity - \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity + \BumbleDocGen\Core\Parser\Entity\RootEntityInterface - @@ -111,13 +111,13 @@ public function __construct(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\Clas
    ```php -public function disableClassLoading(): void; +public function disableEntityLoading(): void; ``` @@ -134,18 +134,18 @@ public function disableClassLoading(): void; ```php -public function getEntity(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity; +public function getEntity(): \BumbleDocGen\Core\Parser\Entity\RootEntityInterface; ``` Parameters: not specified -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity +Return value: \BumbleDocGen\Core\Parser\Entity\RootEntityInterface
    @@ -153,13 +153,13 @@ public function getEntity(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Cla
    ```php -public function isClassCanBeLoad(): bool; +public function isEntityCanBeLoaded(): bool; ``` diff --git a/docs/tech/4.pluginSystem/classes/PhpDocumentorStubberPlugin.md b/docs/tech/4.pluginSystem/classes/PhpDocumentorStubberPlugin.md index 1b573e1e..e8daf4f2 100644 --- a/docs/tech/4.pluginSystem/classes/PhpDocumentorStubberPlugin.md +++ b/docs/tech/4.pluginSystem/classes/PhpDocumentorStubberPlugin.md @@ -30,7 +30,7 @@ final class PhpDocumentorStubberPlugin implements \BumbleDocGen\Core\Plugin\Plug getSubscribedEvents
  • - onCheckIsClassEntityCanBeLoad + onCheckIsEntityCanBeLoaded
  • onGettingResourceLink @@ -69,13 +69,13 @@ public static function getSubscribedEvents(): array;
      -
    • # - onCheckIsClassEntityCanBeLoad +
    • # + onCheckIsEntityCanBeLoaded | source code
    ```php -public function onCheckIsClassEntityCanBeLoad(\BumbleDocGen\LanguageHandler\Php\Plugin\Event\Entity\OnCheckIsClassEntityCanBeLoad $event): void; +public function onCheckIsEntityCanBeLoaded(\BumbleDocGen\LanguageHandler\Php\Plugin\Event\Entity\OnCheckIsEntityCanBeLoaded $event): void; ``` @@ -93,7 +93,7 @@ public function onCheckIsClassEntityCanBeLoad(\BumbleDocGen\LanguageHandler\Php\ $event - \BumbleDocGen\LanguageHandler\Php\Plugin\Event\Entity\OnCheckIsClassEntityCanBeLoad + \BumbleDocGen\LanguageHandler\Php\Plugin\Event\Entity\OnCheckIsEntityCanBeLoaded - diff --git a/docs/tech/4.pluginSystem/classes/PhpUnitStubberPlugin.md b/docs/tech/4.pluginSystem/classes/PhpUnitStubberPlugin.md index abae1a49..a8f98010 100644 --- a/docs/tech/4.pluginSystem/classes/PhpUnitStubberPlugin.md +++ b/docs/tech/4.pluginSystem/classes/PhpUnitStubberPlugin.md @@ -30,7 +30,7 @@ final class PhpUnitStubberPlugin implements \BumbleDocGen\Core\Plugin\PluginInte getSubscribedEvents
  • - onCheckIsClassEntityCanBeLoad + onCheckIsEntityCanBeLoaded
  • onGettingResourceLink @@ -69,13 +69,13 @@ public static function getSubscribedEvents(): array;
      -
    • # - onCheckIsClassEntityCanBeLoad +
    • # + onCheckIsEntityCanBeLoaded | source code
    ```php -public function onCheckIsClassEntityCanBeLoad(\BumbleDocGen\LanguageHandler\Php\Plugin\Event\Entity\OnCheckIsClassEntityCanBeLoad $event): void; +public function onCheckIsEntityCanBeLoaded(\BumbleDocGen\LanguageHandler\Php\Plugin\Event\Entity\OnCheckIsEntityCanBeLoaded $event): void; ``` @@ -93,7 +93,7 @@ public function onCheckIsClassEntityCanBeLoad(\BumbleDocGen\LanguageHandler\Php\ $event - \BumbleDocGen\LanguageHandler\Php\Plugin\Event\Entity\OnCheckIsClassEntityCanBeLoad + \BumbleDocGen\LanguageHandler\Php\Plugin\Event\Entity\OnCheckIsEntityCanBeLoaded - diff --git a/docs/tech/4.pluginSystem/classes/StubberPlugin.md b/docs/tech/4.pluginSystem/classes/StubberPlugin.md index 1c845b77..f3710d17 100644 --- a/docs/tech/4.pluginSystem/classes/StubberPlugin.md +++ b/docs/tech/4.pluginSystem/classes/StubberPlugin.md @@ -37,7 +37,7 @@ final class StubberPlugin implements \BumbleDocGen\Core\Plugin\PluginInterface, getSubscribedEvents
  • - onCheckIsClassEntityCanBeLoad + onCheckIsEntityCanBeLoaded
  • onGettingResourceLink @@ -113,13 +113,13 @@ public static function getSubscribedEvents(): array;
      -
    • # - onCheckIsClassEntityCanBeLoad +
    • # + onCheckIsEntityCanBeLoaded | source code
    ```php -public function onCheckIsClassEntityCanBeLoad(\BumbleDocGen\LanguageHandler\Php\Plugin\Event\Entity\OnCheckIsClassEntityCanBeLoad $event): void; +public function onCheckIsEntityCanBeLoaded(\BumbleDocGen\LanguageHandler\Php\Plugin\Event\Entity\OnCheckIsEntityCanBeLoaded $event): void; ``` @@ -137,7 +137,7 @@ public function onCheckIsClassEntityCanBeLoad(\BumbleDocGen\LanguageHandler\Php\ $event - \BumbleDocGen\LanguageHandler\Php\Plugin\Event\Entity\OnCheckIsClassEntityCanBeLoad + \BumbleDocGen\LanguageHandler\Php\Plugin\Event\Entity\OnCheckIsEntityCanBeLoaded - diff --git a/docs/tech/4.pluginSystem/readme.md b/docs/tech/4.pluginSystem/readme.md index f550cfc7..526b5685 100644 --- a/docs/tech/4.pluginSystem/readme.md +++ b/docs/tech/4.pluginSystem/readme.md @@ -95,7 +95,7 @@ Plugins for any programming languages work regardless of which language handler Adding links to type documentation and documentation of built-in PHP classes @@ -106,7 +106,7 @@ Plugins for any programming languages work regardless of which language handler Adding links to the documentation of PHP classes in the \phpDocumentor namespace @@ -117,7 +117,7 @@ Plugins for any programming languages work regardless of which language handler Adding links to the documentation of PHP classes in the \PHPUnit namespace @@ -128,7 +128,7 @@ Plugins for any programming languages work regardless of which language handler The plugin allows you to automatically provide links to github repositories for documented classes from libraries included in composer @@ -151,7 +151,7 @@ in a separate directory structure, so they are not duplicated.

    Default events

    - +

    Adding a new plugin

    @@ -190,4 +190,4 @@ plugins:

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Mon Nov 13 19:35:15 2023 +0300
    Page content update date: Tue Nov 14 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Mon Nov 20 23:05:39 2023 +0300
    Page content update date: Fri Dec 15 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file diff --git a/docs/tech/classes/AfterLoadingClassEntityCollection.md b/docs/tech/classes/AfterLoadingPhpEntitiesCollection.md similarity index 60% rename from docs/tech/classes/AfterLoadingClassEntityCollection.md rename to docs/tech/classes/AfterLoadingPhpEntitiesCollection.md index 3feb3a5d..111f85c2 100644 --- a/docs/tech/classes/AfterLoadingClassEntityCollection.md +++ b/docs/tech/classes/AfterLoadingPhpEntitiesCollection.md @@ -1,8 +1,8 @@ - BumbleDocGen / Technical description of the project / Class map / AfterLoadingClassEntityCollection
    + BumbleDocGen / Technical description of the project / Class map / AfterLoadingPhpEntitiesCollection

    - AfterLoadingClassEntityCollection class: + AfterLoadingPhpEntitiesCollection class:

    @@ -12,10 +12,10 @@ ```php namespace BumbleDocGen\LanguageHandler\Php\Plugin\Event\Parser; -final class AfterLoadingClassEntityCollection extends \Symfony\Contracts\EventDispatcher\Event +final class AfterLoadingPhpEntitiesCollection extends \Symfony\Contracts\EventDispatcher\Event ``` -
    The event is called after the initial creation of a collection of class entities
    +
    The event is called after the initial creation of a collection of PHP entities
    @@ -34,7 +34,7 @@ final class AfterLoadingClassEntityCollection extends \Symfony\Contracts\EventDi
    1. - getClassEntityCollection + getPhpEntitiesCollection
    @@ -51,11 +51,11 @@ final class AfterLoadingClassEntityCollection extends \Symfony\Contracts\EventDi ```php -public function __construct(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection $classEntityCollection); +public function __construct(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection $entitiesCollection); ``` @@ -72,8 +72,8 @@ public function __construct(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\Clas - $classEntityCollection - \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection + $entitiesCollection + \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection - @@ -86,20 +86,20 @@ public function __construct(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\Clas
    ```php -public function getClassEntityCollection(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection; +public function getPhpEntitiesCollection(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; ``` Parameters: not specified -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection
    diff --git a/docs/tech/classes/BaseEntity.md b/docs/tech/classes/BaseEntity.md index 234383d1..c79c1c85 100644 --- a/docs/tech/classes/BaseEntity.md +++ b/docs/tech/classes/BaseEntity.md @@ -2,7 +2,7 @@ BumbleDocGen / Technical description of the project / Class map / BaseEntity

    - BaseEntity class: + BaseEntity class:

    @@ -26,15 +26,12 @@ abstract class BaseEntity implements \BumbleDocGen\Core\Parser\Entity\Cache\Cach

    Methods:

      -
    1. - entityCacheIsOutdated -
    2. getAbsoluteFileName - Returns the absolute path to a file if it can be retrieved and if the file is in the project directory
    3. getAst -
    4. + - Get AST for this entity
    5. getCacheKey
    6. @@ -46,85 +43,91 @@ abstract class BaseEntity implements \BumbleDocGen\Core\Parser\Entity\Cache\Cach
    7. getDescription -
    8. + - Get entity description
    9. getDescriptionLinks - Get parsed links from description and doc blocks `see` and `link`
    10. getDocBlock -
    11. + - Get DocBlock for current entity
    12. getDocComment - Get the doc comment of an entity
    13. getDocCommentEntity -
    14. + - Link to an entity where docBlock is implemented for this entity +
    15. + getDocCommentLine + - Get the code line number where the docBlock of the current entity begins
    16. getDocNote -
    17. + - Get the note annotation value
    18. getExamples - Get parsed examples from `examples` doc block
    19. -
    20. - getFileName - - Returns the relative path to a file if it can be retrieved and if the file is in the project directory
    21. getFileSourceLink
    22. getFirstExample - - Get first example from @examples doc block
    23. + - Get first example from `examples` doc block
    24. getImplementingClass -
    25. + - Get the class like entity in which the current entity was implemented
    26. getName -
    27. + - Full name of the entity
    28. getObjectId - Get entity unique ID
    29. -
    30. - getPhpHandlerSettings -
    31. getRelativeFileName -
    32. + - File name relative to project_root configuration parameter
    33. getRootEntityCollection - - Get parent collection of entities
    34. + - Get the collection of root entities to which this entity belongs
    35. getShortName -
    36. + - Short name of the entity
    37. getStartLine -
    38. + - Get the line number of the beginning of the entity code in a file
    39. getThrows - Get parsed throws from `throws` doc block
    40. - hasDescriptionLinks + getThrowsDocBlockLinks
    41. +
    42. + hasDescriptionLinks + - Checking if an entity has links in its description
    43. hasExamples -
    44. + - Checking if an entity has `example` docBlock
    45. hasThrows -
    46. + - Checking if an entity has `throws` docBlock +
    47. + isApi + - Checking if an entity has `api` docBlock
    48. isDeprecated -
    49. + - Checking if an entity has `deprecated` docBlock +
    50. + isEntityCacheOutdated + - Checking if the entity cache is out of date
    51. isEntityDataCacheOutdated
    52. isEntityFileCanBeLoad -
    53. + - Checking if entity data can be retrieved
    54. isInternal -
    55. + - Checking if an entity has `internal` docBlock
    56. reloadEntityDependenciesCache -
    57. + - Update entity dependency cache
    58. removeEntityValueFromCache
    59. @@ -148,41 +151,10 @@ abstract class BaseEntity implements \BumbleDocGen\Core\Parser\Entity\Cache\Cach
      - - -```php -public function entityCacheIsOutdated(): bool; -``` - - - -Parameters: not specified - -Return value: bool - - -Throws: - - -
      -
      -
      - ```php @@ -210,14 +182,14 @@ public function getAbsoluteFileName(): null|string; ```php public function getAst(): \PhpParser\Node\Stmt; ``` - +
      Get AST for this entity
      Parameters: not specified @@ -238,7 +210,7 @@ public function getAst(): \PhpParser\Node\Stmt; ```php @@ -261,7 +233,7 @@ public function getCacheKey(): string; ```php @@ -280,6 +252,9 @@ public function getCachedEntityDependencies(): array;
    60. \Psr\Cache\InvalidArgumentException
    61. +
    62. + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    63. +
      @@ -289,18 +264,18 @@ public function getCachedEntityDependencies(): array; ```php -public function getCurrentRootEntity(): null|\BumbleDocGen\Core\Parser\Entity\RootEntityInterface; +public function getCurrentRootEntity(): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; ``` Parameters: not specified -Return value: null | \BumbleDocGen\Core\Parser\Entity\RootEntityInterface +Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity @@ -310,20 +285,27 @@ public function getCurrentRootEntity(): null|\BumbleDocGen\Core\Parser\Entity\Ro ```php public function getDescription(): string; ``` - +
      Get entity description
      Parameters: not specified Return value: string +Throws: + +
      @@ -331,7 +313,7 @@ public function getDescription(): string; ```php @@ -362,20 +344,27 @@ public function getDescriptionLinks(): array; ```php public function getDocBlock(): \phpDocumentor\Reflection\DocBlock; ``` - +
      Get DocBlock for current entity
      Parameters: not specified Return value: \phpDocumentor\Reflection\DocBlock +Throws: + +

      @@ -383,7 +372,7 @@ public function getDocBlock(): \phpDocumentor\Reflection\DocBlock; ```php @@ -411,18 +400,18 @@ public function getDocComment(): string; ```php -public function getDocCommentEntity(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\MethodEntity|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\PropertyEntity|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ConstantEntity; +public function getDocCommentEntity(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntity|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntity|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity; ``` - +
      Link to an entity where docBlock is implemented for this entity
      Parameters: not specified -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\MethodEntity | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PropertyEntity | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ConstantEntity +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntity | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntity | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity
      @@ -430,63 +419,84 @@ public function getDocCommentEntity(): \BumbleDocGen\LanguageHandler\Php\Parser\
      ```php -public function getDocNote(): string; +public function getDocCommentLine(): null|int; ``` - +
      Get the code line number where the docBlock of the current entity begins
      Parameters: not specified -Return value: string +Return value: null | int + + +Throws: +

      ```php -public function getExamples(): array; +public function getDocNote(): string; ``` -
      Get parsed examples from `examples` doc block
      +
      Get the note annotation value
      Parameters: not specified -Return value: array +Return value: string + + +Throws: +

      ```php -public function getFileName(): null|string; +public function getExamples(): array; ``` -
      Returns the relative path to a file if it can be retrieved and if the file is in the project directory
      +
      Get parsed examples from `examples` doc block
      Parameters: not specified -Return value: null | string +Return value: array + +Throws: +

      @@ -495,7 +505,7 @@ public function getFileName(): null|string; ```php @@ -540,20 +550,27 @@ public function getFileSourceLink(bool $withLine = true): null|string; ```php public function getFirstExample(): string; ``` -
      Get first example from @examples doc block
      +
      Get first example from `examples` doc block
      Parameters: not specified Return value: string +Throws: + +
      @@ -561,18 +578,18 @@ public function getFirstExample(): string; ```php -public function getImplementingClass(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity; +public function getImplementingClass(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; ``` - +
      Get the class like entity in which the current entity was implemented
      Parameters: not specified -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity
      @@ -582,7 +599,7 @@ public function getImplementingClass(): \BumbleDocGen\LanguageHandler\Php\Parser ```php @@ -591,7 +608,7 @@ public function getImplementingClass(): \BumbleDocGen\LanguageHandler\Php\Parser public function getName(): string; ``` - +
      Full name of the entity
      Parameters: not specified @@ -605,7 +622,7 @@ public function getName(): string; ```php @@ -619,27 +636,6 @@ public function getObjectId(): string; Return value: string - -
      -
      - - - -```php -public function getPhpHandlerSettings(): \BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings; -``` - - - -Parameters: not specified - -Return value: \BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings - -

      @@ -647,27 +643,26 @@ public function getPhpHandlerSettings(): \BumbleDocGen\LanguageHandler\Php\PhpHa ```php public function getRelativeFileName(): null|string; ``` - +
      File name relative to project_root configuration parameter
      Parameters: not specified Return value: null | string -Throws: -

      @@ -675,18 +670,18 @@ public function getRelativeFileName(): null|string; ```php -public function getRootEntityCollection(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection; +public function getRootEntityCollection(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; ``` -
      Get parent collection of entities
      +
      Get the collection of root entities to which this entity belongs
      Parameters: not specified -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection
      @@ -696,7 +691,7 @@ public function getRootEntityCollection(): \BumbleDocGen\LanguageHandler\Php\Par ```php @@ -705,7 +700,7 @@ public function getRootEntityCollection(): \BumbleDocGen\LanguageHandler\Php\Par public function getShortName(): string; ``` - +
      Short name of the entity
      Parameters: not specified @@ -719,14 +714,14 @@ public function getShortName(): string; ```php public function getStartLine(): int; ``` - +
      Get the line number of the beginning of the entity code in a file
      Parameters: not specified @@ -740,7 +735,7 @@ public function getStartLine(): int; ```php @@ -754,6 +749,34 @@ public function getThrows(): array; Return value: array +Throws: + + + +
      +
      + + + +```php +public function getThrowsDocBlockLinks(): array; +``` + + + +Parameters: not specified + +Return value: array + + Throws:

      @@ -817,20 +847,55 @@ public function hasExamples(): bool; ```php public function hasThrows(): bool; ``` +
      Checking if an entity has `throws` docBlock
      + +Parameters: not specified + +Return value: bool + +Throws: + + +
      +
      +
      + + + +```php +public function isApi(): bool; +``` + +
      Checking if an entity has `api` docBlock
      Parameters: not specified Return value: bool +Throws: + +

      @@ -838,14 +903,42 @@ public function hasThrows(): bool; ```php public function isDeprecated(): bool; ``` +
      Checking if an entity has `deprecated` docBlock
      + +Parameters: not specified + +Return value: bool + + +Throws: + + +
      +
      +
      + +
        +
      • # + isEntityCacheOutdated + :warning: Is internal | source code
      • +
      + +```php +public function isEntityCacheOutdated(): bool; +``` +
      Checking if the entity cache is out of date
      Parameters: not specified @@ -859,7 +952,7 @@ public function isDeprecated(): bool; ```php @@ -889,14 +982,14 @@ public function isEntityDataCacheOutdated(): bool; ```php public function isEntityFileCanBeLoad(): bool; ``` - +
      Checking if entity data can be retrieved
      Parameters: not specified @@ -917,20 +1010,27 @@ public function isEntityFileCanBeLoad(): bool; ```php public function isInternal(): bool; ``` - +
      Checking if an entity has `internal` docBlock
      Parameters: not specified Return value: bool +Throws: + +

      @@ -938,27 +1038,20 @@ public function isInternal(): bool; ```php public function reloadEntityDependenciesCache(): array; ``` - +
      Update entity dependency cache
      Parameters: not specified Return value: array -Throws: - -

      @@ -966,7 +1059,7 @@ public function reloadEntityDependenciesCache(): array; ```php @@ -1006,7 +1099,7 @@ public function removeEntityValueFromCache(string $key): void; ```php diff --git a/docs/tech/classes/BasePhpStubberPlugin.md b/docs/tech/classes/BasePhpStubberPlugin.md index 456aaf06..86f43d74 100644 --- a/docs/tech/classes/BasePhpStubberPlugin.md +++ b/docs/tech/classes/BasePhpStubberPlugin.md @@ -30,7 +30,7 @@ final class BasePhpStubberPlugin implements \BumbleDocGen\Core\Plugin\PluginInte getSubscribedEvents
    64. - onCheckIsClassEntityCanBeLoad + onCheckIsEntityCanBeLoaded
    65. onGettingResourceLink @@ -69,13 +69,13 @@ public static function getSubscribedEvents(): array;
        -
      • # - onCheckIsClassEntityCanBeLoad +
      • # + onCheckIsEntityCanBeLoaded | source code
      ```php -public function onCheckIsClassEntityCanBeLoad(\BumbleDocGen\LanguageHandler\Php\Plugin\Event\Entity\OnCheckIsClassEntityCanBeLoad $event): void; +public function onCheckIsEntityCanBeLoaded(\BumbleDocGen\LanguageHandler\Php\Plugin\Event\Entity\OnCheckIsEntityCanBeLoaded $event): void; ``` @@ -93,7 +93,7 @@ public function onCheckIsClassEntityCanBeLoad(\BumbleDocGen\LanguageHandler\Php\ $event - \BumbleDocGen\LanguageHandler\Php\Plugin\Event\Entity\OnCheckIsClassEntityCanBeLoad + \BumbleDocGen\LanguageHandler\Php\Plugin\Event\Entity\OnCheckIsEntityCanBeLoaded - diff --git a/docs/tech/classes/CacheableEntityInterface.md b/docs/tech/classes/CacheableEntityInterface.md index 04d2f117..8860bd51 100644 --- a/docs/tech/classes/CacheableEntityInterface.md +++ b/docs/tech/classes/CacheableEntityInterface.md @@ -2,7 +2,7 @@ BumbleDocGen / Technical description of the project / Class map / CacheableEntityInterface

      - CacheableEntityInterface class: + CacheableEntityInterface class:

      @@ -12,7 +12,7 @@ ```php namespace BumbleDocGen\Core\Parser\Entity\Cache; -interface CacheableEntityInterface +interface CacheableEntityInterface extends \BumbleDocGen\Core\Parser\Entity\EntityInterface ``` @@ -27,26 +27,41 @@ interface CacheableEntityInterface
      1. - entityCacheIsOutdated -
      2. + getAbsoluteFileName + - Returns the absolute path to a file if it can be retrieved and if the file is in the project directory
      3. getCacheKey -
      4. + - Get the cache key +
      5. + getName + - Full name of the entity
      6. getObjectId -
      7. + - Entity object ID +
      8. + getRelativeFileName + - File name relative to project_root configuration parameter
      9. +
      10. + getRootEntityCollection + - Get parent collection of entities
      11. +
      12. + getShortName + - Short name of the entity
      13. +
      14. + isEntityCacheOutdated + - Checking if the entity cache is out of date
      15. isEntityDataCacheOutdated -
      16. + - Checking if the local entity cache is out of date
      17. isEntityFileCanBeLoad -
      18. + - Checking if the current entity file can be loaded
      19. reloadEntityDependenciesCache -
      20. + - Update entity dependency cache
      21. removeNotUsedEntityDataCache -
      22. + - Delete current entity cache that was not used the last time documentation was generated
      @@ -60,20 +75,22 @@ interface CacheableEntityInterface
      ```php -public function entityCacheIsOutdated(): bool; -``` +// Implemented in BumbleDocGen\Core\Parser\Entity\EntityInterface +public function getAbsoluteFileName(): null|string; +``` +
      Returns the absolute path to a file if it can be retrieved and if the file is in the project directory
      Parameters: not specified -Return value: bool +Return value: null | string
      @@ -83,14 +100,37 @@ public function entityCacheIsOutdated(): bool; ```php public function getCacheKey(): string; ``` +
      Get the cache key
      + +Parameters: not specified + +Return value: string + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\Core\Parser\Entity\EntityInterface + +public function getName(): string; +``` +
      Full name of the entity
      Parameters: not specified @@ -104,20 +144,118 @@ public function getCacheKey(): string; ```php +// Implemented in BumbleDocGen\Core\Parser\Entity\EntityInterface + public function getObjectId(): string; ``` +
      Entity object ID
      + +Parameters: not specified + +Return value: string + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\Core\Parser\Entity\EntityInterface + +public function getRelativeFileName(): null|string; +``` + +
      File name relative to project_root configuration parameter
      + +Parameters: not specified + +Return value: null | string + + + +See: + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\Core\Parser\Entity\EntityInterface + +public function getRootEntityCollection(): \BumbleDocGen\Core\Parser\Entity\RootEntityCollection; +``` + +
      Get parent collection of entities
      + +Parameters: not specified + +Return value: \BumbleDocGen\Core\Parser\Entity\RootEntityCollection + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\Core\Parser\Entity\EntityInterface + +public function getShortName(): string; +``` +
      Short name of the entity
      Parameters: not specified Return value: string +
      +
      +
      + +
        +
      • # + isEntityCacheOutdated + :warning: Is internal | source code
      • +
      + +```php +public function isEntityCacheOutdated(): bool; +``` + +
      Checking if the entity cache is out of date
      + +Parameters: not specified + +Return value: bool + +

      @@ -125,14 +263,14 @@ public function getObjectId(): string; ```php public function isEntityDataCacheOutdated(): bool; ``` - +
      Checking if the local entity cache is out of date
      Parameters: not specified @@ -146,14 +284,14 @@ public function isEntityDataCacheOutdated(): bool; ```php public function isEntityFileCanBeLoad(): bool; ``` - +
      Checking if the current entity file can be loaded
      Parameters: not specified @@ -167,14 +305,14 @@ public function isEntityFileCanBeLoad(): bool; ```php public function reloadEntityDependenciesCache(): array; ``` - +
      Update entity dependency cache
      Parameters: not specified @@ -188,14 +326,14 @@ public function reloadEntityDependenciesCache(): array; ```php public function removeNotUsedEntityDataCache(): void; ``` - +
      Delete current entity cache that was not used the last time documentation was generated
      Parameters: not specified diff --git a/docs/tech/classes/CacheableEntityTrait.md b/docs/tech/classes/CacheableEntityTrait.md index 1bf16d86..f6ba520a 100644 --- a/docs/tech/classes/CacheableEntityTrait.md +++ b/docs/tech/classes/CacheableEntityTrait.md @@ -27,10 +27,10 @@ trait CacheableEntityTrait
      1. - entityCacheIsOutdated + getCacheKey
      2. - getCacheKey + isEntityCacheOutdated
      3. isEntityDataCacheOutdated @@ -54,20 +54,20 @@ trait CacheableEntityTrait
        ```php -public function entityCacheIsOutdated(): bool; +public function getCacheKey(): string; ``` Parameters: not specified -Return value: bool +Return value: string
        @@ -75,20 +75,20 @@ public function entityCacheIsOutdated(): bool;
        ```php -public function getCacheKey(): string; +public function isEntityCacheOutdated(): bool; ``` Parameters: not specified -Return value: string +Return value: bool
        @@ -98,7 +98,7 @@ public function getCacheKey(): string; ```php @@ -126,7 +126,7 @@ public function isEntityDataCacheOutdated(): bool; ```php @@ -164,7 +164,7 @@ public function removeEntityValueFromCache(string $key): void; ```php diff --git a/docs/tech/classes/CacheableEntityWrapperTrait.md b/docs/tech/classes/CacheableEntityWrapperTrait.md index e40efbbe..5bd27c12 100644 --- a/docs/tech/classes/CacheableEntityWrapperTrait.md +++ b/docs/tech/classes/CacheableEntityWrapperTrait.md @@ -27,10 +27,10 @@ trait CacheableEntityWrapperTrait
        1. - entityCacheIsOutdated + getCacheKey
        2. - getCacheKey + isEntityCacheOutdated
        3. isEntityDataCacheOutdated @@ -62,22 +62,22 @@ trait CacheableEntityWrapperTrait
          ```php // Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait -public function entityCacheIsOutdated(): bool; +public function getCacheKey(): string; ``` Parameters: not specified -Return value: bool +Return value: string
          @@ -85,22 +85,22 @@ public function entityCacheIsOutdated(): bool;
          ```php // Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait -public function getCacheKey(): string; +public function isEntityCacheOutdated(): bool; ``` Parameters: not specified -Return value: string +Return value: bool
          @@ -110,7 +110,7 @@ public function getCacheKey(): string; ```php @@ -161,7 +161,7 @@ public function isEntityFileCanBeLoad(): bool; ```php @@ -201,7 +201,7 @@ public function removeEntityValueFromCache(string $key): void; ```php diff --git a/docs/tech/classes/CacheablePhpEntityFactory.md b/docs/tech/classes/CacheablePhpEntityFactory.md index 13968e1b..e7c3a40a 100644 --- a/docs/tech/classes/CacheablePhpEntityFactory.md +++ b/docs/tech/classes/CacheablePhpEntityFactory.md @@ -2,7 +2,7 @@ BumbleDocGen / Technical description of the project / Class map / CacheablePhpEntityFactory

          - CacheablePhpEntityFactory class: + CacheablePhpEntityFactory class:

          @@ -34,11 +34,11 @@ final class CacheablePhpEntityFactory
          1. - createClassEntity + createClassConstantEntity
          2. - createConstantEntity -
          3. + createClassLikeEntity + - Create a child entity ClassLikeEntity in which the CacheableMethod attributes will be processed to cache the results of the methods
          4. createDynamicMethodEntity
          5. @@ -48,9 +48,6 @@ final class CacheablePhpEntityFactory
          6. createPropertyEntity
          7. -
          8. - createSubClassEntity -
          @@ -66,11 +63,11 @@ final class CacheablePhpEntityFactory ```php -public function __construct(\BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityWrapperFactory $cacheableEntityWrapperFactory, \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache $localObjectCache, \DI\Container $diContainer); +public function __construct(\BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityWrapperFactory $cacheableEntityWrapperFactory, \BumbleDocGen\LanguageHandler\Php\Parser\ComposerHelper $composerHelper, \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache $localObjectCache, \DI\Container $diContainer); ``` @@ -90,6 +87,11 @@ public function __construct(\BumbleDocGen\Core\Parser\Entity\Cache\CacheableEnti $cacheableEntityWrapperFactory \BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityWrapperFactory - + + + $composerHelper + \BumbleDocGen\LanguageHandler\Php\Parser\ComposerHelper + - $localObjectCache @@ -111,13 +113,13 @@ public function __construct(\BumbleDocGen\Core\Parser\Entity\Cache\CacheableEnti
          ```php -public function createClassEntity(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection $classEntityCollection, string $className, string|null $relativeFileName = null): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity; +public function createClassConstantEntity(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity $classEntity, string $constantName, string $implementingClassName, bool $reloadCache = false): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity; ``` @@ -134,24 +136,29 @@ public function createClassEntity(\BumbleDocGen\LanguageHandler\Php\Parser\Entit - $classEntityCollection - \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection + $classEntity + \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - - $className + $constantName string - - $relativeFileName - string | null + $implementingClassName + string + - + + + $reloadCache + bool - -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity Throws: @@ -169,16 +176,16 @@ public function createClassEntity(\BumbleDocGen\LanguageHandler\Php\Parser\Entit
          ```php -public function createConstantEntity(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity $classEntity, string $constantName, string $implementingClassName, bool $reloadCache = false): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ConstantEntity; +public function createClassLikeEntity(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection $entitiesCollection, string $className, string|null $relativeFileName = null, string|null $entityClassName = null): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; ``` - +
          Create a child entity ClassLikeEntity in which the CacheableMethod attributes will be processed to cache the results of the methods
          Parameters: @@ -192,29 +199,29 @@ public function createConstantEntity(\BumbleDocGen\LanguageHandler\Php\Parser\En - $classEntity - \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity + $entitiesCollection + \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection - - $constantName + $className string - - $implementingClassName - string + $relativeFileName + string | null - - $reloadCache - bool + $entityClassName + string | null - -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ConstantEntity +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity Throws: @@ -225,6 +232,9 @@ public function createConstantEntity(\BumbleDocGen\LanguageHandler\Php\Parser\En
        4. \DI\NotFoundException
        5. +
        6. + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
        7. +
      @@ -234,11 +244,11 @@ public function createConstantEntity(\BumbleDocGen\LanguageHandler\Php\Parser\En ```php -public function createDynamicMethodEntity(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity $classEntity, \phpDocumentor\Reflection\DocBlock\Tags\Method $annotationMethod): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\DynamicMethodEntity; +public function createDynamicMethodEntity(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity $classEntity, \phpDocumentor\Reflection\DocBlock\Tags\Method $annotationMethod): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\DynamicMethodEntity; ``` @@ -256,7 +266,7 @@ public function createDynamicMethodEntity(\BumbleDocGen\LanguageHandler\Php\Pars $classEntity - \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity + \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - @@ -267,7 +277,7 @@ public function createDynamicMethodEntity(\BumbleDocGen\LanguageHandler\Php\Pars -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\DynamicMethodEntity +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\DynamicMethodEntity Throws: @@ -287,11 +297,11 @@ public function createDynamicMethodEntity(\BumbleDocGen\LanguageHandler\Php\Pars ```php -public function createMethodEntity(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity $classEntity, string $methodName, string $implementingClassName): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\MethodEntity; +public function createMethodEntity(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity $classEntity, string $methodName, string $implementingClassName): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntity; ``` @@ -309,7 +319,7 @@ public function createMethodEntity(\BumbleDocGen\LanguageHandler\Php\Parser\Enti $classEntity - \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity + \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - @@ -325,7 +335,7 @@ public function createMethodEntity(\BumbleDocGen\LanguageHandler\Php\Parser\Enti -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\MethodEntity +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntity Throws: @@ -345,11 +355,11 @@ public function createMethodEntity(\BumbleDocGen\LanguageHandler\Php\Parser\Enti ```php -public function createPropertyEntity(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity $classEntity, string $propertyName, string $implementingClassName): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PropertyEntity; +public function createPropertyEntity(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity $classEntity, string $propertyName, string $implementingClassName): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntity; ``` @@ -367,7 +377,7 @@ public function createPropertyEntity(\BumbleDocGen\LanguageHandler\Php\Parser\En $classEntity - \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity + \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - @@ -383,70 +393,7 @@ public function createPropertyEntity(\BumbleDocGen\LanguageHandler\Php\Parser\En -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PropertyEntity - - -Throws: - - -
    66. -
      -
      - - - -```php -public function createSubClassEntity(string $subClassEntity, \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection $classEntityCollection, string $className, string|null $relativeFileName): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity; -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      NameTypeDescription
      $subClassEntitystring-
      $classEntityCollection\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection-
      $classNamestring-
      $relativeFileNamestring | null-
      - -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntity Throws: diff --git a/docs/tech/classes/ConstantEntityCollection.md b/docs/tech/classes/ClassConstantEntitiesCollection.md similarity index 76% rename from docs/tech/classes/ConstantEntityCollection.md rename to docs/tech/classes/ClassConstantEntitiesCollection.md index 0be6a8a7..ebb72e77 100644 --- a/docs/tech/classes/ConstantEntityCollection.md +++ b/docs/tech/classes/ClassConstantEntitiesCollection.md @@ -1,8 +1,8 @@ - BumbleDocGen / Technical description of the project / Class map / ConstantEntityCollection
      + BumbleDocGen / Technical description of the project / Class map / ClassConstantEntitiesCollection

      - ConstantEntityCollection class: + ClassConstantEntitiesCollection class:

      @@ -10,9 +10,9 @@ ```php -namespace BumbleDocGen\LanguageHandler\Php\Parser\Entity; +namespace BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant; -final class ConstantEntityCollection extends \BumbleDocGen\Core\Parser\Entity\BaseEntityCollection implements \IteratorAggregate +final class ClassConstantEntitiesCollection extends \BumbleDocGen\Core\Parser\Entity\BaseEntityCollection implements \IteratorAggregate ``` @@ -72,11 +72,11 @@ final class ConstantEntityCollection extends \BumbleDocGen\Core\Parser\Entity\Ba ```php -public function __construct(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity $classEntity, \BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings $phpHandlerSettings, \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Cache\CacheablePhpEntityFactory $cacheablePhpEntityFactory); +public function __construct(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity $classEntity, \BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings $phpHandlerSettings, \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Cache\CacheablePhpEntityFactory $cacheablePhpEntityFactory); ``` @@ -94,7 +94,7 @@ public function __construct(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\Clas $classEntity - \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity + \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - @@ -119,11 +119,11 @@ public function __construct(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\Clas ```php -public function add(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ConstantEntity $constantEntity, bool $reload = false): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ConstantEntityCollection; +public function add(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity $constantEntity, bool $reload = false): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntitiesCollection; ``` @@ -141,7 +141,7 @@ public function add(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ConstantEnti $constantEntity - \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ConstantEntity + \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity - @@ -152,7 +152,7 @@ public function add(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ConstantEnti -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ConstantEntityCollection +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntitiesCollection
      @@ -162,11 +162,11 @@ public function add(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ConstantEnti ```php -public function get(string $objectName): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ConstantEntity; +public function get(string $objectName): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity; ``` @@ -190,7 +190,7 @@ public function get(string $objectName): null|\BumbleDocGen\LanguageHandler\Php\ -Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ConstantEntity +Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity @@ -286,7 +286,7 @@ public function isEmpty(): bool; ```php @@ -360,11 +360,11 @@ public function remove(string $objectName): void; ```php -public function unsafeGet(string $constantName): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ConstantEntity; +public function unsafeGet(string $constantName): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity; ``` @@ -388,7 +388,7 @@ public function unsafeGet(string $constantName): null|\BumbleDocGen\LanguageHand -Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ConstantEntity +Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity Throws: diff --git a/docs/tech/classes/ConstantEntity.md b/docs/tech/classes/ClassConstantEntity.md similarity index 70% rename from docs/tech/classes/ConstantEntity.md rename to docs/tech/classes/ClassConstantEntity.md index e1045234..a1c42cfb 100644 --- a/docs/tech/classes/ConstantEntity.md +++ b/docs/tech/classes/ClassConstantEntity.md @@ -1,8 +1,8 @@ - BumbleDocGen / Technical description of the project / Class map / ConstantEntity
      + BumbleDocGen / Technical description of the project / Class map / ClassConstantEntity

      - ConstantEntity class: + ClassConstantEntity class:

      @@ -10,9 +10,9 @@ ```php -namespace BumbleDocGen\LanguageHandler\Php\Parser\Entity; +namespace BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant; -class ConstantEntity extends \BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity implements \BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityInterface, \BumbleDocGen\Core\Parser\Entity\EntityInterface +class ClassConstantEntity extends \BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity implements \BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityInterface, \BumbleDocGen\Core\Parser\Entity\EntityInterface ```
      Class constant entity
      @@ -33,15 +33,12 @@ class ConstantEntity extends \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Bas

      Methods:

        -
      1. - entityCacheIsOutdated -
      2. getAbsoluteFileName - Returns the absolute path to a file if it can be retrieved and if the file is in the project directory
      3. getAst -
      4. + - Get AST for this entity
      5. getCacheKey
      6. @@ -53,109 +50,115 @@ class ConstantEntity extends \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Bas
      7. getDescription -
      8. + - Get entity description
      9. getDescriptionLinks - Get parsed links from description and doc blocks `see` and `link`
      10. getDocBlock -
      11. + - Get DocBlock for current entity
      12. getDocComment - Get the doc comment of an entity
      13. getDocCommentEntity -
      14. + - Link to an entity where docBlock is implemented for this entity +
      15. + getDocCommentLine + - Get the code line number where the docBlock of the current entity begins
      16. getDocNote -
      17. + - Get the note annotation value
      18. getEndLine -
      19. + - Get the line number of the end of a constant's code in a file
      20. getExamples - Get parsed examples from `examples` doc block
      21. -
      22. - getFileName -
      23. getFileSourceLink
      24. getFirstExample - - Get first example from @examples doc block
      25. + - Get first example from `examples` doc block
      26. getImplementingClass -
      27. + - Get the class like entity in which the current entity was implemented
      28. getImplementingClassName
      29. getName -
      30. + - Constant name
      31. getNamespaceName -
      32. + - Get the name of the namespace where the current class is implemented
      33. getObjectId - Get entity unique ID
      34. -
      35. - getPhpHandlerSettings -
      36. getRelativeFileName -
      37. + - File name relative to project_root configuration parameter
      38. getRootEntity -
      39. + - Get the class like entity where this constant was obtained
      40. getRootEntityCollection - - Get parent collection of entities
      41. + - Get the collection of root entities to which this entity belongs
      42. getShortName -
      43. + - Constant short name
      44. getStartLine -
      45. + - Get the line number of the beginning of the constant code in a file
      46. getThrows - Get parsed throws from `throws` doc block
      47. - getValue + getThrowsDocBlockLinks
      48. +
      49. + getValue + - Get the compiled value of a constant
      50. hasDescriptionLinks -
      51. + - Checking if an entity has links in its description
      52. hasExamples -
      53. + - Checking if an entity has `example` docBlock
      54. hasThrows -
      55. + - Checking if an entity has `throws` docBlock +
      56. + isApi + - Checking if an entity has `api` docBlock
      57. isDeprecated -
      58. + - Checking if an entity has `deprecated` docBlock +
      59. + isEntityCacheOutdated + - Checking if the entity cache is out of date
      60. isEntityDataCacheOutdated
      61. isEntityFileCanBeLoad -
      62. + - Checking if entity data can be retrieved
      63. isInternal -
      64. + - Checking if an entity has `internal` docBlock
      65. isPrivate -
      66. + - Check if a constant is a private constant
      67. isProtected -
      68. + - Check if a constant is a protected constant
      69. isPublic -
      70. + - Check if a constant is a public constant
      71. reloadEntityDependenciesCache -
      72. + - Update entity dependency cache
      73. removeEntityValueFromCache
      74. @@ -169,19 +172,19 @@ class ConstantEntity extends \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Bas @@ -196,11 +199,11 @@ class ConstantEntity extends \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Bas ```php -public function __construct(\BumbleDocGen\Core\Configuration\Configuration $configuration, \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity $classEntity, \BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper $parserHelper, \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache $localObjectCache, \Psr\Log\LoggerInterface $logger, string $constantName, string $implementingClassName); +public function __construct(\BumbleDocGen\Core\Configuration\Configuration $configuration, \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity $classEntity, \BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper $parserHelper, \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache $localObjectCache, \Psr\Log\LoggerInterface $logger, string $constantName, string $implementingClassName); ``` @@ -223,7 +226,7 @@ public function __construct(\BumbleDocGen\Core\Configuration\Configuration $conf $classEntity - \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity + \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - @@ -256,39 +259,6 @@ public function __construct(\BumbleDocGen\Core\Configuration\Configuration $conf - -
        -
        - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function entityCacheIsOutdated(): bool; -``` - - - -Parameters: not specified - -Return value: bool - - -Throws: - -

        @@ -296,7 +266,7 @@ public function entityCacheIsOutdated(): bool; ```php @@ -326,14 +296,14 @@ public function getAbsoluteFileName(): null|string; ```php public function getAst(): \PhpParser\Node\Stmt\ClassConst; ``` - +
        Get AST for this entity
        Parameters: not specified @@ -354,7 +324,7 @@ public function getAst(): \PhpParser\Node\Stmt\ClassConst; ```php @@ -377,7 +347,7 @@ public function getCacheKey(): string; ```php @@ -398,6 +368,9 @@ public function getCachedEntityDependencies(): array;
      75. \Psr\Cache\InvalidArgumentException
      76. +
      77. + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
      78. +
        @@ -407,20 +380,20 @@ public function getCachedEntityDependencies(): array; ```php // Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity -public function getCurrentRootEntity(): null|\BumbleDocGen\Core\Parser\Entity\RootEntityInterface; +public function getCurrentRootEntity(): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; ``` Parameters: not specified -Return value: null | \BumbleDocGen\Core\Parser\Entity\RootEntityInterface +Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity @@ -430,14 +403,16 @@ public function getCurrentRootEntity(): null|\BumbleDocGen\Core\Parser\Entity\Ro ```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + public function getDescription(): string; ``` - +
        Get entity description
        Parameters: not specified @@ -458,7 +433,7 @@ public function getDescription(): string; ```php @@ -491,14 +466,16 @@ public function getDescriptionLinks(): array; ```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + public function getDocBlock(): \phpDocumentor\Reflection\DocBlock; ``` - +
        Get DocBlock for current entity
        Parameters: not specified @@ -519,7 +496,7 @@ public function getDocBlock(): \phpDocumentor\Reflection\DocBlock; ```php @@ -549,19 +526,49 @@ public function getDocComment(): string; ```php -public function getDocCommentEntity(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ConstantEntity; +public function getDocCommentEntity(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity; ``` +
        Link to an entity where docBlock is implemented for this entity
        + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity + + + +
        +
        + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDocCommentLine(): null|int; +``` + +
        Get the code line number where the docBlock of the current entity begins
        Parameters: not specified -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ConstantEntity +Return value: null | int + +Throws: +

        @@ -570,7 +577,7 @@ public function getDocCommentEntity(): \BumbleDocGen\LanguageHandler\Php\Parser\ ```php @@ -579,13 +586,20 @@ public function getDocCommentEntity(): \BumbleDocGen\LanguageHandler\Php\Parser\ public function getDocNote(): string; ``` - +
        Get the note annotation value
        Parameters: not specified Return value: string +Throws: + +
        @@ -593,14 +607,14 @@ public function getDocNote(): string; ```php public function getEndLine(): int; ``` - +
        Get the line number of the end of a constant's code in a file
        Parameters: not specified @@ -621,7 +635,7 @@ public function getEndLine(): int; ```php @@ -637,27 +651,6 @@ public function getExamples(): array; Return value: array -
        -
        -
        - - - -```php -public function getFileName(): null|string; -``` - - - -Parameters: not specified - -Return value: null | string - - Throws:
        • @@ -672,7 +665,7 @@ public function getFileName(): null|string; ```php @@ -719,7 +712,7 @@ public function getFileSourceLink(bool $withLine = true): null|string; ```php @@ -728,13 +721,20 @@ public function getFileSourceLink(bool $withLine = true): null|string; public function getFirstExample(): string; ``` -
          Get first example from @examples doc block
          +
          Get first example from `examples` doc block
          Parameters: not specified Return value: string +Throws: + +

        @@ -742,18 +742,18 @@ public function getFirstExample(): string; ```php -public function getImplementingClass(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity; +public function getImplementingClass(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; ``` - +
        Get the class like entity in which the current entity was implemented
        Parameters: not specified -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity
        @@ -763,7 +763,7 @@ public function getImplementingClass(): \BumbleDocGen\LanguageHandler\Php\Parser ```php @@ -784,14 +784,14 @@ public function getImplementingClassName(): string; ```php public function getName(): string; ``` - +
        Constant name
        Parameters: not specified @@ -805,27 +805,20 @@ public function getName(): string; ```php public function getNamespaceName(): string; ``` - +
        Get the name of the namespace where the current class is implemented
        Parameters: not specified Return value: string -Throws: - -
        @@ -833,7 +826,7 @@ public function getNamespaceName(): string; ```php @@ -849,27 +842,6 @@ public function getObjectId(): string; Return value: string -
        -
        -
        - - - -```php -public function getPhpHandlerSettings(): \BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings; -``` - - - -Parameters: not specified - -Return value: \BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings - -

        @@ -877,7 +849,7 @@ public function getPhpHandlerSettings(): \BumbleDocGen\LanguageHandler\Php\PhpHa ```php @@ -886,20 +858,19 @@ public function getPhpHandlerSettings(): \BumbleDocGen\LanguageHandler\Php\PhpHa public function getRelativeFileName(): null|string; ``` - +
        File name relative to project_root configuration parameter
        Parameters: not specified Return value: null | string -Throws: -

        @@ -907,18 +878,18 @@ public function getRelativeFileName(): null|string; ```php -public function getRootEntity(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity; +public function getRootEntity(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; ``` - +
        Get the class like entity where this constant was obtained
        Parameters: not specified -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity
        @@ -928,18 +899,18 @@ public function getRootEntity(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity ```php -public function getRootEntityCollection(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection; +public function getRootEntityCollection(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; ``` -
        Get parent collection of entities
        +
        Get the collection of root entities to which this entity belongs
        Parameters: not specified -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection @@ -949,20 +920,26 @@ public function getRootEntityCollection(): \BumbleDocGen\LanguageHandler\Php\Par ```php public function getShortName(): string; ``` - +
        Constant short name
        Parameters: not specified Return value: string + +See: +
        @@ -970,14 +947,14 @@ public function getShortName(): string; ```php public function getStartLine(): int; ``` - +
        Get the line number of the beginning of the constant code in a file
        Parameters: not specified @@ -998,7 +975,7 @@ public function getStartLine(): int; ```php @@ -1014,6 +991,36 @@ public function getThrows(): array; Return value: array +Throws: + + +
        +
        +
        + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getThrowsDocBlockLinks(): array; +``` + + + +Parameters: not specified + +Return value: array + + Throws:
        • @@ -1028,14 +1035,14 @@ public function getThrows(): array; ```php public function getValue(): string|array|int|bool|null|float; ``` - +
          Get the compiled value of a constant
          Parameters: not specified @@ -1059,7 +1066,7 @@ public function getValue(): string|array|int|bool|null|float; ```php @@ -1068,7 +1075,7 @@ public function getValue(): string|array|int|bool|null|float; public function hasDescriptionLinks(): bool; ``` - +
          Checking if an entity has links in its description
          Parameters: not specified @@ -1089,7 +1096,7 @@ public function hasDescriptionLinks(): bool; ```php @@ -1098,13 +1105,20 @@ public function hasDescriptionLinks(): bool; public function hasExamples(): bool; ``` - +
          Checking if an entity has `example` docBlock
          Parameters: not specified Return value: bool +Throws: + +

        @@ -1112,7 +1126,7 @@ public function hasExamples(): bool; ```php @@ -1121,13 +1135,50 @@ public function hasExamples(): bool; public function hasThrows(): bool; ``` +
        Checking if an entity has `throws` docBlock
        + +Parameters: not specified + +Return value: bool +Throws: + + +
        +
        +
        + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function isApi(): bool; +``` + +
        Checking if an entity has `api` docBlock
        + Parameters: not specified Return value: bool +Throws: + +

        @@ -1135,7 +1186,7 @@ public function hasThrows(): bool; ```php @@ -1144,7 +1195,37 @@ public function hasThrows(): bool; public function isDeprecated(): bool; ``` +
        Checking if an entity has `deprecated` docBlock
        + +Parameters: not specified + +Return value: bool + + +Throws: + + +
        +
        +
        + +
          +
        • # + isEntityCacheOutdated + :warning: Is internal | source code
        • +
        + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity +public function isEntityCacheOutdated(): bool; +``` + +
        Checking if the entity cache is out of date
        Parameters: not specified @@ -1158,7 +1239,7 @@ public function isDeprecated(): bool; ```php @@ -1188,7 +1269,7 @@ public function isEntityDataCacheOutdated(): bool; ```php @@ -1197,7 +1278,7 @@ public function isEntityDataCacheOutdated(): bool; public function isEntityFileCanBeLoad(): bool; ``` - +
        Checking if entity data can be retrieved
        Parameters: not specified @@ -1218,7 +1299,7 @@ public function isEntityFileCanBeLoad(): bool; ```php @@ -1227,13 +1308,20 @@ public function isEntityFileCanBeLoad(): bool; public function isInternal(): bool; ``` - +
        Checking if an entity has `internal` docBlock
        Parameters: not specified Return value: bool +Throws: + +

        @@ -1241,14 +1329,14 @@ public function isInternal(): bool; ```php public function isPrivate(): bool; ``` - +
        Check if a constant is a private constant
        Parameters: not specified @@ -1269,14 +1357,14 @@ public function isPrivate(): bool; ```php public function isProtected(): bool; ``` - +
        Check if a constant is a protected constant
        Parameters: not specified @@ -1297,14 +1385,14 @@ public function isProtected(): bool; ```php public function isPublic(): bool; ``` - +
        Check if a constant is a public constant
        Parameters: not specified @@ -1325,7 +1413,7 @@ public function isPublic(): bool; ```php @@ -1334,20 +1422,13 @@ public function isPublic(): bool; public function reloadEntityDependenciesCache(): array; ``` - +
        Update entity dependency cache
        Parameters: not specified Return value: array -Throws: - -

        @@ -1355,7 +1436,7 @@ public function reloadEntityDependenciesCache(): array; ```php @@ -1395,7 +1476,7 @@ public function removeEntityValueFromCache(string $key): void; ```php diff --git a/docs/tech/classes/ClassConstantEntity_2.md b/docs/tech/classes/ClassConstantEntity_2.md new file mode 100644 index 00000000..31b2e171 --- /dev/null +++ b/docs/tech/classes/ClassConstantEntity_2.md @@ -0,0 +1,1505 @@ + + BumbleDocGen / Technical description of the project / ClassConstantEntity
        + +

        + ClassConstantEntity class: +

        + + + + + +```php +namespace BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant; + +class ClassConstantEntity extends \BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity implements \BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityInterface, \BumbleDocGen\Core\Parser\Entity\EntityInterface +``` + +
        Class constant entity
        + + + + + + +

        Initialization methods:

        + +
          +
        1. + __construct +
        2. +
        + +

        Methods:

        + +
          +
        1. + getAbsoluteFileName + - Returns the absolute path to a file if it can be retrieved and if the file is in the project directory
        2. +
        3. + getAst + - Get AST for this entity
        4. +
        5. + getCacheKey +
        6. +
        7. + getCachedEntityDependencies +
        8. +
        9. + getCurrentRootEntity +
        10. +
        11. + getDescription + - Get entity description
        12. +
        13. + getDescriptionLinks + - Get parsed links from description and doc blocks `see` and `link`
        14. +
        15. + getDocBlock + - Get DocBlock for current entity
        16. +
        17. + getDocComment + - Get the doc comment of an entity
        18. +
        19. + getDocCommentEntity + - Link to an entity where docBlock is implemented for this entity
        20. +
        21. + getDocCommentLine + - Get the code line number where the docBlock of the current entity begins
        22. +
        23. + getDocNote + - Get the note annotation value
        24. +
        25. + getEndLine + - Get the line number of the end of a constant's code in a file
        26. +
        27. + getExamples + - Get parsed examples from `examples` doc block
        28. +
        29. + getFileSourceLink +
        30. +
        31. + getFirstExample + - Get first example from `examples` doc block
        32. +
        33. + getImplementingClass + - Get the class like entity in which the current entity was implemented
        34. +
        35. + getImplementingClassName +
        36. +
        37. + getName + - Constant name
        38. +
        39. + getNamespaceName + - Get the name of the namespace where the current class is implemented
        40. +
        41. + getObjectId + - Get entity unique ID
        42. +
        43. + getRelativeFileName + - File name relative to project_root configuration parameter
        44. +
        45. + getRootEntity + - Get the class like entity where this constant was obtained
        46. +
        47. + getRootEntityCollection + - Get the collection of root entities to which this entity belongs
        48. +
        49. + getShortName + - Constant short name
        50. +
        51. + getStartLine + - Get the line number of the beginning of the constant code in a file
        52. +
        53. + getThrows + - Get parsed throws from `throws` doc block
        54. +
        55. + getThrowsDocBlockLinks +
        56. +
        57. + getValue + - Get the compiled value of a constant
        58. +
        59. + hasDescriptionLinks + - Checking if an entity has links in its description
        60. +
        61. + hasExamples + - Checking if an entity has `example` docBlock
        62. +
        63. + hasThrows + - Checking if an entity has `throws` docBlock
        64. +
        65. + isApi + - Checking if an entity has `api` docBlock
        66. +
        67. + isDeprecated + - Checking if an entity has `deprecated` docBlock
        68. +
        69. + isEntityCacheOutdated + - Checking if the entity cache is out of date
        70. +
        71. + isEntityDataCacheOutdated +
        72. +
        73. + isEntityFileCanBeLoad + - Checking if entity data can be retrieved
        74. +
        75. + isInternal + - Checking if an entity has `internal` docBlock
        76. +
        77. + isPrivate + - Check if a constant is a private constant
        78. +
        79. + isProtected + - Check if a constant is a protected constant
        80. +
        81. + isPublic + - Check if a constant is a public constant
        82. +
        83. + reloadEntityDependenciesCache + - Update entity dependency cache
        84. +
        85. + removeEntityValueFromCache +
        86. +
        87. + removeNotUsedEntityDataCache +
        88. +
        + + +

        Constants:

        + + + + + + +

        Method details:

        + +
        + + + +```php +public function __construct(\BumbleDocGen\Core\Configuration\Configuration $configuration, \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity $classEntity, \BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper $parserHelper, \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache $localObjectCache, \Psr\Log\LoggerInterface $logger, string $constantName, string $implementingClassName); +``` + + + +Parameters: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        NameTypeDescription
        $configuration\BumbleDocGen\Core\Configuration\Configuration-
        $classEntity\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity-
        $parserHelper\BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper-
        $localObjectCache\BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache-
        $logger\Psr\Log\LoggerInterface-
        $constantNamestring-
        $implementingClassNamestring-
        + + + +
        +
        +
        + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getAbsoluteFileName(): null|string; +``` + +
        Returns the absolute path to a file if it can be retrieved and if the file is in the project directory
        + +Parameters: not specified + +Return value: null | string + + +Throws: + + +
        +
        +
        + + + +```php +public function getAst(): \PhpParser\Node\Stmt\ClassConst; +``` + +
        Get AST for this entity
        + +Parameters: not specified + +Return value: \PhpParser\Node\Stmt\ClassConst + + +Throws: + + +
        +
        +
        + + + +```php +// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait + +public function getCacheKey(): string; +``` + + + +Parameters: not specified + +Return value: string + + +
        +
        +
        + +
          +
        • # + getCachedEntityDependencies + :warning: Is internal | source code
        • +
        + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getCachedEntityDependencies(): array; +``` + + + +Parameters: not specified + +Return value: array + + +Throws: + + +
        +
        +
        + +
          +
        • # + getCurrentRootEntity + :warning: Is internal | source code
        • +
        + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getCurrentRootEntity(): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; +``` + + + +Parameters: not specified + +Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + + +
        +
        +
        + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDescription(): string; +``` + +
        Get entity description
        + +Parameters: not specified + +Return value: string + + +Throws: + + +
        +
        +
        + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDescriptionLinks(): array; +``` + +
        Get parsed links from description and doc blocks `see` and `link`
        + +Parameters: not specified + +Return value: array + + +Throws: + + +
        +
        +
        + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDocBlock(): \phpDocumentor\Reflection\DocBlock; +``` + +
        Get DocBlock for current entity
        + +Parameters: not specified + +Return value: \phpDocumentor\Reflection\DocBlock + + +Throws: + + +
        +
        +
        + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDocComment(): string; +``` + +
        Get the doc comment of an entity
        + +Parameters: not specified + +Return value: string + + +Throws: + + +
        +
        +
        + +
          +
        • # + getDocCommentEntity + :warning: Is internal | source code
        • +
        + +```php +public function getDocCommentEntity(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity; +``` + +
        Link to an entity where docBlock is implemented for this entity
        + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity + + +
        +
        +
        + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDocCommentLine(): null|int; +``` + +
        Get the code line number where the docBlock of the current entity begins
        + +Parameters: not specified + +Return value: null | int + + +Throws: + + +
        +
        +
        + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDocNote(): string; +``` + +
        Get the note annotation value
        + +Parameters: not specified + +Return value: string + + +Throws: + + +
        +
        +
        + + + +```php +public function getEndLine(): int; +``` + +
        Get the line number of the end of a constant's code in a file
        + +Parameters: not specified + +Return value: int + + +Throws: + + +
        +
        +
        + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getExamples(): array; +``` + +
        Get parsed examples from `examples` doc block
        + +Parameters: not specified + +Return value: array + + +Throws: + + +
        +
        +
        + +
          +
        • # + getFileSourceLink + :warning: Is internal | source code
        • +
        + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getFileSourceLink(bool $withLine = true): null|string; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
        NameTypeDescription
        $withLinebool-
        + +Return value: null | string + + +Throws: + + +
        +
        +
        + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getFirstExample(): string; +``` + +
        Get first example from `examples` doc block
        + +Parameters: not specified + +Return value: string + + +Throws: + + +
        +
        +
        + + + +```php +public function getImplementingClass(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; +``` + +
        Get the class like entity in which the current entity was implemented
        + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + + +
        +
        +
        + + + +```php +public function getImplementingClassName(): string; +``` + + + +Parameters: not specified + +Return value: string + + +
        +
        +
        + + + +```php +public function getName(): string; +``` + +
        Constant name
        + +Parameters: not specified + +Return value: string + + +
        +
        +
        + + + +```php +public function getNamespaceName(): string; +``` + +
        Get the name of the namespace where the current class is implemented
        + +Parameters: not specified + +Return value: string + + +
        +
        +
        + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getObjectId(): string; +``` + +
        Get entity unique ID
        + +Parameters: not specified + +Return value: string + + +
        +
        +
        + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getRelativeFileName(): null|string; +``` + +
        File name relative to project_root configuration parameter
        + +Parameters: not specified + +Return value: null | string + + + +See: + +
        +
        +
        + + + +```php +public function getRootEntity(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; +``` + +
        Get the class like entity where this constant was obtained
        + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + + +
        +
        +
        + + + +```php +public function getRootEntityCollection(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; +``` + +
        Get the collection of root entities to which this entity belongs
        + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection + + +
        +
        +
        + + + +```php +public function getShortName(): string; +``` + +
        Constant short name
        + +Parameters: not specified + +Return value: string + + + +See: + +
        +
        +
        + + + +```php +public function getStartLine(): int; +``` + +
        Get the line number of the beginning of the constant code in a file
        + +Parameters: not specified + +Return value: int + + +Throws: + + +
        +
        +
        + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getThrows(): array; +``` + +
        Get parsed throws from `throws` doc block
        + +Parameters: not specified + +Return value: array + + +Throws: + + +
        +
        +
        + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getThrowsDocBlockLinks(): array; +``` + + + +Parameters: not specified + +Return value: array + + +Throws: + + +
        +
        +
        + + + +```php +public function getValue(): string|array|int|bool|null|float; +``` + +
        Get the compiled value of a constant
        + +Parameters: not specified + +Return value: string | array | int | bool | null | float + + +Throws: + + +
        +
        +
        + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function hasDescriptionLinks(): bool; +``` + +
        Checking if an entity has links in its description
        + +Parameters: not specified + +Return value: bool + + +Throws: + + +
        +
        +
        + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function hasExamples(): bool; +``` + +
        Checking if an entity has `example` docBlock
        + +Parameters: not specified + +Return value: bool + + +Throws: + + +
        +
        +
        + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function hasThrows(): bool; +``` + +
        Checking if an entity has `throws` docBlock
        + +Parameters: not specified + +Return value: bool + + +Throws: + + +
        +
        +
        + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function isApi(): bool; +``` + +
        Checking if an entity has `api` docBlock
        + +Parameters: not specified + +Return value: bool + + +Throws: + + +
        +
        +
        + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function isDeprecated(): bool; +``` + +
        Checking if an entity has `deprecated` docBlock
        + +Parameters: not specified + +Return value: bool + + +Throws: + + +
        +
        +
        + +
          +
        • # + isEntityCacheOutdated + :warning: Is internal | source code
        • +
        + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function isEntityCacheOutdated(): bool; +``` + +
        Checking if the entity cache is out of date
        + +Parameters: not specified + +Return value: bool + + +
        +
        +
        + +
          +
        • # + isEntityDataCacheOutdated + :warning: Is internal | source code
        • +
        + +```php +// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait + +public function isEntityDataCacheOutdated(): bool; +``` + + + +Parameters: not specified + +Return value: bool + + +Throws: + + +
        +
        +
        + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function isEntityFileCanBeLoad(): bool; +``` + +
        Checking if entity data can be retrieved
        + +Parameters: not specified + +Return value: bool + + +Throws: + + +
        +
        +
        + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function isInternal(): bool; +``` + +
        Checking if an entity has `internal` docBlock
        + +Parameters: not specified + +Return value: bool + + +Throws: + + +
        +
        +
        + + + +```php +public function isPrivate(): bool; +``` + +
        Check if a constant is a private constant
        + +Parameters: not specified + +Return value: bool + + +Throws: + + +
        +
        +
        + + + +```php +public function isProtected(): bool; +``` + +
        Check if a constant is a protected constant
        + +Parameters: not specified + +Return value: bool + + +Throws: + + +
        +
        +
        + + + +```php +public function isPublic(): bool; +``` + +
        Check if a constant is a public constant
        + +Parameters: not specified + +Return value: bool + + +Throws: + + +
        +
        +
        + +
          +
        • # + reloadEntityDependenciesCache + :warning: Is internal | source code
        • +
        + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function reloadEntityDependenciesCache(): array; +``` + +
        Update entity dependency cache
        + +Parameters: not specified + +Return value: array + + +
        +
        +
        + +
          +
        • # + removeEntityValueFromCache + :warning: Is internal | source code
        • +
        + +```php +// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait + +public function removeEntityValueFromCache(string $key): void; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
        NameTypeDescription
        $keystring-
        + +Return value: void + + +
        +
        +
        + +
          +
        • # + removeNotUsedEntityDataCache + :warning: Is internal | source code
        • +
        + +```php +// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait + +public function removeNotUsedEntityDataCache(): void; +``` + + + +Parameters: not specified + +Return value: void + + +Throws: + + +
        +
        + + \ No newline at end of file diff --git a/docs/tech/classes/ClassEntity.md b/docs/tech/classes/ClassEntity.md index 76e605cc..b0480a12 100644 --- a/docs/tech/classes/ClassEntity.md +++ b/docs/tech/classes/ClassEntity.md @@ -2,7 +2,7 @@ BumbleDocGen / Technical description of the project / Class map / ClassEntity

        - ClassEntity class: + ClassEntity class:

        @@ -12,10 +12,16 @@ ```php namespace BumbleDocGen\LanguageHandler\Php\Parser\Entity; -class ClassEntity extends \BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity implements \BumbleDocGen\Core\Renderer\Context\DocumentTransformableEntityInterface, \BumbleDocGen\Core\Parser\Entity\RootEntityInterface, \BumbleDocGen\Core\Parser\Entity\EntityInterface, \BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityInterface +class ClassEntity extends \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity implements \BumbleDocGen\Core\Renderer\Context\DocumentTransformableEntityInterface, \BumbleDocGen\Core\Parser\Entity\RootEntityInterface, \BumbleDocGen\Core\Parser\Entity\EntityInterface, \BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityInterface ``` -
        Class entity
        +
        PHP Class
        + +See: + @@ -34,257 +40,266 @@ class ClassEntity extends \BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEn
        1. - cursorToDocAttributeLinkFragment -
        2. -
        3. - documentCreationAllowed -
        4. + addPluginData + - Add information to aт entity object
        5. - entityCacheIsOutdated -
        6. -
        7. - entityDataCanBeLoaded + cursorToDocAttributeLinkFragment
        8. getAbsoluteFileName - Returns the absolute path to a file if it can be retrieved and if the file is in the project directory
        9. getAst -
        10. + - Get AST for this entity
        11. getCacheKey
        12. getCachedEntityDependencies
        13. -
        14. - getCasesNames -
        15. getConstant -
        16. -
        17. - getConstantEntity -
        18. + - Get the method entity by its name
        19. - getConstantEntityCollection -
        20. + getConstantEntitiesCollection + - Get a collection of constant entities
        21. getConstantValue -
        22. + - Get the compiled value of a constant
        23. getConstants -
        24. + - Get all constants that are available according to the configuration as an array
        25. getConstantsData -
        26. + - Get a list of all constants and classes where they are implemented +
        27. + getConstantsValues + - Get class constant compiled values according to filters
        28. getCurrentRootEntity
        29. getDescription -
        30. + - Get entity description
        31. getDescriptionLinks - Get parsed links from description and doc blocks `see` and `link`
        32. getDocBlock -
        33. + - Get DocBlock for current entity
        34. getDocComment - Get the doc comment of an entity
        35. getDocCommentEntity -
        36. + - Link to an entity where docBlock is implemented for this entity +
        37. + getDocCommentLine + - Get the code line number where the docBlock of the current entity begins
        38. getDocNote -
        39. + - Get the note annotation value
        40. getDocRender
        41. getEndLine -
        42. + - Get the line number of the end of a class code in a file
        43. getEntityDependencies
        44. -
        45. - getEnumCaseValue -
        46. -
        47. - getEnumCases -
        48. getExamples - Get parsed examples from `examples` doc block
        49. getFileContent
        50. -
        51. - getFileName - - Returns the relative path to a file if it can be retrieved and if the file is in the project directory
        52. getFileSourceLink
        53. getFirstExample - - Get first example from @examples doc block
        54. -
        55. - getFullFileName -
        56. + - Get first example from `examples` doc block
        57. getImplementingClass -
        58. + - Get the class like entity in which the current entity was implemented
        59. getInterfaceNames -
        60. + - Get a list of class interface names
        61. getInterfacesEntities -
        62. + - Get a list of interface entities that the current class implements
        63. - getMethodEntity -
        64. + getMethod + - Get the method entity by its name
        65. - getMethodEntityCollection -
        66. + getMethodEntitiesCollection + - Get a collection of method entities +
        67. + getMethods + - Get all methods that are available according to the configuration as an array
        68. getMethodsData -
        69. + - Get a list of all methods and classes where they are implemented
        70. getModifiersString -
        71. + - Get entity modifiers as a string
        72. getName -
        73. + - Full name of the entity
        74. getNamespaceName -
        75. + - Get the entity namespace name
        76. getObjectId - Get entity unique ID
        77. getParentClass -
        78. + - Get the entity of the parent class if it exists
        79. getParentClassEntities -
        80. + - Get a list of parent class entities
        81. getParentClassName -
        82. + - Get the name of the parent class entity if it exists
        83. getParentClassNames -
        84. -
        85. - getPhpHandlerSettings -
        86. + - Get a list of entity names of parent classes
        87. getPluginData -
        88. + - Get additional information added using the plugin +
        89. + getProperties + - Get all properties that are available according to the configuration as an array
        90. getPropertiesData -
        91. + - Get a list of all properties and classes where they are implemented
        92. - getPropertyEntity -
        93. + getProperty + - Get the property entity by its name
        94. - getPropertyEntityCollection -
        95. + getPropertyDefaultValue + - Get the compiled value of a property +
        96. + getPropertyEntitiesCollection + - Get a collection of property entities
        97. getRelativeFileName -
        98. + - File name relative to project_root configuration parameter
        99. getRootEntityCollection - - Get parent collection of entities
        100. + - Get the collection of root entities to which this entity belongs
        101. getShortName -
        102. + - Short name of the entity
        103. getStartLine -
        104. + - Get the line number of the start of a class code in a file
        105. getThrows - Get parsed throws from `throws` doc block
        106. - getTraits + getThrowsDocBlockLinks
        107. +
        108. + getTraits + - Get a list of trait entities of the current class
        109. getTraitsNames -
        110. + - Get a list of class traits names
        111. hasConstant -
        112. + - Check if a constant exists in a class
        113. hasDescriptionLinks -
        114. + - Checking if an entity has links in its description
        115. hasExamples -
        116. + - Checking if an entity has `example` docBlock
        117. hasMethod -
        118. + - Check if a method exists in a class
        119. hasParentClass -
        120. + - Check if a certain parent class exists in a chain of parent classes
        121. hasProperty -
        122. + - Check if a property exists in a class
        123. hasThrows -
        124. + - Checking if an entity has `throws` docBlock
        125. hasTraits -
        126. + - Check if the class contains traits
        127. implementsInterface -
        128. + - Check if a class implements an interface
        129. isAbstract -
        130. + - Check that an entity is abstract +
        131. + isApi + - Checking if an entity has `api` docBlock
        132. +
        133. + isAttribute + - Check if a class is an attribute
        134. +
        135. + isClass + - Check if an entity is a Class
        136. isClassLoad
        137. isDeprecated + - Checking if an entity has `deprecated` docBlock
        138. +
        139. + isDocumentCreationAllowed
        140. +
        141. + isEntityCacheOutdated + - Checking if the entity cache is out of date
        142. isEntityDataCacheOutdated
        143. - isEntityFileCanBeLoad + isEntityDataCanBeLoaded
        144. +
        145. + isEntityFileCanBeLoad + - Checking if entity data can be retrieved
        146. isEntityNameValid - - Check if entity name is valid
        147. + - Check if the name is a valid name for ClassLikeEntity
        148. isEnum -
        149. + - Check if an entity is an Enum
        150. isExternalLibraryEntity - - The entity is loaded from a third party library and should not be treated the same as a standard one
        151. + - Check if a given entity is an entity from a third party library (connected via composer)
        152. isInGit - Checking if class file is in git repository
        153. isInstantiable -
        154. + - Check that an entity is instantiable
        155. isInterface -
        156. + - Check if an entity is an Interface
        157. isInternal -
        158. + - Checking if an entity has `internal` docBlock
        159. isSubclassOf -
        160. + - Whether the given class is a subclass of the specified class
        161. isTrait -
        162. + - Check if an entity is a Trait
        163. - loadPluginData + normalizeClassName
        164. reloadEntityDependenciesCache -
        165. + - Update entity dependency cache
        166. removeEntityValueFromCache
        167. @@ -309,11 +324,13 @@ class ClassEntity extends \BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEn ```php -public function __construct(\BumbleDocGen\Core\Configuration\Configuration $configuration, \BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings $phpHandlerSettings, \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection $classEntityCollection, \BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper $parserHelper, \BumbleDocGen\LanguageHandler\Php\Parser\ComposerHelper $composerHelper, \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpParser\PhpParserHelper $phpParserHelper, \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache $localObjectCache, \Psr\Log\LoggerInterface $logger, string $className, string|null $relativeFileName); +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function __construct(\BumbleDocGen\Core\Configuration\Configuration $configuration, \BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings $phpHandlerSettings, \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection $entitiesCollection, \BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper $parserHelper, \BumbleDocGen\LanguageHandler\Php\Parser\ComposerHelper $composerHelper, \BumbleDocGen\LanguageHandler\Php\Parser\PhpParser\PhpParserHelper $phpParserHelper, \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache $localObjectCache, \Psr\Log\LoggerInterface $logger, string $className, string|null $relativeFileName); ``` @@ -340,8 +357,8 @@ public function __construct(\BumbleDocGen\Core\Configuration\Configuration $conf - - $classEntityCollection - \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection + $entitiesCollection + \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection - @@ -356,7 +373,7 @@ public function __construct(\BumbleDocGen\Core\Configuration\Configuration $conf $phpParserHelper - \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpParser\PhpParserHelper + \BumbleDocGen\LanguageHandler\Php\Parser\PhpParser\PhpParserHelper - @@ -389,16 +406,18 @@ public function __construct(\BumbleDocGen\Core\Configuration\Configuration $conf
          ```php -public function cursorToDocAttributeLinkFragment(string $cursor, bool $isForDocument = true): string; -``` +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity +public function addPluginData(string $pluginKey, mixed $data): void; +``` +
          Add information to aт entity object
          Parameters: @@ -412,118 +431,74 @@ public function cursorToDocAttributeLinkFragment(string $cursor, bool $isForDocu - $cursor + $pluginKey string - - $isForDocument - bool + $data + mixed - -Return value: string - - -Throws: - - -
          -
          -
          - - - -```php -public function documentCreationAllowed(): bool; -``` - - - -Parameters: not specified - -Return value: bool - - -Throws: -

            -
          • # - entityCacheIsOutdated - | source code
          • +
          • # + cursorToDocAttributeLinkFragment + :warning: Is internal | source code
          ```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity -public function entityCacheIsOutdated(): bool; +public function cursorToDocAttributeLinkFragment(string $cursor, bool $isForDocument = true): string; ``` -Parameters: not specified +Parameters: -Return value: bool + + + + + + + + + + + + + + + + + + + + +
          NameTypeDescription
          $cursorstring-
          $isForDocumentbool-
          + +Return value: string Throws: - -
          -
          -
          - - - -```php -public function entityDataCanBeLoaded(): bool; -``` - - - -Parameters: not specified - -Return value: bool - + \DI\NotFoundException -Throws: -
          -
          -
          - - - -```php -public function getCasesNames(): array; -``` - - - -Parameters: not specified - -Return value: array - - -Throws: -
          @@ -679,62 +627,16 @@ public function getCasesNames(): array; ```php -public function getConstant(string $name): string|array|int|bool|null|float; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
          NameTypeDescription
          $namestring-
          +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity -Return value: string | array | int | bool | null | float - - -Throws: - - -
        -
        -
        - - - -```php -public function getConstantEntity(string $constantName, bool $unsafe = true): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ConstantEntity; +public function getConstant(string $constantName, bool $unsafe = false): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity; ``` - +
        Get the method entity by its name
        Parameters: @@ -750,17 +652,17 @@ public function getConstantEntity(string $constantName, bool $unsafe = true): nu $constantName string - - + The name of the constant whose entity you want to get $unsafe bool - - + Check all constants, not just the constants allowed in the configuration (@see PhpHandlerSettings::getClassConstantEntityFilter()) -Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ConstantEntity +Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity Throws: @@ -781,20 +683,22 @@ public function getConstantEntity(string $constantName, bool $unsafe = true): nu
        ```php -public function getConstantEntityCollection(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ConstantEntityCollection; -``` +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity +public function getConstantEntitiesCollection(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntitiesCollection; +``` +
        Get a collection of constant entities
        Parameters: not specified -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ConstantEntityCollection +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntitiesCollection Throws: @@ -810,6 +714,12 @@ public function getConstantEntityCollection(): \BumbleDocGen\LanguageHandler\Php + +See: +

        @@ -817,14 +727,16 @@ public function getConstantEntityCollection(): \BumbleDocGen\LanguageHandler\Php ```php -public function getConstantValue(string $name): string|array|int|bool|null|float; -``` +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity +public function getConstantValue(string $constantName): string|array|int|bool|null|float; +``` +
        Get the compiled value of a constant
        Parameters: @@ -838,9 +750,9 @@ public function getConstantValue(string $name): string|array|int|bool|null|float - $name + $constantName string - - + The name of the constant for which you need to get the value @@ -850,9 +762,45 @@ public function getConstantValue(string $name): string|array|int|bool|null|float Throws: + +
        +
        +
        + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getConstants(): array; +``` + +
        Get all constants that are available according to the configuration as an array
        + +Parameters: not specified + +Return value: array + + +Throws: + + +See: +

        ```php -public function getConstants(): array; +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getConstantsData(bool $onlyFromCurrentClassAndTraits = false, int $flags = \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity::VISIBILITY_MODIFIERS_FLAG_ANY): array; ``` +
        Get a list of all constants and classes where they are implemented
        +Parameters: -Parameters: not specified + + + + + + + + + + + + + + + + + + + + +
        NameTypeDescription
        $onlyFromCurrentClassAndTraitsboolGet data only for constants from the current class
        $flagsintGet data only for constants corresponding to the visibility modifiers passed in this value
        Return value: array Throws:
        @@ -906,16 +877,18 @@ public function getConstants(): array;
        ```php -public function getConstantsData(bool $onlyFromCurrentClassAndTraits = false, int $flags = \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ConstantEntity::VISIBILITY_MODIFIERS_FLAG_ANY): array; -``` +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity +public function getConstantsValues(bool $onlyFromCurrentClassAndTraits = false, int $flags = \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity::VISIBILITY_MODIFIERS_FLAG_ANY): array; +``` +
        Get class constant compiled values according to filters
        Parameters: @@ -931,12 +904,12 @@ public function getConstantsData(bool $onlyFromCurrentClassAndTraits = false, in $onlyFromCurrentClassAndTraits bool - - + Get values only for constants from the current class $flags int - - + Get values only for constants corresponding to the visibility modifiers passed in this value @@ -946,9 +919,18 @@ public function getConstantsData(bool $onlyFromCurrentClassAndTraits = false, in Throws:
        @@ -958,20 +940,20 @@ public function getConstantsData(bool $onlyFromCurrentClassAndTraits = false, in ```php // Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity -public function getCurrentRootEntity(): null|\BumbleDocGen\Core\Parser\Entity\RootEntityInterface; +public function getCurrentRootEntity(): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; ``` Parameters: not specified -Return value: null | \BumbleDocGen\Core\Parser\Entity\RootEntityInterface +Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity
        @@ -981,14 +963,16 @@ public function getCurrentRootEntity(): null|\BumbleDocGen\Core\Parser\Entity\Ro ```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + public function getDescription(): string; ``` - +
        Get entity description
        Parameters: not specified @@ -997,12 +981,6 @@ public function getDescription(): string; Throws: - -
        -
        - - - -```php -public function getFileName(): null|string; -``` - -
        Returns the relative path to a file if it can be retrieved and if the file is in the project directory
        - -Parameters: not specified - -Return value: null | string - -

        @@ -1400,7 +1315,7 @@ public function getFileName(): null|string; ```php @@ -1447,7 +1362,7 @@ public function getFileSourceLink(bool $withLine = true): null|string; ```php @@ -1456,34 +1371,13 @@ public function getFileSourceLink(bool $withLine = true): null|string; public function getFirstExample(): string; ``` -
        Get first example from @examples doc block
        +
        Get first example from `examples` doc block
        Parameters: not specified Return value: string -
        -
        -
        - - - -```php -public function getFullFileName(): null|string; -``` - - - -Parameters: not specified - -Return value: null | string - - Throws:
        @@ -1519,14 +1415,16 @@ public function getImplementingClass(): \BumbleDocGen\LanguageHandler\Php\Parser ```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + public function getInterfaceNames(): array; ``` - +
        Get a list of class interface names
        Parameters: not specified @@ -1547,14 +1445,16 @@ public function getInterfaceNames(): array; ```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + public function getInterfacesEntities(): array; ``` - +
        Get a list of interface entities that the current class implements
        Parameters: not specified @@ -1573,16 +1473,18 @@ public function getInterfacesEntities(): array;
        ```php -public function getMethodEntity(string $methodName, bool $unsafe = true): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\MethodEntity; -``` +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity +public function getMethod(string $methodName, bool $unsafe = false): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntity; +``` +
        Get the method entity by its name
        Parameters: @@ -1598,51 +1500,95 @@ public function getMethodEntity(string $methodName, bool $unsafe = true): null|\ $methodName string - - + The name of the method whose entity you want to get $unsafe bool - - + Check all methods, not just the methods allowed in the configuration (@see PhpHandlerSettings::getMethodEntityFilter()) -Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\MethodEntity +Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntity + + +Throws: + + +
        +
        +
        + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getMethodEntitiesCollection(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntitiesCollection; +``` + +
        Get a collection of method entities
        + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntitiesCollection Throws: + +See: +

        ```php -public function getMethodEntityCollection(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\MethodEntityCollection; -``` +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity +public function getMethods(): array; +``` +
        Get all methods that are available according to the configuration as an array
        Parameters: not specified -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\MethodEntityCollection +Return value: array Throws: @@ -1658,6 +1604,14 @@ public function getMethodEntityCollection(): \BumbleDocGen\LanguageHandler\Php\P + +See: +

        @@ -1665,14 +1619,16 @@ public function getMethodEntityCollection(): \BumbleDocGen\LanguageHandler\Php\P ```php -public function getMethodsData(bool $onlyFromCurrentClassAndTraits = false, int $flags = \BumbleDocGen\LanguageHandler\Php\Parser\Entity\MethodEntity::VISIBILITY_MODIFIERS_FLAG_ANY): array; -``` +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity +public function getMethodsData(bool $onlyFromCurrentClassAndTraits = false, int $flags = \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntity::VISIBILITY_MODIFIERS_FLAG_ANY): array; +``` +
        Get a list of all methods and classes where they are implemented
        Parameters: @@ -1688,12 +1644,12 @@ public function getMethodsData(bool $onlyFromCurrentClassAndTraits = false, int $onlyFromCurrentClassAndTraits bool - - + Get data only for methods from the current class $flags int - - + Get data only for methods corresponding to the visibility modifiers passed in this value @@ -1715,27 +1671,20 @@ public function getMethodsData(bool $onlyFromCurrentClassAndTraits = false, int ```php public function getModifiersString(): string; ``` - +
        Get entity modifiers as a string
        Parameters: not specified Return value: string -Throws: - -

        @@ -1743,14 +1692,16 @@ public function getModifiersString(): string; ```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + public function getName(): string; ``` - +
        Full name of the entity
        Parameters: not specified @@ -1764,14 +1715,16 @@ public function getName(): string; ```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + public function getNamespaceName(): string; ``` - +
        Get the entity namespace name
        Parameters: not specified @@ -1785,10 +1738,12 @@ public function getNamespaceName(): string; ```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + public function getObjectId(): string; ``` @@ -1806,26 +1761,19 @@ public function getObjectId(): string; ```php -public function getParentClass(): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity; +public function getParentClass(): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; ``` - +
        Get the entity of the parent class if it exists
        Parameters: not specified -Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity - - -Throws: -

        @@ -1834,27 +1782,22 @@ public function getParentClass(): null|\BumbleDocGen\LanguageHandler\Php\Parser\ ```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + public function getParentClassEntities(): array; ``` - +
        Get a list of parent class entities
        Parameters: not specified Return value: array -Throws: - -
        @@ -1862,27 +1805,20 @@ public function getParentClassEntities(): array; ```php public function getParentClassName(): null|string; ``` - +
        Get the name of the parent class entity if it exists
        Parameters: not specified Return value: null | string -Throws: - -

        @@ -1890,63 +1826,121 @@ public function getParentClassName(): null|string; ```php public function getParentClassNames(): array; ``` - +
        Get a list of entity names of parent classes
        Parameters: not specified Return value: array -Throws: -
        +
        +
        + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getPluginData(string $pluginKey): mixed; +``` + +
        Get additional information added using the plugin
        + +Parameters: + + + + + + + + + + + + + + + + +
        NameTypeDescription
        $pluginKeystring-
        + +Return value: mixed + +

        ```php -public function getPhpHandlerSettings(): \BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings; -``` +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity +public function getProperties(): array; +``` +
        Get all properties that are available according to the configuration as an array
        Parameters: not specified -Return value: \BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings +Return value: array + + +Throws: + +See: +

        ```php -public function getPluginData(string $pluginKey): null|array; -``` +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity +public function getPropertiesData(bool $onlyFromCurrentClassAndTraits = false, int $flags = \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntity::VISIBILITY_MODIFIERS_FLAG_ANY): array; +``` +
        Get a list of all properties and classes where they are implemented
        Parameters: @@ -1960,31 +1954,45 @@ public function getPluginData(string $pluginKey): null|array; - $pluginKey - string - - + $onlyFromCurrentClassAndTraits + bool + Get data only for properties from the current class + + + $flags + int + Get data only for properties corresponding to the visibility modifiers passed in this value -Return value: null | array +Return value: array + + +Throws: +

        ```php -public function getPropertiesData(bool $onlyFromCurrentClassAndTraits = false, int $flags = \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PropertyEntity::VISIBILITY_MODIFIERS_FLAG_ANY): array; -``` +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity +public function getProperty(string $propertyName, bool $unsafe = false): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntity; +``` +
        Get the property entity by its name
        Parameters: @@ -1998,26 +2006,32 @@ public function getPropertiesData(bool $onlyFromCurrentClassAndTraits = false, i - $onlyFromCurrentClassAndTraits - bool - - + $propertyName + string + The name of the property whose entity you want to get - $flags - int - - + $unsafe + bool + Check all properties, not just the properties allowed in the configuration (@see PhpHandlerSettings::getPropertyEntityFilter()) -Return value: array +Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntity Throws:
        @@ -2025,16 +2039,18 @@ public function getPropertiesData(bool $onlyFromCurrentClassAndTraits = false, i
        ```php -public function getPropertyEntity(string $propertyName, bool $unsafe = true): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\PropertyEntity; -``` +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity +public function getPropertyDefaultValue(string $propertyName): string|array|int|bool|null|float; +``` +
        Get the compiled value of a property
        Parameters: @@ -2050,23 +2066,18 @@ public function getPropertyEntity(string $propertyName, bool $unsafe = true): nu $propertyName string - - - - - $unsafe - bool - - + The name of the property for which you need to get the value -Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PropertyEntity +Return value: string | array | int | bool | null | float Throws:
        @@ -2081,20 +2095,22 @@ public function getPropertyEntity(string $propertyName, bool $unsafe = true): nu
        ```php -public function getPropertyEntityCollection(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PropertyEntityCollection; -``` +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity +public function getPropertyEntitiesCollection(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntitiesCollection; +``` +
        Get a collection of property entities
        Parameters: not specified -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PropertyEntityCollection +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntitiesCollection Throws: @@ -2110,6 +2126,12 @@ public function getPropertyEntityCollection(): \BumbleDocGen\LanguageHandler\Php + +See: +

        @@ -2117,44 +2139,28 @@ public function getPropertyEntityCollection(): \BumbleDocGen\LanguageHandler\Php ```php -public function getRelativeFileName(bool $loadIfEmpty = true): null|string; -``` - +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity +public function getRelativeFileName(): null|string; +``` -Parameters: +
        File name relative to project_root configuration parameter
        - - - - - - - - - - - - - - - -
        NameTypeDescription
        $loadIfEmptybool-
        +Parameters: not specified Return value: null | string -Throws: -

        @@ -2162,18 +2168,20 @@ public function getRelativeFileName(bool $loadIfEmpty = true): null|string; ```php -public function getRootEntityCollection(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection; +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getRootEntityCollection(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; ``` -
        Get parent collection of entities
        +
        Get the collection of root entities to which this entity belongs
        Parameters: not specified -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection
        @@ -2183,14 +2191,16 @@ public function getRootEntityCollection(): \BumbleDocGen\LanguageHandler\Php\Par ```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + public function getShortName(): string; ``` - +
        Short name of the entity
        Parameters: not specified @@ -2204,14 +2214,16 @@ public function getShortName(): string; ```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + public function getStartLine(): int; ``` - +
        Get the line number of the start of a class code in a file
        Parameters: not specified @@ -2232,7 +2244,7 @@ public function getStartLine(): int; ```php @@ -2248,6 +2260,36 @@ public function getThrows(): array; Return value: array +Throws: + + + +
        +
        + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getThrowsDocBlockLinks(): array; +``` + + + +Parameters: not specified + +Return value: array + + Throws:
        • @@ -2262,14 +2304,16 @@ public function getThrows(): array; ```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + public function getTraits(): array; ``` - +
          Get a list of trait entities of the current class
          Parameters: not specified @@ -2290,14 +2334,16 @@ public function getTraits(): array; ```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + public function getTraitsNames(): array; ``` - +
          Get a list of class traits names
          Parameters: not specified @@ -2318,14 +2364,16 @@ public function getTraitsNames(): array; ```php -public function hasConstant(string $constantName): bool; -``` +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity +public function hasConstant(string $constantName, bool $unsafe = false): bool; +``` +
          Check if a constant exists in a class
          Parameters: @@ -2341,7 +2389,12 @@ public function hasConstant(string $constantName): bool; $constantName string - - + The name of the class whose entity you want to check + + + $unsafe + bool + Check all constants, not just the constants allowed in the configuration (@see PhpHandlerSettings::getClassConstantEntityFilter()) @@ -2351,6 +2404,12 @@ public function hasConstant(string $constantName): bool; Throws:

        @@ -2416,14 +2482,16 @@ public function hasExamples(): bool; ```php -public function hasMethod(string $method): bool; -``` +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity +public function hasMethod(string $methodName, bool $unsafe = false): bool; +``` +
        Check if a method exists in a class
        Parameters: @@ -2437,9 +2505,14 @@ public function hasMethod(string $method): bool; - $method + $methodName string - - + The name of the method whose entity you want to check + + + $unsafe + bool + Check all methods, not just the methods allowed in the configuration (@see PhpHandlerSettings::getMethodEntityFilter()) @@ -2449,9 +2522,15 @@ public function hasMethod(string $method): bool; Throws:
        @@ -2461,14 +2540,16 @@ public function hasMethod(string $method): bool; ```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + public function hasParentClass(string $parentClassName): bool; ``` - +
        Check if a certain parent class exists in a chain of parent classes
        Parameters: @@ -2484,7 +2565,7 @@ public function hasParentClass(string $parentClassName): bool; $parentClassName string - - + Searched parent class @@ -2492,13 +2573,6 @@ public function hasParentClass(string $parentClassName): bool; Return value: bool -Throws: - -
        @@ -2506,14 +2580,16 @@ public function hasParentClass(string $parentClassName): bool; ```php -public function hasProperty(string $property): bool; -``` +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity +public function hasProperty(string $propertyName, bool $unsafe = false): bool; +``` +
        Check if a property exists in a class
        Parameters: @@ -2527,9 +2603,14 @@ public function hasProperty(string $property): bool; - $property + $propertyName string - - + The name of the property whose entity you want to check + + + $unsafe + bool + Check all properties, not just the properties allowed in the configuration (@see PhpHandlerSettings::getPropertyEntityFilter()) @@ -2539,9 +2620,15 @@ public function hasProperty(string $property): bool; Throws:
        @@ -2551,7 +2638,7 @@ public function hasProperty(string $property): bool; ```php @@ -2560,13 +2647,20 @@ public function hasProperty(string $property): bool; public function hasThrows(): bool; ``` - +
        Checking if an entity has `throws` docBlock
        Parameters: not specified Return value: bool +Throws: + +
        @@ -2574,14 +2668,16 @@ public function hasThrows(): bool; ```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + public function hasTraits(): bool; ``` - +
        Check if the class contains traits
        Parameters: not specified @@ -2602,14 +2698,16 @@ public function hasTraits(): bool; ```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + public function implementsInterface(string $interfaceName): bool; ``` - +
        Check if a class implements an interface
        Parameters: @@ -2625,7 +2723,7 @@ public function implementsInterface(string $interfaceName): bool; $interfaceName string - - + Name of the required interface in the interface chain @@ -2647,14 +2745,65 @@ public function implementsInterface(string $interfaceName): bool; ```php public function isAbstract(): bool; ``` +
        Check that an entity is abstract
        + +Parameters: not specified + +Return value: bool + + +
        +
        +
        + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function isApi(): bool; +``` + +
        Checking if an entity has `api` docBlock
        + +Parameters: not specified + +Return value: bool + + +Throws: + + +
        +
        +
        + + + +```php +public function isAttribute(): bool; +``` +
        Check if a class is an attribute
        Parameters: not specified @@ -2668,6 +2817,27 @@ public function isAbstract(): bool; +
        +
        +
        + + + +```php +public function isClass(): bool; +``` + +
        Check if an entity is a Class
        + +Parameters: not specified + +Return value: bool + +

        @@ -2675,10 +2845,12 @@ public function isAbstract(): bool; ```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + public function isClassLoad(): bool; ``` @@ -2696,7 +2868,7 @@ public function isClassLoad(): bool; ```php @@ -2705,7 +2877,67 @@ public function isClassLoad(): bool; public function isDeprecated(): bool; ``` +
        Checking if an entity has `deprecated` docBlock
        + +Parameters: not specified + +Return value: bool + + +Throws: + + +
        +
        +
        + +
          +
        • # + isDocumentCreationAllowed + :warning: Is internal | source code
        • +
        + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function isDocumentCreationAllowed(): bool; +``` + + + +Parameters: not specified + +Return value: bool + + +Throws: + + +
        +
        +
        + +
          +
        • # + isEntityCacheOutdated + :warning: Is internal | source code
        • +
        + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function isEntityCacheOutdated(): bool; +``` +
        Checking if the entity cache is out of date
        Parameters: not specified @@ -2719,7 +2951,7 @@ public function isDeprecated(): bool; ```php @@ -2746,10 +2978,40 @@ public function isEntityDataCacheOutdated(): bool;
        + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function isEntityDataCanBeLoaded(): bool; +``` + + + +Parameters: not specified + +Return value: bool + + +Throws: + + +
        +
        +
        + ```php @@ -2758,7 +3020,7 @@ public function isEntityDataCacheOutdated(): bool; public function isEntityFileCanBeLoad(): bool; ``` - +
        Checking if entity data can be retrieved
        Parameters: not specified @@ -2779,14 +3041,16 @@ public function isEntityFileCanBeLoad(): bool; ```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + public static function isEntityNameValid(string $entityName): bool; ``` -
        Check if entity name is valid
        +
        Check if the name is a valid name for ClassLikeEntity
        Parameters: @@ -2817,27 +3081,22 @@ public static function isEntityNameValid(string $entityName): bool; ```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + public function isEnum(): bool; ``` - +
        Check if an entity is an Enum
        Parameters: not specified Return value: bool -Throws: - -

        @@ -2845,14 +3104,16 @@ public function isEnum(): bool; ```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + public function isExternalLibraryEntity(): bool; ``` -
        The entity is loaded from a third party library and should not be treated the same as a standard one
        +
        Check if a given entity is an entity from a third party library (connected via composer)
        Parameters: not specified @@ -2866,10 +3127,12 @@ public function isExternalLibraryEntity(): bool; ```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + public function isInGit(): bool; ``` @@ -2887,27 +3150,20 @@ public function isInGit(): bool; ```php public function isInstantiable(): bool; ``` - +
        Check that an entity is instantiable
        Parameters: not specified Return value: bool -Throws: - -

        @@ -2915,27 +3171,22 @@ public function isInstantiable(): bool; ```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + public function isInterface(): bool; ``` - +
        Check if an entity is an Interface
        Parameters: not specified Return value: bool -Throws: - -

        @@ -2943,7 +3194,7 @@ public function isInterface(): bool; ```php @@ -2952,13 +3203,20 @@ public function isInterface(): bool; public function isInternal(): bool; ``` - +
        Checking if an entity has `internal` docBlock
        Parameters: not specified Return value: bool +Throws: + +

        @@ -2966,14 +3224,16 @@ public function isInternal(): bool; ```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + public function isSubclassOf(string $className): bool; ``` - +
        Whether the given class is a subclass of the specified class
        Parameters: @@ -3011,42 +3271,36 @@ public function isSubclassOf(string $className): bool; ```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + public function isTrait(): bool; ``` - +
        Check if an entity is a Trait
        Parameters: not specified Return value: bool -Throws: - -

        ```php -public function loadPluginData(string $pluginKey, array $data): void; +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public static function normalizeClassName(string $name): string; ``` @@ -3063,19 +3317,14 @@ public function loadPluginData(string $pluginKey, array $data): void; - $pluginKey + $name string - - - - $data - array - - -Return value: void +Return value: string
        @@ -3085,7 +3334,7 @@ public function loadPluginData(string $pluginKey, array $data): void; ```php @@ -3094,20 +3343,13 @@ public function loadPluginData(string $pluginKey, array $data): void; public function reloadEntityDependenciesCache(): array; ``` - +
        Update entity dependency cache
        Parameters: not specified Return value: array -Throws: - -

        @@ -3115,7 +3357,7 @@ public function reloadEntityDependenciesCache(): array; ```php @@ -3155,7 +3397,7 @@ public function removeEntityValueFromCache(string $key): void; ```php @@ -3185,10 +3427,12 @@ public function removeNotUsedEntityDataCache(): void; ```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + public function setCustomAst(\PhpParser\Node\Stmt\Trait_|\PhpParser\Node\Stmt\Enum_|\PhpParser\Node\Stmt\Interface_|\PhpParser\Node\Stmt\Class_|null $customAst): void; ``` diff --git a/docs/tech/classes/ClassLikeEntity.md b/docs/tech/classes/ClassLikeEntity.md new file mode 100644 index 00000000..38dac0e3 --- /dev/null +++ b/docs/tech/classes/ClassLikeEntity.md @@ -0,0 +1,3317 @@ + + BumbleDocGen / Technical description of the project / Class map / ClassLikeEntity
        + +

        + ClassLikeEntity class: +

        + + + + + +```php +namespace BumbleDocGen\LanguageHandler\Php\Parser\Entity; + +abstract class ClassLikeEntity extends \BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity implements \BumbleDocGen\Core\Renderer\Context\DocumentTransformableEntityInterface, \BumbleDocGen\Core\Parser\Entity\RootEntityInterface, \BumbleDocGen\Core\Parser\Entity\EntityInterface, \BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityInterface +``` + + + + + + + + +

        Initialization methods:

        + +
          +
        1. + __construct +
        2. +
        + +

        Methods:

        + +
          +
        1. + addPluginData + - Add information to aт entity object
        2. +
        3. + cursorToDocAttributeLinkFragment +
        4. +
        5. + getAbsoluteFileName + - Returns the absolute path to a file if it can be retrieved and if the file is in the project directory
        6. +
        7. + getAst + - Get AST for this entity
        8. +
        9. + getCacheKey +
        10. +
        11. + getCachedEntityDependencies +
        12. +
        13. + getConstant + - Get the method entity by its name
        14. +
        15. + getConstantEntitiesCollection + - Get a collection of constant entities
        16. +
        17. + getConstantValue + - Get the compiled value of a constant
        18. +
        19. + getConstants + - Get all constants that are available according to the configuration as an array
        20. +
        21. + getConstantsData + - Get a list of all constants and classes where they are implemented
        22. +
        23. + getConstantsValues + - Get class constant compiled values according to filters
        24. +
        25. + getCurrentRootEntity +
        26. +
        27. + getDescription + - Get entity description
        28. +
        29. + getDescriptionLinks + - Get parsed links from description and doc blocks `see` and `link`
        30. +
        31. + getDocBlock + - Get DocBlock for current entity
        32. +
        33. + getDocComment + - Get the doc comment of an entity
        34. +
        35. + getDocCommentEntity + - Link to an entity where docBlock is implemented for this entity
        36. +
        37. + getDocCommentLine + - Get the code line number where the docBlock of the current entity begins
        38. +
        39. + getDocNote + - Get the note annotation value
        40. +
        41. + getDocRender +
        42. +
        43. + getEndLine + - Get the line number of the end of a class code in a file
        44. +
        45. + getEntityDependencies +
        46. +
        47. + getExamples + - Get parsed examples from `examples` doc block
        48. +
        49. + getFileContent +
        50. +
        51. + getFileSourceLink +
        52. +
        53. + getFirstExample + - Get first example from `examples` doc block
        54. +
        55. + getImplementingClass + - Get the class like entity in which the current entity was implemented
        56. +
        57. + getInterfaceNames + - Get a list of class interface names
        58. +
        59. + getInterfacesEntities + - Get a list of interface entities that the current class implements
        60. +
        61. + getMethod + - Get the method entity by its name
        62. +
        63. + getMethodEntitiesCollection + - Get a collection of method entities
        64. +
        65. + getMethods + - Get all methods that are available according to the configuration as an array
        66. +
        67. + getMethodsData + - Get a list of all methods and classes where they are implemented
        68. +
        69. + getModifiersString + - Get entity modifiers as a string
        70. +
        71. + getName + - Full name of the entity
        72. +
        73. + getNamespaceName + - Get the entity namespace name
        74. +
        75. + getObjectId + - Get entity unique ID
        76. +
        77. + getParentClass + - Get the entity of the parent class if it exists
        78. +
        79. + getParentClassEntities + - Get a list of parent class entities
        80. +
        81. + getParentClassName + - Get the name of the parent class entity if it exists
        82. +
        83. + getParentClassNames + - Get a list of entity names of parent classes
        84. +
        85. + getPluginData + - Get additional information added using the plugin
        86. +
        87. + getProperties + - Get all properties that are available according to the configuration as an array
        88. +
        89. + getPropertiesData + - Get a list of all properties and classes where they are implemented
        90. +
        91. + getProperty + - Get the property entity by its name
        92. +
        93. + getPropertyDefaultValue + - Get the compiled value of a property
        94. +
        95. + getPropertyEntitiesCollection + - Get a collection of property entities
        96. +
        97. + getRelativeFileName + - File name relative to project_root configuration parameter
        98. +
        99. + getRootEntityCollection + - Get the collection of root entities to which this entity belongs
        100. +
        101. + getShortName + - Short name of the entity
        102. +
        103. + getStartLine + - Get the line number of the start of a class code in a file
        104. +
        105. + getThrows + - Get parsed throws from `throws` doc block
        106. +
        107. + getThrowsDocBlockLinks +
        108. +
        109. + getTraits + - Get a list of trait entities of the current class
        110. +
        111. + getTraitsNames + - Get a list of class traits names
        112. +
        113. + hasConstant + - Check if a constant exists in a class
        114. +
        115. + hasDescriptionLinks + - Checking if an entity has links in its description
        116. +
        117. + hasExamples + - Checking if an entity has `example` docBlock
        118. +
        119. + hasMethod + - Check if a method exists in a class
        120. +
        121. + hasParentClass + - Check if a certain parent class exists in a chain of parent classes
        122. +
        123. + hasProperty + - Check if a property exists in a class
        124. +
        125. + hasThrows + - Checking if an entity has `throws` docBlock
        126. +
        127. + hasTraits + - Check if the class contains traits
        128. +
        129. + implementsInterface + - Check if a class implements an interface
        130. +
        131. + isAbstract + - Check that an entity is abstract
        132. +
        133. + isApi + - Checking if an entity has `api` docBlock
        134. +
        135. + isClass + - Check if an entity is a Class
        136. +
        137. + isClassLoad +
        138. +
        139. + isDeprecated + - Checking if an entity has `deprecated` docBlock
        140. +
        141. + isDocumentCreationAllowed +
        142. +
        143. + isEntityCacheOutdated + - Checking if the entity cache is out of date
        144. +
        145. + isEntityDataCacheOutdated +
        146. +
        147. + isEntityDataCanBeLoaded +
        148. +
        149. + isEntityFileCanBeLoad + - Checking if entity data can be retrieved
        150. +
        151. + isEntityNameValid + - Check if the name is a valid name for ClassLikeEntity
        152. +
        153. + isEnum + - Check if an entity is an Enum
        154. +
        155. + isExternalLibraryEntity + - Check if a given entity is an entity from a third party library (connected via composer)
        156. +
        157. + isInGit + - Checking if class file is in git repository
        158. +
        159. + isInstantiable + - Check that an entity is instantiable
        160. +
        161. + isInterface + - Check if an entity is an Interface
        162. +
        163. + isInternal + - Checking if an entity has `internal` docBlock
        164. +
        165. + isSubclassOf + - Whether the given class is a subclass of the specified class
        166. +
        167. + isTrait + - Check if an entity is a Trait
        168. +
        169. + normalizeClassName +
        170. +
        171. + reloadEntityDependenciesCache + - Update entity dependency cache
        172. +
        173. + removeEntityValueFromCache +
        174. +
        175. + removeNotUsedEntityDataCache +
        176. +
        177. + setCustomAst +
        178. +
        + + + + + + + +

        Method details:

        + +
        + + + +```php +public function __construct(\BumbleDocGen\Core\Configuration\Configuration $configuration, \BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings $phpHandlerSettings, \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection $entitiesCollection, \BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper $parserHelper, \BumbleDocGen\LanguageHandler\Php\Parser\ComposerHelper $composerHelper, \BumbleDocGen\LanguageHandler\Php\Parser\PhpParser\PhpParserHelper $phpParserHelper, \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache $localObjectCache, \Psr\Log\LoggerInterface $logger, string $className, string|null $relativeFileName); +``` + + + +Parameters: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        NameTypeDescription
        $configuration\BumbleDocGen\Core\Configuration\Configuration-
        $phpHandlerSettings\BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings-
        $entitiesCollection\BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection-
        $parserHelper\BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper-
        $composerHelper\BumbleDocGen\LanguageHandler\Php\Parser\ComposerHelper-
        $phpParserHelper\BumbleDocGen\LanguageHandler\Php\Parser\PhpParser\PhpParserHelper-
        $localObjectCache\BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache-
        $logger\Psr\Log\LoggerInterface-
        $classNamestring-
        $relativeFileNamestring | null-
        + + + +
        +
        +
        + + + +```php +public function addPluginData(string $pluginKey, mixed $data): void; +``` + +
        Add information to aт entity object
        + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
        NameTypeDescription
        $pluginKeystring-
        $datamixed-
        + +Return value: void + + +
        +
        +
        + +
          +
        • # + cursorToDocAttributeLinkFragment + :warning: Is internal | source code
        • +
        + +```php +public function cursorToDocAttributeLinkFragment(string $cursor, bool $isForDocument = true): string; +``` + + + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
        NameTypeDescription
        $cursorstring-
        $isForDocumentbool-
        + +Return value: string + + +Throws: + + +
        +
        +
        + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getAbsoluteFileName(): null|string; +``` + +
        Returns the absolute path to a file if it can be retrieved and if the file is in the project directory
        + +Parameters: not specified + +Return value: null | string + + +Throws: + + +
        +
        +
        + + + +```php +public function getAst(): \PhpParser\Node\Stmt\Class_|\PhpParser\Node\Stmt\Interface_|\PhpParser\Node\Stmt\Trait_|\PhpParser\Node\Stmt\Enum_; +``` + +
        Get AST for this entity
        + +Parameters: not specified + +Return value: \PhpParser\Node\Stmt\Class_ | \PhpParser\Node\Stmt\Interface_ | \PhpParser\Node\Stmt\Trait_ | \PhpParser\Node\Stmt\Enum_ + + +Throws: + + +
        +
        +
        + + + +```php +// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait + +public function getCacheKey(): string; +``` + + + +Parameters: not specified + +Return value: string + + +
        +
        +
        + +
          +
        • # + getCachedEntityDependencies + :warning: Is internal | source code
        • +
        + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getCachedEntityDependencies(): array; +``` + + + +Parameters: not specified + +Return value: array + + +Throws: + + +
        +
        +
        + + + +```php +public function getConstant(string $constantName, bool $unsafe = false): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity; +``` + +
        Get the method entity by its name
        + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
        NameTypeDescription
        $constantNamestringThe name of the constant whose entity you want to get
        $unsafeboolCheck all constants, not just the constants allowed in the configuration (@see PhpHandlerSettings::getClassConstantEntityFilter())
        + +Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity + + +Throws: + + +
        +
        +
        + + + +```php +public function getConstantEntitiesCollection(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntitiesCollection; +``` + +
        Get a collection of constant entities
        + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntitiesCollection + + +Throws: + + + +See: + +
        +
        +
        + + + +```php +public function getConstantValue(string $constantName): string|array|int|bool|null|float; +``` + +
        Get the compiled value of a constant
        + +Parameters: + + + + + + + + + + + + + + + + +
        NameTypeDescription
        $constantNamestringThe name of the constant for which you need to get the value
        + +Return value: string | array | int | bool | null | float + + +Throws: + + +
        +
        +
        + + + +```php +public function getConstants(): array; +``` + +
        Get all constants that are available according to the configuration as an array
        + +Parameters: not specified + +Return value: array + + +Throws: + + + +See: + +
        +
        +
        + +
          +
        • # + getConstantsData + :warning: Is internal | source code
        • +
        + +```php +public function getConstantsData(bool $onlyFromCurrentClassAndTraits = false, int $flags = \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity::VISIBILITY_MODIFIERS_FLAG_ANY): array; +``` + +
        Get a list of all constants and classes where they are implemented
        + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
        NameTypeDescription
        $onlyFromCurrentClassAndTraitsboolGet data only for constants from the current class
        $flagsintGet data only for constants corresponding to the visibility modifiers passed in this value
        + +Return value: array + + +Throws: + + +
        +
        +
        + + + +```php +public function getConstantsValues(bool $onlyFromCurrentClassAndTraits = false, int $flags = \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity::VISIBILITY_MODIFIERS_FLAG_ANY): array; +``` + +
        Get class constant compiled values according to filters
        + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
        NameTypeDescription
        $onlyFromCurrentClassAndTraitsboolGet values only for constants from the current class
        $flagsintGet values only for constants corresponding to the visibility modifiers passed in this value
        + +Return value: array + + +Throws: + + +
        +
        +
        + +
          +
        • # + getCurrentRootEntity + :warning: Is internal | source code
        • +
        + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getCurrentRootEntity(): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; +``` + + + +Parameters: not specified + +Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + + +
        +
        +
        + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDescription(): string; +``` + +
        Get entity description
        + +Parameters: not specified + +Return value: string + + +Throws: + + +
        +
        +
        + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDescriptionLinks(): array; +``` + +
        Get parsed links from description and doc blocks `see` and `link`
        + +Parameters: not specified + +Return value: array + + +Throws: + + +
        +
        +
        + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDocBlock(): \phpDocumentor\Reflection\DocBlock; +``` + +
        Get DocBlock for current entity
        + +Parameters: not specified + +Return value: \phpDocumentor\Reflection\DocBlock + + +Throws: + + +
        +
        +
        + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDocComment(): string; +``` + +
        Get the doc comment of an entity
        + +Parameters: not specified + +Return value: string + + +Throws: + + +
        +
        +
        + +
          +
        • # + getDocCommentEntity + :warning: Is internal | source code
        • +
        + +```php +public function getDocCommentEntity(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; +``` + +
        Link to an entity where docBlock is implemented for this entity
        + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + + +
        +
        +
        + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDocCommentLine(): null|int; +``` + +
        Get the code line number where the docBlock of the current entity begins
        + +Parameters: not specified + +Return value: null | int + + +Throws: + + +
        +
        +
        + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDocNote(): string; +``` + +
        Get the note annotation value
        + +Parameters: not specified + +Return value: string + + +Throws: + + +
        +
        +
        + + + +```php +public function getDocRender(): \BumbleDocGen\Core\Renderer\EntityDocRenderer\EntityDocRendererInterface; +``` + + + +Parameters: not specified + +Return value: \BumbleDocGen\Core\Renderer\EntityDocRenderer\EntityDocRendererInterface + + +Throws: + + +
        +
        +
        + + + +```php +public function getEndLine(): int; +``` + +
        Get the line number of the end of a class code in a file
        + +Parameters: not specified + +Return value: int + + +Throws: + + +
        +
        +
        + + + +```php +public function getEntityDependencies(): array; +``` + + + +Parameters: not specified + +Return value: array + + +
        +
        +
        + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getExamples(): array; +``` + +
        Get parsed examples from `examples` doc block
        + +Parameters: not specified + +Return value: array + + +Throws: + + +
        +
        +
        + + + +```php +public function getFileContent(): string; +``` + + + +Parameters: not specified + +Return value: string + + +Throws: + + +
        +
        +
        + +
          +
        • # + getFileSourceLink + :warning: Is internal | source code
        • +
        + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getFileSourceLink(bool $withLine = true): null|string; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
        NameTypeDescription
        $withLinebool-
        + +Return value: null | string + + +Throws: + + +
        +
        +
        + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getFirstExample(): string; +``` + +
        Get first example from `examples` doc block
        + +Parameters: not specified + +Return value: string + + +Throws: + + +
        +
        +
        + + + +```php +public function getImplementingClass(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; +``` + +
        Get the class like entity in which the current entity was implemented
        + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + + +
        +
        +
        + + + +```php +public function getInterfaceNames(): array; +``` + +
        Get a list of class interface names
        + +Parameters: not specified + +Return value: array + + +Throws: + + +
        +
        +
        + + + +```php +public function getInterfacesEntities(): array; +``` + +
        Get a list of interface entities that the current class implements
        + +Parameters: not specified + +Return value: array + + +Throws: + + +
        +
        +
        + + + +```php +public function getMethod(string $methodName, bool $unsafe = false): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntity; +``` + +
        Get the method entity by its name
        + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
        NameTypeDescription
        $methodNamestringThe name of the method whose entity you want to get
        $unsafeboolCheck all methods, not just the methods allowed in the configuration (@see PhpHandlerSettings::getMethodEntityFilter())
        + +Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntity + + +Throws: + + +
        +
        +
        + + + +```php +public function getMethodEntitiesCollection(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntitiesCollection; +``` + +
        Get a collection of method entities
        + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntitiesCollection + + +Throws: + + + +See: + +
        +
        +
        + + + +```php +public function getMethods(): array; +``` + +
        Get all methods that are available according to the configuration as an array
        + +Parameters: not specified + +Return value: array + + +Throws: + + + +See: + +
        +
        +
        + +
          +
        • # + getMethodsData + :warning: Is internal | source code
        • +
        + +```php +public function getMethodsData(bool $onlyFromCurrentClassAndTraits = false, int $flags = \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntity::VISIBILITY_MODIFIERS_FLAG_ANY): array; +``` + +
        Get a list of all methods and classes where they are implemented
        + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
        NameTypeDescription
        $onlyFromCurrentClassAndTraitsboolGet data only for methods from the current class
        $flagsintGet data only for methods corresponding to the visibility modifiers passed in this value
        + +Return value: array + + +Throws: + + +
        +
        +
        + + + +```php +public function getModifiersString(): string; +``` + +
        Get entity modifiers as a string
        + +Parameters: not specified + +Return value: string + + +
        +
        +
        + + + +```php +public function getName(): string; +``` + +
        Full name of the entity
        + +Parameters: not specified + +Return value: string + + +
        +
        +
        + + + +```php +public function getNamespaceName(): string; +``` + +
        Get the entity namespace name
        + +Parameters: not specified + +Return value: string + + +
        +
        +
        + + + +```php +public function getObjectId(): string; +``` + +
        Get entity unique ID
        + +Parameters: not specified + +Return value: string + + +
        +
        +
        + + + +```php +public function getParentClass(): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; +``` + +
        Get the entity of the parent class if it exists
        + +Parameters: not specified + +Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + + +
        +
        +
        + + + +```php +public function getParentClassEntities(): array; +``` + +
        Get a list of parent class entities
        + +Parameters: not specified + +Return value: array + + +
        +
        +
        + + + +```php +public function getParentClassName(): null|string; +``` + +
        Get the name of the parent class entity if it exists
        + +Parameters: not specified + +Return value: null | string + + +
        +
        +
        + + + +```php +public function getParentClassNames(): array; +``` + +
        Get a list of entity names of parent classes
        + +Parameters: not specified + +Return value: array + + +
        +
        +
        + + + +```php +public function getPluginData(string $pluginKey): mixed; +``` + +
        Get additional information added using the plugin
        + +Parameters: + + + + + + + + + + + + + + + + +
        NameTypeDescription
        $pluginKeystring-
        + +Return value: mixed + + +
        +
        +
        + + + +```php +public function getProperties(): array; +``` + +
        Get all properties that are available according to the configuration as an array
        + +Parameters: not specified + +Return value: array + + +Throws: + + + +See: + +
        +
        +
        + +
          +
        • # + getPropertiesData + :warning: Is internal | source code
        • +
        + +```php +public function getPropertiesData(bool $onlyFromCurrentClassAndTraits = false, int $flags = \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntity::VISIBILITY_MODIFIERS_FLAG_ANY): array; +``` + +
        Get a list of all properties and classes where they are implemented
        + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
        NameTypeDescription
        $onlyFromCurrentClassAndTraitsboolGet data only for properties from the current class
        $flagsintGet data only for properties corresponding to the visibility modifiers passed in this value
        + +Return value: array + + +Throws: + + +
        +
        +
        + + + +```php +public function getProperty(string $propertyName, bool $unsafe = false): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntity; +``` + +
        Get the property entity by its name
        + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
        NameTypeDescription
        $propertyNamestringThe name of the property whose entity you want to get
        $unsafeboolCheck all properties, not just the properties allowed in the configuration (@see PhpHandlerSettings::getPropertyEntityFilter())
        + +Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntity + + +Throws: + + +
        +
        +
        + + + +```php +public function getPropertyDefaultValue(string $propertyName): string|array|int|bool|null|float; +``` + +
        Get the compiled value of a property
        + +Parameters: + + + + + + + + + + + + + + + + +
        NameTypeDescription
        $propertyNamestringThe name of the property for which you need to get the value
        + +Return value: string | array | int | bool | null | float + + +Throws: + + +
        +
        +
        + + + +```php +public function getPropertyEntitiesCollection(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntitiesCollection; +``` + +
        Get a collection of property entities
        + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntitiesCollection + + +Throws: + + + +See: + +
        +
        +
        + + + +```php +public function getRelativeFileName(): null|string; +``` + +
        File name relative to project_root configuration parameter
        + +Parameters: not specified + +Return value: null | string + + + +See: + +
        +
        +
        + + + +```php +public function getRootEntityCollection(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; +``` + +
        Get the collection of root entities to which this entity belongs
        + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection + + +
        +
        +
        + + + +```php +public function getShortName(): string; +``` + +
        Short name of the entity
        + +Parameters: not specified + +Return value: string + + +
        +
        +
        + + + +```php +public function getStartLine(): int; +``` + +
        Get the line number of the start of a class code in a file
        + +Parameters: not specified + +Return value: int + + +Throws: + + +
        +
        +
        + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getThrows(): array; +``` + +
        Get parsed throws from `throws` doc block
        + +Parameters: not specified + +Return value: array + + +Throws: + + +
        +
        +
        + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getThrowsDocBlockLinks(): array; +``` + + + +Parameters: not specified + +Return value: array + + +Throws: + + +
        +
        +
        + + + +```php +public function getTraits(): array; +``` + +
        Get a list of trait entities of the current class
        + +Parameters: not specified + +Return value: array + + +Throws: + + +
        +
        +
        + + + +```php +public function getTraitsNames(): array; +``` + +
        Get a list of class traits names
        + +Parameters: not specified + +Return value: array + + +Throws: + + +
        +
        +
        + + + +```php +public function hasConstant(string $constantName, bool $unsafe = false): bool; +``` + +
        Check if a constant exists in a class
        + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
        NameTypeDescription
        $constantNamestringThe name of the class whose entity you want to check
        $unsafeboolCheck all constants, not just the constants allowed in the configuration (@see PhpHandlerSettings::getClassConstantEntityFilter())
        + +Return value: bool + + +Throws: + + +
        +
        +
        + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function hasDescriptionLinks(): bool; +``` + +
        Checking if an entity has links in its description
        + +Parameters: not specified + +Return value: bool + + +Throws: + + +
        +
        +
        + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function hasExamples(): bool; +``` + +
        Checking if an entity has `example` docBlock
        + +Parameters: not specified + +Return value: bool + + +Throws: + + +
        +
        +
        + + + +```php +public function hasMethod(string $methodName, bool $unsafe = false): bool; +``` + +
        Check if a method exists in a class
        + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
        NameTypeDescription
        $methodNamestringThe name of the method whose entity you want to check
        $unsafeboolCheck all methods, not just the methods allowed in the configuration (@see PhpHandlerSettings::getMethodEntityFilter())
        + +Return value: bool + + +Throws: + + +
        +
        +
        + + + +```php +public function hasParentClass(string $parentClassName): bool; +``` + +
        Check if a certain parent class exists in a chain of parent classes
        + +Parameters: + + + + + + + + + + + + + + + + +
        NameTypeDescription
        $parentClassNamestringSearched parent class
        + +Return value: bool + + +
        +
        +
        + + + +```php +public function hasProperty(string $propertyName, bool $unsafe = false): bool; +``` + +
        Check if a property exists in a class
        + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
        NameTypeDescription
        $propertyNamestringThe name of the property whose entity you want to check
        $unsafeboolCheck all properties, not just the properties allowed in the configuration (@see PhpHandlerSettings::getPropertyEntityFilter())
        + +Return value: bool + + +Throws: + + +
        +
        +
        + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function hasThrows(): bool; +``` + +
        Checking if an entity has `throws` docBlock
        + +Parameters: not specified + +Return value: bool + + +Throws: + + +
        +
        +
        + + + +```php +public function hasTraits(): bool; +``` + +
        Check if the class contains traits
        + +Parameters: not specified + +Return value: bool + + +Throws: + + +
        +
        +
        + + + +```php +public function implementsInterface(string $interfaceName): bool; +``` + +
        Check if a class implements an interface
        + +Parameters: + + + + + + + + + + + + + + + + +
        NameTypeDescription
        $interfaceNamestringName of the required interface in the interface chain
        + +Return value: bool + + +Throws: + + +
        +
        +
        + + + +```php +public function isAbstract(): bool; +``` + +
        Check that an entity is abstract
        + +Parameters: not specified + +Return value: bool + + +
        +
        +
        + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function isApi(): bool; +``` + +
        Checking if an entity has `api` docBlock
        + +Parameters: not specified + +Return value: bool + + +Throws: + + +
        +
        +
        + + + +```php +public function isClass(): bool; +``` + +
        Check if an entity is a Class
        + +Parameters: not specified + +Return value: bool + + +
        +
        +
        + + + +```php +public function isClassLoad(): bool; +``` + + + +Parameters: not specified + +Return value: bool + + +
        +
        +
        + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function isDeprecated(): bool; +``` + +
        Checking if an entity has `deprecated` docBlock
        + +Parameters: not specified + +Return value: bool + + +Throws: + + +
        +
        +
        + +
          +
        • # + isDocumentCreationAllowed + :warning: Is internal | source code
        • +
        + +```php +public function isDocumentCreationAllowed(): bool; +``` + + + +Parameters: not specified + +Return value: bool + + +Throws: + + +
        +
        +
        + +
          +
        • # + isEntityCacheOutdated + :warning: Is internal | source code
        • +
        + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function isEntityCacheOutdated(): bool; +``` + +
        Checking if the entity cache is out of date
        + +Parameters: not specified + +Return value: bool + + +
        +
        +
        + +
          +
        • # + isEntityDataCacheOutdated + :warning: Is internal | source code
        • +
        + +```php +// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait + +public function isEntityDataCacheOutdated(): bool; +``` + + + +Parameters: not specified + +Return value: bool + + +Throws: + + +
        +
        +
        + + + +```php +public function isEntityDataCanBeLoaded(): bool; +``` + + + +Parameters: not specified + +Return value: bool + + +Throws: + + +
        +
        +
        + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function isEntityFileCanBeLoad(): bool; +``` + +
        Checking if entity data can be retrieved
        + +Parameters: not specified + +Return value: bool + + +Throws: + + +
        +
        +
        + + + +```php +public static function isEntityNameValid(string $entityName): bool; +``` + +
        Check if the name is a valid name for ClassLikeEntity
        + +Parameters: + + + + + + + + + + + + + + + + +
        NameTypeDescription
        $entityNamestring-
        + +Return value: bool + + +
        +
        +
        + + + +```php +public function isEnum(): bool; +``` + +
        Check if an entity is an Enum
        + +Parameters: not specified + +Return value: bool + + +
        +
        +
        + +
          +
        • # + isExternalLibraryEntity + :warning: Is internal | source code
        • +
        + +```php +public function isExternalLibraryEntity(): bool; +``` + +
        Check if a given entity is an entity from a third party library (connected via composer)
        + +Parameters: not specified + +Return value: bool + + +
        +
        +
        + + + +```php +public function isInGit(): bool; +``` + +
        Checking if class file is in git repository
        + +Parameters: not specified + +Return value: bool + + +
        +
        +
        + + + +```php +public function isInstantiable(): bool; +``` + +
        Check that an entity is instantiable
        + +Parameters: not specified + +Return value: bool + + +
        +
        +
        + + + +```php +public function isInterface(): bool; +``` + +
        Check if an entity is an Interface
        + +Parameters: not specified + +Return value: bool + + +
        +
        +
        + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function isInternal(): bool; +``` + +
        Checking if an entity has `internal` docBlock
        + +Parameters: not specified + +Return value: bool + + +Throws: + + +
        +
        +
        + + + +```php +public function isSubclassOf(string $className): bool; +``` + +
        Whether the given class is a subclass of the specified class
        + +Parameters: + + + + + + + + + + + + + + + + +
        NameTypeDescription
        $classNamestring-
        + +Return value: bool + + +Throws: + + +
        +
        +
        + + + +```php +public function isTrait(): bool; +``` + +
        Check if an entity is a Trait
        + +Parameters: not specified + +Return value: bool + + +
        +
        +
        + + + +```php +public static function normalizeClassName(string $name): string; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
        NameTypeDescription
        $namestring-
        + +Return value: string + + +
        +
        +
        + +
          +
        • # + reloadEntityDependenciesCache + :warning: Is internal | source code
        • +
        + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function reloadEntityDependenciesCache(): array; +``` + +
        Update entity dependency cache
        + +Parameters: not specified + +Return value: array + + +
        +
        +
        + +
          +
        • # + removeEntityValueFromCache + :warning: Is internal | source code
        • +
        + +```php +// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait + +public function removeEntityValueFromCache(string $key): void; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
        NameTypeDescription
        $keystring-
        + +Return value: void + + +
        +
        +
        + +
          +
        • # + removeNotUsedEntityDataCache + :warning: Is internal | source code
        • +
        + +```php +// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait + +public function removeNotUsedEntityDataCache(): void; +``` + + + +Parameters: not specified + +Return value: void + + +Throws: + + +
        +
        +
        + + + +```php +public function setCustomAst(\PhpParser\Node\Stmt\Trait_|\PhpParser\Node\Stmt\Enum_|\PhpParser\Node\Stmt\Interface_|\PhpParser\Node\Stmt\Class_|null $customAst): void; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
        NameTypeDescription
        $customAst\PhpParser\Node\Stmt\Trait_ | \PhpParser\Node\Stmt\Enum_ | \PhpParser\Node\Stmt\Interface_ | \PhpParser\Node\Stmt\Class_ | null-
        + +Return value: void + + +
        +
        + + \ No newline at end of file diff --git a/docs/tech/classes/ClassLikeEntity_2.md b/docs/tech/classes/ClassLikeEntity_2.md new file mode 100644 index 00000000..d1da066f --- /dev/null +++ b/docs/tech/classes/ClassLikeEntity_2.md @@ -0,0 +1,3317 @@ + + BumbleDocGen / Technical description of the project / ClassLikeEntity
        + +

        + ClassLikeEntity class: +

        + + + + + +```php +namespace BumbleDocGen\LanguageHandler\Php\Parser\Entity; + +abstract class ClassLikeEntity extends \BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity implements \BumbleDocGen\Core\Renderer\Context\DocumentTransformableEntityInterface, \BumbleDocGen\Core\Parser\Entity\RootEntityInterface, \BumbleDocGen\Core\Parser\Entity\EntityInterface, \BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityInterface +``` + + + + + + + + +

        Initialization methods:

        + +
          +
        1. + __construct +
        2. +
        + +

        Methods:

        + +
          +
        1. + addPluginData + - Add information to aт entity object
        2. +
        3. + cursorToDocAttributeLinkFragment +
        4. +
        5. + getAbsoluteFileName + - Returns the absolute path to a file if it can be retrieved and if the file is in the project directory
        6. +
        7. + getAst + - Get AST for this entity
        8. +
        9. + getCacheKey +
        10. +
        11. + getCachedEntityDependencies +
        12. +
        13. + getConstant + - Get the method entity by its name
        14. +
        15. + getConstantEntitiesCollection + - Get a collection of constant entities
        16. +
        17. + getConstantValue + - Get the compiled value of a constant
        18. +
        19. + getConstants + - Get all constants that are available according to the configuration as an array
        20. +
        21. + getConstantsData + - Get a list of all constants and classes where they are implemented
        22. +
        23. + getConstantsValues + - Get class constant compiled values according to filters
        24. +
        25. + getCurrentRootEntity +
        26. +
        27. + getDescription + - Get entity description
        28. +
        29. + getDescriptionLinks + - Get parsed links from description and doc blocks `see` and `link`
        30. +
        31. + getDocBlock + - Get DocBlock for current entity
        32. +
        33. + getDocComment + - Get the doc comment of an entity
        34. +
        35. + getDocCommentEntity + - Link to an entity where docBlock is implemented for this entity
        36. +
        37. + getDocCommentLine + - Get the code line number where the docBlock of the current entity begins
        38. +
        39. + getDocNote + - Get the note annotation value
        40. +
        41. + getDocRender +
        42. +
        43. + getEndLine + - Get the line number of the end of a class code in a file
        44. +
        45. + getEntityDependencies +
        46. +
        47. + getExamples + - Get parsed examples from `examples` doc block
        48. +
        49. + getFileContent +
        50. +
        51. + getFileSourceLink +
        52. +
        53. + getFirstExample + - Get first example from `examples` doc block
        54. +
        55. + getImplementingClass + - Get the class like entity in which the current entity was implemented
        56. +
        57. + getInterfaceNames + - Get a list of class interface names
        58. +
        59. + getInterfacesEntities + - Get a list of interface entities that the current class implements
        60. +
        61. + getMethod + - Get the method entity by its name
        62. +
        63. + getMethodEntitiesCollection + - Get a collection of method entities
        64. +
        65. + getMethods + - Get all methods that are available according to the configuration as an array
        66. +
        67. + getMethodsData + - Get a list of all methods and classes where they are implemented
        68. +
        69. + getModifiersString + - Get entity modifiers as a string
        70. +
        71. + getName + - Full name of the entity
        72. +
        73. + getNamespaceName + - Get the entity namespace name
        74. +
        75. + getObjectId + - Get entity unique ID
        76. +
        77. + getParentClass + - Get the entity of the parent class if it exists
        78. +
        79. + getParentClassEntities + - Get a list of parent class entities
        80. +
        81. + getParentClassName + - Get the name of the parent class entity if it exists
        82. +
        83. + getParentClassNames + - Get a list of entity names of parent classes
        84. +
        85. + getPluginData + - Get additional information added using the plugin
        86. +
        87. + getProperties + - Get all properties that are available according to the configuration as an array
        88. +
        89. + getPropertiesData + - Get a list of all properties and classes where they are implemented
        90. +
        91. + getProperty + - Get the property entity by its name
        92. +
        93. + getPropertyDefaultValue + - Get the compiled value of a property
        94. +
        95. + getPropertyEntitiesCollection + - Get a collection of property entities
        96. +
        97. + getRelativeFileName + - File name relative to project_root configuration parameter
        98. +
        99. + getRootEntityCollection + - Get the collection of root entities to which this entity belongs
        100. +
        101. + getShortName + - Short name of the entity
        102. +
        103. + getStartLine + - Get the line number of the start of a class code in a file
        104. +
        105. + getThrows + - Get parsed throws from `throws` doc block
        106. +
        107. + getThrowsDocBlockLinks +
        108. +
        109. + getTraits + - Get a list of trait entities of the current class
        110. +
        111. + getTraitsNames + - Get a list of class traits names
        112. +
        113. + hasConstant + - Check if a constant exists in a class
        114. +
        115. + hasDescriptionLinks + - Checking if an entity has links in its description
        116. +
        117. + hasExamples + - Checking if an entity has `example` docBlock
        118. +
        119. + hasMethod + - Check if a method exists in a class
        120. +
        121. + hasParentClass + - Check if a certain parent class exists in a chain of parent classes
        122. +
        123. + hasProperty + - Check if a property exists in a class
        124. +
        125. + hasThrows + - Checking if an entity has `throws` docBlock
        126. +
        127. + hasTraits + - Check if the class contains traits
        128. +
        129. + implementsInterface + - Check if a class implements an interface
        130. +
        131. + isAbstract + - Check that an entity is abstract
        132. +
        133. + isApi + - Checking if an entity has `api` docBlock
        134. +
        135. + isClass + - Check if an entity is a Class
        136. +
        137. + isClassLoad +
        138. +
        139. + isDeprecated + - Checking if an entity has `deprecated` docBlock
        140. +
        141. + isDocumentCreationAllowed +
        142. +
        143. + isEntityCacheOutdated + - Checking if the entity cache is out of date
        144. +
        145. + isEntityDataCacheOutdated +
        146. +
        147. + isEntityDataCanBeLoaded +
        148. +
        149. + isEntityFileCanBeLoad + - Checking if entity data can be retrieved
        150. +
        151. + isEntityNameValid + - Check if the name is a valid name for ClassLikeEntity
        152. +
        153. + isEnum + - Check if an entity is an Enum
        154. +
        155. + isExternalLibraryEntity + - Check if a given entity is an entity from a third party library (connected via composer)
        156. +
        157. + isInGit + - Checking if class file is in git repository
        158. +
        159. + isInstantiable + - Check that an entity is instantiable
        160. +
        161. + isInterface + - Check if an entity is an Interface
        162. +
        163. + isInternal + - Checking if an entity has `internal` docBlock
        164. +
        165. + isSubclassOf + - Whether the given class is a subclass of the specified class
        166. +
        167. + isTrait + - Check if an entity is a Trait
        168. +
        169. + normalizeClassName +
        170. +
        171. + reloadEntityDependenciesCache + - Update entity dependency cache
        172. +
        173. + removeEntityValueFromCache +
        174. +
        175. + removeNotUsedEntityDataCache +
        176. +
        177. + setCustomAst +
        178. +
        + + + + + + + +

        Method details:

        + +
        + + + +```php +public function __construct(\BumbleDocGen\Core\Configuration\Configuration $configuration, \BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings $phpHandlerSettings, \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection $entitiesCollection, \BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper $parserHelper, \BumbleDocGen\LanguageHandler\Php\Parser\ComposerHelper $composerHelper, \BumbleDocGen\LanguageHandler\Php\Parser\PhpParser\PhpParserHelper $phpParserHelper, \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache $localObjectCache, \Psr\Log\LoggerInterface $logger, string $className, string|null $relativeFileName); +``` + + + +Parameters: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        NameTypeDescription
        $configuration\BumbleDocGen\Core\Configuration\Configuration-
        $phpHandlerSettings\BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings-
        $entitiesCollection\BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection-
        $parserHelper\BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper-
        $composerHelper\BumbleDocGen\LanguageHandler\Php\Parser\ComposerHelper-
        $phpParserHelper\BumbleDocGen\LanguageHandler\Php\Parser\PhpParser\PhpParserHelper-
        $localObjectCache\BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache-
        $logger\Psr\Log\LoggerInterface-
        $classNamestring-
        $relativeFileNamestring | null-
        + + + +
        +
        +
        + + + +```php +public function addPluginData(string $pluginKey, mixed $data): void; +``` + +
        Add information to aт entity object
        + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
        NameTypeDescription
        $pluginKeystring-
        $datamixed-
        + +Return value: void + + +
        +
        +
        + +
          +
        • # + cursorToDocAttributeLinkFragment + :warning: Is internal | source code
        • +
        + +```php +public function cursorToDocAttributeLinkFragment(string $cursor, bool $isForDocument = true): string; +``` + + + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
        NameTypeDescription
        $cursorstring-
        $isForDocumentbool-
        + +Return value: string + + +Throws: + + +
        +
        +
        + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getAbsoluteFileName(): null|string; +``` + +
        Returns the absolute path to a file if it can be retrieved and if the file is in the project directory
        + +Parameters: not specified + +Return value: null | string + + +Throws: + + +
        +
        +
        + + + +```php +public function getAst(): \PhpParser\Node\Stmt\Class_|\PhpParser\Node\Stmt\Interface_|\PhpParser\Node\Stmt\Trait_|\PhpParser\Node\Stmt\Enum_; +``` + +
        Get AST for this entity
        + +Parameters: not specified + +Return value: \PhpParser\Node\Stmt\Class_ | \PhpParser\Node\Stmt\Interface_ | \PhpParser\Node\Stmt\Trait_ | \PhpParser\Node\Stmt\Enum_ + + +Throws: + + +
        +
        +
        + + + +```php +// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait + +public function getCacheKey(): string; +``` + + + +Parameters: not specified + +Return value: string + + +
        +
        +
        + +
          +
        • # + getCachedEntityDependencies + :warning: Is internal | source code
        • +
        + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getCachedEntityDependencies(): array; +``` + + + +Parameters: not specified + +Return value: array + + +Throws: + + +
        +
        +
        + + + +```php +public function getConstant(string $constantName, bool $unsafe = false): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity; +``` + +
        Get the method entity by its name
        + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
        NameTypeDescription
        $constantNamestringThe name of the constant whose entity you want to get
        $unsafeboolCheck all constants, not just the constants allowed in the configuration (@see PhpHandlerSettings::getClassConstantEntityFilter())
        + +Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity + + +Throws: + + +
        +
        +
        + + + +```php +public function getConstantEntitiesCollection(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntitiesCollection; +``` + +
        Get a collection of constant entities
        + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntitiesCollection + + +Throws: + + + +See: + +
        +
        +
        + + + +```php +public function getConstantValue(string $constantName): string|array|int|bool|null|float; +``` + +
        Get the compiled value of a constant
        + +Parameters: + + + + + + + + + + + + + + + + +
        NameTypeDescription
        $constantNamestringThe name of the constant for which you need to get the value
        + +Return value: string | array | int | bool | null | float + + +Throws: + + +
        +
        +
        + + + +```php +public function getConstants(): array; +``` + +
        Get all constants that are available according to the configuration as an array
        + +Parameters: not specified + +Return value: array + + +Throws: + + + +See: + +
        +
        +
        + +
          +
        • # + getConstantsData + :warning: Is internal | source code
        • +
        + +```php +public function getConstantsData(bool $onlyFromCurrentClassAndTraits = false, int $flags = \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity::VISIBILITY_MODIFIERS_FLAG_ANY): array; +``` + +
        Get a list of all constants and classes where they are implemented
        + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
        NameTypeDescription
        $onlyFromCurrentClassAndTraitsboolGet data only for constants from the current class
        $flagsintGet data only for constants corresponding to the visibility modifiers passed in this value
        + +Return value: array + + +Throws: + + +
        +
        +
        + + + +```php +public function getConstantsValues(bool $onlyFromCurrentClassAndTraits = false, int $flags = \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity::VISIBILITY_MODIFIERS_FLAG_ANY): array; +``` + +
        Get class constant compiled values according to filters
        + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
        NameTypeDescription
        $onlyFromCurrentClassAndTraitsboolGet values only for constants from the current class
        $flagsintGet values only for constants corresponding to the visibility modifiers passed in this value
        + +Return value: array + + +Throws: + + +
        +
        +
        + +
          +
        • # + getCurrentRootEntity + :warning: Is internal | source code
        • +
        + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getCurrentRootEntity(): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; +``` + + + +Parameters: not specified + +Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + + +
        +
        +
        + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDescription(): string; +``` + +
        Get entity description
        + +Parameters: not specified + +Return value: string + + +Throws: + + +
        +
        +
        + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDescriptionLinks(): array; +``` + +
        Get parsed links from description and doc blocks `see` and `link`
        + +Parameters: not specified + +Return value: array + + +Throws: + + +
        +
        +
        + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDocBlock(): \phpDocumentor\Reflection\DocBlock; +``` + +
        Get DocBlock for current entity
        + +Parameters: not specified + +Return value: \phpDocumentor\Reflection\DocBlock + + +Throws: + + +
        +
        +
        + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDocComment(): string; +``` + +
        Get the doc comment of an entity
        + +Parameters: not specified + +Return value: string + + +Throws: + + +
        +
        +
        + +
          +
        • # + getDocCommentEntity + :warning: Is internal | source code
        • +
        + +```php +public function getDocCommentEntity(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; +``` + +
        Link to an entity where docBlock is implemented for this entity
        + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + + +
        +
        +
        + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDocCommentLine(): null|int; +``` + +
        Get the code line number where the docBlock of the current entity begins
        + +Parameters: not specified + +Return value: null | int + + +Throws: + + +
        +
        +
        + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDocNote(): string; +``` + +
        Get the note annotation value
        + +Parameters: not specified + +Return value: string + + +Throws: + + +
        +
        +
        + + + +```php +public function getDocRender(): \BumbleDocGen\Core\Renderer\EntityDocRenderer\EntityDocRendererInterface; +``` + + + +Parameters: not specified + +Return value: \BumbleDocGen\Core\Renderer\EntityDocRenderer\EntityDocRendererInterface + + +Throws: + + +
        +
        +
        + + + +```php +public function getEndLine(): int; +``` + +
        Get the line number of the end of a class code in a file
        + +Parameters: not specified + +Return value: int + + +Throws: + + +
        +
        +
        + + + +```php +public function getEntityDependencies(): array; +``` + + + +Parameters: not specified + +Return value: array + + +
        +
        +
        + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getExamples(): array; +``` + +
        Get parsed examples from `examples` doc block
        + +Parameters: not specified + +Return value: array + + +Throws: + + +
        +
        +
        + + + +```php +public function getFileContent(): string; +``` + + + +Parameters: not specified + +Return value: string + + +Throws: + + +
        +
        +
        + +
          +
        • # + getFileSourceLink + :warning: Is internal | source code
        • +
        + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getFileSourceLink(bool $withLine = true): null|string; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
        NameTypeDescription
        $withLinebool-
        + +Return value: null | string + + +Throws: + + +
        +
        +
        + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getFirstExample(): string; +``` + +
        Get first example from `examples` doc block
        + +Parameters: not specified + +Return value: string + + +Throws: + + +
        +
        +
        + + + +```php +public function getImplementingClass(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; +``` + +
        Get the class like entity in which the current entity was implemented
        + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + + +
        +
        +
        + + + +```php +public function getInterfaceNames(): array; +``` + +
        Get a list of class interface names
        + +Parameters: not specified + +Return value: array + + +Throws: + + +
        +
        +
        + + + +```php +public function getInterfacesEntities(): array; +``` + +
        Get a list of interface entities that the current class implements
        + +Parameters: not specified + +Return value: array + + +Throws: + + +
        +
        +
        + + + +```php +public function getMethod(string $methodName, bool $unsafe = false): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntity; +``` + +
        Get the method entity by its name
        + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
        NameTypeDescription
        $methodNamestringThe name of the method whose entity you want to get
        $unsafeboolCheck all methods, not just the methods allowed in the configuration (@see PhpHandlerSettings::getMethodEntityFilter())
        + +Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntity + + +Throws: + + +
        +
        +
        + + + +```php +public function getMethodEntitiesCollection(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntitiesCollection; +``` + +
        Get a collection of method entities
        + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntitiesCollection + + +Throws: + + + +See: + +
        +
        +
        + + + +```php +public function getMethods(): array; +``` + +
        Get all methods that are available according to the configuration as an array
        + +Parameters: not specified + +Return value: array + + +Throws: + + + +See: + +
        +
        +
        + +
          +
        • # + getMethodsData + :warning: Is internal | source code
        • +
        + +```php +public function getMethodsData(bool $onlyFromCurrentClassAndTraits = false, int $flags = \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntity::VISIBILITY_MODIFIERS_FLAG_ANY): array; +``` + +
        Get a list of all methods and classes where they are implemented
        + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
        NameTypeDescription
        $onlyFromCurrentClassAndTraitsboolGet data only for methods from the current class
        $flagsintGet data only for methods corresponding to the visibility modifiers passed in this value
        + +Return value: array + + +Throws: + + +
        +
        +
        + + + +```php +public function getModifiersString(): string; +``` + +
        Get entity modifiers as a string
        + +Parameters: not specified + +Return value: string + + +
        +
        +
        + + + +```php +public function getName(): string; +``` + +
        Full name of the entity
        + +Parameters: not specified + +Return value: string + + +
        +
        +
        + + + +```php +public function getNamespaceName(): string; +``` + +
        Get the entity namespace name
        + +Parameters: not specified + +Return value: string + + +
        +
        +
        + + + +```php +public function getObjectId(): string; +``` + +
        Get entity unique ID
        + +Parameters: not specified + +Return value: string + + +
        +
        +
        + + + +```php +public function getParentClass(): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; +``` + +
        Get the entity of the parent class if it exists
        + +Parameters: not specified + +Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + + +
        +
        +
        + + + +```php +public function getParentClassEntities(): array; +``` + +
        Get a list of parent class entities
        + +Parameters: not specified + +Return value: array + + +
        +
        +
        + + + +```php +public function getParentClassName(): null|string; +``` + +
        Get the name of the parent class entity if it exists
        + +Parameters: not specified + +Return value: null | string + + +
        +
        +
        + + + +```php +public function getParentClassNames(): array; +``` + +
        Get a list of entity names of parent classes
        + +Parameters: not specified + +Return value: array + + +
        +
        +
        + + + +```php +public function getPluginData(string $pluginKey): mixed; +``` + +
        Get additional information added using the plugin
        + +Parameters: + + + + + + + + + + + + + + + + +
        NameTypeDescription
        $pluginKeystring-
        + +Return value: mixed + + +
        +
        +
        + + + +```php +public function getProperties(): array; +``` + +
        Get all properties that are available according to the configuration as an array
        + +Parameters: not specified + +Return value: array + + +Throws: + + + +See: + +
        +
        +
        + +
          +
        • # + getPropertiesData + :warning: Is internal | source code
        • +
        + +```php +public function getPropertiesData(bool $onlyFromCurrentClassAndTraits = false, int $flags = \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntity::VISIBILITY_MODIFIERS_FLAG_ANY): array; +``` + +
        Get a list of all properties and classes where they are implemented
        + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
        NameTypeDescription
        $onlyFromCurrentClassAndTraitsboolGet data only for properties from the current class
        $flagsintGet data only for properties corresponding to the visibility modifiers passed in this value
        + +Return value: array + + +Throws: + + +
        +
        +
        + + + +```php +public function getProperty(string $propertyName, bool $unsafe = false): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntity; +``` + +
        Get the property entity by its name
        + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
        NameTypeDescription
        $propertyNamestringThe name of the property whose entity you want to get
        $unsafeboolCheck all properties, not just the properties allowed in the configuration (@see PhpHandlerSettings::getPropertyEntityFilter())
        + +Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntity + + +Throws: + + +
        +
        +
        + + + +```php +public function getPropertyDefaultValue(string $propertyName): string|array|int|bool|null|float; +``` + +
        Get the compiled value of a property
        + +Parameters: + + + + + + + + + + + + + + + + +
        NameTypeDescription
        $propertyNamestringThe name of the property for which you need to get the value
        + +Return value: string | array | int | bool | null | float + + +Throws: + + +
        +
        +
        + + + +```php +public function getPropertyEntitiesCollection(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntitiesCollection; +``` + +
        Get a collection of property entities
        + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntitiesCollection + + +Throws: + + + +See: + +
        +
        +
        + + + +```php +public function getRelativeFileName(): null|string; +``` + +
        File name relative to project_root configuration parameter
        + +Parameters: not specified + +Return value: null | string + + + +See: + +
        +
        +
        + + + +```php +public function getRootEntityCollection(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; +``` + +
        Get the collection of root entities to which this entity belongs
        + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection + + +
        +
        +
        + + + +```php +public function getShortName(): string; +``` + +
        Short name of the entity
        + +Parameters: not specified + +Return value: string + + +
        +
        +
        + + + +```php +public function getStartLine(): int; +``` + +
        Get the line number of the start of a class code in a file
        + +Parameters: not specified + +Return value: int + + +Throws: + + +
        +
        +
        + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getThrows(): array; +``` + +
        Get parsed throws from `throws` doc block
        + +Parameters: not specified + +Return value: array + + +Throws: + + +
        +
        +
        + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getThrowsDocBlockLinks(): array; +``` + + + +Parameters: not specified + +Return value: array + + +Throws: + + +
        +
        +
        + + + +```php +public function getTraits(): array; +``` + +
        Get a list of trait entities of the current class
        + +Parameters: not specified + +Return value: array + + +Throws: + + +
        +
        +
        + + + +```php +public function getTraitsNames(): array; +``` + +
        Get a list of class traits names
        + +Parameters: not specified + +Return value: array + + +Throws: + + +
        +
        +
        + + + +```php +public function hasConstant(string $constantName, bool $unsafe = false): bool; +``` + +
        Check if a constant exists in a class
        + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
        NameTypeDescription
        $constantNamestringThe name of the class whose entity you want to check
        $unsafeboolCheck all constants, not just the constants allowed in the configuration (@see PhpHandlerSettings::getClassConstantEntityFilter())
        + +Return value: bool + + +Throws: + + +
        +
        +
        + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function hasDescriptionLinks(): bool; +``` + +
        Checking if an entity has links in its description
        + +Parameters: not specified + +Return value: bool + + +Throws: + + +
        +
        +
        + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function hasExamples(): bool; +``` + +
        Checking if an entity has `example` docBlock
        + +Parameters: not specified + +Return value: bool + + +Throws: + + +
        +
        +
        + + + +```php +public function hasMethod(string $methodName, bool $unsafe = false): bool; +``` + +
        Check if a method exists in a class
        + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
        NameTypeDescription
        $methodNamestringThe name of the method whose entity you want to check
        $unsafeboolCheck all methods, not just the methods allowed in the configuration (@see PhpHandlerSettings::getMethodEntityFilter())
        + +Return value: bool + + +Throws: + + +
        +
        +
        + + + +```php +public function hasParentClass(string $parentClassName): bool; +``` + +
        Check if a certain parent class exists in a chain of parent classes
        + +Parameters: + + + + + + + + + + + + + + + + +
        NameTypeDescription
        $parentClassNamestringSearched parent class
        + +Return value: bool + + +
        +
        +
        + + + +```php +public function hasProperty(string $propertyName, bool $unsafe = false): bool; +``` + +
        Check if a property exists in a class
        + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
        NameTypeDescription
        $propertyNamestringThe name of the property whose entity you want to check
        $unsafeboolCheck all properties, not just the properties allowed in the configuration (@see PhpHandlerSettings::getPropertyEntityFilter())
        + +Return value: bool + + +Throws: + + +
        +
        +
        + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function hasThrows(): bool; +``` + +
        Checking if an entity has `throws` docBlock
        + +Parameters: not specified + +Return value: bool + + +Throws: + + +
        +
        +
        + + + +```php +public function hasTraits(): bool; +``` + +
        Check if the class contains traits
        + +Parameters: not specified + +Return value: bool + + +Throws: + + +
        +
        +
        + + + +```php +public function implementsInterface(string $interfaceName): bool; +``` + +
        Check if a class implements an interface
        + +Parameters: + + + + + + + + + + + + + + + + +
        NameTypeDescription
        $interfaceNamestringName of the required interface in the interface chain
        + +Return value: bool + + +Throws: + + +
        +
        +
        + + + +```php +public function isAbstract(): bool; +``` + +
        Check that an entity is abstract
        + +Parameters: not specified + +Return value: bool + + +
        +
        +
        + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function isApi(): bool; +``` + +
        Checking if an entity has `api` docBlock
        + +Parameters: not specified + +Return value: bool + + +Throws: + + +
        +
        +
        + + + +```php +public function isClass(): bool; +``` + +
        Check if an entity is a Class
        + +Parameters: not specified + +Return value: bool + + +
        +
        +
        + + + +```php +public function isClassLoad(): bool; +``` + + + +Parameters: not specified + +Return value: bool + + +
        +
        +
        + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function isDeprecated(): bool; +``` + +
        Checking if an entity has `deprecated` docBlock
        + +Parameters: not specified + +Return value: bool + + +Throws: + + +
        +
        +
        + +
          +
        • # + isDocumentCreationAllowed + :warning: Is internal | source code
        • +
        + +```php +public function isDocumentCreationAllowed(): bool; +``` + + + +Parameters: not specified + +Return value: bool + + +Throws: + + +
        +
        +
        + +
          +
        • # + isEntityCacheOutdated + :warning: Is internal | source code
        • +
        + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function isEntityCacheOutdated(): bool; +``` + +
        Checking if the entity cache is out of date
        + +Parameters: not specified + +Return value: bool + + +
        +
        +
        + +
          +
        • # + isEntityDataCacheOutdated + :warning: Is internal | source code
        • +
        + +```php +// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait + +public function isEntityDataCacheOutdated(): bool; +``` + + + +Parameters: not specified + +Return value: bool + + +Throws: + + +
        +
        +
        + + + +```php +public function isEntityDataCanBeLoaded(): bool; +``` + + + +Parameters: not specified + +Return value: bool + + +Throws: + + +
        +
        +
        + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function isEntityFileCanBeLoad(): bool; +``` + +
        Checking if entity data can be retrieved
        + +Parameters: not specified + +Return value: bool + + +Throws: + + +
        +
        +
        + + + +```php +public static function isEntityNameValid(string $entityName): bool; +``` + +
        Check if the name is a valid name for ClassLikeEntity
        + +Parameters: + + + + + + + + + + + + + + + + +
        NameTypeDescription
        $entityNamestring-
        + +Return value: bool + + +
        +
        +
        + + + +```php +public function isEnum(): bool; +``` + +
        Check if an entity is an Enum
        + +Parameters: not specified + +Return value: bool + + +
        +
        +
        + +
          +
        • # + isExternalLibraryEntity + :warning: Is internal | source code
        • +
        + +```php +public function isExternalLibraryEntity(): bool; +``` + +
        Check if a given entity is an entity from a third party library (connected via composer)
        + +Parameters: not specified + +Return value: bool + + +
        +
        +
        + + + +```php +public function isInGit(): bool; +``` + +
        Checking if class file is in git repository
        + +Parameters: not specified + +Return value: bool + + +
        +
        +
        + + + +```php +public function isInstantiable(): bool; +``` + +
        Check that an entity is instantiable
        + +Parameters: not specified + +Return value: bool + + +
        +
        +
        + + + +```php +public function isInterface(): bool; +``` + +
        Check if an entity is an Interface
        + +Parameters: not specified + +Return value: bool + + +
        +
        +
        + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function isInternal(): bool; +``` + +
        Checking if an entity has `internal` docBlock
        + +Parameters: not specified + +Return value: bool + + +Throws: + + +
        +
        +
        + + + +```php +public function isSubclassOf(string $className): bool; +``` + +
        Whether the given class is a subclass of the specified class
        + +Parameters: + + + + + + + + + + + + + + + + +
        NameTypeDescription
        $classNamestring-
        + +Return value: bool + + +Throws: + + +
        +
        +
        + + + +```php +public function isTrait(): bool; +``` + +
        Check if an entity is a Trait
        + +Parameters: not specified + +Return value: bool + + +
        +
        +
        + + + +```php +public static function normalizeClassName(string $name): string; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
        NameTypeDescription
        $namestring-
        + +Return value: string + + +
        +
        +
        + +
          +
        • # + reloadEntityDependenciesCache + :warning: Is internal | source code
        • +
        + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function reloadEntityDependenciesCache(): array; +``` + +
        Update entity dependency cache
        + +Parameters: not specified + +Return value: array + + +
        +
        +
        + +
          +
        • # + removeEntityValueFromCache + :warning: Is internal | source code
        • +
        + +```php +// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait + +public function removeEntityValueFromCache(string $key): void; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
        NameTypeDescription
        $keystring-
        + +Return value: void + + +
        +
        +
        + +
          +
        • # + removeNotUsedEntityDataCache + :warning: Is internal | source code
        • +
        + +```php +// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait + +public function removeNotUsedEntityDataCache(): void; +``` + + + +Parameters: not specified + +Return value: void + + +Throws: + + +
        +
        +
        + + + +```php +public function setCustomAst(\PhpParser\Node\Stmt\Trait_|\PhpParser\Node\Stmt\Enum_|\PhpParser\Node\Stmt\Interface_|\PhpParser\Node\Stmt\Class_|null $customAst): void; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
        NameTypeDescription
        $customAst\PhpParser\Node\Stmt\Trait_ | \PhpParser\Node\Stmt\Enum_ | \PhpParser\Node\Stmt\Interface_ | \PhpParser\Node\Stmt\Class_ | null-
        + +Return value: void + + +
        +
        + + \ No newline at end of file diff --git a/docs/tech/classes/CollectionGroupLoadEntitiesResult.md b/docs/tech/classes/CollectionGroupLoadEntitiesResult.md new file mode 100644 index 00000000..ebaef5dd --- /dev/null +++ b/docs/tech/classes/CollectionGroupLoadEntitiesResult.md @@ -0,0 +1,110 @@ + + BumbleDocGen / Technical description of the project / Class map / CollectionGroupLoadEntitiesResult
        + +

        + CollectionGroupLoadEntitiesResult class: +

        + + + + + +```php +namespace BumbleDocGen\Core\Parser\Entity; + +final class CollectionGroupLoadEntitiesResult +``` + + + + + + + + + +

        Methods:

        + +
          +
        1. + addResult +
        2. +
        3. + getSummary +
        4. +
        + + + + + + + +

        Method details:

        + +
        + + + +```php +public function addResult(string $collectionName, \BumbleDocGen\Core\Parser\Entity\CollectionLoadEntitiesResult $collectionLoadEntitiesResult): void; +``` + + + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
        NameTypeDescription
        $collectionNamestring-
        $collectionLoadEntitiesResult\BumbleDocGen\Core\Parser\Entity\CollectionLoadEntitiesResult-
        + +Return value: void + + +
        +
        +
        + + + +```php +public function getSummary(): \BumbleDocGen\Core\Parser\Entity\CollectionLoadEntitiesResult; +``` + + + +Parameters: not specified + +Return value: \BumbleDocGen\Core\Parser\Entity\CollectionLoadEntitiesResult + + +
        +
        + + \ No newline at end of file diff --git a/docs/tech/classes/CollectionLoadEntitiesResult.md b/docs/tech/classes/CollectionLoadEntitiesResult.md new file mode 100644 index 00000000..47ed6628 --- /dev/null +++ b/docs/tech/classes/CollectionLoadEntitiesResult.md @@ -0,0 +1,224 @@ + + BumbleDocGen / Technical description of the project / Class map / CollectionLoadEntitiesResult
        + +

        + CollectionLoadEntitiesResult class: +

        + + + + + +```php +namespace BumbleDocGen\Core\Parser\Entity; + +final class CollectionLoadEntitiesResult +``` + + + + + + + + +

        Initialization methods:

        + +
          +
        1. + __construct +
        2. +
        + +

        Methods:

        + +
          +
        1. + getEntitiesAddedByPluginsCount +
        2. +
        3. + getProcessedEntitiesCount +
        4. +
        5. + getProcessedFilesCount +
        6. +
        7. + getSkippedEntitiesCount +
        8. +
        9. + getTotalAddedEntities +
        10. +
        + + + + + + + +

        Method details:

        + +
        + + + +```php +public function __construct(int $processedFilesCount, int $processedEntitiesCount, int $skippedEntitiesCount, int $entitiesAddedByPluginsCount, int $totalAddedEntities); +``` + + + +Parameters: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        NameTypeDescription
        $processedFilesCountint-
        $processedEntitiesCountint-
        $skippedEntitiesCountint-
        $entitiesAddedByPluginsCountint-
        $totalAddedEntitiesint-
        + + + +
        +
        +
        + + + +```php +public function getEntitiesAddedByPluginsCount(): int; +``` + + + +Parameters: not specified + +Return value: int + + +
        +
        +
        + + + +```php +public function getProcessedEntitiesCount(): int; +``` + + + +Parameters: not specified + +Return value: int + + +
        +
        +
        + + + +```php +public function getProcessedFilesCount(): int; +``` + + + +Parameters: not specified + +Return value: int + + +
        +
        +
        + + + +```php +public function getSkippedEntitiesCount(): int; +``` + + + +Parameters: not specified + +Return value: int + + +
        +
        +
        + + + +```php +public function getTotalAddedEntities(): int; +``` + + + +Parameters: not specified + +Return value: int + + +
        +
        + + \ No newline at end of file diff --git a/docs/tech/classes/ComposerHelper.md b/docs/tech/classes/ComposerHelper.md index c118bcf9..3a54c39a 100644 --- a/docs/tech/classes/ComposerHelper.md +++ b/docs/tech/classes/ComposerHelper.md @@ -127,7 +127,7 @@ public function getComposerClassLoader(): \Composer\Autoload\ClassLoader; ```php diff --git a/docs/tech/classes/Configuration.md b/docs/tech/classes/Configuration.md index ce7fcfda..ce3d0316 100644 --- a/docs/tech/classes/Configuration.md +++ b/docs/tech/classes/Configuration.md @@ -159,7 +159,7 @@ public function __construct(\BumbleDocGen\Core\Configuration\ConfigurationParame ```php @@ -242,7 +242,7 @@ public function getConfigurationVersion(): string; ```php @@ -263,7 +263,7 @@ public function getDocGenLibDir(): string; ```php @@ -291,7 +291,7 @@ public function getGitClientPath(): string; ```php @@ -426,7 +426,7 @@ public function getOutputDirBaseUrl(): string; ```php @@ -584,7 +584,7 @@ public function getTemplatesDir(): string; ```php @@ -618,7 +618,7 @@ public function getTwigFilters(): \BumbleDocGen\Core\Renderer\Twig\Filter\Custom ```php @@ -652,7 +652,7 @@ public function getTwigFunctions(): \BumbleDocGen\Core\Renderer\Twig\Function\Cu ```php @@ -680,7 +680,7 @@ public function getWorkingDir(): string; ```php @@ -708,7 +708,7 @@ public function isCheckFileInGitBeforeCreatingDocEnabled(): bool; ```php diff --git a/docs/tech/classes/ConfigurationParameterBag.md b/docs/tech/classes/ConfigurationParameterBag.md index b47b5e0e..ed6207ea 100644 --- a/docs/tech/classes/ConfigurationParameterBag.md +++ b/docs/tech/classes/ConfigurationParameterBag.md @@ -613,7 +613,7 @@ public function set(string $name, mixed $value): void; ```php @@ -658,7 +658,7 @@ public function validateAndGetBooleanValue(string $parameterName): bool; ```php @@ -775,7 +775,7 @@ public function validateAndGetClassValue(string $parameterName, string $classInt ```php @@ -825,7 +825,7 @@ public function validateAndGetDirectoryPathValue(string $parameterName, bool $nu ```php @@ -880,7 +880,7 @@ public function validateAndGetFilePathValue(string $parameterName, array $fileEx ```php diff --git a/docs/tech/classes/Configuration_2.md b/docs/tech/classes/Configuration_2.md index 48259066..1920a55d 100644 --- a/docs/tech/classes/Configuration_2.md +++ b/docs/tech/classes/Configuration_2.md @@ -159,7 +159,7 @@ public function __construct(\BumbleDocGen\Core\Configuration\ConfigurationParame ```php @@ -242,7 +242,7 @@ public function getConfigurationVersion(): string; ```php @@ -263,7 +263,7 @@ public function getDocGenLibDir(): string; ```php @@ -291,7 +291,7 @@ public function getGitClientPath(): string; ```php @@ -426,7 +426,7 @@ public function getOutputDirBaseUrl(): string; ```php @@ -584,7 +584,7 @@ public function getTemplatesDir(): string; ```php @@ -618,7 +618,7 @@ public function getTwigFilters(): \BumbleDocGen\Core\Renderer\Twig\Filter\Custom ```php @@ -652,7 +652,7 @@ public function getTwigFunctions(): \BumbleDocGen\Core\Renderer\Twig\Function\Cu ```php @@ -680,7 +680,7 @@ public function getWorkingDir(): string; ```php @@ -708,7 +708,7 @@ public function isCheckFileInGitBeforeCreatingDocEnabled(): bool; ```php diff --git a/docs/tech/classes/DisplayClassApiMethods.md b/docs/tech/classes/DisplayClassApiMethods.md new file mode 100644 index 00000000..9a2705d8 --- /dev/null +++ b/docs/tech/classes/DisplayClassApiMethods.md @@ -0,0 +1,209 @@ + + BumbleDocGen / Technical description of the project / Class map / DisplayClassApiMethods
        + +

        + DisplayClassApiMethods class: +

        + + + + + +```php +namespace BumbleDocGen\LanguageHandler\Php\Renderer\Twig\Function; + +final class DisplayClassApiMethods implements \BumbleDocGen\Core\Renderer\Twig\Function\CustomFunctionInterface +``` + +
        Display all API methods of a class
        + + +Examples of using: + +```php +{{ displayClassApiMethods('\\BumbleDocGen\\LanguageHandler\\Php\\Parser\\Entity\\ClassEntity') }} + +``` + + + + +

        Settings:

        + + + + + + +
        Function name:displayClassApiMethods
        + + + + +

        Initialization methods:

        + +
          +
        1. + __construct +
        2. +
        + +

        Methods:

        + +
          +
        1. + __invoke +
        2. +
        3. + getName +
        4. +
        5. + getOptions +
        6. +
        + + + + + + + +

        Method details:

        + +
        + + + +```php +public function __construct(\BumbleDocGen\Core\Parser\Entity\RootEntityCollectionsGroup $rootEntityCollectionsGroup, \BumbleDocGen\Core\Renderer\Twig\Function\GetDocumentedEntityUrl $getDocumentedEntityUrlFunction); +``` + + + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
        NameTypeDescription
        $rootEntityCollectionsGroup\BumbleDocGen\Core\Parser\Entity\RootEntityCollectionsGroup-
        $getDocumentedEntityUrlFunction\BumbleDocGen\Core\Renderer\Twig\Function\GetDocumentedEntityUrl-
        + + + +
        +
        +
        + + + +```php +public function __invoke(string $className): null|string; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
        NameTypeDescription
        $classNamestringName of the class for which API methods need to be displayed
        + +Return value: null | string + + +Throws: + + +
        +
        +
        + + + +```php +public static function getName(): string; +``` + + + +Parameters: not specified + +Return value: string + + +
        +
        +
        + + + +```php +public static function getOptions(): array; +``` + + + +Parameters: not specified + +Return value: array + + +
        +
        + + \ No newline at end of file diff --git a/docs/tech/classes/DocBlockLink.md b/docs/tech/classes/DocBlockLink.md new file mode 100644 index 00000000..6b4c3e98 --- /dev/null +++ b/docs/tech/classes/DocBlockLink.md @@ -0,0 +1,95 @@ + + BumbleDocGen / Technical description of the project / Class map / DocBlockLink
        + +

        + DocBlockLink class: +

        + + + + + +```php +namespace BumbleDocGen\LanguageHandler\Php\Parser\Entity\Data; + +final class DocBlockLink +``` + + + + + + + + +

        Initialization methods:

        + +
          +
        1. + __construct +
        2. +
        + + + + + + + + +

        Method details:

        + +
        + + + +```php +public function __construct(string $name, string $description = '', string|null $className = null, string|null $url = null); +``` + + + +Parameters: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        NameTypeDescription
        $namestring-
        $descriptionstring-
        $classNamestring | null-
        $urlstring | null-
        + + + +
        +
        + + \ No newline at end of file diff --git a/docs/tech/classes/DocGenerator.md b/docs/tech/classes/DocGenerator.md index d8083ff2..cb7bfb48 100644 --- a/docs/tech/classes/DocGenerator.md +++ b/docs/tech/classes/DocGenerator.md @@ -2,7 +2,7 @@ BumbleDocGen / Technical description of the project / Class map / DocGenerator

        - DocGenerator class: + DocGenerator class:

        @@ -52,11 +52,11 @@ final class DocGenerator @@ -71,11 +71,11 @@ final class DocGenerator ```php -public function __construct(\Symfony\Component\Console\Style\OutputStyle $io, \BumbleDocGen\Core\Configuration\Configuration $configuration, \BumbleDocGen\Core\Plugin\PluginEventDispatcher $pluginEventDispatcher, \BumbleDocGen\Core\Parser\ProjectParser $parser, \BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper $parserHelper, \BumbleDocGen\Core\Renderer\Renderer $renderer, \BumbleDocGen\Core\Logger\Handler\GenerationErrorsHandler $generationErrorsHandler, \BumbleDocGen\Core\Parser\Entity\RootEntityCollectionsGroup $rootEntityCollectionsGroup, \Monolog\Logger $logger); +public function __construct(\Symfony\Component\Console\Style\OutputStyle $io, \BumbleDocGen\Core\Configuration\Configuration $configuration, \BumbleDocGen\Core\Plugin\PluginEventDispatcher $pluginEventDispatcher, \BumbleDocGen\Core\Parser\ProjectParser $parser, \BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper $parserHelper, \BumbleDocGen\Core\Renderer\Renderer $renderer, \BumbleDocGen\Core\Logger\Handler\GenerationErrorsHandler $generationErrorsHandler, \BumbleDocGen\Core\Parser\Entity\RootEntityCollectionsGroup $rootEntityCollectionsGroup, \BumbleDocGen\Console\ProgressBar\ProgressBarFactory $progressBarFactory, \Monolog\Logger $logger); ``` @@ -130,6 +130,11 @@ public function __construct(\Symfony\Component\Console\Style\OutputStyle $io, \B $rootEntityCollectionsGroup \BumbleDocGen\Core\Parser\Entity\RootEntityCollectionsGroup - + + + $progressBarFactory + \BumbleDocGen\Console\ProgressBar\ProgressBarFactory + - $logger @@ -161,7 +166,7 @@ public function __construct(\Symfony\Component\Console\Style\OutputStyle $io, \B ```php @@ -297,7 +302,7 @@ public function generateReadmeTemplate(\BumbleDocGen\AI\ProviderInterface $aiPro ```php diff --git a/docs/tech/classes/DocGeneratorFactory.md b/docs/tech/classes/DocGeneratorFactory.md index cf8dbf0d..47b2018c 100644 --- a/docs/tech/classes/DocGeneratorFactory.md +++ b/docs/tech/classes/DocGeneratorFactory.md @@ -2,7 +2,7 @@ BumbleDocGen / Technical description of the project / Class map / DocGeneratorFactory

        - DocGeneratorFactory class: + DocGeneratorFactory class:

        @@ -42,6 +42,9 @@ final class DocGeneratorFactory
      79. createConfiguration
      80. +
      81. + getRootEntityReflections +
      82. setCustomConfigurationParameters
      83. @@ -63,7 +66,7 @@ final class DocGeneratorFactory ```php @@ -100,7 +103,7 @@ public function __construct(string $diConfig = __DIR__ . '/di-config.php'); ```php @@ -151,7 +154,7 @@ public function create(string|null ...$configurationFiles): \BumbleDocGen\DocGen ```php @@ -202,7 +205,7 @@ public function createByConfigArray(array $config): \BumbleDocGen\DocGenerator; ```php @@ -233,6 +236,57 @@ public function createConfiguration(string ...$configurationFiles): \BumbleDocGe Return value: \BumbleDocGen\Core\Configuration\Configuration +Throws: + + +
        +
        +
        + + + +```php +public function getRootEntityReflections(\BumbleDocGen\Core\Configuration\ReflectionApiConfig $reflectionApiConfig): \BumbleDocGen\Core\Parser\Entity\RootEntityCollection; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
        NameTypeDescription
        $reflectionApiConfig\BumbleDocGen\Core\Configuration\ReflectionApiConfig-
        + +Return value: \BumbleDocGen\Core\Parser\Entity\RootEntityCollection + + Throws:
      @@ -103,20 +103,20 @@ public function cursorToDocAttributeLinkFragment(string $cursor, bool $isForDocu
      ```php -public function documentCreationAllowed(): bool; +public function getDocRender(): \BumbleDocGen\Core\Renderer\EntityDocRenderer\EntityDocRendererInterface; ``` Parameters: not specified -Return value: bool +Return value: \BumbleDocGen\Core\Renderer\EntityDocRenderer\EntityDocRendererInterface
      @@ -124,20 +124,20 @@ public function documentCreationAllowed(): bool;
      ```php -public function entityCacheIsOutdated(): bool; +public function getName(): string; ``` Parameters: not specified -Return value: bool +Return value: string
      @@ -145,20 +145,20 @@ public function entityCacheIsOutdated(): bool;
      ```php -public function getDocRender(): \BumbleDocGen\Core\Renderer\EntityDocRenderer\EntityDocRendererInterface; +public function getRootEntityCollection(): \BumbleDocGen\Core\Parser\Entity\RootEntityCollection; ``` Parameters: not specified -Return value: \BumbleDocGen\Core\Renderer\EntityDocRenderer\EntityDocRendererInterface +Return value: \BumbleDocGen\Core\Parser\Entity\RootEntityCollection
      @@ -166,13 +166,13 @@ public function getDocRender(): \BumbleDocGen\Core\Renderer\EntityDocRenderer\En
      ```php -public function getName(): string; +public function getShortName(): string; ``` @@ -187,20 +187,20 @@ public function getName(): string;
      ```php -public function getRootEntityCollection(): \BumbleDocGen\Core\Parser\Entity\RootEntityCollection; +public function isDocumentCreationAllowed(): bool; ``` Parameters: not specified -Return value: \BumbleDocGen\Core\Parser\Entity\RootEntityCollection +Return value: bool
      @@ -208,20 +208,20 @@ public function getRootEntityCollection(): \BumbleDocGen\Core\Parser\Entity\Root
      ```php -public function getShortName(): string; +public function isEntityCacheOutdated(): bool; ``` Parameters: not specified -Return value: string +Return value: bool
      diff --git a/docs/tech/classes/DrawClassMap.md b/docs/tech/classes/DrawClassMap.md index 9d6cb02d..e8458489 100644 --- a/docs/tech/classes/DrawClassMap.md +++ b/docs/tech/classes/DrawClassMap.md @@ -21,12 +21,12 @@ final class DrawClassMap implements \BumbleDocGen\Core\Renderer\Twig\Function\Cu Examples of using: ```php -{{ drawClassMap(classEntityCollection.filterByPaths(['/src/Renderer'])) }} +{{ drawClassMap(phpEntities.filterByPaths(['/src/Renderer'])) }} ``` ```php -{{ drawClassMap(classEntityCollection) }} +{{ drawClassMap(phpEntities) }} ``` @@ -132,7 +132,7 @@ public function __construct(\BumbleDocGen\Core\Renderer\Twig\Function\GetDocumen ```php -public function __invoke(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection ...$classEntityCollections): string; +public function __invoke(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection ...$entitiesCollections): string; ``` @@ -149,8 +149,8 @@ public function __invoke(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEn - $classEntityCollections (variadic) - \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection + $entitiesCollections (variadic) + \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection The collection of entities for which the class map will be generated @@ -231,7 +231,7 @@ public function convertDirectoryStructureToFormattedString(array $structure, str ```php -public function getDirectoryStructure(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection ...$classEntityCollections): array; +public function getDirectoryStructure(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection ...$entitiesCollections): array; ``` @@ -248,8 +248,8 @@ public function getDirectoryStructure(\BumbleDocGen\LanguageHandler\Php\Parser\E - $classEntityCollections (variadic) - \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection + $entitiesCollections (variadic) + \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection - diff --git a/docs/tech/classes/DynamicMethodEntity.md b/docs/tech/classes/DynamicMethodEntity.md index 34dd8cf1..8fea58ca 100644 --- a/docs/tech/classes/DynamicMethodEntity.md +++ b/docs/tech/classes/DynamicMethodEntity.md @@ -2,7 +2,7 @@ BumbleDocGen / Technical description of the project / Class map / DynamicMethodEntity

      - DynamicMethodEntity class: + DynamicMethodEntity class:

      @@ -10,9 +10,9 @@ ```php -namespace BumbleDocGen\LanguageHandler\Php\Parser\Entity; +namespace BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method; -class DynamicMethodEntity implements \BumbleDocGen\LanguageHandler\Php\Parser\Entity\MethodEntityInterface, \BumbleDocGen\Core\Parser\Entity\EntityInterface +class DynamicMethodEntity implements \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntityInterface, \BumbleDocGen\Core\Parser\Entity\EntityInterface ```
      Method obtained by parsing the "method" annotation
      @@ -33,90 +33,96 @@ class DynamicMethodEntity implements \BumbleDocGen\LanguageHandler\Php\Parser\En

      Methods:

        -
      1. - entityCacheIsOutdated -
      2. getAbsoluteFileName -
      3. + - Returns the absolute path to a file if it can be retrieved and if the file is in the project directory
      4. getBodyCode -
      5. + - Get the code for this method
      6. getCallMethod -
      7. + - Get the entity of the magic method that will be called instead of the current virtual one
      8. getDescription -
      9. + - Get a description of this method
      10. getEndLine -
      11. -
      12. - getFileName -
      13. + - Get the line number of the end of a method's code in a file
      14. getFirstReturnValue -
      15. + - Get the compiled first return value of a method (if possible)
      16. getImplementingClass -
      17. + - Get the ClassLike entity in which this method was implemented
      18. getImplementingClassName -
      19. + - Get the name of the class in which this method is implemented
      20. getModifiersString -
      21. + - Get a text representation of method modifiers
      22. getName -
      23. + - Full name of the entity
      24. getNamespaceName -
      25. + - Namespace of the class that contains this method
      26. getObjectId -
      27. + - Entity object ID
      28. getParameters -
      29. + - Get a list of method parameters
      30. getParametersString -
      31. + - Get a list of method parameters as a string +
      32. + getRelativeFileName + - File name relative to project_root configuration parameter
      33. getReturnType -
      34. + - Get the return type of method
      35. getRootEntity -
      36. + - Get the class like entity where this method was obtained
      37. getRootEntityCollection - Get parent collection of entities
      38. getShortName -
      39. + - Short name of the entity +
      40. + getSignature + - Get the method signature as a string
      41. getStartColumn -
      42. + - Get the column number of the beginning of the method code in a file
      43. getStartLine -
      44. + - Get the line number of the beginning of the method code in a file
      45. isDynamic + - Check if a method is a dynamic method, that is, implementable using __call or __callStatic
      46. +
      47. + isEntityCacheOutdated
      48. +
      49. + isImplementedInParentClass + - Check if this method is implemented in the parent class
      50. isInitialization -
      51. + - Check if a method is an initialization method
      52. isPrivate -
      53. + - Check if a method is a private method
      54. isProtected -
      55. + - Check if a method is a protected method
      56. isPublic -
      57. + - Check if a method is a public method
      58. isStatic -
      59. + - Check if this method is static
      @@ -132,11 +138,11 @@ class DynamicMethodEntity implements \BumbleDocGen\LanguageHandler\Php\Parser\En ```php -public function __construct(\BumbleDocGen\Core\Configuration\Configuration $configuration, \BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper $parserHelper, \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity $classEntity, \phpDocumentor\Reflection\DocBlock\Tags\Method $annotationMethod); +public function __construct(\BumbleDocGen\Core\Configuration\Configuration $configuration, \BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper $parserHelper, \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity $classEntity, \phpDocumentor\Reflection\DocBlock\Tags\Method $annotationMethod); ``` @@ -164,7 +170,7 @@ public function __construct(\BumbleDocGen\Core\Configuration\Configuration $conf $classEntity - \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity + \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - @@ -177,27 +183,6 @@ public function __construct(\BumbleDocGen\Core\Configuration\Configuration $conf -
      -
      -
      - - - -```php -public function entityCacheIsOutdated(): bool; -``` - - - -Parameters: not specified - -Return value: bool - -

      @@ -205,27 +190,20 @@ public function entityCacheIsOutdated(): bool; ```php public function getAbsoluteFileName(): null|string; ``` - +
      Returns the absolute path to a file if it can be retrieved and if the file is in the project directory
      Parameters: not specified Return value: null | string -Throws: - -

      @@ -233,14 +211,14 @@ public function getAbsoluteFileName(): null|string; ```php public function getBodyCode(): string; ``` - +
      Get the code for this method
      Parameters: not specified @@ -254,18 +232,18 @@ public function getBodyCode(): string; ```php -public function getCallMethod(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\MethodEntity; +public function getCallMethod(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntity; ``` - +
      Get the entity of the magic method that will be called instead of the current virtual one
      Parameters: not specified -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\MethodEntity +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntity Throws: @@ -282,14 +260,14 @@ public function getCallMethod(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity ```php public function getDescription(): string; ``` - +
      Get a description of this method
      Parameters: not specified @@ -303,58 +281,20 @@ public function getDescription(): string; ```php public function getEndLine(): int; ``` - +
      Get the line number of the end of a method's code in a file
      Parameters: not specified Return value: int -Throws: - - -
      -
      -
      - - - -```php -public function getFileName(): null|string; -``` - - - -Parameters: not specified - -Return value: null | string - - -Throws: - -

      @@ -362,14 +302,14 @@ public function getFileName(): null|string; ```php public function getFirstReturnValue(): mixed; ``` - +
      Get the compiled first return value of a method (if possible)
      Parameters: not specified @@ -383,18 +323,18 @@ public function getFirstReturnValue(): mixed; ```php -public function getImplementingClass(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity; +public function getImplementingClass(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; ``` - +
      Get the ClassLike entity in which this method was implemented
      Parameters: not specified -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity
      @@ -404,27 +344,20 @@ public function getImplementingClass(): \BumbleDocGen\LanguageHandler\Php\Parser ```php public function getImplementingClassName(): string; ``` - +
      Get the name of the class in which this method is implemented
      Parameters: not specified Return value: string -Throws: - -
      @@ -432,14 +365,14 @@ public function getImplementingClassName(): string; ```php public function getModifiersString(): string; ``` - +
      Get a text representation of method modifiers
      Parameters: not specified @@ -453,14 +386,14 @@ public function getModifiersString(): string; ```php public function getName(): string; ``` - +
      Full name of the entity
      Parameters: not specified @@ -474,14 +407,14 @@ public function getName(): string; ```php public function getNamespaceName(): string; ``` - +
      Namespace of the class that contains this method
      Parameters: not specified @@ -495,14 +428,14 @@ public function getNamespaceName(): string; ```php public function getObjectId(): string; ``` - +
      Entity object ID
      Parameters: not specified @@ -516,14 +449,14 @@ public function getObjectId(): string; ```php public function getParameters(): array; ``` - +
      Get a list of method parameters
      Parameters: not specified @@ -537,14 +470,14 @@ public function getParameters(): array; ```php public function getParametersString(): string; ``` - +
      Get a list of method parameters as a string
      Parameters: not specified @@ -556,29 +489,49 @@ public function getParametersString(): string;
      ```php -public function getReturnType(): string; +public function getRelativeFileName(): null|string; ``` - +
      File name relative to project_root configuration parameter
      Parameters: not specified -Return value: string +Return value: null | string -Throws: + +See: +
      +
      +
      + +```php +public function getReturnType(): string; +``` + +
      Get the return type of method
      + +Parameters: not specified + +Return value: string + +

      @@ -586,18 +539,18 @@ public function getReturnType(): string; ```php -public function getRootEntity(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity; +public function getRootEntity(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; ``` - +
      Get the class like entity where this method was obtained
      Parameters: not specified -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity
      @@ -607,7 +560,7 @@ public function getRootEntity(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity ```php @@ -628,15 +581,36 @@ public function getRootEntityCollection(): \BumbleDocGen\Core\Parser\Entity\Root ```php public function getShortName(): string; ``` +
      Short name of the entity
      + +Parameters: not specified + +Return value: string +
      +
      +
      + + + +```php +public function getSignature(): string; +``` + +
      Get the method signature as a string
      + Parameters: not specified Return value: string @@ -649,27 +623,20 @@ public function getShortName(): string; ```php public function getStartColumn(): int; ``` - +
      Get the column number of the beginning of the method code in a file
      Parameters: not specified Return value: int -Throws: - -

      @@ -677,27 +644,20 @@ public function getStartColumn(): int; ```php public function getStartLine(): int; ``` - +
      Get the line number of the beginning of the method code in a file
      Parameters: not specified Return value: int -Throws: - -

      @@ -705,14 +665,14 @@ public function getStartLine(): int; ```php public function isDynamic(): bool; ``` - +
      Check if a method is a dynamic method, that is, implementable using __call or __callStatic
      Parameters: not specified @@ -724,13 +684,13 @@ public function isDynamic(): bool;
      ```php -public function isInitialization(): bool; +public function isEntityCacheOutdated(): bool; ``` @@ -743,13 +703,55 @@ public function isInitialization(): bool; Throws: + +
      +
      +
      + + + +```php +public function isImplementedInParentClass(): bool; +``` +
      Check if this method is implemented in the parent class
      + +Parameters: not specified + +Return value: bool + + +
      +
      +
      + + +```php +public function isInitialization(): bool; +``` + +
      Check if a method is an initialization method
      + +Parameters: not specified + +Return value: bool + +

      @@ -757,14 +759,14 @@ public function isInitialization(): bool; ```php public function isPrivate(): bool; ``` - +
      Check if a method is a private method
      Parameters: not specified @@ -778,14 +780,14 @@ public function isPrivate(): bool; ```php public function isProtected(): bool; ``` - +
      Check if a method is a protected method
      Parameters: not specified @@ -799,14 +801,14 @@ public function isProtected(): bool; ```php public function isPublic(): bool; ``` - +
      Check if a method is a public method
      Parameters: not specified @@ -820,14 +822,14 @@ public function isPublic(): bool; ```php public function isStatic(): bool; ``` - +
      Check if this method is static
      Parameters: not specified diff --git a/docs/tech/classes/EntitiesLoaderProgressBarInterface.md b/docs/tech/classes/EntitiesLoaderProgressBarInterface.md new file mode 100644 index 00000000..b9d7702d --- /dev/null +++ b/docs/tech/classes/EntitiesLoaderProgressBarInterface.md @@ -0,0 +1,168 @@ + + BumbleDocGen / Technical description of the project / Class map / EntitiesLoaderProgressBarInterface
      + +

      + EntitiesLoaderProgressBarInterface class: +

      + + + + + +```php +namespace BumbleDocGen\Core\Parser\Entity; + +interface EntitiesLoaderProgressBarInterface +``` + + + + + + + + + +

      Methods:

      + +
        +
      1. + iterate +
      2. +
      3. + setName +
      4. +
      5. + setStepDescription +
      6. +
      + + + + + + + +

      Method details:

      + +
      + + + +```php +public function iterate(iterable $iterable, int|null $max = null): \Generator; +``` + + + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $iterableiterable-
      $maxint | null-
      + +Return value: \Generator + + +
      +
      +
      + + + +```php +public function setName(string $name): void; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $namestring-
      + +Return value: void + + +
      +
      +
      + + + +```php +public function setStepDescription(string $stepDescription): void; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $stepDescriptionstring-
      + +Return value: void + + +
      +
      + + \ No newline at end of file diff --git a/docs/tech/classes/EntityCacheItemPool.md b/docs/tech/classes/EntityCacheItemPool.md index 6660ffd5..030cee81 100644 --- a/docs/tech/classes/EntityCacheItemPool.md +++ b/docs/tech/classes/EntityCacheItemPool.md @@ -2,13 +2,13 @@ BumbleDocGen / Technical description of the project / Class map / EntityCacheItemPool

      - EntityCacheItemPool class: + EntityCacheItemPool class:

      - +:warning: Is internal ```php namespace BumbleDocGen\Core\Cache; @@ -75,7 +75,7 @@ final class EntityCacheItemPool implements \Psr\Cache\CacheItemPoolInterface ```php @@ -119,7 +119,7 @@ public function __construct(\BumbleDocGen\Core\Configuration\Configuration $conf ```php @@ -140,7 +140,7 @@ public function clear(): bool; ```php @@ -161,7 +161,7 @@ public function commit(): bool; ```php @@ -199,7 +199,7 @@ public function deleteItem(string $key): bool; ```php @@ -237,7 +237,7 @@ public function deleteItems(array $keys): bool; ```php @@ -275,7 +275,7 @@ public function getItem(string $key): \Psr\Cache\CacheItemInterface; ```php @@ -313,7 +313,7 @@ public function getItems(array $keys = []): iterable; ```php @@ -351,7 +351,7 @@ public function hasItem(string $key): bool; ```php @@ -389,7 +389,7 @@ public function save(\Psr\Cache\CacheItemInterface $item): bool; ```php diff --git a/docs/tech/classes/EntityInterface.md b/docs/tech/classes/EntityInterface.md index 317c5847..bab90127 100644 --- a/docs/tech/classes/EntityInterface.md +++ b/docs/tech/classes/EntityInterface.md @@ -2,7 +2,7 @@ BumbleDocGen / Technical description of the project / Class map / EntityInterface

      - EntityInterface class: + EntityInterface class:

      @@ -26,26 +26,26 @@ interface EntityInterface

      Methods:

        -
      1. - entityCacheIsOutdated -
      2. getAbsoluteFileName - Returns the absolute path to a file if it can be retrieved and if the file is in the project directory
      3. -
      4. - getFileName - - Returns the relative path to a file if it can be retrieved and if the file is in the project directory
      5. getName -
      6. + - Full name of the entity
      7. getObjectId -
      8. + - Entity object ID +
      9. + getRelativeFileName + - File name relative to project_root configuration parameter
      10. getRootEntityCollection - Get parent collection of entities
      11. getShortName + - Short name of the entity
      12. +
      13. + isEntityCacheOutdated
      @@ -59,31 +59,10 @@ interface EntityInterface
      - - -```php -public function entityCacheIsOutdated(): bool; -``` - - - -Parameters: not specified - -Return value: bool - - -
      -
      -
      - ```php @@ -102,20 +81,20 @@ public function getAbsoluteFileName(): null|string;
      ```php -public function getFileName(): null|string; +public function getName(): string; ``` -
      Returns the relative path to a file if it can be retrieved and if the file is in the project directory
      +
      Full name of the entity
      Parameters: not specified -Return value: null | string +Return value: string
      @@ -123,16 +102,16 @@ public function getFileName(): null|string;
      ```php -public function getName(): string; +public function getObjectId(): string; ``` - +
      Entity object ID
      Parameters: not specified @@ -144,22 +123,28 @@ public function getName(): string;
      ```php -public function getObjectId(): string; +public function getRelativeFileName(): null|string; ``` - +
      File name relative to project_root configuration parameter
      Parameters: not specified -Return value: string +Return value: null | string + +See: +

      @@ -167,7 +152,7 @@ public function getObjectId(): string; ```php @@ -188,20 +173,41 @@ public function getRootEntityCollection(): \BumbleDocGen\Core\Parser\Entity\Root ```php public function getShortName(): string; ``` - +
      Short name of the entity
      Parameters: not specified Return value: string +
      +
      +
      + +
        +
      • # + isEntityCacheOutdated + :warning: Is internal | source code
      • +
      + +```php +public function isEntityCacheOutdated(): bool; +``` + + + +Parameters: not specified + +Return value: bool + +

      diff --git a/docs/tech/classes/EnumEntity.md b/docs/tech/classes/EnumEntity.md new file mode 100644 index 00000000..8ebbe5ce --- /dev/null +++ b/docs/tech/classes/EnumEntity.md @@ -0,0 +1,3562 @@ + + BumbleDocGen / Technical description of the project / Class map / EnumEntity
      + +

      + EnumEntity class: +

      + + + + + +```php +namespace BumbleDocGen\LanguageHandler\Php\Parser\Entity; + +class EnumEntity extends \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity implements \BumbleDocGen\Core\Renderer\Context\DocumentTransformableEntityInterface, \BumbleDocGen\Core\Parser\Entity\RootEntityInterface, \BumbleDocGen\Core\Parser\Entity\EntityInterface, \BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityInterface +``` + +
      Enumeration
      + +See: + + + + + + + +

      Initialization methods:

      + +
        +
      1. + __construct +
      2. +
      + +

      Methods:

      + +
        +
      1. + addPluginData + - Add information to aт entity object
      2. +
      3. + cursorToDocAttributeLinkFragment +
      4. +
      5. + getAbsoluteFileName + - Returns the absolute path to a file if it can be retrieved and if the file is in the project directory
      6. +
      7. + getAst + - Get AST for this entity
      8. +
      9. + getCacheKey +
      10. +
      11. + getCachedEntityDependencies +
      12. +
      13. + getCasesNames + - Get enum cases names
      14. +
      15. + getConstant + - Get the method entity by its name
      16. +
      17. + getConstantEntitiesCollection + - Get a collection of constant entities
      18. +
      19. + getConstantValue + - Get the compiled value of a constant
      20. +
      21. + getConstants + - Get all constants that are available according to the configuration as an array
      22. +
      23. + getConstantsData + - Get a list of all constants and classes where they are implemented
      24. +
      25. + getConstantsValues + - Get class constant compiled values according to filters
      26. +
      27. + getCurrentRootEntity +
      28. +
      29. + getDescription + - Get entity description
      30. +
      31. + getDescriptionLinks + - Get parsed links from description and doc blocks `see` and `link`
      32. +
      33. + getDocBlock + - Get DocBlock for current entity
      34. +
      35. + getDocComment + - Get the doc comment of an entity
      36. +
      37. + getDocCommentEntity + - Link to an entity where docBlock is implemented for this entity
      38. +
      39. + getDocCommentLine + - Get the code line number where the docBlock of the current entity begins
      40. +
      41. + getDocNote + - Get the note annotation value
      42. +
      43. + getDocRender +
      44. +
      45. + getEndLine + - Get the line number of the end of a class code in a file
      46. +
      47. + getEntityDependencies +
      48. +
      49. + getEnumCaseValue + - Get enum case value
      50. +
      51. + getEnumCases + - Get enum cases values
      52. +
      53. + getExamples + - Get parsed examples from `examples` doc block
      54. +
      55. + getFileContent +
      56. +
      57. + getFileSourceLink +
      58. +
      59. + getFirstExample + - Get first example from `examples` doc block
      60. +
      61. + getImplementingClass + - Get the class like entity in which the current entity was implemented
      62. +
      63. + getInterfaceNames + - Get a list of class interface names
      64. +
      65. + getInterfacesEntities + - Get a list of interface entities that the current class implements
      66. +
      67. + getMethod + - Get the method entity by its name
      68. +
      69. + getMethodEntitiesCollection + - Get a collection of method entities
      70. +
      71. + getMethods + - Get all methods that are available according to the configuration as an array
      72. +
      73. + getMethodsData + - Get a list of all methods and classes where they are implemented
      74. +
      75. + getModifiersString + - Get entity modifiers as a string
      76. +
      77. + getName + - Full name of the entity
      78. +
      79. + getNamespaceName + - Get the entity namespace name
      80. +
      81. + getObjectId + - Get entity unique ID
      82. +
      83. + getParentClass + - Get the entity of the parent class if it exists
      84. +
      85. + getParentClassEntities + - Get a list of parent class entities
      86. +
      87. + getParentClassName + - Get the name of the parent class entity if it exists
      88. +
      89. + getParentClassNames + - Get a list of entity names of parent classes
      90. +
      91. + getPluginData + - Get additional information added using the plugin
      92. +
      93. + getProperties + - Get all properties that are available according to the configuration as an array
      94. +
      95. + getPropertiesData + - Get a list of all properties and classes where they are implemented
      96. +
      97. + getProperty + - Get the property entity by its name
      98. +
      99. + getPropertyDefaultValue + - Get the compiled value of a property
      100. +
      101. + getPropertyEntitiesCollection + - Get a collection of property entities
      102. +
      103. + getRelativeFileName + - File name relative to project_root configuration parameter
      104. +
      105. + getRootEntityCollection + - Get the collection of root entities to which this entity belongs
      106. +
      107. + getShortName + - Short name of the entity
      108. +
      109. + getStartLine + - Get the line number of the start of a class code in a file
      110. +
      111. + getThrows + - Get parsed throws from `throws` doc block
      112. +
      113. + getThrowsDocBlockLinks +
      114. +
      115. + getTraits + - Get a list of trait entities of the current class
      116. +
      117. + getTraitsNames + - Get a list of class traits names
      118. +
      119. + hasConstant + - Check if a constant exists in a class
      120. +
      121. + hasDescriptionLinks + - Checking if an entity has links in its description
      122. +
      123. + hasExamples + - Checking if an entity has `example` docBlock
      124. +
      125. + hasMethod + - Check if a method exists in a class
      126. +
      127. + hasParentClass + - Check if a certain parent class exists in a chain of parent classes
      128. +
      129. + hasProperty + - Check if a property exists in a class
      130. +
      131. + hasThrows + - Checking if an entity has `throws` docBlock
      132. +
      133. + hasTraits + - Check if the class contains traits
      134. +
      135. + implementsInterface + - Check if a class implements an interface
      136. +
      137. + isAbstract + - Check that an entity is abstract
      138. +
      139. + isApi + - Checking if an entity has `api` docBlock
      140. +
      141. + isClass + - Check if an entity is a Class
      142. +
      143. + isClassLoad +
      144. +
      145. + isDeprecated + - Checking if an entity has `deprecated` docBlock
      146. +
      147. + isDocumentCreationAllowed +
      148. +
      149. + isEntityCacheOutdated + - Checking if the entity cache is out of date
      150. +
      151. + isEntityDataCacheOutdated +
      152. +
      153. + isEntityDataCanBeLoaded +
      154. +
      155. + isEntityFileCanBeLoad + - Checking if entity data can be retrieved
      156. +
      157. + isEntityNameValid + - Check if the name is a valid name for ClassLikeEntity
      158. +
      159. + isEnum + - Check if an entity is an Enum
      160. +
      161. + isExternalLibraryEntity + - Check if a given entity is an entity from a third party library (connected via composer)
      162. +
      163. + isInGit + - Checking if class file is in git repository
      164. +
      165. + isInstantiable + - Check that an entity is instantiable
      166. +
      167. + isInterface + - Check if an entity is an Interface
      168. +
      169. + isInternal + - Checking if an entity has `internal` docBlock
      170. +
      171. + isSubclassOf + - Whether the given class is a subclass of the specified class
      172. +
      173. + isTrait + - Check if an entity is a Trait
      174. +
      175. + normalizeClassName +
      176. +
      177. + reloadEntityDependenciesCache + - Update entity dependency cache
      178. +
      179. + removeEntityValueFromCache +
      180. +
      181. + removeNotUsedEntityDataCache +
      182. +
      183. + setCustomAst +
      184. +
      + + + + + + + +

      Method details:

      + +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function __construct(\BumbleDocGen\Core\Configuration\Configuration $configuration, \BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings $phpHandlerSettings, \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection $entitiesCollection, \BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper $parserHelper, \BumbleDocGen\LanguageHandler\Php\Parser\ComposerHelper $composerHelper, \BumbleDocGen\LanguageHandler\Php\Parser\PhpParser\PhpParserHelper $phpParserHelper, \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache $localObjectCache, \Psr\Log\LoggerInterface $logger, string $className, string|null $relativeFileName); +``` + + + +Parameters: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $configuration\BumbleDocGen\Core\Configuration\Configuration-
      $phpHandlerSettings\BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings-
      $entitiesCollection\BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection-
      $parserHelper\BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper-
      $composerHelper\BumbleDocGen\LanguageHandler\Php\Parser\ComposerHelper-
      $phpParserHelper\BumbleDocGen\LanguageHandler\Php\Parser\PhpParser\PhpParserHelper-
      $localObjectCache\BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache-
      $logger\Psr\Log\LoggerInterface-
      $classNamestring-
      $relativeFileNamestring | null-
      + + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function addPluginData(string $pluginKey, mixed $data): void; +``` + +
      Add information to aт entity object
      + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $pluginKeystring-
      $datamixed-
      + +Return value: void + + +
      +
      +
      + +
        +
      • # + cursorToDocAttributeLinkFragment + :warning: Is internal | source code
      • +
      + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function cursorToDocAttributeLinkFragment(string $cursor, bool $isForDocument = true): string; +``` + + + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $cursorstring-
      $isForDocumentbool-
      + +Return value: string + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getAbsoluteFileName(): null|string; +``` + +
      Returns the absolute path to a file if it can be retrieved and if the file is in the project directory
      + +Parameters: not specified + +Return value: null | string + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getAst(): \PhpParser\Node\Stmt\Class_|\PhpParser\Node\Stmt\Interface_|\PhpParser\Node\Stmt\Trait_|\PhpParser\Node\Stmt\Enum_; +``` + +
      Get AST for this entity
      + +Parameters: not specified + +Return value: \PhpParser\Node\Stmt\Class_ | \PhpParser\Node\Stmt\Interface_ | \PhpParser\Node\Stmt\Trait_ | \PhpParser\Node\Stmt\Enum_ + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait + +public function getCacheKey(): string; +``` + + + +Parameters: not specified + +Return value: string + + +
      +
      +
      + +
        +
      • # + getCachedEntityDependencies + :warning: Is internal | source code
      • +
      + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getCachedEntityDependencies(): array; +``` + + + +Parameters: not specified + +Return value: array + + +Throws: + + +
      +
      +
      + + + +```php +public function getCasesNames(): array; +``` + +
      Get enum cases names
      + +Parameters: not specified + +Return value: array + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getConstant(string $constantName, bool $unsafe = false): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity; +``` + +
      Get the method entity by its name
      + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $constantNamestringThe name of the constant whose entity you want to get
      $unsafeboolCheck all constants, not just the constants allowed in the configuration (@see PhpHandlerSettings::getClassConstantEntityFilter())
      + +Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getConstantEntitiesCollection(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntitiesCollection; +``` + +
      Get a collection of constant entities
      + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntitiesCollection + + +Throws: + + + +See: + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getConstantValue(string $constantName): string|array|int|bool|null|float; +``` + +
      Get the compiled value of a constant
      + +Parameters: + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $constantNamestringThe name of the constant for which you need to get the value
      + +Return value: string | array | int | bool | null | float + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getConstants(): array; +``` + +
      Get all constants that are available according to the configuration as an array
      + +Parameters: not specified + +Return value: array + + +Throws: + + + +See: + +
      +
      +
      + +
        +
      • # + getConstantsData + :warning: Is internal | source code
      • +
      + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getConstantsData(bool $onlyFromCurrentClassAndTraits = false, int $flags = \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity::VISIBILITY_MODIFIERS_FLAG_ANY): array; +``` + +
      Get a list of all constants and classes where they are implemented
      + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $onlyFromCurrentClassAndTraitsboolGet data only for constants from the current class
      $flagsintGet data only for constants corresponding to the visibility modifiers passed in this value
      + +Return value: array + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getConstantsValues(bool $onlyFromCurrentClassAndTraits = false, int $flags = \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity::VISIBILITY_MODIFIERS_FLAG_ANY): array; +``` + +
      Get class constant compiled values according to filters
      + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $onlyFromCurrentClassAndTraitsboolGet values only for constants from the current class
      $flagsintGet values only for constants corresponding to the visibility modifiers passed in this value
      + +Return value: array + + +Throws: + + +
      +
      +
      + +
        +
      • # + getCurrentRootEntity + :warning: Is internal | source code
      • +
      + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getCurrentRootEntity(): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; +``` + + + +Parameters: not specified + +Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDescription(): string; +``` + +
      Get entity description
      + +Parameters: not specified + +Return value: string + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDescriptionLinks(): array; +``` + +
      Get parsed links from description and doc blocks `see` and `link`
      + +Parameters: not specified + +Return value: array + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDocBlock(): \phpDocumentor\Reflection\DocBlock; +``` + +
      Get DocBlock for current entity
      + +Parameters: not specified + +Return value: \phpDocumentor\Reflection\DocBlock + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDocComment(): string; +``` + +
      Get the doc comment of an entity
      + +Parameters: not specified + +Return value: string + + +Throws: + + +
      +
      +
      + +
        +
      • # + getDocCommentEntity + :warning: Is internal | source code
      • +
      + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getDocCommentEntity(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; +``` + +
      Link to an entity where docBlock is implemented for this entity
      + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDocCommentLine(): null|int; +``` + +
      Get the code line number where the docBlock of the current entity begins
      + +Parameters: not specified + +Return value: null | int + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDocNote(): string; +``` + +
      Get the note annotation value
      + +Parameters: not specified + +Return value: string + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getDocRender(): \BumbleDocGen\Core\Renderer\EntityDocRenderer\EntityDocRendererInterface; +``` + + + +Parameters: not specified + +Return value: \BumbleDocGen\Core\Renderer\EntityDocRenderer\EntityDocRendererInterface + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getEndLine(): int; +``` + +
      Get the line number of the end of a class code in a file
      + +Parameters: not specified + +Return value: int + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getEntityDependencies(): array; +``` + + + +Parameters: not specified + +Return value: array + + +
      +
      +
      + + + +```php +public function getEnumCaseValue(string $name): mixed; +``` + +
      Get enum case value
      + +Parameters: + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $namestring-
      + +Return value: mixed + + +Throws: + + +
      +
      +
      + + + +```php +public function getEnumCases(): array; +``` + +
      Get enum cases values
      + +Parameters: not specified + +Return value: array + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getExamples(): array; +``` + +
      Get parsed examples from `examples` doc block
      + +Parameters: not specified + +Return value: array + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getFileContent(): string; +``` + + + +Parameters: not specified + +Return value: string + + +Throws: + + +
      +
      +
      + +
        +
      • # + getFileSourceLink + :warning: Is internal | source code
      • +
      + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getFileSourceLink(bool $withLine = true): null|string; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $withLinebool-
      + +Return value: null | string + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getFirstExample(): string; +``` + +
      Get first example from `examples` doc block
      + +Parameters: not specified + +Return value: string + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getImplementingClass(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; +``` + +
      Get the class like entity in which the current entity was implemented
      + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + + +
      +
      +
      + + + +```php +public function getInterfaceNames(): array; +``` + +
      Get a list of class interface names
      + +Parameters: not specified + +Return value: array + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getInterfacesEntities(): array; +``` + +
      Get a list of interface entities that the current class implements
      + +Parameters: not specified + +Return value: array + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getMethod(string $methodName, bool $unsafe = false): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntity; +``` + +
      Get the method entity by its name
      + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $methodNamestringThe name of the method whose entity you want to get
      $unsafeboolCheck all methods, not just the methods allowed in the configuration (@see PhpHandlerSettings::getMethodEntityFilter())
      + +Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntity + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getMethodEntitiesCollection(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntitiesCollection; +``` + +
      Get a collection of method entities
      + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntitiesCollection + + +Throws: + + + +See: + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getMethods(): array; +``` + +
      Get all methods that are available according to the configuration as an array
      + +Parameters: not specified + +Return value: array + + +Throws: + + + +See: + +
      +
      +
      + +
        +
      • # + getMethodsData + :warning: Is internal | source code
      • +
      + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getMethodsData(bool $onlyFromCurrentClassAndTraits = false, int $flags = \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntity::VISIBILITY_MODIFIERS_FLAG_ANY): array; +``` + +
      Get a list of all methods and classes where they are implemented
      + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $onlyFromCurrentClassAndTraitsboolGet data only for methods from the current class
      $flagsintGet data only for methods corresponding to the visibility modifiers passed in this value
      + +Return value: array + + +Throws: + + +
      +
      +
      + + + +```php +public function getModifiersString(): string; +``` + +
      Get entity modifiers as a string
      + +Parameters: not specified + +Return value: string + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getName(): string; +``` + +
      Full name of the entity
      + +Parameters: not specified + +Return value: string + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getNamespaceName(): string; +``` + +
      Get the entity namespace name
      + +Parameters: not specified + +Return value: string + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getObjectId(): string; +``` + +
      Get entity unique ID
      + +Parameters: not specified + +Return value: string + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getParentClass(): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; +``` + +
      Get the entity of the parent class if it exists
      + +Parameters: not specified + +Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getParentClassEntities(): array; +``` + +
      Get a list of parent class entities
      + +Parameters: not specified + +Return value: array + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getParentClassName(): null|string; +``` + +
      Get the name of the parent class entity if it exists
      + +Parameters: not specified + +Return value: null | string + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getParentClassNames(): array; +``` + +
      Get a list of entity names of parent classes
      + +Parameters: not specified + +Return value: array + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getPluginData(string $pluginKey): mixed; +``` + +
      Get additional information added using the plugin
      + +Parameters: + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $pluginKeystring-
      + +Return value: mixed + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getProperties(): array; +``` + +
      Get all properties that are available according to the configuration as an array
      + +Parameters: not specified + +Return value: array + + +Throws: + + + +See: + +
      +
      +
      + +
        +
      • # + getPropertiesData + :warning: Is internal | source code
      • +
      + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getPropertiesData(bool $onlyFromCurrentClassAndTraits = false, int $flags = \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntity::VISIBILITY_MODIFIERS_FLAG_ANY): array; +``` + +
      Get a list of all properties and classes where they are implemented
      + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $onlyFromCurrentClassAndTraitsboolGet data only for properties from the current class
      $flagsintGet data only for properties corresponding to the visibility modifiers passed in this value
      + +Return value: array + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getProperty(string $propertyName, bool $unsafe = false): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntity; +``` + +
      Get the property entity by its name
      + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $propertyNamestringThe name of the property whose entity you want to get
      $unsafeboolCheck all properties, not just the properties allowed in the configuration (@see PhpHandlerSettings::getPropertyEntityFilter())
      + +Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntity + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getPropertyDefaultValue(string $propertyName): string|array|int|bool|null|float; +``` + +
      Get the compiled value of a property
      + +Parameters: + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $propertyNamestringThe name of the property for which you need to get the value
      + +Return value: string | array | int | bool | null | float + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getPropertyEntitiesCollection(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntitiesCollection; +``` + +
      Get a collection of property entities
      + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntitiesCollection + + +Throws: + + + +See: + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getRelativeFileName(): null|string; +``` + +
      File name relative to project_root configuration parameter
      + +Parameters: not specified + +Return value: null | string + + + +See: + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getRootEntityCollection(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; +``` + +
      Get the collection of root entities to which this entity belongs
      + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getShortName(): string; +``` + +
      Short name of the entity
      + +Parameters: not specified + +Return value: string + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getStartLine(): int; +``` + +
      Get the line number of the start of a class code in a file
      + +Parameters: not specified + +Return value: int + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getThrows(): array; +``` + +
      Get parsed throws from `throws` doc block
      + +Parameters: not specified + +Return value: array + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getThrowsDocBlockLinks(): array; +``` + + + +Parameters: not specified + +Return value: array + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getTraits(): array; +``` + +
      Get a list of trait entities of the current class
      + +Parameters: not specified + +Return value: array + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getTraitsNames(): array; +``` + +
      Get a list of class traits names
      + +Parameters: not specified + +Return value: array + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function hasConstant(string $constantName, bool $unsafe = false): bool; +``` + +
      Check if a constant exists in a class
      + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $constantNamestringThe name of the class whose entity you want to check
      $unsafeboolCheck all constants, not just the constants allowed in the configuration (@see PhpHandlerSettings::getClassConstantEntityFilter())
      + +Return value: bool + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function hasDescriptionLinks(): bool; +``` + +
      Checking if an entity has links in its description
      + +Parameters: not specified + +Return value: bool + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function hasExamples(): bool; +``` + +
      Checking if an entity has `example` docBlock
      + +Parameters: not specified + +Return value: bool + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function hasMethod(string $methodName, bool $unsafe = false): bool; +``` + +
      Check if a method exists in a class
      + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $methodNamestringThe name of the method whose entity you want to check
      $unsafeboolCheck all methods, not just the methods allowed in the configuration (@see PhpHandlerSettings::getMethodEntityFilter())
      + +Return value: bool + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function hasParentClass(string $parentClassName): bool; +``` + +
      Check if a certain parent class exists in a chain of parent classes
      + +Parameters: + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $parentClassNamestringSearched parent class
      + +Return value: bool + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function hasProperty(string $propertyName, bool $unsafe = false): bool; +``` + +
      Check if a property exists in a class
      + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $propertyNamestringThe name of the property whose entity you want to check
      $unsafeboolCheck all properties, not just the properties allowed in the configuration (@see PhpHandlerSettings::getPropertyEntityFilter())
      + +Return value: bool + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function hasThrows(): bool; +``` + +
      Checking if an entity has `throws` docBlock
      + +Parameters: not specified + +Return value: bool + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function hasTraits(): bool; +``` + +
      Check if the class contains traits
      + +Parameters: not specified + +Return value: bool + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function implementsInterface(string $interfaceName): bool; +``` + +
      Check if a class implements an interface
      + +Parameters: + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $interfaceNamestringName of the required interface in the interface chain
      + +Return value: bool + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function isAbstract(): bool; +``` + +
      Check that an entity is abstract
      + +Parameters: not specified + +Return value: bool + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function isApi(): bool; +``` + +
      Checking if an entity has `api` docBlock
      + +Parameters: not specified + +Return value: bool + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function isClass(): bool; +``` + +
      Check if an entity is a Class
      + +Parameters: not specified + +Return value: bool + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function isClassLoad(): bool; +``` + + + +Parameters: not specified + +Return value: bool + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function isDeprecated(): bool; +``` + +
      Checking if an entity has `deprecated` docBlock
      + +Parameters: not specified + +Return value: bool + + +Throws: + + +
      +
      +
      + +
        +
      • # + isDocumentCreationAllowed + :warning: Is internal | source code
      • +
      + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function isDocumentCreationAllowed(): bool; +``` + + + +Parameters: not specified + +Return value: bool + + +Throws: + + +
      +
      +
      + +
        +
      • # + isEntityCacheOutdated + :warning: Is internal | source code
      • +
      + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function isEntityCacheOutdated(): bool; +``` + +
      Checking if the entity cache is out of date
      + +Parameters: not specified + +Return value: bool + + +
      +
      +
      + +
        +
      • # + isEntityDataCacheOutdated + :warning: Is internal | source code
      • +
      + +```php +// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait + +public function isEntityDataCacheOutdated(): bool; +``` + + + +Parameters: not specified + +Return value: bool + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function isEntityDataCanBeLoaded(): bool; +``` + + + +Parameters: not specified + +Return value: bool + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function isEntityFileCanBeLoad(): bool; +``` + +
      Checking if entity data can be retrieved
      + +Parameters: not specified + +Return value: bool + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public static function isEntityNameValid(string $entityName): bool; +``` + +
      Check if the name is a valid name for ClassLikeEntity
      + +Parameters: + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $entityNamestring-
      + +Return value: bool + + +
      +
      +
      + + + +```php +public function isEnum(): bool; +``` + +
      Check if an entity is an Enum
      + +Parameters: not specified + +Return value: bool + + +
      +
      +
      + +
        +
      • # + isExternalLibraryEntity + :warning: Is internal | source code
      • +
      + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function isExternalLibraryEntity(): bool; +``` + +
      Check if a given entity is an entity from a third party library (connected via composer)
      + +Parameters: not specified + +Return value: bool + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function isInGit(): bool; +``` + +
      Checking if class file is in git repository
      + +Parameters: not specified + +Return value: bool + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function isInstantiable(): bool; +``` + +
      Check that an entity is instantiable
      + +Parameters: not specified + +Return value: bool + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function isInterface(): bool; +``` + +
      Check if an entity is an Interface
      + +Parameters: not specified + +Return value: bool + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function isInternal(): bool; +``` + +
      Checking if an entity has `internal` docBlock
      + +Parameters: not specified + +Return value: bool + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function isSubclassOf(string $className): bool; +``` + +
      Whether the given class is a subclass of the specified class
      + +Parameters: + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $classNamestring-
      + +Return value: bool + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function isTrait(): bool; +``` + +
      Check if an entity is a Trait
      + +Parameters: not specified + +Return value: bool + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public static function normalizeClassName(string $name): string; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $namestring-
      + +Return value: string + + +
      +
      +
      + +
        +
      • # + reloadEntityDependenciesCache + :warning: Is internal | source code
      • +
      + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function reloadEntityDependenciesCache(): array; +``` + +
      Update entity dependency cache
      + +Parameters: not specified + +Return value: array + + +
      +
      +
      + +
        +
      • # + removeEntityValueFromCache + :warning: Is internal | source code
      • +
      + +```php +// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait + +public function removeEntityValueFromCache(string $key): void; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $keystring-
      + +Return value: void + + +
      +
      +
      + +
        +
      • # + removeNotUsedEntityDataCache + :warning: Is internal | source code
      • +
      + +```php +// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait + +public function removeNotUsedEntityDataCache(): void; +``` + + + +Parameters: not specified + +Return value: void + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function setCustomAst(\PhpParser\Node\Stmt\Trait_|\PhpParser\Node\Stmt\Enum_|\PhpParser\Node\Stmt\Interface_|\PhpParser\Node\Stmt\Class_|null $customAst): void; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $customAst\PhpParser\Node\Stmt\Trait_ | \PhpParser\Node\Stmt\Enum_ | \PhpParser\Node\Stmt\Interface_ | \PhpParser\Node\Stmt\Class_ | null-
      + +Return value: void + + +
      +
      + + \ No newline at end of file diff --git a/docs/tech/classes/GetDocumentedEntityUrl.md b/docs/tech/classes/GetDocumentedEntityUrl.md index 9e14ed56..e13597ea 100644 --- a/docs/tech/classes/GetDocumentedEntityUrl.md +++ b/docs/tech/classes/GetDocumentedEntityUrl.md @@ -32,19 +32,19 @@ See: Examples of using: ```php -{{ getDocumentedEntityUrl(phpClassEntityCollection, '\\BumbleDocGen\\Renderer\\Twig\\MainExtension', 'getFunctions') }} +{{ getDocumentedEntityUrl(phpEntities, '\\BumbleDocGen\\Renderer\\Twig\\MainExtension', 'getFunctions') }} The function returns a reference to the documented entity, anchored to the getFunctions method ``` ```php -{{ getDocumentedEntityUrl(phpClassEntityCollection, '\\BumbleDocGen\\Renderer\\Twig\\MainExtension') }} +{{ getDocumentedEntityUrl(phpEntities, '\\BumbleDocGen\\Renderer\\Twig\\MainExtension') }} The function returns a reference to the documented entity MainExtension ``` ```php -{{ getDocumentedEntityUrl(phpClassEntityCollection, '\\BumbleDocGen\\Renderer\\Twig\\MainExtension', '', false) }} +{{ getDocumentedEntityUrl(phpEntities, '\\BumbleDocGen\\Renderer\\Twig\\MainExtension', '', false) }} The function returns a link to the file MainExtension ``` diff --git a/docs/tech/classes/GetDocumentedEntityUrl_2.md b/docs/tech/classes/GetDocumentedEntityUrl_2.md index 2126708d..a3009846 100644 --- a/docs/tech/classes/GetDocumentedEntityUrl_2.md +++ b/docs/tech/classes/GetDocumentedEntityUrl_2.md @@ -32,19 +32,19 @@ See: Examples of using: ```php -{{ getDocumentedEntityUrl(phpClassEntityCollection, '\\BumbleDocGen\\Renderer\\Twig\\MainExtension', 'getFunctions') }} +{{ getDocumentedEntityUrl(phpEntities, '\\BumbleDocGen\\Renderer\\Twig\\MainExtension', 'getFunctions') }} The function returns a reference to the documented entity, anchored to the getFunctions method ``` ```php -{{ getDocumentedEntityUrl(phpClassEntityCollection, '\\BumbleDocGen\\Renderer\\Twig\\MainExtension') }} +{{ getDocumentedEntityUrl(phpEntities, '\\BumbleDocGen\\Renderer\\Twig\\MainExtension') }} The function returns a reference to the documented entity MainExtension ``` ```php -{{ getDocumentedEntityUrl(phpClassEntityCollection, '\\BumbleDocGen\\Renderer\\Twig\\MainExtension', '', false) }} +{{ getDocumentedEntityUrl(phpEntities, '\\BumbleDocGen\\Renderer\\Twig\\MainExtension', '', false) }} The function returns a link to the file MainExtension ``` diff --git a/docs/tech/classes/InterfaceEntity.md b/docs/tech/classes/InterfaceEntity.md new file mode 100644 index 00000000..45c957d6 --- /dev/null +++ b/docs/tech/classes/InterfaceEntity.md @@ -0,0 +1,3441 @@ + + BumbleDocGen / Technical description of the project / Class map / InterfaceEntity
      + +

      + InterfaceEntity class: +

      + + + + + +```php +namespace BumbleDocGen\LanguageHandler\Php\Parser\Entity; + +class InterfaceEntity extends \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity implements \BumbleDocGen\Core\Renderer\Context\DocumentTransformableEntityInterface, \BumbleDocGen\Core\Parser\Entity\RootEntityInterface, \BumbleDocGen\Core\Parser\Entity\EntityInterface, \BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityInterface +``` + +
      Object interface
      + +See: + + + + + + + +

      Initialization methods:

      + +
        +
      1. + __construct +
      2. +
      + +

      Methods:

      + +
        +
      1. + addPluginData + - Add information to aт entity object
      2. +
      3. + cursorToDocAttributeLinkFragment +
      4. +
      5. + getAbsoluteFileName + - Returns the absolute path to a file if it can be retrieved and if the file is in the project directory
      6. +
      7. + getAst + - Get AST for this entity
      8. +
      9. + getCacheKey +
      10. +
      11. + getCachedEntityDependencies +
      12. +
      13. + getConstant + - Get the method entity by its name
      14. +
      15. + getConstantEntitiesCollection + - Get a collection of constant entities
      16. +
      17. + getConstantValue + - Get the compiled value of a constant
      18. +
      19. + getConstants + - Get all constants that are available according to the configuration as an array
      20. +
      21. + getConstantsData + - Get a list of all constants and classes where they are implemented
      22. +
      23. + getConstantsValues + - Get class constant compiled values according to filters
      24. +
      25. + getCurrentRootEntity +
      26. +
      27. + getDescription + - Get entity description
      28. +
      29. + getDescriptionLinks + - Get parsed links from description and doc blocks `see` and `link`
      30. +
      31. + getDocBlock + - Get DocBlock for current entity
      32. +
      33. + getDocComment + - Get the doc comment of an entity
      34. +
      35. + getDocCommentEntity + - Link to an entity where docBlock is implemented for this entity
      36. +
      37. + getDocCommentLine + - Get the code line number where the docBlock of the current entity begins
      38. +
      39. + getDocNote + - Get the note annotation value
      40. +
      41. + getDocRender +
      42. +
      43. + getEndLine + - Get the line number of the end of a class code in a file
      44. +
      45. + getEntityDependencies +
      46. +
      47. + getExamples + - Get parsed examples from `examples` doc block
      48. +
      49. + getFileContent +
      50. +
      51. + getFileSourceLink +
      52. +
      53. + getFirstExample + - Get first example from `examples` doc block
      54. +
      55. + getImplementingClass + - Get the class like entity in which the current entity was implemented
      56. +
      57. + getInterfaceNames + - Get a list of class interface names
      58. +
      59. + getInterfacesEntities + - Get a list of interface entities that the current class implements
      60. +
      61. + getMethod + - Get the method entity by its name
      62. +
      63. + getMethodEntitiesCollection + - Get a collection of method entities
      64. +
      65. + getMethods + - Get all methods that are available according to the configuration as an array
      66. +
      67. + getMethodsData + - Get a list of all methods and classes where they are implemented
      68. +
      69. + getModifiersString + - Get entity modifiers as a string
      70. +
      71. + getName + - Full name of the entity
      72. +
      73. + getNamespaceName + - Get the entity namespace name
      74. +
      75. + getObjectId + - Get entity unique ID
      76. +
      77. + getParentClass + - Get the entity of the parent class if it exists
      78. +
      79. + getParentClassEntities + - Get a list of parent class entities
      80. +
      81. + getParentClassName + - Get the name of the parent class entity if it exists
      82. +
      83. + getParentClassNames + - Get a list of entity names of parent classes
      84. +
      85. + getPluginData + - Get additional information added using the plugin
      86. +
      87. + getProperties + - Get all properties that are available according to the configuration as an array
      88. +
      89. + getPropertiesData + - Get a list of all properties and classes where they are implemented
      90. +
      91. + getProperty + - Get the property entity by its name
      92. +
      93. + getPropertyDefaultValue + - Get the compiled value of a property
      94. +
      95. + getPropertyEntitiesCollection + - Get a collection of property entities
      96. +
      97. + getRelativeFileName + - File name relative to project_root configuration parameter
      98. +
      99. + getRootEntityCollection + - Get the collection of root entities to which this entity belongs
      100. +
      101. + getShortName + - Short name of the entity
      102. +
      103. + getStartLine + - Get the line number of the start of a class code in a file
      104. +
      105. + getThrows + - Get parsed throws from `throws` doc block
      106. +
      107. + getThrowsDocBlockLinks +
      108. +
      109. + getTraits + - Get a list of trait entities of the current class
      110. +
      111. + getTraitsNames + - Get a list of class traits names
      112. +
      113. + hasConstant + - Check if a constant exists in a class
      114. +
      115. + hasDescriptionLinks + - Checking if an entity has links in its description
      116. +
      117. + hasExamples + - Checking if an entity has `example` docBlock
      118. +
      119. + hasMethod + - Check if a method exists in a class
      120. +
      121. + hasParentClass + - Check if a certain parent class exists in a chain of parent classes
      122. +
      123. + hasProperty + - Check if a property exists in a class
      124. +
      125. + hasThrows + - Checking if an entity has `throws` docBlock
      126. +
      127. + hasTraits + - Check if the class contains traits
      128. +
      129. + implementsInterface + - Check if a class implements an interface
      130. +
      131. + isAbstract + - Check that an entity is abstract
      132. +
      133. + isApi + - Checking if an entity has `api` docBlock
      134. +
      135. + isClass + - Check if an entity is a Class
      136. +
      137. + isClassLoad +
      138. +
      139. + isDeprecated + - Checking if an entity has `deprecated` docBlock
      140. +
      141. + isDocumentCreationAllowed +
      142. +
      143. + isEntityCacheOutdated + - Checking if the entity cache is out of date
      144. +
      145. + isEntityDataCacheOutdated +
      146. +
      147. + isEntityDataCanBeLoaded +
      148. +
      149. + isEntityFileCanBeLoad + - Checking if entity data can be retrieved
      150. +
      151. + isEntityNameValid + - Check if the name is a valid name for ClassLikeEntity
      152. +
      153. + isEnum + - Check if an entity is an Enum
      154. +
      155. + isExternalLibraryEntity + - Check if a given entity is an entity from a third party library (connected via composer)
      156. +
      157. + isInGit + - Checking if class file is in git repository
      158. +
      159. + isInstantiable + - Check that an entity is instantiable
      160. +
      161. + isInterface + - Check if an entity is an Interface
      162. +
      163. + isInternal + - Checking if an entity has `internal` docBlock
      164. +
      165. + isSubclassOf + - Whether the given class is a subclass of the specified class
      166. +
      167. + isTrait + - Check if an entity is a Trait
      168. +
      169. + normalizeClassName +
      170. +
      171. + reloadEntityDependenciesCache + - Update entity dependency cache
      172. +
      173. + removeEntityValueFromCache +
      174. +
      175. + removeNotUsedEntityDataCache +
      176. +
      177. + setCustomAst +
      178. +
      + + + + + + + +

      Method details:

      + +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function __construct(\BumbleDocGen\Core\Configuration\Configuration $configuration, \BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings $phpHandlerSettings, \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection $entitiesCollection, \BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper $parserHelper, \BumbleDocGen\LanguageHandler\Php\Parser\ComposerHelper $composerHelper, \BumbleDocGen\LanguageHandler\Php\Parser\PhpParser\PhpParserHelper $phpParserHelper, \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache $localObjectCache, \Psr\Log\LoggerInterface $logger, string $className, string|null $relativeFileName); +``` + + + +Parameters: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $configuration\BumbleDocGen\Core\Configuration\Configuration-
      $phpHandlerSettings\BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings-
      $entitiesCollection\BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection-
      $parserHelper\BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper-
      $composerHelper\BumbleDocGen\LanguageHandler\Php\Parser\ComposerHelper-
      $phpParserHelper\BumbleDocGen\LanguageHandler\Php\Parser\PhpParser\PhpParserHelper-
      $localObjectCache\BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache-
      $logger\Psr\Log\LoggerInterface-
      $classNamestring-
      $relativeFileNamestring | null-
      + + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function addPluginData(string $pluginKey, mixed $data): void; +``` + +
      Add information to aт entity object
      + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $pluginKeystring-
      $datamixed-
      + +Return value: void + + +
      +
      +
      + +
        +
      • # + cursorToDocAttributeLinkFragment + :warning: Is internal | source code
      • +
      + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function cursorToDocAttributeLinkFragment(string $cursor, bool $isForDocument = true): string; +``` + + + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $cursorstring-
      $isForDocumentbool-
      + +Return value: string + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getAbsoluteFileName(): null|string; +``` + +
      Returns the absolute path to a file if it can be retrieved and if the file is in the project directory
      + +Parameters: not specified + +Return value: null | string + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getAst(): \PhpParser\Node\Stmt\Class_|\PhpParser\Node\Stmt\Interface_|\PhpParser\Node\Stmt\Trait_|\PhpParser\Node\Stmt\Enum_; +``` + +
      Get AST for this entity
      + +Parameters: not specified + +Return value: \PhpParser\Node\Stmt\Class_ | \PhpParser\Node\Stmt\Interface_ | \PhpParser\Node\Stmt\Trait_ | \PhpParser\Node\Stmt\Enum_ + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait + +public function getCacheKey(): string; +``` + + + +Parameters: not specified + +Return value: string + + +
      +
      +
      + +
        +
      • # + getCachedEntityDependencies + :warning: Is internal | source code
      • +
      + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getCachedEntityDependencies(): array; +``` + + + +Parameters: not specified + +Return value: array + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getConstant(string $constantName, bool $unsafe = false): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity; +``` + +
      Get the method entity by its name
      + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $constantNamestringThe name of the constant whose entity you want to get
      $unsafeboolCheck all constants, not just the constants allowed in the configuration (@see PhpHandlerSettings::getClassConstantEntityFilter())
      + +Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getConstantEntitiesCollection(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntitiesCollection; +``` + +
      Get a collection of constant entities
      + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntitiesCollection + + +Throws: + + + +See: + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getConstantValue(string $constantName): string|array|int|bool|null|float; +``` + +
      Get the compiled value of a constant
      + +Parameters: + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $constantNamestringThe name of the constant for which you need to get the value
      + +Return value: string | array | int | bool | null | float + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getConstants(): array; +``` + +
      Get all constants that are available according to the configuration as an array
      + +Parameters: not specified + +Return value: array + + +Throws: + + + +See: + +
      +
      +
      + +
        +
      • # + getConstantsData + :warning: Is internal | source code
      • +
      + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getConstantsData(bool $onlyFromCurrentClassAndTraits = false, int $flags = \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity::VISIBILITY_MODIFIERS_FLAG_ANY): array; +``` + +
      Get a list of all constants and classes where they are implemented
      + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $onlyFromCurrentClassAndTraitsboolGet data only for constants from the current class
      $flagsintGet data only for constants corresponding to the visibility modifiers passed in this value
      + +Return value: array + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getConstantsValues(bool $onlyFromCurrentClassAndTraits = false, int $flags = \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity::VISIBILITY_MODIFIERS_FLAG_ANY): array; +``` + +
      Get class constant compiled values according to filters
      + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $onlyFromCurrentClassAndTraitsboolGet values only for constants from the current class
      $flagsintGet values only for constants corresponding to the visibility modifiers passed in this value
      + +Return value: array + + +Throws: + + +
      +
      +
      + +
        +
      • # + getCurrentRootEntity + :warning: Is internal | source code
      • +
      + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getCurrentRootEntity(): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; +``` + + + +Parameters: not specified + +Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDescription(): string; +``` + +
      Get entity description
      + +Parameters: not specified + +Return value: string + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDescriptionLinks(): array; +``` + +
      Get parsed links from description and doc blocks `see` and `link`
      + +Parameters: not specified + +Return value: array + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDocBlock(): \phpDocumentor\Reflection\DocBlock; +``` + +
      Get DocBlock for current entity
      + +Parameters: not specified + +Return value: \phpDocumentor\Reflection\DocBlock + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDocComment(): string; +``` + +
      Get the doc comment of an entity
      + +Parameters: not specified + +Return value: string + + +Throws: + + +
      +
      +
      + +
        +
      • # + getDocCommentEntity + :warning: Is internal | source code
      • +
      + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getDocCommentEntity(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; +``` + +
      Link to an entity where docBlock is implemented for this entity
      + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDocCommentLine(): null|int; +``` + +
      Get the code line number where the docBlock of the current entity begins
      + +Parameters: not specified + +Return value: null | int + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDocNote(): string; +``` + +
      Get the note annotation value
      + +Parameters: not specified + +Return value: string + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getDocRender(): \BumbleDocGen\Core\Renderer\EntityDocRenderer\EntityDocRendererInterface; +``` + + + +Parameters: not specified + +Return value: \BumbleDocGen\Core\Renderer\EntityDocRenderer\EntityDocRendererInterface + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getEndLine(): int; +``` + +
      Get the line number of the end of a class code in a file
      + +Parameters: not specified + +Return value: int + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getEntityDependencies(): array; +``` + + + +Parameters: not specified + +Return value: array + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getExamples(): array; +``` + +
      Get parsed examples from `examples` doc block
      + +Parameters: not specified + +Return value: array + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getFileContent(): string; +``` + + + +Parameters: not specified + +Return value: string + + +Throws: + + +
      +
      +
      + +
        +
      • # + getFileSourceLink + :warning: Is internal | source code
      • +
      + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getFileSourceLink(bool $withLine = true): null|string; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $withLinebool-
      + +Return value: null | string + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getFirstExample(): string; +``` + +
      Get first example from `examples` doc block
      + +Parameters: not specified + +Return value: string + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getImplementingClass(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; +``` + +
      Get the class like entity in which the current entity was implemented
      + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getInterfaceNames(): array; +``` + +
      Get a list of class interface names
      + +Parameters: not specified + +Return value: array + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getInterfacesEntities(): array; +``` + +
      Get a list of interface entities that the current class implements
      + +Parameters: not specified + +Return value: array + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getMethod(string $methodName, bool $unsafe = false): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntity; +``` + +
      Get the method entity by its name
      + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $methodNamestringThe name of the method whose entity you want to get
      $unsafeboolCheck all methods, not just the methods allowed in the configuration (@see PhpHandlerSettings::getMethodEntityFilter())
      + +Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntity + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getMethodEntitiesCollection(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntitiesCollection; +``` + +
      Get a collection of method entities
      + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntitiesCollection + + +Throws: + + + +See: + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getMethods(): array; +``` + +
      Get all methods that are available according to the configuration as an array
      + +Parameters: not specified + +Return value: array + + +Throws: + + + +See: + +
      +
      +
      + +
        +
      • # + getMethodsData + :warning: Is internal | source code
      • +
      + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getMethodsData(bool $onlyFromCurrentClassAndTraits = false, int $flags = \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntity::VISIBILITY_MODIFIERS_FLAG_ANY): array; +``` + +
      Get a list of all methods and classes where they are implemented
      + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $onlyFromCurrentClassAndTraitsboolGet data only for methods from the current class
      $flagsintGet data only for methods corresponding to the visibility modifiers passed in this value
      + +Return value: array + + +Throws: + + +
      +
      +
      + + + +```php +public function getModifiersString(): string; +``` + +
      Get entity modifiers as a string
      + +Parameters: not specified + +Return value: string + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getName(): string; +``` + +
      Full name of the entity
      + +Parameters: not specified + +Return value: string + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getNamespaceName(): string; +``` + +
      Get the entity namespace name
      + +Parameters: not specified + +Return value: string + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getObjectId(): string; +``` + +
      Get entity unique ID
      + +Parameters: not specified + +Return value: string + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getParentClass(): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; +``` + +
      Get the entity of the parent class if it exists
      + +Parameters: not specified + +Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getParentClassEntities(): array; +``` + +
      Get a list of parent class entities
      + +Parameters: not specified + +Return value: array + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getParentClassName(): null|string; +``` + +
      Get the name of the parent class entity if it exists
      + +Parameters: not specified + +Return value: null | string + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getParentClassNames(): array; +``` + +
      Get a list of entity names of parent classes
      + +Parameters: not specified + +Return value: array + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getPluginData(string $pluginKey): mixed; +``` + +
      Get additional information added using the plugin
      + +Parameters: + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $pluginKeystring-
      + +Return value: mixed + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getProperties(): array; +``` + +
      Get all properties that are available according to the configuration as an array
      + +Parameters: not specified + +Return value: array + + +Throws: + + + +See: + +
      +
      +
      + +
        +
      • # + getPropertiesData + :warning: Is internal | source code
      • +
      + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getPropertiesData(bool $onlyFromCurrentClassAndTraits = false, int $flags = \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntity::VISIBILITY_MODIFIERS_FLAG_ANY): array; +``` + +
      Get a list of all properties and classes where they are implemented
      + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $onlyFromCurrentClassAndTraitsboolGet data only for properties from the current class
      $flagsintGet data only for properties corresponding to the visibility modifiers passed in this value
      + +Return value: array + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getProperty(string $propertyName, bool $unsafe = false): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntity; +``` + +
      Get the property entity by its name
      + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $propertyNamestringThe name of the property whose entity you want to get
      $unsafeboolCheck all properties, not just the properties allowed in the configuration (@see PhpHandlerSettings::getPropertyEntityFilter())
      + +Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntity + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getPropertyDefaultValue(string $propertyName): string|array|int|bool|null|float; +``` + +
      Get the compiled value of a property
      + +Parameters: + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $propertyNamestringThe name of the property for which you need to get the value
      + +Return value: string | array | int | bool | null | float + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getPropertyEntitiesCollection(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntitiesCollection; +``` + +
      Get a collection of property entities
      + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntitiesCollection + + +Throws: + + + +See: + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getRelativeFileName(): null|string; +``` + +
      File name relative to project_root configuration parameter
      + +Parameters: not specified + +Return value: null | string + + + +See: + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getRootEntityCollection(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; +``` + +
      Get the collection of root entities to which this entity belongs
      + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getShortName(): string; +``` + +
      Short name of the entity
      + +Parameters: not specified + +Return value: string + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getStartLine(): int; +``` + +
      Get the line number of the start of a class code in a file
      + +Parameters: not specified + +Return value: int + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getThrows(): array; +``` + +
      Get parsed throws from `throws` doc block
      + +Parameters: not specified + +Return value: array + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getThrowsDocBlockLinks(): array; +``` + + + +Parameters: not specified + +Return value: array + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getTraits(): array; +``` + +
      Get a list of trait entities of the current class
      + +Parameters: not specified + +Return value: array + + +Throws: + + +
      +
      +
      + + + +```php +public function getTraitsNames(): array; +``` + +
      Get a list of class traits names
      + +Parameters: not specified + +Return value: array + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function hasConstant(string $constantName, bool $unsafe = false): bool; +``` + +
      Check if a constant exists in a class
      + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $constantNamestringThe name of the class whose entity you want to check
      $unsafeboolCheck all constants, not just the constants allowed in the configuration (@see PhpHandlerSettings::getClassConstantEntityFilter())
      + +Return value: bool + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function hasDescriptionLinks(): bool; +``` + +
      Checking if an entity has links in its description
      + +Parameters: not specified + +Return value: bool + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function hasExamples(): bool; +``` + +
      Checking if an entity has `example` docBlock
      + +Parameters: not specified + +Return value: bool + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function hasMethod(string $methodName, bool $unsafe = false): bool; +``` + +
      Check if a method exists in a class
      + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $methodNamestringThe name of the method whose entity you want to check
      $unsafeboolCheck all methods, not just the methods allowed in the configuration (@see PhpHandlerSettings::getMethodEntityFilter())
      + +Return value: bool + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function hasParentClass(string $parentClassName): bool; +``` + +
      Check if a certain parent class exists in a chain of parent classes
      + +Parameters: + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $parentClassNamestringSearched parent class
      + +Return value: bool + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function hasProperty(string $propertyName, bool $unsafe = false): bool; +``` + +
      Check if a property exists in a class
      + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $propertyNamestringThe name of the property whose entity you want to check
      $unsafeboolCheck all properties, not just the properties allowed in the configuration (@see PhpHandlerSettings::getPropertyEntityFilter())
      + +Return value: bool + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function hasThrows(): bool; +``` + +
      Checking if an entity has `throws` docBlock
      + +Parameters: not specified + +Return value: bool + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function hasTraits(): bool; +``` + +
      Check if the class contains traits
      + +Parameters: not specified + +Return value: bool + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function implementsInterface(string $interfaceName): bool; +``` + +
      Check if a class implements an interface
      + +Parameters: + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $interfaceNamestringName of the required interface in the interface chain
      + +Return value: bool + + +Throws: + + +
      +
      +
      + + + +```php +public function isAbstract(): bool; +``` + +
      Check that an entity is abstract
      + +Parameters: not specified + +Return value: bool + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function isApi(): bool; +``` + +
      Checking if an entity has `api` docBlock
      + +Parameters: not specified + +Return value: bool + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function isClass(): bool; +``` + +
      Check if an entity is a Class
      + +Parameters: not specified + +Return value: bool + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function isClassLoad(): bool; +``` + + + +Parameters: not specified + +Return value: bool + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function isDeprecated(): bool; +``` + +
      Checking if an entity has `deprecated` docBlock
      + +Parameters: not specified + +Return value: bool + + +Throws: + + +
      +
      +
      + +
        +
      • # + isDocumentCreationAllowed + :warning: Is internal | source code
      • +
      + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function isDocumentCreationAllowed(): bool; +``` + + + +Parameters: not specified + +Return value: bool + + +Throws: + + +
      +
      +
      + +
        +
      • # + isEntityCacheOutdated + :warning: Is internal | source code
      • +
      + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function isEntityCacheOutdated(): bool; +``` + +
      Checking if the entity cache is out of date
      + +Parameters: not specified + +Return value: bool + + +
      +
      +
      + +
        +
      • # + isEntityDataCacheOutdated + :warning: Is internal | source code
      • +
      + +```php +// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait + +public function isEntityDataCacheOutdated(): bool; +``` + + + +Parameters: not specified + +Return value: bool + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function isEntityDataCanBeLoaded(): bool; +``` + + + +Parameters: not specified + +Return value: bool + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function isEntityFileCanBeLoad(): bool; +``` + +
      Checking if entity data can be retrieved
      + +Parameters: not specified + +Return value: bool + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public static function isEntityNameValid(string $entityName): bool; +``` + +
      Check if the name is a valid name for ClassLikeEntity
      + +Parameters: + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $entityNamestring-
      + +Return value: bool + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function isEnum(): bool; +``` + +
      Check if an entity is an Enum
      + +Parameters: not specified + +Return value: bool + + +
      +
      +
      + +
        +
      • # + isExternalLibraryEntity + :warning: Is internal | source code
      • +
      + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function isExternalLibraryEntity(): bool; +``` + +
      Check if a given entity is an entity from a third party library (connected via composer)
      + +Parameters: not specified + +Return value: bool + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function isInGit(): bool; +``` + +
      Checking if class file is in git repository
      + +Parameters: not specified + +Return value: bool + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function isInstantiable(): bool; +``` + +
      Check that an entity is instantiable
      + +Parameters: not specified + +Return value: bool + + +
      +
      +
      + + + +```php +public function isInterface(): bool; +``` + +
      Check if an entity is an Interface
      + +Parameters: not specified + +Return value: bool + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function isInternal(): bool; +``` + +
      Checking if an entity has `internal` docBlock
      + +Parameters: not specified + +Return value: bool + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function isSubclassOf(string $className): bool; +``` + +
      Whether the given class is a subclass of the specified class
      + +Parameters: + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $classNamestring-
      + +Return value: bool + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function isTrait(): bool; +``` + +
      Check if an entity is a Trait
      + +Parameters: not specified + +Return value: bool + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public static function normalizeClassName(string $name): string; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $namestring-
      + +Return value: string + + +
      +
      +
      + +
        +
      • # + reloadEntityDependenciesCache + :warning: Is internal | source code
      • +
      + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function reloadEntityDependenciesCache(): array; +``` + +
      Update entity dependency cache
      + +Parameters: not specified + +Return value: array + + +
      +
      +
      + +
        +
      • # + removeEntityValueFromCache + :warning: Is internal | source code
      • +
      + +```php +// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait + +public function removeEntityValueFromCache(string $key): void; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $keystring-
      + +Return value: void + + +
      +
      +
      + +
        +
      • # + removeNotUsedEntityDataCache + :warning: Is internal | source code
      • +
      + +```php +// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait + +public function removeNotUsedEntityDataCache(): void; +``` + + + +Parameters: not specified + +Return value: void + + +Throws: + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function setCustomAst(\PhpParser\Node\Stmt\Trait_|\PhpParser\Node\Stmt\Enum_|\PhpParser\Node\Stmt\Interface_|\PhpParser\Node\Stmt\Class_|null $customAst): void; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $customAst\PhpParser\Node\Stmt\Trait_ | \PhpParser\Node\Stmt\Enum_ | \PhpParser\Node\Stmt\Interface_ | \PhpParser\Node\Stmt\Class_ | null-
      + +Return value: void + + +
      +
      + + \ No newline at end of file diff --git a/docs/tech/classes/LoggableRootEntityCollection.md b/docs/tech/classes/LoggableRootEntityCollection.md index d5feff8b..0fafe7d8 100644 --- a/docs/tech/classes/LoggableRootEntityCollection.md +++ b/docs/tech/classes/LoggableRootEntityCollection.md @@ -63,9 +63,18 @@ abstract class LoggableRootEntityCollection extends \BumbleDocGen\Core\Parser\En
    67. isEmpty
    68. +
    69. + loadEntities +
    70. +
    71. + loadEntitiesByConfiguration +
    72. remove
    73. +
    74. + toArray +
    75. updateEntitiesCache
    76. @@ -206,7 +215,7 @@ public function get(string $objectName): null|\BumbleDocGen\Core\Parser\Entity\R ```php @@ -229,7 +238,7 @@ public function getEntityCollectionName(): string; ```php @@ -341,7 +350,7 @@ public function getLoadedOrCreateNew(string $objectName, bool $withAddClassEntit See:

      @@ -427,6 +436,96 @@ public function isEmpty(): bool; Return value: bool +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\Core\Parser\Entity\RootEntityCollection + +public function loadEntities(\BumbleDocGen\Core\Parser\SourceLocator\SourceLocatorsCollection $sourceLocatorsCollection, \BumbleDocGen\Core\Parser\FilterCondition\ConditionInterface|null $filters = null, \BumbleDocGen\Core\Parser\Entity\EntitiesLoaderProgressBarInterface|null $progressBar = null): \BumbleDocGen\Core\Parser\Entity\CollectionLoadEntitiesResult; +``` + + + +Parameters: + + + + + + + + + + + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $sourceLocatorsCollection\BumbleDocGen\Core\Parser\SourceLocator\SourceLocatorsCollection-
      $filters\BumbleDocGen\Core\Parser\FilterCondition\ConditionInterface | null-
      $progressBar\BumbleDocGen\Core\Parser\Entity\EntitiesLoaderProgressBarInterface | null-
      + +Return value: \BumbleDocGen\Core\Parser\Entity\CollectionLoadEntitiesResult + + +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\Core\Parser\Entity\RootEntityCollection + +public function loadEntitiesByConfiguration(\BumbleDocGen\Core\Parser\Entity\EntitiesLoaderProgressBarInterface|null $progressBar = null): \BumbleDocGen\Core\Parser\Entity\CollectionLoadEntitiesResult; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $progressBar\BumbleDocGen\Core\Parser\Entity\EntitiesLoaderProgressBarInterface | null-
      + +Return value: \BumbleDocGen\Core\Parser\Entity\CollectionLoadEntitiesResult + +

      @@ -467,6 +566,29 @@ public function remove(string $objectName): void; Return value: void +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\Core\Parser\Entity\RootEntityCollection + +public function toArray(): array; +``` + + + +Parameters: not specified + +Return value: array + +

      @@ -474,7 +596,7 @@ public function remove(string $objectName): void; ```php diff --git a/docs/tech/classes/MethodEntityCollection.md b/docs/tech/classes/MethodEntitiesCollection.md similarity index 66% rename from docs/tech/classes/MethodEntityCollection.md rename to docs/tech/classes/MethodEntitiesCollection.md index 9766da4f..585e2d99 100644 --- a/docs/tech/classes/MethodEntityCollection.md +++ b/docs/tech/classes/MethodEntitiesCollection.md @@ -1,8 +1,8 @@ - BumbleDocGen / Technical description of the project / Class map / MethodEntityCollection
      + BumbleDocGen / Technical description of the project / Class map / MethodEntitiesCollection

      - MethodEntityCollection class: + MethodEntitiesCollection class:

      @@ -10,12 +10,12 @@ ```php -namespace BumbleDocGen\LanguageHandler\Php\Parser\Entity; +namespace BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method; -final class MethodEntityCollection extends \BumbleDocGen\Core\Parser\Entity\BaseEntityCollection implements \IteratorAggregate +final class MethodEntitiesCollection extends \BumbleDocGen\Core\Parser\Entity\BaseEntityCollection implements \IteratorAggregate ``` - +
      Collection of PHP class method entities
      @@ -35,16 +35,16 @@ final class MethodEntityCollection extends \BumbleDocGen\Core\Parser\Entity\Base
      1. add -
      2. + - Add an entity to a collection
      3. get -
      4. + - Get the loaded method entity if it exists
      5. getAllExceptInitializations -
      6. + - Get a copy of the collection containing only those methods that are not initialization methods
      7. getInitializations -
      8. + - Get a copy of the collection containing only those methods that are initialization methods
      9. getIterator
      10. @@ -56,13 +56,13 @@ final class MethodEntityCollection extends \BumbleDocGen\Core\Parser\Entity\Base
      11. loadMethodEntities -
      12. + - Load method entities into the collection according to the project configuration
      13. remove
      14. unsafeGet -
      15. + - Get the method entity if it exists. If the method exists but has not been loaded into the collection, a new entity object will be created
      @@ -78,11 +78,11 @@ final class MethodEntityCollection extends \BumbleDocGen\Core\Parser\Entity\Base ```php -public function __construct(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity $classEntity, \BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings $phpHandlerSettings, \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Cache\CacheablePhpEntityFactory $cacheablePhpEntityFactory, \Psr\Log\LoggerInterface $logger); +public function __construct(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity $classEntity, \BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings $phpHandlerSettings, \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Cache\CacheablePhpEntityFactory $cacheablePhpEntityFactory, \Psr\Log\LoggerInterface $logger); ``` @@ -100,7 +100,7 @@ public function __construct(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\Clas $classEntity - \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity + \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - @@ -130,14 +130,14 @@ public function __construct(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\Clas ```php -public function add(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\MethodEntityInterface $methodEntity, bool $reload = false): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\MethodEntityCollection; +public function add(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntityInterface $methodEntity, bool $reload = false): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntitiesCollection; ``` - +
      Add an entity to a collection
      Parameters: @@ -152,18 +152,18 @@ public function add(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\MethodEntity $methodEntity - \BumbleDocGen\LanguageHandler\Php\Parser\Entity\MethodEntityInterface - - + \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntityInterface + Entity to be added to the collection $reload bool - - + Replace an entity with a new one if one has already been loaded previously -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\MethodEntityCollection +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntitiesCollection
      @@ -173,14 +173,14 @@ public function add(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\MethodEntity ```php -public function get(string $objectName): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\MethodEntity; +public function get(string $objectName): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntity; ``` - +
      Get the loaded method entity if it exists
      Parameters: @@ -196,12 +196,12 @@ public function get(string $objectName): null|\BumbleDocGen\LanguageHandler\Php\ $objectName string - - + Method entity name -Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\MethodEntity +Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntity
      @@ -211,18 +211,18 @@ public function get(string $objectName): null|\BumbleDocGen\LanguageHandler\Php\ ```php -public function getAllExceptInitializations(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\MethodEntityCollection; +public function getAllExceptInitializations(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntitiesCollection; ``` - +
      Get a copy of the collection containing only those methods that are not initialization methods
      Parameters: not specified -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\MethodEntityCollection +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntitiesCollection
      @@ -232,18 +232,18 @@ public function getAllExceptInitializations(): \BumbleDocGen\LanguageHandler\Php ```php -public function getInitializations(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\MethodEntityCollection; +public function getInitializations(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntitiesCollection; ``` - +
      Get a copy of the collection containing only those methods that are initialization methods
      Parameters: not specified -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\MethodEntityCollection +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntitiesCollection @@ -339,14 +339,14 @@ public function isEmpty(): bool; ```php public function loadMethodEntities(): void; ``` - +
      Load method entities into the collection according to the project configuration
      Parameters: not specified @@ -366,6 +366,12 @@ public function loadMethodEntities(): void; + +See: +
      @@ -413,14 +419,14 @@ public function remove(string $objectName): void; ```php -public function unsafeGet(string $objectName): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\MethodEntity; +public function unsafeGet(string $objectName): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntity; ``` - +
      Get the method entity if it exists. If the method exists but has not been loaded into the collection, a new entity object will be created
      Parameters: @@ -436,12 +442,12 @@ public function unsafeGet(string $objectName): null|\BumbleDocGen\LanguageHandle $objectName string - - + Method entity name -Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\MethodEntity +Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntity Throws: diff --git a/docs/tech/classes/MethodEntity.md b/docs/tech/classes/MethodEntity.md index 42fb0dbb..c7c10872 100644 --- a/docs/tech/classes/MethodEntity.md +++ b/docs/tech/classes/MethodEntity.md @@ -2,7 +2,7 @@ BumbleDocGen / Technical description of the project / Class map / MethodEntity

      - MethodEntity class: + MethodEntity class:

      @@ -10,9 +10,9 @@ ```php -namespace BumbleDocGen\LanguageHandler\Php\Parser\Entity; +namespace BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method; -class MethodEntity extends \BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity implements \BumbleDocGen\LanguageHandler\Php\Parser\Entity\MethodEntityInterface, \BumbleDocGen\Core\Parser\Entity\EntityInterface, \BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityInterface +class MethodEntity extends \BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity implements \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntityInterface, \BumbleDocGen\Core\Parser\Entity\EntityInterface, \BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityInterface ```
      Class method entity
      @@ -33,18 +33,15 @@ class MethodEntity extends \BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseE

      Methods:

        -
      1. - entityCacheIsOutdated -
      2. getAbsoluteFileName - Returns the absolute path to a file if it can be retrieved and if the file is in the project directory
      3. getAst -
      4. + - Get AST for this entity
      5. getBodyCode -
      6. + - Get the code for this method
      7. getCacheKey
      8. @@ -56,157 +53,151 @@ class MethodEntity extends \BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseE
      9. getDescription -
      10. + - Get entity description
      11. getDescriptionLinks - Get parsed links from description and doc blocks `see` and `link`
      12. getDocBlock -
      13. + - Get DocBlock for current entity
      14. getDocComment - Get the doc comment of an entity
      15. getDocCommentEntity -
      16. + - Link to an entity where docBlock is implemented for this entity
      17. getDocCommentLine
      18. -
      19. - getDocCommentLineRecursive -
      20. -
      21. - getDocCommentRecursive -
      22. getDocNote -
      23. + - Get the note annotation value
      24. getEndLine -
      25. + - Get the line number of the end of a method's code in a file
      26. getExamples - Get parsed examples from `examples` doc block
      27. -
      28. - getFileName -
      29. getFileSourceLink
      30. getFirstExample - - Get first example from @examples doc block
      31. + - Get first example from `examples` doc block
      32. getFirstReturnValue -
      33. + - Get the compiled first return value of a method (if possible)
      34. getImplementingClass -
      35. + - Get the class like entity in which the current entity was implemented
      36. getImplementingClassName -
      37. + - Get the name of the class in which this method is implemented
      38. getModifiersString -
      39. + - Get a text representation of method modifiers
      40. getName -
      41. + - Full name of the entity
      42. getNamespaceName -
      43. + - Namespace of the class that contains this method
      44. getObjectId - Get entity unique ID
      45. getParameters -
      46. + - Get a list of method parameters
      47. getParametersString -
      48. -
      49. - getPhpHandlerSettings -
      50. + - Get a list of method parameters as a string
      51. - getPrototype -
      52. + getParentMethod + - Get the parent method for this method
      53. getRelativeFileName -
      54. + - File name relative to project_root configuration parameter
      55. getReturnType -
      56. + - Get the return type of method
      57. getRootEntity
      58. getRootEntityCollection - - Get parent collection of entities
      59. + - Get the collection of root entities to which this entity belongs
      60. getShortName -
      61. + - Short name of the entity
      62. getSignature -
      63. + - Get the method signature as a string
      64. getStartColumn -
      65. + - Get the column number of the beginning of the method code in a file
      66. getStartLine -
      67. + - Get the line number of the beginning of the entity code in a file
      68. getThrows - Get parsed throws from `throws` doc block
      69. - hasDescriptionLinks + getThrowsDocBlockLinks
      70. +
      71. + hasDescriptionLinks + - Checking if an entity has links in its description
      72. hasExamples -
      73. + - Checking if an entity has `example` docBlock
      74. hasThrows -
      75. + - Checking if an entity has `throws` docBlock +
      76. + isApi + - Checking if an entity has `api` docBlock
      77. isConstructor -
      78. + - Checking that a method is a constructor
      79. isDeprecated -
      80. + - Checking if an entity has `deprecated` docBlock
      81. isDynamic -
      82. + - Check if a method is a dynamic method, that is, implementable using __call or __callStatic +
      83. + isEntityCacheOutdated + - Checking if the entity cache is out of date
      84. isEntityDataCacheOutdated
      85. isEntityFileCanBeLoad -
      86. + - Checking if entity data can be retrieved
      87. isImplementedInParentClass -
      88. + - Check if this method is implemented in the parent class
      89. isInitialization -
      90. + - Check if a method is an initialization method
      91. isInternal -
      92. + - Checking if an entity has `internal` docBlock
      93. isPrivate -
      94. + - Check if a method is a private method
      95. isProtected -
      96. + - Check if a method is a protected method
      97. isPublic -
      98. + - Check if a method is a public method
      99. isStatic -
      100. -
      101. - parseAnnotationParams -
      102. + - Check if this method is static
      103. reloadEntityDependenciesCache -
      104. + - Update entity dependency cache
      105. removeEntityValueFromCache
      106. @@ -220,19 +211,19 @@ class MethodEntity extends \BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseE @@ -247,11 +238,11 @@ class MethodEntity extends \BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseE ```php -public function __construct(\BumbleDocGen\Core\Configuration\Configuration $configuration, \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity $classEntity, \BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper $parserHelper, \PhpParser\PrettyPrinter\Standard $astPrinter, \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache $localObjectCache, \Psr\Log\LoggerInterface $logger, string $methodName, string $implementingClassName); +public function __construct(\BumbleDocGen\Core\Configuration\Configuration $configuration, \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity $classEntity, \BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper $parserHelper, \PhpParser\PrettyPrinter\Standard $astPrinter, \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache $localObjectCache, \Psr\Log\LoggerInterface $logger, string $methodName, string $implementingClassName); ``` @@ -274,7 +265,7 @@ public function __construct(\BumbleDocGen\Core\Configuration\Configuration $conf $classEntity - \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity + \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - @@ -312,39 +303,6 @@ public function __construct(\BumbleDocGen\Core\Configuration\Configuration $conf -
      -
      -
      - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function entityCacheIsOutdated(): bool; -``` - - - -Parameters: not specified - -Return value: bool - - -Throws: - -

      @@ -352,7 +310,7 @@ public function entityCacheIsOutdated(): bool; ```php @@ -382,14 +340,14 @@ public function getAbsoluteFileName(): null|string; ```php public function getAst(): \PhpParser\Node\Stmt\ClassMethod; ``` - +
      Get AST for this entity
      Parameters: not specified @@ -410,27 +368,20 @@ public function getAst(): \PhpParser\Node\Stmt\ClassMethod; ```php public function getBodyCode(): string; ``` - +
      Get the code for this method
      Parameters: not specified Return value: string -Throws: - -

      @@ -438,7 +389,7 @@ public function getBodyCode(): string; ```php @@ -461,7 +412,7 @@ public function getCacheKey(): string; ```php @@ -482,6 +433,9 @@ public function getCachedEntityDependencies(): array;
    77. \Psr\Cache\InvalidArgumentException
    78. +
    79. + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    80. +
      @@ -491,20 +445,20 @@ public function getCachedEntityDependencies(): array; ```php // Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity -public function getCurrentRootEntity(): null|\BumbleDocGen\Core\Parser\Entity\RootEntityInterface; +public function getCurrentRootEntity(): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; ``` Parameters: not specified -Return value: null | \BumbleDocGen\Core\Parser\Entity\RootEntityInterface +Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity @@ -514,14 +468,16 @@ public function getCurrentRootEntity(): null|\BumbleDocGen\Core\Parser\Entity\Ro ```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + public function getDescription(): string; ``` - +
      Get entity description
      Parameters: not specified @@ -530,12 +486,6 @@ public function getDescription(): string; Throws: ```php -public function getRootEntity(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity; +public function getRootEntity(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; ``` Parameters: not specified -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity diff --git a/docs/tech/classes/OnCheckIsClassEntityCanBeLoad.md b/docs/tech/classes/OnCheckIsEntityCanBeLoaded.md similarity index 61% rename from docs/tech/classes/OnCheckIsClassEntityCanBeLoad.md rename to docs/tech/classes/OnCheckIsEntityCanBeLoaded.md index cf664587..f6c3419b 100644 --- a/docs/tech/classes/OnCheckIsClassEntityCanBeLoad.md +++ b/docs/tech/classes/OnCheckIsEntityCanBeLoaded.md @@ -1,8 +1,8 @@ - BumbleDocGen / Technical description of the project / Class map / OnCheckIsClassEntityCanBeLoad
      + BumbleDocGen / Technical description of the project / Class map / OnCheckIsEntityCanBeLoaded

      - OnCheckIsClassEntityCanBeLoad class: + OnCheckIsEntityCanBeLoaded class:

      @@ -12,7 +12,7 @@ ```php namespace BumbleDocGen\LanguageHandler\Php\Plugin\Event\Entity; -final class OnCheckIsClassEntityCanBeLoad extends \Symfony\Contracts\EventDispatcher\Event +final class OnCheckIsEntityCanBeLoaded extends \Symfony\Contracts\EventDispatcher\Event ``` @@ -34,13 +34,13 @@ final class OnCheckIsClassEntityCanBeLoad extends \Symfony\Contracts\EventDispat
      1. - disableClassLoading + disableEntityLoading
      2. getEntity
      3. - isClassCanBeLoad + isEntityCanBeLoaded
      @@ -50,7 +50,7 @@ final class OnCheckIsClassEntityCanBeLoad extends \Symfony\Contracts\EventDispat
      1. - classCanBeLoad
      2. + isEntityCanBeLoaded
      @@ -58,11 +58,11 @@ final class OnCheckIsClassEntityCanBeLoad extends \Symfony\Contracts\EventDispat

      Property details:

      -* # - $classCanBeLoad - **|** source code +* # + $isEntityCanBeLoaded + **|** source code ```php -public bool $classCanBeLoad; +public bool $isEntityCanBeLoaded; ``` @@ -76,11 +76,11 @@ public bool $classCanBeLoad; ```php -public function __construct(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity $entity); +public function __construct(\BumbleDocGen\Core\Parser\Entity\RootEntityInterface $entity); ``` @@ -98,7 +98,7 @@ public function __construct(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\Clas $entity - \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity + \BumbleDocGen\Core\Parser\Entity\RootEntityInterface - @@ -111,13 +111,13 @@ public function __construct(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\Clas
      ```php -public function disableClassLoading(): void; +public function disableEntityLoading(): void; ``` @@ -134,18 +134,18 @@ public function disableClassLoading(): void; ```php -public function getEntity(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity; +public function getEntity(): \BumbleDocGen\Core\Parser\Entity\RootEntityInterface; ``` Parameters: not specified -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity +Return value: \BumbleDocGen\Core\Parser\Entity\RootEntityInterface
      @@ -153,13 +153,13 @@ public function getEntity(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Cla
      ```php -public function isClassCanBeLoad(): bool; +public function isEntityCanBeLoaded(): bool; ``` diff --git a/docs/tech/classes/ParserHelper.md b/docs/tech/classes/ParserHelper.md index a4363831..52798d89 100644 --- a/docs/tech/classes/ParserHelper.md +++ b/docs/tech/classes/ParserHelper.md @@ -33,9 +33,6 @@ final class ParserHelper

      Methods:

        -
      1. - getBuiltInClassNames -
      2. getDocBlock
      3. @@ -123,27 +120,6 @@ public function __construct(\BumbleDocGen\Core\Configuration\Configuration $conf -
      -
      -
      - - - -```php -public static function getBuiltInClassNames(): array; -``` - - - -Parameters: not specified - -Return value: array - -

      @@ -151,11 +127,11 @@ public static function getBuiltInClassNames(): array; ```php -public function getDocBlock(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity $classEntity, string $docComment, int|null $lineNumber = null): \phpDocumentor\Reflection\DocBlock; +public function getDocBlock(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity $classEntity, string $docComment, int|null $lineNumber = null): \phpDocumentor\Reflection\DocBlock; ``` @@ -173,7 +149,7 @@ public function getDocBlock(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\Clas $classEntity - \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity + \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - @@ -206,11 +182,11 @@ public function getDocBlock(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\Clas ```php -public function getDocBlockContext(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity $classEntity): \phpDocumentor\Reflection\Types\Context; +public function getDocBlockContext(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity $classEntity): \phpDocumentor\Reflection\Types\Context; ``` @@ -228,7 +204,7 @@ public function getDocBlockContext(\BumbleDocGen\LanguageHandler\Php\Parser\Enti $classEntity - \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity + \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - @@ -251,7 +227,7 @@ public function getDocBlockContext(\BumbleDocGen\LanguageHandler\Php\Parser\Enti ```php @@ -279,11 +255,11 @@ public function getFilesInGit(): array; ```php -public function getUsesListByClassEntity(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity $classEntity, bool $extended = true): array; +public function getUsesListByClassEntity(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity $classEntity, bool $extended = true): array; ``` @@ -301,7 +277,7 @@ public function getUsesListByClassEntity(\BumbleDocGen\LanguageHandler\Php\Parse $classEntity - \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity + \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - @@ -329,7 +305,7 @@ public function getUsesListByClassEntity(\BumbleDocGen\LanguageHandler\Php\Parse ```php @@ -367,7 +343,7 @@ public static function isBuiltInClass(string $className): bool; ```php @@ -405,7 +381,7 @@ public static function isBuiltInType(string $name): bool; ```php @@ -450,7 +426,7 @@ public function isClassLoaded(string $className): bool; ```php @@ -493,11 +469,11 @@ public static function isCorrectClassName(string $className, bool $checkBuiltIns ```php -public function parseFullClassName(string $searchClassName, \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity $parentClassEntity, bool $extended = true): string; +public function parseFullClassName(string $searchClassName, \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity $parentClassEntity, bool $extended = true): string; ``` @@ -520,7 +496,7 @@ public function parseFullClassName(string $searchClassName, \BumbleDocGen\Langua $parentClassEntity - \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity + \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - diff --git a/docs/tech/classes/PhpDocumentorStubberPlugin.md b/docs/tech/classes/PhpDocumentorStubberPlugin.md index 8ef4badc..30f250b7 100644 --- a/docs/tech/classes/PhpDocumentorStubberPlugin.md +++ b/docs/tech/classes/PhpDocumentorStubberPlugin.md @@ -30,7 +30,7 @@ final class PhpDocumentorStubberPlugin implements \BumbleDocGen\Core\Plugin\Plug getSubscribedEvents
    81. - onCheckIsClassEntityCanBeLoad + onCheckIsEntityCanBeLoaded
    82. onGettingResourceLink @@ -69,13 +69,13 @@ public static function getSubscribedEvents(): array;
        -
      • # - onCheckIsClassEntityCanBeLoad +
      • # + onCheckIsEntityCanBeLoaded | source code
      ```php -public function onCheckIsClassEntityCanBeLoad(\BumbleDocGen\LanguageHandler\Php\Plugin\Event\Entity\OnCheckIsClassEntityCanBeLoad $event): void; +public function onCheckIsEntityCanBeLoaded(\BumbleDocGen\LanguageHandler\Php\Plugin\Event\Entity\OnCheckIsEntityCanBeLoaded $event): void; ``` @@ -93,7 +93,7 @@ public function onCheckIsClassEntityCanBeLoad(\BumbleDocGen\LanguageHandler\Php\ $event - \BumbleDocGen\LanguageHandler\Php\Plugin\Event\Entity\OnCheckIsClassEntityCanBeLoad + \BumbleDocGen\LanguageHandler\Php\Plugin\Event\Entity\OnCheckIsEntityCanBeLoaded - diff --git a/docs/tech/classes/ClassEntityCollection.md b/docs/tech/classes/PhpEntitiesCollection.md similarity index 71% rename from docs/tech/classes/ClassEntityCollection.md rename to docs/tech/classes/PhpEntitiesCollection.md index 86597bbf..7831fea8 100644 --- a/docs/tech/classes/ClassEntityCollection.md +++ b/docs/tech/classes/PhpEntitiesCollection.md @@ -1,8 +1,8 @@ - BumbleDocGen / Technical description of the project / Class map / ClassEntityCollection
      + BumbleDocGen / Technical description of the project / Class map / PhpEntitiesCollection

      - ClassEntityCollection class: + PhpEntitiesCollection class:

      @@ -12,10 +12,10 @@ ```php namespace BumbleDocGen\LanguageHandler\Php\Parser\Entity; -final class ClassEntityCollection extends \BumbleDocGen\Core\Parser\Entity\LoggableRootEntityCollection implements \IteratorAggregate +final class PhpEntitiesCollection extends \BumbleDocGen\Core\Parser\Entity\LoggableRootEntityCollection implements \IteratorAggregate ``` -
      Collection of PHP class entities
      +
      Collection of php root entities
      @@ -41,16 +41,16 @@ final class ClassEntityCollection extends \BumbleDocGen\Core\Parser\Entity\Logga
    83. filterByInterfaces -
    84. + - Retrieving all entities that implement the specified interfaces. Filtering is only available for ClassLikeEntity.
    85. filterByNameRegularExpression
    86. filterByParentClassNames -
    87. + - Retrieving all entities that inherit from the specified classes. Filtering is only available for ClassLikeEntity.
    88. filterByPaths -
    89. + - Filtering entities by relative files paths (from project_root) of the project
    90. findEntity
    91. @@ -77,7 +77,7 @@ final class ClassEntityCollection extends \BumbleDocGen\Core\Parser\Entity\Logga
    92. getOnlyInstantiable -
    93. + - Retrieving only instantiable entities. Filtering is only available for ClassLikeEntity.
    94. getOnlyInterfaces
    95. @@ -103,11 +103,17 @@ final class ClassEntityCollection extends \BumbleDocGen\Core\Parser\Entity\Logga isEmpty
    96. - loadClassEntities -
    97. + loadEntities + - Load entities into a collection +
    98. + loadEntitiesByConfiguration + - Load entities into a collection by configuration
    99. remove
    100. +
    101. + toArray +
    102. updateEntitiesCache
    103. @@ -118,7 +124,7 @@ final class ClassEntityCollection extends \BumbleDocGen\Core\Parser\Entity\Logga @@ -133,11 +139,11 @@ final class ClassEntityCollection extends \BumbleDocGen\Core\Parser\Entity\Logga ```php -public function __construct(\BumbleDocGen\Core\Configuration\Configuration $configuration, \BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings $phpHandlerSettings, \BumbleDocGen\Core\Plugin\PluginEventDispatcher $pluginEventDispatcher, \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Cache\CacheablePhpEntityFactory $cacheablePhpEntityFactory, \BumbleDocGen\LanguageHandler\Php\Renderer\EntityDocRenderer\EntityDocRendererHelper $docRendererHelper, \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpParser\PhpParserHelper $phpParserHelper, \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache $localObjectCache, \BumbleDocGen\Console\ProgressBar\ProgressBarFactory $progressBarFactory, \Symfony\Component\Console\Style\OutputStyle $io, \Psr\Log\LoggerInterface $logger); +public function __construct(\BumbleDocGen\Core\Configuration\Configuration $configuration, \BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings $phpHandlerSettings, \BumbleDocGen\Core\Plugin\PluginEventDispatcher $pluginEventDispatcher, \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Cache\CacheablePhpEntityFactory $cacheablePhpEntityFactory, \BumbleDocGen\LanguageHandler\Php\Renderer\EntityDocRenderer\EntityDocRendererHelper $docRendererHelper, \BumbleDocGen\LanguageHandler\Php\Parser\PhpParser\PhpParserHelper $phpParserHelper, \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache $localObjectCache, \Psr\Log\LoggerInterface $logger); ``` @@ -180,23 +186,13 @@ public function __construct(\BumbleDocGen\Core\Configuration\Configuration $conf $phpParserHelper - \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpParser\PhpParserHelper + \BumbleDocGen\LanguageHandler\Php\Parser\PhpParser\PhpParserHelper - $localObjectCache \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache - - - - $progressBarFactory - \BumbleDocGen\Console\ProgressBar\ProgressBarFactory - - - - - $io - \Symfony\Component\Console\Style\OutputStyle - - $logger @@ -215,11 +211,11 @@ public function __construct(\BumbleDocGen\Core\Configuration\Configuration $conf ```php -public function add(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity $classEntity, bool $reload = false): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection; +public function add(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity $classEntity, bool $reload = false): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; ``` @@ -237,7 +233,7 @@ public function add(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity $classEntity - \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity + \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - @@ -248,7 +244,7 @@ public function add(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection Throws: @@ -288,14 +284,14 @@ public function clearOperationsLogCollection(): void; ```php -public function filterByInterfaces(array $interfaces): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection; +public function filterByInterfaces(array $interfaces): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; ``` - +
      Retrieving all entities that implement the specified interfaces. Filtering is only available for ClassLikeEntity.
      Parameters: @@ -316,7 +312,7 @@ public function filterByInterfaces(array $interfaces): \BumbleDocGen\LanguageHan -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection Throws: @@ -333,11 +329,11 @@ public function filterByInterfaces(array $interfaces): \BumbleDocGen\LanguageHan ```php -public function filterByNameRegularExpression(string $regexPattern): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection; +public function filterByNameRegularExpression(string $regexPattern): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; ``` @@ -361,7 +357,7 @@ public function filterByNameRegularExpression(string $regexPattern): \BumbleDocG -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection
      @@ -371,14 +367,14 @@ public function filterByNameRegularExpression(string $regexPattern): \BumbleDocG ```php -public function filterByParentClassNames(array $parentClassNames): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection; +public function filterByParentClassNames(array $parentClassNames): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; ``` - +
      Retrieving all entities that inherit from the specified classes. Filtering is only available for ClassLikeEntity.
      Parameters: @@ -399,7 +395,7 @@ public function filterByParentClassNames(array $parentClassNames): \BumbleDocGen -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection Throws: @@ -416,14 +412,14 @@ public function filterByParentClassNames(array $parentClassNames): \BumbleDocGen ```php -public function filterByPaths(array $paths): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection; +public function filterByPaths(array $paths): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; ``` - +
      Filtering entities by relative files paths (from project_root) of the project
      Parameters: @@ -444,7 +440,7 @@ public function filterByPaths(array $paths): \BumbleDocGen\LanguageHandler\Php\P -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection Throws: @@ -546,11 +542,11 @@ public function get(string $objectName): null|\BumbleDocGen\Core\Parser\Entity\R ```php -public function getEntityByClassName(string $className, bool $createIfNotExists = true): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity; +public function getEntityByClassName(string $className, bool $createIfNotExists = true): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; ``` @@ -579,7 +575,7 @@ public function getEntityByClassName(string $className, bool $createIfNotExists -Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity +Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity @@ -589,7 +585,7 @@ public function getEntityByClassName(string $className, bool $createIfNotExists ```php @@ -610,7 +606,7 @@ public function getEntityCollectionName(): string; ```php @@ -724,7 +720,7 @@ public function getLoadedOrCreateNew(string $objectName, bool $withAddClassEntit See:
      @@ -733,18 +729,18 @@ public function getLoadedOrCreateNew(string $objectName, bool $withAddClassEntit ```php -public function getOnlyAbstractClasses(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection; +public function getOnlyAbstractClasses(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; ``` Parameters: not specified -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection Throws: @@ -761,26 +757,19 @@ public function getOnlyAbstractClasses(): \BumbleDocGen\LanguageHandler\Php\Pars ```php -public function getOnlyInstantiable(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection; +public function getOnlyInstantiable(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; ``` - +
      Retrieving only instantiable entities. Filtering is only available for ClassLikeEntity.
      Parameters: not specified -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection - - -Throws: -
      @@ -789,27 +778,20 @@ public function getOnlyInstantiable(): \BumbleDocGen\LanguageHandler\Php\Parser\ ```php -public function getOnlyInterfaces(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection; +public function getOnlyInterfaces(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; ``` Parameters: not specified -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection -Throws: - -
      @@ -817,27 +799,20 @@ public function getOnlyInterfaces(): \BumbleDocGen\LanguageHandler\Php\Parser\En ```php -public function getOnlyTraits(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection; +public function getOnlyTraits(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; ``` Parameters: not specified -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection -Throws: - -

      @@ -868,7 +843,7 @@ public function getOperationsLogCollection(): \BumbleDocGen\Core\Parser\Entity\C ```php @@ -929,11 +904,11 @@ public function has(string $objectName): bool; ```php -public function internalFindEntity(string $search, bool $useUnsafeKeys = true): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity; +public function internalFindEntity(string $search, bool $useUnsafeKeys = true): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; ``` @@ -964,7 +939,7 @@ public function internalFindEntity(string $search, bool $useUnsafeKeys = true): -Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity +Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity @@ -972,14 +947,14 @@ public function internalFindEntity(string $search, bool $useUnsafeKeys = true): Examples of using: ```php -$classEntityCollection->findEntity('App'); // class name -$classEntityCollection->findEntity('BumbleDocGen\Console\App'); // class with namespace -$classEntityCollection->findEntity('\BumbleDocGen\Console\App'); // class with namespace -$classEntityCollection->findEntity('\BumbleDocGen\Console\App::test()'); // class with namespace and optional part -$classEntityCollection->findEntity('App.php'); // filename -$classEntityCollection->findEntity('/BumbleDocGen/Console/App.php'); // relative path -$classEntityCollection->findEntity('/Users/someuser/Desktop/projects/bumble-doc-gen/BumbleDocGen/Console/App.php'); // absolute path -$classEntityCollection->findEntity('https://github.com/bumble-tech/bumble-doc-gen/blob/master/BumbleDocGen/Console/App.php'); // source link +$entitiesCollection->findEntity('App'); // class name +$entitiesCollection->findEntity('BumbleDocGen\Console\App'); // class with namespace +$entitiesCollection->findEntity('\BumbleDocGen\Console\App'); // class with namespace +$entitiesCollection->findEntity('\BumbleDocGen\Console\App::test()'); // class with namespace and optional part +$entitiesCollection->findEntity('App.php'); // filename +$entitiesCollection->findEntity('/src/Console/App.php'); // relative path +$entitiesCollection->findEntity('/Users/someuser/Desktop/projects/bumble-doc-gen/src/Console/App.php'); // absolute path +$entitiesCollection->findEntity('https://github.com/bumble-tech/bumble-doc-gen/blob/master/src/Console/App.php'); // source link ```
      @@ -989,11 +964,11 @@ $classEntityCollection->findEntity('https://github.com/bumble-tech/bumble-doc-ge ```php -public function internalGetLoadedOrCreateNew(string $objectName, bool $withAddClassEntityToCollectionEvent = false): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity; +public function internalGetLoadedOrCreateNew(string $objectName, bool $withAddClassEntityToCollectionEvent = false): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; ``` @@ -1022,7 +997,7 @@ public function internalGetLoadedOrCreateNew(string $objectName, bool $withAddCl -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity Throws: @@ -1033,6 +1008,9 @@ public function internalGetLoadedOrCreateNew(string $objectName, bool $withAddCl
    104. \DI\NotFoundException
    105. +
    106. + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    107. + @@ -1063,20 +1041,47 @@ public function isEmpty(): bool;
      ```php -public function loadClassEntities(): void; +public function loadEntities(\BumbleDocGen\Core\Parser\SourceLocator\SourceLocatorsCollection $sourceLocatorsCollection, \BumbleDocGen\Core\Parser\FilterCondition\ConditionInterface|null $filters = null, \BumbleDocGen\Core\Parser\Entity\EntitiesLoaderProgressBarInterface|null $progressBar = null): \BumbleDocGen\Core\Parser\Entity\CollectionLoadEntitiesResult; ``` +
      Load entities into a collection
      +Parameters: -Parameters: not specified + + + + + + + + + + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $sourceLocatorsCollection\BumbleDocGen\Core\Parser\SourceLocator\SourceLocatorsCollection-
      $filters\BumbleDocGen\Core\Parser\FilterCondition\ConditionInterface | null-
      $progressBar\BumbleDocGen\Core\Parser\Entity\EntitiesLoaderProgressBarInterface | null-
      -Return value: void +Return value: \BumbleDocGen\Core\Parser\Entity\CollectionLoadEntitiesResult Throws: @@ -1099,6 +1104,60 @@ public function loadClassEntities(): void;
      +
        +
      • # + loadEntitiesByConfiguration + :warning: Is internal | source code
      • +
      + +```php +public function loadEntitiesByConfiguration(\BumbleDocGen\Core\Parser\Entity\EntitiesLoaderProgressBarInterface|null $progressBar = null): \BumbleDocGen\Core\Parser\Entity\CollectionLoadEntitiesResult; +``` + +
      Load entities into a collection by configuration
      + +Parameters: + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $progressBar\BumbleDocGen\Core\Parser\Entity\EntitiesLoaderProgressBarInterface | null-
      + +Return value: \BumbleDocGen\Core\Parser\Entity\CollectionLoadEntitiesResult + + +Throws: + + +
      +
      +
      +
      • # remove @@ -1135,6 +1194,29 @@ public function remove(string $objectName): void; Return value: void +
      +
      +
      + + + +```php +// Implemented in BumbleDocGen\Core\Parser\Entity\RootEntityCollection + +public function toArray(): array; +``` + + + +Parameters: not specified + +Return value: array + +

      @@ -1142,7 +1224,7 @@ public function remove(string $objectName): void; ```php diff --git a/docs/tech/classes/PhpHandler.md b/docs/tech/classes/PhpHandler.md index 0961287a..c169860c 100644 --- a/docs/tech/classes/PhpHandler.md +++ b/docs/tech/classes/PhpHandler.md @@ -2,7 +2,7 @@ BumbleDocGen / Technical description of the project / Class map / PhpHandler

      - PhpHandler class: + PhpHandler class:

      @@ -45,6 +45,9 @@ final class PhpHandler implements \BumbleDocGen\LanguageHandler\LanguageHandlerI
    108. getLanguageKey - Unique language handler key
    109. +
    110. + getPhpHandlerSettings +
    @@ -60,11 +63,11 @@ final class PhpHandler implements \BumbleDocGen\LanguageHandler\LanguageHandlerI ```php -public function __construct(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection $classEntityCollection, \BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings $phpHandlerSettings); +public function __construct(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection $entitiesCollection, \BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings $phpHandlerSettings); ``` @@ -81,8 +84,8 @@ public function __construct(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\Clas - $classEntityCollection - \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection + $entitiesCollection + \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection - @@ -102,7 +105,7 @@ public function __construct(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\Clas ```php @@ -153,7 +156,7 @@ public function getCustomTwigFilters(\BumbleDocGen\Core\Renderer\Context\Rendere ```php @@ -208,51 +211,56 @@ public function getCustomTwigFunctions(\BumbleDocGen\Core\Renderer\Context\Rende ```php -public function getEntityCollection(): \BumbleDocGen\Core\Parser\Entity\RootEntityCollection; +public function getEntityCollection(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; ``` Parameters: not specified -Return value: \BumbleDocGen\Core\Parser\Entity\RootEntityCollection +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection -Throws: + +
    +
    + -
  • - \DI\DependencyException
  • +```php +public static function getLanguageKey(): string; +``` -
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • +
    Unique language handler key
    -
  • - \Psr\Cache\InvalidArgumentException
  • +Parameters: not specified + +Return value: string -
    ```php -public static function getLanguageKey(): string; +public function getPhpHandlerSettings(): \BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings; ``` -
    Unique language handler key
    + Parameters: not specified -Return value: string +Return value: \BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings
    diff --git a/docs/tech/classes/PhpHandlerSettings.md b/docs/tech/classes/PhpHandlerSettings.md index e07845e8..5b3abf00 100644 --- a/docs/tech/classes/PhpHandlerSettings.md +++ b/docs/tech/classes/PhpHandlerSettings.md @@ -43,7 +43,7 @@ final class PhpHandlerSettings getComposerConfigFile
  • - getComposerInstalledFile + getComposerVendorDir
  • getCustomTwigFilters @@ -231,13 +231,13 @@ public function getComposerConfigFile(): null|string;
      -
    • # - getComposerInstalledFile +
    • # + getComposerVendorDir | source code
    ```php -public function getComposerInstalledFile(): null|string; +public function getComposerVendorDir(): null|string; ``` @@ -261,7 +261,7 @@ public function getComposerInstalledFile(): null|string; ```php @@ -295,7 +295,7 @@ public function getCustomTwigFilters(): \BumbleDocGen\Core\Renderer\Twig\Filter\ ```php @@ -459,7 +459,7 @@ public function getPropertyEntityFilter(): \BumbleDocGen\Core\Parser\FilterCondi ```php diff --git a/docs/tech/classes/PhpHandlerSettings_2.md b/docs/tech/classes/PhpHandlerSettings_2.md new file mode 100644 index 00000000..fd2a8151 --- /dev/null +++ b/docs/tech/classes/PhpHandlerSettings_2.md @@ -0,0 +1,514 @@ + + BumbleDocGen / Technical description of the project / PhpHandlerSettings
    + +

    + PhpHandlerSettings class: +

    + + + + + +```php +namespace BumbleDocGen\LanguageHandler\Php; + +final class PhpHandlerSettings +``` + + + + + + + + +

    Initialization methods:

    + +
      +
    1. + __construct +
    2. +
    + +

    Methods:

    + +
      +
    1. + getClassConstantEntityFilter +
    2. +
    3. + getClassEntityFilter +
    4. +
    5. + getComposerConfigFile +
    6. +
    7. + getComposerVendorDir +
    8. +
    9. + getCustomTwigFilters +
    10. +
    11. + getCustomTwigFunctions +
    12. +
    13. + getEntityDocRenderersCollection +
    14. +
    15. + getFileSourceBaseUrl +
    16. +
    17. + getMethodEntityFilter +
    18. +
    19. + getPropertyEntityFilter +
    20. +
    21. + getPsr4Map +
    22. +
    23. + getUseComposerAutoload +
    24. +
    + + +

    Constants:

    + + + + + + +

    Method details:

    + +
    + + + +```php +public function __construct(\BumbleDocGen\Core\Configuration\ConfigurationParameterBag $parameterBag, \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache $localObjectCache); +``` + + + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $parameterBag\BumbleDocGen\Core\Configuration\ConfigurationParameterBag-
    $localObjectCache\BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache-
    + + + +
    +
    +
    + + + +```php +public function getClassConstantEntityFilter(): \BumbleDocGen\Core\Parser\FilterCondition\ConditionInterface; +``` + + + +Parameters: not specified + +Return value: \BumbleDocGen\Core\Parser\FilterCondition\ConditionInterface + + +Throws: + + +
    +
    +
    + + + +```php +public function getClassEntityFilter(): \BumbleDocGen\Core\Parser\FilterCondition\ConditionInterface; +``` + + + +Parameters: not specified + +Return value: \BumbleDocGen\Core\Parser\FilterCondition\ConditionInterface + + +Throws: + + +
    +
    +
    + + + +```php +public function getComposerConfigFile(): null|string; +``` + + + +Parameters: not specified + +Return value: null | string + + +Throws: + + +
    +
    +
    + + + +```php +public function getComposerVendorDir(): null|string; +``` + + + +Parameters: not specified + +Return value: null | string + + +Throws: + + +
    +
    +
    + + + +```php +public function getCustomTwigFilters(): \BumbleDocGen\Core\Renderer\Twig\Filter\CustomFiltersCollection; +``` + + + +Parameters: not specified + +Return value: \BumbleDocGen\Core\Renderer\Twig\Filter\CustomFiltersCollection + + +Throws: + + +
    +
    +
    + + + +```php +public function getCustomTwigFunctions(): \BumbleDocGen\Core\Renderer\Twig\Function\CustomFunctionsCollection; +``` + + + +Parameters: not specified + +Return value: \BumbleDocGen\Core\Renderer\Twig\Function\CustomFunctionsCollection + + +Throws: + + +
    +
    +
    + + + +```php +public function getEntityDocRenderersCollection(): \BumbleDocGen\Core\Renderer\EntityDocRenderer\EntityDocRenderersCollection; +``` + + + +Parameters: not specified + +Return value: \BumbleDocGen\Core\Renderer\EntityDocRenderer\EntityDocRenderersCollection + + +Throws: + + +
    +
    +
    + + + +```php +public function getFileSourceBaseUrl(): null|string; +``` + + + +Parameters: not specified + +Return value: null | string + + +Throws: + + +
    +
    +
    + + + +```php +public function getMethodEntityFilter(): \BumbleDocGen\Core\Parser\FilterCondition\ConditionInterface; +``` + + + +Parameters: not specified + +Return value: \BumbleDocGen\Core\Parser\FilterCondition\ConditionInterface + + +Throws: + + +
    +
    +
    + + + +```php +public function getPropertyEntityFilter(): \BumbleDocGen\Core\Parser\FilterCondition\ConditionInterface; +``` + + + +Parameters: not specified + +Return value: \BumbleDocGen\Core\Parser\FilterCondition\ConditionInterface + + +Throws: + + +
    +
    +
    + + + +```php +public function getPsr4Map(): array; +``` + + + +Parameters: not specified + +Return value: array + + +Throws: + + +
    +
    +
    + + + +```php +public function getUseComposerAutoload(): bool; +``` + + + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    + + \ No newline at end of file diff --git a/docs/tech/classes/PhpParserHelper.md b/docs/tech/classes/PhpParserHelper.md index ae43d32d..b1759862 100644 --- a/docs/tech/classes/PhpParserHelper.md +++ b/docs/tech/classes/PhpParserHelper.md @@ -2,7 +2,7 @@ BumbleDocGen / Technical description of the project / Class map / PhpParserHelper

    - PhpParserHelper class: + PhpParserHelper class:

    @@ -10,7 +10,7 @@ ```php -namespace BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpParser; +namespace BumbleDocGen\LanguageHandler\Php\Parser\PhpParser; final class PhpParserHelper ``` @@ -44,7 +44,7 @@ final class PhpParserHelper ```php diff --git a/docs/tech/classes/PhpReflectionApiConfig.md b/docs/tech/classes/PhpReflectionApiConfig.md new file mode 100644 index 00000000..c5247abf --- /dev/null +++ b/docs/tech/classes/PhpReflectionApiConfig.md @@ -0,0 +1,643 @@ + + BumbleDocGen / Technical description of the project / Class map / PhpReflectionApiConfig
    + +

    + PhpReflectionApiConfig class: +

    + + + + + +```php +namespace BumbleDocGen\LanguageHandler\Php; + +final class PhpReflectionApiConfig extends \BumbleDocGen\Core\Configuration\ReflectionApiConfig +``` + + + + + + + + +

    Initialization methods:

    + +
      +
    1. + create +
    2. +
    3. + createByConfiguration +
    4. +
    + +

    Methods:

    + +
      +
    1. + disableComposerAutoload +
    2. +
    3. + getCacheDir +
    4. +
    5. + getLanguageHandlerClassName +
    6. +
    7. + getProjectRoot +
    8. +
    9. + setCacheDir +
    10. +
    11. + setClassConstantFilter +
    12. +
    13. + setClassFilter +
    14. +
    15. + setComposerConfigFile +
    16. +
    17. + setComposerVendorPath +
    18. +
    19. + setMethodFilter +
    20. +
    21. + setProjectRoot +
    22. +
    23. + setPropertyFilter +
    24. +
    25. + setPsr4Map +
    26. +
    27. + toConfigArray +
    28. +
    29. + useComposerAutoload +
    30. +
    + + + + + + + +

    Method details:

    + +
    + + + +```php +public static function create(): self; +``` + + + +Parameters: not specified + +Return value: self + + +
    +
    +
    + + + +```php +public static function createByConfiguration(\BumbleDocGen\Core\Configuration\Configuration $configuration): self; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $configuration\BumbleDocGen\Core\Configuration\Configuration-
    + +Return value: self + + +Throws: + + +
    +
    +
    + + + +```php +public function disableComposerAutoload(): void; +``` + + + +Parameters: not specified + +Return value: void + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\Core\Configuration\ReflectionApiConfig + +public function getCacheDir(): null|string; +``` + + + +Parameters: not specified + +Return value: null | string + + +
    +
    +
    + + + +```php +public function getLanguageHandlerClassName(): string; +``` + + + +Parameters: not specified + +Return value: string + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\Core\Configuration\ReflectionApiConfig + +public function getProjectRoot(): string; +``` + + + +Parameters: not specified + +Return value: string + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\Core\Configuration\ReflectionApiConfig + +public function setCacheDir(string|null $cacheDir): void; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $cacheDirstring | null-
    + +Return value: void + + +
    +
    +
    + + + +```php +public function setClassConstantFilter(\BumbleDocGen\Core\Parser\FilterCondition\ConditionInterface $classConstantFilter): void; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $classConstantFilter\BumbleDocGen\Core\Parser\FilterCondition\ConditionInterface-
    + +Return value: void + + +
    +
    +
    + + + +```php +public function setClassFilter(\BumbleDocGen\Core\Parser\FilterCondition\ConditionInterface $classFilter): void; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $classFilter\BumbleDocGen\Core\Parser\FilterCondition\ConditionInterface-
    + +Return value: void + + +
    +
    +
    + + + +```php +public function setComposerConfigFile(string $composerConfigFile): void; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $composerConfigFilestring-
    + +Return value: void + + +
    +
    +
    + + + +```php +public function setComposerVendorPath(string $composerInstalledFile): void; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $composerInstalledFilestring-
    + +Return value: void + + +
    +
    +
    + + + +```php +public function setMethodFilter(\BumbleDocGen\Core\Parser\FilterCondition\ConditionInterface $methodFilter): void; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $methodFilter\BumbleDocGen\Core\Parser\FilterCondition\ConditionInterface-
    + +Return value: void + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\Core\Configuration\ReflectionApiConfig + +public function setProjectRoot(string $projectRoot): void; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $projectRootstring-
    + +Return value: void + + +
    +
    +
    + + + +```php +public function setPropertyFilter(\BumbleDocGen\Core\Parser\FilterCondition\ConditionInterface $propertyFilter): void; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $propertyFilter\BumbleDocGen\Core\Parser\FilterCondition\ConditionInterface-
    + +Return value: void + + +
    +
    +
    + + + +```php +public function setPsr4Map(array $psr4Map): void; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $psr4Maparray-
    + +Return value: void + + +
    +
    +
    + + + +```php +public function toConfigArray(): array; +``` + + + +Parameters: not specified + +Return value: array + + +
    +
    +
    + + + +```php +public function useComposerAutoload(): void; +``` + + + +Parameters: not specified + +Return value: void + + +
    +
    + + \ No newline at end of file diff --git a/docs/tech/classes/PhpUnitStubberPlugin.md b/docs/tech/classes/PhpUnitStubberPlugin.md index f1f872c4..968ac2aa 100644 --- a/docs/tech/classes/PhpUnitStubberPlugin.md +++ b/docs/tech/classes/PhpUnitStubberPlugin.md @@ -30,7 +30,7 @@ final class PhpUnitStubberPlugin implements \BumbleDocGen\Core\Plugin\PluginInte getSubscribedEvents
  • - onCheckIsClassEntityCanBeLoad + onCheckIsEntityCanBeLoaded
  • onGettingResourceLink @@ -69,13 +69,13 @@ public static function getSubscribedEvents(): array;
      -
    • # - onCheckIsClassEntityCanBeLoad +
    • # + onCheckIsEntityCanBeLoaded | source code
    ```php -public function onCheckIsClassEntityCanBeLoad(\BumbleDocGen\LanguageHandler\Php\Plugin\Event\Entity\OnCheckIsClassEntityCanBeLoad $event): void; +public function onCheckIsEntityCanBeLoaded(\BumbleDocGen\LanguageHandler\Php\Plugin\Event\Entity\OnCheckIsEntityCanBeLoaded $event): void; ``` @@ -93,7 +93,7 @@ public function onCheckIsClassEntityCanBeLoad(\BumbleDocGen\LanguageHandler\Php\ $event - \BumbleDocGen\LanguageHandler\Php\Plugin\Event\Entity\OnCheckIsClassEntityCanBeLoad + \BumbleDocGen\LanguageHandler\Php\Plugin\Event\Entity\OnCheckIsEntityCanBeLoaded - diff --git a/docs/tech/classes/PrintEntityCollectionAsList.md b/docs/tech/classes/PrintEntityCollectionAsList.md index fae8c861..16259fe2 100644 --- a/docs/tech/classes/PrintEntityCollectionAsList.md +++ b/docs/tech/classes/PrintEntityCollectionAsList.md @@ -21,13 +21,13 @@ final class PrintEntityCollectionAsList implements \BumbleDocGen\Core\Renderer\T Examples of using: ```php -{{ printEntityCollectionAsList(phpClassEntityCollection.filterByInterfaces(['ScriptFramework\\ScriptInterface', 'ScriptFramework\\TestScriptInterface'])) }} +{{ printEntityCollectionAsList(phpEntities.filterByInterfaces(['ScriptFramework\\ScriptInterface', 'ScriptFramework\\TestScriptInterface'])) }} The function will output a list of PHP classes that match the ScriptFramework\ScriptInterface and ScriptFramework\TestScriptInterface interfaces ``` ```php -{{ printEntityCollectionAsList(phpClassEntityCollection) }} +{{ printEntityCollectionAsList(phpEntities) }} The function will list all documented PHP classes ``` diff --git a/docs/tech/classes/ProjectParser.md b/docs/tech/classes/ProjectParser.md index 2f2dacbc..952b3e02 100644 --- a/docs/tech/classes/ProjectParser.md +++ b/docs/tech/classes/ProjectParser.md @@ -2,7 +2,7 @@ BumbleDocGen / Technical description of the project / Class map / ProjectParser

    - ProjectParser class: + ProjectParser class:

    @@ -33,6 +33,12 @@ final class ProjectParser

    Methods:

      +
    1. + getEntityCollectionForPL +
    2. +
    3. + getRootEntityCollectionsGroup +
    4. parse
    5. @@ -51,7 +57,7 @@ final class ProjectParser ```php @@ -96,13 +102,64 @@ public function __construct(\BumbleDocGen\Core\Configuration\Configuration $conf
      ```php -public function parse(): \BumbleDocGen\Core\Parser\Entity\RootEntityCollectionsGroup; +public function getEntityCollectionForPL(string $plHandlerClassName): null|\BumbleDocGen\Core\Parser\Entity\RootEntityCollection; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $plHandlerClassNamestring-
      + +Return value: null | \BumbleDocGen\Core\Parser\Entity\RootEntityCollection + + +Throws: + + +
      +
      +
      + + + +```php +public function getRootEntityCollectionsGroup(): \BumbleDocGen\Core\Parser\Entity\RootEntityCollectionsGroup; ``` @@ -112,6 +169,44 @@ public function parse(): \BumbleDocGen\Core\Parser\Entity\RootEntityCollectionsG Return value: \BumbleDocGen\Core\Parser\Entity\RootEntityCollectionsGroup +
      +
      +
      + + + +```php +public function parse(\BumbleDocGen\Core\Parser\Entity\EntitiesLoaderProgressBarInterface|null $progressBar = null): \BumbleDocGen\Core\Parser\Entity\CollectionGroupLoadEntitiesResult; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $progressBar\BumbleDocGen\Core\Parser\Entity\EntitiesLoaderProgressBarInterface | null-
      + +Return value: \BumbleDocGen\Core\Parser\Entity\CollectionGroupLoadEntitiesResult + + Throws:
      • diff --git a/docs/tech/classes/PropertyEntityCollection.md b/docs/tech/classes/PropertyEntitiesCollection.md similarity index 69% rename from docs/tech/classes/PropertyEntityCollection.md rename to docs/tech/classes/PropertyEntitiesCollection.md index 8e710bf7..6d3ed9f5 100644 --- a/docs/tech/classes/PropertyEntityCollection.md +++ b/docs/tech/classes/PropertyEntitiesCollection.md @@ -1,8 +1,8 @@ - BumbleDocGen / Technical description of the project / Class map / PropertyEntityCollection
        + BumbleDocGen / Technical description of the project / Class map / PropertyEntitiesCollection

        - PropertyEntityCollection class: + PropertyEntitiesCollection class:

        @@ -10,9 +10,9 @@ ```php -namespace BumbleDocGen\LanguageHandler\Php\Parser\Entity; +namespace BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property; -final class PropertyEntityCollection extends \BumbleDocGen\Core\Parser\Entity\BaseEntityCollection implements \IteratorAggregate +final class PropertyEntitiesCollection extends \BumbleDocGen\Core\Parser\Entity\BaseEntityCollection implements \IteratorAggregate ``` @@ -35,10 +35,10 @@ final class PropertyEntityCollection extends \BumbleDocGen\Core\Parser\Entity\Ba
        1. add -
        2. + - Add an entity to a collection
        3. get -
        4. + - Get the loaded property entity if it exists
        5. getIterator
        6. @@ -50,13 +50,13 @@ final class PropertyEntityCollection extends \BumbleDocGen\Core\Parser\Entity\Ba
        7. loadPropertyEntities -
        8. + - Load property entities into the collection according to the project configuration
        9. remove
        10. unsafeGet -
        11. + - Get the property entity if it exists. If the property exists but has not been loaded into the collection, a new entity object will be created
        @@ -72,11 +72,11 @@ final class PropertyEntityCollection extends \BumbleDocGen\Core\Parser\Entity\Ba ```php -public function __construct(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity $classEntity, \BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings $phpHandlerSettings, \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Cache\CacheablePhpEntityFactory $cacheablePhpEntityFactory); +public function __construct(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity $classEntity, \BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings $phpHandlerSettings, \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Cache\CacheablePhpEntityFactory $cacheablePhpEntityFactory); ``` @@ -94,7 +94,7 @@ public function __construct(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\Clas $classEntity - \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity + \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - @@ -119,14 +119,14 @@ public function __construct(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\Clas ```php -public function add(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\PropertyEntity $propertyEntity, bool $reload = false): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PropertyEntityCollection; +public function add(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntity $propertyEntity, bool $reload = false): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntitiesCollection; ``` - +
        Add an entity to a collection
        Parameters: @@ -141,18 +141,18 @@ public function add(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\PropertyEnti $propertyEntity - \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PropertyEntity - - + \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntity + Entity to be added to the collection $reload bool - - + Replace an entity with a new one if one has already been loaded previously -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PropertyEntityCollection +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntitiesCollection
      @@ -162,14 +162,14 @@ public function add(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\PropertyEnti ```php -public function get(string $objectName): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\PropertyEntity; +public function get(string $objectName): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntity; ``` - +
      Get the loaded property entity if it exists
      Parameters: @@ -185,12 +185,12 @@ public function get(string $objectName): null|\BumbleDocGen\LanguageHandler\Php\ $objectName string - - + Property entity name -Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PropertyEntity +Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntity
    @@ -286,14 +286,14 @@ public function isEmpty(): bool; ```php public function loadPropertyEntities(): void; ``` - +
    Load property entities into the collection according to the project configuration
    Parameters: not specified @@ -313,6 +313,12 @@ public function loadPropertyEntities(): void; + +See: +
    @@ -360,14 +366,14 @@ public function remove(string $objectName): void; ```php -public function unsafeGet(string $objectName): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\PropertyEntity; +public function unsafeGet(string $objectName): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntity; ``` - +
    Get the property entity if it exists. If the property exists but has not been loaded into the collection, a new entity object will be created
    Parameters: @@ -383,16 +389,19 @@ public function unsafeGet(string $objectName): null|\BumbleDocGen\LanguageHandle $objectName string - - + Property entity name -Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PropertyEntity +Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntity Throws:
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function entityCacheIsOutdated(): bool; -``` - - - -Parameters: not specified - -Return value: bool - - -Throws: - -

    @@ -310,7 +275,7 @@ public function entityCacheIsOutdated(): bool; ```php @@ -340,14 +305,14 @@ public function getAbsoluteFileName(): null|string; ```php public function getAst(): \PhpParser\Node\Stmt\Property; ``` - +
    Get AST for this entity
    Parameters: not specified @@ -368,7 +333,7 @@ public function getAst(): \PhpParser\Node\Stmt\Property; ```php @@ -391,7 +356,7 @@ public function getCacheKey(): string; ```php @@ -412,6 +377,9 @@ public function getCachedEntityDependencies(): array;
  • \Psr\Cache\InvalidArgumentException
  • +
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + @@ -421,20 +389,20 @@ public function getCachedEntityDependencies(): array; ```php // Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity -public function getCurrentRootEntity(): null|\BumbleDocGen\Core\Parser\Entity\RootEntityInterface; +public function getCurrentRootEntity(): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; ``` Parameters: not specified -Return value: null | \BumbleDocGen\Core\Parser\Entity\RootEntityInterface +Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity @@ -444,14 +412,14 @@ public function getCurrentRootEntity(): null|\BumbleDocGen\Core\Parser\Entity\Ro ```php public function getDefaultValue(): string|array|int|bool|null|float; ``` - +
    Get the compiled default value of a property
    Parameters: not specified @@ -475,14 +443,16 @@ public function getDefaultValue(): string|array|int|bool|null|float; ```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + public function getDescription(): string; ``` - +
    Get entity description
    Parameters: not specified @@ -491,12 +461,6 @@ public function getDescription(): string; Throws:
      -
    • - \DI\NotFoundException
    • - -
    • - \DI\DependencyException
    • -
    • \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    • @@ -509,7 +473,7 @@ public function getDescription(): string; ```php @@ -542,14 +506,16 @@ public function getDescriptionLinks(): array; ```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + public function getDocBlock(): \phpDocumentor\Reflection\DocBlock; ``` - +
      Get DocBlock for current entity
      Parameters: not specified @@ -558,12 +524,6 @@ public function getDocBlock(): \phpDocumentor\Reflection\DocBlock; Throws:
        -
      • - \DI\DependencyException
      • - -
      • - \DI\NotFoundException
      • -
      • \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
      • @@ -576,7 +536,7 @@ public function getDocBlock(): \phpDocumentor\Reflection\DocBlock; ```php @@ -606,28 +566,45 @@ public function getDocComment(): string; ```php -public function getDocCommentEntity(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PropertyEntity; +public function getDocCommentEntity(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntity; ``` - +
        Link to an entity where docBlock is implemented for this entity
        Parameters: not specified -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PropertyEntity +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntity -Throws: + +
        +
        + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDocCommentLine(): null|int; +``` + +
        Get the code line number where the docBlock of the current entity begins
        + +Parameters: not specified + +Return value: null | int -
      • - \DI\NotFoundException
      • +Throws: +

        @@ -663,14 +647,14 @@ public function getDocNote(): string; ```php public function getEndLine(): int; ``` - +
        Get the line number of the end of a property's code in a file
        Parameters: not specified @@ -691,7 +675,7 @@ public function getEndLine(): int; ```php @@ -707,27 +691,6 @@ public function getExamples(): array; Return value: array -
        -
        -
        - - - -```php -public function getFileName(): null|string; -``` - - - -Parameters: not specified - -Return value: null | string - - Throws:
        • @@ -742,7 +705,7 @@ public function getFileName(): null|string; ```php @@ -789,7 +752,7 @@ public function getFileSourceLink(bool $withLine = true): null|string; ```php @@ -798,13 +761,20 @@ public function getFileSourceLink(bool $withLine = true): null|string; public function getFirstExample(): string; ``` -
          Get first example from @examples doc block
          +
          Get first example from `examples` doc block
          Parameters: not specified Return value: string +Throws: + +

        @@ -812,18 +782,18 @@ public function getFirstExample(): string; ```php -public function getImplementingClass(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity; +public function getImplementingClass(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; ``` - +
        Get the class like entity in which the current entity was implemented
        Parameters: not specified -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity
        @@ -833,14 +803,14 @@ public function getImplementingClass(): \BumbleDocGen\LanguageHandler\Php\Parser ```php public function getImplementingClassName(): string; ``` - +
        Get the name of the class in which this property is implemented
        Parameters: not specified @@ -854,14 +824,14 @@ public function getImplementingClassName(): string; ```php public function getModifiersString(): string; ``` - +
        Get a text representation of property modifiers
        Parameters: not specified @@ -888,14 +858,14 @@ public function getModifiersString(): string; ```php public function getName(): string; ``` - +
        Full name of the entity
        Parameters: not specified @@ -909,14 +879,14 @@ public function getName(): string; ```php public function getNamespaceName(): string; ``` - +
        Namespace of the class that contains this property
        Parameters: not specified @@ -930,7 +900,7 @@ public function getNamespaceName(): string; ```php @@ -946,27 +916,6 @@ public function getObjectId(): string; Return value: string - -
        -
        - - - -```php -public function getPhpHandlerSettings(): \BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings; -``` - - - -Parameters: not specified - -Return value: \BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings - -

        @@ -974,29 +923,26 @@ public function getPhpHandlerSettings(): \BumbleDocGen\LanguageHandler\Php\PhpHa ```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - public function getRelativeFileName(): null|string; ``` - +
        File name relative to project_root configuration parameter
        Parameters: not specified Return value: null | string -Throws: -

        @@ -1004,18 +950,18 @@ public function getRelativeFileName(): null|string; ```php -public function getRootEntity(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity; +public function getRootEntity(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; ``` Parameters: not specified -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity
        @@ -1025,18 +971,18 @@ public function getRootEntity(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity ```php -public function getRootEntityCollection(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection; +public function getRootEntityCollection(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; ``` -
        Get parent collection of entities
        +
        Get the collection of root entities to which this entity belongs
        Parameters: not specified -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection @@ -1046,14 +992,14 @@ public function getRootEntityCollection(): \BumbleDocGen\LanguageHandler\Php\Par ```php public function getShortName(): string; ``` - +
        Short name of the entity
        Parameters: not specified @@ -1067,20 +1013,43 @@ public function getShortName(): string; ```php public function getStartLine(): int; ``` - +
        Get the line number of the beginning of the entity code in a file
        Parameters: not specified Return value: int + +
        +
        + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getThrows(): array; +``` + +
        Get parsed throws from `throws` doc block
        + +Parameters: not specified + +Return value: array + + Throws:
        • @@ -1093,18 +1062,18 @@ public function getStartLine(): int;
          ```php // Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity -public function getThrows(): array; +public function getThrowsDocBlockLinks(): array; ``` -
          Get parsed throws from `throws` doc block
          + Parameters: not specified @@ -1125,14 +1094,14 @@ public function getThrows(): array; ```php public function getType(): string; ``` - +
          Get current property type
          Parameters: not specified @@ -1159,7 +1128,7 @@ public function getType(): string; ```php @@ -1168,7 +1137,7 @@ public function getType(): string; public function hasDescriptionLinks(): bool; ``` - +
          Checking if an entity has links in its description
          Parameters: not specified @@ -1189,7 +1158,7 @@ public function hasDescriptionLinks(): bool; ```php @@ -1198,13 +1167,20 @@ public function hasDescriptionLinks(): bool; public function hasExamples(): bool; ``` - +
          Checking if an entity has `example` docBlock
          Parameters: not specified Return value: bool +Throws: + +

          @@ -1212,7 +1188,7 @@ public function hasExamples(): bool; ```php @@ -1221,13 +1197,50 @@ public function hasExamples(): bool; public function hasThrows(): bool; ``` +
          Checking if an entity has `throws` docBlock
          + +Parameters: not specified +Return value: bool + + +Throws: + + +
          +
          +
          + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function isApi(): bool; +``` + +
          Checking if an entity has `api` docBlock
          Parameters: not specified Return value: bool +Throws: + +

          @@ -1235,7 +1248,7 @@ public function hasThrows(): bool; ```php @@ -1244,7 +1257,37 @@ public function hasThrows(): bool; public function isDeprecated(): bool; ``` +
          Checking if an entity has `deprecated` docBlock
          +Parameters: not specified + +Return value: bool + + +Throws: + + +
          +
          +
          + +
            +
          • # + isEntityCacheOutdated + :warning: Is internal | source code
          • +
          + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function isEntityCacheOutdated(): bool; +``` + +
          Checking if the entity cache is out of date
          Parameters: not specified @@ -1258,7 +1301,7 @@ public function isDeprecated(): bool; ```php @@ -1288,7 +1331,7 @@ public function isEntityDataCacheOutdated(): bool; ```php @@ -1297,7 +1340,7 @@ public function isEntityDataCacheOutdated(): bool; public function isEntityFileCanBeLoad(): bool; ``` - +
          Checking if entity data can be retrieved
          Parameters: not specified @@ -1318,14 +1361,14 @@ public function isEntityFileCanBeLoad(): bool; ```php public function isImplementedInParentClass(): bool; ``` - +
          Check if this property is implemented in the parent class
          Parameters: not specified @@ -1339,7 +1382,7 @@ public function isImplementedInParentClass(): bool; ```php @@ -1348,13 +1391,20 @@ public function isImplementedInParentClass(): bool; public function isInternal(): bool; ``` - +
          Checking if an entity has `internal` docBlock
          Parameters: not specified Return value: bool +Throws: + +

          @@ -1362,14 +1412,14 @@ public function isInternal(): bool; ```php public function isPrivate(): bool; ``` - +
          Check if a private is a public private
          Parameters: not specified @@ -1390,14 +1440,14 @@ public function isPrivate(): bool; ```php public function isProtected(): bool; ``` - +
          Check if a protected is a public protected
          Parameters: not specified @@ -1418,14 +1468,14 @@ public function isProtected(): bool; ```php public function isPublic(): bool; ``` - +
          Check if a property is a public property
          Parameters: not specified @@ -1446,7 +1496,7 @@ public function isPublic(): bool; ```php @@ -1455,20 +1505,13 @@ public function isPublic(): bool; public function reloadEntityDependenciesCache(): array; ``` - +
          Update entity dependency cache
          Parameters: not specified Return value: array -Throws: - -

          @@ -1476,7 +1519,7 @@ public function reloadEntityDependenciesCache(): array; ```php @@ -1516,7 +1559,7 @@ public function removeEntityValueFromCache(string $key): void; ```php diff --git a/docs/tech/classes/ReflectionApiConfig.md b/docs/tech/classes/ReflectionApiConfig.md new file mode 100644 index 00000000..0137673b --- /dev/null +++ b/docs/tech/classes/ReflectionApiConfig.md @@ -0,0 +1,218 @@ + + BumbleDocGen / Technical description of the project / Class map / ReflectionApiConfig
          + +

          + ReflectionApiConfig class: +

          + + + + + +```php +namespace BumbleDocGen\Core\Configuration; + +abstract class ReflectionApiConfig +``` + + + + + + + + + +

          Methods:

          + +
            +
          1. + getCacheDir +
          2. +
          3. + getLanguageHandlerClassName +
          4. +
          5. + getProjectRoot +
          6. +
          7. + setCacheDir +
          8. +
          9. + setProjectRoot +
          10. +
          11. + toConfigArray +
          12. +
          + + + + + + + +

          Method details:

          + +
          + + + +```php +public function getCacheDir(): null|string; +``` + + + +Parameters: not specified + +Return value: null | string + + +
          +
          +
          + + + +```php +public function getLanguageHandlerClassName(): string; +``` + + + +Parameters: not specified + +Return value: string + + +
          +
          +
          + + + +```php +public function getProjectRoot(): string; +``` + + + +Parameters: not specified + +Return value: string + + +
          +
          +
          + + + +```php +public function setCacheDir(string|null $cacheDir): void; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
          NameTypeDescription
          $cacheDirstring | null-
          + +Return value: void + + +
          +
          +
          + + + +```php +public function setProjectRoot(string $projectRoot): void; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
          NameTypeDescription
          $projectRootstring-
          + +Return value: void + + +
          +
          +
          + + + +```php +public function toConfigArray(): array; +``` + + + +Parameters: not specified + +Return value: array + + +
          +
          + + \ No newline at end of file diff --git a/docs/tech/classes/RootEntityCollection.md b/docs/tech/classes/RootEntityCollection.md index 2e372463..df557e88 100644 --- a/docs/tech/classes/RootEntityCollection.md +++ b/docs/tech/classes/RootEntityCollection.md @@ -2,7 +2,7 @@ BumbleDocGen / Technical description of the project / Class map / RootEntityCollection

          - RootEntityCollection class: + RootEntityCollection class:

          @@ -50,9 +50,18 @@ abstract class RootEntityCollection extends \BumbleDocGen\Core\Parser\Entity\Bas
        • isEmpty
        • +
        • + loadEntities +
        • +
        • + loadEntitiesByConfiguration +
        • remove
        • +
        • + toArray +
        • updateEntitiesCache
        • @@ -71,7 +80,7 @@ abstract class RootEntityCollection extends \BumbleDocGen\Core\Parser\Entity\Bas ```php @@ -114,7 +123,7 @@ public function findEntity(string $search, bool $useUnsafeKeys = true): null|\Bu ```php @@ -152,7 +161,7 @@ public function get(string $objectName): null|\BumbleDocGen\Core\Parser\Entity\R ```php @@ -173,7 +182,7 @@ public function getEntityCollectionName(): string; ```php @@ -245,7 +254,7 @@ public function getIterator(): \Generator; ```php @@ -285,7 +294,7 @@ public function getLoadedOrCreateNew(string $objectName, bool $withAddClassEntit See:

        @@ -350,6 +359,92 @@ public function isEmpty(): bool; Return value: bool + +
        +
        + + + +```php +public function loadEntities(\BumbleDocGen\Core\Parser\SourceLocator\SourceLocatorsCollection $sourceLocatorsCollection, \BumbleDocGen\Core\Parser\FilterCondition\ConditionInterface|null $filters = null, \BumbleDocGen\Core\Parser\Entity\EntitiesLoaderProgressBarInterface|null $progressBar = null): \BumbleDocGen\Core\Parser\Entity\CollectionLoadEntitiesResult; +``` + + + +Parameters: + + + + + + + + + + + + + + + + + + + + + + + + + + +
        NameTypeDescription
        $sourceLocatorsCollection\BumbleDocGen\Core\Parser\SourceLocator\SourceLocatorsCollection-
        $filters\BumbleDocGen\Core\Parser\FilterCondition\ConditionInterface | null-
        $progressBar\BumbleDocGen\Core\Parser\Entity\EntitiesLoaderProgressBarInterface | null-
        + +Return value: \BumbleDocGen\Core\Parser\Entity\CollectionLoadEntitiesResult + + +
        +
        +
        + + + +```php +public function loadEntitiesByConfiguration(\BumbleDocGen\Core\Parser\Entity\EntitiesLoaderProgressBarInterface|null $progressBar = null): \BumbleDocGen\Core\Parser\Entity\CollectionLoadEntitiesResult; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
        NameTypeDescription
        $progressBar\BumbleDocGen\Core\Parser\Entity\EntitiesLoaderProgressBarInterface | null-
        + +Return value: \BumbleDocGen\Core\Parser\Entity\CollectionLoadEntitiesResult + +

        @@ -390,6 +485,27 @@ public function remove(string $objectName): void; Return value: void +
        +
        +
        + + + +```php +public function toArray(): array; +``` + + + +Parameters: not specified + +Return value: array + +

        @@ -397,7 +513,7 @@ public function remove(string $objectName): void; ```php diff --git a/docs/tech/classes/RootEntityCollectionsGroup.md b/docs/tech/classes/RootEntityCollectionsGroup.md index 865ad29f..c393a043 100644 --- a/docs/tech/classes/RootEntityCollectionsGroup.md +++ b/docs/tech/classes/RootEntityCollectionsGroup.md @@ -2,7 +2,7 @@ BumbleDocGen / Technical description of the project / Class map / RootEntityCollectionsGroup

        - RootEntityCollectionsGroup class: + RootEntityCollectionsGroup class:

        @@ -47,6 +47,9 @@ final class RootEntityCollectionsGroup implements \IteratorAggregate
      • isFoundEntitiesOperationsLogCacheOutdated
      • +
      • + loadByLanguageHandlers +
      • updateAllEntitiesCache
      • @@ -65,7 +68,7 @@ final class RootEntityCollectionsGroup implements \IteratorAggregate ```php @@ -103,7 +106,7 @@ public function add(\BumbleDocGen\Core\Parser\Entity\RootEntityCollection $rootE ```php @@ -124,7 +127,7 @@ public function clearOperationsLog(): void; ```php @@ -162,7 +165,7 @@ public function get(string $collectionName): null|\BumbleDocGen\Core\Parser\Enti ```php @@ -183,7 +186,7 @@ public function getIterator(): \Generator; ```php @@ -204,7 +207,7 @@ public function getOperationsLog(): array; ```php @@ -225,11 +228,11 @@ public function getOperationsLogWithoutDuplicates(): array; ```php -public function isFoundEntitiesOperationsLogCacheOutdated(array $classEntityCollectionOperationsLog): bool; +public function isFoundEntitiesOperationsLogCacheOutdated(array $entitiesCollectionOperationsLog): bool; ``` @@ -246,7 +249,7 @@ public function isFoundEntitiesOperationsLogCacheOutdated(array $classEntityColl - $classEntityCollectionOperationsLog + $entitiesCollectionOperationsLog array - @@ -256,6 +259,49 @@ public function isFoundEntitiesOperationsLogCacheOutdated(array $classEntityColl Return value: bool +
        +
        +
        + + + +```php +public function loadByLanguageHandlers(\BumbleDocGen\LanguageHandler\LanguageHandlersCollection $languageHandlersCollection, \BumbleDocGen\Core\Parser\Entity\EntitiesLoaderProgressBarInterface|null $progressBar = null): \BumbleDocGen\Core\Parser\Entity\CollectionGroupLoadEntitiesResult; +``` + + + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
        NameTypeDescription
        $languageHandlersCollection\BumbleDocGen\LanguageHandler\LanguageHandlersCollection-
        $progressBar\BumbleDocGen\Core\Parser\Entity\EntitiesLoaderProgressBarInterface | null-
        + +Return value: \BumbleDocGen\Core\Parser\Entity\CollectionGroupLoadEntitiesResult + +

        @@ -263,7 +309,7 @@ public function isFoundEntitiesOperationsLogCacheOutdated(array $classEntityColl ```php diff --git a/docs/tech/classes/RootEntityInterface.md b/docs/tech/classes/RootEntityInterface.md index f7e3978e..54e972b8 100644 --- a/docs/tech/classes/RootEntityInterface.md +++ b/docs/tech/classes/RootEntityInterface.md @@ -27,12 +27,6 @@ their entities need to correspond to the same interfaces

        Methods:

          -
        1. - entityCacheIsOutdated -
        2. -
        3. - entityDataCanBeLoaded - - Checking if it is possible to get the entity data
        4. getAbsoluteFileName - Returns the absolute path to a file if it can be retrieved and if the file is in the project directory
        5. @@ -42,24 +36,30 @@ their entities need to correspond to the same interfaces
        6. getFileContent
        7. -
        8. - getFileName - - Returns the relative path to a file if it can be retrieved and if the file is in the project directory
        9. getFileSourceLink
        10. getName -
        11. + - Full name of the entity
        12. getObjectId -
        13. + - Entity object ID +
        14. + getRelativeFileName + - File name relative to project_root configuration parameter
        15. getRootEntityCollection - Get parent collection of entities
        16. getShortName + - Short name of the entity
        17. +
        18. + isEntityCacheOutdated
        19. +
        20. + isEntityDataCanBeLoaded + - Checking if it is possible to get the entity data
        21. isEntityNameValid - Check if entity name is valid
        22. @@ -69,6 +69,9 @@ their entities need to correspond to the same interfaces
        23. isInGit - The entity file is in the git repository
        24. +
        25. + normalizeClassName +
        @@ -81,54 +84,10 @@ their entities need to correspond to the same interfaces
        - - -```php -// Implemented in BumbleDocGen\Core\Parser\Entity\EntityInterface - -public function entityCacheIsOutdated(): bool; -``` - - - -Parameters: not specified - -Return value: bool - - -
        -
        -
        - - - -```php -public function entityDataCanBeLoaded(): bool; -``` - -
        Checking if it is possible to get the entity data
        - -Parameters: not specified - -Return value: bool - - -
        -
        -
        - ```php @@ -151,7 +110,7 @@ public function getAbsoluteFileName(): null|string; ```php @@ -172,7 +131,7 @@ public function getEntityDependencies(): array; ```php @@ -186,29 +145,6 @@ public function getFileContent(): string; Return value: string -
        -
        -
        - - - -```php -// Implemented in BumbleDocGen\Core\Parser\Entity\EntityInterface - -public function getFileName(): null|string; -``` - -
        Returns the relative path to a file if it can be retrieved and if the file is in the project directory
        - -Parameters: not specified - -Return value: null | string - -

        @@ -216,7 +152,7 @@ public function getFileName(): null|string; ```php @@ -254,7 +190,7 @@ public function getFileSourceLink(bool $withLine = true): null|string; ```php @@ -263,7 +199,7 @@ public function getFileSourceLink(bool $withLine = true): null|string; public function getName(): string; ``` - +
        Full name of the entity
        Parameters: not specified @@ -277,7 +213,7 @@ public function getName(): string; ```php @@ -286,7 +222,7 @@ public function getName(): string; public function getObjectId(): string; ``` - +
        Entity object ID
        Parameters: not specified @@ -297,10 +233,39 @@ public function getObjectId(): string;
        + + +```php +// Implemented in BumbleDocGen\Core\Parser\Entity\EntityInterface + +public function getRelativeFileName(): null|string; +``` + +
        File name relative to project_root configuration parameter
        + +Parameters: not specified + +Return value: null | string + + + +See: + +
        +
        +
        + ```php @@ -323,7 +288,7 @@ public function getRootEntityCollection(): \BumbleDocGen\Core\Parser\Entity\Root ```php @@ -332,13 +297,57 @@ public function getRootEntityCollection(): \BumbleDocGen\Core\Parser\Entity\Root public function getShortName(): string; ``` - +
        Short name of the entity
        Parameters: not specified Return value: string +
        +
        +
        + +
          +
        • # + isEntityCacheOutdated + :warning: Is internal | source code
        • +
        + +```php +// Implemented in BumbleDocGen\Core\Parser\Entity\EntityInterface + +public function isEntityCacheOutdated(): bool; +``` + + + +Parameters: not specified + +Return value: bool + + +
        +
        +
        + + + +```php +public function isEntityDataCanBeLoaded(): bool; +``` + +
        Checking if it is possible to get the entity data
        + +Parameters: not specified + +Return value: bool + +

        @@ -346,7 +355,7 @@ public function getShortName(): string; ```php @@ -384,7 +393,7 @@ public static function isEntityNameValid(string $entityName): bool; ```php @@ -405,7 +414,7 @@ public function isExternalLibraryEntity(): bool; ```php @@ -419,6 +428,44 @@ public function isInGit(): bool; Return value: bool +
        +
        +
        + + + +```php +public static function normalizeClassName(string $name): string; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
        NameTypeDescription
        $namestring-
        + +Return value: string + +

        diff --git a/docs/tech/classes/RootEntityInterface_2.md b/docs/tech/classes/RootEntityInterface_2.md index 74733aa1..e5ba8b82 100644 --- a/docs/tech/classes/RootEntityInterface_2.md +++ b/docs/tech/classes/RootEntityInterface_2.md @@ -27,12 +27,6 @@ their entities need to correspond to the same interfaces

        Methods:

          -
        1. - entityCacheIsOutdated -
        2. -
        3. - entityDataCanBeLoaded - - Checking if it is possible to get the entity data
        4. getAbsoluteFileName - Returns the absolute path to a file if it can be retrieved and if the file is in the project directory
        5. @@ -42,24 +36,30 @@ their entities need to correspond to the same interfaces
        6. getFileContent
        7. -
        8. - getFileName - - Returns the relative path to a file if it can be retrieved and if the file is in the project directory
        9. getFileSourceLink
        10. getName -
        11. + - Full name of the entity
        12. getObjectId -
        13. + - Entity object ID +
        14. + getRelativeFileName + - File name relative to project_root configuration parameter
        15. getRootEntityCollection - Get parent collection of entities
        16. getShortName + - Short name of the entity
        17. +
        18. + isEntityCacheOutdated
        19. +
        20. + isEntityDataCanBeLoaded + - Checking if it is possible to get the entity data
        21. isEntityNameValid - Check if entity name is valid
        22. @@ -69,6 +69,9 @@ their entities need to correspond to the same interfaces
        23. isInGit - The entity file is in the git repository
        24. +
        25. + normalizeClassName +
        @@ -81,54 +84,10 @@ their entities need to correspond to the same interfaces
        - - -```php -// Implemented in BumbleDocGen\Core\Parser\Entity\EntityInterface - -public function entityCacheIsOutdated(): bool; -``` - - - -Parameters: not specified - -Return value: bool - - -
        -
        -
        - - - -```php -public function entityDataCanBeLoaded(): bool; -``` - -
        Checking if it is possible to get the entity data
        - -Parameters: not specified - -Return value: bool - - -
        -
        -
        - ```php @@ -151,7 +110,7 @@ public function getAbsoluteFileName(): null|string; ```php @@ -172,7 +131,7 @@ public function getEntityDependencies(): array; ```php @@ -186,29 +145,6 @@ public function getFileContent(): string; Return value: string -
        -
        -
        - - - -```php -// Implemented in BumbleDocGen\Core\Parser\Entity\EntityInterface - -public function getFileName(): null|string; -``` - -
        Returns the relative path to a file if it can be retrieved and if the file is in the project directory
        - -Parameters: not specified - -Return value: null | string - -

        @@ -216,7 +152,7 @@ public function getFileName(): null|string; ```php @@ -254,7 +190,7 @@ public function getFileSourceLink(bool $withLine = true): null|string; ```php @@ -263,7 +199,7 @@ public function getFileSourceLink(bool $withLine = true): null|string; public function getName(): string; ``` - +
        Full name of the entity
        Parameters: not specified @@ -277,7 +213,7 @@ public function getName(): string; ```php @@ -286,7 +222,7 @@ public function getName(): string; public function getObjectId(): string; ``` - +
        Entity object ID
        Parameters: not specified @@ -297,10 +233,39 @@ public function getObjectId(): string;
        + + +```php +// Implemented in BumbleDocGen\Core\Parser\Entity\EntityInterface + +public function getRelativeFileName(): null|string; +``` + +
        File name relative to project_root configuration parameter
        + +Parameters: not specified + +Return value: null | string + + + +See: + +
        +
        +
        + ```php @@ -323,7 +288,7 @@ public function getRootEntityCollection(): \BumbleDocGen\Core\Parser\Entity\Root ```php @@ -332,13 +297,57 @@ public function getRootEntityCollection(): \BumbleDocGen\Core\Parser\Entity\Root public function getShortName(): string; ``` - +
        Short name of the entity
        Parameters: not specified Return value: string +
        +
        +
        + +
          +
        • # + isEntityCacheOutdated + :warning: Is internal | source code
        • +
        + +```php +// Implemented in BumbleDocGen\Core\Parser\Entity\EntityInterface + +public function isEntityCacheOutdated(): bool; +``` + + + +Parameters: not specified + +Return value: bool + + +
        +
        +
        + + + +```php +public function isEntityDataCanBeLoaded(): bool; +``` + +
        Checking if it is possible to get the entity data
        + +Parameters: not specified + +Return value: bool + +

        @@ -346,7 +355,7 @@ public function getShortName(): string; ```php @@ -384,7 +393,7 @@ public static function isEntityNameValid(string $entityName): bool; ```php @@ -405,7 +414,7 @@ public function isExternalLibraryEntity(): bool; ```php @@ -419,6 +428,44 @@ public function isInGit(): bool; Return value: bool +
        +
        +
        + + + +```php +public static function normalizeClassName(string $name): string; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
        NameTypeDescription
        $namestring-
        + +Return value: string + +

        diff --git a/docs/tech/classes/StubberPlugin.md b/docs/tech/classes/StubberPlugin.md index e89d8660..af09eca5 100644 --- a/docs/tech/classes/StubberPlugin.md +++ b/docs/tech/classes/StubberPlugin.md @@ -37,7 +37,7 @@ final class StubberPlugin implements \BumbleDocGen\Core\Plugin\PluginInterface, getSubscribedEvents
      • - onCheckIsClassEntityCanBeLoad + onCheckIsEntityCanBeLoaded
      • onGettingResourceLink @@ -113,13 +113,13 @@ public static function getSubscribedEvents(): array;
          -
        • # - onCheckIsClassEntityCanBeLoad +
        • # + onCheckIsEntityCanBeLoaded | source code
        ```php -public function onCheckIsClassEntityCanBeLoad(\BumbleDocGen\LanguageHandler\Php\Plugin\Event\Entity\OnCheckIsClassEntityCanBeLoad $event): void; +public function onCheckIsEntityCanBeLoaded(\BumbleDocGen\LanguageHandler\Php\Plugin\Event\Entity\OnCheckIsEntityCanBeLoaded $event): void; ``` @@ -137,7 +137,7 @@ public function onCheckIsClassEntityCanBeLoad(\BumbleDocGen\LanguageHandler\Php\ $event - \BumbleDocGen\LanguageHandler\Php\Plugin\Event\Entity\OnCheckIsClassEntityCanBeLoad + \BumbleDocGen\LanguageHandler\Php\Plugin\Event\Entity\OnCheckIsEntityCanBeLoaded - diff --git a/docs/tech/classes/StylizedProgressBar.md b/docs/tech/classes/StylizedProgressBar.md index d83e024d..e39a2a6e 100644 --- a/docs/tech/classes/StylizedProgressBar.md +++ b/docs/tech/classes/StylizedProgressBar.md @@ -2,7 +2,7 @@ BumbleDocGen / Technical description of the project / Class map / StylizedProgressBar

        - StylizedProgressBar class: + StylizedProgressBar class:

        @@ -12,7 +12,7 @@ ```php namespace BumbleDocGen\Console\ProgressBar; -final class StylizedProgressBar +final class StylizedProgressBar implements \BumbleDocGen\Core\Parser\Entity\EntitiesLoaderProgressBarInterface ``` @@ -69,7 +69,7 @@ final class StylizedProgressBar ```php @@ -106,7 +106,7 @@ public function __construct(\Symfony\Component\Console\Style\OutputStyle $io); ```php @@ -144,7 +144,7 @@ public function advance(int $step): void; ```php @@ -165,7 +165,7 @@ public function finish(): void; ```php @@ -208,7 +208,7 @@ public function iterate(iterable $iterable, int|null $max = null): \Generator; ```php @@ -246,7 +246,7 @@ public function setMaxSteps(int $maxSteps): void; ```php @@ -284,7 +284,7 @@ public function setName(string $name): void; ```php @@ -322,7 +322,7 @@ public function setStepDescription(string $stepDescription): void; ```php diff --git a/docs/tech/classes/TraitEntity.md b/docs/tech/classes/TraitEntity.md new file mode 100644 index 00000000..3b1e7fd6 --- /dev/null +++ b/docs/tech/classes/TraitEntity.md @@ -0,0 +1,3441 @@ + + BumbleDocGen / Technical description of the project / Class map / TraitEntity
        + +

        + TraitEntity class: +

        + + + + + +```php +namespace BumbleDocGen\LanguageHandler\Php\Parser\Entity; + +class TraitEntity extends \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity implements \BumbleDocGen\Core\Renderer\Context\DocumentTransformableEntityInterface, \BumbleDocGen\Core\Parser\Entity\RootEntityInterface, \BumbleDocGen\Core\Parser\Entity\EntityInterface, \BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityInterface +``` + +
        Trait
        + +See: + + + + + + + +

        Initialization methods:

        + +
          +
        1. + __construct +
        2. +
        + +

        Methods:

        + +
          +
        1. + addPluginData + - Add information to aт entity object
        2. +
        3. + cursorToDocAttributeLinkFragment +
        4. +
        5. + getAbsoluteFileName + - Returns the absolute path to a file if it can be retrieved and if the file is in the project directory
        6. +
        7. + getAst + - Get AST for this entity
        8. +
        9. + getCacheKey +
        10. +
        11. + getCachedEntityDependencies +
        12. +
        13. + getConstant + - Get the method entity by its name
        14. +
        15. + getConstantEntitiesCollection + - Get a collection of constant entities
        16. +
        17. + getConstantValue + - Get the compiled value of a constant
        18. +
        19. + getConstants + - Get all constants that are available according to the configuration as an array
        20. +
        21. + getConstantsData + - Get a list of all constants and classes where they are implemented
        22. +
        23. + getConstantsValues + - Get class constant compiled values according to filters
        24. +
        25. + getCurrentRootEntity +
        26. +
        27. + getDescription + - Get entity description
        28. +
        29. + getDescriptionLinks + - Get parsed links from description and doc blocks `see` and `link`
        30. +
        31. + getDocBlock + - Get DocBlock for current entity
        32. +
        33. + getDocComment + - Get the doc comment of an entity
        34. +
        35. + getDocCommentEntity + - Link to an entity where docBlock is implemented for this entity
        36. +
        37. + getDocCommentLine + - Get the code line number where the docBlock of the current entity begins
        38. +
        39. + getDocNote + - Get the note annotation value
        40. +
        41. + getDocRender +
        42. +
        43. + getEndLine + - Get the line number of the end of a class code in a file
        44. +
        45. + getEntityDependencies +
        46. +
        47. + getExamples + - Get parsed examples from `examples` doc block
        48. +
        49. + getFileContent +
        50. +
        51. + getFileSourceLink +
        52. +
        53. + getFirstExample + - Get first example from `examples` doc block
        54. +
        55. + getImplementingClass + - Get the class like entity in which the current entity was implemented
        56. +
        57. + getInterfaceNames + - Get a list of class interface names
        58. +
        59. + getInterfacesEntities + - Get a list of interface entities that the current class implements
        60. +
        61. + getMethod + - Get the method entity by its name
        62. +
        63. + getMethodEntitiesCollection + - Get a collection of method entities
        64. +
        65. + getMethods + - Get all methods that are available according to the configuration as an array
        66. +
        67. + getMethodsData + - Get a list of all methods and classes where they are implemented
        68. +
        69. + getModifiersString + - Get entity modifiers as a string
        70. +
        71. + getName + - Full name of the entity
        72. +
        73. + getNamespaceName + - Get the entity namespace name
        74. +
        75. + getObjectId + - Get entity unique ID
        76. +
        77. + getParentClass + - Get the entity of the parent class if it exists
        78. +
        79. + getParentClassEntities + - Get a list of parent class entities
        80. +
        81. + getParentClassName + - Get the name of the parent class entity if it exists
        82. +
        83. + getParentClassNames + - Get a list of entity names of parent classes
        84. +
        85. + getPluginData + - Get additional information added using the plugin
        86. +
        87. + getProperties + - Get all properties that are available according to the configuration as an array
        88. +
        89. + getPropertiesData + - Get a list of all properties and classes where they are implemented
        90. +
        91. + getProperty + - Get the property entity by its name
        92. +
        93. + getPropertyDefaultValue + - Get the compiled value of a property
        94. +
        95. + getPropertyEntitiesCollection + - Get a collection of property entities
        96. +
        97. + getRelativeFileName + - File name relative to project_root configuration parameter
        98. +
        99. + getRootEntityCollection + - Get the collection of root entities to which this entity belongs
        100. +
        101. + getShortName + - Short name of the entity
        102. +
        103. + getStartLine + - Get the line number of the start of a class code in a file
        104. +
        105. + getThrows + - Get parsed throws from `throws` doc block
        106. +
        107. + getThrowsDocBlockLinks +
        108. +
        109. + getTraits + - Get a list of trait entities of the current class
        110. +
        111. + getTraitsNames + - Get a list of class traits names
        112. +
        113. + hasConstant + - Check if a constant exists in a class
        114. +
        115. + hasDescriptionLinks + - Checking if an entity has links in its description
        116. +
        117. + hasExamples + - Checking if an entity has `example` docBlock
        118. +
        119. + hasMethod + - Check if a method exists in a class
        120. +
        121. + hasParentClass + - Check if a certain parent class exists in a chain of parent classes
        122. +
        123. + hasProperty + - Check if a property exists in a class
        124. +
        125. + hasThrows + - Checking if an entity has `throws` docBlock
        126. +
        127. + hasTraits + - Check if the class contains traits
        128. +
        129. + implementsInterface + - Check if a class implements an interface
        130. +
        131. + isAbstract + - Check that an entity is abstract
        132. +
        133. + isApi + - Checking if an entity has `api` docBlock
        134. +
        135. + isClass + - Check if an entity is a Class
        136. +
        137. + isClassLoad +
        138. +
        139. + isDeprecated + - Checking if an entity has `deprecated` docBlock
        140. +
        141. + isDocumentCreationAllowed +
        142. +
        143. + isEntityCacheOutdated + - Checking if the entity cache is out of date
        144. +
        145. + isEntityDataCacheOutdated +
        146. +
        147. + isEntityDataCanBeLoaded +
        148. +
        149. + isEntityFileCanBeLoad + - Checking if entity data can be retrieved
        150. +
        151. + isEntityNameValid + - Check if the name is a valid name for ClassLikeEntity
        152. +
        153. + isEnum + - Check if an entity is an Enum
        154. +
        155. + isExternalLibraryEntity + - Check if a given entity is an entity from a third party library (connected via composer)
        156. +
        157. + isInGit + - Checking if class file is in git repository
        158. +
        159. + isInstantiable + - Check that an entity is instantiable
        160. +
        161. + isInterface + - Check if an entity is an Interface
        162. +
        163. + isInternal + - Checking if an entity has `internal` docBlock
        164. +
        165. + isSubclassOf + - Whether the given class is a subclass of the specified class
        166. +
        167. + isTrait + - Check if an entity is a Trait
        168. +
        169. + normalizeClassName +
        170. +
        171. + reloadEntityDependenciesCache + - Update entity dependency cache
        172. +
        173. + removeEntityValueFromCache +
        174. +
        175. + removeNotUsedEntityDataCache +
        176. +
        177. + setCustomAst +
        178. +
        + + + + + + + +

        Method details:

        + +
        + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function __construct(\BumbleDocGen\Core\Configuration\Configuration $configuration, \BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings $phpHandlerSettings, \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection $entitiesCollection, \BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper $parserHelper, \BumbleDocGen\LanguageHandler\Php\Parser\ComposerHelper $composerHelper, \BumbleDocGen\LanguageHandler\Php\Parser\PhpParser\PhpParserHelper $phpParserHelper, \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache $localObjectCache, \Psr\Log\LoggerInterface $logger, string $className, string|null $relativeFileName); +``` + + + +Parameters: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        NameTypeDescription
        $configuration\BumbleDocGen\Core\Configuration\Configuration-
        $phpHandlerSettings\BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings-
        $entitiesCollection\BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection-
        $parserHelper\BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper-
        $composerHelper\BumbleDocGen\LanguageHandler\Php\Parser\ComposerHelper-
        $phpParserHelper\BumbleDocGen\LanguageHandler\Php\Parser\PhpParser\PhpParserHelper-
        $localObjectCache\BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache-
        $logger\Psr\Log\LoggerInterface-
        $classNamestring-
        $relativeFileNamestring | null-
        + + + +
        +
        +
        + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function addPluginData(string $pluginKey, mixed $data): void; +``` + +
        Add information to aт entity object
        + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
        NameTypeDescription
        $pluginKeystring-
        $datamixed-
        + +Return value: void + + +
        +
        +
        + +
          +
        • # + cursorToDocAttributeLinkFragment + :warning: Is internal | source code
        • +
        + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function cursorToDocAttributeLinkFragment(string $cursor, bool $isForDocument = true): string; +``` + + + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
        NameTypeDescription
        $cursorstring-
        $isForDocumentbool-
        + +Return value: string + + +Throws: + + +
        +
        +
        + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getAbsoluteFileName(): null|string; +``` + +
        Returns the absolute path to a file if it can be retrieved and if the file is in the project directory
        + +Parameters: not specified + +Return value: null | string + + +Throws: + + +
        +
        +
        + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getAst(): \PhpParser\Node\Stmt\Class_|\PhpParser\Node\Stmt\Interface_|\PhpParser\Node\Stmt\Trait_|\PhpParser\Node\Stmt\Enum_; +``` + +
        Get AST for this entity
        + +Parameters: not specified + +Return value: \PhpParser\Node\Stmt\Class_ | \PhpParser\Node\Stmt\Interface_ | \PhpParser\Node\Stmt\Trait_ | \PhpParser\Node\Stmt\Enum_ + + +Throws: + + +
        +
        +
        + + + +```php +// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait + +public function getCacheKey(): string; +``` + + + +Parameters: not specified + +Return value: string + + +
        +
        +
        + +
          +
        • # + getCachedEntityDependencies + :warning: Is internal | source code
        • +
        + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getCachedEntityDependencies(): array; +``` + + + +Parameters: not specified + +Return value: array + + +Throws: + + +
        +
        +
        + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getConstant(string $constantName, bool $unsafe = false): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity; +``` + +
        Get the method entity by its name
        + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
        NameTypeDescription
        $constantNamestringThe name of the constant whose entity you want to get
        $unsafeboolCheck all constants, not just the constants allowed in the configuration (@see PhpHandlerSettings::getClassConstantEntityFilter())
        + +Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity + + +Throws: + + +
        +
        +
        + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getConstantEntitiesCollection(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntitiesCollection; +``` + +
        Get a collection of constant entities
        + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntitiesCollection + + +Throws: + + + +See: + +
        +
        +
        + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getConstantValue(string $constantName): string|array|int|bool|null|float; +``` + +
        Get the compiled value of a constant
        + +Parameters: + + + + + + + + + + + + + + + + +
        NameTypeDescription
        $constantNamestringThe name of the constant for which you need to get the value
        + +Return value: string | array | int | bool | null | float + + +Throws: + + +
        +
        +
        + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getConstants(): array; +``` + +
        Get all constants that are available according to the configuration as an array
        + +Parameters: not specified + +Return value: array + + +Throws: + + + +See: + +
        +
        +
        + +
          +
        • # + getConstantsData + :warning: Is internal | source code
        • +
        + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getConstantsData(bool $onlyFromCurrentClassAndTraits = false, int $flags = \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity::VISIBILITY_MODIFIERS_FLAG_ANY): array; +``` + +
        Get a list of all constants and classes where they are implemented
        + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
        NameTypeDescription
        $onlyFromCurrentClassAndTraitsboolGet data only for constants from the current class
        $flagsintGet data only for constants corresponding to the visibility modifiers passed in this value
        + +Return value: array + + +Throws: + + +
        +
        +
        + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getConstantsValues(bool $onlyFromCurrentClassAndTraits = false, int $flags = \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity::VISIBILITY_MODIFIERS_FLAG_ANY): array; +``` + +
        Get class constant compiled values according to filters
        + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
        NameTypeDescription
        $onlyFromCurrentClassAndTraitsboolGet values only for constants from the current class
        $flagsintGet values only for constants corresponding to the visibility modifiers passed in this value
        + +Return value: array + + +Throws: + + +
        +
        +
        + +
          +
        • # + getCurrentRootEntity + :warning: Is internal | source code
        • +
        + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getCurrentRootEntity(): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; +``` + + + +Parameters: not specified + +Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + + +
        +
        +
        + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDescription(): string; +``` + +
        Get entity description
        + +Parameters: not specified + +Return value: string + + +Throws: + + +
        +
        +
        + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDescriptionLinks(): array; +``` + +
        Get parsed links from description and doc blocks `see` and `link`
        + +Parameters: not specified + +Return value: array + + +Throws: + + +
        +
        +
        + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDocBlock(): \phpDocumentor\Reflection\DocBlock; +``` + +
        Get DocBlock for current entity
        + +Parameters: not specified + +Return value: \phpDocumentor\Reflection\DocBlock + + +Throws: + + +
        +
        +
        + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDocComment(): string; +``` + +
        Get the doc comment of an entity
        + +Parameters: not specified + +Return value: string + + +Throws: + + +
        +
        +
        + +
          +
        • # + getDocCommentEntity + :warning: Is internal | source code
        • +
        + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getDocCommentEntity(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; +``` + +
        Link to an entity where docBlock is implemented for this entity
        + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + + +
        +
        +
        + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDocCommentLine(): null|int; +``` + +
        Get the code line number where the docBlock of the current entity begins
        + +Parameters: not specified + +Return value: null | int + + +Throws: + + +
        +
        +
        + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getDocNote(): string; +``` + +
        Get the note annotation value
        + +Parameters: not specified + +Return value: string + + +Throws: + + +
        +
        +
        + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getDocRender(): \BumbleDocGen\Core\Renderer\EntityDocRenderer\EntityDocRendererInterface; +``` + + + +Parameters: not specified + +Return value: \BumbleDocGen\Core\Renderer\EntityDocRenderer\EntityDocRendererInterface + + +Throws: + + +
        +
        +
        + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getEndLine(): int; +``` + +
        Get the line number of the end of a class code in a file
        + +Parameters: not specified + +Return value: int + + +Throws: + + +
        +
        +
        + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getEntityDependencies(): array; +``` + + + +Parameters: not specified + +Return value: array + + +
        +
        +
        + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getExamples(): array; +``` + +
        Get parsed examples from `examples` doc block
        + +Parameters: not specified + +Return value: array + + +Throws: + + +
        +
        +
        + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getFileContent(): string; +``` + + + +Parameters: not specified + +Return value: string + + +Throws: + + +
        +
        +
        + +
          +
        • # + getFileSourceLink + :warning: Is internal | source code
        • +
        + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getFileSourceLink(bool $withLine = true): null|string; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
        NameTypeDescription
        $withLinebool-
        + +Return value: null | string + + +Throws: + + +
        +
        +
        + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getFirstExample(): string; +``` + +
        Get first example from `examples` doc block
        + +Parameters: not specified + +Return value: string + + +Throws: + + +
        +
        +
        + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getImplementingClass(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; +``` + +
        Get the class like entity in which the current entity was implemented
        + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + + +
        +
        +
        + + + +```php +public function getInterfaceNames(): array; +``` + +
        Get a list of class interface names
        + +Parameters: not specified + +Return value: array + + +Throws: + + +
        +
        +
        + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getInterfacesEntities(): array; +``` + +
        Get a list of interface entities that the current class implements
        + +Parameters: not specified + +Return value: array + + +Throws: + + +
        +
        +
        + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getMethod(string $methodName, bool $unsafe = false): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntity; +``` + +
        Get the method entity by its name
        + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
        NameTypeDescription
        $methodNamestringThe name of the method whose entity you want to get
        $unsafeboolCheck all methods, not just the methods allowed in the configuration (@see PhpHandlerSettings::getMethodEntityFilter())
        + +Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntity + + +Throws: + + +
        +
        +
        + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getMethodEntitiesCollection(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntitiesCollection; +``` + +
        Get a collection of method entities
        + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntitiesCollection + + +Throws: + + + +See: + +
        +
        +
        + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getMethods(): array; +``` + +
        Get all methods that are available according to the configuration as an array
        + +Parameters: not specified + +Return value: array + + +Throws: + + + +See: + +
        +
        +
        + +
          +
        • # + getMethodsData + :warning: Is internal | source code
        • +
        + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getMethodsData(bool $onlyFromCurrentClassAndTraits = false, int $flags = \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntity::VISIBILITY_MODIFIERS_FLAG_ANY): array; +``` + +
        Get a list of all methods and classes where they are implemented
        + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
        NameTypeDescription
        $onlyFromCurrentClassAndTraitsboolGet data only for methods from the current class
        $flagsintGet data only for methods corresponding to the visibility modifiers passed in this value
        + +Return value: array + + +Throws: + + +
        +
        +
        + + + +```php +public function getModifiersString(): string; +``` + +
        Get entity modifiers as a string
        + +Parameters: not specified + +Return value: string + + +
        +
        +
        + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getName(): string; +``` + +
        Full name of the entity
        + +Parameters: not specified + +Return value: string + + +
        +
        +
        + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getNamespaceName(): string; +``` + +
        Get the entity namespace name
        + +Parameters: not specified + +Return value: string + + +
        +
        +
        + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getObjectId(): string; +``` + +
        Get entity unique ID
        + +Parameters: not specified + +Return value: string + + +
        +
        +
        + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getParentClass(): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; +``` + +
        Get the entity of the parent class if it exists
        + +Parameters: not specified + +Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + + +
        +
        +
        + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getParentClassEntities(): array; +``` + +
        Get a list of parent class entities
        + +Parameters: not specified + +Return value: array + + +
        +
        +
        + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getParentClassName(): null|string; +``` + +
        Get the name of the parent class entity if it exists
        + +Parameters: not specified + +Return value: null | string + + +
        +
        +
        + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getParentClassNames(): array; +``` + +
        Get a list of entity names of parent classes
        + +Parameters: not specified + +Return value: array + + +
        +
        +
        + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getPluginData(string $pluginKey): mixed; +``` + +
        Get additional information added using the plugin
        + +Parameters: + + + + + + + + + + + + + + + + +
        NameTypeDescription
        $pluginKeystring-
        + +Return value: mixed + + +
        +
        +
        + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getProperties(): array; +``` + +
        Get all properties that are available according to the configuration as an array
        + +Parameters: not specified + +Return value: array + + +Throws: + + + +See: + +
        +
        +
        + +
          +
        • # + getPropertiesData + :warning: Is internal | source code
        • +
        + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getPropertiesData(bool $onlyFromCurrentClassAndTraits = false, int $flags = \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntity::VISIBILITY_MODIFIERS_FLAG_ANY): array; +``` + +
        Get a list of all properties and classes where they are implemented
        + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
        NameTypeDescription
        $onlyFromCurrentClassAndTraitsboolGet data only for properties from the current class
        $flagsintGet data only for properties corresponding to the visibility modifiers passed in this value
        + +Return value: array + + +Throws: + + +
        +
        +
        + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getProperty(string $propertyName, bool $unsafe = false): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntity; +``` + +
        Get the property entity by its name
        + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
        NameTypeDescription
        $propertyNamestringThe name of the property whose entity you want to get
        $unsafeboolCheck all properties, not just the properties allowed in the configuration (@see PhpHandlerSettings::getPropertyEntityFilter())
        + +Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntity + + +Throws: + + +
        +
        +
        + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getPropertyDefaultValue(string $propertyName): string|array|int|bool|null|float; +``` + +
        Get the compiled value of a property
        + +Parameters: + + + + + + + + + + + + + + + + +
        NameTypeDescription
        $propertyNamestringThe name of the property for which you need to get the value
        + +Return value: string | array | int | bool | null | float + + +Throws: + + +
        +
        +
        + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getPropertyEntitiesCollection(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntitiesCollection; +``` + +
        Get a collection of property entities
        + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntitiesCollection + + +Throws: + + + +See: + +
        +
        +
        + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getRelativeFileName(): null|string; +``` + +
        File name relative to project_root configuration parameter
        + +Parameters: not specified + +Return value: null | string + + + +See: + +
        +
        +
        + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getRootEntityCollection(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; +``` + +
        Get the collection of root entities to which this entity belongs
        + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection + + +
        +
        +
        + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getShortName(): string; +``` + +
        Short name of the entity
        + +Parameters: not specified + +Return value: string + + +
        +
        +
        + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getStartLine(): int; +``` + +
        Get the line number of the start of a class code in a file
        + +Parameters: not specified + +Return value: int + + +Throws: + + +
        +
        +
        + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getThrows(): array; +``` + +
        Get parsed throws from `throws` doc block
        + +Parameters: not specified + +Return value: array + + +Throws: + + +
        +
        +
        + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function getThrowsDocBlockLinks(): array; +``` + + + +Parameters: not specified + +Return value: array + + +Throws: + + +
        +
        +
        + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getTraits(): array; +``` + +
        Get a list of trait entities of the current class
        + +Parameters: not specified + +Return value: array + + +Throws: + + +
        +
        +
        + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function getTraitsNames(): array; +``` + +
        Get a list of class traits names
        + +Parameters: not specified + +Return value: array + + +Throws: + + +
        +
        +
        + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function hasConstant(string $constantName, bool $unsafe = false): bool; +``` + +
        Check if a constant exists in a class
        + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
        NameTypeDescription
        $constantNamestringThe name of the class whose entity you want to check
        $unsafeboolCheck all constants, not just the constants allowed in the configuration (@see PhpHandlerSettings::getClassConstantEntityFilter())
        + +Return value: bool + + +Throws: + + +
        +
        +
        + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function hasDescriptionLinks(): bool; +``` + +
        Checking if an entity has links in its description
        + +Parameters: not specified + +Return value: bool + + +Throws: + + +
        +
        +
        + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function hasExamples(): bool; +``` + +
        Checking if an entity has `example` docBlock
        + +Parameters: not specified + +Return value: bool + + +Throws: + + +
        +
        +
        + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function hasMethod(string $methodName, bool $unsafe = false): bool; +``` + +
        Check if a method exists in a class
        + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
        NameTypeDescription
        $methodNamestringThe name of the method whose entity you want to check
        $unsafeboolCheck all methods, not just the methods allowed in the configuration (@see PhpHandlerSettings::getMethodEntityFilter())
        + +Return value: bool + + +Throws: + + +
        +
        +
        + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function hasParentClass(string $parentClassName): bool; +``` + +
        Check if a certain parent class exists in a chain of parent classes
        + +Parameters: + + + + + + + + + + + + + + + + +
        NameTypeDescription
        $parentClassNamestringSearched parent class
        + +Return value: bool + + +
        +
        +
        + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function hasProperty(string $propertyName, bool $unsafe = false): bool; +``` + +
        Check if a property exists in a class
        + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
        NameTypeDescription
        $propertyNamestringThe name of the property whose entity you want to check
        $unsafeboolCheck all properties, not just the properties allowed in the configuration (@see PhpHandlerSettings::getPropertyEntityFilter())
        + +Return value: bool + + +Throws: + + +
        +
        +
        + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function hasThrows(): bool; +``` + +
        Checking if an entity has `throws` docBlock
        + +Parameters: not specified + +Return value: bool + + +Throws: + + +
        +
        +
        + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function hasTraits(): bool; +``` + +
        Check if the class contains traits
        + +Parameters: not specified + +Return value: bool + + +Throws: + + +
        +
        +
        + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function implementsInterface(string $interfaceName): bool; +``` + +
        Check if a class implements an interface
        + +Parameters: + + + + + + + + + + + + + + + + +
        NameTypeDescription
        $interfaceNamestringName of the required interface in the interface chain
        + +Return value: bool + + +Throws: + + +
        +
        +
        + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function isAbstract(): bool; +``` + +
        Check that an entity is abstract
        + +Parameters: not specified + +Return value: bool + + +
        +
        +
        + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function isApi(): bool; +``` + +
        Checking if an entity has `api` docBlock
        + +Parameters: not specified + +Return value: bool + + +Throws: + + +
        +
        +
        + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function isClass(): bool; +``` + +
        Check if an entity is a Class
        + +Parameters: not specified + +Return value: bool + + +
        +
        +
        + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function isClassLoad(): bool; +``` + + + +Parameters: not specified + +Return value: bool + + +
        +
        +
        + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function isDeprecated(): bool; +``` + +
        Checking if an entity has `deprecated` docBlock
        + +Parameters: not specified + +Return value: bool + + +Throws: + + +
        +
        +
        + +
          +
        • # + isDocumentCreationAllowed + :warning: Is internal | source code
        • +
        + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function isDocumentCreationAllowed(): bool; +``` + + + +Parameters: not specified + +Return value: bool + + +Throws: + + +
        +
        +
        + +
          +
        • # + isEntityCacheOutdated + :warning: Is internal | source code
        • +
        + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function isEntityCacheOutdated(): bool; +``` + +
        Checking if the entity cache is out of date
        + +Parameters: not specified + +Return value: bool + + +
        +
        +
        + +
          +
        • # + isEntityDataCacheOutdated + :warning: Is internal | source code
        • +
        + +```php +// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait + +public function isEntityDataCacheOutdated(): bool; +``` + + + +Parameters: not specified + +Return value: bool + + +Throws: + + +
        +
        +
        + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function isEntityDataCanBeLoaded(): bool; +``` + + + +Parameters: not specified + +Return value: bool + + +Throws: + + +
        +
        +
        + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function isEntityFileCanBeLoad(): bool; +``` + +
        Checking if entity data can be retrieved
        + +Parameters: not specified + +Return value: bool + + +Throws: + + +
        +
        +
        + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public static function isEntityNameValid(string $entityName): bool; +``` + +
        Check if the name is a valid name for ClassLikeEntity
        + +Parameters: + + + + + + + + + + + + + + + + +
        NameTypeDescription
        $entityNamestring-
        + +Return value: bool + + +
        +
        +
        + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function isEnum(): bool; +``` + +
        Check if an entity is an Enum
        + +Parameters: not specified + +Return value: bool + + +
        +
        +
        + +
          +
        • # + isExternalLibraryEntity + :warning: Is internal | source code
        • +
        + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function isExternalLibraryEntity(): bool; +``` + +
        Check if a given entity is an entity from a third party library (connected via composer)
        + +Parameters: not specified + +Return value: bool + + +
        +
        +
        + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function isInGit(): bool; +``` + +
        Checking if class file is in git repository
        + +Parameters: not specified + +Return value: bool + + +
        +
        +
        + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function isInstantiable(): bool; +``` + +
        Check that an entity is instantiable
        + +Parameters: not specified + +Return value: bool + + +
        +
        +
        + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function isInterface(): bool; +``` + +
        Check if an entity is an Interface
        + +Parameters: not specified + +Return value: bool + + +
        +
        +
        + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function isInternal(): bool; +``` + +
        Checking if an entity has `internal` docBlock
        + +Parameters: not specified + +Return value: bool + + +Throws: + + +
        +
        +
        + + + +```php +public function isSubclassOf(string $className): bool; +``` + +
        Whether the given class is a subclass of the specified class
        + +Parameters: + + + + + + + + + + + + + + + + +
        NameTypeDescription
        $classNamestring-
        + +Return value: bool + + +Throws: + + +
        +
        +
        + + + +```php +public function isTrait(): bool; +``` + +
        Check if an entity is a Trait
        + +Parameters: not specified + +Return value: bool + + +
        +
        +
        + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public static function normalizeClassName(string $name): string; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
        NameTypeDescription
        $namestring-
        + +Return value: string + + +
        +
        +
        + +
          +
        • # + reloadEntityDependenciesCache + :warning: Is internal | source code
        • +
        + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity + +public function reloadEntityDependenciesCache(): array; +``` + +
        Update entity dependency cache
        + +Parameters: not specified + +Return value: array + + +
        +
        +
        + +
          +
        • # + removeEntityValueFromCache + :warning: Is internal | source code
        • +
        + +```php +// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait + +public function removeEntityValueFromCache(string $key): void; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
        NameTypeDescription
        $keystring-
        + +Return value: void + + +
        +
        +
        + +
          +
        • # + removeNotUsedEntityDataCache + :warning: Is internal | source code
        • +
        + +```php +// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait + +public function removeNotUsedEntityDataCache(): void; +``` + + + +Parameters: not specified + +Return value: void + + +Throws: + + +
        +
        +
        + + + +```php +// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + +public function setCustomAst(\PhpParser\Node\Stmt\Trait_|\PhpParser\Node\Stmt\Enum_|\PhpParser\Node\Stmt\Interface_|\PhpParser\Node\Stmt\Class_|null $customAst): void; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
        NameTypeDescription
        $customAst\PhpParser\Node\Stmt\Trait_ | \PhpParser\Node\Stmt\Enum_ | \PhpParser\Node\Stmt\Interface_ | \PhpParser\Node\Stmt\Class_ | null-
        + +Return value: void + + +
        +
        + + \ No newline at end of file diff --git a/docs/tech/map.md b/docs/tech/map.md index f593a2d2..0a407d0f 100644 --- a/docs/tech/map.md +++ b/docs/tech/map.md @@ -46,7 +46,8 @@ Directory layout ( only documented files shown ): │ │ │ │ ├── ValueToClassTransformer.php Standard text-to-class transformer │ │ │ │ └── ValueTransformerInterface.php Interface defining classes that transform text configuration values into objects │ │ │ ├── Configuration.php Configuration project documentation -│ │ │ └── ConfigurationParameterBag.php Wrapper for getting raw configuration file data +│ │ │ ├── ConfigurationParameterBag.php Wrapper for getting raw configuration file data +│ │ │ └── ReflectionApiConfig.php │ │ ├──Logger/ │ │ │ └──Handler/ │ │ │ │ └── GenerationErrorsHandler.php @@ -70,6 +71,9 @@ Directory layout ( only documented files shown ): │ │ │ │ │ ├── OperationsCollection.php │ │ │ │ │ └── SingleEntitySearchOperation.php │ │ │ │ ├── BaseEntityCollection.php +│ │ │ │ ├── CollectionGroupLoadEntitiesResult.php +│ │ │ │ ├── CollectionLoadEntitiesResult.php +│ │ │ │ ├── EntitiesLoaderProgressBarInterface.php │ │ │ │ ├── EntityInterface.php │ │ │ │ ├── LoggableRootEntityCollection.php │ │ │ │ ├── RootEntityCollection.php @@ -178,20 +182,27 @@ Directory layout ( only documented files shown ): │ │ │ │ ├──Entity/ │ │ │ │ │ ├──Cache/ │ │ │ │ │ │ └── CacheablePhpEntityFactory.php -│ │ │ │ │ ├──PhpParser/ -│ │ │ │ │ │ ├── NodeValueCompiler.php -│ │ │ │ │ │ └── PhpParserHelper.php +│ │ │ │ │ ├──Data/ +│ │ │ │ │ │ └── DocBlockLink.php +│ │ │ │ │ ├──SubEntity/ +│ │ │ │ │ │ ├──ClassConstant/ +│ │ │ │ │ │ │ ├── ClassConstantEntitiesCollection.php +│ │ │ │ │ │ │ └── ClassConstantEntity.php Class constant entity +│ │ │ │ │ │ ├──Method/ +│ │ │ │ │ │ │ ├── DynamicMethodEntity.php Method obtained by parsing the "method" annotation +│ │ │ │ │ │ │ ├── MethodEntitiesCollection.php Collection of PHP class method entities +│ │ │ │ │ │ │ ├── MethodEntity.php Class method entity +│ │ │ │ │ │ │ └── MethodEntityInterface.php +│ │ │ │ │ │ └──Property/ +│ │ │ │ │ │ │ ├── PropertyEntitiesCollection.php +│ │ │ │ │ │ │ └── PropertyEntity.php Class property entity │ │ │ │ │ ├── BaseEntity.php -│ │ │ │ │ ├── ClassEntity.php Class entity -│ │ │ │ │ ├── ClassEntityCollection.php Collection of PHP class entities -│ │ │ │ │ ├── ConstantEntity.php Class constant entity -│ │ │ │ │ ├── ConstantEntityCollection.php -│ │ │ │ │ ├── DynamicMethodEntity.php Method obtained by parsing the "method" annotation -│ │ │ │ │ ├── MethodEntity.php Class method entity -│ │ │ │ │ ├── MethodEntityCollection.php -│ │ │ │ │ ├── MethodEntityInterface.php -│ │ │ │ │ ├── PropertyEntity.php Class property entity -│ │ │ │ │ └── PropertyEntityCollection.php +│ │ │ │ │ ├── ClassEntity.php PHP Class +│ │ │ │ │ ├── ClassLikeEntity.php +│ │ │ │ │ ├── EnumEntity.php Enumeration +│ │ │ │ │ ├── InterfaceEntity.php Object interface +│ │ │ │ │ ├── PhpEntitiesCollection.php Collection of php root entities +│ │ │ │ │ └── TraitEntity.php Trait │ │ │ │ ├──FilterCondition/ │ │ │ │ │ ├──ClassConstantFilterCondition/ │ │ │ │ │ │ ├── IsPrivateCondition.php Check is a private constant or not @@ -212,6 +223,9 @@ Directory layout ( only documented files shown ): │ │ │ │ │ │ ├── IsPublicCondition.php Check is a public property or not │ │ │ │ │ │ ├── OnlyFromCurrentClassCondition.php Only properties that belong to the current class (not parent) │ │ │ │ │ │ └── VisibilityCondition.php Property access modifier check +│ │ │ │ ├──PhpParser/ +│ │ │ │ │ ├── NodeValueCompiler.php +│ │ │ │ │ └── PhpParserHelper.php │ │ │ │ ├── ComposerHelper.php │ │ │ │ └── ParserHelper.php │ │ │ ├──Plugin/ @@ -226,9 +240,9 @@ Directory layout ( only documented files shown ): │ │ │ │ │ │ └── EntityDocUnifiedPlacePlugin.php This plugin changes the algorithm for saving entity documents. The standard system stores each fi... │ │ │ │ └──Event/ │ │ │ │ │ ├──Entity/ -│ │ │ │ │ │ └── OnCheckIsClassEntityCanBeLoad.php +│ │ │ │ │ │ └── OnCheckIsEntityCanBeLoaded.php │ │ │ │ │ └──Parser/ -│ │ │ │ │ │ ├── AfterLoadingClassEntityCollection.php The event is called after the initial creation of a collection of class entities +│ │ │ │ │ │ ├── AfterLoadingPhpEntitiesCollection.php The event is called after the initial creation of a collection of PHP entities │ │ │ │ │ │ └── OnAddClassEntityToCollection.php Called when each class entity is added to the entity collection │ │ │ ├──Renderer/ │ │ │ │ ├──EntityDocRenderer/ @@ -238,10 +252,12 @@ Directory layout ( only documented files shown ): │ │ │ │ │ └── EntityDocRendererHelper.php │ │ │ │ └──Twig/ │ │ │ │ │ └──Function/ +│ │ │ │ │ │ ├── DisplayClassApiMethods.php Display all API methods of a class │ │ │ │ │ │ ├── DrawClassMap.php Generate class map in HTML format │ │ │ │ │ │ └── GetClassMethodsBodyCode.php Get the code of the specified class methods as a formatted string │ │ │ ├── PhpHandler.php -│ │ │ └── PhpHandlerSettings.php +│ │ │ ├── PhpHandlerSettings.php +│ │ │ └── PhpReflectionApiConfig.php │ │ ├── LanguageHandlerInterface.php │ │ └── LanguageHandlersCollection.php │ ├── DocGenerator.php Class for generating documentation. @@ -250,4 +266,4 @@ Directory layout ( only documented files shown ):

        -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
        Last modified date: Sat Sep 2 21:01:47 2023 +0300
        Page content update date: Tue Nov 14 2023
        Made with Bumble Documentation Generator
        \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
        Last modified date: Mon Nov 20 19:18:48 2023 +0300
        Page content update date: Fri Dec 15 2023
        Made with Bumble Documentation Generator
        \ No newline at end of file diff --git a/docs/tech/readme.md b/docs/tech/readme.md index 1c59e254..568bd12a 100644 --- a/docs/tech/readme.md +++ b/docs/tech/readme.md @@ -44,4 +44,4 @@ After that, the process of parsing the project code according to the configurati

        -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
        Last modified date: Thu Oct 5 17:42:06 2023 +0300
        Page content update date: Tue Nov 14 2023
        Made with Bumble Documentation Generator
        \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
        Last modified date: Thu Oct 5 17:42:06 2023 +0300
        Page content update date: Fri Dec 15 2023
        Made with Bumble Documentation Generator
      • \ No newline at end of file From c6345ce7d940d8365b99c7eb19297c93971b2f87 Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Sat, 16 Dec 2023 13:54:48 +0300 Subject: [PATCH 133/210] Updating templates --- .../php/phpEntitiesCollection.md.twig | 9 ++++++ .../2.parser/reflectionApi/php/readme.md.twig | 31 +++++++++++++++++++ 2 files changed, 40 insertions(+) create mode 100644 selfdoc/templates/tech/2.parser/reflectionApi/php/phpEntitiesCollection.md.twig diff --git a/selfdoc/templates/tech/2.parser/reflectionApi/php/phpEntitiesCollection.md.twig b/selfdoc/templates/tech/2.parser/reflectionApi/php/phpEntitiesCollection.md.twig new file mode 100644 index 00000000..5da03eb5 --- /dev/null +++ b/selfdoc/templates/tech/2.parser/reflectionApi/php/phpEntitiesCollection.md.twig @@ -0,0 +1,9 @@ +{% set title = 'PHP entities collection' %} +{{ generatePageBreadcrumbs(title, _self) }} +{% set prevPage = 'Reflection API for PHP' %} + +{{ "PHP entities collection" | textToHeading('H1') }} + +**PHP entities collection API methods:** + +{{ displayClassApiMethods('\\BumbleDocGen\\LanguageHandler\\Php\\Parser\\Entity\\PhpEntitiesCollection') }} \ No newline at end of file diff --git a/selfdoc/templates/tech/2.parser/reflectionApi/php/readme.md.twig b/selfdoc/templates/tech/2.parser/reflectionApi/php/readme.md.twig index d30c0d86..52400fe5 100644 --- a/selfdoc/templates/tech/2.parser/reflectionApi/php/readme.md.twig +++ b/selfdoc/templates/tech/2.parser/reflectionApi/php/readme.md.twig @@ -30,6 +30,37 @@ $entityClassCodeStartLine = $classReflection->getStartLine(); // ... etc. ``` +{{ "Entities collection" | textToHeading('H2') }} + +Class reflections are stored in collections. The collection is filled either before documents are generated, +if the Reflection API is used to generate documentation, or when special methods are called that, under certain conditions, fill them with the required reflections. + +You can perform a number of filtering and searching operations on a collection of entities. +The collections API is presented on this page: [a]PHP entities collection[/a] + +**Usage example:** + +```php +// Create an empty collection +$entitiesCollection = (new \BumbleDocGen\DocGeneratorFactory())->getRootEntityReflections($reflectionApiConfig); + +// Fill the collection with entities +$entitiesCollection->loadEntities( + $sourceLocators, // Source locators are needed so that we can determine all the files that will be traversed to fill the collection with data + $filters // We can define special filters according to which entities will be loaded +); + +$classReflection = $entitiesCollection->get('SomeClassName'); + +$entitiesCollection = $entitiesCollection + ->filterByInterfaces(['SomeNamespace\Interface1', 'SomeNamespace\Interface2']) + ->filterByParentClassNames(['SomeNamespace\ParentClass']); + +foreach($entitiesCollection as $classReflection) { + $name = $classReflection->getName(); +} +``` + {{ "Class like sub entities reflections" | textToHeading('H2') }} PHP classes contain methods, properties and constants. Below is information about these child entities: From b34176b6302e406a6a80a80f46d672a9a2c650ce Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Sat, 16 Dec 2023 13:55:10 +0300 Subject: [PATCH 134/210] Changing output format --- .../Php/Renderer/Twig/Function/DisplayClassApiMethods.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/LanguageHandler/Php/Renderer/Twig/Function/DisplayClassApiMethods.php b/src/LanguageHandler/Php/Renderer/Twig/Function/DisplayClassApiMethods.php index dc60f6bf..b9ef5162 100644 --- a/src/LanguageHandler/Php/Renderer/Twig/Function/DisplayClassApiMethods.php +++ b/src/LanguageHandler/Php/Renderer/Twig/Function/DisplayClassApiMethods.php @@ -59,7 +59,7 @@ public function __invoke(string $className): ?string $classEntity->getName(), $method->getName() ]); - $apiMethods[] = "- [#]({$entityDocUrl}) `{$method->getName()}()`" . ($description ? ": {$description}" : ''); + $apiMethods[] = "- [{$method->getName()}()]({$entityDocUrl})" . ($description ? ": {$description}" : ''); } } return implode("\n", $apiMethods); From ef5e35d3b4a9bd32f36c2b20fab3cb1dfbda6b03 Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Sat, 16 Dec 2023 13:55:24 +0300 Subject: [PATCH 135/210] Fixing api tags --- .../Php/Parser/Entity/BaseEntity.php | 8 +++--- .../Php/Parser/Entity/EnumEntity.php | 6 +++++ .../Parser/Entity/PhpEntitiesCollection.php | 26 +++++++++++++++++++ 3 files changed, 36 insertions(+), 4 deletions(-) diff --git a/src/LanguageHandler/Php/Parser/Entity/BaseEntity.php b/src/LanguageHandler/Php/Parser/Entity/BaseEntity.php index b101e7b4..12669bc2 100644 --- a/src/LanguageHandler/Php/Parser/Entity/BaseEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/BaseEntity.php @@ -411,10 +411,10 @@ className: $className, * * @return DocBlockLink[] * + * @api + * * @throws InvalidConfigurationParameterException * @throws \Exception - *@api - * */ public function getDescriptionLinks(): array { @@ -478,9 +478,9 @@ className: $className, * * @return DocBlockLink[] * - * @throws InvalidConfigurationParameterException - *@api + * @api * + * @throws InvalidConfigurationParameterException */ public function getThrows(): array { diff --git a/src/LanguageHandler/Php/Parser/Entity/EnumEntity.php b/src/LanguageHandler/Php/Parser/Entity/EnumEntity.php index b06680ba..edae6212 100644 --- a/src/LanguageHandler/Php/Parser/Entity/EnumEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/EnumEntity.php @@ -37,6 +37,8 @@ public function getInterfaceNames(): array /** * Get enum cases values * + * @api + * * @throws InvalidConfigurationParameterException * @throws ConstExprEvaluationException */ @@ -64,6 +66,8 @@ public function getInterfaceNames(): array * * @return string[] * + * @api + * * @throws InvalidConfigurationParameterException * @throws ConstExprEvaluationException */ @@ -75,6 +79,8 @@ public function getCasesNames(): array /** * Get enum case value * + * @api + * * @throws InvalidConfigurationParameterException * @throws ConstExprEvaluationException */ diff --git a/src/LanguageHandler/Php/Parser/Entity/PhpEntitiesCollection.php b/src/LanguageHandler/Php/Parser/Entity/PhpEntitiesCollection.php index 0a1f9dc6..9bfa6530 100644 --- a/src/LanguageHandler/Php/Parser/Entity/PhpEntitiesCollection.php +++ b/src/LanguageHandler/Php/Parser/Entity/PhpEntitiesCollection.php @@ -65,6 +65,9 @@ public function getPluginEventDispatcher(): PluginEventDispatcher return $this->pluginEventDispatcher; } + /** + * @api + */ public function getEntityCollectionName(): string { return self::NAME; @@ -183,6 +186,8 @@ className: $namespaceName ? "{$namespaceName}\\{$className}" : $className, } /** + * @api + * * @throws InvalidConfigurationParameterException */ public function add(ClassLikeEntity $classEntity, bool $reload = false): PhpEntitiesCollection @@ -238,6 +243,8 @@ public function getEntityByClassName(string $className, bool $createIfNotExists * * @param string[] $interfaces * + * @api + * * @throws InvalidConfigurationParameterException */ public function filterByInterfaces(array $interfaces): PhpEntitiesCollection @@ -262,6 +269,8 @@ public function filterByInterfaces(array $interfaces): PhpEntitiesCollection /** * Retrieving all entities that inherit from the specified classes. Filtering is only available for ClassLikeEntity. * + * @api + * * @throws InvalidConfigurationParameterException */ public function filterByParentClassNames(array $parentClassNames): PhpEntitiesCollection @@ -286,6 +295,8 @@ public function filterByParentClassNames(array $parentClassNames): PhpEntitiesCo /** * Filtering entities by relative files paths (from project_root) of the project * + * @api + * * @throws InvalidConfigurationParameterException */ public function filterByPaths(array $paths): PhpEntitiesCollection @@ -306,6 +317,9 @@ public function filterByPaths(array $paths): PhpEntitiesCollection return $entitiesCollection; } + /** + * @api + */ public function filterByNameRegularExpression(string $regexPattern): PhpEntitiesCollection { $entitiesCollection = $this->cloneForFiltration(); @@ -320,6 +334,8 @@ public function filterByNameRegularExpression(string $regexPattern): PhpEntities /** * Retrieving only instantiable entities. Filtering is only available for ClassLikeEntity. + * + * @api */ public function getOnlyInstantiable(): PhpEntitiesCollection { @@ -332,6 +348,9 @@ public function getOnlyInstantiable(): PhpEntitiesCollection return $entitiesCollection; } + /** + * @api + */ public function getOnlyInterfaces(): PhpEntitiesCollection { $entitiesCollection = $this->cloneForFiltration(); @@ -343,6 +362,9 @@ public function getOnlyInterfaces(): PhpEntitiesCollection return $entitiesCollection; } + /** + * @api + */ public function getOnlyTraits(): PhpEntitiesCollection { $entitiesCollection = $this->cloneForFiltration(); @@ -355,6 +377,8 @@ public function getOnlyTraits(): PhpEntitiesCollection } /** + * @api + * * @throws InvalidConfigurationParameterException */ public function getOnlyAbstractClasses(): PhpEntitiesCollection @@ -378,6 +402,8 @@ public function getOnlyAbstractClasses(): PhpEntitiesCollection * * @return ClassLikeEntity|null * + * @api + * * @example * $entitiesCollection->findEntity('App'); // class name * $entitiesCollection->findEntity('BumbleDocGen\Console\App'); // class with namespace From 9f4779a9e19a694ff4b8d3a5e23c6f3010eadb09 Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Sat, 16 Dec 2023 14:20:12 +0300 Subject: [PATCH 136/210] Updating doc blocks --- .../Parser/Entity/BaseEntityCollection.php | 20 +++++++++++++ .../Parser/Entity/RootEntityCollection.php | 28 +++++++++++++++++++ .../Parser/Entity/PhpEntitiesCollection.php | 26 +++++++++++++---- 3 files changed, 68 insertions(+), 6 deletions(-) diff --git a/src/Core/Parser/Entity/BaseEntityCollection.php b/src/Core/Parser/Entity/BaseEntityCollection.php index d1d18805..54e00df5 100644 --- a/src/Core/Parser/Entity/BaseEntityCollection.php +++ b/src/Core/Parser/Entity/BaseEntityCollection.php @@ -14,21 +14,41 @@ public function getIterator(): \Generator yield from $this->entities; } + /** + * Get an entity from a collection (only previously added) + * + * @api + */ public function get(string $objectName): ?EntityInterface { return $this->entities[$objectName] ?? null; } + /** + * Remove an entity from a collection + * + * @api + */ public function remove(string $objectName): void { unset($this->entities[$objectName]); } + /** + * Check if an entity has been added to the collection + * + * @api + */ public function has(string $objectName): bool { return array_key_exists($objectName, $this->entities); } + /** + * Check if the collection is empty or not + * + * @api + */ public function isEmpty(): bool { return empty($this->entities); diff --git a/src/Core/Parser/Entity/RootEntityCollection.php b/src/Core/Parser/Entity/RootEntityCollection.php index ba0a4ea9..6a9ea146 100644 --- a/src/Core/Parser/Entity/RootEntityCollection.php +++ b/src/Core/Parser/Entity/RootEntityCollection.php @@ -31,11 +31,20 @@ abstract public function loadEntities( ?EntitiesLoaderProgressBarInterface $progressBar = null ): CollectionLoadEntitiesResult; + /** + * Get collection name + * + * @api + */ abstract public function getEntityCollectionName(): string; /** + * Get an entity from a collection (only previously added) + * * @param class-string $objectName * @return null|T + * + * @api */ public function get(string $objectName): ?RootEntityInterface { @@ -43,6 +52,8 @@ public function get(string $objectName): ?RootEntityInterface } /** + * Get an entity from the collection or create a new one if it has not yet been added + * * @warning The entity obtained as a result of executing this method may not be available for loading * * @see RootEntityInterface::isEntityDataCanBeLoaded() @@ -50,11 +61,17 @@ public function get(string $objectName): ?RootEntityInterface * @param class-string $objectName * * @return T + * + * @api */ abstract public function getLoadedOrCreateNew(string $objectName, bool $withAddClassEntityToCollectionEvent = false): RootEntityInterface; /** + * Find an entity in a collection + * * @return null|T + * + * @api */ abstract public function findEntity(string $search, bool $useUnsafeKeys = true): ?RootEntityInterface; @@ -66,11 +83,15 @@ abstract public function findEntity(string $search, bool $useUnsafeKeys = true): * * @return array * + * @internal + * * @todo return object instead array */ abstract public function getEntityLinkData(string $rawLink, ?string $defaultEntityName = null, bool $useUnsafeKeys = true): array; /** + * @internal + * * @throws InvalidArgumentException */ public function updateEntitiesCache(): void @@ -96,6 +117,13 @@ public function updateEntitiesCache(): void } } + /** + * Convert collection to array + * + * @return RootEntityInterface[] + * + * @api + */ public function toArray(): array { return $this->entities; diff --git a/src/LanguageHandler/Php/Parser/Entity/PhpEntitiesCollection.php b/src/LanguageHandler/Php/Parser/Entity/PhpEntitiesCollection.php index 9bfa6530..d1e86fe9 100644 --- a/src/LanguageHandler/Php/Parser/Entity/PhpEntitiesCollection.php +++ b/src/LanguageHandler/Php/Parser/Entity/PhpEntitiesCollection.php @@ -66,7 +66,7 @@ public function getPluginEventDispatcher(): PluginEventDispatcher } /** - * @api + * @inheritDoc */ public function getEntityCollectionName(): string { @@ -186,6 +186,8 @@ className: $namespaceName ? "{$namespaceName}\\{$className}" : $className, } /** + * Add an entity to the collection + * * @api * * @throws InvalidConfigurationParameterException @@ -208,6 +210,8 @@ protected function prepareObjectName(string $objectName): string } /** + * @internal + * * @throws DependencyException * @throws NotFoundException * @throws InvalidConfigurationParameterException @@ -239,7 +243,7 @@ public function getEntityByClassName(string $className, bool $createIfNotExists } /** - * Retrieving all entities that implement the specified interfaces. Filtering is only available for ClassLikeEntity. + * Get a copy of the current collection only with entities filtered by interfaces names (filtering is only available for ClassLikeEntity) * * @param string[] $interfaces * @@ -267,7 +271,7 @@ public function filterByInterfaces(array $interfaces): PhpEntitiesCollection } /** - * Retrieving all entities that inherit from the specified classes. Filtering is only available for ClassLikeEntity. + * Get a copy of the current collection only with entities filtered by parent classes names (filtering is only available for ClassLikeEntity) * * @api * @@ -293,7 +297,9 @@ public function filterByParentClassNames(array $parentClassNames): PhpEntitiesCo } /** - * Filtering entities by relative files paths (from project_root) of the project + * Get a copy of the current collection only with entities filtered by file paths (from project_root) + * + * Get a copy of a collection with only instantiable entities from the current collection * * @api * @@ -318,6 +324,8 @@ public function filterByPaths(array $paths): PhpEntitiesCollection } /** + * Get a copy of the current collection with only entities whose names match the regular expression + * * @api */ public function filterByNameRegularExpression(string $regexPattern): PhpEntitiesCollection @@ -333,7 +341,7 @@ public function filterByNameRegularExpression(string $regexPattern): PhpEntities } /** - * Retrieving only instantiable entities. Filtering is only available for ClassLikeEntity. + * Get a copy of the current collection with only instantiable entities * * @api */ @@ -349,6 +357,8 @@ public function getOnlyInstantiable(): PhpEntitiesCollection } /** + * Get a copy of the current collection with only interfaces + * * @api */ public function getOnlyInterfaces(): PhpEntitiesCollection @@ -363,6 +373,8 @@ public function getOnlyInterfaces(): PhpEntitiesCollection } /** + * Get a copy of the current collection with only traits + * * @api */ public function getOnlyTraits(): PhpEntitiesCollection @@ -377,6 +389,8 @@ public function getOnlyTraits(): PhpEntitiesCollection } /** + * Get a copy of the current collection with only abstract classes + * * @api * * @throws InvalidConfigurationParameterException @@ -402,7 +416,7 @@ public function getOnlyAbstractClasses(): PhpEntitiesCollection * * @return ClassLikeEntity|null * - * @api + * @internal * * @example * $entitiesCollection->findEntity('App'); // class name From 35771ed14372d6d1338e3a589dfac214a708c816 Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Sat, 16 Dec 2023 14:21:05 +0300 Subject: [PATCH 137/210] Adding description --- src/LanguageHandler/Php/Parser/Entity/ClassLikeEntity.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/LanguageHandler/Php/Parser/Entity/ClassLikeEntity.php b/src/LanguageHandler/Php/Parser/Entity/ClassLikeEntity.php index 450d9f47..20b2edcb 100644 --- a/src/LanguageHandler/Php/Parser/Entity/ClassLikeEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/ClassLikeEntity.php @@ -87,6 +87,8 @@ public static function isEntityNameValid(string $entityName): bool } /** + * Bring the class name to the standard format used in the system + * * @api */ final public static function normalizeClassName(string $name): string From 49fa36c8a3afb26724683cd71390ddd4b6aa5321 Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Sat, 16 Dec 2023 14:21:33 +0300 Subject: [PATCH 138/210] Removing old code --- .../Php/Parser/Entity/PhpEntitiesCollection.php | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/LanguageHandler/Php/Parser/Entity/PhpEntitiesCollection.php b/src/LanguageHandler/Php/Parser/Entity/PhpEntitiesCollection.php index d1e86fe9..1f798369 100644 --- a/src/LanguageHandler/Php/Parser/Entity/PhpEntitiesCollection.php +++ b/src/LanguageHandler/Php/Parser/Entity/PhpEntitiesCollection.php @@ -60,11 +60,6 @@ public function __construct( parent::__construct(); } - public function getPluginEventDispatcher(): PluginEventDispatcher - { - return $this->pluginEventDispatcher; - } - /** * @inheritDoc */ From c9596a27dc8500272a564375a27bea8a0b672cb9 Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Sat, 16 Dec 2023 14:23:24 +0300 Subject: [PATCH 139/210] Removing old method --- .../TwigFilterClassParser/TwigFilterClassParserPlugin.php | 2 +- .../TwigFunctionClassParserPlugin.php | 2 +- .../Php/Parser/Entity/PhpEntitiesCollection.php | 5 ----- 3 files changed, 2 insertions(+), 7 deletions(-) diff --git a/selfdoc/Plugin/TwigFilterClassParser/TwigFilterClassParserPlugin.php b/selfdoc/Plugin/TwigFilterClassParser/TwigFilterClassParserPlugin.php index 2ff68d13..e3c2b723 100644 --- a/selfdoc/Plugin/TwigFilterClassParser/TwigFilterClassParserPlugin.php +++ b/selfdoc/Plugin/TwigFilterClassParser/TwigFilterClassParserPlugin.php @@ -136,7 +136,7 @@ private function getFilterData(PhpEntitiesCollection $entitiesCollection, string } $functionData['name'] = $filters[$className]; - $entity = $entitiesCollection->getEntityByClassName($className); + $entity = $entitiesCollection->getLoadedOrCreateNew($className); $method = $entity->getMethodEntitiesCollection()->get('__invoke'); $functionData['parameters'] = $method->getParameters(); $filtersData[$className] = $functionData; diff --git a/selfdoc/Plugin/TwigFunctionClassParser/TwigFunctionClassParserPlugin.php b/selfdoc/Plugin/TwigFunctionClassParser/TwigFunctionClassParserPlugin.php index 83ee155b..a49754cc 100644 --- a/selfdoc/Plugin/TwigFunctionClassParser/TwigFunctionClassParserPlugin.php +++ b/selfdoc/Plugin/TwigFunctionClassParser/TwigFunctionClassParserPlugin.php @@ -129,7 +129,7 @@ private function getFunctionData(PhpEntitiesCollection $entitiesCollection, stri if (!isset($functions[$className])) { return null; } - $entity = $entitiesCollection->getEntityByClassName($className); + $entity = $entitiesCollection->getLoadedOrCreateNew($className); if (str_starts_with($entity->getRelativeFileName(), '/selfdoc')) { return null; } diff --git a/src/LanguageHandler/Php/Parser/Entity/PhpEntitiesCollection.php b/src/LanguageHandler/Php/Parser/Entity/PhpEntitiesCollection.php index 1f798369..6fd2516e 100644 --- a/src/LanguageHandler/Php/Parser/Entity/PhpEntitiesCollection.php +++ b/src/LanguageHandler/Php/Parser/Entity/PhpEntitiesCollection.php @@ -232,11 +232,6 @@ public function internalGetLoadedOrCreateNew(string $objectName, bool $withAddCl return $classEntity; } - public function getEntityByClassName(string $className, bool $createIfNotExists = true): ?ClassLikeEntity - { - return $createIfNotExists ? $this->getLoadedOrCreateNew($className) : $this->get($className); - } - /** * Get a copy of the current collection only with entities filtered by interfaces names (filtering is only available for ClassLikeEntity) * From 98869f15076c76d3f94329b1305cef2309096094 Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Sat, 16 Dec 2023 14:23:52 +0300 Subject: [PATCH 140/210] Updating doc --- docs/README.md | 2 +- docs/shared_c.cache | 2 +- docs/tech/1.configuration/readme.md | 2 +- .../ClassConstantEntitiesCollection.md | 18 +- docs/tech/2.parser/classes/ClassEntity.md | 112 +- docs/tech/2.parser/classes/ClassLikeEntity.md | 124 +- docs/tech/2.parser/classes/EnumEntity.md | 128 +- docs/tech/2.parser/classes/InterfaceEntity.md | 118 +- .../classes/MethodEntitiesCollection.md | 18 +- .../2.parser/classes/PhpEntitiesCollection.md | 178 +-- .../classes/PropertyEntitiesCollection.md | 18 +- .../2.parser/classes/RootEntityCollection.md | 52 +- docs/tech/2.parser/classes/TraitEntity.md | 118 +- docs/tech/2.parser/entity.md | 2 +- docs/tech/2.parser/entityFilterCondition.md | 2 +- docs/tech/2.parser/readme.md | 4 +- .../reflectionApi/php/classes/ClassEntity.md | 112 +- .../php/classes/ClassLikeEntity.md | 124 +- .../php/classes/ClassLikeEntity_2.md | 124 +- .../php/classes/ClassLikeEntity_3.md | 124 +- .../php/classes/ClassLikeEntity_4.md | 124 +- .../php/classes/ClassLikeEntity_5.md | 124 +- .../reflectionApi/php/classes/EnumEntity.md | 128 +- .../php/classes/InterfaceEntity.md | 118 +- .../php/classes/PhpEntitiesCollection.md | 1183 +++++++++++++++++ .../php/classes/RootEntityInterface.md | 472 +++++++ .../reflectionApi/php/classes/TraitEntity.md | 118 +- .../php/phpClassConstantReflectionApi.md | 58 +- .../php/phpClassMethodReflectionApi.md | 88 +- .../php/phpClassPropertyReflectionApi.md | 70 +- .../php/phpClassReflectionApi.md | 126 +- .../php/phpEntitiesCollection.md | 28 + .../reflectionApi/php/phpEnumReflectionApi.md | 127 +- .../php/phpInterfaceReflectionApi.md | 124 +- .../php/phpTraitReflectionApi.md | 124 +- .../tech/2.parser/reflectionApi/php/readme.md | 34 +- docs/tech/2.parser/reflectionApi/readme.md | 2 +- docs/tech/2.parser/sourceLocator.md | 2 +- docs/tech/3.renderer/01_templates.md | 2 +- docs/tech/3.renderer/02_breadcrumbs.md | 2 +- docs/tech/3.renderer/03_documentStructure.md | 2 +- docs/tech/3.renderer/04_twigCustomFilters.md | 2 +- .../tech/3.renderer/05_twigCustomFunctions.md | 2 +- .../classes/PhpEntitiesCollection.md | 178 +-- .../classes/PhpEntitiesCollection_2.md | 178 +-- .../classes/RootEntityCollection.md | 52 +- docs/tech/3.renderer/readme.md | 2 +- .../tech/3.renderer/templatesDynamicBlocks.md | 2 +- docs/tech/3.renderer/templatesLinking.md | 2 +- docs/tech/3.renderer/templatesVariables.md | 2 +- docs/tech/4.pluginSystem/readme.md | 2 +- docs/tech/classes/BaseEntityCollection.md | 24 +- .../ClassConstantEntitiesCollection.md | 18 +- docs/tech/classes/ClassEntity.md | 112 +- docs/tech/classes/ClassLikeEntity.md | 124 +- docs/tech/classes/ClassLikeEntity_2.md | 124 +- docs/tech/classes/EnumEntity.md | 128 +- docs/tech/classes/InterfaceEntity.md | 118 +- .../classes/LoggableRootEntityCollection.md | 46 +- docs/tech/classes/MethodEntitiesCollection.md | 18 +- docs/tech/classes/PhpEntitiesCollection.md | 178 +-- .../classes/PropertyEntitiesCollection.md | 18 +- docs/tech/classes/RootEntityCollection.md | 52 +- docs/tech/classes/TraitEntity.md | 118 +- docs/tech/map.md | 2 +- docs/tech/readme.md | 2 +- 66 files changed, 3690 insertions(+), 2252 deletions(-) create mode 100644 docs/tech/2.parser/reflectionApi/php/classes/PhpEntitiesCollection.md create mode 100644 docs/tech/2.parser/reflectionApi/php/classes/RootEntityInterface.md create mode 100644 docs/tech/2.parser/reflectionApi/php/phpEntitiesCollection.md diff --git a/docs/README.md b/docs/README.md index 4bd6c833..fd2facba 100644 --- a/docs/README.md +++ b/docs/README.md @@ -95,4 +95,4 @@ To update this documentation, run the following command:

        -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
        Last modified date: Fri Dec 15 21:27:10 2023 +0300
        Page content update date: Fri Dec 15 2023
        Made with Bumble Documentation Generator
        \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
        Last modified date: Fri Dec 15 21:27:10 2023 +0300
        Page content update date: Sat Dec 16 2023
        Made with Bumble Documentation Generator
        \ No newline at end of file diff --git a/docs/shared_c.cache b/docs/shared_c.cache index 0274c397..eb3bb6a1 100644 --- a/docs/shared_c.cache +++ b/docs/shared_c.cache @@ -1 +1 @@ -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 \ No newline at end of file +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 \ No newline at end of file diff --git a/docs/tech/1.configuration/readme.md b/docs/tech/1.configuration/readme.md index 442a80c8..ecbc44f3 100644 --- a/docs/tech/1.configuration/readme.md +++ b/docs/tech/1.configuration/readme.md @@ -223,4 +223,4 @@ The inheritance algorithm is as follows: scalar types can be overwritten by each

        -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
        Last modified date: Mon Nov 20 19:18:48 2023 +0300
        Page content update date: Fri Dec 15 2023
        Made with Bumble Documentation Generator
        \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
        Last modified date: Mon Nov 20 19:18:48 2023 +0300
        Page content update date: Sat Dec 16 2023
        Made with Bumble Documentation Generator
        \ No newline at end of file diff --git a/docs/tech/2.parser/classes/ClassConstantEntitiesCollection.md b/docs/tech/2.parser/classes/ClassConstantEntitiesCollection.md index 1e040b9a..280eb25d 100644 --- a/docs/tech/2.parser/classes/ClassConstantEntitiesCollection.md +++ b/docs/tech/2.parser/classes/ClassConstantEntitiesCollection.md @@ -44,16 +44,16 @@ final class ClassConstantEntitiesCollection extends \BumbleDocGen\Core\Parser\En
      • has -
      • + - Check if an entity has been added to the collection
      • isEmpty -
      • + - Check if the collection is empty or not
      • loadConstantEntities
      • remove -
      • + - Remove an entity from a collection
      • unsafeGet
      • @@ -223,7 +223,7 @@ public function getIterator(): \Generator; ```php @@ -232,7 +232,7 @@ public function getIterator(): \Generator; public function has(string $objectName): bool; ``` - +
        Check if an entity has been added to the collection
        Parameters: @@ -263,7 +263,7 @@ public function has(string $objectName): bool; ```php @@ -272,7 +272,7 @@ public function has(string $objectName): bool; public function isEmpty(): bool; ``` - +
        Check if the collection is empty or not
        Parameters: not specified @@ -320,7 +320,7 @@ public function loadConstantEntities(): void; ```php @@ -329,7 +329,7 @@ public function loadConstantEntities(): void; public function remove(string $objectName): void; ``` - +
        Remove an entity from a collection
        Parameters: diff --git a/docs/tech/2.parser/classes/ClassEntity.md b/docs/tech/2.parser/classes/ClassEntity.md index 5872a965..74c17ad9 100644 --- a/docs/tech/2.parser/classes/ClassEntity.md +++ b/docs/tech/2.parser/classes/ClassEntity.md @@ -296,7 +296,7 @@ See: - Check if an entity is a Trait
      • normalizeClassName -
      • + - Bring the class name to the standard format used in the system
      • reloadEntityDependenciesCache - Update entity dependency cache
      • @@ -408,7 +408,7 @@ public function __construct(\BumbleDocGen\Core\Configuration\Configuration $conf ```php @@ -453,7 +453,7 @@ public function addPluginData(string $pluginKey, mixed $data): void; ```php @@ -541,7 +541,7 @@ public function getAbsoluteFileName(): null|string; ```php @@ -627,7 +627,7 @@ public function getCachedEntityDependencies(): array; ```php @@ -685,7 +685,7 @@ public function getConstant(string $constantName, bool $unsafe = false): null|\B ```php @@ -727,7 +727,7 @@ public function getConstantEntitiesCollection(): \BumbleDocGen\LanguageHandler\P ```php @@ -783,7 +783,7 @@ public function getConstantValue(string $constantName): string|array|int|bool|nu ```php @@ -827,7 +827,7 @@ public function getConstants(): array; ```php @@ -879,7 +879,7 @@ public function getConstantsData(bool $onlyFromCurrentClassAndTraits = false, in ```php @@ -1086,7 +1086,7 @@ public function getDocComment(): string; ```php @@ -1169,7 +1169,7 @@ public function getDocNote(): string; ```php @@ -1202,7 +1202,7 @@ public function getDocRender(): \BumbleDocGen\Core\Renderer\EntityDocRenderer\En ```php @@ -1232,7 +1232,7 @@ public function getEndLine(): int; ```php @@ -1285,7 +1285,7 @@ public function getExamples(): array; ```php @@ -1392,7 +1392,7 @@ public function getFirstExample(): string; ```php @@ -1415,7 +1415,7 @@ public function getImplementingClass(): \BumbleDocGen\LanguageHandler\Php\Parser ```php @@ -1445,7 +1445,7 @@ public function getInterfaceNames(): array; ```php @@ -1475,7 +1475,7 @@ public function getInterfacesEntities(): array; ```php @@ -1533,7 +1533,7 @@ public function getMethod(string $methodName, bool $unsafe = false): null|\Bumbl ```php @@ -1575,7 +1575,7 @@ public function getMethodEntitiesCollection(): \BumbleDocGen\LanguageHandler\Php ```php @@ -1619,7 +1619,7 @@ public function getMethods(): array; ```php @@ -1692,7 +1692,7 @@ public function getModifiersString(): string; ```php @@ -1715,7 +1715,7 @@ public function getName(): string; ```php @@ -1738,7 +1738,7 @@ public function getNamespaceName(): string; ```php @@ -1782,7 +1782,7 @@ public function getParentClass(): null|\BumbleDocGen\LanguageHandler\Php\Parser\ ```php @@ -1847,7 +1847,7 @@ public function getParentClassNames(): array; ```php @@ -1887,7 +1887,7 @@ public function getPluginData(string $pluginKey): mixed; ```php @@ -1931,7 +1931,7 @@ public function getProperties(): array; ```php @@ -1983,7 +1983,7 @@ public function getPropertiesData(bool $onlyFromCurrentClassAndTraits = false, i ```php @@ -2041,7 +2041,7 @@ public function getProperty(string $propertyName, bool $unsafe = false): null|\B ```php @@ -2097,7 +2097,7 @@ public function getPropertyDefaultValue(string $propertyName): string|array|int| ```php @@ -2139,7 +2139,7 @@ public function getPropertyEntitiesCollection(): \BumbleDocGen\LanguageHandler\P ```php @@ -2168,7 +2168,7 @@ public function getRelativeFileName(): null|string; ```php @@ -2191,7 +2191,7 @@ public function getRootEntityCollection(): \BumbleDocGen\LanguageHandler\Php\Par ```php @@ -2214,7 +2214,7 @@ public function getShortName(): string; ```php @@ -2304,7 +2304,7 @@ public function getThrowsDocBlockLinks(): array; ```php @@ -2334,7 +2334,7 @@ public function getTraits(): array; ```php @@ -2364,7 +2364,7 @@ public function getTraitsNames(): array; ```php @@ -2482,7 +2482,7 @@ public function hasExamples(): bool; ```php @@ -2540,7 +2540,7 @@ public function hasMethod(string $methodName, bool $unsafe = false): bool; ```php @@ -2580,7 +2580,7 @@ public function hasParentClass(string $parentClassName): bool; ```php @@ -2668,7 +2668,7 @@ public function hasThrows(): bool; ```php @@ -2698,7 +2698,7 @@ public function hasTraits(): bool; ```php @@ -2845,7 +2845,7 @@ public function isClass(): bool; ```php @@ -2898,7 +2898,7 @@ public function isDeprecated(): bool; ```php @@ -2981,7 +2981,7 @@ public function isEntityDataCacheOutdated(): bool; ```php @@ -3081,7 +3081,7 @@ public static function isEntityNameValid(string $entityName): bool; ```php @@ -3104,7 +3104,7 @@ public function isEnum(): bool; ```php @@ -3127,7 +3127,7 @@ public function isExternalLibraryEntity(): bool; ```php @@ -3171,7 +3171,7 @@ public function isInstantiable(): bool; ```php @@ -3224,7 +3224,7 @@ public function isInternal(): bool; ```php @@ -3271,7 +3271,7 @@ public function isSubclassOf(string $className): bool; ```php @@ -3294,7 +3294,7 @@ public function isTrait(): bool; ```php @@ -3303,7 +3303,7 @@ public function isTrait(): bool; public static function normalizeClassName(string $name): string; ``` - +
        Bring the class name to the standard format used in the system
        Parameters: @@ -3427,7 +3427,7 @@ public function removeNotUsedEntityDataCache(): void; ```php diff --git a/docs/tech/2.parser/classes/ClassLikeEntity.md b/docs/tech/2.parser/classes/ClassLikeEntity.md index aff034fd..61d077ec 100644 --- a/docs/tech/2.parser/classes/ClassLikeEntity.md +++ b/docs/tech/2.parser/classes/ClassLikeEntity.md @@ -287,7 +287,7 @@ abstract class ClassLikeEntity extends \BumbleDocGen\LanguageHandler\Php\Parser\ - Check if an entity is a Trait
      • normalizeClassName -
      • + - Bring the class name to the standard format used in the system
      • reloadEntityDependenciesCache - Update entity dependency cache
      • @@ -397,7 +397,7 @@ public function __construct(\BumbleDocGen\Core\Configuration\Configuration $conf ```php @@ -440,7 +440,7 @@ public function addPluginData(string $pluginKey, mixed $data): void; ```php @@ -526,7 +526,7 @@ public function getAbsoluteFileName(): null|string; ```php @@ -610,7 +610,7 @@ public function getCachedEntityDependencies(): array; ```php @@ -666,7 +666,7 @@ public function getConstant(string $constantName, bool $unsafe = false): null|\B ```php @@ -706,7 +706,7 @@ public function getConstantEntitiesCollection(): \BumbleDocGen\LanguageHandler\P ```php @@ -760,7 +760,7 @@ public function getConstantValue(string $constantName): string|array|int|bool|nu ```php @@ -802,7 +802,7 @@ public function getConstants(): array; ```php @@ -852,7 +852,7 @@ public function getConstantsData(bool $onlyFromCurrentClassAndTraits = false, in ```php @@ -1057,7 +1057,7 @@ public function getDocComment(): string; ```php @@ -1138,7 +1138,7 @@ public function getDocNote(): string; ```php @@ -1169,7 +1169,7 @@ public function getDocRender(): \BumbleDocGen\Core\Renderer\EntityDocRenderer\En ```php @@ -1197,7 +1197,7 @@ public function getEndLine(): int; ```php @@ -1248,7 +1248,7 @@ public function getExamples(): array; ```php @@ -1353,7 +1353,7 @@ public function getFirstExample(): string; ```php @@ -1374,7 +1374,7 @@ public function getImplementingClass(): \BumbleDocGen\LanguageHandler\Php\Parser ```php @@ -1402,7 +1402,7 @@ public function getInterfaceNames(): array; ```php @@ -1430,7 +1430,7 @@ public function getInterfacesEntities(): array; ```php @@ -1486,7 +1486,7 @@ public function getMethod(string $methodName, bool $unsafe = false): null|\Bumbl ```php @@ -1526,7 +1526,7 @@ public function getMethodEntitiesCollection(): \BumbleDocGen\LanguageHandler\Php ```php @@ -1568,7 +1568,7 @@ public function getMethods(): array; ```php @@ -1639,7 +1639,7 @@ public function getModifiersString(): string; ```php @@ -1660,7 +1660,7 @@ public function getName(): string; ```php @@ -1681,7 +1681,7 @@ public function getNamespaceName(): string; ```php @@ -1702,7 +1702,7 @@ public function getObjectId(): string; ```php @@ -1723,7 +1723,7 @@ public function getParentClass(): null|\BumbleDocGen\LanguageHandler\Php\Parser\ ```php @@ -1744,7 +1744,7 @@ public function getParentClassEntities(): array; ```php @@ -1765,7 +1765,7 @@ public function getParentClassName(): null|string; ```php @@ -1786,7 +1786,7 @@ public function getParentClassNames(): array; ```php @@ -1824,7 +1824,7 @@ public function getPluginData(string $pluginKey): mixed; ```php @@ -1866,7 +1866,7 @@ public function getProperties(): array; ```php @@ -1916,7 +1916,7 @@ public function getPropertiesData(bool $onlyFromCurrentClassAndTraits = false, i ```php @@ -1972,7 +1972,7 @@ public function getProperty(string $propertyName, bool $unsafe = false): null|\B ```php @@ -2026,7 +2026,7 @@ public function getPropertyDefaultValue(string $propertyName): string|array|int| ```php @@ -2066,7 +2066,7 @@ public function getPropertyEntitiesCollection(): \BumbleDocGen\LanguageHandler\P ```php @@ -2093,7 +2093,7 @@ public function getRelativeFileName(): null|string; ```php @@ -2114,7 +2114,7 @@ public function getRootEntityCollection(): \BumbleDocGen\LanguageHandler\Php\Par ```php @@ -2135,7 +2135,7 @@ public function getShortName(): string; ```php @@ -2223,7 +2223,7 @@ public function getThrowsDocBlockLinks(): array; ```php @@ -2251,7 +2251,7 @@ public function getTraits(): array; ```php @@ -2279,7 +2279,7 @@ public function getTraitsNames(): array; ```php @@ -2395,7 +2395,7 @@ public function hasExamples(): bool; ```php @@ -2451,7 +2451,7 @@ public function hasMethod(string $methodName, bool $unsafe = false): bool; ```php @@ -2489,7 +2489,7 @@ public function hasParentClass(string $parentClassName): bool; ```php @@ -2575,7 +2575,7 @@ public function hasThrows(): bool; ```php @@ -2603,7 +2603,7 @@ public function hasTraits(): bool; ```php @@ -2648,7 +2648,7 @@ public function implementsInterface(string $interfaceName): bool; ```php @@ -2699,7 +2699,7 @@ public function isApi(): bool; ```php @@ -2720,7 +2720,7 @@ public function isClass(): bool; ```php @@ -2771,7 +2771,7 @@ public function isDeprecated(): bool; ```php @@ -2852,7 +2852,7 @@ public function isEntityDataCacheOutdated(): bool; ```php @@ -2948,7 +2948,7 @@ public static function isEntityNameValid(string $entityName): bool; ```php @@ -2969,7 +2969,7 @@ public function isEnum(): bool; ```php @@ -2990,7 +2990,7 @@ public function isExternalLibraryEntity(): bool; ```php @@ -3011,7 +3011,7 @@ public function isInGit(): bool; ```php @@ -3032,7 +3032,7 @@ public function isInstantiable(): bool; ```php @@ -3083,7 +3083,7 @@ public function isInternal(): bool; ```php @@ -3128,7 +3128,7 @@ public function isSubclassOf(string $className): bool; ```php @@ -3149,14 +3149,14 @@ public function isTrait(): bool; ```php public static function normalizeClassName(string $name): string; ``` - +
        Bring the class name to the standard format used in the system
        Parameters: @@ -3280,7 +3280,7 @@ public function removeNotUsedEntityDataCache(): void; ```php diff --git a/docs/tech/2.parser/classes/EnumEntity.md b/docs/tech/2.parser/classes/EnumEntity.md index 806c870a..9739163c 100644 --- a/docs/tech/2.parser/classes/EnumEntity.md +++ b/docs/tech/2.parser/classes/EnumEntity.md @@ -302,7 +302,7 @@ See: - Check if an entity is a Trait
      • normalizeClassName -
      • + - Bring the class name to the standard format used in the system
      • reloadEntityDependenciesCache - Update entity dependency cache
      • @@ -414,7 +414,7 @@ public function __construct(\BumbleDocGen\Core\Configuration\Configuration $conf ```php @@ -459,7 +459,7 @@ public function addPluginData(string $pluginKey, mixed $data): void; ```php @@ -547,7 +547,7 @@ public function getAbsoluteFileName(): null|string; ```php @@ -633,7 +633,7 @@ public function getCachedEntityDependencies(): array; ```php @@ -664,7 +664,7 @@ public function getCasesNames(): array; ```php @@ -722,7 +722,7 @@ public function getConstant(string $constantName, bool $unsafe = false): null|\B ```php @@ -764,7 +764,7 @@ public function getConstantEntitiesCollection(): \BumbleDocGen\LanguageHandler\P ```php @@ -820,7 +820,7 @@ public function getConstantValue(string $constantName): string|array|int|bool|nu ```php @@ -864,7 +864,7 @@ public function getConstants(): array; ```php @@ -916,7 +916,7 @@ public function getConstantsData(bool $onlyFromCurrentClassAndTraits = false, in ```php @@ -1123,7 +1123,7 @@ public function getDocComment(): string; ```php @@ -1206,7 +1206,7 @@ public function getDocNote(): string; ```php @@ -1239,7 +1239,7 @@ public function getDocRender(): \BumbleDocGen\Core\Renderer\EntityDocRenderer\En ```php @@ -1269,7 +1269,7 @@ public function getEndLine(): int; ```php @@ -1292,7 +1292,7 @@ public function getEntityDependencies(): array; ```php @@ -1340,7 +1340,7 @@ public function getEnumCaseValue(string $name): mixed; ```php @@ -1401,7 +1401,7 @@ public function getExamples(): array; ```php @@ -1508,7 +1508,7 @@ public function getFirstExample(): string; ```php @@ -1559,7 +1559,7 @@ public function getInterfaceNames(): array; ```php @@ -1589,7 +1589,7 @@ public function getInterfacesEntities(): array; ```php @@ -1647,7 +1647,7 @@ public function getMethod(string $methodName, bool $unsafe = false): null|\Bumbl ```php @@ -1689,7 +1689,7 @@ public function getMethodEntitiesCollection(): \BumbleDocGen\LanguageHandler\Php ```php @@ -1733,7 +1733,7 @@ public function getMethods(): array; ```php @@ -1785,7 +1785,7 @@ public function getMethodsData(bool $onlyFromCurrentClassAndTraits = false, int ```php @@ -1806,7 +1806,7 @@ public function getModifiersString(): string; ```php @@ -1829,7 +1829,7 @@ public function getName(): string; ```php @@ -1852,7 +1852,7 @@ public function getNamespaceName(): string; ```php @@ -1875,7 +1875,7 @@ public function getObjectId(): string; ```php @@ -1898,7 +1898,7 @@ public function getParentClass(): null|\BumbleDocGen\LanguageHandler\Php\Parser\ ```php @@ -1921,7 +1921,7 @@ public function getParentClassEntities(): array; ```php @@ -1944,7 +1944,7 @@ public function getParentClassName(): null|string; ```php @@ -1967,7 +1967,7 @@ public function getParentClassNames(): array; ```php @@ -2007,7 +2007,7 @@ public function getPluginData(string $pluginKey): mixed; ```php @@ -2051,7 +2051,7 @@ public function getProperties(): array; ```php @@ -2103,7 +2103,7 @@ public function getPropertiesData(bool $onlyFromCurrentClassAndTraits = false, i ```php @@ -2161,7 +2161,7 @@ public function getProperty(string $propertyName, bool $unsafe = false): null|\B ```php @@ -2217,7 +2217,7 @@ public function getPropertyDefaultValue(string $propertyName): string|array|int| ```php @@ -2259,7 +2259,7 @@ public function getPropertyEntitiesCollection(): \BumbleDocGen\LanguageHandler\P ```php @@ -2288,7 +2288,7 @@ public function getRelativeFileName(): null|string; ```php @@ -2311,7 +2311,7 @@ public function getRootEntityCollection(): \BumbleDocGen\LanguageHandler\Php\Par ```php @@ -2334,7 +2334,7 @@ public function getShortName(): string; ```php @@ -2424,7 +2424,7 @@ public function getThrowsDocBlockLinks(): array; ```php @@ -2454,7 +2454,7 @@ public function getTraits(): array; ```php @@ -2484,7 +2484,7 @@ public function getTraitsNames(): array; ```php @@ -2602,7 +2602,7 @@ public function hasExamples(): bool; ```php @@ -2660,7 +2660,7 @@ public function hasMethod(string $methodName, bool $unsafe = false): bool; ```php @@ -2700,7 +2700,7 @@ public function hasParentClass(string $parentClassName): bool; ```php @@ -2788,7 +2788,7 @@ public function hasThrows(): bool; ```php @@ -2818,7 +2818,7 @@ public function hasTraits(): bool; ```php @@ -2865,7 +2865,7 @@ public function implementsInterface(string $interfaceName): bool; ```php @@ -2918,7 +2918,7 @@ public function isApi(): bool; ```php @@ -2941,7 +2941,7 @@ public function isClass(): bool; ```php @@ -2994,7 +2994,7 @@ public function isDeprecated(): bool; ```php @@ -3077,7 +3077,7 @@ public function isEntityDataCacheOutdated(): bool; ```php @@ -3198,7 +3198,7 @@ public function isEnum(): bool; ```php @@ -3221,7 +3221,7 @@ public function isExternalLibraryEntity(): bool; ```php @@ -3244,7 +3244,7 @@ public function isInGit(): bool; ```php @@ -3267,7 +3267,7 @@ public function isInstantiable(): bool; ```php @@ -3320,7 +3320,7 @@ public function isInternal(): bool; ```php @@ -3367,7 +3367,7 @@ public function isSubclassOf(string $className): bool; ```php @@ -3390,7 +3390,7 @@ public function isTrait(): bool; ```php @@ -3399,7 +3399,7 @@ public function isTrait(): bool; public static function normalizeClassName(string $name): string; ``` - +
        Bring the class name to the standard format used in the system
        Parameters: @@ -3523,7 +3523,7 @@ public function removeNotUsedEntityDataCache(): void; ```php diff --git a/docs/tech/2.parser/classes/InterfaceEntity.md b/docs/tech/2.parser/classes/InterfaceEntity.md index ed8b2aef..de68126c 100644 --- a/docs/tech/2.parser/classes/InterfaceEntity.md +++ b/docs/tech/2.parser/classes/InterfaceEntity.md @@ -293,7 +293,7 @@ See: - Check if an entity is a Trait
      • normalizeClassName -
      • + - Bring the class name to the standard format used in the system
      • reloadEntityDependenciesCache - Update entity dependency cache
      • @@ -405,7 +405,7 @@ public function __construct(\BumbleDocGen\Core\Configuration\Configuration $conf ```php @@ -450,7 +450,7 @@ public function addPluginData(string $pluginKey, mixed $data): void; ```php @@ -538,7 +538,7 @@ public function getAbsoluteFileName(): null|string; ```php @@ -624,7 +624,7 @@ public function getCachedEntityDependencies(): array; ```php @@ -682,7 +682,7 @@ public function getConstant(string $constantName, bool $unsafe = false): null|\B ```php @@ -724,7 +724,7 @@ public function getConstantEntitiesCollection(): \BumbleDocGen\LanguageHandler\P ```php @@ -780,7 +780,7 @@ public function getConstantValue(string $constantName): string|array|int|bool|nu ```php @@ -824,7 +824,7 @@ public function getConstants(): array; ```php @@ -876,7 +876,7 @@ public function getConstantsData(bool $onlyFromCurrentClassAndTraits = false, in ```php @@ -1083,7 +1083,7 @@ public function getDocComment(): string; ```php @@ -1166,7 +1166,7 @@ public function getDocNote(): string; ```php @@ -1199,7 +1199,7 @@ public function getDocRender(): \BumbleDocGen\Core\Renderer\EntityDocRenderer\En ```php @@ -1229,7 +1229,7 @@ public function getEndLine(): int; ```php @@ -1282,7 +1282,7 @@ public function getExamples(): array; ```php @@ -1389,7 +1389,7 @@ public function getFirstExample(): string; ```php @@ -1412,7 +1412,7 @@ public function getImplementingClass(): \BumbleDocGen\LanguageHandler\Php\Parser ```php @@ -1442,7 +1442,7 @@ public function getInterfaceNames(): array; ```php @@ -1472,7 +1472,7 @@ public function getInterfacesEntities(): array; ```php @@ -1530,7 +1530,7 @@ public function getMethod(string $methodName, bool $unsafe = false): null|\Bumbl ```php @@ -1572,7 +1572,7 @@ public function getMethodEntitiesCollection(): \BumbleDocGen\LanguageHandler\Php ```php @@ -1616,7 +1616,7 @@ public function getMethods(): array; ```php @@ -1689,7 +1689,7 @@ public function getModifiersString(): string; ```php @@ -1712,7 +1712,7 @@ public function getName(): string; ```php @@ -1735,7 +1735,7 @@ public function getNamespaceName(): string; ```php @@ -1758,7 +1758,7 @@ public function getObjectId(): string; ```php @@ -1781,7 +1781,7 @@ public function getParentClass(): null|\BumbleDocGen\LanguageHandler\Php\Parser\ ```php @@ -1804,7 +1804,7 @@ public function getParentClassEntities(): array; ```php @@ -1827,7 +1827,7 @@ public function getParentClassName(): null|string; ```php @@ -1850,7 +1850,7 @@ public function getParentClassNames(): array; ```php @@ -1890,7 +1890,7 @@ public function getPluginData(string $pluginKey): mixed; ```php @@ -1934,7 +1934,7 @@ public function getProperties(): array; ```php @@ -1986,7 +1986,7 @@ public function getPropertiesData(bool $onlyFromCurrentClassAndTraits = false, i ```php @@ -2044,7 +2044,7 @@ public function getProperty(string $propertyName, bool $unsafe = false): null|\B ```php @@ -2100,7 +2100,7 @@ public function getPropertyDefaultValue(string $propertyName): string|array|int| ```php @@ -2142,7 +2142,7 @@ public function getPropertyEntitiesCollection(): \BumbleDocGen\LanguageHandler\P ```php @@ -2171,7 +2171,7 @@ public function getRelativeFileName(): null|string; ```php @@ -2194,7 +2194,7 @@ public function getRootEntityCollection(): \BumbleDocGen\LanguageHandler\Php\Par ```php @@ -2217,7 +2217,7 @@ public function getShortName(): string; ```php @@ -2307,7 +2307,7 @@ public function getThrowsDocBlockLinks(): array; ```php @@ -2365,7 +2365,7 @@ public function getTraitsNames(): array; ```php @@ -2483,7 +2483,7 @@ public function hasExamples(): bool; ```php @@ -2541,7 +2541,7 @@ public function hasMethod(string $methodName, bool $unsafe = false): bool; ```php @@ -2581,7 +2581,7 @@ public function hasParentClass(string $parentClassName): bool; ```php @@ -2669,7 +2669,7 @@ public function hasThrows(): bool; ```php @@ -2699,7 +2699,7 @@ public function hasTraits(): bool; ```php @@ -2797,7 +2797,7 @@ public function isApi(): bool; ```php @@ -2820,7 +2820,7 @@ public function isClass(): bool; ```php @@ -2873,7 +2873,7 @@ public function isDeprecated(): bool; ```php @@ -2956,7 +2956,7 @@ public function isEntityDataCacheOutdated(): bool; ```php @@ -3056,7 +3056,7 @@ public static function isEntityNameValid(string $entityName): bool; ```php @@ -3079,7 +3079,7 @@ public function isEnum(): bool; ```php @@ -3102,7 +3102,7 @@ public function isExternalLibraryEntity(): bool; ```php @@ -3125,7 +3125,7 @@ public function isInGit(): bool; ```php @@ -3199,7 +3199,7 @@ public function isInternal(): bool; ```php @@ -3246,7 +3246,7 @@ public function isSubclassOf(string $className): bool; ```php @@ -3269,7 +3269,7 @@ public function isTrait(): bool; ```php @@ -3278,7 +3278,7 @@ public function isTrait(): bool; public static function normalizeClassName(string $name): string; ``` - +
        Bring the class name to the standard format used in the system
        Parameters: @@ -3402,7 +3402,7 @@ public function removeNotUsedEntityDataCache(): void; ```php diff --git a/docs/tech/2.parser/classes/MethodEntitiesCollection.md b/docs/tech/2.parser/classes/MethodEntitiesCollection.md index 4d88bd7f..e6d5c296 100644 --- a/docs/tech/2.parser/classes/MethodEntitiesCollection.md +++ b/docs/tech/2.parser/classes/MethodEntitiesCollection.md @@ -50,16 +50,16 @@ final class MethodEntitiesCollection extends \BumbleDocGen\Core\Parser\Entity\Ba
      • has -
      • + - Check if an entity has been added to the collection
      • isEmpty -
      • + - Check if the collection is empty or not
      • loadMethodEntities - Load method entities into the collection according to the project configuration
      • remove -
      • + - Remove an entity from a collection
      • unsafeGet - Get the method entity if it exists. If the method exists but has not been loaded into the collection, a new entity object will be created
      • @@ -276,7 +276,7 @@ public function getIterator(): \Generator; ```php @@ -285,7 +285,7 @@ public function getIterator(): \Generator; public function has(string $objectName): bool; ``` - +
        Check if an entity has been added to the collection
        Parameters: @@ -316,7 +316,7 @@ public function has(string $objectName): bool; ```php @@ -325,7 +325,7 @@ public function has(string $objectName): bool; public function isEmpty(): bool; ``` - +
        Check if the collection is empty or not
        Parameters: not specified @@ -379,7 +379,7 @@ public function loadMethodEntities(): void; ```php @@ -388,7 +388,7 @@ public function loadMethodEntities(): void; public function remove(string $objectName): void; ``` - +
        Remove an entity from a collection
        Parameters: diff --git a/docs/tech/2.parser/classes/PhpEntitiesCollection.md b/docs/tech/2.parser/classes/PhpEntitiesCollection.md index 33f6ef8c..19161dc2 100644 --- a/docs/tech/2.parser/classes/PhpEntitiesCollection.md +++ b/docs/tech/2.parser/classes/PhpEntitiesCollection.md @@ -35,34 +35,31 @@ final class PhpEntitiesCollection extends \BumbleDocGen\Core\Parser\Entity\Logga
        1. add -
        2. + - Add an entity to the collection
        3. clearOperationsLogCollection
        4. filterByInterfaces - - Retrieving all entities that implement the specified interfaces. Filtering is only available for ClassLikeEntity.
        5. + - Get a copy of the current collection only with entities filtered by interfaces names (filtering is only available for ClassLikeEntity)
        6. filterByNameRegularExpression -
        7. + - Get a copy of the current collection with only entities whose names match the regular expression
        8. filterByParentClassNames - - Retrieving all entities that inherit from the specified classes. Filtering is only available for ClassLikeEntity.
        9. + - Get a copy of the current collection only with entities filtered by parent classes names (filtering is only available for ClassLikeEntity)
        10. filterByPaths - - Filtering entities by relative files paths (from project_root) of the project
        11. + - Get a copy of the current collection only with entities filtered by file paths (from project_root)
        12. findEntity -
        13. + - Find an entity in a collection
        14. get -
        15. -
        16. - getEntityByClassName -
        17. + - Get an entity from a collection (only previously added)
        18. getEntityCollectionName -
        19. + - Get collection name
        20. getEntityLinkData
        21. @@ -71,28 +68,25 @@ final class PhpEntitiesCollection extends \BumbleDocGen\Core\Parser\Entity\Logga
        22. getLoadedOrCreateNew -
        23. + - Get an entity from the collection or create a new one if it has not yet been added
        24. getOnlyAbstractClasses -
        25. + - Get a copy of the current collection with only abstract classes
        26. getOnlyInstantiable - - Retrieving only instantiable entities. Filtering is only available for ClassLikeEntity.
        27. + - Get a copy of the current collection with only instantiable entities
        28. getOnlyInterfaces -
        29. + - Get a copy of the current collection with only interfaces
        30. getOnlyTraits -
        31. + - Get a copy of the current collection with only traits
        32. getOperationsLogCollection
        33. -
        34. - getPluginEventDispatcher -
        35. has -
        36. + - Check if an entity has been added to the collection
        37. internalFindEntity
        38. @@ -101,7 +95,7 @@ final class PhpEntitiesCollection extends \BumbleDocGen\Core\Parser\Entity\Logga
        39. isEmpty -
        40. + - Check if the collection is empty or not
        41. loadEntities - Load entities into a collection
        42. @@ -110,10 +104,10 @@ final class PhpEntitiesCollection extends \BumbleDocGen\Core\Parser\Entity\Logga - Load entities into a collection by configuration
        43. remove -
        44. + - Remove an entity from a collection
        45. toArray -
        46. + - Convert collection to array
        47. updateEntitiesCache
        48. @@ -211,14 +205,14 @@ public function __construct(\BumbleDocGen\Core\Configuration\Configuration $conf ```php public function add(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity $classEntity, bool $reload = false): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; ``` - +
          Add an entity to the collection
          Parameters: @@ -284,14 +278,14 @@ public function clearOperationsLogCollection(): void; ```php public function filterByInterfaces(array $interfaces): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; ``` -
          Retrieving all entities that implement the specified interfaces. Filtering is only available for ClassLikeEntity.
          +
          Get a copy of the current collection only with entities filtered by interfaces names (filtering is only available for ClassLikeEntity)
          Parameters: @@ -329,14 +323,14 @@ public function filterByInterfaces(array $interfaces): \BumbleDocGen\LanguageHan ```php public function filterByNameRegularExpression(string $regexPattern): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; ``` - +
          Get a copy of the current collection with only entities whose names match the regular expression
          Parameters: @@ -367,14 +361,14 @@ public function filterByNameRegularExpression(string $regexPattern): \BumbleDocG ```php public function filterByParentClassNames(array $parentClassNames): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; ``` -
          Retrieving all entities that inherit from the specified classes. Filtering is only available for ClassLikeEntity.
          +
          Get a copy of the current collection only with entities filtered by parent classes names (filtering is only available for ClassLikeEntity)
          Parameters: @@ -412,14 +406,14 @@ public function filterByParentClassNames(array $parentClassNames): \BumbleDocGen ```php public function filterByPaths(array $paths): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; ``` -
          Filtering entities by relative files paths (from project_root) of the project
          +
          Get a copy of the current collection only with entities filtered by file paths (from project_root)
          Parameters: @@ -466,7 +460,7 @@ public function filterByPaths(array $paths): \BumbleDocGen\LanguageHandler\Php\P public function findEntity(string $search, bool $useUnsafeKeys = true): null|\BumbleDocGen\Core\Parser\Entity\RootEntityInterface; ``` - +
          Find an entity in a collection
          Parameters: @@ -511,7 +505,7 @@ public function findEntity(string $search, bool $useUnsafeKeys = true): null|\Bu public function get(string $objectName): null|\BumbleDocGen\Core\Parser\Entity\RootEntityInterface; ``` - +
          Get an entity from a collection (only previously added)
          Parameters: @@ -535,49 +529,6 @@ public function get(string $objectName): null|\BumbleDocGen\Core\Parser\Entity\R Return value: null | \BumbleDocGen\Core\Parser\Entity\RootEntityInterface - -
          -
          - - - -```php -public function getEntityByClassName(string $className, bool $createIfNotExists = true): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
          NameTypeDescription
          $classNamestring-
          $createIfNotExistsbool-
          - -Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -

          @@ -585,14 +536,14 @@ public function getEntityByClassName(string $className, bool $createIfNotExists ```php public function getEntityCollectionName(): string; ``` - +
          Get collection name
          Parameters: not specified @@ -606,7 +557,7 @@ public function getEntityCollectionName(): string; ```php @@ -687,7 +638,7 @@ public function getIterator(): \Generator; public function getLoadedOrCreateNew(string $objectName, bool $withAddClassEntityToCollectionEvent = false): \BumbleDocGen\Core\Parser\Entity\RootEntityInterface; ``` - +
          Get an entity from the collection or create a new one if it has not yet been added
          Parameters: @@ -729,14 +680,14 @@ public function getLoadedOrCreateNew(string $objectName, bool $withAddClassEntit ```php public function getOnlyAbstractClasses(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; ``` - +
          Get a copy of the current collection with only abstract classes
          Parameters: not specified @@ -757,14 +708,14 @@ public function getOnlyAbstractClasses(): \BumbleDocGen\LanguageHandler\Php\Pars ```php public function getOnlyInstantiable(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; ``` -
          Retrieving only instantiable entities. Filtering is only available for ClassLikeEntity.
          +
          Get a copy of the current collection with only instantiable entities
          Parameters: not specified @@ -778,14 +729,14 @@ public function getOnlyInstantiable(): \BumbleDocGen\LanguageHandler\Php\Parser\ ```php public function getOnlyInterfaces(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; ``` - +
          Get a copy of the current collection with only interfaces
          Parameters: not specified @@ -799,14 +750,14 @@ public function getOnlyInterfaces(): \BumbleDocGen\LanguageHandler\Php\Parser\En ```php public function getOnlyTraits(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; ``` - +
          Get a copy of the current collection with only traits
          Parameters: not specified @@ -836,27 +787,6 @@ public function getOperationsLogCollection(): \BumbleDocGen\Core\Parser\Entity\C Return value: \BumbleDocGen\Core\Parser\Entity\CollectionLogOperation\OperationsCollection -
          -
          -
          - - - -```php -public function getPluginEventDispatcher(): \BumbleDocGen\Core\Plugin\PluginEventDispatcher; -``` - - - -Parameters: not specified - -Return value: \BumbleDocGen\Core\Plugin\PluginEventDispatcher - -

          @@ -864,7 +794,7 @@ public function getPluginEventDispatcher(): \BumbleDocGen\Core\Plugin\PluginEven ```php @@ -873,7 +803,7 @@ public function getPluginEventDispatcher(): \BumbleDocGen\Core\Plugin\PluginEven public function has(string $objectName): bool; ``` - +
          Check if an entity has been added to the collection
          Parameters: @@ -904,7 +834,7 @@ public function has(string $objectName): bool; ```php @@ -964,7 +894,7 @@ $entitiesCollection->findEntity('https://github.com/bumble-tech/bumble-doc-gen/b ```php @@ -1020,7 +950,7 @@ public function internalGetLoadedOrCreateNew(string $objectName, bool $withAddCl ```php @@ -1029,7 +959,7 @@ public function internalGetLoadedOrCreateNew(string $objectName, bool $withAddCl public function isEmpty(): bool; ``` - +
          Check if the collection is empty or not
          Parameters: not specified @@ -1043,7 +973,7 @@ public function isEmpty(): bool; ```php @@ -1107,7 +1037,7 @@ public function loadEntities(\BumbleDocGen\Core\Parser\SourceLocator\SourceLocat ```php @@ -1161,7 +1091,7 @@ public function loadEntitiesByConfiguration(\BumbleDocGen\Core\Parser\Entity\Ent ```php @@ -1170,7 +1100,7 @@ public function loadEntitiesByConfiguration(\BumbleDocGen\Core\Parser\Entity\Ent public function remove(string $objectName): void; ``` - +
          Remove an entity from a collection
          Parameters: @@ -1201,7 +1131,7 @@ public function remove(string $objectName): void; ```php @@ -1210,7 +1140,7 @@ public function remove(string $objectName): void; public function toArray(): array; ``` - +
          Convert collection to array
          Parameters: not specified @@ -1224,7 +1154,7 @@ public function toArray(): array; ```php diff --git a/docs/tech/2.parser/classes/PropertyEntitiesCollection.md b/docs/tech/2.parser/classes/PropertyEntitiesCollection.md index 792b7054..501bf6b7 100644 --- a/docs/tech/2.parser/classes/PropertyEntitiesCollection.md +++ b/docs/tech/2.parser/classes/PropertyEntitiesCollection.md @@ -44,16 +44,16 @@ final class PropertyEntitiesCollection extends \BumbleDocGen\Core\Parser\Entity\
        49. has -
        50. + - Check if an entity has been added to the collection
        51. isEmpty -
        52. + - Check if the collection is empty or not
        53. loadPropertyEntities - Load property entities into the collection according to the project configuration
        54. remove -
        55. + - Remove an entity from a collection
        56. unsafeGet - Get the property entity if it exists. If the property exists but has not been loaded into the collection, a new entity object will be created
        57. @@ -223,7 +223,7 @@ public function getIterator(): \Generator; ```php @@ -232,7 +232,7 @@ public function getIterator(): \Generator; public function has(string $objectName): bool; ``` - +
          Check if an entity has been added to the collection
          Parameters: @@ -263,7 +263,7 @@ public function has(string $objectName): bool; ```php @@ -272,7 +272,7 @@ public function has(string $objectName): bool; public function isEmpty(): bool; ``` - +
          Check if the collection is empty or not
          Parameters: not specified @@ -326,7 +326,7 @@ public function loadPropertyEntities(): void; ```php @@ -335,7 +335,7 @@ public function loadPropertyEntities(): void; public function remove(string $objectName): void; ``` - +
          Remove an entity from a collection
          Parameters: diff --git a/docs/tech/2.parser/classes/RootEntityCollection.md b/docs/tech/2.parser/classes/RootEntityCollection.md index c804adb5..c7e3c95a 100644 --- a/docs/tech/2.parser/classes/RootEntityCollection.md +++ b/docs/tech/2.parser/classes/RootEntityCollection.md @@ -28,13 +28,13 @@ abstract class RootEntityCollection extends \BumbleDocGen\Core\Parser\Entity\Bas
          1. findEntity -
          2. + - Find an entity in a collection
          3. get -
          4. + - Get an entity from a collection (only previously added)
          5. getEntityCollectionName -
          6. + - Get collection name
          7. getEntityLinkData
          8. @@ -43,13 +43,13 @@ abstract class RootEntityCollection extends \BumbleDocGen\Core\Parser\Entity\Bas
          9. getLoadedOrCreateNew -
          10. + - Get an entity from the collection or create a new one if it has not yet been added
          11. has -
          12. + - Check if an entity has been added to the collection
          13. isEmpty -
          14. + - Check if the collection is empty or not
          15. loadEntities
          16. @@ -58,10 +58,10 @@ abstract class RootEntityCollection extends \BumbleDocGen\Core\Parser\Entity\Bas
          17. remove -
          18. + - Remove an entity from a collection
          19. toArray -
          20. + - Convert collection to array
          21. updateEntitiesCache
          22. @@ -80,14 +80,14 @@ abstract class RootEntityCollection extends \BumbleDocGen\Core\Parser\Entity\Bas ```php public function findEntity(string $search, bool $useUnsafeKeys = true): null|\BumbleDocGen\Core\Parser\Entity\RootEntityInterface; ``` - +
            Find an entity in a collection
            Parameters: @@ -123,14 +123,14 @@ public function findEntity(string $search, bool $useUnsafeKeys = true): null|\Bu ```php public function get(string $objectName): null|\BumbleDocGen\Core\Parser\Entity\RootEntityInterface; ``` - +
            Get an entity from a collection (only previously added)
            Parameters: @@ -161,14 +161,14 @@ public function get(string $objectName): null|\BumbleDocGen\Core\Parser\Entity\R ```php public function getEntityCollectionName(): string; ``` - +
            Get collection name
            Parameters: not specified @@ -182,7 +182,7 @@ public function getEntityCollectionName(): string; ```php @@ -254,14 +254,14 @@ public function getIterator(): \Generator; ```php public function getLoadedOrCreateNew(string $objectName, bool $withAddClassEntityToCollectionEvent = false): \BumbleDocGen\Core\Parser\Entity\RootEntityInterface; ``` - +
            Get an entity from the collection or create a new one if it has not yet been added
            Parameters: @@ -303,7 +303,7 @@ public function getLoadedOrCreateNew(string $objectName, bool $withAddClassEntit ```php @@ -312,7 +312,7 @@ public function getLoadedOrCreateNew(string $objectName, bool $withAddClassEntit public function has(string $objectName): bool; ``` - +
            Check if an entity has been added to the collection
            Parameters: @@ -343,7 +343,7 @@ public function has(string $objectName): bool; ```php @@ -352,7 +352,7 @@ public function has(string $objectName): bool; public function isEmpty(): bool; ``` - +
            Check if the collection is empty or not
            Parameters: not specified @@ -452,7 +452,7 @@ public function loadEntitiesByConfiguration(\BumbleDocGen\Core\Parser\Entity\Ent ```php @@ -461,7 +461,7 @@ public function loadEntitiesByConfiguration(\BumbleDocGen\Core\Parser\Entity\Ent public function remove(string $objectName): void; ``` - +
            Remove an entity from a collection
            Parameters: @@ -492,14 +492,14 @@ public function remove(string $objectName): void; ```php public function toArray(): array; ``` - +
            Convert collection to array
            Parameters: not specified @@ -513,7 +513,7 @@ public function toArray(): array; ```php diff --git a/docs/tech/2.parser/classes/TraitEntity.md b/docs/tech/2.parser/classes/TraitEntity.md index 62f9f6b6..e96fdc13 100644 --- a/docs/tech/2.parser/classes/TraitEntity.md +++ b/docs/tech/2.parser/classes/TraitEntity.md @@ -293,7 +293,7 @@ See: - Check if an entity is a Trait
          23. normalizeClassName -
          24. + - Bring the class name to the standard format used in the system
          25. reloadEntityDependenciesCache - Update entity dependency cache
          26. @@ -405,7 +405,7 @@ public function __construct(\BumbleDocGen\Core\Configuration\Configuration $conf ```php @@ -450,7 +450,7 @@ public function addPluginData(string $pluginKey, mixed $data): void; ```php @@ -538,7 +538,7 @@ public function getAbsoluteFileName(): null|string; ```php @@ -624,7 +624,7 @@ public function getCachedEntityDependencies(): array; ```php @@ -682,7 +682,7 @@ public function getConstant(string $constantName, bool $unsafe = false): null|\B ```php @@ -724,7 +724,7 @@ public function getConstantEntitiesCollection(): \BumbleDocGen\LanguageHandler\P ```php @@ -780,7 +780,7 @@ public function getConstantValue(string $constantName): string|array|int|bool|nu ```php @@ -824,7 +824,7 @@ public function getConstants(): array; ```php @@ -876,7 +876,7 @@ public function getConstantsData(bool $onlyFromCurrentClassAndTraits = false, in ```php @@ -1083,7 +1083,7 @@ public function getDocComment(): string; ```php @@ -1166,7 +1166,7 @@ public function getDocNote(): string; ```php @@ -1199,7 +1199,7 @@ public function getDocRender(): \BumbleDocGen\Core\Renderer\EntityDocRenderer\En ```php @@ -1229,7 +1229,7 @@ public function getEndLine(): int; ```php @@ -1282,7 +1282,7 @@ public function getExamples(): array; ```php @@ -1389,7 +1389,7 @@ public function getFirstExample(): string; ```php @@ -1440,7 +1440,7 @@ public function getInterfaceNames(): array; ```php @@ -1470,7 +1470,7 @@ public function getInterfacesEntities(): array; ```php @@ -1528,7 +1528,7 @@ public function getMethod(string $methodName, bool $unsafe = false): null|\Bumbl ```php @@ -1570,7 +1570,7 @@ public function getMethodEntitiesCollection(): \BumbleDocGen\LanguageHandler\Php ```php @@ -1614,7 +1614,7 @@ public function getMethods(): array; ```php @@ -1687,7 +1687,7 @@ public function getModifiersString(): string; ```php @@ -1710,7 +1710,7 @@ public function getName(): string; ```php @@ -1733,7 +1733,7 @@ public function getNamespaceName(): string; ```php @@ -1756,7 +1756,7 @@ public function getObjectId(): string; ```php @@ -1779,7 +1779,7 @@ public function getParentClass(): null|\BumbleDocGen\LanguageHandler\Php\Parser\ ```php @@ -1802,7 +1802,7 @@ public function getParentClassEntities(): array; ```php @@ -1825,7 +1825,7 @@ public function getParentClassName(): null|string; ```php @@ -1848,7 +1848,7 @@ public function getParentClassNames(): array; ```php @@ -1888,7 +1888,7 @@ public function getPluginData(string $pluginKey): mixed; ```php @@ -1932,7 +1932,7 @@ public function getProperties(): array; ```php @@ -1984,7 +1984,7 @@ public function getPropertiesData(bool $onlyFromCurrentClassAndTraits = false, i ```php @@ -2042,7 +2042,7 @@ public function getProperty(string $propertyName, bool $unsafe = false): null|\B ```php @@ -2098,7 +2098,7 @@ public function getPropertyDefaultValue(string $propertyName): string|array|int| ```php @@ -2140,7 +2140,7 @@ public function getPropertyEntitiesCollection(): \BumbleDocGen\LanguageHandler\P ```php @@ -2169,7 +2169,7 @@ public function getRelativeFileName(): null|string; ```php @@ -2192,7 +2192,7 @@ public function getRootEntityCollection(): \BumbleDocGen\LanguageHandler\Php\Par ```php @@ -2215,7 +2215,7 @@ public function getShortName(): string; ```php @@ -2305,7 +2305,7 @@ public function getThrowsDocBlockLinks(): array; ```php @@ -2335,7 +2335,7 @@ public function getTraits(): array; ```php @@ -2365,7 +2365,7 @@ public function getTraitsNames(): array; ```php @@ -2483,7 +2483,7 @@ public function hasExamples(): bool; ```php @@ -2541,7 +2541,7 @@ public function hasMethod(string $methodName, bool $unsafe = false): bool; ```php @@ -2581,7 +2581,7 @@ public function hasParentClass(string $parentClassName): bool; ```php @@ -2669,7 +2669,7 @@ public function hasThrows(): bool; ```php @@ -2699,7 +2699,7 @@ public function hasTraits(): bool; ```php @@ -2746,7 +2746,7 @@ public function implementsInterface(string $interfaceName): bool; ```php @@ -2799,7 +2799,7 @@ public function isApi(): bool; ```php @@ -2822,7 +2822,7 @@ public function isClass(): bool; ```php @@ -2875,7 +2875,7 @@ public function isDeprecated(): bool; ```php @@ -2958,7 +2958,7 @@ public function isEntityDataCacheOutdated(): bool; ```php @@ -3058,7 +3058,7 @@ public static function isEntityNameValid(string $entityName): bool; ```php @@ -3081,7 +3081,7 @@ public function isEnum(): bool; ```php @@ -3104,7 +3104,7 @@ public function isExternalLibraryEntity(): bool; ```php @@ -3127,7 +3127,7 @@ public function isInGit(): bool; ```php @@ -3150,7 +3150,7 @@ public function isInstantiable(): bool; ```php @@ -3269,7 +3269,7 @@ public function isTrait(): bool; ```php @@ -3278,7 +3278,7 @@ public function isTrait(): bool; public static function normalizeClassName(string $name): string; ``` - +
            Bring the class name to the standard format used in the system
            Parameters: @@ -3402,7 +3402,7 @@ public function removeNotUsedEntityDataCache(): void; ```php diff --git a/docs/tech/2.parser/entity.md b/docs/tech/2.parser/entity.md index 4552e011..918afa62 100644 --- a/docs/tech/2.parser/entity.md +++ b/docs/tech/2.parser/entity.md @@ -144,4 +144,4 @@ These classes are a convenient wrapper for accessing data in templates:

            -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
            Last modified date: Tue Nov 21 16:24:59 2023 +0300
            Page content update date: Fri Dec 15 2023
            Made with Bumble Documentation Generator
            \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
            Last modified date: Tue Nov 21 16:24:59 2023 +0300
            Page content update date: Sat Dec 16 2023
            Made with Bumble Documentation Generator
          \ No newline at end of file diff --git a/docs/tech/2.parser/entityFilterCondition.md b/docs/tech/2.parser/entityFilterCondition.md index 72b77970..684c60f9 100644 --- a/docs/tech/2.parser/entityFilterCondition.md +++ b/docs/tech/2.parser/entityFilterCondition.md @@ -78,4 +78,4 @@ Filter condition for working with entities PHP language handler:

          -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
          Last modified date: Mon Nov 20 19:18:48 2023 +0300
          Page content update date: Fri Dec 15 2023
          Made with Bumble Documentation Generator
          \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
          Last modified date: Mon Nov 20 19:18:48 2023 +0300
          Page content update date: Sat Dec 16 2023
          Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/2.parser/readme.md b/docs/tech/2.parser/readme.md index 89402dd8..023eb2b3 100644 --- a/docs/tech/2.parser/readme.md +++ b/docs/tech/2.parser/readme.md @@ -11,7 +11,7 @@ In this section, we show how the parser works and what components it consists of

          Description of the main components of the parser

          - +

          Starting the parsing process

          @@ -42,4 +42,4 @@ In this section, we show how the parser works and what components it consists of

          -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
          Last modified date: Wed Nov 29 11:54:40 2023 +0300
          Page content update date: Fri Dec 15 2023
          Made with Bumble Documentation Generator
          \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
          Last modified date: Wed Nov 29 11:54:40 2023 +0300
          Page content update date: Sat Dec 16 2023
          Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md b/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md index 995114f9..0acc7667 100644 --- a/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md +++ b/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md @@ -296,7 +296,7 @@ See: - Check if an entity is a Trait
        58. normalizeClassName -
        59. + - Bring the class name to the standard format used in the system
        60. reloadEntityDependenciesCache - Update entity dependency cache
        61. @@ -408,7 +408,7 @@ public function __construct(\BumbleDocGen\Core\Configuration\Configuration $conf ```php @@ -453,7 +453,7 @@ public function addPluginData(string $pluginKey, mixed $data): void; ```php @@ -541,7 +541,7 @@ public function getAbsoluteFileName(): null|string; ```php @@ -627,7 +627,7 @@ public function getCachedEntityDependencies(): array; ```php @@ -685,7 +685,7 @@ public function getConstant(string $constantName, bool $unsafe = false): null|\B ```php @@ -727,7 +727,7 @@ public function getConstantEntitiesCollection(): \BumbleDocGen\LanguageHandler\P ```php @@ -783,7 +783,7 @@ public function getConstantValue(string $constantName): string|array|int|bool|nu ```php @@ -827,7 +827,7 @@ public function getConstants(): array; ```php @@ -879,7 +879,7 @@ public function getConstantsData(bool $onlyFromCurrentClassAndTraits = false, in ```php @@ -1086,7 +1086,7 @@ public function getDocComment(): string; ```php @@ -1169,7 +1169,7 @@ public function getDocNote(): string; ```php @@ -1202,7 +1202,7 @@ public function getDocRender(): \BumbleDocGen\Core\Renderer\EntityDocRenderer\En ```php @@ -1232,7 +1232,7 @@ public function getEndLine(): int; ```php @@ -1285,7 +1285,7 @@ public function getExamples(): array; ```php @@ -1392,7 +1392,7 @@ public function getFirstExample(): string; ```php @@ -1415,7 +1415,7 @@ public function getImplementingClass(): \BumbleDocGen\LanguageHandler\Php\Parser ```php @@ -1445,7 +1445,7 @@ public function getInterfaceNames(): array; ```php @@ -1475,7 +1475,7 @@ public function getInterfacesEntities(): array; ```php @@ -1533,7 +1533,7 @@ public function getMethod(string $methodName, bool $unsafe = false): null|\Bumbl ```php @@ -1575,7 +1575,7 @@ public function getMethodEntitiesCollection(): \BumbleDocGen\LanguageHandler\Php ```php @@ -1619,7 +1619,7 @@ public function getMethods(): array; ```php @@ -1692,7 +1692,7 @@ public function getModifiersString(): string; ```php @@ -1715,7 +1715,7 @@ public function getName(): string; ```php @@ -1738,7 +1738,7 @@ public function getNamespaceName(): string; ```php @@ -1782,7 +1782,7 @@ public function getParentClass(): null|\BumbleDocGen\LanguageHandler\Php\Parser\ ```php @@ -1847,7 +1847,7 @@ public function getParentClassNames(): array; ```php @@ -1887,7 +1887,7 @@ public function getPluginData(string $pluginKey): mixed; ```php @@ -1931,7 +1931,7 @@ public function getProperties(): array; ```php @@ -1983,7 +1983,7 @@ public function getPropertiesData(bool $onlyFromCurrentClassAndTraits = false, i ```php @@ -2041,7 +2041,7 @@ public function getProperty(string $propertyName, bool $unsafe = false): null|\B ```php @@ -2097,7 +2097,7 @@ public function getPropertyDefaultValue(string $propertyName): string|array|int| ```php @@ -2139,7 +2139,7 @@ public function getPropertyEntitiesCollection(): \BumbleDocGen\LanguageHandler\P ```php @@ -2168,7 +2168,7 @@ public function getRelativeFileName(): null|string; ```php @@ -2191,7 +2191,7 @@ public function getRootEntityCollection(): \BumbleDocGen\LanguageHandler\Php\Par ```php @@ -2214,7 +2214,7 @@ public function getShortName(): string; ```php @@ -2304,7 +2304,7 @@ public function getThrowsDocBlockLinks(): array; ```php @@ -2334,7 +2334,7 @@ public function getTraits(): array; ```php @@ -2364,7 +2364,7 @@ public function getTraitsNames(): array; ```php @@ -2482,7 +2482,7 @@ public function hasExamples(): bool; ```php @@ -2540,7 +2540,7 @@ public function hasMethod(string $methodName, bool $unsafe = false): bool; ```php @@ -2580,7 +2580,7 @@ public function hasParentClass(string $parentClassName): bool; ```php @@ -2668,7 +2668,7 @@ public function hasThrows(): bool; ```php @@ -2698,7 +2698,7 @@ public function hasTraits(): bool; ```php @@ -2845,7 +2845,7 @@ public function isClass(): bool; ```php @@ -2898,7 +2898,7 @@ public function isDeprecated(): bool; ```php @@ -2981,7 +2981,7 @@ public function isEntityDataCacheOutdated(): bool; ```php @@ -3081,7 +3081,7 @@ public static function isEntityNameValid(string $entityName): bool; ```php @@ -3104,7 +3104,7 @@ public function isEnum(): bool; ```php @@ -3127,7 +3127,7 @@ public function isExternalLibraryEntity(): bool; ```php @@ -3171,7 +3171,7 @@ public function isInstantiable(): bool; ```php @@ -3224,7 +3224,7 @@ public function isInternal(): bool; ```php @@ -3271,7 +3271,7 @@ public function isSubclassOf(string $className): bool; ```php @@ -3294,7 +3294,7 @@ public function isTrait(): bool; ```php @@ -3303,7 +3303,7 @@ public function isTrait(): bool; public static function normalizeClassName(string $name): string; ``` - +
          Bring the class name to the standard format used in the system
          Parameters: @@ -3427,7 +3427,7 @@ public function removeNotUsedEntityDataCache(): void; ```php diff --git a/docs/tech/2.parser/reflectionApi/php/classes/ClassLikeEntity.md b/docs/tech/2.parser/reflectionApi/php/classes/ClassLikeEntity.md index 2688e1dd..797a6201 100644 --- a/docs/tech/2.parser/reflectionApi/php/classes/ClassLikeEntity.md +++ b/docs/tech/2.parser/reflectionApi/php/classes/ClassLikeEntity.md @@ -287,7 +287,7 @@ abstract class ClassLikeEntity extends \BumbleDocGen\LanguageHandler\Php\Parser\ - Check if an entity is a Trait
        62. normalizeClassName -
        63. + - Bring the class name to the standard format used in the system
        64. reloadEntityDependenciesCache - Update entity dependency cache
        65. @@ -397,7 +397,7 @@ public function __construct(\BumbleDocGen\Core\Configuration\Configuration $conf ```php @@ -440,7 +440,7 @@ public function addPluginData(string $pluginKey, mixed $data): void; ```php @@ -526,7 +526,7 @@ public function getAbsoluteFileName(): null|string; ```php @@ -610,7 +610,7 @@ public function getCachedEntityDependencies(): array; ```php @@ -666,7 +666,7 @@ public function getConstant(string $constantName, bool $unsafe = false): null|\B ```php @@ -706,7 +706,7 @@ public function getConstantEntitiesCollection(): \BumbleDocGen\LanguageHandler\P ```php @@ -760,7 +760,7 @@ public function getConstantValue(string $constantName): string|array|int|bool|nu ```php @@ -802,7 +802,7 @@ public function getConstants(): array; ```php @@ -852,7 +852,7 @@ public function getConstantsData(bool $onlyFromCurrentClassAndTraits = false, in ```php @@ -1057,7 +1057,7 @@ public function getDocComment(): string; ```php @@ -1138,7 +1138,7 @@ public function getDocNote(): string; ```php @@ -1169,7 +1169,7 @@ public function getDocRender(): \BumbleDocGen\Core\Renderer\EntityDocRenderer\En ```php @@ -1197,7 +1197,7 @@ public function getEndLine(): int; ```php @@ -1248,7 +1248,7 @@ public function getExamples(): array; ```php @@ -1353,7 +1353,7 @@ public function getFirstExample(): string; ```php @@ -1374,7 +1374,7 @@ public function getImplementingClass(): \BumbleDocGen\LanguageHandler\Php\Parser ```php @@ -1402,7 +1402,7 @@ public function getInterfaceNames(): array; ```php @@ -1430,7 +1430,7 @@ public function getInterfacesEntities(): array; ```php @@ -1486,7 +1486,7 @@ public function getMethod(string $methodName, bool $unsafe = false): null|\Bumbl ```php @@ -1526,7 +1526,7 @@ public function getMethodEntitiesCollection(): \BumbleDocGen\LanguageHandler\Php ```php @@ -1568,7 +1568,7 @@ public function getMethods(): array; ```php @@ -1639,7 +1639,7 @@ public function getModifiersString(): string; ```php @@ -1660,7 +1660,7 @@ public function getName(): string; ```php @@ -1681,7 +1681,7 @@ public function getNamespaceName(): string; ```php @@ -1702,7 +1702,7 @@ public function getObjectId(): string; ```php @@ -1723,7 +1723,7 @@ public function getParentClass(): null|\BumbleDocGen\LanguageHandler\Php\Parser\ ```php @@ -1744,7 +1744,7 @@ public function getParentClassEntities(): array; ```php @@ -1765,7 +1765,7 @@ public function getParentClassName(): null|string; ```php @@ -1786,7 +1786,7 @@ public function getParentClassNames(): array; ```php @@ -1824,7 +1824,7 @@ public function getPluginData(string $pluginKey): mixed; ```php @@ -1866,7 +1866,7 @@ public function getProperties(): array; ```php @@ -1916,7 +1916,7 @@ public function getPropertiesData(bool $onlyFromCurrentClassAndTraits = false, i ```php @@ -1972,7 +1972,7 @@ public function getProperty(string $propertyName, bool $unsafe = false): null|\B ```php @@ -2026,7 +2026,7 @@ public function getPropertyDefaultValue(string $propertyName): string|array|int| ```php @@ -2066,7 +2066,7 @@ public function getPropertyEntitiesCollection(): \BumbleDocGen\LanguageHandler\P ```php @@ -2093,7 +2093,7 @@ public function getRelativeFileName(): null|string; ```php @@ -2114,7 +2114,7 @@ public function getRootEntityCollection(): \BumbleDocGen\LanguageHandler\Php\Par ```php @@ -2135,7 +2135,7 @@ public function getShortName(): string; ```php @@ -2223,7 +2223,7 @@ public function getThrowsDocBlockLinks(): array; ```php @@ -2251,7 +2251,7 @@ public function getTraits(): array; ```php @@ -2279,7 +2279,7 @@ public function getTraitsNames(): array; ```php @@ -2395,7 +2395,7 @@ public function hasExamples(): bool; ```php @@ -2451,7 +2451,7 @@ public function hasMethod(string $methodName, bool $unsafe = false): bool; ```php @@ -2489,7 +2489,7 @@ public function hasParentClass(string $parentClassName): bool; ```php @@ -2575,7 +2575,7 @@ public function hasThrows(): bool; ```php @@ -2603,7 +2603,7 @@ public function hasTraits(): bool; ```php @@ -2648,7 +2648,7 @@ public function implementsInterface(string $interfaceName): bool; ```php @@ -2699,7 +2699,7 @@ public function isApi(): bool; ```php @@ -2720,7 +2720,7 @@ public function isClass(): bool; ```php @@ -2771,7 +2771,7 @@ public function isDeprecated(): bool; ```php @@ -2852,7 +2852,7 @@ public function isEntityDataCacheOutdated(): bool; ```php @@ -2948,7 +2948,7 @@ public static function isEntityNameValid(string $entityName): bool; ```php @@ -2969,7 +2969,7 @@ public function isEnum(): bool; ```php @@ -2990,7 +2990,7 @@ public function isExternalLibraryEntity(): bool; ```php @@ -3011,7 +3011,7 @@ public function isInGit(): bool; ```php @@ -3032,7 +3032,7 @@ public function isInstantiable(): bool; ```php @@ -3083,7 +3083,7 @@ public function isInternal(): bool; ```php @@ -3128,7 +3128,7 @@ public function isSubclassOf(string $className): bool; ```php @@ -3149,14 +3149,14 @@ public function isTrait(): bool; ```php public static function normalizeClassName(string $name): string; ``` - +
          Bring the class name to the standard format used in the system
          Parameters: @@ -3280,7 +3280,7 @@ public function removeNotUsedEntityDataCache(): void; ```php diff --git a/docs/tech/2.parser/reflectionApi/php/classes/ClassLikeEntity_2.md b/docs/tech/2.parser/reflectionApi/php/classes/ClassLikeEntity_2.md index d5a81c5c..339b07cb 100644 --- a/docs/tech/2.parser/reflectionApi/php/classes/ClassLikeEntity_2.md +++ b/docs/tech/2.parser/reflectionApi/php/classes/ClassLikeEntity_2.md @@ -287,7 +287,7 @@ abstract class ClassLikeEntity extends \BumbleDocGen\LanguageHandler\Php\Parser\ - Check if an entity is a Trait
        66. normalizeClassName -
        67. + - Bring the class name to the standard format used in the system
        68. reloadEntityDependenciesCache - Update entity dependency cache
        69. @@ -397,7 +397,7 @@ public function __construct(\BumbleDocGen\Core\Configuration\Configuration $conf ```php @@ -440,7 +440,7 @@ public function addPluginData(string $pluginKey, mixed $data): void; ```php @@ -526,7 +526,7 @@ public function getAbsoluteFileName(): null|string; ```php @@ -610,7 +610,7 @@ public function getCachedEntityDependencies(): array; ```php @@ -666,7 +666,7 @@ public function getConstant(string $constantName, bool $unsafe = false): null|\B ```php @@ -706,7 +706,7 @@ public function getConstantEntitiesCollection(): \BumbleDocGen\LanguageHandler\P ```php @@ -760,7 +760,7 @@ public function getConstantValue(string $constantName): string|array|int|bool|nu ```php @@ -802,7 +802,7 @@ public function getConstants(): array; ```php @@ -852,7 +852,7 @@ public function getConstantsData(bool $onlyFromCurrentClassAndTraits = false, in ```php @@ -1057,7 +1057,7 @@ public function getDocComment(): string; ```php @@ -1138,7 +1138,7 @@ public function getDocNote(): string; ```php @@ -1169,7 +1169,7 @@ public function getDocRender(): \BumbleDocGen\Core\Renderer\EntityDocRenderer\En ```php @@ -1197,7 +1197,7 @@ public function getEndLine(): int; ```php @@ -1248,7 +1248,7 @@ public function getExamples(): array; ```php @@ -1353,7 +1353,7 @@ public function getFirstExample(): string; ```php @@ -1374,7 +1374,7 @@ public function getImplementingClass(): \BumbleDocGen\LanguageHandler\Php\Parser ```php @@ -1402,7 +1402,7 @@ public function getInterfaceNames(): array; ```php @@ -1430,7 +1430,7 @@ public function getInterfacesEntities(): array; ```php @@ -1486,7 +1486,7 @@ public function getMethod(string $methodName, bool $unsafe = false): null|\Bumbl ```php @@ -1526,7 +1526,7 @@ public function getMethodEntitiesCollection(): \BumbleDocGen\LanguageHandler\Php ```php @@ -1568,7 +1568,7 @@ public function getMethods(): array; ```php @@ -1639,7 +1639,7 @@ public function getModifiersString(): string; ```php @@ -1660,7 +1660,7 @@ public function getName(): string; ```php @@ -1681,7 +1681,7 @@ public function getNamespaceName(): string; ```php @@ -1702,7 +1702,7 @@ public function getObjectId(): string; ```php @@ -1723,7 +1723,7 @@ public function getParentClass(): null|\BumbleDocGen\LanguageHandler\Php\Parser\ ```php @@ -1744,7 +1744,7 @@ public function getParentClassEntities(): array; ```php @@ -1765,7 +1765,7 @@ public function getParentClassName(): null|string; ```php @@ -1786,7 +1786,7 @@ public function getParentClassNames(): array; ```php @@ -1824,7 +1824,7 @@ public function getPluginData(string $pluginKey): mixed; ```php @@ -1866,7 +1866,7 @@ public function getProperties(): array; ```php @@ -1916,7 +1916,7 @@ public function getPropertiesData(bool $onlyFromCurrentClassAndTraits = false, i ```php @@ -1972,7 +1972,7 @@ public function getProperty(string $propertyName, bool $unsafe = false): null|\B ```php @@ -2026,7 +2026,7 @@ public function getPropertyDefaultValue(string $propertyName): string|array|int| ```php @@ -2066,7 +2066,7 @@ public function getPropertyEntitiesCollection(): \BumbleDocGen\LanguageHandler\P ```php @@ -2093,7 +2093,7 @@ public function getRelativeFileName(): null|string; ```php @@ -2114,7 +2114,7 @@ public function getRootEntityCollection(): \BumbleDocGen\LanguageHandler\Php\Par ```php @@ -2135,7 +2135,7 @@ public function getShortName(): string; ```php @@ -2223,7 +2223,7 @@ public function getThrowsDocBlockLinks(): array; ```php @@ -2251,7 +2251,7 @@ public function getTraits(): array; ```php @@ -2279,7 +2279,7 @@ public function getTraitsNames(): array; ```php @@ -2395,7 +2395,7 @@ public function hasExamples(): bool; ```php @@ -2451,7 +2451,7 @@ public function hasMethod(string $methodName, bool $unsafe = false): bool; ```php @@ -2489,7 +2489,7 @@ public function hasParentClass(string $parentClassName): bool; ```php @@ -2575,7 +2575,7 @@ public function hasThrows(): bool; ```php @@ -2603,7 +2603,7 @@ public function hasTraits(): bool; ```php @@ -2648,7 +2648,7 @@ public function implementsInterface(string $interfaceName): bool; ```php @@ -2699,7 +2699,7 @@ public function isApi(): bool; ```php @@ -2720,7 +2720,7 @@ public function isClass(): bool; ```php @@ -2771,7 +2771,7 @@ public function isDeprecated(): bool; ```php @@ -2852,7 +2852,7 @@ public function isEntityDataCacheOutdated(): bool; ```php @@ -2948,7 +2948,7 @@ public static function isEntityNameValid(string $entityName): bool; ```php @@ -2969,7 +2969,7 @@ public function isEnum(): bool; ```php @@ -2990,7 +2990,7 @@ public function isExternalLibraryEntity(): bool; ```php @@ -3011,7 +3011,7 @@ public function isInGit(): bool; ```php @@ -3032,7 +3032,7 @@ public function isInstantiable(): bool; ```php @@ -3083,7 +3083,7 @@ public function isInternal(): bool; ```php @@ -3128,7 +3128,7 @@ public function isSubclassOf(string $className): bool; ```php @@ -3149,14 +3149,14 @@ public function isTrait(): bool; ```php public static function normalizeClassName(string $name): string; ``` - +
          Bring the class name to the standard format used in the system
          Parameters: @@ -3280,7 +3280,7 @@ public function removeNotUsedEntityDataCache(): void; ```php diff --git a/docs/tech/2.parser/reflectionApi/php/classes/ClassLikeEntity_3.md b/docs/tech/2.parser/reflectionApi/php/classes/ClassLikeEntity_3.md index 71fe7426..faa4d1b1 100644 --- a/docs/tech/2.parser/reflectionApi/php/classes/ClassLikeEntity_3.md +++ b/docs/tech/2.parser/reflectionApi/php/classes/ClassLikeEntity_3.md @@ -287,7 +287,7 @@ abstract class ClassLikeEntity extends \BumbleDocGen\LanguageHandler\Php\Parser\ - Check if an entity is a Trait
        70. normalizeClassName -
        71. + - Bring the class name to the standard format used in the system
        72. reloadEntityDependenciesCache - Update entity dependency cache
        73. @@ -397,7 +397,7 @@ public function __construct(\BumbleDocGen\Core\Configuration\Configuration $conf ```php @@ -440,7 +440,7 @@ public function addPluginData(string $pluginKey, mixed $data): void; ```php @@ -526,7 +526,7 @@ public function getAbsoluteFileName(): null|string; ```php @@ -610,7 +610,7 @@ public function getCachedEntityDependencies(): array; ```php @@ -666,7 +666,7 @@ public function getConstant(string $constantName, bool $unsafe = false): null|\B ```php @@ -706,7 +706,7 @@ public function getConstantEntitiesCollection(): \BumbleDocGen\LanguageHandler\P ```php @@ -760,7 +760,7 @@ public function getConstantValue(string $constantName): string|array|int|bool|nu ```php @@ -802,7 +802,7 @@ public function getConstants(): array; ```php @@ -852,7 +852,7 @@ public function getConstantsData(bool $onlyFromCurrentClassAndTraits = false, in ```php @@ -1057,7 +1057,7 @@ public function getDocComment(): string; ```php @@ -1138,7 +1138,7 @@ public function getDocNote(): string; ```php @@ -1169,7 +1169,7 @@ public function getDocRender(): \BumbleDocGen\Core\Renderer\EntityDocRenderer\En ```php @@ -1197,7 +1197,7 @@ public function getEndLine(): int; ```php @@ -1248,7 +1248,7 @@ public function getExamples(): array; ```php @@ -1353,7 +1353,7 @@ public function getFirstExample(): string; ```php @@ -1374,7 +1374,7 @@ public function getImplementingClass(): \BumbleDocGen\LanguageHandler\Php\Parser ```php @@ -1402,7 +1402,7 @@ public function getInterfaceNames(): array; ```php @@ -1430,7 +1430,7 @@ public function getInterfacesEntities(): array; ```php @@ -1486,7 +1486,7 @@ public function getMethod(string $methodName, bool $unsafe = false): null|\Bumbl ```php @@ -1526,7 +1526,7 @@ public function getMethodEntitiesCollection(): \BumbleDocGen\LanguageHandler\Php ```php @@ -1568,7 +1568,7 @@ public function getMethods(): array; ```php @@ -1639,7 +1639,7 @@ public function getModifiersString(): string; ```php @@ -1660,7 +1660,7 @@ public function getName(): string; ```php @@ -1681,7 +1681,7 @@ public function getNamespaceName(): string; ```php @@ -1702,7 +1702,7 @@ public function getObjectId(): string; ```php @@ -1723,7 +1723,7 @@ public function getParentClass(): null|\BumbleDocGen\LanguageHandler\Php\Parser\ ```php @@ -1744,7 +1744,7 @@ public function getParentClassEntities(): array; ```php @@ -1765,7 +1765,7 @@ public function getParentClassName(): null|string; ```php @@ -1786,7 +1786,7 @@ public function getParentClassNames(): array; ```php @@ -1824,7 +1824,7 @@ public function getPluginData(string $pluginKey): mixed; ```php @@ -1866,7 +1866,7 @@ public function getProperties(): array; ```php @@ -1916,7 +1916,7 @@ public function getPropertiesData(bool $onlyFromCurrentClassAndTraits = false, i ```php @@ -1972,7 +1972,7 @@ public function getProperty(string $propertyName, bool $unsafe = false): null|\B ```php @@ -2026,7 +2026,7 @@ public function getPropertyDefaultValue(string $propertyName): string|array|int| ```php @@ -2066,7 +2066,7 @@ public function getPropertyEntitiesCollection(): \BumbleDocGen\LanguageHandler\P ```php @@ -2093,7 +2093,7 @@ public function getRelativeFileName(): null|string; ```php @@ -2114,7 +2114,7 @@ public function getRootEntityCollection(): \BumbleDocGen\LanguageHandler\Php\Par ```php @@ -2135,7 +2135,7 @@ public function getShortName(): string; ```php @@ -2223,7 +2223,7 @@ public function getThrowsDocBlockLinks(): array; ```php @@ -2251,7 +2251,7 @@ public function getTraits(): array; ```php @@ -2279,7 +2279,7 @@ public function getTraitsNames(): array; ```php @@ -2395,7 +2395,7 @@ public function hasExamples(): bool; ```php @@ -2451,7 +2451,7 @@ public function hasMethod(string $methodName, bool $unsafe = false): bool; ```php @@ -2489,7 +2489,7 @@ public function hasParentClass(string $parentClassName): bool; ```php @@ -2575,7 +2575,7 @@ public function hasThrows(): bool; ```php @@ -2603,7 +2603,7 @@ public function hasTraits(): bool; ```php @@ -2648,7 +2648,7 @@ public function implementsInterface(string $interfaceName): bool; ```php @@ -2699,7 +2699,7 @@ public function isApi(): bool; ```php @@ -2720,7 +2720,7 @@ public function isClass(): bool; ```php @@ -2771,7 +2771,7 @@ public function isDeprecated(): bool; ```php @@ -2852,7 +2852,7 @@ public function isEntityDataCacheOutdated(): bool; ```php @@ -2948,7 +2948,7 @@ public static function isEntityNameValid(string $entityName): bool; ```php @@ -2969,7 +2969,7 @@ public function isEnum(): bool; ```php @@ -2990,7 +2990,7 @@ public function isExternalLibraryEntity(): bool; ```php @@ -3011,7 +3011,7 @@ public function isInGit(): bool; ```php @@ -3032,7 +3032,7 @@ public function isInstantiable(): bool; ```php @@ -3083,7 +3083,7 @@ public function isInternal(): bool; ```php @@ -3128,7 +3128,7 @@ public function isSubclassOf(string $className): bool; ```php @@ -3149,14 +3149,14 @@ public function isTrait(): bool; ```php public static function normalizeClassName(string $name): string; ``` - +
          Bring the class name to the standard format used in the system
          Parameters: @@ -3280,7 +3280,7 @@ public function removeNotUsedEntityDataCache(): void; ```php diff --git a/docs/tech/2.parser/reflectionApi/php/classes/ClassLikeEntity_4.md b/docs/tech/2.parser/reflectionApi/php/classes/ClassLikeEntity_4.md index f9fe4794..892431aa 100644 --- a/docs/tech/2.parser/reflectionApi/php/classes/ClassLikeEntity_4.md +++ b/docs/tech/2.parser/reflectionApi/php/classes/ClassLikeEntity_4.md @@ -287,7 +287,7 @@ abstract class ClassLikeEntity extends \BumbleDocGen\LanguageHandler\Php\Parser\ - Check if an entity is a Trait
        74. normalizeClassName -
        75. + - Bring the class name to the standard format used in the system
        76. reloadEntityDependenciesCache - Update entity dependency cache
        77. @@ -397,7 +397,7 @@ public function __construct(\BumbleDocGen\Core\Configuration\Configuration $conf ```php @@ -440,7 +440,7 @@ public function addPluginData(string $pluginKey, mixed $data): void; ```php @@ -526,7 +526,7 @@ public function getAbsoluteFileName(): null|string; ```php @@ -610,7 +610,7 @@ public function getCachedEntityDependencies(): array; ```php @@ -666,7 +666,7 @@ public function getConstant(string $constantName, bool $unsafe = false): null|\B ```php @@ -706,7 +706,7 @@ public function getConstantEntitiesCollection(): \BumbleDocGen\LanguageHandler\P ```php @@ -760,7 +760,7 @@ public function getConstantValue(string $constantName): string|array|int|bool|nu ```php @@ -802,7 +802,7 @@ public function getConstants(): array; ```php @@ -852,7 +852,7 @@ public function getConstantsData(bool $onlyFromCurrentClassAndTraits = false, in ```php @@ -1057,7 +1057,7 @@ public function getDocComment(): string; ```php @@ -1138,7 +1138,7 @@ public function getDocNote(): string; ```php @@ -1169,7 +1169,7 @@ public function getDocRender(): \BumbleDocGen\Core\Renderer\EntityDocRenderer\En ```php @@ -1197,7 +1197,7 @@ public function getEndLine(): int; ```php @@ -1248,7 +1248,7 @@ public function getExamples(): array; ```php @@ -1353,7 +1353,7 @@ public function getFirstExample(): string; ```php @@ -1374,7 +1374,7 @@ public function getImplementingClass(): \BumbleDocGen\LanguageHandler\Php\Parser ```php @@ -1402,7 +1402,7 @@ public function getInterfaceNames(): array; ```php @@ -1430,7 +1430,7 @@ public function getInterfacesEntities(): array; ```php @@ -1486,7 +1486,7 @@ public function getMethod(string $methodName, bool $unsafe = false): null|\Bumbl ```php @@ -1526,7 +1526,7 @@ public function getMethodEntitiesCollection(): \BumbleDocGen\LanguageHandler\Php ```php @@ -1568,7 +1568,7 @@ public function getMethods(): array; ```php @@ -1639,7 +1639,7 @@ public function getModifiersString(): string; ```php @@ -1660,7 +1660,7 @@ public function getName(): string; ```php @@ -1681,7 +1681,7 @@ public function getNamespaceName(): string; ```php @@ -1702,7 +1702,7 @@ public function getObjectId(): string; ```php @@ -1723,7 +1723,7 @@ public function getParentClass(): null|\BumbleDocGen\LanguageHandler\Php\Parser\ ```php @@ -1744,7 +1744,7 @@ public function getParentClassEntities(): array; ```php @@ -1765,7 +1765,7 @@ public function getParentClassName(): null|string; ```php @@ -1786,7 +1786,7 @@ public function getParentClassNames(): array; ```php @@ -1824,7 +1824,7 @@ public function getPluginData(string $pluginKey): mixed; ```php @@ -1866,7 +1866,7 @@ public function getProperties(): array; ```php @@ -1916,7 +1916,7 @@ public function getPropertiesData(bool $onlyFromCurrentClassAndTraits = false, i ```php @@ -1972,7 +1972,7 @@ public function getProperty(string $propertyName, bool $unsafe = false): null|\B ```php @@ -2026,7 +2026,7 @@ public function getPropertyDefaultValue(string $propertyName): string|array|int| ```php @@ -2066,7 +2066,7 @@ public function getPropertyEntitiesCollection(): \BumbleDocGen\LanguageHandler\P ```php @@ -2093,7 +2093,7 @@ public function getRelativeFileName(): null|string; ```php @@ -2114,7 +2114,7 @@ public function getRootEntityCollection(): \BumbleDocGen\LanguageHandler\Php\Par ```php @@ -2135,7 +2135,7 @@ public function getShortName(): string; ```php @@ -2223,7 +2223,7 @@ public function getThrowsDocBlockLinks(): array; ```php @@ -2251,7 +2251,7 @@ public function getTraits(): array; ```php @@ -2279,7 +2279,7 @@ public function getTraitsNames(): array; ```php @@ -2395,7 +2395,7 @@ public function hasExamples(): bool; ```php @@ -2451,7 +2451,7 @@ public function hasMethod(string $methodName, bool $unsafe = false): bool; ```php @@ -2489,7 +2489,7 @@ public function hasParentClass(string $parentClassName): bool; ```php @@ -2575,7 +2575,7 @@ public function hasThrows(): bool; ```php @@ -2603,7 +2603,7 @@ public function hasTraits(): bool; ```php @@ -2648,7 +2648,7 @@ public function implementsInterface(string $interfaceName): bool; ```php @@ -2699,7 +2699,7 @@ public function isApi(): bool; ```php @@ -2720,7 +2720,7 @@ public function isClass(): bool; ```php @@ -2771,7 +2771,7 @@ public function isDeprecated(): bool; ```php @@ -2852,7 +2852,7 @@ public function isEntityDataCacheOutdated(): bool; ```php @@ -2948,7 +2948,7 @@ public static function isEntityNameValid(string $entityName): bool; ```php @@ -2969,7 +2969,7 @@ public function isEnum(): bool; ```php @@ -2990,7 +2990,7 @@ public function isExternalLibraryEntity(): bool; ```php @@ -3011,7 +3011,7 @@ public function isInGit(): bool; ```php @@ -3032,7 +3032,7 @@ public function isInstantiable(): bool; ```php @@ -3083,7 +3083,7 @@ public function isInternal(): bool; ```php @@ -3128,7 +3128,7 @@ public function isSubclassOf(string $className): bool; ```php @@ -3149,14 +3149,14 @@ public function isTrait(): bool; ```php public static function normalizeClassName(string $name): string; ``` - +
          Bring the class name to the standard format used in the system
          Parameters: @@ -3280,7 +3280,7 @@ public function removeNotUsedEntityDataCache(): void; ```php diff --git a/docs/tech/2.parser/reflectionApi/php/classes/ClassLikeEntity_5.md b/docs/tech/2.parser/reflectionApi/php/classes/ClassLikeEntity_5.md index 292cb50c..6100d437 100644 --- a/docs/tech/2.parser/reflectionApi/php/classes/ClassLikeEntity_5.md +++ b/docs/tech/2.parser/reflectionApi/php/classes/ClassLikeEntity_5.md @@ -287,7 +287,7 @@ abstract class ClassLikeEntity extends \BumbleDocGen\LanguageHandler\Php\Parser\ - Check if an entity is a Trait
        78. normalizeClassName -
        79. + - Bring the class name to the standard format used in the system
        80. reloadEntityDependenciesCache - Update entity dependency cache
        81. @@ -397,7 +397,7 @@ public function __construct(\BumbleDocGen\Core\Configuration\Configuration $conf ```php @@ -440,7 +440,7 @@ public function addPluginData(string $pluginKey, mixed $data): void; ```php @@ -526,7 +526,7 @@ public function getAbsoluteFileName(): null|string; ```php @@ -610,7 +610,7 @@ public function getCachedEntityDependencies(): array; ```php @@ -666,7 +666,7 @@ public function getConstant(string $constantName, bool $unsafe = false): null|\B ```php @@ -706,7 +706,7 @@ public function getConstantEntitiesCollection(): \BumbleDocGen\LanguageHandler\P ```php @@ -760,7 +760,7 @@ public function getConstantValue(string $constantName): string|array|int|bool|nu ```php @@ -802,7 +802,7 @@ public function getConstants(): array; ```php @@ -852,7 +852,7 @@ public function getConstantsData(bool $onlyFromCurrentClassAndTraits = false, in ```php @@ -1057,7 +1057,7 @@ public function getDocComment(): string; ```php @@ -1138,7 +1138,7 @@ public function getDocNote(): string; ```php @@ -1169,7 +1169,7 @@ public function getDocRender(): \BumbleDocGen\Core\Renderer\EntityDocRenderer\En ```php @@ -1197,7 +1197,7 @@ public function getEndLine(): int; ```php @@ -1248,7 +1248,7 @@ public function getExamples(): array; ```php @@ -1353,7 +1353,7 @@ public function getFirstExample(): string; ```php @@ -1374,7 +1374,7 @@ public function getImplementingClass(): \BumbleDocGen\LanguageHandler\Php\Parser ```php @@ -1402,7 +1402,7 @@ public function getInterfaceNames(): array; ```php @@ -1430,7 +1430,7 @@ public function getInterfacesEntities(): array; ```php @@ -1486,7 +1486,7 @@ public function getMethod(string $methodName, bool $unsafe = false): null|\Bumbl ```php @@ -1526,7 +1526,7 @@ public function getMethodEntitiesCollection(): \BumbleDocGen\LanguageHandler\Php ```php @@ -1568,7 +1568,7 @@ public function getMethods(): array; ```php @@ -1639,7 +1639,7 @@ public function getModifiersString(): string; ```php @@ -1660,7 +1660,7 @@ public function getName(): string; ```php @@ -1681,7 +1681,7 @@ public function getNamespaceName(): string; ```php @@ -1702,7 +1702,7 @@ public function getObjectId(): string; ```php @@ -1723,7 +1723,7 @@ public function getParentClass(): null|\BumbleDocGen\LanguageHandler\Php\Parser\ ```php @@ -1744,7 +1744,7 @@ public function getParentClassEntities(): array; ```php @@ -1765,7 +1765,7 @@ public function getParentClassName(): null|string; ```php @@ -1786,7 +1786,7 @@ public function getParentClassNames(): array; ```php @@ -1824,7 +1824,7 @@ public function getPluginData(string $pluginKey): mixed; ```php @@ -1866,7 +1866,7 @@ public function getProperties(): array; ```php @@ -1916,7 +1916,7 @@ public function getPropertiesData(bool $onlyFromCurrentClassAndTraits = false, i ```php @@ -1972,7 +1972,7 @@ public function getProperty(string $propertyName, bool $unsafe = false): null|\B ```php @@ -2026,7 +2026,7 @@ public function getPropertyDefaultValue(string $propertyName): string|array|int| ```php @@ -2066,7 +2066,7 @@ public function getPropertyEntitiesCollection(): \BumbleDocGen\LanguageHandler\P ```php @@ -2093,7 +2093,7 @@ public function getRelativeFileName(): null|string; ```php @@ -2114,7 +2114,7 @@ public function getRootEntityCollection(): \BumbleDocGen\LanguageHandler\Php\Par ```php @@ -2135,7 +2135,7 @@ public function getShortName(): string; ```php @@ -2223,7 +2223,7 @@ public function getThrowsDocBlockLinks(): array; ```php @@ -2251,7 +2251,7 @@ public function getTraits(): array; ```php @@ -2279,7 +2279,7 @@ public function getTraitsNames(): array; ```php @@ -2395,7 +2395,7 @@ public function hasExamples(): bool; ```php @@ -2451,7 +2451,7 @@ public function hasMethod(string $methodName, bool $unsafe = false): bool; ```php @@ -2489,7 +2489,7 @@ public function hasParentClass(string $parentClassName): bool; ```php @@ -2575,7 +2575,7 @@ public function hasThrows(): bool; ```php @@ -2603,7 +2603,7 @@ public function hasTraits(): bool; ```php @@ -2648,7 +2648,7 @@ public function implementsInterface(string $interfaceName): bool; ```php @@ -2699,7 +2699,7 @@ public function isApi(): bool; ```php @@ -2720,7 +2720,7 @@ public function isClass(): bool; ```php @@ -2771,7 +2771,7 @@ public function isDeprecated(): bool; ```php @@ -2852,7 +2852,7 @@ public function isEntityDataCacheOutdated(): bool; ```php @@ -2948,7 +2948,7 @@ public static function isEntityNameValid(string $entityName): bool; ```php @@ -2969,7 +2969,7 @@ public function isEnum(): bool; ```php @@ -2990,7 +2990,7 @@ public function isExternalLibraryEntity(): bool; ```php @@ -3011,7 +3011,7 @@ public function isInGit(): bool; ```php @@ -3032,7 +3032,7 @@ public function isInstantiable(): bool; ```php @@ -3083,7 +3083,7 @@ public function isInternal(): bool; ```php @@ -3128,7 +3128,7 @@ public function isSubclassOf(string $className): bool; ```php @@ -3149,14 +3149,14 @@ public function isTrait(): bool; ```php public static function normalizeClassName(string $name): string; ``` - +
          Bring the class name to the standard format used in the system
          Parameters: @@ -3280,7 +3280,7 @@ public function removeNotUsedEntityDataCache(): void; ```php diff --git a/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md b/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md index 83c9a973..821f1263 100644 --- a/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md +++ b/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md @@ -302,7 +302,7 @@ See: - Check if an entity is a Trait
        82. normalizeClassName -
        83. + - Bring the class name to the standard format used in the system
        84. reloadEntityDependenciesCache - Update entity dependency cache
        85. @@ -414,7 +414,7 @@ public function __construct(\BumbleDocGen\Core\Configuration\Configuration $conf ```php @@ -459,7 +459,7 @@ public function addPluginData(string $pluginKey, mixed $data): void; ```php @@ -547,7 +547,7 @@ public function getAbsoluteFileName(): null|string; ```php @@ -633,7 +633,7 @@ public function getCachedEntityDependencies(): array; ```php @@ -664,7 +664,7 @@ public function getCasesNames(): array; ```php @@ -722,7 +722,7 @@ public function getConstant(string $constantName, bool $unsafe = false): null|\B ```php @@ -764,7 +764,7 @@ public function getConstantEntitiesCollection(): \BumbleDocGen\LanguageHandler\P ```php @@ -820,7 +820,7 @@ public function getConstantValue(string $constantName): string|array|int|bool|nu ```php @@ -864,7 +864,7 @@ public function getConstants(): array; ```php @@ -916,7 +916,7 @@ public function getConstantsData(bool $onlyFromCurrentClassAndTraits = false, in ```php @@ -1123,7 +1123,7 @@ public function getDocComment(): string; ```php @@ -1206,7 +1206,7 @@ public function getDocNote(): string; ```php @@ -1239,7 +1239,7 @@ public function getDocRender(): \BumbleDocGen\Core\Renderer\EntityDocRenderer\En ```php @@ -1269,7 +1269,7 @@ public function getEndLine(): int; ```php @@ -1292,7 +1292,7 @@ public function getEntityDependencies(): array; ```php @@ -1340,7 +1340,7 @@ public function getEnumCaseValue(string $name): mixed; ```php @@ -1401,7 +1401,7 @@ public function getExamples(): array; ```php @@ -1508,7 +1508,7 @@ public function getFirstExample(): string; ```php @@ -1559,7 +1559,7 @@ public function getInterfaceNames(): array; ```php @@ -1589,7 +1589,7 @@ public function getInterfacesEntities(): array; ```php @@ -1647,7 +1647,7 @@ public function getMethod(string $methodName, bool $unsafe = false): null|\Bumbl ```php @@ -1689,7 +1689,7 @@ public function getMethodEntitiesCollection(): \BumbleDocGen\LanguageHandler\Php ```php @@ -1733,7 +1733,7 @@ public function getMethods(): array; ```php @@ -1785,7 +1785,7 @@ public function getMethodsData(bool $onlyFromCurrentClassAndTraits = false, int ```php @@ -1806,7 +1806,7 @@ public function getModifiersString(): string; ```php @@ -1829,7 +1829,7 @@ public function getName(): string; ```php @@ -1852,7 +1852,7 @@ public function getNamespaceName(): string; ```php @@ -1875,7 +1875,7 @@ public function getObjectId(): string; ```php @@ -1898,7 +1898,7 @@ public function getParentClass(): null|\BumbleDocGen\LanguageHandler\Php\Parser\ ```php @@ -1921,7 +1921,7 @@ public function getParentClassEntities(): array; ```php @@ -1944,7 +1944,7 @@ public function getParentClassName(): null|string; ```php @@ -1967,7 +1967,7 @@ public function getParentClassNames(): array; ```php @@ -2007,7 +2007,7 @@ public function getPluginData(string $pluginKey): mixed; ```php @@ -2051,7 +2051,7 @@ public function getProperties(): array; ```php @@ -2103,7 +2103,7 @@ public function getPropertiesData(bool $onlyFromCurrentClassAndTraits = false, i ```php @@ -2161,7 +2161,7 @@ public function getProperty(string $propertyName, bool $unsafe = false): null|\B ```php @@ -2217,7 +2217,7 @@ public function getPropertyDefaultValue(string $propertyName): string|array|int| ```php @@ -2259,7 +2259,7 @@ public function getPropertyEntitiesCollection(): \BumbleDocGen\LanguageHandler\P ```php @@ -2288,7 +2288,7 @@ public function getRelativeFileName(): null|string; ```php @@ -2311,7 +2311,7 @@ public function getRootEntityCollection(): \BumbleDocGen\LanguageHandler\Php\Par ```php @@ -2334,7 +2334,7 @@ public function getShortName(): string; ```php @@ -2424,7 +2424,7 @@ public function getThrowsDocBlockLinks(): array; ```php @@ -2454,7 +2454,7 @@ public function getTraits(): array; ```php @@ -2484,7 +2484,7 @@ public function getTraitsNames(): array; ```php @@ -2602,7 +2602,7 @@ public function hasExamples(): bool; ```php @@ -2660,7 +2660,7 @@ public function hasMethod(string $methodName, bool $unsafe = false): bool; ```php @@ -2700,7 +2700,7 @@ public function hasParentClass(string $parentClassName): bool; ```php @@ -2788,7 +2788,7 @@ public function hasThrows(): bool; ```php @@ -2818,7 +2818,7 @@ public function hasTraits(): bool; ```php @@ -2865,7 +2865,7 @@ public function implementsInterface(string $interfaceName): bool; ```php @@ -2918,7 +2918,7 @@ public function isApi(): bool; ```php @@ -2941,7 +2941,7 @@ public function isClass(): bool; ```php @@ -2994,7 +2994,7 @@ public function isDeprecated(): bool; ```php @@ -3077,7 +3077,7 @@ public function isEntityDataCacheOutdated(): bool; ```php @@ -3198,7 +3198,7 @@ public function isEnum(): bool; ```php @@ -3221,7 +3221,7 @@ public function isExternalLibraryEntity(): bool; ```php @@ -3244,7 +3244,7 @@ public function isInGit(): bool; ```php @@ -3267,7 +3267,7 @@ public function isInstantiable(): bool; ```php @@ -3320,7 +3320,7 @@ public function isInternal(): bool; ```php @@ -3367,7 +3367,7 @@ public function isSubclassOf(string $className): bool; ```php @@ -3390,7 +3390,7 @@ public function isTrait(): bool; ```php @@ -3399,7 +3399,7 @@ public function isTrait(): bool; public static function normalizeClassName(string $name): string; ``` - +
          Bring the class name to the standard format used in the system
          Parameters: @@ -3523,7 +3523,7 @@ public function removeNotUsedEntityDataCache(): void; ```php diff --git a/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md b/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md index 76ffa8c4..4c9f8680 100644 --- a/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md +++ b/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md @@ -293,7 +293,7 @@ See: - Check if an entity is a Trait
        86. normalizeClassName -
        87. + - Bring the class name to the standard format used in the system
        88. reloadEntityDependenciesCache - Update entity dependency cache
        89. @@ -405,7 +405,7 @@ public function __construct(\BumbleDocGen\Core\Configuration\Configuration $conf ```php @@ -450,7 +450,7 @@ public function addPluginData(string $pluginKey, mixed $data): void; ```php @@ -538,7 +538,7 @@ public function getAbsoluteFileName(): null|string; ```php @@ -624,7 +624,7 @@ public function getCachedEntityDependencies(): array; ```php @@ -682,7 +682,7 @@ public function getConstant(string $constantName, bool $unsafe = false): null|\B ```php @@ -724,7 +724,7 @@ public function getConstantEntitiesCollection(): \BumbleDocGen\LanguageHandler\P ```php @@ -780,7 +780,7 @@ public function getConstantValue(string $constantName): string|array|int|bool|nu ```php @@ -824,7 +824,7 @@ public function getConstants(): array; ```php @@ -876,7 +876,7 @@ public function getConstantsData(bool $onlyFromCurrentClassAndTraits = false, in ```php @@ -1083,7 +1083,7 @@ public function getDocComment(): string; ```php @@ -1166,7 +1166,7 @@ public function getDocNote(): string; ```php @@ -1199,7 +1199,7 @@ public function getDocRender(): \BumbleDocGen\Core\Renderer\EntityDocRenderer\En ```php @@ -1229,7 +1229,7 @@ public function getEndLine(): int; ```php @@ -1282,7 +1282,7 @@ public function getExamples(): array; ```php @@ -1389,7 +1389,7 @@ public function getFirstExample(): string; ```php @@ -1412,7 +1412,7 @@ public function getImplementingClass(): \BumbleDocGen\LanguageHandler\Php\Parser ```php @@ -1442,7 +1442,7 @@ public function getInterfaceNames(): array; ```php @@ -1472,7 +1472,7 @@ public function getInterfacesEntities(): array; ```php @@ -1530,7 +1530,7 @@ public function getMethod(string $methodName, bool $unsafe = false): null|\Bumbl ```php @@ -1572,7 +1572,7 @@ public function getMethodEntitiesCollection(): \BumbleDocGen\LanguageHandler\Php ```php @@ -1616,7 +1616,7 @@ public function getMethods(): array; ```php @@ -1689,7 +1689,7 @@ public function getModifiersString(): string; ```php @@ -1712,7 +1712,7 @@ public function getName(): string; ```php @@ -1735,7 +1735,7 @@ public function getNamespaceName(): string; ```php @@ -1758,7 +1758,7 @@ public function getObjectId(): string; ```php @@ -1781,7 +1781,7 @@ public function getParentClass(): null|\BumbleDocGen\LanguageHandler\Php\Parser\ ```php @@ -1804,7 +1804,7 @@ public function getParentClassEntities(): array; ```php @@ -1827,7 +1827,7 @@ public function getParentClassName(): null|string; ```php @@ -1850,7 +1850,7 @@ public function getParentClassNames(): array; ```php @@ -1890,7 +1890,7 @@ public function getPluginData(string $pluginKey): mixed; ```php @@ -1934,7 +1934,7 @@ public function getProperties(): array; ```php @@ -1986,7 +1986,7 @@ public function getPropertiesData(bool $onlyFromCurrentClassAndTraits = false, i ```php @@ -2044,7 +2044,7 @@ public function getProperty(string $propertyName, bool $unsafe = false): null|\B ```php @@ -2100,7 +2100,7 @@ public function getPropertyDefaultValue(string $propertyName): string|array|int| ```php @@ -2142,7 +2142,7 @@ public function getPropertyEntitiesCollection(): \BumbleDocGen\LanguageHandler\P ```php @@ -2171,7 +2171,7 @@ public function getRelativeFileName(): null|string; ```php @@ -2194,7 +2194,7 @@ public function getRootEntityCollection(): \BumbleDocGen\LanguageHandler\Php\Par ```php @@ -2217,7 +2217,7 @@ public function getShortName(): string; ```php @@ -2307,7 +2307,7 @@ public function getThrowsDocBlockLinks(): array; ```php @@ -2365,7 +2365,7 @@ public function getTraitsNames(): array; ```php @@ -2483,7 +2483,7 @@ public function hasExamples(): bool; ```php @@ -2541,7 +2541,7 @@ public function hasMethod(string $methodName, bool $unsafe = false): bool; ```php @@ -2581,7 +2581,7 @@ public function hasParentClass(string $parentClassName): bool; ```php @@ -2669,7 +2669,7 @@ public function hasThrows(): bool; ```php @@ -2699,7 +2699,7 @@ public function hasTraits(): bool; ```php @@ -2797,7 +2797,7 @@ public function isApi(): bool; ```php @@ -2820,7 +2820,7 @@ public function isClass(): bool; ```php @@ -2873,7 +2873,7 @@ public function isDeprecated(): bool; ```php @@ -2956,7 +2956,7 @@ public function isEntityDataCacheOutdated(): bool; ```php @@ -3056,7 +3056,7 @@ public static function isEntityNameValid(string $entityName): bool; ```php @@ -3079,7 +3079,7 @@ public function isEnum(): bool; ```php @@ -3102,7 +3102,7 @@ public function isExternalLibraryEntity(): bool; ```php @@ -3125,7 +3125,7 @@ public function isInGit(): bool; ```php @@ -3199,7 +3199,7 @@ public function isInternal(): bool; ```php @@ -3246,7 +3246,7 @@ public function isSubclassOf(string $className): bool; ```php @@ -3269,7 +3269,7 @@ public function isTrait(): bool; ```php @@ -3278,7 +3278,7 @@ public function isTrait(): bool; public static function normalizeClassName(string $name): string; ``` - +
          Bring the class name to the standard format used in the system
          Parameters: @@ -3402,7 +3402,7 @@ public function removeNotUsedEntityDataCache(): void; ```php diff --git a/docs/tech/2.parser/reflectionApi/php/classes/PhpEntitiesCollection.md b/docs/tech/2.parser/reflectionApi/php/classes/PhpEntitiesCollection.md new file mode 100644 index 00000000..2107e294 --- /dev/null +++ b/docs/tech/2.parser/reflectionApi/php/classes/PhpEntitiesCollection.md @@ -0,0 +1,1183 @@ + + BumbleDocGen / Technical description of the project / Parser / Reflection API / Reflection API for PHP / PHP entities collection / PhpEntitiesCollection
          + +

          + PhpEntitiesCollection class: +

          + + + + + +```php +namespace BumbleDocGen\LanguageHandler\Php\Parser\Entity; + +final class PhpEntitiesCollection extends \BumbleDocGen\Core\Parser\Entity\LoggableRootEntityCollection implements \IteratorAggregate +``` + +
          Collection of php root entities
          + + + + + + +

          Initialization methods:

          + +
            +
          1. + __construct +
          2. +
          + +

          Methods:

          + +
            +
          1. + add + - Add an entity to the collection
          2. +
          3. + clearOperationsLogCollection +
          4. +
          5. + filterByInterfaces + - Get a copy of the current collection only with entities filtered by interfaces names (filtering is only available for ClassLikeEntity)
          6. +
          7. + filterByNameRegularExpression + - Get a copy of the current collection with only entities whose names match the regular expression
          8. +
          9. + filterByParentClassNames + - Get a copy of the current collection only with entities filtered by parent classes names (filtering is only available for ClassLikeEntity)
          10. +
          11. + filterByPaths + - Get a copy of the current collection only with entities filtered by file paths (from project_root)
          12. +
          13. + findEntity + - Find an entity in a collection
          14. +
          15. + get + - Get an entity from a collection (only previously added)
          16. +
          17. + getEntityCollectionName + - Get collection name
          18. +
          19. + getEntityLinkData +
          20. +
          21. + getIterator +
          22. +
          23. + getLoadedOrCreateNew + - Get an entity from the collection or create a new one if it has not yet been added
          24. +
          25. + getOnlyAbstractClasses + - Get a copy of the current collection with only abstract classes
          26. +
          27. + getOnlyInstantiable + - Get a copy of the current collection with only instantiable entities
          28. +
          29. + getOnlyInterfaces + - Get a copy of the current collection with only interfaces
          30. +
          31. + getOnlyTraits + - Get a copy of the current collection with only traits
          32. +
          33. + getOperationsLogCollection +
          34. +
          35. + has + - Check if an entity has been added to the collection
          36. +
          37. + internalFindEntity +
          38. +
          39. + internalGetLoadedOrCreateNew +
          40. +
          41. + isEmpty + - Check if the collection is empty or not
          42. +
          43. + loadEntities + - Load entities into a collection
          44. +
          45. + loadEntitiesByConfiguration + - Load entities into a collection by configuration
          46. +
          47. + remove + - Remove an entity from a collection
          48. +
          49. + toArray + - Convert collection to array
          50. +
          51. + updateEntitiesCache +
          52. +
          + + +

          Constants:

          + + + + + + +

          Method details:

          + +
          + + + +```php +public function __construct(\BumbleDocGen\Core\Configuration\Configuration $configuration, \BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings $phpHandlerSettings, \BumbleDocGen\Core\Plugin\PluginEventDispatcher $pluginEventDispatcher, \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Cache\CacheablePhpEntityFactory $cacheablePhpEntityFactory, \BumbleDocGen\LanguageHandler\Php\Renderer\EntityDocRenderer\EntityDocRendererHelper $docRendererHelper, \BumbleDocGen\LanguageHandler\Php\Parser\PhpParser\PhpParserHelper $phpParserHelper, \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache $localObjectCache, \Psr\Log\LoggerInterface $logger); +``` + + + +Parameters: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          NameTypeDescription
          $configuration\BumbleDocGen\Core\Configuration\Configuration-
          $phpHandlerSettings\BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings-
          $pluginEventDispatcher\BumbleDocGen\Core\Plugin\PluginEventDispatcher-
          $cacheablePhpEntityFactory\BumbleDocGen\LanguageHandler\Php\Parser\Entity\Cache\CacheablePhpEntityFactory-
          $docRendererHelper\BumbleDocGen\LanguageHandler\Php\Renderer\EntityDocRenderer\EntityDocRendererHelper-
          $phpParserHelper\BumbleDocGen\LanguageHandler\Php\Parser\PhpParser\PhpParserHelper-
          $localObjectCache\BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache-
          $logger\Psr\Log\LoggerInterface-
          + + + +
          +
          +
          + + + +```php +public function add(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity $classEntity, bool $reload = false): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; +``` + +
          Add an entity to the collection
          + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
          NameTypeDescription
          $classEntity\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity-
          $reloadbool-
          + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection + + +Throws: + + +
          +
          +
          + + + +```php +// Implemented in BumbleDocGen\Core\Parser\Entity\LoggableRootEntityCollection + +public function clearOperationsLogCollection(): void; +``` + + + +Parameters: not specified + +Return value: void + + +
          +
          +
          + + + +```php +public function filterByInterfaces(array $interfaces): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; +``` + +
          Get a copy of the current collection only with entities filtered by interfaces names (filtering is only available for ClassLikeEntity)
          + +Parameters: + + + + + + + + + + + + + + + + +
          NameTypeDescription
          $interfacesstring[]-
          + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection + + +Throws: + + +
          +
          +
          + + + +```php +public function filterByNameRegularExpression(string $regexPattern): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; +``` + +
          Get a copy of the current collection with only entities whose names match the regular expression
          + +Parameters: + + + + + + + + + + + + + + + + +
          NameTypeDescription
          $regexPatternstring-
          + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection + + +
          +
          +
          + + + +```php +public function filterByParentClassNames(array $parentClassNames): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; +``` + +
          Get a copy of the current collection only with entities filtered by parent classes names (filtering is only available for ClassLikeEntity)
          + +Parameters: + + + + + + + + + + + + + + + + +
          NameTypeDescription
          $parentClassNamesarray-
          + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection + + +Throws: + + +
          +
          +
          + + + +```php +public function filterByPaths(array $paths): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; +``` + +
          Get a copy of the current collection only with entities filtered by file paths (from project_root)
          + +Parameters: + + + + + + + + + + + + + + + + +
          NameTypeDescription
          $pathsarray-
          + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection + + +Throws: + + +
          +
          +
          + + + +```php +// Implemented in BumbleDocGen\Core\Parser\Entity\LoggableRootEntityCollection + +public function findEntity(string $search, bool $useUnsafeKeys = true): null|\BumbleDocGen\Core\Parser\Entity\RootEntityInterface; +``` + +
          Find an entity in a collection
          + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
          NameTypeDescription
          $searchstring-
          $useUnsafeKeysbool-
          + +Return value: null | \BumbleDocGen\Core\Parser\Entity\RootEntityInterface + + +
          +
          +
          + + + +```php +// Implemented in BumbleDocGen\Core\Parser\Entity\LoggableRootEntityCollection + +public function get(string $objectName): null|\BumbleDocGen\Core\Parser\Entity\RootEntityInterface; +``` + +
          Get an entity from a collection (only previously added)
          + +Parameters: + + + + + + + + + + + + + + + + +
          NameTypeDescription
          $objectNamestring-
          + +Return value: null | \BumbleDocGen\Core\Parser\Entity\RootEntityInterface + + +
          +
          +
          + + + +```php +public function getEntityCollectionName(): string; +``` + +
          Get collection name
          + +Parameters: not specified + +Return value: string + + +
          +
          +
          + +
            +
          • # + getEntityLinkData + :warning: Is internal | source code
          • +
          + +```php +public function getEntityLinkData(string $rawLink, string|null $defaultEntityName = null, bool $useUnsafeKeys = true): array; +``` + + + +Parameters: + + + + + + + + + + + + + + + + + + + + + + + + + + +
          NameTypeDescription
          $rawLinkstringRaw link to an entity or entity element
          $defaultEntityNamestring | nullEntity name to use if the link does not contain a valid or existing entity name, + but only a cursor on an entity element
          $useUnsafeKeysbool-
          + +Return value: array + + +
          +
          +
          + + + +```php +// Implemented in BumbleDocGen\Core\Parser\Entity\LoggableRootEntityCollection + +public function getIterator(): \Generator; +``` + + + +Parameters: not specified + +Return value: \Generator + + +
          +
          +
          + + + +```php +// Implemented in BumbleDocGen\Core\Parser\Entity\LoggableRootEntityCollection + +public function getLoadedOrCreateNew(string $objectName, bool $withAddClassEntityToCollectionEvent = false): \BumbleDocGen\Core\Parser\Entity\RootEntityInterface; +``` + +
          Get an entity from the collection or create a new one if it has not yet been added
          + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
          NameTypeDescription
          $objectNamestring-
          $withAddClassEntityToCollectionEventbool-
          + +Return value: \BumbleDocGen\Core\Parser\Entity\RootEntityInterface + + + +See: + +
          +
          +
          + + + +```php +public function getOnlyAbstractClasses(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; +``` + +
          Get a copy of the current collection with only abstract classes
          + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection + + +Throws: + + +
          +
          +
          + + + +```php +public function getOnlyInstantiable(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; +``` + +
          Get a copy of the current collection with only instantiable entities
          + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection + + +
          +
          +
          + + + +```php +public function getOnlyInterfaces(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; +``` + +
          Get a copy of the current collection with only interfaces
          + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection + + +
          +
          +
          + + + +```php +public function getOnlyTraits(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; +``` + +
          Get a copy of the current collection with only traits
          + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection + + +
          +
          +
          + + + +```php +// Implemented in BumbleDocGen\Core\Parser\Entity\LoggableRootEntityCollection + +public function getOperationsLogCollection(): \BumbleDocGen\Core\Parser\Entity\CollectionLogOperation\OperationsCollection; +``` + + + +Parameters: not specified + +Return value: \BumbleDocGen\Core\Parser\Entity\CollectionLogOperation\OperationsCollection + + +
          +
          +
          + + + +```php +// Implemented in BumbleDocGen\Core\Parser\Entity\BaseEntityCollection + +public function has(string $objectName): bool; +``` + +
          Check if an entity has been added to the collection
          + +Parameters: + + + + + + + + + + + + + + + + +
          NameTypeDescription
          $objectNamestring-
          + +Return value: bool + + +
          +
          +
          + +
            +
          • # + internalFindEntity + :warning: Is internal | source code
          • +
          + +```php +public function internalFindEntity(string $search, bool $useUnsafeKeys = true): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; +``` + + + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
          NameTypeDescription
          $searchstringSearch query. For the search, only the main part is taken, up to the characters: `::`, `->`, `#`. + If the request refers to multiple existing entities and if unsafe keys are allowed, + a warning will be shown and the first entity found will be used.
          $useUnsafeKeysboolWhether to use search keys that can be used to find several entities
          + +Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + + + + +Examples of using: + +```php +$entitiesCollection->findEntity('App'); // class name +$entitiesCollection->findEntity('BumbleDocGen\Console\App'); // class with namespace +$entitiesCollection->findEntity('\BumbleDocGen\Console\App'); // class with namespace +$entitiesCollection->findEntity('\BumbleDocGen\Console\App::test()'); // class with namespace and optional part +$entitiesCollection->findEntity('App.php'); // filename +$entitiesCollection->findEntity('/src/Console/App.php'); // relative path +$entitiesCollection->findEntity('/Users/someuser/Desktop/projects/bumble-doc-gen/src/Console/App.php'); // absolute path +$entitiesCollection->findEntity('https://github.com/bumble-tech/bumble-doc-gen/blob/master/src/Console/App.php'); // source link +``` + +
          +
          +
          + +
            +
          • # + internalGetLoadedOrCreateNew + :warning: Is internal | source code
          • +
          + +```php +public function internalGetLoadedOrCreateNew(string $objectName, bool $withAddClassEntityToCollectionEvent = false): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; +``` + + + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
          NameTypeDescription
          $objectNamestring-
          $withAddClassEntityToCollectionEventbool-
          + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity + + +Throws: + + +
          +
          +
          + + + +```php +// Implemented in BumbleDocGen\Core\Parser\Entity\BaseEntityCollection + +public function isEmpty(): bool; +``` + +
          Check if the collection is empty or not
          + +Parameters: not specified + +Return value: bool + + +
          +
          +
          + + + +```php +public function loadEntities(\BumbleDocGen\Core\Parser\SourceLocator\SourceLocatorsCollection $sourceLocatorsCollection, \BumbleDocGen\Core\Parser\FilterCondition\ConditionInterface|null $filters = null, \BumbleDocGen\Core\Parser\Entity\EntitiesLoaderProgressBarInterface|null $progressBar = null): \BumbleDocGen\Core\Parser\Entity\CollectionLoadEntitiesResult; +``` + +
          Load entities into a collection
          + +Parameters: + + + + + + + + + + + + + + + + + + + + + + + + + + +
          NameTypeDescription
          $sourceLocatorsCollection\BumbleDocGen\Core\Parser\SourceLocator\SourceLocatorsCollection-
          $filters\BumbleDocGen\Core\Parser\FilterCondition\ConditionInterface | null-
          $progressBar\BumbleDocGen\Core\Parser\Entity\EntitiesLoaderProgressBarInterface | null-
          + +Return value: \BumbleDocGen\Core\Parser\Entity\CollectionLoadEntitiesResult + + +Throws: + + +
          +
          +
          + +
            +
          • # + loadEntitiesByConfiguration + :warning: Is internal | source code
          • +
          + +```php +public function loadEntitiesByConfiguration(\BumbleDocGen\Core\Parser\Entity\EntitiesLoaderProgressBarInterface|null $progressBar = null): \BumbleDocGen\Core\Parser\Entity\CollectionLoadEntitiesResult; +``` + +
          Load entities into a collection by configuration
          + +Parameters: + + + + + + + + + + + + + + + + +
          NameTypeDescription
          $progressBar\BumbleDocGen\Core\Parser\Entity\EntitiesLoaderProgressBarInterface | null-
          + +Return value: \BumbleDocGen\Core\Parser\Entity\CollectionLoadEntitiesResult + + +Throws: + + +
          +
          +
          + + + +```php +// Implemented in BumbleDocGen\Core\Parser\Entity\BaseEntityCollection + +public function remove(string $objectName): void; +``` + +
          Remove an entity from a collection
          + +Parameters: + + + + + + + + + + + + + + + + +
          NameTypeDescription
          $objectNamestring-
          + +Return value: void + + +
          +
          +
          + + + +```php +// Implemented in BumbleDocGen\Core\Parser\Entity\RootEntityCollection + +public function toArray(): array; +``` + +
          Convert collection to array
          + +Parameters: not specified + +Return value: array + + +
          +
          +
          + +
            +
          • # + updateEntitiesCache + :warning: Is internal | source code
          • +
          + +```php +// Implemented in BumbleDocGen\Core\Parser\Entity\RootEntityCollection + +public function updateEntitiesCache(): void; +``` + + + +Parameters: not specified + +Return value: void + + +Throws: + + +
          +
          + + \ No newline at end of file diff --git a/docs/tech/2.parser/reflectionApi/php/classes/RootEntityInterface.md b/docs/tech/2.parser/reflectionApi/php/classes/RootEntityInterface.md new file mode 100644 index 00000000..05d2e4a0 --- /dev/null +++ b/docs/tech/2.parser/reflectionApi/php/classes/RootEntityInterface.md @@ -0,0 +1,472 @@ + + BumbleDocGen / Technical description of the project / Parser / Reflection API / Reflection API for PHP / RootEntityInterface
          + +

          + RootEntityInterface class: +

          + + + + + +```php +namespace BumbleDocGen\Core\Parser\Entity; + +interface RootEntityInterface extends \BumbleDocGen\Core\Parser\Entity\EntityInterface +``` + +
          Since the documentation generator supports several programming languages, +their entities need to correspond to the same interfaces
          + + + + + + + +

          Methods:

          + +
            +
          1. + getAbsoluteFileName + - Returns the absolute path to a file if it can be retrieved and if the file is in the project directory
          2. +
          3. + getEntityDependencies +
          4. +
          5. + getFileContent +
          6. +
          7. + getFileSourceLink +
          8. +
          9. + getName + - Full name of the entity
          10. +
          11. + getObjectId + - Entity object ID
          12. +
          13. + getRelativeFileName + - File name relative to project_root configuration parameter
          14. +
          15. + getRootEntityCollection + - Get parent collection of entities
          16. +
          17. + getShortName + - Short name of the entity
          18. +
          19. + isEntityCacheOutdated +
          20. +
          21. + isEntityDataCanBeLoaded + - Checking if it is possible to get the entity data
          22. +
          23. + isEntityNameValid + - Check if entity name is valid
          24. +
          25. + isExternalLibraryEntity + - The entity is loaded from a third party library and should not be treated the same as a standard one
          26. +
          27. + isInGit + - The entity file is in the git repository
          28. +
          29. + normalizeClassName +
          30. +
          + + + + + + + +

          Method details:

          + +
          + + + +```php +// Implemented in BumbleDocGen\Core\Parser\Entity\EntityInterface + +public function getAbsoluteFileName(): null|string; +``` + +
          Returns the absolute path to a file if it can be retrieved and if the file is in the project directory
          + +Parameters: not specified + +Return value: null | string + + +
          +
          +
          + + + +```php +public function getEntityDependencies(): array; +``` + + + +Parameters: not specified + +Return value: array + + +
          +
          +
          + + + +```php +public function getFileContent(): string; +``` + + + +Parameters: not specified + +Return value: string + + +
          +
          +
          + + + +```php +public function getFileSourceLink(bool $withLine = true): null|string; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
          NameTypeDescription
          $withLinebool-
          + +Return value: null | string + + +
          +
          +
          + + + +```php +// Implemented in BumbleDocGen\Core\Parser\Entity\EntityInterface + +public function getName(): string; +``` + +
          Full name of the entity
          + +Parameters: not specified + +Return value: string + + +
          +
          +
          + + + +```php +// Implemented in BumbleDocGen\Core\Parser\Entity\EntityInterface + +public function getObjectId(): string; +``` + +
          Entity object ID
          + +Parameters: not specified + +Return value: string + + +
          +
          +
          + + + +```php +// Implemented in BumbleDocGen\Core\Parser\Entity\EntityInterface + +public function getRelativeFileName(): null|string; +``` + +
          File name relative to project_root configuration parameter
          + +Parameters: not specified + +Return value: null | string + + + +See: + +
          +
          +
          + + + +```php +// Implemented in BumbleDocGen\Core\Parser\Entity\EntityInterface + +public function getRootEntityCollection(): \BumbleDocGen\Core\Parser\Entity\RootEntityCollection; +``` + +
          Get parent collection of entities
          + +Parameters: not specified + +Return value: \BumbleDocGen\Core\Parser\Entity\RootEntityCollection + + +
          +
          +
          + + + +```php +// Implemented in BumbleDocGen\Core\Parser\Entity\EntityInterface + +public function getShortName(): string; +``` + +
          Short name of the entity
          + +Parameters: not specified + +Return value: string + + +
          +
          +
          + +
            +
          • # + isEntityCacheOutdated + :warning: Is internal | source code
          • +
          + +```php +// Implemented in BumbleDocGen\Core\Parser\Entity\EntityInterface + +public function isEntityCacheOutdated(): bool; +``` + + + +Parameters: not specified + +Return value: bool + + +
          +
          +
          + + + +```php +public function isEntityDataCanBeLoaded(): bool; +``` + +
          Checking if it is possible to get the entity data
          + +Parameters: not specified + +Return value: bool + + +
          +
          +
          + + + +```php +public static function isEntityNameValid(string $entityName): bool; +``` + +
          Check if entity name is valid
          + +Parameters: + + + + + + + + + + + + + + + + +
          NameTypeDescription
          $entityNamestring-
          + +Return value: bool + + +
          +
          +
          + + + +```php +public function isExternalLibraryEntity(): bool; +``` + +
          The entity is loaded from a third party library and should not be treated the same as a standard one
          + +Parameters: not specified + +Return value: bool + + +
          +
          +
          + + + +```php +public function isInGit(): bool; +``` + +
          The entity file is in the git repository
          + +Parameters: not specified + +Return value: bool + + +
          +
          +
          + + + +```php +public static function normalizeClassName(string $name): string; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
          NameTypeDescription
          $namestring-
          + +Return value: string + + +
          +
          + + \ No newline at end of file diff --git a/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md b/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md index f1cc36f2..cf093a56 100644 --- a/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md +++ b/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md @@ -293,7 +293,7 @@ See: - Check if an entity is a Trait
        90. normalizeClassName -
        91. + - Bring the class name to the standard format used in the system
        92. reloadEntityDependenciesCache - Update entity dependency cache
        93. @@ -405,7 +405,7 @@ public function __construct(\BumbleDocGen\Core\Configuration\Configuration $conf ```php @@ -450,7 +450,7 @@ public function addPluginData(string $pluginKey, mixed $data): void; ```php @@ -538,7 +538,7 @@ public function getAbsoluteFileName(): null|string; ```php @@ -624,7 +624,7 @@ public function getCachedEntityDependencies(): array; ```php @@ -682,7 +682,7 @@ public function getConstant(string $constantName, bool $unsafe = false): null|\B ```php @@ -724,7 +724,7 @@ public function getConstantEntitiesCollection(): \BumbleDocGen\LanguageHandler\P ```php @@ -780,7 +780,7 @@ public function getConstantValue(string $constantName): string|array|int|bool|nu ```php @@ -824,7 +824,7 @@ public function getConstants(): array; ```php @@ -876,7 +876,7 @@ public function getConstantsData(bool $onlyFromCurrentClassAndTraits = false, in ```php @@ -1083,7 +1083,7 @@ public function getDocComment(): string; ```php @@ -1166,7 +1166,7 @@ public function getDocNote(): string; ```php @@ -1199,7 +1199,7 @@ public function getDocRender(): \BumbleDocGen\Core\Renderer\EntityDocRenderer\En ```php @@ -1229,7 +1229,7 @@ public function getEndLine(): int; ```php @@ -1282,7 +1282,7 @@ public function getExamples(): array; ```php @@ -1389,7 +1389,7 @@ public function getFirstExample(): string; ```php @@ -1440,7 +1440,7 @@ public function getInterfaceNames(): array; ```php @@ -1470,7 +1470,7 @@ public function getInterfacesEntities(): array; ```php @@ -1528,7 +1528,7 @@ public function getMethod(string $methodName, bool $unsafe = false): null|\Bumbl ```php @@ -1570,7 +1570,7 @@ public function getMethodEntitiesCollection(): \BumbleDocGen\LanguageHandler\Php ```php @@ -1614,7 +1614,7 @@ public function getMethods(): array; ```php @@ -1687,7 +1687,7 @@ public function getModifiersString(): string; ```php @@ -1710,7 +1710,7 @@ public function getName(): string; ```php @@ -1733,7 +1733,7 @@ public function getNamespaceName(): string; ```php @@ -1756,7 +1756,7 @@ public function getObjectId(): string; ```php @@ -1779,7 +1779,7 @@ public function getParentClass(): null|\BumbleDocGen\LanguageHandler\Php\Parser\ ```php @@ -1802,7 +1802,7 @@ public function getParentClassEntities(): array; ```php @@ -1825,7 +1825,7 @@ public function getParentClassName(): null|string; ```php @@ -1848,7 +1848,7 @@ public function getParentClassNames(): array; ```php @@ -1888,7 +1888,7 @@ public function getPluginData(string $pluginKey): mixed; ```php @@ -1932,7 +1932,7 @@ public function getProperties(): array; ```php @@ -1984,7 +1984,7 @@ public function getPropertiesData(bool $onlyFromCurrentClassAndTraits = false, i ```php @@ -2042,7 +2042,7 @@ public function getProperty(string $propertyName, bool $unsafe = false): null|\B ```php @@ -2098,7 +2098,7 @@ public function getPropertyDefaultValue(string $propertyName): string|array|int| ```php @@ -2140,7 +2140,7 @@ public function getPropertyEntitiesCollection(): \BumbleDocGen\LanguageHandler\P ```php @@ -2169,7 +2169,7 @@ public function getRelativeFileName(): null|string; ```php @@ -2192,7 +2192,7 @@ public function getRootEntityCollection(): \BumbleDocGen\LanguageHandler\Php\Par ```php @@ -2215,7 +2215,7 @@ public function getShortName(): string; ```php @@ -2305,7 +2305,7 @@ public function getThrowsDocBlockLinks(): array; ```php @@ -2335,7 +2335,7 @@ public function getTraits(): array; ```php @@ -2365,7 +2365,7 @@ public function getTraitsNames(): array; ```php @@ -2483,7 +2483,7 @@ public function hasExamples(): bool; ```php @@ -2541,7 +2541,7 @@ public function hasMethod(string $methodName, bool $unsafe = false): bool; ```php @@ -2581,7 +2581,7 @@ public function hasParentClass(string $parentClassName): bool; ```php @@ -2669,7 +2669,7 @@ public function hasThrows(): bool; ```php @@ -2699,7 +2699,7 @@ public function hasTraits(): bool; ```php @@ -2746,7 +2746,7 @@ public function implementsInterface(string $interfaceName): bool; ```php @@ -2799,7 +2799,7 @@ public function isApi(): bool; ```php @@ -2822,7 +2822,7 @@ public function isClass(): bool; ```php @@ -2875,7 +2875,7 @@ public function isDeprecated(): bool; ```php @@ -2958,7 +2958,7 @@ public function isEntityDataCacheOutdated(): bool; ```php @@ -3058,7 +3058,7 @@ public static function isEntityNameValid(string $entityName): bool; ```php @@ -3081,7 +3081,7 @@ public function isEnum(): bool; ```php @@ -3104,7 +3104,7 @@ public function isExternalLibraryEntity(): bool; ```php @@ -3127,7 +3127,7 @@ public function isInGit(): bool; ```php @@ -3150,7 +3150,7 @@ public function isInstantiable(): bool; ```php @@ -3269,7 +3269,7 @@ public function isTrait(): bool; ```php @@ -3278,7 +3278,7 @@ public function isTrait(): bool; public static function normalizeClassName(string $name): string; ``` - +
          Bring the class name to the standard format used in the system
          Parameters: @@ -3402,7 +3402,7 @@ public function removeNotUsedEntityDataCache(): void; ```php diff --git a/docs/tech/2.parser/reflectionApi/php/phpClassConstantReflectionApi.md b/docs/tech/2.parser/reflectionApi/php/phpClassConstantReflectionApi.md index d5874365..c7d3a732 100644 --- a/docs/tech/2.parser/reflectionApi/php/phpClassConstantReflectionApi.md +++ b/docs/tech/2.parser/reflectionApi/php/phpClassConstantReflectionApi.md @@ -16,35 +16,35 @@ $constantReflection = $classReflection->getConstant('constantName'); **Class constant reflection API methods:** -- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassConstantEntity.md#mgetabsolutefilename) `getAbsoluteFileName()`: Returns the absolute path to a file if it can be retrieved and if the file is in the project directory -- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassConstantEntity.md#mgetast) `getAst()`: Get AST for this entity -- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassConstantEntity.md#mgetdescription) `getDescription()`: Get entity description -- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassConstantEntity.md#mgetdescriptionlinks) `getDescriptionLinks()`: Get parsed links from description and doc blocks `see` and `link` -- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassConstantEntity.md#mgetdoccomment) `getDocComment()`: Get the doc comment of an entity -- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassConstantEntity.md#mgetdoccommentline) `getDocCommentLine()`: Get the code line number where the docBlock of the current entity begins -- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassConstantEntity.md#mgetdocnote) `getDocNote()`: Get the note annotation value -- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassConstantEntity.md#mgetendline) `getEndLine()`: Get the line number of the end of a constant's code in a file -- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassConstantEntity.md#mgetexamples) `getExamples()`: Get parsed examples from `examples` doc block -- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassConstantEntity.md#mgetfirstexample) `getFirstExample()`: Get first example from `examples` doc block -- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassConstantEntity.md#mgetimplementingclass) `getImplementingClass()`: Get the class like entity in which the current entity was implemented -- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassConstantEntity.md#mgetnamespacename) `getNamespaceName()`: Get the name of the namespace where the current class is implemented -- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassConstantEntity.md#mgetobjectid) `getObjectId()`: Get entity unique ID -- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassConstantEntity.md#mgetrelativefilename) `getRelativeFileName()`: File name relative to project_root configuration parameter -- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassConstantEntity.md#mgetrootentitycollection) `getRootEntityCollection()`: Get the collection of root entities to which this entity belongs -- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassConstantEntity.md#mgetstartline) `getStartLine()`: Get the line number of the beginning of the constant code in a file -- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassConstantEntity.md#mgetthrows) `getThrows()`: Get parsed throws from `throws` doc block -- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassConstantEntity.md#mgetvalue) `getValue()`: Get the compiled value of a constant -- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassConstantEntity.md#mhasdescriptionlinks) `hasDescriptionLinks()`: Checking if an entity has links in its description -- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassConstantEntity.md#mhasexamples) `hasExamples()`: Checking if an entity has `example` docBlock -- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassConstantEntity.md#mhasthrows) `hasThrows()`: Checking if an entity has `throws` docBlock -- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassConstantEntity.md#misapi) `isApi()`: Checking if an entity has `api` docBlock -- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassConstantEntity.md#misdeprecated) `isDeprecated()`: Checking if an entity has `deprecated` docBlock -- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassConstantEntity.md#misentityfilecanbeload) `isEntityFileCanBeLoad()`: Checking if entity data can be retrieved -- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassConstantEntity.md#misinternal) `isInternal()`: Checking if an entity has `internal` docBlock -- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassConstantEntity.md#misprivate) `isPrivate()`: Check if a constant is a private constant -- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassConstantEntity.md#misprotected) `isProtected()`: Check if a constant is a protected constant -- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassConstantEntity.md#mispublic) `isPublic()`: Check if a constant is a public constant +- [getAbsoluteFileName()](/docs/tech/2.parser/reflectionApi/php/classes/ClassConstantEntity.md#mgetabsolutefilename): Returns the absolute path to a file if it can be retrieved and if the file is in the project directory +- [getAst()](/docs/tech/2.parser/reflectionApi/php/classes/ClassConstantEntity.md#mgetast): Get AST for this entity +- [getDescription()](/docs/tech/2.parser/reflectionApi/php/classes/ClassConstantEntity.md#mgetdescription): Get entity description +- [getDescriptionLinks()](/docs/tech/2.parser/reflectionApi/php/classes/ClassConstantEntity.md#mgetdescriptionlinks): Get parsed links from description and doc blocks `see` and `link` +- [getDocComment()](/docs/tech/2.parser/reflectionApi/php/classes/ClassConstantEntity.md#mgetdoccomment): Get the doc comment of an entity +- [getDocCommentLine()](/docs/tech/2.parser/reflectionApi/php/classes/ClassConstantEntity.md#mgetdoccommentline): Get the code line number where the docBlock of the current entity begins +- [getDocNote()](/docs/tech/2.parser/reflectionApi/php/classes/ClassConstantEntity.md#mgetdocnote): Get the note annotation value +- [getEndLine()](/docs/tech/2.parser/reflectionApi/php/classes/ClassConstantEntity.md#mgetendline): Get the line number of the end of a constant's code in a file +- [getExamples()](/docs/tech/2.parser/reflectionApi/php/classes/ClassConstantEntity.md#mgetexamples): Get parsed examples from `examples` doc block +- [getFirstExample()](/docs/tech/2.parser/reflectionApi/php/classes/ClassConstantEntity.md#mgetfirstexample): Get first example from `examples` doc block +- [getImplementingClass()](/docs/tech/2.parser/reflectionApi/php/classes/ClassConstantEntity.md#mgetimplementingclass): Get the class like entity in which the current entity was implemented +- [getNamespaceName()](/docs/tech/2.parser/reflectionApi/php/classes/ClassConstantEntity.md#mgetnamespacename): Get the name of the namespace where the current class is implemented +- [getObjectId()](/docs/tech/2.parser/reflectionApi/php/classes/ClassConstantEntity.md#mgetobjectid): Get entity unique ID +- [getRelativeFileName()](/docs/tech/2.parser/reflectionApi/php/classes/ClassConstantEntity.md#mgetrelativefilename): File name relative to project_root configuration parameter +- [getRootEntityCollection()](/docs/tech/2.parser/reflectionApi/php/classes/ClassConstantEntity.md#mgetrootentitycollection): Get the collection of root entities to which this entity belongs +- [getStartLine()](/docs/tech/2.parser/reflectionApi/php/classes/ClassConstantEntity.md#mgetstartline): Get the line number of the beginning of the constant code in a file +- [getThrows()](/docs/tech/2.parser/reflectionApi/php/classes/ClassConstantEntity.md#mgetthrows): Get parsed throws from `throws` doc block +- [getValue()](/docs/tech/2.parser/reflectionApi/php/classes/ClassConstantEntity.md#mgetvalue): Get the compiled value of a constant +- [hasDescriptionLinks()](/docs/tech/2.parser/reflectionApi/php/classes/ClassConstantEntity.md#mhasdescriptionlinks): Checking if an entity has links in its description +- [hasExamples()](/docs/tech/2.parser/reflectionApi/php/classes/ClassConstantEntity.md#mhasexamples): Checking if an entity has `example` docBlock +- [hasThrows()](/docs/tech/2.parser/reflectionApi/php/classes/ClassConstantEntity.md#mhasthrows): Checking if an entity has `throws` docBlock +- [isApi()](/docs/tech/2.parser/reflectionApi/php/classes/ClassConstantEntity.md#misapi): Checking if an entity has `api` docBlock +- [isDeprecated()](/docs/tech/2.parser/reflectionApi/php/classes/ClassConstantEntity.md#misdeprecated): Checking if an entity has `deprecated` docBlock +- [isEntityFileCanBeLoad()](/docs/tech/2.parser/reflectionApi/php/classes/ClassConstantEntity.md#misentityfilecanbeload): Checking if entity data can be retrieved +- [isInternal()](/docs/tech/2.parser/reflectionApi/php/classes/ClassConstantEntity.md#misinternal): Checking if an entity has `internal` docBlock +- [isPrivate()](/docs/tech/2.parser/reflectionApi/php/classes/ClassConstantEntity.md#misprivate): Check if a constant is a private constant +- [isProtected()](/docs/tech/2.parser/reflectionApi/php/classes/ClassConstantEntity.md#misprotected): Check if a constant is a protected constant +- [isPublic()](/docs/tech/2.parser/reflectionApi/php/classes/ClassConstantEntity.md#mispublic): Check if a constant is a public constant

          -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
          Last modified date: Fri Dec 15 21:27:10 2023 +0300
          Page content update date: Fri Dec 15 2023
          Made with Bumble Documentation Generator
          \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
          Last modified date: Fri Dec 15 21:27:10 2023 +0300
          Page content update date: Sat Dec 16 2023
          Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/2.parser/reflectionApi/php/phpClassMethodReflectionApi.md b/docs/tech/2.parser/reflectionApi/php/phpClassMethodReflectionApi.md index c6b60dcb..c9430288 100644 --- a/docs/tech/2.parser/reflectionApi/php/phpClassMethodReflectionApi.md +++ b/docs/tech/2.parser/reflectionApi/php/phpClassMethodReflectionApi.md @@ -16,50 +16,50 @@ $methodReflection = $classReflection->getMethod('methodName'); **Class method reflection API methods:** -- [#](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#mgetabsolutefilename) `getAbsoluteFileName()`: Returns the absolute path to a file if it can be retrieved and if the file is in the project directory -- [#](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#mgetast) `getAst()`: Get AST for this entity -- [#](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#mgetbodycode) `getBodyCode()`: Get the code for this method -- [#](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#mgetdescription) `getDescription()`: Get entity description -- [#](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#mgetdescriptionlinks) `getDescriptionLinks()`: Get parsed links from description and doc blocks `see` and `link` -- [#](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#mgetdoccomment) `getDocComment()`: Get the doc comment of an entity -- [#](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#mgetdocnote) `getDocNote()`: Get the note annotation value -- [#](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#mgetendline) `getEndLine()`: Get the line number of the end of a method's code in a file -- [#](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#mgetexamples) `getExamples()`: Get parsed examples from `examples` doc block -- [#](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#mgetfirstexample) `getFirstExample()`: Get first example from `examples` doc block -- [#](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#mgetfirstreturnvalue) `getFirstReturnValue()`: Get the compiled first return value of a method (if possible) -- [#](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#mgetimplementingclass) `getImplementingClass()`: Get the class like entity in which the current entity was implemented -- [#](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#mgetimplementingclassname) `getImplementingClassName()`: Get the name of the class in which this method is implemented -- [#](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#mgetmodifiersstring) `getModifiersString()`: Get a text representation of method modifiers -- [#](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#mgetname) `getName()`: Full name of the entity -- [#](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#mgetnamespacename) `getNamespaceName()`: Namespace of the class that contains this method -- [#](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#mgetobjectid) `getObjectId()`: Get entity unique ID -- [#](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#mgetparameters) `getParameters()`: Get a list of method parameters -- [#](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#mgetparametersstring) `getParametersString()`: Get a list of method parameters as a string -- [#](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#mgetparentmethod) `getParentMethod()`: Get the parent method for this method -- [#](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#mgetrelativefilename) `getRelativeFileName()`: File name relative to project_root configuration parameter -- [#](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#mgetreturntype) `getReturnType()`: Get the return type of method -- [#](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#mgetrootentitycollection) `getRootEntityCollection()`: Get the collection of root entities to which this entity belongs -- [#](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#mgetshortname) `getShortName()`: Short name of the entity -- [#](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#mgetsignature) `getSignature()`: Get the method signature as a string -- [#](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#mgetstartcolumn) `getStartColumn()`: Get the column number of the beginning of the method code in a file -- [#](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#mgetstartline) `getStartLine()`: Get the line number of the beginning of the entity code in a file -- [#](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#mgetthrows) `getThrows()`: Get parsed throws from `throws` doc block -- [#](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#mhasdescriptionlinks) `hasDescriptionLinks()`: Checking if an entity has links in its description -- [#](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#mhasexamples) `hasExamples()`: Checking if an entity has `example` docBlock -- [#](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#mhasthrows) `hasThrows()`: Checking if an entity has `throws` docBlock -- [#](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#misapi) `isApi()`: Checking if an entity has `api` docBlock -- [#](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#misconstructor) `isConstructor()`: Checking that a method is a constructor -- [#](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#misdeprecated) `isDeprecated()`: Checking if an entity has `deprecated` docBlock -- [#](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#misdynamic) `isDynamic()`: Check if a method is a dynamic method, that is, implementable using __call or __callStatic -- [#](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#misentityfilecanbeload) `isEntityFileCanBeLoad()`: Checking if entity data can be retrieved -- [#](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#misimplementedinparentclass) `isImplementedInParentClass()`: Check if this method is implemented in the parent class -- [#](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#misinitialization) `isInitialization()`: Check if a method is an initialization method -- [#](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#misinternal) `isInternal()`: Checking if an entity has `internal` docBlock -- [#](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#misprivate) `isPrivate()`: Check if a method is a private method -- [#](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#misprotected) `isProtected()`: Check if a method is a protected method -- [#](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#mispublic) `isPublic()`: Check if a method is a public method -- [#](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#misstatic) `isStatic()`: Check if this method is static +- [getAbsoluteFileName()](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#mgetabsolutefilename): Returns the absolute path to a file if it can be retrieved and if the file is in the project directory +- [getAst()](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#mgetast): Get AST for this entity +- [getBodyCode()](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#mgetbodycode): Get the code for this method +- [getDescription()](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#mgetdescription): Get entity description +- [getDescriptionLinks()](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#mgetdescriptionlinks): Get parsed links from description and doc blocks `see` and `link` +- [getDocComment()](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#mgetdoccomment): Get the doc comment of an entity +- [getDocNote()](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#mgetdocnote): Get the note annotation value +- [getEndLine()](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#mgetendline): Get the line number of the end of a method's code in a file +- [getExamples()](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#mgetexamples): Get parsed examples from `examples` doc block +- [getFirstExample()](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#mgetfirstexample): Get first example from `examples` doc block +- [getFirstReturnValue()](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#mgetfirstreturnvalue): Get the compiled first return value of a method (if possible) +- [getImplementingClass()](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#mgetimplementingclass): Get the class like entity in which the current entity was implemented +- [getImplementingClassName()](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#mgetimplementingclassname): Get the name of the class in which this method is implemented +- [getModifiersString()](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#mgetmodifiersstring): Get a text representation of method modifiers +- [getName()](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#mgetname): Full name of the entity +- [getNamespaceName()](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#mgetnamespacename): Namespace of the class that contains this method +- [getObjectId()](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#mgetobjectid): Get entity unique ID +- [getParameters()](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#mgetparameters): Get a list of method parameters +- [getParametersString()](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#mgetparametersstring): Get a list of method parameters as a string +- [getParentMethod()](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#mgetparentmethod): Get the parent method for this method +- [getRelativeFileName()](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#mgetrelativefilename): File name relative to project_root configuration parameter +- [getReturnType()](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#mgetreturntype): Get the return type of method +- [getRootEntityCollection()](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#mgetrootentitycollection): Get the collection of root entities to which this entity belongs +- [getShortName()](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#mgetshortname): Short name of the entity +- [getSignature()](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#mgetsignature): Get the method signature as a string +- [getStartColumn()](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#mgetstartcolumn): Get the column number of the beginning of the method code in a file +- [getStartLine()](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#mgetstartline): Get the line number of the beginning of the entity code in a file +- [getThrows()](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#mgetthrows): Get parsed throws from `throws` doc block +- [hasDescriptionLinks()](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#mhasdescriptionlinks): Checking if an entity has links in its description +- [hasExamples()](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#mhasexamples): Checking if an entity has `example` docBlock +- [hasThrows()](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#mhasthrows): Checking if an entity has `throws` docBlock +- [isApi()](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#misapi): Checking if an entity has `api` docBlock +- [isConstructor()](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#misconstructor): Checking that a method is a constructor +- [isDeprecated()](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#misdeprecated): Checking if an entity has `deprecated` docBlock +- [isDynamic()](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#misdynamic): Check if a method is a dynamic method, that is, implementable using __call or __callStatic +- [isEntityFileCanBeLoad()](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#misentityfilecanbeload): Checking if entity data can be retrieved +- [isImplementedInParentClass()](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#misimplementedinparentclass): Check if this method is implemented in the parent class +- [isInitialization()](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#misinitialization): Check if a method is an initialization method +- [isInternal()](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#misinternal): Checking if an entity has `internal` docBlock +- [isPrivate()](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#misprivate): Check if a method is a private method +- [isProtected()](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#misprotected): Check if a method is a protected method +- [isPublic()](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#mispublic): Check if a method is a public method +- [isStatic()](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#misstatic): Check if this method is static

          -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
          Last modified date: Fri Dec 15 21:27:10 2023 +0300
          Page content update date: Fri Dec 15 2023
          Made with Bumble Documentation Generator
          \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
          Last modified date: Fri Dec 15 21:27:10 2023 +0300
          Page content update date: Sat Dec 16 2023
          Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/2.parser/reflectionApi/php/phpClassPropertyReflectionApi.md b/docs/tech/2.parser/reflectionApi/php/phpClassPropertyReflectionApi.md index 8eaff833..14e2bae5 100644 --- a/docs/tech/2.parser/reflectionApi/php/phpClassPropertyReflectionApi.md +++ b/docs/tech/2.parser/reflectionApi/php/phpClassPropertyReflectionApi.md @@ -16,41 +16,41 @@ $propertyReflection = $classReflection->getProperty('propertyName'); **Class property reflection API methods:** -- [#](/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md#mgetabsolutefilename) `getAbsoluteFileName()`: Returns the absolute path to a file if it can be retrieved and if the file is in the project directory -- [#](/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md#mgetast) `getAst()`: Get AST for this entity -- [#](/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md#mgetdefaultvalue) `getDefaultValue()`: Get the compiled default value of a property -- [#](/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md#mgetdescription) `getDescription()`: Get entity description -- [#](/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md#mgetdescriptionlinks) `getDescriptionLinks()`: Get parsed links from description and doc blocks `see` and `link` -- [#](/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md#mgetdoccomment) `getDocComment()`: Get the doc comment of an entity -- [#](/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md#mgetdoccommentline) `getDocCommentLine()`: Get the code line number where the docBlock of the current entity begins -- [#](/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md#mgetdocnote) `getDocNote()`: Get the note annotation value -- [#](/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md#mgetendline) `getEndLine()`: Get the line number of the end of a property's code in a file -- [#](/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md#mgetexamples) `getExamples()`: Get parsed examples from `examples` doc block -- [#](/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md#mgetfirstexample) `getFirstExample()`: Get first example from `examples` doc block -- [#](/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md#mgetimplementingclass) `getImplementingClass()`: Get the class like entity in which the current entity was implemented -- [#](/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md#mgetimplementingclassname) `getImplementingClassName()`: Get the name of the class in which this property is implemented -- [#](/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md#mgetmodifiersstring) `getModifiersString()`: Get a text representation of property modifiers -- [#](/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md#mgetname) `getName()`: Full name of the entity -- [#](/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md#mgetnamespacename) `getNamespaceName()`: Namespace of the class that contains this property -- [#](/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md#mgetobjectid) `getObjectId()`: Get entity unique ID -- [#](/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md#mgetrelativefilename) `getRelativeFileName()`: File name relative to project_root configuration parameter -- [#](/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md#mgetrootentitycollection) `getRootEntityCollection()`: Get the collection of root entities to which this entity belongs -- [#](/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md#mgetshortname) `getShortName()`: Short name of the entity -- [#](/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md#mgetstartline) `getStartLine()`: Get the line number of the beginning of the entity code in a file -- [#](/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md#mgetthrows) `getThrows()`: Get parsed throws from `throws` doc block -- [#](/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md#mgettype) `getType()`: Get current property type -- [#](/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md#mhasdescriptionlinks) `hasDescriptionLinks()`: Checking if an entity has links in its description -- [#](/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md#mhasexamples) `hasExamples()`: Checking if an entity has `example` docBlock -- [#](/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md#mhasthrows) `hasThrows()`: Checking if an entity has `throws` docBlock -- [#](/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md#misapi) `isApi()`: Checking if an entity has `api` docBlock -- [#](/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md#misdeprecated) `isDeprecated()`: Checking if an entity has `deprecated` docBlock -- [#](/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md#misentityfilecanbeload) `isEntityFileCanBeLoad()`: Checking if entity data can be retrieved -- [#](/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md#misimplementedinparentclass) `isImplementedInParentClass()`: Check if this property is implemented in the parent class -- [#](/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md#misinternal) `isInternal()`: Checking if an entity has `internal` docBlock -- [#](/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md#misprivate) `isPrivate()`: Check if a private is a public private -- [#](/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md#misprotected) `isProtected()`: Check if a protected is a public protected -- [#](/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md#mispublic) `isPublic()`: Check if a property is a public property +- [getAbsoluteFileName()](/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md#mgetabsolutefilename): Returns the absolute path to a file if it can be retrieved and if the file is in the project directory +- [getAst()](/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md#mgetast): Get AST for this entity +- [getDefaultValue()](/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md#mgetdefaultvalue): Get the compiled default value of a property +- [getDescription()](/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md#mgetdescription): Get entity description +- [getDescriptionLinks()](/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md#mgetdescriptionlinks): Get parsed links from description and doc blocks `see` and `link` +- [getDocComment()](/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md#mgetdoccomment): Get the doc comment of an entity +- [getDocCommentLine()](/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md#mgetdoccommentline): Get the code line number where the docBlock of the current entity begins +- [getDocNote()](/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md#mgetdocnote): Get the note annotation value +- [getEndLine()](/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md#mgetendline): Get the line number of the end of a property's code in a file +- [getExamples()](/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md#mgetexamples): Get parsed examples from `examples` doc block +- [getFirstExample()](/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md#mgetfirstexample): Get first example from `examples` doc block +- [getImplementingClass()](/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md#mgetimplementingclass): Get the class like entity in which the current entity was implemented +- [getImplementingClassName()](/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md#mgetimplementingclassname): Get the name of the class in which this property is implemented +- [getModifiersString()](/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md#mgetmodifiersstring): Get a text representation of property modifiers +- [getName()](/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md#mgetname): Full name of the entity +- [getNamespaceName()](/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md#mgetnamespacename): Namespace of the class that contains this property +- [getObjectId()](/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md#mgetobjectid): Get entity unique ID +- [getRelativeFileName()](/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md#mgetrelativefilename): File name relative to project_root configuration parameter +- [getRootEntityCollection()](/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md#mgetrootentitycollection): Get the collection of root entities to which this entity belongs +- [getShortName()](/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md#mgetshortname): Short name of the entity +- [getStartLine()](/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md#mgetstartline): Get the line number of the beginning of the entity code in a file +- [getThrows()](/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md#mgetthrows): Get parsed throws from `throws` doc block +- [getType()](/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md#mgettype): Get current property type +- [hasDescriptionLinks()](/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md#mhasdescriptionlinks): Checking if an entity has links in its description +- [hasExamples()](/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md#mhasexamples): Checking if an entity has `example` docBlock +- [hasThrows()](/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md#mhasthrows): Checking if an entity has `throws` docBlock +- [isApi()](/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md#misapi): Checking if an entity has `api` docBlock +- [isDeprecated()](/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md#misdeprecated): Checking if an entity has `deprecated` docBlock +- [isEntityFileCanBeLoad()](/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md#misentityfilecanbeload): Checking if entity data can be retrieved +- [isImplementedInParentClass()](/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md#misimplementedinparentclass): Check if this property is implemented in the parent class +- [isInternal()](/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md#misinternal): Checking if an entity has `internal` docBlock +- [isPrivate()](/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md#misprivate): Check if a private is a public private +- [isProtected()](/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md#misprotected): Check if a protected is a public protected +- [isPublic()](/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md#mispublic): Check if a property is a public property

          -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
          Last modified date: Fri Dec 15 21:27:10 2023 +0300
          Page content update date: Fri Dec 15 2023
          Made with Bumble Documentation Generator
          \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
          Last modified date: Fri Dec 15 21:27:10 2023 +0300
          Page content update date: Sat Dec 16 2023
          Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/2.parser/reflectionApi/php/phpClassReflectionApi.md b/docs/tech/2.parser/reflectionApi/php/phpClassReflectionApi.md index 7673934e..d264dc75 100644 --- a/docs/tech/2.parser/reflectionApi/php/phpClassReflectionApi.md +++ b/docs/tech/2.parser/reflectionApi/php/phpClassReflectionApi.md @@ -20,70 +20,70 @@ $classReflection = $entitiesCollection->getLoadedOrCreateNew('SomeClassName'); / **Class reflection API methods:** -- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetabsolutefilename) `getAbsoluteFileName()`: Returns the absolute path to a file if it can be retrieved and if the file is in the project directory -- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetast) `getAst()`: Get AST for this entity -- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetconstant) `getConstant()`: Get the method entity by its name -- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetconstantentitiescollection) `getConstantEntitiesCollection()`: Get a collection of constant entities -- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetconstantvalue) `getConstantValue()`: Get the compiled value of a constant -- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetconstants) `getConstants()`: Get all constants that are available according to the configuration as an array -- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetconstantsvalues) `getConstantsValues()`: Get class constant compiled values according to filters -- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetdescription) `getDescription()`: Get entity description -- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetdescriptionlinks) `getDescriptionLinks()`: Get parsed links from description and doc blocks `see` and `link` -- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetdoccomment) `getDocComment()`: Get the doc comment of an entity -- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetdoccommentline) `getDocCommentLine()`: Get the code line number where the docBlock of the current entity begins -- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetdocnote) `getDocNote()`: Get the note annotation value -- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetendline) `getEndLine()`: Get the line number of the end of a class code in a file -- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetexamples) `getExamples()`: Get parsed examples from `examples` doc block -- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetfirstexample) `getFirstExample()`: Get first example from `examples` doc block -- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetimplementingclass) `getImplementingClass()`: Get the class like entity in which the current entity was implemented -- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetinterfacenames) `getInterfaceNames()`: Get a list of class interface names -- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetinterfacesentities) `getInterfacesEntities()`: Get a list of interface entities that the current class implements -- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetmethod) `getMethod()`: Get the method entity by its name -- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetmethodentitiescollection) `getMethodEntitiesCollection()`: Get a collection of method entities -- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetmethods) `getMethods()`: Get all methods that are available according to the configuration as an array -- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetname) `getName()`: Full name of the entity -- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetnamespacename) `getNamespaceName()`: Get the entity namespace name -- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetobjectid) `getObjectId()`: Get entity unique ID -- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetparentclass) `getParentClass()`: Get the entity of the parent class if it exists -- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetparentclassentities) `getParentClassEntities()`: Get a list of parent class entities -- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetparentclassname) `getParentClassName()`: Get the name of the parent class entity if it exists -- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetparentclassnames) `getParentClassNames()`: Get a list of entity names of parent classes -- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetplugindata) `getPluginData()`: Get additional information added using the plugin -- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetproperties) `getProperties()`: Get all properties that are available according to the configuration as an array -- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetproperty) `getProperty()`: Get the property entity by its name -- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetpropertydefaultvalue) `getPropertyDefaultValue()`: Get the compiled value of a property -- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetpropertyentitiescollection) `getPropertyEntitiesCollection()`: Get a collection of property entities -- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetrelativefilename) `getRelativeFileName()`: File name relative to project_root configuration parameter -- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetrootentitycollection) `getRootEntityCollection()`: Get the collection of root entities to which this entity belongs -- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetshortname) `getShortName()`: Short name of the entity -- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetstartline) `getStartLine()`: Get the line number of the start of a class code in a file -- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetthrows) `getThrows()`: Get parsed throws from `throws` doc block -- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgettraits) `getTraits()`: Get a list of trait entities of the current class -- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgettraitsnames) `getTraitsNames()`: Get a list of class traits names -- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mhasconstant) `hasConstant()`: Check if a constant exists in a class -- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mhasdescriptionlinks) `hasDescriptionLinks()`: Checking if an entity has links in its description -- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mhasexamples) `hasExamples()`: Checking if an entity has `example` docBlock -- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mhasmethod) `hasMethod()`: Check if a method exists in a class -- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mhasparentclass) `hasParentClass()`: Check if a certain parent class exists in a chain of parent classes -- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mhasproperty) `hasProperty()`: Check if a property exists in a class -- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mhasthrows) `hasThrows()`: Checking if an entity has `throws` docBlock -- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mhastraits) `hasTraits()`: Check if the class contains traits -- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mimplementsinterface) `implementsInterface()`: Check if a class implements an interface -- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#misabstract) `isAbstract()`: Check that an entity is abstract -- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#misapi) `isApi()`: Checking if an entity has `api` docBlock -- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#misattribute) `isAttribute()`: Check if a class is an attribute -- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#misclass) `isClass()`: Check if an entity is a Class -- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#misdeprecated) `isDeprecated()`: Checking if an entity has `deprecated` docBlock -- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#misentityfilecanbeload) `isEntityFileCanBeLoad()`: Checking if entity data can be retrieved -- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#misenum) `isEnum()`: Check if an entity is an Enum -- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#misinstantiable) `isInstantiable()`: Check that an entity is instantiable -- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#misinterface) `isInterface()`: Check if an entity is an Interface -- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#misinternal) `isInternal()`: Checking if an entity has `internal` docBlock -- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#missubclassof) `isSubclassOf()`: Whether the given class is a subclass of the specified class -- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mistrait) `isTrait()`: Check if an entity is a Trait -- [#](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mnormalizeclassname) `normalizeClassName()` +- [getAbsoluteFileName()](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetabsolutefilename): Returns the absolute path to a file if it can be retrieved and if the file is in the project directory +- [getAst()](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetast): Get AST for this entity +- [getConstant()](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetconstant): Get the method entity by its name +- [getConstantEntitiesCollection()](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetconstantentitiescollection): Get a collection of constant entities +- [getConstantValue()](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetconstantvalue): Get the compiled value of a constant +- [getConstants()](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetconstants): Get all constants that are available according to the configuration as an array +- [getConstantsValues()](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetconstantsvalues): Get class constant compiled values according to filters +- [getDescription()](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetdescription): Get entity description +- [getDescriptionLinks()](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetdescriptionlinks): Get parsed links from description and doc blocks `see` and `link` +- [getDocComment()](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetdoccomment): Get the doc comment of an entity +- [getDocCommentLine()](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetdoccommentline): Get the code line number where the docBlock of the current entity begins +- [getDocNote()](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetdocnote): Get the note annotation value +- [getEndLine()](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetendline): Get the line number of the end of a class code in a file +- [getExamples()](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetexamples): Get parsed examples from `examples` doc block +- [getFirstExample()](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetfirstexample): Get first example from `examples` doc block +- [getImplementingClass()](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetimplementingclass): Get the class like entity in which the current entity was implemented +- [getInterfaceNames()](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetinterfacenames): Get a list of class interface names +- [getInterfacesEntities()](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetinterfacesentities): Get a list of interface entities that the current class implements +- [getMethod()](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetmethod): Get the method entity by its name +- [getMethodEntitiesCollection()](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetmethodentitiescollection): Get a collection of method entities +- [getMethods()](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetmethods): Get all methods that are available according to the configuration as an array +- [getName()](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetname): Full name of the entity +- [getNamespaceName()](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetnamespacename): Get the entity namespace name +- [getObjectId()](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetobjectid): Get entity unique ID +- [getParentClass()](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetparentclass): Get the entity of the parent class if it exists +- [getParentClassEntities()](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetparentclassentities): Get a list of parent class entities +- [getParentClassName()](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetparentclassname): Get the name of the parent class entity if it exists +- [getParentClassNames()](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetparentclassnames): Get a list of entity names of parent classes +- [getPluginData()](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetplugindata): Get additional information added using the plugin +- [getProperties()](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetproperties): Get all properties that are available according to the configuration as an array +- [getProperty()](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetproperty): Get the property entity by its name +- [getPropertyDefaultValue()](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetpropertydefaultvalue): Get the compiled value of a property +- [getPropertyEntitiesCollection()](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetpropertyentitiescollection): Get a collection of property entities +- [getRelativeFileName()](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetrelativefilename): File name relative to project_root configuration parameter +- [getRootEntityCollection()](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetrootentitycollection): Get the collection of root entities to which this entity belongs +- [getShortName()](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetshortname): Short name of the entity +- [getStartLine()](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetstartline): Get the line number of the start of a class code in a file +- [getThrows()](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetthrows): Get parsed throws from `throws` doc block +- [getTraits()](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgettraits): Get a list of trait entities of the current class +- [getTraitsNames()](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgettraitsnames): Get a list of class traits names +- [hasConstant()](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mhasconstant): Check if a constant exists in a class +- [hasDescriptionLinks()](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mhasdescriptionlinks): Checking if an entity has links in its description +- [hasExamples()](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mhasexamples): Checking if an entity has `example` docBlock +- [hasMethod()](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mhasmethod): Check if a method exists in a class +- [hasParentClass()](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mhasparentclass): Check if a certain parent class exists in a chain of parent classes +- [hasProperty()](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mhasproperty): Check if a property exists in a class +- [hasThrows()](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mhasthrows): Checking if an entity has `throws` docBlock +- [hasTraits()](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mhastraits): Check if the class contains traits +- [implementsInterface()](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mimplementsinterface): Check if a class implements an interface +- [isAbstract()](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#misabstract): Check that an entity is abstract +- [isApi()](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#misapi): Checking if an entity has `api` docBlock +- [isAttribute()](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#misattribute): Check if a class is an attribute +- [isClass()](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#misclass): Check if an entity is a Class +- [isDeprecated()](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#misdeprecated): Checking if an entity has `deprecated` docBlock +- [isEntityFileCanBeLoad()](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#misentityfilecanbeload): Checking if entity data can be retrieved +- [isEnum()](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#misenum): Check if an entity is an Enum +- [isInstantiable()](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#misinstantiable): Check that an entity is instantiable +- [isInterface()](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#misinterface): Check if an entity is an Interface +- [isInternal()](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#misinternal): Checking if an entity has `internal` docBlock +- [isSubclassOf()](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#missubclassof): Whether the given class is a subclass of the specified class +- [isTrait()](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mistrait): Check if an entity is a Trait +- [normalizeClassName()](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mnormalizeclassname): Bring the class name to the standard format used in the system

          -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
          Last modified date: Fri Dec 15 21:27:10 2023 +0300
          Page content update date: Fri Dec 15 2023
          Made with Bumble Documentation Generator
          \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
          Last modified date: Fri Dec 15 21:27:10 2023 +0300
          Page content update date: Sat Dec 16 2023
          Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/2.parser/reflectionApi/php/phpEntitiesCollection.md b/docs/tech/2.parser/reflectionApi/php/phpEntitiesCollection.md new file mode 100644 index 00000000..36284f6c --- /dev/null +++ b/docs/tech/2.parser/reflectionApi/php/phpEntitiesCollection.md @@ -0,0 +1,28 @@ + BumbleDocGen / Technical description of the project / Parser / Reflection API / Reflection API for PHP / PHP entities collection
          + +

          PHP entities collection

          + +**PHP entities collection API methods:** + +- [add()](/docs/tech/2.parser/reflectionApi/php/classes/PhpEntitiesCollection.md#madd): Add an entity to the collection +- [filterByInterfaces()](/docs/tech/2.parser/reflectionApi/php/classes/PhpEntitiesCollection.md#mfilterbyinterfaces): Get a copy of the current collection only with entities filtered by interfaces names (filtering is only available for ClassLikeEntity) +- [filterByNameRegularExpression()](/docs/tech/2.parser/reflectionApi/php/classes/PhpEntitiesCollection.md#mfilterbynameregularexpression): Get a copy of the current collection with only entities whose names match the regular expression +- [filterByParentClassNames()](/docs/tech/2.parser/reflectionApi/php/classes/PhpEntitiesCollection.md#mfilterbyparentclassnames): Get a copy of the current collection only with entities filtered by parent classes names (filtering is only available for ClassLikeEntity) +- [filterByPaths()](/docs/tech/2.parser/reflectionApi/php/classes/PhpEntitiesCollection.md#mfilterbypaths): Get a copy of the current collection only with entities filtered by file paths (from project_root) +- [findEntity()](/docs/tech/2.parser/reflectionApi/php/classes/PhpEntitiesCollection.md#mfindentity): Find an entity in a collection +- [get()](/docs/tech/2.parser/reflectionApi/php/classes/PhpEntitiesCollection.md#mget): Get an entity from a collection (only previously added) +- [getEntityCollectionName()](/docs/tech/2.parser/reflectionApi/php/classes/PhpEntitiesCollection.md#mgetentitycollectionname): Get collection name +- [getLoadedOrCreateNew()](/docs/tech/2.parser/reflectionApi/php/classes/PhpEntitiesCollection.md#mgetloadedorcreatenew): Get an entity from the collection or create a new one if it has not yet been added +- [getOnlyAbstractClasses()](/docs/tech/2.parser/reflectionApi/php/classes/PhpEntitiesCollection.md#mgetonlyabstractclasses): Get a copy of the current collection with only abstract classes +- [getOnlyInstantiable()](/docs/tech/2.parser/reflectionApi/php/classes/PhpEntitiesCollection.md#mgetonlyinstantiable): Get a copy of the current collection with only instantiable entities +- [getOnlyInterfaces()](/docs/tech/2.parser/reflectionApi/php/classes/PhpEntitiesCollection.md#mgetonlyinterfaces): Get a copy of the current collection with only interfaces +- [getOnlyTraits()](/docs/tech/2.parser/reflectionApi/php/classes/PhpEntitiesCollection.md#mgetonlytraits): Get a copy of the current collection with only traits +- [has()](/docs/tech/2.parser/reflectionApi/php/classes/PhpEntitiesCollection.md#mhas): Check if an entity has been added to the collection +- [isEmpty()](/docs/tech/2.parser/reflectionApi/php/classes/PhpEntitiesCollection.md#misempty): Check if the collection is empty or not +- [loadEntities()](/docs/tech/2.parser/reflectionApi/php/classes/PhpEntitiesCollection.md#mloadentities): Load entities into a collection +- [remove()](/docs/tech/2.parser/reflectionApi/php/classes/PhpEntitiesCollection.md#mremove): Remove an entity from a collection +- [toArray()](/docs/tech/2.parser/reflectionApi/php/classes/PhpEntitiesCollection.md#mtoarray): Convert collection to array + +
          +
          +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
          Last modified date: Sat Dec 16 13:54:48 2023 +0300
          Page content update date: Sat Dec 16 2023
          Made with Bumble Documentation Generator
          \ No newline at end of file diff --git a/docs/tech/2.parser/reflectionApi/php/phpEnumReflectionApi.md b/docs/tech/2.parser/reflectionApi/php/phpEnumReflectionApi.md index d74f54fc..d4ecfa05 100644 --- a/docs/tech/2.parser/reflectionApi/php/phpEnumReflectionApi.md +++ b/docs/tech/2.parser/reflectionApi/php/phpEnumReflectionApi.md @@ -18,68 +18,71 @@ $enumReflection = $entitiesCollection->getLoadedOrCreateNew('SomeEnumName'); // **Enum reflection API methods:** -- [#](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetabsolutefilename) `getAbsoluteFileName()`: Returns the absolute path to a file if it can be retrieved and if the file is in the project directory -- [#](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetast) `getAst()`: Get AST for this entity -- [#](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetconstant) `getConstant()`: Get the method entity by its name -- [#](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetconstantentitiescollection) `getConstantEntitiesCollection()`: Get a collection of constant entities -- [#](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetconstantvalue) `getConstantValue()`: Get the compiled value of a constant -- [#](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetconstants) `getConstants()`: Get all constants that are available according to the configuration as an array -- [#](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetconstantsvalues) `getConstantsValues()`: Get class constant compiled values according to filters -- [#](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetdescription) `getDescription()`: Get entity description -- [#](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetdescriptionlinks) `getDescriptionLinks()`: Get parsed links from description and doc blocks `see` and `link` -- [#](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetdoccomment) `getDocComment()`: Get the doc comment of an entity -- [#](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetdoccommentline) `getDocCommentLine()`: Get the code line number where the docBlock of the current entity begins -- [#](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetdocnote) `getDocNote()`: Get the note annotation value -- [#](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetendline) `getEndLine()`: Get the line number of the end of a class code in a file -- [#](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetexamples) `getExamples()`: Get parsed examples from `examples` doc block -- [#](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetfirstexample) `getFirstExample()`: Get first example from `examples` doc block -- [#](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetimplementingclass) `getImplementingClass()`: Get the class like entity in which the current entity was implemented -- [#](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetinterfacenames) `getInterfaceNames()`: Get a list of class interface names -- [#](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetinterfacesentities) `getInterfacesEntities()`: Get a list of interface entities that the current class implements -- [#](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetmethod) `getMethod()`: Get the method entity by its name -- [#](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetmethodentitiescollection) `getMethodEntitiesCollection()`: Get a collection of method entities -- [#](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetmethods) `getMethods()`: Get all methods that are available according to the configuration as an array -- [#](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetname) `getName()`: Full name of the entity -- [#](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetnamespacename) `getNamespaceName()`: Get the entity namespace name -- [#](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetobjectid) `getObjectId()`: Get entity unique ID -- [#](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetparentclass) `getParentClass()`: Get the entity of the parent class if it exists -- [#](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetparentclassentities) `getParentClassEntities()`: Get a list of parent class entities -- [#](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetparentclassname) `getParentClassName()`: Get the name of the parent class entity if it exists -- [#](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetparentclassnames) `getParentClassNames()`: Get a list of entity names of parent classes -- [#](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetplugindata) `getPluginData()`: Get additional information added using the plugin -- [#](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetproperties) `getProperties()`: Get all properties that are available according to the configuration as an array -- [#](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetproperty) `getProperty()`: Get the property entity by its name -- [#](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetpropertydefaultvalue) `getPropertyDefaultValue()`: Get the compiled value of a property -- [#](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetpropertyentitiescollection) `getPropertyEntitiesCollection()`: Get a collection of property entities -- [#](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetrelativefilename) `getRelativeFileName()`: File name relative to project_root configuration parameter -- [#](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetrootentitycollection) `getRootEntityCollection()`: Get the collection of root entities to which this entity belongs -- [#](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetshortname) `getShortName()`: Short name of the entity -- [#](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetstartline) `getStartLine()`: Get the line number of the start of a class code in a file -- [#](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetthrows) `getThrows()`: Get parsed throws from `throws` doc block -- [#](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgettraits) `getTraits()`: Get a list of trait entities of the current class -- [#](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgettraitsnames) `getTraitsNames()`: Get a list of class traits names -- [#](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mhasconstant) `hasConstant()`: Check if a constant exists in a class -- [#](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mhasdescriptionlinks) `hasDescriptionLinks()`: Checking if an entity has links in its description -- [#](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mhasexamples) `hasExamples()`: Checking if an entity has `example` docBlock -- [#](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mhasmethod) `hasMethod()`: Check if a method exists in a class -- [#](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mhasparentclass) `hasParentClass()`: Check if a certain parent class exists in a chain of parent classes -- [#](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mhasproperty) `hasProperty()`: Check if a property exists in a class -- [#](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mhasthrows) `hasThrows()`: Checking if an entity has `throws` docBlock -- [#](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mhastraits) `hasTraits()`: Check if the class contains traits -- [#](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mimplementsinterface) `implementsInterface()`: Check if a class implements an interface -- [#](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#misabstract) `isAbstract()`: Check that an entity is abstract -- [#](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#misapi) `isApi()`: Checking if an entity has `api` docBlock -- [#](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#misclass) `isClass()`: Check if an entity is a Class -- [#](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#misdeprecated) `isDeprecated()`: Checking if an entity has `deprecated` docBlock -- [#](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#misentityfilecanbeload) `isEntityFileCanBeLoad()`: Checking if entity data can be retrieved -- [#](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#misenum) `isEnum()`: Check if an entity is an Enum -- [#](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#misinstantiable) `isInstantiable()`: Check that an entity is instantiable -- [#](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#misinterface) `isInterface()`: Check if an entity is an Interface -- [#](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#misinternal) `isInternal()`: Checking if an entity has `internal` docBlock -- [#](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#missubclassof) `isSubclassOf()`: Whether the given class is a subclass of the specified class -- [#](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mistrait) `isTrait()`: Check if an entity is a Trait -- [#](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mnormalizeclassname) `normalizeClassName()` +- [getAbsoluteFileName()](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetabsolutefilename): Returns the absolute path to a file if it can be retrieved and if the file is in the project directory +- [getAst()](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetast): Get AST for this entity +- [getCasesNames()](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetcasesnames): Get enum cases names +- [getConstant()](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetconstant): Get the method entity by its name +- [getConstantEntitiesCollection()](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetconstantentitiescollection): Get a collection of constant entities +- [getConstantValue()](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetconstantvalue): Get the compiled value of a constant +- [getConstants()](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetconstants): Get all constants that are available according to the configuration as an array +- [getConstantsValues()](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetconstantsvalues): Get class constant compiled values according to filters +- [getDescription()](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetdescription): Get entity description +- [getDescriptionLinks()](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetdescriptionlinks): Get parsed links from description and doc blocks `see` and `link` +- [getDocComment()](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetdoccomment): Get the doc comment of an entity +- [getDocCommentLine()](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetdoccommentline): Get the code line number where the docBlock of the current entity begins +- [getDocNote()](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetdocnote): Get the note annotation value +- [getEndLine()](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetendline): Get the line number of the end of a class code in a file +- [getEnumCaseValue()](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetenumcasevalue): Get enum case value +- [getEnumCases()](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetenumcases): Get enum cases values +- [getExamples()](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetexamples): Get parsed examples from `examples` doc block +- [getFirstExample()](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetfirstexample): Get first example from `examples` doc block +- [getImplementingClass()](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetimplementingclass): Get the class like entity in which the current entity was implemented +- [getInterfaceNames()](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetinterfacenames): Get a list of class interface names +- [getInterfacesEntities()](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetinterfacesentities): Get a list of interface entities that the current class implements +- [getMethod()](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetmethod): Get the method entity by its name +- [getMethodEntitiesCollection()](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetmethodentitiescollection): Get a collection of method entities +- [getMethods()](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetmethods): Get all methods that are available according to the configuration as an array +- [getName()](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetname): Full name of the entity +- [getNamespaceName()](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetnamespacename): Get the entity namespace name +- [getObjectId()](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetobjectid): Get entity unique ID +- [getParentClass()](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetparentclass): Get the entity of the parent class if it exists +- [getParentClassEntities()](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetparentclassentities): Get a list of parent class entities +- [getParentClassName()](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetparentclassname): Get the name of the parent class entity if it exists +- [getParentClassNames()](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetparentclassnames): Get a list of entity names of parent classes +- [getPluginData()](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetplugindata): Get additional information added using the plugin +- [getProperties()](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetproperties): Get all properties that are available according to the configuration as an array +- [getProperty()](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetproperty): Get the property entity by its name +- [getPropertyDefaultValue()](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetpropertydefaultvalue): Get the compiled value of a property +- [getPropertyEntitiesCollection()](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetpropertyentitiescollection): Get a collection of property entities +- [getRelativeFileName()](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetrelativefilename): File name relative to project_root configuration parameter +- [getRootEntityCollection()](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetrootentitycollection): Get the collection of root entities to which this entity belongs +- [getShortName()](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetshortname): Short name of the entity +- [getStartLine()](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetstartline): Get the line number of the start of a class code in a file +- [getThrows()](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetthrows): Get parsed throws from `throws` doc block +- [getTraits()](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgettraits): Get a list of trait entities of the current class +- [getTraitsNames()](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgettraitsnames): Get a list of class traits names +- [hasConstant()](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mhasconstant): Check if a constant exists in a class +- [hasDescriptionLinks()](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mhasdescriptionlinks): Checking if an entity has links in its description +- [hasExamples()](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mhasexamples): Checking if an entity has `example` docBlock +- [hasMethod()](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mhasmethod): Check if a method exists in a class +- [hasParentClass()](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mhasparentclass): Check if a certain parent class exists in a chain of parent classes +- [hasProperty()](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mhasproperty): Check if a property exists in a class +- [hasThrows()](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mhasthrows): Checking if an entity has `throws` docBlock +- [hasTraits()](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mhastraits): Check if the class contains traits +- [implementsInterface()](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mimplementsinterface): Check if a class implements an interface +- [isAbstract()](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#misabstract): Check that an entity is abstract +- [isApi()](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#misapi): Checking if an entity has `api` docBlock +- [isClass()](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#misclass): Check if an entity is a Class +- [isDeprecated()](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#misdeprecated): Checking if an entity has `deprecated` docBlock +- [isEntityFileCanBeLoad()](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#misentityfilecanbeload): Checking if entity data can be retrieved +- [isEnum()](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#misenum): Check if an entity is an Enum +- [isInstantiable()](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#misinstantiable): Check that an entity is instantiable +- [isInterface()](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#misinterface): Check if an entity is an Interface +- [isInternal()](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#misinternal): Checking if an entity has `internal` docBlock +- [isSubclassOf()](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#missubclassof): Whether the given class is a subclass of the specified class +- [isTrait()](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mistrait): Check if an entity is a Trait +- [normalizeClassName()](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mnormalizeclassname): Bring the class name to the standard format used in the system

          -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
          Last modified date: Fri Dec 15 21:27:10 2023 +0300
          Page content update date: Fri Dec 15 2023
          Made with Bumble Documentation Generator
          \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
          Last modified date: Fri Dec 15 21:27:10 2023 +0300
          Page content update date: Sat Dec 16 2023
          Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/2.parser/reflectionApi/php/phpInterfaceReflectionApi.md b/docs/tech/2.parser/reflectionApi/php/phpInterfaceReflectionApi.md index 1e5ff483..1f64bfe9 100644 --- a/docs/tech/2.parser/reflectionApi/php/phpInterfaceReflectionApi.md +++ b/docs/tech/2.parser/reflectionApi/php/phpInterfaceReflectionApi.md @@ -18,68 +18,68 @@ $interfaceReflection = $entitiesCollection->getLoadedOrCreateNew('SomeInterfaceN **Interface reflection API methods:** -- [#](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetabsolutefilename) `getAbsoluteFileName()`: Returns the absolute path to a file if it can be retrieved and if the file is in the project directory -- [#](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetast) `getAst()`: Get AST for this entity -- [#](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetconstant) `getConstant()`: Get the method entity by its name -- [#](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetconstantentitiescollection) `getConstantEntitiesCollection()`: Get a collection of constant entities -- [#](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetconstantvalue) `getConstantValue()`: Get the compiled value of a constant -- [#](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetconstants) `getConstants()`: Get all constants that are available according to the configuration as an array -- [#](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetconstantsvalues) `getConstantsValues()`: Get class constant compiled values according to filters -- [#](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetdescription) `getDescription()`: Get entity description -- [#](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetdescriptionlinks) `getDescriptionLinks()`: Get parsed links from description and doc blocks `see` and `link` -- [#](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetdoccomment) `getDocComment()`: Get the doc comment of an entity -- [#](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetdoccommentline) `getDocCommentLine()`: Get the code line number where the docBlock of the current entity begins -- [#](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetdocnote) `getDocNote()`: Get the note annotation value -- [#](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetendline) `getEndLine()`: Get the line number of the end of a class code in a file -- [#](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetexamples) `getExamples()`: Get parsed examples from `examples` doc block -- [#](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetfirstexample) `getFirstExample()`: Get first example from `examples` doc block -- [#](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetimplementingclass) `getImplementingClass()`: Get the class like entity in which the current entity was implemented -- [#](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetinterfacenames) `getInterfaceNames()`: Get a list of class interface names -- [#](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetinterfacesentities) `getInterfacesEntities()`: Get a list of interface entities that the current class implements -- [#](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetmethod) `getMethod()`: Get the method entity by its name -- [#](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetmethodentitiescollection) `getMethodEntitiesCollection()`: Get a collection of method entities -- [#](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetmethods) `getMethods()`: Get all methods that are available according to the configuration as an array -- [#](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetname) `getName()`: Full name of the entity -- [#](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetnamespacename) `getNamespaceName()`: Get the entity namespace name -- [#](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetobjectid) `getObjectId()`: Get entity unique ID -- [#](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetparentclass) `getParentClass()`: Get the entity of the parent class if it exists -- [#](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetparentclassentities) `getParentClassEntities()`: Get a list of parent class entities -- [#](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetparentclassname) `getParentClassName()`: Get the name of the parent class entity if it exists -- [#](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetparentclassnames) `getParentClassNames()`: Get a list of entity names of parent classes -- [#](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetplugindata) `getPluginData()`: Get additional information added using the plugin -- [#](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetproperties) `getProperties()`: Get all properties that are available according to the configuration as an array -- [#](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetproperty) `getProperty()`: Get the property entity by its name -- [#](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetpropertydefaultvalue) `getPropertyDefaultValue()`: Get the compiled value of a property -- [#](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetpropertyentitiescollection) `getPropertyEntitiesCollection()`: Get a collection of property entities -- [#](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetrelativefilename) `getRelativeFileName()`: File name relative to project_root configuration parameter -- [#](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetrootentitycollection) `getRootEntityCollection()`: Get the collection of root entities to which this entity belongs -- [#](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetshortname) `getShortName()`: Short name of the entity -- [#](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetstartline) `getStartLine()`: Get the line number of the start of a class code in a file -- [#](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetthrows) `getThrows()`: Get parsed throws from `throws` doc block -- [#](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgettraits) `getTraits()`: Get a list of trait entities of the current class -- [#](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgettraitsnames) `getTraitsNames()`: Get a list of class traits names -- [#](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mhasconstant) `hasConstant()`: Check if a constant exists in a class -- [#](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mhasdescriptionlinks) `hasDescriptionLinks()`: Checking if an entity has links in its description -- [#](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mhasexamples) `hasExamples()`: Checking if an entity has `example` docBlock -- [#](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mhasmethod) `hasMethod()`: Check if a method exists in a class -- [#](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mhasparentclass) `hasParentClass()`: Check if a certain parent class exists in a chain of parent classes -- [#](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mhasproperty) `hasProperty()`: Check if a property exists in a class -- [#](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mhasthrows) `hasThrows()`: Checking if an entity has `throws` docBlock -- [#](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mhastraits) `hasTraits()`: Check if the class contains traits -- [#](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mimplementsinterface) `implementsInterface()`: Check if a class implements an interface -- [#](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#misabstract) `isAbstract()`: Check that an entity is abstract -- [#](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#misapi) `isApi()`: Checking if an entity has `api` docBlock -- [#](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#misclass) `isClass()`: Check if an entity is a Class -- [#](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#misdeprecated) `isDeprecated()`: Checking if an entity has `deprecated` docBlock -- [#](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#misentityfilecanbeload) `isEntityFileCanBeLoad()`: Checking if entity data can be retrieved -- [#](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#misenum) `isEnum()`: Check if an entity is an Enum -- [#](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#misinstantiable) `isInstantiable()`: Check that an entity is instantiable -- [#](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#misinterface) `isInterface()`: Check if an entity is an Interface -- [#](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#misinternal) `isInternal()`: Checking if an entity has `internal` docBlock -- [#](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#missubclassof) `isSubclassOf()`: Whether the given class is a subclass of the specified class -- [#](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mistrait) `isTrait()`: Check if an entity is a Trait -- [#](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mnormalizeclassname) `normalizeClassName()` +- [getAbsoluteFileName()](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetabsolutefilename): Returns the absolute path to a file if it can be retrieved and if the file is in the project directory +- [getAst()](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetast): Get AST for this entity +- [getConstant()](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetconstant): Get the method entity by its name +- [getConstantEntitiesCollection()](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetconstantentitiescollection): Get a collection of constant entities +- [getConstantValue()](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetconstantvalue): Get the compiled value of a constant +- [getConstants()](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetconstants): Get all constants that are available according to the configuration as an array +- [getConstantsValues()](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetconstantsvalues): Get class constant compiled values according to filters +- [getDescription()](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetdescription): Get entity description +- [getDescriptionLinks()](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetdescriptionlinks): Get parsed links from description and doc blocks `see` and `link` +- [getDocComment()](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetdoccomment): Get the doc comment of an entity +- [getDocCommentLine()](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetdoccommentline): Get the code line number where the docBlock of the current entity begins +- [getDocNote()](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetdocnote): Get the note annotation value +- [getEndLine()](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetendline): Get the line number of the end of a class code in a file +- [getExamples()](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetexamples): Get parsed examples from `examples` doc block +- [getFirstExample()](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetfirstexample): Get first example from `examples` doc block +- [getImplementingClass()](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetimplementingclass): Get the class like entity in which the current entity was implemented +- [getInterfaceNames()](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetinterfacenames): Get a list of class interface names +- [getInterfacesEntities()](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetinterfacesentities): Get a list of interface entities that the current class implements +- [getMethod()](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetmethod): Get the method entity by its name +- [getMethodEntitiesCollection()](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetmethodentitiescollection): Get a collection of method entities +- [getMethods()](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetmethods): Get all methods that are available according to the configuration as an array +- [getName()](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetname): Full name of the entity +- [getNamespaceName()](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetnamespacename): Get the entity namespace name +- [getObjectId()](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetobjectid): Get entity unique ID +- [getParentClass()](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetparentclass): Get the entity of the parent class if it exists +- [getParentClassEntities()](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetparentclassentities): Get a list of parent class entities +- [getParentClassName()](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetparentclassname): Get the name of the parent class entity if it exists +- [getParentClassNames()](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetparentclassnames): Get a list of entity names of parent classes +- [getPluginData()](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetplugindata): Get additional information added using the plugin +- [getProperties()](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetproperties): Get all properties that are available according to the configuration as an array +- [getProperty()](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetproperty): Get the property entity by its name +- [getPropertyDefaultValue()](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetpropertydefaultvalue): Get the compiled value of a property +- [getPropertyEntitiesCollection()](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetpropertyentitiescollection): Get a collection of property entities +- [getRelativeFileName()](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetrelativefilename): File name relative to project_root configuration parameter +- [getRootEntityCollection()](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetrootentitycollection): Get the collection of root entities to which this entity belongs +- [getShortName()](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetshortname): Short name of the entity +- [getStartLine()](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetstartline): Get the line number of the start of a class code in a file +- [getThrows()](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetthrows): Get parsed throws from `throws` doc block +- [getTraits()](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgettraits): Get a list of trait entities of the current class +- [getTraitsNames()](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgettraitsnames): Get a list of class traits names +- [hasConstant()](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mhasconstant): Check if a constant exists in a class +- [hasDescriptionLinks()](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mhasdescriptionlinks): Checking if an entity has links in its description +- [hasExamples()](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mhasexamples): Checking if an entity has `example` docBlock +- [hasMethod()](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mhasmethod): Check if a method exists in a class +- [hasParentClass()](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mhasparentclass): Check if a certain parent class exists in a chain of parent classes +- [hasProperty()](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mhasproperty): Check if a property exists in a class +- [hasThrows()](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mhasthrows): Checking if an entity has `throws` docBlock +- [hasTraits()](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mhastraits): Check if the class contains traits +- [implementsInterface()](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mimplementsinterface): Check if a class implements an interface +- [isAbstract()](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#misabstract): Check that an entity is abstract +- [isApi()](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#misapi): Checking if an entity has `api` docBlock +- [isClass()](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#misclass): Check if an entity is a Class +- [isDeprecated()](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#misdeprecated): Checking if an entity has `deprecated` docBlock +- [isEntityFileCanBeLoad()](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#misentityfilecanbeload): Checking if entity data can be retrieved +- [isEnum()](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#misenum): Check if an entity is an Enum +- [isInstantiable()](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#misinstantiable): Check that an entity is instantiable +- [isInterface()](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#misinterface): Check if an entity is an Interface +- [isInternal()](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#misinternal): Checking if an entity has `internal` docBlock +- [isSubclassOf()](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#missubclassof): Whether the given class is a subclass of the specified class +- [isTrait()](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mistrait): Check if an entity is a Trait +- [normalizeClassName()](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mnormalizeclassname): Bring the class name to the standard format used in the system

          -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
          Last modified date: Fri Dec 15 21:27:10 2023 +0300
          Page content update date: Fri Dec 15 2023
          Made with Bumble Documentation Generator
          \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
          Last modified date: Fri Dec 15 21:27:10 2023 +0300
          Page content update date: Sat Dec 16 2023
          Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/2.parser/reflectionApi/php/phpTraitReflectionApi.md b/docs/tech/2.parser/reflectionApi/php/phpTraitReflectionApi.md index c569cc7f..159f7722 100644 --- a/docs/tech/2.parser/reflectionApi/php/phpTraitReflectionApi.md +++ b/docs/tech/2.parser/reflectionApi/php/phpTraitReflectionApi.md @@ -18,68 +18,68 @@ $traitReflection = $entitiesCollection->getLoadedOrCreateNew('SomeTraitName'); / **Trait reflection API methods:** -- [#](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetabsolutefilename) `getAbsoluteFileName()`: Returns the absolute path to a file if it can be retrieved and if the file is in the project directory -- [#](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetast) `getAst()`: Get AST for this entity -- [#](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetconstant) `getConstant()`: Get the method entity by its name -- [#](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetconstantentitiescollection) `getConstantEntitiesCollection()`: Get a collection of constant entities -- [#](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetconstantvalue) `getConstantValue()`: Get the compiled value of a constant -- [#](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetconstants) `getConstants()`: Get all constants that are available according to the configuration as an array -- [#](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetconstantsvalues) `getConstantsValues()`: Get class constant compiled values according to filters -- [#](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetdescription) `getDescription()`: Get entity description -- [#](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetdescriptionlinks) `getDescriptionLinks()`: Get parsed links from description and doc blocks `see` and `link` -- [#](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetdoccomment) `getDocComment()`: Get the doc comment of an entity -- [#](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetdoccommentline) `getDocCommentLine()`: Get the code line number where the docBlock of the current entity begins -- [#](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetdocnote) `getDocNote()`: Get the note annotation value -- [#](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetendline) `getEndLine()`: Get the line number of the end of a class code in a file -- [#](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetexamples) `getExamples()`: Get parsed examples from `examples` doc block -- [#](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetfirstexample) `getFirstExample()`: Get first example from `examples` doc block -- [#](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetimplementingclass) `getImplementingClass()`: Get the class like entity in which the current entity was implemented -- [#](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetinterfacenames) `getInterfaceNames()`: Get a list of class interface names -- [#](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetinterfacesentities) `getInterfacesEntities()`: Get a list of interface entities that the current class implements -- [#](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetmethod) `getMethod()`: Get the method entity by its name -- [#](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetmethodentitiescollection) `getMethodEntitiesCollection()`: Get a collection of method entities -- [#](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetmethods) `getMethods()`: Get all methods that are available according to the configuration as an array -- [#](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetname) `getName()`: Full name of the entity -- [#](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetnamespacename) `getNamespaceName()`: Get the entity namespace name -- [#](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetobjectid) `getObjectId()`: Get entity unique ID -- [#](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetparentclass) `getParentClass()`: Get the entity of the parent class if it exists -- [#](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetparentclassentities) `getParentClassEntities()`: Get a list of parent class entities -- [#](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetparentclassname) `getParentClassName()`: Get the name of the parent class entity if it exists -- [#](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetparentclassnames) `getParentClassNames()`: Get a list of entity names of parent classes -- [#](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetplugindata) `getPluginData()`: Get additional information added using the plugin -- [#](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetproperties) `getProperties()`: Get all properties that are available according to the configuration as an array -- [#](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetproperty) `getProperty()`: Get the property entity by its name -- [#](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetpropertydefaultvalue) `getPropertyDefaultValue()`: Get the compiled value of a property -- [#](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetpropertyentitiescollection) `getPropertyEntitiesCollection()`: Get a collection of property entities -- [#](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetrelativefilename) `getRelativeFileName()`: File name relative to project_root configuration parameter -- [#](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetrootentitycollection) `getRootEntityCollection()`: Get the collection of root entities to which this entity belongs -- [#](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetshortname) `getShortName()`: Short name of the entity -- [#](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetstartline) `getStartLine()`: Get the line number of the start of a class code in a file -- [#](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetthrows) `getThrows()`: Get parsed throws from `throws` doc block -- [#](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgettraits) `getTraits()`: Get a list of trait entities of the current class -- [#](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgettraitsnames) `getTraitsNames()`: Get a list of class traits names -- [#](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mhasconstant) `hasConstant()`: Check if a constant exists in a class -- [#](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mhasdescriptionlinks) `hasDescriptionLinks()`: Checking if an entity has links in its description -- [#](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mhasexamples) `hasExamples()`: Checking if an entity has `example` docBlock -- [#](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mhasmethod) `hasMethod()`: Check if a method exists in a class -- [#](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mhasparentclass) `hasParentClass()`: Check if a certain parent class exists in a chain of parent classes -- [#](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mhasproperty) `hasProperty()`: Check if a property exists in a class -- [#](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mhasthrows) `hasThrows()`: Checking if an entity has `throws` docBlock -- [#](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mhastraits) `hasTraits()`: Check if the class contains traits -- [#](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mimplementsinterface) `implementsInterface()`: Check if a class implements an interface -- [#](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#misabstract) `isAbstract()`: Check that an entity is abstract -- [#](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#misapi) `isApi()`: Checking if an entity has `api` docBlock -- [#](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#misclass) `isClass()`: Check if an entity is a Class -- [#](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#misdeprecated) `isDeprecated()`: Checking if an entity has `deprecated` docBlock -- [#](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#misentityfilecanbeload) `isEntityFileCanBeLoad()`: Checking if entity data can be retrieved -- [#](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#misenum) `isEnum()`: Check if an entity is an Enum -- [#](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#misinstantiable) `isInstantiable()`: Check that an entity is instantiable -- [#](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#misinterface) `isInterface()`: Check if an entity is an Interface -- [#](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#misinternal) `isInternal()`: Checking if an entity has `internal` docBlock -- [#](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#missubclassof) `isSubclassOf()`: Whether the given class is a subclass of the specified class -- [#](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mistrait) `isTrait()`: Check if an entity is a Trait -- [#](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mnormalizeclassname) `normalizeClassName()` +- [getAbsoluteFileName()](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetabsolutefilename): Returns the absolute path to a file if it can be retrieved and if the file is in the project directory +- [getAst()](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetast): Get AST for this entity +- [getConstant()](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetconstant): Get the method entity by its name +- [getConstantEntitiesCollection()](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetconstantentitiescollection): Get a collection of constant entities +- [getConstantValue()](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetconstantvalue): Get the compiled value of a constant +- [getConstants()](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetconstants): Get all constants that are available according to the configuration as an array +- [getConstantsValues()](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetconstantsvalues): Get class constant compiled values according to filters +- [getDescription()](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetdescription): Get entity description +- [getDescriptionLinks()](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetdescriptionlinks): Get parsed links from description and doc blocks `see` and `link` +- [getDocComment()](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetdoccomment): Get the doc comment of an entity +- [getDocCommentLine()](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetdoccommentline): Get the code line number where the docBlock of the current entity begins +- [getDocNote()](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetdocnote): Get the note annotation value +- [getEndLine()](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetendline): Get the line number of the end of a class code in a file +- [getExamples()](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetexamples): Get parsed examples from `examples` doc block +- [getFirstExample()](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetfirstexample): Get first example from `examples` doc block +- [getImplementingClass()](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetimplementingclass): Get the class like entity in which the current entity was implemented +- [getInterfaceNames()](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetinterfacenames): Get a list of class interface names +- [getInterfacesEntities()](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetinterfacesentities): Get a list of interface entities that the current class implements +- [getMethod()](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetmethod): Get the method entity by its name +- [getMethodEntitiesCollection()](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetmethodentitiescollection): Get a collection of method entities +- [getMethods()](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetmethods): Get all methods that are available according to the configuration as an array +- [getName()](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetname): Full name of the entity +- [getNamespaceName()](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetnamespacename): Get the entity namespace name +- [getObjectId()](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetobjectid): Get entity unique ID +- [getParentClass()](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetparentclass): Get the entity of the parent class if it exists +- [getParentClassEntities()](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetparentclassentities): Get a list of parent class entities +- [getParentClassName()](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetparentclassname): Get the name of the parent class entity if it exists +- [getParentClassNames()](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetparentclassnames): Get a list of entity names of parent classes +- [getPluginData()](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetplugindata): Get additional information added using the plugin +- [getProperties()](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetproperties): Get all properties that are available according to the configuration as an array +- [getProperty()](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetproperty): Get the property entity by its name +- [getPropertyDefaultValue()](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetpropertydefaultvalue): Get the compiled value of a property +- [getPropertyEntitiesCollection()](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetpropertyentitiescollection): Get a collection of property entities +- [getRelativeFileName()](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetrelativefilename): File name relative to project_root configuration parameter +- [getRootEntityCollection()](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetrootentitycollection): Get the collection of root entities to which this entity belongs +- [getShortName()](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetshortname): Short name of the entity +- [getStartLine()](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetstartline): Get the line number of the start of a class code in a file +- [getThrows()](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetthrows): Get parsed throws from `throws` doc block +- [getTraits()](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgettraits): Get a list of trait entities of the current class +- [getTraitsNames()](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgettraitsnames): Get a list of class traits names +- [hasConstant()](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mhasconstant): Check if a constant exists in a class +- [hasDescriptionLinks()](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mhasdescriptionlinks): Checking if an entity has links in its description +- [hasExamples()](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mhasexamples): Checking if an entity has `example` docBlock +- [hasMethod()](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mhasmethod): Check if a method exists in a class +- [hasParentClass()](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mhasparentclass): Check if a certain parent class exists in a chain of parent classes +- [hasProperty()](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mhasproperty): Check if a property exists in a class +- [hasThrows()](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mhasthrows): Checking if an entity has `throws` docBlock +- [hasTraits()](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mhastraits): Check if the class contains traits +- [implementsInterface()](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mimplementsinterface): Check if a class implements an interface +- [isAbstract()](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#misabstract): Check that an entity is abstract +- [isApi()](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#misapi): Checking if an entity has `api` docBlock +- [isClass()](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#misclass): Check if an entity is a Class +- [isDeprecated()](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#misdeprecated): Checking if an entity has `deprecated` docBlock +- [isEntityFileCanBeLoad()](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#misentityfilecanbeload): Checking if entity data can be retrieved +- [isEnum()](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#misenum): Check if an entity is an Enum +- [isInstantiable()](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#misinstantiable): Check that an entity is instantiable +- [isInterface()](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#misinterface): Check if an entity is an Interface +- [isInternal()](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#misinternal): Checking if an entity has `internal` docBlock +- [isSubclassOf()](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#missubclassof): Whether the given class is a subclass of the specified class +- [isTrait()](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mistrait): Check if an entity is a Trait +- [normalizeClassName()](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mnormalizeclassname): Bring the class name to the standard format used in the system

          -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
          Last modified date: Fri Dec 15 21:27:10 2023 +0300
          Page content update date: Fri Dec 15 2023
          Made with Bumble Documentation Generator
          \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
          Last modified date: Fri Dec 15 21:27:10 2023 +0300
          Page content update date: Sat Dec 16 2023
          Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/2.parser/reflectionApi/php/readme.md b/docs/tech/2.parser/reflectionApi/php/readme.md index a77fbaa2..51f855f2 100644 --- a/docs/tech/2.parser/reflectionApi/php/readme.md +++ b/docs/tech/2.parser/reflectionApi/php/readme.md @@ -25,9 +25,41 @@ $classReflection = $entitiesCollection->getLoadedOrCreateNew('SomeClassName'); / $entityName = $classReflection->getName(); $entityDescription = $classReflection->getDescription(); $entityClassCodeStartLine = $classReflection->getStartLine(); + // ... etc. ``` +

          Entities collection

          + +Class reflections are stored in collections. The collection is filled either before documents are generated, +if the Reflection API is used to generate documentation, or when special methods are called that, under certain conditions, fill them with the required reflections. + +You can perform a number of filtering and searching operations on a collection of entities. +The collections API is presented on this page: PHP entities collection + +**Usage example:** + +```php +// Create an empty collection +$entitiesCollection = (new \BumbleDocGen\DocGeneratorFactory())->getRootEntityReflections($reflectionApiConfig); + +// Fill the collection with entities +$entitiesCollection->loadEntities( + $sourceLocators, // Source locators are needed so that we can determine all the files that will be traversed to fill the collection with data + $filters // We can define special filters according to which entities will be loaded +); + +$classReflection = $entitiesCollection->get('SomeClassName'); + +$entitiesCollection = $entitiesCollection + ->filterByInterfaces(['SomeNamespace\Interface1', 'SomeNamespace\Interface2']) + ->filterByParentClassNames(['SomeNamespace\ParentClass']); + +foreach($entitiesCollection as $classReflection) { + $name = $classReflection->getName(); +} +``` +

          Class like sub entities reflections

          PHP classes contain methods, properties and constants. Below is information about these child entities: @@ -55,4 +87,4 @@ $firstMethodReturnValue = $methodReflection->getFirstReturnValue();

          -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
          Last modified date: Fri Dec 15 21:27:10 2023 +0300
          Page content update date: Fri Dec 15 2023
          Made with Bumble Documentation Generator
          \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
          Last modified date: Sat Dec 16 13:54:48 2023 +0300
          Page content update date: Sat Dec 16 2023
          Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/2.parser/reflectionApi/readme.md b/docs/tech/2.parser/reflectionApi/readme.md index 0e6e0bab..3bc182fd 100644 --- a/docs/tech/2.parser/reflectionApi/readme.md +++ b/docs/tech/2.parser/reflectionApi/readme.md @@ -58,4 +58,4 @@ In addition, add - + - Add an entity to the collection
        94. clearOperationsLogCollection
        95. filterByInterfaces - - Retrieving all entities that implement the specified interfaces. Filtering is only available for ClassLikeEntity.
        96. + - Get a copy of the current collection only with entities filtered by interfaces names (filtering is only available for ClassLikeEntity)
        97. filterByNameRegularExpression -
        98. + - Get a copy of the current collection with only entities whose names match the regular expression
        99. filterByParentClassNames - - Retrieving all entities that inherit from the specified classes. Filtering is only available for ClassLikeEntity.
        100. + - Get a copy of the current collection only with entities filtered by parent classes names (filtering is only available for ClassLikeEntity)
        101. filterByPaths - - Filtering entities by relative files paths (from project_root) of the project
        102. + - Get a copy of the current collection only with entities filtered by file paths (from project_root)
        103. findEntity -
        104. + - Find an entity in a collection
        105. get -
        106. -
        107. - getEntityByClassName -
        108. + - Get an entity from a collection (only previously added)
        109. getEntityCollectionName -
        110. + - Get collection name
        111. getEntityLinkData
        112. @@ -71,28 +68,25 @@ final class PhpEntitiesCollection extends \BumbleDocGen\Core\Parser\Entity\Logga
        113. getLoadedOrCreateNew -
        114. + - Get an entity from the collection or create a new one if it has not yet been added
        115. getOnlyAbstractClasses -
        116. + - Get a copy of the current collection with only abstract classes
        117. getOnlyInstantiable - - Retrieving only instantiable entities. Filtering is only available for ClassLikeEntity.
        118. + - Get a copy of the current collection with only instantiable entities
        119. getOnlyInterfaces -
        120. + - Get a copy of the current collection with only interfaces
        121. getOnlyTraits -
        122. + - Get a copy of the current collection with only traits
        123. getOperationsLogCollection
        124. -
        125. - getPluginEventDispatcher -
        126. has -
        127. + - Check if an entity has been added to the collection
        128. internalFindEntity
        129. @@ -101,7 +95,7 @@ final class PhpEntitiesCollection extends \BumbleDocGen\Core\Parser\Entity\Logga
        130. isEmpty -
        131. + - Check if the collection is empty or not
        132. loadEntities - Load entities into a collection
        133. @@ -110,10 +104,10 @@ final class PhpEntitiesCollection extends \BumbleDocGen\Core\Parser\Entity\Logga - Load entities into a collection by configuration
        134. remove -
        135. + - Remove an entity from a collection
        136. toArray -
        137. + - Convert collection to array
        138. updateEntitiesCache
        139. @@ -211,14 +205,14 @@ public function __construct(\BumbleDocGen\Core\Configuration\Configuration $conf ```php public function add(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity $classEntity, bool $reload = false): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; ``` - +
          Add an entity to the collection
          Parameters: @@ -284,14 +278,14 @@ public function clearOperationsLogCollection(): void; ```php public function filterByInterfaces(array $interfaces): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; ``` -
          Retrieving all entities that implement the specified interfaces. Filtering is only available for ClassLikeEntity.
          +
          Get a copy of the current collection only with entities filtered by interfaces names (filtering is only available for ClassLikeEntity)
          Parameters: @@ -329,14 +323,14 @@ public function filterByInterfaces(array $interfaces): \BumbleDocGen\LanguageHan ```php public function filterByNameRegularExpression(string $regexPattern): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; ``` - +
          Get a copy of the current collection with only entities whose names match the regular expression
          Parameters: @@ -367,14 +361,14 @@ public function filterByNameRegularExpression(string $regexPattern): \BumbleDocG ```php public function filterByParentClassNames(array $parentClassNames): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; ``` -
          Retrieving all entities that inherit from the specified classes. Filtering is only available for ClassLikeEntity.
          +
          Get a copy of the current collection only with entities filtered by parent classes names (filtering is only available for ClassLikeEntity)
          Parameters: @@ -412,14 +406,14 @@ public function filterByParentClassNames(array $parentClassNames): \BumbleDocGen ```php public function filterByPaths(array $paths): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; ``` -
          Filtering entities by relative files paths (from project_root) of the project
          +
          Get a copy of the current collection only with entities filtered by file paths (from project_root)
          Parameters: @@ -466,7 +460,7 @@ public function filterByPaths(array $paths): \BumbleDocGen\LanguageHandler\Php\P public function findEntity(string $search, bool $useUnsafeKeys = true): null|\BumbleDocGen\Core\Parser\Entity\RootEntityInterface; ``` - +
          Find an entity in a collection
          Parameters: @@ -511,7 +505,7 @@ public function findEntity(string $search, bool $useUnsafeKeys = true): null|\Bu public function get(string $objectName): null|\BumbleDocGen\Core\Parser\Entity\RootEntityInterface; ``` - +
          Get an entity from a collection (only previously added)
          Parameters: @@ -535,49 +529,6 @@ public function get(string $objectName): null|\BumbleDocGen\Core\Parser\Entity\R Return value: null | \BumbleDocGen\Core\Parser\Entity\RootEntityInterface - -
          -
          - - - -```php -public function getEntityByClassName(string $className, bool $createIfNotExists = true): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
          NameTypeDescription
          $classNamestring-
          $createIfNotExistsbool-
          - -Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -

          @@ -585,14 +536,14 @@ public function getEntityByClassName(string $className, bool $createIfNotExists ```php public function getEntityCollectionName(): string; ``` - +
          Get collection name
          Parameters: not specified @@ -606,7 +557,7 @@ public function getEntityCollectionName(): string; ```php @@ -687,7 +638,7 @@ public function getIterator(): \Generator; public function getLoadedOrCreateNew(string $objectName, bool $withAddClassEntityToCollectionEvent = false): \BumbleDocGen\Core\Parser\Entity\RootEntityInterface; ``` - +
          Get an entity from the collection or create a new one if it has not yet been added
          Parameters: @@ -729,14 +680,14 @@ public function getLoadedOrCreateNew(string $objectName, bool $withAddClassEntit ```php public function getOnlyAbstractClasses(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; ``` - +
          Get a copy of the current collection with only abstract classes
          Parameters: not specified @@ -757,14 +708,14 @@ public function getOnlyAbstractClasses(): \BumbleDocGen\LanguageHandler\Php\Pars ```php public function getOnlyInstantiable(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; ``` -
          Retrieving only instantiable entities. Filtering is only available for ClassLikeEntity.
          +
          Get a copy of the current collection with only instantiable entities
          Parameters: not specified @@ -778,14 +729,14 @@ public function getOnlyInstantiable(): \BumbleDocGen\LanguageHandler\Php\Parser\ ```php public function getOnlyInterfaces(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; ``` - +
          Get a copy of the current collection with only interfaces
          Parameters: not specified @@ -799,14 +750,14 @@ public function getOnlyInterfaces(): \BumbleDocGen\LanguageHandler\Php\Parser\En ```php public function getOnlyTraits(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; ``` - +
          Get a copy of the current collection with only traits
          Parameters: not specified @@ -836,27 +787,6 @@ public function getOperationsLogCollection(): \BumbleDocGen\Core\Parser\Entity\C Return value: \BumbleDocGen\Core\Parser\Entity\CollectionLogOperation\OperationsCollection -
          -
          -
          - - - -```php -public function getPluginEventDispatcher(): \BumbleDocGen\Core\Plugin\PluginEventDispatcher; -``` - - - -Parameters: not specified - -Return value: \BumbleDocGen\Core\Plugin\PluginEventDispatcher - -

          @@ -864,7 +794,7 @@ public function getPluginEventDispatcher(): \BumbleDocGen\Core\Plugin\PluginEven ```php @@ -873,7 +803,7 @@ public function getPluginEventDispatcher(): \BumbleDocGen\Core\Plugin\PluginEven public function has(string $objectName): bool; ``` - +
          Check if an entity has been added to the collection
          Parameters: @@ -904,7 +834,7 @@ public function has(string $objectName): bool; ```php @@ -964,7 +894,7 @@ $entitiesCollection->findEntity('https://github.com/bumble-tech/bumble-doc-gen/b ```php @@ -1020,7 +950,7 @@ public function internalGetLoadedOrCreateNew(string $objectName, bool $withAddCl ```php @@ -1029,7 +959,7 @@ public function internalGetLoadedOrCreateNew(string $objectName, bool $withAddCl public function isEmpty(): bool; ``` - +
          Check if the collection is empty or not
          Parameters: not specified @@ -1043,7 +973,7 @@ public function isEmpty(): bool; ```php @@ -1107,7 +1037,7 @@ public function loadEntities(\BumbleDocGen\Core\Parser\SourceLocator\SourceLocat ```php @@ -1161,7 +1091,7 @@ public function loadEntitiesByConfiguration(\BumbleDocGen\Core\Parser\Entity\Ent ```php @@ -1170,7 +1100,7 @@ public function loadEntitiesByConfiguration(\BumbleDocGen\Core\Parser\Entity\Ent public function remove(string $objectName): void; ``` - +
          Remove an entity from a collection
          Parameters: @@ -1201,7 +1131,7 @@ public function remove(string $objectName): void; ```php @@ -1210,7 +1140,7 @@ public function remove(string $objectName): void; public function toArray(): array; ``` - +
          Convert collection to array
          Parameters: not specified @@ -1224,7 +1154,7 @@ public function toArray(): array; ```php diff --git a/docs/tech/3.renderer/classes/PhpEntitiesCollection_2.md b/docs/tech/3.renderer/classes/PhpEntitiesCollection_2.md index c9e44de5..4fdbec17 100644 --- a/docs/tech/3.renderer/classes/PhpEntitiesCollection_2.md +++ b/docs/tech/3.renderer/classes/PhpEntitiesCollection_2.md @@ -35,34 +35,31 @@ final class PhpEntitiesCollection extends \BumbleDocGen\Core\Parser\Entity\Logga
          1. add -
          2. + - Add an entity to the collection
          3. clearOperationsLogCollection
          4. filterByInterfaces - - Retrieving all entities that implement the specified interfaces. Filtering is only available for ClassLikeEntity.
          5. + - Get a copy of the current collection only with entities filtered by interfaces names (filtering is only available for ClassLikeEntity)
          6. filterByNameRegularExpression -
          7. + - Get a copy of the current collection with only entities whose names match the regular expression
          8. filterByParentClassNames - - Retrieving all entities that inherit from the specified classes. Filtering is only available for ClassLikeEntity.
          9. + - Get a copy of the current collection only with entities filtered by parent classes names (filtering is only available for ClassLikeEntity)
          10. filterByPaths - - Filtering entities by relative files paths (from project_root) of the project
          11. + - Get a copy of the current collection only with entities filtered by file paths (from project_root)
          12. findEntity -
          13. + - Find an entity in a collection
          14. get -
          15. -
          16. - getEntityByClassName -
          17. + - Get an entity from a collection (only previously added)
          18. getEntityCollectionName -
          19. + - Get collection name
          20. getEntityLinkData
          21. @@ -71,28 +68,25 @@ final class PhpEntitiesCollection extends \BumbleDocGen\Core\Parser\Entity\Logga
          22. getLoadedOrCreateNew -
          23. + - Get an entity from the collection or create a new one if it has not yet been added
          24. getOnlyAbstractClasses -
          25. + - Get a copy of the current collection with only abstract classes
          26. getOnlyInstantiable - - Retrieving only instantiable entities. Filtering is only available for ClassLikeEntity.
          27. + - Get a copy of the current collection with only instantiable entities
          28. getOnlyInterfaces -
          29. + - Get a copy of the current collection with only interfaces
          30. getOnlyTraits -
          31. + - Get a copy of the current collection with only traits
          32. getOperationsLogCollection
          33. -
          34. - getPluginEventDispatcher -
          35. has -
          36. + - Check if an entity has been added to the collection
          37. internalFindEntity
          38. @@ -101,7 +95,7 @@ final class PhpEntitiesCollection extends \BumbleDocGen\Core\Parser\Entity\Logga
          39. isEmpty -
          40. + - Check if the collection is empty or not
          41. loadEntities - Load entities into a collection
          42. @@ -110,10 +104,10 @@ final class PhpEntitiesCollection extends \BumbleDocGen\Core\Parser\Entity\Logga - Load entities into a collection by configuration
          43. remove -
          44. + - Remove an entity from a collection
          45. toArray -
          46. + - Convert collection to array
          47. updateEntitiesCache
          48. @@ -211,14 +205,14 @@ public function __construct(\BumbleDocGen\Core\Configuration\Configuration $conf ```php public function add(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity $classEntity, bool $reload = false): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; ``` - +
            Add an entity to the collection
            Parameters: @@ -284,14 +278,14 @@ public function clearOperationsLogCollection(): void; ```php public function filterByInterfaces(array $interfaces): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; ``` -
            Retrieving all entities that implement the specified interfaces. Filtering is only available for ClassLikeEntity.
            +
            Get a copy of the current collection only with entities filtered by interfaces names (filtering is only available for ClassLikeEntity)
            Parameters: @@ -329,14 +323,14 @@ public function filterByInterfaces(array $interfaces): \BumbleDocGen\LanguageHan ```php public function filterByNameRegularExpression(string $regexPattern): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; ``` - +
            Get a copy of the current collection with only entities whose names match the regular expression
            Parameters: @@ -367,14 +361,14 @@ public function filterByNameRegularExpression(string $regexPattern): \BumbleDocG ```php public function filterByParentClassNames(array $parentClassNames): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; ``` -
            Retrieving all entities that inherit from the specified classes. Filtering is only available for ClassLikeEntity.
            +
            Get a copy of the current collection only with entities filtered by parent classes names (filtering is only available for ClassLikeEntity)
            Parameters: @@ -412,14 +406,14 @@ public function filterByParentClassNames(array $parentClassNames): \BumbleDocGen ```php public function filterByPaths(array $paths): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; ``` -
            Filtering entities by relative files paths (from project_root) of the project
            +
            Get a copy of the current collection only with entities filtered by file paths (from project_root)
            Parameters: @@ -466,7 +460,7 @@ public function filterByPaths(array $paths): \BumbleDocGen\LanguageHandler\Php\P public function findEntity(string $search, bool $useUnsafeKeys = true): null|\BumbleDocGen\Core\Parser\Entity\RootEntityInterface; ``` - +
            Find an entity in a collection
            Parameters: @@ -511,7 +505,7 @@ public function findEntity(string $search, bool $useUnsafeKeys = true): null|\Bu public function get(string $objectName): null|\BumbleDocGen\Core\Parser\Entity\RootEntityInterface; ``` - +
            Get an entity from a collection (only previously added)
            Parameters: @@ -535,49 +529,6 @@ public function get(string $objectName): null|\BumbleDocGen\Core\Parser\Entity\R Return value: null | \BumbleDocGen\Core\Parser\Entity\RootEntityInterface -
          -
          -
          - - - -```php -public function getEntityByClassName(string $className, bool $createIfNotExists = true): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
          NameTypeDescription
          $classNamestring-
          $createIfNotExistsbool-
          - -Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -

          @@ -585,14 +536,14 @@ public function getEntityByClassName(string $className, bool $createIfNotExists ```php public function getEntityCollectionName(): string; ``` - +
          Get collection name
          Parameters: not specified @@ -606,7 +557,7 @@ public function getEntityCollectionName(): string; ```php @@ -687,7 +638,7 @@ public function getIterator(): \Generator; public function getLoadedOrCreateNew(string $objectName, bool $withAddClassEntityToCollectionEvent = false): \BumbleDocGen\Core\Parser\Entity\RootEntityInterface; ``` - +
          Get an entity from the collection or create a new one if it has not yet been added
          Parameters: @@ -729,14 +680,14 @@ public function getLoadedOrCreateNew(string $objectName, bool $withAddClassEntit ```php public function getOnlyAbstractClasses(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; ``` - +
          Get a copy of the current collection with only abstract classes
          Parameters: not specified @@ -757,14 +708,14 @@ public function getOnlyAbstractClasses(): \BumbleDocGen\LanguageHandler\Php\Pars ```php public function getOnlyInstantiable(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; ``` -
          Retrieving only instantiable entities. Filtering is only available for ClassLikeEntity.
          +
          Get a copy of the current collection with only instantiable entities
          Parameters: not specified @@ -778,14 +729,14 @@ public function getOnlyInstantiable(): \BumbleDocGen\LanguageHandler\Php\Parser\ ```php public function getOnlyInterfaces(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; ``` - +
          Get a copy of the current collection with only interfaces
          Parameters: not specified @@ -799,14 +750,14 @@ public function getOnlyInterfaces(): \BumbleDocGen\LanguageHandler\Php\Parser\En ```php public function getOnlyTraits(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; ``` - +
          Get a copy of the current collection with only traits
          Parameters: not specified @@ -836,27 +787,6 @@ public function getOperationsLogCollection(): \BumbleDocGen\Core\Parser\Entity\C Return value: \BumbleDocGen\Core\Parser\Entity\CollectionLogOperation\OperationsCollection -
          -
          -
          - - - -```php -public function getPluginEventDispatcher(): \BumbleDocGen\Core\Plugin\PluginEventDispatcher; -``` - - - -Parameters: not specified - -Return value: \BumbleDocGen\Core\Plugin\PluginEventDispatcher - -

          @@ -864,7 +794,7 @@ public function getPluginEventDispatcher(): \BumbleDocGen\Core\Plugin\PluginEven ```php @@ -873,7 +803,7 @@ public function getPluginEventDispatcher(): \BumbleDocGen\Core\Plugin\PluginEven public function has(string $objectName): bool; ``` - +
          Check if an entity has been added to the collection
          Parameters: @@ -904,7 +834,7 @@ public function has(string $objectName): bool; ```php @@ -964,7 +894,7 @@ $entitiesCollection->findEntity('https://github.com/bumble-tech/bumble-doc-gen/b ```php @@ -1020,7 +950,7 @@ public function internalGetLoadedOrCreateNew(string $objectName, bool $withAddCl ```php @@ -1029,7 +959,7 @@ public function internalGetLoadedOrCreateNew(string $objectName, bool $withAddCl public function isEmpty(): bool; ``` - +
          Check if the collection is empty or not
          Parameters: not specified @@ -1043,7 +973,7 @@ public function isEmpty(): bool; ```php @@ -1107,7 +1037,7 @@ public function loadEntities(\BumbleDocGen\Core\Parser\SourceLocator\SourceLocat ```php @@ -1161,7 +1091,7 @@ public function loadEntitiesByConfiguration(\BumbleDocGen\Core\Parser\Entity\Ent ```php @@ -1170,7 +1100,7 @@ public function loadEntitiesByConfiguration(\BumbleDocGen\Core\Parser\Entity\Ent public function remove(string $objectName): void; ``` - +
          Remove an entity from a collection
          Parameters: @@ -1201,7 +1131,7 @@ public function remove(string $objectName): void; ```php @@ -1210,7 +1140,7 @@ public function remove(string $objectName): void; public function toArray(): array; ``` - +
          Convert collection to array
          Parameters: not specified @@ -1224,7 +1154,7 @@ public function toArray(): array; ```php diff --git a/docs/tech/3.renderer/classes/RootEntityCollection.md b/docs/tech/3.renderer/classes/RootEntityCollection.md index a641442b..39cf71c5 100644 --- a/docs/tech/3.renderer/classes/RootEntityCollection.md +++ b/docs/tech/3.renderer/classes/RootEntityCollection.md @@ -28,13 +28,13 @@ abstract class RootEntityCollection extends \BumbleDocGen\Core\Parser\Entity\Bas
          1. findEntity -
          2. + - Find an entity in a collection
          3. get -
          4. + - Get an entity from a collection (only previously added)
          5. getEntityCollectionName -
          6. + - Get collection name
          7. getEntityLinkData
          8. @@ -43,13 +43,13 @@ abstract class RootEntityCollection extends \BumbleDocGen\Core\Parser\Entity\Bas
          9. getLoadedOrCreateNew -
          10. + - Get an entity from the collection or create a new one if it has not yet been added
          11. has -
          12. + - Check if an entity has been added to the collection
          13. isEmpty -
          14. + - Check if the collection is empty or not
          15. loadEntities
          16. @@ -58,10 +58,10 @@ abstract class RootEntityCollection extends \BumbleDocGen\Core\Parser\Entity\Bas
          17. remove -
          18. + - Remove an entity from a collection
          19. toArray -
          20. + - Convert collection to array
          21. updateEntitiesCache
          22. @@ -80,14 +80,14 @@ abstract class RootEntityCollection extends \BumbleDocGen\Core\Parser\Entity\Bas ```php public function findEntity(string $search, bool $useUnsafeKeys = true): null|\BumbleDocGen\Core\Parser\Entity\RootEntityInterface; ``` - +
            Find an entity in a collection
            Parameters: @@ -123,14 +123,14 @@ public function findEntity(string $search, bool $useUnsafeKeys = true): null|\Bu ```php public function get(string $objectName): null|\BumbleDocGen\Core\Parser\Entity\RootEntityInterface; ``` - +
            Get an entity from a collection (only previously added)
            Parameters: @@ -161,14 +161,14 @@ public function get(string $objectName): null|\BumbleDocGen\Core\Parser\Entity\R ```php public function getEntityCollectionName(): string; ``` - +
            Get collection name
            Parameters: not specified @@ -182,7 +182,7 @@ public function getEntityCollectionName(): string; ```php @@ -254,14 +254,14 @@ public function getIterator(): \Generator; ```php public function getLoadedOrCreateNew(string $objectName, bool $withAddClassEntityToCollectionEvent = false): \BumbleDocGen\Core\Parser\Entity\RootEntityInterface; ``` - +
            Get an entity from the collection or create a new one if it has not yet been added
            Parameters: @@ -303,7 +303,7 @@ public function getLoadedOrCreateNew(string $objectName, bool $withAddClassEntit ```php @@ -312,7 +312,7 @@ public function getLoadedOrCreateNew(string $objectName, bool $withAddClassEntit public function has(string $objectName): bool; ``` - +
            Check if an entity has been added to the collection
            Parameters: @@ -343,7 +343,7 @@ public function has(string $objectName): bool; ```php @@ -352,7 +352,7 @@ public function has(string $objectName): bool; public function isEmpty(): bool; ``` - +
            Check if the collection is empty or not
            Parameters: not specified @@ -452,7 +452,7 @@ public function loadEntitiesByConfiguration(\BumbleDocGen\Core\Parser\Entity\Ent ```php @@ -461,7 +461,7 @@ public function loadEntitiesByConfiguration(\BumbleDocGen\Core\Parser\Entity\Ent public function remove(string $objectName): void; ``` - +
            Remove an entity from a collection
            Parameters: @@ -492,14 +492,14 @@ public function remove(string $objectName): void; ```php public function toArray(): array; ``` - +
            Convert collection to array
            Parameters: not specified @@ -513,7 +513,7 @@ public function toArray(): array; ```php diff --git a/docs/tech/3.renderer/readme.md b/docs/tech/3.renderer/readme.md index 258fdd3a..b1531d66 100644 --- a/docs/tech/3.renderer/readme.md +++ b/docs/tech/3.renderer/readme.md @@ -60,4 +60,4 @@ This process is presented in the form of a diagram below.

            -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
            Last modified date: Sat Sep 2 21:01:47 2023 +0300
            Page content update date: Fri Dec 15 2023
            Made with Bumble Documentation Generator
            \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
            Last modified date: Sat Sep 2 21:01:47 2023 +0300
            Page content update date: Sat Dec 16 2023
            Made with Bumble Documentation Generator
          \ No newline at end of file diff --git a/docs/tech/3.renderer/templatesDynamicBlocks.md b/docs/tech/3.renderer/templatesDynamicBlocks.md index 3df9d5dc..950f280e 100644 --- a/docs/tech/3.renderer/templatesDynamicBlocks.md +++ b/docs/tech/3.renderer/templatesDynamicBlocks.md @@ -26,4 +26,4 @@ You can use the built-in functions and filters or add your own, so you can imple

          -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
          Last modified date: Mon Nov 20 19:18:48 2023 +0300
          Page content update date: Fri Dec 15 2023
          Made with Bumble Documentation Generator
          \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
          Last modified date: Mon Nov 20 19:18:48 2023 +0300
          Page content update date: Sat Dec 16 2023
          Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/3.renderer/templatesLinking.md b/docs/tech/3.renderer/templatesLinking.md index 3b97dfab..fa430fd1 100644 --- a/docs/tech/3.renderer/templatesLinking.md +++ b/docs/tech/3.renderer/templatesLinking.md @@ -27,4 +27,4 @@ You can also implement your own functions for relinking if necessary.

          -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
          Last modified date: Sat Oct 28 11:03:31 2023 +0300
          Page content update date: Fri Dec 15 2023
          Made with Bumble Documentation Generator
          \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
          Last modified date: Sat Oct 28 11:03:31 2023 +0300
          Page content update date: Sat Dec 16 2023
          Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/3.renderer/templatesVariables.md b/docs/tech/3.renderer/templatesVariables.md index 4524717f..a2be49c6 100644 --- a/docs/tech/3.renderer/templatesVariables.md +++ b/docs/tech/3.renderer/templatesVariables.md @@ -11,4 +11,4 @@ There are several variables available in each processed template.

          -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
          Last modified date: Mon Nov 20 20:31:30 2023 +0300
          Page content update date: Fri Dec 15 2023
          Made with Bumble Documentation Generator
          \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
          Last modified date: Mon Nov 20 20:31:30 2023 +0300
          Page content update date: Sat Dec 16 2023
          Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/4.pluginSystem/readme.md b/docs/tech/4.pluginSystem/readme.md index 526b5685..fce90717 100644 --- a/docs/tech/4.pluginSystem/readme.md +++ b/docs/tech/4.pluginSystem/readme.md @@ -190,4 +190,4 @@ plugins:

          -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
          Last modified date: Mon Nov 20 23:05:39 2023 +0300
          Page content update date: Fri Dec 15 2023
          Made with Bumble Documentation Generator
          \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
          Last modified date: Mon Nov 20 23:05:39 2023 +0300
          Page content update date: Sat Dec 16 2023
          Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/classes/BaseEntityCollection.md b/docs/tech/classes/BaseEntityCollection.md index 69dfbe91..96229446 100644 --- a/docs/tech/classes/BaseEntityCollection.md +++ b/docs/tech/classes/BaseEntityCollection.md @@ -28,19 +28,19 @@ abstract class BaseEntityCollection implements \IteratorAggregate
          1. get -
          2. + - Get an entity from a collection (only previously added)
          3. getIterator
          4. has -
          5. + - Check if an entity has been added to the collection
          6. isEmpty -
          7. + - Check if the collection is empty or not
          8. remove -
          9. + - Remove an entity from a collection
          @@ -56,14 +56,14 @@ abstract class BaseEntityCollection implements \IteratorAggregate ```php public function get(string $objectName): null|\BumbleDocGen\Core\Parser\Entity\EntityInterface; ``` - +
          Get an entity from a collection (only previously added)
          Parameters: @@ -115,14 +115,14 @@ public function getIterator(): \Generator; ```php public function has(string $objectName): bool; ``` - +
          Check if an entity has been added to the collection
          Parameters: @@ -153,14 +153,14 @@ public function has(string $objectName): bool; ```php public function isEmpty(): bool; ``` - +
          Check if the collection is empty or not
          Parameters: not specified @@ -174,14 +174,14 @@ public function isEmpty(): bool; ```php public function remove(string $objectName): void; ``` - +
          Remove an entity from a collection
          Parameters: diff --git a/docs/tech/classes/ClassConstantEntitiesCollection.md b/docs/tech/classes/ClassConstantEntitiesCollection.md index ebb72e77..e68b718a 100644 --- a/docs/tech/classes/ClassConstantEntitiesCollection.md +++ b/docs/tech/classes/ClassConstantEntitiesCollection.md @@ -44,16 +44,16 @@ final class ClassConstantEntitiesCollection extends \BumbleDocGen\Core\Parser\En
        140. has -
        141. + - Check if an entity has been added to the collection
        142. isEmpty -
        143. + - Check if the collection is empty or not
        144. loadConstantEntities
        145. remove -
        146. + - Remove an entity from a collection
        147. unsafeGet
        148. @@ -223,7 +223,7 @@ public function getIterator(): \Generator; ```php @@ -232,7 +232,7 @@ public function getIterator(): \Generator; public function has(string $objectName): bool; ``` - +
          Check if an entity has been added to the collection
          Parameters: @@ -263,7 +263,7 @@ public function has(string $objectName): bool; ```php @@ -272,7 +272,7 @@ public function has(string $objectName): bool; public function isEmpty(): bool; ``` - +
          Check if the collection is empty or not
          Parameters: not specified @@ -320,7 +320,7 @@ public function loadConstantEntities(): void; ```php @@ -329,7 +329,7 @@ public function loadConstantEntities(): void; public function remove(string $objectName): void; ``` - +
          Remove an entity from a collection
          Parameters: diff --git a/docs/tech/classes/ClassEntity.md b/docs/tech/classes/ClassEntity.md index b0480a12..4396df00 100644 --- a/docs/tech/classes/ClassEntity.md +++ b/docs/tech/classes/ClassEntity.md @@ -296,7 +296,7 @@ See: - Check if an entity is a Trait
        149. normalizeClassName -
        150. + - Bring the class name to the standard format used in the system
        151. reloadEntityDependenciesCache - Update entity dependency cache
        152. @@ -408,7 +408,7 @@ public function __construct(\BumbleDocGen\Core\Configuration\Configuration $conf ```php @@ -453,7 +453,7 @@ public function addPluginData(string $pluginKey, mixed $data): void; ```php @@ -541,7 +541,7 @@ public function getAbsoluteFileName(): null|string; ```php @@ -627,7 +627,7 @@ public function getCachedEntityDependencies(): array; ```php @@ -685,7 +685,7 @@ public function getConstant(string $constantName, bool $unsafe = false): null|\B ```php @@ -727,7 +727,7 @@ public function getConstantEntitiesCollection(): \BumbleDocGen\LanguageHandler\P ```php @@ -783,7 +783,7 @@ public function getConstantValue(string $constantName): string|array|int|bool|nu ```php @@ -827,7 +827,7 @@ public function getConstants(): array; ```php @@ -879,7 +879,7 @@ public function getConstantsData(bool $onlyFromCurrentClassAndTraits = false, in ```php @@ -1086,7 +1086,7 @@ public function getDocComment(): string; ```php @@ -1169,7 +1169,7 @@ public function getDocNote(): string; ```php @@ -1202,7 +1202,7 @@ public function getDocRender(): \BumbleDocGen\Core\Renderer\EntityDocRenderer\En ```php @@ -1232,7 +1232,7 @@ public function getEndLine(): int; ```php @@ -1285,7 +1285,7 @@ public function getExamples(): array; ```php @@ -1392,7 +1392,7 @@ public function getFirstExample(): string; ```php @@ -1415,7 +1415,7 @@ public function getImplementingClass(): \BumbleDocGen\LanguageHandler\Php\Parser ```php @@ -1445,7 +1445,7 @@ public function getInterfaceNames(): array; ```php @@ -1475,7 +1475,7 @@ public function getInterfacesEntities(): array; ```php @@ -1533,7 +1533,7 @@ public function getMethod(string $methodName, bool $unsafe = false): null|\Bumbl ```php @@ -1575,7 +1575,7 @@ public function getMethodEntitiesCollection(): \BumbleDocGen\LanguageHandler\Php ```php @@ -1619,7 +1619,7 @@ public function getMethods(): array; ```php @@ -1692,7 +1692,7 @@ public function getModifiersString(): string; ```php @@ -1715,7 +1715,7 @@ public function getName(): string; ```php @@ -1738,7 +1738,7 @@ public function getNamespaceName(): string; ```php @@ -1782,7 +1782,7 @@ public function getParentClass(): null|\BumbleDocGen\LanguageHandler\Php\Parser\ ```php @@ -1847,7 +1847,7 @@ public function getParentClassNames(): array; ```php @@ -1887,7 +1887,7 @@ public function getPluginData(string $pluginKey): mixed; ```php @@ -1931,7 +1931,7 @@ public function getProperties(): array; ```php @@ -1983,7 +1983,7 @@ public function getPropertiesData(bool $onlyFromCurrentClassAndTraits = false, i ```php @@ -2041,7 +2041,7 @@ public function getProperty(string $propertyName, bool $unsafe = false): null|\B ```php @@ -2097,7 +2097,7 @@ public function getPropertyDefaultValue(string $propertyName): string|array|int| ```php @@ -2139,7 +2139,7 @@ public function getPropertyEntitiesCollection(): \BumbleDocGen\LanguageHandler\P ```php @@ -2168,7 +2168,7 @@ public function getRelativeFileName(): null|string; ```php @@ -2191,7 +2191,7 @@ public function getRootEntityCollection(): \BumbleDocGen\LanguageHandler\Php\Par ```php @@ -2214,7 +2214,7 @@ public function getShortName(): string; ```php @@ -2304,7 +2304,7 @@ public function getThrowsDocBlockLinks(): array; ```php @@ -2334,7 +2334,7 @@ public function getTraits(): array; ```php @@ -2364,7 +2364,7 @@ public function getTraitsNames(): array; ```php @@ -2482,7 +2482,7 @@ public function hasExamples(): bool; ```php @@ -2540,7 +2540,7 @@ public function hasMethod(string $methodName, bool $unsafe = false): bool; ```php @@ -2580,7 +2580,7 @@ public function hasParentClass(string $parentClassName): bool; ```php @@ -2668,7 +2668,7 @@ public function hasThrows(): bool; ```php @@ -2698,7 +2698,7 @@ public function hasTraits(): bool; ```php @@ -2845,7 +2845,7 @@ public function isClass(): bool; ```php @@ -2898,7 +2898,7 @@ public function isDeprecated(): bool; ```php @@ -2981,7 +2981,7 @@ public function isEntityDataCacheOutdated(): bool; ```php @@ -3081,7 +3081,7 @@ public static function isEntityNameValid(string $entityName): bool; ```php @@ -3104,7 +3104,7 @@ public function isEnum(): bool; ```php @@ -3127,7 +3127,7 @@ public function isExternalLibraryEntity(): bool; ```php @@ -3171,7 +3171,7 @@ public function isInstantiable(): bool; ```php @@ -3224,7 +3224,7 @@ public function isInternal(): bool; ```php @@ -3271,7 +3271,7 @@ public function isSubclassOf(string $className): bool; ```php @@ -3294,7 +3294,7 @@ public function isTrait(): bool; ```php @@ -3303,7 +3303,7 @@ public function isTrait(): bool; public static function normalizeClassName(string $name): string; ``` - +
          Bring the class name to the standard format used in the system
          Parameters: @@ -3427,7 +3427,7 @@ public function removeNotUsedEntityDataCache(): void; ```php diff --git a/docs/tech/classes/ClassLikeEntity.md b/docs/tech/classes/ClassLikeEntity.md index 38dac0e3..4a6c33ba 100644 --- a/docs/tech/classes/ClassLikeEntity.md +++ b/docs/tech/classes/ClassLikeEntity.md @@ -287,7 +287,7 @@ abstract class ClassLikeEntity extends \BumbleDocGen\LanguageHandler\Php\Parser\ - Check if an entity is a Trait
        153. normalizeClassName -
        154. + - Bring the class name to the standard format used in the system
        155. reloadEntityDependenciesCache - Update entity dependency cache
        156. @@ -397,7 +397,7 @@ public function __construct(\BumbleDocGen\Core\Configuration\Configuration $conf ```php @@ -440,7 +440,7 @@ public function addPluginData(string $pluginKey, mixed $data): void; ```php @@ -526,7 +526,7 @@ public function getAbsoluteFileName(): null|string; ```php @@ -610,7 +610,7 @@ public function getCachedEntityDependencies(): array; ```php @@ -666,7 +666,7 @@ public function getConstant(string $constantName, bool $unsafe = false): null|\B ```php @@ -706,7 +706,7 @@ public function getConstantEntitiesCollection(): \BumbleDocGen\LanguageHandler\P ```php @@ -760,7 +760,7 @@ public function getConstantValue(string $constantName): string|array|int|bool|nu ```php @@ -802,7 +802,7 @@ public function getConstants(): array; ```php @@ -852,7 +852,7 @@ public function getConstantsData(bool $onlyFromCurrentClassAndTraits = false, in ```php @@ -1057,7 +1057,7 @@ public function getDocComment(): string; ```php @@ -1138,7 +1138,7 @@ public function getDocNote(): string; ```php @@ -1169,7 +1169,7 @@ public function getDocRender(): \BumbleDocGen\Core\Renderer\EntityDocRenderer\En ```php @@ -1197,7 +1197,7 @@ public function getEndLine(): int; ```php @@ -1248,7 +1248,7 @@ public function getExamples(): array; ```php @@ -1353,7 +1353,7 @@ public function getFirstExample(): string; ```php @@ -1374,7 +1374,7 @@ public function getImplementingClass(): \BumbleDocGen\LanguageHandler\Php\Parser ```php @@ -1402,7 +1402,7 @@ public function getInterfaceNames(): array; ```php @@ -1430,7 +1430,7 @@ public function getInterfacesEntities(): array; ```php @@ -1486,7 +1486,7 @@ public function getMethod(string $methodName, bool $unsafe = false): null|\Bumbl ```php @@ -1526,7 +1526,7 @@ public function getMethodEntitiesCollection(): \BumbleDocGen\LanguageHandler\Php ```php @@ -1568,7 +1568,7 @@ public function getMethods(): array; ```php @@ -1639,7 +1639,7 @@ public function getModifiersString(): string; ```php @@ -1660,7 +1660,7 @@ public function getName(): string; ```php @@ -1681,7 +1681,7 @@ public function getNamespaceName(): string; ```php @@ -1702,7 +1702,7 @@ public function getObjectId(): string; ```php @@ -1723,7 +1723,7 @@ public function getParentClass(): null|\BumbleDocGen\LanguageHandler\Php\Parser\ ```php @@ -1744,7 +1744,7 @@ public function getParentClassEntities(): array; ```php @@ -1765,7 +1765,7 @@ public function getParentClassName(): null|string; ```php @@ -1786,7 +1786,7 @@ public function getParentClassNames(): array; ```php @@ -1824,7 +1824,7 @@ public function getPluginData(string $pluginKey): mixed; ```php @@ -1866,7 +1866,7 @@ public function getProperties(): array; ```php @@ -1916,7 +1916,7 @@ public function getPropertiesData(bool $onlyFromCurrentClassAndTraits = false, i ```php @@ -1972,7 +1972,7 @@ public function getProperty(string $propertyName, bool $unsafe = false): null|\B ```php @@ -2026,7 +2026,7 @@ public function getPropertyDefaultValue(string $propertyName): string|array|int| ```php @@ -2066,7 +2066,7 @@ public function getPropertyEntitiesCollection(): \BumbleDocGen\LanguageHandler\P ```php @@ -2093,7 +2093,7 @@ public function getRelativeFileName(): null|string; ```php @@ -2114,7 +2114,7 @@ public function getRootEntityCollection(): \BumbleDocGen\LanguageHandler\Php\Par ```php @@ -2135,7 +2135,7 @@ public function getShortName(): string; ```php @@ -2223,7 +2223,7 @@ public function getThrowsDocBlockLinks(): array; ```php @@ -2251,7 +2251,7 @@ public function getTraits(): array; ```php @@ -2279,7 +2279,7 @@ public function getTraitsNames(): array; ```php @@ -2395,7 +2395,7 @@ public function hasExamples(): bool; ```php @@ -2451,7 +2451,7 @@ public function hasMethod(string $methodName, bool $unsafe = false): bool; ```php @@ -2489,7 +2489,7 @@ public function hasParentClass(string $parentClassName): bool; ```php @@ -2575,7 +2575,7 @@ public function hasThrows(): bool; ```php @@ -2603,7 +2603,7 @@ public function hasTraits(): bool; ```php @@ -2648,7 +2648,7 @@ public function implementsInterface(string $interfaceName): bool; ```php @@ -2699,7 +2699,7 @@ public function isApi(): bool; ```php @@ -2720,7 +2720,7 @@ public function isClass(): bool; ```php @@ -2771,7 +2771,7 @@ public function isDeprecated(): bool; ```php @@ -2852,7 +2852,7 @@ public function isEntityDataCacheOutdated(): bool; ```php @@ -2948,7 +2948,7 @@ public static function isEntityNameValid(string $entityName): bool; ```php @@ -2969,7 +2969,7 @@ public function isEnum(): bool; ```php @@ -2990,7 +2990,7 @@ public function isExternalLibraryEntity(): bool; ```php @@ -3011,7 +3011,7 @@ public function isInGit(): bool; ```php @@ -3032,7 +3032,7 @@ public function isInstantiable(): bool; ```php @@ -3083,7 +3083,7 @@ public function isInternal(): bool; ```php @@ -3128,7 +3128,7 @@ public function isSubclassOf(string $className): bool; ```php @@ -3149,14 +3149,14 @@ public function isTrait(): bool; ```php public static function normalizeClassName(string $name): string; ``` - +
          Bring the class name to the standard format used in the system
          Parameters: @@ -3280,7 +3280,7 @@ public function removeNotUsedEntityDataCache(): void; ```php diff --git a/docs/tech/classes/ClassLikeEntity_2.md b/docs/tech/classes/ClassLikeEntity_2.md index d1da066f..b08734f5 100644 --- a/docs/tech/classes/ClassLikeEntity_2.md +++ b/docs/tech/classes/ClassLikeEntity_2.md @@ -287,7 +287,7 @@ abstract class ClassLikeEntity extends \BumbleDocGen\LanguageHandler\Php\Parser\ - Check if an entity is a Trait
        157. normalizeClassName -
        158. + - Bring the class name to the standard format used in the system
        159. reloadEntityDependenciesCache - Update entity dependency cache
        160. @@ -397,7 +397,7 @@ public function __construct(\BumbleDocGen\Core\Configuration\Configuration $conf ```php @@ -440,7 +440,7 @@ public function addPluginData(string $pluginKey, mixed $data): void; ```php @@ -526,7 +526,7 @@ public function getAbsoluteFileName(): null|string; ```php @@ -610,7 +610,7 @@ public function getCachedEntityDependencies(): array; ```php @@ -666,7 +666,7 @@ public function getConstant(string $constantName, bool $unsafe = false): null|\B ```php @@ -706,7 +706,7 @@ public function getConstantEntitiesCollection(): \BumbleDocGen\LanguageHandler\P ```php @@ -760,7 +760,7 @@ public function getConstantValue(string $constantName): string|array|int|bool|nu ```php @@ -802,7 +802,7 @@ public function getConstants(): array; ```php @@ -852,7 +852,7 @@ public function getConstantsData(bool $onlyFromCurrentClassAndTraits = false, in ```php @@ -1057,7 +1057,7 @@ public function getDocComment(): string; ```php @@ -1138,7 +1138,7 @@ public function getDocNote(): string; ```php @@ -1169,7 +1169,7 @@ public function getDocRender(): \BumbleDocGen\Core\Renderer\EntityDocRenderer\En ```php @@ -1197,7 +1197,7 @@ public function getEndLine(): int; ```php @@ -1248,7 +1248,7 @@ public function getExamples(): array; ```php @@ -1353,7 +1353,7 @@ public function getFirstExample(): string; ```php @@ -1374,7 +1374,7 @@ public function getImplementingClass(): \BumbleDocGen\LanguageHandler\Php\Parser ```php @@ -1402,7 +1402,7 @@ public function getInterfaceNames(): array; ```php @@ -1430,7 +1430,7 @@ public function getInterfacesEntities(): array; ```php @@ -1486,7 +1486,7 @@ public function getMethod(string $methodName, bool $unsafe = false): null|\Bumbl ```php @@ -1526,7 +1526,7 @@ public function getMethodEntitiesCollection(): \BumbleDocGen\LanguageHandler\Php ```php @@ -1568,7 +1568,7 @@ public function getMethods(): array; ```php @@ -1639,7 +1639,7 @@ public function getModifiersString(): string; ```php @@ -1660,7 +1660,7 @@ public function getName(): string; ```php @@ -1681,7 +1681,7 @@ public function getNamespaceName(): string; ```php @@ -1702,7 +1702,7 @@ public function getObjectId(): string; ```php @@ -1723,7 +1723,7 @@ public function getParentClass(): null|\BumbleDocGen\LanguageHandler\Php\Parser\ ```php @@ -1744,7 +1744,7 @@ public function getParentClassEntities(): array; ```php @@ -1765,7 +1765,7 @@ public function getParentClassName(): null|string; ```php @@ -1786,7 +1786,7 @@ public function getParentClassNames(): array; ```php @@ -1824,7 +1824,7 @@ public function getPluginData(string $pluginKey): mixed; ```php @@ -1866,7 +1866,7 @@ public function getProperties(): array; ```php @@ -1916,7 +1916,7 @@ public function getPropertiesData(bool $onlyFromCurrentClassAndTraits = false, i ```php @@ -1972,7 +1972,7 @@ public function getProperty(string $propertyName, bool $unsafe = false): null|\B ```php @@ -2026,7 +2026,7 @@ public function getPropertyDefaultValue(string $propertyName): string|array|int| ```php @@ -2066,7 +2066,7 @@ public function getPropertyEntitiesCollection(): \BumbleDocGen\LanguageHandler\P ```php @@ -2093,7 +2093,7 @@ public function getRelativeFileName(): null|string; ```php @@ -2114,7 +2114,7 @@ public function getRootEntityCollection(): \BumbleDocGen\LanguageHandler\Php\Par ```php @@ -2135,7 +2135,7 @@ public function getShortName(): string; ```php @@ -2223,7 +2223,7 @@ public function getThrowsDocBlockLinks(): array; ```php @@ -2251,7 +2251,7 @@ public function getTraits(): array; ```php @@ -2279,7 +2279,7 @@ public function getTraitsNames(): array; ```php @@ -2395,7 +2395,7 @@ public function hasExamples(): bool; ```php @@ -2451,7 +2451,7 @@ public function hasMethod(string $methodName, bool $unsafe = false): bool; ```php @@ -2489,7 +2489,7 @@ public function hasParentClass(string $parentClassName): bool; ```php @@ -2575,7 +2575,7 @@ public function hasThrows(): bool; ```php @@ -2603,7 +2603,7 @@ public function hasTraits(): bool; ```php @@ -2648,7 +2648,7 @@ public function implementsInterface(string $interfaceName): bool; ```php @@ -2699,7 +2699,7 @@ public function isApi(): bool; ```php @@ -2720,7 +2720,7 @@ public function isClass(): bool; ```php @@ -2771,7 +2771,7 @@ public function isDeprecated(): bool; ```php @@ -2852,7 +2852,7 @@ public function isEntityDataCacheOutdated(): bool; ```php @@ -2948,7 +2948,7 @@ public static function isEntityNameValid(string $entityName): bool; ```php @@ -2969,7 +2969,7 @@ public function isEnum(): bool; ```php @@ -2990,7 +2990,7 @@ public function isExternalLibraryEntity(): bool; ```php @@ -3011,7 +3011,7 @@ public function isInGit(): bool; ```php @@ -3032,7 +3032,7 @@ public function isInstantiable(): bool; ```php @@ -3083,7 +3083,7 @@ public function isInternal(): bool; ```php @@ -3128,7 +3128,7 @@ public function isSubclassOf(string $className): bool; ```php @@ -3149,14 +3149,14 @@ public function isTrait(): bool; ```php public static function normalizeClassName(string $name): string; ``` - +
          Bring the class name to the standard format used in the system
          Parameters: @@ -3280,7 +3280,7 @@ public function removeNotUsedEntityDataCache(): void; ```php diff --git a/docs/tech/classes/EnumEntity.md b/docs/tech/classes/EnumEntity.md index 8ebbe5ce..dedfb586 100644 --- a/docs/tech/classes/EnumEntity.md +++ b/docs/tech/classes/EnumEntity.md @@ -302,7 +302,7 @@ See: - Check if an entity is a Trait
        161. normalizeClassName -
        162. + - Bring the class name to the standard format used in the system
        163. reloadEntityDependenciesCache - Update entity dependency cache
        164. @@ -414,7 +414,7 @@ public function __construct(\BumbleDocGen\Core\Configuration\Configuration $conf ```php @@ -459,7 +459,7 @@ public function addPluginData(string $pluginKey, mixed $data): void; ```php @@ -547,7 +547,7 @@ public function getAbsoluteFileName(): null|string; ```php @@ -633,7 +633,7 @@ public function getCachedEntityDependencies(): array; ```php @@ -664,7 +664,7 @@ public function getCasesNames(): array; ```php @@ -722,7 +722,7 @@ public function getConstant(string $constantName, bool $unsafe = false): null|\B ```php @@ -764,7 +764,7 @@ public function getConstantEntitiesCollection(): \BumbleDocGen\LanguageHandler\P ```php @@ -820,7 +820,7 @@ public function getConstantValue(string $constantName): string|array|int|bool|nu ```php @@ -864,7 +864,7 @@ public function getConstants(): array; ```php @@ -916,7 +916,7 @@ public function getConstantsData(bool $onlyFromCurrentClassAndTraits = false, in ```php @@ -1123,7 +1123,7 @@ public function getDocComment(): string; ```php @@ -1206,7 +1206,7 @@ public function getDocNote(): string; ```php @@ -1239,7 +1239,7 @@ public function getDocRender(): \BumbleDocGen\Core\Renderer\EntityDocRenderer\En ```php @@ -1269,7 +1269,7 @@ public function getEndLine(): int; ```php @@ -1292,7 +1292,7 @@ public function getEntityDependencies(): array; ```php @@ -1340,7 +1340,7 @@ public function getEnumCaseValue(string $name): mixed; ```php @@ -1401,7 +1401,7 @@ public function getExamples(): array; ```php @@ -1508,7 +1508,7 @@ public function getFirstExample(): string; ```php @@ -1559,7 +1559,7 @@ public function getInterfaceNames(): array; ```php @@ -1589,7 +1589,7 @@ public function getInterfacesEntities(): array; ```php @@ -1647,7 +1647,7 @@ public function getMethod(string $methodName, bool $unsafe = false): null|\Bumbl ```php @@ -1689,7 +1689,7 @@ public function getMethodEntitiesCollection(): \BumbleDocGen\LanguageHandler\Php ```php @@ -1733,7 +1733,7 @@ public function getMethods(): array; ```php @@ -1785,7 +1785,7 @@ public function getMethodsData(bool $onlyFromCurrentClassAndTraits = false, int ```php @@ -1806,7 +1806,7 @@ public function getModifiersString(): string; ```php @@ -1829,7 +1829,7 @@ public function getName(): string; ```php @@ -1852,7 +1852,7 @@ public function getNamespaceName(): string; ```php @@ -1875,7 +1875,7 @@ public function getObjectId(): string; ```php @@ -1898,7 +1898,7 @@ public function getParentClass(): null|\BumbleDocGen\LanguageHandler\Php\Parser\ ```php @@ -1921,7 +1921,7 @@ public function getParentClassEntities(): array; ```php @@ -1944,7 +1944,7 @@ public function getParentClassName(): null|string; ```php @@ -1967,7 +1967,7 @@ public function getParentClassNames(): array; ```php @@ -2007,7 +2007,7 @@ public function getPluginData(string $pluginKey): mixed; ```php @@ -2051,7 +2051,7 @@ public function getProperties(): array; ```php @@ -2103,7 +2103,7 @@ public function getPropertiesData(bool $onlyFromCurrentClassAndTraits = false, i ```php @@ -2161,7 +2161,7 @@ public function getProperty(string $propertyName, bool $unsafe = false): null|\B ```php @@ -2217,7 +2217,7 @@ public function getPropertyDefaultValue(string $propertyName): string|array|int| ```php @@ -2259,7 +2259,7 @@ public function getPropertyEntitiesCollection(): \BumbleDocGen\LanguageHandler\P ```php @@ -2288,7 +2288,7 @@ public function getRelativeFileName(): null|string; ```php @@ -2311,7 +2311,7 @@ public function getRootEntityCollection(): \BumbleDocGen\LanguageHandler\Php\Par ```php @@ -2334,7 +2334,7 @@ public function getShortName(): string; ```php @@ -2424,7 +2424,7 @@ public function getThrowsDocBlockLinks(): array; ```php @@ -2454,7 +2454,7 @@ public function getTraits(): array; ```php @@ -2484,7 +2484,7 @@ public function getTraitsNames(): array; ```php @@ -2602,7 +2602,7 @@ public function hasExamples(): bool; ```php @@ -2660,7 +2660,7 @@ public function hasMethod(string $methodName, bool $unsafe = false): bool; ```php @@ -2700,7 +2700,7 @@ public function hasParentClass(string $parentClassName): bool; ```php @@ -2788,7 +2788,7 @@ public function hasThrows(): bool; ```php @@ -2818,7 +2818,7 @@ public function hasTraits(): bool; ```php @@ -2865,7 +2865,7 @@ public function implementsInterface(string $interfaceName): bool; ```php @@ -2918,7 +2918,7 @@ public function isApi(): bool; ```php @@ -2941,7 +2941,7 @@ public function isClass(): bool; ```php @@ -2994,7 +2994,7 @@ public function isDeprecated(): bool; ```php @@ -3077,7 +3077,7 @@ public function isEntityDataCacheOutdated(): bool; ```php @@ -3198,7 +3198,7 @@ public function isEnum(): bool; ```php @@ -3221,7 +3221,7 @@ public function isExternalLibraryEntity(): bool; ```php @@ -3244,7 +3244,7 @@ public function isInGit(): bool; ```php @@ -3267,7 +3267,7 @@ public function isInstantiable(): bool; ```php @@ -3320,7 +3320,7 @@ public function isInternal(): bool; ```php @@ -3367,7 +3367,7 @@ public function isSubclassOf(string $className): bool; ```php @@ -3390,7 +3390,7 @@ public function isTrait(): bool; ```php @@ -3399,7 +3399,7 @@ public function isTrait(): bool; public static function normalizeClassName(string $name): string; ``` - +
          Bring the class name to the standard format used in the system
          Parameters: @@ -3523,7 +3523,7 @@ public function removeNotUsedEntityDataCache(): void; ```php diff --git a/docs/tech/classes/InterfaceEntity.md b/docs/tech/classes/InterfaceEntity.md index 45c957d6..afe1cb94 100644 --- a/docs/tech/classes/InterfaceEntity.md +++ b/docs/tech/classes/InterfaceEntity.md @@ -293,7 +293,7 @@ See: - Check if an entity is a Trait
        165. normalizeClassName -
        166. + - Bring the class name to the standard format used in the system
        167. reloadEntityDependenciesCache - Update entity dependency cache
        168. @@ -405,7 +405,7 @@ public function __construct(\BumbleDocGen\Core\Configuration\Configuration $conf ```php @@ -450,7 +450,7 @@ public function addPluginData(string $pluginKey, mixed $data): void; ```php @@ -538,7 +538,7 @@ public function getAbsoluteFileName(): null|string; ```php @@ -624,7 +624,7 @@ public function getCachedEntityDependencies(): array; ```php @@ -682,7 +682,7 @@ public function getConstant(string $constantName, bool $unsafe = false): null|\B ```php @@ -724,7 +724,7 @@ public function getConstantEntitiesCollection(): \BumbleDocGen\LanguageHandler\P ```php @@ -780,7 +780,7 @@ public function getConstantValue(string $constantName): string|array|int|bool|nu ```php @@ -824,7 +824,7 @@ public function getConstants(): array; ```php @@ -876,7 +876,7 @@ public function getConstantsData(bool $onlyFromCurrentClassAndTraits = false, in ```php @@ -1083,7 +1083,7 @@ public function getDocComment(): string; ```php @@ -1166,7 +1166,7 @@ public function getDocNote(): string; ```php @@ -1199,7 +1199,7 @@ public function getDocRender(): \BumbleDocGen\Core\Renderer\EntityDocRenderer\En ```php @@ -1229,7 +1229,7 @@ public function getEndLine(): int; ```php @@ -1282,7 +1282,7 @@ public function getExamples(): array; ```php @@ -1389,7 +1389,7 @@ public function getFirstExample(): string; ```php @@ -1412,7 +1412,7 @@ public function getImplementingClass(): \BumbleDocGen\LanguageHandler\Php\Parser ```php @@ -1442,7 +1442,7 @@ public function getInterfaceNames(): array; ```php @@ -1472,7 +1472,7 @@ public function getInterfacesEntities(): array; ```php @@ -1530,7 +1530,7 @@ public function getMethod(string $methodName, bool $unsafe = false): null|\Bumbl ```php @@ -1572,7 +1572,7 @@ public function getMethodEntitiesCollection(): \BumbleDocGen\LanguageHandler\Php ```php @@ -1616,7 +1616,7 @@ public function getMethods(): array; ```php @@ -1689,7 +1689,7 @@ public function getModifiersString(): string; ```php @@ -1712,7 +1712,7 @@ public function getName(): string; ```php @@ -1735,7 +1735,7 @@ public function getNamespaceName(): string; ```php @@ -1758,7 +1758,7 @@ public function getObjectId(): string; ```php @@ -1781,7 +1781,7 @@ public function getParentClass(): null|\BumbleDocGen\LanguageHandler\Php\Parser\ ```php @@ -1804,7 +1804,7 @@ public function getParentClassEntities(): array; ```php @@ -1827,7 +1827,7 @@ public function getParentClassName(): null|string; ```php @@ -1850,7 +1850,7 @@ public function getParentClassNames(): array; ```php @@ -1890,7 +1890,7 @@ public function getPluginData(string $pluginKey): mixed; ```php @@ -1934,7 +1934,7 @@ public function getProperties(): array; ```php @@ -1986,7 +1986,7 @@ public function getPropertiesData(bool $onlyFromCurrentClassAndTraits = false, i ```php @@ -2044,7 +2044,7 @@ public function getProperty(string $propertyName, bool $unsafe = false): null|\B ```php @@ -2100,7 +2100,7 @@ public function getPropertyDefaultValue(string $propertyName): string|array|int| ```php @@ -2142,7 +2142,7 @@ public function getPropertyEntitiesCollection(): \BumbleDocGen\LanguageHandler\P ```php @@ -2171,7 +2171,7 @@ public function getRelativeFileName(): null|string; ```php @@ -2194,7 +2194,7 @@ public function getRootEntityCollection(): \BumbleDocGen\LanguageHandler\Php\Par ```php @@ -2217,7 +2217,7 @@ public function getShortName(): string; ```php @@ -2307,7 +2307,7 @@ public function getThrowsDocBlockLinks(): array; ```php @@ -2365,7 +2365,7 @@ public function getTraitsNames(): array; ```php @@ -2483,7 +2483,7 @@ public function hasExamples(): bool; ```php @@ -2541,7 +2541,7 @@ public function hasMethod(string $methodName, bool $unsafe = false): bool; ```php @@ -2581,7 +2581,7 @@ public function hasParentClass(string $parentClassName): bool; ```php @@ -2669,7 +2669,7 @@ public function hasThrows(): bool; ```php @@ -2699,7 +2699,7 @@ public function hasTraits(): bool; ```php @@ -2797,7 +2797,7 @@ public function isApi(): bool; ```php @@ -2820,7 +2820,7 @@ public function isClass(): bool; ```php @@ -2873,7 +2873,7 @@ public function isDeprecated(): bool; ```php @@ -2956,7 +2956,7 @@ public function isEntityDataCacheOutdated(): bool; ```php @@ -3056,7 +3056,7 @@ public static function isEntityNameValid(string $entityName): bool; ```php @@ -3079,7 +3079,7 @@ public function isEnum(): bool; ```php @@ -3102,7 +3102,7 @@ public function isExternalLibraryEntity(): bool; ```php @@ -3125,7 +3125,7 @@ public function isInGit(): bool; ```php @@ -3199,7 +3199,7 @@ public function isInternal(): bool; ```php @@ -3246,7 +3246,7 @@ public function isSubclassOf(string $className): bool; ```php @@ -3269,7 +3269,7 @@ public function isTrait(): bool; ```php @@ -3278,7 +3278,7 @@ public function isTrait(): bool; public static function normalizeClassName(string $name): string; ``` - +
          Bring the class name to the standard format used in the system
          Parameters: @@ -3402,7 +3402,7 @@ public function removeNotUsedEntityDataCache(): void; ```php diff --git a/docs/tech/classes/LoggableRootEntityCollection.md b/docs/tech/classes/LoggableRootEntityCollection.md index 0fafe7d8..46c3d0c2 100644 --- a/docs/tech/classes/LoggableRootEntityCollection.md +++ b/docs/tech/classes/LoggableRootEntityCollection.md @@ -38,13 +38,13 @@ abstract class LoggableRootEntityCollection extends \BumbleDocGen\Core\Parser\En
        169. findEntity -
        170. + - Find an entity in a collection
        171. get -
        172. + - Get an entity from a collection (only previously added)
        173. getEntityCollectionName -
        174. + - Get collection name
        175. getEntityLinkData
        176. @@ -53,16 +53,16 @@ abstract class LoggableRootEntityCollection extends \BumbleDocGen\Core\Parser\En
        177. getLoadedOrCreateNew -
        178. + - Get an entity from the collection or create a new one if it has not yet been added
        179. getOperationsLogCollection
        180. has -
        181. + - Check if an entity has been added to the collection
        182. isEmpty -
        183. + - Check if the collection is empty or not
        184. loadEntities
        185. @@ -71,10 +71,10 @@ abstract class LoggableRootEntityCollection extends \BumbleDocGen\Core\Parser\En
        186. remove -
        187. + - Remove an entity from a collection
        188. toArray -
        189. + - Convert collection to array
        190. updateEntitiesCache
        191. @@ -141,7 +141,7 @@ public function clearOperationsLogCollection(): void; public function findEntity(string $search, bool $useUnsafeKeys = true): null|\BumbleDocGen\Core\Parser\Entity\RootEntityInterface; ``` - +
          Find an entity in a collection
          Parameters: @@ -184,7 +184,7 @@ public function findEntity(string $search, bool $useUnsafeKeys = true): null|\Bu public function get(string $objectName): null|\BumbleDocGen\Core\Parser\Entity\RootEntityInterface; ``` - +
          Get an entity from a collection (only previously added)
          Parameters: @@ -215,7 +215,7 @@ public function get(string $objectName): null|\BumbleDocGen\Core\Parser\Entity\R ```php @@ -224,7 +224,7 @@ public function get(string $objectName): null|\BumbleDocGen\Core\Parser\Entity\R public function getEntityCollectionName(): string; ``` - +
          Get collection name
          Parameters: not specified @@ -238,7 +238,7 @@ public function getEntityCollectionName(): string; ```php @@ -317,7 +317,7 @@ public function getIterator(): \Generator; public function getLoadedOrCreateNew(string $objectName, bool $withAddClassEntityToCollectionEvent = false): \BumbleDocGen\Core\Parser\Entity\RootEntityInterface; ``` - +
          Get an entity from the collection or create a new one if it has not yet been added
          Parameters: @@ -380,7 +380,7 @@ public function getOperationsLogCollection(): \BumbleDocGen\Core\Parser\Entity\C ```php @@ -389,7 +389,7 @@ public function getOperationsLogCollection(): \BumbleDocGen\Core\Parser\Entity\C public function has(string $objectName): bool; ``` - +
          Check if an entity has been added to the collection
          Parameters: @@ -420,7 +420,7 @@ public function has(string $objectName): bool; ```php @@ -429,7 +429,7 @@ public function has(string $objectName): bool; public function isEmpty(): bool; ``` - +
          Check if the collection is empty or not
          Parameters: not specified @@ -533,7 +533,7 @@ public function loadEntitiesByConfiguration(\BumbleDocGen\Core\Parser\Entity\Ent ```php @@ -542,7 +542,7 @@ public function loadEntitiesByConfiguration(\BumbleDocGen\Core\Parser\Entity\Ent public function remove(string $objectName): void; ``` - +
          Remove an entity from a collection
          Parameters: @@ -573,7 +573,7 @@ public function remove(string $objectName): void; ```php @@ -582,7 +582,7 @@ public function remove(string $objectName): void; public function toArray(): array; ``` - +
          Convert collection to array
          Parameters: not specified @@ -596,7 +596,7 @@ public function toArray(): array; ```php diff --git a/docs/tech/classes/MethodEntitiesCollection.md b/docs/tech/classes/MethodEntitiesCollection.md index 585e2d99..c022262e 100644 --- a/docs/tech/classes/MethodEntitiesCollection.md +++ b/docs/tech/classes/MethodEntitiesCollection.md @@ -50,16 +50,16 @@ final class MethodEntitiesCollection extends \BumbleDocGen\Core\Parser\Entity\Ba
        192. has -
        193. + - Check if an entity has been added to the collection
        194. isEmpty -
        195. + - Check if the collection is empty or not
        196. loadMethodEntities - Load method entities into the collection according to the project configuration
        197. remove -
        198. + - Remove an entity from a collection
        199. unsafeGet - Get the method entity if it exists. If the method exists but has not been loaded into the collection, a new entity object will be created
        200. @@ -276,7 +276,7 @@ public function getIterator(): \Generator; ```php @@ -285,7 +285,7 @@ public function getIterator(): \Generator; public function has(string $objectName): bool; ``` - +
          Check if an entity has been added to the collection
          Parameters: @@ -316,7 +316,7 @@ public function has(string $objectName): bool; ```php @@ -325,7 +325,7 @@ public function has(string $objectName): bool; public function isEmpty(): bool; ``` - +
          Check if the collection is empty or not
          Parameters: not specified @@ -379,7 +379,7 @@ public function loadMethodEntities(): void; ```php @@ -388,7 +388,7 @@ public function loadMethodEntities(): void; public function remove(string $objectName): void; ``` - +
          Remove an entity from a collection
          Parameters: diff --git a/docs/tech/classes/PhpEntitiesCollection.md b/docs/tech/classes/PhpEntitiesCollection.md index 7831fea8..19f1f69c 100644 --- a/docs/tech/classes/PhpEntitiesCollection.md +++ b/docs/tech/classes/PhpEntitiesCollection.md @@ -35,34 +35,31 @@ final class PhpEntitiesCollection extends \BumbleDocGen\Core\Parser\Entity\Logga
          1. add -
          2. + - Add an entity to the collection
          3. clearOperationsLogCollection
          4. filterByInterfaces - - Retrieving all entities that implement the specified interfaces. Filtering is only available for ClassLikeEntity.
          5. + - Get a copy of the current collection only with entities filtered by interfaces names (filtering is only available for ClassLikeEntity)
          6. filterByNameRegularExpression -
          7. + - Get a copy of the current collection with only entities whose names match the regular expression
          8. filterByParentClassNames - - Retrieving all entities that inherit from the specified classes. Filtering is only available for ClassLikeEntity.
          9. + - Get a copy of the current collection only with entities filtered by parent classes names (filtering is only available for ClassLikeEntity)
          10. filterByPaths - - Filtering entities by relative files paths (from project_root) of the project
          11. + - Get a copy of the current collection only with entities filtered by file paths (from project_root)
          12. findEntity -
          13. + - Find an entity in a collection
          14. get -
          15. -
          16. - getEntityByClassName -
          17. + - Get an entity from a collection (only previously added)
          18. getEntityCollectionName -
          19. + - Get collection name
          20. getEntityLinkData
          21. @@ -71,28 +68,25 @@ final class PhpEntitiesCollection extends \BumbleDocGen\Core\Parser\Entity\Logga
          22. getLoadedOrCreateNew -
          23. + - Get an entity from the collection or create a new one if it has not yet been added
          24. getOnlyAbstractClasses -
          25. + - Get a copy of the current collection with only abstract classes
          26. getOnlyInstantiable - - Retrieving only instantiable entities. Filtering is only available for ClassLikeEntity.
          27. + - Get a copy of the current collection with only instantiable entities
          28. getOnlyInterfaces -
          29. + - Get a copy of the current collection with only interfaces
          30. getOnlyTraits -
          31. + - Get a copy of the current collection with only traits
          32. getOperationsLogCollection
          33. -
          34. - getPluginEventDispatcher -
          35. has -
          36. + - Check if an entity has been added to the collection
          37. internalFindEntity
          38. @@ -101,7 +95,7 @@ final class PhpEntitiesCollection extends \BumbleDocGen\Core\Parser\Entity\Logga
          39. isEmpty -
          40. + - Check if the collection is empty or not
          41. loadEntities - Load entities into a collection
          42. @@ -110,10 +104,10 @@ final class PhpEntitiesCollection extends \BumbleDocGen\Core\Parser\Entity\Logga - Load entities into a collection by configuration
          43. remove -
          44. + - Remove an entity from a collection
          45. toArray -
          46. + - Convert collection to array
          47. updateEntitiesCache
          48. @@ -211,14 +205,14 @@ public function __construct(\BumbleDocGen\Core\Configuration\Configuration $conf ```php public function add(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity $classEntity, bool $reload = false): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; ``` - +
            Add an entity to the collection
            Parameters: @@ -284,14 +278,14 @@ public function clearOperationsLogCollection(): void; ```php public function filterByInterfaces(array $interfaces): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; ``` -
            Retrieving all entities that implement the specified interfaces. Filtering is only available for ClassLikeEntity.
            +
            Get a copy of the current collection only with entities filtered by interfaces names (filtering is only available for ClassLikeEntity)
            Parameters: @@ -329,14 +323,14 @@ public function filterByInterfaces(array $interfaces): \BumbleDocGen\LanguageHan ```php public function filterByNameRegularExpression(string $regexPattern): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; ``` - +
            Get a copy of the current collection with only entities whose names match the regular expression
            Parameters: @@ -367,14 +361,14 @@ public function filterByNameRegularExpression(string $regexPattern): \BumbleDocG ```php public function filterByParentClassNames(array $parentClassNames): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; ``` -
            Retrieving all entities that inherit from the specified classes. Filtering is only available for ClassLikeEntity.
            +
            Get a copy of the current collection only with entities filtered by parent classes names (filtering is only available for ClassLikeEntity)
            Parameters: @@ -412,14 +406,14 @@ public function filterByParentClassNames(array $parentClassNames): \BumbleDocGen ```php public function filterByPaths(array $paths): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; ``` -
            Filtering entities by relative files paths (from project_root) of the project
            +
            Get a copy of the current collection only with entities filtered by file paths (from project_root)
            Parameters: @@ -466,7 +460,7 @@ public function filterByPaths(array $paths): \BumbleDocGen\LanguageHandler\Php\P public function findEntity(string $search, bool $useUnsafeKeys = true): null|\BumbleDocGen\Core\Parser\Entity\RootEntityInterface; ``` - +
            Find an entity in a collection
            Parameters: @@ -511,7 +505,7 @@ public function findEntity(string $search, bool $useUnsafeKeys = true): null|\Bu public function get(string $objectName): null|\BumbleDocGen\Core\Parser\Entity\RootEntityInterface; ``` - +
            Get an entity from a collection (only previously added)
            Parameters: @@ -535,49 +529,6 @@ public function get(string $objectName): null|\BumbleDocGen\Core\Parser\Entity\R Return value: null | \BumbleDocGen\Core\Parser\Entity\RootEntityInterface - -
            -
            - - - -```php -public function getEntityByClassName(string $className, bool $createIfNotExists = true): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
            NameTypeDescription
            $classNamestring-
            $createIfNotExistsbool-
            - -Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -

            @@ -585,14 +536,14 @@ public function getEntityByClassName(string $className, bool $createIfNotExists ```php public function getEntityCollectionName(): string; ``` - +
            Get collection name
            Parameters: not specified @@ -606,7 +557,7 @@ public function getEntityCollectionName(): string; ```php @@ -687,7 +638,7 @@ public function getIterator(): \Generator; public function getLoadedOrCreateNew(string $objectName, bool $withAddClassEntityToCollectionEvent = false): \BumbleDocGen\Core\Parser\Entity\RootEntityInterface; ``` - +
            Get an entity from the collection or create a new one if it has not yet been added
            Parameters: @@ -729,14 +680,14 @@ public function getLoadedOrCreateNew(string $objectName, bool $withAddClassEntit ```php public function getOnlyAbstractClasses(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; ``` - +
            Get a copy of the current collection with only abstract classes
            Parameters: not specified @@ -757,14 +708,14 @@ public function getOnlyAbstractClasses(): \BumbleDocGen\LanguageHandler\Php\Pars ```php public function getOnlyInstantiable(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; ``` -
            Retrieving only instantiable entities. Filtering is only available for ClassLikeEntity.
            +
            Get a copy of the current collection with only instantiable entities
            Parameters: not specified @@ -778,14 +729,14 @@ public function getOnlyInstantiable(): \BumbleDocGen\LanguageHandler\Php\Parser\ ```php public function getOnlyInterfaces(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; ``` - +
            Get a copy of the current collection with only interfaces
            Parameters: not specified @@ -799,14 +750,14 @@ public function getOnlyInterfaces(): \BumbleDocGen\LanguageHandler\Php\Parser\En ```php public function getOnlyTraits(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; ``` - +
            Get a copy of the current collection with only traits
            Parameters: not specified @@ -836,27 +787,6 @@ public function getOperationsLogCollection(): \BumbleDocGen\Core\Parser\Entity\C Return value: \BumbleDocGen\Core\Parser\Entity\CollectionLogOperation\OperationsCollection -
            -
            -
            - - - -```php -public function getPluginEventDispatcher(): \BumbleDocGen\Core\Plugin\PluginEventDispatcher; -``` - - - -Parameters: not specified - -Return value: \BumbleDocGen\Core\Plugin\PluginEventDispatcher - -

            @@ -864,7 +794,7 @@ public function getPluginEventDispatcher(): \BumbleDocGen\Core\Plugin\PluginEven ```php @@ -873,7 +803,7 @@ public function getPluginEventDispatcher(): \BumbleDocGen\Core\Plugin\PluginEven public function has(string $objectName): bool; ``` - +
            Check if an entity has been added to the collection
            Parameters: @@ -904,7 +834,7 @@ public function has(string $objectName): bool; ```php @@ -964,7 +894,7 @@ $entitiesCollection->findEntity('https://github.com/bumble-tech/bumble-doc-gen/b ```php @@ -1020,7 +950,7 @@ public function internalGetLoadedOrCreateNew(string $objectName, bool $withAddCl ```php @@ -1029,7 +959,7 @@ public function internalGetLoadedOrCreateNew(string $objectName, bool $withAddCl public function isEmpty(): bool; ``` - +
            Check if the collection is empty or not
            Parameters: not specified @@ -1043,7 +973,7 @@ public function isEmpty(): bool; ```php @@ -1107,7 +1037,7 @@ public function loadEntities(\BumbleDocGen\Core\Parser\SourceLocator\SourceLocat ```php @@ -1161,7 +1091,7 @@ public function loadEntitiesByConfiguration(\BumbleDocGen\Core\Parser\Entity\Ent ```php @@ -1170,7 +1100,7 @@ public function loadEntitiesByConfiguration(\BumbleDocGen\Core\Parser\Entity\Ent public function remove(string $objectName): void; ``` - +
            Remove an entity from a collection
            Parameters: @@ -1201,7 +1131,7 @@ public function remove(string $objectName): void; ```php @@ -1210,7 +1140,7 @@ public function remove(string $objectName): void; public function toArray(): array; ``` - +
            Convert collection to array
            Parameters: not specified @@ -1224,7 +1154,7 @@ public function toArray(): array; ```php diff --git a/docs/tech/classes/PropertyEntitiesCollection.md b/docs/tech/classes/PropertyEntitiesCollection.md index 6d3ed9f5..a157f085 100644 --- a/docs/tech/classes/PropertyEntitiesCollection.md +++ b/docs/tech/classes/PropertyEntitiesCollection.md @@ -44,16 +44,16 @@ final class PropertyEntitiesCollection extends \BumbleDocGen\Core\Parser\Entity\
          49. has -
          50. + - Check if an entity has been added to the collection
          51. isEmpty -
          52. + - Check if the collection is empty or not
          53. loadPropertyEntities - Load property entities into the collection according to the project configuration
          54. remove -
          55. + - Remove an entity from a collection
          56. unsafeGet - Get the property entity if it exists. If the property exists but has not been loaded into the collection, a new entity object will be created
          57. @@ -223,7 +223,7 @@ public function getIterator(): \Generator; ```php @@ -232,7 +232,7 @@ public function getIterator(): \Generator; public function has(string $objectName): bool; ``` - +
            Check if an entity has been added to the collection
            Parameters: @@ -263,7 +263,7 @@ public function has(string $objectName): bool; ```php @@ -272,7 +272,7 @@ public function has(string $objectName): bool; public function isEmpty(): bool; ``` - +
            Check if the collection is empty or not
            Parameters: not specified @@ -326,7 +326,7 @@ public function loadPropertyEntities(): void; ```php @@ -335,7 +335,7 @@ public function loadPropertyEntities(): void; public function remove(string $objectName): void; ``` - +
            Remove an entity from a collection
            Parameters: diff --git a/docs/tech/classes/RootEntityCollection.md b/docs/tech/classes/RootEntityCollection.md index df557e88..70ff0443 100644 --- a/docs/tech/classes/RootEntityCollection.md +++ b/docs/tech/classes/RootEntityCollection.md @@ -28,13 +28,13 @@ abstract class RootEntityCollection extends \BumbleDocGen\Core\Parser\Entity\Bas
            1. findEntity -
            2. + - Find an entity in a collection
            3. get -
            4. + - Get an entity from a collection (only previously added)
            5. getEntityCollectionName -
            6. + - Get collection name
            7. getEntityLinkData
            8. @@ -43,13 +43,13 @@ abstract class RootEntityCollection extends \BumbleDocGen\Core\Parser\Entity\Bas
            9. getLoadedOrCreateNew -
            10. + - Get an entity from the collection or create a new one if it has not yet been added
            11. has -
            12. + - Check if an entity has been added to the collection
            13. isEmpty -
            14. + - Check if the collection is empty or not
            15. loadEntities
            16. @@ -58,10 +58,10 @@ abstract class RootEntityCollection extends \BumbleDocGen\Core\Parser\Entity\Bas
            17. remove -
            18. + - Remove an entity from a collection
            19. toArray -
            20. + - Convert collection to array
            21. updateEntitiesCache
            22. @@ -80,14 +80,14 @@ abstract class RootEntityCollection extends \BumbleDocGen\Core\Parser\Entity\Bas ```php public function findEntity(string $search, bool $useUnsafeKeys = true): null|\BumbleDocGen\Core\Parser\Entity\RootEntityInterface; ``` - +
              Find an entity in a collection
              Parameters: @@ -123,14 +123,14 @@ public function findEntity(string $search, bool $useUnsafeKeys = true): null|\Bu ```php public function get(string $objectName): null|\BumbleDocGen\Core\Parser\Entity\RootEntityInterface; ``` - +
              Get an entity from a collection (only previously added)
              Parameters: @@ -161,14 +161,14 @@ public function get(string $objectName): null|\BumbleDocGen\Core\Parser\Entity\R ```php public function getEntityCollectionName(): string; ``` - +
              Get collection name
              Parameters: not specified @@ -182,7 +182,7 @@ public function getEntityCollectionName(): string; ```php @@ -254,14 +254,14 @@ public function getIterator(): \Generator; ```php public function getLoadedOrCreateNew(string $objectName, bool $withAddClassEntityToCollectionEvent = false): \BumbleDocGen\Core\Parser\Entity\RootEntityInterface; ``` - +
              Get an entity from the collection or create a new one if it has not yet been added
              Parameters: @@ -303,7 +303,7 @@ public function getLoadedOrCreateNew(string $objectName, bool $withAddClassEntit ```php @@ -312,7 +312,7 @@ public function getLoadedOrCreateNew(string $objectName, bool $withAddClassEntit public function has(string $objectName): bool; ``` - +
              Check if an entity has been added to the collection
              Parameters: @@ -343,7 +343,7 @@ public function has(string $objectName): bool; ```php @@ -352,7 +352,7 @@ public function has(string $objectName): bool; public function isEmpty(): bool; ``` - +
              Check if the collection is empty or not
              Parameters: not specified @@ -452,7 +452,7 @@ public function loadEntitiesByConfiguration(\BumbleDocGen\Core\Parser\Entity\Ent ```php @@ -461,7 +461,7 @@ public function loadEntitiesByConfiguration(\BumbleDocGen\Core\Parser\Entity\Ent public function remove(string $objectName): void; ``` - +
              Remove an entity from a collection
              Parameters: @@ -492,14 +492,14 @@ public function remove(string $objectName): void; ```php public function toArray(): array; ``` - +
              Convert collection to array
              Parameters: not specified @@ -513,7 +513,7 @@ public function toArray(): array; ```php diff --git a/docs/tech/classes/TraitEntity.md b/docs/tech/classes/TraitEntity.md index 3b1e7fd6..9325271e 100644 --- a/docs/tech/classes/TraitEntity.md +++ b/docs/tech/classes/TraitEntity.md @@ -293,7 +293,7 @@ See: - Check if an entity is a Trait
            23. normalizeClassName -
            24. + - Bring the class name to the standard format used in the system
            25. reloadEntityDependenciesCache - Update entity dependency cache
            26. @@ -405,7 +405,7 @@ public function __construct(\BumbleDocGen\Core\Configuration\Configuration $conf ```php @@ -450,7 +450,7 @@ public function addPluginData(string $pluginKey, mixed $data): void; ```php @@ -538,7 +538,7 @@ public function getAbsoluteFileName(): null|string; ```php @@ -624,7 +624,7 @@ public function getCachedEntityDependencies(): array; ```php @@ -682,7 +682,7 @@ public function getConstant(string $constantName, bool $unsafe = false): null|\B ```php @@ -724,7 +724,7 @@ public function getConstantEntitiesCollection(): \BumbleDocGen\LanguageHandler\P ```php @@ -780,7 +780,7 @@ public function getConstantValue(string $constantName): string|array|int|bool|nu ```php @@ -824,7 +824,7 @@ public function getConstants(): array; ```php @@ -876,7 +876,7 @@ public function getConstantsData(bool $onlyFromCurrentClassAndTraits = false, in ```php @@ -1083,7 +1083,7 @@ public function getDocComment(): string; ```php @@ -1166,7 +1166,7 @@ public function getDocNote(): string; ```php @@ -1199,7 +1199,7 @@ public function getDocRender(): \BumbleDocGen\Core\Renderer\EntityDocRenderer\En ```php @@ -1229,7 +1229,7 @@ public function getEndLine(): int; ```php @@ -1282,7 +1282,7 @@ public function getExamples(): array; ```php @@ -1389,7 +1389,7 @@ public function getFirstExample(): string; ```php @@ -1440,7 +1440,7 @@ public function getInterfaceNames(): array; ```php @@ -1470,7 +1470,7 @@ public function getInterfacesEntities(): array; ```php @@ -1528,7 +1528,7 @@ public function getMethod(string $methodName, bool $unsafe = false): null|\Bumbl ```php @@ -1570,7 +1570,7 @@ public function getMethodEntitiesCollection(): \BumbleDocGen\LanguageHandler\Php ```php @@ -1614,7 +1614,7 @@ public function getMethods(): array; ```php @@ -1687,7 +1687,7 @@ public function getModifiersString(): string; ```php @@ -1710,7 +1710,7 @@ public function getName(): string; ```php @@ -1733,7 +1733,7 @@ public function getNamespaceName(): string; ```php @@ -1756,7 +1756,7 @@ public function getObjectId(): string; ```php @@ -1779,7 +1779,7 @@ public function getParentClass(): null|\BumbleDocGen\LanguageHandler\Php\Parser\ ```php @@ -1802,7 +1802,7 @@ public function getParentClassEntities(): array; ```php @@ -1825,7 +1825,7 @@ public function getParentClassName(): null|string; ```php @@ -1848,7 +1848,7 @@ public function getParentClassNames(): array; ```php @@ -1888,7 +1888,7 @@ public function getPluginData(string $pluginKey): mixed; ```php @@ -1932,7 +1932,7 @@ public function getProperties(): array; ```php @@ -1984,7 +1984,7 @@ public function getPropertiesData(bool $onlyFromCurrentClassAndTraits = false, i ```php @@ -2042,7 +2042,7 @@ public function getProperty(string $propertyName, bool $unsafe = false): null|\B ```php @@ -2098,7 +2098,7 @@ public function getPropertyDefaultValue(string $propertyName): string|array|int| ```php @@ -2140,7 +2140,7 @@ public function getPropertyEntitiesCollection(): \BumbleDocGen\LanguageHandler\P ```php @@ -2169,7 +2169,7 @@ public function getRelativeFileName(): null|string; ```php @@ -2192,7 +2192,7 @@ public function getRootEntityCollection(): \BumbleDocGen\LanguageHandler\Php\Par ```php @@ -2215,7 +2215,7 @@ public function getShortName(): string; ```php @@ -2305,7 +2305,7 @@ public function getThrowsDocBlockLinks(): array; ```php @@ -2335,7 +2335,7 @@ public function getTraits(): array; ```php @@ -2365,7 +2365,7 @@ public function getTraitsNames(): array; ```php @@ -2483,7 +2483,7 @@ public function hasExamples(): bool; ```php @@ -2541,7 +2541,7 @@ public function hasMethod(string $methodName, bool $unsafe = false): bool; ```php @@ -2581,7 +2581,7 @@ public function hasParentClass(string $parentClassName): bool; ```php @@ -2669,7 +2669,7 @@ public function hasThrows(): bool; ```php @@ -2699,7 +2699,7 @@ public function hasTraits(): bool; ```php @@ -2746,7 +2746,7 @@ public function implementsInterface(string $interfaceName): bool; ```php @@ -2799,7 +2799,7 @@ public function isApi(): bool; ```php @@ -2822,7 +2822,7 @@ public function isClass(): bool; ```php @@ -2875,7 +2875,7 @@ public function isDeprecated(): bool; ```php @@ -2958,7 +2958,7 @@ public function isEntityDataCacheOutdated(): bool; ```php @@ -3058,7 +3058,7 @@ public static function isEntityNameValid(string $entityName): bool; ```php @@ -3081,7 +3081,7 @@ public function isEnum(): bool; ```php @@ -3104,7 +3104,7 @@ public function isExternalLibraryEntity(): bool; ```php @@ -3127,7 +3127,7 @@ public function isInGit(): bool; ```php @@ -3150,7 +3150,7 @@ public function isInstantiable(): bool; ```php @@ -3269,7 +3269,7 @@ public function isTrait(): bool; ```php @@ -3278,7 +3278,7 @@ public function isTrait(): bool; public static function normalizeClassName(string $name): string; ``` - +
              Bring the class name to the standard format used in the system
              Parameters: @@ -3402,7 +3402,7 @@ public function removeNotUsedEntityDataCache(): void; ```php diff --git a/docs/tech/map.md b/docs/tech/map.md index 0a407d0f..77995d8b 100644 --- a/docs/tech/map.md +++ b/docs/tech/map.md @@ -266,4 +266,4 @@ Directory layout ( only documented files shown ):

              -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
              Last modified date: Mon Nov 20 19:18:48 2023 +0300
              Page content update date: Fri Dec 15 2023
              Made with Bumble Documentation Generator
              \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
              Last modified date: Mon Nov 20 19:18:48 2023 +0300
              Page content update date: Sat Dec 16 2023
              Made with Bumble Documentation Generator
            \ No newline at end of file diff --git a/docs/tech/readme.md b/docs/tech/readme.md index 568bd12a..16068711 100644 --- a/docs/tech/readme.md +++ b/docs/tech/readme.md @@ -44,4 +44,4 @@ After that, the process of parsing the project code according to the configurati

            -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
            Last modified date: Thu Oct 5 17:42:06 2023 +0300
            Page content update date: Fri Dec 15 2023
            Made with Bumble Documentation Generator
            \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
            Last modified date: Thu Oct 5 17:42:06 2023 +0300
            Page content update date: Sat Dec 16 2023
            Made with Bumble Documentation Generator \ No newline at end of file From 0e30ec54e13f60bb8a6ea67f651e91aca6ca05b3 Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Mon, 18 Dec 2023 15:25:50 +0300 Subject: [PATCH 141/210] Renaming method to get collection --- demo/demo6-reflection-api/demoScript.php | 2 +- docs/README.md | 2 +- docs/classes/DocGeneratorFactory.md | 8 ++++---- docs/shared_c.cache | 2 +- docs/tech/1.configuration/readme.md | 2 +- docs/tech/2.parser/entity.md | 2 +- docs/tech/2.parser/entityFilterCondition.md | 2 +- docs/tech/2.parser/readme.md | 2 +- .../php/phpClassConstantReflectionApi.md | 4 ++-- .../reflectionApi/php/phpClassMethodReflectionApi.md | 4 ++-- .../php/phpClassPropertyReflectionApi.md | 4 ++-- .../reflectionApi/php/phpClassReflectionApi.md | 4 ++-- .../reflectionApi/php/phpEntitiesCollection.md | 2 +- .../reflectionApi/php/phpEnumReflectionApi.md | 4 ++-- .../reflectionApi/php/phpInterfaceReflectionApi.md | 4 ++-- .../reflectionApi/php/phpTraitReflectionApi.md | 4 ++-- docs/tech/2.parser/reflectionApi/php/readme.md | 11 ++++++----- docs/tech/2.parser/reflectionApi/readme.md | 4 ++-- docs/tech/2.parser/sourceLocator.md | 2 +- docs/tech/3.renderer/01_templates.md | 2 +- docs/tech/3.renderer/02_breadcrumbs.md | 2 +- docs/tech/3.renderer/03_documentStructure.md | 2 +- docs/tech/3.renderer/04_twigCustomFilters.md | 2 +- docs/tech/3.renderer/05_twigCustomFunctions.md | 2 +- docs/tech/3.renderer/readme.md | 2 +- docs/tech/3.renderer/templatesDynamicBlocks.md | 2 +- docs/tech/3.renderer/templatesLinking.md | 2 +- docs/tech/3.renderer/templatesVariables.md | 2 +- docs/tech/4.pluginSystem/readme.md | 2 +- docs/tech/classes/DocGeneratorFactory.md | 8 ++++---- docs/tech/map.md | 2 +- docs/tech/readme.md | 2 +- .../php/phpClassConstantReflectionApi.md.twig | 2 +- .../php/phpClassMethodReflectionApi.md.twig | 2 +- .../php/phpClassPropertyReflectionApi.md.twig | 2 +- .../reflectionApi/php/phpClassReflectionApi.md.twig | 2 +- .../reflectionApi/php/phpEnumReflectionApi.md.twig | 2 +- .../php/phpInterfaceReflectionApi.md.twig | 2 +- .../reflectionApi/php/phpTraitReflectionApi.md.twig | 2 +- .../tech/2.parser/reflectionApi/php/readme.md.twig | 9 +++++---- .../tech/2.parser/reflectionApi/readme.md.twig | 2 +- src/DocGeneratorFactory.php | 8 ++++++-- 42 files changed, 70 insertions(+), 64 deletions(-) diff --git a/demo/demo6-reflection-api/demoScript.php b/demo/demo6-reflection-api/demoScript.php index 293c8c64..6c4dd144 100644 --- a/demo/demo6-reflection-api/demoScript.php +++ b/demo/demo6-reflection-api/demoScript.php @@ -18,7 +18,7 @@ $reflectionApiConfig = PhpReflectionApiConfig::create(); /** @var PhpEntitiesCollection $entitiesCollection*/ - $entitiesCollection = (new \BumbleDocGen\DocGeneratorFactory())->getRootEntityReflections($reflectionApiConfig); + $entitiesCollection = (new \BumbleDocGen\DocGeneratorFactory())->createRootEntitiesCollection($reflectionApiConfig); // Initially, the data in the collection is not loaded assert(0 === count(iterator_to_array($entitiesCollection))); diff --git a/docs/README.md b/docs/README.md index fd2facba..21080c2d 100644 --- a/docs/README.md +++ b/docs/README.md @@ -95,4 +95,4 @@ To update this documentation, run the following command:

            -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
            Last modified date: Fri Dec 15 21:27:10 2023 +0300
            Page content update date: Sat Dec 16 2023
            Made with Bumble Documentation Generator
            \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
            Last modified date: Fri Dec 15 21:27:10 2023 +0300
            Page content update date: Mon Dec 18 2023
            Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/classes/DocGeneratorFactory.md b/docs/classes/DocGeneratorFactory.md index d6658754..565ce7c2 100644 --- a/docs/classes/DocGeneratorFactory.md +++ b/docs/classes/DocGeneratorFactory.md @@ -43,7 +43,7 @@ final class DocGeneratorFactory createConfiguration
          58. - getRootEntityReflections + createRootEntitiesCollection
          59. setCustomConfigurationParameters @@ -254,13 +254,13 @@ public function createConfiguration(string ...$configurationFiles): \BumbleDocGe
              -
            • # - getRootEntityReflections +
            • # + createRootEntitiesCollection | source code
            ```php -public function getRootEntityReflections(\BumbleDocGen\Core\Configuration\ReflectionApiConfig $reflectionApiConfig): \BumbleDocGen\Core\Parser\Entity\RootEntityCollection; +public function createRootEntitiesCollection(\BumbleDocGen\Core\Configuration\ReflectionApiConfig $reflectionApiConfig): \BumbleDocGen\Core\Parser\Entity\RootEntityCollection; ``` diff --git a/docs/shared_c.cache b/docs/shared_c.cache index eb3bb6a1..1b72931a 100644 --- a/docs/shared_c.cache +++ b/docs/shared_c.cache @@ -1 +1 @@ -eJzsvXlvG0m2L3g/ykMBF697BuiKfXFjMPBSizG1+Nm+9/4x9dCI5YTMLkkUSMpdvj393SeSiyxRZDKTTKZSGacXK0mJkckTvzj74l4oSl78c/6CyxffTG9g5haT6fX8b5fTi799u4Dw6dsZuHgFf7mKf1n8Y3LxzV/dC1r9PaUvvrn5dPPd9WKymMD8m7/++kLnJV7dXvlLeDMNP8D1b6+nM/jtnZvNYfbb8g+/5LcuLyFU9/hpevHr5n6/3V3Nv/7BN+sbkfsPVt0/P++//vWv/Mj2xTdpcgnzv0W4gesI1yE/yd7H5i/+OXlB8nMqsus531crzPKTvp5eL+CPxW9vNot++e37fJevL795IZYPpla3f5v/fHbtLn+aXP/+zV/zY+kX3/zz3xdwdXPpFtXDTWb//q/dD5UXMS++CdUNrxf5Jnmh93ABf3zz11/+uvrmV24RPr3N912/J15888nNPy3vw158wwg1yUAQkDRP3AROuTYWjBLeJhe++eu/Ji9oD9+Z7frO7797+ebn75p83fkLmVf49k///Pc//+l//N9//tMcFvniz3/KmLmEP//p//0f/9f//j/zj//5zf/+85/+8n/8+U//8//7Jv/+3//152+/2UGoyQvzmFRRJkd0EklmGgVpQUXPnBBGcS2J0EtSsYpUO2FcR6o3k1mG7HT25T69WEUvk2/8bycv9m+ZnNsUp7tQVv1C005ueZ90NPkkNQgvgzXGKhlcCsGEkKxnhstMun+t/nInB7lyN0NiH9QuocwyAcPl9BruPqykjsZ4a6xWpnoiZY9+otcPVl6fHrN7a45Y8N9u5+4CXk9vrxcV3GneKMM7WzzdXi//5hd3BUus8eWpzwB89eWdW3yaL3EmO7ufm13M18ioOPTdxfIMfzufhRXAbHfkm+4CTJ8YrN4WGYGTRfU2bM6BTikYLzyziQqgOnkeqFRSUk5Bglg+4/GofPvwbvfwueRWpxB439K7kGrPcBu44ySZukYv6cu3CPXybcX95tNL+O1ljPnNV5fT8Hver6srdx2rx6swJ2s+ll8u7/8+C/Kf4eOa+95boPp+YhtEeYH1B6ez+W939717r/ogq+68LaQffvD9UnvY3PTBp3nFqenjT7+bTT9PMt//3i35e/WnovrTHV9x86dLQZNVB6j+WFZfp2bdeQX763tvVB9S1YfU4w99nLnJYv7bh09uBnFNs7y5k7D8RfVJnT/JxCN4r7fs5mYj2uX26pu/Wa9abe+kgoW7XL9z/5hPXtjqCR9rRA/XeOXmD3Z2yY/2PdzmQxuA3P9ghQm5TcTNBzPhLmYwn79ys/vX9zaMsrV6dPDzHxZfLif/DfHee8sFKnQ8OgzLM/fahU+wPnLL63y+rt5Np5fLz1VQUWb/536ahkzg1RJ/BLhZ8UH/90zoX6aL7/OZj3fvLxeUuymxa8Hl5Wqt5RvLz1fIknr/5++gdVN9faiO+O3VSteEr6voXWd0tcr0Ok0ubjcy4/6r5SfN/vvv/2Tma1mOVsLTXSxXqdBndurjD1f5StO315/d5STuXvYBiRnZT+IHi7+HtD4QL28mq18tP1+BVe3GyoPP/6e7vM1sMGPwc2baL2cXnx+8s1yrAq5qQK6Ha2003cfrVThWjw/CgfXyN328VA20a5Z68OoBo2QVtHXTZ8sM73qeprOrzZofp68v3Xx+7/3lohXe9WOW03TRr288fFa9m4XOqlN3cZE//mNmXZf555qb5Vt8N5tlEbR+f7mI2c2VHgnyio2uGcwDHsyqY6B3Im1LE1ge7eW//w98ubu4k38PvhsnaxOo5apvILnby8WjxZdrVmeikdb1cM2NybW2uHavzfZieu/aLv/h6t2HX706HnInphssdSeDudh7ahss818zd3PzQN/g1cnYbVM3X+/r06ldGtrh1X6GxafpUhxz3Yri92Tjh/yVsi77I1zerM4AN02/2h3yf5hNb29+mrq40WAzN8m4W65WHYjdfpr9qvGuhUR1BrqzXasVG5+AlnZHtTZrygcO2F0PDoPgaxO1S2uuWrc6HaYJenav+2FyfbHB9gdws/DpITGWh2Una364/IaUFQJgdk/he0iFpSre4CzvYCdCN4RjJTOqI/Z+Ol3sYvSiqaTYu4BtyNh2LTBfnrilLbNfNdq3zENbaHkI6oi5cmlmdr8yPpZGwfR6+93v3WVlWKxfLleujoCp+4INV85q7sdK0mSB4yYVdO/fpDoRpu7rN7tJpZgvIL69frj68lzsVFWOWT2bD9s3WCpYdSej2Q0+zm63iL+UKHWc4vHC66uv0NJ7teZGa3z8cpN5wu3Vcq3lcanjtXvXegjX6tTwOlBlrlGZV6tXS8Od7FUM1x/5ML2dBVhu0nS2VO0evLNcZL8FsXORjfM5M7PHay21ozpUPVyrOgArWTOdPV6M71XRdy72HsLtbD75DLVPKA5pEw8XXfH/6jkfL7Xk/XUHdGup+68ebL1S7bbgwastgaf0foX68vZisrpeX/7k5hlOF0vvx2SRn+jxO8s1zf5v+mjN6tNV0ANWePv6crmS3a+s1q1UXf64uLpcvVz9fumAIvspd2i9R2vR/bL80Frv54tHy7H9UnC1xnef4Xqx2eFXkKrV84uMuHzSQ1YPlsvsN6IfLHMXL3qZlmG66lVe6WvAJi8lDm3j1lKrZ3o9g6zvXF/kv6/OwXIleYjsO1e6e6r1UqunqgF/k7UefMOD4N9a69fr5beDjeMJ4gMzZrlmjdGwZ80fYLHm1Rvn7zzzpNUT2r0ugprVNstUwZxXX95Dvq743DRUbyydrKTl1i6XrXa18o4suckyTplXons9LftWurNqvlRPtPyj16uY8XLB6hyI3fJxteCv15df1nr2H5mHL90Xnzef5ruc0/c/vfqx/MCbyfymCiuvNs6I3V7j7Y8+YMVm6UGvO26rH1tc16i9kvgrbqtsgjDLfzC/f/3VPDV6L9IOLfLxH5N8ED5PZtPrqw3l9uO2bWy8Wm2/sdsiKaFy5e93+NQttPnd17fuuSws3WuStlvzARQsa/Gka/5x58Lb4/Ox+30+e9fcwZOs2OsxaLrMFoCt3BXP2r3ilp9s+XF1mFZ3LGL/Ow9ppQ/vaoM1t7+o2Svl79bYCPe1GJ4+1GTu3l0uZw/vxOPlfpgsPt366v35oxUpaXBCHi/56J0HtKSkOiK8nhtsLlYfYLtCibs/8JWFUcIP4+hut9ea//3YGVmGO+vpuZGGG22EEnmY+1Yccm2JVdHGKvPoevH9bHr1E6RVpJuowyzu/iqvb+eL6dXqxRax97ssD660BVdKzF7xuXOt7yd/fFjMPkz+e/0odq/83Pnxt5m007j67CqCWs+s7n/23Qwufq7k7+rTtN2m5E/fuNnGzFprI3QZTG3xDP/rdrqAK1i41af5Xl/Bzk+/h6vp5+rm8Grmfl/plHQZVt3th9q5SCZ/5R/4OP2P2Sosuwqj7tT5di5QuYQ+Tl/nbVjmHazWUHudcjVr/JgVhKxYrVbQe23zrRXW2UQbWK5fPoQ4bcBG61bbhvkyyNroyGzWezNz/9jItqU/9me4vl3F38lhzWf/Whs5eQdB1hjIm+UqxpTV67USvEIR2+8a2bPKJjWh4uz3VL3Varz9aosH1KpW3QB0FV2tl7R7V9vQ624xudcftmexyn6406rv7Aa6jKbutkT2LPQu24OPHMovs4idr1fcn0nwcMWfXbYo/shPMt/gcxU+bcAEqo/u0MbpMnzKtu+9+vE1vEiX8VC+fQ7u/9l9abmMdD6Krv3kri9uK4fJOiq89frhQV4GNB+xyANLbJ/eVShzG47bi7z7dLPxdlQpH9P5A81hGcd8lKxRs8ajePVqmaXfeRs1h5fZij++W+e6fnlAbrVLe2+wdpUrcP8Zd+oHDdf5afL7g+9rdnGCw2u9cQt3l9p2x+uWMc0jNqFyht97qFVEs/0XvIPm/bV2OiQOr/Xua7byFlqXEcys4LZe8sOtv78TVUrXwl0vHr7ad9PqiNht7bLLe67JtQzsHGIJdfdZhd5/e/Pl2l1NwurV/RvIXcGvI25wb+Ud5FK7wken3WX9/NXhM4cYXsuVH/LUZQTVnoKvbMVlvnjvYh+ZduamnX6nFalWEdj2W73M/ri/Dl0euBagfBQyu4/27V++nWfB/3mZxHkvTkjl6pi32OnWd822RlhUCYwP7svbspe29731l5OwdVOxvGkLOdDqpv85mU/85HKpWD24rezktg1u9/M0TtJkrSssY8C2BXfYvsHq7DYFUsUxbItj0PxuuwG0ZB8n4Hbv/XYBxy53sIXIb3a3yqlfuVde385mWQfeoOvenZfRa9v5jfdBdRnnPmUXNwyyIWrUiv204M1tbrgTOMuI+SkUrbnjDuioFc/ZNvU6uF8D8FSMx57h1nvhs9MBU3PD1Y97Bs4yMv8o9l23wqeb9dUv0wjLFOHKbppcbhbcGeFptODd1f3nW7oKGwnpTzf3Moup3pmoVf/BD6vo48qbsYy8H7RB1wvsSYSny3i7aSQTHkXzl+79TzcfFrfew2zr5deQPl0G45spdofukS83HpTpbMedRGffJl/+x/VkseMezTX5R/fYGPDvXPi9CmNsbrbjLqo5H3x0m7toTv4GWfrHd5dZx9797v1bLiNHjZjD/ZD2Wnv99fr1Jwi/v51vUomvX8EybXNVHbTMB2izMw/SPJbZGdVqVZbHXgt1mSXwKPev6T1+vX4Z4z2fQ+VLfrD8MlugkY3YJtB2j5UY2lgtrLlD/vWqymL6c7x7sfntLh/bMtWgkVrY9q7Vi3t/tLobb+pp2ud1nsxvLt2X5Q0yL1upMyuOaHbWu7RZe+b+sVz4Z3ezWlE2PRP7Xb6rBVeP+Woav7zeRIqM+uu//rXs8VBJyAtYrM7Lr7NVds0v8A+tAxc+UeYhm8lSOOkclzYmHrURDKpC2TOlaa9qua04voi1ZvUd5bLnuhMs393UeLcull2djHM82Hb5OSO7MfDNWtyc4xm2StKPoE8degO1XnHKFeXCEqbzbz1RyUoZbXRUI3pboveEmu3CcHwCpeoQzbmjNBCtJZPGSmcpZcRZy53RiUREdGt+3L6JQGFIPoJCdQiOOoB3zhAumPZSSk+IMzJo8Pm1Qo2iNU8+sptFYTA+lky1+kVkjjkVwdFIlJHU2ES0EsEmFaS2iOWWWG7UW6Uw4DaiSa0N57KqwMEpzYIJRjgTiTcCuOXRMkYQpW1R2qytT2k4bUaVOqSCisY4aqSmTIEIhiTNpBBSsJiIp4jUttptu55ShSG2JXVq7TJghHFuCQtaGxCGSc6ljNpmNYAAIrc1co9obFYafI8gUS2GA02MQQqaBMOESo5w64Fp7iSnTiKGW2K4vsVeYWitJ0YtLjMDlYk57WmwKlgvdMovrABDNCUccdnWY3BSW8fCcHsasWrtMu/J0mPghAejfCA+/6MZiRBksnEkuBb96QytWo0WhuN2xKnDrYsiRaGMY44raY0DLQgw5lmwPLE0Etz2qOu27nZbGnZbE6jWy2B5YCpy5T11xFQhiMCY0vl1tt4k6hOt9Yljmy4XBuOj6VSHZua1YkywpGQkYByVWYOgEIiU+R0YixbRI5qPbgFeGpyPJlQdnq2K2jNvrWMiCUut5CZEYZ1zIUMd48OttYu2HekLg3Fr+tTrxqAUUOeIj1olbpylwkViWIayQN24NXq7m4tQGKy7I1wd3qXTlYOYUQ0xMG8cTyFFlgwngluH2kcHuvSubXs8tqMweB9Npzo0qySFSYxKyRShTiUdgAinPKHUJY9obo3m04bIlIbp06hVq1VT4rSt3M02ccq9J54YAG/AS21XY/gQ2afkDa/2qm6wUWFoPoJCtbmWiYBwQkKVUuEUiVRIK5TTQcUUtEIEd8Obmw7YKgzNJ1KrNiPeuSCz7kwso1Qm4DrG6KJVlobIIuZdtEX2eYa+FQb48xCxVvsW1POkDKiQuXwy1DAtlKHUG6uTH0ttE3tqW/LwfMLCoH40nWrjMtyFJIT2TKREJJFGcxWDkQxMImhLtvcEdjEtszBkd0KzWpRbiI5oSpNhjmcuLZlLhFGmOOEsOkR5W5R3Nce1NKR3RbdaLwrJermOLIhoudWSaRWEYppaEYLkaIO2RnsHU4ZLA3oHJKvDONFEgFJWiMzECYlSpegSN5FoS+NoslKfPIJ5xPjr0pDeGeFqebqxhLsUozRJO61c4FRYqRipumsYrNxqi/dup7MXhvluiVebBRuMTR6iJV5ywRnjQnpwELhz3ieMCLXG/c6xHo227usb5XL7rslXa7Xm19Z7wYnSUnCtUgiU8ZDZPwgJArHf1tO4c8xOXuwi32TTpHCdpJ8//d1sNp3N73rRFob004h1IBuLKWsSEUFqxX2kFpxlJgUaBNNj4enqKXPBH93k6yCbkqskjyZULZ+WOmblHESw0lZg1txA1lnAG5k0Vv6211HqhpVvbvJ1otL/A1/uLn7YtMQqWEXplnr1nFw5RbiJVFFqNChuvaBeWKtEIAKt0tbI3z1ku27v3kByt5eLR1tYHu67pF0d6r1R0oHVOjIJkBk/IUIaRZJ2VANWT7RH/e757XU7tzUlGtF/FhrW1hBp5j0I7gOniRpHKdBsqQrjDPFKoge+myjT3h3cOQO+MNB3QbJa7yPIYDxYoyN1QpCq/j6ZqiQ/G7CRIcZbW6o7gyUNNqzM3mmnkqs2U93AUkv3PnnGiCRABIlK6KzTEEqwgrk1/96Z29Fgs/5r5m5uyu0c3BndauOnlhMeCQmOc2oDOM6sjjJKRQkLo/E59oj2nXUzzXetTIbeEdVqkS6ZTZJIK3xGelLOKalVynaqtiwltE5b6yzt/GnVnq2mWBWH7hMoVYdoQZIRhKcYBE2EK8GMEFJ5Ct44EJjPeD5Lc/Vief0hC9lqltt6Dl9h0O6CZLXelCSp8dIEq01QoKUCYrUVXDHpGeYznkc/ubvJD7Pp7U21KcvfTGD+Hua3l6ifHEm1OqQbCVI5a6S1GfBcK8iXzlFjPY0C9ZP2SN9ZArn/JgjykwlWGx1ilCotDY8+c3GbNDgwlGkRdOA6oF+lNb6bRDZ23+T15fQavtKnOKB3R7laxHOVuAgEuM9gl0JTC9nejPk/GnRgiPiWiG8Uy9t9k7eL6go2DKtc7J+FhnWnIEkQURPjiSRaMx4Ek6CS115IJgP2x2h9Cpp4E3bf5O6q3NBox9SrjSQ5rrzyQJQDkf/N3J9Errk1wYNBjac98ltZYbv3bl5wmm/n9Kv1TirGPTMEHOcBlMivwSvFBM/nQOM8qtboPxOxSjsE5yJjbeyJG0WcZcp5nw8DC8rYqE30iRnwAScNt7Z9dxbhPLzJRk9d7sbsXgf7cpWfrsh2oNMjSQLy32mtVIgpOak1odxTb6nCqo+2WBcN8kBWP8oF9lE0qq3g4CxKpn20knpuElVRJB9DdCGIzMlHguL+utk1cS5XRZRV8Pv9dLpYvVWwsn46wWozeLV2NDhGMpsW1mhGBMn4JiIqTYUfi23K+8uGaUAsxPVJhKrtPlq1Z2QeAnPReauBJKe0i9YyHr0aC78eVkb6rm2aL4Pf5aH6RHLVW48iahdENJxnFTppSnVKUTPuTIiA1mNrbDeoiPy6WeVq1UfTqXZuMlXByABREO1d9JEKQQQEIEZkoGPGeWuveJ3t8/3kcrGsZIzLKde/VSNWp9fb737vLqvpweuXxeH8DBSszfSiNGR120jhM+A9FZY4QhmXWhkaHXbdbe0ZrxO+Dfdvcgkfq2Lf6fXCTaooR6mH4bzErI0YRRooaO65FNSa/MLJqC3TMXrJI+o5rc9FnfxutpXVBLYFxLfXBR+I81DxQHdHH4NlnlBpKDGOEs8gq0syMipgLN6ZHk/CzvaEx+zhL9NF0YfhbISsOw9cJxl55FzJxLSUlWteiRiDS846jh0fW9sMdYHAZtv4cXZbssnQOQFr5QGxNBGqFUuCewAdnSBWSJa41j5iFVRrD1BdJtTj7VtfFeraPIVWtbV9ICyN2fKlMms5yWruAIwVnDqvHfYLax9jrcttrd+pj19u8i1ur4pDdyc0q59QwIiggXkQXoOU4JxJTEXDqUiKYGSqNe+uq2DYu2MFe/FPpVft9FOpqWWSQfQiQSBegrIsBOqBJEUR3W3Rzevcb+9m07/n1VevigNyG9LUzkjiYDjP2FYyMA5cc6ps8kFZxTOW0c/YmiPXGUMfprezAEujfzpbdhF/8E5xKD6NWPXTHAUDCBSU5t5aBgSqJl7WiBgZMMy87VSffrhVbyYzqNqtTWBeNrw7oVmtL5Byljm2BJlkVqol504QQxgXhnsvsa6oNcrrXLoPd6wK7K2qgKezwmHeCdFqtRQVreEskAx1SwMJkoRsOnpPndHBoHektc+7jlgPt+w9hNvZfPIZkK3XTrY7lnh1uKfUei6AMUllMolRE7y3wQcegUWL/L01f2++datFK4ZVNtq7IFmtDhMs8CAkd9IJpxgllbOEJGsoTdIhb2+N8bocja0Nu/+qXK9gBxSrn4LBk03EapoiKPC6mhLAsz1KtPFxNPVzg7RFH7wqud9FJzSr9X47Gw0NOqXAjBTcRsqq9hZVhm+Q2iPK2+rou7nS5e3FZHW9vvzJzRfvlo94dTVZZI70+J3i0N4p7WpRn5QhiUUnjNIsqy6E2qCr8v6QMuwxO7Ej7eXRzlV79NPk+ndYuYa/viwO6x1QrLaHhdYxCsYIQNZbuMj/mORIyGC3lAiMELVG+O4Km7r9qi5/XFxdrl6ufl8ezruiW/3EoySttGC5j1BVlEbOqaCJQeBe4pzernT1Q7tWNtK7oFltN17QxMnoEnVMeUO0ZTwxVnkXJRWYbdge5bsD2Yd27P18UTbQOyJbrQ/dxarVHCM6Ixt40IYYCsbajPqgJNZYt85w2Z16tNqp7z7nP97c8RWkag/zi7z4u9k0wHxeHMZPJVf9bHUWrdABdEyRJO9VDDpFLShRiiScrd5RfOj+Zm0mIv/2Mi1gtnqV11+uPoHy8N0FyWoxLj2txjFGI73LjDx4HYPxqmoYoKRGjHfqYdnasBVLWu5FXj//fRXcKw/ip1OsPldRccqUrFpfAI8m8CrPhRmVpHToQ+zY5ty5X3c8ab1hBbLxLmhWG+evmLcBG2yGuoyGKRG90kFSJ310BFHeH8rLVVa6oFltrF9IJ6uURJeYCSFqL8GnGJTl+b9obXYbBd3asV+vV/uQ//L2Kv8GVkPZNoORi0N7p7Srz0P3yppIKCGGMxJYsjYG7pWL3ESKvL01b99dZ75n536Axbrk6yNc3VzmPZm/mcwK5O7dUK22X13WVBLYql8dybq5YNaZapAFI0qDtJjl0pq/7y4e2L9nm8165xafXn15D/m6yq+ehuqN4iDfNflqqzCEFYGGaLTmXHvio8+8PlnBpZdOYTb6OT0xy82rXArvYb7Kz5tc/14c3DugWG02l0nAVdWQlDPpVRSRqwz4yLTTIDh2I22N8MPBj3v7dTdG+UvFj5Z/VLXNhOsC5093RrjaLqNCmJT1l+StJ0QkbkFI6Zkj1bQ6FRDvLfEudvcXWW3br9eXX9ZL/QHhtvr4cieLA/eRVKrXTTwoLaJVEUiVnBgymiEJq1TI2opCJLdFcl1qxurHclveTOY3bhE+FeheOYZEtZkqMjjrWQhJGyps/iWVhkSaktBGAUY6W2N499io+xtUbtFbO+LUzhtSgXppmHOGOCIlkSRmBdpT40Fjr/IjcFuXUrH6UXIpW1vy1E5gEc4rWQ01BJ5B7Eh0RBiTTb7K2xE1Yrcldne3dPoaVMuEj2GW/2B+//pHuCwxQHMasWr1YW9SsjxQ6rLmELR2iQZBtRNMMEaRJ3cTkTm0VR//Mbn47vrzZDa9virR0uuIavVac5IiArgM9eCBiJT/NUlks88SJbG6vmOkLx1Lfyx+ewM31VvX4ctd87IvX99DpB9HtdraNM+ZA0Ksc0ET8DKrKMFHzaLhUhr01rVG+k4TqG7Pqjy3kkF+MsHq54w7lv8XeHCZd2srlVVEGs5s8oZit6v2sfWd0bK67dr87utb37sljyoO6p3SrparS+AWmKOWMglBZ4WdxczOFTGCBo5ev9ao35nj2W7nynULdky9Wr9hDFFWrpas1xhOiafRpiC0JUAsSNRnzsXv1ymeH2fuep6msyvnN+sXjPsuaVeH+sStjc4opcFDDMBZiD4IC8pYrrHjfnuP485Uib07V3pS+Knkqs+f0o5orqnijgtmUgLqiYQYUxXWxPyp1hbqzkyJpptVcpCoQ8rVVj5YoZVMHriT0RvuTEiJshS8oNmORR2mNTdv5mLYvLF+XRy8jyVTbVcgQ4ihoYrjJ2MIlQlEsoQZwxMwg9y7Y318tUT+1f53UB/vhHa1MwmpIFWpmuVRJkOE4J4wKrhIkjsr0f/Ssf+lwc6VrLd0TL1abT0Kb2VKwkhgRATJtKUy/zeQUHVBROS31dbr0zk2XczWrZ2mD/uw3r1bHOS7IlttjxVQifgQBXOKKiUSy/8yYJ5LmxUerNvs2DJ9vGk/TBafbn31/rxwuHdHudpKZa4Eyfq7VSCVcoaqytuej0B+k4ogEPHdavOP9+3RO6jNd0K7Wu96VEYIz1XgVRKY8ZIbq/IP0Jwoj9lgbVHP6/OaNhfFIboxXeonhguS1RBmNHVayKQVl8RKQghzUidEa1u0ino+s7koNN28JXVq/d5EEEeMztqEUkYqqbO+QaKXnicwCjv+dOz3vnNqrYenlpqWdSyZarmwlzKkrCZTZZUIxLOQsUyU8FGoGLD/Zmudod7C2bSgKbKXbCva1Gq6HqzlSnvQNKZIo5MxeZe8UZ7agBXvrTlwvRuqKkqp0pmrIWEvY3xbpbotvp9Nr36CVGD88SRi1dbzGJ8VC0t8cCwalRkzAcKYsDKbdBwr19p76upF5v2ten07X0yvVi/KdVacTrDaimNStbCnwlrwkgWSAjDlmXeUBp4cRtlb43snsQ5uV8lBxi5IVlvJQ4yTjmsF4Ii11qQMcSeDESJEj9Zhe7/GAa3x3oZ9P/njw2L2YfLf5THuI6lU2887UCkFd0Zm1cNJDdF6CkRpSyKnAm3D1khurji+zabQNBYI4yNIVOurY8mk4CllLnEmmeXBS544MOkga9uI4bYYrk+hv79B72Zw8XPV/Ks8FB9FpPp8pVQloxIwNjAqkwqKOWOoc9IoFTBf6Ywej7xFN24GH8ptPXwasWo9eWCo4pwbRh2hIImnhkfunVYuiBQR1+fjz//rdrqAK1i44vB8HJFqc+yoFMlIRUNSUZIglCDcAVcKZLYIMZO6NX+uzzG4v0Xv4Wr6ueI18Grmfi9wstNJtKqtUg+WJ2KqaIs0SRPHq9F8NtCsPWedGiu8WqO6Pgvh/k5lE/3jlxv4OP2P2WV5iD6WTrWeOTCKRet4ipIypYQyXgUqnPI0CoGeudZo3jmAZecufYQ/Fh+nr7O9/upyGgrUoE8gVW2vS6Ahisiy/mzAZ04tjLbBKh21sZKh/twa083DA6uN+hFczKuXh+ijCVWbuS+l0EBCUJzZkNk0EGmtEUxRqoGhv651hLAJ41njaxPwWr8sOAreCdFq+XbkSoM1VmRmbRLTLFIfuAEtPCcMe2+3xnkTF9XuLSs6Gt4R2Wp919YSC5YaG4w2TFqvrUgiJV8NrUmI9bNkfWw27c3M/ePNutPLcrGf4fq2PJx3QLJ6vQWoTV44qoAz5WNKKSgGQehEjECMt8Z4E5/Wrg3bdDMqMlDTEdXqe7ZSpZRhjGgJoH3KCns1vQkIM0AAa2vPEonc7FmVG/8DLNYTDgt0dZ9ErNoOUJqpkJKTBqJ0yfJEA4TlaJzM0w1HXJ/T8sy/r1ZZtra4Nw2jOHx3Q7RaTSUwSoKs2q5S4WS+5o5RpVl+RYNDnJ8Z54sHmmW1dSUGeLohWm1vMw4CnCMh8/AMaxlk8Fw4rfNF/omxy9Y4r+/OtXfLNqplkTDvgma1EXpnnddaGBCKsZT1b0qkkkR6RoTSCVHeVhtvkke/2bFqO+6GLpY5rP1ketVmVfGKg+vIhWCCp6qDEw9BGKU1F5JiVlVrHt4k8W2zW+9mk+vFatWvN345/2kyLw/m3RGuNkPFkgxyIxQVOjAmGDBNpJBGq0S4RW7eFu+igT/sZze5/u6PzIzmkwIDQEdQqLaC3RIHRAZrQnRCJmGCJjESq22SgWBnhtb6SINMuGp/Sp+2ejSdatGcDHVUapYk0CAjpSpVNWSWMZoo+kpao5ltc5vVj+qPC+yGeoAa9ZN/nUmSeCIdU1k/1koYpzMoIQoTMQrTGpl8m1j396LUjmPNiFKb50SsktwQS5lzIRDmWACqPLOUe+ewo01rfWDbo/STu764zc/yo7uOl/lGW6/LTeI7gVL1PZoM0dTbUGHYZSgLMCYoy0hUWghEdGtEb0vBA/tUcrreSbSq5dNBBCF81nGdEMwl4YGkqLziTBLi0W5rjertANf2Tr37dLO55+vp1c10Xmxr3lNIVV+96InmGcfBEkm10FSxQIkjPCvNoMcy90L1h2ndfKPW96zGlawuy4P1adSq7WojrRKsKlvULkYlszqSTUGtlE5aeZzo0hrZetu9f3ivXrvwCVb/VnOQ8x+sflGqrXgOEtZqLFn15lGSZQYTWEOTNYJyHllk0gusFGvN3Y/YwEs3n5fK3k8kV30UxWSuzojShgjFPGUKqJDRCCO4Gk11mHy6ipmGm/XT5PdS1ZcuSFaHcYhSpGhkVmEUj0HJkGR+B5yxJkVrRoLxJ8xDPbxhb9zCVT7dZaOBMgtmOiFara7uDKUpEsKSCswlZ6uG7iw6raVKgDkdPVih313fXhXKxk+kVn0Nu1NECWk15So6S2lm5oIIwjXRjmMMsgct5S5oUSi8uyBZbUaeoCQyRrXlOlb/GpcRbnhWXICQiD2jWmO8vdm08QtMoOTQT3eEq824ZoTIrKxk1PtgAiPcJc105u4igI1jsTz7wzsl7TnUh1t/36J6Pb2eL9z14uErPBL90ra2pjJpAcF7mqUFEEjUOA0uSuOkB+2wO3fbU2O3xxB1ubHlaUnnJmetL1PoqppeKl21JdSCExcdYRQAbLYg0E/f9myYQ3lNdZv5Myw+TeNvb75cu6tJWL0q9FCcjY61XSZYiox7EY3OprN2ymhHhTOcpvzaoqRofRraq8WPdvHe9pWtUJ2XmLW5OsqyqLkJinMXkg3UAIlcUKarzp8oJVpnNGw3yjltK8sTD90TsDYaJqT2nkPISpI32XDg1FV9iIKuqp4ZzlprLRcOZcq23L5y8+jPSMlau4GBtImZKvtYSqMhOWMZlSYRF4zHHLfWNvUpzpJ3s2le9t4Faks9ELR2Oqe3ggcVs+ZknLApsWxQSyFtsLIaQITno63EOMVJsns7y9OazkPE2vyKbE9b4iyxgSgFLngRgpHO8mRVdHgOWudXtDcCP87cpFTf6qnkqvUWGc9iYJGBF0Qm7R1PiQodA6GRa5zu0j4a18Lpt5pe8np6HSfL2zxwfW//8u383WzyOW/b3VvFnYR+iVt7biixTKgoYxDECSfzoZHBs5SVppA1JTw3rc9NCyOw9dZOF/nhIJZ8cvolb23GE3PKgs7KU9XVXaoIVCbLnVcm+WDw7Jw1A6Tt5t76y0ko+eD0SNtaKySAi04zk1U2J7lmVtIshDhhTAqIqKm1PzUtMvNb7ex/TuYTP7mcVM0Zyz03vVK3VlcTiQMRuhrO6pijkM8LsyxKcJwqjpGP/k9Ogz39eRonaVJgs4qeqVsrc5QjxlAejKOGE8NMIopaBYFFIy12ImodIWkR8t3exVWEC70Cj6MkvRC17pwIEo2wJHHLlNCaZ/smOC1FSFK7lFDCtD4nLVyezbe0eC9AX2StPSuBJOa4VjEa5ZgILARmlM6amE9EYlV267Nygmdn76YWbvX3QtPabEVmpEqRROEoo9laSdGFxLnIdr81FDWv9jZLizLlZlv66/Xll+9n06vXt7NZvtnGaC30yPRP4Np6KW+zrc+MyXpZMMxZmpwXIugkIXDA89NaynS+u+gl642qtfW4CrL1Ql1WxZhynOoImtPktdGEaDwpvdoum7QktPI7tV3akLV2MrVyzibQ1FpiXIwSLIiUrXzBuZYSa9fba2Utsvna7Grxpn6PlK2dkcpSNcpdMPBBRGMAnAbDpFeK6eAw1t+nHlazraXb+/1QtTZKaUnUIWb73osQFQleQ0hK2CxfOEnYxa29bNkeHNrBpqLN/1DI9E/iujOUgKgkVbBJGxu4yUeIEaposNqY4HDGRGtpc4b9Rbu/R7rW1j/SSEUijrloowLHTZJBU1nlxAhtsFNE29MiW6QKrn6UOo/laELV4tlxwTOfT9ncELKqYbFcBamYA28k1vO2xrNqoRXny/XVL9MI/+kub6GapDO5LBDendGt1rK23INJIlIvmM3KjbWK6FAxcAJBYBy9NdpbxHy/7trdVaGsvCOq1XpdM9JdcImAjIQro1QiRCbHLXcsaOyQ2xbpolEV3aeb9cviMN2aPrU2qcwKSfSKSrAqcqdYhKSDFFxDzEYporetlr09h71+dz7AYpHXnheH4qPpVBstFkxHpTyjMkkeOI9BSCeM0Y5ES7EXQms0N5Kfn27eQ1rf6OXNJBv4aXJRHqJPoVWthkEVI54ZlxVoF4JSxiQeaKhGBznAHvytUW0apeRf3l5MVvdfX1bTKfNvPixuvc9/9PDl6m+KA/05SVnf4QAiFxBVWtZnRx5IspEzBdrlU0HxTLQ8E82aeR3ayHyZP357ldeezso+GecnaO1sIm98IJb6LCkIt55YZogGIolJNP8fz8eTyIx8+R/Xk0XZJ+OcpKy1DoBy4mWyQgmaXBAGIEgtmEoyKcrxTLQ9E42SHh9t5GaG/TsXfs9/PN/saOGn4qzErPXVEy61VU4kQXminCbhXADptTbZmEZdqn1uT6Psxkd7uVo7fyQztjSB+O4yb8Pudws9JD1Str7+zRGb7Q3HVYxeesKdD9oHAU55AlhR3fbE6EYZJ+u9/Jw/u7nzr9evP0H4/e16rPhrd/0KVttV3Nk4Cw1r/VIhOMo1gQiaOsZsStSApJE750zAjIZz2hirHVw/wMu0gFm1P/lWOC2yrY3RlpR1Z0J7xqgPiieufOTMGGoqwUBcklk8oK+29ZloFCfasZG/Xr+McZmeu7rNx2nJx+E8VDwQi0sQshkBLJvawZuUBCfS8KSj1QStitYnoUnc/z1cR5jd3TX/5f53Cs0JOhsda08DD1RZy4OUxkcSA6mGC1MVgFMpCdYxt7exm/Shq9nG/OslX/s4/Tnevdj89uM/JhffXX+ezKbXleu9uDPSM3XrTk7UUsaqPUbixBJGONOgVT5LhFvrBFY1t470NVGN225t9eLeHxV3YPoham3nMhNU1El657WXyTMfpNMiee6VoQzPSWufVBOH/N0GVjztt+/X0PztzWR+c+m+LHfx5c1k1QylvCS/c5Cwtne/MyqLiWi0JUYbaQRjiSWtq/wQit37Wp8BdcoGztw/lrv3s7spDvndEa42C8olKgwIQfN/jOJac8uNB5pcApWwovgscYg92/YDrKrB15zq1TR+eT2N5c1LPQsNa2cH65AcUMEhsGwYRKGIElwpLRVVCrBSuN0p+KU0wAr64psPX67S9PrLKp3iunKAVgMeppdQvXOVgbv5eUAJZyC40cJqSSpnjwOiqnqEILRlQWFIDKFYC0Wu66D48ubmchJW210fhQIagRPhqwGgUmqtwJP8HyOVY1GEkcCQIQzP5M148c13fwS4aYK0bGRxn7ymmlMFTDJjnPKcWOelxDxjRNpB2fvz9Hp6Ob34baMfvvTzxcyFxbvZNMB8npdrVMqqRLbwjWLGOQ9OMcIyHiVn2nsllRpLMz+OUDyT7LX3Ze/1EoLzVTS88kW5RfhU3fDzwYiF5p7ZQJLgjPlslzsZuZbUchZNsBIj3wjEep5odymBO4H49XUFyX9VqOSZVGlyCfO/RbiprOzrMMkvvl1A+PTtlbv5y1X8y+IfVc2pe8FXt/z1hdpOq11+tTsjvToO8MfitzebFb9Ufb/g68s18Oj63m/zn8+u3eVPk+vfK9LxDJN//vsCrm4uMz3zk01m//6vHU+UV8hEDtXdNpP13sMF/LECAc0PeVV927f5puv38sKf3PzT8ib5SNmULa0gLAQpbIAkghUxaiCcyOS9zFSqgHv+L8x2feH337188/N3Tb7uirl8+6d//vuf//Q//u8//2kOi3zx5z9l/FzCn//0//6P/+t//5/5x//85n//+U9/+T/+/Kf/+f99k3//7//687ff7CDU5IV5TKookyM6iSQ5zZaqBRU9c0JUbkRJqrjqvyoN+/yk0nuxkU9fvIKB0MtHrQOlnmQL3yaaWP7XchpjpEBY5WVayoS81HRztOd/y2rN+uSJv9ws06s+fJnn7/roqy2Pf36SrA7dfM06rCSF3i4rb8517q7upy+ub/TgOav7M1m9z/JuhMvMce4+q6SOxnhrwYVliZTa9u81f6DXD1ZeA6PKTTuWrz5ccIeAqpJ9Olp8W1ZQvgR0BuGrL+/c4tMyvFftVkf325ILeYfumWffzmfh22rpzRetJNfyzS1v6wqWtjsaT3eBqkec0kMwBSIQpvdgar7CdMl7kwtwdqx+VWZ2So91qunqx91TFYfVLEQCYvUeVu1S/a56LL9djVeeuHybM4GVvPjnCOEmMtwmi+pt2KgRPmbVTkYlAiNcW80lD0SYlFiMIaYlBB9F7Zo/49uHd7sHRra0Rk8g8L6ld8HSnuE2cKeIuSx185fR24n099nZvYLDn9x88W75iFdXk0Ve/vE71YPv7Me5Z8nqw5XSXEVQK/m+uLpcvdxULK7ooLbTm5stt71U5VtX20ltzZZ6P19sr1Y5rc7ZKmbyQvy1j5Ybkxeys2+yu4HB5IX667mLwScv9F97raWtDKp/ff1PTbKvs9HQoFMKzMhsaEWa7SxIhtIQpB5L/NT0l9DSJb8qzA/XKe1qW4PL4KxnISRtqLD5l1QaEmlKQhsFo3EYk95g387qKAzX7U2yvew6g5MplhwHTagnRvAkMqsG4YRUo+l9bDHScR4kStM40vHh1s/DbJK1mIbYlNJTTm2IRnrnvA9ex2C8Ep6LbICPhan2p0qoOnG4Khq+Cwq8gpR/udyLvH7++yokUByj7YBitf03tI5RMEYAhCBc5H9MciQb+cRSIsZSU9oX9+3QEi8N513RrVbXSMqQxKITRukM8UQyc9eeehtStg3H0nOJDYSh7962pQvj7mV5QD+dYrUM3SRppQXLfQQT8i85p4ImBoF7ScbSoLJHht6FL7Q0jHdBs9qitWwrOhldoo4pb4i2jCfGTPBeUsFGkzLcY5VmR3760pDeEdlwdkOPVijObugM/081uyGbpiIfgWi05lx74qNnJCQruPTSqbHUaw5Ekd/yM/x6/cNqlNJ7mE9vZwE2eZhFQb8DimF/4D7DmNgfuJ+6/C77Axcyo6e/U4Azerquc8UZPWM6HzijZ2C2Ac7oefpUGBzS0+WxwCE9ozkYOKXnXKdkIFN6nJBO6mCSS8yEELWX4FMMyvL839F0g+yrC86BhNhHXpPVPmw0Y4irO/zXzN3cFBg67pR2dag30ZEE1kjhiQtSMOuM854zojRIO5YU+h5Rv90K/ZCv8OO6lr0qCn715T3k68nn6sPVG+UBv2Py1WGfU6+siSQLIJMBH1iyNgbulYvcRDqWaFt/2Fe7Kxf3b9672fTv+Y6bPZy/mczKa3vdEdUqpO8vHnbMao3Fw9iPYXM1zBp3x6LGfgz3OZS4D9NZZgbLjsfVr/vrytC611lBgOU8SQQsNmU4c1MGEbhz0sTAPAFirHLUJxmDtqRy7AE2ZWjSlCEL/X+u6sgOKFzrW67KbKoXWaFbNxi9a8Sw2zLYqbYtx4SuXuWFvrt7onUPhtMLf9YdGOqScXcudPdM65Xmm/YLJyx1/+uJrn0Zq5YKHanMq+4JXZucq34JHeQMrYKhj2aD1C5UmTJ3LtDVH71edcDb5NKfJbFj7Yo/5xzddY70mWaT5tVZs6YToLWjwTESQAtrNCOCJB+JiEpT4ceSrdWf10A2INb76XSxht29TSvMUXA8oeqnYGmmrElEBKkV95FacJaZFGgQTI8l7qEGhecq8wHxfDShatujWBOVrOIXhgjFPGUKqJDRCCO4Gs1kQ9GfV7dR2tvDe1Zi9qfJ7+v1i0N2FySrzRgPnmgOJAVLJNVCU8UCJY5w6RiMpvGV7I9nb9ekH96wr5ypOHifSK1abYSzKJn20UrquUlURZG16xBdCCKrJSNBdo/VnrvbNz24SV76onLSoZbdCcE2BqSoGa1wsMF7X8MW5M7ZA02e8eTxC8BSlb5eFXQHTnSWY5FqVulsWZoJwPELOH7hzOMXzJ7xC/wvszXFvr37rv/pZstIxnxQYxiW/ux9FSPEKskNsZS5LD4JcywAVZ5Zyr1zY+n41J8sldtO8W29Z+t1uU0jT6BUrXYoKImMUW25jtW/xgkiDI9GAiGj6Y8wsIntD++5xz1fGMC7I9xaW6xcBnu1xcbySPakNVbL79EDGj7rydpjVJSoFJLLLEBnW5GA4Um6BNxxy5VD7RG1x/Npj1WU/Oz0EqbJKRsU6Yj2jDiwmlQjQ6rmoixqqRLTWQPNeFuSTvRg1u6fIXiPdIT+7e5PBkLAbA8rbYFGbaRItqJlZmzeO06sV5WKs1SQVAvLpaJJlm1Dslt4nd1SSKfaHrU87FR7nJLXR6day0GAy/AOFILjMsjguXBZAsmQfwZEe1u070xdu5MsHzML/O37Ndx++wEW27lm/zG7LA/pXdCsts4wMEqC9EFYKpzM19wxqjTLr2iGPaK8Lcp3Zi0e3rHlWhWXKhLmnRBtY7GTlhb7Dj2sL3tdNrIk9j/pyda6s8lzHsElwni2oYISPHoTiI2cWqXQWkdrHa11tNZHaa1Xvt3G1vqbL9fuahJeXU7D74OKNVa1Vstvo1rKvb3fqDdvdSN4HXrek2WgUkR4SgwA48JE4SPTKUoHnGeBCAJlIMpAlIEoA0cpA0UDj/XjLLihyDzZ0NZ7/A1ETzKu65PXUKZJJYw0WZzp6CKhwQsN1NjMt5NmwaBMQ5l2fpm2kxnU0evNZJYP/nT25T7Rlrl0lQ9yhyuq5WL/lmm6TXa6i+zVL/Tu4vq2t7xPOpp8khqEl8EaY5UMLmVhFkKynhkum5slRP6tgsLr2/lierVxjQ3KLMkw/2ddh44gFQTs0DGEzkcVNO9aH327Afi3ldv12w22NgSoemDs6oj07btPN3s/WlbvmSBdwN4z95FtviL7LqO0vzZJraILDznqVv5rSRj2FPvSTbB/0pn7JzmZePJZl1QqBRKTEypVfW6VsiRoENg/qVH/pCV5d3c+2sPn3szcPx6EUX+G69u7Hkr1mvv+lTZ5B5tGOdW3lzsHNO5ZrLKYfoDFujfO/K6DUrsA8fWSZlVg+FVlOoVZ/ujXFkqdBJtXlf6d5GesCqrlTpTvWaoK16+SmOb32ghVvTR2tyXas8y72eT6UaHky/lPk/li0y9JN0mo34eMyTwbVV+WJfQvbyY/w+LTNM73NlBqs3LG3HLZn91NqwZK+7dmtdzqEV9NYyZIhHUDpUb9h6K1xIKlxgajDZPWayuSSMlrEW0aS3+LHjNpOmBnpeXRdECy2mwxCdQmLxxVwJnyMaUUFIMgdCJGIMZbY7wbQVsazLuhWn32r4jaBREN597SpCnVKUXNuDMhwlhy3fvrViR3913c0ySt4ArdY+lUO79cUqWUYYxoCaB9kkJTGRwQZoCsrKwRoLnHivOTbJrSIH0SsWpn02qmQkpOGojSJcsTDRAocOqzhmIwe/3M2et77OzC8N0N0bBKY7g4xyqNLqs0sOauP5xjzV17mJ+75q6QTuU92pbYqbyhJn6WTuXKWee1FgaEYixle5ISqSSRPiNb6TQSPPdoXZ4aCioN1qfSq3aWPa80Eh25EEzwZHyIPARhlNZcSDqakd396SSdRSgLg3l3hKvDuzBBRZ2kzzzdy+SZD9JpkTz3ytDR9OnvD+/niKAXhvxzkLB+9opRiZNotCVGG2lE1mtY0lkKBEJHM3N+YP0sG+V6FIb87giH/Vv7nLiN/VvPiPdGhKuNG7lEK3NV0Pyfqs5L84x5DzS5BCqpkeC9Rx3nHLl3hUH/LDSsz+aSQgMJQXFmg6QMiLQ26zqKUg3M4Sloy/U7KTQpDPZdVee06oFyuHyyr/rwZj1QDj3vyfXiJqkoo+SegqeRxqQZYS4JnyyIQDTWi2O9OPZAGWAPlHXDw+mGwe6rFxf3GcjyawyrWpwdqEf0zhusRxxEtTipqRZfPtFdrbhsXiu+/mBhVbY+26CI6uFUitdLoJUuuny83+5z0nKrxD2YhPjFKvEzV4lTE6yzJkQShYlVsbgiQGFZzkAsS1gl3qhKnCynezTJxl/xuJcxVtpp1ntn06ufIC029eGiScLFao3vJ398WMw+TP4b7rSC5g/wNuvq6zJcttbgG37y3Qwufq7U603Vd4uvnT9742bwYXo7C7CpZBft7v+/bqfZ0oCFuyvvblKztvrse7iafq5uDK9m7neYb0q7d5cG7Vwik/zjlxv4OF0XmFeV3LKJo2X18Y/Zzvo4rTyIy2arG+tkd/pYzQo/ZmNqcn2xqtBuVEWdPFjLlfagaUyRRidj8i55ozy1AT3zrXPJTjruhfkiTyNWbYSVGCcd1wrAEWutSUx5J4MRIkSvxhJh7Q/XR4qgwgB9JJXqkOwClVJwZySn1kkN0XoKRGlLIqdiLNnrPSL5CH2oNBgfQaI6DHOWTAqeUuYSZ5JZHrzkiQOTDozHyGdrDB+lmZeG4qOIVNtzKCbCjCFgbGBUJhUUc8ZQ56RRatWEEnF8Hm15h5VYGJ5PI1atFQiGKs65YdQRCpJ4anjk3mnlgkgRcX0+/nzPc1EYno8jUm3tEJUiGaloqNIrSBBKEO6AKwUyW4RYO9SaP5/iRSsMzifRqrbeM1ieiKk8ddIkTVzWm42ygWbtOevUWKXfGtXHOnZLQ/SxdMJq/B5rH7Aavymcz1KNL8EoFq3jKUrKlBLKeBWocMrTKAR6mlvj+YS4WWmIPoFUdZgmQEMUkWV70IDPmocw2gardNTGSob2YDc8ukkktzREH02oTUWCaFiRcCBBt7d6hJ0J+O2e9uRqBK6lc96GJGKSyScTs92ss36mPVc8OKxGwGoErEZ4xtUI/G9x3TUtG2q3YXE7G+R40cbM+8D3GRjzrn3ak5m308YLMFwHD0lnM4RyI1gKwkSXOTpF5o3MG5n3MJl3ZcAdZN7sb/5r4+Ihse1ltvY+G1IL55XkJi3bg0tHosuUMDEyIqyI2Neq41j5vebW969/hMubqtCrNDvyJGJhD/yhdnH4AXvgd9oDf1UcYBqq3XslUV8Kd3WsGyjce57zZFVbSyoFJ5Im8JIZ8MSFLNI8ZzGQkDiq2qhqo6o9UFWbNVC16d/uvvmQFO2Nf0Q2bbez53vIvth0syY7O5/yZCYtgFuQIKOGrKXFGATVxjHJQn43GYtMGpk0MukBMumq6PfXQ8Mmd5DuzWSW+ed09uU+/Za+icoO26GOt1zs3zJ5t3eA7kLssu3A7uL1tre8TzqafJIahJfBGmOVDC5lmoWQrGeGy7V8o3vkG/vLzVIgfTtfZYNPg8s3G5J4O9CLCFQwGrteDKdrS93IzA/3QfbwVbFtW0CzEBHAT9hM6w67lUT92kxrtXaBcASGcMQuQmfuImQiUdFJ7Z0JyVBHIiEyeq+EF1FxwC5C+24Dd0qYW52s3TPydorcjTaZP/7gF5teQrs9xzuXqmyS1TNOZ4/Wqr68rotzPFzrPYTb2XzyGeqer0qaV83XXHnMq6d8tBJv1v6GBws8CMmddMIpRglJipJkDaVJOhyl1jqYc7puWFokpwttegVyWeMdPGwF9hbD4XudF4ce8mTfoI+MQtIeBOOBeE5BMhM99SEzAGsw0RV9g8/eN7g/RHp3vAZFOOsMd55ERRJEHbiOlpkQPCeReuU2rWXMIffWDNKaGb+8mTz6ik/v5aJ12VJKcxWZh8BcdN5qIMkp7aK1jEevGCoiLRURubO5wOFiv/kPs+lteXPPTiXXpvqGNVFBDp3U3tK3SRNWWfesp2eUOMms80yyFFwkBsB4cFKAd16ppXKHCgkqJKiQDE4hUfvySfawjqx1DFApuau8qcssafWN+soxqRnk1OJ5T2bg0nIrlaU0SEnyuWKEEVimuFsaOA/IwJGBIwMfHANf55o8X/2yj5QdA4lpBSEIZ3yg3HKpvLEAwATzbCUHtW4vB/P/P87cZPH+/m+GJBZNna3OYz6JxFliA1EKXPAiBCOd5cmq6MRIbHVjns5YPzyFeImf1TUa6y3JVRcRo9ZEJRlR2hChmKdMARUyGmEEV2wsZXuW8f5iYtvkOrxdy+HCP01+h0IR3gXJ6lsqeqI5kBQskVQLTRULlDjCpWOg/UhQLi3pj4fr1lv2ys1LBfiJ1KptsAgyVM1CjY40W1fZJFU6Ga68Z8rG0TTvMsOKJbx24ROs/q1yx1bvLqVuedg+kVy1jDuGKKsmAp4zwynxNNoUhLYEiM3AHwm4qeiPcev6Lq93RvC6hU3epOt5ms6uvu5buck7ndKuDveWi6hdENFw7i1NmlKdUtSMOxMi2NHgXvTH1esSrx6FPMvF+NF0qsNzSIQkAfnvtFYqxKqhhtaEck8zvNVoumgY2xuexbZKueMmpWP5KBrVTmfTzHsQ3AdOEzWOUqCcKGGcIV7JsSjbVKinc5c0VR/LhXUXJFtn8FQ1PMcEgg+69FVPceGqoqR9XPjA45/eYVdqBiIZqx1hzlNtiJUgoktAJWcEw8QYJsYwMYaJxxkmrkayP/uEoB5IyQKPhPAgvNNaS6+oYhGICBTAc6FWuqg52Olhp3y7k/XPM+pOolNZsZZWU66is5TKqAWpGtUT7ThG3fuIS95hqNCwTRckw+h71tHlkFGO0XeMvneAcsH6c/5h9H0g0fdSApSsPw6OAUoMUA4H9/05wjFAiQHKs+OZ95cHiwFKDFCejy/3p2tjgPKJApTF57zyHtO5Mee135zXVfS9UQuvI937fUXgTYMGX0d9hZOj8CRKpiVPinLmhE4xERpVyOa6qQaV4ahEjMJjFB6j8BiFxyj8wSi8VkdF4b+7vr16ngF47qqmuJkyLKnAXHKWMWFZzESSKsFoeuWS/jwiR8QhKvxg1OYYamHc/YWh/RmQGHc/3UuCcfej4u6ix9JgjLtj3L3XeE1/2Ma4O8bdh4N7hnH3gWEc4+6n4BkLg4eEZYy7H4vjJ8zkxrg7xt0x7o5x9w7i7uTouHutQ7+3ovf9A8GPfvrTo+2BOPCUWSesYxJSxRwAUgpUBi0YRtsx2o7Rdoy2Y7Qdo+0Ho+3HdZn/bh1E/6pqDCncLuvC7VJQEhmj2uZDWv1rnCDC8GgkEBLJSFRrKnpM3G7fN/3dLgwVp2V3R7g6Y1JyVuVn+mgl9VU+pooi+Riiq9isHc0MRNljL7Wd4ufhTfLSF5VdtGu8X3lIP5lgte4SrR0NjpEAWlijGREkI5yIqDQVHkaDcN2fv6QBuRDZJxGqlmc7zZQ1KetrUivuI7WQWbXJNn4QTJuxILrHftxNNuprVgQi+ghC1QbUM2t2QqroeLbxwIV8xTKomdfK2zQWRPfWaPuX0mBJs6n6dlH9ejp7eXExg4v8EF30V603ZgffX7Xu8U/2NfvoTahcMcBcYiT/p3JypWCsB54VLfQ1o68Zfc3oa0ZfM/qaz+RrXqbiP8/SLkKV51ESSUngYA1N1gjKeWSRSS/cSHReSnss7WrvMl0CaHVdni13IrmwuOuFNk84owOLu7C4qx+/RY8Ny7C4C4u7+m1i1l/cBIu7sLhrOLjvb+gBFnc15OZY3PUsimKwuAuLu8ZQbI7FXadblFjcdQzKsbhrqADvqrjr+JB7vU9/8CH3usc/OeRexUxUJFHTQH0QzklBs2rnbORZx+OAIXcMuWPIHUPuGHLHkPvBkaby+JD7u1n1ycWXwYbea8u8nLeCBxWVssYJmxIDsFJIG6yUJIxlrCmV/bn4zPahPByI+HDr11cbNN1dFBrNOQ8RMYD5gloMYA4T8mcMYBbiMHzC2dXoLnxqd2EpwR2GsZ0Bobrz2A56vdHrPQqvtz3N633QrO5tnNh+p+XpX+NkL7jVTBohgTJDbGIuM4qQrRXqMv9wSSv0gqMXHL3g6AVHLzh6wQ96wfnxXvCfYfFpGgfrA1d1PnClLIuam6A4dyHZQA2QyAXN6KNUj6X8jPU4w6CaTne0+3aFpfWPQp2B3RMQfd95Z9H3PUy4n9H3DUJq73lWI2zWHqRxnDqI0gWdTGUrjQTblPYY4dyW2icyp3Ldh2ekJPrKXwisgxgS2LEO4ki15QkL6zGu+dRxTQwIYUBoFAEhfVpA6ICHqbdwkDwlHFT7JU4OBjlI3BFFE3HBS5KvhaAyBOmy0UNIwGAQBoMwGITBIAwGYTDonCURmcjzhbteDDYcVFsSYZIWELynghIgUBmWOu+fNE560E6OROGmrD/viD0lm/8BpB6+KtRbfm5yYqgIyyQGC34skzgV2z1OPEN34tDciYWEfvrDOEZ+sEoCneKlIXogVRIHLe3nUSVx4Guc7BiPVhOtXHSSKAZWUcMz/7DOVFfUOXSMo2McHePoGEfHODrGDznGhTjsGH/4pZ7e303r/N1RamqZZBC9SBCIl6AsC4F6IEnR0cy97k2V5nW64bvZ9O959dWr4tTmNqRZq8jCNFORt8+c6Enz7VbwNlRoA5FSyBBjAO0poYEYDYomxYlUHHDeJCq051dodwqvOnq9mczy+Z7OvtwnGquIVsmXHQyo5WL/lmm6TXa6i+zLEjXayS0ftKRNPkkNwstgjbFKBpdCyEptsp5lk3Pt07KHFIiVOFltfH6MOKn+ckj6xHLPWKZsuJxew91HldTRGO8UtWY5HETZo5/n9YOV12fL7N6zIxbcoRxU5a8dLb4te+lKhuXtfPXVwzlfolB2dtMtYXvfWVW3DVsw++3uassVa7uj/XQX1vpWh+vgm1ZZHgjfNXztUnX89foyo3fpqJtUDs0z4Ze8+Oe44HaIWzJCI8LtHtz4V275zi0+9cco8wZ8O5+Fb6ulx8n1qkjcZFG9DRvFwYeUGE2SWa8jZ4zqyHiIVILQJKswy2c8HppvH97tHkiX5+IUAu9behdc7RluA3eq17rDhK6Lcz4WtFdX0+vtd793l3O4e1k9Plkb6KcunG2Sj1mhrfRaN6kQc+8eSxLVjdxqdo+fpiETKr69frB41XbCiK4W/2W62Fq/ytR61C+h/fofZ7cPCS8q1anucO5VnX6YTW9vqiXkxotRx/6pA2T/Q2D/FXNc8v+tlLJv3326+XZ1q2+39rwYKUEseCa9VVEn6YgzQgEnkUDVPd5a/+ylBOtDStCVi4jw5jmMj5jM/YD59i/fzt/NJp/zYzySIJS0aDXQ+p7TRaYIxEcyhZIWY6fb3vXWX07CI0lDybao6eqW/zmZT/zkMmPgkfixLdr1bC+7qglstpOVSLItZtU3v9euHVwWCJwAm713e7xzarlzLVJ7m92rMlm/n02vXt/OZvkcbrb3632XE487v+0epJgTd2/TTLQZVuySpC1KBdrcbueBJycSs+aGjxFDV/xlW+R0cLuDoFn14D7DnffghvKVGvmvtTK5d16zYUTQwDwIr0FKcM4kpqLhVCRFMJLbOinyVMdpYeHdDhzNS4Ar3iTmezBM0lcIWNHDIeADD3t6RNgqzyxEqiAkHoUVwolkhdNBKeEwIowRYUxxHF6KY6OEshXvGFQAWByIaRhCCTq17olncd+pdadWVr/uMQ7cQPd7P52u64Dv+5/G6OSqQ2+WDoheDACfO/Kmqmgb10Bl5DQEERwzVFiT2acUQjx7n2ovkbcldVULt8r6nu++is77sKhY5WFTG7R2NG8XCaDzhulseJPkIxFRaSr8WLoK91dGe7xsKs3GPkmI78OzdJopaxIRQWrFfaQWXNZWU6BBMG1GgmfJBgXor40pENBHEKoO0NSaqCQjShsiFPOUKaBCRiOM4IrpkQC6x3GQjzpTHBaxSxvnp8nvpfaq6YJk2IzpBe2vUxn2YhpILybJWZRM+2gl9dwkqqLICnaIrqp0tWOJZfWH7N3O2Yc3yUtfVIY9KtqdEKwW34KSWJn/lutY/WucIMLwaCQQEslI8N2nftKZC6A0oHdGuNrkBNDCCami45AYuJCvWDYymdfK2zQWC1P0hPdfSkNpVci58gdOZy8vLmZwkR9iBbk6T35YpaaiJ/+ZxaH2W/xjCwzUoNdyLES8j16MQ50Otx1xKLDcc+mZS0Yq7X2SViUSLE9cWMkxDtUoDiW6j0O1TKBfL9i81/ejW9K/7qg1O20m4aN7LC2CU77VJnv27mL3ffi9MF4djxURY/1D0xC6cpwWwLwTJV46GZJjgjgCmX0Hr6gO1KhIDZbvNmfej5q6NkTdBnFHO0W/u769+roIPe4A3KVRf12pYrVHfKllj9qvq/C/HkiGIFR5HiWRlAQO1tBkjaCcRxaZ9MKNxLTvse7gRCAW5ho4lVx12ObOUJoiISypkDVkZxkTlkWntVQJEmK7LbZPY4+lQfs0atVy7egUUUJaTbmKzlIqoxZEEK6JdiurD5F93gSJRzK7MHh3QbJa7h0Zt8RZYgNRClzwIgQjneXJZswjxnvQTB5ok4Xh+1Ry1WGbMUJkVkwoiT6YwAh3STOdObkIYONoMtxUb+Du1dlW2EnolbZ1x6aU8Z69nRoc7tnpQXnK4Z6epawweRGNzpaBrgrhHBXOcJryazuWs8H6OxznDaYUdjTOS8xlLTargh/Xq99/iVIagOC0MIbRqod3pNW8RKDeOCLR99P6NLRoJtVgA59momIVmvmKkX4PQP6Kv52JgAfCpG7dCRbDpINo6X7Gk1RI3NRoSUAQVuk11ECIJKs7SiqqnCXcKIybNombrqZ3tGhnuQ+Mb75cu6tJuI/JTUD1UW/fE7G+Is6BmCbN6m+qZqnpYJXWghMXHWEUACyJDmOarWX/uUBSmhJ8LjrWFhoqy6LmJijOXUg2ZI5JIheUaUWpxtPQ9jR0z9MKOwbdE7BWGjCQNjFDiFfZKNSQnLGMSpOIC8aPptC2P1/7+TNACzsQ5ydo3QFx3oqqE3wWFMYJmxLLepIU0gYrJQkYaG2tLp3iBt69neUJifMQse4chERIEpANaa2VCrFyF2pNKPfUW6o4noOW50DUjdRZ3+QJnYGDgPlRNGo1Xne1J0Mdr7v9dCc3U6YKInWSew4iizQXvAbBnCFce6N1wmbK2EwZmykPsZmypHuaKdO/5OdOk4vb1a8efbcB9FRe+lL3tk+gxGlLqLE25ZPmPfHEAHgDXmqrxtI+oUfFYue2vr4PkoevylMr2lOoTjWOUXgrUxJGAqv6TDJtqcz/DSQkOZrkkh7zzXfOPLyTEO/yU1XcPpsvAebz6WzZU+HRu8XBuiuy1WLdWmLBZm4djDZMWq+tyEpS8lpEm0aTm9sf1ncS627TPmYZ/tv3a7T99mbm/pH/7PYqr7Fc7Ge4vi0P5x2QrDaRVgK1yQuXrSXOlI8ppaAYBKETMQIx3hrjO+Vtgw2DdQxjo9uXBfNuqFabFquZCpUnz0CUVVZAogECBU59xr5Bp15rpO+cBr1nz/Lvl4kolQh+VZltYZY/Oi8P6J0QrbZFHwcBzpGQsR0cl0Fm81o4rfNF/hkQ521xvp2rUb9li23W9B+zy/Jg3gXNanNZnHVea2FAKMYSAUGJVJJIn61SpTGruy3Kd0993LNj1Xa8u7y9mFQ+saUjsTiEn0yv2qpQXnFwHbkQTPBkfIg8BGGU1lxIShHdbXn4dtFJ3W69m02uHzWCfjn/aTIvD+bdEa7WCg2MkiB9EJYKt+xA5BhVmuVXNCsxiPfz6uZ38ne5VqVuFqm0dEK02sQSSZVShjGiJYD2SQpNZXBAmIGswyDO22ot9W7gh1tWhVbztq0lcHm252nEqsN18mAtV9qDpjFFGp2MybvkjfLUBoW4Pgeul7H7317GWEXcrxffz6ZXP0EqT0c5jVi18z2IcdJxrQAcsdaaxJR3MhghQvRqNPM9+ovXN7GaVlv1/eSPD4vZh8l/F5gKeByV6uP2KesYhoCxWdeWSQXFnDHUOWmUChi3PyOHfjeDGzeDD9PbWYAiwzunEatW8wBDFefcMOoIBUk8NTxy77RyQaSIuG7LoZsY/Kut+l+30wVcwcIVh+fjiFTr8aNSVIMbaEgqVrU2ShDugCsFMmsh6PFrzZ+bRJRXW/QerqafK14Dr2budyjQMDyFVvWjTS1PxFTWoTRJE8eBGWUDZdJ5SjEW2RrVtPFOZbXw45cb+Dgt0ZV3NJ1qrUEwikXreIqSMqWEMl4FKpzyNAqB1mBrNDdxuK526SP8sfg4fT2N8OpyGgrUoE8gVW3/cKAhisiy/mzAZ04tjLZVs5SojZUM9efWmG6SsHl/o34EF/Pq5SH6aELV9gpnyaSQdQvmEmeSWR685CnrHdKB8djj5Iz2YDbdL36uKsCKw/JxRKptxRColII7Izm1TmqI1lMgSlsSORWAOG6L4+YuqLdXN5dZepaH4iNIVBvt1jpGwRgByNoxF/kfkxwJjBBLibCI4ZYYVrtbBCwTy5bX68tNnROsCqF+XFxdrl6ufl8csDujWy3aTVX/aKsxrBFMyL/kmVHTxCBwLwnmMLVG+84c4oO7VjbSu6DZpqmmrGkqcrgSn/fUW0TyvT0QDj3kyS1GQATBhSMyWEmzIV3VWAjFVSSBeu4tthjBFiPnazFSNf7Z0SnDzfPjzL+N0/C3+WJ2Gxa3M2B/ubkeRH+Mahz78sH3MJdDD99Pu6KdLKXm0U5mJCpQrsFaHwhhzLGohXY+0OCdt5yx9W6TZrs9uM0WzTe7973eyTr3P9nJW80091zzYDVNIbBEOKNeaMlocjY4s9pqbmq3Gv5w+YGHt9Hs4EY/fvJ+tpkc2OYHz3XyJguvAwOlgwBPDOUqURaMZSw4r4CukwH4jvO8LbSffnNrOxrRZKijUrMkgQYZKVWp8rrmr0oTHU3lBuvN6mHbu7r6Uf1xgW1eDlCjttuzdNkiJ55Ix1TkQithXOa5FKIwcTS1Fv0hk28T6/5efO9C/re85rTNiLK2qPkePWgnz+9FLJ5qODYUh1F66qzhgoas2poUnctarY08ZStZOLs+yY91ngdf/eXb6vvOp5dQ5fHnN5fx7SzCrq7cdRyCqBR1opIDI4xzS1jQ2oAwTHIuZdRWaktgLCl++ulCOhkgy8G7898+fHIziGtk5OUnYfmL4tjTMSSqE6ra+6p7ZSJOeDAqm6s+/6MZiRBksmNJFxGiPxA/ZvArFrfemWXjujsWVxp8WxGnDrigQ3JABYfAlLJRKKIEV0pXs8IUjKX+RfaE21+KQ2JWKj58uUrT62q9q5vpNVSzebfg2AiKWgcufKLMQ3JBCied49LGxLNqJNhYUjtsfyx0O+h1SFEsDbtt6bM2VwzZaa60WGodLLxyN08RGRxLVKyPAOJ4omL9RBHFXno9APvTgst7BtQHJQkllgHjiSURKZPKqWDDSkyp5lb32rEB7zMkfoaP62+P9veg5C7a30MSvWh/H4NhztH+HgR80f5u6ThC+3vw9neg1qusbivKRVYGdP6tJyrZrArY6OhYWt73Z3/LGvvygMpYGIpPoNTaJrftbPLaRdE6R+scrfOBW+ePU8S2z/pdusH8tzv/270cmae3ymWtVc4dpYFoLZk0VjpLKSPOWu6MTiSORRqbHs3y7W09jJHCxPARFKo1yl1GLgenNAsmGOFMJN4I4JZHy9hY+oL0mGm2Q016N5t+nmTxUO6A6IZUqc2JpJGKRBxz2dRR4LhJMmgqqeIgtBmLFd4fUh81saiZTb/68SNc5rWKA+/xhKqfdSSidkFEw7m3NGlKdUpRs6w9hAhjqTDvLxtpd9+shzd5P52uhzyUy4uPplNtj17ngmTeZGuAUpmA62w5ZU6tLA2RReTObdFsdpqZD2cff/dHgJvl1dvrz+5yEh/8Oj9QXivv3t2fFQf18xBxk2Kyu2CslXKObix0Y6Eba+BuLNnGjfV+iYaNt3pQvqzaDJOoA3jnDOGCaS+l9IQ4ky0s8Pm1Gktmp+zRvto+YQ2BUpiMPpZM6NVCr9bz92qB1tWUQEYCaGGNZkSQ5CMRUWkq/FjY7hN6tWqt23tSszTwHk8o9AP02EkO/QCD9wPotn6APToNOgPQGYDOgGE7A6qk+APOgI0GeNdB4+kt/9o2SFkuO+ZUBEcjUUYuc/S1EsEmFaQeSyCK9ZdUyrcjLLtQUZgIbkQTtOnRpn9qnDa16f+1KUBsoPttAR0VPVT0UNEbuKJ3uLR4B1t4elWP1ql6hchQSvrLOkIperoU1c0Kgx4tgHIU5SjK0WHLUdncYTKvJN31vTeGIE9rXSeFyFPZX7gDxem5As0qGuOokZoyBSIYkjSTQkjBYiJ+LB1kaJ/tN2pcWjt4WWGYbUmdjSrYzqHyaCFUCVElRJVw2Cqhejz4aft8H+oz9fR6Ya2fpZB2bbS/YAX2aztTv7ZVCgtvJHXrV0PRi6IXRe+wRS+39aL3rh/yzc0QhGyt80WwjAujhc2Hx+bz5IAopTwLQlsWlB+JkMW2fOdyqui6tnz5BFxOwmq7ax0rPGTOxCAFTYJhQmUez60HprnLfN6NJeO5x/QpJvZ07lxypcJQWk+MTRoKPay/3fscamqoqaGmNmxNTR9wkmy3j30Z46T6U3e5fud+xc7ANTkLWjghVXQcEgMX8hWz4JjXyttkRiJCccDRmWQkzWzy7WJVRPPy4mIGF/khDmhtloBMzGlPg82nzgud8gsrwBBNyVhm/5oe2y9tu59acajCEHsasTb9lBt47Vqsi1ohaoWoFQ5bK5QHetHUzrgYuBZYyHwY1mPQDOfD1ITLcD5MO+D2lVhVnPnSej7MKlOqQduBGkijtofaHmp7A9f2GkZrN8d73UlkSBofR40PJwIORc6ixtcOuJh6MBSNbz8UXRQp48845riS1jjQggBjngVbCZWRQFH1x0L3Bdz3StnSwNuaQJss0xZZCnvWQqsFrRa0WoZttagDFb+bI/5uNr2YwXz+ys3uXz+XtmlgeVb+IlfeU0dM1TE9MKZ0fs2ClmOJIPdY+7tjME0zpBQmgI+mU50eWeXaMCZYUjISMI7KbIdTCETK/A6MxRbvL/iyo7/y4136sPhyOflviPfeKw/ORxNqo1c2qBludkRQvUT1EtXLgauXur16uZN7PL1+Wesct9wo4ixTznsegAVlbNQm+sQM+DCWtrw9DuRRj5PuHt1kA4Pldszu4aXc5jNdkQ21z8xcUf8cHL5P0T9rEswTU6BScomJRAJE54HGLNBC9MLJsYSI+vIOFBciyveZVCUN+UZfDR17nKGzA7xo6aClg5bOsC0deaAF9ZJwr134BGvGs7x+m7/7u+n0cggGTu3EUZ2IFTpaE7zSQYLyMjiehKMcDFFjiVxTFJHnauCQwfFuPlsfgQfgb2h2WBW1Z95al5U0YamV3IQorHMuZItkNNMXVY81B9utSg9xqcJA25o+tfilxGlb5VDalNUU74knBsAb8FJbNZbC6R7Ru1MwPhwU+OBVefhtTyGcF4rzQp8XyM87L7TBtIt6oYDGOxrvaLwP23ivWqo2NN5/mgZ3uT7sd0zlV//3zMV+mS6+zzIk3uMiT2/Vkxf/XDIySmQrTtbmeyKLQxaHLG7YLO5wou+uo7+8XJ365RtD4Gi1ib7S6aqbJ6MaYsimiuMppMiS4SRDyY0lNi37ak+2M4G1GVIKM0OOplN9wRgoBdQ5klmiStw4S4WLxDCRL0ZTMNafxV3NAO5GtSsM3t0RrlUicJMjhOonqp+ofg5b/dSssfp5N7Hkpkp/gZj/4vZq9cVgMEpobTawSlKYxKiUTBHqVNIBiHDKE0pd8mNRQqnqsWGp3i9+GgCmMGF9IrUwiolRzAGhGaOYw0YwRjGHHsWscNDC1jooItDiQosLLa5hW1yKNLG46oTo01tZtHZwayGqKLUGldHByOmOldGQMstzQkI1bdgpEqmQViing4opaDUSDPdYSbnb9N2/P3dq0yt3URyaT6RWHbILicT2iGwMxD5dILaQEVQ9ohknUPU3gap4ZxjtryUtesMG7A3bfxCoqRi5t8EzSx1VPnN2E5RlJCotxFg6+PTI4LcNpZ/c9cVtfpYfM3u6zDfaej0vmb+fQqs6VBuuBBHJWgVSKWeoClEaH2J+k4ogENUtUa13Kpd3/sd3+akqX+K72TTAfD7d8U65vak6pV0d6pUK1EvDnDPEESmJJJFw5qnxoHlEXt7aLbibWJe3F5Pr9Y+S2Xdb8tRm/GqebCJW0xRBgc+6B2EcKCHa+GgZYrcldtXOGv71TT5Mb2cBKlfAYrr1qmRAd0KzOpRr4oPXVFgLXrJAUgCmPPOO0sCTc4jytijfSaw72frxH5OL31Zxyt9e384X06vVi6JB3gHJ6jBOIlcarLEiWGUS0yxSH7gBLTwnTCPG22J8Z2/TrQ1bI22zZeuXReO8I7Jt6jZY01yi/VEkzB/C/CHMHxp2/lCzio2mkeKnzyWqrdgoJA1DckzEGKaQPmMiRtZACXcpRmmSdlq5wLPhJRUj0llq6Eiw3aMPeCexHu7Vf7rLW/g4c9fzNJ1d5Zuv3pi+vnTz+b33iwN6t8TD0PYLjZHt54T/gdR5NBMsaKehnYZ22rDtNCtb22nt+cvTm293feyoPorHtf3OyPqQ9SHrGzbra9bT7gEbeA9pzWle3kxWvxoCd6utc1OCep6UARUk6GSoYVook7FkrE5+LIEkKvurc9tTI3AYKoVZK0fTqXWTr0NLojxGeYzyeNjyWDeagfXY1fce5tPLz5mWL2cXnx+8MwTZXBs4IpoIUMoKQZkiJEqVokvcRKItjXYsVY60Py/jnkaTNah58Krc9OruCFc7/Je7kITQnomUiCTSaK5iMJKBSWQ8ve36a7C8O9myJZssDetd0Az7MmBfhoHi++R0gPXMj8bTi9qcHDTF0BRDU2zYpphpn7338NRvaIPm2ADFNu2v8TKaY8M2xyzELGsoTYY5rpOXzCXCMvo54SyOpZCK9xcaUA1Ur0assjS8d0U3NMvQLBsoxrsyy45L02twetA0Q9MMTbNhm2Zan2iavYeEVtkApTZaZcOX4P1YZZZEF3VkQUTLrZZMqyAU09SKECQfi5raZ5CsadlQDZcsDeodkAxtMbTFBgrvbmwxazswxbbPDVphaIWhFTZsK8zwE62wfXrh09tiDG2xF4yjLTZ0Cd6PLYZqKqqpz15NpUR2oKfuPj6oraK2itrqwLXVI2MGjZroDFxjhWBs8hAt8ZILzhgX0oODwJ3zPo1lzCMjvUlwLY7uwfT1jXL11q7Jh83bsinQH/ixe9twuretldsTnLANboQKLiq4qOAOXMG1XSm4O0Xs06u4tR1eClFxRX9V5KjiDkzFXTdvo11K+h23QlmPsh5l/bBlfTUH8KCsz7zrIpNtMwAzv7/+wHez2XQ2X78/BMlem/qqQRrBffKaak4VMMmMccpzYp2XMo1Esvc1XvmX0gSxyLj+eXo9zYfk7iy89PPFzIXFeixmXu7uNNSWCubX1nvBidJScK1SCJTx4LQCIWEss2AN7S8SunOyUlPOVRiSTyNWHbC5FVrJbD9xJ6M33JmQEmUpeJFVHBdGAuweI/zNVJnNG+vX5SH6SDJtUk95Q1uo2RlBywctH7R8hm35qCZh/IeM6pWbr/nRPVNk6FaPdJopaxIRQWrFfaQWnGUmBRoE02PxZzLbXwGUbECu3VgpTSofTajaODzoKolURcchMXAhX7EMaua18nY0Hvq+dMzi7PhqasnbRfXr6ezlxcUMLvJDHExcJklkqIHWSoWYkpNaE8o99ZYqjpBryULFzlTchzdZ/Sg38HMUjTbN/pumcRxmxmjMoDGDxsywjRnTpNv/Fody4ROs/v1/4MvdxdqjMR1WxkZtUjKTOhLuQAQrbWXeaG7AQwRvZNJkNMK5r8DO/IXe2dL7aPwUJrc7pl6dXppte+8zG/WB00SNoxQoJ0oYZ4hXcjQVpL0hf3ejjr175/xm2XLh3gXJ7nKSmjZJP/I0oS6LuizqsgPXZZtMkqw9/28gudvLxSM2MARNttZXX4gm22NzPtRkn4kmK13mAYSbSBWlRoPi1gvqhbVKBCLGUlzXY5s+vXNe6JGMszTgd0k7NODQgBsy2Ls04EjTIcNHnSU039B8Q/Nt2OZbxeZPM9+2kjTRjBuoUEcz7pkI+B7NOG+UdGC1jkwC5DNAiJBGkaQd1cDGUmPVpxlnW2/eYQZa2gE4Bw3RrEOzbsig7zQup7ow6w6dKTTv0LxD827Y5l2jiVntmMzTW3OizporJPebyv50Wsz+Plv2d/E6KRWolQ4Y1t1opTXFYZQ4bQk11qasJHlPPDEA3oCX2qqxFIf111hD7JTBNU3zi4P0ERSqQ3BWMxwNjpGscAhrNCOCJB+JiEpT4WEkCO6PSzepQn0/nS5Wl1iuewSh2k5wa8Pv0SuAXgH0CgzcK9BkgluDQ/9x5iaLIXgE6lsEgwzGQ5bNkeZzRhhTOhmuMqmUjWw0llSPYzDkzvljzRFTmqQ+kVwbed10klXTlVFWo6xGWT1sWV1Jpi5k9X/N3E1e5nsXFtPZlyEI7doq8WBgWUrgffKMEUkg29VRCS0BMrnGYlbL/jxDqoGHuhFyChPendGtvp5GA9OcUQ0xMG8cTyFFltVUkjmpG4uO2qMXaWdJyGqffpoGd3nv8lf/93yv5RvFoftoOt2VEIjulNKHJwa1U9ROUTsduHZKOtVOB+NQqh+rWohDSaBDaahS+2SHUk1I3nLCIyHBcU5tAMeZ1VFGqShhYTQdiHmPeSdNmNZhrlgYxjui2p2eyjrXU9GHiloqaqnPQEtVJ/XbrM79z7D4NI1D0ExrQ51WMpskkVb4LLuTck5JrRJwpy1LaSz1fKa/3pqyXTHmfawUJq9PoNQmvnlyO8Gvi6JYRrGMYnnYYvno4qTVi+X1h8V0lkXDj3B5M4yZprWeI0GSEYSnGARNhCvBjBBSeQreOBBqJPKZ2h7Dmo0rFPajpjBJ3QXJaj1IKmrPvLWOiSQstZKbEIV1zgWv1Vhi9/05kMRO1erRFr3NUuHddHpZHKBb06eLBPh9ZwM1T9Q8UfMctuZ5TNjyjk/9MJve3lQMb6Nevof57eXww5YuSWq8NMFqExRoqYBYbQVXTHpmxxK2lP31OWsUojiMm8KkdUdUq9NAjYR83q2R1mbE86xz5kvnqLGeRjEaP2iPSN8pWvbfBEF+MsFODVweOkGop6KeinrqsPXUSm88Wk8dpopaG78sRG732bwJJfdTSW6rTxTcKLNRZqPMfm4y2xzRUX8323p9Ob2GrxJqAMK7tvNikiCiJsYTSbRmPAgmQSWvvZBMBjkS4c17bCbeJKXmwLaW27uuY+rV9tFnlCotDY9eS2WTBgeGMi2CDlyHsUQ8M9frT29t0gS+Gd8sDPcdUq4O88Fx5ZUHohyI/K+FRCLX3JrgwYwG8z1OTelYiJeG+87ph20fe0Q/tn1sCPOT2z5ScuR4iCYyAz0U6KFAD8WwPRTHzPzbffbfLqor2LgiBuWrqJ35V4ivgvVnr6Gv4rn4KrhKXAQC3GtwUmiaLTfgmaFGDTqwkUCf9umnO97i3s9BSzsB56AhWnDYuH94UD/dgjt2wF+784O2HNpyaMsN25YzR7S2aK5HPr0VV5suVogVJ/prd4FW3KCsuLW0P7IvRtM7oZxHOY9yfthy3p5Ssdgg1vn0kr42t8xmG90JqaLjkBi4kK+YBce8Vt6msTSlND0J+l9Kk8w0c86VmTudvby4mMFFfgjMb6n8pKo/DxFmuJyoX/aZ4VKIcdUj+tG2GpJthZEBjAwMDeQdRAZOrRY/KDXQW4DeAvQWDNxbcERnzfbCauhOg0I0WM5RhX0W0r1HFVYoxj0zBBznAZTIr8ErxTKHhaTdWKDPaH9JXmciV2mH4FxkrG1Iy7MccEFEw7m3NGlKdUoxiwRnQgQ7ktPQY7HOzqmR++yUcjn+0XRC9wS6JwYI59PdE0d2XG798OilQC8FeimG7aUwtLWXYuNjWPLB2bvZ9GIG8/krN3s+SYuWG0WcZcp5n20zFpSxUZvoEzPgw1iUUdVjqxB1mFpNgFOYNO+KbHdl5fwo2X74FijLUZajLB+2LK9mCh0jy78MSnDX1oyHREgSkB9Va6VCTMlJrQnlnnpLFR+J4Nb9VRsI3VACFexCOopGtc5QSpy2hBprUxYX3hNPDIDPyqfUVo0llba/CXRiJ3PKsiFNLm7Xqz14VR6G21MIHaDoAB0ekE92gFbNgY+1kb6gQYQGERpET06ss43uyHzpoppgvpuDPL11lN+pMY8kZ1Ey7aOV1HOTqIoiS+UQXQjC2dH0FWL9pVs1GUVRD5rC5PPpBEO984VgGjXPoSH7FM2zhmc7zZQ1iYggteI+UguZVZsUaMgwGIsvgPXYt77JRr1yc0BEH02oWu9WGYXifaW9YqH44ULxQrJLe1QKMLu0GQc9R3ZpIW0PsOnBc0F5r00PnObJJmI1TREUeC0EYRwoIdr4OBonRn/oV3U1Tx+mt7MAP01DJW0fvioZ8Z3QrFZjMYwIGpgH4TVICc6ZxFRWYKhIiiDKW2ssdc2rV/7p19PrOFkue3dVsOZyKr3q9fEiEmz7q/bC/Nrj2Hhn+bXFD0zvEes4Lr37kEs9wU4bl14XzsE8CcyTwDyJYedJqPataoaaH6Hr0iMKCR5LisHjwcloDB6f4kVg/RVEYPC4Q0QfETzGSB5G8kYTycNYBsYynhzZGMt4bijHWAbGMkbs38VYBsYySsE6xjKeKJZhjmtzhzEMjGFgDOP5xTCqxt4dxDDmP8ymtzdDiGTIukiG0lzFbG8F5qLzVgNJTmkXrWU8ejUWi8v010FEmuP88xvAFCamTyUX1nj22Socg3RPGaSjxhBNvQ2eWeqo8gKMCcoykgEtxFgcCD26x7ZF8E/u+uI2P8uP7jpe5httvS7Z+XsSrdAt1mdoA91iQ3WLuSSp8dIEqzPjBi0VEKut4IrJzNQjYr0t1lsZUUudEX1jXVFtk+wrO3OQrbR6dJOhmwzdZMN2k1XS8mg32aD6RNeOncQ+0V1LbOwT/RR9ostIhjQEsyEHBuWzZENi2/OumTK2PT/EkrHt+aAdARia6CE0scqHMSea+9j6HO18tPOfnFjN7HzbYhbU4wTpq6vp9fa737vLOdy9HIIHoHZSVCE1CT3WkWFNwnBqEjRVwcgAURDtXfSRCkEEBCBGcBHHYkn1p4fqOtfNcQyyMLyfgYK1PVLL8PD2dwLQwXs2B+9qNi9tOXfqmDODphmaZmiaDds0Ww7p7tg2yxT7mMlbUdlNKuPpuZhphtJABDFS+Ky3eioscYQyLrUyNDo3EjFO+4sJmLrM/JPhVJjAPy8xsacC+i8GC/2z+i/QekPr7XlZb6xltuyJwgENOTTk0JAbtiFnW+TSNmMHy8ZbEN9eD8qAq61Ez1QJFDT3XApqTX7hZNSW6Ri95HEsKYq0v+mVpi717ngcFSbsz0RFTG/sU6nF9MZ+0xuzWQbV6FbQVmqnSKRCWqGcDiqmoBUiuK3TYafJUbM/+f75o5kNvXIXxaH5RGqhwwEdDoPCc+f1QNG5IJk32SahVCbgWcuOLlplaYgsypGguMdgyU5j9yHH+e6PADfLq7fXn93lJO5mQXd/VhzMz0PEu7SJlnnrx+r26HFDjxt63AbucbNn8rj9Ml08J6cbBONjsMwTKg0lxlGSyae9k5FRAWMpQ+vT6Sa6chdtQ6k0ZeBshETXG7reBgR0dL0NG8HoekPX2ziRja43dL2h6w1db2d3vTF6RtfbQ/UevW/ofUPv28C9b7Rr79vH2S22lBiaCoAlGUOV9mctyeA6ycgj50ompqWMkmklYgwuOeu4GAm6+zPTdF1j+qP4Y2Fw756A6KZAN8WgIH5aQwl+DvPswZFBswzNMjTLhm2WaXKKWba+GszYy1oLDIiliVCtMhm4B9DRCWKFZIlr7eNY5vD02C3i0XiwNmgpTFifRCvs9fCiv2wedCwMyLGAhhUaVs/KsKp6J59mV91n/WhCoQmFJtTATSjTlQn18ctNZlG3V0MwpWidKeVAWBoJZVRKQ5PV3AEYKzh1XjuWRiKV+xuQpvjR1sFX0BQmpTuh2cYdSkiXYnuzPopvFN8ovgcuvkUH4ntQw00Z5qGgu2iwYhvdReguGheiT3IXqY70Thywhzon6pxPTqxmOqdsMcTh3Wz698yhVq+GoF6aOvUySk0tkwyiFwkC8RKUZSFQDyQpOhb1kpveJDCvmyKwBY7CBG8b0mADAGwAMCDodtwAgAgPSotoVQRCAiNBJA5J2GwEac6xAUBrBO9OH7+8vZhcr3989zl/5M1kflPpBAVy32NIVIdhpbmKzENgLjpvdVYYnNIuWst49GosqoPozzNVJx7XN9k19X1eaIbeieSqwzZo7WhwmS+DFtZoRgRJPhIRlaaZd48E2/3xZ9mAWLs2qzxUH00obGjRI56xocWAG1rUWI7cKOIsU857HoAFZWzUJvrEsvEYxjLApL9zoOrKNu/70icwX+7GLNv5FzOYz1+5WbkhiK7IVod1lyQ1XppgtQkKtFRArLaCKyY9s2Opn+kR660ctksts9qUzT6+h/nt5aI8qHdDtXX8TbeczPfAq4ihNgy1Yaht2KE23aLv0Ifp7SzAssXYdPbbKzeHB+8MIfhWm9vFgwUehOROOuEUo6SKuZFkDaVJurGkZdP+gm+qbhDcQ7g8eFWwJno6xWoDHRwM5/nvlAyMA9ecKpsyE7CKWybHYnCJHj1pdabDQY5YGLpPI9Ym56tl65UD66IWilooaqED10Jb1Ag+PO5vJrPMtKazzCEGp4zWtlspRFL3WGiAgro/QV28kdVfI1e0sQZmYzErGECgoDT3Nss0ApSwYI2IsRJwI0F4j47+ukrlpuK+NIx3QbNjq7ubrY+GFxpeaHgN3PBqMfTz4amvKPZ2UX1yOkPLa4DyGy2vQQputLzQ8hotuM9seWU1iWVuLUEmyTxIzp0ghjAuDPdeYlpta4TXDRRuLO9LA3knRLuzvVrOgWt4AzS+0PhC42vYxpfRxxpf7yHczuaTz4Dhr2GLcjTCBinC0QhDI2y04D53iqGK1nAWSLbDLA0kSBKcM95TZ3QwY0F4f0aYriNWa7lfGNi7Jd6dUWZPMcoO3giNMzTO0DgbtnGmjzbOVvyrohuaZAMU7GiSDVKQo0mGJtlowX1mk4xS67kAxiSVySRGTfDeBh94BBYtxsVaI7y5VbFX2pcG8Q5ItikAO8n62rM62lxoc6HNNXCbSx1tc+2Rmk9vctUOiitENe3P5ELV9ElU05XYNieJ7Z2Lo9RGqY1Se+BS++ji7Qev7gvTAcjtWlepBS2ckCo6DomBC/mKWXDMa+VtGstEhL4GvP5SmtClmVtu0jZfXlzM4CI/xIH2kponm4jVNEVQ4LUQhHHIGqM2PtqxtH+nlPSnLDavodzPqQpDbic0Q299j2MO0CR6OpPoxMrqfScIrSK0itAqGrZVZBr5MlfTgKrr9eVPbr54txQUV1eTRf5ej98ZgnUkaoccOhsNDTqlwIzMiMq04RZSluAhSO1HIsJZfxF3vVsiHYeewqR5p7Sr1Vyt0EomD1l1jd5wZ0JKlKXgRRZCLowF9r2hXjYTNps31q+LA/ixZMKRnzjyc0Aw7njkp5SecmpDNNI7533wOgbjlfBcKKkpIrgbP8JKeC4nWX7lOa8g5V8u9yKvn/++sgKKQ3QHFLvzIzSOrR6j16A/Af0J6E8Ytj+hWW7Uo9NfnfOKGrBKm//6cgheBFPnRaAyOOtZCEkbKmz+JZWGRJqS0EbBWAR4f4EAsfOsPRhIXa7Pvx1xame/ZmwyxZLjoElmgUbwJCgNsMwY0ARx2wq3xeUGVHO2P3y5StPrar2rm+l1pShujYpfvf5w6+dhNvHQtFAkJmVIYtFlzUUzQhLJFpL21NuQQpBjmbNtnnwCVhs5XBi+O6BYHcS1cF5JbhIFTr10JDoijImREWFF1COBeI9e2J2FmV8N18rwCLP8B/P71z/C5U2B4D6NWHW4VpqryDwE5qLzVgNJTmkXrWU8ejWW/K8ecW0OE+v9dLpYXX693Xw5M7c8ZJ9Irvox8SDAORICheC4DDJ4LpzW+SL/xMhZN5mNd2zo4z8mF799v0bZbz/AIv/V7VVeAlZzoL/8x+yyOIB3QjOMSGBEYsgY7yIiUZf444Jk3hDLKJUJuI4xZhVFWRoii2PpQ0B7Q7jZ6ZV6GBP97o8AN8urt9ef3eUkPvh1fqC81gJmd39WHOjPQ8TWRY/NDVwMx2E4DsNxww7HVWLstHBcdfnj4upy9XL1+yEE5VRtam8ZDmSGDuThynN0ID8vMw0dyOhAHiWu0YGMDuSRYhsdyOhALgDl6EBGBzI6kNGB/IQOZEpEFx7kXd4k9COjHxn9yMP2Izdrnnfo5KMPeXhCHn3IAxbp6EN+XpYa+pDRhzxKXKMPGX3II8U2+pDRh1wAytGHjD5k9CGjD/lJfciN2wy38SSh/xj9x+g/Hrb/2NAu/Mfv5wt0IQ9PxqMLecASHV3Iz8tQQxcyupBHiWt0IaMLeaTYRhcyupALQDm6kNGFjC5kdCE/qQuZd+VC3nImoRcZvcjoRR62F1nz5l7klXhds7eVcK1eZE72bjYNMJ8PwXtMazvLu6iy3sqIpoIBD9oQQ8FYS7TNhBrLcCP71C6IxngpTJCfSq5N6ynZTmIfXBklNUpqlNQDl9S6raS+o+LLtPw+1at85r9K5aeX1uTFP1cczR7D0Q58QeRqyNWQqw2cq7UYbtXMvff0TI3VmSCF+NC5Qif6YM2QMzvRCxmH3d/8NhyH3cy6Pnoc9lENnZscFFRBUQVFFXTgKmiLRhw7z/yd4bk+9IOyrFtXiDT7isjYkLEhYyuFsQ3RZdgxY0OnITI2ZGxPTayGpW/HOw1/vV7Zptu5r/81czfLCoanZ3C17kMnpJM6mOQSMyFE7SX4FIOyPP93NBkMtL/6N93CGXYQPYV5XDqlXZ1LMXFrozNKafAQA3AWog8iCx9js9ixI4F9jy7FnZkoj4UNAr0mcac5ue5ybU/zMR44Q6i7ou6KuuvAdVdygu76AyzezaZ/z9zs44YWbyazQZjltXm3nHplTcx0IYYzEljK4jxwr1zkJlIyEvHNdH9B793b2hY3hYnxjqh2J83ZidJ8zx1QjqMcRzk+cDluT5PjmwP/zi0+vfryHvL15HP14eqNwQt0Ex1JYI0UnrggBbPOOO+zbM8WurR+JAK9xyw2LVqKpgMAKkyyd02+jYivDuCpIr72VijrUdajrB+2rD8hSX3JAKqEwPcwn97OAqzIM3DxXjWaCzREozXn2hOfjxwJyQouvXRqLG0wBpqkvgczhUn0DijWTWLvzsVRbKPYRrE9bLFtWve2uHfmK+a34lSVor78o9erLzsE6c3rpLdy1nmthQGhGEsZUZTITCqZhbhQOo1EevfXxEraFo31qu1Y4WV+B5jCRPfJ9Kpt0WYScBWIIJxJr6KIXGVVNTLtdOadbiTolv3lgqjDXUkaMsbCcN4d4ep7y4qoXRDRcO4tTZpSnVLUrCqsjIC5T63Z+W7LYk8j4KWClFwor0z4aDrdxUeP6lPU6Mig/YX2F9pfw7a/lGhuf/16ffllzZz+gHBbfWLJDYZgbNW6SkU+Usk4n7z1hIjELQiZLS1HPDNEjaXZAevPVSp2Wg8HcVKYcD6SSmvRbFQ7ybxvQRTDKIZRDA9cDLcYFLf6sTzabybzm+oBnkFRnOae2UCS4Ix5So2TMZ8uajmLJlg5lp5asicR/EuJsvTDl6s0va7Wu7qZXld26NYp2H5d77QhwoPSIloVgZDASMiqISRhlQqaczUWSPL+1MKdg8nq+VZpOD6CRBuFsOUQiJ2roTaI2iBqg8PWBqVsqw3ec+w+vR646f5SdcNuz6/uvgpyKuRUyKkGzqlaNLy/SyC4YyAD4FW1SToWtHBCquiyWcDAhXzFLDjmtfI2jaWRS19u4+JsVppPx9tF9evp7OXFxQwu8kMcGMCsAvXSMOcMcURKIkkknHlqPGgex5JIQCnpzyjdTa69TKkwkLYlTx16qQzOehZC0oYKm39JpSGRpiS0UTAWJ1+Pcbadmsg+1b805LYiztqJoltOsXl0AtAsQbMEzZJhmyW6STjta5fZCg5hlv9gfv/6R7i8GUZgTdUG1oTzSnKTKPCsOjoSHRHGxMiqCsGoRyJzaY/tJuVOH31TvBQmhU8jVm1SNSVOW0KNtSmLEu+JJwbAG/BSWzUW85v1p03u5FcPZ5Q/eFUcmI+gUB2CpdPANGdUQwzMG8dTSJElw0mW9S4igtty5p3p7q9d+AS//TQN7vLe5a++atq1fKM4HB9Np9p8CW9S1kyzruqyLR+0dokGQbUTTDBGx+Kb6g/Nu1vdHRKdVWned9efJ7PpddVftjhsd0Q1zAzqU/PAxKDzJAbV1OA6F2TWObKVTKlMwHWM0WVIWxoii2PpD9NjIMHs9L88VA6/+yPAzfLq7fVndzmJD36dHyivtYDZ3Z8VB/PzEHHTRaZphlwz8xRdvejqRVfvsF29jXq1t1YOn97nW9/7rQxLrMfMdTTFntQUa9mrveUdUI6jHEc5PiY5voNwbyazzM6msy/3qDcAOS7q5HiQwC0wR22mBgSdxXm2zKVRxAga+Fjypfoqipy/0Lztedv87utb5SZUdUy9+kzBJEUEcFmFDR6ISPlfk0TQ3BIl2UiQbwajwTblmIVBviOq1TpipSBKMWYye9dCJq24JFYSQpiTOo0F6v31hhM7g5t3e7a5KDQfpyV1MITQYxgMIwhDjyAc4YNoJiPQB4E+CPRBDNsHoZvU3bcgHLofBiHf0f3wPAR7j+6H4DlzQIjNGq4m4LOAsSFzVBYNzwdgLB1BKe/R/3CqmCkN7qcTDL0O6HUYCJjR64Beh1ED/Lx5i007ZTWXDuhvQH8D+huG7W8wTWbWtrN/vndLv+MQXA+yzvUguWP5f4EHp7nVViqriDSc2eQNtWMR8tr253uo18Daoacw4d4p7dAq67OwDK2yfqyyQhJ2BlP8i/k6u51mPeTroP8B/Q+DA/65/A/Fx0h65PgYIek/QrLO6jEdONj26vzoa0NfG/raBu5rM5372gY1dKN2+FohiT6sv2gwZvo8k0wf9Lihx23IHreVflrx8zPopzhLCTVU1FCfnFhnjQZPw23V4+LjzF3P03R25fyGWQ1KP60dtKRiiLJqWe45M5wST6NNQWhLgFiQY3E1UdVfD/OmIc1G8ClMiHdKuzrl1BtCDA3VtKdkDKmiDSJZwozhCZhxI8F9f8rpgZ1bLZF/tf8dRH0ntKtDPWjtaHCMBNDCGs2IIMlHIqLSVHhA1LdEvWxArPfT6WJ1eU9Ylwbx4wnVQSChgbRAMw3NNDTThm2mVb7L4800iKsj/18zd3MzjOlStSXCiVsbnVFKg4cYgLMQfRD54Bmbj9xYOo2a/vJ0pWllXDwCTGki+0Ry1Q7bLcPt0GNUDJ0Ow3c64FCqrjk6DqVqxsrPMZQKXWjoQhsMwjt2oa1qg+WpHoctnQidDOhkQCfDsJ0MRnToZLjvBBiAv8HU+Rui0fnscU0Vd1wwk1ImFpEQY2IhpLGIc6F6k+fKnmJAzwuOFnRIuToNlluhlUweuJPRG+5MSImyFLzI4seNxQvRoz3WTMxs3li/Lg7ex5IJfQvoWxgemM/hW9DCeSW5SRQ49dKR6IgwlcOYCCuiRjS3RfPOGbfNhnGWB+mTiIXjrXG89ZDQ3PV4a8szA3ZBRMO5tzRpSnVKUbNKf44wlsD0U2sa+3KjyvXxHk2nOjQXkmbRI5oxy2IoWRaF9NOhvWEb++kMuJ/OOk1YdRy0u+dNxPgdxu8wfjfs+J06apLQI1fr0wfrass2C4lcKI2hi2EJ73OELkrpkdNfIhm2yHkeLXIKcT70lwaPzoeenQ9Lo8scPURlS06ggYUGFhpYwzaw2jXLWTGMponXA7e6Cql4oGQwdWvt4FOY9O6tbUghairGyAYK9HPGyDCbAbMZnls2w7ENcdpIBDTF0BRDU2zgplirzvoNTv/A6tVq++NY0MIJqaLjkBi4kK+YBce8Vt4mMxLBLXsS3L+UJn9p5ptvF9Wvp7OXFxczuMgPcUBXpIIE7pXlmfkbIgT3hFHBKxngrBxLoMoMJlLVlmUVBuGOqYfNPobTsAkdX0NwfKFzAJ0Dz9M50H6sSTtpge4BdA+ge2Dg7gHaxj3wLkuEigjvZtMA8/l09tsrN4dH7w7BL1AbpI1ReCtTEkYCIyJIpi2V+b+BhCTtaIpe+qt6UfXl0I2BU5gM74psdQqq4UqQbIhZBVIpZ6iq+ur6EPObVAQxErD3lwZ+wLR4vGmP3ilXae2UdvV+OOK0JdRYm7J25T3xxAB4A15qq8bi+u3PLBM7BffDkrwHr4rD9hEUuovT8ramWEPRgDYY2mBogw3cBmvVTvTxwf9hsvh066v358/LDCtEM6V9xWdRNX0WqikDlUhGuWBOUaVEYvnfzBw8l5Y550cCe9GfbnqgF2wbllkY6DukHFpjaI0NCNmnWGOt+8M0PydokKFBhgbZwA2yVuWL7RTDpzfJKJpkLxhHk+wZyPCOTbJja2La3AflO8p3lO/Dlu+StJHvm4shyG5bW+1ShpHdX/41GtlnMbJrmghEZYTwXAUOJgnjJTcZuF6C5kR5NhIEy/4gzHdu0A7eVhhwG9OldkK55ioyD4G56LzVQJJT2kVrGY9ejQWuPab+72zisC+l/evt5j/Mprc3xYH4VHLhFBqcQjMkPHc9haaQDsg98mdsgNyIL5+hATK1xAGRwZoQnZBZOQ6axEistkkGgvy4NZbrfYsf/zG5+O1nN7muLr67/jyZTa+rxlHlgflYOtVyZiKII0ZHIpQyUkltuCLRS88TGEUQzd1y5rua5nUzi+9dyP9+KQ/MR5Kp1gpMUpjEqJRMEepU0gGIcMoTSl3yOFW3NZb1/mmxHz65GcTX06ubGcznEN+s+/lVruxCZ+ueRi2cDYazwZ4X4M86G0yztsHhzQUGfjHwi4HfgQd+WyV2bS42Q7ufPvxb2+wwSkGUYsxo6rSQSSsuiZWEEOakTmOJRlDSXzmNqLd9twFSmCBuSR2MNmC0YVDw7XrmfRnpN1jjMiAId5t+U4i93x+C0d4fvL3fOhn8oVqDVj9a/Wj1D9vqbzfue28M6OnNf1o/77uMmCrl/dn/GFV9sqgq5m5h7tYAsXxU7hbmiWOe+FjzxKPRWb/nmiruuGAmpayQEQkxJhZCGsvQj/6wfaAjz4FBliWPuumQcujnRT/vgJDdsZ8XMxYxY3GkGYtl5ED0yJsxA6KfDAjJHcv/Czw4za22UllFpOHMJm/oaEaS9IfcA72DdvjHN7/7+lapDr1OaVeLeqeBac6ohhiYN46nkCJLhhPBrUNNpLUmsnPnVrL1p2lwl/cuf/V/z/cqVAc5lk51aAbLA1ORK++pI0ZK6QNjSufXLGjJEc2no/l6Pr3M95lNLyoF8ZWb3b8ulV8fTSfMycSczCEBueucTJZfW+8FJ0pLwbVKIVBW6dgKhITRtDPtjyPv3KC82EW+yY/uOl7mn/n99ae/m82ms/n6/eLQfBqxMFPzRX9dejFTc+iZmkYfm6m5lXeCKZuYsokpm8NO2ZStRqJ9XH/lilpDyNOsL9P0UoakQFJllQjEs8AVIUr4KFSsGpWPQnQz2p9SyusD/w/hUZhMbkUbTHt4oTDtYTDY7TjtoRCHVo8IRodW3w4tNPzR8B8eys9botl6Gt99pQatfbT20doftrVfpZu0sParjrOrL/Lbyxir2+cvNpte/QRpMQTzn9WZ/8mDtVxpD5rGFGl0MibvkjfKUxvGooTS/iT47ihLU7gUJqlPI1Ztg3LjHTGW+OBYNCokRTI/ZMLKwIFTOxZg9ze754AAub9Xr2/ni+nV6kW54yJPJ9ha5bS8tcpZd3BQB0UdFHXQgeugrZqENGAlT6+H1g56LkRci/68oSiun0xct04NObg2imwU2SiyBy6ydRci+0Hd/9ML7doWXxa0cEKq6DgkBi7kK2bBMa+Vt2ksMXjdk8z+pTSJS/OJ2WRDvry4mMFFfoh6t47OGqLXVFgLXrJAUgCmPPOO0sCTG0t/F8p7VBR3kqsdoyoMuF2QDJ2XPaaGoDH0ZMaQ7coYund60BxCcwjNoWGbQ6pdzvy9Q//95I8Pi9mHyX8Pwm1ZGz6XxDjpuFYAjlhrTcraqJPBCBGiH1GT494ktTiQIL4HJ4WJ5yOphDonBswHjOrOlE7TPkdz54lBPRP1TNQzB65nHp2t+TZ/+2kcvpLpApVScGfyIbNOaojWZ7gobUnkVIylRLNPJbN52uEdSAqTxceQCNVLVC8HDOnu1MuT8jHXxwV1S9QtUbccuG7Jj9Ut383g4ufqIQavXXKWTAqeUuYSZ5JZHrzkiQOTDrLQHotg7lG73Dnf5hBMChPGxxEJNUzUMAcM6u40THmKhnl3YFDHRB0Tdcxh65jHV5vnY37jZvBhejsLsKLMwHXNGBNhxhAwNjAqkwqKOWOoc9IoFcbSLmaY1eY74FKYeD6NWKh7ou45YHAPpNr80cFBHRR1UNRBh62DHu/n/F+300wBWLjB654JDFWcc8OoIxQk8dTwyL3TygWRxjLba5h+znswKUwsH0ck1DVR1xwwqAfi57w7MKhjoo6JOuawdUxNjtUx38PV9HNlS8Krmfsd5oNXNRmVIhmpaJbNUZIglCDcAVcKpCSGjkVC9+jm3LmtDdFSmHA+iVaoeKLiOWBsd+fkZKcontvnBvVP1D9R/xy2/qnUsfrnh8Xs45cb+Dj9j9nlEHRPWduTi4MA50gIFILjMsjguXAZTllKCxdGIqT7Uz0r3/hBoKxl5W8/wCL/1e1VXgLiavUlaEoT013QrE4VzceaJ2Kq4QXSJE0cB2aUDfnMO0/pWFDOWH8WFm2sWT3kh4VB+2g6oWWFltWAcd2FZVWT+CcFUYoxo6nTQiatuCRWEkKYkzqxkQC8P3Yt6tnQ5uJHuLwpccxhO+rUIRe0djSzZRJAC2s0I4IkH4mISlPhx1J836Oi0YBY76fTxeqy4CajxxNqE1w1p/i47msv6N9C/xb6twbu37LH+rc+Zgp+nL6eRnh1OQ3DryKRYBSL1vEUJWVKCWW8ClQ45WkUApsutpfJorHy/wgspUnlE0iFLgB0AQwY2t0FV+kpiufWsUHdE3VP1D0HrnsePfpoddh/zPjInGrwmicBGqKIzDBqwBsPwmgbrNJRGysZ1pB05A1qApXChPPxhEKtE7XOAQO7u1qSkybNPDg0qHOizok657B1Tn2Ev3OTcrRmJOuXz2dKtpFSaCAhKM5skJQBkdYawRSlGthoejWa/sR1E3feQdiUJrI7IdpabFNypLfowA1QhqMMRxk+bBlujuh9t/vY49jswUnxvoQ4js0+PDabRK40WGNFsMokplnMh5ObjETPCdMjgRxV/eWxqSbNBBswq8LA2xXZ6tBeiJnU4/hstJKe3Eo6sivjwaOEdhLaSWgnDdtO0kfE1zcH/83M/WNTX7n8/M9wfTsEG8lgGXNmG1jGPGAJfu4y5mgtsWCpscFow6T12oosaZLXIto0FrOM9Vit3yRN4gBrLA3lHZAMrbFec0zQHHs6c6xGZ6HEaUsyN7cpmwreE08MgDfgpbZqLH7dHoucd2qi2S5Ik4vb9WoPXhUH6iMoVIdgLZxXkptEgVMvHYmOCGNiZERYEUejj/SG4AMTZ15VhnuY5T+Y378utGr/NGLV4ZpboZVMHriT0RvuTEiJshS8oDyMxprsEdfNXDebN9avy0P0kWSqw7LkjuX/hYxbza22UllFpMm6dfKG2rHMUOsPy7q+WcgON+Tmd1/f+t6FxXT2pTiAd0q7Wk+Jc0Eyb4hllMoEXMcYXbTK0hBZHAvq+/MHmp2s6aHm+N0fAW6WV2+vP7vLSXzw6/xAea1sGd39WXHwPw8RN1W0R9Yz1LpqMNqH0T6M9g072meOmJSx69BvwhBDGQ1c27fYSKBZgxWOKuBM+ZhSCopBEDoRI0bjeugxFNJkDsRh3BQm0juiGgZEMCAydKSfPyBSRhJHjznHmMTRHubnTuKwXETtgoiGc29p0pmLpxQ1q9zMEcbSQ6FH5/JOp9K+xqflMvCj6YSONnS0PS+on9XRRsmRw8AOmQHobENnGzrbhu1s0yeUIFc0yxrj69X3G8Rc2trC4yCpUsowRrQE0D5JoakMLmPHQMbUSGR7n1OT2lQzPoJLYUL8NGKhRw09agMH+Pk9aiFlNu2EBG2ldopEKqQVyumgYgpajQToPTJw3TKB9s6OeOUKbEJ6GrU2iQ0nljJviQa0stDKQitr4FbWCc0a8++rD8K7LCHu5X0PwdpSddaW10yFlJw0EKXLCEo0QFhWVlAFho9FVveY0dBGv9oLm8JkdjdEQ+sLra8xAf0o6wvL47A8brDuMyyPGxCusTyuEaKxPG74WMbyOCyPGwrqMWvnWcH/zFk7J84N2GProjsZ3cnoTh6zO/kuxXvNYi5gmeP99O5kUVsgFxglQfogLBVO5uus5lKlWX5FgxuNO1kO08u2FzaFyfRuiIbuZHQnjwno6E4egqsC3cmDcCejMwKdEcPD+9CdETs1JXRGoDMCnREDd0aYTpwRD+rNn94XYet8EYlbG51RSoOHGICzECvHBChj87kbS8l7fxJemmanbQsr/zVzN0XqrieSq1Z7NTpLFK6p4o4LZlLKLIBIiDGxENJY3A89Zm3aUzar6FmJ3VEO03/65OaY/vNU6T+ltJzqMUqCPafaM+5z95zCGAnGSIaA87PHSKIURCnGjKZOC5m04pJYSQhhTurERgL0/mIkoj4lcXNRaFCkJXVwGhhOAxsSerudBgZaV5lFjATQwhrNiCDJRyKi0lR4QAS3tQsbEOtrw8aCHR/HEwrj0hiXfl5YP3NcmnQWl75nnGJYGsPSGJYeeFhaHB+Wrjjiu8vbi0kVKl5+xyGEpGvT45WzzmstDAjFWNUmjRKZKSR9VluVTiMR7n32tqyPPh1GTGGC/GR6ocMXHb4Dx/j5Hb5EeFBaZKssAiGBkSAShySsUkFzjh0uW7vNduZ5r3jP+sd3n/NH3kzmN5XmUaLX9wgS4UQYnAgzOCCfMBFm1ZlVneYteKzVoKcAPQXoKRi2p8Dw4z0F72aT60du+JfznybzQbgMakfOMl5liunIhWCCJ+ND5CHkk6c1F5LSsYjpHlN96/OyW0CnMMHdHeHQiYBOhKGDHQfPPjcDDJOAj4D5uZOAMT8H83MwP+fZ4Rnzc54V1s+cnyNP87jV2ALoekPXG7rehu16U6S16+1nN7n+7o/8leZLRvL0PrbaIUgxMme8JzIZ4rSJ1gcDJltiljLQcSwuh75cbL+UJn2ro7SE/R3kf3vp54uZC4t7h6B2IIAlyXgjFBU6MCbyUdRECmm0SiRzsJEgkKr+3Ly760xq2VRhsD2CQtihAQe0DA3GZ+nQgHWRWBc5BG58dF1kIX6q/qJo6KcasJ9q/zmgxhBNvQ2eWeqo8gKMCcoyEpUWAtMcW2sl23zqJ3d9cZuf5Ud3HS/zjbZel9wb7SRarb2vFTiPcL4+UNzRy4peVvSyDtzLqo7yslYX311/nsym11Vcfgi+1tp8RmqJAyKDNSE6IZMwQZMYidU2yUDGUjojTX8Cub4d0H6klCaMj6UTOgrQUTAgHHfsKCgk9PDUCMbAw9kCD1iNi9W4z70atxB3LaYVPiuUnzWtsPoWRzq2tlR0dG+hewvdW8N2b4kDSYSrH9Xvp7MhOLEorfViJUMdlZolCTTISKlKklluGaOJjmbOtdS9yWu2va8PAVGY4D1ADfRIPbk9jx6ps3mk0J5He/7Z2/NSU8skg+hFgkC8BGVZCNQDSYriSJC2GOY7m0+sb/JuNv17Xn31qjjstiFNbaoUjVQk4piLNipw3CQZNJVUcRDajMUH9YSl2tvpP+8+3dzt0/JHoRNtjidUHZ5TVEYIz1XgYJIwXnKTFeDMijUnyiMPbs2D6+M2m4vi4NuYLnVozVwXrPciQ1NLwbVKWVtgPDitQEgQiNa23HenSpcXu8g32TCWtVGdP/3dbDadzdfvFwfh04hVh2uluYrMQ8gAd97qrP86pbOKYRmPXo2FC/dXiLB7rvjDm+zqazL/YTa9vSkP2SeSq7a5keWBqciV99QRI6X0gTGl82sWtByLG7hHnv04R+96Pr2Eyoy5mMF8/srN7l9/78JiOvtSHqiPpRPmIGDJ2POCev8lY9pJYzlkLYUFE4xwJhJvBHDLo2WM4DloazduNxl8+bZiTp8n2Swqt8NoQ6qss2VUgzKw+0FCzInBnBjMiRl4ToxunhNzp8E9fWpMfX2XdCZJ4ol0lWUktBLGaZooRGHiaNxYPTYy4tvU2gmL0oRnI6LURrvKSOHqT8vDDC7M4BqmVwkzuHrO4FKCep6UARUk6MxoDdNCmaw9GquT14jg0/2ij/bnPaT1TV7eTFa/Kg7HR9MJRxjgCIMBwvmEEQYrr5Ft5zVaa87oPELnETqPhu08qqax1TmPDrQau+dhHrhHiRCrJDfEUuZcCIQ5FoCqqp8f986NpYOf6FH+bkcemmOlNAF8PKWwVXafOVHYKrsRnM/QKlsTH3y2g6wFL1kgKQDLzNk7SgNPbizDM/rjzmonsbZGKy1Vks3cyeWLkvusdkGy2orEyJUGa6wIVpnENItZP+MGtPCcMPRntcb4znTjRtNVi8Z5R2RDbxd6u4aH7pO9XZYc9nY1VeDRBYYuMHSBDdsFpg/0FGrTbf/pnWC8zglmszB2QqroOCQGLuQrZsExr5W3aSw5AaonqVzciEKaueTbxSrI8/LiYgYX+SFwckrVkpKS/lRBnJ3SXBs8bXZK8fGEvlgphhN6CiesTJwGZSDNDwoaOWjkoJEzbCOnSuFpY+Tca5Xzenp1M73XLOfpbRxRG+gPIgjhg4z5hDGXRNUrLSqvOJOE+LH0/ct73Z9oFs0bK22jpTTZfAKpMJsfs/kHBOWOs/mTDIlFr6gEqyJ3ikVIOlRNqiCagBH+1lx5O0t9J6v5dLN++QEWi7z2vDgcH00n7HLSI5qxy8mAu5ysnAa0vdNgr7aDPgP0GaDPYNg+A82O9hmsedorN1+zriG4DeqHsajgieZAUrBEUi00VSxkq4tw6RhoPxKJrlmPGqpubgzvQExhwvtEatVm44EMxoM1OtIsQ0jVXTKZquEkUzarqyPBNiU9BmEbNAR97cInWP3r/GbZjzM3KbBm4ERy1aE7JEKSABdAa6VCTMlJrQnlnnpL1Vh6sKgenWPbrGjHTVY/yo3CHkWjOhg7zbzP2qsPnCZqHKVAOakaXxnilRwLk2b9xS12F3Q0YDrloroLkqHfLO8lOs6eE+z7bw9MrYlKMqK0IUIxT5kCKmQ0wgiuRlMM1l/+2CPOddh8en3p5vOfJr+XanF2QbLaBl7Ksqi5CYpzF5IN1ACJXFCmFaUaQ35tMa63K/cOb9iHW7+++hkWn6Zx/aNQxHdPwFqN3lvBg4r5HBgnbEoMwEohbbBSkjCWLrZPGCRss33vZpU7+N5FoWfgPESsOwcmaQHBeyooAQKVcavBRWmc9KDdaJT+3s6BPWULlyK8mvSycNeLh68KPRHnJicm9r2gmNg3GLh3nNgnM1ePjFFtuY7Vv1nXIcLwaCQQEscy6KY/7q62YyWH2dG7rxH1gov9uiPcJuVJnJTytL7H1ygtZj1h1hNmPQ0768nyU7OetuIjGxbzZUDDd+pTobi0SjDladQuRiWpt1kr1UrppJV3Y0mFoqq/KI1uL5oOwqgw6X4OEtamlRjIxyAQ75NnjEgCRJCohJYAmYFgC7PWem2DjImdseX/mrmbvGapwO+MbrX9LMoom+0x+RWLZp+6aFY6DUxzRjXEwLxxPIUUWTKcZHXZjSajqj9M7x6Ms+Q9P02Du7x3+av/e77X8o3yAH0snTBj5EWPjbQwZaS9LnLmlBEMFWKocMj4f8pQIQZaMNAyjFPQZaCl+Fzx/kLjmCr+PFPFhXbJcql0sEprwYmLjjAKAJZEnI3T/hwcaqDZIAv0zZdrdzUJRWfTno2OmFSOSeXP5xhgUvmzxj8mlQ84qXyZhpW1/y7ysA5EgzE5C5OzMDlr2MlZ+vTkrMrrtuEvT5+IxVhdIlYhIR/ObH9OEAz6DC7oU0p7KiX7i9Rje6qhtKcqpLEgp7o/dGNjwWE0FrRcRO2CiIZzb2nSlOqUombcmRBhLFOw6FOnWD28ydfxteU2qjqaTthJ8IXoTw/BToJP0EmQUOV5lFnbIIFntZomawTlPKvSTHoxmhBJj8MJj6g9ue9oKAzRp5IL22S+oObpPCJNjZ9yWfa522QW0hWE96eHYFeQfruCFDLuqz8ujeO+jjQMuxj3VUjqtcDU66HDu5/Ua0ojFYk45qKNChw3mZ9rKqniILQZS+p1j269FiG01Y9Sa4GPJhRWt2N1+yARfa6R0JZ7MFWOjBfMBqesVUSHik0TCGIsNmKP5WDbFlAd6/l0s31VKLw7ohr2ccA+DoPD9ln6OBRS1ij7c+5hXeOzrGvEXg8dnwPs9dDpiXjKXg+MESIjIZREH0xghLukmY7OigA2jiXzu7+zQUn7JObmu1m2T7JX2tadmqxUEUMDc84kY0ilXYlkCTOGJ2BmLEGnHmuDdyrAd5VJqyXyr/a/U26OQKe0w4p4rIh/RtDvtSLesxQZ9yIaTZTQThntqHCG05RfW7QjWtvT7WOMddtXtnJ0XmJipwjsFPHMzkPv4wcpA2kTM1WgV0qjITljGZUmEReMH0sBXo9+plPMvd1bWLaMOD9BNwOtummk8jVXH5umYNMUbJoy8KYpupOmKfe7OQygcUrtBKtSGqdI2V/RPTZOaS3XsXFKJzDHximDRTg2TsHGKeMFNzZOwcYpowM1Nk7BxinjgHLnjVOwt8TZjUbsLYG9JbC3RGGQxt4SxyAYe0sMDcfYW+IE3bk/nQN7SxypeWBvieeYjoG9JZqyb+wt8SzwjL0lsLfEyDCNvSWOUkiwt8SzQzr2ljglDoO9JZqgWT5hzj/2lmiPdewt8ezZOvaW6DbjH3tLjOdsYG+J8x0U7C0x1lODvSWwt0SBqMfeEidCH3tLPGf8Y2+JLu1q7C0xmnOBvSWwtwSeA+wt0bmnqbfeEraz3hJf61+xvwT2l8D+EgPvL2FP7S/xxi3cb/mvX11Ow+8rCj19h4naBhMQpUjRyJhNQh4zgUKS+R3I0t+kaEeTINNfwZtqkcq0HzaFCfduiLYW4JTQLiT4oxugDEcZjjJ84DKcnSrDv7u+vdpYzE8vvBnD9lAZn/wJK32xPRS2h8L2UNge6hRyYXsobA81XHCfrz0Ud4bSFAlhSQXmkrOMCcui01qqBGkk2Bb9NWk4YrPua7QI7TbUws5n2PlsgKDGzmfY+WwcUMbOZ9j5bHyoxs5n3ViM/bFq7HyGnc/OgGDsfDY0HGPnsxN05/50Dux8dqTmgZ3PnmOyMHY+a8q+sfPZs8Azdj7DzmcjwzR2PjtKIcHOZ88O6dj57JQ4DHY+a4Jm2V8cBjufYeez4R6EHitSsfNZp/Wo2PlsPGcDO5+d76Bg57OxnhrsfIadzwpEPXY+OxH62PnsOeMfO591aVdj57PRnAvsfIadz/AcYOezzj1NvXU+E130TflaQIUNU7BhCjZMGXjDFH1qw5Q7P8RG2mLXlEFIfC4I6S87BrumYNeUJ4E5dk0ZLMKxawp2TRkvuM/XNQVbS/ST0vjwJthaAltLnFQeh60lhgRlbC2BrSXGh2psLdGNWt0fq8bWEthaAltLFIBjbC1xgu7cn86BrSWO1DywtcRzzMbA1hJN2Te2lngWeMbWEthaYmSYxtYSRykk2Fri2SEdW0ucEofB1hJN0CyfMOUfW0u0xzq2lnj2bB1bS3Sb8I+tJcZzNrC1xPkOCraWGOupwdYS2FqiQNRja4kToY+tJZ4z/rG1RJd29ZO1liDRqXwApNWUq2w5UCqjFkQQrol2fCytJezTJUoeUZVZGPq7IBm2T8H2Kc8L9dg+5dmfA2yf0rU3tbf2KbaL9ilbUgh7qGAPFeyhMuweKoaf2kNlT6bs03dSobauk0oh2enG9leEj/npxxp8veSnS6dZtvgSEUFqxX2kFpxlJgUaBNNjyX2ktr/WQY8Sr3fc5GvnhIIRfjyhatsEae1ocIwE0MIazYggyUciotJUeBgJohlVg0L01y4KiOgjCFXLozmLkmkfraSem0RVFBnRIboQRGbWI0G06LG7205T4OFN8tIXVbk5ArsTgmGRfo8+NyzSxyL9541gLNJvqHGco0ifZDVZaREzlIGQkFVpkTgkYZUKmnMs8mzNj7fTeFY3uby9mFyvf3z3OX/kzWR+U7nwCqx+O4ZEdRjm0irBlKdRuxhV1pxt1iq0Ujpp5R3G8Vrn8rX3R201btq4p75878JiOisvmn0OEtbWPgiWIASQwFwQwZuUBCfS8KSj1YTiGWh5BqrAyMENbJOYXGip89noiGX+WOY/cOxjmf/zQzqW+R9pjXZR5l/IeJP+wjk426Q90z7zbJNCWln01+QTO1k8y04WhUyK6HEGCg6KOEFzaUCn2kERjiuvPBDlQOR/LSQSuebWhGyJhtGkovTng+w4S7Q0lHdOv/r5EjzZRKymKYICr6uZbRwoIdr4OJq0lR79Ldtes/s3+TC9nQWoLKvFdOtVyYjvhGa1GothRNDAPAivQUqoWqYwlRUYKpIiiPLWGoutIdaqXiKrmHGyXPbuqmDN5VR61evjRhFnmXLe8wAsKGOjNtEnZsCHsejjPbbr3x3mfnCT5Y8JzJe7MXs3m17MYD5/5QpuAdQV2Wq7KEqQylkjrTVecq0gXzpHjfU0ipQQ622x3iBp9P5N3F1jjvcwv70sb77s6QRbV+5SIrso3d1ZT4QFvFjAiwW8wy7gpVSfWsF7dFvJp6/x1bUlvmUUPDI2rPIwLHg8iVDY4fiF6K89GbY4Pt8ZGEyL40LSSnp0T2NaydDSSrAs7dzhdCxL263pnKMsDUt6ug6nY0nPcyvpKWTUT3/GK4766fQ8POWon0KSaHssd8Mk2uEm0a4CPbyTHq1HGtgYCsJQEIaCBh4KqkLBfYWCvgwh/ENpXfynEAWaSokq9PNUGJ5ShVbBE82BpGCJpFpoqligxBEuHQM9GheL7TE6qltv59cYYHHgP5FatY1hQQbjwRodqatqEZjSyXCVxaiy2T4cCbZ5j9Dedn7tuslDb9fq3Y8zNykvve9UctWWmiVCkgAXQGulQkzJSa0J5Z56SxUfCbj7ywEQ24xoX8ZxwUWTR9GovmSMeZ9tPx84rTRzSoFyooRxphrHNBYWTfurg38UYW7Kc8pFdRckw27HL3h/rBq7HR9i1N12Oy4kdeoJuTSmTj116hSlkYpEHHPRRgWOmySrVoFZlwahzVj8hD2mTrXYsNWPQhsEHk8o7AmIPQGHB+dz9AQsJdWjP18e5noMONej+ImVPVYx4LzKIxXyDudVrnKbmO43twlnU2M+E+YzDTyfyZru0pl+hsWnafztzZdrdzUJq1cb38DT5zHVTqqmQrsMJal0sEprwYmLjjAKAJZk7Xgkcr/HPI1GMymOQVJhesDZ6Ijh7xeyv+ZNGP9+gvg3CKm95xAyU/dGGsepgyhd0Mn4wMbSMJia/vI4TItxK/vY0X0+VC7az0hJDJdjuHxASO86XI6hRAwljiiUWEj6Bw5kGjCyz53+oZRlUXMTFOcuJBuoARK5oEwrSvVY/Cs99hrZ7uB8ovZYHOK7J2CtJaq1o8ExEkALazQjgiQfiYhKU+HHYok+oc6y4yZfBwwVHEc8nlCYMPKCYr7Ic8L6eXuDVF+xy/j5fuc8Bs4xcI6B82EHzinhnUfO7/GAwXWBN9gFHrvAD1Hon6cLvGcpMu5FNJoooZ0y2YATznCa8ms7FgXX9BcBN+0TGlswyMJAf15iorca+7wPGf3Y570TjPcXI8c+7w11Gezz/gw4NvZ5Pz360nOf90IyAfs7A5gH2Jkq/zR5gIVE5PuzbzEi/6wi8oVEMHuUCBjBHHwEs5Mx1o0dSRjGxDAmhjGHHca09JxRzEEU/lJWF7osRA/OXwU14eeiBfSrCRczpID05+/GIQVtvN5nHFJQht8vn1j0/D073D+R5w8Hd3TO7nFwRyt+j4M7TlZm+tPmsXPJE3QuwckdZ0+zasp0ykU1Tu7oRhHpj1VjK5KeW5GUkQyLkzsGDGmc3NGNRt2ftYjtdhraiTi541ngGSd3NIMzTu44Hs3YieFZYR0ndzx7to6TO45VyDuf3EH5ufP2sOUI5uphrt7Ac/UoIWdN1rvntn36rD1Zl7RXSJSPqv4au2OY7wnCfIWkJ2U1HNOTnh3anyg9qZCYCjYYGTD0zx1TKSTy3Z/TDiPfPUe+saH1uaOCO26CDa1PItRdGSw7uzvtTtdBvxr61dCvNnS/mu7Or/ZuVq1072KXY//p3Wsa2/liO9/nKt7bt/OlmTPaxAypsuel0ZCcsYzKjHEXjB9LjavsL1PTtjeRWzLJwoB/foKi1w29bkM+AdjWtxOMY1vfoQEb2/o+B46NbX1Pb1zTc1tf563gQUWVrVUnbEoMwEohbbBSkiBGcgb6M1Mf5e2eroSWdwrOQ0SsAsBmps/8HHRUBLCO4thuozgNTGgM5mAwB4M5ww7mWHnuWM4wmprSugBOIXoxVT3mlaJm/Bw140Kam3LSY6YSNjcdSHNTbOTYNbSxkSM2csRGjuXWvGAjR2zkOD5UYyPHbhSR/lg1lrNgI8czIBgbOQ4Y0tjI8ZkFCbGRY1M7ERs5Pgs8YyPHZnDGRo7Pwd+BORwDzuHARo79qeLYyPFIhbz7Ro66j5wlbOaIeUqYpzTwPCXNT81TWgbRNob/02cksdoxy4U42Di3/TU9Qh/b4HxshaRkUCUxJ2OYCD9nTkYpyXS0PycFJtMNJJnOchG1CyIazr2lSWdjLaWoGXcmRLAjwTZ9anfyw5t8bdRWbnbG0XTC9LkXoj89BNPnMH0O0+dKRDWmz3WjVmP63GAg3XH6XCGdlfrj0thZ6UjduYvOSoVEoAVGoIcO7y4j0JgYiomhQ8P3eRJDSRBBCB9kdEIwl4QHkqLyijNZNQBGPLfFs2i+Ta+nVzfTghF9AqlqbUTLPZgqjcALZoNT1iqiQ8WmCQQxFhuxx6y4FtPN8uX2VaHw7ohqmNaPaf2Dwzam9R+PZtkfnDGt/1mm9ZukBQTvqaAECFTBHA0uSuOkB+3GchD6Owf2lF5ay6S2vJ/zhbtePHy1+oviTsS5yVl3NhgjREZCKIk+mMAId0kzHZ0VAWwcS3Jsf2eDklOGqRzazbJ9kr3Stu7UZKWKGBqYcyYZQyrtSiRLmDE8ATNjCTr1d2r0TgX4rnhjtUT+1f53ys0R6JR2tWM/IuOWOEtsIEqBC16EYKSzPFkV3Whau5KnSzBvWXpTGNJPJVdtgrmyLGpuguLchWQDNUAiF5RpRalGlt6apasTZPWOucbFob17AtaqNCxl9u5FNJoooZ0y2lHhDKcpv7ZoJLd2FrVnVnXbV7bmf15i4pynp5xvg93sO3Cinr2bfSFjjHt0ouIU447dqD1MMf7XZs7L6a1U7lkm2DQFm6Zg05RhN02h1RNON9ynXdeU1TfKxIyTJVt74Hve/uXb+bvZ5HMm191bQ2ixwus6rHjjWQwsMvCCyKS94ylRoWMgNHI9lrwZ2l9/FUp4c2F2MrwKUxT6JW5taqVhRNDAPAivQUqoAkpMRcOpSIqwkRycHnta2BpiPdrKzVW5saOT6YWNAHo0GbEPwNn6AKyaZApykmV3oqxAMxDNQDQDB24GMtKfGTjNJFpAfEaGYEU5oaKMQRAnnMxWoAyeJedtSGks+myvhmCLspcOAFaYttA3edEYRGNwsIcBjUE0BseF6NOMQdavMbgtLdAcRHMQzcGBm4PVWJWezMFbfzkJz8cWlMwpCzpZRWVwUkWgMsPNeWWSD2Ys6myvtmCLDJdT0VWYptArbdEKRCtwsCcBrUC0AseF6JOsQG57tQIfigo0AdEERBNw6Cag7ccE/M/JfOInl5lNPR8jkIeMfqeZ8cY7yTWzkmZacsKYFBAxM/QII7BFm8fT8VWYqtAzddEQRENwsGcBDUE0BMeF6NPCgbQ/Q3CHsEBTEE1BNAULMwUb8IWfp3GSJlVn66c3BWltbqhIHPI5BKOYY45CNgCZZTErtrwa9zESid/jlNPTjZVW+CpMWeiZuudUM1o8CKoZqGagmjF0NYN2pmasmmL9/+2963OjOPY//B/1cL/s86qTvkzXk57OJpn5vumqKSFEwrZjXNju6WzV/u8/AcbxBWMJBMHw2a3pALZ1pMPR51wknTOCHASmQzTP41PSI7pnap7hRZqj+w6jRujZ/miKqPcXafYl8g82F6uJWRX9MBVxZcSVBzsFEFdGXHlcEt1ug5Gp1OETVRJw9ODowdEbuqNn9uDoXVyWAUsLPcvXItM3HMt1TeL4lLi2RSPbJVE0mkhyj66eRHrtNoI1MbugL7bC3YO7N9hJAHcP7t64JLqdu9cueXhzNQGHDw4fHL6hO3zqssudRIYLyyNgUS0yiOk6Yeg5xLCoQanhOS7X7kGk2d5IVHyf3l6LnGfCUjUxm6AXnsLPg5832BkAPw9+3rgkup2fpzZ7nKCOgJMHJw9O3sCdPMPo2Mn7Np+9fEqT5+t1mnI2lEfNLsThgyULS3a8lqxjeLYThVpoEd3QDd+IQkIj07Rcw/c9fSz7lPs8BXVopnWNnxObDv0zGJ4gPMFBTYF2iQOsHjzB2hkFrxBeIbzCgXuFetde4SXmj/MC3yCG4Xme5VPPIL4ekcCyqBvZjJpsLNZyn4t/yo055I3rjatYAETYZLBzAAuAcPvGJdHtFgD7cPuQKA7OHpy9C3T21B3su02zhlYvI8jhYjhMCz2dEMMyHGLqbshcU48C13M1zYW318Dba3ECTUawJmYY9MVW+Hvw9wY7CeDvwd8bl0QP6WCfuJqAwweHDw7f0B0+uxeH7+JyuVCHED9iru77mkfC0GY+syIa2ZbJJ6ftjkTP91og6nBWdiZbEzMPeuQsHD84foOdB3D84PiNS6LbOX5ub44fcrrA9YPrd2mun7qNnTXYcGFZXXwjchzPsAwWUCv0PMaIyzzDDhzHcCkZixF7IRs7JeRqYpZBT1yFvwd/b7BzAP4e/L1xSfSQNnYKawk4e3D24OwN3NkzrM6dPWR3uQB9D2t2qLq/U2s28LXQpaFr+IFFQ0ejXMZp5Fh+RCNTi6KRSHd/1izHWvUOOPK77C9r989ieITwCAc1CdpleHF68QiR4wXeIbzDS/YO9e69w0vM8hIxzYlszqfI9XxqetxoNjTd0anveh4lzkg0fp+LgR2YdMjz0iNfsSCIEMpgZwEWBOH+jUui2y0I9uP+IdcLnD44fRfn9DluY5+v+PM7m/GfD8GJc+qcOF0PufmpEYOEfugwYnqRTV3d5iqbWa5nj0Vvu2Z/dukhu4RlZWLquzmjav0sXSOur+me70dcfQSBFmgeY4HHAtv1nbFUnuzREq3EKa4rovhxvWlt725ygtyAQ3USrFGLWlZA7ZDbPAaJrIBpUegEjmnYmhaMJbDWnwTbljjQXCfPi2TCmNyCVXUybROXcSVs6C4LqRF4xIxoFBqRZ2rcZiUhZFpWpvVKzCH0iX2/SSiZ7Vx+C/7DaeUPpifQTflUJ82674WObWiO62mWYwS64TDdskPP8izTMcaS/8LrTZodCVOwpJktpN/EPzbtT06wVbCsTsZDQqjNkZr7yLpuR8x0wzDkXqLj6zQ0wrF4hk5vMu5VBl/2rcSPvyhb5Fdf5j/JLA73PuYd4m2tWLr92uSkvhsmbmLCnt8qJLzroyLGixgvYrzDjvF6zY/488vN1R9JyP4iszXLvCHOrwsI+RLTMj2PRoZlWLblhtQ3HWo7BmGBZwfBSBS71d++HUfiuHmt5ExMmSvjW23pXsc3Qtf0qGOahEY+1T2mhaalG66j6y4Zibj3F3lwHWnH434dbK6KgiibPxP13NQzsE7+SeBbJnVCPg88YvlRZDDm25btU9+2NWpB/tv6cTKvr9wmsr2Y6Bzohol188CLXIvRINAtXWMai3SPuNzAtz1iB8wlY4ln9DcP/DavsDwGs1yR+Wr/bqIzomt2Ip7d49xAPBvx7LeR8f68XsSzhx7P1rV2SY9qfG7EtxHfRnx74PFtTUF8e3s1nA3Nem2mIt8MmJcxI7AMnxLH9x3NpdmeZo1RazTbP3vcm3H4WpvJzcQUuyKubTW5oUiTH1CAHocehx4fth63vQZ6/GmxuR2CxvbqNLam+Y5tcr9cN7iLTjWDGJTpTmD4uhkQMpb60abWm8a2zTO65+B+uieIW3Cq9jQ8N0IJJZHG7FAzHc9xIk3jisT0TS7crjYSkdZNuzeZts69qUPUm5gkS/On9rSGpWuhYeiub7ph9q9HLM3yzNCzmaaFY5Ffqz8fSqL0fLnI+aqqdzTs1MRaHePq5D2yaWSEgaPbzHdCkzhGyCKX2pbpstCjY9kj1J+8H526qUeje7Za8baXkxPvxnyqk2bTt1zHjgJmEjsMPJN4NIp0I6KBxV1YQiHNstIs5qqWDzb30xPmhmyqk2VXC2jg6pbvs8A2qBZRZnDXMCC6Ts2IjAWZ33Bnwv5LevgnftzkNvp+vV6ukufiZtI2iAKWYWfCW+7QxM4EeanvamdCTSAwNB2X+Z5vUd/xIsM1Qj2gpsdcKzA17EKTx/rDjeZVwLWRvRK6NreTxntFbCtPlWoNl+62Zj8W6bBIh0W6YS/SZaDRfJHu1bEf+GLdRCJlutljvkDEyt4uVkYjjoHEspnr2y5xtFC3bN9yiEudMKIucq1JS3NlTuaaXHhbL+GKPE5PpttxCxnXkHFteDLdRca1iVTP6G9XL6pnSEp1l9UzJhIB1hECviiZ7z8EjOU+LPe9tdR3vdyHZQ4scwxCzpUtc9QVY7A0agaOb4Z25GmWZQaaoVtmFqknvq1D1iVl3T3c5rv/0oom+Eenn0xZ5BVzr1zg89ou8JWxSiz0YaEPC33DXuhzm5yqf1rcsWiDG+8XceEjDWGxz65b7HMsPTAjx2MOtZkbebpnuJbjcXnyfDcKxmKpcnfzrYPIey51pahMTFM35lOdNWpYhhs6TmDoNlcg1DRDatnE8jyXaCE3VUciz2aPx/JsoTQHJ+BvajLdhlcoeYeSdwOSZcUl76ayAIL1j0sS8v7XP7DMjWXuS1/mzmNiftN8VZXmD+JiiIshLjbsuJiu6Q0CY7P1Y1wwdXN5RZaMf3K/WgcB/9L+bfGdIcTNzLq4GdUdQwsMj09JSih1HM+LTKpTO3QJYaNJn2K4/ZmzQiVTmgnTxDR8l6ysrcNkEI2DbEhMJwwDO9BMElA3oBYjDsdhNpZJ0d9S8KGpVvMiP/7kvy0pf5tfPzH648uyuL8m8ytWvK7JTYZOeFi7+cfyLa4JQs91TdMNtIDbaRqNfMu0A5s4Ywl09Lj5p3KhYO+Vba21b/PPxUL7HVsm65Sy0gyblMwr4FiZldgwG3p5TdQLnEA4gXACh+4Euh04gfyS/3z9zIedpJflCgY6C02LhU4UMt2OQpNq3AY2DYe5hDuDo9kA2Z8r6AvViWojUhOzB7pnKNxCuIUXNSXgFl76LIBb+JZuod+RW3haycA5hHMI53DozmEXK4T88s95vLost1ALvIBqvh5E3CE0/YAzzdNcptmaF+n8v7Ho+0tbIawWpolZAl2yEq4gXMGLmgxwBS99FsAVHOMKYZV6gRMIJxBO4NCdQFOFE3idPC8SDnu3hP7gX16WsDA4N9CqcwM5v0wtsLlydyw9ItTyGKO2axlOZEeObo5E15tOf26gUL24puI0MTugW2bWGsHUopYVUDvk2skgkRUwLQqdwDENW9MCpGWWPgdliddRLN9fWYN+YlLfhlUIbyC8cVHCjvDGpc8ChDfeMrxhqwpvCBlNCHAgwIEAx8ADHLqtIsBRYBn/yZ/zOIpZeDsjlFU/vZBgh6+ZWTYiYkWWbka6qUcW4b23A9f1HCcYy1Zos7/kFrp2OCs7k62JmQg9crbOWCaWTWyXehGJDI/S0A1sFkQhdXyT/99GYi9pl1HK9CveQ7njkIUFhf9LyWKKcRGlvKuTelMPHN8LuZLVPJM7h0bk+2GWRZyEphfqo0mf0J+LWK3+Tzs8t2mS1WV6KO2xD3E6vXqDirhWJ+leSLSI+Z5tBRqhtmX4xCNBwIXecZntB5B0WXw/jN2ee2fly7olq6erlzvGr+Of2Y+zB5MTedXsK8MkmTusJkwibWAhZIKQCUImww6ZZLqhYcREeE3i7YMjRm2q/WksDlpYHbwoe6Dv1UHftEKXUCv0TDPw9cjVdTeKQtcwiUdD5o9lGvS376Paad8jcpckq+Jywnlvm/KpNHFLNd3QxBWcPbBmYc3Cmh22NdvmmGsBAxvYeR/x0WXzngPZ7avNumNqDt2qpZQS7vxrLGSuTgzDjyLdY7YemoRwhT6W+Jbe35KfzNlMWWGamMrvkpV1Nq5t6VpoGLrrm26Y/esRS7M8M/RspmmjyQ7dn43rCG1T36OJGaApZZyi435y0wzGMIxhGMPDNoYzPFVhC3+bvw/D6xlZbnzih2RYZnDtzjc34Oqec8qMTCcITcPzdC+L7WoksqnFxqLxjf7KqHqH4Ro1cjQx/d8RF+uMX4trn8gjQRT4gaZZkekzy7a5VsrqpWgOHclU6C/vkVVdsKt4ad/ms5dNU78YXWc/z9/j5CS9IZfqJFn3vdCxs506nmY5RqAbDtMtO/QszzIdYyzFsXt044TyEO/TzCDoJv6xaX9yYq2CZQhVIFRxAZKuPFSRuU6qQhV19hCiFIhSIEox8CiFJx+l2PLxY7n59PSTMj3E28cp7Np0RJYRMUqZzQxCLRp4UWSZmu2ZkRv6rjaWE3pej8t1poDaaiJJE1P/nfGxNmGLazqhETBqkJAEvsu0iDguCX3fMMPAGUsx9v62ZNqHRlztJqtXcsvPabJeTE7o27KrfqMlsxghGqU6o8S0qU0D0yLcsrAp/zuWOFyPZ+wOEWrf2HrgptD3Txsp+/6ZrQ5PRv6ZziYn4Ep4ViflzHWJTomhUeZavucamqVFQahZoePqVjCWXfU9IrgAs6ogaXKi3ZxRdfIcEkJtI/C4J6PrdsRMl3t93CBxfJ2GRojkWdL2eaWLzD3jKH5cb1r7+IuyRX71Zf6TzOJw72PeId4W92m3X5ucrHfDxO2WIq1ZnE7eG0CkDpE6ROqGHanTdV9pqI5/nMftH5Kv4fam/DQzQD/Of8ZpMs/MziHE72q32xsm1R3f51PT9riVG1LNo4amO5SZum1rYzk9Z5u92Qe6JpIMWJl8Tcxw6Jm7tSvdvhZ5gWc5uuVSw7A4/riabdme60Qah+2RTJ3+LGurEhD3ffuvJJ5//MWVzXKKZnMDDpU2saUrt4llphIMZRjKMJSHbig3OIUqiw/Zzc6XhmAg1y5wB56meTo1CPEiz9OyEJoV+ZrheWbEDI+MRMtbem9qvjoppEzsZbo5J5TyrjZs7Np2GJHAikyNS7tmGi5zHe4pcsvWJ9ZYtirrmt2b3Psih4dbw+nEJkQ/TK2bKROJoPTnBiKAMpEASsRVSUg8x3FZwEI+XwwaBtTiro/nc6cHM0fNZqljVwfZyWs2S4mzC1np+pRtZKUTE+q2WenMhvk4WhpZCBAiQIgA4bADhH6DOtwntmZ+iJecHy85ErxfxF/Z6ikJl4OPBloedUI3sgMSuIEdBUZAbeJaUWAGjqeP5gS30d9yuStySlNSiCam8rtgYW0JEtu2XKZR6piGT23dYJrt+55lONzIZcZYQuJ6j2e8K4tonHhl1+vlKnkub6dr6aphGk5zvXmAAqe5pAIUOM01SNnGaa4GEN71aa6JnH7pb/Eep18Gf/pFb1hgXspDQLgO4TqE64YdrvMUhutS8k+OAF/JYghBOqcuSGcTz4lMLfRcX/Ncz/Ysw+D8cd3QpJo+mhLYPRZGE0qlJiQ6E9P06hiHgBwCckMX9s4DcghaIGjx9mLeddACYWeEnccadkZ66LcwzfdpIj206vTQkw9A94flCEAPPgCtKQ5A7/jBCDsj7Iyw87DDzpkeUBR25t5TMfOLRaerJOTmZsiGEIGurd4WkEi3PGZZOv9fNvVck1u6AdMjEjEncsai9XvcJnpYjUmFFE1M63fCQ8SlEZceuNxjo+jFeXmI2A0mYjeRCAa20F2UxHe8hc5RGsE4YTwhmIFgBoIZww5m6IYAFBQYVxR5zK43lzdkubrNdczzc7zigzt+soEA690i/8n9y5Jz7UioAAoAhYsHBbtStETE/03ZZ+qeG3KQiHxqWVzciO8zS8s4aAR+4EYlTBiNYSIDhIxJmQ2R2ROr51lxW3wOiABEACJGABEi1aPFIALwAHgAPIwMHgyBBP1i8HC3XAEhgBBAiJEhRNMSHseAcUWWjH9yv1oHAf/S/i1QA6gB1BgPargdoQa/LI+2JCmwA9gB7BgddnRlcfDLP+fxCqgB1ABqjA41GmYQP0aN6+R5kSw5QBD6g395WcIHcAO4AdwYG27YDc+NHeNGsYmM/4QbGVHMwtsZoaz6KTAEGAIMGQ2G6AK2x+4qyseffCzl/tQrFmUYwm/i+eNtmlC2XAIZgAxAhjEgg0Ac9BgZtsx9H+WDyu44OHzcnDgFOgAdgA5jQAfJbd4H6FBYDvlRGI4O/PsZawEOAAeAwxjAQXLnZiU4bG2HDTrAdgA8AB4AD4fwANcC8AB4GBE8yJ4gPYCHb/PihP1hGuFNGXLABGACMDEGmNBawsRntrpNk/8wunooWfQhTmFHACAAEKMACL89QJTIcEtWT1cvd4xfxz+zH2cPgBRACiDFCJCi5WJGjhTZOsYdWybrlOZnSwEOAAeAwwjAwWi0Q2oHHLLEf9utlMWXrosRAyOAEcCIEWBElsCvxU7sAjIKjMjil0+M/viyLO6vyfyKFblDAReAC8DFCOCi5THRvT3Y+T7LDB+yLdhV9baAGkANoMYIUMNsmGS7CjW+zd+HYZ5ju7AyHhIABgADgDEmwPAFjofuBi6KP9sKLoABwABg4PJhoFFxjoP7Q1Aw36Ub3v+25dpfJI0Jb3G5Cw42wAHgcNngYHkn+bUzDQbFOs0NDI0w39U0y4uooWlG6NpOZLiEUi5vOevMHnD1dF2THdZp+t/brwyEgbbmO67P9ND1bCvyM14yzwwCYmp+4IRazkCrewZmzZ9nYB0EvykbdY3qpmWEBjUpn87EtSPTI9Sljkb8yNBKx7ZpOOx8sXnoK+gr6CvoK+gr6Ctl+spQVpjkRO2iKl5lX4vnj1BWUFZQVlBWUFbtGSgke6cB+G1jf8SnJOCS6Lm+pxl26FieG0XMc02P2pZXqiqBjUn7XD2qxHt4jvLPdAY1BTUFNQU1BTUFNaVGTYkuVZ9XU5ta9Y8Megp6CnoKegp6CnpKmZ4SPVJ+Qk99SMk/e4rqK5uvj7WUZv+d8eR6vVwlz+WP99apLOgq6CroqonqKkdMV51BkTdlpUtsTbdMI9CIaVuEWX4U6lrgmiSg1DJYuTXAUAe4ZQBr53Q+MBeYC8wF5gJzdzBXPD3r3v6ruyRZFZc1u4WBskBZoCxQFigrnFbmhGWbsfUzW20yySwBtYBaQC2gFlBbEUQQOF9Qv7o4Z2meBPSRXWWyRFP+U0AuIBeQC8gF5HYCuYIbOgC5gFxALiAXkGtq/Wz1BuICcYG4QFwgri5cYOTEQlldngLALGAWMAuYBcwK14M8YdhmyZGL4/XLzWoZ0BZoC7QF2gJtK8IILY/i3abx/Mi8fb+8iZeAXcAuYBewC9itgF1LAHarciCeOvcQLznLXvIM/+8X8Ve2ekpC7FgAAAOAAcAA4IZ2rwwAp+SfHH2/kgVgF7AL2AXsAnbVwW6j3N+AXcAuYBewC9i1GtYSPL13rDB2izjDVRK+XCchzv8CgYHAQGAgcAcnJPYHj5QLgFxALiAXkFu3kawh5Oaj+f4+DLM+8NGlyfMNi6q2M1i7TMp/BqAF0AJoAbQZ0FbOSjkMeVNG2qGpO0QPfJNZhENsoGu2Z7kB05gW8qvyWETDmiMFzH6Kf92v0vv4v1WmLPAV+Ap8Bb5OG19bmbFfOHuqQ7MAV4ArwBXgOm1wbZiWsQDX25Q9fs16AngFvAJeAa+A1314bReC5fC6ICm7T9YpZSfKOABmAbOAWcDspGG2nRX773XCWcRWBPAKeAW8Al4BrwdWbMNUiwW83rHn5GdmvrKrlPxgVadygbJAWaAsUHbSKFuOvxnK3q/Sh5cFe0iqk9gCYYGwQFgg7LQRtmE58wJhHziLH5LsnNfVLKGIxQJkAbIAWYDsIci67UH2dy5A8fwREAuIBcQCYgGxBxArnbN2p4zj7vXvbLZgaQXMGn8Hr98CwAJgAbAAWD5QRwhgT6DHm7LQJDRgzHEd6hiuSZirWb5t2Jrt2p7pmKrKlIvXzgXEAmIBsYNhHSC2L4iVLSO22f6aULJK0u8f4pRRfsF/svfBBmGNd4v8V78tdz8EvAJexwSvpzFiK/+DYpxPPJMEWuhoEQtdarqhb3iUBqYW6oFDWG/gap5n3AngeNuJqoc+F7wo8M3IjahH9TCKXMOPNIO4thvJ7tOqRNaMk19WmfWapIBWQCugFdAKaC2h1WsDrXeMrtNl/JPBegXEAmIBsYDYY4jVW0HsfTx/nLGMnwBWACuAFcAKYJXdkVUNrLt3h3m3gavAVeAqcHWSuCqc3GW/eNddkhwVDF9+TpP14hBUUxaVBcUX8ZGIAVuBrcDWqWJr1vx5xtXhx9tut/BYZLgOo9QiXkB10zdtJ/B8xphhGYFR1u0SWNE6Xy7xISXxBnLrIXbxtMj+y79/t/vJLuo6QF2gLlAXqDtK1I3/Zb1pDZ4aZB4UKw1qhppmUisgruvagaM7Rsg0i+qMBabl5Ky0u2el6zdh5Rkl97acdbj7xdGQhRbRTc/RTN8JLIeSQNdDYpSHYCyBshvnTYO8jOdN/IPBPIB58Nb8gnkA8wDmAcwDmAcKzAOB3QTnzYPtepeEebD9DUwEmAgwEQbCOJgIMBGGxcqhmAiewCptI0X3ttw1Ij65iReGZui7JnX9wKLMcixLD0zTDJSaCU2iCDATYCbATICZADMBZgLMhIGbCaYSM+HjfP0sYSFkX4dxAOMAxsFAGAfjAMbBsFg5FOPAPZ3wqbGOe9upbocuMR3qh2FEmO2anuMw3/V8zfI8jdpl+EAgXVw34QMYBzAOYBwMiHEwDmAcDIuVMA7e1jiwlRxeuM34wK/4T1/PiwmaCIc/g40AGwE2AmwE2AiwEQZmIzTdp1in5N6Us5FFTSvgjI00zfAtGukGJUTzHUfTSBiZSk845hEEiehB/n2ED2AawDQYCONgGsA0GBYrL940qFNybwyStutohFsIRhBEvmt4zIyyyl++oQW2pr35CUeYBzAPYB4MiXEwD2AeDIuVMA/e2DxwlUQO7tdBudCQJguW7lzIGgzl72A4wHCA4TAQxsFwgOEwLFYOxXDwTkNfe2X3tksPzDaZw4hHrMCzLd2mNuHQaeoWMQlxycaAcJTEF14NiK9s9ZSEmz+yxkPxK5gOMB1gOgyEcTAdYDoMi5WDMR3sNqZDrap74z0LUWBQJyIB04NQ9xjzLeZqATEsx3LsMvG9pzjykHOFv5PlisxX+3eyZkT5OxgSMCRgSAyEcTAkYEgMi5WDMSRaxSDOKLu3BUvOUa5NmBE4ju5ZhIRBYBmOx0LdNCyLFqaEJ1ma7DZN/sNHWtwdWwWHBXJMKHsoeyj7oSn7fHOTZPGsYhicm2GcAR3/7Pk5mR8+/URmS7a9PQQIljsTB79BQS3gBfBi0HjRj3Ogn2fcGQB5Uz7qnG2uxXTbN33N5y6CT9zMBtN8x3J0vVz0yfrRAe7yFh8497OXQOL5EhAMCAYEA4IBwRUQbNldQHBeQpeFX+bAXmAvsBfYC+ytwl6BRK6NsfePZAX4BfwCfgG/gN9q+BXYOSIPvw/pGkFfwC5gF7AL2K2CXd1vC7ubq89psl4AYYGwQFggLBD2FWEdgY1MNVuijwB3d3vX4Ydflrdp/JNzEzYvEBmIDEQGIlchsoDNqxKRE87BFQuBycBkYDIwGZhchclOr5i8DmYxBSADkAHIAGQAchUgt6trKwXIf8XLOIhnnGWAZEAyIBmQDEiuguR2yTUOUbdINoIQMqB4OIgCKAYUXwQUC5yVUwLFiB0DjAHGAGOAcc3BZbXreSfBGEFjIDGQGEgMJD6FxK5A6p7WSPxtPnv5lCbP1+s05awoI8tAZaAyUBmoDFQ+Clb0gcpYwwMWA4uBxcDiPgPHZa0hrOIBjIeDKQBjgPFFgHG7MmcyYIx1PMAx4BhwDDjuLU5RA8dYyQMWA4uBxcDikyt5Zi9YjLU84PIg+AVcBi5fAi47/eAyVvOAxkBjoDHQuBaNDQE0FsqemfMvIpQBZYGyQFmgLFB2J0dxuwyaH3MOZE/yK/7T62S2qYpcDbfAV+Ar8BX4KsK4Q8R4U8ZFGjUMw3WoGwWaobvU0swgMG0a2UR33LLCsqYEUPNgbXENGAWMAkYBoxOD0XY5Kzcw+nG+fgaKAkWBokDRKaKo3m7X1wZFtwFUQCmgFFAKKJ0ilKrx6x9SEq8Ao4BRwChgdIowarbLJ7aB0ft1sBsovd7kPt+/A8wCZgGzgNkpwqytxPEXh1ks/ANyAbmA3AlDrtku+8wR5BapwL5/eJmT55gWdzBpga/AV+DrJPFVSQD2CF93gBVGLEAWIAuQnTDIGnbXIAvrFcAKYAWwTg1YFa97lckFthcAV4ArwBXgOkVwtRSvdlWDK8IDAFoALYB2wkCrCQDtbk6WDZ7eJclmNxYAFAAKAAWAThRAfYFTrRX4Wfw5k8cK0AnoBHQCOkcKneK2J2dgFD+uU1KmAXy92yCn/o7uPj2SI/IvEwAKAL1sALXNk/w6J/9vyj/XZp7peabLHOq7um8ZZkjdwDC9MLIIccoFFYHtlvsMvSWPLGPObZpQtlwm6fcrsmRHT4ERwAhgxCgwIuuhHEY88LF9/7Se5yGq7x9S8g//2vqZDzHnwlc2XwMfgA/Ah1HggyHqUgjgA9tsb8tYB4gARAAixgERWjuI4J8zPvzczbjKGEBT/tMlEAIIAYQYBULoAjs76xFidWhD/JnOABAACADEOABC4ExNHUDcJCS8na0f4/nyuhgowAHgAHAYBTgYVjtwuE3j+dHeuvfLm3gJlABKACVGghKtoxCrvXWMLBoBJwMIAYQYC0Lo0tsh9hEi4yVHiY2DgfgkkAHIMG1kyEfz/X0YZn3go0uT5xsWwasAMgAZxoEMWsPAZIEMn+Jf96v0Pv4vAyQAEgAJo4CEdsbCbcoWJGX3yTqlDBuhgAxAhtEgg9ZwoaJAhn+vE84ZtiJABCACEGEUiCBSXPQ0Ityx5+RnZiSwq5T8YIg4AhgADOMABpFSmaeB4X6VPrws2EOCBUqAAkBhLKCgN9zCUIDCA+fsQ3KdhOxqllDEFYALwIVx4ILW8Iz2Li78zscdzx+BCkAFoMI4UKFVtPE2ZY9fs54AEYAIQIRxIEKrlckvnCvceQAeAA+AB6PAA8MUTaWbH53MrzeXZcq3TU6431fPs+K2+BwgAZAASIwCJIRzM5wFCQAEAAIAMTaAcAQWJYo/WRKnLDfs4aQi/9IxySUmecZ0geXhXaZ/IpT/+wLeK+C9+Eni670s6h9/UbbIr77Mf5JZHO59fEtS8sz4cLdf+7saUsm/DLwxqMTOVKLUgtI1oU/s+01Cyay4fBXyb8F/GF39kaw+Jet5CKmGVL+xVHuiR7X2YXvvDtIL6X0b6fXblg08LH0FGYYM9y3DLdN8nsziB1mGLPduI4sunjTJWQuBhkD3Dc7Smwi3/DsQ4/9LyWLBUogyRPmtsFna0Dgjy8ujotsQa4h13wgtffyj5F/5YHMPEYYIDzeKcUPmj+tsTxGZh7Ns68DTIvtvc3vPVqt4/riEDEOG38q6ENhGWynEe5G56xlZLm/iH6y4hzxDnt9Ink0Bu+K8PN+vg13J5jxersh8tX8HWYesv62sN1sEbLh3w3q3yMPV9y9LzkHsboTAj3B3Y6VoiYj/m7LP1D03pI4d+dSyuLgR32eWlnHQCPzAjcrdzy1ry5xcsgI0ABoADZcMDabojgwlpoT5Lt28FmAFsGJ8WGF5J/lVI/pvyjrNDQyNMN/VNMuLqKFpRujaTmS4hFIub7KnrkV3bgEKAAWAgkGxThQKVK9LAxGACECEC0YE+aqU0jtVAA4AB4DDoFgnai5IZ4ev3/ADJAASAAkGxTpBJGi7DFF72ACwAFgALAyKdWKw4DvKTjQDA4ABwIBBsU7QNLBEK8UoWYY03i3yVQrOqmgTZni/iH9bPC0qcMMGbgA3Lhw3nJP82pkKA2KcTzyTBFroaBELXWq6oW94lAamFuqBQ1jOOLN7xmXNn2fcLoYMio2axzjQOoxSi3gB1U3ftJ3A8xljhmUERs5Gqwc2WrJsrILiN2WlQc1Q00xqBcR1XTtwdMcImWZRnbHAtLZ5RgXOH0sdDYKqgqqCqoKqgqqCqlKrqgyBbRxNDwBCa0FrQWtBa0FrQWspdrBE9yGfXy2AkoKSgpKCkoKSgpLqPwoodVgGqgqqCqoKqgqqCqpKraqyBTZedJE2CRoNGg0aDRoNGg0arf91rU62EmLDMbQWtNbgtVZ+JlH0wHKDAA1gADAAGBgNDDTdrQkYAAwABi4CBvSm9RzkdsIBEYAIQIRLQARfNFGB1CYjzH/Mf8z/S5j/uqlkb3yrVTGgBdACaHEZaNEsg0nDFQf9Hd39HqACUDE+qLDNk/w6J/9vyj/XZp7peabLHOq7um8ZZkjdwDC9MLII2W4Qlc6EtmVobQplYAOwAdhw2dhgiBZ3a55MGTABmABMXDZMaKJOh2BaZWACMAGYcNmYoPdVF/ZwMpJ/6QAHCXD4X9FBlplp2RtK2Szn9TKvH23nDOBTu5DMZ7LY5bTjZB/zjuRs99zszjIPmP7+S8bpZTJj39+HIX94NUvoD24JPj+TebipUp1JzKYTL3/P+UvOg3SyTWWHSDJeb23MsqWs8cXT4uNmkHzYxQQ81Tq/ZVzk2B2feV/Zw+YVC3S5RaNSnbfsYzqb9pN0+X3Lmu2zWj7LNybH6cN5uN/+XQ5vJT+Eety0RaluZ/UoD4ncpsnPmMPHJ0J5gy91fRT6uVyHKoSrbHG7C7S2S2INyElizTCX379xLN15UCuFcg3JddI5bvshJfFq+f3+iaQs3MzCm+QxpvkHtT1t0JpUdw3rSHFtUG+xqOtY/e/k5uzhGMumNmPLADjOWiGzzZNX17525rZqV+6lH6v/fVJXZCmC6XLtyHXx1Asrmy51hkg3pduSE4jD6Vk2z6fkY8qWyyuS7l4LIGTjJuU6bghQuV+9zOL/snDnWW3PG7cpJx6HeF1YzIQ+sc3Cfn79hdugt0kyk7KlzjUl1VHHO936TUL5XC4Iba37b8F/eLN/JKtPyXoebp/XjUAdjbZyX0U2vywo5g8k5V6sSbmOu6epbNXUIhNMFpbh2sz/Od/9dg23s3PP7XWTsnPPN6aC46fb3/qzV+SxAcdFG5YahFfpNLfz0uvG1g09FVN8rwt3uwdSi48aTPHzTcrBbjWo71H5i8zW3OXk2uknS7+/Tx9/7j2pRVwVzcsNSEDQ9ymWQRnxQakiITewY4PhDFUuHeJjUtC6Cn1fQ3DvTshZVUdDamiuKC+5YzdfRkn6XFJ+SPLdlDvP64anlo7cEI89BVHSrw+E3qFqSm1d2DSzqh4fOZFyq+zGKeJtfUzTJF1unku6sBLttvVdjk4CZ97nxoIX88AbtyknZJXK4+CcUm4z5v/+/+xle7EN2InJmFpCcoOsVPO1tD+wiKxnq6Mu1A5RJRm5AfrSlA/WdOUG2gU5BYr6ZA8I/+LH/WP48oparnU5AKlUogIEzwZB27aswC4UILbZdyQQjFJGQm5glS6pONWzr0kRgXYra+dpfmWrp0RuZU280Y4AYCdsds9ffXb+hs0WTSx1udbVC9i2qc9psl7cJCQs2+DWNNcirQXsPAG5QVXGDE7RlBxP67blhiKi8XbIPX5bsDLiM0vmbHtbOyZ1RNRbD9V0v6zytYqyOaFhdkJOvdFb3YPtlTqjV5yQ3CClZnw17aWYr6KclFwoVASsq6nfx/PHUpPeM5LSJyEJ7oqiHCRV+rf7nSh/kOEfS3dWuMTMYEUU5JYSBAw8CVO+UXPKtVwWdchMndd0YGITq33byuMYskNo3qZyD6qKzDI3ddp6UHUtK1jjOJtTTn6NQ6BJOW1TN8+K/ZTc9Q/jzSLY83MyP3z6icyyDRqb21p9o56YnMapEwlB+vGMPWSBkGS+InGm/QTG3S1dORbUSZVYV7KF8xULv8zFxt4NQblBV8bJm/Thj2QlOu7OaMrN7zpbQKwbD+lacHorpyWHwXXW7DH5zdV5PdKmWQXrzUKUHl4W3DhdP8uvN0s2L/dG6jzGkxTFtGPbpqUGYtYBODees01ExV3t/mCJVhQsxW0avk/WKWU5liRpvvS090R+KU60XXWyv0/qQ5yyLBjMfyo8EiXNyw2oDv/3KWa6vYiQJKn4iJS0r2DtvpLkHaPrdBn/ZE1ello66sLT+6SLiEDGW/F3pqB1ueHUGV8HBHfvxMIM7RvvCiL27gSDYUqaV7G8PVs/xsX15vKGLLleeMx3lscrzrzjJw2Wt5uRUSF+R5QzGtmxP1bokdfbBuIn07iKRdI6etnl76vnWXFbfN5gkVSehIp5dY6q8KBUNK8iwnqO4t1yJTwmRRRUhMoKSh9/8i6WaHXFoqwP/IZrEW5YUrZcNgiVCbesQsXuEtueIX4f5ed5sztO77UZaRUr1bo6jDsgWHDvOmUkSyXPv5/p98YYJ9a4OiiopLdl34Zg/ctR0XxfAxKSNhXNq7MZDih+m+fSwD5UZwtqbDPIklGxo+IE5c9stXGcy+PIS+4J1L8zNQTk3lq1s3aaZknslqyerl7u8qQBP7MfZw/ktwQ3p9QZFubEM6TKdpTn5nSe90ENFp5oXG4w55XiDr3tTpWXjHX5l66LpBTym/Cb0JBbq60OnhVkv81nL5vV7l/cu84ay3tSu1rbrEG5TtfZXMWfvNkP8XKRJe44cxy+QWty3a1eAt4lILYQLtWOXBfrbKXij6DvLNuSgujmq17N8vfQlH9huXt9frNgu3YVKLVzpB7+ibmZ8DNOk/nzOSBRQ0DloCry/5RBupedJEDNByVKQMGuEImkRtK7QmTaVmAq1pErP3t9JLCzWykZuQFWWt9ylFtsB2xMqJO3uDG+twe7JI9OKCWjIKxxkrKEE9O2ZTngqDSBRImJxqjVEZF7R2LIdXBYSCrFlGCLKufO1pY+/UTF3JEjoxIBBSiL7hRWS0hBOHdLqYyxbqKRyX6Yf/tUPpwrT0ElYBwT/RyvntZB9nwpPjJ1RFTOvGO6R09UzDw5MnI7Qupt0/KidjuIaBNyTl09S8qL8+6RZEMq9ckWFjebFkSSXTVsUe6l18+mMpR2Lqov1YxKVznz9zabo7JEcFlq0/nqU5o837CoXlu3alelA7ZL6nq9XCXPxY3YjoXWbStY6TpLTtQWVNC6gqhhJcFP8a/7VXof/7c+tNWsQQVRw0oaX/i0S8L6HjdoTa679S7LLoHblD1+zUKTtR1u1F5XmMNJLEha7mg6E+9v125XXP/3OlmxZ7Yiiri+054c1+uNh10Sd+w5+ZmxhV2l5Ef9gmarZuUGUG9e7FLiMz/bgPyQ/JnWJmFs3KRcxytX2CqpZAc2HpJrDgN5hufavrdoVa774mqjIPQ7I2E8r0/H1rhNOX0qwqP1nBZ7vgudt7kVMw+UtK/St60jKWomKKKg3vIpiX5IyT9lxCo/UPuVzdetLZ8zratc6ThNsAzAnV3bVkNAvd4uaWa+yGe22iw316uQVu12BwifN/mZsxDAzhqYMkA42X6XQ1rtiXZG+oyOVNO+3JDqY4cnSZayfW5EKpqXmzkifktJMdu0sV0BP7shpHXTcm9GxE4tqd2m8fzosPT75U28bLDFpQkNOZNeAFG/knj+8Rfn2/Lc9gb5xpTbwln7EhsCGjcp1XHjkDHFn/OZ6M78UC4qd2gO7LYlUklE6PdyL/QQkw5LyB/cix15bN5oO9fyDB1BQ7RVs+08tENKt0+LckN7lks9WYrEw9u0Ktf9w1MgNYQKrNxJKCqV51yuYbkFoEPYP0/rIL3c7aZFoT0oHVCTe2cNOpBlGRZ4aS1bbue3CRK7iX8IyJ+K1tsZ0+cJfiArsi3JddZtU9J+1+CQHdzvBBx2G+5azLbKrBMxO2q9nRl9nuDtaxOCYRxlNKSGpmvyzLxfB7uzN6vdsyLz1f6d3Oh77YYUg/zDJUWVHasV864pS7HBO2eb1nWmSCT7/cMLpxDT4u78+DsjKTdw+Xl51Isd8sIzolu6cqbeYcCvXVfqDT3ltOTe9jkfRpK8kN/XIVE5qGuDwbdpwj2hnQs5ce+etpwctMHe6u7UY10n9Lr2cPLk5p14OHstSxo0EmrjKI/Urp48/PDL8jaNf+YFIAVypfXbD0kWSQCOdNeSFe9CVsNOiEn99qQ701i2c+tgFlNBHvXYDUkGSbjHUj37K17GQTzLVwmEWNRrR3pmkkCfviZhHMX14c2eOyJneUhYfYe9KCyfdmDdD305lkgoTfEuyYBzXz2QY0sLhXGyU+Jg3At5SXyRiOuJdSk7z59t7r5epykffwmQIjjcd1/kZEd57yT1VE8d6A1nSn+jJfj21APJaSXhkcn0Ss487q0TvU2kmm5JwHA/HZCUmMOtPQo61QKK+++NnAx10D9ZOO6rC3JxGAl3r/gjsLWhcZty62QS05Jfbq7+SEKW16zNNlXEZ4rHKiMhNzAJs++V6vZKoK6dGgJSg7KEAlRPC4GSvtJNyc2Iw61u9a3fF5nB6vcwN21SruNCb/VpUVnJvsVGq7pm5cLgQn7xUVbU/PT80+J+tQ4Clh7cnk++2iXVDhZEznWEX5ZbkpNUmAnd034DSeCXf87jVc+SUE21g1Xgo46U2wRvCf2RZVwoeyTOgE7pduERHfWlWMXhP+HvIIpZeDsjlFU/Pc+PHjsht0QuZErupn3cLHR9m18/Mfrjy2Y73zWZX7G8ZF9tMd9OyHWGB3sJpvOczBnJLL+07CapLqnKDV/IfqjoyLf5+zDc2b+ZnfMUGnk3BNXvAdqeQNhOrtNPztvFnZHsYA2nphv84/wVPCRfw+1N+anEoY+eO6J+DUe2a9nNzpdar+G0pi+nFUS096lDoPFyMSMveS+4+V6Ef2t9mi6oyXnJbTqQkn9y6l9JbbE2dTTU6/fTRxILqgVTr5Lw5fpMGpJOyEkMuOp83fsv5QnYJF1ud7gv906D6dl4jvYy5SfTCv9zvam2/PEXZYsi7Dr/SWZxuPcxV128a1xjb78mtXdKCT05bh1lp9rn1h0j4TMr8z6BZf+rCj8VfchP7ZTWKb/+smLPt0kymzSvqg97FrzKqlTNdi6/BVkxg/zBlmfVZ3SPfv86jKKRP5LVp2Q9D4X4pI6GJG8qayoVxO6fSJotcz0vsuLnLCxjIVlWgn0OTVGqqk897/dh727S3DohZ6e5tSV5RR4nzbnaqoibwMTBac3i6d7u+Zx9jURW7tR/bWOSE6yuHPpm4OMYaXXixf2R3iSPj9m7fa1pvx/6yIddren2G3ptQOxYfdMmJfFBQMrHOvTmPb9AWe+o4P2EFYRXV+pYiqPcmgRTC6bKlTSfLJuUlLCdLvfU1cydLg/VlOedLv+UVQOeLgsVlkIsbNlxZNBTUJxuujJVn1PvWrh63HQ5qKBU3WSZp7g43mT5qLTs2WS5KFtN6IIiItN8odJVmCYr+s1LQU2WZZJlqCbLpxYlRopl8XElLldbl2FkzJnmDFFW2GKyGKOqBAUYKDnRDwteTJeBaoDYyuNyqMWNWtzCLUK9Noqbn5iaZ+qrTBbfGlVymSy3WpSSmSzPzlaxmSxn2lVSmS7blFRwmRznLiqu3VmNm+nOmtY1dKxJsu6CM+CMrN7QZcGXGuZjzmHOYc51aBnul+/CdMN0w3TrUMVVFJrDnMOcw5xrHPRuWw0RM2//cNaGacM869lzwcjJBku6rztpTpK1F4W2KD+6PSLccf3RixKKyU3avuqwTo6xF+sDdFmWdoJScEHw13WV3gvMSNJb4d4JzozLxcdOaxhPUBIuCxPal3NGVPSiZjyiom8731qU7ZpskEthwbDJ8rBBGa/J8qoFtE+XZ0LO1skiZpPlW4fVUibL024KakyWnSoLdkyWiR2VBpkoPze5cn5bMfr0m/Vukeduu39Zrtjzb2leRePdc/hu9U+hXOxsHLzP+Zjy9czqtE/HyQBvyHKVHS7OssnGqyxDxNGTOkYpJSPn5KnLuClcY7cpCbmBqUmDKZdvQrJ5uQEpy0t5ckyKKMgtPqImbPuO3KImLGrCoibsqGvCVmfEqKrRecWirFv8JitPmiaULevDyS1bbhdVPia2tW7zMqvFHaf32oxEVLlB63LDqbPcDggW3LvmdmcWBuLfLzOunRxN+8bV2UyV9Lbs2xCsfzkqmu9rQELSpqJ5qQHVOgpHmbVzaWAf5LPvKCUj98YqF1ZOUeYO76b0RJnEcPkhTuvfmRoCcm+tuiDJaZolsVuyerp6uWP8Ov6Z/Th7UPviFFPqDAtz4hlS3bFlsk4pKzPDqcDCE43LDUZhDnu5GodNaMiJI6rLo7r82KvLW9Ul5DYRjPyP0DkYuXZarlc3D75NNL6Lcjcod/P2LES5m5OrL9l2kmL1xXyXbqjw+40t/RdJ4yyv0XJ3FcbYXYXJ2XFu6fvgXux8Y/NG29mRbY+3itiRjWl0sOCLo7ujPLq7KVpxem5n6oEbsLsz29qZ2fny6sRWH08v2x8GTwaX7V5V2u2TI1LSPszvYZjf0oKObOLIJi7ZolwIZIpTE5USWm4ds9wKA0ez/87smev1cpU8l/zbc2B0c8fO0fNNZQoL6Qivesq1rmCVRoDgYR0YuVUaaQJTsMTP1pTdZ1a2jJrtEy38+fp9Aa3a7dK8PFkWR5F5eaL9aVvMI/Rqjk7Z1c5PMcuseZtyXR9HjFBt0RO5hdYmNOQWWjs5X3JynbUDaupDnYLnP1qFOoVoIIorsRtA/sBJq90AsuS6U8z7Zr6Q0aemfUlfD4U64fvvyoMqB22izn8rb/ACUz6hLCmCbVhIwEICFhJgTByrwhZRkmI/02VGVlGRVY38IM0G0mxcJBOxdW2MC2ZIstLBSrldtVJu7a6UxzNO4eRGX13LDQWRFce8oe/vw/ALfzxffUqT5xsW1ZuGrdqVmhSWyOJJQepT/Ot+ld7H/60/gNKsQblOi/Pny/NidibE26Q1ue6KWGUFgduUPX4lK1p7arJZe+rX6LckFiRl90LHItu12xXX/71OVoxDClHE9Z325LguEgYtSNyx5+RnxhZ2lZIf9ee+WzWrQMVWUuIz/+FlwR6SMwH4xk3KdVwkHlZQeeBeeHbQL2RXs4TWS3uLVhVsDKgh9DvLj2vKbwwQaVNF5FpIZvQRLgDlOeD8KvPE+Dt4jV7vGia7+/cMAbtkJwi+e/2aYbMhep9pd9o7rM4r1bOvZaL2OpZ7FGSVdEpEMd4tcvf0t02qiYSSVZLu7QfegRP7NMJuvNz73Wa+f4hT3p8k5ZT3PmiQlkaueQXgUkkx2yf6ZZUJVJKKj0hJ+3LbYuqC3vsk7xhdp8ssbUqDl6WWjtxbEyd9z+2QGct4K/7OFLQuN5y62NEBwd07sU097RuXDamYRwiT7uZE/+04f+0u0OinF0LPr9wsP6fJunYfXtuWJZmRCVMtM/hPsv/ymjN7qePr7brWVW2E+SPZcruJfMmVWlBsSGVIHsWG3kCEL273lxLmY85hzmHOiZs0xx5kpUmztSDFzZoGrN9S6eTFHrU+XTltNp6K1wO4BdwCbmHiYM5hzg1xzm0iciImzsf5+lkiaCNR5XPD9YyAQMymXcPTFcz/KXgpgFZAK6AV5gzmHObcEOecxCJU+bPXVa+Tu57zaM1Yc0vgmEU3aHUhxywkZkwOI50u2+4UlVC8bLvX8nTRvNmy7cFrgUECgwQGCZwAzDnMuSHOuWxfqCZh0tymyYKlq5eTps2RM3A0Mc6z/34dlKbzhtz24vzr7oaeHI51OuYJItuFzajMRxSeUcWpa/H55AoV4TshWwWxzZ/zc0k9Lbl51NlYMYeGPoektBIntVyR+el90kezyG+D0Hs09+/Oz6muKcvNsO75YGK+DX2+YTpsYcfwK2Dn8FSKe4gmZt3ZkU257eKujhUyrcjNcrn+TfQM5NQypLYIF0xWQhCgQoAKAap+capRbyeLUDDoYdDDoN85dG4dGfRFh4uEQbz1MM6aObk8XwTdqgurFqM4aIl/9vyczA+ffiKzJdve1kbd1BOTkh2vzlsQpB/PWJbyiT9ZkaKQ0vlxd0tXjgV1noBYV/J0CSz8MhcbezcE5QZdl5NEqg9/JCvRcXdGU2roR4Fm+W48pGvB6a2clpwRXql5TpLfXJ1Pn9GmWakB6NphNqAaDXNEeVelHH74ZXmbxj+5MAm9x377Icmiw7ehsmsJV6d8wgkyqd+eSLJJwvOS7dw6mMVUkEc9dkOSQYfwrKpnf8XLOIhncZZJR4hFvXZEztSWWKQ8pF4sTrbDoX7oy7FEYt+keJdkcKevHsixpQUWnuyUOM70Ql4SXyQO2Yl16dt89pIlOr9epykffzn3RSCm777IyY7y3klCcE8d6A1nyt1VLcG3px5ITiuJGIxMr+Qsv9460dtEqumWBAz30wFJiRGpHyLZqRZQ3H9v5GSog/7JwnFfXZALLlSW9jgXBRA74dW2abl1lM4igJNdmeoyvDhRplZvWCq6uZdG197dsWSN+ozuaA5TTjUrzJAT940kvTJWh+Xjv9K9EYbJXrshtyIoscJx1LHN+YsPL5xCTEWPnHRGst0SeLuDJ8Ki0C3ddkuiYz1nNMEjihyH20BOdReEhbx72nI6vUUxcLnKaCJtSnXdqtsptDXdsj9CLnaj5uScQKTPmW76HORTwdZ5bJ3v9YgPcphiumG69TXdUAYBcw5zrmcVh8pqmG+Yb73NN5wvxPlCrCBtp0PPS0gT3efQ/UrURU2+SQpAHytyk2PsxVqBSA44VdsD6VUn/vZ7W7qeoCRcrjZos4qfW9WXu6racBfAxaWsyxIZbktM6+/obksVWRr13aSvxuVZ+U5lnog7Ng9Zmk0bPoVu4vkPDmSULZdJ+v2KLNnR09pQlyIK7aJ3+0Qf+Nv7/mk9zxv6/iEl//CvrZ95z3MefmXztVT0rkHrcsOplAIBgmxjdma8rB2RGgJyg6o8qnGCJv+ccQHPBeMqm4Y05T+t1Qlq2pcb0mEAoZ7k6pCLf6az2hGpaF5OVVeehzpB8SYh4e1s/VikRFpxwvJHrSSalnszlWmfTlC7TeP5kQ5/v7yJl7UjUkejy3m02gOjTN7PSZ2S9uXErl5n7JPM0nFxshu5qDcTW7Wrfgj5ybPv78PwC388X2UnR29YVD9tWrUr57GJzNCC1Kf41/0qvY//W7/1s1mDXfH9NmULkrL7ZJ1Sdk5DtmtXju8iOFKQ+vc6WTHujJFatjdqT47rIvZDQeKOPSc/M7ZwPUt+sPr52qbZdj7paUpcLh9eFuwhOYObjZuU67gIOhdUspyFD8l1ErKrWULrpb1Fq3LdFzGldwn9zm0z7rrL74sXabOracoR4fErWdEnRdN0pz25LouD2JfnxYy/09oON2hNzrKpjjnkdmB+vbksvcWNO/n76nlW3Baf1xo3qkgo8BPOUhUelIrmJcNDTYIek11oVhieGJ3LOUl5UBXfme6MUhRMmi4D1eBIvs/1aLvsflu5R/1r9f2wif9LyWJRX72obctyWrreXT1DTDR9iToicoZ3pcwd0S0fbO5r303DFqEdZI+ztohdThffFEVJJ8vAFhESfYSGqlr3dLJSpcgTni7/VNooE+Xi/4ov/3b38f2Hrx9PVfTNr41DR634k3kT9bsgzvxQygYyD6MHu219IpT/W3u4Qez3cnJ4ljHTlS1jW2T6RJFXxM5QPxVuOdxyuOUXBUQwvTqBcxSIPi95KBA9veMHSEmAlASjnI8XJAdISfB6SEYvvVrzXbqxeSocXKvlqadLdNlgF2I9Go4vHN+xTk3EK6U0ZXZy9qB4TsqicmV+Ef/Gf1KhOe1KzQnvGN4xvGN4xwOzeaESsISFyAkiJ4icnLMH/1c8pjkn/34iy6dyS4ZrO17osMDSPUoMI7Bt6pLIDw1HI1ZEgvx7/KdxhgdzMvubEvrEFeXfy5flij3//ZO7X/lrif9l/H//+3/5DnPL \ No newline at end of file +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 \ No newline at end of file diff --git a/docs/tech/1.configuration/readme.md b/docs/tech/1.configuration/readme.md index ecbc44f3..286235fc 100644 --- a/docs/tech/1.configuration/readme.md +++ b/docs/tech/1.configuration/readme.md @@ -223,4 +223,4 @@ The inheritance algorithm is as follows: scalar types can be overwritten by each

            -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
            Last modified date: Mon Nov 20 19:18:48 2023 +0300
            Page content update date: Sat Dec 16 2023
            Made with Bumble Documentation Generator
            \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
            Last modified date: Mon Nov 20 19:18:48 2023 +0300
            Page content update date: Mon Dec 18 2023
            Made with Bumble Documentation Generator
            \ No newline at end of file diff --git a/docs/tech/2.parser/entity.md b/docs/tech/2.parser/entity.md index 918afa62..40794529 100644 --- a/docs/tech/2.parser/entity.md +++ b/docs/tech/2.parser/entity.md @@ -144,4 +144,4 @@ These classes are a convenient wrapper for accessing data in templates:

            -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
            Last modified date: Tue Nov 21 16:24:59 2023 +0300
            Page content update date: Sat Dec 16 2023
            Made with Bumble Documentation Generator
            \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
            Last modified date: Tue Nov 21 16:24:59 2023 +0300
            Page content update date: Mon Dec 18 2023
            Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/2.parser/entityFilterCondition.md b/docs/tech/2.parser/entityFilterCondition.md index 684c60f9..43cbb3d0 100644 --- a/docs/tech/2.parser/entityFilterCondition.md +++ b/docs/tech/2.parser/entityFilterCondition.md @@ -78,4 +78,4 @@ Filter condition for working with entities PHP language handler:

            -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
            Last modified date: Mon Nov 20 19:18:48 2023 +0300
            Page content update date: Sat Dec 16 2023
            Made with Bumble Documentation Generator
            \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
            Last modified date: Mon Nov 20 19:18:48 2023 +0300
            Page content update date: Mon Dec 18 2023
            Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/2.parser/readme.md b/docs/tech/2.parser/readme.md index 023eb2b3..adb9471c 100644 --- a/docs/tech/2.parser/readme.md +++ b/docs/tech/2.parser/readme.md @@ -42,4 +42,4 @@ In this section, we show how the parser works and what components it consists of

            -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
            Last modified date: Wed Nov 29 11:54:40 2023 +0300
            Page content update date: Sat Dec 16 2023
            Made with Bumble Documentation Generator
            \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
            Last modified date: Wed Nov 29 11:54:40 2023 +0300
            Page content update date: Mon Dec 18 2023
            Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/2.parser/reflectionApi/php/phpClassConstantReflectionApi.md b/docs/tech/2.parser/reflectionApi/php/phpClassConstantReflectionApi.md index c7d3a732..9ffa3985 100644 --- a/docs/tech/2.parser/reflectionApi/php/phpClassConstantReflectionApi.md +++ b/docs/tech/2.parser/reflectionApi/php/phpClassConstantReflectionApi.md @@ -7,7 +7,7 @@ Class constant reflection entity class: getRootEntityReflections($reflectionApiConfig); +$entitiesCollection = (new \BumbleDocGen\DocGeneratorFactory())->createRootEntitiesCollection($reflectionApiConfig); $classReflection = $entitiesCollection->getLoadedOrCreateNew('SomeClassName'); @@ -62,4 +62,4 @@ $methodReflection = $classReflection->getMethod('methodName'); \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
            Last modified date: Fri Dec 15 21:27:10 2023 +0300
            Page content update date: Mon Dec 18 2023
            Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/2.parser/reflectionApi/php/phpClassPropertyReflectionApi.md b/docs/tech/2.parser/reflectionApi/php/phpClassPropertyReflectionApi.md index 14e2bae5..d4e324e0 100644 --- a/docs/tech/2.parser/reflectionApi/php/phpClassPropertyReflectionApi.md +++ b/docs/tech/2.parser/reflectionApi/php/phpClassPropertyReflectionApi.md @@ -7,7 +7,7 @@ Property reflection entity class: getRootEntityReflections($reflectionApiConfig); +$entitiesCollection = (new \BumbleDocGen\DocGeneratorFactory())->createRootEntitiesCollection($reflectionApiConfig); $classReflection = $entitiesCollection->getLoadedOrCreateNew('SomeClassName'); // or get() ``` @@ -86,4 +86,4 @@ $classReflection = $entitiesCollection->getLoadedOrCreateNew('SomeClassName'); / \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
            Last modified date: Fri Dec 15 21:27:10 2023 +0300
            Page content update date: Mon Dec 18 2023
            Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/2.parser/reflectionApi/php/phpEntitiesCollection.md b/docs/tech/2.parser/reflectionApi/php/phpEntitiesCollection.md index 36284f6c..0c00b48d 100644 --- a/docs/tech/2.parser/reflectionApi/php/phpEntitiesCollection.md +++ b/docs/tech/2.parser/reflectionApi/php/phpEntitiesCollection.md @@ -25,4 +25,4 @@

            -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
            Last modified date: Sat Dec 16 13:54:48 2023 +0300
            Page content update date: Sat Dec 16 2023
            Made with Bumble Documentation Generator
            \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
            Last modified date: Sat Dec 16 13:54:48 2023 +0300
            Page content update date: Mon Dec 18 2023
            Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/2.parser/reflectionApi/php/phpEnumReflectionApi.md b/docs/tech/2.parser/reflectionApi/php/phpEnumReflectionApi.md index d4ecfa05..fa55ca10 100644 --- a/docs/tech/2.parser/reflectionApi/php/phpEnumReflectionApi.md +++ b/docs/tech/2.parser/reflectionApi/php/phpEnumReflectionApi.md @@ -11,7 +11,7 @@ PHP enum reflection getRootEntityReflections($reflectionApiConfig); +$entitiesCollection = (new \BumbleDocGen\DocGeneratorFactory())->createRootEntitiesCollection($reflectionApiConfig); $interfaceReflection = $entitiesCollection->getLoadedOrCreateNew('SomeInterfaceName'); // or get() ``` @@ -82,4 +82,4 @@ $interfaceReflection = $entitiesCollection->getLoadedOrCreateNew('SomeInterfaceN \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
            Last modified date: Fri Dec 15 21:27:10 2023 +0300
            Page content update date: Mon Dec 18 2023
            Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/2.parser/reflectionApi/php/phpTraitReflectionApi.md b/docs/tech/2.parser/reflectionApi/php/phpTraitReflectionApi.md index 159f7722..9703ff42 100644 --- a/docs/tech/2.parser/reflectionApi/php/phpTraitReflectionApi.md +++ b/docs/tech/2.parser/reflectionApi/php/phpTraitReflectionApi.md @@ -11,7 +11,7 @@ PHP trait reflection getRootEntityReflections($reflectionApiConfig); +$entitiesCollection = (new \BumbleDocGen\DocGeneratorFactory())->createRootEntitiesCollection($reflectionApiConfig); // Fill the collection with entities $entitiesCollection->loadEntities( @@ -71,7 +72,7 @@ PHP classes contain methods, properties and constants. Below is information abou **Usage example:** ```php -$entitiesCollection = (new \BumbleDocGen\DocGeneratorFactory())->getRootEntityReflections($reflectionApiConfig); +$entitiesCollection = (new \BumbleDocGen\DocGeneratorFactory())->createRootEntitiesCollection($reflectionApiConfig); $classReflection = $entitiesCollection->getLoadedOrCreateNew('SomeClassName'); @@ -87,4 +88,4 @@ $firstMethodReturnValue = $methodReflection->getFirstReturnValue(); \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
            Last modified date: Sat Dec 16 13:54:48 2023 +0300
            Page content update date: Mon Dec 18 2023
            Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/2.parser/reflectionApi/readme.md b/docs/tech/2.parser/reflectionApi/readme.md index 3bc182fd..ad4b502b 100644 --- a/docs/tech/2.parser/reflectionApi/readme.md +++ b/docs/tech/2.parser/reflectionApi/readme.md @@ -16,7 +16,7 @@ You can use the Reflection API both in documentation templates and simply in you $reflectionApiConfig = PhpReflectionApiConfig::create(); /** @var PhpEntitiesCollection $entitiesCollection*/ - $entitiesCollection = (new BumbleDocGenDocGeneratorFactory())->getRootEntityReflections($reflectionApiConfig); + $entitiesCollection = (new BumbleDocGenDocGeneratorFactory())->createRootEntitiesCollection($reflectionApiConfig); // By default the collection is empty. You can populate the collection with data $entitiesCollection->loadEntities( @@ -58,4 +58,4 @@ In addition, createConfiguration
          60. - getRootEntityReflections + createRootEntitiesCollection
          61. setCustomConfigurationParameters @@ -254,13 +254,13 @@ public function createConfiguration(string ...$configurationFiles): \BumbleDocGe
              -
            • # - getRootEntityReflections +
            • # + createRootEntitiesCollection | source code
            ```php -public function getRootEntityReflections(\BumbleDocGen\Core\Configuration\ReflectionApiConfig $reflectionApiConfig): \BumbleDocGen\Core\Parser\Entity\RootEntityCollection; +public function createRootEntitiesCollection(\BumbleDocGen\Core\Configuration\ReflectionApiConfig $reflectionApiConfig): \BumbleDocGen\Core\Parser\Entity\RootEntityCollection; ``` diff --git a/docs/tech/map.md b/docs/tech/map.md index 77995d8b..f88be538 100644 --- a/docs/tech/map.md +++ b/docs/tech/map.md @@ -266,4 +266,4 @@ Directory layout ( only documented files shown ):

            -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
            Last modified date: Mon Nov 20 19:18:48 2023 +0300
            Page content update date: Sat Dec 16 2023
            Made with Bumble Documentation Generator
            \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
            Last modified date: Mon Nov 20 19:18:48 2023 +0300
            Page content update date: Mon Dec 18 2023
            Made with Bumble Documentation Generator
            \ No newline at end of file diff --git a/docs/tech/readme.md b/docs/tech/readme.md index 16068711..100cbab8 100644 --- a/docs/tech/readme.md +++ b/docs/tech/readme.md @@ -44,4 +44,4 @@ After that, the process of parsing the project code according to the configurati

            -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
            Last modified date: Thu Oct 5 17:42:06 2023 +0300
            Page content update date: Sat Dec 16 2023
            Made with Bumble Documentation Generator
            \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
            Last modified date: Thu Oct 5 17:42:06 2023 +0300
            Page content update date: Mon Dec 18 2023
            Made with Bumble Documentation Generator \ No newline at end of file diff --git a/selfdoc/templates/tech/2.parser/reflectionApi/php/phpClassConstantReflectionApi.md.twig b/selfdoc/templates/tech/2.parser/reflectionApi/php/phpClassConstantReflectionApi.md.twig index d9797766..1a5f1889 100644 --- a/selfdoc/templates/tech/2.parser/reflectionApi/php/phpClassConstantReflectionApi.md.twig +++ b/selfdoc/templates/tech/2.parser/reflectionApi/php/phpClassConstantReflectionApi.md.twig @@ -9,7 +9,7 @@ Class constant reflection entity class: [a]ClassConstantEntity[/a]. **Example of creating class constant reflection:** ```php -$entitiesCollection = (new \BumbleDocGen\DocGeneratorFactory())->getRootEntityReflections($reflectionApiConfig); +$entitiesCollection = (new \BumbleDocGen\DocGeneratorFactory())->createRootEntitiesCollection($reflectionApiConfig); $classReflection = $entitiesCollection->getLoadedOrCreateNew('SomeClassName'); diff --git a/selfdoc/templates/tech/2.parser/reflectionApi/php/phpClassMethodReflectionApi.md.twig b/selfdoc/templates/tech/2.parser/reflectionApi/php/phpClassMethodReflectionApi.md.twig index e5e91bb1..77da781a 100644 --- a/selfdoc/templates/tech/2.parser/reflectionApi/php/phpClassMethodReflectionApi.md.twig +++ b/selfdoc/templates/tech/2.parser/reflectionApi/php/phpClassMethodReflectionApi.md.twig @@ -9,7 +9,7 @@ Method reflection entity class: [a]MethodEntity[/a]. **Example of creating class method reflection:** ```php -$entitiesCollection = (new \BumbleDocGen\DocGeneratorFactory())->getRootEntityReflections($reflectionApiConfig); +$entitiesCollection = (new \BumbleDocGen\DocGeneratorFactory())->createRootEntitiesCollection($reflectionApiConfig); $classReflection = $entitiesCollection->getLoadedOrCreateNew('SomeClassName'); diff --git a/selfdoc/templates/tech/2.parser/reflectionApi/php/phpClassPropertyReflectionApi.md.twig b/selfdoc/templates/tech/2.parser/reflectionApi/php/phpClassPropertyReflectionApi.md.twig index 5422a661..9958dae4 100644 --- a/selfdoc/templates/tech/2.parser/reflectionApi/php/phpClassPropertyReflectionApi.md.twig +++ b/selfdoc/templates/tech/2.parser/reflectionApi/php/phpClassPropertyReflectionApi.md.twig @@ -9,7 +9,7 @@ Property reflection entity class: [a]PropertyEntity[/a]. **Example of creating class property reflection:** ```php -$entitiesCollection = (new \BumbleDocGen\DocGeneratorFactory())->getRootEntityReflections($reflectionApiConfig); +$entitiesCollection = (new \BumbleDocGen\DocGeneratorFactory())->createRootEntitiesCollection($reflectionApiConfig); $classReflection = $entitiesCollection->getLoadedOrCreateNew('SomeClassName'); diff --git a/selfdoc/templates/tech/2.parser/reflectionApi/php/phpClassReflectionApi.md.twig b/selfdoc/templates/tech/2.parser/reflectionApi/php/phpClassReflectionApi.md.twig index c5234b9c..7b8b7a93 100644 --- a/selfdoc/templates/tech/2.parser/reflectionApi/php/phpClassReflectionApi.md.twig +++ b/selfdoc/templates/tech/2.parser/reflectionApi/php/phpClassReflectionApi.md.twig @@ -15,7 +15,7 @@ PHP class reflection [a]ClassEntity[/a] inherits from [a]ClassLikeEntity[/a]. **Example of creating class reflection:** ```php -$entitiesCollection = (new \BumbleDocGen\DocGeneratorFactory())->getRootEntityReflections($reflectionApiConfig); +$entitiesCollection = (new \BumbleDocGen\DocGeneratorFactory())->createRootEntitiesCollection($reflectionApiConfig); $classReflection = $entitiesCollection->getLoadedOrCreateNew('SomeClassName'); // or get() ``` diff --git a/selfdoc/templates/tech/2.parser/reflectionApi/php/phpEnumReflectionApi.md.twig b/selfdoc/templates/tech/2.parser/reflectionApi/php/phpEnumReflectionApi.md.twig index f4fec3e4..b57f914b 100644 --- a/selfdoc/templates/tech/2.parser/reflectionApi/php/phpEnumReflectionApi.md.twig +++ b/selfdoc/templates/tech/2.parser/reflectionApi/php/phpEnumReflectionApi.md.twig @@ -13,7 +13,7 @@ PHP enum reflection [a]EnumEntity[/a] inherits from [a]ClassLikeEntity[/a]. **Example of creating enum reflection:** ```php -$entitiesCollection = (new \BumbleDocGen\DocGeneratorFactory())->getRootEntityReflections($reflectionApiConfig); +$entitiesCollection = (new \BumbleDocGen\DocGeneratorFactory())->createRootEntitiesCollection($reflectionApiConfig); $enumReflection = $entitiesCollection->getLoadedOrCreateNew('SomeEnumName'); // or get() ``` diff --git a/selfdoc/templates/tech/2.parser/reflectionApi/php/phpInterfaceReflectionApi.md.twig b/selfdoc/templates/tech/2.parser/reflectionApi/php/phpInterfaceReflectionApi.md.twig index 5729e999..7a5b915b 100644 --- a/selfdoc/templates/tech/2.parser/reflectionApi/php/phpInterfaceReflectionApi.md.twig +++ b/selfdoc/templates/tech/2.parser/reflectionApi/php/phpInterfaceReflectionApi.md.twig @@ -13,7 +13,7 @@ PHP interface reflection [a]InterfaceEntity[/a] inherits from [a]ClassLikeEntity **Example of creating interface reflection:** ```php -$entitiesCollection = (new \BumbleDocGen\DocGeneratorFactory())->getRootEntityReflections($reflectionApiConfig); +$entitiesCollection = (new \BumbleDocGen\DocGeneratorFactory())->createRootEntitiesCollection($reflectionApiConfig); $interfaceReflection = $entitiesCollection->getLoadedOrCreateNew('SomeInterfaceName'); // or get() ``` diff --git a/selfdoc/templates/tech/2.parser/reflectionApi/php/phpTraitReflectionApi.md.twig b/selfdoc/templates/tech/2.parser/reflectionApi/php/phpTraitReflectionApi.md.twig index d7b2631e..b0580dd3 100644 --- a/selfdoc/templates/tech/2.parser/reflectionApi/php/phpTraitReflectionApi.md.twig +++ b/selfdoc/templates/tech/2.parser/reflectionApi/php/phpTraitReflectionApi.md.twig @@ -13,7 +13,7 @@ PHP trait reflection [a]TraitEntity[/a] inherits from [a]ClassLikeEntity[/a]. **Example of creating trait reflection:** ```php -$entitiesCollection = (new \BumbleDocGen\DocGeneratorFactory())->getRootEntityReflections($reflectionApiConfig); +$entitiesCollection = (new \BumbleDocGen\DocGeneratorFactory())->createRootEntitiesCollection($reflectionApiConfig); $traitReflection = $entitiesCollection->getLoadedOrCreateNew('SomeTraitName'); // or get() ``` diff --git a/selfdoc/templates/tech/2.parser/reflectionApi/php/readme.md.twig b/selfdoc/templates/tech/2.parser/reflectionApi/php/readme.md.twig index 52400fe5..b3e251d4 100644 --- a/selfdoc/templates/tech/2.parser/reflectionApi/php/readme.md.twig +++ b/selfdoc/templates/tech/2.parser/reflectionApi/php/readme.md.twig @@ -19,9 +19,10 @@ Below is information about the available methods for working with each entity ty **Usage example:** ```php -$entitiesCollection = (new \BumbleDocGen\DocGeneratorFactory())->getRootEntityReflections($reflectionApiConfig); +$entitiesCollection = (new \BumbleDocGen\DocGeneratorFactory())->createRootEntitiesCollection($reflectionApiConfig); -$classReflection = $entitiesCollection->getLoadedOrCreateNew('SomeClassName'); // or get() +// In this example, the collection is empty, so we use a method that will create an entity by its name +$classReflection = $entitiesCollection->getLoadedOrCreateNew('SomeClassName'); $entityName = $classReflection->getName(); $entityDescription = $classReflection->getDescription(); @@ -42,7 +43,7 @@ The collections API is presented on this page: [a]PHP entities collection[/a] ```php // Create an empty collection -$entitiesCollection = (new \BumbleDocGen\DocGeneratorFactory())->getRootEntityReflections($reflectionApiConfig); +$entitiesCollection = (new \BumbleDocGen\DocGeneratorFactory())->createRootEntitiesCollection($reflectionApiConfig); // Fill the collection with entities $entitiesCollection->loadEntities( @@ -72,7 +73,7 @@ PHP classes contain methods, properties and constants. Below is information abou **Usage example:** ```php -$entitiesCollection = (new \BumbleDocGen\DocGeneratorFactory())->getRootEntityReflections($reflectionApiConfig); +$entitiesCollection = (new \BumbleDocGen\DocGeneratorFactory())->createRootEntitiesCollection($reflectionApiConfig); $classReflection = $entitiesCollection->getLoadedOrCreateNew('SomeClassName'); diff --git a/selfdoc/templates/tech/2.parser/reflectionApi/readme.md.twig b/selfdoc/templates/tech/2.parser/reflectionApi/readme.md.twig index 795b2da0..43981a01 100644 --- a/selfdoc/templates/tech/2.parser/reflectionApi/readme.md.twig +++ b/selfdoc/templates/tech/2.parser/reflectionApi/readme.md.twig @@ -16,7 +16,7 @@ You can use the Reflection API both in documentation templates and simply in you $reflectionApiConfig = PhpReflectionApiConfig::create(); /** @var PhpEntitiesCollection $entitiesCollection*/ -$entitiesCollection = (new \BumbleDocGen\DocGeneratorFactory())->getRootEntityReflections($reflectionApiConfig); +$entitiesCollection = (new \BumbleDocGen\DocGeneratorFactory())->createRootEntitiesCollection($reflectionApiConfig); // By default the collection is empty. You can populate the collection with data $entitiesCollection->loadEntities( diff --git a/src/DocGeneratorFactory.php b/src/DocGeneratorFactory.php index 28243085..953af042 100644 --- a/src/DocGeneratorFactory.php +++ b/src/DocGeneratorFactory.php @@ -108,7 +108,7 @@ public function createConfiguration(string ...$configurationFiles): Configuratio * @throws NotFoundException * @throws \Exception */ - public function getRootEntityReflections(ReflectionApiConfig $reflectionApiConfig): RootEntityCollection + public function createRootEntitiesCollection(ReflectionApiConfig $reflectionApiConfig): RootEntityCollection { $diContainer = $this->buildDiContainer(); $logger = $diContainer->get(LoggerInterface::class); @@ -116,13 +116,17 @@ public function getRootEntityReflections(ReflectionApiConfig $reflectionApiConfi /** @var ConfigurationParameterBag $configurationParameterBag */ $configurationParameterBag = $diContainer->get(ConfigurationParameterBag::class); $configurationParameterBag->loadFromArray($reflectionApiConfig->toConfigArray()); - return $diContainer->get(ProjectParser::class)->getEntityCollectionForPL( + $entitiesCollection = $diContainer->get(ProjectParser::class)->getEntityCollectionForPL( $reflectionApiConfig->getLanguageHandlerClassName() ); } catch (\Exception $e) { $logger->error("{$e->getMessage()} ( {$e->getFile()}:{$e->getLine()} )"); throw new \RuntimeException($e->getMessage()); } + if (!$entitiesCollection) { + throw new \InvalidArgumentException('The collection could not be created'); + } + return $entitiesCollection; } /** From e4d5b3b6d84eab2e0742de95d09129b099ad6033 Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Mon, 18 Dec 2023 15:41:43 +0300 Subject: [PATCH 142/210] Fixing endpoints API documentation --- docs/README.md | 14 +++++++------- docs/classes/DocGenerator.md | 14 +++++++------- docs/classes/DocGeneratorFactory.md | 24 ++++++++++++------------ docs/shared_c.cache | 2 +- docs/tech/classes/DocGenerator.md | 14 +++++++------- docs/tech/classes/DocGeneratorFactory.md | 24 ++++++++++++------------ selfdoc/templates/README.md.twig | 9 ++------- src/DocGenerator.php | 10 +++++++++- src/DocGeneratorFactory.php | 16 ++++++++++++++++ 9 files changed, 73 insertions(+), 54 deletions(-) diff --git a/docs/README.md b/docs/README.md index 21080c2d..69b24a5a 100644 --- a/docs/README.md +++ b/docs/README.md @@ -36,16 +36,16 @@ BumbleDocGen's interface consists of mainly two classes: DocGenerator provides main operations for generating the documents. - - `addMissingDocBlocks()`: This method creates missing docBlocks in your code. - - `fillInReadmeMdTemplate()`: This method prepares the `README.md` file using a predefined template. - - `generate()`: This method produces all necessary documentation. - - `generateProjectTemplatesStructure()`: This method creates a structure for project templates. - - `parseAndGetRootEntityCollectionsGroup()`: This method parses your project's files and collects information for the documentation. + - [addDocBlocks()](/docs/classes/DocGenerator.md#madddocblocks): Generate missing docBlocks with LLM for project class methods that are available for documentation + - [generate()](/docs/classes/DocGenerator.md#mgenerate): Generates documentation using configuration + - [generateReadmeTemplate()](/docs/classes/DocGenerator.md#mgeneratereadmetemplate): Creates a `README.md` template filled with basic information using LLM - DocGeneratorFactory provides a method for creating `DocGenerator` instance. - - `create(configurationFiles: string)`: This method creates a `DocGenerator` instance using provided configuration files. - - `setCustomConfigurationParameters(customConfigurationParameters: array)`: This method sets custom configuration parameters for the `DocGenerator` creation. + - [create()](/docs/classes/DocGeneratorFactory.md#mcreate): Creates a documentation generator instance using configuration files + - [createByConfigArray()](/docs/classes/DocGeneratorFactory.md#mcreatebyconfigarray): Creates a documentation generator instance using an array containing the configuration + - [createConfiguration()](/docs/classes/DocGeneratorFactory.md#mcreateconfiguration): Creating a project configuration instance + - [createRootEntitiesCollection()](/docs/classes/DocGeneratorFactory.md#mcreaterootentitiescollection): Creating a collection of entities (see `ReflectionAPI`)

            Examples of usage

            diff --git a/docs/classes/DocGenerator.md b/docs/classes/DocGenerator.md index 83af3f1f..e8b13655 100644 --- a/docs/classes/DocGenerator.md +++ b/docs/classes/DocGenerator.md @@ -35,13 +35,13 @@ final class DocGenerator
            1. addDocBlocks - - Generate missing docBlocks with ChatGPT for project class methods that are available for documentation
            2. + - Generate missing docBlocks with LLM for project class methods that are available for documentation
            3. generate - Generates documentation using configuration
            4. generateReadmeTemplate -
            5. + - Creates a `README.md` template filled with basic information using LLM
            6. parseAndGetRootEntityCollectionsGroup
            7. @@ -166,14 +166,14 @@ public function __construct(\Symfony\Component\Console\Style\OutputStyle $io, \B ```php public function addDocBlocks(\BumbleDocGen\AI\ProviderInterface $aiProvider): void; ``` -
              Generate missing docBlocks with ChatGPT for project class methods that are available for documentation
              +
              Generate missing docBlocks with LLM for project class methods that are available for documentation
              Parameters: @@ -220,7 +220,7 @@ public function addDocBlocks(\BumbleDocGen\AI\ProviderInterface $aiProvider): vo ```php @@ -251,14 +251,14 @@ public function generate(): void; ```php public function generateReadmeTemplate(\BumbleDocGen\AI\ProviderInterface $aiProvider): void; ``` - +
              Creates a `README.md` template filled with basic information using LLM
              Parameters: diff --git a/docs/classes/DocGeneratorFactory.md b/docs/classes/DocGeneratorFactory.md index 565ce7c2..9851c4ab 100644 --- a/docs/classes/DocGeneratorFactory.md +++ b/docs/classes/DocGeneratorFactory.md @@ -35,16 +35,16 @@ final class DocGeneratorFactory
              1. create -
              2. + - Creates a documentation generator instance using configuration files
              3. createByConfigArray -
              4. + - Creates a documentation generator instance using an array containing the configuration
              5. createConfiguration -
              6. + - Creating a project configuration instance
              7. createRootEntitiesCollection -
              8. + - Creating a collection of entities (see `ReflectionAPI`)
              9. setCustomConfigurationParameters
              10. @@ -103,14 +103,14 @@ public function __construct(string $diConfig = __DIR__ . '/di-config.php'); ```php public function create(string|null ...$configurationFiles): \BumbleDocGen\DocGenerator; ``` - +
                Creates a documentation generator instance using configuration files
                Parameters: @@ -154,14 +154,14 @@ public function create(string|null ...$configurationFiles): \BumbleDocGen\DocGen ```php public function createByConfigArray(array $config): \BumbleDocGen\DocGenerator; ``` - +
                Creates a documentation generator instance using an array containing the configuration
                Parameters: @@ -205,14 +205,14 @@ public function createByConfigArray(array $config): \BumbleDocGen\DocGenerator; ```php public function createConfiguration(string ...$configurationFiles): \BumbleDocGen\Core\Configuration\Configuration; ``` - +
                Creating a project configuration instance
                Parameters: @@ -256,14 +256,14 @@ public function createConfiguration(string ...$configurationFiles): \BumbleDocGe ```php public function createRootEntitiesCollection(\BumbleDocGen\Core\Configuration\ReflectionApiConfig $reflectionApiConfig): \BumbleDocGen\Core\Parser\Entity\RootEntityCollection; ``` - +
                Creating a collection of entities (see `ReflectionAPI`)
                Parameters: diff --git a/docs/shared_c.cache b/docs/shared_c.cache index 1b72931a..cc50e92d 100644 --- a/docs/shared_c.cache +++ b/docs/shared_c.cache @@ -1 +1 @@ -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 \ No newline at end of file +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 \ No newline at end of file diff --git a/docs/tech/classes/DocGenerator.md b/docs/tech/classes/DocGenerator.md index cb7bfb48..4839f9e4 100644 --- a/docs/tech/classes/DocGenerator.md +++ b/docs/tech/classes/DocGenerator.md @@ -35,13 +35,13 @@ final class DocGenerator
                1. addDocBlocks - - Generate missing docBlocks with ChatGPT for project class methods that are available for documentation
                2. + - Generate missing docBlocks with LLM for project class methods that are available for documentation
                3. generate - Generates documentation using configuration
                4. generateReadmeTemplate -
                5. + - Creates a `README.md` template filled with basic information using LLM
                6. parseAndGetRootEntityCollectionsGroup
                7. @@ -166,14 +166,14 @@ public function __construct(\Symfony\Component\Console\Style\OutputStyle $io, \B ```php public function addDocBlocks(\BumbleDocGen\AI\ProviderInterface $aiProvider): void; ``` -
                  Generate missing docBlocks with ChatGPT for project class methods that are available for documentation
                  +
                  Generate missing docBlocks with LLM for project class methods that are available for documentation
                  Parameters: @@ -220,7 +220,7 @@ public function addDocBlocks(\BumbleDocGen\AI\ProviderInterface $aiProvider): vo ```php @@ -251,14 +251,14 @@ public function generate(): void; ```php public function generateReadmeTemplate(\BumbleDocGen\AI\ProviderInterface $aiProvider): void; ``` - +
                  Creates a `README.md` template filled with basic information using LLM
                  Parameters: diff --git a/docs/tech/classes/DocGeneratorFactory.md b/docs/tech/classes/DocGeneratorFactory.md index e5d6e93c..306a6720 100644 --- a/docs/tech/classes/DocGeneratorFactory.md +++ b/docs/tech/classes/DocGeneratorFactory.md @@ -35,16 +35,16 @@ final class DocGeneratorFactory
                  1. create -
                  2. + - Creates a documentation generator instance using configuration files
                  3. createByConfigArray -
                  4. + - Creates a documentation generator instance using an array containing the configuration
                  5. createConfiguration -
                  6. + - Creating a project configuration instance
                  7. createRootEntitiesCollection -
                  8. + - Creating a collection of entities (see `ReflectionAPI`)
                  9. setCustomConfigurationParameters
                  10. @@ -103,14 +103,14 @@ public function __construct(string $diConfig = __DIR__ . '/di-config.php'); ```php public function create(string|null ...$configurationFiles): \BumbleDocGen\DocGenerator; ``` - +
                    Creates a documentation generator instance using configuration files
                    Parameters: @@ -154,14 +154,14 @@ public function create(string|null ...$configurationFiles): \BumbleDocGen\DocGen ```php public function createByConfigArray(array $config): \BumbleDocGen\DocGenerator; ``` - +
                    Creates a documentation generator instance using an array containing the configuration
                    Parameters: @@ -205,14 +205,14 @@ public function createByConfigArray(array $config): \BumbleDocGen\DocGenerator; ```php public function createConfiguration(string ...$configurationFiles): \BumbleDocGen\Core\Configuration\Configuration; ``` - +
                    Creating a project configuration instance
                    Parameters: @@ -256,14 +256,14 @@ public function createConfiguration(string ...$configurationFiles): \BumbleDocGe ```php public function createRootEntitiesCollection(\BumbleDocGen\Core\Configuration\ReflectionApiConfig $reflectionApiConfig): \BumbleDocGen\Core\Parser\Entity\RootEntityCollection; ``` - +
                    Creating a collection of entities (see `ReflectionAPI`)
                    Parameters: diff --git a/selfdoc/templates/README.md.twig b/selfdoc/templates/README.md.twig index 24153aa8..2d6c079b 100644 --- a/selfdoc/templates/README.md.twig +++ b/selfdoc/templates/README.md.twig @@ -34,16 +34,11 @@ BumbleDocGen's interface consists of mainly two classes: [a]DocGenerator[/a] and - [a]DocGenerator[/a] provides main operations for generating the documents. - - `addMissingDocBlocks()`: This method creates missing docBlocks in your code. - - `fillInReadmeMdTemplate()`: This method prepares the `README.md` file using a predefined template. - - `generate()`: This method produces all necessary documentation. - - `generateProjectTemplatesStructure()`: This method creates a structure for project templates. - - `parseAndGetRootEntityCollectionsGroup()`: This method parses your project's files and collects information for the documentation. +{{ displayClassApiMethods('\\BumbleDocGen\\DocGenerator') | addIndentFromLeft}} - [a]DocGeneratorFactory[/a] provides a method for creating `DocGenerator` instance. - - `create(configurationFiles: string)`: This method creates a `DocGenerator` instance using provided configuration files. - - `setCustomConfigurationParameters(customConfigurationParameters: array)`: This method sets custom configuration parameters for the `DocGenerator` creation. +{{ displayClassApiMethods('\\BumbleDocGen\\DocGeneratorFactory') | addIndentFromLeft }} {{ "Examples of usage" | textToHeading('H3') }} diff --git a/src/DocGenerator.php b/src/DocGenerator.php index 8f4daa96..b41feddf 100644 --- a/src/DocGenerator.php +++ b/src/DocGenerator.php @@ -77,7 +77,9 @@ public function parseAndGetRootEntityCollectionsGroup(): RootEntityCollectionsGr } /** - * Generate missing docBlocks with ChatGPT for project class methods that are available for documentation + * Generate missing docBlocks with LLM for project class methods that are available for documentation + * + * @api * * @throws NotFoundException * @throws DependencyException @@ -160,6 +162,10 @@ public function addDocBlocks( } /** + * Creates a `README.md` template filled with basic information using LLM + * + * @api + * * @throws DependencyException * @throws NotFoundException * @throws InvalidConfigurationParameterException @@ -246,6 +252,8 @@ public function generateReadmeTemplate( /** * Generates documentation using configuration * + * @api + * * @throws InvalidArgumentException * @throws Exception */ diff --git a/src/DocGeneratorFactory.php b/src/DocGeneratorFactory.php index 953af042..c937a05b 100644 --- a/src/DocGeneratorFactory.php +++ b/src/DocGeneratorFactory.php @@ -41,6 +41,10 @@ public function setCustomDiDefinitions(array $definitions): void } /** + * Creates a documentation generator instance using configuration files + * + * @api + * * @throws DependencyException * @throws NotFoundException * @throws \Exception @@ -62,6 +66,10 @@ public function create(?string ...$configurationFiles): DocGenerator } /** + * Creates a documentation generator instance using an array containing the configuration + * + * @api + * * @throws DependencyException * @throws NotFoundException * @throws \Exception @@ -83,6 +91,10 @@ public function createByConfigArray(array $config): DocGenerator } /** + * Creating a project configuration instance + * + * @api + * * @throws DependencyException * @throws NotFoundException * @throws \Exception @@ -104,6 +116,10 @@ public function createConfiguration(string ...$configurationFiles): Configuratio } /** + * Creating a collection of entities (see `ReflectionAPI`) + * + * @api + * * @throws DependencyException * @throws NotFoundException * @throws \Exception From c32172516c860b885f0a19753959633eb6f1147b Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Tue, 19 Dec 2023 15:59:46 +0300 Subject: [PATCH 143/210] Updating UPGRADE info --- UPGRADE.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/UPGRADE.md b/UPGRADE.md index a23f1d63..8c511b03 100644 --- a/UPGRADE.md +++ b/UPGRADE.md @@ -4,6 +4,7 @@ This document serves as a reference for updating your current version of the Bum ## Upgrading from BumbleDocGen 1.6.0 to 2.0.0 +* Changes when working with templates: variable `phpClassEntityCollection` renamed to `phpEntities` * The BetterReflection library and classes that depend on it in the code have been removed: * `\BumbleDocGen\Core\Cache\SourceLocatorCacheItemPool` * `\BumbleDocGen\Core\Plugin\Event\Parser\OnLoadSourceLocatorsCollection` @@ -26,3 +27,7 @@ This document serves as a reference for updating your current version of the Bum * Method `\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity::getInterfacesString()` has been removed. * Now documentation for built classes does not load automatically * Removed the `async_source_loading_enabled` configuration option (Method `\BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings::asyncSourceLoadingEnabled()`) +* Class `\BumbleDocGen\LanguageHandler\Php\Plugin\Event\Entity\AfterLoadingClassEntityCollection` has been removed. Use `\BumbleDocGen\LanguageHandler\Php\Plugin\Event\Entity\AfterLoadingPhpEntitiesCollection` +* Class `\BumbleDocGen\LanguageHandler\Php\Plugin\Event\Entity\OnCheckIsClassEntityCanBeLoad` has been removed. Use `\BumbleDocGen\LanguageHandler\Php\Plugin\Event\Entity\OnCheckIsEntityCanBeLoaded` +* ⚠️**PHP ReflectionAPI has been completely changed. See information about the current version here:** [ReflectionAPI](https://github.com/bumble-tech/bumble-doc-gen/tree/master/docs/tech/2.parser/reflectionApi) +* Method `\BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings::getComposerInstalledFile()` renamed to `\BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings::getComposerVendorDir()` From cb8049bc184cadd45f9e4279c41eab44178504b7 Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Tue, 19 Dec 2023 16:02:04 +0300 Subject: [PATCH 144/210] Using call_user_func instead of call_user_func_array --- src/LanguageHandler/Php/Parser/Entity/BaseEntity.php | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/src/LanguageHandler/Php/Parser/Entity/BaseEntity.php b/src/LanguageHandler/Php/Parser/Entity/BaseEntity.php index 12669bc2..5b36e6fd 100644 --- a/src/LanguageHandler/Php/Parser/Entity/BaseEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/BaseEntity.php @@ -527,13 +527,11 @@ private function getPreparedDocBlockLinks(array $docBlockLinks): array } if ($entityData['entityName']) { - $url = call_user_func_array( - callback: $this->documentedEntityUrlFunction, - args: [ - $this->getRootEntityCollection(), - $entityData['entityName'], - $entityData['cursor'] - ] + $url = call_user_func( + $this->documentedEntityUrlFunction, + $this->getRootEntityCollection(), + $entityData['entityName'], + $entityData['cursor'] ); } else { $preloadResourceLink = $this->rendererHelper->getPreloadResourceLink($data->className); From 373eeba038aa20e82cf62ab632454676695d731d Mon Sep 17 00:00:00 2001 From: Filipp Shcherbanich Date: Tue, 19 Dec 2023 16:03:23 +0300 Subject: [PATCH 145/210] Update src/Core/Parser/Entity/CollectionLogOperation/OperationsCollection.php MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Seán McNamara --- .../Entity/CollectionLogOperation/OperationsCollection.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Core/Parser/Entity/CollectionLogOperation/OperationsCollection.php b/src/Core/Parser/Entity/CollectionLogOperation/OperationsCollection.php index e222ef16..37625997 100644 --- a/src/Core/Parser/Entity/CollectionLogOperation/OperationsCollection.php +++ b/src/Core/Parser/Entity/CollectionLogOperation/OperationsCollection.php @@ -98,7 +98,8 @@ private function checkIsFoundEntitiesCacheOutdatedRecursive( $entityName = $entityName && $entity?->isEntityDataCanBeLoaded() ? $entityName : null; if ($operation->getEntityName() !== $entityName) { return true; - } elseif ($entity?->isEntityCacheOutdated() && $entity?->isEntityDataCanBeLoaded()) { + } + if ($entity?->isEntityCacheOutdated() && $entity?->isEntityDataCanBeLoaded()) { return true; } } elseif ($operation instanceof IterateEntitiesOperation) { From 37ac5edab2be4e26fa36ae22b78d30c4a787595c Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Tue, 19 Dec 2023 16:04:46 +0300 Subject: [PATCH 146/210] Fixing Null pointer errors --- src/LanguageHandler/Php/Parser/Entity/ClassLikeEntity.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/LanguageHandler/Php/Parser/Entity/ClassLikeEntity.php b/src/LanguageHandler/Php/Parser/Entity/ClassLikeEntity.php index 20b2edcb..d8f2de0c 100644 --- a/src/LanguageHandler/Php/Parser/Entity/ClassLikeEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/ClassLikeEntity.php @@ -828,7 +828,7 @@ public function getConstant(string $constantName, bool $unsafe = false): ?ClassC */ public function getConstantValue(string $constantName): string|array|int|bool|null|float { - return $this->getConstant($constantName, true)->getValue(); + return $this->getConstant($constantName, true)?->getValue(); } /** @@ -1026,7 +1026,7 @@ public function getProperty(string $propertyName, bool $unsafe = false): ?Proper */ public function getPropertyDefaultValue(string $propertyName): string|array|int|bool|null|float { - return $this->getProperty($propertyName, true)->getDefaultValue(); + return $this->getProperty($propertyName, true)?->getDefaultValue(); } /** From ff37569b89932e94ffee7c25d288b720b344fe92 Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Tue, 19 Dec 2023 16:15:12 +0300 Subject: [PATCH 147/210] Adding more examples; Updating doc --- docs/shared_c.cache | 2 +- .../2.parser/classes/ClassConstantEntity.md | 18 +++++++++--------- .../2.parser/classes/ClassConstantEntity_2.md | 18 +++++++++--------- docs/tech/2.parser/classes/ClassEntity.md | 18 +++++++++--------- docs/tech/2.parser/classes/ClassLikeEntity.md | 18 +++++++++--------- docs/tech/2.parser/classes/EnumEntity.md | 18 +++++++++--------- docs/tech/2.parser/classes/InterfaceEntity.md | 18 +++++++++--------- docs/tech/2.parser/classes/MethodEntity.md | 18 +++++++++--------- docs/tech/2.parser/classes/PropertyEntity.md | 18 +++++++++--------- docs/tech/2.parser/classes/TraitEntity.md | 18 +++++++++--------- docs/tech/2.parser/entity.md | 2 +- .../php/classes/ClassConstantEntity.md | 18 +++++++++--------- .../php/classes/ClassConstantEntity_2.md | 18 +++++++++--------- .../reflectionApi/php/classes/ClassEntity.md | 18 +++++++++--------- .../php/classes/ClassLikeEntity.md | 18 +++++++++--------- .../php/classes/ClassLikeEntity_2.md | 18 +++++++++--------- .../php/classes/ClassLikeEntity_3.md | 18 +++++++++--------- .../php/classes/ClassLikeEntity_4.md | 18 +++++++++--------- .../php/classes/ClassLikeEntity_5.md | 18 +++++++++--------- .../reflectionApi/php/classes/EnumEntity.md | 18 +++++++++--------- .../php/classes/InterfaceEntity.md | 18 +++++++++--------- .../reflectionApi/php/classes/MethodEntity.md | 18 +++++++++--------- .../php/classes/PropertyEntity.md | 18 +++++++++--------- .../reflectionApi/php/classes/TraitEntity.md | 18 +++++++++--------- .../php/phpClassConstantReflectionApi.md | 2 +- .../php/phpClassMethodReflectionApi.md | 2 +- .../php/phpClassPropertyReflectionApi.md | 2 +- .../reflectionApi/php/phpClassReflectionApi.md | 2 +- .../reflectionApi/php/phpEnumReflectionApi.md | 2 +- .../php/phpInterfaceReflectionApi.md | 2 +- .../reflectionApi/php/phpTraitReflectionApi.md | 2 +- docs/tech/2.parser/reflectionApi/readme.md | 12 +++++++++--- .../classes/PhpEntitiesCollection.md | 2 +- .../classes/PhpEntitiesCollection_2.md | 2 +- docs/tech/classes/BaseEntity.md | 18 +++++++++--------- docs/tech/classes/ClassConstantEntity.md | 18 +++++++++--------- docs/tech/classes/ClassConstantEntity_2.md | 18 +++++++++--------- docs/tech/classes/ClassEntity.md | 18 +++++++++--------- docs/tech/classes/ClassLikeEntity.md | 18 +++++++++--------- docs/tech/classes/ClassLikeEntity_2.md | 18 +++++++++--------- docs/tech/classes/EnumEntity.md | 18 +++++++++--------- docs/tech/classes/InterfaceEntity.md | 18 +++++++++--------- docs/tech/classes/MethodEntity.md | 18 +++++++++--------- docs/tech/classes/OperationsCollection.md | 4 ++-- docs/tech/classes/PropertyEntity.md | 18 +++++++++--------- docs/tech/classes/TraitEntity.md | 18 +++++++++--------- docs/tech/map.md | 2 +- .../tech/2.parser/reflectionApi/readme.md.twig | 10 ++++++++-- 48 files changed, 328 insertions(+), 316 deletions(-) diff --git a/docs/shared_c.cache b/docs/shared_c.cache index cc50e92d..0d7aedab 100644 --- a/docs/shared_c.cache +++ b/docs/shared_c.cache @@ -1 +1 @@ -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 \ No newline at end of file +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 \ No newline at end of file diff --git a/docs/tech/2.parser/classes/ClassConstantEntity.md b/docs/tech/2.parser/classes/ClassConstantEntity.md index 5c16d285..da704752 100644 --- a/docs/tech/2.parser/classes/ClassConstantEntity.md +++ b/docs/tech/2.parser/classes/ClassConstantEntity.md @@ -347,7 +347,7 @@ public function getCacheKey(): string; ```php @@ -380,7 +380,7 @@ public function getCachedEntityDependencies(): array; ```php @@ -496,7 +496,7 @@ public function getDocBlock(): \phpDocumentor\Reflection\DocBlock; ```php @@ -577,7 +577,7 @@ public function getDocCommentLine(): null|int; ```php @@ -635,7 +635,7 @@ public function getEndLine(): int; ```php @@ -712,7 +712,7 @@ public function getFileSourceLink(bool $withLine = true): null|string; ```php @@ -1096,7 +1096,7 @@ public function hasDescriptionLinks(): bool; ```php @@ -1216,7 +1216,7 @@ public function isDeprecated(): bool; ```php @@ -1413,7 +1413,7 @@ public function isPublic(): bool; ```php diff --git a/docs/tech/2.parser/classes/ClassConstantEntity_2.md b/docs/tech/2.parser/classes/ClassConstantEntity_2.md index 662f4451..8e8b3deb 100644 --- a/docs/tech/2.parser/classes/ClassConstantEntity_2.md +++ b/docs/tech/2.parser/classes/ClassConstantEntity_2.md @@ -347,7 +347,7 @@ public function getCacheKey(): string; ```php @@ -380,7 +380,7 @@ public function getCachedEntityDependencies(): array; ```php @@ -496,7 +496,7 @@ public function getDocBlock(): \phpDocumentor\Reflection\DocBlock; ```php @@ -577,7 +577,7 @@ public function getDocCommentLine(): null|int; ```php @@ -635,7 +635,7 @@ public function getEndLine(): int; ```php @@ -712,7 +712,7 @@ public function getFileSourceLink(bool $withLine = true): null|string; ```php @@ -1096,7 +1096,7 @@ public function hasDescriptionLinks(): bool; ```php @@ -1216,7 +1216,7 @@ public function isDeprecated(): bool; ```php @@ -1413,7 +1413,7 @@ public function isPublic(): bool; ```php diff --git a/docs/tech/2.parser/classes/ClassEntity.md b/docs/tech/2.parser/classes/ClassEntity.md index 74c17ad9..22fb40b1 100644 --- a/docs/tech/2.parser/classes/ClassEntity.md +++ b/docs/tech/2.parser/classes/ClassEntity.md @@ -594,7 +594,7 @@ public function getCacheKey(): string; ```php @@ -940,7 +940,7 @@ public function getConstantsValues(bool $onlyFromCurrentClassAndTraits = false, ```php @@ -1056,7 +1056,7 @@ public function getDocBlock(): \phpDocumentor\Reflection\DocBlock; ```php @@ -1139,7 +1139,7 @@ public function getDocCommentLine(): null|int; ```php @@ -1255,7 +1255,7 @@ public function getEntityDependencies(): array; ```php @@ -1362,7 +1362,7 @@ public function getFileSourceLink(bool $withLine = true): null|string; ```php @@ -2452,7 +2452,7 @@ public function hasDescriptionLinks(): bool; ```php @@ -2928,7 +2928,7 @@ public function isDocumentCreationAllowed(): bool; ```php @@ -3334,7 +3334,7 @@ public static function normalizeClassName(string $name): string; ```php diff --git a/docs/tech/2.parser/classes/ClassLikeEntity.md b/docs/tech/2.parser/classes/ClassLikeEntity.md index 61d077ec..40be3801 100644 --- a/docs/tech/2.parser/classes/ClassLikeEntity.md +++ b/docs/tech/2.parser/classes/ClassLikeEntity.md @@ -577,7 +577,7 @@ public function getCacheKey(): string; ```php @@ -911,7 +911,7 @@ public function getConstantsValues(bool $onlyFromCurrentClassAndTraits = false, ```php @@ -1027,7 +1027,7 @@ public function getDocBlock(): \phpDocumentor\Reflection\DocBlock; ```php @@ -1108,7 +1108,7 @@ public function getDocCommentLine(): null|int; ```php @@ -1218,7 +1218,7 @@ public function getEntityDependencies(): array; ```php @@ -1323,7 +1323,7 @@ public function getFileSourceLink(bool $withLine = true): null|string; ```php @@ -2365,7 +2365,7 @@ public function hasDescriptionLinks(): bool; ```php @@ -2799,7 +2799,7 @@ public function isDocumentCreationAllowed(): bool; ```php @@ -3187,7 +3187,7 @@ public static function normalizeClassName(string $name): string; ```php diff --git a/docs/tech/2.parser/classes/EnumEntity.md b/docs/tech/2.parser/classes/EnumEntity.md index 9739163c..3687c4e3 100644 --- a/docs/tech/2.parser/classes/EnumEntity.md +++ b/docs/tech/2.parser/classes/EnumEntity.md @@ -600,7 +600,7 @@ public function getCacheKey(): string; ```php @@ -977,7 +977,7 @@ public function getConstantsValues(bool $onlyFromCurrentClassAndTraits = false, ```php @@ -1093,7 +1093,7 @@ public function getDocBlock(): \phpDocumentor\Reflection\DocBlock; ```php @@ -1176,7 +1176,7 @@ public function getDocCommentLine(): null|int; ```php @@ -1371,7 +1371,7 @@ public function getEnumCases(): array; ```php @@ -1478,7 +1478,7 @@ public function getFileSourceLink(bool $withLine = true): null|string; ```php @@ -2572,7 +2572,7 @@ public function hasDescriptionLinks(): bool; ```php @@ -3024,7 +3024,7 @@ public function isDocumentCreationAllowed(): bool; ```php @@ -3430,7 +3430,7 @@ public static function normalizeClassName(string $name): string; ```php diff --git a/docs/tech/2.parser/classes/InterfaceEntity.md b/docs/tech/2.parser/classes/InterfaceEntity.md index de68126c..2efbcfd1 100644 --- a/docs/tech/2.parser/classes/InterfaceEntity.md +++ b/docs/tech/2.parser/classes/InterfaceEntity.md @@ -591,7 +591,7 @@ public function getCacheKey(): string; ```php @@ -937,7 +937,7 @@ public function getConstantsValues(bool $onlyFromCurrentClassAndTraits = false, ```php @@ -1053,7 +1053,7 @@ public function getDocBlock(): \phpDocumentor\Reflection\DocBlock; ```php @@ -1136,7 +1136,7 @@ public function getDocCommentLine(): null|int; ```php @@ -1252,7 +1252,7 @@ public function getEntityDependencies(): array; ```php @@ -1359,7 +1359,7 @@ public function getFileSourceLink(bool $withLine = true): null|string; ```php @@ -2453,7 +2453,7 @@ public function hasDescriptionLinks(): bool; ```php @@ -2903,7 +2903,7 @@ public function isDocumentCreationAllowed(): bool; ```php @@ -3309,7 +3309,7 @@ public static function normalizeClassName(string $name): string; ```php diff --git a/docs/tech/2.parser/classes/MethodEntity.md b/docs/tech/2.parser/classes/MethodEntity.md index 56e1b600..c752a32d 100644 --- a/docs/tech/2.parser/classes/MethodEntity.md +++ b/docs/tech/2.parser/classes/MethodEntity.md @@ -412,7 +412,7 @@ public function getCacheKey(): string; ```php @@ -445,7 +445,7 @@ public function getCachedEntityDependencies(): array; ```php @@ -561,7 +561,7 @@ public function getDocBlock(): \phpDocumentor\Reflection\DocBlock; ```php @@ -640,7 +640,7 @@ public function getDocCommentLine(): null|int; ```php @@ -691,7 +691,7 @@ public function getEndLine(): int; ```php @@ -768,7 +768,7 @@ public function getFileSourceLink(bool $withLine = true): null|string; ```php @@ -1287,7 +1287,7 @@ public function hasDescriptionLinks(): bool; ```php @@ -1449,7 +1449,7 @@ public function isDynamic(): bool; ```php @@ -1688,7 +1688,7 @@ public function isStatic(): bool; ```php diff --git a/docs/tech/2.parser/classes/PropertyEntity.md b/docs/tech/2.parser/classes/PropertyEntity.md index 4aaedef8..1c21ee85 100644 --- a/docs/tech/2.parser/classes/PropertyEntity.md +++ b/docs/tech/2.parser/classes/PropertyEntity.md @@ -356,7 +356,7 @@ public function getCacheKey(): string; ```php @@ -389,7 +389,7 @@ public function getCachedEntityDependencies(): array; ```php @@ -536,7 +536,7 @@ public function getDocBlock(): \phpDocumentor\Reflection\DocBlock; ```php @@ -617,7 +617,7 @@ public function getDocCommentLine(): null|int; ```php @@ -675,7 +675,7 @@ public function getEndLine(): int; ```php @@ -752,7 +752,7 @@ public function getFileSourceLink(bool $withLine = true): null|string; ```php @@ -1158,7 +1158,7 @@ public function hasDescriptionLinks(): bool; ```php @@ -1278,7 +1278,7 @@ public function isDeprecated(): bool; ```php @@ -1496,7 +1496,7 @@ public function isPublic(): bool; ```php diff --git a/docs/tech/2.parser/classes/TraitEntity.md b/docs/tech/2.parser/classes/TraitEntity.md index e96fdc13..397f5ffc 100644 --- a/docs/tech/2.parser/classes/TraitEntity.md +++ b/docs/tech/2.parser/classes/TraitEntity.md @@ -591,7 +591,7 @@ public function getCacheKey(): string; ```php @@ -937,7 +937,7 @@ public function getConstantsValues(bool $onlyFromCurrentClassAndTraits = false, ```php @@ -1053,7 +1053,7 @@ public function getDocBlock(): \phpDocumentor\Reflection\DocBlock; ```php @@ -1136,7 +1136,7 @@ public function getDocCommentLine(): null|int; ```php @@ -1252,7 +1252,7 @@ public function getEntityDependencies(): array; ```php @@ -1359,7 +1359,7 @@ public function getFileSourceLink(bool $withLine = true): null|string; ```php @@ -2453,7 +2453,7 @@ public function hasDescriptionLinks(): bool; ```php @@ -2905,7 +2905,7 @@ public function isDocumentCreationAllowed(): bool; ```php @@ -3309,7 +3309,7 @@ public static function normalizeClassName(string $name): string; ```php diff --git a/docs/tech/2.parser/entity.md b/docs/tech/2.parser/entity.md index 40794529..50b1c5f4 100644 --- a/docs/tech/2.parser/entity.md +++ b/docs/tech/2.parser/entity.md @@ -144,4 +144,4 @@ These classes are a convenient wrapper for accessing data in templates:

                    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
                    Last modified date: Tue Nov 21 16:24:59 2023 +0300
                    Page content update date: Mon Dec 18 2023
                    Made with Bumble Documentation Generator
                    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
                    Last modified date: Tue Nov 21 16:24:59 2023 +0300
                    Page content update date: Tue Dec 19 2023
                    Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/2.parser/reflectionApi/php/classes/ClassConstantEntity.md b/docs/tech/2.parser/reflectionApi/php/classes/ClassConstantEntity.md index 7ec2ffc8..41b34c30 100644 --- a/docs/tech/2.parser/reflectionApi/php/classes/ClassConstantEntity.md +++ b/docs/tech/2.parser/reflectionApi/php/classes/ClassConstantEntity.md @@ -347,7 +347,7 @@ public function getCacheKey(): string; ```php @@ -380,7 +380,7 @@ public function getCachedEntityDependencies(): array; ```php @@ -496,7 +496,7 @@ public function getDocBlock(): \phpDocumentor\Reflection\DocBlock; ```php @@ -577,7 +577,7 @@ public function getDocCommentLine(): null|int; ```php @@ -635,7 +635,7 @@ public function getEndLine(): int; ```php @@ -712,7 +712,7 @@ public function getFileSourceLink(bool $withLine = true): null|string; ```php @@ -1096,7 +1096,7 @@ public function hasDescriptionLinks(): bool; ```php @@ -1216,7 +1216,7 @@ public function isDeprecated(): bool; ```php @@ -1413,7 +1413,7 @@ public function isPublic(): bool; ```php diff --git a/docs/tech/2.parser/reflectionApi/php/classes/ClassConstantEntity_2.md b/docs/tech/2.parser/reflectionApi/php/classes/ClassConstantEntity_2.md index c010e147..8054691b 100644 --- a/docs/tech/2.parser/reflectionApi/php/classes/ClassConstantEntity_2.md +++ b/docs/tech/2.parser/reflectionApi/php/classes/ClassConstantEntity_2.md @@ -347,7 +347,7 @@ public function getCacheKey(): string; ```php @@ -380,7 +380,7 @@ public function getCachedEntityDependencies(): array; ```php @@ -496,7 +496,7 @@ public function getDocBlock(): \phpDocumentor\Reflection\DocBlock; ```php @@ -577,7 +577,7 @@ public function getDocCommentLine(): null|int; ```php @@ -635,7 +635,7 @@ public function getEndLine(): int; ```php @@ -712,7 +712,7 @@ public function getFileSourceLink(bool $withLine = true): null|string; ```php @@ -1096,7 +1096,7 @@ public function hasDescriptionLinks(): bool; ```php @@ -1216,7 +1216,7 @@ public function isDeprecated(): bool; ```php @@ -1413,7 +1413,7 @@ public function isPublic(): bool; ```php diff --git a/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md b/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md index 0acc7667..bccd53d5 100644 --- a/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md +++ b/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md @@ -594,7 +594,7 @@ public function getCacheKey(): string; ```php @@ -940,7 +940,7 @@ public function getConstantsValues(bool $onlyFromCurrentClassAndTraits = false, ```php @@ -1056,7 +1056,7 @@ public function getDocBlock(): \phpDocumentor\Reflection\DocBlock; ```php @@ -1139,7 +1139,7 @@ public function getDocCommentLine(): null|int; ```php @@ -1255,7 +1255,7 @@ public function getEntityDependencies(): array; ```php @@ -1362,7 +1362,7 @@ public function getFileSourceLink(bool $withLine = true): null|string; ```php @@ -2452,7 +2452,7 @@ public function hasDescriptionLinks(): bool; ```php @@ -2928,7 +2928,7 @@ public function isDocumentCreationAllowed(): bool; ```php @@ -3334,7 +3334,7 @@ public static function normalizeClassName(string $name): string; ```php diff --git a/docs/tech/2.parser/reflectionApi/php/classes/ClassLikeEntity.md b/docs/tech/2.parser/reflectionApi/php/classes/ClassLikeEntity.md index 797a6201..985cc369 100644 --- a/docs/tech/2.parser/reflectionApi/php/classes/ClassLikeEntity.md +++ b/docs/tech/2.parser/reflectionApi/php/classes/ClassLikeEntity.md @@ -577,7 +577,7 @@ public function getCacheKey(): string; ```php @@ -911,7 +911,7 @@ public function getConstantsValues(bool $onlyFromCurrentClassAndTraits = false, ```php @@ -1027,7 +1027,7 @@ public function getDocBlock(): \phpDocumentor\Reflection\DocBlock; ```php @@ -1108,7 +1108,7 @@ public function getDocCommentLine(): null|int; ```php @@ -1218,7 +1218,7 @@ public function getEntityDependencies(): array; ```php @@ -1323,7 +1323,7 @@ public function getFileSourceLink(bool $withLine = true): null|string; ```php @@ -2365,7 +2365,7 @@ public function hasDescriptionLinks(): bool; ```php @@ -2799,7 +2799,7 @@ public function isDocumentCreationAllowed(): bool; ```php @@ -3187,7 +3187,7 @@ public static function normalizeClassName(string $name): string; ```php diff --git a/docs/tech/2.parser/reflectionApi/php/classes/ClassLikeEntity_2.md b/docs/tech/2.parser/reflectionApi/php/classes/ClassLikeEntity_2.md index 339b07cb..d9a4de24 100644 --- a/docs/tech/2.parser/reflectionApi/php/classes/ClassLikeEntity_2.md +++ b/docs/tech/2.parser/reflectionApi/php/classes/ClassLikeEntity_2.md @@ -577,7 +577,7 @@ public function getCacheKey(): string; ```php @@ -911,7 +911,7 @@ public function getConstantsValues(bool $onlyFromCurrentClassAndTraits = false, ```php @@ -1027,7 +1027,7 @@ public function getDocBlock(): \phpDocumentor\Reflection\DocBlock; ```php @@ -1108,7 +1108,7 @@ public function getDocCommentLine(): null|int; ```php @@ -1218,7 +1218,7 @@ public function getEntityDependencies(): array; ```php @@ -1323,7 +1323,7 @@ public function getFileSourceLink(bool $withLine = true): null|string; ```php @@ -2365,7 +2365,7 @@ public function hasDescriptionLinks(): bool; ```php @@ -2799,7 +2799,7 @@ public function isDocumentCreationAllowed(): bool; ```php @@ -3187,7 +3187,7 @@ public static function normalizeClassName(string $name): string; ```php diff --git a/docs/tech/2.parser/reflectionApi/php/classes/ClassLikeEntity_3.md b/docs/tech/2.parser/reflectionApi/php/classes/ClassLikeEntity_3.md index faa4d1b1..1d9d778c 100644 --- a/docs/tech/2.parser/reflectionApi/php/classes/ClassLikeEntity_3.md +++ b/docs/tech/2.parser/reflectionApi/php/classes/ClassLikeEntity_3.md @@ -577,7 +577,7 @@ public function getCacheKey(): string; ```php @@ -911,7 +911,7 @@ public function getConstantsValues(bool $onlyFromCurrentClassAndTraits = false, ```php @@ -1027,7 +1027,7 @@ public function getDocBlock(): \phpDocumentor\Reflection\DocBlock; ```php @@ -1108,7 +1108,7 @@ public function getDocCommentLine(): null|int; ```php @@ -1218,7 +1218,7 @@ public function getEntityDependencies(): array; ```php @@ -1323,7 +1323,7 @@ public function getFileSourceLink(bool $withLine = true): null|string; ```php @@ -2365,7 +2365,7 @@ public function hasDescriptionLinks(): bool; ```php @@ -2799,7 +2799,7 @@ public function isDocumentCreationAllowed(): bool; ```php @@ -3187,7 +3187,7 @@ public static function normalizeClassName(string $name): string; ```php diff --git a/docs/tech/2.parser/reflectionApi/php/classes/ClassLikeEntity_4.md b/docs/tech/2.parser/reflectionApi/php/classes/ClassLikeEntity_4.md index 892431aa..1e4899d4 100644 --- a/docs/tech/2.parser/reflectionApi/php/classes/ClassLikeEntity_4.md +++ b/docs/tech/2.parser/reflectionApi/php/classes/ClassLikeEntity_4.md @@ -577,7 +577,7 @@ public function getCacheKey(): string; ```php @@ -911,7 +911,7 @@ public function getConstantsValues(bool $onlyFromCurrentClassAndTraits = false, ```php @@ -1027,7 +1027,7 @@ public function getDocBlock(): \phpDocumentor\Reflection\DocBlock; ```php @@ -1108,7 +1108,7 @@ public function getDocCommentLine(): null|int; ```php @@ -1218,7 +1218,7 @@ public function getEntityDependencies(): array; ```php @@ -1323,7 +1323,7 @@ public function getFileSourceLink(bool $withLine = true): null|string; ```php @@ -2365,7 +2365,7 @@ public function hasDescriptionLinks(): bool; ```php @@ -2799,7 +2799,7 @@ public function isDocumentCreationAllowed(): bool; ```php @@ -3187,7 +3187,7 @@ public static function normalizeClassName(string $name): string; ```php diff --git a/docs/tech/2.parser/reflectionApi/php/classes/ClassLikeEntity_5.md b/docs/tech/2.parser/reflectionApi/php/classes/ClassLikeEntity_5.md index 6100d437..4eabfa6a 100644 --- a/docs/tech/2.parser/reflectionApi/php/classes/ClassLikeEntity_5.md +++ b/docs/tech/2.parser/reflectionApi/php/classes/ClassLikeEntity_5.md @@ -577,7 +577,7 @@ public function getCacheKey(): string; ```php @@ -911,7 +911,7 @@ public function getConstantsValues(bool $onlyFromCurrentClassAndTraits = false, ```php @@ -1027,7 +1027,7 @@ public function getDocBlock(): \phpDocumentor\Reflection\DocBlock; ```php @@ -1108,7 +1108,7 @@ public function getDocCommentLine(): null|int; ```php @@ -1218,7 +1218,7 @@ public function getEntityDependencies(): array; ```php @@ -1323,7 +1323,7 @@ public function getFileSourceLink(bool $withLine = true): null|string; ```php @@ -2365,7 +2365,7 @@ public function hasDescriptionLinks(): bool; ```php @@ -2799,7 +2799,7 @@ public function isDocumentCreationAllowed(): bool; ```php @@ -3187,7 +3187,7 @@ public static function normalizeClassName(string $name): string; ```php diff --git a/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md b/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md index 821f1263..26d94b59 100644 --- a/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md +++ b/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md @@ -600,7 +600,7 @@ public function getCacheKey(): string; ```php @@ -977,7 +977,7 @@ public function getConstantsValues(bool $onlyFromCurrentClassAndTraits = false, ```php @@ -1093,7 +1093,7 @@ public function getDocBlock(): \phpDocumentor\Reflection\DocBlock; ```php @@ -1176,7 +1176,7 @@ public function getDocCommentLine(): null|int; ```php @@ -1371,7 +1371,7 @@ public function getEnumCases(): array; ```php @@ -1478,7 +1478,7 @@ public function getFileSourceLink(bool $withLine = true): null|string; ```php @@ -2572,7 +2572,7 @@ public function hasDescriptionLinks(): bool; ```php @@ -3024,7 +3024,7 @@ public function isDocumentCreationAllowed(): bool; ```php @@ -3430,7 +3430,7 @@ public static function normalizeClassName(string $name): string; ```php diff --git a/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md b/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md index 4c9f8680..6bda2e50 100644 --- a/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md +++ b/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md @@ -591,7 +591,7 @@ public function getCacheKey(): string; ```php @@ -937,7 +937,7 @@ public function getConstantsValues(bool $onlyFromCurrentClassAndTraits = false, ```php @@ -1053,7 +1053,7 @@ public function getDocBlock(): \phpDocumentor\Reflection\DocBlock; ```php @@ -1136,7 +1136,7 @@ public function getDocCommentLine(): null|int; ```php @@ -1252,7 +1252,7 @@ public function getEntityDependencies(): array; ```php @@ -1359,7 +1359,7 @@ public function getFileSourceLink(bool $withLine = true): null|string; ```php @@ -2453,7 +2453,7 @@ public function hasDescriptionLinks(): bool; ```php @@ -2903,7 +2903,7 @@ public function isDocumentCreationAllowed(): bool; ```php @@ -3309,7 +3309,7 @@ public static function normalizeClassName(string $name): string; ```php diff --git a/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md b/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md index a270dcaf..3eb71769 100644 --- a/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md +++ b/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md @@ -412,7 +412,7 @@ public function getCacheKey(): string; ```php @@ -445,7 +445,7 @@ public function getCachedEntityDependencies(): array; ```php @@ -561,7 +561,7 @@ public function getDocBlock(): \phpDocumentor\Reflection\DocBlock; ```php @@ -640,7 +640,7 @@ public function getDocCommentLine(): null|int; ```php @@ -691,7 +691,7 @@ public function getEndLine(): int; ```php @@ -768,7 +768,7 @@ public function getFileSourceLink(bool $withLine = true): null|string; ```php @@ -1287,7 +1287,7 @@ public function hasDescriptionLinks(): bool; ```php @@ -1449,7 +1449,7 @@ public function isDynamic(): bool; ```php @@ -1688,7 +1688,7 @@ public function isStatic(): bool; ```php diff --git a/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md b/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md index 24a7308e..8a8bed06 100644 --- a/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md +++ b/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md @@ -356,7 +356,7 @@ public function getCacheKey(): string; ```php @@ -389,7 +389,7 @@ public function getCachedEntityDependencies(): array; ```php @@ -536,7 +536,7 @@ public function getDocBlock(): \phpDocumentor\Reflection\DocBlock; ```php @@ -617,7 +617,7 @@ public function getDocCommentLine(): null|int; ```php @@ -675,7 +675,7 @@ public function getEndLine(): int; ```php @@ -752,7 +752,7 @@ public function getFileSourceLink(bool $withLine = true): null|string; ```php @@ -1158,7 +1158,7 @@ public function hasDescriptionLinks(): bool; ```php @@ -1278,7 +1278,7 @@ public function isDeprecated(): bool; ```php @@ -1496,7 +1496,7 @@ public function isPublic(): bool; ```php diff --git a/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md b/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md index cf093a56..70c429eb 100644 --- a/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md +++ b/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md @@ -591,7 +591,7 @@ public function getCacheKey(): string; ```php @@ -937,7 +937,7 @@ public function getConstantsValues(bool $onlyFromCurrentClassAndTraits = false, ```php @@ -1053,7 +1053,7 @@ public function getDocBlock(): \phpDocumentor\Reflection\DocBlock; ```php @@ -1136,7 +1136,7 @@ public function getDocCommentLine(): null|int; ```php @@ -1252,7 +1252,7 @@ public function getEntityDependencies(): array; ```php @@ -1359,7 +1359,7 @@ public function getFileSourceLink(bool $withLine = true): null|string; ```php @@ -2453,7 +2453,7 @@ public function hasDescriptionLinks(): bool; ```php @@ -2905,7 +2905,7 @@ public function isDocumentCreationAllowed(): bool; ```php @@ -3309,7 +3309,7 @@ public static function normalizeClassName(string $name): string; ```php diff --git a/docs/tech/2.parser/reflectionApi/php/phpClassConstantReflectionApi.md b/docs/tech/2.parser/reflectionApi/php/phpClassConstantReflectionApi.md index 9ffa3985..067c54af 100644 --- a/docs/tech/2.parser/reflectionApi/php/phpClassConstantReflectionApi.md +++ b/docs/tech/2.parser/reflectionApi/php/phpClassConstantReflectionApi.md @@ -47,4 +47,4 @@ $constantReflection = $classReflection->getConstant('constantName');

                    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
                    Last modified date: Fri Dec 15 21:27:10 2023 +0300
                    Page content update date: Mon Dec 18 2023
                    Made with Bumble Documentation Generator
                    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
                    Last modified date: Mon Dec 18 15:25:50 2023 +0300
                    Page content update date: Tue Dec 19 2023
                    Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/2.parser/reflectionApi/php/phpClassMethodReflectionApi.md b/docs/tech/2.parser/reflectionApi/php/phpClassMethodReflectionApi.md index 55b9aa6e..7ced6c06 100644 --- a/docs/tech/2.parser/reflectionApi/php/phpClassMethodReflectionApi.md +++ b/docs/tech/2.parser/reflectionApi/php/phpClassMethodReflectionApi.md @@ -62,4 +62,4 @@ $methodReflection = $classReflection->getMethod('methodName');

                    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
                    Last modified date: Fri Dec 15 21:27:10 2023 +0300
                    Page content update date: Mon Dec 18 2023
                    Made with Bumble Documentation Generator
                    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
                    Last modified date: Mon Dec 18 15:25:50 2023 +0300
                    Page content update date: Tue Dec 19 2023
                    Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/2.parser/reflectionApi/php/phpClassPropertyReflectionApi.md b/docs/tech/2.parser/reflectionApi/php/phpClassPropertyReflectionApi.md index d4e324e0..02b5ca68 100644 --- a/docs/tech/2.parser/reflectionApi/php/phpClassPropertyReflectionApi.md +++ b/docs/tech/2.parser/reflectionApi/php/phpClassPropertyReflectionApi.md @@ -53,4 +53,4 @@ $propertyReflection = $classReflection->getProperty('propertyName');

                    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
                    Last modified date: Fri Dec 15 21:27:10 2023 +0300
                    Page content update date: Mon Dec 18 2023
                    Made with Bumble Documentation Generator
                    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
                    Last modified date: Mon Dec 18 15:25:50 2023 +0300
                    Page content update date: Tue Dec 19 2023
                    Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/2.parser/reflectionApi/php/phpClassReflectionApi.md b/docs/tech/2.parser/reflectionApi/php/phpClassReflectionApi.md index cd37d8ea..78869366 100644 --- a/docs/tech/2.parser/reflectionApi/php/phpClassReflectionApi.md +++ b/docs/tech/2.parser/reflectionApi/php/phpClassReflectionApi.md @@ -86,4 +86,4 @@ $classReflection = $entitiesCollection->getLoadedOrCreateNew('SomeClassName'); /

                    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
                    Last modified date: Fri Dec 15 21:27:10 2023 +0300
                    Page content update date: Mon Dec 18 2023
                    Made with Bumble Documentation Generator
                    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
                    Last modified date: Mon Dec 18 15:25:50 2023 +0300
                    Page content update date: Tue Dec 19 2023
                    Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/2.parser/reflectionApi/php/phpEnumReflectionApi.md b/docs/tech/2.parser/reflectionApi/php/phpEnumReflectionApi.md index fa55ca10..eb8b8f7f 100644 --- a/docs/tech/2.parser/reflectionApi/php/phpEnumReflectionApi.md +++ b/docs/tech/2.parser/reflectionApi/php/phpEnumReflectionApi.md @@ -85,4 +85,4 @@ $enumReflection = $entitiesCollection->getLoadedOrCreateNew('SomeEnumName'); //

                    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
                    Last modified date: Fri Dec 15 21:27:10 2023 +0300
                    Page content update date: Mon Dec 18 2023
                    Made with Bumble Documentation Generator
                    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
                    Last modified date: Mon Dec 18 15:25:50 2023 +0300
                    Page content update date: Tue Dec 19 2023
                    Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/2.parser/reflectionApi/php/phpInterfaceReflectionApi.md b/docs/tech/2.parser/reflectionApi/php/phpInterfaceReflectionApi.md index 93ee5213..7e4db319 100644 --- a/docs/tech/2.parser/reflectionApi/php/phpInterfaceReflectionApi.md +++ b/docs/tech/2.parser/reflectionApi/php/phpInterfaceReflectionApi.md @@ -82,4 +82,4 @@ $interfaceReflection = $entitiesCollection->getLoadedOrCreateNew('SomeInterfaceN

                    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
                    Last modified date: Fri Dec 15 21:27:10 2023 +0300
                    Page content update date: Mon Dec 18 2023
                    Made with Bumble Documentation Generator
                    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
                    Last modified date: Mon Dec 18 15:25:50 2023 +0300
                    Page content update date: Tue Dec 19 2023
                    Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/2.parser/reflectionApi/php/phpTraitReflectionApi.md b/docs/tech/2.parser/reflectionApi/php/phpTraitReflectionApi.md index 9703ff42..65a30308 100644 --- a/docs/tech/2.parser/reflectionApi/php/phpTraitReflectionApi.md +++ b/docs/tech/2.parser/reflectionApi/php/phpTraitReflectionApi.md @@ -82,4 +82,4 @@ $traitReflection = $entitiesCollection->getLoadedOrCreateNew('SomeTraitName'); /

                    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
                    Last modified date: Fri Dec 15 21:27:10 2023 +0300
                    Page content update date: Mon Dec 18 2023
                    Made with Bumble Documentation Generator
                    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
                    Last modified date: Mon Dec 18 15:25:50 2023 +0300
                    Page content update date: Tue Dec 19 2023
                    Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/2.parser/reflectionApi/readme.md b/docs/tech/2.parser/reflectionApi/readme.md index ad4b502b..0edd70d5 100644 --- a/docs/tech/2.parser/reflectionApi/readme.md +++ b/docs/tech/2.parser/reflectionApi/readme.md @@ -18,10 +18,16 @@ You can use the Reflection API both in documentation templates and simply in you /** @var PhpEntitiesCollection $entitiesCollection*/ $entitiesCollection = (new BumbleDocGenDocGeneratorFactory())->createRootEntitiesCollection($reflectionApiConfig); + // Source locators are needed so that we can determine all the files that will be traversed to fill the collection with data + $sourceLocators = SourceLocatorsCollection::create(new DirectoriesSourceLocator([__DIR__])); + + // We can define special filters according to which entities will be loaded + $filter = new TrueCondition(); + // By default the collection is empty. You can populate the collection with data $entitiesCollection->loadEntities( - $sourceLocators, // Source locators are needed so that we can determine all the files that will be traversed to fill the collection with data - $filter // We can define special filters according to which entities will be loaded + $sourceLocators, + $filter ); // And now you can use Reflection API @@ -58,4 +64,4 @@ In addition, \BumbleDocGen\Core\Parser\Entity\RootEntityInterface::isEntityDataCanBeLoaded() + \BumbleDocGen\Core\Parser\Entity\RootEntityInterface::isEntityDataCanBeLoaded()

      diff --git a/docs/tech/3.renderer/classes/PhpEntitiesCollection_2.md b/docs/tech/3.renderer/classes/PhpEntitiesCollection_2.md index 4fdbec17..d6b16863 100644 --- a/docs/tech/3.renderer/classes/PhpEntitiesCollection_2.md +++ b/docs/tech/3.renderer/classes/PhpEntitiesCollection_2.md @@ -671,7 +671,7 @@ public function getLoadedOrCreateNew(string $objectName, bool $withAddClassEntit See:
      diff --git a/docs/tech/classes/BaseEntity.md b/docs/tech/classes/BaseEntity.md index c79c1c85..7856d386 100644 --- a/docs/tech/classes/BaseEntity.md +++ b/docs/tech/classes/BaseEntity.md @@ -233,7 +233,7 @@ public function getCacheKey(): string; ```php @@ -264,7 +264,7 @@ public function getCachedEntityDependencies(): array; ```php @@ -372,7 +372,7 @@ public function getDocBlock(): \phpDocumentor\Reflection\DocBlock; ```php @@ -449,7 +449,7 @@ public function getDocCommentLine(): null|int; ```php @@ -477,7 +477,7 @@ public function getDocNote(): string; ```php @@ -550,7 +550,7 @@ public function getFileSourceLink(bool $withLine = true): null|string; ```php @@ -819,7 +819,7 @@ public function hasDescriptionLinks(): bool; ```php @@ -931,7 +931,7 @@ public function isDeprecated(): bool; ```php @@ -1038,7 +1038,7 @@ public function isInternal(): bool; ```php diff --git a/docs/tech/classes/ClassConstantEntity.md b/docs/tech/classes/ClassConstantEntity.md index a1c42cfb..98e2b743 100644 --- a/docs/tech/classes/ClassConstantEntity.md +++ b/docs/tech/classes/ClassConstantEntity.md @@ -347,7 +347,7 @@ public function getCacheKey(): string; ```php @@ -380,7 +380,7 @@ public function getCachedEntityDependencies(): array; ```php @@ -496,7 +496,7 @@ public function getDocBlock(): \phpDocumentor\Reflection\DocBlock; ```php @@ -577,7 +577,7 @@ public function getDocCommentLine(): null|int; ```php @@ -635,7 +635,7 @@ public function getEndLine(): int; ```php @@ -712,7 +712,7 @@ public function getFileSourceLink(bool $withLine = true): null|string; ```php @@ -1096,7 +1096,7 @@ public function hasDescriptionLinks(): bool; ```php @@ -1216,7 +1216,7 @@ public function isDeprecated(): bool; ```php @@ -1413,7 +1413,7 @@ public function isPublic(): bool; ```php diff --git a/docs/tech/classes/ClassConstantEntity_2.md b/docs/tech/classes/ClassConstantEntity_2.md index 31b2e171..f18a2bc6 100644 --- a/docs/tech/classes/ClassConstantEntity_2.md +++ b/docs/tech/classes/ClassConstantEntity_2.md @@ -347,7 +347,7 @@ public function getCacheKey(): string; ```php @@ -380,7 +380,7 @@ public function getCachedEntityDependencies(): array; ```php @@ -496,7 +496,7 @@ public function getDocBlock(): \phpDocumentor\Reflection\DocBlock; ```php @@ -577,7 +577,7 @@ public function getDocCommentLine(): null|int; ```php @@ -635,7 +635,7 @@ public function getEndLine(): int; ```php @@ -712,7 +712,7 @@ public function getFileSourceLink(bool $withLine = true): null|string; ```php @@ -1096,7 +1096,7 @@ public function hasDescriptionLinks(): bool; ```php @@ -1216,7 +1216,7 @@ public function isDeprecated(): bool; ```php @@ -1413,7 +1413,7 @@ public function isPublic(): bool; ```php diff --git a/docs/tech/classes/ClassEntity.md b/docs/tech/classes/ClassEntity.md index 4396df00..8535d10c 100644 --- a/docs/tech/classes/ClassEntity.md +++ b/docs/tech/classes/ClassEntity.md @@ -594,7 +594,7 @@ public function getCacheKey(): string; ```php @@ -940,7 +940,7 @@ public function getConstantsValues(bool $onlyFromCurrentClassAndTraits = false, ```php @@ -1056,7 +1056,7 @@ public function getDocBlock(): \phpDocumentor\Reflection\DocBlock; ```php @@ -1139,7 +1139,7 @@ public function getDocCommentLine(): null|int; ```php @@ -1255,7 +1255,7 @@ public function getEntityDependencies(): array; ```php @@ -1362,7 +1362,7 @@ public function getFileSourceLink(bool $withLine = true): null|string; ```php @@ -2452,7 +2452,7 @@ public function hasDescriptionLinks(): bool; ```php @@ -2928,7 +2928,7 @@ public function isDocumentCreationAllowed(): bool; ```php @@ -3334,7 +3334,7 @@ public static function normalizeClassName(string $name): string; ```php diff --git a/docs/tech/classes/ClassLikeEntity.md b/docs/tech/classes/ClassLikeEntity.md index 4a6c33ba..046924ac 100644 --- a/docs/tech/classes/ClassLikeEntity.md +++ b/docs/tech/classes/ClassLikeEntity.md @@ -577,7 +577,7 @@ public function getCacheKey(): string; ```php @@ -911,7 +911,7 @@ public function getConstantsValues(bool $onlyFromCurrentClassAndTraits = false, ```php @@ -1027,7 +1027,7 @@ public function getDocBlock(): \phpDocumentor\Reflection\DocBlock; ```php @@ -1108,7 +1108,7 @@ public function getDocCommentLine(): null|int; ```php @@ -1218,7 +1218,7 @@ public function getEntityDependencies(): array; ```php @@ -1323,7 +1323,7 @@ public function getFileSourceLink(bool $withLine = true): null|string; ```php @@ -2365,7 +2365,7 @@ public function hasDescriptionLinks(): bool; ```php @@ -2799,7 +2799,7 @@ public function isDocumentCreationAllowed(): bool; ```php @@ -3187,7 +3187,7 @@ public static function normalizeClassName(string $name): string; ```php diff --git a/docs/tech/classes/ClassLikeEntity_2.md b/docs/tech/classes/ClassLikeEntity_2.md index b08734f5..d5618bc1 100644 --- a/docs/tech/classes/ClassLikeEntity_2.md +++ b/docs/tech/classes/ClassLikeEntity_2.md @@ -577,7 +577,7 @@ public function getCacheKey(): string; ```php @@ -911,7 +911,7 @@ public function getConstantsValues(bool $onlyFromCurrentClassAndTraits = false, ```php @@ -1027,7 +1027,7 @@ public function getDocBlock(): \phpDocumentor\Reflection\DocBlock; ```php @@ -1108,7 +1108,7 @@ public function getDocCommentLine(): null|int; ```php @@ -1218,7 +1218,7 @@ public function getEntityDependencies(): array; ```php @@ -1323,7 +1323,7 @@ public function getFileSourceLink(bool $withLine = true): null|string; ```php @@ -2365,7 +2365,7 @@ public function hasDescriptionLinks(): bool; ```php @@ -2799,7 +2799,7 @@ public function isDocumentCreationAllowed(): bool; ```php @@ -3187,7 +3187,7 @@ public static function normalizeClassName(string $name): string; ```php diff --git a/docs/tech/classes/EnumEntity.md b/docs/tech/classes/EnumEntity.md index dedfb586..33a1d908 100644 --- a/docs/tech/classes/EnumEntity.md +++ b/docs/tech/classes/EnumEntity.md @@ -600,7 +600,7 @@ public function getCacheKey(): string; ```php @@ -977,7 +977,7 @@ public function getConstantsValues(bool $onlyFromCurrentClassAndTraits = false, ```php @@ -1093,7 +1093,7 @@ public function getDocBlock(): \phpDocumentor\Reflection\DocBlock; ```php @@ -1176,7 +1176,7 @@ public function getDocCommentLine(): null|int; ```php @@ -1371,7 +1371,7 @@ public function getEnumCases(): array; ```php @@ -1478,7 +1478,7 @@ public function getFileSourceLink(bool $withLine = true): null|string; ```php @@ -2572,7 +2572,7 @@ public function hasDescriptionLinks(): bool; ```php @@ -3024,7 +3024,7 @@ public function isDocumentCreationAllowed(): bool; ```php @@ -3430,7 +3430,7 @@ public static function normalizeClassName(string $name): string; ```php diff --git a/docs/tech/classes/InterfaceEntity.md b/docs/tech/classes/InterfaceEntity.md index afe1cb94..dcc2e413 100644 --- a/docs/tech/classes/InterfaceEntity.md +++ b/docs/tech/classes/InterfaceEntity.md @@ -591,7 +591,7 @@ public function getCacheKey(): string; ```php @@ -937,7 +937,7 @@ public function getConstantsValues(bool $onlyFromCurrentClassAndTraits = false, ```php @@ -1053,7 +1053,7 @@ public function getDocBlock(): \phpDocumentor\Reflection\DocBlock; ```php @@ -1136,7 +1136,7 @@ public function getDocCommentLine(): null|int; ```php @@ -1252,7 +1252,7 @@ public function getEntityDependencies(): array; ```php @@ -1359,7 +1359,7 @@ public function getFileSourceLink(bool $withLine = true): null|string; ```php @@ -2453,7 +2453,7 @@ public function hasDescriptionLinks(): bool; ```php @@ -2903,7 +2903,7 @@ public function isDocumentCreationAllowed(): bool; ```php @@ -3309,7 +3309,7 @@ public static function normalizeClassName(string $name): string; ```php diff --git a/docs/tech/classes/MethodEntity.md b/docs/tech/classes/MethodEntity.md index c7c10872..d27ae752 100644 --- a/docs/tech/classes/MethodEntity.md +++ b/docs/tech/classes/MethodEntity.md @@ -412,7 +412,7 @@ public function getCacheKey(): string; ```php @@ -445,7 +445,7 @@ public function getCachedEntityDependencies(): array; ```php @@ -561,7 +561,7 @@ public function getDocBlock(): \phpDocumentor\Reflection\DocBlock; ```php @@ -640,7 +640,7 @@ public function getDocCommentLine(): null|int; ```php @@ -691,7 +691,7 @@ public function getEndLine(): int; ```php @@ -768,7 +768,7 @@ public function getFileSourceLink(bool $withLine = true): null|string; ```php @@ -1287,7 +1287,7 @@ public function hasDescriptionLinks(): bool; ```php @@ -1449,7 +1449,7 @@ public function isDynamic(): bool; ```php @@ -1688,7 +1688,7 @@ public function isStatic(): bool; ```php diff --git a/docs/tech/classes/OperationsCollection.md b/docs/tech/classes/OperationsCollection.md index 3e72c8ac..53100a16 100644 --- a/docs/tech/classes/OperationsCollection.md +++ b/docs/tech/classes/OperationsCollection.md @@ -59,7 +59,7 @@ final class OperationsCollection implements \IteratorAggregate ```php @@ -80,7 +80,7 @@ public function __serialize(): array; ```php diff --git a/docs/tech/classes/PropertyEntity.md b/docs/tech/classes/PropertyEntity.md index e1a8fc6f..5c66e145 100644 --- a/docs/tech/classes/PropertyEntity.md +++ b/docs/tech/classes/PropertyEntity.md @@ -356,7 +356,7 @@ public function getCacheKey(): string; ```php @@ -389,7 +389,7 @@ public function getCachedEntityDependencies(): array; ```php @@ -536,7 +536,7 @@ public function getDocBlock(): \phpDocumentor\Reflection\DocBlock; ```php @@ -617,7 +617,7 @@ public function getDocCommentLine(): null|int; ```php @@ -675,7 +675,7 @@ public function getEndLine(): int; ```php @@ -752,7 +752,7 @@ public function getFileSourceLink(bool $withLine = true): null|string; ```php @@ -1158,7 +1158,7 @@ public function hasDescriptionLinks(): bool; ```php @@ -1278,7 +1278,7 @@ public function isDeprecated(): bool; ```php @@ -1496,7 +1496,7 @@ public function isPublic(): bool; ```php diff --git a/docs/tech/classes/TraitEntity.md b/docs/tech/classes/TraitEntity.md index 9325271e..586b3d52 100644 --- a/docs/tech/classes/TraitEntity.md +++ b/docs/tech/classes/TraitEntity.md @@ -591,7 +591,7 @@ public function getCacheKey(): string; ```php @@ -937,7 +937,7 @@ public function getConstantsValues(bool $onlyFromCurrentClassAndTraits = false, ```php @@ -1053,7 +1053,7 @@ public function getDocBlock(): \phpDocumentor\Reflection\DocBlock; ```php @@ -1136,7 +1136,7 @@ public function getDocCommentLine(): null|int; ```php @@ -1252,7 +1252,7 @@ public function getEntityDependencies(): array; ```php @@ -1359,7 +1359,7 @@ public function getFileSourceLink(bool $withLine = true): null|string; ```php @@ -2453,7 +2453,7 @@ public function hasDescriptionLinks(): bool; ```php @@ -2905,7 +2905,7 @@ public function isDocumentCreationAllowed(): bool; ```php @@ -3309,7 +3309,7 @@ public static function normalizeClassName(string $name): string; ```php diff --git a/docs/tech/map.md b/docs/tech/map.md index f88be538..c3a755ae 100644 --- a/docs/tech/map.md +++ b/docs/tech/map.md @@ -266,4 +266,4 @@ Directory layout ( only documented files shown ):

      -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
      Last modified date: Mon Nov 20 19:18:48 2023 +0300
      Page content update date: Mon Dec 18 2023
      Made with Bumble Documentation Generator
      \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
      Last modified date: Mon Nov 20 19:18:48 2023 +0300
      Page content update date: Tue Dec 19 2023
      Made with Bumble Documentation Generator \ No newline at end of file diff --git a/selfdoc/templates/tech/2.parser/reflectionApi/readme.md.twig b/selfdoc/templates/tech/2.parser/reflectionApi/readme.md.twig index 43981a01..8a4f93f9 100644 --- a/selfdoc/templates/tech/2.parser/reflectionApi/readme.md.twig +++ b/selfdoc/templates/tech/2.parser/reflectionApi/readme.md.twig @@ -18,10 +18,16 @@ $reflectionApiConfig = PhpReflectionApiConfig::create(); /** @var PhpEntitiesCollection $entitiesCollection*/ $entitiesCollection = (new \BumbleDocGen\DocGeneratorFactory())->createRootEntitiesCollection($reflectionApiConfig); +// Source locators are needed so that we can determine all the files that will be traversed to fill the collection with data +$sourceLocators = SourceLocatorsCollection::create(new DirectoriesSourceLocator([__DIR__])); + +// We can define special filters according to which entities will be loaded +$filter = new TrueCondition(); + // By default the collection is empty. You can populate the collection with data $entitiesCollection->loadEntities( - $sourceLocators, // Source locators are needed so that we can determine all the files that will be traversed to fill the collection with data - $filter // We can define special filters according to which entities will be loaded + $sourceLocators, + $filter ); // And now you can use Reflection API From 74f2c4c8e88a0b5f65cd8c44d045f900e5a7ae9b Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Tue, 19 Dec 2023 16:23:30 +0300 Subject: [PATCH 148/210] Updating doc --- docs/README.md | 2 +- docs/classes/DocGenerator.md | 107 +- docs/shared_c.cache | 2 +- .../1.configuration/classes/Configuration.md | 30 +- docs/tech/1.configuration/readme.md | 2 +- docs/tech/2.parser/classes/Configuration.md | 30 +- docs/tech/2.parser/entityFilterCondition.md | 2 +- docs/tech/2.parser/readme.md | 2 +- .../php/classes/Configuration.md | 30 +- .../php/phpEntitiesCollection.md | 2 +- .../tech/2.parser/reflectionApi/php/readme.md | 2 +- docs/tech/2.parser/reflectionApi/readme.md | 2 +- docs/tech/2.parser/sourceLocator.md | 2 +- docs/tech/3.renderer/01_templates.md | 2 +- docs/tech/3.renderer/02_breadcrumbs.md | 2 +- docs/tech/3.renderer/03_documentStructure.md | 2 +- docs/tech/3.renderer/04_twigCustomFilters.md | 2 +- .../tech/3.renderer/05_twigCustomFunctions.md | 2 +- docs/tech/3.renderer/classes/Configuration.md | 30 +- .../classes/PhpEntitiesCollection.md | 2 +- .../classes/PhpEntitiesCollection_2.md | 2 +- docs/tech/3.renderer/readme.md | 2 +- .../tech/3.renderer/templatesDynamicBlocks.md | 2 +- docs/tech/3.renderer/templatesLinking.md | 2 +- docs/tech/3.renderer/templatesVariables.md | 2 +- docs/tech/4.pluginSystem/readme.md | 2 +- docs/tech/classes/App.md | 4 +- docs/tech/classes/Configuration.md | 30 +- docs/tech/classes/ConfigurationCommand.md | 1304 +---------------- docs/tech/classes/Configuration_2.md | 30 +- docs/tech/classes/CustomFiltersCollection.md | 24 + .../tech/classes/CustomFunctionsCollection.md | 24 + docs/tech/classes/DocGenerator.md | 107 +- .../classes/LanguageHandlersCollection.md | 24 + docs/tech/classes/PluginsCollection.md | 24 + docs/tech/map.md | 2 + docs/tech/readme.md | 2 +- 37 files changed, 411 insertions(+), 1433 deletions(-) diff --git a/docs/README.md b/docs/README.md index 69b24a5a..f805af43 100644 --- a/docs/README.md +++ b/docs/README.md @@ -95,4 +95,4 @@ To update this documentation, run the following command:

      -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
      Last modified date: Fri Dec 15 21:27:10 2023 +0300
      Page content update date: Mon Dec 18 2023
      Made with Bumble Documentation Generator
      \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
      Last modified date: Mon Dec 18 15:41:43 2023 +0300
      Page content update date: Tue Dec 19 2023
      Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/classes/DocGenerator.md b/docs/classes/DocGenerator.md index e8b13655..f85c7c3f 100644 --- a/docs/classes/DocGenerator.md +++ b/docs/classes/DocGenerator.md @@ -2,7 +2,7 @@ BumbleDocGen / DocGenerator

      - DocGenerator class: + DocGenerator class:

      @@ -42,6 +42,12 @@ final class DocGenerator
    • generateReadmeTemplate - Creates a `README.md` template filled with basic information using LLM
    • +
    • + getConfigurationKey +
    • +
    • + getConfigurationKeys +
    • parseAndGetRootEntityCollectionsGroup
    • @@ -52,11 +58,11 @@ final class DocGenerator @@ -71,7 +77,7 @@ final class DocGenerator ```php @@ -166,7 +172,7 @@ public function __construct(\Symfony\Component\Console\Style\OutputStyle $io, \B ```php @@ -220,7 +226,7 @@ public function addDocBlocks(\BumbleDocGen\AI\ProviderInterface $aiProvider): vo ```php @@ -251,7 +257,7 @@ public function generate(): void; ```php @@ -282,6 +288,91 @@ public function generateReadmeTemplate(\BumbleDocGen\AI\ProviderInterface $aiPro Return value: void +Throws: + + + +
      +
      + + + +```php +public function getConfigurationKey(string $key): void; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $keystring-
      + +Return value: void + + +Throws: + + +
      +
      +
      + + + +```php +public function getConfigurationKeys(): void; +``` + + + +Parameters: not specified + +Return value: void + + Throws:
      • @@ -302,7 +393,7 @@ public function generateReadmeTemplate(\BumbleDocGen\AI\ProviderInterface $aiPro ```php diff --git a/docs/shared_c.cache b/docs/shared_c.cache index 0d7aedab..65f14249 100644 --- a/docs/shared_c.cache +++ b/docs/shared_c.cache @@ -1 +1 @@ -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 \ No newline at end of file +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 \ No newline at end of file diff --git a/docs/tech/1.configuration/classes/Configuration.md b/docs/tech/1.configuration/classes/Configuration.md index 18e12cc5..67ad2cf2 100644 --- a/docs/tech/1.configuration/classes/Configuration.md +++ b/docs/tech/1.configuration/classes/Configuration.md @@ -159,7 +159,7 @@ public function __construct(\BumbleDocGen\Core\Configuration\ConfigurationParame ```php @@ -193,7 +193,7 @@ public function getAdditionalConsoleCommands(): \BumbleDocGen\Console\Command\Ad ```php @@ -242,7 +242,7 @@ public function getConfigurationVersion(): string; ```php @@ -263,7 +263,7 @@ public function getDocGenLibDir(): string; ```php @@ -291,7 +291,7 @@ public function getGitClientPath(): string; ```php @@ -336,7 +336,7 @@ public function getIfExists(mixed $key): null|string; ```php @@ -370,7 +370,7 @@ public function getLanguageHandlersCollection(): \BumbleDocGen\LanguageHandler\L ```php @@ -398,7 +398,7 @@ public function getOutputDir(): string; ```php @@ -426,7 +426,7 @@ public function getOutputDirBaseUrl(): string; ```php @@ -460,7 +460,7 @@ public function getPageLinkProcessor(): \BumbleDocGen\Core\Renderer\PageLinkProc ```php @@ -584,7 +584,7 @@ public function getTemplatesDir(): string; ```php @@ -618,7 +618,7 @@ public function getTwigFilters(): \BumbleDocGen\Core\Renderer\Twig\Filter\Custom ```php @@ -652,7 +652,7 @@ public function getTwigFunctions(): \BumbleDocGen\Core\Renderer\Twig\Function\Cu ```php @@ -680,7 +680,7 @@ public function getWorkingDir(): string; ```php @@ -708,7 +708,7 @@ public function isCheckFileInGitBeforeCreatingDocEnabled(): bool; ```php diff --git a/docs/tech/1.configuration/readme.md b/docs/tech/1.configuration/readme.md index 286235fc..c5ad1284 100644 --- a/docs/tech/1.configuration/readme.md +++ b/docs/tech/1.configuration/readme.md @@ -223,4 +223,4 @@ The inheritance algorithm is as follows: scalar types can be overwritten by each

        -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
        Last modified date: Mon Nov 20 19:18:48 2023 +0300
        Page content update date: Mon Dec 18 2023
        Made with Bumble Documentation Generator
        \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
        Last modified date: Mon Nov 20 19:18:48 2023 +0300
        Page content update date: Tue Dec 19 2023
        Made with Bumble Documentation Generator
      \ No newline at end of file diff --git a/docs/tech/2.parser/classes/Configuration.md b/docs/tech/2.parser/classes/Configuration.md index 778606a4..f682b128 100644 --- a/docs/tech/2.parser/classes/Configuration.md +++ b/docs/tech/2.parser/classes/Configuration.md @@ -159,7 +159,7 @@ public function __construct(\BumbleDocGen\Core\Configuration\ConfigurationParame ```php @@ -193,7 +193,7 @@ public function getAdditionalConsoleCommands(): \BumbleDocGen\Console\Command\Ad ```php @@ -242,7 +242,7 @@ public function getConfigurationVersion(): string; ```php @@ -263,7 +263,7 @@ public function getDocGenLibDir(): string; ```php @@ -291,7 +291,7 @@ public function getGitClientPath(): string; ```php @@ -336,7 +336,7 @@ public function getIfExists(mixed $key): null|string; ```php @@ -370,7 +370,7 @@ public function getLanguageHandlersCollection(): \BumbleDocGen\LanguageHandler\L ```php @@ -398,7 +398,7 @@ public function getOutputDir(): string; ```php @@ -426,7 +426,7 @@ public function getOutputDirBaseUrl(): string; ```php @@ -460,7 +460,7 @@ public function getPageLinkProcessor(): \BumbleDocGen\Core\Renderer\PageLinkProc ```php @@ -584,7 +584,7 @@ public function getTemplatesDir(): string; ```php @@ -618,7 +618,7 @@ public function getTwigFilters(): \BumbleDocGen\Core\Renderer\Twig\Filter\Custom ```php @@ -652,7 +652,7 @@ public function getTwigFunctions(): \BumbleDocGen\Core\Renderer\Twig\Function\Cu ```php @@ -680,7 +680,7 @@ public function getWorkingDir(): string; ```php @@ -708,7 +708,7 @@ public function isCheckFileInGitBeforeCreatingDocEnabled(): bool; ```php diff --git a/docs/tech/2.parser/entityFilterCondition.md b/docs/tech/2.parser/entityFilterCondition.md index 43cbb3d0..0837a7bf 100644 --- a/docs/tech/2.parser/entityFilterCondition.md +++ b/docs/tech/2.parser/entityFilterCondition.md @@ -78,4 +78,4 @@ Filter condition for working with entities PHP language handler:

      -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
      Last modified date: Mon Nov 20 19:18:48 2023 +0300
      Page content update date: Mon Dec 18 2023
      Made with Bumble Documentation Generator
      \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
      Last modified date: Mon Nov 20 19:18:48 2023 +0300
      Page content update date: Tue Dec 19 2023
      Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/2.parser/readme.md b/docs/tech/2.parser/readme.md index adb9471c..bf2485e1 100644 --- a/docs/tech/2.parser/readme.md +++ b/docs/tech/2.parser/readme.md @@ -42,4 +42,4 @@ In this section, we show how the parser works and what components it consists of

      -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
      Last modified date: Wed Nov 29 11:54:40 2023 +0300
      Page content update date: Mon Dec 18 2023
      Made with Bumble Documentation Generator
      \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
      Last modified date: Wed Nov 29 11:54:40 2023 +0300
      Page content update date: Tue Dec 19 2023
      Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/2.parser/reflectionApi/php/classes/Configuration.md b/docs/tech/2.parser/reflectionApi/php/classes/Configuration.md index 8ea3bbd0..23d82b73 100644 --- a/docs/tech/2.parser/reflectionApi/php/classes/Configuration.md +++ b/docs/tech/2.parser/reflectionApi/php/classes/Configuration.md @@ -159,7 +159,7 @@ public function __construct(\BumbleDocGen\Core\Configuration\ConfigurationParame ```php @@ -193,7 +193,7 @@ public function getAdditionalConsoleCommands(): \BumbleDocGen\Console\Command\Ad ```php @@ -242,7 +242,7 @@ public function getConfigurationVersion(): string; ```php @@ -263,7 +263,7 @@ public function getDocGenLibDir(): string; ```php @@ -291,7 +291,7 @@ public function getGitClientPath(): string; ```php @@ -336,7 +336,7 @@ public function getIfExists(mixed $key): null|string; ```php @@ -370,7 +370,7 @@ public function getLanguageHandlersCollection(): \BumbleDocGen\LanguageHandler\L ```php @@ -398,7 +398,7 @@ public function getOutputDir(): string; ```php @@ -426,7 +426,7 @@ public function getOutputDirBaseUrl(): string; ```php @@ -460,7 +460,7 @@ public function getPageLinkProcessor(): \BumbleDocGen\Core\Renderer\PageLinkProc ```php @@ -584,7 +584,7 @@ public function getTemplatesDir(): string; ```php @@ -618,7 +618,7 @@ public function getTwigFilters(): \BumbleDocGen\Core\Renderer\Twig\Filter\Custom ```php @@ -652,7 +652,7 @@ public function getTwigFunctions(): \BumbleDocGen\Core\Renderer\Twig\Function\Cu ```php @@ -680,7 +680,7 @@ public function getWorkingDir(): string; ```php @@ -708,7 +708,7 @@ public function isCheckFileInGitBeforeCreatingDocEnabled(): bool; ```php diff --git a/docs/tech/2.parser/reflectionApi/php/phpEntitiesCollection.md b/docs/tech/2.parser/reflectionApi/php/phpEntitiesCollection.md index 0c00b48d..862731c6 100644 --- a/docs/tech/2.parser/reflectionApi/php/phpEntitiesCollection.md +++ b/docs/tech/2.parser/reflectionApi/php/phpEntitiesCollection.md @@ -25,4 +25,4 @@

      -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
      Last modified date: Sat Dec 16 13:54:48 2023 +0300
      Page content update date: Mon Dec 18 2023
      Made with Bumble Documentation Generator
      \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
      Last modified date: Sat Dec 16 13:54:48 2023 +0300
      Page content update date: Tue Dec 19 2023
      Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/2.parser/reflectionApi/php/readme.md b/docs/tech/2.parser/reflectionApi/php/readme.md index b130f9dd..27c448d7 100644 --- a/docs/tech/2.parser/reflectionApi/php/readme.md +++ b/docs/tech/2.parser/reflectionApi/php/readme.md @@ -88,4 +88,4 @@ $firstMethodReturnValue = $methodReflection->getFirstReturnValue();

      -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
      Last modified date: Sat Dec 16 13:54:48 2023 +0300
      Page content update date: Mon Dec 18 2023
      Made with Bumble Documentation Generator
      \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
      Last modified date: Mon Dec 18 15:25:50 2023 +0300
      Page content update date: Tue Dec 19 2023
      Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/2.parser/reflectionApi/readme.md b/docs/tech/2.parser/reflectionApi/readme.md index 0edd70d5..562b182b 100644 --- a/docs/tech/2.parser/reflectionApi/readme.md +++ b/docs/tech/2.parser/reflectionApi/readme.md @@ -64,4 +64,4 @@ In addition, # getAdditionalConsoleCommands - | source code + | source code
    ```php @@ -193,7 +193,7 @@ public function getAdditionalConsoleCommands(): \BumbleDocGen\Console\Command\Ad ```php @@ -242,7 +242,7 @@ public function getConfigurationVersion(): string; ```php @@ -263,7 +263,7 @@ public function getDocGenLibDir(): string; ```php @@ -291,7 +291,7 @@ public function getGitClientPath(): string; ```php @@ -336,7 +336,7 @@ public function getIfExists(mixed $key): null|string; ```php @@ -370,7 +370,7 @@ public function getLanguageHandlersCollection(): \BumbleDocGen\LanguageHandler\L ```php @@ -398,7 +398,7 @@ public function getOutputDir(): string; ```php @@ -426,7 +426,7 @@ public function getOutputDirBaseUrl(): string; ```php @@ -460,7 +460,7 @@ public function getPageLinkProcessor(): \BumbleDocGen\Core\Renderer\PageLinkProc ```php @@ -584,7 +584,7 @@ public function getTemplatesDir(): string; ```php @@ -618,7 +618,7 @@ public function getTwigFilters(): \BumbleDocGen\Core\Renderer\Twig\Filter\Custom ```php @@ -652,7 +652,7 @@ public function getTwigFunctions(): \BumbleDocGen\Core\Renderer\Twig\Function\Cu ```php @@ -680,7 +680,7 @@ public function getWorkingDir(): string; ```php @@ -708,7 +708,7 @@ public function isCheckFileInGitBeforeCreatingDocEnabled(): bool; ```php diff --git a/docs/tech/3.renderer/classes/PhpEntitiesCollection.md b/docs/tech/3.renderer/classes/PhpEntitiesCollection.md index bb384f10..0ff6447b 100644 --- a/docs/tech/3.renderer/classes/PhpEntitiesCollection.md +++ b/docs/tech/3.renderer/classes/PhpEntitiesCollection.md @@ -671,7 +671,7 @@ public function getLoadedOrCreateNew(string $objectName, bool $withAddClassEntit See:
    diff --git a/docs/tech/3.renderer/classes/PhpEntitiesCollection_2.md b/docs/tech/3.renderer/classes/PhpEntitiesCollection_2.md index d6b16863..4fdbec17 100644 --- a/docs/tech/3.renderer/classes/PhpEntitiesCollection_2.md +++ b/docs/tech/3.renderer/classes/PhpEntitiesCollection_2.md @@ -671,7 +671,7 @@ public function getLoadedOrCreateNew(string $objectName, bool $withAddClassEntit See:
    diff --git a/docs/tech/3.renderer/readme.md b/docs/tech/3.renderer/readme.md index 82427505..4eef9568 100644 --- a/docs/tech/3.renderer/readme.md +++ b/docs/tech/3.renderer/readme.md @@ -60,4 +60,4 @@ This process is presented in the form of a diagram below.

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Sep 2 21:01:47 2023 +0300
    Page content update date: Mon Dec 18 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Sep 2 21:01:47 2023 +0300
    Page content update date: Tue Dec 19 2023
    Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/3.renderer/templatesDynamicBlocks.md b/docs/tech/3.renderer/templatesDynamicBlocks.md index db55b659..75518c18 100644 --- a/docs/tech/3.renderer/templatesDynamicBlocks.md +++ b/docs/tech/3.renderer/templatesDynamicBlocks.md @@ -26,4 +26,4 @@ You can use the built-in functions and filters or add your own, so you can imple

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Mon Nov 20 19:18:48 2023 +0300
    Page content update date: Mon Dec 18 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Mon Nov 20 19:18:48 2023 +0300
    Page content update date: Tue Dec 19 2023
    Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/3.renderer/templatesLinking.md b/docs/tech/3.renderer/templatesLinking.md index 181519e0..60eaf5eb 100644 --- a/docs/tech/3.renderer/templatesLinking.md +++ b/docs/tech/3.renderer/templatesLinking.md @@ -27,4 +27,4 @@ You can also implement your own functions for relinking if necessary.

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Oct 28 11:03:31 2023 +0300
    Page content update date: Mon Dec 18 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Oct 28 11:03:31 2023 +0300
    Page content update date: Tue Dec 19 2023
    Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/3.renderer/templatesVariables.md b/docs/tech/3.renderer/templatesVariables.md index 5f5cf973..94aa6d2e 100644 --- a/docs/tech/3.renderer/templatesVariables.md +++ b/docs/tech/3.renderer/templatesVariables.md @@ -11,4 +11,4 @@ There are several variables available in each processed template.

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Mon Nov 20 20:31:30 2023 +0300
    Page content update date: Mon Dec 18 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Mon Nov 20 20:31:30 2023 +0300
    Page content update date: Tue Dec 19 2023
    Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/4.pluginSystem/readme.md b/docs/tech/4.pluginSystem/readme.md index 8ca1596b..d3b4e7c2 100644 --- a/docs/tech/4.pluginSystem/readme.md +++ b/docs/tech/4.pluginSystem/readme.md @@ -190,4 +190,4 @@ plugins:

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Mon Nov 20 23:05:39 2023 +0300
    Page content update date: Mon Dec 18 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Mon Nov 20 23:05:39 2023 +0300
    Page content update date: Tue Dec 19 2023
    Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/classes/App.md b/docs/tech/classes/App.md index 30d213df..158fab37 100644 --- a/docs/tech/classes/App.md +++ b/docs/tech/classes/App.md @@ -2,7 +2,7 @@ BumbleDocGen / Technical description of the project / Class map / App

    - App class: + App class:

    @@ -44,7 +44,7 @@ class App extends \Symfony\Component\Console\Application ```php diff --git a/docs/tech/classes/Configuration.md b/docs/tech/classes/Configuration.md index ce3d0316..150df3a5 100644 --- a/docs/tech/classes/Configuration.md +++ b/docs/tech/classes/Configuration.md @@ -159,7 +159,7 @@ public function __construct(\BumbleDocGen\Core\Configuration\ConfigurationParame ```php @@ -193,7 +193,7 @@ public function getAdditionalConsoleCommands(): \BumbleDocGen\Console\Command\Ad ```php @@ -242,7 +242,7 @@ public function getConfigurationVersion(): string; ```php @@ -263,7 +263,7 @@ public function getDocGenLibDir(): string; ```php @@ -291,7 +291,7 @@ public function getGitClientPath(): string; ```php @@ -336,7 +336,7 @@ public function getIfExists(mixed $key): null|string; ```php @@ -370,7 +370,7 @@ public function getLanguageHandlersCollection(): \BumbleDocGen\LanguageHandler\L ```php @@ -398,7 +398,7 @@ public function getOutputDir(): string; ```php @@ -426,7 +426,7 @@ public function getOutputDirBaseUrl(): string; ```php @@ -460,7 +460,7 @@ public function getPageLinkProcessor(): \BumbleDocGen\Core\Renderer\PageLinkProc ```php @@ -584,7 +584,7 @@ public function getTemplatesDir(): string; ```php @@ -618,7 +618,7 @@ public function getTwigFilters(): \BumbleDocGen\Core\Renderer\Twig\Filter\Custom ```php @@ -652,7 +652,7 @@ public function getTwigFunctions(): \BumbleDocGen\Core\Renderer\Twig\Function\Cu ```php @@ -680,7 +680,7 @@ public function getWorkingDir(): string; ```php @@ -708,7 +708,7 @@ public function isCheckFileInGitBeforeCreatingDocEnabled(): bool; ```php diff --git a/docs/tech/classes/ConfigurationCommand.md b/docs/tech/classes/ConfigurationCommand.md index eaa07bbd..7ff6f270 100644 --- a/docs/tech/classes/ConfigurationCommand.md +++ b/docs/tech/classes/ConfigurationCommand.md @@ -15,7 +15,7 @@ namespace BumbleDocGen\Console\Command; final class ConfigurationCommand extends \BumbleDocGen\Console\Command\BaseCommand ``` -
    Base class for all commands.
    + @@ -30,126 +30,8 @@ final class ConfigurationCommand extends \BumbleDocGen\Console\Command\BaseComma -

    Methods:

    - -
      -
    1. - addArgument - - Adds an argument.
    2. -
    3. - addOption - - Adds an option.
    4. -
    5. - addUsage - - Add a command usage example, it'll be prefixed with the command name.
    6. -
    7. - complete - - Adds suggestions to $suggestions for the current completion input (e.g. option or argument).
    8. -
    9. - getAliases - - Returns the aliases for the command.
    10. -
    11. - getApplication - - Gets the application instance for this command.
    12. -
    13. - getDefaultDescription -
    14. -
    15. - getDefaultName -
    16. -
    17. - getDefinition - - Gets the InputDefinition attached to this Command.
    18. -
    19. - getDescription - - Returns the description for the command.
    20. -
    21. - getHelp - - Returns the help for the command.
    22. -
    23. - getHelper - - Gets a helper instance by name.
    24. -
    25. - getHelperSet - - Gets the helper set.
    26. -
    27. - getName - - Returns the command name.
    28. -
    29. - getNativeDefinition - - Gets the InputDefinition to be used to create representations of this Command.
    30. -
    31. - getProcessedHelp - - Returns the processed help for the command replacing the %command.name% and %command.full_name% patterns with the real values dynamically.
    32. -
    33. - getSynopsis - - Returns the synopsis for the command.
    34. -
    35. - getUsages - - Returns alternative usages of the command.
    36. -
    37. - ignoreValidationErrors - - Ignores validation errors.
    38. -
    39. - isEnabled - - Checks whether the command is enabled or not in the current environment.
    40. -
    41. - isHidden -
    42. -
    43. - mergeApplicationDefinition - - Merges the application definition with the command definition.
    44. -
    45. - run - - Runs the command.
    46. -
    47. - setAliases - - Sets the aliases for the command.
    48. -
    49. - setApplication -
    50. -
    51. - setCode - - Sets the code to execute when running this command.
    52. -
    53. - setDefinition - - Sets an array of argument and option instances.
    54. -
    55. - setDescription - - Sets the description for the command.
    56. -
    57. - setHelp - - Sets the help for the command.
    58. -
    59. - setHelperSet -
    60. -
    61. - setHidden -
    62. -
    63. - setName - - Sets the name of the command.
    64. -
    65. - setProcessTitle - - Sets the process title of the command.
    66. -
    -

    Constants:

    - @@ -187,1195 +69,11 @@ public function __construct(string $name = null); $name string - The name of the command; passing null means it must be set in configure() - - - - - - -Throws: - - - -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function addArgument(string $name, int $mode = null, string $description = '', mixed $default = null): static; -``` - -
    Adds an argument.
    - -Parameters: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $namestring-
    $modeintThe argument mode: InputArgument::REQUIRED or InputArgument::OPTIONAL
    $descriptionstring-
    $defaultmixedThe default value (for InputArgument::OPTIONAL mode only)
    - -Return value: static - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function addOption(string $name, string|array $shortcut = null, int $mode = null, string $description = '', mixed $default = null): static; -``` - -
    Adds an option.
    - -Parameters: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $namestring-
    $shortcutstring | arrayThe shortcuts, can be null, a string of shortcuts delimited by | or an array of shortcuts
    $modeintThe option mode: One of the InputOption::VALUE_* constants
    $descriptionstring-
    $defaultmixedThe default value (must be null for InputOption::VALUE_NONE)
    - -Return value: static - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function addUsage(string $usage): static; -``` - -
    Add a command usage example, it'll be prefixed with the command name.
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $usagestring-
    - -Return value: static - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function complete(\Symfony\Component\Console\Completion\CompletionInput $input, \Symfony\Component\Console\Completion\CompletionSuggestions $suggestions): void; -``` - -
    Adds suggestions to $suggestions for the current completion input (e.g. option or argument).
    - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $input\Symfony\Component\Console\Completion\CompletionInput-
    $suggestions\Symfony\Component\Console\Completion\CompletionSuggestions-
    - -Return value: void - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function getAliases(): array; -``` - -
    Returns the aliases for the command.
    - -Parameters: not specified - -Return value: array - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function getApplication(): \Symfony\Component\Console\Application|null; -``` - -
    Gets the application instance for this command.
    - -Parameters: not specified - -Return value: \Symfony\Component\Console\Application | null - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public static function getDefaultDescription(): string|null; -``` - - - -Parameters: not specified - -Return value: string | null - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public static function getDefaultName(): string|null; -``` - - - -Parameters: not specified - -Return value: string | null - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function getDefinition(): \Symfony\Component\Console\Input\InputDefinition; -``` - -
    Gets the InputDefinition attached to this Command.
    - -Parameters: not specified - -Return value: \Symfony\Component\Console\Input\InputDefinition - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function getDescription(): string; -``` - -
    Returns the description for the command.
    - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function getHelp(): string; -``` - -
    Returns the help for the command.
    - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function getHelper(string $name): mixed; -``` - -
    Gets a helper instance by name.
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $namestring-
    - -Return value: mixed - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function getHelperSet(): \Symfony\Component\Console\Helper\HelperSet|null; -``` - -
    Gets the helper set.
    - -Parameters: not specified - -Return value: \Symfony\Component\Console\Helper\HelperSet | null - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function getName(): string|null; -``` - -
    Returns the command name.
    - -Parameters: not specified - -Return value: string | null - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function getNativeDefinition(): \Symfony\Component\Console\Input\InputDefinition; -``` - -
    Gets the InputDefinition to be used to create representations of this Command.
    - -Parameters: not specified - -Return value: \Symfony\Component\Console\Input\InputDefinition - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function getProcessedHelp(): string; -``` - -
    Returns the processed help for the command replacing the %command.name% and -%command.full_name% patterns with the real values dynamically.
    - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function getSynopsis(bool $short = false): string; -``` - -
    Returns the synopsis for the command.
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $shortboolWhether to show the short version of the synopsis (with options folded) or not
    - -Return value: string - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function getUsages(): array; -``` - -
    Returns alternative usages of the command.
    - -Parameters: not specified - -Return value: array - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function ignoreValidationErrors(): mixed; -``` - -
    Ignores validation errors.
    - -Parameters: not specified - -Return value: mixed - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function isEnabled(): bool; -``` - -
    Checks whether the command is enabled or not in the current environment.
    - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function isHidden(): bool; -``` - - - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - -
      -
    • # - mergeApplicationDefinition - :warning: Is internal | source code
    • -
    - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function mergeApplicationDefinition(bool $mergeArgs = true): mixed; -``` - -
    Merges the application definition with the command definition.
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $mergeArgsboolWhether to merge or not the Application definition arguments to Command definition arguments
    - -Return value: mixed - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function run(\Symfony\Component\Console\Input\InputInterface $input, \Symfony\Component\Console\Output\OutputInterface $output): int; -``` - -
    Runs the command.
    - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $input\Symfony\Component\Console\Input\InputInterface-
    $output\Symfony\Component\Console\Output\OutputInterface-
    - -Return value: int - - -Throws: - - - -See: - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function setAliases(iterable $aliases): static; -``` - -
    Sets the aliases for the command.
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $aliasesiterableAn array of aliases for the command
    - -Return value: static - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function setApplication(\Symfony\Component\Console\Application $application = null): mixed; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $application\Symfony\Component\Console\Application-
    - -Return value: mixed - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function setCode(callable $code): static; -``` - -
    Sets the code to execute when running this command.
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $codecallableA callable(InputInterface $input, OutputInterface $output)
    - -Return value: static - - -Throws: - - - -See: - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function setDefinition(array|\Symfony\Component\Console\Input\InputDefinition $definition): static; -``` - -
    Sets an array of argument and option instances.
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $definitionarray | \Symfony\Component\Console\Input\InputDefinition-
    - -Return value: static - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function setDescription(string $description): static; -``` - -
    Sets the description for the command.
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $descriptionstring-
    - -Return value: static - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function setHelp(string $help): static; -``` - -
    Sets the help for the command.
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $helpstring-
    - -Return value: static - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function setHelperSet(\Symfony\Component\Console\Helper\HelperSet $helperSet): mixed; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $helperSet\Symfony\Component\Console\Helper\HelperSet-
    - -Return value: mixed - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function setHidden(bool $hidden = true): static; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $hiddenboolWhether or not the command should be hidden from the list of commands
    - -Return value: static - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function setName(string $name): static; -``` - -
    Sets the name of the command.
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $namestring-
    - -Return value: static - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function setProcessTitle(string $title): static; -``` - -
    Sets the process title of the command.
    - -Parameters: - - - - - - - - - - - - -
    NameTypeDescription
    $titlestring -
    -Return value: static
    diff --git a/docs/tech/classes/Configuration_2.md b/docs/tech/classes/Configuration_2.md index 1920a55d..11ece911 100644 --- a/docs/tech/classes/Configuration_2.md +++ b/docs/tech/classes/Configuration_2.md @@ -159,7 +159,7 @@ public function __construct(\BumbleDocGen\Core\Configuration\ConfigurationParame ```php @@ -193,7 +193,7 @@ public function getAdditionalConsoleCommands(): \BumbleDocGen\Console\Command\Ad ```php @@ -242,7 +242,7 @@ public function getConfigurationVersion(): string; ```php @@ -263,7 +263,7 @@ public function getDocGenLibDir(): string; ```php @@ -291,7 +291,7 @@ public function getGitClientPath(): string; ```php @@ -336,7 +336,7 @@ public function getIfExists(mixed $key): null|string; ```php @@ -370,7 +370,7 @@ public function getLanguageHandlersCollection(): \BumbleDocGen\LanguageHandler\L ```php @@ -398,7 +398,7 @@ public function getOutputDir(): string; ```php @@ -426,7 +426,7 @@ public function getOutputDirBaseUrl(): string; ```php @@ -460,7 +460,7 @@ public function getPageLinkProcessor(): \BumbleDocGen\Core\Renderer\PageLinkProc ```php @@ -584,7 +584,7 @@ public function getTemplatesDir(): string; ```php @@ -618,7 +618,7 @@ public function getTwigFilters(): \BumbleDocGen\Core\Renderer\Twig\Filter\Custom ```php @@ -652,7 +652,7 @@ public function getTwigFunctions(): \BumbleDocGen\Core\Renderer\Twig\Function\Cu ```php @@ -680,7 +680,7 @@ public function getWorkingDir(): string; ```php @@ -708,7 +708,7 @@ public function isCheckFileInGitBeforeCreatingDocEnabled(): bool; ```php diff --git a/docs/tech/classes/CustomFiltersCollection.md b/docs/tech/classes/CustomFiltersCollection.md index 165f8d0b..59618bdf 100644 --- a/docs/tech/classes/CustomFiltersCollection.md +++ b/docs/tech/classes/CustomFiltersCollection.md @@ -41,6 +41,9 @@ final class CustomFiltersCollection implements \IteratorAggregate
  • getTwigFilters
  • +
  • + keys +
  • @@ -205,6 +208,27 @@ public function getTwigFilters(): \Generator; Return value: \Generator + +
    +
    + + + +```php +public function keys(): array; +``` + + + +Parameters: not specified + +Return value: array + +

    diff --git a/docs/tech/classes/CustomFunctionsCollection.md b/docs/tech/classes/CustomFunctionsCollection.md index 740c517b..f641c7d6 100644 --- a/docs/tech/classes/CustomFunctionsCollection.md +++ b/docs/tech/classes/CustomFunctionsCollection.md @@ -44,6 +44,9 @@ final class CustomFunctionsCollection implements \IteratorAggregate
  • has
  • +
  • + keys +
  • @@ -246,6 +249,27 @@ public function has(string $key): bool; Return value: bool + +
    +
    + + + +```php +public function keys(): array; +``` + + + +Parameters: not specified + +Return value: array + +

    diff --git a/docs/tech/classes/DocGenerator.md b/docs/tech/classes/DocGenerator.md index 4839f9e4..6a0c9d0d 100644 --- a/docs/tech/classes/DocGenerator.md +++ b/docs/tech/classes/DocGenerator.md @@ -2,7 +2,7 @@ BumbleDocGen / Technical description of the project / Class map / DocGenerator

    - DocGenerator class: + DocGenerator class:

    @@ -42,6 +42,12 @@ final class DocGenerator
  • generateReadmeTemplate - Creates a `README.md` template filled with basic information using LLM
  • +
  • + getConfigurationKey +
  • +
  • + getConfigurationKeys +
  • parseAndGetRootEntityCollectionsGroup
  • @@ -52,11 +58,11 @@ final class DocGenerator @@ -71,7 +77,7 @@ final class DocGenerator ```php @@ -166,7 +172,7 @@ public function __construct(\Symfony\Component\Console\Style\OutputStyle $io, \B ```php @@ -220,7 +226,7 @@ public function addDocBlocks(\BumbleDocGen\AI\ProviderInterface $aiProvider): vo ```php @@ -251,7 +257,7 @@ public function generate(): void; ```php @@ -282,6 +288,91 @@ public function generateReadmeTemplate(\BumbleDocGen\AI\ProviderInterface $aiPro Return value: void +Throws: + + + +
    +
    + + + +```php +public function getConfigurationKey(string $key): void; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $keystring-
    + +Return value: void + + +Throws: + + +
    +
    +
    + + + +```php +public function getConfigurationKeys(): void; +``` + + + +Parameters: not specified + +Return value: void + + Throws:
    • @@ -302,7 +393,7 @@ public function generateReadmeTemplate(\BumbleDocGen\AI\ProviderInterface $aiPro ```php diff --git a/docs/tech/classes/LanguageHandlersCollection.md b/docs/tech/classes/LanguageHandlersCollection.md index c10f9b32..c2407460 100644 --- a/docs/tech/classes/LanguageHandlersCollection.md +++ b/docs/tech/classes/LanguageHandlersCollection.md @@ -38,6 +38,9 @@ final class LanguageHandlersCollection implements \IteratorAggregate
    • getIterator
    • +
    • + keys +
    • @@ -181,6 +184,27 @@ public function getIterator(): \Generator; Return value: \Generator +
    +
    +
    + + + +```php +public function keys(): array; +``` + + + +Parameters: not specified + +Return value: array + +

    diff --git a/docs/tech/classes/PluginsCollection.md b/docs/tech/classes/PluginsCollection.md index 6a87f2d3..d3ad1f00 100644 --- a/docs/tech/classes/PluginsCollection.md +++ b/docs/tech/classes/PluginsCollection.md @@ -38,6 +38,9 @@ final class PluginsCollection implements \IteratorAggregate
  • getIterator
  • +
  • + keys +
  • @@ -181,6 +184,27 @@ public function getIterator(): \Generator; Return value: \Generator + +
    +
    + + + +```php +public function keys(): array; +``` + + + +Parameters: not specified + +Return value: array + +

    diff --git a/docs/tech/map.md b/docs/tech/map.md index c3a755ae..9073c6cb 100644 --- a/docs/tech/map.md +++ b/docs/tech/map.md @@ -21,6 +21,7 @@ Directory layout ( only documented files shown ): │ │ ├──Command/ │ │ │ ├── AdditionalCommandCollection.php │ │ │ ├── BaseCommand.php +│ │ │ ├── ConfigurationCommand.php │ │ │ └── GenerateCommand.php │ │ ├──ProgressBar/ │ │ │ ├── ProgressBarFactory.php @@ -46,6 +47,7 @@ Directory layout ( only documented files shown ): │ │ │ │ ├── ValueToClassTransformer.php Standard text-to-class transformer │ │ │ │ └── ValueTransformerInterface.php Interface defining classes that transform text configuration values into objects │ │ │ ├── Configuration.php Configuration project documentation +│ │ │ ├── ConfigurationKey.php │ │ │ ├── ConfigurationParameterBag.php Wrapper for getting raw configuration file data │ │ │ └── ReflectionApiConfig.php │ │ ├──Logger/ diff --git a/docs/tech/readme.md b/docs/tech/readme.md index 100cbab8..86e94726 100644 --- a/docs/tech/readme.md +++ b/docs/tech/readme.md @@ -44,4 +44,4 @@ After that, the process of parsing the project code according to the configurati

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Thu Oct 5 17:42:06 2023 +0300
    Page content update date: Mon Dec 18 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Thu Oct 5 17:42:06 2023 +0300
    Page content update date: Tue Dec 19 2023
    Made with Bumble Documentation Generator \ No newline at end of file From 7f345bca5c01a12ef75b8e36dc8db58c7d0ce66a Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Thu, 21 Dec 2023 13:33:35 +0300 Subject: [PATCH 149/210] Changing min php version to 8.1 --- composer.json | 4 +- composer.lock | 819 +++++++++++------- .../Handler/GenerationErrorsHandler.php | 7 +- 3 files changed, 512 insertions(+), 318 deletions(-) diff --git a/composer.json b/composer.json index a431e736..80c29a27 100644 --- a/composer.json +++ b/composer.json @@ -15,7 +15,7 @@ "issues": "https://github.com/bumble-tech/bumble-doc-gen/issues" }, "require": { - "php": "^8.0.0", + "php": "^8.1.0", "ext-zlib": "*", "ext-mbstring": "*", "symfony/console": "^6.0", @@ -25,7 +25,7 @@ "phpdocumentor/reflection-docblock": "^5.3", "doctrine/annotations": "^1.13", "nette/php-generator": "^4.0", - "monolog/monolog": "^2.5", + "monolog/monolog": "^3.0", "bramus/monolog-colored-line-formatter": "^3.0", "symfony/cache": "^6.0", "symfony/event-dispatcher": "^6.0", diff --git a/composer.lock b/composer.lock index 521c4e8d..66dfb0cb 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "360432be120c210d9c2955b3eb6c731a", + "content-hash": "d32b02956f16b2671cf86338e4ae8535", "packages": [ { "name": "bramus/ansi-php", @@ -52,25 +52,25 @@ }, { "name": "bramus/monolog-colored-line-formatter", - "version": "3.0.6", + "version": "3.1.2", "source": { "type": "git", "url": "https://github.com/bramus/monolog-colored-line-formatter.git", - "reference": "708891d34cb431d9ed56da91a53ecc2d8afdc24e" + "reference": "1ce52a13d5accdc425fb912f9b96c84f6be2ea72" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/bramus/monolog-colored-line-formatter/zipball/708891d34cb431d9ed56da91a53ecc2d8afdc24e", - "reference": "708891d34cb431d9ed56da91a53ecc2d8afdc24e", + "url": "https://api.github.com/repos/bramus/monolog-colored-line-formatter/zipball/1ce52a13d5accdc425fb912f9b96c84f6be2ea72", + "reference": "1ce52a13d5accdc425fb912f9b96c84f6be2ea72", "shasum": "" }, "require": { "bramus/ansi-php": "^3.0.3", - "php": "^7.2|^8.0" + "monolog/monolog": "~3.0", + "php": "^8.1" }, "require-dev": { - "monolog/monolog": "~2.0", - "phpunit/phpunit": "~7.0|^9.4" + "phpunit/phpunit": "~9.6" }, "type": "library", "autoload": { @@ -92,9 +92,15 @@ "description": "Colored Line Formatter for Monolog", "support": { "issues": "https://github.com/bramus/monolog-colored-line-formatter/issues", - "source": "https://github.com/bramus/monolog-colored-line-formatter/tree/3.0.6" + "source": "https://github.com/bramus/monolog-colored-line-formatter/tree/3.1.2" }, - "time": "2021-12-05T09:10:49+00:00" + "funding": [ + { + "url": "https://github.com/bramus", + "type": "github" + } + ], + "time": "2023-08-18T13:44:29+00:00" }, { "name": "doctrine/annotations", @@ -299,16 +305,16 @@ }, { "name": "guzzlehttp/guzzle", - "version": "7.8.0", + "version": "7.8.1", "source": { "type": "git", "url": "https://github.com/guzzle/guzzle.git", - "reference": "1110f66a6530a40fe7aea0378fe608ee2b2248f9" + "reference": "41042bc7ab002487b876a0683fc8dce04ddce104" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/1110f66a6530a40fe7aea0378fe608ee2b2248f9", - "reference": "1110f66a6530a40fe7aea0378fe608ee2b2248f9", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/41042bc7ab002487b876a0683fc8dce04ddce104", + "reference": "41042bc7ab002487b876a0683fc8dce04ddce104", "shasum": "" }, "require": { @@ -323,11 +329,11 @@ "psr/http-client-implementation": "1.0" }, "require-dev": { - "bamarni/composer-bin-plugin": "^1.8.1", + "bamarni/composer-bin-plugin": "^1.8.2", "ext-curl": "*", "php-http/client-integration-tests": "dev-master#2c025848417c1135031fdf9c728ee53d0a7ceaee as 3.0.999", "php-http/message-factory": "^1.1", - "phpunit/phpunit": "^8.5.29 || ^9.5.23", + "phpunit/phpunit": "^8.5.36 || ^9.6.15", "psr/log": "^1.1 || ^2.0 || ^3.0" }, "suggest": { @@ -405,7 +411,7 @@ ], "support": { "issues": "https://github.com/guzzle/guzzle/issues", - "source": "https://github.com/guzzle/guzzle/tree/7.8.0" + "source": "https://github.com/guzzle/guzzle/tree/7.8.1" }, "funding": [ { @@ -421,28 +427,28 @@ "type": "tidelift" } ], - "time": "2023-08-27T10:20:53+00:00" + "time": "2023-12-03T20:35:24+00:00" }, { "name": "guzzlehttp/promises", - "version": "2.0.1", + "version": "2.0.2", "source": { "type": "git", "url": "https://github.com/guzzle/promises.git", - "reference": "111166291a0f8130081195ac4556a5587d7f1b5d" + "reference": "bbff78d96034045e58e13dedd6ad91b5d1253223" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/promises/zipball/111166291a0f8130081195ac4556a5587d7f1b5d", - "reference": "111166291a0f8130081195ac4556a5587d7f1b5d", + "url": "https://api.github.com/repos/guzzle/promises/zipball/bbff78d96034045e58e13dedd6ad91b5d1253223", + "reference": "bbff78d96034045e58e13dedd6ad91b5d1253223", "shasum": "" }, "require": { "php": "^7.2.5 || ^8.0" }, "require-dev": { - "bamarni/composer-bin-plugin": "^1.8.1", - "phpunit/phpunit": "^8.5.29 || ^9.5.23" + "bamarni/composer-bin-plugin": "^1.8.2", + "phpunit/phpunit": "^8.5.36 || ^9.6.15" }, "type": "library", "extra": { @@ -488,7 +494,7 @@ ], "support": { "issues": "https://github.com/guzzle/promises/issues", - "source": "https://github.com/guzzle/promises/tree/2.0.1" + "source": "https://github.com/guzzle/promises/tree/2.0.2" }, "funding": [ { @@ -504,20 +510,20 @@ "type": "tidelift" } ], - "time": "2023-08-03T15:11:55+00:00" + "time": "2023-12-03T20:19:20+00:00" }, { "name": "guzzlehttp/psr7", - "version": "2.6.1", + "version": "2.6.2", "source": { "type": "git", "url": "https://github.com/guzzle/psr7.git", - "reference": "be45764272e8873c72dbe3d2edcfdfcc3bc9f727" + "reference": "45b30f99ac27b5ca93cb4831afe16285f57b8221" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/be45764272e8873c72dbe3d2edcfdfcc3bc9f727", - "reference": "be45764272e8873c72dbe3d2edcfdfcc3bc9f727", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/45b30f99ac27b5ca93cb4831afe16285f57b8221", + "reference": "45b30f99ac27b5ca93cb4831afe16285f57b8221", "shasum": "" }, "require": { @@ -531,9 +537,9 @@ "psr/http-message-implementation": "1.0" }, "require-dev": { - "bamarni/composer-bin-plugin": "^1.8.1", + "bamarni/composer-bin-plugin": "^1.8.2", "http-interop/http-factory-tests": "^0.9", - "phpunit/phpunit": "^8.5.29 || ^9.5.23" + "phpunit/phpunit": "^8.5.36 || ^9.6.15" }, "suggest": { "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" @@ -604,7 +610,7 @@ ], "support": { "issues": "https://github.com/guzzle/psr7/issues", - "source": "https://github.com/guzzle/psr7/tree/2.6.1" + "source": "https://github.com/guzzle/psr7/tree/2.6.2" }, "funding": [ { @@ -620,7 +626,7 @@ "type": "tidelift" } ], - "time": "2023-08-27T10:13:57+00:00" + "time": "2023-12-03T20:05:35+00:00" }, { "name": "hassankhan/config", @@ -686,16 +692,16 @@ }, { "name": "laravel/serializable-closure", - "version": "v1.3.2", + "version": "v1.3.3", "source": { "type": "git", "url": "https://github.com/laravel/serializable-closure.git", - "reference": "076fe2cf128bd54b4341cdc6d49b95b34e101e4c" + "reference": "3dbf8a8e914634c48d389c1234552666b3d43754" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/076fe2cf128bd54b4341cdc6d49b95b34e101e4c", - "reference": "076fe2cf128bd54b4341cdc6d49b95b34e101e4c", + "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/3dbf8a8e914634c48d389c1234552666b3d43754", + "reference": "3dbf8a8e914634c48d389c1234552666b3d43754", "shasum": "" }, "require": { @@ -742,46 +748,45 @@ "issues": "https://github.com/laravel/serializable-closure/issues", "source": "https://github.com/laravel/serializable-closure" }, - "time": "2023-10-17T13:38:16+00:00" + "time": "2023-11-08T14:08:06+00:00" }, { "name": "monolog/monolog", - "version": "2.9.2", + "version": "3.5.0", "source": { "type": "git", "url": "https://github.com/Seldaek/monolog.git", - "reference": "437cb3628f4cf6042cc10ae97fc2b8472e48ca1f" + "reference": "c915e2634718dbc8a4a15c61b0e62e7a44e14448" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/monolog/zipball/437cb3628f4cf6042cc10ae97fc2b8472e48ca1f", - "reference": "437cb3628f4cf6042cc10ae97fc2b8472e48ca1f", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/c915e2634718dbc8a4a15c61b0e62e7a44e14448", + "reference": "c915e2634718dbc8a4a15c61b0e62e7a44e14448", "shasum": "" }, "require": { - "php": ">=7.2", - "psr/log": "^1.0.1 || ^2.0 || ^3.0" + "php": ">=8.1", + "psr/log": "^2.0 || ^3.0" }, "provide": { - "psr/log-implementation": "1.0.0 || 2.0.0 || 3.0.0" + "psr/log-implementation": "3.0.0" }, "require-dev": { - "aws/aws-sdk-php": "^2.4.9 || ^3.0", + "aws/aws-sdk-php": "^3.0", "doctrine/couchdb": "~1.0@dev", "elasticsearch/elasticsearch": "^7 || ^8", "ext-json": "*", - "graylog2/gelf-php": "^1.4.2 || ^2@dev", - "guzzlehttp/guzzle": "^7.4", + "graylog2/gelf-php": "^1.4.2 || ^2.0", + "guzzlehttp/guzzle": "^7.4.5", "guzzlehttp/psr7": "^2.2", "mongodb/mongodb": "^1.8", "php-amqplib/php-amqplib": "~2.4 || ^3", - "phpspec/prophecy": "^1.15", - "phpstan/phpstan": "^0.12.91", - "phpunit/phpunit": "^8.5.14", - "predis/predis": "^1.1 || ^2.0", - "rollbar/rollbar": "^1.3 || ^2 || ^3", + "phpstan/phpstan": "^1.9", + "phpstan/phpstan-deprecation-rules": "^1.0", + "phpstan/phpstan-strict-rules": "^1.4", + "phpunit/phpunit": "^10.1", + "predis/predis": "^1.1 || ^2", "ruflin/elastica": "^7", - "swiftmailer/swiftmailer": "^5.3|^6.0", "symfony/mailer": "^5.4 || ^6", "symfony/mime": "^5.4 || ^6" }, @@ -804,7 +809,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "2.x-dev" + "dev-main": "3.x-dev" } }, "autoload": { @@ -832,7 +837,7 @@ ], "support": { "issues": "https://github.com/Seldaek/monolog/issues", - "source": "https://github.com/Seldaek/monolog/tree/2.9.2" + "source": "https://github.com/Seldaek/monolog/tree/3.5.0" }, "funding": [ { @@ -844,7 +849,7 @@ "type": "tidelift" } ], - "time": "2023-10-27T15:25:26+00:00" + "time": "2023-10-27T15:32:31+00:00" }, { "name": "nette/php-generator", @@ -1003,16 +1008,16 @@ }, { "name": "nikic/php-parser", - "version": "v4.17.1", + "version": "v4.18.0", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "a6303e50c90c355c7eeee2c4a8b27fe8dc8fef1d" + "reference": "1bcbb2179f97633e98bbbc87044ee2611c7d7999" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/a6303e50c90c355c7eeee2c4a8b27fe8dc8fef1d", - "reference": "a6303e50c90c355c7eeee2c4a8b27fe8dc8fef1d", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/1bcbb2179f97633e98bbbc87044ee2611c7d7999", + "reference": "1bcbb2179f97633e98bbbc87044ee2611c7d7999", "shasum": "" }, "require": { @@ -1053,9 +1058,9 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v4.17.1" + "source": "https://github.com/nikic/PHP-Parser/tree/v4.18.0" }, - "time": "2023-08-13T19:53:39+00:00" + "time": "2023-12-10T21:03:43+00:00" }, { "name": "php-di/invoker", @@ -1355,16 +1360,16 @@ }, { "name": "phpstan/phpdoc-parser", - "version": "1.24.2", + "version": "1.24.5", "source": { "type": "git", "url": "https://github.com/phpstan/phpdoc-parser.git", - "reference": "bcad8d995980440892759db0c32acae7c8e79442" + "reference": "fedf211ff14ec8381c9bf5714e33a7a552dd1acc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/bcad8d995980440892759db0c32acae7c8e79442", - "reference": "bcad8d995980440892759db0c32acae7c8e79442", + "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/fedf211ff14ec8381c9bf5714e33a7a552dd1acc", + "reference": "fedf211ff14ec8381c9bf5714e33a7a552dd1acc", "shasum": "" }, "require": { @@ -1396,9 +1401,9 @@ "description": "PHPDoc parser with support for nullable, intersection and generic types", "support": { "issues": "https://github.com/phpstan/phpdoc-parser/issues", - "source": "https://github.com/phpstan/phpdoc-parser/tree/1.24.2" + "source": "https://github.com/phpstan/phpdoc-parser/tree/1.24.5" }, - "time": "2023-09-26T12:28:12+00:00" + "time": "2023-12-16T09:33:33+00:00" }, { "name": "psr/cache", @@ -1808,25 +1813,25 @@ }, { "name": "symfony/cache", - "version": "v6.0.19", + "version": "v6.4.0", "source": { "type": "git", "url": "https://github.com/symfony/cache.git", - "reference": "81ca309f056e836480928b20280ec52ce8369bb3" + "reference": "ac2d25f97b17eec6e19760b6b9962a4f7c44356a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/cache/zipball/81ca309f056e836480928b20280ec52ce8369bb3", - "reference": "81ca309f056e836480928b20280ec52ce8369bb3", + "url": "https://api.github.com/repos/symfony/cache/zipball/ac2d25f97b17eec6e19760b6b9962a4f7c44356a", + "reference": "ac2d25f97b17eec6e19760b6b9962a4f7c44356a", "shasum": "" }, "require": { - "php": ">=8.0.2", + "php": ">=8.1", "psr/cache": "^2.0|^3.0", "psr/log": "^1.1|^2|^3", - "symfony/cache-contracts": "^1.1.7|^2|^3", - "symfony/service-contracts": "^1.1|^2|^3", - "symfony/var-exporter": "^5.4|^6.0" + "symfony/cache-contracts": "^2.5|^3", + "symfony/service-contracts": "^2.5|^3", + "symfony/var-exporter": "^6.3.6|^7.0" }, "conflict": { "doctrine/dbal": "<2.13.1", @@ -1841,21 +1846,24 @@ }, "require-dev": { "cache/integration-tests": "dev-master", - "doctrine/dbal": "^2.13.1|^3.0", - "predis/predis": "^1.1", + "doctrine/dbal": "^2.13.1|^3|^4", + "predis/predis": "^1.1|^2.0", "psr/simple-cache": "^1.0|^2.0|^3.0", - "symfony/config": "^5.4|^6.0", - "symfony/dependency-injection": "^5.4|^6.0", - "symfony/filesystem": "^5.4|^6.0", - "symfony/http-kernel": "^5.4|^6.0", - "symfony/messenger": "^5.4|^6.0", - "symfony/var-dumper": "^5.4|^6.0" + "symfony/config": "^5.4|^6.0|^7.0", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/filesystem": "^5.4|^6.0|^7.0", + "symfony/http-kernel": "^5.4|^6.0|^7.0", + "symfony/messenger": "^5.4|^6.0|^7.0", + "symfony/var-dumper": "^5.4|^6.0|^7.0" }, "type": "library", "autoload": { "psr-4": { "Symfony\\Component\\Cache\\": "" }, + "classmap": [ + "Traits/ValueWrapper.php" + ], "exclude-from-classmap": [ "/Tests/" ] @@ -1881,7 +1889,7 @@ "psr6" ], "support": { - "source": "https://github.com/symfony/cache/tree/v6.0.19" + "source": "https://github.com/symfony/cache/tree/v6.4.0" }, "funding": [ { @@ -1897,33 +1905,30 @@ "type": "tidelift" } ], - "time": "2023-01-20T17:44:14+00:00" + "time": "2023-11-24T19:28:07+00:00" }, { "name": "symfony/cache-contracts", - "version": "v3.0.2", + "version": "v3.4.0", "source": { "type": "git", "url": "https://github.com/symfony/cache-contracts.git", - "reference": "1c0a181c9ee221afe4fa55b2d13fc63c5ae14348" + "reference": "1d74b127da04ffa87aa940abe15446fa89653778" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/cache-contracts/zipball/1c0a181c9ee221afe4fa55b2d13fc63c5ae14348", - "reference": "1c0a181c9ee221afe4fa55b2d13fc63c5ae14348", + "url": "https://api.github.com/repos/symfony/cache-contracts/zipball/1d74b127da04ffa87aa940abe15446fa89653778", + "reference": "1d74b127da04ffa87aa940abe15446fa89653778", "shasum": "" }, "require": { - "php": ">=8.0.2", + "php": ">=8.1", "psr/cache": "^3.0" }, - "suggest": { - "symfony/cache-implementation": "" - }, "type": "library", "extra": { "branch-alias": { - "dev-main": "3.0-dev" + "dev-main": "3.4-dev" }, "thanks": { "name": "symfony/contracts", @@ -1960,7 +1965,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/cache-contracts/tree/v3.0.2" + "source": "https://github.com/symfony/cache-contracts/tree/v3.4.0" }, "funding": [ { @@ -1976,27 +1981,28 @@ "type": "tidelift" } ], - "time": "2022-01-02T09:55:41+00:00" + "time": "2023-09-25T12:52:38+00:00" }, { "name": "symfony/console", - "version": "v6.0.19", + "version": "v6.4.1", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "c3ebc83d031b71c39da318ca8b7a07ecc67507ed" + "reference": "a550a7c99daeedef3f9d23fb82e3531525ff11fd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/c3ebc83d031b71c39da318ca8b7a07ecc67507ed", - "reference": "c3ebc83d031b71c39da318ca8b7a07ecc67507ed", + "url": "https://api.github.com/repos/symfony/console/zipball/a550a7c99daeedef3f9d23fb82e3531525ff11fd", + "reference": "a550a7c99daeedef3f9d23fb82e3531525ff11fd", "shasum": "" }, "require": { - "php": ">=8.0.2", + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-mbstring": "~1.0", - "symfony/service-contracts": "^1.1|^2|^3", - "symfony/string": "^5.4|^6.0" + "symfony/service-contracts": "^2.5|^3", + "symfony/string": "^5.4|^6.0|^7.0" }, "conflict": { "symfony/dependency-injection": "<5.4", @@ -2010,18 +2016,16 @@ }, "require-dev": { "psr/log": "^1|^2|^3", - "symfony/config": "^5.4|^6.0", - "symfony/dependency-injection": "^5.4|^6.0", - "symfony/event-dispatcher": "^5.4|^6.0", - "symfony/lock": "^5.4|^6.0", - "symfony/process": "^5.4|^6.0", - "symfony/var-dumper": "^5.4|^6.0" - }, - "suggest": { - "psr/log": "For using the console logger", - "symfony/event-dispatcher": "", - "symfony/lock": "", - "symfony/process": "" + "symfony/config": "^5.4|^6.0|^7.0", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/event-dispatcher": "^5.4|^6.0|^7.0", + "symfony/http-foundation": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/lock": "^5.4|^6.0|^7.0", + "symfony/messenger": "^5.4|^6.0|^7.0", + "symfony/process": "^5.4|^6.0|^7.0", + "symfony/stopwatch": "^5.4|^6.0|^7.0", + "symfony/var-dumper": "^5.4|^6.0|^7.0" }, "type": "library", "autoload": { @@ -2050,12 +2054,12 @@ "homepage": "https://symfony.com", "keywords": [ "cli", - "command line", + "command-line", "console", "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v6.0.19" + "source": "https://github.com/symfony/console/tree/v6.4.1" }, "funding": [ { @@ -2071,29 +2075,29 @@ "type": "tidelift" } ], - "time": "2023-01-01T08:36:10+00:00" + "time": "2023-11-30T10:54:28+00:00" }, { "name": "symfony/deprecation-contracts", - "version": "v3.0.2", + "version": "v3.4.0", "source": { "type": "git", "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "26954b3d62a6c5fd0ea8a2a00c0353a14978d05c" + "reference": "7c3aff79d10325257a001fcf92d991f24fc967cf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/26954b3d62a6c5fd0ea8a2a00c0353a14978d05c", - "reference": "26954b3d62a6c5fd0ea8a2a00c0353a14978d05c", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/7c3aff79d10325257a001fcf92d991f24fc967cf", + "reference": "7c3aff79d10325257a001fcf92d991f24fc967cf", "shasum": "" }, "require": { - "php": ">=8.0.2" + "php": ">=8.1" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "3.0-dev" + "dev-main": "3.4-dev" }, "thanks": { "name": "symfony/contracts", @@ -2122,7 +2126,7 @@ "description": "A generic function and convention to trigger deprecation notices", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v3.0.2" + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.4.0" }, "funding": [ { @@ -2138,28 +2142,29 @@ "type": "tidelift" } ], - "time": "2022-01-02T09:55:41+00:00" + "time": "2023-05-23T14:45:45+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v6.0.19", + "version": "v6.4.0", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "2eaf8e63bc5b8cefabd4a800157f0d0c094f677a" + "reference": "d76d2632cfc2206eecb5ad2b26cd5934082941b6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/2eaf8e63bc5b8cefabd4a800157f0d0c094f677a", - "reference": "2eaf8e63bc5b8cefabd4a800157f0d0c094f677a", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/d76d2632cfc2206eecb5ad2b26cd5934082941b6", + "reference": "d76d2632cfc2206eecb5ad2b26cd5934082941b6", "shasum": "" }, "require": { - "php": ">=8.0.2", - "symfony/event-dispatcher-contracts": "^2|^3" + "php": ">=8.1", + "symfony/event-dispatcher-contracts": "^2.5|^3" }, "conflict": { - "symfony/dependency-injection": "<5.4" + "symfony/dependency-injection": "<5.4", + "symfony/service-contracts": "<2.5" }, "provide": { "psr/event-dispatcher-implementation": "1.0", @@ -2167,17 +2172,13 @@ }, "require-dev": { "psr/log": "^1|^2|^3", - "symfony/config": "^5.4|^6.0", - "symfony/dependency-injection": "^5.4|^6.0", - "symfony/error-handler": "^5.4|^6.0", - "symfony/expression-language": "^5.4|^6.0", - "symfony/http-foundation": "^5.4|^6.0", - "symfony/service-contracts": "^1.1|^2|^3", - "symfony/stopwatch": "^5.4|^6.0" - }, - "suggest": { - "symfony/dependency-injection": "", - "symfony/http-kernel": "" + "symfony/config": "^5.4|^6.0|^7.0", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/error-handler": "^5.4|^6.0|^7.0", + "symfony/expression-language": "^5.4|^6.0|^7.0", + "symfony/http-foundation": "^5.4|^6.0|^7.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/stopwatch": "^5.4|^6.0|^7.0" }, "type": "library", "autoload": { @@ -2205,7 +2206,7 @@ "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/event-dispatcher/tree/v6.0.19" + "source": "https://github.com/symfony/event-dispatcher/tree/v6.4.0" }, "funding": [ { @@ -2221,33 +2222,30 @@ "type": "tidelift" } ], - "time": "2023-01-01T08:36:10+00:00" + "time": "2023-07-27T06:52:43+00:00" }, { "name": "symfony/event-dispatcher-contracts", - "version": "v3.0.2", + "version": "v3.4.0", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher-contracts.git", - "reference": "7bc61cc2db649b4637d331240c5346dcc7708051" + "reference": "a76aed96a42d2b521153fb382d418e30d18b59df" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/7bc61cc2db649b4637d331240c5346dcc7708051", - "reference": "7bc61cc2db649b4637d331240c5346dcc7708051", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/a76aed96a42d2b521153fb382d418e30d18b59df", + "reference": "a76aed96a42d2b521153fb382d418e30d18b59df", "shasum": "" }, "require": { - "php": ">=8.0.2", + "php": ">=8.1", "psr/event-dispatcher": "^1" }, - "suggest": { - "symfony/event-dispatcher-implementation": "" - }, "type": "library", "extra": { "branch-alias": { - "dev-main": "3.0-dev" + "dev-main": "3.4-dev" }, "thanks": { "name": "symfony/contracts", @@ -2284,7 +2282,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.0.2" + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.4.0" }, "funding": [ { @@ -2300,24 +2298,24 @@ "type": "tidelift" } ], - "time": "2022-01-02T09:55:41+00:00" + "time": "2023-05-23T14:45:45+00:00" }, { "name": "symfony/filesystem", - "version": "v6.0.19", + "version": "v6.4.0", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "3d49eec03fda1f0fc19b7349fbbe55ebc1004214" + "reference": "952a8cb588c3bc6ce76f6023000fb932f16a6e59" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/3d49eec03fda1f0fc19b7349fbbe55ebc1004214", - "reference": "3d49eec03fda1f0fc19b7349fbbe55ebc1004214", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/952a8cb588c3bc6ce76f6023000fb932f16a6e59", + "reference": "952a8cb588c3bc6ce76f6023000fb932f16a6e59", "shasum": "" }, "require": { - "php": ">=8.0.2", + "php": ">=8.1", "symfony/polyfill-ctype": "~1.8", "symfony/polyfill-mbstring": "~1.8" }, @@ -2347,7 +2345,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v6.0.19" + "source": "https://github.com/symfony/filesystem/tree/v6.4.0" }, "funding": [ { @@ -2363,24 +2361,27 @@ "type": "tidelift" } ], - "time": "2023-01-20T17:44:14+00:00" + "time": "2023-07-26T17:27:13+00:00" }, { "name": "symfony/finder", - "version": "v6.0.19", + "version": "v6.4.0", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "5cc9cac6586fc0c28cd173780ca696e419fefa11" + "reference": "11d736e97f116ac375a81f96e662911a34cd50ce" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/5cc9cac6586fc0c28cd173780ca696e419fefa11", - "reference": "5cc9cac6586fc0c28cd173780ca696e419fefa11", + "url": "https://api.github.com/repos/symfony/finder/zipball/11d736e97f116ac375a81f96e662911a34cd50ce", + "reference": "11d736e97f116ac375a81f96e662911a34cd50ce", "shasum": "" }, "require": { - "php": ">=8.0.2" + "php": ">=8.1" + }, + "require-dev": { + "symfony/filesystem": "^6.0|^7.0" }, "type": "library", "autoload": { @@ -2408,7 +2409,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v6.0.19" + "source": "https://github.com/symfony/finder/tree/v6.4.0" }, "funding": [ { @@ -2424,7 +2425,7 @@ "type": "tidelift" } ], - "time": "2023-01-20T17:44:14+00:00" + "time": "2023-10-31T17:30:12+00:00" }, { "name": "symfony/polyfill-ctype", @@ -2756,34 +2757,114 @@ ], "time": "2023-07-28T09:04:16+00:00" }, + { + "name": "symfony/polyfill-php80", + "version": "v1.28.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php80.git", + "reference": "6caa57379c4aec19c0a12a38b59b26487dcfe4b5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/6caa57379c4aec19c0a12a38b59b26487dcfe4b5", + "reference": "6caa57379c4aec19c0a12a38b59b26487dcfe4b5", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.28-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php80\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ion Bazan", + "email": "ion.bazan@gmail.com" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php80/tree/v1.28.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-01-26T09:26:14+00:00" + }, { "name": "symfony/service-contracts", - "version": "v3.0.2", + "version": "v3.4.0", "source": { "type": "git", "url": "https://github.com/symfony/service-contracts.git", - "reference": "d78d39c1599bd1188b8e26bb341da52c3c6d8a66" + "reference": "b3313c2dbffaf71c8de2934e2ea56ed2291a3838" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/d78d39c1599bd1188b8e26bb341da52c3c6d8a66", - "reference": "d78d39c1599bd1188b8e26bb341da52c3c6d8a66", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/b3313c2dbffaf71c8de2934e2ea56ed2291a3838", + "reference": "b3313c2dbffaf71c8de2934e2ea56ed2291a3838", "shasum": "" }, "require": { - "php": ">=8.0.2", + "php": ">=8.1", "psr/container": "^2.0" }, "conflict": { "ext-psr": "<1.1|>=2" }, - "suggest": { - "symfony/service-implementation": "" - }, "type": "library", "extra": { "branch-alias": { - "dev-main": "3.0-dev" + "dev-main": "3.4-dev" }, "thanks": { "name": "symfony/contracts", @@ -2793,7 +2874,10 @@ "autoload": { "psr-4": { "Symfony\\Contracts\\Service\\": "" - } + }, + "exclude-from-classmap": [ + "/Test/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -2820,7 +2904,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/service-contracts/tree/v3.0.2" + "source": "https://github.com/symfony/service-contracts/tree/v3.4.0" }, "funding": [ { @@ -2836,37 +2920,38 @@ "type": "tidelift" } ], - "time": "2022-05-30T19:17:58+00:00" + "time": "2023-07-30T20:28:31+00:00" }, { "name": "symfony/string", - "version": "v6.0.19", + "version": "v6.4.0", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "d9e72497367c23e08bf94176d2be45b00a9d232a" + "reference": "b45fcf399ea9c3af543a92edf7172ba21174d809" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/d9e72497367c23e08bf94176d2be45b00a9d232a", - "reference": "d9e72497367c23e08bf94176d2be45b00a9d232a", + "url": "https://api.github.com/repos/symfony/string/zipball/b45fcf399ea9c3af543a92edf7172ba21174d809", + "reference": "b45fcf399ea9c3af543a92edf7172ba21174d809", "shasum": "" }, "require": { - "php": ">=8.0.2", + "php": ">=8.1", "symfony/polyfill-ctype": "~1.8", "symfony/polyfill-intl-grapheme": "~1.0", "symfony/polyfill-intl-normalizer": "~1.0", "symfony/polyfill-mbstring": "~1.0" }, "conflict": { - "symfony/translation-contracts": "<2.0" + "symfony/translation-contracts": "<2.5" }, "require-dev": { - "symfony/error-handler": "^5.4|^6.0", - "symfony/http-client": "^5.4|^6.0", - "symfony/translation-contracts": "^2.0|^3.0", - "symfony/var-exporter": "^5.4|^6.0" + "symfony/error-handler": "^5.4|^6.0|^7.0", + "symfony/http-client": "^5.4|^6.0|^7.0", + "symfony/intl": "^6.2|^7.0", + "symfony/translation-contracts": "^2.5|^3.0", + "symfony/var-exporter": "^5.4|^6.0|^7.0" }, "type": "library", "autoload": { @@ -2905,7 +2990,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v6.0.19" + "source": "https://github.com/symfony/string/tree/v6.4.0" }, "funding": [ { @@ -2921,27 +3006,28 @@ "type": "tidelift" } ], - "time": "2023-01-01T08:36:10+00:00" + "time": "2023-11-28T20:41:49+00:00" }, { "name": "symfony/var-exporter", - "version": "v6.0.19", + "version": "v6.4.1", "source": { "type": "git", "url": "https://github.com/symfony/var-exporter.git", - "reference": "df56f53818c2d5d9f683f4ad2e365ba73a3b69d2" + "reference": "2d08ca6b9cc704dce525615d1e6d1788734f36d9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-exporter/zipball/df56f53818c2d5d9f683f4ad2e365ba73a3b69d2", - "reference": "df56f53818c2d5d9f683f4ad2e365ba73a3b69d2", + "url": "https://api.github.com/repos/symfony/var-exporter/zipball/2d08ca6b9cc704dce525615d1e6d1788734f36d9", + "reference": "2d08ca6b9cc704dce525615d1e6d1788734f36d9", "shasum": "" }, "require": { - "php": ">=8.0.2" + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3" }, "require-dev": { - "symfony/var-dumper": "^5.4|^6.0" + "symfony/var-dumper": "^5.4|^6.0|^7.0" }, "type": "library", "autoload": { @@ -2974,10 +3060,12 @@ "export", "hydrate", "instantiate", + "lazy-loading", + "proxy", "serialize" ], "support": { - "source": "https://github.com/symfony/var-exporter/tree/v6.0.19" + "source": "https://github.com/symfony/var-exporter/tree/v6.4.1" }, "funding": [ { @@ -2993,34 +3081,32 @@ "type": "tidelift" } ], - "time": "2023-01-13T08:34:10+00:00" + "time": "2023-11-30T10:32:10+00:00" }, { "name": "symfony/yaml", - "version": "v6.0.19", + "version": "v6.4.0", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "deec3a812a0305a50db8ae689b183f43d915c884" + "reference": "4f9237a1bb42455d609e6687d2613dde5b41a587" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/deec3a812a0305a50db8ae689b183f43d915c884", - "reference": "deec3a812a0305a50db8ae689b183f43d915c884", + "url": "https://api.github.com/repos/symfony/yaml/zipball/4f9237a1bb42455d609e6687d2613dde5b41a587", + "reference": "4f9237a1bb42455d609e6687d2613dde5b41a587", "shasum": "" }, "require": { - "php": ">=8.0.2", + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-ctype": "^1.8" }, "conflict": { "symfony/console": "<5.4" }, "require-dev": { - "symfony/console": "^5.4|^6.0" - }, - "suggest": { - "symfony/console": "For validating YAML files using the lint command" + "symfony/console": "^5.4|^6.0|^7.0" }, "bin": [ "Resources/bin/yaml-lint" @@ -3051,7 +3137,7 @@ "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v6.0.19" + "source": "https://github.com/symfony/yaml/tree/v6.4.0" }, "funding": [ { @@ -3067,30 +3153,31 @@ "type": "tidelift" } ], - "time": "2023-01-11T11:50:03+00:00" + "time": "2023-11-06T11:00:25+00:00" }, { "name": "twig/twig", - "version": "v3.7.1", + "version": "v3.8.0", "source": { "type": "git", "url": "https://github.com/twigphp/Twig.git", - "reference": "a0ce373a0ca3bf6c64b9e3e2124aca502ba39554" + "reference": "9d15f0ac07f44dc4217883ec6ae02fd555c6f71d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/Twig/zipball/a0ce373a0ca3bf6c64b9e3e2124aca502ba39554", - "reference": "a0ce373a0ca3bf6c64b9e3e2124aca502ba39554", + "url": "https://api.github.com/repos/twigphp/Twig/zipball/9d15f0ac07f44dc4217883ec6ae02fd555c6f71d", + "reference": "9d15f0ac07f44dc4217883ec6ae02fd555c6f71d", "shasum": "" }, "require": { "php": ">=7.2.5", "symfony/polyfill-ctype": "^1.8", - "symfony/polyfill-mbstring": "^1.3" + "symfony/polyfill-mbstring": "^1.3", + "symfony/polyfill-php80": "^1.22" }, "require-dev": { "psr/container": "^1.0|^2.0", - "symfony/phpunit-bridge": "^5.4.9|^6.3" + "symfony/phpunit-bridge": "^5.4.9|^6.3|^7.0" }, "type": "library", "autoload": { @@ -3126,7 +3213,7 @@ ], "support": { "issues": "https://github.com/twigphp/Twig/issues", - "source": "https://github.com/twigphp/Twig/tree/v3.7.1" + "source": "https://github.com/twigphp/Twig/tree/v3.8.0" }, "funding": [ { @@ -3138,7 +3225,7 @@ "type": "tidelift" } ], - "time": "2023-08-28T11:09:02+00:00" + "time": "2023-11-21T18:54:41+00:00" }, { "name": "webmozart/assert", @@ -3202,29 +3289,30 @@ "packages-dev": [ { "name": "captainhook/captainhook", - "version": "5.18.3", + "version": "5.19.2", "source": { "type": "git", "url": "https://github.com/captainhookphp/captainhook.git", - "reference": "b7bc503a40ccfe80ea9638e4921b4697669d725f" + "reference": "604bfc55fa40d6fe8c0275ca707ee80920b3b3f1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/captainhookphp/captainhook/zipball/b7bc503a40ccfe80ea9638e4921b4697669d725f", - "reference": "b7bc503a40ccfe80ea9638e4921b4697669d725f", + "url": "https://api.github.com/repos/captainhookphp/captainhook/zipball/604bfc55fa40d6fe8c0275ca707ee80920b3b3f1", + "reference": "604bfc55fa40d6fe8c0275ca707ee80920b3b3f1", "shasum": "" }, "require": { + "captainhook/secrets": "^0.9.4", "ext-json": "*", "ext-spl": "*", "ext-xml": "*", - "php": ">=7.4", + "php": ">=8.0", "sebastianfeldmann/camino": "^0.9.2", "sebastianfeldmann/cli": "^3.3", "sebastianfeldmann/git": "^3.9", - "symfony/console": "^2.7 || ^3.0 || ^4.0 || ^5.0 || ^6.0", - "symfony/filesystem": "^2.7 || ^3.0 || ^4.0 || ^5.0 || ^6.0", - "symfony/process": "^2.7 || ^3.0 || ^4.0 || ^5.0 || ^6.0" + "symfony/console": "^2.7 || ^3.0 || ^4.0 || ^5.0 || ^6.0 || ^7.0", + "symfony/filesystem": "^2.7 || ^3.0 || ^4.0 || ^5.0 || ^6.0 || ^7.0", + "symfony/process": "^2.7 || ^3.0 || ^4.0 || ^5.0 || ^6.0 || ^7.0" }, "replace": { "sebastianfeldmann/captainhook": "*" @@ -3261,7 +3349,7 @@ } ], "description": "PHP git hook manager", - "homepage": "https://github.com/captainhookphp/captainhook", + "homepage": "http://php.captainhook.info/", "keywords": [ "commit-msg", "git", @@ -3273,7 +3361,7 @@ ], "support": { "issues": "https://github.com/captainhookphp/captainhook/issues", - "source": "https://github.com/captainhookphp/captainhook/tree/5.18.3" + "source": "https://github.com/captainhookphp/captainhook/tree/5.19.2" }, "funding": [ { @@ -3281,7 +3369,7 @@ "type": "github" } ], - "time": "2023-11-05T13:56:19+00:00" + "time": "2023-12-18T14:06:12+00:00" }, { "name": "captainhook/plugin-composer", @@ -3338,6 +3426,62 @@ }, "time": "2022-01-28T04:35:22+00:00" }, + { + "name": "captainhook/secrets", + "version": "0.9.5", + "source": { + "type": "git", + "url": "https://github.com/captainhookphp/secrets.git", + "reference": "8aa90d5b9b7892abd11b9da2fc172a7b32b90cbe" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/captainhookphp/secrets/zipball/8aa90d5b9b7892abd11b9da2fc172a7b32b90cbe", + "reference": "8aa90d5b9b7892abd11b9da2fc172a7b32b90cbe", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": ">=8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "CaptainHook\\Secrets\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Sebastian Feldmann", + "email": "sf@sebastian-feldmann.info" + } + ], + "description": "Utility classes to detect secrets", + "keywords": [ + "commit-msg", + "keys", + "passwords", + "post-merge", + "prepare-commit-msg", + "secrets", + "tokens" + ], + "support": { + "issues": "https://github.com/captainhookphp/secrets/issues", + "source": "https://github.com/captainhookphp/secrets/tree/0.9.5" + }, + "funding": [ + { + "url": "https://github.com/sponsors/sebastianfeldmann", + "type": "github" + } + ], + "time": "2023-11-30T18:10:18+00:00" + }, { "name": "dg/bypass-finals", "version": "v1.5.1", @@ -3393,30 +3537,30 @@ }, { "name": "doctrine/instantiator", - "version": "1.5.0", + "version": "2.0.0", "source": { "type": "git", "url": "https://github.com/doctrine/instantiator.git", - "reference": "0a0fa9780f5d4e507415a065172d26a98d02047b" + "reference": "c6222283fa3f4ac679f8b9ced9a4e23f163e80d0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/instantiator/zipball/0a0fa9780f5d4e507415a065172d26a98d02047b", - "reference": "0a0fa9780f5d4e507415a065172d26a98d02047b", + "url": "https://api.github.com/repos/doctrine/instantiator/zipball/c6222283fa3f4ac679f8b9ced9a4e23f163e80d0", + "reference": "c6222283fa3f4ac679f8b9ced9a4e23f163e80d0", "shasum": "" }, "require": { - "php": "^7.1 || ^8.0" + "php": "^8.1" }, "require-dev": { - "doctrine/coding-standard": "^9 || ^11", + "doctrine/coding-standard": "^11", "ext-pdo": "*", "ext-phar": "*", - "phpbench/phpbench": "^0.16 || ^1", - "phpstan/phpstan": "^1.4", - "phpstan/phpstan-phpunit": "^1", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", - "vimeo/psalm": "^4.30 || ^5.4" + "phpbench/phpbench": "^1.2", + "phpstan/phpstan": "^1.9.4", + "phpstan/phpstan-phpunit": "^1.3", + "phpunit/phpunit": "^9.5.27", + "vimeo/psalm": "^5.4" }, "type": "library", "autoload": { @@ -3443,7 +3587,7 @@ ], "support": { "issues": "https://github.com/doctrine/instantiator/issues", - "source": "https://github.com/doctrine/instantiator/tree/1.5.0" + "source": "https://github.com/doctrine/instantiator/tree/2.0.0" }, "funding": [ { @@ -3459,7 +3603,7 @@ "type": "tidelift" } ], - "time": "2022-12-30T00:15:36+00:00" + "time": "2022-12-30T00:23:10+00:00" }, { "name": "myclabs/deep-copy", @@ -3952,16 +4096,16 @@ }, { "name": "phpunit/phpunit", - "version": "9.6.13", + "version": "9.6.15", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "f3d767f7f9e191eab4189abe41ab37797e30b1be" + "reference": "05017b80304e0eb3f31d90194a563fd53a6021f1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/f3d767f7f9e191eab4189abe41ab37797e30b1be", - "reference": "f3d767f7f9e191eab4189abe41ab37797e30b1be", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/05017b80304e0eb3f31d90194a563fd53a6021f1", + "reference": "05017b80304e0eb3f31d90194a563fd53a6021f1", "shasum": "" }, "require": { @@ -4035,7 +4179,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.13" + "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.15" }, "funding": [ { @@ -4051,7 +4195,7 @@ "type": "tidelift" } ], - "time": "2023-09-19T05:39:22+00:00" + "time": "2023-12-01T16:55:19+00:00" }, { "name": "roave/security-advisories", @@ -4059,20 +4203,21 @@ "source": { "type": "git", "url": "https://github.com/Roave/SecurityAdvisories.git", - "reference": "c4fd7758ddbe86b94226ad8c96d1f5fcbb19dbc5" + "reference": "bdde663d321b2d2130c2f88e2607c2edf4071f2c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/c4fd7758ddbe86b94226ad8c96d1f5fcbb19dbc5", - "reference": "c4fd7758ddbe86b94226ad8c96d1f5fcbb19dbc5", + "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/bdde663d321b2d2130c2f88e2607c2edf4071f2c", + "reference": "bdde663d321b2d2130c2f88e2607c2edf4071f2c", "shasum": "" }, "conflict": { "3f/pygmentize": "<1.2", - "admidio/admidio": "<4.2.11", + "admidio/admidio": "<4.2.13", "adodb/adodb-php": "<=5.20.20|>=5.21,<=5.21.3", "aheinze/cockpit": "<2.2", "aimeos/aimeos-typo3": "<19.10.12|>=20,<20.10.5", + "airesvsg/acf-to-rest-api": "<=3.1", "akaunting/akaunting": "<2.1.13", "akeneo/pim-community-dev": "<5.0.119|>=6,<6.0.53", "alextselegidis/easyappointments": "<1.5", @@ -4111,7 +4256,7 @@ "baserproject/basercms": "<4.8", "bassjobsen/bootstrap-3-typeahead": ">4.0.2", "bigfork/silverstripe-form-capture": ">=3,<3.1.1", - "billz/raspap-webgui": "<=2.9.2", + "billz/raspap-webgui": "<2.9.5", "bk2k/bootstrap-package": ">=7.1,<7.1.2|>=8,<8.0.8|>=9,<9.0.4|>=9.1,<9.1.3|>=10,<10.0.10|>=11,<11.0.3", "bmarshall511/wordpress_zero_spam": "<5.2.13", "bolt/bolt": "<3.7.2", @@ -4141,10 +4286,10 @@ "codeception/codeception": "<3.1.3|>=4,<4.1.22", "codeigniter/framework": "<3.1.9", "codeigniter4/framework": "<=4.4.2", - "codeigniter4/shield": "<1.0.0.0-beta4", + "codeigniter4/shield": "<1.0.0.0-beta8", "codiad/codiad": "<=2.8.4", "composer/composer": "<1.10.27|>=2,<2.2.22|>=2.3,<2.6.4", - "concrete5/concrete5": "<=9.2.1", + "concrete5/concrete5": "<9.2.2", "concrete5/core": "<8.5.8|>=9,<9.1", "contao-components/mediaelement": ">=2.14.2,<2.21.1", "contao/contao": ">=4,<4.4.56|>=4.5,<4.9.40|>=4.10,<4.11.7|>=4.13,<4.13.21|>=5.1,<5.1.4", @@ -4166,7 +4311,7 @@ "derhansen/fe_change_pwd": "<2.0.5|>=3,<3.0.3", "derhansen/sf_event_mgt": "<4.3.1|>=5,<5.1.1", "desperado/xml-bundle": "<=0.1.7", - "directmailteam/direct-mail": "<5.2.4", + "directmailteam/direct-mail": "<6.0.3|>=7,<7.0.3|>=8,<9.5.2", "doctrine/annotations": "<1.2.7", "doctrine/cache": "<1.3.2|>=1.4,<1.4.2", "doctrine/common": "<2.4.3|>=2.5,<2.5.1", @@ -4177,14 +4322,17 @@ "doctrine/mongodb-odm-bundle": "<3.0.1", "doctrine/orm": ">=2,<2.4.8|>=2.5,<2.5.1|>=2.8.3,<2.8.4", "dolibarr/dolibarr": "<18.0.2", - "dompdf/dompdf": "<2.0.2|==2.0.2", - "drupal/core": "<9.4.14|>=9.5,<9.5.8|>=10,<10.0.8", + "dompdf/dompdf": "<2.0.4", + "doublethreedigital/guest-entries": "<3.1.2", + "drupal/core": "<9.5.11|>=10,<10.0.11|>=10.1,<10.1.4", "drupal/drupal": ">=6,<6.38|>=7,<7.80|>=8,<8.9.16|>=9,<9.1.12|>=9.2,<9.2.4", + "duncanmcclean/guest-entries": "<3.1.2", "dweeves/magmi": "<=0.7.24", "ecodev/newsletter": "<=4", "ectouch/ectouch": "<=2.7.2", "elefant/cms": "<2.0.7", "elgg/elgg": "<3.3.24|>=4,<4.0.5", + "elijaa/phpmemcacheadmin": "<=1.3", "encore/laravel-admin": "<=1.8.19", "endroid/qr-code-bundle": "<3.4.2", "enshrined/svg-sanitize": "<0.15", @@ -4207,7 +4355,7 @@ "ezsystems/ezplatform-solr-search-engine": ">=1.7,<1.7.12|>=2,<2.0.2|>=3.3,<3.3.15", "ezsystems/ezplatform-user": ">=1,<1.0.1", "ezsystems/ezpublish-kernel": "<6.13.8.2-dev|>=7,<7.5.31", - "ezsystems/ezpublish-legacy": "<=2017.12.7.3|>=2018.6,<=2019.03.5.1", + "ezsystems/ezpublish-legacy": "<=2017.12.7.3|>=2018.06,<=2019.03.5.1", "ezsystems/platform-ui-assets-bundle": ">=4.2,<4.2.3", "ezsystems/repository-forms": ">=2.3,<2.3.2.1-dev|>=2.5,<2.5.15", "ezyang/htmlpurifier": "<4.1.1", @@ -4241,7 +4389,7 @@ "friendsoftypo3/mediace": ">=7.6.2,<7.6.5", "friendsoftypo3/openid": ">=4.5,<4.5.31|>=4.7,<4.7.16|>=6,<6.0.11|>=6.1,<6.1.6", "froala/wysiwyg-editor": "<3.2.7|>=4.0.1,<=4.1.1", - "froxlor/froxlor": "<2.1", + "froxlor/froxlor": "<2.1.0.0-beta1", "fuel/core": "<1.8.1", "funadmin/funadmin": "<=3.2|>=3.3.2,<=3.3.3", "gaoming13/wechat-php-sdk": "<=1.10.2", @@ -4287,7 +4435,7 @@ "illuminate/encryption": ">=4,<=4.0.11|>=4.1,<=4.1.31|>=4.2,<=4.2.22|>=5,<=5.0.35|>=5.1,<=5.1.46|>=5.2,<=5.2.45|>=5.3,<=5.3.31|>=5.4,<=5.4.36|>=5.5,<5.5.40|>=5.6,<5.6.15", "illuminate/view": "<6.20.42|>=7,<7.30.6|>=8,<8.75", "impresscms/impresscms": "<=1.4.5", - "in2code/femanager": "<5.5.3|>=6,<6.3.4|>=7,<7.2.2", + "in2code/femanager": "<5.5.3|>=6,<6.3.4|>=7,<7.2.3", "in2code/ipandlanguageredirect": "<5.1.2", "in2code/lux": "<17.6.1|>=18,<24.0.2", "innologi/typo3-appointments": "<2.0.6", @@ -4354,12 +4502,16 @@ "mautic/core": "<4.3", "mediawiki/core": ">=1.27,<1.27.6|>=1.29,<1.29.3|>=1.30,<1.30.2|>=1.31,<1.31.9|>=1.32,<1.32.6|>=1.32.99,<1.33.3|>=1.33.99,<1.34.3|>=1.34.99,<1.35", "mediawiki/matomo": "<2.4.3", + "mediawiki/semantic-media-wiki": "<4.0.2", "melisplatform/melis-asset-manager": "<5.0.1", "melisplatform/melis-cms": "<5.0.1", "melisplatform/melis-front": "<5.0.1", "mezzio/mezzio-swoole": "<3.7|>=4,<4.3", "mgallegos/laravel-jqgrid": "<=1.3", - "microweber/microweber": "<2.0.3", + "microsoft/microsoft-graph": ">=1.16,<1.109.1|>=2.0.0.0-RC1-dev,<2.0.1", + "microsoft/microsoft-graph-beta": "<2.0.1", + "microsoft/microsoft-graph-core": "<2.0.2", + "microweber/microweber": "<=2.0.4", "miniorange/miniorange-saml": "<1.4.3", "mittwald/typo3_forum": "<1.2.1", "mobiledetect/mobiledetectlib": "<2.8.32", @@ -4371,6 +4523,9 @@ "mos/cimage": "<0.7.19", "movim/moxl": ">=0.8,<=0.10", "mpdf/mpdf": "<=7.1.7", + "munkireport/comment": "<4.1", + "munkireport/managedinstalls": "<2.6", + "munkireport/munkireport": ">=2.5.3,<5.6.3", "mustache/mustache": ">=2,<2.14.1", "namshi/jose": "<2.2", "neoan3-apps/template": "<1.1.1", @@ -4395,19 +4550,22 @@ "october/cms": "<1.0.469|==1.0.469|==1.0.471|==1.1.1", "october/october": "<=3.4.4", "october/rain": "<1.0.472|>=1.1,<1.1.2", - "october/system": "<1.0.476|>=1.1,<1.1.12|>=2,<2.2.34|>=3,<3.0.66", + "october/system": "<1.0.476|>=1.1,<1.1.12|>=2,<2.2.34|>=3,<3.5.2", "omeka/omeka-s": "<4.0.3", "onelogin/php-saml": "<2.10.4", "oneup/uploader-bundle": "<1.9.3|>=2,<2.1.5", "open-web-analytics/open-web-analytics": "<1.7.4", "opencart/opencart": "<=3.0.3.7|>=4,<4.0.2.3-dev", "openid/php-openid": "<2.3", - "openmage/magento-lts": "<=19.5|>=20,<=20.1", + "openmage/magento-lts": "<20.2", "opensource-workshop/connect-cms": "<1.7.2|>=2,<2.3.2", "orchid/platform": ">=9,<9.4.4|>=14.0.0.0-alpha4,<14.5", + "oro/calendar-bundle": ">=4.2,<=4.2.6|>=5,<=5.0.6|>=5.1,<5.1.1", "oro/commerce": ">=4.1,<5.0.11|>=5.1,<5.1.1", "oro/crm": ">=1.7,<1.7.4|>=3.1,<4.1.17|>=4.2,<4.2.7", - "oro/platform": ">=1.7,<1.7.4|>=3.1,<3.1.29|>=4.1,<4.1.17|>=4.2,<4.2.8", + "oro/crm-call-bundle": ">=4.2,<=4.2.5|>=5,<5.0.4|>=5.1,<5.1.1", + "oro/customer-portal": ">=4.2,<=4.2.8|>=5,<5.0.11|>=5.1,<5.1.1", + "oro/platform": ">=1.7,<1.7.4|>=3.1,<3.1.29|>=4.1,<4.1.17|>=4.2,<=4.2.10|>=5,<5.0.8", "oxid-esales/oxideshop-ce": "<4.5", "packbackbooks/lti-1-3-php-library": "<5", "padraic/humbug_get_contents": "<1.1.2", @@ -4422,6 +4580,7 @@ "pegasus/google-for-jobs": "<1.5.1|>=2,<2.1.1", "personnummer/personnummer": "<3.0.2", "phanan/koel": "<5.1.4", + "phenx/php-svg-lib": "<0.5.1", "php-mod/curl": "<2.3.2", "phpbb/phpbb": "<3.2.10|>=3.3,<3.3.1", "phpfastcache/phpfastcache": "<6.1.5|>=7,<7.1.2|>=8,<8.0.7", @@ -4431,23 +4590,24 @@ "phpmyfaq/phpmyfaq": "<=3.1.7", "phpoffice/phpexcel": "<1.8", "phpoffice/phpspreadsheet": "<1.16", - "phpseclib/phpseclib": "<2.0.31|>=3,<3.0.19", + "phpseclib/phpseclib": "<2.0.31|>=3,<3.0.34", "phpservermon/phpservermon": "<3.6", - "phpsysinfo/phpsysinfo": "<3.2.5", + "phpsysinfo/phpsysinfo": "<3.4.3", "phpunit/phpunit": ">=4.8.19,<4.8.28|>=5,<5.6.3", "phpwhois/phpwhois": "<=4.2.5", "phpxmlrpc/extras": "<0.6.1", "phpxmlrpc/phpxmlrpc": "<4.9.2", "pi/pi": "<=2.5", - "pimcore/admin-ui-classic-bundle": "<1.2", + "pimcore/admin-ui-classic-bundle": "<1.2.2", "pimcore/customer-management-framework-bundle": "<3.4.2", "pimcore/data-hub": "<1.2.4", "pimcore/demo": "<10.3", "pimcore/perspective-editor": "<1.5.1", - "pimcore/pimcore": "<11.1", + "pimcore/pimcore": "<11.1.1", "pixelfed/pixelfed": "<=0.11.4", "pocketmine/bedrock-protocol": "<8.0.2", "pocketmine/pocketmine-mp": "<=4.23|>=5,<5.3.1", + "pocketmine/raklib": ">=0.14,<0.14.6|>=0.15,<0.15.1", "pressbooks/pressbooks": "<5.18", "prestashop/autoupgrade": ">=4,<4.10.1", "prestashop/blockreassurance": "<=5.1.3", @@ -4466,6 +4626,7 @@ "pterodactyl/panel": "<1.7", "ptheofan/yii2-statemachine": ">=2.0.0.0-RC1-dev,<=2", "ptrofimov/beanstalk_console": "<1.7.14", + "pubnub/pubnub": "<6.1", "pusher/pusher-php-server": "<2.2.1", "pwweb/laravel-core": "<=0.3.6.0-beta", "pyrocms/pyrocms": "<=3.9.1", @@ -4478,6 +4639,7 @@ "really-simple-plugins/complianz-gdpr": "<6.4.2", "remdex/livehelperchat": "<3.99", "reportico-web/reportico": "<=7.1.21", + "rhukster/dom-sanitizer": "<1.0.7", "rmccue/requests": ">=1.6,<1.8", "robrichards/xmlseclibs": "<3.0.4", "roots/soil": "<4.1", @@ -4516,11 +4678,12 @@ "silverstripe/userforms": "<3", "silverstripe/versioned-admin": ">=1,<1.11.1", "simple-updates/phpwhois": "<=1", - "simplesamlphp/saml2": "<1.15.4|>=2,<2.3.8|>=3,<3.1.4", + "simplesamlphp/saml2": "<1.15.4|>=2,<2.3.8|>=3,<3.1.4|==5.0.0.0-alpha12", "simplesamlphp/simplesamlphp": "<1.18.6", "simplesamlphp/simplesamlphp-module-infocard": "<1.0.1", "simplesamlphp/simplesamlphp-module-openid": "<1", "simplesamlphp/simplesamlphp-module-openidprovider": "<0.9", + "simplesamlphp/xml-security": "==1.6.11", "simplito/elliptic-php": "<1.0.6", "sitegeist/fluid-components": "<3.5", "sjbr/sr-freecap": "<2.4.6|>=2.5,<2.5.3", @@ -4537,7 +4700,7 @@ "spoonity/tcpdf": "<6.2.22", "squizlabs/php_codesniffer": ">=1,<2.8.1|>=3,<3.0.1", "ssddanbrown/bookstack": "<22.02.3", - "statamic/cms": "<4.10", + "statamic/cms": "<4.36", "stormpath/sdk": "<9.9.99", "studio-42/elfinder": "<2.1.62", "subhh/libconnect": "<7.0.8|>=8,<8.1", @@ -4546,6 +4709,7 @@ "sumocoders/framework-user-bundle": "<1.4", "swag/paypal": "<5.4.4", "swiftmailer/swiftmailer": ">=4,<5.4.5", + "swiftyedit/swiftyedit": "<1.2", "sylius/admin-bundle": ">=1,<1.0.17|>=1.1,<1.1.9|>=1.2,<1.2.2", "sylius/grid": ">=1,<1.1.19|>=1.2,<1.2.18|>=1.3,<1.3.13|>=1.4,<1.4.5|>=1.5,<1.5.1", "sylius/grid-bundle": "<1.10.1", @@ -4577,17 +4741,21 @@ "symfony/security-core": ">=2.4,<2.6.13|>=2.7,<2.7.9|>=2.7.30,<2.7.32|>=2.8,<3.4.49|>=4,<4.4.24|>=5,<5.2.9", "symfony/security-csrf": ">=2.4,<2.7.48|>=2.8,<2.8.41|>=3,<3.3.17|>=3.4,<3.4.11|>=4,<4.0.11", "symfony/security-guard": ">=2.8,<3.4.48|>=4,<4.4.23|>=5,<5.2.8", - "symfony/security-http": ">=2.3,<2.3.41|>=2.4,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.2.12|>=4.3,<4.3.8|>=4.4,<4.4.7|>=5,<5.0.7|>=5.1,<5.2.8|>=5.3,<5.3.2", + "symfony/security-http": ">=2.3,<2.3.41|>=2.4,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.2.12|>=4.3,<4.3.8|>=4.4,<4.4.7|>=5,<5.0.7|>=5.1,<5.2.8|>=5.3,<5.3.2|>=5.4,<5.4.31|>=6,<6.3.8", "symfony/serializer": ">=2,<2.0.11|>=4.1,<4.4.35|>=5,<5.3.12", - "symfony/symfony": "<4.4.50|>=5,<5.4.20|>=6,<6.0.20|>=6.1,<6.1.12|>=6.2,<6.2.6", + "symfony/symfony": "<4.4.51|>=5,<5.4.31|>=6,<6.3.8", "symfony/translation": ">=2,<2.0.17", + "symfony/twig-bridge": ">=2,<4.4.51|>=5,<5.4.31|>=6,<6.3.8", "symfony/ux-autocomplete": "<2.11.2", "symfony/validator": ">=2,<2.0.24|>=2.1,<2.1.12|>=2.2,<2.2.5|>=2.3,<2.3.3", "symfony/var-exporter": ">=4.2,<4.2.12|>=4.3,<4.3.8", "symfony/web-profiler-bundle": ">=2,<2.3.19|>=2.4,<2.4.9|>=2.5,<2.5.4", + "symfony/webhook": ">=6.3,<6.3.8", "symfony/yaml": ">=2,<2.0.22|>=2.1,<2.1.7", + "symphonycms/symphony-2": "<2.6.4", "t3/dce": "<0.11.5|>=2.2,<2.6.2", "t3g/svg-sanitizer": "<1.0.3", + "t3s/content-consent": "<1.0.3|>=2,<2.0.2", "tastyigniter/tastyigniter": "<3.3", "tcg/voyager": "<=1.4", "tecnickcom/tcpdf": "<6.2.22", @@ -4598,7 +4766,7 @@ "thinkcmf/thinkcmf": "<=5.1.7", "thorsten/phpmyfaq": "<3.2.2", "tikiwiki/tiki-manager": "<=17.1", - "tinymce/tinymce": "<5.10.8|>=6,<6.7.1", + "tinymce/tinymce": "<5.10.9|>=6,<6.7.3", "tinymighty/wiki-seo": "<1.2.2", "titon/framework": "<9.9.99", "tobiasbg/tablepress": "<=2.0.0.0-RC1", @@ -4612,19 +4780,20 @@ "twig/twig": "<1.44.7|>=2,<2.15.3|>=3,<3.4.3", "typo3/cms": "<9.5.29|>=10,<10.4.35|>=11,<11.5.23|>=12,<12.2", "typo3/cms-backend": ">=7,<=7.6.50|>=8,<=8.7.39|>=9,<=9.5.24|>=10,<=10.4.13|>=11,<=11.1", - "typo3/cms-core": "<8.7.51|>=9,<9.5.42|>=10,<10.4.39|>=11,<11.5.30|>=12,<12.4.4", + "typo3/cms-core": "<8.7.55|>=9,<9.5.44|>=10,<10.4.41|>=11,<11.5.33|>=12,<12.4.8", "typo3/cms-extbase": "<6.2.24|>=7,<7.6.8|==8.1.1", "typo3/cms-form": ">=8,<=8.7.39|>=9,<=9.5.24|>=10,<=10.4.13|>=11,<=11.1", + "typo3/cms-install": ">=12.2,<12.4.8", "typo3/cms-rte-ckeditor": ">=9.5,<9.5.42|>=10,<10.4.39|>=11,<11.5.30", "typo3/flow": ">=1,<1.0.4|>=1.1,<1.1.1|>=2,<2.0.1|>=2.3,<2.3.16|>=3,<3.0.12|>=3.1,<3.1.10|>=3.2,<3.2.13|>=3.3,<3.3.13|>=4,<4.0.6", - "typo3/html-sanitizer": ">=1,<1.5.1|>=2,<2.1.2", + "typo3/html-sanitizer": ">=1,<=1.5.2|>=2,<=2.1.3", "typo3/neos": ">=1.1,<1.1.3|>=1.2,<1.2.13|>=2,<2.0.4|>=2.3,<2.3.99|>=3,<3.0.20|>=3.1,<3.1.18|>=3.2,<3.2.14|>=3.3,<3.3.23|>=4,<4.0.17|>=4.1,<4.1.16|>=4.2,<4.2.12|>=4.3,<4.3.3", "typo3/phar-stream-wrapper": ">=1,<2.1.1|>=3,<3.1.1", "typo3/swiftmailer": ">=4.1,<4.1.99|>=5.4,<5.4.5", "typo3fluid/fluid": ">=2,<2.0.8|>=2.1,<2.1.7|>=2.2,<2.2.4|>=2.3,<2.3.7|>=2.4,<2.4.4|>=2.5,<2.5.11|>=2.6,<2.6.10", "ua-parser/uap-php": "<3.8", "uasoft-indonesia/badaso": "<=2.9.7", - "unisharp/laravel-filemanager": "<=2.5.1", + "unisharp/laravel-filemanager": "<2.6.4", "userfrosting/userfrosting": ">=0.3.1,<4.6.3", "usmanhalalit/pixie": "<1.0.3|>=2,<2.0.2", "uvdesk/community-skeleton": "<=1.1.1", @@ -4658,8 +4827,9 @@ "yetiforce/yetiforce-crm": "<=6.4", "yidashi/yii2cmf": "<=2", "yii2mod/yii2-cms": "<1.9.2", - "yiisoft/yii": "<1.1.27", + "yiisoft/yii": "<1.1.29", "yiisoft/yii2": "<2.0.38", + "yiisoft/yii2-authclient": "<2.2.15", "yiisoft/yii2-bootstrap": "<2.0.4", "yiisoft/yii2-dev": "<2.0.43", "yiisoft/yii2-elasticsearch": "<2.0.5", @@ -4705,7 +4875,7 @@ "zf-commons/zfc-user": "<1.2.2", "zfcampus/zf-apigility-doctrine": "<1.0.3", "zfr/zfr-oauth2-server-module": "<0.1.2", - "zoujingli/thinkadmin": "<6.0.22" + "zoujingli/thinkadmin": "<=6.1.53" }, "default-branch": true, "type": "metapackage", @@ -4743,7 +4913,7 @@ "type": "tidelift" } ], - "time": "2023-11-09T23:04:23+00:00" + "time": "2023-12-20T21:04:04+00:00" }, { "name": "sebastian/cli-parser", @@ -5886,16 +6056,16 @@ }, { "name": "squizlabs/php_codesniffer", - "version": "3.7.2", + "version": "3.8.0", "source": { "type": "git", - "url": "https://github.com/squizlabs/PHP_CodeSniffer.git", - "reference": "ed8e00df0a83aa96acf703f8c2979ff33341f879" + "url": "https://github.com/PHPCSStandards/PHP_CodeSniffer.git", + "reference": "5805f7a4e4958dbb5e944ef1e6edae0a303765e7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/ed8e00df0a83aa96acf703f8c2979ff33341f879", - "reference": "ed8e00df0a83aa96acf703f8c2979ff33341f879", + "url": "https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/5805f7a4e4958dbb5e944ef1e6edae0a303765e7", + "reference": "5805f7a4e4958dbb5e944ef1e6edae0a303765e7", "shasum": "" }, "require": { @@ -5905,7 +6075,7 @@ "php": ">=5.4.0" }, "require-dev": { - "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0" + "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0 || ^8.0 || ^9.0" }, "bin": [ "bin/phpcs", @@ -5924,39 +6094,62 @@ "authors": [ { "name": "Greg Sherwood", - "role": "lead" + "role": "Former lead" + }, + { + "name": "Juliette Reinders Folmer", + "role": "Current lead" + }, + { + "name": "Contributors", + "homepage": "https://github.com/PHPCSStandards/PHP_CodeSniffer/graphs/contributors" } ], "description": "PHP_CodeSniffer tokenizes PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.", - "homepage": "https://github.com/squizlabs/PHP_CodeSniffer", + "homepage": "https://github.com/PHPCSStandards/PHP_CodeSniffer", "keywords": [ "phpcs", "standards", "static analysis" ], "support": { - "issues": "https://github.com/squizlabs/PHP_CodeSniffer/issues", - "source": "https://github.com/squizlabs/PHP_CodeSniffer", - "wiki": "https://github.com/squizlabs/PHP_CodeSniffer/wiki" + "issues": "https://github.com/PHPCSStandards/PHP_CodeSniffer/issues", + "security": "https://github.com/PHPCSStandards/PHP_CodeSniffer/security/policy", + "source": "https://github.com/PHPCSStandards/PHP_CodeSniffer", + "wiki": "https://github.com/PHPCSStandards/PHP_CodeSniffer/wiki" }, - "time": "2023-02-22T23:07:41+00:00" + "funding": [ + { + "url": "https://github.com/PHPCSStandards", + "type": "github" + }, + { + "url": "https://github.com/jrfnl", + "type": "github" + }, + { + "url": "https://opencollective.com/php_codesniffer", + "type": "open_collective" + } + ], + "time": "2023-12-08T12:32:31+00:00" }, { "name": "symfony/process", - "version": "v6.0.19", + "version": "v6.4.0", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "2114fd60f26a296cc403a7939ab91478475a33d4" + "reference": "191703b1566d97a5425dc969e4350d32b8ef17aa" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/2114fd60f26a296cc403a7939ab91478475a33d4", - "reference": "2114fd60f26a296cc403a7939ab91478475a33d4", + "url": "https://api.github.com/repos/symfony/process/zipball/191703b1566d97a5425dc969e4350d32b8ef17aa", + "reference": "191703b1566d97a5425dc969e4350d32b8ef17aa", "shasum": "" }, "require": { - "php": ">=8.0.2" + "php": ">=8.1" }, "type": "library", "autoload": { @@ -5984,7 +6177,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v6.0.19" + "source": "https://github.com/symfony/process/tree/v6.4.0" }, "funding": [ { @@ -6000,20 +6193,20 @@ "type": "tidelift" } ], - "time": "2023-01-01T08:36:10+00:00" + "time": "2023-11-17T21:06:49+00:00" }, { "name": "theseer/tokenizer", - "version": "1.2.1", + "version": "1.2.2", "source": { "type": "git", "url": "https://github.com/theseer/tokenizer.git", - "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e" + "reference": "b2ad5003ca10d4ee50a12da31de12a5774ba6b96" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/theseer/tokenizer/zipball/34a41e998c2183e22995f158c581e7b5e755ab9e", - "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/b2ad5003ca10d4ee50a12da31de12a5774ba6b96", + "reference": "b2ad5003ca10d4ee50a12da31de12a5774ba6b96", "shasum": "" }, "require": { @@ -6042,7 +6235,7 @@ "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", "support": { "issues": "https://github.com/theseer/tokenizer/issues", - "source": "https://github.com/theseer/tokenizer/tree/1.2.1" + "source": "https://github.com/theseer/tokenizer/tree/1.2.2" }, "funding": [ { @@ -6050,7 +6243,7 @@ "type": "github" } ], - "time": "2021-07-28T10:34:58+00:00" + "time": "2023-11-20T00:12:19+00:00" } ], "aliases": [], @@ -6061,7 +6254,7 @@ "prefer-stable": false, "prefer-lowest": false, "platform": { - "php": "^8.0.0", + "php": "^8.1.0", "ext-zlib": "*", "ext-mbstring": "*" }, diff --git a/src/Core/Logger/Handler/GenerationErrorsHandler.php b/src/Core/Logger/Handler/GenerationErrorsHandler.php index b21143af..d2406095 100644 --- a/src/Core/Logger/Handler/GenerationErrorsHandler.php +++ b/src/Core/Logger/Handler/GenerationErrorsHandler.php @@ -7,6 +7,7 @@ use BumbleDocGen\Core\Renderer\Context\RendererContext; use Monolog\Handler\AbstractProcessingHandler; use Monolog\Logger; +use Monolog\LogRecord; final class GenerationErrorsHandler extends AbstractProcessingHandler { @@ -20,7 +21,7 @@ public function __construct( parent::__construct($level, $bubble); } - protected function write(array $record): void + protected function write(LogRecord $record): void { $initiator = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS)[3] ?? []; $fileName = str_replace([ @@ -38,8 +39,8 @@ protected function write(array $record): void } $this->records[] = [ - "type" => $record['level_name'], - "msg" => $record['message'], + "type" => $record->level->getName(), + "msg" => $record->message, 'initiator' => $initiator, 'isRenderingError' => boolval($this->rendererContext->getCurrentTemplateFilePatch()), 'currentDocumentedEntityWrapper' => $this->rendererContext->getCurrentDocumentedEntityWrapper()?->getDocumentTransformableEntity()?->getName() From dd175dc28b124fb6aa7c009e16c324945a99e590 Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Thu, 21 Dec 2023 13:33:49 +0300 Subject: [PATCH 150/210] Updating doc --- docs/README.md | 2 +- docs/shared_c.cache | 2 +- docs/tech/1.configuration/readme.md | 2 +- docs/tech/2.parser/entity.md | 2 +- docs/tech/2.parser/entityFilterCondition.md | 2 +- docs/tech/2.parser/readme.md | 2 +- .../reflectionApi/php/phpClassConstantReflectionApi.md | 2 +- .../reflectionApi/php/phpClassMethodReflectionApi.md | 2 +- .../reflectionApi/php/phpClassPropertyReflectionApi.md | 2 +- .../2.parser/reflectionApi/php/phpClassReflectionApi.md | 2 +- .../2.parser/reflectionApi/php/phpEntitiesCollection.md | 2 +- .../2.parser/reflectionApi/php/phpEnumReflectionApi.md | 2 +- .../reflectionApi/php/phpInterfaceReflectionApi.md | 2 +- .../2.parser/reflectionApi/php/phpTraitReflectionApi.md | 2 +- docs/tech/2.parser/reflectionApi/php/readme.md | 2 +- docs/tech/2.parser/reflectionApi/readme.md | 2 +- docs/tech/2.parser/sourceLocator.md | 2 +- docs/tech/3.renderer/01_templates.md | 2 +- docs/tech/3.renderer/02_breadcrumbs.md | 2 +- docs/tech/3.renderer/03_documentStructure.md | 2 +- docs/tech/3.renderer/04_twigCustomFilters.md | 2 +- docs/tech/3.renderer/05_twigCustomFunctions.md | 2 +- docs/tech/3.renderer/readme.md | 2 +- docs/tech/3.renderer/templatesDynamicBlocks.md | 2 +- docs/tech/3.renderer/templatesLinking.md | 2 +- docs/tech/3.renderer/templatesVariables.md | 2 +- docs/tech/4.pluginSystem/readme.md | 2 +- docs/tech/classes/GenerationErrorsHandler.md | 8 ++++---- docs/tech/map.md | 2 +- docs/tech/readme.md | 2 +- 30 files changed, 33 insertions(+), 33 deletions(-) diff --git a/docs/README.md b/docs/README.md index f805af43..0e67283f 100644 --- a/docs/README.md +++ b/docs/README.md @@ -95,4 +95,4 @@ To update this documentation, run the following command:

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Mon Dec 18 15:41:43 2023 +0300
    Page content update date: Tue Dec 19 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Mon Dec 18 15:41:43 2023 +0300
    Page content update date: Thu Dec 21 2023
    Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/shared_c.cache b/docs/shared_c.cache index 65f14249..14994f34 100644 --- a/docs/shared_c.cache +++ b/docs/shared_c.cache @@ -1 +1 @@ -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 \ No newline at end of file +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 \ No newline at end of file diff --git a/docs/tech/1.configuration/readme.md b/docs/tech/1.configuration/readme.md index c5ad1284..fea12134 100644 --- a/docs/tech/1.configuration/readme.md +++ b/docs/tech/1.configuration/readme.md @@ -223,4 +223,4 @@ The inheritance algorithm is as follows: scalar types can be overwritten by each

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Mon Nov 20 19:18:48 2023 +0300
    Page content update date: Tue Dec 19 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Mon Nov 20 19:18:48 2023 +0300
    Page content update date: Thu Dec 21 2023
    Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/2.parser/entity.md b/docs/tech/2.parser/entity.md index 50b1c5f4..1cc5c1da 100644 --- a/docs/tech/2.parser/entity.md +++ b/docs/tech/2.parser/entity.md @@ -144,4 +144,4 @@ These classes are a convenient wrapper for accessing data in templates:

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Tue Nov 21 16:24:59 2023 +0300
    Page content update date: Tue Dec 19 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Tue Nov 21 16:24:59 2023 +0300
    Page content update date: Thu Dec 21 2023
    Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/2.parser/entityFilterCondition.md b/docs/tech/2.parser/entityFilterCondition.md index 0837a7bf..8272587c 100644 --- a/docs/tech/2.parser/entityFilterCondition.md +++ b/docs/tech/2.parser/entityFilterCondition.md @@ -78,4 +78,4 @@ Filter condition for working with entities PHP language handler:

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Mon Nov 20 19:18:48 2023 +0300
    Page content update date: Tue Dec 19 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Mon Nov 20 19:18:48 2023 +0300
    Page content update date: Thu Dec 21 2023
    Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/2.parser/readme.md b/docs/tech/2.parser/readme.md index bf2485e1..354b820a 100644 --- a/docs/tech/2.parser/readme.md +++ b/docs/tech/2.parser/readme.md @@ -42,4 +42,4 @@ In this section, we show how the parser works and what components it consists of

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Wed Nov 29 11:54:40 2023 +0300
    Page content update date: Tue Dec 19 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Wed Nov 29 11:54:40 2023 +0300
    Page content update date: Thu Dec 21 2023
    Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/2.parser/reflectionApi/php/phpClassConstantReflectionApi.md b/docs/tech/2.parser/reflectionApi/php/phpClassConstantReflectionApi.md index 067c54af..58ff6b0c 100644 --- a/docs/tech/2.parser/reflectionApi/php/phpClassConstantReflectionApi.md +++ b/docs/tech/2.parser/reflectionApi/php/phpClassConstantReflectionApi.md @@ -47,4 +47,4 @@ $constantReflection = $classReflection->getConstant('constantName');

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Mon Dec 18 15:25:50 2023 +0300
    Page content update date: Tue Dec 19 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Mon Dec 18 15:25:50 2023 +0300
    Page content update date: Thu Dec 21 2023
    Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/2.parser/reflectionApi/php/phpClassMethodReflectionApi.md b/docs/tech/2.parser/reflectionApi/php/phpClassMethodReflectionApi.md index 7ced6c06..dacd8fd5 100644 --- a/docs/tech/2.parser/reflectionApi/php/phpClassMethodReflectionApi.md +++ b/docs/tech/2.parser/reflectionApi/php/phpClassMethodReflectionApi.md @@ -62,4 +62,4 @@ $methodReflection = $classReflection->getMethod('methodName');

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Mon Dec 18 15:25:50 2023 +0300
    Page content update date: Tue Dec 19 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Mon Dec 18 15:25:50 2023 +0300
    Page content update date: Thu Dec 21 2023
    Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/2.parser/reflectionApi/php/phpClassPropertyReflectionApi.md b/docs/tech/2.parser/reflectionApi/php/phpClassPropertyReflectionApi.md index 02b5ca68..4d40e0a0 100644 --- a/docs/tech/2.parser/reflectionApi/php/phpClassPropertyReflectionApi.md +++ b/docs/tech/2.parser/reflectionApi/php/phpClassPropertyReflectionApi.md @@ -53,4 +53,4 @@ $propertyReflection = $classReflection->getProperty('propertyName');

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Mon Dec 18 15:25:50 2023 +0300
    Page content update date: Tue Dec 19 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Mon Dec 18 15:25:50 2023 +0300
    Page content update date: Thu Dec 21 2023
    Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/2.parser/reflectionApi/php/phpClassReflectionApi.md b/docs/tech/2.parser/reflectionApi/php/phpClassReflectionApi.md index 78869366..ec1c017e 100644 --- a/docs/tech/2.parser/reflectionApi/php/phpClassReflectionApi.md +++ b/docs/tech/2.parser/reflectionApi/php/phpClassReflectionApi.md @@ -86,4 +86,4 @@ $classReflection = $entitiesCollection->getLoadedOrCreateNew('SomeClassName'); /

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Mon Dec 18 15:25:50 2023 +0300
    Page content update date: Tue Dec 19 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Mon Dec 18 15:25:50 2023 +0300
    Page content update date: Thu Dec 21 2023
    Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/2.parser/reflectionApi/php/phpEntitiesCollection.md b/docs/tech/2.parser/reflectionApi/php/phpEntitiesCollection.md index 862731c6..d439635e 100644 --- a/docs/tech/2.parser/reflectionApi/php/phpEntitiesCollection.md +++ b/docs/tech/2.parser/reflectionApi/php/phpEntitiesCollection.md @@ -25,4 +25,4 @@

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Dec 16 13:54:48 2023 +0300
    Page content update date: Tue Dec 19 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Dec 16 13:54:48 2023 +0300
    Page content update date: Thu Dec 21 2023
    Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/2.parser/reflectionApi/php/phpEnumReflectionApi.md b/docs/tech/2.parser/reflectionApi/php/phpEnumReflectionApi.md index eb8b8f7f..42eec249 100644 --- a/docs/tech/2.parser/reflectionApi/php/phpEnumReflectionApi.md +++ b/docs/tech/2.parser/reflectionApi/php/phpEnumReflectionApi.md @@ -85,4 +85,4 @@ $enumReflection = $entitiesCollection->getLoadedOrCreateNew('SomeEnumName'); //

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Mon Dec 18 15:25:50 2023 +0300
    Page content update date: Tue Dec 19 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Mon Dec 18 15:25:50 2023 +0300
    Page content update date: Thu Dec 21 2023
    Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/2.parser/reflectionApi/php/phpInterfaceReflectionApi.md b/docs/tech/2.parser/reflectionApi/php/phpInterfaceReflectionApi.md index 7e4db319..94a6ab1b 100644 --- a/docs/tech/2.parser/reflectionApi/php/phpInterfaceReflectionApi.md +++ b/docs/tech/2.parser/reflectionApi/php/phpInterfaceReflectionApi.md @@ -82,4 +82,4 @@ $interfaceReflection = $entitiesCollection->getLoadedOrCreateNew('SomeInterfaceN

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Mon Dec 18 15:25:50 2023 +0300
    Page content update date: Tue Dec 19 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Mon Dec 18 15:25:50 2023 +0300
    Page content update date: Thu Dec 21 2023
    Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/2.parser/reflectionApi/php/phpTraitReflectionApi.md b/docs/tech/2.parser/reflectionApi/php/phpTraitReflectionApi.md index 65a30308..9abb51b6 100644 --- a/docs/tech/2.parser/reflectionApi/php/phpTraitReflectionApi.md +++ b/docs/tech/2.parser/reflectionApi/php/phpTraitReflectionApi.md @@ -82,4 +82,4 @@ $traitReflection = $entitiesCollection->getLoadedOrCreateNew('SomeTraitName'); /

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Mon Dec 18 15:25:50 2023 +0300
    Page content update date: Tue Dec 19 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Mon Dec 18 15:25:50 2023 +0300
    Page content update date: Thu Dec 21 2023
    Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/2.parser/reflectionApi/php/readme.md b/docs/tech/2.parser/reflectionApi/php/readme.md index 27c448d7..1e5100c3 100644 --- a/docs/tech/2.parser/reflectionApi/php/readme.md +++ b/docs/tech/2.parser/reflectionApi/php/readme.md @@ -88,4 +88,4 @@ $firstMethodReturnValue = $methodReflection->getFirstReturnValue();

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Mon Dec 18 15:25:50 2023 +0300
    Page content update date: Tue Dec 19 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Mon Dec 18 15:25:50 2023 +0300
    Page content update date: Thu Dec 21 2023
    Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/2.parser/reflectionApi/readme.md b/docs/tech/2.parser/reflectionApi/readme.md index 562b182b..91ed5f81 100644 --- a/docs/tech/2.parser/reflectionApi/readme.md +++ b/docs/tech/2.parser/reflectionApi/readme.md @@ -64,4 +64,4 @@ In addition, BumbleDocGen / Technical description of the project / Class map / GenerationErrorsHandler

    - GenerationErrorsHandler class: + GenerationErrorsHandler class:

    @@ -54,7 +54,7 @@ final class GenerationErrorsHandler extends \Monolog\Handler\AbstractProcessingH ```php @@ -101,7 +101,7 @@ public function __construct(\BumbleDocGen\Core\Renderer\Context\RendererContext ```php @@ -139,7 +139,7 @@ public function addRecords(array $records): void; ```php diff --git a/docs/tech/map.md b/docs/tech/map.md index 9073c6cb..ef823733 100644 --- a/docs/tech/map.md +++ b/docs/tech/map.md @@ -268,4 +268,4 @@ Directory layout ( only documented files shown ):

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Mon Nov 20 19:18:48 2023 +0300
    Page content update date: Tue Dec 19 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Mon Nov 20 19:18:48 2023 +0300
    Page content update date: Thu Dec 21 2023
    Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/readme.md b/docs/tech/readme.md index 86e94726..75252161 100644 --- a/docs/tech/readme.md +++ b/docs/tech/readme.md @@ -44,4 +44,4 @@ After that, the process of parsing the project code according to the configurati

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Thu Oct 5 17:42:06 2023 +0300
    Page content update date: Tue Dec 19 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Thu Oct 5 17:42:06 2023 +0300
    Page content update date: Thu Dec 21 2023
    Made with Bumble Documentation Generator \ No newline at end of file From 21bb0bb98cec86fca9b31cd1c31f2ef66324c90a Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Fri, 22 Dec 2023 13:01:32 +0300 Subject: [PATCH 151/210] Fixing unified plugin error --- src/Core/Renderer/Breadcrumbs/BreadcrumbsHelper.php | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/Core/Renderer/Breadcrumbs/BreadcrumbsHelper.php b/src/Core/Renderer/Breadcrumbs/BreadcrumbsHelper.php index 5dfd37ca..392960f8 100644 --- a/src/Core/Renderer/Breadcrumbs/BreadcrumbsHelper.php +++ b/src/Core/Renderer/Breadcrumbs/BreadcrumbsHelper.php @@ -9,6 +9,7 @@ use BumbleDocGen\Core\Configuration\Configuration; use BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException; use BumbleDocGen\Core\Plugin\Event\Renderer\OnGetProjectTemplatesDirs; +use BumbleDocGen\Core\Plugin\Event\Renderer\OnGetTemplatePathByRelativeDocPath; use BumbleDocGen\Core\Plugin\PluginEventDispatcher; use BumbleDocGen\Core\Renderer\TemplateFile; use DI\DependencyException; @@ -120,13 +121,16 @@ public function getNearestIndexFile(string $templateName): string */ private function getFindIndexFileByRelativePath(string $relativePath): ?string { + $event = $this->pluginEventDispatcher->dispatch(new OnGetTemplatePathByRelativeDocPath($relativePath)); + $path = $event->getCustomTemplateFilePath() ?: $this->configuration->getTemplatesDir() . '/' . $relativePath; + $finder = Finder::create() ->name('*.twig') ->ignoreVCS(true) ->ignoreDotFiles(true) ->ignoreUnreadableDirs() ->depth(0) - ->in($this->configuration->getTemplatesDir() . '/' . $relativePath); + ->in($path); $indexFile = null; foreach ($finder->files() as $file) { From 25633cffb271d31878ea625d257fa0c8214a2069 Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Sat, 23 Dec 2023 22:58:52 +0300 Subject: [PATCH 152/210] Adding FrontMatterLoader --- src/Core/Renderer/Twig/FrontMatterLoader.php | 60 ++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 src/Core/Renderer/Twig/FrontMatterLoader.php diff --git a/src/Core/Renderer/Twig/FrontMatterLoader.php b/src/Core/Renderer/Twig/FrontMatterLoader.php new file mode 100644 index 00000000..ea30104a --- /dev/null +++ b/src/Core/Renderer/Twig/FrontMatterLoader.php @@ -0,0 +1,60 @@ +loader->getSourceContext($name); + $code = $source->getCode(); + $data = $this->breadcrumbsHelper->getTemplateFrontMatter($name); + if ($data) { + $vars = ''; + foreach ($data as $name => $val) { + $val = (string)json_encode($val, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE); + $vars .= "{% set {$name} = {$val} %}"; + } + $code = preg_replace( + '/^---([^-]+)(---)/', + $this->removeFrontMatterFromTemplate ? $vars : "$0\n{$vars}", + $code + ); + } + return new Source($code, $source->getName(), $source->getPath()); + } + + public function getCacheKey(string $name): string + { + return $this->loader->getCacheKey($name); + } + + public function isFresh(string $name, int $time): bool + { + return $this->loader->isFresh($name, $time); + } + + public function exists(string $name): bool + { + return $this->loader->exists($name); + } +} From 7d03318da97ee6431cd7d2924d4e85291defeb19 Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Sat, 23 Dec 2023 22:59:36 +0300 Subject: [PATCH 153/210] Fixing error text --- src/DocGenerator.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/DocGenerator.php b/src/DocGenerator.php index 040385f1..da435c27 100644 --- a/src/DocGenerator.php +++ b/src/DocGenerator.php @@ -281,7 +281,7 @@ public function generate(): void $this->renderer->run(); } catch (Exception $e) { $this->logger->critical( - "{$e->getFile()}:{$e->getLine()} {$e->getMessage()} \n\n{{$e->getTraceAsString()}}" + "{$e->getFile()}:{$e->getLine()} {$e->getMessage()} \n\n{$e->getTraceAsString()}" ); throw $e; } From 136ffc1391225421c277f461b4665448ab7e042d Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Sat, 23 Dec 2023 22:59:50 +0300 Subject: [PATCH 154/210] Using new loader --- src/Core/Renderer/Twig/MainTwigEnvironment.php | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/Core/Renderer/Twig/MainTwigEnvironment.php b/src/Core/Renderer/Twig/MainTwigEnvironment.php index b57f5e0d..d9c9ab55 100644 --- a/src/Core/Renderer/Twig/MainTwigEnvironment.php +++ b/src/Core/Renderer/Twig/MainTwigEnvironment.php @@ -8,6 +8,7 @@ use BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException; use BumbleDocGen\Core\Plugin\Event\Renderer\OnGetProjectTemplatesDirs; use BumbleDocGen\Core\Plugin\PluginEventDispatcher; +use BumbleDocGen\Core\Renderer\Breadcrumbs\BreadcrumbsHelper; use Twig\Environment; use Twig\Error\LoaderError; use Twig\Error\RuntimeError; @@ -20,9 +21,10 @@ final class MainTwigEnvironment private bool $isEnvLoaded = false; public function __construct( - private Configuration $configuration, - private MainExtension $mainExtension, - private PluginEventDispatcher $pluginEventDispatcher, + private readonly Configuration $configuration, + private readonly MainExtension $mainExtension, + private readonly PluginEventDispatcher $pluginEventDispatcher, + private readonly BreadcrumbsHelper $breadcrumbsHelper ) { } @@ -35,7 +37,7 @@ private function loadMainTwigEnvironment(): void $templatesDir = $this->configuration->getTemplatesDir(); $event = $this->pluginEventDispatcher->dispatch(new OnGetProjectTemplatesDirs([$templatesDir])); $templatesDirs = $event->getTemplatesDirs(); - $loader = new FilesystemLoader($templatesDirs); + $loader = new FrontMatterLoader(new FilesystemLoader($templatesDirs), $this->breadcrumbsHelper); $this->twig = new Environment($loader); $this->twig->addExtension($this->mainExtension); $this->isEnvLoaded = true; From a6fe458fd0066bf43bd3ffb3d9dcf292e17f3303 Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Sat, 23 Dec 2023 23:00:21 +0300 Subject: [PATCH 155/210] Using FrontMatter instead of old variables --- .../Breadcrumbs/BreadcrumbsHelper.php | 84 +++++++++---------- 1 file changed, 42 insertions(+), 42 deletions(-) diff --git a/src/Core/Renderer/Breadcrumbs/BreadcrumbsHelper.php b/src/Core/Renderer/Breadcrumbs/BreadcrumbsHelper.php index 5dfd37ca..904e0720 100644 --- a/src/Core/Renderer/Breadcrumbs/BreadcrumbsHelper.php +++ b/src/Core/Renderer/Breadcrumbs/BreadcrumbsHelper.php @@ -14,6 +14,7 @@ use DI\DependencyException; use DI\NotFoundException; use Symfony\Component\Finder\Finder; +use Symfony\Component\Yaml\Yaml; use Twig\Error\LoaderError; use Twig\Error\RuntimeError; use Twig\Error\SyntaxError; @@ -34,35 +35,14 @@ final class BreadcrumbsHelper * @param string $prevPageNameTemplate Index page for each child section */ public function __construct( - private Configuration $configuration, - private LocalObjectCache $localObjectCache, - private BreadcrumbsTwigEnvironment $breadcrumbsTwig, - private PluginEventDispatcher $pluginEventDispatcher, - private string $prevPageNameTemplate = self::DEFAULT_PREV_PAGE_NAME_TEMPLATE + private readonly Configuration $configuration, + private readonly LocalObjectCache $localObjectCache, + private readonly BreadcrumbsTwigEnvironment $breadcrumbsTwig, + private readonly PluginEventDispatcher $pluginEventDispatcher, + private readonly string $prevPageNameTemplate = self::DEFAULT_PREV_PAGE_NAME_TEMPLATE ) { } - /** - * @throws InvalidConfigurationParameterException - */ - private function loadTemplateContent(string $templateName): string - { - $filePath = TemplateFile::getTemplatePathByRelativeDocPath( - $templateName, - $this->configuration, - $this->pluginEventDispatcher - ); - - try { - return $this->localObjectCache->getMethodCachedResult(__METHOD__, $filePath); - } catch (ObjectNotFoundException) { - } - - $templateContent = file_get_contents($filePath) ?: ''; - $this->localObjectCache->cacheMethodResult(__METHOD__, $filePath, $templateContent); - return $templateContent; - } - /** * @throws NotFoundException * @throws DependencyException @@ -74,10 +54,9 @@ private function getPrevPage(string $templateName): ?string return $this->localObjectCache->getMethodCachedResult(__METHOD__, $templateName); } catch (ObjectNotFoundException) { } - $code = $this->loadTemplateContent($templateName); - if (preg_match_all('/({%)( ?)(set)( )(prevPage)([ =]+)([\'"])(.*)(\'|")( %})/', $code, $matches)) { - $prevPageKey = array_reverse($matches[8])[0]; - $prevPage = $this->getPageDocFileByKey($prevPageKey); + $frontMatter = $this->getTemplateFrontMatter($templateName); + if (array_key_exists('prevPage', $frontMatter) && $frontMatter['prevPage']) { + $prevPage = $this->getPageDocFileByKey($frontMatter['prevPage']); if ($prevPage) { $this->localObjectCache->cacheMethodResult(__METHOD__, $templateName, $prevPage); return $prevPage; @@ -145,19 +124,17 @@ private function getFindIndexFileByRelativePath(string $relativePath): ?string * * @throws InvalidConfigurationParameterException * @example - * // variable in template: - * // {% set title = 'Some template title' %} + * # Front matter in template: + * # --- + * # title: Some template title + * # --- * * $breadcrumbsHelper->getTemplateTitle() == 'Some template title'; // is true */ public function getTemplateTitle(string $templateName): string { - $code = $this->loadTemplateContent($templateName); - if (preg_match_all('/({%)( ?)(set)( )(title)([ =]+)([\'"])(.*)(\'|")( %})/', $code, $matches)) { - return array_reverse($matches[8])[0]; - } - - return pathinfo($templateName, PATHINFO_FILENAME); + $frontMatter = $this->getTemplateFrontMatter($templateName); + return $frontMatter['title'] ?? pathinfo($templateName, PATHINFO_FILENAME); } /** @@ -165,12 +142,35 @@ public function getTemplateTitle(string $templateName): string */ public function getTemplateLinkKey(string $templateName): ?string { - $code = $this->loadTemplateContent($templateName); - if (preg_match_all('/({%)( ?)(set)( )(linkKey)([ =]+)([\'"])(.*)(\'|")( %})/', $code, $matches)) { - return array_reverse($matches[8])[0]; + $frontMatter = $this->getTemplateFrontMatter($templateName); + return $frontMatter['linkKey'] ?? null; + } + + /** + * @throws InvalidConfigurationParameterException + */ + public function getTemplateFrontMatter(string $templateName): array + { + try { + return $this->localObjectCache->getMethodCachedResult(__METHOD__, $templateName); + } catch (ObjectNotFoundException) { + } + + $filePath = TemplateFile::getTemplatePathByRelativeDocPath( + $templateName, + $this->configuration, + $this->pluginEventDispatcher + ); + $code = file_get_contents($filePath) ?: ''; + + $frontMatter = []; + if (preg_match('/^---([^-]+)(---)/', $code)) { + $frontMatterBlock = explode('---', $code)[1]; + $frontMatter = Yaml::parse($frontMatterBlock); } - return null; + $this->localObjectCache->cacheMethodResult(__METHOD__, $templateName, $frontMatter); + return $frontMatter; } /** From b1f94e5550e1de4dd3af26f32e7f43fda1d4ff89 Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Sat, 23 Dec 2023 23:00:37 +0300 Subject: [PATCH 156/210] Updating templates --- selfdoc/templates/README.md.twig | 4 +++- selfdoc/templates/tech/1.configuration/readme.md.twig | 4 +++- selfdoc/templates/tech/2.parser/entity.md.twig | 6 ++++-- .../templates/tech/2.parser/entityFilterCondition.md.twig | 6 ++++-- selfdoc/templates/tech/2.parser/readme.md.twig | 4 +++- .../reflectionApi/php/phpClassConstantReflectionApi.md.twig | 6 ++++-- .../reflectionApi/php/phpClassMethodReflectionApi.md.twig | 6 ++++-- .../reflectionApi/php/phpClassPropertyReflectionApi.md.twig | 6 ++++-- .../reflectionApi/php/phpClassReflectionApi.md.twig | 6 ++++-- .../reflectionApi/php/phpEntitiesCollection.md.twig | 6 ++++-- .../2.parser/reflectionApi/php/phpEnumReflectionApi.md.twig | 6 ++++-- .../reflectionApi/php/phpInterfaceReflectionApi.md.twig | 6 ++++-- .../reflectionApi/php/phpTraitReflectionApi.md.twig | 6 ++++-- .../tech/2.parser/reflectionApi/php/readme.md.twig | 4 +++- .../templates/tech/2.parser/reflectionApi/readme.md.twig | 4 +++- selfdoc/templates/tech/2.parser/sourceLocator.md.twig | 6 ++++-- selfdoc/templates/tech/3.renderer/01_templates.md.twig | 6 ++++-- selfdoc/templates/tech/3.renderer/02_breadcrumbs.md.twig | 6 ++++-- .../templates/tech/3.renderer/03_documentStructure.md.twig | 6 ++++-- .../templates/tech/3.renderer/04_twigCustomFilters.md.twig | 6 ++++-- .../tech/3.renderer/05_twigCustomFunctions.md.twig | 6 ++++-- selfdoc/templates/tech/3.renderer/readme.md.twig | 4 +++- .../tech/3.renderer/templatesDynamicBlocks.md.twig | 6 ++++-- selfdoc/templates/tech/3.renderer/templatesLinking.md.twig | 6 ++++-- .../templates/tech/3.renderer/templatesVariables.md.twig | 6 ++++-- selfdoc/templates/tech/4.pluginSystem/readme.md.twig | 4 +++- selfdoc/templates/tech/map.md.twig | 6 ++++-- selfdoc/templates/tech/readme.md.twig | 4 +++- 28 files changed, 104 insertions(+), 48 deletions(-) diff --git a/selfdoc/templates/README.md.twig b/selfdoc/templates/README.md.twig index 2d6c079b..99921573 100644 --- a/selfdoc/templates/README.md.twig +++ b/selfdoc/templates/README.md.twig @@ -1,4 +1,6 @@ -{% set title = 'BumbleDocGen' %} +--- +title: BumbleDocGen +--- {{ "BumbleDocGen: A Documentation Generator for PHP projects 🐝" | textToHeading('H1') }} BumbleDocGen is a robust library for generating and maintaining documentation next to the code of large and small PHP projects. diff --git a/selfdoc/templates/tech/1.configuration/readme.md.twig b/selfdoc/templates/tech/1.configuration/readme.md.twig index c511b32d..c1038104 100644 --- a/selfdoc/templates/tech/1.configuration/readme.md.twig +++ b/selfdoc/templates/tech/1.configuration/readme.md.twig @@ -1,4 +1,6 @@ -{% set title = 'Configuration files' %} +--- +title: Configuration files +--- {{ generatePageBreadcrumbs(title, _self) }} {{ "Configuration" | textToHeading('H1') }} diff --git a/selfdoc/templates/tech/2.parser/entity.md.twig b/selfdoc/templates/tech/2.parser/entity.md.twig index 3087854f..90d69ba7 100644 --- a/selfdoc/templates/tech/2.parser/entity.md.twig +++ b/selfdoc/templates/tech/2.parser/entity.md.twig @@ -1,5 +1,7 @@ -{% set title = 'Entities and entities collections' %} -{% set prevPage = 'Parser' %} +--- +title: Entities and entities collections +prevPage: Parser +--- {{ generatePageBreadcrumbs(title, _self) }} {{ "Entities and entities collections" | textToHeading('H1') }} diff --git a/selfdoc/templates/tech/2.parser/entityFilterCondition.md.twig b/selfdoc/templates/tech/2.parser/entityFilterCondition.md.twig index 7563ff9e..d10019a4 100644 --- a/selfdoc/templates/tech/2.parser/entityFilterCondition.md.twig +++ b/selfdoc/templates/tech/2.parser/entityFilterCondition.md.twig @@ -1,5 +1,7 @@ -{% set title = 'Entity filter conditions' %} -{% set prevPage = 'Parser' %} +--- +title: Entity filter conditions +prevPage: Parser +--- {{ generatePageBreadcrumbs(title, _self) }} {{ "Entity filter conditions" | textToHeading('H1') }} diff --git a/selfdoc/templates/tech/2.parser/readme.md.twig b/selfdoc/templates/tech/2.parser/readme.md.twig index f78752a1..eeb8d0c6 100644 --- a/selfdoc/templates/tech/2.parser/readme.md.twig +++ b/selfdoc/templates/tech/2.parser/readme.md.twig @@ -1,4 +1,6 @@ -{% set title = 'Parser' %} +--- +title: Parser +--- {{ generatePageBreadcrumbs(title, _self) }} {{ "Documentation parser" | textToHeading('H1') }} diff --git a/selfdoc/templates/tech/2.parser/reflectionApi/php/phpClassConstantReflectionApi.md.twig b/selfdoc/templates/tech/2.parser/reflectionApi/php/phpClassConstantReflectionApi.md.twig index 1a5f1889..ac76af5f 100644 --- a/selfdoc/templates/tech/2.parser/reflectionApi/php/phpClassConstantReflectionApi.md.twig +++ b/selfdoc/templates/tech/2.parser/reflectionApi/php/phpClassConstantReflectionApi.md.twig @@ -1,6 +1,8 @@ -{% set title = 'PHP class constant reflection API' %} +--- +title: PHP class constant reflection API +prevPage: Reflection API for PHP +--- {{ generatePageBreadcrumbs(title, _self) }} -{% set prevPage = 'Reflection API for PHP' %} {{ "PHP class constant reflection API" | textToHeading('H1') }} diff --git a/selfdoc/templates/tech/2.parser/reflectionApi/php/phpClassMethodReflectionApi.md.twig b/selfdoc/templates/tech/2.parser/reflectionApi/php/phpClassMethodReflectionApi.md.twig index 77da781a..0a3c253b 100644 --- a/selfdoc/templates/tech/2.parser/reflectionApi/php/phpClassMethodReflectionApi.md.twig +++ b/selfdoc/templates/tech/2.parser/reflectionApi/php/phpClassMethodReflectionApi.md.twig @@ -1,6 +1,8 @@ -{% set title = 'PHP class method reflection API' %} +--- +title: PHP class method reflection API +prevPage: Reflection API for PHP +--- {{ generatePageBreadcrumbs(title, _self) }} -{% set prevPage = 'Reflection API for PHP' %} {{ "PHP class method reflection API" | textToHeading('H1') }} diff --git a/selfdoc/templates/tech/2.parser/reflectionApi/php/phpClassPropertyReflectionApi.md.twig b/selfdoc/templates/tech/2.parser/reflectionApi/php/phpClassPropertyReflectionApi.md.twig index 9958dae4..a82dbea3 100644 --- a/selfdoc/templates/tech/2.parser/reflectionApi/php/phpClassPropertyReflectionApi.md.twig +++ b/selfdoc/templates/tech/2.parser/reflectionApi/php/phpClassPropertyReflectionApi.md.twig @@ -1,6 +1,8 @@ -{% set title = 'PHP class property reflection API' %} +--- +title: PHP class property reflection API +prevPage: Reflection API for PHP +--- {{ generatePageBreadcrumbs(title, _self) }} -{% set prevPage = 'Reflection API for PHP' %} {{ "PHP class property reflection API" | textToHeading('H1') }} diff --git a/selfdoc/templates/tech/2.parser/reflectionApi/php/phpClassReflectionApi.md.twig b/selfdoc/templates/tech/2.parser/reflectionApi/php/phpClassReflectionApi.md.twig index 7b8b7a93..e57df6db 100644 --- a/selfdoc/templates/tech/2.parser/reflectionApi/php/phpClassReflectionApi.md.twig +++ b/selfdoc/templates/tech/2.parser/reflectionApi/php/phpClassReflectionApi.md.twig @@ -1,6 +1,8 @@ -{% set title = 'PHP class reflection API' %} +--- +title: PHP class reflection API +prevPage: Reflection API for PHP +--- {{ generatePageBreadcrumbs(title, _self) }} -{% set prevPage = 'Reflection API for PHP' %} {{ "PHP class reflection API" | textToHeading('H1') }} diff --git a/selfdoc/templates/tech/2.parser/reflectionApi/php/phpEntitiesCollection.md.twig b/selfdoc/templates/tech/2.parser/reflectionApi/php/phpEntitiesCollection.md.twig index 5da03eb5..05ee72f4 100644 --- a/selfdoc/templates/tech/2.parser/reflectionApi/php/phpEntitiesCollection.md.twig +++ b/selfdoc/templates/tech/2.parser/reflectionApi/php/phpEntitiesCollection.md.twig @@ -1,6 +1,8 @@ -{% set title = 'PHP entities collection' %} +--- +title: PHP entities collection +prevPage: Reflection API for PHP +--- {{ generatePageBreadcrumbs(title, _self) }} -{% set prevPage = 'Reflection API for PHP' %} {{ "PHP entities collection" | textToHeading('H1') }} diff --git a/selfdoc/templates/tech/2.parser/reflectionApi/php/phpEnumReflectionApi.md.twig b/selfdoc/templates/tech/2.parser/reflectionApi/php/phpEnumReflectionApi.md.twig index b57f914b..3a062d29 100644 --- a/selfdoc/templates/tech/2.parser/reflectionApi/php/phpEnumReflectionApi.md.twig +++ b/selfdoc/templates/tech/2.parser/reflectionApi/php/phpEnumReflectionApi.md.twig @@ -1,6 +1,8 @@ -{% set title = 'PHP enum reflection API' %} +--- +title: PHP enum reflection API +prevPage: Reflection API for PHP +--- {{ generatePageBreadcrumbs(title, _self) }} -{% set prevPage = 'Reflection API for PHP' %} {{ "PHP enum reflection API" | textToHeading('H1') }} diff --git a/selfdoc/templates/tech/2.parser/reflectionApi/php/phpInterfaceReflectionApi.md.twig b/selfdoc/templates/tech/2.parser/reflectionApi/php/phpInterfaceReflectionApi.md.twig index 7a5b915b..dfe79126 100644 --- a/selfdoc/templates/tech/2.parser/reflectionApi/php/phpInterfaceReflectionApi.md.twig +++ b/selfdoc/templates/tech/2.parser/reflectionApi/php/phpInterfaceReflectionApi.md.twig @@ -1,6 +1,8 @@ -{% set title = 'PHP interface reflection API' %} +--- +title: PHP interface reflection API +prevPage: Reflection API for PHP +--- {{ generatePageBreadcrumbs(title, _self) }} -{% set prevPage = 'Reflection API for PHP' %} {{ "PHP interface reflection API" | textToHeading('H1') }} diff --git a/selfdoc/templates/tech/2.parser/reflectionApi/php/phpTraitReflectionApi.md.twig b/selfdoc/templates/tech/2.parser/reflectionApi/php/phpTraitReflectionApi.md.twig index b0580dd3..bb8c7001 100644 --- a/selfdoc/templates/tech/2.parser/reflectionApi/php/phpTraitReflectionApi.md.twig +++ b/selfdoc/templates/tech/2.parser/reflectionApi/php/phpTraitReflectionApi.md.twig @@ -1,6 +1,8 @@ -{% set title = 'PHP trait reflection API' %} +--- +title: PHP trait reflection API +prevPage: Reflection API for PHP +--- {{ generatePageBreadcrumbs(title, _self) }} -{% set prevPage = 'Reflection API for PHP' %} {{ "PHP trait reflection API" | textToHeading('H1') }} diff --git a/selfdoc/templates/tech/2.parser/reflectionApi/php/readme.md.twig b/selfdoc/templates/tech/2.parser/reflectionApi/php/readme.md.twig index b3e251d4..ff9657fa 100644 --- a/selfdoc/templates/tech/2.parser/reflectionApi/php/readme.md.twig +++ b/selfdoc/templates/tech/2.parser/reflectionApi/php/readme.md.twig @@ -1,4 +1,6 @@ -{% set title = 'Reflection API for PHP' %} +--- +title: Reflection API for PHP +--- {{ generatePageBreadcrumbs(title, _self) }} {{ "Reflection API for PHP" | textToHeading('H1') }} diff --git a/selfdoc/templates/tech/2.parser/reflectionApi/readme.md.twig b/selfdoc/templates/tech/2.parser/reflectionApi/readme.md.twig index 8a4f93f9..7f4be448 100644 --- a/selfdoc/templates/tech/2.parser/reflectionApi/readme.md.twig +++ b/selfdoc/templates/tech/2.parser/reflectionApi/readme.md.twig @@ -1,4 +1,6 @@ -{% set title = 'Reflection API' %} +--- +title: Reflection API +--- {{ generatePageBreadcrumbs(title, _self) }} {{ "Reflection API" | textToHeading('H1') }} diff --git a/selfdoc/templates/tech/2.parser/sourceLocator.md.twig b/selfdoc/templates/tech/2.parser/sourceLocator.md.twig index d83566e1..1abd1872 100644 --- a/selfdoc/templates/tech/2.parser/sourceLocator.md.twig +++ b/selfdoc/templates/tech/2.parser/sourceLocator.md.twig @@ -1,5 +1,7 @@ -{% set title = 'Source locators' %} -{% set prevPage = 'Parser' %} +--- +title: Source locators +prevPage: Parser +--- {{ generatePageBreadcrumbs(title, _self) }} {{ "Source locators" | textToHeading('H1') }} diff --git a/selfdoc/templates/tech/3.renderer/01_templates.md.twig b/selfdoc/templates/tech/3.renderer/01_templates.md.twig index 0c56bd5d..7390c4be 100644 --- a/selfdoc/templates/tech/3.renderer/01_templates.md.twig +++ b/selfdoc/templates/tech/3.renderer/01_templates.md.twig @@ -1,5 +1,7 @@ -{% set title = 'How to create documentation templates?' %} -{% set prevPage = 'Renderer' %} +--- +title: How to create documentation templates? +prevPage: Renderer +--- {{ generatePageBreadcrumbs(title, _self) }} {{ "How to create documentation templates?" | textToHeading('H1') }} diff --git a/selfdoc/templates/tech/3.renderer/02_breadcrumbs.md.twig b/selfdoc/templates/tech/3.renderer/02_breadcrumbs.md.twig index d815b3a4..a4ce2fe7 100644 --- a/selfdoc/templates/tech/3.renderer/02_breadcrumbs.md.twig +++ b/selfdoc/templates/tech/3.renderer/02_breadcrumbs.md.twig @@ -1,5 +1,7 @@ -{% set title = 'Documentation structure and breadcrumbs' %} -{% set prevPage = 'Renderer' %} +--- +title: Documentation structure and breadcrumbs +prevPage: Renderer +--- {{ generatePageBreadcrumbs(title, _self) }} {{ "Documentation structure and breadcrumbs" | textToHeading('H1') }} diff --git a/selfdoc/templates/tech/3.renderer/03_documentStructure.md.twig b/selfdoc/templates/tech/3.renderer/03_documentStructure.md.twig index e5047268..0e841568 100644 --- a/selfdoc/templates/tech/3.renderer/03_documentStructure.md.twig +++ b/selfdoc/templates/tech/3.renderer/03_documentStructure.md.twig @@ -1,5 +1,7 @@ -{% set title = 'Document structure of generated entities' %} -{% set prevPage = 'Renderer' %} +--- +title: Document structure of generated entities +prevPage: Renderer +--- {{ generatePageBreadcrumbs(title, _self) }} {{ "Document structure of generated entities" | textToHeading('H1') }} diff --git a/selfdoc/templates/tech/3.renderer/04_twigCustomFilters.md.twig b/selfdoc/templates/tech/3.renderer/04_twigCustomFilters.md.twig index 07e1519a..e90bf3c5 100644 --- a/selfdoc/templates/tech/3.renderer/04_twigCustomFilters.md.twig +++ b/selfdoc/templates/tech/3.renderer/04_twigCustomFilters.md.twig @@ -1,5 +1,7 @@ -{% set title = 'Template filters' %} -{% set prevPage = 'Renderer' %} +--- +title: Template filters +prevPage: Renderer +--- {{ generatePageBreadcrumbs(title, _self) }} {{ "Template filters" | textToHeading('H1') }} diff --git a/selfdoc/templates/tech/3.renderer/05_twigCustomFunctions.md.twig b/selfdoc/templates/tech/3.renderer/05_twigCustomFunctions.md.twig index ec4842c6..17abf0f9 100644 --- a/selfdoc/templates/tech/3.renderer/05_twigCustomFunctions.md.twig +++ b/selfdoc/templates/tech/3.renderer/05_twigCustomFunctions.md.twig @@ -1,5 +1,7 @@ -{% set title = 'Template functions' %} -{% set prevPage = 'Renderer' %} +--- +title: Template functions +prevPage: Renderer +--- {{ generatePageBreadcrumbs(title, _self) }} {{ "Template functions" | textToHeading('H1') }} diff --git a/selfdoc/templates/tech/3.renderer/readme.md.twig b/selfdoc/templates/tech/3.renderer/readme.md.twig index 0a3bd7fb..5b34b4b5 100644 --- a/selfdoc/templates/tech/3.renderer/readme.md.twig +++ b/selfdoc/templates/tech/3.renderer/readme.md.twig @@ -1,4 +1,6 @@ -{% set title = 'Renderer' %} +--- +title: Renderer +--- {{ generatePageBreadcrumbs(title, _self) }} {{ "Documentation renderer" | textToHeading('H1') }} diff --git a/selfdoc/templates/tech/3.renderer/templatesDynamicBlocks.md.twig b/selfdoc/templates/tech/3.renderer/templatesDynamicBlocks.md.twig index 65c091b5..3923b06b 100644 --- a/selfdoc/templates/tech/3.renderer/templatesDynamicBlocks.md.twig +++ b/selfdoc/templates/tech/3.renderer/templatesDynamicBlocks.md.twig @@ -1,5 +1,7 @@ -{% set title = 'Templates dynamic blocks' %} -{% set prevPage = 'How to create documentation templates?' %} +--- +title: Templates dynamic blocks +prevPage: How to create documentation templates? +--- {{ generatePageBreadcrumbs(title, _self) }} {{ "Templates dynamic blocks" | textToHeading('H1') }} diff --git a/selfdoc/templates/tech/3.renderer/templatesLinking.md.twig b/selfdoc/templates/tech/3.renderer/templatesLinking.md.twig index 3387e7fc..cc845e3b 100644 --- a/selfdoc/templates/tech/3.renderer/templatesLinking.md.twig +++ b/selfdoc/templates/tech/3.renderer/templatesLinking.md.twig @@ -1,5 +1,7 @@ -{% set title = 'Linking templates' %} -{% set prevPage = 'How to create documentation templates?' %} +--- +title: Linking templates +prevPage: How to create documentation templates? +--- {{ generatePageBreadcrumbs(title, _self) }} {{ "Linking templates" | textToHeading('H1') }} diff --git a/selfdoc/templates/tech/3.renderer/templatesVariables.md.twig b/selfdoc/templates/tech/3.renderer/templatesVariables.md.twig index 943683f1..aea301ff 100644 --- a/selfdoc/templates/tech/3.renderer/templatesVariables.md.twig +++ b/selfdoc/templates/tech/3.renderer/templatesVariables.md.twig @@ -1,5 +1,7 @@ -{% set title = 'Templates variables' %} -{% set prevPage = 'How to create documentation templates?' %} +--- +title: Templates variables +prevPage: How to create documentation templates? +--- {{ generatePageBreadcrumbs(title, _self) }} {{ "Templates variables" | textToHeading('H1') }} diff --git a/selfdoc/templates/tech/4.pluginSystem/readme.md.twig b/selfdoc/templates/tech/4.pluginSystem/readme.md.twig index 143a7074..97e9fdde 100644 --- a/selfdoc/templates/tech/4.pluginSystem/readme.md.twig +++ b/selfdoc/templates/tech/4.pluginSystem/readme.md.twig @@ -1,4 +1,6 @@ -{% set title = 'Plugin system' %} +--- +title: Plugin system +--- {{ generatePageBreadcrumbs(title, _self) }} {{ "Plugin system" | textToHeading('H1') }} diff --git a/selfdoc/templates/tech/map.md.twig b/selfdoc/templates/tech/map.md.twig index 23ebf204..42f76a2c 100644 --- a/selfdoc/templates/tech/map.md.twig +++ b/selfdoc/templates/tech/map.md.twig @@ -1,5 +1,7 @@ -{% set title = 'Class map' %} -{% set prevPage = 'Technical description of the project' %} +--- +title: Class map +prevPage: Technical description of the project +--- {{ generatePageBreadcrumbs(title, _self) }} Directory layout ( only documented files shown ): diff --git a/selfdoc/templates/tech/readme.md.twig b/selfdoc/templates/tech/readme.md.twig index 858ce1c2..7e3efb2c 100644 --- a/selfdoc/templates/tech/readme.md.twig +++ b/selfdoc/templates/tech/readme.md.twig @@ -1,4 +1,6 @@ -{% set title = 'Technical description of the project' %} +--- +title: Technical description of the project +--- {{ generatePageBreadcrumbs(title, _self) }} {{ "Technical description of the project" | textToHeading('H1') }} From b034a261e6e581e57ab6bb25c4010cdd56ac7929 Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Sat, 23 Dec 2023 23:12:46 +0300 Subject: [PATCH 157/210] Using FrontMatter instead of old variables --- demo/demo1/templates/classMap/index.md.twig | 4 +++- demo/demo1/templates/readme.md.twig | 5 +++-- .../classListExample/index.md.twig | 4 +++- .../templates/sectionWithSubsections/index.md.twig | 4 +++- .../pageLinkingExample/index.md.twig | 4 +++- demo/demo4-config-array/templates/README.md.twig | 5 +++-- .../templates/tech/3.renderer/01_templates.md.twig | 6 ++++-- .../templates/tech/3.renderer/02_breadcrumbs.md.twig | 12 ++++++++---- src/DocGenerator.php | 2 +- .../templates/__structure/classes.md.twig | 6 ++++-- .../templates/__structure/interfaces.md.twig | 6 ++++-- .../templates/__structure/map.md.twig | 6 ++++-- .../templates/__structure/readme.md.twig | 6 ++++-- .../templates/__structure/traits.md.twig | 6 ++++-- 14 files changed, 51 insertions(+), 25 deletions(-) diff --git a/demo/demo1/templates/classMap/index.md.twig b/demo/demo1/templates/classMap/index.md.twig index d284f4dd..c44ae3d1 100644 --- a/demo/demo1/templates/classMap/index.md.twig +++ b/demo/demo1/templates/classMap/index.md.twig @@ -1,4 +1,6 @@ -{% set title = 'Class map' %} +--- +title: Class map +--- {{ generatePageBreadcrumbs(title, _self) }} {{ "Class map epample" | textToHeading('H1') }} diff --git a/demo/demo1/templates/readme.md.twig b/demo/demo1/templates/readme.md.twig index 48d2e82e..95e4e70c 100644 --- a/demo/demo1/templates/readme.md.twig +++ b/demo/demo1/templates/readme.md.twig @@ -1,5 +1,6 @@ -{% set title = 'Demo 1' %} - +--- +title: Demo 1 +--- {{ "Demo 1" | textToHeading('H1') }} {{ drawDocumentationMenu() }} diff --git a/demo/demo1/templates/sectionWithSubsections/classListExample/index.md.twig b/demo/demo1/templates/sectionWithSubsections/classListExample/index.md.twig index 7d0fd007..5aa0c947 100644 --- a/demo/demo1/templates/sectionWithSubsections/classListExample/index.md.twig +++ b/demo/demo1/templates/sectionWithSubsections/classListExample/index.md.twig @@ -1,4 +1,6 @@ -{% set title = 'Class list example' %} +--- +title: Class list example +--- {{ generatePageBreadcrumbs(title, _self) }} {{ "Class list" | textToHeading('H1') }} diff --git a/demo/demo1/templates/sectionWithSubsections/index.md.twig b/demo/demo1/templates/sectionWithSubsections/index.md.twig index 991ffa89..3df87f7a 100644 --- a/demo/demo1/templates/sectionWithSubsections/index.md.twig +++ b/demo/demo1/templates/sectionWithSubsections/index.md.twig @@ -1,4 +1,6 @@ -{% set title = 'Section with subsections' %} +--- +title: Section with subsections +--- {{ generatePageBreadcrumbs(title, _self) }} {{ "Section with subsections example" | textToHeading('H1') }} diff --git a/demo/demo1/templates/sectionWithSubsections/pageLinkingExample/index.md.twig b/demo/demo1/templates/sectionWithSubsections/pageLinkingExample/index.md.twig index 3f8d09a4..543908a4 100644 --- a/demo/demo1/templates/sectionWithSubsections/pageLinkingExample/index.md.twig +++ b/demo/demo1/templates/sectionWithSubsections/pageLinkingExample/index.md.twig @@ -1,4 +1,6 @@ -{% set title = 'Page linking example' %} +--- +title: Page linking example +--- {{ generatePageBreadcrumbs(title, _self) }} {{ "Page linking example" | textToHeading('H1') }} diff --git a/demo/demo4-config-array/templates/README.md.twig b/demo/demo4-config-array/templates/README.md.twig index 1de2e14a..db1b72e3 100644 --- a/demo/demo4-config-array/templates/README.md.twig +++ b/demo/demo4-config-array/templates/README.md.twig @@ -1,5 +1,6 @@ -{% set title = 'Demo 5' %} - +--- +title: Demo 5 +--- {{ "Demo 5" | textToHeading('H1') }} {{ printEntityCollectionAsList( phpEntities.filterByPaths(['/annotations']) ) }} diff --git a/selfdoc/templates/tech/3.renderer/01_templates.md.twig b/selfdoc/templates/tech/3.renderer/01_templates.md.twig index 7390c4be..318074aa 100644 --- a/selfdoc/templates/tech/3.renderer/01_templates.md.twig +++ b/selfdoc/templates/tech/3.renderer/01_templates.md.twig @@ -22,8 +22,10 @@ After generating the documentation, this page will look exactly like a template. {{ "2) An example of a template with static text and dynamic blocks:" | textToHeading('H3') }} -{{ "{% set title = 'Some page' %\} -{% set prevPage = 'Technical description of the project' %\} +{{ "--- +title: Some page +prevPage: Technical description of the project +--- {{ generatePageBreadcrumbs(title, _self) }\} Some static text... diff --git a/selfdoc/templates/tech/3.renderer/02_breadcrumbs.md.twig b/selfdoc/templates/tech/3.renderer/02_breadcrumbs.md.twig index a4ce2fe7..513922a7 100644 --- a/selfdoc/templates/tech/3.renderer/02_breadcrumbs.md.twig +++ b/selfdoc/templates/tech/3.renderer/02_breadcrumbs.md.twig @@ -17,9 +17,11 @@ For each directory there is an index file ( readme.md or index.md But in addition to building the documentation structure using the actual location of template files in directories, -you can explicitly specify the parent page in each template using the special variable `prevPage`: +you can explicitly specify the parent page in each template using the special front matter variable `prevPage`: -{{ "{% set prevPage = 'Prev page name' %\}" | textToCodeBlock('twig') }} +{{ "--- +prevPage: Prev page name +---" | textToCodeBlock('markdown') }} In this way, complex documentation structures can be created with less file nesting: @@ -33,9 +35,11 @@ Here is how it is used in twig templates: {{ '{{ generatePageBreadcrumbs(title, _self) }\}' | textToCodeBlock('twig') }} To build breadcrumbs, the previously compiled project structure and the names of each template are used. -The template name can be specified using the `title` variable: +The template name can be specified using the `title` front matter variable: -{{ "{% set title = 'Some page title' %\}" | textToCodeBlock('twig') }} +{{ "--- +title: Some page title +---" | textToCodeBlock('markdown') }} Here is an example of the result of the `generatePageBreadcrumbs` function: diff --git a/src/DocGenerator.php b/src/DocGenerator.php index da435c27..c226252c 100644 --- a/src/DocGenerator.php +++ b/src/DocGenerator.php @@ -242,7 +242,7 @@ public function generateReadmeTemplate( $additionalPrompt, ); - $fileContent = "{% set title = 'About the project' %}\n{$readmeFileContent}"; + $fileContent = "---\ntitle: About the project\n---\n{$readmeFileContent}"; $this->io->note("readme.md.twig file content generated:"); $this->io->text($fileContent); if ($this->io->confirm('Save file?')) { diff --git a/src/LanguageHandler/Php/Plugin/CorePlugin/EntityDocUnifiedPlace/templates/__structure/classes.md.twig b/src/LanguageHandler/Php/Plugin/CorePlugin/EntityDocUnifiedPlace/templates/__structure/classes.md.twig index d2f3f103..af6001a4 100644 --- a/src/LanguageHandler/Php/Plugin/CorePlugin/EntityDocUnifiedPlace/templates/__structure/classes.md.twig +++ b/src/LanguageHandler/Php/Plugin/CorePlugin/EntityDocUnifiedPlace/templates/__structure/classes.md.twig @@ -1,5 +1,7 @@ -{% set title = 'Project classes' %} -{% set prevPage = 'Project structure' %} +--- +title: Project classes +prevPage: Project structure +--- {{ generatePageBreadcrumbs(title, _self) }} {{ "Project classes" | textToHeading('H1') }} diff --git a/src/LanguageHandler/Php/Plugin/CorePlugin/EntityDocUnifiedPlace/templates/__structure/interfaces.md.twig b/src/LanguageHandler/Php/Plugin/CorePlugin/EntityDocUnifiedPlace/templates/__structure/interfaces.md.twig index 1c90347c..43c47edc 100644 --- a/src/LanguageHandler/Php/Plugin/CorePlugin/EntityDocUnifiedPlace/templates/__structure/interfaces.md.twig +++ b/src/LanguageHandler/Php/Plugin/CorePlugin/EntityDocUnifiedPlace/templates/__structure/interfaces.md.twig @@ -1,5 +1,7 @@ -{% set title = 'Project interfaces' %} -{% set prevPage = 'Project structure' %} +--- +title: Project interfaces +prevPage: Project structure +--- {{ generatePageBreadcrumbs(title, _self) }} {{ "Project interfaces" | textToHeading('H1') }} diff --git a/src/LanguageHandler/Php/Plugin/CorePlugin/EntityDocUnifiedPlace/templates/__structure/map.md.twig b/src/LanguageHandler/Php/Plugin/CorePlugin/EntityDocUnifiedPlace/templates/__structure/map.md.twig index 310f6542..3b9bc477 100644 --- a/src/LanguageHandler/Php/Plugin/CorePlugin/EntityDocUnifiedPlace/templates/__structure/map.md.twig +++ b/src/LanguageHandler/Php/Plugin/CorePlugin/EntityDocUnifiedPlace/templates/__structure/map.md.twig @@ -1,5 +1,7 @@ -{% set title = 'Project entities map' %} -{% set prevPage = 'Project structure' %} +--- +title: Project entities map +prevPage: Project structure +--- {{ generatePageBreadcrumbs(title, _self) }} {{ "Entities map" | textToHeading('H1') }} diff --git a/src/LanguageHandler/Php/Plugin/CorePlugin/EntityDocUnifiedPlace/templates/__structure/readme.md.twig b/src/LanguageHandler/Php/Plugin/CorePlugin/EntityDocUnifiedPlace/templates/__structure/readme.md.twig index 2f31c6a7..93a96255 100644 --- a/src/LanguageHandler/Php/Plugin/CorePlugin/EntityDocUnifiedPlace/templates/__structure/readme.md.twig +++ b/src/LanguageHandler/Php/Plugin/CorePlugin/EntityDocUnifiedPlace/templates/__structure/readme.md.twig @@ -1,5 +1,7 @@ -{% set title = 'Project structure' %} -{% set prevPage = '/' %} +--- +title: Project structure +prevPage: / +--- {{ generatePageBreadcrumbs(title, _self) }} {{ "Project structure" | textToHeading('H1') }} diff --git a/src/LanguageHandler/Php/Plugin/CorePlugin/EntityDocUnifiedPlace/templates/__structure/traits.md.twig b/src/LanguageHandler/Php/Plugin/CorePlugin/EntityDocUnifiedPlace/templates/__structure/traits.md.twig index bec445e4..a380c2e3 100644 --- a/src/LanguageHandler/Php/Plugin/CorePlugin/EntityDocUnifiedPlace/templates/__structure/traits.md.twig +++ b/src/LanguageHandler/Php/Plugin/CorePlugin/EntityDocUnifiedPlace/templates/__structure/traits.md.twig @@ -1,5 +1,7 @@ -{% set title = 'Project traits' %} -{% set prevPage = 'Project structure' %} +--- +title: Project traits +prevPage: Project structure +--- {{ generatePageBreadcrumbs(title, _self) }} {{ "Project traits" | textToHeading('H1') }} From 4b0e10da7b59ffb97a012dc0b95c8d577f5f141c Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Sat, 23 Dec 2023 23:14:12 +0300 Subject: [PATCH 158/210] Updating doc --- docs/README.md | 2 +- docs/shared_c.cache | 2 +- docs/tech/1.configuration/readme.md | 2 +- docs/tech/2.parser/entity.md | 2 +- docs/tech/2.parser/entityFilterCondition.md | 2 +- docs/tech/2.parser/readme.md | 2 +- .../php/phpClassConstantReflectionApi.md | 2 +- .../php/phpClassMethodReflectionApi.md | 2 +- .../php/phpClassPropertyReflectionApi.md | 2 +- .../php/phpClassReflectionApi.md | 2 +- .../php/phpEntitiesCollection.md | 2 +- .../reflectionApi/php/phpEnumReflectionApi.md | 2 +- .../php/phpInterfaceReflectionApi.md | 2 +- .../php/phpTraitReflectionApi.md | 2 +- .../tech/2.parser/reflectionApi/php/readme.md | 2 +- docs/tech/2.parser/reflectionApi/readme.md | 2 +- docs/tech/2.parser/sourceLocator.md | 2 +- docs/tech/3.renderer/01_templates.md | 8 +- docs/tech/3.renderer/02_breadcrumbs.md | 18 +- docs/tech/3.renderer/03_documentStructure.md | 2 +- docs/tech/3.renderer/04_twigCustomFilters.md | 2 +- .../tech/3.renderer/05_twigCustomFunctions.md | 2 +- .../3.renderer/classes/BreadcrumbsHelper.md | 66 ++++- docs/tech/3.renderer/readme.md | 2 +- .../tech/3.renderer/templatesDynamicBlocks.md | 2 +- docs/tech/3.renderer/templatesLinking.md | 2 +- docs/tech/3.renderer/templatesVariables.md | 2 +- docs/tech/4.pluginSystem/readme.md | 2 +- docs/tech/classes/BreadcrumbsHelper.md | 66 ++++- docs/tech/classes/FrontMatterLoader.md | 273 ++++++++++++++++++ docs/tech/classes/MainTwigEnvironment.md | 13 +- docs/tech/map.md | 3 +- docs/tech/readme.md | 2 +- 33 files changed, 442 insertions(+), 57 deletions(-) create mode 100644 docs/tech/classes/FrontMatterLoader.md diff --git a/docs/README.md b/docs/README.md index 0e67283f..a9d73576 100644 --- a/docs/README.md +++ b/docs/README.md @@ -95,4 +95,4 @@ To update this documentation, run the following command:

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Mon Dec 18 15:41:43 2023 +0300
    Page content update date: Thu Dec 21 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Dec 23 23:00:37 2023 +0300
    Page content update date: Sat Dec 23 2023
    Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/shared_c.cache b/docs/shared_c.cache index 14994f34..80402fad 100644 --- a/docs/shared_c.cache +++ b/docs/shared_c.cache @@ -1 +1 @@ -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 \ No newline at end of file +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 \ No newline at end of file diff --git a/docs/tech/1.configuration/readme.md b/docs/tech/1.configuration/readme.md index fea12134..fb658a97 100644 --- a/docs/tech/1.configuration/readme.md +++ b/docs/tech/1.configuration/readme.md @@ -223,4 +223,4 @@ The inheritance algorithm is as follows: scalar types can be overwritten by each

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Mon Nov 20 19:18:48 2023 +0300
    Page content update date: Thu Dec 21 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Dec 23 23:00:37 2023 +0300
    Page content update date: Sat Dec 23 2023
    Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/2.parser/entity.md b/docs/tech/2.parser/entity.md index 1cc5c1da..8ba12f09 100644 --- a/docs/tech/2.parser/entity.md +++ b/docs/tech/2.parser/entity.md @@ -144,4 +144,4 @@ These classes are a convenient wrapper for accessing data in templates:

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Tue Nov 21 16:24:59 2023 +0300
    Page content update date: Thu Dec 21 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Dec 23 23:00:37 2023 +0300
    Page content update date: Sat Dec 23 2023
    Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/2.parser/entityFilterCondition.md b/docs/tech/2.parser/entityFilterCondition.md index 8272587c..2f69ced4 100644 --- a/docs/tech/2.parser/entityFilterCondition.md +++ b/docs/tech/2.parser/entityFilterCondition.md @@ -78,4 +78,4 @@ Filter condition for working with entities PHP language handler:

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Mon Nov 20 19:18:48 2023 +0300
    Page content update date: Thu Dec 21 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Dec 23 23:00:37 2023 +0300
    Page content update date: Sat Dec 23 2023
    Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/2.parser/readme.md b/docs/tech/2.parser/readme.md index 354b820a..10da51b0 100644 --- a/docs/tech/2.parser/readme.md +++ b/docs/tech/2.parser/readme.md @@ -42,4 +42,4 @@ In this section, we show how the parser works and what components it consists of

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Wed Nov 29 11:54:40 2023 +0300
    Page content update date: Thu Dec 21 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Dec 23 23:00:37 2023 +0300
    Page content update date: Sat Dec 23 2023
    Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/2.parser/reflectionApi/php/phpClassConstantReflectionApi.md b/docs/tech/2.parser/reflectionApi/php/phpClassConstantReflectionApi.md index 58ff6b0c..f292594c 100644 --- a/docs/tech/2.parser/reflectionApi/php/phpClassConstantReflectionApi.md +++ b/docs/tech/2.parser/reflectionApi/php/phpClassConstantReflectionApi.md @@ -47,4 +47,4 @@ $constantReflection = $classReflection->getConstant('constantName');

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Mon Dec 18 15:25:50 2023 +0300
    Page content update date: Thu Dec 21 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Dec 23 23:00:37 2023 +0300
    Page content update date: Sat Dec 23 2023
    Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/2.parser/reflectionApi/php/phpClassMethodReflectionApi.md b/docs/tech/2.parser/reflectionApi/php/phpClassMethodReflectionApi.md index dacd8fd5..1e6d58b5 100644 --- a/docs/tech/2.parser/reflectionApi/php/phpClassMethodReflectionApi.md +++ b/docs/tech/2.parser/reflectionApi/php/phpClassMethodReflectionApi.md @@ -62,4 +62,4 @@ $methodReflection = $classReflection->getMethod('methodName');

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Mon Dec 18 15:25:50 2023 +0300
    Page content update date: Thu Dec 21 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Dec 23 23:00:37 2023 +0300
    Page content update date: Sat Dec 23 2023
    Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/2.parser/reflectionApi/php/phpClassPropertyReflectionApi.md b/docs/tech/2.parser/reflectionApi/php/phpClassPropertyReflectionApi.md index 4d40e0a0..6f4ac037 100644 --- a/docs/tech/2.parser/reflectionApi/php/phpClassPropertyReflectionApi.md +++ b/docs/tech/2.parser/reflectionApi/php/phpClassPropertyReflectionApi.md @@ -53,4 +53,4 @@ $propertyReflection = $classReflection->getProperty('propertyName');

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Mon Dec 18 15:25:50 2023 +0300
    Page content update date: Thu Dec 21 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Dec 23 23:00:37 2023 +0300
    Page content update date: Sat Dec 23 2023
    Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/2.parser/reflectionApi/php/phpClassReflectionApi.md b/docs/tech/2.parser/reflectionApi/php/phpClassReflectionApi.md index ec1c017e..2ed81ce9 100644 --- a/docs/tech/2.parser/reflectionApi/php/phpClassReflectionApi.md +++ b/docs/tech/2.parser/reflectionApi/php/phpClassReflectionApi.md @@ -86,4 +86,4 @@ $classReflection = $entitiesCollection->getLoadedOrCreateNew('SomeClassName'); /

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Mon Dec 18 15:25:50 2023 +0300
    Page content update date: Thu Dec 21 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Dec 23 23:00:37 2023 +0300
    Page content update date: Sat Dec 23 2023
    Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/2.parser/reflectionApi/php/phpEntitiesCollection.md b/docs/tech/2.parser/reflectionApi/php/phpEntitiesCollection.md index d439635e..f2287023 100644 --- a/docs/tech/2.parser/reflectionApi/php/phpEntitiesCollection.md +++ b/docs/tech/2.parser/reflectionApi/php/phpEntitiesCollection.md @@ -25,4 +25,4 @@

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Dec 16 13:54:48 2023 +0300
    Page content update date: Thu Dec 21 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Dec 23 23:00:37 2023 +0300
    Page content update date: Sat Dec 23 2023
    Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/2.parser/reflectionApi/php/phpEnumReflectionApi.md b/docs/tech/2.parser/reflectionApi/php/phpEnumReflectionApi.md index 42eec249..80b2bbaa 100644 --- a/docs/tech/2.parser/reflectionApi/php/phpEnumReflectionApi.md +++ b/docs/tech/2.parser/reflectionApi/php/phpEnumReflectionApi.md @@ -85,4 +85,4 @@ $enumReflection = $entitiesCollection->getLoadedOrCreateNew('SomeEnumName'); //

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Mon Dec 18 15:25:50 2023 +0300
    Page content update date: Thu Dec 21 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Dec 23 23:00:37 2023 +0300
    Page content update date: Sat Dec 23 2023
    Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/2.parser/reflectionApi/php/phpInterfaceReflectionApi.md b/docs/tech/2.parser/reflectionApi/php/phpInterfaceReflectionApi.md index 94a6ab1b..f991a69d 100644 --- a/docs/tech/2.parser/reflectionApi/php/phpInterfaceReflectionApi.md +++ b/docs/tech/2.parser/reflectionApi/php/phpInterfaceReflectionApi.md @@ -82,4 +82,4 @@ $interfaceReflection = $entitiesCollection->getLoadedOrCreateNew('SomeInterfaceN

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Mon Dec 18 15:25:50 2023 +0300
    Page content update date: Thu Dec 21 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Dec 23 23:00:37 2023 +0300
    Page content update date: Sat Dec 23 2023
    Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/2.parser/reflectionApi/php/phpTraitReflectionApi.md b/docs/tech/2.parser/reflectionApi/php/phpTraitReflectionApi.md index 9abb51b6..3e471ed4 100644 --- a/docs/tech/2.parser/reflectionApi/php/phpTraitReflectionApi.md +++ b/docs/tech/2.parser/reflectionApi/php/phpTraitReflectionApi.md @@ -82,4 +82,4 @@ $traitReflection = $entitiesCollection->getLoadedOrCreateNew('SomeTraitName'); /

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Mon Dec 18 15:25:50 2023 +0300
    Page content update date: Thu Dec 21 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Dec 23 23:00:37 2023 +0300
    Page content update date: Sat Dec 23 2023
    Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/2.parser/reflectionApi/php/readme.md b/docs/tech/2.parser/reflectionApi/php/readme.md index 1e5100c3..5b3f7b56 100644 --- a/docs/tech/2.parser/reflectionApi/php/readme.md +++ b/docs/tech/2.parser/reflectionApi/php/readme.md @@ -88,4 +88,4 @@ $firstMethodReturnValue = $methodReflection->getFirstReturnValue();

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Mon Dec 18 15:25:50 2023 +0300
    Page content update date: Thu Dec 21 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Dec 23 23:00:37 2023 +0300
    Page content update date: Sat Dec 23 2023
    Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/2.parser/reflectionApi/readme.md b/docs/tech/2.parser/reflectionApi/readme.md index 91ed5f81..4a171f25 100644 --- a/docs/tech/2.parser/reflectionApi/readme.md +++ b/docs/tech/2.parser/reflectionApi/readme.md @@ -64,4 +64,4 @@ In addition, But in addition to building the documentation structure using the actual location of template files in directories, -you can explicitly specify the parent page in each template using the special variable `prevPage`: +you can explicitly specify the parent page in each template using the special front matter variable `prevPage`: -```twig - {% set prevPage = 'Prev page name' %} +```markdown + --- + prevPage: Prev page name + --- ``` @@ -35,10 +37,12 @@ Here is how it is used in twig templates: To build breadcrumbs, the previously compiled project structure and the names of each template are used. -The template name can be specified using the `title` variable: +The template name can be specified using the `title` front matter variable: -```twig - {% set title = 'Some page title' %} +```markdown + --- + title: Some page title + --- ``` @@ -51,4 +55,4 @@ Here is an example of the result of the `generatePageBreadcrumbs` function: \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Dec 23 23:12:46 2023 +0300
    Page content update date: Sat Dec 23 2023
    Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/3.renderer/03_documentStructure.md b/docs/tech/3.renderer/03_documentStructure.md index 7a7abf55..203a40bd 100644 --- a/docs/tech/3.renderer/03_documentStructure.md +++ b/docs/tech/3.renderer/03_documentStructure.md @@ -19,4 +19,4 @@ plugins:

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Fri Oct 13 18:40:45 2023 +0300
    Page content update date: Thu Dec 21 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Dec 23 23:00:37 2023 +0300
    Page content update date: Sat Dec 23 2023
    Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/3.renderer/04_twigCustomFilters.md b/docs/tech/3.renderer/04_twigCustomFilters.md index 2bc856ae..798b17cb 100644 --- a/docs/tech/3.renderer/04_twigCustomFilters.md +++ b/docs/tech/3.renderer/04_twigCustomFilters.md @@ -274,4 +274,4 @@ Here is a list of filters available by default:

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Mon Nov 20 19:18:48 2023 +0300
    Page content update date: Thu Dec 21 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Dec 23 23:00:37 2023 +0300
    Page content update date: Sat Dec 23 2023
    Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/3.renderer/05_twigCustomFunctions.md b/docs/tech/3.renderer/05_twigCustomFunctions.md index 11ba9bcc..66dd903e 100644 --- a/docs/tech/3.renderer/05_twigCustomFunctions.md +++ b/docs/tech/3.renderer/05_twigCustomFunctions.md @@ -401,4 +401,4 @@ Here is a list of functions available by default:

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Mon Nov 20 19:18:48 2023 +0300
    Page content update date: Thu Dec 21 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Dec 23 23:00:37 2023 +0300
    Page content update date: Sat Dec 23 2023
    Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/3.renderer/classes/BreadcrumbsHelper.md b/docs/tech/3.renderer/classes/BreadcrumbsHelper.md index b8dbeecd..9a55fc96 100644 --- a/docs/tech/3.renderer/classes/BreadcrumbsHelper.md +++ b/docs/tech/3.renderer/classes/BreadcrumbsHelper.md @@ -2,7 +2,7 @@ BumbleDocGen / Technical description of the project / Renderer / Documentation structure and breadcrumbs / BreadcrumbsHelper

    - BreadcrumbsHelper class: + BreadcrumbsHelper class:

    @@ -54,6 +54,9 @@ final class BreadcrumbsHelper
  • getPageLinkByKey
  • +
  • + getTemplateFrontMatter +
  • getTemplateLinkKey
  • @@ -70,7 +73,7 @@ final class BreadcrumbsHelper @@ -85,7 +88,7 @@ final class BreadcrumbsHelper ```php @@ -288,7 +291,7 @@ public function getBreadcrumbsForTemplates(string $filePatch, bool $fromCurrent ```php @@ -483,10 +486,55 @@ public function getPageLinkByKey(string $key): null|string;
    + + +```php +public function getTemplateFrontMatter(string $templateName): array; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $templateNamestring-
    + +Return value: array + + +Throws: + + +
    +
    +
    + ```php @@ -531,7 +579,7 @@ public function getTemplateLinkKey(string $templateName): null|string; ```php @@ -574,8 +622,10 @@ public function getTemplateTitle(string $templateName): string; Examples of using: ```php -// variable in template: -// {% set title = 'Some template title' %} +# Front matter in template: +# --- +# title: Some template title +# --- $breadcrumbsHelper->getTemplateTitle() == 'Some template title'; // is true ``` diff --git a/docs/tech/3.renderer/readme.md b/docs/tech/3.renderer/readme.md index e2d2274b..07fbe0af 100644 --- a/docs/tech/3.renderer/readme.md +++ b/docs/tech/3.renderer/readme.md @@ -60,4 +60,4 @@ This process is presented in the form of a diagram below.

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Sep 2 21:01:47 2023 +0300
    Page content update date: Thu Dec 21 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Dec 23 23:00:37 2023 +0300
    Page content update date: Sat Dec 23 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file diff --git a/docs/tech/3.renderer/templatesDynamicBlocks.md b/docs/tech/3.renderer/templatesDynamicBlocks.md index c414e516..c9e776c0 100644 --- a/docs/tech/3.renderer/templatesDynamicBlocks.md +++ b/docs/tech/3.renderer/templatesDynamicBlocks.md @@ -26,4 +26,4 @@ You can use the built-in functions and filters or add your own, so you can imple

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Mon Nov 20 19:18:48 2023 +0300
    Page content update date: Thu Dec 21 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Dec 23 23:00:37 2023 +0300
    Page content update date: Sat Dec 23 2023
    Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/3.renderer/templatesLinking.md b/docs/tech/3.renderer/templatesLinking.md index a885220c..039bd0d7 100644 --- a/docs/tech/3.renderer/templatesLinking.md +++ b/docs/tech/3.renderer/templatesLinking.md @@ -27,4 +27,4 @@ You can also implement your own functions for relinking if necessary.

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Oct 28 11:03:31 2023 +0300
    Page content update date: Thu Dec 21 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Dec 23 23:00:37 2023 +0300
    Page content update date: Sat Dec 23 2023
    Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/3.renderer/templatesVariables.md b/docs/tech/3.renderer/templatesVariables.md index ad5fe8d1..25123956 100644 --- a/docs/tech/3.renderer/templatesVariables.md +++ b/docs/tech/3.renderer/templatesVariables.md @@ -11,4 +11,4 @@ There are several variables available in each processed template.

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Mon Nov 20 20:31:30 2023 +0300
    Page content update date: Thu Dec 21 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Dec 23 23:00:37 2023 +0300
    Page content update date: Sat Dec 23 2023
    Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/4.pluginSystem/readme.md b/docs/tech/4.pluginSystem/readme.md index f5a8e3fe..d939d498 100644 --- a/docs/tech/4.pluginSystem/readme.md +++ b/docs/tech/4.pluginSystem/readme.md @@ -190,4 +190,4 @@ plugins:

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Mon Nov 20 23:05:39 2023 +0300
    Page content update date: Thu Dec 21 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Dec 23 23:00:37 2023 +0300
    Page content update date: Sat Dec 23 2023
    Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/classes/BreadcrumbsHelper.md b/docs/tech/classes/BreadcrumbsHelper.md index 398c854a..3b80e132 100644 --- a/docs/tech/classes/BreadcrumbsHelper.md +++ b/docs/tech/classes/BreadcrumbsHelper.md @@ -2,7 +2,7 @@ BumbleDocGen / Technical description of the project / Class map / BreadcrumbsHelper

    - BreadcrumbsHelper class: + BreadcrumbsHelper class:

    @@ -54,6 +54,9 @@ final class BreadcrumbsHelper
  • getPageLinkByKey
  • +
  • + getTemplateFrontMatter +
  • getTemplateLinkKey
  • @@ -70,7 +73,7 @@ final class BreadcrumbsHelper @@ -85,7 +88,7 @@ final class BreadcrumbsHelper ```php @@ -288,7 +291,7 @@ public function getBreadcrumbsForTemplates(string $filePatch, bool $fromCurrent ```php @@ -483,10 +486,55 @@ public function getPageLinkByKey(string $key): null|string;
    + + +```php +public function getTemplateFrontMatter(string $templateName): array; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $templateNamestring-
    + +Return value: array + + +Throws: + + +
    +
    +
    + ```php @@ -531,7 +579,7 @@ public function getTemplateLinkKey(string $templateName): null|string; ```php @@ -574,8 +622,10 @@ public function getTemplateTitle(string $templateName): string; Examples of using: ```php -// variable in template: -// {% set title = 'Some template title' %} +# Front matter in template: +# --- +# title: Some template title +# --- $breadcrumbsHelper->getTemplateTitle() == 'Some template title'; // is true ``` diff --git a/docs/tech/classes/FrontMatterLoader.md b/docs/tech/classes/FrontMatterLoader.md new file mode 100644 index 00000000..64d0ec96 --- /dev/null +++ b/docs/tech/classes/FrontMatterLoader.md @@ -0,0 +1,273 @@ + + BumbleDocGen / Technical description of the project / Class map / FrontMatterLoader
    + +

    + FrontMatterLoader class: +

    + + + + + +```php +namespace BumbleDocGen\Core\Renderer\Twig; + +final class FrontMatterLoader implements \Twig\Loader\LoaderInterface +``` + + + + + + + + +

    Initialization methods:

    + +
      +
    1. + __construct +
    2. +
    + +

    Methods:

    + +
      +
    1. + exists +
    2. +
    3. + getCacheKey +
    4. +
    5. + getSourceContext +
    6. +
    7. + isFresh +
    8. +
    + + + + + + + +

    Method details:

    + +
    + + + +```php +public function __construct(\Twig\Loader\LoaderInterface $loader, \BumbleDocGen\Core\Renderer\Breadcrumbs\BreadcrumbsHelper $breadcrumbsHelper, bool $removeFrontMatterFromTemplate = true); +``` + + + +Parameters: + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $loader\Twig\Loader\LoaderInterface-
    $breadcrumbsHelper\BumbleDocGen\Core\Renderer\Breadcrumbs\BreadcrumbsHelper-
    $removeFrontMatterFromTemplatebool-
    + + + +
    +
    +
    + + + +```php +public function exists(string $name): bool; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $namestring-
    + +Return value: bool + + +
    +
    +
    + + + +```php +public function getCacheKey(string $name): string; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $namestring-
    + +Return value: string + + +
    +
    +
    + + + +```php +public function getSourceContext(string $name): \Twig\Source; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $namestring-
    + +Return value: \Twig\Source + + +Throws: + + +
    +
    +
    + + + +```php +public function isFresh(string $name, int $time): bool; +``` + + + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $namestring-
    $timeint-
    + +Return value: bool + + +
    +
    + + \ No newline at end of file diff --git a/docs/tech/classes/MainTwigEnvironment.md b/docs/tech/classes/MainTwigEnvironment.md index c0a946fa..485ccc01 100644 --- a/docs/tech/classes/MainTwigEnvironment.md +++ b/docs/tech/classes/MainTwigEnvironment.md @@ -2,7 +2,7 @@ BumbleDocGen / Technical description of the project / Class map / MainTwigEnvironment

    - MainTwigEnvironment class: + MainTwigEnvironment class:

    @@ -51,11 +51,11 @@ final class MainTwigEnvironment ```php -public function __construct(\BumbleDocGen\Core\Configuration\Configuration $configuration, \BumbleDocGen\Core\Renderer\Twig\MainExtension $mainExtension, \BumbleDocGen\Core\Plugin\PluginEventDispatcher $pluginEventDispatcher); +public function __construct(\BumbleDocGen\Core\Configuration\Configuration $configuration, \BumbleDocGen\Core\Renderer\Twig\MainExtension $mainExtension, \BumbleDocGen\Core\Plugin\PluginEventDispatcher $pluginEventDispatcher, \BumbleDocGen\Core\Renderer\Breadcrumbs\BreadcrumbsHelper $breadcrumbsHelper); ``` @@ -85,6 +85,11 @@ public function __construct(\BumbleDocGen\Core\Configuration\Configuration $conf $pluginEventDispatcher \BumbleDocGen\Core\Plugin\PluginEventDispatcher - + + + $breadcrumbsHelper + \BumbleDocGen\Core\Renderer\Breadcrumbs\BreadcrumbsHelper + - @@ -98,7 +103,7 @@ public function __construct(\BumbleDocGen\Core\Configuration\Configuration $conf ```php diff --git a/docs/tech/map.md b/docs/tech/map.md index ef823733..52c6e911 100644 --- a/docs/tech/map.md +++ b/docs/tech/map.md @@ -172,6 +172,7 @@ Directory layout ( only documented files shown ): │ │ │ │ │ ├── GetDocumentedEntityUrl.php Get the URL of a documented entity by its name. If the entity is found, next to the file where th... │ │ │ │ │ ├── LoadPluginsContent.php Process entity template blocks with plugins. The method returns the content processed by plugins. │ │ │ │ │ └── PrintEntityCollectionAsList.php Outputting entity data as HTML list +│ │ │ │ ├── FrontMatterLoader.php │ │ │ │ ├── MainExtension.php This is an extension that is used to generate documents from templates │ │ │ │ └── MainTwigEnvironment.php │ │ │ ├── Renderer.php Generates and processes files from directory TemplatesDir saving them to directory OutputDir @@ -268,4 +269,4 @@ Directory layout ( only documented files shown ):

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Mon Nov 20 19:18:48 2023 +0300
    Page content update date: Thu Dec 21 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Dec 23 23:00:37 2023 +0300
    Page content update date: Sat Dec 23 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file diff --git a/docs/tech/readme.md b/docs/tech/readme.md index 75252161..ff224193 100644 --- a/docs/tech/readme.md +++ b/docs/tech/readme.md @@ -44,4 +44,4 @@ After that, the process of parsing the project code according to the configurati

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Thu Oct 5 17:42:06 2023 +0300
    Page content update date: Thu Dec 21 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Dec 23 23:00:37 2023 +0300
    Page content update date: Sat Dec 23 2023
    Made with Bumble Documentation Generator \ No newline at end of file From 3e81060392501ee2b0981c7b2652422d3da26058 Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Sat, 23 Dec 2023 23:19:35 +0300 Subject: [PATCH 159/210] Updating UPGRADE.md --- UPGRADE.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/UPGRADE.md b/UPGRADE.md index 8c511b03..e6a60304 100644 --- a/UPGRADE.md +++ b/UPGRADE.md @@ -4,7 +4,9 @@ This document serves as a reference for updating your current version of the Bum ## Upgrading from BumbleDocGen 1.6.0 to 2.0.0 +* Updating the minimum PHP version to 8.1 * Changes when working with templates: variable `phpClassEntityCollection` renamed to `phpEntities` +* Now, instead of variables in the template with title and previous page, the Front Matter block is used * The BetterReflection library and classes that depend on it in the code have been removed: * `\BumbleDocGen\Core\Cache\SourceLocatorCacheItemPool` * `\BumbleDocGen\Core\Plugin\Event\Parser\OnLoadSourceLocatorsCollection` From 1b620a1751e23895305c01143bf7f94071b7ea1d Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Mon, 8 Jan 2024 14:21:19 +0300 Subject: [PATCH 160/210] Adding new event to handle entity doc files --- .../Renderer/BeforeCreatingEntityDocFile.php | 43 +++++++++++++++++++ src/Core/Renderer/Renderer.php | 32 +++++++------- 2 files changed, 60 insertions(+), 15 deletions(-) create mode 100644 src/Core/Plugin/Event/Renderer/BeforeCreatingEntityDocFile.php diff --git a/src/Core/Plugin/Event/Renderer/BeforeCreatingEntityDocFile.php b/src/Core/Plugin/Event/Renderer/BeforeCreatingEntityDocFile.php new file mode 100644 index 00000000..572ebd49 --- /dev/null +++ b/src/Core/Plugin/Event/Renderer/BeforeCreatingEntityDocFile.php @@ -0,0 +1,43 @@ +content; + } + + public function setContent(string $content): void + { + $this->content = $content; + } + + public function getOutputFilePatch(): string + { + return $this->outputFilePatch; + } + + public function setOutputFilePatch(string $outputFilePatch): void + { + $this->outputFilePatch = $outputFilePatch; + } + + public function getContext(): RendererContext + { + return $this->context; + } +} diff --git a/src/Core/Renderer/Renderer.php b/src/Core/Renderer/Renderer.php index 5fa7c683..35a2b3c4 100644 --- a/src/Core/Renderer/Renderer.php +++ b/src/Core/Renderer/Renderer.php @@ -10,14 +10,13 @@ use BumbleDocGen\Core\Parser\Entity\RootEntityCollectionsGroup; use BumbleDocGen\Core\Plugin\Event\Renderer\AfterRenderingEntities; use BumbleDocGen\Core\Plugin\Event\Renderer\BeforeCreatingDocFile; +use BumbleDocGen\Core\Plugin\Event\Renderer\BeforeCreatingEntityDocFile; use BumbleDocGen\Core\Plugin\Event\Renderer\BeforeRenderingDocFiles; use BumbleDocGen\Core\Plugin\Event\Renderer\BeforeRenderingEntities; use BumbleDocGen\Core\Plugin\PluginEventDispatcher; use BumbleDocGen\Core\Renderer\Context\DocumentedEntityWrapper; use BumbleDocGen\Core\Renderer\Context\RendererContext; use BumbleDocGen\Core\Renderer\Twig\MainTwigEnvironment; -use DI\DependencyException; -use DI\NotFoundException; use Psr\Cache\InvalidArgumentException; use Psr\Log\LoggerInterface; use Symfony\Component\Filesystem\Filesystem; @@ -34,15 +33,15 @@ final class Renderer { public function __construct( - private Configuration $configuration, - private RootEntityCollectionsGroup $rootEntityCollectionsGroup, - private PluginEventDispatcher $pluginEventDispatcher, - private RendererContext $rendererContext, - private MainTwigEnvironment $twig, - private RendererIteratorFactory $renderIteratorFactory, - private SharedCompressedDocumentFileCache $sharedCompressedDocumentFileCache, - private Filesystem $fs, - private LoggerInterface $logger + private readonly Configuration $configuration, + private readonly RootEntityCollectionsGroup $rootEntityCollectionsGroup, + private readonly PluginEventDispatcher $pluginEventDispatcher, + private readonly RendererContext $rendererContext, + private readonly MainTwigEnvironment $twig, + private readonly RendererIteratorFactory $renderIteratorFactory, + private readonly SharedCompressedDocumentFileCache $sharedCompressedDocumentFileCache, + private readonly Filesystem $fs, + private readonly LoggerInterface $logger ) { } @@ -52,9 +51,7 @@ public function __construct( * @throws InvalidArgumentException * @throws RuntimeError * @throws LoaderError - * @throws DependencyException * @throws SyntaxError - * @throws NotFoundException * @throws InvalidConfigurationParameterException */ public function run(): void @@ -104,8 +101,13 @@ public function run(): void if (!is_dir($newDirName)) { $this->fs->mkdir($newDirName, 0755); } - // tmp hack to fix gitHub pages - $this->fs->dumpFile($filePatch, "\n{$content}\n"); + $handledEvent = $this->pluginEventDispatcher->dispatch( + new BeforeCreatingEntityDocFile($content, $filePatch, $this->rendererContext) + ); + + $content = $handledEvent->getContent(); + $filePatch = $handledEvent->getOutputFilePatch(); + $this->fs->dumpFile($filePatch, $content); $this->logger->info("Saving `{$filePatch}`"); } From 9d7cc94813137b8789278b1afbf4143007d7f1cf Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Mon, 8 Jan 2024 14:21:58 +0300 Subject: [PATCH 161/210] Adding new option to render front matter --- src/Core/Configuration/Configuration.php | 14 ++++++++++++++ src/Core/Configuration/ConfigurationKey.php | 2 ++ src/Core/Configuration/defaultConfiguration.yaml | 1 + src/Core/Renderer/Twig/FrontMatterLoader.php | 2 +- src/Core/Renderer/Twig/MainExtension.php | 14 ++++++++++++-- src/Core/Renderer/Twig/MainTwigEnvironment.php | 7 ++++++- 6 files changed, 36 insertions(+), 4 deletions(-) diff --git a/src/Core/Configuration/Configuration.php b/src/Core/Configuration/Configuration.php index aeddcda9..610a7d61 100644 --- a/src/Core/Configuration/Configuration.php +++ b/src/Core/Configuration/Configuration.php @@ -324,6 +324,20 @@ public function useSharedCache(): bool return $useSharedCache; } + /** + * @throws InvalidConfigurationParameterException + */ + public function renderWithFrontMatter(): bool + { + try { + return $this->localObjectCache->getMethodCachedResult(__METHOD__, ''); + } catch (ObjectNotFoundException) { + } + $renderWithFrontMatter = $this->parameterBag->validateAndGetBooleanValue(ConfigurationKey::RENDER_WITH_FRONT_MATTER); + $this->localObjectCache->cacheMethodResult(__METHOD__, '', $renderWithFrontMatter); + return $renderWithFrontMatter; + } + /** * @throws InvalidConfigurationParameterException */ diff --git a/src/Core/Configuration/ConfigurationKey.php b/src/Core/Configuration/ConfigurationKey.php index 74f2314d..76715a14 100644 --- a/src/Core/Configuration/ConfigurationKey.php +++ b/src/Core/Configuration/ConfigurationKey.php @@ -14,6 +14,7 @@ final class ConfigurationKey public const PAGE_LINK_PROCESSOR = 'page_link_processor'; public const GIT_CLIENT_PATH = 'git_client_path'; public const USE_SHARED_CACHE = 'use_shared_cache'; + public const RENDER_WITH_FRONT_MATTER = 'render_with_front_matter'; public const CHECK_FILE_IN_GIT_BEFORE_CREATING_DOC = 'check_file_in_git_before_creating_doc'; public const SOURCE_LOCATORS = 'source_locators'; public const LANGUAGE_HANDLERS = 'language_handlers'; @@ -33,6 +34,7 @@ public static function all(): array self::PAGE_LINK_PROCESSOR, self::GIT_CLIENT_PATH, self::USE_SHARED_CACHE, + self::RENDER_WITH_FRONT_MATTER, self::CHECK_FILE_IN_GIT_BEFORE_CREATING_DOC, self::SOURCE_LOCATORS, self::LANGUAGE_HANDLERS, diff --git a/src/Core/Configuration/defaultConfiguration.yaml b/src/Core/Configuration/defaultConfiguration.yaml index 50bac201..899dd9f6 100644 --- a/src/Core/Configuration/defaultConfiguration.yaml +++ b/src/Core/Configuration/defaultConfiguration.yaml @@ -5,6 +5,7 @@ output_dir: "%project_root%/docs" # (string) Path to the directory where the fin cache_dir: '%WORKING_DIR%/.bumbleDocGenCache'# (string|null) Path to the directory where the documentation generator cache will be saved output_dir_base_url: "/docs" # (string) Basic part of url documentation. Used to form links in generated documents. git_client_path: "git" # (string) Path to git client +render_with_front_matter: true # (bool) Do not remove the front matter block from templates when creating documents check_file_in_git_before_creating_doc: true # (bool) Checking if a document exists in GIT before creating a document page_link_processor: # (PageLinkProcessorInterface) Link handler class on documentation pages class: \BumbleDocGen\Core\Renderer\PageLinkProcessor\BasePageLinkProcessor diff --git a/src/Core/Renderer/Twig/FrontMatterLoader.php b/src/Core/Renderer/Twig/FrontMatterLoader.php index ea30104a..99b96290 100644 --- a/src/Core/Renderer/Twig/FrontMatterLoader.php +++ b/src/Core/Renderer/Twig/FrontMatterLoader.php @@ -15,7 +15,7 @@ final class FrontMatterLoader implements LoaderInterface public function __construct( private readonly LoaderInterface $loader, private readonly BreadcrumbsHelper $breadcrumbsHelper, - private bool $removeFrontMatterFromTemplate = true + private readonly bool $removeFrontMatterFromTemplate = true ) { } diff --git a/src/Core/Renderer/Twig/MainExtension.php b/src/Core/Renderer/Twig/MainExtension.php index 5ab249e9..39b95999 100644 --- a/src/Core/Renderer/Twig/MainExtension.php +++ b/src/Core/Renderer/Twig/MainExtension.php @@ -11,6 +11,8 @@ use BumbleDocGen\Core\Renderer\Twig\Function\CustomFunctionsCollection; use BumbleDocGen\LanguageHandler\LanguageHandlerInterface; use BumbleDocGen\LanguageHandler\LanguageHandlersCollection; +use DI\DependencyException; +use DI\NotFoundException; /** * This is an extension that is used to generate documents from templates @@ -21,18 +23,22 @@ final class MainExtension extends \Twig\Extension\AbstractExtension private CustomFiltersCollection $filters; /** + * @throws NotFoundException + * @throws DependencyException * @throws InvalidConfigurationParameterException */ public function __construct( - private RendererContext $context, - private Configuration $configuration + private readonly RendererContext $context, + private readonly Configuration $configuration ) { $this->setDefaultFunctions(); $this->setDefaultFilters(); } /** + * @throws DependencyException * @throws InvalidConfigurationParameterException + * @throws NotFoundException */ public function getLanguageHandlersCollection(): LanguageHandlersCollection { @@ -40,6 +46,8 @@ public function getLanguageHandlersCollection(): LanguageHandlersCollection } /** + * @throws NotFoundException + * @throws DependencyException * @throws InvalidConfigurationParameterException */ public function setDefaultFunctions(): void @@ -54,6 +62,8 @@ public function setDefaultFunctions(): void } /** + * @throws NotFoundException + * @throws DependencyException * @throws InvalidConfigurationParameterException */ public function setDefaultFilters(): void diff --git a/src/Core/Renderer/Twig/MainTwigEnvironment.php b/src/Core/Renderer/Twig/MainTwigEnvironment.php index d9c9ab55..0fb353b4 100644 --- a/src/Core/Renderer/Twig/MainTwigEnvironment.php +++ b/src/Core/Renderer/Twig/MainTwigEnvironment.php @@ -37,7 +37,12 @@ private function loadMainTwigEnvironment(): void $templatesDir = $this->configuration->getTemplatesDir(); $event = $this->pluginEventDispatcher->dispatch(new OnGetProjectTemplatesDirs([$templatesDir])); $templatesDirs = $event->getTemplatesDirs(); - $loader = new FrontMatterLoader(new FilesystemLoader($templatesDirs), $this->breadcrumbsHelper); + $removeFrontMatterFromTemplate = !$this->configuration->renderWithFrontMatter(); + $loader = new FrontMatterLoader( + new FilesystemLoader($templatesDirs), + $this->breadcrumbsHelper, + $removeFrontMatterFromTemplate + ); $this->twig = new Environment($loader); $this->twig->addExtension($this->mainExtension); $this->isEnvLoaded = true; From aa561ae16ad8672e446e789277d66a2a53f0e242 Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Mon, 8 Jan 2024 14:22:05 +0300 Subject: [PATCH 162/210] Adding new option to render front matter --- src/DocGenerator.php | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/DocGenerator.php b/src/DocGenerator.php index c226252c..b1fc3625 100644 --- a/src/DocGenerator.php +++ b/src/DocGenerator.php @@ -411,6 +411,12 @@ public function getConfigurationKey(string $key): void $boolWrapFn($this->configuration->useSharedCache()), ], ], + ConfigurationKey::RENDER_WITH_FRONT_MATTER => [ + [ + 'Do not remove the front matter block from templates when creating documents', + $boolWrapFn($this->configuration->renderWithFrontMatter()), + ], + ], ConfigurationKey::CHECK_FILE_IN_GIT_BEFORE_CREATING_DOC => [ [ 'Check file in Git before creating doc', From 6240de011472582afeba24a74003bcc14669c9be Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Mon, 8 Jan 2024 14:25:25 +0300 Subject: [PATCH 163/210] Made it possible to change the name of the generated doc file --- .../Event/Renderer/BeforeCreatingDocFile.php | 17 +++++++++++++++-- src/Core/Renderer/Renderer.php | 10 ++++++---- 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/src/Core/Plugin/Event/Renderer/BeforeCreatingDocFile.php b/src/Core/Plugin/Event/Renderer/BeforeCreatingDocFile.php index 76bc1e89..89964885 100644 --- a/src/Core/Plugin/Event/Renderer/BeforeCreatingDocFile.php +++ b/src/Core/Plugin/Event/Renderer/BeforeCreatingDocFile.php @@ -12,8 +12,11 @@ */ final class BeforeCreatingDocFile extends Event { - public function __construct(private string $content, private RendererContext $context) - { + public function __construct( + private string $content, + private string $outputFilePatch, + private readonly RendererContext $context + ) { } public function getContent(): string @@ -26,6 +29,16 @@ public function setContent(string $content): void $this->content = $content; } + public function getOutputFilePatch(): string + { + return $this->outputFilePatch; + } + + public function setOutputFilePatch(string $outputFilePatch): void + { + $this->outputFilePatch = $outputFilePatch; + } + public function getContext(): RendererContext { return $this->context; diff --git a/src/Core/Renderer/Renderer.php b/src/Core/Renderer/Renderer.php index 35a2b3c4..36dbe4a6 100644 --- a/src/Core/Renderer/Renderer.php +++ b/src/Core/Renderer/Renderer.php @@ -66,18 +66,20 @@ public function run(): void $this->pluginEventDispatcher->dispatch(new BeforeRenderingDocFiles()); foreach ($this->renderIteratorFactory->getTemplatesWithOutdatedCache() as $templateFile) { + $filePatch = "{$outputDir}{$templateFile->getRelativeDocPath()}"; if ($templateFile->isTemplate()) { $this->rendererContext->setCurrentTemplateFilePatch($templateFile->getRelativeTemplatePath()); $content = $this->twig->render($templateFile->getRelativeTemplatePath(), $templateParams); - $content = $this->pluginEventDispatcher->dispatch( - new BeforeCreatingDocFile($content, $this->rendererContext) - )->getContent(); + $handledEvent = $this->pluginEventDispatcher->dispatch( + new BeforeCreatingDocFile($content, $filePatch, $this->rendererContext) + ); + $content = $handledEvent->getContent(); + $filePatch = $handledEvent->getOutputFilePatch(); } else { $content = file_get_contents($templateFile->getRealPath()); } - $filePatch = "{$outputDir}{$templateFile->getRelativeDocPath()}"; $newDirName = dirname($filePatch); if (!is_dir($newDirName)) { $this->fs->mkdir($newDirName, 0755); From d6110359fdf4240d5f6322479c33c23a8180b9a6 Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Mon, 8 Jan 2024 16:09:01 +0300 Subject: [PATCH 164/210] Fixing method to get new doc file path --- .../Event/Renderer/BeforeCreatingDocFile.php | 9 +---- .../Renderer/BeforeCreatingEntityDocFile.php | 9 +---- src/Core/Renderer/Renderer.php | 4 +- src/Core/Renderer/RendererIteratorFactory.php | 40 +++++++++++-------- 4 files changed, 27 insertions(+), 35 deletions(-) diff --git a/src/Core/Plugin/Event/Renderer/BeforeCreatingDocFile.php b/src/Core/Plugin/Event/Renderer/BeforeCreatingDocFile.php index 89964885..d45b3d58 100644 --- a/src/Core/Plugin/Event/Renderer/BeforeCreatingDocFile.php +++ b/src/Core/Plugin/Event/Renderer/BeforeCreatingDocFile.php @@ -4,7 +4,6 @@ namespace BumbleDocGen\Core\Plugin\Event\Renderer; -use BumbleDocGen\Core\Renderer\Context\RendererContext; use Symfony\Contracts\EventDispatcher\Event; /** @@ -14,8 +13,7 @@ final class BeforeCreatingDocFile extends Event { public function __construct( private string $content, - private string $outputFilePatch, - private readonly RendererContext $context + private string $outputFilePatch ) { } @@ -38,9 +36,4 @@ public function setOutputFilePatch(string $outputFilePatch): void { $this->outputFilePatch = $outputFilePatch; } - - public function getContext(): RendererContext - { - return $this->context; - } } diff --git a/src/Core/Plugin/Event/Renderer/BeforeCreatingEntityDocFile.php b/src/Core/Plugin/Event/Renderer/BeforeCreatingEntityDocFile.php index 572ebd49..4f3391c5 100644 --- a/src/Core/Plugin/Event/Renderer/BeforeCreatingEntityDocFile.php +++ b/src/Core/Plugin/Event/Renderer/BeforeCreatingEntityDocFile.php @@ -4,15 +4,13 @@ namespace BumbleDocGen\Core\Plugin\Event\Renderer; -use BumbleDocGen\Core\Renderer\Context\RendererContext; use Symfony\Contracts\EventDispatcher\Event; final class BeforeCreatingEntityDocFile extends Event { public function __construct( private string $content, - private string $outputFilePatch, - private readonly RendererContext $context + private string $outputFilePatch ) { } @@ -35,9 +33,4 @@ public function setOutputFilePatch(string $outputFilePatch): void { $this->outputFilePatch = $outputFilePatch; } - - public function getContext(): RendererContext - { - return $this->context; - } } diff --git a/src/Core/Renderer/Renderer.php b/src/Core/Renderer/Renderer.php index 36dbe4a6..1cc7c4f3 100644 --- a/src/Core/Renderer/Renderer.php +++ b/src/Core/Renderer/Renderer.php @@ -72,7 +72,7 @@ public function run(): void $content = $this->twig->render($templateFile->getRelativeTemplatePath(), $templateParams); $handledEvent = $this->pluginEventDispatcher->dispatch( - new BeforeCreatingDocFile($content, $filePatch, $this->rendererContext) + new BeforeCreatingDocFile($content, $filePatch) ); $content = $handledEvent->getContent(); $filePatch = $handledEvent->getOutputFilePatch(); @@ -104,7 +104,7 @@ public function run(): void $this->fs->mkdir($newDirName, 0755); } $handledEvent = $this->pluginEventDispatcher->dispatch( - new BeforeCreatingEntityDocFile($content, $filePatch, $this->rendererContext) + new BeforeCreatingEntityDocFile($content, $filePatch) ); $content = $handledEvent->getContent(); diff --git a/src/Core/Renderer/RendererIteratorFactory.php b/src/Core/Renderer/RendererIteratorFactory.php index 1a1224ac..346ea051 100644 --- a/src/Core/Renderer/RendererIteratorFactory.php +++ b/src/Core/Renderer/RendererIteratorFactory.php @@ -12,6 +12,7 @@ use BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException; use BumbleDocGen\Core\Logger\Handler\GenerationErrorsHandler; use BumbleDocGen\Core\Parser\Entity\RootEntityCollectionsGroup; +use BumbleDocGen\Core\Plugin\Event\Renderer\BeforeCreatingEntityDocFile; use BumbleDocGen\Core\Plugin\Event\Renderer\OnGetProjectTemplatesDirs; use BumbleDocGen\Core\Plugin\PluginEventDispatcher; use BumbleDocGen\Core\Renderer\Context\Dependency\RendererDependencyFactory; @@ -29,19 +30,19 @@ final class RendererIteratorFactory private array $renderedFileNames = []; public function __construct( - private RendererContext $rendererContext, - private RootEntityCollectionsGroup $rootEntityCollectionsGroup, - private DocumentedEntityWrappersCollection $documentedEntityWrappersCollection, - private Configuration $configuration, - private SharedCompressedDocumentFileCache $sharedCompressedDocumentFileCache, + private readonly RendererContext $rendererContext, + private readonly RootEntityCollectionsGroup $rootEntityCollectionsGroup, + private readonly DocumentedEntityWrappersCollection $documentedEntityWrappersCollection, + private readonly Configuration $configuration, + private readonly SharedCompressedDocumentFileCache $sharedCompressedDocumentFileCache, private RendererHelper $rendererHelper, - private RendererDependencyFactory $dependencyFactory, - private LocalObjectCache $localObjectCache, - private ProgressBarFactory $progressBarFactory, - private PluginEventDispatcher $pluginEventDispatcher, - private OutputStyle $io, - private Logger $logger, - private GenerationErrorsHandler $generationErrorsHandler, + private readonly RendererDependencyFactory $dependencyFactory, + private readonly LocalObjectCache $localObjectCache, + private readonly ProgressBarFactory $progressBarFactory, + private readonly PluginEventDispatcher $pluginEventDispatcher, + private readonly OutputStyle $io, + private readonly Logger $logger, + private readonly GenerationErrorsHandler $generationErrorsHandler, ) { } @@ -224,10 +225,14 @@ public function getFilesToRemove(): \Generator $this->markFileNameAsRendered('/.gitattributes'); foreach ($finder as $docFile) { + $handledEvent = $this->pluginEventDispatcher->dispatch( + new BeforeCreatingEntityDocFile('', $docFile->getRealPath()) + ); + $outputFilePatch = $handledEvent->getOutputFilePatch(); $relativeFilePath = str_replace( $this->configuration->getOutputDir(), '', - $docFile->getRealPath() + $outputFilePatch ); if (array_key_exists($relativeFilePath, $this->renderedFileNames)) { continue; @@ -268,10 +273,11 @@ private function isInternalCachingVersionChanged(): bool */ private function markFileNameAsRendered(string $docFileName): void { - $docFileName = str_replace([ - '.twig', - $this->configuration->getOutputDir() - ], '', $docFileName); + $docFileName = str_replace('.twig', '', $docFileName); + $handledEvent = $this->pluginEventDispatcher->dispatch( + new BeforeCreatingEntityDocFile('', $docFileName) + ); + $docFileName = str_replace($this->configuration->getOutputDir(), '', $handledEvent->getOutputFilePatch()); $this->renderedFileNames[$docFileName] = $docFileName; } From 6be9a322d339312af70b19aef9c77a7c530561fb Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Mon, 8 Jan 2024 20:15:58 +0300 Subject: [PATCH 165/210] Adding dynamic templates mode --- src/Core/Renderer/Renderer.php | 7 +++++- .../Renderer/Twig/MainTwigEnvironment.php | 24 +++++++++++++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/src/Core/Renderer/Renderer.php b/src/Core/Renderer/Renderer.php index 1cc7c4f3..d38b9f8d 100644 --- a/src/Core/Renderer/Renderer.php +++ b/src/Core/Renderer/Renderer.php @@ -48,14 +48,19 @@ public function __construct( /** * Starting the rendering process * + * @param bool $enableDynamicTemplatesMode Less productive mode, which is necessary to avoid caching twig templates within one script run + * * @throws InvalidArgumentException * @throws RuntimeError * @throws LoaderError * @throws SyntaxError * @throws InvalidConfigurationParameterException */ - public function run(): void + public function run(bool $enableDynamicTemplatesMode = false): void { + if ($enableDynamicTemplatesMode) { + $this->twig->enableDynamicTemplatesMode(); + } $outputDir = $this->configuration->getOutputDir(); $templateParams = []; diff --git a/src/Core/Renderer/Twig/MainTwigEnvironment.php b/src/Core/Renderer/Twig/MainTwigEnvironment.php index 0fb353b4..4162555f 100644 --- a/src/Core/Renderer/Twig/MainTwigEnvironment.php +++ b/src/Core/Renderer/Twig/MainTwigEnvironment.php @@ -19,6 +19,7 @@ final class MainTwigEnvironment { private Environment $twig; private bool $isEnvLoaded = false; + private bool $dynamicTemplatesMode = false; public function __construct( private readonly Configuration $configuration, @@ -49,6 +50,16 @@ private function loadMainTwigEnvironment(): void } } + /** + * To avoid template caching in Twig + * + * @internal + */ + public function enableDynamicTemplatesMode(): void + { + $this->dynamicTemplatesMode = true; + } + /** * @throws SyntaxError * @throws RuntimeError @@ -58,6 +69,19 @@ private function loadMainTwigEnvironment(): void public function render($name, array $context = []): string { $this->loadMainTwigEnvironment(); + // To avoid template caching in Twig + if ($this->dynamicTemplatesMode) { + $tmpTemplate = '/~bumbleDocGen' . uniqid() . '.twig'; + $tmpFile = $this->configuration->getTemplatesDir() . $tmpTemplate; + try { + file_put_contents($tmpFile, file_get_contents($this->configuration->getTemplatesDir() . $name)); + $data = $this->twig->render($tmpTemplate, $context); + } finally { + unlink($tmpFile); + } + return $data; + } + return $this->twig->render($name, $context); } } From 0f5745daf2b188c17e4194ed6ef4d70011b9cd13 Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Mon, 8 Jan 2024 20:17:01 +0300 Subject: [PATCH 166/210] Fixing remove old file errors --- src/Core/Renderer/RendererIteratorFactory.php | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/Core/Renderer/RendererIteratorFactory.php b/src/Core/Renderer/RendererIteratorFactory.php index 346ea051..8bf93571 100644 --- a/src/Core/Renderer/RendererIteratorFactory.php +++ b/src/Core/Renderer/RendererIteratorFactory.php @@ -225,14 +225,10 @@ public function getFilesToRemove(): \Generator $this->markFileNameAsRendered('/.gitattributes'); foreach ($finder as $docFile) { - $handledEvent = $this->pluginEventDispatcher->dispatch( - new BeforeCreatingEntityDocFile('', $docFile->getRealPath()) - ); - $outputFilePatch = $handledEvent->getOutputFilePatch(); $relativeFilePath = str_replace( $this->configuration->getOutputDir(), '', - $outputFilePatch + $docFile->getRealPath() ); if (array_key_exists($relativeFilePath, $this->renderedFileNames)) { continue; @@ -362,6 +358,9 @@ private function isFilesDependenciesCacheOutdated(string $templateFileName): boo return false; } + /** + * @throws InvalidConfigurationParameterException + */ private function moveCachedDataToCurrentData(string $templateFileName, ?string $entityName = null): void { $cachedEntitiesRelations = $this->sharedCompressedDocumentFileCache->get('entities_relations', []); From 9c265a1bae6837a7648ee47c8eea336d2bddf08c Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Tue, 9 Jan 2024 01:20:09 +0300 Subject: [PATCH 167/210] Adding Daux plugin --- .../Php/Plugin/CorePlugin/Daux/Daux.php | 106 ++++++++++++++++++ .../-Project_Structure/Entities_Map.md.twig | 9 ++ .../Project_Classes.md.twig | 19 ++++ .../Project_Interfaces.md.twig | 14 +++ .../-Project_Structure/Project_Traits.md.twig | 14 +++ .../-Project_Structure/index.md.twig | 12 ++ .../CorePlugin/Daux/templates/config.json | 10 ++ 7 files changed, 184 insertions(+) create mode 100644 src/LanguageHandler/Php/Plugin/CorePlugin/Daux/Daux.php create mode 100644 src/LanguageHandler/Php/Plugin/CorePlugin/Daux/templates/-Project_Structure/Entities_Map.md.twig create mode 100644 src/LanguageHandler/Php/Plugin/CorePlugin/Daux/templates/-Project_Structure/Project_Classes.md.twig create mode 100644 src/LanguageHandler/Php/Plugin/CorePlugin/Daux/templates/-Project_Structure/Project_Interfaces.md.twig create mode 100644 src/LanguageHandler/Php/Plugin/CorePlugin/Daux/templates/-Project_Structure/Project_Traits.md.twig create mode 100644 src/LanguageHandler/Php/Plugin/CorePlugin/Daux/templates/-Project_Structure/index.md.twig create mode 100644 src/LanguageHandler/Php/Plugin/CorePlugin/Daux/templates/config.json diff --git a/src/LanguageHandler/Php/Plugin/CorePlugin/Daux/Daux.php b/src/LanguageHandler/Php/Plugin/CorePlugin/Daux/Daux.php new file mode 100644 index 00000000..5726bdbd --- /dev/null +++ b/src/LanguageHandler/Php/Plugin/CorePlugin/Daux/Daux.php @@ -0,0 +1,106 @@ + 'onCreateDocumentedEntityWrapper', + OnGetTemplatePathByRelativeDocPath::class => 'onGetTemplatePathByRelativeDocPath', + OnGetProjectTemplatesDirs::class => 'onGetProjectTemplatesDirs', + BeforeCreatingDocFile::class => 'beforeCreatingDocFile', + BeforeCreatingEntityDocFile::class => 'beforeCreatingDocFile', + AfterRenderingEntities::class => 'afterRenderingEntities' + ]; + } + + /** + * @throws InvalidConfigurationParameterException + */ + final public function beforeCreatingDocFile(BeforeCreatingDocFile|BeforeCreatingEntityDocFile $event): void + { + $content = str_replace( + "{$this->configuration->getOutputDirBaseUrl()}/", + '/', + $event->getContent() + ); + + // MD links are not always converted to HTML correctly. This hack fixes that + $content = preg_replace('/\[([^\[]+)\]\((.*)\)/', '$1', $content); + + // Hack to make images work in generated HTML + $content = preg_replace_callback('/(src=("|\')\/)([^"\']+)/', function (array $elements): string { + return explode('?', $elements[0])[0]; + }, $content); + + $content = preg_replace('/(\/readme.md)("|\')/', '/index.md$2', $content); + $event->setContent($content); + + $outputFileName = $event->getOutputFilePatch(); + $outputFileName = preg_replace('/\/(readme.md)$/i', '/index.md', $outputFileName); + $event->setOutputFilePatch($outputFileName); + } + + public function onCreateDocumentedEntityWrapper(OnCreateDocumentedEntityWrapper $event): void + { + // Here we replace the parent document for all entities so that they are all in the same directory. + $structureDirName = self::ENTITY_DOC_STRUCTURE_DIR_NAME; + $event->getDocumentedEntityWrapper()->setParentDocFilePath("/{$structureDirName}/index.md"); + } + + public function onGetTemplatePathByRelativeDocPath(OnGetTemplatePathByRelativeDocPath $event): void + { + // When getting the path to the template file, + // we need to take into account that it is located in the plugin directory, and not the standard one. + if (str_starts_with($event->getTemplateName(), '/' . self::ENTITY_DOC_STRUCTURE_DIR_NAME)) { + $event->setCustomTemplateFilePath(self::TEMPLATES_FOLDER . $event->getTemplateName()); + } + } + + public function onGetProjectTemplatesDirs(OnGetProjectTemplatesDirs $event): void + { + $event->addTemplatesDir(self::TEMPLATES_FOLDER); + } + + /** + * @throws InvalidConfigurationParameterException + */ + public function afterRenderingEntities(): void + { + $indexFile = $this->breadcrumbsHelper->getNearestIndexFile('/'); + $frontMatter = $this->breadcrumbsHelper->getTemplateFrontMatter($indexFile); + + $dauxConfig = self::TEMPLATES_FOLDER . DIRECTORY_SEPARATOR . 'config.json'; + $config = json_decode(file_get_contents($dauxConfig), true); + $config = array_merge_recursive($config, $frontMatter); + $outputConfigFile = $this->configuration->getOutputDir() . DIRECTORY_SEPARATOR . 'config.json'; + file_put_contents($outputConfigFile, json_encode($config)); + } +} diff --git a/src/LanguageHandler/Php/Plugin/CorePlugin/Daux/templates/-Project_Structure/Entities_Map.md.twig b/src/LanguageHandler/Php/Plugin/CorePlugin/Daux/templates/-Project_Structure/Entities_Map.md.twig new file mode 100644 index 00000000..3b9bc477 --- /dev/null +++ b/src/LanguageHandler/Php/Plugin/CorePlugin/Daux/templates/-Project_Structure/Entities_Map.md.twig @@ -0,0 +1,9 @@ +--- +title: Project entities map +prevPage: Project structure +--- +{{ generatePageBreadcrumbs(title, _self) }} + +{{ "Entities map" | textToHeading('H1') }} + +{{ drawClassMap( phpEntities ) }} \ No newline at end of file diff --git a/src/LanguageHandler/Php/Plugin/CorePlugin/Daux/templates/-Project_Structure/Project_Classes.md.twig b/src/LanguageHandler/Php/Plugin/CorePlugin/Daux/templates/-Project_Structure/Project_Classes.md.twig new file mode 100644 index 00000000..af6001a4 --- /dev/null +++ b/src/LanguageHandler/Php/Plugin/CorePlugin/Daux/templates/-Project_Structure/Project_Classes.md.twig @@ -0,0 +1,19 @@ +--- +title: Project classes +prevPage: Project structure +--- +{{ generatePageBreadcrumbs(title, _self) }} + +{{ "Project classes" | textToHeading('H1') }} + + + + +{% for abstractClassEntity in phpEntities.getOnlyAbstractClasses() %} + +{% endfor %} + +{% for classEntity in phpEntities.getOnlyInstantiable() %} + +{% endfor %} +
    NameNamespace
    Abstract classes
    [a x-title='{{ classEntity.getShortName() }}']{{ abstractClassEntity.getName() }}[/a]{{ abstractClassEntity.getNamespaceName() }}
    Classes
    [a x-title='{{ classEntity.getShortName() }}']{{ classEntity.getName() }}[/a]{{ classEntity.getNamespaceName() }}
    \ No newline at end of file diff --git a/src/LanguageHandler/Php/Plugin/CorePlugin/Daux/templates/-Project_Structure/Project_Interfaces.md.twig b/src/LanguageHandler/Php/Plugin/CorePlugin/Daux/templates/-Project_Structure/Project_Interfaces.md.twig new file mode 100644 index 00000000..43c47edc --- /dev/null +++ b/src/LanguageHandler/Php/Plugin/CorePlugin/Daux/templates/-Project_Structure/Project_Interfaces.md.twig @@ -0,0 +1,14 @@ +--- +title: Project interfaces +prevPage: Project structure +--- +{{ generatePageBreadcrumbs(title, _self) }} + +{{ "Project interfaces" | textToHeading('H1') }} + + + +{% for interfaceEntity in phpEntities.getOnlyInterfaces() %} + +{% endfor %} +
    NameNamespace
    [a x-title='{{ interfaceEntity.getShortName() }}']{{ interfaceEntity.getName() }}[/a]{{ interfaceEntity.getNamespaceName() }}
    \ No newline at end of file diff --git a/src/LanguageHandler/Php/Plugin/CorePlugin/Daux/templates/-Project_Structure/Project_Traits.md.twig b/src/LanguageHandler/Php/Plugin/CorePlugin/Daux/templates/-Project_Structure/Project_Traits.md.twig new file mode 100644 index 00000000..a380c2e3 --- /dev/null +++ b/src/LanguageHandler/Php/Plugin/CorePlugin/Daux/templates/-Project_Structure/Project_Traits.md.twig @@ -0,0 +1,14 @@ +--- +title: Project traits +prevPage: Project structure +--- +{{ generatePageBreadcrumbs(title, _self) }} + +{{ "Project traits" | textToHeading('H1') }} + + + +{% for traitEntity in phpEntities.getOnlyTraits() %} + +{% endfor %} +
    NameNamespace
    [a x-title='{{ traitEntity.getShortName() }}']{{ traitEntity.getName() }}[/a]{{ traitEntity.getNamespaceName() }}
    \ No newline at end of file diff --git a/src/LanguageHandler/Php/Plugin/CorePlugin/Daux/templates/-Project_Structure/index.md.twig b/src/LanguageHandler/Php/Plugin/CorePlugin/Daux/templates/-Project_Structure/index.md.twig new file mode 100644 index 00000000..93a96255 --- /dev/null +++ b/src/LanguageHandler/Php/Plugin/CorePlugin/Daux/templates/-Project_Structure/index.md.twig @@ -0,0 +1,12 @@ +--- +title: Project structure +prevPage: / +--- +{{ generatePageBreadcrumbs(title, _self) }} + +{{ "Project structure" | textToHeading('H1') }} + +* Interfaces +* Classes +* Traits +* All entities map \ No newline at end of file diff --git a/src/LanguageHandler/Php/Plugin/CorePlugin/Daux/templates/config.json b/src/LanguageHandler/Php/Plugin/CorePlugin/Daux/templates/config.json new file mode 100644 index 00000000..17a39be7 --- /dev/null +++ b/src/LanguageHandler/Php/Plugin/CorePlugin/Daux/templates/config.json @@ -0,0 +1,10 @@ +{ + "tagline": "", + "html": { + "auto_landing": true, + "breadcrumbs": false, + "inherit_index": true, + "jump_buttons": true, + "toggle_code": false + } +} \ No newline at end of file From c4ebdc3f8104b423966790e20cd96ac851070f81 Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Tue, 9 Jan 2024 01:20:36 +0300 Subject: [PATCH 168/210] Adding Daux lib --- composer.json | 3 +- composer.lock | 1608 ++++++++++++++--- .../Php/Parser/Entity/BaseEntity.php | 4 +- 3 files changed, 1328 insertions(+), 287 deletions(-) diff --git a/composer.json b/composer.json index 80c29a27..240527d9 100644 --- a/composer.json +++ b/composer.json @@ -33,7 +33,8 @@ "symfony/yaml": "^6.0", "hassankhan/config": "^3.1", "guzzlehttp/guzzle": "^7.8", - "symfony/filesystem": "^6.0" + "symfony/filesystem": "^6.0", + "daux/daux.io": "^0.22.1" }, "require-dev": { "roave/security-advisories": "dev-latest", diff --git a/composer.lock b/composer.lock index 66dfb0cb..5c883332 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "d32b02956f16b2671cf86338e4ae8535", + "content-hash": "ef9784477bf206a6afda54b8574034b0", "packages": [ { "name": "bramus/ansi-php", @@ -102,6 +102,157 @@ ], "time": "2023-08-18T13:44:29+00:00" }, + { + "name": "daux/daux.io", + "version": "0.22.1", + "source": { + "type": "git", + "url": "https://github.com/dauxio/daux.io.git", + "reference": "d8ec7aaca64f7ab4ae53843b1eb21bdaa55b35b9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dauxio/daux.io/zipball/d8ec7aaca64f7ab4ae53843b1eb21bdaa55b35b9", + "reference": "d8ec7aaca64f7ab4ae53843b1eb21bdaa55b35b9", + "shasum": "" + }, + "require": { + "ext-json": "*", + "guzzlehttp/guzzle": "~6.0 || ~7.0", + "league/commonmark": "^2.2.0", + "league/plates": "~3.1", + "php": ">=8.1", + "scrivo/highlight.php": "^9.15", + "symfony/console": "^4.4|^5.0|^6.0", + "symfony/http-foundation": "^4.4|^5.0|^6.0", + "symfony/mime": "^4.4|^5.0|^6.0", + "symfony/polyfill-intl-icu": "^1.10", + "symfony/process": "^4.4|^5.0|^6.0", + "symfony/yaml": "^4.4|^5.0|^6.0" + }, + "replace": { + "justinwalsh/daux.io": "*" + }, + "require-dev": { + "mikey179/vfsstream": "^1.6", + "phpspec/prophecy-phpunit": "^2.0", + "phpunit/phpunit": "^9.5" + }, + "suggest": { + "ext-intl": "Allows to translate the modified at date" + }, + "bin": [ + "bin/daux" + ], + "type": "project", + "autoload": { + "psr-4": { + "Todaymade\\Daux\\": "libs/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Stéphane Goetz", + "homepage": "http://onigoetz.ch/" + }, + { + "name": "Justin Walsh", + "homepage": "http://todaymade.com/" + } + ], + "description": "Documentation generator that uses a simple folder structure and Markdown files to create custom documentation on the fly", + "homepage": "https://dauxio.github.io/", + "keywords": [ + "docs", + "documentation", + "markdown", + "md" + ], + "support": { + "issues": "https://github.com/dauxio/daux.io/issues", + "source": "https://github.com/dauxio/daux.io/tree/0.22.1" + }, + "time": "2023-09-24T17:06:59+00:00" + }, + { + "name": "dflydev/dot-access-data", + "version": "v3.0.2", + "source": { + "type": "git", + "url": "https://github.com/dflydev/dflydev-dot-access-data.git", + "reference": "f41715465d65213d644d3141a6a93081be5d3549" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dflydev/dflydev-dot-access-data/zipball/f41715465d65213d644d3141a6a93081be5d3549", + "reference": "f41715465d65213d644d3141a6a93081be5d3549", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^0.12.42", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.3", + "scrutinizer/ocular": "1.6.0", + "squizlabs/php_codesniffer": "^3.5", + "vimeo/psalm": "^4.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Dflydev\\DotAccessData\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Dragonfly Development Inc.", + "email": "info@dflydev.com", + "homepage": "http://dflydev.com" + }, + { + "name": "Beau Simensen", + "email": "beau@dflydev.com", + "homepage": "http://beausimensen.com" + }, + { + "name": "Carlos Frutos", + "email": "carlos@kiwing.it", + "homepage": "https://github.com/cfrutos" + }, + { + "name": "Colin O'Dell", + "email": "colinodell@gmail.com", + "homepage": "https://www.colinodell.com" + } + ], + "description": "Given a deep data structure, access data by dot notation.", + "homepage": "https://github.com/dflydev/dflydev-dot-access-data", + "keywords": [ + "access", + "data", + "dot", + "notation" + ], + "support": { + "issues": "https://github.com/dflydev/dflydev-dot-access-data/issues", + "source": "https://github.com/dflydev/dflydev-dot-access-data/tree/v3.0.2" + }, + "time": "2022-10-27T11:44:00+00:00" + }, { "name": "doctrine/annotations", "version": "1.14.3", @@ -750,6 +901,258 @@ }, "time": "2023-11-08T14:08:06+00:00" }, + { + "name": "league/commonmark", + "version": "2.4.1", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/commonmark.git", + "reference": "3669d6d5f7a47a93c08ddff335e6d945481a1dd5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/3669d6d5f7a47a93c08ddff335e6d945481a1dd5", + "reference": "3669d6d5f7a47a93c08ddff335e6d945481a1dd5", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "league/config": "^1.1.1", + "php": "^7.4 || ^8.0", + "psr/event-dispatcher": "^1.0", + "symfony/deprecation-contracts": "^2.1 || ^3.0", + "symfony/polyfill-php80": "^1.16" + }, + "require-dev": { + "cebe/markdown": "^1.0", + "commonmark/cmark": "0.30.0", + "commonmark/commonmark.js": "0.30.0", + "composer/package-versions-deprecated": "^1.8", + "embed/embed": "^4.4", + "erusev/parsedown": "^1.0", + "ext-json": "*", + "github/gfm": "0.29.0", + "michelf/php-markdown": "^1.4 || ^2.0", + "nyholm/psr7": "^1.5", + "phpstan/phpstan": "^1.8.2", + "phpunit/phpunit": "^9.5.21", + "scrutinizer/ocular": "^1.8.1", + "symfony/finder": "^5.3 | ^6.0", + "symfony/yaml": "^2.3 | ^3.0 | ^4.0 | ^5.0 | ^6.0", + "unleashedtech/php-coding-standard": "^3.1.1", + "vimeo/psalm": "^4.24.0 || ^5.0.0" + }, + "suggest": { + "symfony/yaml": "v2.3+ required if using the Front Matter extension" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.5-dev" + } + }, + "autoload": { + "psr-4": { + "League\\CommonMark\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Colin O'Dell", + "email": "colinodell@gmail.com", + "homepage": "https://www.colinodell.com", + "role": "Lead Developer" + } + ], + "description": "Highly-extensible PHP Markdown parser which fully supports the CommonMark spec and GitHub-Flavored Markdown (GFM)", + "homepage": "https://commonmark.thephpleague.com", + "keywords": [ + "commonmark", + "flavored", + "gfm", + "github", + "github-flavored", + "markdown", + "md", + "parser" + ], + "support": { + "docs": "https://commonmark.thephpleague.com/", + "forum": "https://github.com/thephpleague/commonmark/discussions", + "issues": "https://github.com/thephpleague/commonmark/issues", + "rss": "https://github.com/thephpleague/commonmark/releases.atom", + "source": "https://github.com/thephpleague/commonmark" + }, + "funding": [ + { + "url": "https://www.colinodell.com/sponsor", + "type": "custom" + }, + { + "url": "https://www.paypal.me/colinpodell/10.00", + "type": "custom" + }, + { + "url": "https://github.com/colinodell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/league/commonmark", + "type": "tidelift" + } + ], + "time": "2023-08-30T16:55:00+00:00" + }, + { + "name": "league/config", + "version": "v1.2.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/config.git", + "reference": "754b3604fb2984c71f4af4a9cbe7b57f346ec1f3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/config/zipball/754b3604fb2984c71f4af4a9cbe7b57f346ec1f3", + "reference": "754b3604fb2984c71f4af4a9cbe7b57f346ec1f3", + "shasum": "" + }, + "require": { + "dflydev/dot-access-data": "^3.0.1", + "nette/schema": "^1.2", + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^1.8.2", + "phpunit/phpunit": "^9.5.5", + "scrutinizer/ocular": "^1.8.1", + "unleashedtech/php-coding-standard": "^3.1", + "vimeo/psalm": "^4.7.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.2-dev" + } + }, + "autoload": { + "psr-4": { + "League\\Config\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Colin O'Dell", + "email": "colinodell@gmail.com", + "homepage": "https://www.colinodell.com", + "role": "Lead Developer" + } + ], + "description": "Define configuration arrays with strict schemas and access values with dot notation", + "homepage": "https://config.thephpleague.com", + "keywords": [ + "array", + "config", + "configuration", + "dot", + "dot-access", + "nested", + "schema" + ], + "support": { + "docs": "https://config.thephpleague.com/", + "issues": "https://github.com/thephpleague/config/issues", + "rss": "https://github.com/thephpleague/config/releases.atom", + "source": "https://github.com/thephpleague/config" + }, + "funding": [ + { + "url": "https://www.colinodell.com/sponsor", + "type": "custom" + }, + { + "url": "https://www.paypal.me/colinpodell/10.00", + "type": "custom" + }, + { + "url": "https://github.com/colinodell", + "type": "github" + } + ], + "time": "2022-12-11T20:36:23+00:00" + }, + { + "name": "league/plates", + "version": "v3.5.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/plates.git", + "reference": "a6a3238e46c6e19af7318fdc36bfbe49b0620231" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/plates/zipball/a6a3238e46c6e19af7318fdc36bfbe49b0620231", + "reference": "a6a3238e46c6e19af7318fdc36bfbe49b0620231", + "shasum": "" + }, + "require": { + "php": "^7.0|^8.0" + }, + "require-dev": { + "mikey179/vfsstream": "^1.6", + "phpunit/phpunit": "^9.5", + "squizlabs/php_codesniffer": "^3.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "psr-4": { + "League\\Plates\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jonathan Reinink", + "email": "jonathan@reinink.ca", + "role": "Developer" + }, + { + "name": "RJ Garcia", + "email": "ragboyjr@icloud.com", + "role": "Developer" + } + ], + "description": "Plates, the native PHP template system that's fast, easy to use and easy to extend.", + "homepage": "https://platesphp.com", + "keywords": [ + "league", + "package", + "templates", + "templating", + "views" + ], + "support": { + "issues": "https://github.com/thephpleague/plates/issues", + "source": "https://github.com/thephpleague/plates/tree/v3.5.0" + }, + "time": "2023-01-16T20:25:45+00:00" + }, { "name": "monolog/monolog", "version": "3.5.0", @@ -921,44 +1324,32 @@ "time": "2023-10-29T22:57:32+00:00" }, { - "name": "nette/utils", - "version": "v4.0.3", + "name": "nette/schema", + "version": "v1.2.5", "source": { "type": "git", - "url": "https://github.com/nette/utils.git", - "reference": "a9d127dd6a203ce6d255b2e2db49759f7506e015" + "url": "https://github.com/nette/schema.git", + "reference": "0462f0166e823aad657c9224d0f849ecac1ba10a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nette/utils/zipball/a9d127dd6a203ce6d255b2e2db49759f7506e015", - "reference": "a9d127dd6a203ce6d255b2e2db49759f7506e015", + "url": "https://api.github.com/repos/nette/schema/zipball/0462f0166e823aad657c9224d0f849ecac1ba10a", + "reference": "0462f0166e823aad657c9224d0f849ecac1ba10a", "shasum": "" }, "require": { - "php": ">=8.0 <8.4" - }, - "conflict": { - "nette/finder": "<3", - "nette/schema": "<1.2.2" + "nette/utils": "^2.5.7 || ^3.1.5 || ^4.0", + "php": "7.1 - 8.3" }, "require-dev": { - "jetbrains/phpstorm-attributes": "dev-master", - "nette/tester": "^2.5", - "phpstan/phpstan": "^1.0", - "tracy/tracy": "^2.9" - }, - "suggest": { - "ext-gd": "to use Image", - "ext-iconv": "to use Strings::webalize(), toAscii(), chr() and reverse()", - "ext-intl": "to use Strings::webalize(), toAscii(), normalize() and compare()", - "ext-json": "to use Nette\\Utils\\Json", - "ext-mbstring": "to use Strings::lower() etc...", - "ext-tokenizer": "to use Nette\\Utils\\Reflection::getUseStatements()" + "nette/tester": "^2.3 || ^2.4", + "phpstan/phpstan-nette": "^1.0", + "tracy/tracy": "^2.7" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "4.0-dev" + "dev-master": "1.2-dev" } }, "autoload": { @@ -982,12 +1373,86 @@ "homepage": "https://nette.org/contributors" } ], - "description": "🛠 Nette Utils: lightweight utilities for string & array manipulation, image handling, safe JSON encoding/decoding, validation, slug or strong password generating etc.", + "description": "📐 Nette Schema: validating data structures against a given Schema.", "homepage": "https://nette.org", "keywords": [ - "array", - "core", - "datetime", + "config", + "nette" + ], + "support": { + "issues": "https://github.com/nette/schema/issues", + "source": "https://github.com/nette/schema/tree/v1.2.5" + }, + "time": "2023-10-05T20:37:59+00:00" + }, + { + "name": "nette/utils", + "version": "v4.0.3", + "source": { + "type": "git", + "url": "https://github.com/nette/utils.git", + "reference": "a9d127dd6a203ce6d255b2e2db49759f7506e015" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nette/utils/zipball/a9d127dd6a203ce6d255b2e2db49759f7506e015", + "reference": "a9d127dd6a203ce6d255b2e2db49759f7506e015", + "shasum": "" + }, + "require": { + "php": ">=8.0 <8.4" + }, + "conflict": { + "nette/finder": "<3", + "nette/schema": "<1.2.2" + }, + "require-dev": { + "jetbrains/phpstorm-attributes": "dev-master", + "nette/tester": "^2.5", + "phpstan/phpstan": "^1.0", + "tracy/tracy": "^2.9" + }, + "suggest": { + "ext-gd": "to use Image", + "ext-iconv": "to use Strings::webalize(), toAscii(), chr() and reverse()", + "ext-intl": "to use Strings::webalize(), toAscii(), normalize() and compare()", + "ext-json": "to use Nette\\Utils\\Json", + "ext-mbstring": "to use Strings::lower() etc...", + "ext-tokenizer": "to use Nette\\Utils\\Reflection::getUseStatements()" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause", + "GPL-2.0-only", + "GPL-3.0-only" + ], + "authors": [ + { + "name": "David Grudl", + "homepage": "https://davidgrudl.com" + }, + { + "name": "Nette Community", + "homepage": "https://nette.org/contributors" + } + ], + "description": "🛠 Nette Utils: lightweight utilities for string & array manipulation, image handling, safe JSON encoding/decoding, validation, slug or strong password generating etc.", + "homepage": "https://nette.org", + "keywords": [ + "array", + "core", + "datetime", "images", "json", "nette", @@ -1360,16 +1825,16 @@ }, { "name": "phpstan/phpdoc-parser", - "version": "1.24.5", + "version": "1.25.0", "source": { "type": "git", "url": "https://github.com/phpstan/phpdoc-parser.git", - "reference": "fedf211ff14ec8381c9bf5714e33a7a552dd1acc" + "reference": "bd84b629c8de41aa2ae82c067c955e06f1b00240" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/fedf211ff14ec8381c9bf5714e33a7a552dd1acc", - "reference": "fedf211ff14ec8381c9bf5714e33a7a552dd1acc", + "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/bd84b629c8de41aa2ae82c067c955e06f1b00240", + "reference": "bd84b629c8de41aa2ae82c067c955e06f1b00240", "shasum": "" }, "require": { @@ -1401,9 +1866,9 @@ "description": "PHPDoc parser with support for nullable, intersection and generic types", "support": { "issues": "https://github.com/phpstan/phpdoc-parser/issues", - "source": "https://github.com/phpstan/phpdoc-parser/tree/1.24.5" + "source": "https://github.com/phpstan/phpdoc-parser/tree/1.25.0" }, - "time": "2023-12-16T09:33:33+00:00" + "time": "2024-01-04T17:06:16+00:00" }, { "name": "psr/cache", @@ -1811,18 +2276,96 @@ }, "time": "2019-03-08T08:55:37+00:00" }, + { + "name": "scrivo/highlight.php", + "version": "v9.18.1.10", + "source": { + "type": "git", + "url": "https://github.com/scrivo/highlight.php.git", + "reference": "850f4b44697a2552e892ffe71490ba2733c2fc6e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/scrivo/highlight.php/zipball/850f4b44697a2552e892ffe71490ba2733c2fc6e", + "reference": "850f4b44697a2552e892ffe71490ba2733c2fc6e", + "shasum": "" + }, + "require": { + "ext-json": "*", + "php": ">=5.4" + }, + "require-dev": { + "phpunit/phpunit": "^4.8|^5.7", + "sabberworm/php-css-parser": "^8.3", + "symfony/finder": "^2.8|^3.4|^5.4", + "symfony/var-dumper": "^2.8|^3.4|^5.4" + }, + "suggest": { + "ext-mbstring": "Allows highlighting code with unicode characters and supports language with unicode keywords" + }, + "type": "library", + "autoload": { + "files": [ + "HighlightUtilities/functions.php" + ], + "psr-0": { + "Highlight\\": "", + "HighlightUtilities\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Geert Bergman", + "homepage": "http://www.scrivo.org/", + "role": "Project Author" + }, + { + "name": "Vladimir Jimenez", + "homepage": "https://allejo.io", + "role": "Maintainer" + }, + { + "name": "Martin Folkers", + "homepage": "https://twobrain.io", + "role": "Contributor" + } + ], + "description": "Server side syntax highlighter that supports 185 languages. It's a PHP port of highlight.js", + "keywords": [ + "code", + "highlight", + "highlight.js", + "highlight.php", + "syntax" + ], + "support": { + "issues": "https://github.com/scrivo/highlight.php/issues", + "source": "https://github.com/scrivo/highlight.php" + }, + "funding": [ + { + "url": "https://github.com/allejo", + "type": "github" + } + ], + "time": "2022-12-17T21:53:22+00:00" + }, { "name": "symfony/cache", - "version": "v6.4.0", + "version": "v6.4.2", "source": { "type": "git", "url": "https://github.com/symfony/cache.git", - "reference": "ac2d25f97b17eec6e19760b6b9962a4f7c44356a" + "reference": "14a75869bbb41cb35bc5d9d322473928c6f3f978" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/cache/zipball/ac2d25f97b17eec6e19760b6b9962a4f7c44356a", - "reference": "ac2d25f97b17eec6e19760b6b9962a4f7c44356a", + "url": "https://api.github.com/repos/symfony/cache/zipball/14a75869bbb41cb35bc5d9d322473928c6f3f978", + "reference": "14a75869bbb41cb35bc5d9d322473928c6f3f978", "shasum": "" }, "require": { @@ -1889,7 +2432,7 @@ "psr6" ], "support": { - "source": "https://github.com/symfony/cache/tree/v6.4.0" + "source": "https://github.com/symfony/cache/tree/v6.4.2" }, "funding": [ { @@ -1905,7 +2448,7 @@ "type": "tidelift" } ], - "time": "2023-11-24T19:28:07+00:00" + "time": "2023-12-29T15:34:34+00:00" }, { "name": "symfony/cache-contracts", @@ -1985,16 +2528,16 @@ }, { "name": "symfony/console", - "version": "v6.4.1", + "version": "v6.4.2", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "a550a7c99daeedef3f9d23fb82e3531525ff11fd" + "reference": "0254811a143e6bc6c8deea08b589a7e68a37f625" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/a550a7c99daeedef3f9d23fb82e3531525ff11fd", - "reference": "a550a7c99daeedef3f9d23fb82e3531525ff11fd", + "url": "https://api.github.com/repos/symfony/console/zipball/0254811a143e6bc6c8deea08b589a7e68a37f625", + "reference": "0254811a143e6bc6c8deea08b589a7e68a37f625", "shasum": "" }, "require": { @@ -2059,7 +2602,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v6.4.1" + "source": "https://github.com/symfony/console/tree/v6.4.2" }, "funding": [ { @@ -2075,7 +2618,7 @@ "type": "tidelift" } ], - "time": "2023-11-30T10:54:28+00:00" + "time": "2023-12-10T16:15:48+00:00" }, { "name": "symfony/deprecation-contracts", @@ -2146,16 +2689,16 @@ }, { "name": "symfony/event-dispatcher", - "version": "v6.4.0", + "version": "v6.4.2", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "d76d2632cfc2206eecb5ad2b26cd5934082941b6" + "reference": "e95216850555cd55e71b857eb9d6c2674124603a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/d76d2632cfc2206eecb5ad2b26cd5934082941b6", - "reference": "d76d2632cfc2206eecb5ad2b26cd5934082941b6", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/e95216850555cd55e71b857eb9d6c2674124603a", + "reference": "e95216850555cd55e71b857eb9d6c2674124603a", "shasum": "" }, "require": { @@ -2206,7 +2749,7 @@ "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/event-dispatcher/tree/v6.4.0" + "source": "https://github.com/symfony/event-dispatcher/tree/v6.4.2" }, "funding": [ { @@ -2222,7 +2765,7 @@ "type": "tidelift" } ], - "time": "2023-07-27T06:52:43+00:00" + "time": "2023-12-27T22:16:42+00:00" }, { "name": "symfony/event-dispatcher-contracts", @@ -2345,7 +2888,569 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v6.4.0" + "source": "https://github.com/symfony/filesystem/tree/v6.4.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-07-26T17:27:13+00:00" + }, + { + "name": "symfony/finder", + "version": "v6.4.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/finder.git", + "reference": "11d736e97f116ac375a81f96e662911a34cd50ce" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/finder/zipball/11d736e97f116ac375a81f96e662911a34cd50ce", + "reference": "11d736e97f116ac375a81f96e662911a34cd50ce", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "symfony/filesystem": "^6.0|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Finder\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Finds files and directories via an intuitive fluent interface", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/finder/tree/v6.4.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-10-31T17:30:12+00:00" + }, + { + "name": "symfony/http-foundation", + "version": "v6.4.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-foundation.git", + "reference": "172d807f9ef3fc3fbed8377cc57c20d389269271" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/172d807f9ef3fc3fbed8377cc57c20d389269271", + "reference": "172d807f9ef3fc3fbed8377cc57c20d389269271", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "~1.1", + "symfony/polyfill-php83": "^1.27" + }, + "conflict": { + "symfony/cache": "<6.3" + }, + "require-dev": { + "doctrine/dbal": "^2.13.1|^3|^4", + "predis/predis": "^1.1|^2.0", + "symfony/cache": "^6.3|^7.0", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/expression-language": "^5.4|^6.0|^7.0", + "symfony/http-kernel": "^5.4.12|^6.0.12|^6.1.4|^7.0", + "symfony/mime": "^5.4|^6.0|^7.0", + "symfony/rate-limiter": "^5.4|^6.0|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpFoundation\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Defines an object-oriented layer for the HTTP specification", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/http-foundation/tree/v6.4.2" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-12-27T22:16:42+00:00" + }, + { + "name": "symfony/mime", + "version": "v6.4.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/mime.git", + "reference": "ca4f58b2ef4baa8f6cecbeca2573f88cd577d205" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/mime/zipball/ca4f58b2ef4baa8f6cecbeca2573f88cd577d205", + "reference": "ca4f58b2ef4baa8f6cecbeca2573f88cd577d205", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-intl-idn": "^1.10", + "symfony/polyfill-mbstring": "^1.0" + }, + "conflict": { + "egulias/email-validator": "~3.0.0", + "phpdocumentor/reflection-docblock": "<3.2.2", + "phpdocumentor/type-resolver": "<1.4.0", + "symfony/mailer": "<5.4", + "symfony/serializer": "<6.3.2" + }, + "require-dev": { + "egulias/email-validator": "^2.1.10|^3.1|^4", + "league/html-to-markdown": "^5.0", + "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/property-access": "^5.4|^6.0|^7.0", + "symfony/property-info": "^5.4|^6.0|^7.0", + "symfony/serializer": "^6.3.2|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Mime\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Allows manipulating MIME messages", + "homepage": "https://symfony.com", + "keywords": [ + "mime", + "mime-type" + ], + "support": { + "source": "https://github.com/symfony/mime/tree/v6.4.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-10-17T11:49:05+00:00" + }, + { + "name": "symfony/polyfill-ctype", + "version": "v1.28.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb", + "reference": "ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "provide": { + "ext-ctype": "*" + }, + "suggest": { + "ext-ctype": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.28-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Gert de Pagter", + "email": "BackEndTea@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for ctype functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "ctype", + "polyfill", + "portable" + ], + "support": { + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.28.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-01-26T09:26:14+00:00" + }, + { + "name": "symfony/polyfill-intl-grapheme", + "version": "v1.28.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-grapheme.git", + "reference": "875e90aeea2777b6f135677f618529449334a612" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/875e90aeea2777b6f135677f618529449334a612", + "reference": "875e90aeea2777b6f135677f618529449334a612", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.28-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Grapheme\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's grapheme_* functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "grapheme", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.28.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-01-26T09:26:14+00:00" + }, + { + "name": "symfony/polyfill-intl-icu", + "version": "v1.28.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-icu.git", + "reference": "e46b4da57951a16053cd751f63f4a24292788157" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-icu/zipball/e46b4da57951a16053cd751f63f4a24292788157", + "reference": "e46b4da57951a16053cd751f63f4a24292788157", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-intl": "For best performance and support of other locales than \"en\"" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.28-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Icu\\": "" + }, + "classmap": [ + "Resources/stubs" + ], + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's ICU-related data and classes", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "icu", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-icu/tree/v1.28.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-03-21T17:27:24+00:00" + }, + { + "name": "symfony/polyfill-intl-idn", + "version": "v1.28.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-idn.git", + "reference": "ecaafce9f77234a6a449d29e49267ba10499116d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/ecaafce9f77234a6a449d29e49267ba10499116d", + "reference": "ecaafce9f77234a6a449d29e49267ba10499116d", + "shasum": "" + }, + "require": { + "php": ">=7.1", + "symfony/polyfill-intl-normalizer": "^1.10", + "symfony/polyfill-php72": "^1.10" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.28-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Idn\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Laurent Bassin", + "email": "laurent@bassin.info" + }, + { + "name": "Trevor Rowbotham", + "email": "trevor.rowbotham@pm.me" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "idn", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.28.0" }, "funding": [ { @@ -2361,35 +3466,47 @@ "type": "tidelift" } ], - "time": "2023-07-26T17:27:13+00:00" + "time": "2023-01-26T09:30:37+00:00" }, { - "name": "symfony/finder", - "version": "v6.4.0", + "name": "symfony/polyfill-intl-normalizer", + "version": "v1.28.0", "source": { "type": "git", - "url": "https://github.com/symfony/finder.git", - "reference": "11d736e97f116ac375a81f96e662911a34cd50ce" + "url": "https://github.com/symfony/polyfill-intl-normalizer.git", + "reference": "8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/11d736e97f116ac375a81f96e662911a34cd50ce", - "reference": "11d736e97f116ac375a81f96e662911a34cd50ce", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92", + "reference": "8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=7.1" }, - "require-dev": { - "symfony/filesystem": "^6.0|^7.0" + "suggest": { + "ext-intl": "For best performance" }, "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.28-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, "autoload": { + "files": [ + "bootstrap.php" + ], "psr-4": { - "Symfony\\Component\\Finder\\": "" + "Symfony\\Polyfill\\Intl\\Normalizer\\": "" }, - "exclude-from-classmap": [ - "/Tests/" + "classmap": [ + "Resources/stubs" ] }, "notification-url": "https://packagist.org/downloads/", @@ -2398,18 +3515,26 @@ ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" + "name": "Nicolas Grekas", + "email": "p@tchwork.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "Finds files and directories via an intuitive fluent interface", + "description": "Symfony polyfill for intl's Normalizer class and related functions", "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "intl", + "normalizer", + "polyfill", + "portable", + "shim" + ], "support": { - "source": "https://github.com/symfony/finder/tree/v6.4.0" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.28.0" }, "funding": [ { @@ -2425,30 +3550,30 @@ "type": "tidelift" } ], - "time": "2023-10-31T17:30:12+00:00" + "time": "2023-01-26T09:26:14+00:00" }, { - "name": "symfony/polyfill-ctype", + "name": "symfony/polyfill-mbstring", "version": "v1.28.0", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb" + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "42292d99c55abe617799667f454222c54c60e229" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb", - "reference": "ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/42292d99c55abe617799667f454222c54c60e229", + "reference": "42292d99c55abe617799667f454222c54c60e229", "shasum": "" }, "require": { "php": ">=7.1" }, "provide": { - "ext-ctype": "*" + "ext-mbstring": "*" }, "suggest": { - "ext-ctype": "For best performance" + "ext-mbstring": "For best performance" }, "type": "library", "extra": { @@ -2465,7 +3590,7 @@ "bootstrap.php" ], "psr-4": { - "Symfony\\Polyfill\\Ctype\\": "" + "Symfony\\Polyfill\\Mbstring\\": "" } }, "notification-url": "https://packagist.org/downloads/", @@ -2474,24 +3599,25 @@ ], "authors": [ { - "name": "Gert de Pagter", - "email": "BackEndTea@gmail.com" + "name": "Nicolas Grekas", + "email": "p@tchwork.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony polyfill for ctype functions", + "description": "Symfony polyfill for the Mbstring extension", "homepage": "https://symfony.com", "keywords": [ "compatibility", - "ctype", + "mbstring", "polyfill", - "portable" + "portable", + "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.28.0" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.28.0" }, "funding": [ { @@ -2507,28 +3633,25 @@ "type": "tidelift" } ], - "time": "2023-01-26T09:26:14+00:00" + "time": "2023-07-28T09:04:16+00:00" }, { - "name": "symfony/polyfill-intl-grapheme", + "name": "symfony/polyfill-php72", "version": "v1.28.0", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "875e90aeea2777b6f135677f618529449334a612" + "url": "https://github.com/symfony/polyfill-php72.git", + "reference": "70f4aebd92afca2f865444d30a4d2151c13c3179" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/875e90aeea2777b6f135677f618529449334a612", - "reference": "875e90aeea2777b6f135677f618529449334a612", + "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/70f4aebd92afca2f865444d30a4d2151c13c3179", + "reference": "70f4aebd92afca2f865444d30a4d2151c13c3179", "shasum": "" }, "require": { "php": ">=7.1" }, - "suggest": { - "ext-intl": "For best performance" - }, "type": "library", "extra": { "branch-alias": { @@ -2544,7 +3667,7 @@ "bootstrap.php" ], "psr-4": { - "Symfony\\Polyfill\\Intl\\Grapheme\\": "" + "Symfony\\Polyfill\\Php72\\": "" } }, "notification-url": "https://packagist.org/downloads/", @@ -2561,18 +3684,16 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony polyfill for intl's grapheme_* functions", + "description": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions", "homepage": "https://symfony.com", "keywords": [ "compatibility", - "grapheme", - "intl", "polyfill", "portable", "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.28.0" + "source": "https://github.com/symfony/polyfill-php72/tree/v1.28.0" }, "funding": [ { @@ -2591,25 +3712,22 @@ "time": "2023-01-26T09:26:14+00:00" }, { - "name": "symfony/polyfill-intl-normalizer", + "name": "symfony/polyfill-php80", "version": "v1.28.0", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92" + "url": "https://github.com/symfony/polyfill-php80.git", + "reference": "6caa57379c4aec19c0a12a38b59b26487dcfe4b5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92", - "reference": "8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/6caa57379c4aec19c0a12a38b59b26487dcfe4b5", + "reference": "6caa57379c4aec19c0a12a38b59b26487dcfe4b5", "shasum": "" }, "require": { "php": ">=7.1" }, - "suggest": { - "ext-intl": "For best performance" - }, "type": "library", "extra": { "branch-alias": { @@ -2625,7 +3743,7 @@ "bootstrap.php" ], "psr-4": { - "Symfony\\Polyfill\\Intl\\Normalizer\\": "" + "Symfony\\Polyfill\\Php80\\": "" }, "classmap": [ "Resources/stubs" @@ -2636,6 +3754,10 @@ "MIT" ], "authors": [ + { + "name": "Ion Bazan", + "email": "ion.bazan@gmail.com" + }, { "name": "Nicolas Grekas", "email": "p@tchwork.com" @@ -2645,18 +3767,16 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony polyfill for intl's Normalizer class and related functions", + "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", "homepage": "https://symfony.com", "keywords": [ "compatibility", - "intl", - "normalizer", "polyfill", "portable", "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.28.0" + "source": "https://github.com/symfony/polyfill-php80/tree/v1.28.0" }, "funding": [ { @@ -2675,27 +3795,22 @@ "time": "2023-01-26T09:26:14+00:00" }, { - "name": "symfony/polyfill-mbstring", + "name": "symfony/polyfill-php83", "version": "v1.28.0", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "42292d99c55abe617799667f454222c54c60e229" + "url": "https://github.com/symfony/polyfill-php83.git", + "reference": "b0f46ebbeeeda3e9d2faebdfbf4b4eae9b59fa11" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/42292d99c55abe617799667f454222c54c60e229", - "reference": "42292d99c55abe617799667f454222c54c60e229", + "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/b0f46ebbeeeda3e9d2faebdfbf4b4eae9b59fa11", + "reference": "b0f46ebbeeeda3e9d2faebdfbf4b4eae9b59fa11", "shasum": "" }, "require": { - "php": ">=7.1" - }, - "provide": { - "ext-mbstring": "*" - }, - "suggest": { - "ext-mbstring": "For best performance" + "php": ">=7.1", + "symfony/polyfill-php80": "^1.14" }, "type": "library", "extra": { @@ -2712,8 +3827,11 @@ "bootstrap.php" ], "psr-4": { - "Symfony\\Polyfill\\Mbstring\\": "" - } + "Symfony\\Polyfill\\Php83\\": "" + }, + "classmap": [ + "Resources/stubs" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -2729,17 +3847,16 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony polyfill for the Mbstring extension", + "description": "Symfony polyfill backporting some PHP 8.3+ features to lower PHP versions", "homepage": "https://symfony.com", "keywords": [ "compatibility", - "mbstring", "polyfill", "portable", "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.28.0" + "source": "https://github.com/symfony/polyfill-php83/tree/v1.28.0" }, "funding": [ { @@ -2755,44 +3872,32 @@ "type": "tidelift" } ], - "time": "2023-07-28T09:04:16+00:00" + "time": "2023-08-16T06:22:46+00:00" }, { - "name": "symfony/polyfill-php80", - "version": "v1.28.0", + "name": "symfony/process", + "version": "v6.4.2", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "6caa57379c4aec19c0a12a38b59b26487dcfe4b5" + "url": "https://github.com/symfony/process.git", + "reference": "c4b1ef0bc80533d87a2e969806172f1c2a980241" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/6caa57379c4aec19c0a12a38b59b26487dcfe4b5", - "reference": "6caa57379c4aec19c0a12a38b59b26487dcfe4b5", + "url": "https://api.github.com/repos/symfony/process/zipball/c4b1ef0bc80533d87a2e969806172f1c2a980241", + "reference": "c4b1ef0bc80533d87a2e969806172f1c2a980241", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=8.1" }, "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.28-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, "autoload": { - "files": [ - "bootstrap.php" - ], "psr-4": { - "Symfony\\Polyfill\\Php80\\": "" + "Symfony\\Component\\Process\\": "" }, - "classmap": [ - "Resources/stubs" + "exclude-from-classmap": [ + "/Tests/" ] }, "notification-url": "https://packagist.org/downloads/", @@ -2801,28 +3906,18 @@ ], "authors": [ { - "name": "Ion Bazan", - "email": "ion.bazan@gmail.com" - }, - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" + "name": "Fabien Potencier", + "email": "fabien@symfony.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", + "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.28.0" + "source": "https://github.com/symfony/process/tree/v6.4.2" }, "funding": [ { @@ -2838,25 +3933,25 @@ "type": "tidelift" } ], - "time": "2023-01-26T09:26:14+00:00" + "time": "2023-12-22T16:42:54+00:00" }, { "name": "symfony/service-contracts", - "version": "v3.4.0", + "version": "v3.4.1", "source": { "type": "git", "url": "https://github.com/symfony/service-contracts.git", - "reference": "b3313c2dbffaf71c8de2934e2ea56ed2291a3838" + "reference": "fe07cbc8d837f60caf7018068e350cc5163681a0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/b3313c2dbffaf71c8de2934e2ea56ed2291a3838", - "reference": "b3313c2dbffaf71c8de2934e2ea56ed2291a3838", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/fe07cbc8d837f60caf7018068e350cc5163681a0", + "reference": "fe07cbc8d837f60caf7018068e350cc5163681a0", "shasum": "" }, "require": { "php": ">=8.1", - "psr/container": "^2.0" + "psr/container": "^1.1|^2.0" }, "conflict": { "ext-psr": "<1.1|>=2" @@ -2904,7 +3999,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/service-contracts/tree/v3.4.0" + "source": "https://github.com/symfony/service-contracts/tree/v3.4.1" }, "funding": [ { @@ -2920,20 +4015,20 @@ "type": "tidelift" } ], - "time": "2023-07-30T20:28:31+00:00" + "time": "2023-12-26T14:02:43+00:00" }, { "name": "symfony/string", - "version": "v6.4.0", + "version": "v6.4.2", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "b45fcf399ea9c3af543a92edf7172ba21174d809" + "reference": "7cb80bc10bfcdf6b5492741c0b9357dac66940bc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/b45fcf399ea9c3af543a92edf7172ba21174d809", - "reference": "b45fcf399ea9c3af543a92edf7172ba21174d809", + "url": "https://api.github.com/repos/symfony/string/zipball/7cb80bc10bfcdf6b5492741c0b9357dac66940bc", + "reference": "7cb80bc10bfcdf6b5492741c0b9357dac66940bc", "shasum": "" }, "require": { @@ -2990,7 +4085,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v6.4.0" + "source": "https://github.com/symfony/string/tree/v6.4.2" }, "funding": [ { @@ -3006,20 +4101,20 @@ "type": "tidelift" } ], - "time": "2023-11-28T20:41:49+00:00" + "time": "2023-12-10T16:15:48+00:00" }, { "name": "symfony/var-exporter", - "version": "v6.4.1", + "version": "v6.4.2", "source": { "type": "git", "url": "https://github.com/symfony/var-exporter.git", - "reference": "2d08ca6b9cc704dce525615d1e6d1788734f36d9" + "reference": "5fe9a0021b8d35e67d914716ec8de50716a68e7e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-exporter/zipball/2d08ca6b9cc704dce525615d1e6d1788734f36d9", - "reference": "2d08ca6b9cc704dce525615d1e6d1788734f36d9", + "url": "https://api.github.com/repos/symfony/var-exporter/zipball/5fe9a0021b8d35e67d914716ec8de50716a68e7e", + "reference": "5fe9a0021b8d35e67d914716ec8de50716a68e7e", "shasum": "" }, "require": { @@ -3065,7 +4160,7 @@ "serialize" ], "support": { - "source": "https://github.com/symfony/var-exporter/tree/v6.4.1" + "source": "https://github.com/symfony/var-exporter/tree/v6.4.2" }, "funding": [ { @@ -3081,7 +4176,7 @@ "type": "tidelift" } ], - "time": "2023-11-30T10:32:10+00:00" + "time": "2023-12-27T08:18:35+00:00" }, { "name": "symfony/yaml", @@ -3777,23 +4872,23 @@ }, { "name": "phpunit/php-code-coverage", - "version": "9.2.29", + "version": "9.2.30", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "6a3a87ac2bbe33b25042753df8195ba4aa534c76" + "reference": "ca2bd87d2f9215904682a9cb9bb37dda98e76089" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/6a3a87ac2bbe33b25042753df8195ba4aa534c76", - "reference": "6a3a87ac2bbe33b25042753df8195ba4aa534c76", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/ca2bd87d2f9215904682a9cb9bb37dda98e76089", + "reference": "ca2bd87d2f9215904682a9cb9bb37dda98e76089", "shasum": "" }, "require": { "ext-dom": "*", "ext-libxml": "*", "ext-xmlwriter": "*", - "nikic/php-parser": "^4.15", + "nikic/php-parser": "^4.18 || ^5.0", "php": ">=7.3", "phpunit/php-file-iterator": "^3.0.3", "phpunit/php-text-template": "^2.0.2", @@ -3843,7 +4938,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.29" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.30" }, "funding": [ { @@ -3851,7 +4946,7 @@ "type": "github" } ], - "time": "2023-09-19T04:57:46+00:00" + "time": "2023-12-22T06:47:57+00:00" }, { "name": "phpunit/php-file-iterator", @@ -4203,12 +5298,12 @@ "source": { "type": "git", "url": "https://github.com/Roave/SecurityAdvisories.git", - "reference": "bdde663d321b2d2130c2f88e2607c2edf4071f2c" + "reference": "c8682d0318353f7979a429981e902463e4879cf0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/bdde663d321b2d2130c2f88e2607c2edf4071f2c", - "reference": "bdde663d321b2d2130c2f88e2607c2edf4071f2c", + "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/c8682d0318353f7979a429981e902463e4879cf0", + "reference": "c8682d0318353f7979a429981e902463e4879cf0", "shasum": "" }, "conflict": { @@ -4240,9 +5335,9 @@ "athlon1600/php-proxy": "<=5.1", "athlon1600/php-proxy-app": "<=3", "austintoddj/canvas": "<=3.4.2", - "automad/automad": "<1.8", + "automad/automad": "<=1.10.9", "awesome-support/awesome-support": "<=6.0.7", - "aws/aws-sdk-php": ">=3,<3.2.1", + "aws/aws-sdk-php": "<3.288.1", "azuracast/azuracast": "<0.18.3", "backdrop/backdrop": "<1.24.2", "backpack/crud": "<3.4.9", @@ -4282,6 +5377,7 @@ "cesnet/simplesamlphp-module-proxystatistics": "<3.1", "chriskacerguis/codeigniter-restserver": "<=2.7.1", "civicrm/civicrm-core": ">=4.2,<4.2.9|>=4.3,<4.3.3", + "ckeditor/ckeditor": "<4.17", "cockpit-hq/cockpit": "<=2.6.3", "codeception/codeception": "<3.1.3|>=4,<4.1.22", "codeigniter/framework": "<3.1.9", @@ -4289,7 +5385,7 @@ "codeigniter4/shield": "<1.0.0.0-beta8", "codiad/codiad": "<=2.8.4", "composer/composer": "<1.10.27|>=2,<2.2.22|>=2.3,<2.6.4", - "concrete5/concrete5": "<9.2.2", + "concrete5/concrete5": "<9.2.3", "concrete5/core": "<8.5.8|>=9,<9.1", "contao-components/mediaelement": ">=2.14.2,<2.21.1", "contao/contao": ">=4,<4.4.56|>=4.5,<4.9.40|>=4.10,<4.11.7|>=4.13,<4.13.21|>=5.1,<5.1.4", @@ -4297,8 +5393,9 @@ "contao/core-bundle": "<4.9.42|>=4.10,<4.13.28|>=5,<5.1.10", "contao/listing-bundle": ">=4,<4.4.8", "contao/managed-edition": "<=1.5", + "corveda/phpsandbox": "<1.3.5", "cosenary/instagram": "<=2.3", - "craftcms/cms": "<=4.4.14", + "craftcms/cms": "<=4.5.10", "croogo/croogo": "<4", "cuyz/valinor": "<0.12", "czproject/git-php": "<4.0.3", @@ -4368,8 +5465,8 @@ "firebase/php-jwt": "<6", "fixpunkt/fp-masterquiz": "<2.2.1|>=3,<3.5.2", "fixpunkt/fp-newsletter": "<1.1.1|>=2,<2.1.2|>=2.2,<3.2.6", - "flarum/core": "<1.8", - "flarum/framework": "<1.8", + "flarum/core": "<1.8.5", + "flarum/framework": "<1.8.5", "flarum/mentions": "<1.6.3", "flarum/sticky": ">=0.1.0.0-beta14,<=0.1.0.0-beta15", "flarum/tags": "<=0.1.0.0-beta13", @@ -4389,7 +5486,7 @@ "friendsoftypo3/mediace": ">=7.6.2,<7.6.5", "friendsoftypo3/openid": ">=4.5,<4.5.31|>=4.7,<4.7.16|>=6,<6.0.11|>=6.1,<6.1.6", "froala/wysiwyg-editor": "<3.2.7|>=4.0.1,<=4.1.1", - "froxlor/froxlor": "<2.1.0.0-beta1", + "froxlor/froxlor": "<=2.1.1", "fuel/core": "<1.8.1", "funadmin/funadmin": "<=3.2|>=3.3.2,<=3.3.3", "gaoming13/wechat-php-sdk": "<=1.10.2", @@ -4399,7 +5496,7 @@ "getkirby/kirby": "<=2.5.12", "getkirby/panel": "<2.5.14", "getkirby/starterkit": "<=3.7.0.2", - "gilacms/gila": "<=1.11.4", + "gilacms/gila": "<=1.15.4", "gleez/cms": "<=1.2|==2", "globalpayments/php-sdk": "<2", "gogentooss/samlbase": "<1.2.7", @@ -4407,7 +5504,7 @@ "gos/web-socket-bundle": "<1.10.4|>=2,<2.6.1|>=3,<3.3", "gree/jose": "<2.2.1", "gregwar/rst": "<1.0.3", - "grumpydictator/firefly-iii": "<6", + "grumpydictator/firefly-iii": "<6.1.1", "gugoan/economizzer": "<=0.9.0.0-beta1", "guzzlehttp/guzzle": "<6.5.8|>=7,<7.4.5", "guzzlehttp/psr7": "<1.9.1|>=2,<2.4.5", @@ -4496,6 +5593,7 @@ "magento/magento1ee": ">=1,<1.14.4.3-dev", "magento/product-community-edition": ">=2,<2.2.10|>=2.3,<2.3.2.0-patch2", "maikuolan/phpmussel": ">=1,<1.6", + "mainwp/mainwp": "<=4.4.3.3", "mantisbt/mantisbt": "<=2.25.7", "marcwillmann/turn": "<0.3.3", "matyhtf/framework": "<3.0.6", @@ -4605,6 +5703,7 @@ "pimcore/perspective-editor": "<1.5.1", "pimcore/pimcore": "<11.1.1", "pixelfed/pixelfed": "<=0.11.4", + "plotly/plotly.js": "<2.25.2", "pocketmine/bedrock-protocol": "<8.0.2", "pocketmine/pocketmine-mp": "<=4.23|>=5,<5.3.1", "pocketmine/raklib": ">=0.14,<0.14.6|>=0.15,<0.15.1", @@ -4614,7 +5713,7 @@ "prestashop/blockwishlist": ">=2,<2.1.1", "prestashop/contactform": ">=1.0.1,<4.3", "prestashop/gamification": "<2.3.2", - "prestashop/prestashop": "<8.1.2", + "prestashop/prestashop": "<8.1.3", "prestashop/productcomments": "<5.0.2", "prestashop/ps_emailsubscription": "<2.6.1", "prestashop/ps_facetedsearch": "<3.4.1", @@ -4798,7 +5897,7 @@ "usmanhalalit/pixie": "<1.0.3|>=2,<2.0.2", "uvdesk/community-skeleton": "<=1.1.1", "vanilla/safecurl": "<0.9.2", - "verot/class.upload.php": "<=1.0.3|>=2,<=2.0.4", + "verot/class.upload.php": "<=2.1.6", "vova07/yii2-fileapi-widget": "<0.1.9", "vrana/adminer": "<4.8.1", "waldhacker/hcaptcha": "<2.1.2", @@ -4814,6 +5913,8 @@ "wikibase/wikibase": "<=1.39.3", "wikimedia/parsoid": "<0.12.2", "willdurand/js-translation-bundle": "<2.1.1", + "winter/wn-backend-module": "<1.2.4", + "winter/wn-system-module": "<1.2.4", "wintercms/winter": "<1.2.3", "woocommerce/woocommerce": "<6.6", "wp-cli/wp-cli": "<2.5", @@ -4913,7 +6014,7 @@ "type": "tidelift" } ], - "time": "2023-12-20T21:04:04+00:00" + "time": "2024-01-05T21:04:02+00:00" }, { "name": "sebastian/cli-parser", @@ -5158,20 +6259,20 @@ }, { "name": "sebastian/complexity", - "version": "2.0.2", + "version": "2.0.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/complexity.git", - "reference": "739b35e53379900cc9ac327b2147867b8b6efd88" + "reference": "25f207c40d62b8b7aa32f5ab026c53561964053a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/739b35e53379900cc9ac327b2147867b8b6efd88", - "reference": "739b35e53379900cc9ac327b2147867b8b6efd88", + "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/25f207c40d62b8b7aa32f5ab026c53561964053a", + "reference": "25f207c40d62b8b7aa32f5ab026c53561964053a", "shasum": "" }, "require": { - "nikic/php-parser": "^4.7", + "nikic/php-parser": "^4.18 || ^5.0", "php": ">=7.3" }, "require-dev": { @@ -5203,7 +6304,7 @@ "homepage": "https://github.com/sebastianbergmann/complexity", "support": { "issues": "https://github.com/sebastianbergmann/complexity/issues", - "source": "https://github.com/sebastianbergmann/complexity/tree/2.0.2" + "source": "https://github.com/sebastianbergmann/complexity/tree/2.0.3" }, "funding": [ { @@ -5211,7 +6312,7 @@ "type": "github" } ], - "time": "2020-10-26T15:52:27+00:00" + "time": "2023-12-22T06:19:30+00:00" }, { "name": "sebastian/diff", @@ -5485,20 +6586,20 @@ }, { "name": "sebastian/lines-of-code", - "version": "1.0.3", + "version": "1.0.4", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/lines-of-code.git", - "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc" + "reference": "e1e4a170560925c26d424b6a03aed157e7dcc5c5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/c1c2e997aa3146983ed888ad08b15470a2e22ecc", - "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc", + "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/e1e4a170560925c26d424b6a03aed157e7dcc5c5", + "reference": "e1e4a170560925c26d424b6a03aed157e7dcc5c5", "shasum": "" }, "require": { - "nikic/php-parser": "^4.6", + "nikic/php-parser": "^4.18 || ^5.0", "php": ">=7.3" }, "require-dev": { @@ -5530,7 +6631,7 @@ "homepage": "https://github.com/sebastianbergmann/lines-of-code", "support": { "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", - "source": "https://github.com/sebastianbergmann/lines-of-code/tree/1.0.3" + "source": "https://github.com/sebastianbergmann/lines-of-code/tree/1.0.4" }, "funding": [ { @@ -5538,7 +6639,7 @@ "type": "github" } ], - "time": "2020-11-28T06:42:11+00:00" + "time": "2023-12-22T06:20:34+00:00" }, { "name": "sebastian/object-enumerator", @@ -6134,67 +7235,6 @@ ], "time": "2023-12-08T12:32:31+00:00" }, - { - "name": "symfony/process", - "version": "v6.4.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/process.git", - "reference": "191703b1566d97a5425dc969e4350d32b8ef17aa" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/191703b1566d97a5425dc969e4350d32b8ef17aa", - "reference": "191703b1566d97a5425dc969e4350d32b8ef17aa", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Process\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Executes commands in sub-processes", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/process/tree/v6.4.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2023-11-17T21:06:49+00:00" - }, { "name": "theseer/tokenizer", "version": "1.2.2", diff --git a/src/LanguageHandler/Php/Parser/Entity/BaseEntity.php b/src/LanguageHandler/Php/Parser/Entity/BaseEntity.php index 5b36e6fd..332d998b 100644 --- a/src/LanguageHandler/Php/Parser/Entity/BaseEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/BaseEntity.php @@ -375,7 +375,7 @@ className: $name, url: $url, ); } else { - $currentClassEntity = is_a($docCommentImplementingClass, ClassLikeEntity::class) ? $docCommentImplementingClass : $docCommentImplementingClass->getRootEntity(); + $currentClassEntity = is_a($docCommentImplementingClass, ClassLikeEntity::class) ? $docCommentImplementingClass : $docCommentImplementingClass->getCurrentRootEntity(); $className = $this->parserHelper->parseFullClassName( $name, $currentClassEntity @@ -443,7 +443,7 @@ public function hasThrows(): bool #[CacheableMethod] public function getThrowsDocBlockLinks(): array { $throws = []; - $implementingClassEntity = $this->getDocCommentEntity()->getRootEntity(); + $implementingClassEntity = $this->getDocCommentEntity()->getCurrentRootEntity(); $docBlock = $this->getDocBlock(); foreach ($docBlock->getTagsByName('throws') as $throwBlock) { if (is_a($throwBlock, DocBlock\Tags\Throws::class)) { From e7006ec9e6f40b231589076105bc246f4df12a54 Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Tue, 9 Jan 2024 01:21:41 +0300 Subject: [PATCH 169/210] Fixing dynamicTemplatesMode custom template error --- src/Core/Renderer/Twig/MainTwigEnvironment.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/Core/Renderer/Twig/MainTwigEnvironment.php b/src/Core/Renderer/Twig/MainTwigEnvironment.php index 4162555f..ef3685ed 100644 --- a/src/Core/Renderer/Twig/MainTwigEnvironment.php +++ b/src/Core/Renderer/Twig/MainTwigEnvironment.php @@ -9,6 +9,7 @@ use BumbleDocGen\Core\Plugin\Event\Renderer\OnGetProjectTemplatesDirs; use BumbleDocGen\Core\Plugin\PluginEventDispatcher; use BumbleDocGen\Core\Renderer\Breadcrumbs\BreadcrumbsHelper; +use BumbleDocGen\Core\Renderer\TemplateFile; use Twig\Environment; use Twig\Error\LoaderError; use Twig\Error\RuntimeError; @@ -74,7 +75,8 @@ public function render($name, array $context = []): string $tmpTemplate = '/~bumbleDocGen' . uniqid() . '.twig'; $tmpFile = $this->configuration->getTemplatesDir() . $tmpTemplate; try { - file_put_contents($tmpFile, file_get_contents($this->configuration->getTemplatesDir() . $name)); + $path = TemplateFile::getTemplatePathByRelativeDocPath($name, $this->configuration, $this->pluginEventDispatcher); + file_put_contents($tmpFile, file_get_contents($path)); $data = $this->twig->render($tmpTemplate, $context); } finally { unlink($tmpFile); From 83e5ec9ab4200bd98eab26e91bcc9747b354e4b9 Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Tue, 9 Jan 2024 01:35:19 +0300 Subject: [PATCH 170/210] Adding new method to serve documentation --- src/DocGenerator.php | 93 +++++++++++++++++++++++++++++++++++++++----- 1 file changed, 83 insertions(+), 10 deletions(-) diff --git a/src/DocGenerator.php b/src/DocGenerator.php index b1fc3625..055a2e11 100644 --- a/src/DocGenerator.php +++ b/src/DocGenerator.php @@ -14,12 +14,15 @@ use BumbleDocGen\Core\Logger\Handler\GenerationErrorsHandler; use BumbleDocGen\Core\Parser\Entity\RootEntityCollectionsGroup; use BumbleDocGen\Core\Parser\ProjectParser; +use BumbleDocGen\Core\Plugin\Event\Renderer\OnGetProjectTemplatesDirs; use BumbleDocGen\Core\Plugin\PluginEventDispatcher; +use BumbleDocGen\Core\Plugin\PluginInterface; use BumbleDocGen\Core\Renderer\Renderer; use BumbleDocGen\Core\Renderer\Twig\Filter\AddIndentFromLeft; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; use BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper; +use DI\Container; use DI\DependencyException; use DI\NotFoundException; use Exception; @@ -48,16 +51,17 @@ final class DocGenerator * @throws NotFoundException */ public function __construct( - private OutputStyle $io, - private Configuration $configuration, - PluginEventDispatcher $pluginEventDispatcher, - private ProjectParser $parser, - private ParserHelper $parserHelper, - private Renderer $renderer, - private GenerationErrorsHandler $generationErrorsHandler, - private RootEntityCollectionsGroup $rootEntityCollectionsGroup, - private ProgressBarFactory $progressBarFactory, - private Logger $logger + private readonly OutputStyle $io, + private readonly Configuration $configuration, + private readonly PluginEventDispatcher $pluginEventDispatcher, + private readonly ProjectParser $parser, + private readonly ParserHelper $parserHelper, + private readonly Renderer $renderer, + private readonly GenerationErrorsHandler $generationErrorsHandler, + private readonly RootEntityCollectionsGroup $rootEntityCollectionsGroup, + private readonly ProgressBarFactory $progressBarFactory, + private readonly Container $diContainer, + private readonly Logger $logger ) { if (file_exists(self::LOG_FILE_NAME)) { unlink(self::LOG_FILE_NAME); @@ -68,6 +72,21 @@ public function __construct( } } + /** + * @throws DependencyException + * @throws InvalidConfigurationParameterException + * @throws NotFoundException + */ + public function addPlugin(PluginInterface|string $plugin): void + { + if (is_string($plugin)) { + $plugin = $this->diContainer->get($plugin); + } + + $this->configuration->getPlugins()->add($plugin); + $this->pluginEventDispatcher->addSubscriber($plugin); + } + /** * @throws DependencyException * @throws NotFoundException @@ -333,6 +352,60 @@ public function generate(): void ]); } + /** + * Serve documentation + * + * @api + * + * @throws Exception + * @throws InvalidArgumentException + */ + public function serve(?callable $afterPreparation = null, int $timeout = 1000): void + { + $templatesDir = $this->configuration->getTemplatesDir(); + $event = $this->pluginEventDispatcher->dispatch(new OnGetProjectTemplatesDirs([$templatesDir])); + $templatesDirs = $event->getTemplatesDirs(); + + $checkedFiles = []; + $checkIsTemplatesChanged = function () use ($templatesDirs, &$checkedFiles) { + $finder = Finder::create() + ->ignoreVCS(true) + ->ignoreDotFiles(true) + ->ignoreUnreadableDirs() + ->sortByName() + ->in($templatesDirs); + + $files = []; + foreach ($finder as $f) { + try { + $files[$f->getPathname()] = $f->getMTime(); + } catch (\Exception) { + } + } + $changed = $checkedFiles !== $files; + $checkedFiles = $files; + return $changed; + }; + + $pb = $this->progressBarFactory->createStylizedProgressBar(); + $this->parser->parse($pb); + while (true) { + if ($checkIsTemplatesChanged()) { + try { + $this->renderer->run(true); + $this->io->success('Documentation updated'); + if ($afterPreparation) { + call_user_func($afterPreparation); + $afterPreparation = null; + } + } catch (\Exception $e) { + $this->io->error($e->getMessage()); + } + } + usleep($timeout); + } + } + /** * @throws DependencyException * @throws NotFoundException From 399b6e55debb42241440e3b52c1f6766bfff1abd Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Tue, 9 Jan 2024 01:35:37 +0300 Subject: [PATCH 171/210] Adding serve documentation command --- src/Console/App.php | 2 + src/Console/Command/BaseCommand.php | 5 +- src/Console/Command/ServeCommand.php | 95 ++++++++++++++++++++++++++++ 3 files changed, 100 insertions(+), 2 deletions(-) create mode 100644 src/Console/Command/ServeCommand.php diff --git a/src/Console/App.php b/src/Console/App.php index 5f7819db..af90d2e9 100644 --- a/src/Console/App.php +++ b/src/Console/App.php @@ -8,6 +8,7 @@ use BumbleDocGen\AI\Console\GenerateReadMeTemplateCommand; use BumbleDocGen\Console\Command\ConfigurationCommand; use BumbleDocGen\Console\Command\GenerateCommand; +use BumbleDocGen\Console\Command\ServeCommand; use BumbleDocGen\DocGeneratorFactory; use Symfony\Component\Console\Application; use Symfony\Component\Console\Command\CompleteCommand; @@ -33,6 +34,7 @@ public function __construct() ); $this->setDefinition($inputDefinition); $this->add(new GenerateCommand()); + $this->add(new ServeCommand()); $this->add(new GenerateReadMeTemplateCommand()); $this->add(new AddDocBlocksCommand()); $this->add(new ConfigurationCommand()); diff --git a/src/Console/Command/BaseCommand.php b/src/Console/Command/BaseCommand.php index 19979257..6a09c00e 100644 --- a/src/Console/Command/BaseCommand.php +++ b/src/Console/Command/BaseCommand.php @@ -38,11 +38,12 @@ public function __construct(string $name = null) */ protected function createDocGenInstance( InputInterface $input, - OutputInterface $output + OutputInterface $output, + array $customConfigurationParameters = [] ): DocGenerator { $docGeneratorFactory = (new DocGeneratorFactory()); $docGeneratorFactory->setCustomConfigurationParameters( - $this->getCustomConfigurationParameters($input) + array_merge($this->getCustomConfigurationParameters($input), $customConfigurationParameters) ); $docGeneratorFactory->setCustomDiDefinitions([ OutputStyle::class => new SymfonyStyle($input, $output), diff --git a/src/Console/Command/ServeCommand.php b/src/Console/Command/ServeCommand.php new file mode 100644 index 00000000..63cce7bb --- /dev/null +++ b/src/Console/Command/ServeCommand.php @@ -0,0 +1,95 @@ + 'Path to the directory of the documented project', + 'templates_dir' => 'Path to directory with documentation templates', + 'use_shared_cache' => 'Enable/disable shared cache when generating documentation (true/false)', + ]; + } + + protected function configure(): void + { + $this->setName('serve') + ->setDescription('Serve documentation') + ->addOption( + name: 'use-dev-server', + mode: InputOption::VALUE_OPTIONAL, + description: 'Display HTML documentation on dev server. Otherwise update files in output_dir', + default: 'true' + ) + ->addOption( + name: 'dev-server-host', + mode: InputOption::VALUE_OPTIONAL, + description: 'Dev server host', + default: 'localhost' + ) + ->addOption( + name: 'dev-server-port', + mode: InputOption::VALUE_OPTIONAL, + description: 'Dev server port', + default: 8085 + ); + } + + /** + * @throws NotFoundException + * @throws DependencyException + * @throws InvalidArgumentException + * @throws InvalidConfigurationParameterException + */ + protected function execute( + InputInterface $input, + OutputInterface $output + ): void { + $asHtml = $input->getOption('use-dev-server'); + if ($asHtml === 'true' || $asHtml === '1') { + $tmpDir = sys_get_temp_dir() . '/~bumbleDocGen'; + $process = new Process([ + PHP_BINARY, + dirname(__DIR__, 3) . DIRECTORY_SEPARATOR . 'vendor/bin/daux', + 'serve', + "--source={$tmpDir}" + ]); + try { + $filesystem = new Filesystem(); + $filesystem->remove($tmpDir); + + $docGen = $this->createDocGenInstance($input, $output, [ + 'output_dir' => $tmpDir + ]); + $docGen->addPlugin(Daux::class); + + $host = $input->getOption('dev-server-host'); + $port = $input->getOption('dev-server-port'); + $docGen->serve(function () use ($process, $output, $host, $port) { + $process->start(); + $output->writeln("Development server started on: http://{$host}:{$port}/"); + }); + } finally { + $process->signal(15); + } + } else { + $docGen = $this->createDocGenInstance($input, $output); + $docGen->serve(); + } + } +} From bd37fd67742717124d9de2760b3574efe8786401 Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Tue, 9 Jan 2024 01:35:48 +0300 Subject: [PATCH 172/210] Removing old template --- selfdoc/templates/tech/map.md.twig | 9 --------- 1 file changed, 9 deletions(-) delete mode 100644 selfdoc/templates/tech/map.md.twig diff --git a/selfdoc/templates/tech/map.md.twig b/selfdoc/templates/tech/map.md.twig deleted file mode 100644 index 42f76a2c..00000000 --- a/selfdoc/templates/tech/map.md.twig +++ /dev/null @@ -1,9 +0,0 @@ ---- -title: Class map -prevPage: Technical description of the project ---- -{{ generatePageBreadcrumbs(title, _self) }} - -Directory layout ( only documented files shown ): - -{{ drawClassMap( phpEntities.filterByPaths(['/src']) ) }} \ No newline at end of file From 3a63fd1a4300e2f7d0f52d2b5c9b773edee5e92e Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Tue, 9 Jan 2024 20:56:32 +0300 Subject: [PATCH 173/210] Adding method to get configuration --- src/DocGenerator.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/DocGenerator.php b/src/DocGenerator.php index 055a2e11..db006e07 100644 --- a/src/DocGenerator.php +++ b/src/DocGenerator.php @@ -525,4 +525,9 @@ public function getConfigurationKey(string $key): void $this->io->table([], $result); } + + public function getConfiguration(): Configuration + { + return $this->configuration; + } } From 7c468f871c5a1631ac443faa364dab98b6df4b91 Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Tue, 9 Jan 2024 20:57:14 +0300 Subject: [PATCH 174/210] Adding option to generate html doc --- src/Console/Command/GenerateCommand.php | 42 +++++++++++++++++++++++-- 1 file changed, 40 insertions(+), 2 deletions(-) diff --git a/src/Console/Command/GenerateCommand.php b/src/Console/Command/GenerateCommand.php index 35046669..16e7ce98 100644 --- a/src/Console/Command/GenerateCommand.php +++ b/src/Console/Command/GenerateCommand.php @@ -4,11 +4,16 @@ namespace BumbleDocGen\Console\Command; +use BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException; +use BumbleDocGen\LanguageHandler\Php\Plugin\CorePlugin\Daux\Daux; use DI\DependencyException; use DI\NotFoundException; use Psr\Cache\InvalidArgumentException; use Symfony\Component\Console\Input\InputInterface; +use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Output\OutputInterface; +use Symfony\Component\Filesystem\Filesystem; +use Symfony\Component\Process\Process; final class GenerateCommand extends BaseCommand { @@ -25,19 +30,52 @@ protected function getCustomConfigOptionsMap(): array protected function configure(): void { - $this->setName('generate')->setDescription('Generate documentation'); + $this->setName('generate') + ->setDescription('Generate documentation') + ->addOption( + name: 'as-html', + mode: InputOption::VALUE_NONE, + description: 'Generate documentation in HTML format', + ); } /** * @throws NotFoundException * @throws DependencyException * @throws InvalidArgumentException + * @throws InvalidConfigurationParameterException */ protected function execute( InputInterface $input, OutputInterface $output ): int { - $this->createDocGenInstance($input, $output)->generate(); + + $asHtml = $input->getOption('as-html'); + if ($asHtml) { + $tmpDir = sys_get_temp_dir() . '/~bumbleDocGen'; + $filesystem = new Filesystem(); + $filesystem->remove($tmpDir); + + $docGen = $this->createDocGenInstance($input, $output, [ + 'output_dir' => $tmpDir + ]); + $docGen->addPlugin(Daux::class); + $docGen->generate(); + + $docGen = $this->createDocGenInstance($input, $output)->getConfiguration(); + $process = new Process([ + PHP_BINARY, + dirname(__DIR__, 3) . DIRECTORY_SEPARATOR . 'vendor/bin/daux', + 'generate', + "--source={$tmpDir}", + "--destination={$docGen->getOutputDir()}/html" + ]); + $process->setTty(true); + $process->run(); + } else { + $this->createDocGenInstance($input, $output)->generate(); + } + return self::SUCCESS; } } From e0a926f4d37b1a6623a0a73c56df4fd9e5679ae8 Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Tue, 9 Jan 2024 21:13:24 +0300 Subject: [PATCH 175/210] Disabling render_with_front_matter by default --- src/Console/Command/GenerateCommand.php | 3 ++- src/Console/Command/ServeCommand.php | 3 ++- src/Core/Configuration/defaultConfiguration.yaml | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/Console/Command/GenerateCommand.php b/src/Console/Command/GenerateCommand.php index 16e7ce98..92c4840d 100644 --- a/src/Console/Command/GenerateCommand.php +++ b/src/Console/Command/GenerateCommand.php @@ -57,7 +57,8 @@ protected function execute( $filesystem->remove($tmpDir); $docGen = $this->createDocGenInstance($input, $output, [ - 'output_dir' => $tmpDir + 'output_dir' => $tmpDir, + 'render_with_front_matter' => true ]); $docGen->addPlugin(Daux::class); $docGen->generate(); diff --git a/src/Console/Command/ServeCommand.php b/src/Console/Command/ServeCommand.php index 63cce7bb..c826394f 100644 --- a/src/Console/Command/ServeCommand.php +++ b/src/Console/Command/ServeCommand.php @@ -74,7 +74,8 @@ protected function execute( $filesystem->remove($tmpDir); $docGen = $this->createDocGenInstance($input, $output, [ - 'output_dir' => $tmpDir + 'output_dir' => $tmpDir, + 'render_with_front_matter' => true ]); $docGen->addPlugin(Daux::class); diff --git a/src/Core/Configuration/defaultConfiguration.yaml b/src/Core/Configuration/defaultConfiguration.yaml index 899dd9f6..550dfb09 100644 --- a/src/Core/Configuration/defaultConfiguration.yaml +++ b/src/Core/Configuration/defaultConfiguration.yaml @@ -5,7 +5,7 @@ output_dir: "%project_root%/docs" # (string) Path to the directory where the fin cache_dir: '%WORKING_DIR%/.bumbleDocGenCache'# (string|null) Path to the directory where the documentation generator cache will be saved output_dir_base_url: "/docs" # (string) Basic part of url documentation. Used to form links in generated documents. git_client_path: "git" # (string) Path to git client -render_with_front_matter: true # (bool) Do not remove the front matter block from templates when creating documents +render_with_front_matter: false # (bool) Do not remove the front matter block from templates when creating documents check_file_in_git_before_creating_doc: true # (bool) Checking if a document exists in GIT before creating a document page_link_processor: # (PageLinkProcessorInterface) Link handler class on documentation pages class: \BumbleDocGen\Core\Renderer\PageLinkProcessor\BasePageLinkProcessor From 7a0216f9704a312936ce8b8c8775dd892e07e131 Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Wed, 10 Jan 2024 00:07:18 +0300 Subject: [PATCH 176/210] Fixing urls --- src/LanguageHandler/Php/Plugin/CorePlugin/Daux/Daux.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/LanguageHandler/Php/Plugin/CorePlugin/Daux/Daux.php b/src/LanguageHandler/Php/Plugin/CorePlugin/Daux/Daux.php index 5726bdbd..08fbf021 100644 --- a/src/LanguageHandler/Php/Plugin/CorePlugin/Daux/Daux.php +++ b/src/LanguageHandler/Php/Plugin/CorePlugin/Daux/Daux.php @@ -60,7 +60,7 @@ final public function beforeCreatingDocFile(BeforeCreatingDocFile|BeforeCreating return explode('?', $elements[0])[0]; }, $content); - $content = preg_replace('/(\/readme.md)("|\')/', '/index.md$2', $content); + $content = preg_replace('/(\/readme.md)("|\')/i', '/index.md$2', $content); $event->setContent($content); $outputFileName = $event->getOutputFilePatch(); From 8793e12f0a7dd8de24d0cac415e1e6943bc238aa Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Wed, 10 Jan 2024 00:08:51 +0300 Subject: [PATCH 177/210] Fixing html generation errors --- .../Breadcrumbs/BreadcrumbsHelper.php | 3 ++- .../Renderer/Twig/MainTwigEnvironment.php | 9 ++++++--- src/DocGenerator.php | 19 +++++++++++++------ 3 files changed, 21 insertions(+), 10 deletions(-) diff --git a/src/Core/Renderer/Breadcrumbs/BreadcrumbsHelper.php b/src/Core/Renderer/Breadcrumbs/BreadcrumbsHelper.php index c87cc616..ebe9ce58 100644 --- a/src/Core/Renderer/Breadcrumbs/BreadcrumbsHelper.php +++ b/src/Core/Renderer/Breadcrumbs/BreadcrumbsHelper.php @@ -12,6 +12,7 @@ use BumbleDocGen\Core\Plugin\Event\Renderer\OnGetTemplatePathByRelativeDocPath; use BumbleDocGen\Core\Plugin\PluginEventDispatcher; use BumbleDocGen\Core\Renderer\TemplateFile; +use BumbleDocGen\Core\Renderer\Twig\MainTwigEnvironment; use DI\DependencyException; use DI\NotFoundException; use Symfony\Component\Finder\Finder; @@ -269,7 +270,7 @@ public function getAllPageLinks(): array foreach ($finder->files() as $file) { $filePatch = str_replace($templatesDirs, '', $file->getRealPath()); - if (!str_ends_with($filePatch, '.twig')) { + if (!str_ends_with($filePatch, '.twig') || str_contains($filePatch, DIRECTORY_SEPARATOR . MainTwigEnvironment::TMP_TEMPLATE_PREFIX)) { continue; } diff --git a/src/Core/Renderer/Twig/MainTwigEnvironment.php b/src/Core/Renderer/Twig/MainTwigEnvironment.php index ef3685ed..ee98fb35 100644 --- a/src/Core/Renderer/Twig/MainTwigEnvironment.php +++ b/src/Core/Renderer/Twig/MainTwigEnvironment.php @@ -18,6 +18,8 @@ final class MainTwigEnvironment { + public const TMP_TEMPLATE_PREFIX = '~bumbleDocGen'; + private Environment $twig; private bool $isEnvLoaded = false; private bool $dynamicTemplatesMode = false; @@ -72,10 +74,11 @@ public function render($name, array $context = []): string $this->loadMainTwigEnvironment(); // To avoid template caching in Twig if ($this->dynamicTemplatesMode) { - $tmpTemplate = '/~bumbleDocGen' . uniqid() . '.twig'; - $tmpFile = $this->configuration->getTemplatesDir() . $tmpTemplate; + $tmpFileName = self::TMP_TEMPLATE_PREFIX . uniqid() . '.twig'; + $tmpTemplate = dirname($name) . DIRECTORY_SEPARATOR . $tmpFileName; + $path = TemplateFile::getTemplatePathByRelativeDocPath($name, $this->configuration, $this->pluginEventDispatcher); + $tmpFile = dirname($path) . DIRECTORY_SEPARATOR . $tmpFileName; try { - $path = TemplateFile::getTemplatePathByRelativeDocPath($name, $this->configuration, $this->pluginEventDispatcher); file_put_contents($tmpFile, file_get_contents($path)); $data = $this->twig->render($tmpTemplate, $context); } finally { diff --git a/src/DocGenerator.php b/src/DocGenerator.php index db006e07..9c987cd1 100644 --- a/src/DocGenerator.php +++ b/src/DocGenerator.php @@ -19,6 +19,7 @@ use BumbleDocGen\Core\Plugin\PluginInterface; use BumbleDocGen\Core\Renderer\Renderer; use BumbleDocGen\Core\Renderer\Twig\Filter\AddIndentFromLeft; +use BumbleDocGen\Core\Renderer\Twig\MainTwigEnvironment; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; use BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper; @@ -360,7 +361,7 @@ public function generate(): void * @throws Exception * @throws InvalidArgumentException */ - public function serve(?callable $afterPreparation = null, int $timeout = 1000): void + public function serve(?callable $afterPreparation = null, int $timeout = 1000000): void { $templatesDir = $this->configuration->getTemplatesDir(); $event = $this->pluginEventDispatcher->dispatch(new OnGetProjectTemplatesDirs([$templatesDir])); @@ -373,10 +374,14 @@ public function serve(?callable $afterPreparation = null, int $timeout = 1000): ->ignoreDotFiles(true) ->ignoreUnreadableDirs() ->sortByName() - ->in($templatesDirs); + ->in($templatesDirs) + ->files(); $files = []; foreach ($finder as $f) { + if (str_contains($f->getPathname(), MainTwigEnvironment::TMP_TEMPLATE_PREFIX)) { + continue; + } try { $files[$f->getPathname()] = $f->getMTime(); } catch (\Exception) { @@ -389,15 +394,17 @@ public function serve(?callable $afterPreparation = null, int $timeout = 1000): $pb = $this->progressBarFactory->createStylizedProgressBar(); $this->parser->parse($pb); + $this->renderer->run(true); + $checkIsTemplatesChanged(); + if ($afterPreparation) { + call_user_func($afterPreparation); + } + while (true) { if ($checkIsTemplatesChanged()) { try { $this->renderer->run(true); $this->io->success('Documentation updated'); - if ($afterPreparation) { - call_user_func($afterPreparation); - $afterPreparation = null; - } } catch (\Exception $e) { $this->io->error($e->getMessage()); } From dc31df12060dee18847c2a88ebc51b5a0d170034 Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Wed, 10 Jan 2024 23:35:46 +0300 Subject: [PATCH 178/210] Fixing serve errors --- src/Console/Command/ServeCommand.php | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/Console/Command/ServeCommand.php b/src/Console/Command/ServeCommand.php index c826394f..da6a819f 100644 --- a/src/Console/Command/ServeCommand.php +++ b/src/Console/Command/ServeCommand.php @@ -31,10 +31,9 @@ protected function configure(): void $this->setName('serve') ->setDescription('Serve documentation') ->addOption( - name: 'use-dev-server', - mode: InputOption::VALUE_OPTIONAL, + name: 'as-html', + mode: InputOption::VALUE_NONE, description: 'Display HTML documentation on dev server. Otherwise update files in output_dir', - default: 'true' ) ->addOption( name: 'dev-server-host', @@ -60,8 +59,8 @@ protected function execute( InputInterface $input, OutputInterface $output ): void { - $asHtml = $input->getOption('use-dev-server'); - if ($asHtml === 'true' || $asHtml === '1') { + $asHtml = $input->getOption('as-html'); + if ($asHtml) { $tmpDir = sys_get_temp_dir() . '/~bumbleDocGen'; $process = new Process([ PHP_BINARY, @@ -69,6 +68,8 @@ protected function execute( 'serve', "--source={$tmpDir}" ]); + $process->setTimeout(3600); + $process->disableOutput(); try { $filesystem = new Filesystem(); $filesystem->remove($tmpDir); @@ -86,7 +87,7 @@ protected function execute( $output->writeln("Development server started on: http://{$host}:{$port}/"); }); } finally { - $process->signal(15); + $process->signal(9); } } else { $docGen = $this->createDocGenInstance($input, $output); From c4c8c0d4c3e3d13209a52e5ae7439e71f3abc091 Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Wed, 10 Jan 2024 23:55:20 +0300 Subject: [PATCH 179/210] Now ypu can use template file name to get the link --- src/Core/Renderer/Breadcrumbs/BreadcrumbsHelper.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/Core/Renderer/Breadcrumbs/BreadcrumbsHelper.php b/src/Core/Renderer/Breadcrumbs/BreadcrumbsHelper.php index ebe9ce58..46d8f578 100644 --- a/src/Core/Renderer/Breadcrumbs/BreadcrumbsHelper.php +++ b/src/Core/Renderer/Breadcrumbs/BreadcrumbsHelper.php @@ -288,6 +288,9 @@ public function getAllPageLinks(): array $addLinkKey($docFilePatch, $value); $addLinkKey($url, $value); $addLinkKey($title, $value); + $templateFileName = array_reverse(explode(DIRECTORY_SEPARATOR, $filePatch))[0]; + $addLinkKey($templateFileName, $value); + $addLinkKey(rtrim($templateFileName, '.twig'), $value); $linkKey = $this->getTemplateLinkKey($filePatch); if ($linkKey) { $addLinkKey($linkKey, $value); From 42aaadf93ff757459b99759f8cf509873e4bf376 Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Wed, 10 Jan 2024 23:55:33 +0300 Subject: [PATCH 180/210] Changing structure --- .../readme.md.twig => 01_configuration.md.twig} | 3 ++- selfdoc/templates/tech/{2.parser => 02_parser}/entity.md.twig | 0 .../{2.parser => 02_parser}/entityFilterCondition.md.twig | 0 selfdoc/templates/tech/{2.parser => 02_parser}/readme.md.twig | 0 .../reflectionApi/php/phpClassConstantReflectionApi.md.twig | 0 .../reflectionApi/php/phpClassMethodReflectionApi.md.twig | 0 .../reflectionApi/php/phpClassPropertyReflectionApi.md.twig | 0 .../reflectionApi/php/phpClassReflectionApi.md.twig | 0 .../reflectionApi/php/phpEntitiesCollection.md.twig | 0 .../reflectionApi/php/phpEnumReflectionApi.md.twig | 0 .../reflectionApi/php/phpInterfaceReflectionApi.md.twig | 0 .../reflectionApi/php/phpTraitReflectionApi.md.twig | 0 .../{2.parser => 02_parser}/reflectionApi/php/readme.md.twig | 0 .../tech/{2.parser => 02_parser}/reflectionApi/readme.md.twig | 0 .../tech/{2.parser => 02_parser}/sourceLocator.md.twig | 0 .../tech/{3.renderer => 03_renderer}/01_templates.md.twig | 0 .../tech/{3.renderer => 03_renderer}/02_breadcrumbs.md.twig | 0 .../{3.renderer => 03_renderer}/03_documentStructure.md.twig | 0 .../{3.renderer => 03_renderer}/04_twigCustomFilters.md.twig | 4 ++-- .../05_twigCustomFunctions.md.twig | 4 ++-- .../templates/tech/{3.renderer => 03_renderer}/readme.md.twig | 0 .../templatesDynamicBlocks.md.twig | 0 .../tech/{3.renderer => 03_renderer}/templatesLinking.md.twig | 0 .../{3.renderer => 03_renderer}/templatesVariables.md.twig | 0 .../readme.md.twig => 04_pluginSystem.md.twig} | 1 + 25 files changed, 7 insertions(+), 5 deletions(-) rename selfdoc/templates/tech/{1.configuration/readme.md.twig => 01_configuration.md.twig} (97%) rename selfdoc/templates/tech/{2.parser => 02_parser}/entity.md.twig (100%) rename selfdoc/templates/tech/{2.parser => 02_parser}/entityFilterCondition.md.twig (100%) rename selfdoc/templates/tech/{2.parser => 02_parser}/readme.md.twig (100%) rename selfdoc/templates/tech/{2.parser => 02_parser}/reflectionApi/php/phpClassConstantReflectionApi.md.twig (100%) rename selfdoc/templates/tech/{2.parser => 02_parser}/reflectionApi/php/phpClassMethodReflectionApi.md.twig (100%) rename selfdoc/templates/tech/{2.parser => 02_parser}/reflectionApi/php/phpClassPropertyReflectionApi.md.twig (100%) rename selfdoc/templates/tech/{2.parser => 02_parser}/reflectionApi/php/phpClassReflectionApi.md.twig (100%) rename selfdoc/templates/tech/{2.parser => 02_parser}/reflectionApi/php/phpEntitiesCollection.md.twig (100%) rename selfdoc/templates/tech/{2.parser => 02_parser}/reflectionApi/php/phpEnumReflectionApi.md.twig (100%) rename selfdoc/templates/tech/{2.parser => 02_parser}/reflectionApi/php/phpInterfaceReflectionApi.md.twig (100%) rename selfdoc/templates/tech/{2.parser => 02_parser}/reflectionApi/php/phpTraitReflectionApi.md.twig (100%) rename selfdoc/templates/tech/{2.parser => 02_parser}/reflectionApi/php/readme.md.twig (100%) rename selfdoc/templates/tech/{2.parser => 02_parser}/reflectionApi/readme.md.twig (100%) rename selfdoc/templates/tech/{2.parser => 02_parser}/sourceLocator.md.twig (100%) rename selfdoc/templates/tech/{3.renderer => 03_renderer}/01_templates.md.twig (100%) rename selfdoc/templates/tech/{3.renderer => 03_renderer}/02_breadcrumbs.md.twig (100%) rename selfdoc/templates/tech/{3.renderer => 03_renderer}/03_documentStructure.md.twig (100%) rename selfdoc/templates/tech/{3.renderer => 03_renderer}/04_twigCustomFilters.md.twig (96%) rename selfdoc/templates/tech/{3.renderer => 03_renderer}/05_twigCustomFunctions.md.twig (96%) rename selfdoc/templates/tech/{3.renderer => 03_renderer}/readme.md.twig (100%) rename selfdoc/templates/tech/{3.renderer => 03_renderer}/templatesDynamicBlocks.md.twig (100%) rename selfdoc/templates/tech/{3.renderer => 03_renderer}/templatesLinking.md.twig (100%) rename selfdoc/templates/tech/{3.renderer => 03_renderer}/templatesVariables.md.twig (100%) rename selfdoc/templates/tech/{4.pluginSystem/readme.md.twig => 04_pluginSystem.md.twig} (98%) diff --git a/selfdoc/templates/tech/1.configuration/readme.md.twig b/selfdoc/templates/tech/01_configuration.md.twig similarity index 97% rename from selfdoc/templates/tech/1.configuration/readme.md.twig rename to selfdoc/templates/tech/01_configuration.md.twig index c1038104..a9214cc8 100644 --- a/selfdoc/templates/tech/1.configuration/readme.md.twig +++ b/selfdoc/templates/tech/01_configuration.md.twig @@ -1,5 +1,6 @@ --- -title: Configuration files +title: Configuration +prevPage: Technical description of the project --- {{ generatePageBreadcrumbs(title, _self) }} diff --git a/selfdoc/templates/tech/2.parser/entity.md.twig b/selfdoc/templates/tech/02_parser/entity.md.twig similarity index 100% rename from selfdoc/templates/tech/2.parser/entity.md.twig rename to selfdoc/templates/tech/02_parser/entity.md.twig diff --git a/selfdoc/templates/tech/2.parser/entityFilterCondition.md.twig b/selfdoc/templates/tech/02_parser/entityFilterCondition.md.twig similarity index 100% rename from selfdoc/templates/tech/2.parser/entityFilterCondition.md.twig rename to selfdoc/templates/tech/02_parser/entityFilterCondition.md.twig diff --git a/selfdoc/templates/tech/2.parser/readme.md.twig b/selfdoc/templates/tech/02_parser/readme.md.twig similarity index 100% rename from selfdoc/templates/tech/2.parser/readme.md.twig rename to selfdoc/templates/tech/02_parser/readme.md.twig diff --git a/selfdoc/templates/tech/2.parser/reflectionApi/php/phpClassConstantReflectionApi.md.twig b/selfdoc/templates/tech/02_parser/reflectionApi/php/phpClassConstantReflectionApi.md.twig similarity index 100% rename from selfdoc/templates/tech/2.parser/reflectionApi/php/phpClassConstantReflectionApi.md.twig rename to selfdoc/templates/tech/02_parser/reflectionApi/php/phpClassConstantReflectionApi.md.twig diff --git a/selfdoc/templates/tech/2.parser/reflectionApi/php/phpClassMethodReflectionApi.md.twig b/selfdoc/templates/tech/02_parser/reflectionApi/php/phpClassMethodReflectionApi.md.twig similarity index 100% rename from selfdoc/templates/tech/2.parser/reflectionApi/php/phpClassMethodReflectionApi.md.twig rename to selfdoc/templates/tech/02_parser/reflectionApi/php/phpClassMethodReflectionApi.md.twig diff --git a/selfdoc/templates/tech/2.parser/reflectionApi/php/phpClassPropertyReflectionApi.md.twig b/selfdoc/templates/tech/02_parser/reflectionApi/php/phpClassPropertyReflectionApi.md.twig similarity index 100% rename from selfdoc/templates/tech/2.parser/reflectionApi/php/phpClassPropertyReflectionApi.md.twig rename to selfdoc/templates/tech/02_parser/reflectionApi/php/phpClassPropertyReflectionApi.md.twig diff --git a/selfdoc/templates/tech/2.parser/reflectionApi/php/phpClassReflectionApi.md.twig b/selfdoc/templates/tech/02_parser/reflectionApi/php/phpClassReflectionApi.md.twig similarity index 100% rename from selfdoc/templates/tech/2.parser/reflectionApi/php/phpClassReflectionApi.md.twig rename to selfdoc/templates/tech/02_parser/reflectionApi/php/phpClassReflectionApi.md.twig diff --git a/selfdoc/templates/tech/2.parser/reflectionApi/php/phpEntitiesCollection.md.twig b/selfdoc/templates/tech/02_parser/reflectionApi/php/phpEntitiesCollection.md.twig similarity index 100% rename from selfdoc/templates/tech/2.parser/reflectionApi/php/phpEntitiesCollection.md.twig rename to selfdoc/templates/tech/02_parser/reflectionApi/php/phpEntitiesCollection.md.twig diff --git a/selfdoc/templates/tech/2.parser/reflectionApi/php/phpEnumReflectionApi.md.twig b/selfdoc/templates/tech/02_parser/reflectionApi/php/phpEnumReflectionApi.md.twig similarity index 100% rename from selfdoc/templates/tech/2.parser/reflectionApi/php/phpEnumReflectionApi.md.twig rename to selfdoc/templates/tech/02_parser/reflectionApi/php/phpEnumReflectionApi.md.twig diff --git a/selfdoc/templates/tech/2.parser/reflectionApi/php/phpInterfaceReflectionApi.md.twig b/selfdoc/templates/tech/02_parser/reflectionApi/php/phpInterfaceReflectionApi.md.twig similarity index 100% rename from selfdoc/templates/tech/2.parser/reflectionApi/php/phpInterfaceReflectionApi.md.twig rename to selfdoc/templates/tech/02_parser/reflectionApi/php/phpInterfaceReflectionApi.md.twig diff --git a/selfdoc/templates/tech/2.parser/reflectionApi/php/phpTraitReflectionApi.md.twig b/selfdoc/templates/tech/02_parser/reflectionApi/php/phpTraitReflectionApi.md.twig similarity index 100% rename from selfdoc/templates/tech/2.parser/reflectionApi/php/phpTraitReflectionApi.md.twig rename to selfdoc/templates/tech/02_parser/reflectionApi/php/phpTraitReflectionApi.md.twig diff --git a/selfdoc/templates/tech/2.parser/reflectionApi/php/readme.md.twig b/selfdoc/templates/tech/02_parser/reflectionApi/php/readme.md.twig similarity index 100% rename from selfdoc/templates/tech/2.parser/reflectionApi/php/readme.md.twig rename to selfdoc/templates/tech/02_parser/reflectionApi/php/readme.md.twig diff --git a/selfdoc/templates/tech/2.parser/reflectionApi/readme.md.twig b/selfdoc/templates/tech/02_parser/reflectionApi/readme.md.twig similarity index 100% rename from selfdoc/templates/tech/2.parser/reflectionApi/readme.md.twig rename to selfdoc/templates/tech/02_parser/reflectionApi/readme.md.twig diff --git a/selfdoc/templates/tech/2.parser/sourceLocator.md.twig b/selfdoc/templates/tech/02_parser/sourceLocator.md.twig similarity index 100% rename from selfdoc/templates/tech/2.parser/sourceLocator.md.twig rename to selfdoc/templates/tech/02_parser/sourceLocator.md.twig diff --git a/selfdoc/templates/tech/3.renderer/01_templates.md.twig b/selfdoc/templates/tech/03_renderer/01_templates.md.twig similarity index 100% rename from selfdoc/templates/tech/3.renderer/01_templates.md.twig rename to selfdoc/templates/tech/03_renderer/01_templates.md.twig diff --git a/selfdoc/templates/tech/3.renderer/02_breadcrumbs.md.twig b/selfdoc/templates/tech/03_renderer/02_breadcrumbs.md.twig similarity index 100% rename from selfdoc/templates/tech/3.renderer/02_breadcrumbs.md.twig rename to selfdoc/templates/tech/03_renderer/02_breadcrumbs.md.twig diff --git a/selfdoc/templates/tech/3.renderer/03_documentStructure.md.twig b/selfdoc/templates/tech/03_renderer/03_documentStructure.md.twig similarity index 100% rename from selfdoc/templates/tech/3.renderer/03_documentStructure.md.twig rename to selfdoc/templates/tech/03_renderer/03_documentStructure.md.twig diff --git a/selfdoc/templates/tech/3.renderer/04_twigCustomFilters.md.twig b/selfdoc/templates/tech/03_renderer/04_twigCustomFilters.md.twig similarity index 96% rename from selfdoc/templates/tech/3.renderer/04_twigCustomFilters.md.twig rename to selfdoc/templates/tech/03_renderer/04_twigCustomFilters.md.twig index e90bf3c5..d628d61f 100644 --- a/selfdoc/templates/tech/3.renderer/04_twigCustomFilters.md.twig +++ b/selfdoc/templates/tech/03_renderer/04_twigCustomFilters.md.twig @@ -7,7 +7,7 @@ prevPage: Renderer {{ "Template filters" | textToHeading('H1') }} When generating pages, you can use filters that allow you to modify the content. -Filters available during page generation are defined in the configuration ( `twig_filters` parameter ) +Filters available during page generation are defined in the configuration ( `twig_filters` parameter ) We use the twig template engine, you can get more information about working with filters here: https://twig.symfony.com/doc/1.x/advanced.html#filters @@ -32,7 +32,7 @@ twig_filters: ``` It is important to remember that when a template is inherited, custom filters are not overridden and augmented. -This information is detailed on page [a]Configuration files[/a]. +This information is detailed on page [a]01_configuration.md[/a]. {{ "Defautl template filters" | textToHeading('H2') }} diff --git a/selfdoc/templates/tech/3.renderer/05_twigCustomFunctions.md.twig b/selfdoc/templates/tech/03_renderer/05_twigCustomFunctions.md.twig similarity index 96% rename from selfdoc/templates/tech/3.renderer/05_twigCustomFunctions.md.twig rename to selfdoc/templates/tech/03_renderer/05_twigCustomFunctions.md.twig index 17abf0f9..9da7d28c 100644 --- a/selfdoc/templates/tech/3.renderer/05_twigCustomFunctions.md.twig +++ b/selfdoc/templates/tech/03_renderer/05_twigCustomFunctions.md.twig @@ -7,7 +7,7 @@ prevPage: Renderer {{ "Template functions" | textToHeading('H1') }} When generating pages, you can use functions that allow you to modify the content. -Functions available during page generation are defined in the configuration ( `twig_functions` parameter ) +Functions available during page generation are defined in the configuration ( `twig_functions` parameter ) We use the twig template engine, you can get more information about working with functions here: https://twig.symfony.com/doc/1.x/advanced.html#functions @@ -30,7 +30,7 @@ twig_functions: ``` It is important to remember that when a template is inherited, custom functions are not overridden and augmented. -This information is detailed on page [a]Configuration files[/a]. +This information is detailed on page [a]01_configuration.md[/a]. {{ "Defautl template functions" | textToHeading('H2') }} diff --git a/selfdoc/templates/tech/3.renderer/readme.md.twig b/selfdoc/templates/tech/03_renderer/readme.md.twig similarity index 100% rename from selfdoc/templates/tech/3.renderer/readme.md.twig rename to selfdoc/templates/tech/03_renderer/readme.md.twig diff --git a/selfdoc/templates/tech/3.renderer/templatesDynamicBlocks.md.twig b/selfdoc/templates/tech/03_renderer/templatesDynamicBlocks.md.twig similarity index 100% rename from selfdoc/templates/tech/3.renderer/templatesDynamicBlocks.md.twig rename to selfdoc/templates/tech/03_renderer/templatesDynamicBlocks.md.twig diff --git a/selfdoc/templates/tech/3.renderer/templatesLinking.md.twig b/selfdoc/templates/tech/03_renderer/templatesLinking.md.twig similarity index 100% rename from selfdoc/templates/tech/3.renderer/templatesLinking.md.twig rename to selfdoc/templates/tech/03_renderer/templatesLinking.md.twig diff --git a/selfdoc/templates/tech/3.renderer/templatesVariables.md.twig b/selfdoc/templates/tech/03_renderer/templatesVariables.md.twig similarity index 100% rename from selfdoc/templates/tech/3.renderer/templatesVariables.md.twig rename to selfdoc/templates/tech/03_renderer/templatesVariables.md.twig diff --git a/selfdoc/templates/tech/4.pluginSystem/readme.md.twig b/selfdoc/templates/tech/04_pluginSystem.md.twig similarity index 98% rename from selfdoc/templates/tech/4.pluginSystem/readme.md.twig rename to selfdoc/templates/tech/04_pluginSystem.md.twig index 97e9fdde..b69e12ca 100644 --- a/selfdoc/templates/tech/4.pluginSystem/readme.md.twig +++ b/selfdoc/templates/tech/04_pluginSystem.md.twig @@ -1,5 +1,6 @@ --- title: Plugin system +prevPage: Technical description of the project --- {{ generatePageBreadcrumbs(title, _self) }} From 9eae4da6a50ddf5ec20044a8225ff23c171e8cf1 Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Thu, 11 Jan 2024 00:14:41 +0300 Subject: [PATCH 181/210] Changing structure --- .../readme.md.twig} | 1 - .../{ => 01_howToCreateTemplates}/templatesDynamicBlocks.md.twig | 0 .../{ => 01_howToCreateTemplates}/templatesLinking.md.twig | 0 .../{ => 01_howToCreateTemplates}/templatesVariables.md.twig | 0 4 files changed, 1 deletion(-) rename selfdoc/templates/tech/03_renderer/{01_templates.md.twig => 01_howToCreateTemplates/readme.md.twig} (99%) rename selfdoc/templates/tech/03_renderer/{ => 01_howToCreateTemplates}/templatesDynamicBlocks.md.twig (100%) rename selfdoc/templates/tech/03_renderer/{ => 01_howToCreateTemplates}/templatesLinking.md.twig (100%) rename selfdoc/templates/tech/03_renderer/{ => 01_howToCreateTemplates}/templatesVariables.md.twig (100%) diff --git a/selfdoc/templates/tech/03_renderer/01_templates.md.twig b/selfdoc/templates/tech/03_renderer/01_howToCreateTemplates/readme.md.twig similarity index 99% rename from selfdoc/templates/tech/03_renderer/01_templates.md.twig rename to selfdoc/templates/tech/03_renderer/01_howToCreateTemplates/readme.md.twig index 318074aa..d7db5360 100644 --- a/selfdoc/templates/tech/03_renderer/01_templates.md.twig +++ b/selfdoc/templates/tech/03_renderer/01_howToCreateTemplates/readme.md.twig @@ -1,6 +1,5 @@ --- title: How to create documentation templates? -prevPage: Renderer --- {{ generatePageBreadcrumbs(title, _self) }} diff --git a/selfdoc/templates/tech/03_renderer/templatesDynamicBlocks.md.twig b/selfdoc/templates/tech/03_renderer/01_howToCreateTemplates/templatesDynamicBlocks.md.twig similarity index 100% rename from selfdoc/templates/tech/03_renderer/templatesDynamicBlocks.md.twig rename to selfdoc/templates/tech/03_renderer/01_howToCreateTemplates/templatesDynamicBlocks.md.twig diff --git a/selfdoc/templates/tech/03_renderer/templatesLinking.md.twig b/selfdoc/templates/tech/03_renderer/01_howToCreateTemplates/templatesLinking.md.twig similarity index 100% rename from selfdoc/templates/tech/03_renderer/templatesLinking.md.twig rename to selfdoc/templates/tech/03_renderer/01_howToCreateTemplates/templatesLinking.md.twig diff --git a/selfdoc/templates/tech/03_renderer/templatesVariables.md.twig b/selfdoc/templates/tech/03_renderer/01_howToCreateTemplates/templatesVariables.md.twig similarity index 100% rename from selfdoc/templates/tech/03_renderer/templatesVariables.md.twig rename to selfdoc/templates/tech/03_renderer/01_howToCreateTemplates/templatesVariables.md.twig From 3faa00515a5ffc93d861e29b87d299f7683a9905 Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Thu, 11 Jan 2024 13:50:48 +0300 Subject: [PATCH 182/210] Adding a new documentation page about working with the console app --- .../CustomFunction/GetConsoleCommands.php | 51 +++++++++++++++++++ selfdoc/templates/tech/05_console.md.twig | 39 ++++++++++++++ 2 files changed, 90 insertions(+) create mode 100644 selfdoc/Twig/CustomFunction/GetConsoleCommands.php create mode 100644 selfdoc/templates/tech/05_console.md.twig diff --git a/selfdoc/Twig/CustomFunction/GetConsoleCommands.php b/selfdoc/Twig/CustomFunction/GetConsoleCommands.php new file mode 100644 index 00000000..11ea327d --- /dev/null +++ b/selfdoc/Twig/CustomFunction/GetConsoleCommands.php @@ -0,0 +1,51 @@ +all(); + + foreach ($commands as $command) { + $synopsis = $command->getSynopsis(); + $synopsis = htmlspecialchars($synopsis); + $commandParts = explode(' ', $synopsis); + $name = array_shift($commandParts); + if (str_starts_with($name, '_')) { + continue; + } + $synopsis = str_replace('] [', "]
    [", implode(' ', $commandParts)); + $synopsis = str_replace("
    [--]
    ", "
    ", $synopsis); + $result[] = [ + 'name' => $name, + 'class' => get_class($command), + 'description' => $command->getDescription(), + 'synopsis' => $synopsis + ]; + } + + return $result; + } + + public static function getOptions(): array + { + return [ + 'is_safe' => ['html'], + ]; + } +} diff --git a/selfdoc/templates/tech/05_console.md.twig b/selfdoc/templates/tech/05_console.md.twig new file mode 100644 index 00000000..ee27c1d3 --- /dev/null +++ b/selfdoc/templates/tech/05_console.md.twig @@ -0,0 +1,39 @@ +--- +title: Console app +prevPage: Technical description of the project +--- +{{ generatePageBreadcrumbs(title, _self) }} + +{{ "Console app" | textToHeading('H1') }} + +The documentation generator provides the ability to work through a built-in [a x-title="console application"]App[/a]. +It is available via composer: +```console +vendor/bin/bumbleDocGen list +``` + +We use [Symfony Console](https://github.com/symfony/console) as the basis of the console application. + +{{ "Built-in console commands" | textToHeading('H2') }} + + + + + + + +{% for consoleCommandData in getConsoleCommands() %} + + + + + +{% endfor %} +
    CommandParametersDescription
    {{ consoleCommandData.name }}{{ consoleCommandData.synopsis|raw }}{{ consoleCommandData.description }}
    + +{{ "Adding a custom command" | textToHeading('H2') }} + +The system allows you to add custom commands to a standard console application. +This can be done using a special configuration option [a x-title="additional_console_commands"]Configuration::getAdditionalConsoleCommands()[/a] (see [a]Configuration[/a] page). + +After adding a new command to the configuration, it will be available in the application. Each added command must inherit the `\Symfony\Component\Console\Command\Command` class \ No newline at end of file From 282261f7efa14f0f54da4bb4dff0de213c44fe91 Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Thu, 11 Jan 2024 13:51:18 +0300 Subject: [PATCH 183/210] Using new func --- bumble_doc_gen.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/bumble_doc_gen.yaml b/bumble_doc_gen.yaml index b1f0a796..3aba2e7b 100644 --- a/bumble_doc_gen.yaml +++ b/bumble_doc_gen.yaml @@ -20,6 +20,7 @@ twig_functions: - class: \SelfDocConfig\Twig\CustomFunction\FindEntitiesClassesByCollectionClassName - class: \SelfDocConfig\Twig\CustomFunction\PrintClassCollectionAsGroupedTable - class: \SelfDocConfig\Twig\CustomFunction\GetConfigParametersDescription + - class: \SelfDocConfig\Twig\CustomFunction\GetConsoleCommands plugins: - class: \SelfDocConfig\Plugin\TwigFilterClassParser\TwigFilterClassParserPlugin - class: \SelfDocConfig\Plugin\TwigFunctionClassParser\TwigFunctionClassParserPlugin From de11f83b837fb9182a9703f15c53bc880c625e5f Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Thu, 11 Jan 2024 13:51:56 +0300 Subject: [PATCH 184/210] Fix selfdoc formatting --- composer.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/composer.json b/composer.json index 240527d9..3f33a01e 100644 --- a/composer.json +++ b/composer.json @@ -68,7 +68,7 @@ ], "scripts": { "test": "vendor/bin/phpunit", - "phpcs": "vendor/bin/phpcs --standard=psr12 src demo tests --warning-severity=0 --error-severity=1", - "phpcbf": "vendor/bin/phpcbf --standard=psr12 src demo tests" + "phpcs": "vendor/bin/phpcs --standard=psr12 src demo tests selfdoc --warning-severity=0 --error-severity=1", + "phpcbf": "vendor/bin/phpcbf --standard=psr12 src demo tests selfdoc" } } From 2bc8b0a0c6bfd39083d022407f840ebd2fc5d41c Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Thu, 11 Jan 2024 13:52:18 +0300 Subject: [PATCH 185/210] Fix short link version bug --- src/Core/Renderer/Twig/Filter/StrTypeToUrl.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/Core/Renderer/Twig/Filter/StrTypeToUrl.php b/src/Core/Renderer/Twig/Filter/StrTypeToUrl.php index 2d34c540..8b550acf 100644 --- a/src/Core/Renderer/Twig/Filter/StrTypeToUrl.php +++ b/src/Core/Renderer/Twig/Filter/StrTypeToUrl.php @@ -59,6 +59,9 @@ public function __invoke( foreach ($types as $type) { $preloadResourceLink = $this->rendererHelper->getPreloadResourceLink($type); if ($preloadResourceLink) { + if ($useShortLinkVersion) { + $type = array_reverse(explode('\\', $type))[0]; + } $preparedTypes[] = "{$type}"; continue; } From f472400a602a54c9080a2ec919866217398b6c23 Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Thu, 11 Jan 2024 13:53:03 +0300 Subject: [PATCH 186/210] Fixing formatting --- src/Console/Command/ConfigurationCommand.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/Console/Command/ConfigurationCommand.php b/src/Console/Command/ConfigurationCommand.php index 76236fe1..4ca16759 100644 --- a/src/Console/Command/ConfigurationCommand.php +++ b/src/Console/Command/ConfigurationCommand.php @@ -18,8 +18,7 @@ protected function configure(): void $this ->setName('configuration') ->setDescription('Display list of configured plugins, programming language handlers, etc') - ->addArgument('key', InputArgument::OPTIONAL, 'Configuration key to display') - ; + ->addArgument('key', InputArgument::OPTIONAL, 'Configuration key to display'); } /** From 6757c3651601c66d86811df0815d032457245d60 Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Thu, 11 Jan 2024 13:55:34 +0300 Subject: [PATCH 187/210] Updating doc --- docs/README.md | 9 +- docs/classes/DocGenerator.md | 162 +- docs/classes/DocGeneratorFactory.md | 3 - .../InvalidConfigurationParameterException.md | 3 - docs/shared_c.cache | 2 +- .../readme.md => 01_configuration.md} | 55 +- .../ClassConstantEntitiesCollection.md | 9 +- .../classes/ClassConstantEntity.md | 61 +- .../classes/ClassConstantEntity_2.md | 61 +- .../classes/ClassEntity.md | 131 +- .../classes/ClassLikeEntity.md | 129 +- .../{ => 02_parser}/classes/ConditionGroup.md | 5 +- .../classes/ConditionInterface.md | 5 +- .../classes/Configuration.md | 78 +- .../classes/DirectoriesSourceLocator.md | 5 +- .../classes/DynamicMethodEntity.md | 9 +- .../classes/EntityInterface.md | 7 +- .../{ => 02_parser}/classes/EnumEntity.md | 135 +- .../{ => 02_parser}/classes/FalseCondition.md | 5 +- .../classes/FileIteratorSourceLocator.md | 5 +- .../classes/FileTextContainsCondition.md | 5 +- .../classes/InterfaceEntity.md | 129 +- ...InvalidConfigurationParameterException.md} | 5 +- .../classes/IsPrivateCondition.md | 5 +- .../classes/IsPrivateCondition_2.md | 5 +- .../classes/IsPrivateCondition_3.md | 5 +- .../classes/IsProtectedCondition.md | 5 +- .../classes/IsProtectedCondition_2.md | 5 +- .../classes/IsProtectedCondition_3.md | 5 +- .../classes/IsPublicCondition.md | 5 +- .../classes/IsPublicCondition_2.md | 5 +- .../classes/IsPublicCondition_3.md | 5 +- .../classes/LocatedInCondition.md | 7 +- .../classes/LocatedNotInCondition.md | 7 +- .../classes/MethodEntitiesCollection.md | 11 +- .../{ => 02_parser}/classes/MethodEntity.md | 49 +- .../classes/OnlyFromCurrentClassCondition.md | 5 +- .../OnlyFromCurrentClassCondition_2.md | 5 +- .../classes/PhpEntitiesCollection.md | 23 +- .../classes/PhpHandlerSettings.md | 29 +- .../{ => 02_parser}/classes/ProjectParser.md | 9 +- .../classes/PropertyEntitiesCollection.md | 11 +- .../{ => 02_parser}/classes/PropertyEntity.md | 61 +- .../RecursiveDirectoriesSourceLocator.md | 5 +- .../classes/RootEntityCollection.md | 7 +- .../classes/RootEntityInterface.md} | 7 +- .../classes/SingleFileSourceLocator.md | 5 +- .../classes/SourceLocatorInterface.md | 5 +- .../classes/TraitEntity.md | 129 +- .../{ => 02_parser}/classes/TrueCondition.md | 5 +- .../classes/VisibilityCondition.md | 5 +- .../classes/VisibilityCondition_2.md | 5 +- .../classes/VisibilityCondition_3.md | 5 +- docs/tech/{2.parser => 02_parser}/entity.md | 42 +- .../entityFilterCondition.md | 10 +- docs/tech/{2.parser => 02_parser}/readme.md | 6 +- .../classes/RootEntityCollectionsGroup.md | 5 +- .../php}/classes/ClassConstantEntity.md | 61 +- .../php}/classes/ClassConstantEntity_2.md | 61 +- .../reflectionApi/php}/classes/ClassEntity.md | 131 +- .../php/classes/ClassLikeEntity.md | 129 +- .../php}/classes/ClassLikeEntity_2.md | 129 +- .../php/classes/ClassLikeEntity_3.md | 129 +- .../php/classes/ClassLikeEntity_4.md | 129 +- .../php/classes/ClassLikeEntity_5.md | 129 +- .../php}/classes/Configuration.md | 78 +- .../reflectionApi/php/classes/EnumEntity.md | 135 +- .../php/classes/InterfaceEntity.md | 129 +- .../InvalidConfigurationParameterException.md | 5 +- .../php}/classes/MethodEntity.md | 49 +- .../php}/classes/PhpEntitiesCollection.md | 23 +- .../php}/classes/PhpHandlerSettings.md | 29 +- .../php}/classes/PropertyEntity.md | 61 +- .../php/classes/RootEntityInterface.md} | 7 +- .../reflectionApi/php/classes/TraitEntity.md | 129 +- .../php/phpClassConstantReflectionApi.md | 50 + .../php/phpClassMethodReflectionApi.md | 65 + .../php/phpClassPropertyReflectionApi.md | 56 + .../php/phpClassReflectionApi.md | 89 + .../php/phpEntitiesCollection.md | 28 + .../reflectionApi/php/phpEnumReflectionApi.md | 88 + .../php/phpInterfaceReflectionApi.md | 85 + .../php/phpTraitReflectionApi.md | 85 + .../reflectionApi/php/readme.md | 20 +- .../reflectionApi/readme.md | 8 +- docs/tech/02_parser/sourceLocator.md | 28 + .../classes/Configuration.md | 78 +- .../classes/DocumentedEntityWrapper.md | 5 +- .../DocumentedEntityWrappersCollection.md | 7 +- .../classes/GetDocumentationPageUrl.md | 7 +- .../classes/GetDocumentedEntityUrl.md | 13 +- .../InvalidConfigurationParameterException.md | 5 +- .../classes/LanguageHandlerInterface.md | 5 +- .../classes/PageHtmlLinkerPlugin.md | 7 +- .../classes/PhpEntitiesCollection.md} | 23 +- .../classes/RendererContext.md | 5 +- .../classes/RootEntityInterface.md | 7 +- .../01_howToCreateTemplates/readme.md} | 6 +- .../templatesDynamicBlocks.md | 8 +- .../templatesLinking.md | 8 +- .../templatesVariables.md | 14 + .../02_breadcrumbs.md | 8 +- .../03_documentStructure.md | 4 +- .../04_twigCustomFilters.md | 28 +- .../05_twigCustomFunctions.md | 42 +- .../classes/AddIndentFromLeft.md | 5 +- .../classes/BreadcrumbsHelper.md | 55 +- .../classes/Configuration.md | 78 +- .../classes/CustomFunctionInterface.md | 5 +- .../classes/DisplayClassApiMethods.md | 7 +- .../classes/DocumentedEntityWrapper.md} | 5 +- .../DocumentedEntityWrappersCollection.md} | 7 +- .../{ => 03_renderer}/classes/DrawClassMap.md | 9 +- .../classes/DrawDocumentationMenu.md | 9 +- .../classes/DrawDocumentedEntityLink.md | 7 +- .../classes/FileGetContents.md | 5 +- .../classes/FixStrSize.md | 5 +- .../classes/GeneratePageBreadcrumbs.md | 7 +- .../classes/GeneratePageBreadcrumbs_2.md | 7 +- .../classes/GetClassMethodsBodyCode.md | 7 +- .../classes/GetDocumentationPageUrl.md | 7 +- .../classes/GetDocumentedEntityUrl.md | 13 +- .../classes/GetDocumentedEntityUrl_2.md | 13 +- .../classes/Implode.md | 5 +- .../InvalidConfigurationParameterException.md | 5 +- .../classes/LoadPluginsContent.md | 5 +- .../classes/PhpEntitiesCollection.md | 23 +- .../classes/PregMatch.md | 5 +- .../classes/PrepareSourceLink.md | 5 +- .../classes/PrintEntityCollectionAsList.md | 7 +- .../classes/Quotemeta.md | 5 +- .../classes/RemoveLineBrakes.md | 5 +- .../classes/RendererContext.md} | 5 +- .../classes/RootEntityCollection.md | 7 +- .../classes/RootEntityInterface.md | 7 +- .../classes/RootEntityInterface_2.md} | 7 +- .../classes/StrTypeToUrl.md | 7 +- .../classes/TextToCodeBlock.md | 5 +- .../classes/TextToHeading.md | 5 +- .../{3.renderer => 03_renderer}/readme.md | 4 +- docs/tech/04_pluginSystem.md | 208 + docs/tech/05_console.md | 67 + .../classes/BasePageLinkProcessor.md | 125 - .../classes/DocumentedEntityWrapper.md | 303 -- .../DocumentedEntityWrappersCollection.md | 219 - .../classes/PageHtmlLinkerPlugin.md | 213 - .../classes/PageLinkerPlugin.md | 213 - .../ClassConstantEntitiesCollection.md | 410 -- docs/tech/2.parser/classes/ConditionGroup.md | 131 - .../2.parser/classes/ConditionInterface.md | 81 - .../classes/DirectoriesSourceLocator.md | 110 - .../2.parser/classes/DynamicMethodEntity.md | 842 ---- docs/tech/2.parser/classes/EntityInterface.md | 214 - docs/tech/2.parser/classes/EnumEntity.md | 3562 ----------------- docs/tech/2.parser/classes/FalseCondition.md | 81 - .../classes/FileIteratorSourceLocator.md | 110 - .../classes/FileTextContainsCondition.md | 125 - docs/tech/2.parser/classes/InterfaceEntity.md | 3441 ---------------- .../2.parser/classes/IsPrivateCondition.md | 108 - .../2.parser/classes/IsPrivateCondition_2.md | 108 - .../2.parser/classes/IsPrivateCondition_3.md | 108 - .../2.parser/classes/IsProtectedCondition.md | 108 - .../classes/IsProtectedCondition_2.md | 108 - .../classes/IsProtectedCondition_3.md | 108 - .../2.parser/classes/IsPublicCondition.md | 108 - .../2.parser/classes/IsPublicCondition_2.md | 108 - .../2.parser/classes/IsPublicCondition_3.md | 108 - .../2.parser/classes/LocatedInCondition.md | 142 - .../2.parser/classes/LocatedNotInCondition.md | 142 - .../classes/MethodEntitiesCollection.md | 469 --- .../classes/OnlyFromCurrentClassCondition.md | 81 - .../OnlyFromCurrentClassCondition_2.md | 81 - docs/tech/2.parser/classes/ProjectParser.md | 226 -- .../classes/PropertyEntitiesCollection.md | 416 -- .../RecursiveDirectoriesSourceLocator.md | 120 - .../classes/SingleFileSourceLocator.md | 110 - .../classes/SourceLocatorInterface.md | 64 - docs/tech/2.parser/classes/TrueCondition.md | 81 - .../2.parser/classes/VisibilityCondition.md | 125 - .../2.parser/classes/VisibilityCondition_2.md | 125 - .../2.parser/classes/VisibilityCondition_3.md | 125 - .../classes/RootEntityCollectionsGroup.md | 336 -- .../php/classes/ClassConstantEntity.md | 1505 ------- .../php/classes/ClassConstantEntity_2.md | 1505 ------- .../reflectionApi/php/classes/ClassEntity.md | 3466 ---------------- .../php/classes/ClassLikeEntity_2.md | 3317 --------------- .../InvalidConfigurationParameterException.md | 34 - .../reflectionApi/php/classes/MethodEntity.md | 1780 -------- .../php/classes/PhpEntitiesCollection.md | 1183 ------ .../php/classes/PhpHandlerSettings.md | 514 --- .../php/classes/PropertyEntity.md | 1588 -------- .../php/classes/RootEntityInterface.md | 472 --- .../php/phpClassConstantReflectionApi.md | 50 - .../php/phpClassMethodReflectionApi.md | 65 - .../php/phpClassPropertyReflectionApi.md | 56 - .../php/phpClassReflectionApi.md | 89 - .../php/phpEntitiesCollection.md | 28 - .../reflectionApi/php/phpEnumReflectionApi.md | 88 - .../php/phpInterfaceReflectionApi.md | 85 - .../php/phpTraitReflectionApi.md | 85 - docs/tech/2.parser/sourceLocator.md | 28 - .../3.renderer/classes/AddIndentFromLeft.md | 153 - .../3.renderer/classes/BreadcrumbsHelper.md | 706 ---- .../classes/CustomFunctionInterface.md | 88 - .../classes/DisplayClassApiMethods.md | 209 - docs/tech/3.renderer/classes/DrawClassMap.md | 319 -- .../classes/DrawDocumentationMenu.md | 248 -- .../classes/DrawDocumentedEntityLink.md | 224 -- .../3.renderer/classes/FileGetContents.md | 203 - docs/tech/3.renderer/classes/FixStrSize.md | 153 - .../classes/GeneratePageBreadcrumbs.md | 227 -- .../classes/GetClassMethodsBodyCode.md | 209 - .../classes/GetDocumentationPageUrl_2.md | 232 -- .../classes/GetDocumentedEntityUrl_3.md | 266 -- docs/tech/3.renderer/classes/Implode.md | 154 - .../3.renderer/classes/LoadPluginsContent.md | 201 - docs/tech/3.renderer/classes/PregMatch.md | 154 - .../3.renderer/classes/PrepareSourceLink.md | 143 - .../classes/PrintEntityCollectionAsList.md | 220 - docs/tech/3.renderer/classes/Quotemeta.md | 149 - .../3.renderer/classes/RemoveLineBrakes.md | 143 - .../3.renderer/classes/RendererContext.md | 259 -- .../classes/RootEntityCollection.md | 540 --- docs/tech/3.renderer/classes/StrTypeToUrl.md | 218 - .../3.renderer/classes/TextToCodeBlock.md | 148 - docs/tech/3.renderer/classes/TextToHeading.md | 148 - docs/tech/3.renderer/templatesVariables.md | 14 - .../AfterLoadingPhpEntitiesCollection.md | 108 - .../classes/AfterRenderingEntities.md | 34 - .../classes/BasePhpStubberPlugin.md | 146 - .../classes/BeforeParsingProcess.md | 63 - .../classes/BeforeRenderingDocFiles.md | 34 - .../classes/BeforeRenderingEntities.md | 34 - .../classes/EntityDocUnifiedPlacePlugin.md | 196 - .../InvalidConfigurationParameterException.md | 34 - .../classes/LastPageCommitter.md | 154 - .../classes/LoadPluginsContent.md | 201 - .../classes/OnAddClassEntityToCollection.md | 161 - .../classes/OnCheckIsEntityCanBeLoaded.md | 175 - .../OnCreateDocumentedEntityWrapper.md | 108 - .../classes/OnGetProjectTemplatesDirs.md | 149 - .../OnGetTemplatePathByRelativeDocPath.md | 173 - .../classes/OnGettingResourceLink.md | 173 - .../classes/OnLoadEntityDocPluginContent.md | 237 -- .../classes/PageRstLinkerPlugin.md | 203 - .../classes/PhpDocumentorStubberPlugin.md | 146 - .../classes/PhpUnitStubberPlugin.md | 146 - .../4.pluginSystem/classes/PluginInterface.md | 34 - .../4.pluginSystem/classes/StubberPlugin.md | 204 - docs/tech/4.pluginSystem/readme.md | 193 - docs/tech/classes/AddDocBlocksCommand.md | 5 +- docs/tech/classes/AddIndentFromLeft.md | 5 +- .../classes/AdditionalCommandCollection.md | 146 - .../AfterLoadingPhpEntitiesCollection.md | 5 +- docs/tech/classes/AfterRenderingEntities.md | 5 +- docs/tech/classes/App.md | 9 +- docs/tech/classes/ArgvValueResolver.md | 100 - docs/tech/classes/BaseEntity.md | 1128 ------ docs/tech/classes/BaseEntityCollection.md | 211 - docs/tech/classes/BasePageLinkProcessor.md | 5 +- docs/tech/classes/BasePageLinker.md | 177 - docs/tech/classes/BasePhpStubberPlugin.md | 5 +- docs/tech/classes/BaseSourceLocator.md | 91 - docs/tech/classes/BeforeCreatingDocFile.md | 70 +- .../BeforeCreatingEntityDocFile.md} | 74 +- docs/tech/classes/BeforeParsingProcess.md | 5 +- docs/tech/classes/BeforeRenderingDocFiles.md | 5 +- docs/tech/classes/BeforeRenderingEntities.md | 5 +- .../classes/BreadcrumbsTwigEnvironment.md | 126 - .../classes/CacheKeyGeneratorInterface.md | 91 - docs/tech/classes/CacheableEntityInterface.md | 346 -- docs/tech/classes/CacheableEntityTrait.md | 191 - .../classes/CacheableEntityWrapperFactory.md | 130 - .../classes/CacheableEntityWrapperTrait.md | 230 -- docs/tech/classes/CacheableMethod.md | 152 - .../tech/classes/CacheablePhpEntityFactory.md | 412 -- docs/tech/classes/ClassLikeEntity.md | 3317 --------------- docs/tech/classes/CloneOperation.md | 207 - .../CollectionGroupLoadEntitiesResult.md | 110 - .../classes/CollectionLoadEntitiesResult.md | 224 -- docs/tech/classes/ComposerHelper.md | 192 - docs/tech/classes/ConditionGroupTypeEnum.md | 45 - docs/tech/classes/Configuration.md | 78 +- docs/tech/classes/ConfigurationCommand.md | 5 +- docs/tech/classes/ConfigurationKey.md | 127 - .../tech/classes/ConfigurationParameterBag.md | 984 ----- docs/tech/classes/Configuration_2.md | 735 ---- docs/tech/classes/CustomFilterInterface.md | 88 - docs/tech/classes/CustomFiltersCollection.md | 235 -- .../tech/classes/CustomFunctionsCollection.md | 276 -- docs/tech/classes/Daux.md | 319 ++ docs/tech/classes/DefaultCacheKeyGenerator.md | 91 - docs/tech/classes/DirectoryDependency.md | 190 - docs/tech/classes/DocBlockLink.md | 95 - docs/tech/classes/DocBlocksGenerator.md | 216 - docs/tech/classes/DocGenerator.md | 426 -- docs/tech/classes/DocGeneratorFactory.md | 382 -- .../DocumentTransformableEntityInterface.md | 230 -- docs/tech/classes/DocumentedEntityWrapper.md | 5 +- .../DocumentedEntityWrappersCollection.md | 7 +- docs/tech/classes/DrawDocumentationMenu.md | 7 +- docs/tech/classes/DrawDocumentedEntityLink.md | 7 +- .../EntitiesLoaderProgressBarInterface.md | 168 - docs/tech/classes/EntityCacheItemPool.md | 426 -- docs/tech/classes/EntityCacheStorageHelper.md | 366 -- docs/tech/classes/EntityDocRendererHelper.md | 225 -- .../classes/EntityDocRendererInterface.md | 170 - .../classes/EntityDocRenderersCollection.md | 146 - .../classes/EntityDocUnifiedPlacePlugin.md | 5 +- docs/tech/classes/FileDependency.md | 275 -- docs/tech/classes/FileGetContents.md | 5 +- docs/tech/classes/FixStrSize.md | 5 +- docs/tech/classes/FrontMatterLoader.md | 273 -- docs/tech/classes/GenerateCommand.md | 7 +- docs/tech/classes/GeneratePageBreadcrumbs.md | 7 +- .../classes/GenerateReadMeTemplateCommand.md | 5 +- docs/tech/classes/GenerationErrorsHandler.md | 159 - docs/tech/classes/GetDocumentationPageUrl.md | 7 +- docs/tech/classes/GetDocumentedEntityUrl.md | 13 +- docs/tech/classes/GetDocumentedEntityUrl_2.md | 11 +- docs/tech/classes/GithubPagesLinkProcessor.md | 130 - docs/tech/classes/Implode.md | 5 +- docs/tech/classes/InternalValueResolver.md | 142 - .../InvalidConfigurationParameterException.md | 5 +- docs/tech/classes/IterateEntitiesOperation.md | 238 -- docs/tech/classes/LanguageHandlerInterface.md | 170 - .../classes/LanguageHandlersCollection.md | 211 - docs/tech/classes/LastPageCommitter.md | 5 +- docs/tech/classes/LoadPluginsContent.md | 5 +- docs/tech/classes/LoadPluginsContent_2.md | 3 - docs/tech/classes/LocalObjectCache.md | 144 - .../classes/LoggableRootEntityCollection.md | 625 --- docs/tech/classes/MainExtension.md | 237 -- docs/tech/classes/MainTwigEnvironment.md | 161 - docs/tech/classes/MethodEntityInterface.md | 732 ---- docs/tech/classes/NodeValueCompiler.md | 96 - docs/tech/classes/ObjectNotFoundException.md | 34 - .../tech/classes/ObjectNotFoundException_2.md | 34 - .../classes/OnAddClassEntityToCollection.md | 5 +- .../classes/OnCheckIsEntityCanBeLoaded.md | 5 +- .../OnCreateDocumentedEntityWrapper.md | 5 +- .../tech/classes/OnGetProjectTemplatesDirs.md | 5 +- .../OnGetTemplatePathByRelativeDocPath.md | 5 +- docs/tech/classes/OnGettingResourceLink.md | 5 +- .../classes/OnLoadEntityDocPluginContent.md | 5 +- docs/tech/classes/OnlySingleExecutionEvent.md | 64 - docs/tech/classes/OperationInterface.md | 88 - docs/tech/classes/OperationsCollection.md | 235 -- docs/tech/classes/PageHtmlLinkerPlugin.md | 7 +- .../PageHtmlLinkerPlugin_2.md} | 7 +- .../classes/PageLinkProcessorInterface.md | 81 - docs/tech/classes/PageLinkerPlugin.md | 7 +- .../PageLinkerPlugin_2.md} | 7 +- docs/tech/classes/PageRstLinkerPlugin.md | 7 +- docs/tech/classes/ParserHelper.md | 523 --- .../PhpClassRendererTwigEnvironment.md | 143 - docs/tech/classes/PhpClassToMdDocRenderer.md | 242 -- .../classes/PhpDocumentorStubberPlugin.md | 5 +- docs/tech/classes/PhpHandler.md | 269 -- docs/tech/classes/PhpHandlerSettings_2.md | 514 --- docs/tech/classes/PhpParserHelper.md | 64 - docs/tech/classes/PhpReflectionApiConfig.md | 643 --- docs/tech/classes/PhpUnitStubberPlugin.md | 5 +- docs/tech/classes/PluginEventDispatcher.md | 130 - docs/tech/classes/PluginInterface.md | 5 +- docs/tech/classes/PluginsCollection.md | 211 - docs/tech/classes/PregMatch.md | 5 +- docs/tech/classes/PrepareSourceLink.md | 5 +- .../classes/PrintEntityCollectionAsList.md | 7 +- docs/tech/classes/ProgressBarFactory.md | 108 - docs/tech/classes/Provider.md | 287 -- docs/tech/classes/ProviderFactory.md | 98 - docs/tech/classes/ProviderInterface.md | 197 - docs/tech/classes/Quotemeta.md | 5 +- docs/tech/classes/ReadmeTemplateGenerator.md | 153 - docs/tech/classes/RefValueResolver.md | 98 - docs/tech/classes/ReflectionApiConfig.md | 218 - docs/tech/classes/RemoveLineBrakes.md | 5 +- docs/tech/classes/Renderer.md | 181 - docs/tech/classes/RendererContext.md | 5 +- .../RendererContextCacheKeyGenerator.md | 91 - .../tech/classes/RendererDependencyFactory.md | 190 - .../classes/RendererDependencyInterface.md | 81 - docs/tech/classes/RendererHelper.md | 232 -- docs/tech/classes/RendererIteratorFactory.md | 237 -- .../{BaseCommand.md => ServeCommand.md} | 11 +- docs/tech/classes/SharedCommandLogicTrait.md | 34 - .../SharedCompressedDocumentFileCache.md | 262 -- .../classes/SingleEntitySearchOperation.md | 303 -- docs/tech/classes/SourceLocatorsCollection.md | 170 - docs/tech/classes/StrTypeToUrl.md | 5 +- docs/tech/classes/StubberPlugin.md | 5 +- docs/tech/classes/StylizedProgressBar.md | 359 -- docs/tech/classes/TemplateFile.md | 359 -- docs/tech/classes/TextToCodeBlock.md | 5 +- docs/tech/classes/TextToHeading.md | 5 +- docs/tech/classes/TraitEntity.md | 3441 ---------------- docs/tech/classes/ValueResolverInterface.md | 86 - docs/tech/classes/ValueToClassTransformer.md | 204 - .../tech/classes/ValueTransformerInterface.md | 122 - .../classes/VisibilityConditionModifier.md | 53 - docs/tech/map.md | 272 -- docs/tech/readme.md | 4 +- 403 files changed, 3251 insertions(+), 68672 deletions(-) rename docs/tech/{1.configuration/readme.md => 01_configuration.md} (75%) rename docs/tech/{ => 02_parser}/classes/ClassConstantEntitiesCollection.md (95%) rename docs/tech/{ => 02_parser}/classes/ClassConstantEntity.md (89%) rename docs/tech/{ => 02_parser}/classes/ClassConstantEntity_2.md (89%) rename docs/tech/{2.parser => 02_parser}/classes/ClassEntity.md (89%) rename docs/tech/{2.parser => 02_parser}/classes/ClassLikeEntity.md (89%) rename docs/tech/{ => 02_parser}/classes/ConditionGroup.md (93%) rename docs/tech/{ => 02_parser}/classes/ConditionInterface.md (88%) rename docs/tech/{2.parser/reflectionApi/php => 02_parser}/classes/Configuration.md (81%) rename docs/tech/{ => 02_parser}/classes/DirectoriesSourceLocator.md (92%) rename docs/tech/{ => 02_parser}/classes/DynamicMethodEntity.md (97%) rename docs/tech/{ => 02_parser}/classes/EntityInterface.md (93%) rename docs/tech/{ => 02_parser}/classes/EnumEntity.md (89%) rename docs/tech/{ => 02_parser}/classes/FalseCondition.md (89%) rename docs/tech/{ => 02_parser}/classes/FileIteratorSourceLocator.md (92%) rename docs/tech/{ => 02_parser}/classes/FileTextContainsCondition.md (92%) rename docs/tech/{ => 02_parser}/classes/InterfaceEntity.md (89%) rename docs/tech/{classes/InvalidConfigurationParameterException_2.md => 02_parser/classes/InvalidConfigurationParameterException.md} (79%) rename docs/tech/{ => 02_parser}/classes/IsPrivateCondition.md (92%) rename docs/tech/{ => 02_parser}/classes/IsPrivateCondition_2.md (91%) rename docs/tech/{ => 02_parser}/classes/IsPrivateCondition_3.md (91%) rename docs/tech/{ => 02_parser}/classes/IsProtectedCondition.md (92%) rename docs/tech/{ => 02_parser}/classes/IsProtectedCondition_2.md (91%) rename docs/tech/{ => 02_parser}/classes/IsProtectedCondition_3.md (91%) rename docs/tech/{ => 02_parser}/classes/IsPublicCondition.md (92%) rename docs/tech/{ => 02_parser}/classes/IsPublicCondition_2.md (91%) rename docs/tech/{ => 02_parser}/classes/IsPublicCondition_3.md (92%) rename docs/tech/{ => 02_parser}/classes/LocatedInCondition.md (89%) rename docs/tech/{ => 02_parser}/classes/LocatedNotInCondition.md (89%) rename docs/tech/{ => 02_parser}/classes/MethodEntitiesCollection.md (95%) rename docs/tech/{ => 02_parser}/classes/MethodEntity.md (92%) rename docs/tech/{ => 02_parser}/classes/OnlyFromCurrentClassCondition.md (89%) rename docs/tech/{ => 02_parser}/classes/OnlyFromCurrentClassCondition_2.md (89%) rename docs/tech/{ => 02_parser}/classes/PhpEntitiesCollection.md (95%) rename docs/tech/{ => 02_parser}/classes/PhpHandlerSettings.md (85%) rename docs/tech/{ => 02_parser}/classes/ProjectParser.md (92%) rename docs/tech/{ => 02_parser}/classes/PropertyEntitiesCollection.md (94%) rename docs/tech/{ => 02_parser}/classes/PropertyEntity.md (89%) rename docs/tech/{ => 02_parser}/classes/RecursiveDirectoriesSourceLocator.md (93%) rename docs/tech/{ => 02_parser}/classes/RootEntityCollection.md (97%) rename docs/tech/{classes/RootEntityInterface_2.md => 02_parser/classes/RootEntityInterface.md} (97%) rename docs/tech/{ => 02_parser}/classes/SingleFileSourceLocator.md (92%) rename docs/tech/{ => 02_parser}/classes/SourceLocatorInterface.md (85%) rename docs/tech/{2.parser => 02_parser}/classes/TraitEntity.md (89%) rename docs/tech/{ => 02_parser}/classes/TrueCondition.md (89%) rename docs/tech/{ => 02_parser}/classes/VisibilityCondition.md (93%) rename docs/tech/{ => 02_parser}/classes/VisibilityCondition_2.md (93%) rename docs/tech/{ => 02_parser}/classes/VisibilityCondition_3.md (93%) rename docs/tech/{2.parser => 02_parser}/entity.md (60%) rename docs/tech/{2.parser => 02_parser}/entityFilterCondition.md (52%) rename docs/tech/{2.parser => 02_parser}/readme.md (52%) rename docs/tech/{ => 02_parser/reflectionApi}/classes/RootEntityCollectionsGroup.md (97%) rename docs/tech/{2.parser => 02_parser/reflectionApi/php}/classes/ClassConstantEntity.md (87%) rename docs/tech/{2.parser => 02_parser/reflectionApi/php}/classes/ClassConstantEntity_2.md (87%) rename docs/tech/{ => 02_parser/reflectionApi/php}/classes/ClassEntity.md (88%) rename docs/tech/{2.parser => 02_parser}/reflectionApi/php/classes/ClassLikeEntity.md (88%) rename docs/tech/{ => 02_parser/reflectionApi/php}/classes/ClassLikeEntity_2.md (88%) rename docs/tech/{2.parser => 02_parser}/reflectionApi/php/classes/ClassLikeEntity_3.md (88%) rename docs/tech/{2.parser => 02_parser}/reflectionApi/php/classes/ClassLikeEntity_4.md (88%) rename docs/tech/{2.parser => 02_parser}/reflectionApi/php/classes/ClassLikeEntity_5.md (88%) rename docs/tech/{2.parser => 02_parser/reflectionApi/php}/classes/Configuration.md (79%) rename docs/tech/{2.parser => 02_parser}/reflectionApi/php/classes/EnumEntity.md (88%) rename docs/tech/{2.parser => 02_parser}/reflectionApi/php/classes/InterfaceEntity.md (88%) rename docs/tech/{3.renderer => 02_parser/reflectionApi/php}/classes/InvalidConfigurationParameterException.md (62%) rename docs/tech/{2.parser => 02_parser/reflectionApi/php}/classes/MethodEntity.md (91%) rename docs/tech/{3.renderer => 02_parser/reflectionApi/php}/classes/PhpEntitiesCollection.md (94%) rename docs/tech/{2.parser => 02_parser/reflectionApi/php}/classes/PhpHandlerSettings.md (83%) rename docs/tech/{2.parser => 02_parser/reflectionApi/php}/classes/PropertyEntity.md (88%) rename docs/tech/{3.renderer/classes/RootEntityInterface_2.md => 02_parser/reflectionApi/php/classes/RootEntityInterface.md} (96%) rename docs/tech/{2.parser => 02_parser}/reflectionApi/php/classes/TraitEntity.md (88%) create mode 100644 docs/tech/02_parser/reflectionApi/php/phpClassConstantReflectionApi.md create mode 100644 docs/tech/02_parser/reflectionApi/php/phpClassMethodReflectionApi.md create mode 100644 docs/tech/02_parser/reflectionApi/php/phpClassPropertyReflectionApi.md create mode 100644 docs/tech/02_parser/reflectionApi/php/phpClassReflectionApi.md create mode 100644 docs/tech/02_parser/reflectionApi/php/phpEntitiesCollection.md create mode 100644 docs/tech/02_parser/reflectionApi/php/phpEnumReflectionApi.md create mode 100644 docs/tech/02_parser/reflectionApi/php/phpInterfaceReflectionApi.md create mode 100644 docs/tech/02_parser/reflectionApi/php/phpTraitReflectionApi.md rename docs/tech/{2.parser => 02_parser}/reflectionApi/php/readme.md (73%) rename docs/tech/{2.parser => 02_parser}/reflectionApi/readme.md (81%) create mode 100644 docs/tech/02_parser/sourceLocator.md rename docs/tech/{1.configuration => 03_renderer/01_howToCreateTemplates}/classes/Configuration.md (79%) rename docs/tech/{3.renderer => 03_renderer/01_howToCreateTemplates}/classes/DocumentedEntityWrapper.md (97%) rename docs/tech/{3.renderer => 03_renderer/01_howToCreateTemplates}/classes/DocumentedEntityWrappersCollection.md (92%) rename docs/tech/{3.renderer => 03_renderer/01_howToCreateTemplates}/classes/GetDocumentationPageUrl.md (90%) rename docs/tech/{3.renderer => 03_renderer/01_howToCreateTemplates}/classes/GetDocumentedEntityUrl.md (86%) rename docs/tech/{1.configuration => 03_renderer/01_howToCreateTemplates}/classes/InvalidConfigurationParameterException.md (66%) rename docs/tech/{3.renderer => 03_renderer/01_howToCreateTemplates}/classes/LanguageHandlerInterface.md (93%) rename docs/tech/{3.renderer => 03_renderer/01_howToCreateTemplates}/classes/PageHtmlLinkerPlugin.md (91%) rename docs/tech/{3.renderer/classes/PhpEntitiesCollection_2.md => 03_renderer/01_howToCreateTemplates/classes/PhpEntitiesCollection.md} (94%) rename docs/tech/{1.configuration => 03_renderer/01_howToCreateTemplates}/classes/RendererContext.md (96%) rename docs/tech/{3.renderer => 03_renderer/01_howToCreateTemplates}/classes/RootEntityInterface.md (96%) rename docs/tech/{3.renderer/01_templates.md => 03_renderer/01_howToCreateTemplates/readme.md} (82%) rename docs/tech/{3.renderer => 03_renderer/01_howToCreateTemplates}/templatesDynamicBlocks.md (52%) rename docs/tech/{3.renderer => 03_renderer/01_howToCreateTemplates}/templatesLinking.md (57%) create mode 100644 docs/tech/03_renderer/01_howToCreateTemplates/templatesVariables.md rename docs/tech/{3.renderer => 03_renderer}/02_breadcrumbs.md (80%) rename docs/tech/{3.renderer => 03_renderer}/03_documentStructure.md (79%) rename docs/tech/{3.renderer => 03_renderer}/04_twigCustomFilters.md (88%) rename docs/tech/{3.renderer => 03_renderer}/05_twigCustomFunctions.md (87%) rename docs/tech/{1.configuration => 03_renderer}/classes/AddIndentFromLeft.md (94%) rename docs/tech/{ => 03_renderer}/classes/BreadcrumbsHelper.md (86%) rename docs/tech/{3.renderer => 03_renderer}/classes/Configuration.md (81%) rename docs/tech/{ => 03_renderer}/classes/CustomFunctionInterface.md (88%) rename docs/tech/{ => 03_renderer}/classes/DisplayClassApiMethods.md (92%) rename docs/tech/{classes/DocumentedEntityWrapper_2.md => 03_renderer/classes/DocumentedEntityWrapper.md} (98%) rename docs/tech/{classes/DocumentedEntityWrappersCollection_2.md => 03_renderer/classes/DocumentedEntityWrappersCollection.md} (94%) rename docs/tech/{ => 03_renderer}/classes/DrawClassMap.md (93%) rename docs/tech/{1.configuration => 03_renderer}/classes/DrawDocumentationMenu.md (92%) rename docs/tech/{1.configuration => 03_renderer}/classes/DrawDocumentedEntityLink.md (92%) rename docs/tech/{1.configuration => 03_renderer}/classes/FileGetContents.md (95%) rename docs/tech/{1.configuration => 03_renderer}/classes/FixStrSize.md (94%) rename docs/tech/{1.configuration => 03_renderer}/classes/GeneratePageBreadcrumbs.md (93%) rename docs/tech/{3.renderer => 03_renderer}/classes/GeneratePageBreadcrumbs_2.md (93%) rename docs/tech/{ => 03_renderer}/classes/GetClassMethodsBodyCode.md (92%) rename docs/tech/{1.configuration => 03_renderer}/classes/GetDocumentationPageUrl.md (92%) rename docs/tech/{1.configuration => 03_renderer}/classes/GetDocumentedEntityUrl.md (89%) rename docs/tech/{3.renderer => 03_renderer}/classes/GetDocumentedEntityUrl_2.md (88%) rename docs/tech/{1.configuration => 03_renderer}/classes/Implode.md (94%) rename docs/tech/{2.parser => 03_renderer}/classes/InvalidConfigurationParameterException.md (74%) rename docs/tech/{1.configuration => 03_renderer}/classes/LoadPluginsContent.md (95%) rename docs/tech/{2.parser => 03_renderer}/classes/PhpEntitiesCollection.md (95%) rename docs/tech/{1.configuration => 03_renderer}/classes/PregMatch.md (94%) rename docs/tech/{1.configuration => 03_renderer}/classes/PrepareSourceLink.md (93%) rename docs/tech/{1.configuration => 03_renderer}/classes/PrintEntityCollectionAsList.md (93%) rename docs/tech/{1.configuration => 03_renderer}/classes/Quotemeta.md (93%) rename docs/tech/{1.configuration => 03_renderer}/classes/RemoveLineBrakes.md (93%) rename docs/tech/{classes/RendererContext_2.md => 03_renderer/classes/RendererContext.md} (98%) rename docs/tech/{2.parser => 03_renderer}/classes/RootEntityCollection.md (97%) rename docs/tech/{2.parser => 03_renderer}/classes/RootEntityInterface.md (97%) rename docs/tech/{classes/RootEntityInterface.md => 03_renderer/classes/RootEntityInterface_2.md} (97%) rename docs/tech/{1.configuration => 03_renderer}/classes/StrTypeToUrl.md (93%) rename docs/tech/{1.configuration => 03_renderer}/classes/TextToCodeBlock.md (93%) rename docs/tech/{1.configuration => 03_renderer}/classes/TextToHeading.md (93%) rename docs/tech/{3.renderer => 03_renderer}/readme.md (78%) create mode 100644 docs/tech/04_pluginSystem.md create mode 100644 docs/tech/05_console.md delete mode 100644 docs/tech/1.configuration/classes/BasePageLinkProcessor.md delete mode 100644 docs/tech/1.configuration/classes/DocumentedEntityWrapper.md delete mode 100644 docs/tech/1.configuration/classes/DocumentedEntityWrappersCollection.md delete mode 100644 docs/tech/1.configuration/classes/PageHtmlLinkerPlugin.md delete mode 100644 docs/tech/1.configuration/classes/PageLinkerPlugin.md delete mode 100644 docs/tech/2.parser/classes/ClassConstantEntitiesCollection.md delete mode 100644 docs/tech/2.parser/classes/ConditionGroup.md delete mode 100644 docs/tech/2.parser/classes/ConditionInterface.md delete mode 100644 docs/tech/2.parser/classes/DirectoriesSourceLocator.md delete mode 100644 docs/tech/2.parser/classes/DynamicMethodEntity.md delete mode 100644 docs/tech/2.parser/classes/EntityInterface.md delete mode 100644 docs/tech/2.parser/classes/EnumEntity.md delete mode 100644 docs/tech/2.parser/classes/FalseCondition.md delete mode 100644 docs/tech/2.parser/classes/FileIteratorSourceLocator.md delete mode 100644 docs/tech/2.parser/classes/FileTextContainsCondition.md delete mode 100644 docs/tech/2.parser/classes/InterfaceEntity.md delete mode 100644 docs/tech/2.parser/classes/IsPrivateCondition.md delete mode 100644 docs/tech/2.parser/classes/IsPrivateCondition_2.md delete mode 100644 docs/tech/2.parser/classes/IsPrivateCondition_3.md delete mode 100644 docs/tech/2.parser/classes/IsProtectedCondition.md delete mode 100644 docs/tech/2.parser/classes/IsProtectedCondition_2.md delete mode 100644 docs/tech/2.parser/classes/IsProtectedCondition_3.md delete mode 100644 docs/tech/2.parser/classes/IsPublicCondition.md delete mode 100644 docs/tech/2.parser/classes/IsPublicCondition_2.md delete mode 100644 docs/tech/2.parser/classes/IsPublicCondition_3.md delete mode 100644 docs/tech/2.parser/classes/LocatedInCondition.md delete mode 100644 docs/tech/2.parser/classes/LocatedNotInCondition.md delete mode 100644 docs/tech/2.parser/classes/MethodEntitiesCollection.md delete mode 100644 docs/tech/2.parser/classes/OnlyFromCurrentClassCondition.md delete mode 100644 docs/tech/2.parser/classes/OnlyFromCurrentClassCondition_2.md delete mode 100644 docs/tech/2.parser/classes/ProjectParser.md delete mode 100644 docs/tech/2.parser/classes/PropertyEntitiesCollection.md delete mode 100644 docs/tech/2.parser/classes/RecursiveDirectoriesSourceLocator.md delete mode 100644 docs/tech/2.parser/classes/SingleFileSourceLocator.md delete mode 100644 docs/tech/2.parser/classes/SourceLocatorInterface.md delete mode 100644 docs/tech/2.parser/classes/TrueCondition.md delete mode 100644 docs/tech/2.parser/classes/VisibilityCondition.md delete mode 100644 docs/tech/2.parser/classes/VisibilityCondition_2.md delete mode 100644 docs/tech/2.parser/classes/VisibilityCondition_3.md delete mode 100644 docs/tech/2.parser/reflectionApi/classes/RootEntityCollectionsGroup.md delete mode 100644 docs/tech/2.parser/reflectionApi/php/classes/ClassConstantEntity.md delete mode 100644 docs/tech/2.parser/reflectionApi/php/classes/ClassConstantEntity_2.md delete mode 100644 docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md delete mode 100644 docs/tech/2.parser/reflectionApi/php/classes/ClassLikeEntity_2.md delete mode 100644 docs/tech/2.parser/reflectionApi/php/classes/InvalidConfigurationParameterException.md delete mode 100644 docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md delete mode 100644 docs/tech/2.parser/reflectionApi/php/classes/PhpEntitiesCollection.md delete mode 100644 docs/tech/2.parser/reflectionApi/php/classes/PhpHandlerSettings.md delete mode 100644 docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md delete mode 100644 docs/tech/2.parser/reflectionApi/php/classes/RootEntityInterface.md delete mode 100644 docs/tech/2.parser/reflectionApi/php/phpClassConstantReflectionApi.md delete mode 100644 docs/tech/2.parser/reflectionApi/php/phpClassMethodReflectionApi.md delete mode 100644 docs/tech/2.parser/reflectionApi/php/phpClassPropertyReflectionApi.md delete mode 100644 docs/tech/2.parser/reflectionApi/php/phpClassReflectionApi.md delete mode 100644 docs/tech/2.parser/reflectionApi/php/phpEntitiesCollection.md delete mode 100644 docs/tech/2.parser/reflectionApi/php/phpEnumReflectionApi.md delete mode 100644 docs/tech/2.parser/reflectionApi/php/phpInterfaceReflectionApi.md delete mode 100644 docs/tech/2.parser/reflectionApi/php/phpTraitReflectionApi.md delete mode 100644 docs/tech/2.parser/sourceLocator.md delete mode 100644 docs/tech/3.renderer/classes/AddIndentFromLeft.md delete mode 100644 docs/tech/3.renderer/classes/BreadcrumbsHelper.md delete mode 100644 docs/tech/3.renderer/classes/CustomFunctionInterface.md delete mode 100644 docs/tech/3.renderer/classes/DisplayClassApiMethods.md delete mode 100644 docs/tech/3.renderer/classes/DrawClassMap.md delete mode 100644 docs/tech/3.renderer/classes/DrawDocumentationMenu.md delete mode 100644 docs/tech/3.renderer/classes/DrawDocumentedEntityLink.md delete mode 100644 docs/tech/3.renderer/classes/FileGetContents.md delete mode 100644 docs/tech/3.renderer/classes/FixStrSize.md delete mode 100644 docs/tech/3.renderer/classes/GeneratePageBreadcrumbs.md delete mode 100644 docs/tech/3.renderer/classes/GetClassMethodsBodyCode.md delete mode 100644 docs/tech/3.renderer/classes/GetDocumentationPageUrl_2.md delete mode 100644 docs/tech/3.renderer/classes/GetDocumentedEntityUrl_3.md delete mode 100644 docs/tech/3.renderer/classes/Implode.md delete mode 100644 docs/tech/3.renderer/classes/LoadPluginsContent.md delete mode 100644 docs/tech/3.renderer/classes/PregMatch.md delete mode 100644 docs/tech/3.renderer/classes/PrepareSourceLink.md delete mode 100644 docs/tech/3.renderer/classes/PrintEntityCollectionAsList.md delete mode 100644 docs/tech/3.renderer/classes/Quotemeta.md delete mode 100644 docs/tech/3.renderer/classes/RemoveLineBrakes.md delete mode 100644 docs/tech/3.renderer/classes/RendererContext.md delete mode 100644 docs/tech/3.renderer/classes/RootEntityCollection.md delete mode 100644 docs/tech/3.renderer/classes/StrTypeToUrl.md delete mode 100644 docs/tech/3.renderer/classes/TextToCodeBlock.md delete mode 100644 docs/tech/3.renderer/classes/TextToHeading.md delete mode 100644 docs/tech/3.renderer/templatesVariables.md delete mode 100644 docs/tech/4.pluginSystem/classes/AfterLoadingPhpEntitiesCollection.md delete mode 100644 docs/tech/4.pluginSystem/classes/AfterRenderingEntities.md delete mode 100644 docs/tech/4.pluginSystem/classes/BasePhpStubberPlugin.md delete mode 100644 docs/tech/4.pluginSystem/classes/BeforeParsingProcess.md delete mode 100644 docs/tech/4.pluginSystem/classes/BeforeRenderingDocFiles.md delete mode 100644 docs/tech/4.pluginSystem/classes/BeforeRenderingEntities.md delete mode 100644 docs/tech/4.pluginSystem/classes/EntityDocUnifiedPlacePlugin.md delete mode 100644 docs/tech/4.pluginSystem/classes/InvalidConfigurationParameterException.md delete mode 100644 docs/tech/4.pluginSystem/classes/LastPageCommitter.md delete mode 100644 docs/tech/4.pluginSystem/classes/LoadPluginsContent.md delete mode 100644 docs/tech/4.pluginSystem/classes/OnAddClassEntityToCollection.md delete mode 100644 docs/tech/4.pluginSystem/classes/OnCheckIsEntityCanBeLoaded.md delete mode 100644 docs/tech/4.pluginSystem/classes/OnCreateDocumentedEntityWrapper.md delete mode 100644 docs/tech/4.pluginSystem/classes/OnGetProjectTemplatesDirs.md delete mode 100644 docs/tech/4.pluginSystem/classes/OnGetTemplatePathByRelativeDocPath.md delete mode 100644 docs/tech/4.pluginSystem/classes/OnGettingResourceLink.md delete mode 100644 docs/tech/4.pluginSystem/classes/OnLoadEntityDocPluginContent.md delete mode 100644 docs/tech/4.pluginSystem/classes/PageRstLinkerPlugin.md delete mode 100644 docs/tech/4.pluginSystem/classes/PhpDocumentorStubberPlugin.md delete mode 100644 docs/tech/4.pluginSystem/classes/PhpUnitStubberPlugin.md delete mode 100644 docs/tech/4.pluginSystem/classes/PluginInterface.md delete mode 100644 docs/tech/4.pluginSystem/classes/StubberPlugin.md delete mode 100644 docs/tech/4.pluginSystem/readme.md delete mode 100644 docs/tech/classes/AdditionalCommandCollection.md delete mode 100644 docs/tech/classes/ArgvValueResolver.md delete mode 100644 docs/tech/classes/BaseEntity.md delete mode 100644 docs/tech/classes/BaseEntityCollection.md delete mode 100644 docs/tech/classes/BasePageLinker.md delete mode 100644 docs/tech/classes/BaseSourceLocator.md rename docs/tech/{4.pluginSystem/classes/BeforeCreatingDocFile.md => classes/BeforeCreatingEntityDocFile.md} (53%) delete mode 100644 docs/tech/classes/BreadcrumbsTwigEnvironment.md delete mode 100644 docs/tech/classes/CacheKeyGeneratorInterface.md delete mode 100644 docs/tech/classes/CacheableEntityInterface.md delete mode 100644 docs/tech/classes/CacheableEntityTrait.md delete mode 100644 docs/tech/classes/CacheableEntityWrapperFactory.md delete mode 100644 docs/tech/classes/CacheableEntityWrapperTrait.md delete mode 100644 docs/tech/classes/CacheableMethod.md delete mode 100644 docs/tech/classes/CacheablePhpEntityFactory.md delete mode 100644 docs/tech/classes/ClassLikeEntity.md delete mode 100644 docs/tech/classes/CloneOperation.md delete mode 100644 docs/tech/classes/CollectionGroupLoadEntitiesResult.md delete mode 100644 docs/tech/classes/CollectionLoadEntitiesResult.md delete mode 100644 docs/tech/classes/ComposerHelper.md delete mode 100644 docs/tech/classes/ConditionGroupTypeEnum.md delete mode 100644 docs/tech/classes/ConfigurationKey.md delete mode 100644 docs/tech/classes/ConfigurationParameterBag.md delete mode 100644 docs/tech/classes/Configuration_2.md delete mode 100644 docs/tech/classes/CustomFilterInterface.md delete mode 100644 docs/tech/classes/CustomFiltersCollection.md delete mode 100644 docs/tech/classes/CustomFunctionsCollection.md create mode 100644 docs/tech/classes/Daux.md delete mode 100644 docs/tech/classes/DefaultCacheKeyGenerator.md delete mode 100644 docs/tech/classes/DirectoryDependency.md delete mode 100644 docs/tech/classes/DocBlockLink.md delete mode 100644 docs/tech/classes/DocBlocksGenerator.md delete mode 100644 docs/tech/classes/DocGenerator.md delete mode 100644 docs/tech/classes/DocGeneratorFactory.md delete mode 100644 docs/tech/classes/DocumentTransformableEntityInterface.md delete mode 100644 docs/tech/classes/EntitiesLoaderProgressBarInterface.md delete mode 100644 docs/tech/classes/EntityCacheItemPool.md delete mode 100644 docs/tech/classes/EntityCacheStorageHelper.md delete mode 100644 docs/tech/classes/EntityDocRendererHelper.md delete mode 100644 docs/tech/classes/EntityDocRendererInterface.md delete mode 100644 docs/tech/classes/EntityDocRenderersCollection.md delete mode 100644 docs/tech/classes/FileDependency.md delete mode 100644 docs/tech/classes/FrontMatterLoader.md delete mode 100644 docs/tech/classes/GenerationErrorsHandler.md delete mode 100644 docs/tech/classes/GithubPagesLinkProcessor.md delete mode 100644 docs/tech/classes/InternalValueResolver.md delete mode 100644 docs/tech/classes/IterateEntitiesOperation.md delete mode 100644 docs/tech/classes/LanguageHandlerInterface.md delete mode 100644 docs/tech/classes/LanguageHandlersCollection.md delete mode 100644 docs/tech/classes/LocalObjectCache.md delete mode 100644 docs/tech/classes/LoggableRootEntityCollection.md delete mode 100644 docs/tech/classes/MainExtension.md delete mode 100644 docs/tech/classes/MainTwigEnvironment.md delete mode 100644 docs/tech/classes/MethodEntityInterface.md delete mode 100644 docs/tech/classes/NodeValueCompiler.md delete mode 100644 docs/tech/classes/ObjectNotFoundException.md delete mode 100644 docs/tech/classes/ObjectNotFoundException_2.md delete mode 100644 docs/tech/classes/OnlySingleExecutionEvent.md delete mode 100644 docs/tech/classes/OperationInterface.md delete mode 100644 docs/tech/classes/OperationsCollection.md rename docs/tech/{4.pluginSystem/classes/PageHtmlLinkerPlugin.md => classes/PageHtmlLinkerPlugin_2.md} (94%) delete mode 100644 docs/tech/classes/PageLinkProcessorInterface.md rename docs/tech/{4.pluginSystem/classes/PageLinkerPlugin.md => classes/PageLinkerPlugin_2.md} (94%) delete mode 100644 docs/tech/classes/ParserHelper.md delete mode 100644 docs/tech/classes/PhpClassRendererTwigEnvironment.md delete mode 100644 docs/tech/classes/PhpClassToMdDocRenderer.md delete mode 100644 docs/tech/classes/PhpHandler.md delete mode 100644 docs/tech/classes/PhpHandlerSettings_2.md delete mode 100644 docs/tech/classes/PhpParserHelper.md delete mode 100644 docs/tech/classes/PhpReflectionApiConfig.md delete mode 100644 docs/tech/classes/PluginEventDispatcher.md delete mode 100644 docs/tech/classes/PluginsCollection.md delete mode 100644 docs/tech/classes/ProgressBarFactory.md delete mode 100644 docs/tech/classes/Provider.md delete mode 100644 docs/tech/classes/ProviderFactory.md delete mode 100644 docs/tech/classes/ProviderInterface.md delete mode 100644 docs/tech/classes/ReadmeTemplateGenerator.md delete mode 100644 docs/tech/classes/RefValueResolver.md delete mode 100644 docs/tech/classes/ReflectionApiConfig.md delete mode 100644 docs/tech/classes/Renderer.md delete mode 100644 docs/tech/classes/RendererContextCacheKeyGenerator.md delete mode 100644 docs/tech/classes/RendererDependencyFactory.md delete mode 100644 docs/tech/classes/RendererDependencyInterface.md delete mode 100644 docs/tech/classes/RendererHelper.md delete mode 100644 docs/tech/classes/RendererIteratorFactory.md rename docs/tech/classes/{BaseCommand.md => ServeCommand.md} (78%) delete mode 100644 docs/tech/classes/SharedCommandLogicTrait.md delete mode 100644 docs/tech/classes/SharedCompressedDocumentFileCache.md delete mode 100644 docs/tech/classes/SingleEntitySearchOperation.md delete mode 100644 docs/tech/classes/SourceLocatorsCollection.md delete mode 100644 docs/tech/classes/StylizedProgressBar.md delete mode 100644 docs/tech/classes/TemplateFile.md delete mode 100644 docs/tech/classes/TraitEntity.md delete mode 100644 docs/tech/classes/ValueResolverInterface.md delete mode 100644 docs/tech/classes/ValueToClassTransformer.md delete mode 100644 docs/tech/classes/ValueTransformerInterface.md delete mode 100644 docs/tech/classes/VisibilityConditionModifier.md delete mode 100644 docs/tech/map.md diff --git a/docs/README.md b/docs/README.md index a9d73576..0c496496 100644 --- a/docs/README.md +++ b/docs/README.md @@ -19,10 +19,10 @@ Add the BumbleDocGen to the `composer.json` file of your project using the follo

    Core Features

    -- 🔍 Parsing: - BumbleDocGen analyzes your code and provides a convenient Reflection API. +- 🔍 Parsing: + BumbleDocGen analyzes your code and provides a convenient Reflection API. -- ✍️ Rendering: +- ✍️ Rendering: BumbleDocGen generates markdown content using templates and fills them with data obtained from parsing your code. - 🧠 AI tools for documentation generation: @@ -39,6 +39,7 @@ BumbleDocGen's interface consists of mainly two classes: DocGeneratorFactory provides a method for creating `DocGenerator` instance. @@ -95,4 +96,4 @@ To update this documentation, run the following command:

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Dec 23 23:00:37 2023 +0300
    Page content update date: Sat Dec 23 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Dec 23 23:00:37 2023 +0300
    Page content update date: Thu Jan 11 2024
    Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/classes/DocGenerator.md b/docs/classes/DocGenerator.md index f85c7c3f..024290d8 100644 --- a/docs/classes/DocGenerator.md +++ b/docs/classes/DocGenerator.md @@ -1,8 +1,7 @@ - BumbleDocGen / DocGenerator

    - DocGenerator class: + DocGenerator class:

    @@ -36,12 +35,18 @@ final class DocGenerator
  • addDocBlocks - Generate missing docBlocks with LLM for project class methods that are available for documentation
  • +
  • + addPlugin +
  • generate - Generates documentation using configuration
  • generateReadmeTemplate - Creates a `README.md` template filled with basic information using LLM
  • +
  • + getConfiguration +
  • getConfigurationKey
  • @@ -51,6 +56,9 @@ final class DocGenerator
  • parseAndGetRootEntityCollectionsGroup
  • +
  • + serve + - Serve documentation
  • @@ -58,11 +66,11 @@ final class DocGenerator @@ -77,11 +85,11 @@ final class DocGenerator ```php -public function __construct(\Symfony\Component\Console\Style\OutputStyle $io, \BumbleDocGen\Core\Configuration\Configuration $configuration, \BumbleDocGen\Core\Plugin\PluginEventDispatcher $pluginEventDispatcher, \BumbleDocGen\Core\Parser\ProjectParser $parser, \BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper $parserHelper, \BumbleDocGen\Core\Renderer\Renderer $renderer, \BumbleDocGen\Core\Logger\Handler\GenerationErrorsHandler $generationErrorsHandler, \BumbleDocGen\Core\Parser\Entity\RootEntityCollectionsGroup $rootEntityCollectionsGroup, \BumbleDocGen\Console\ProgressBar\ProgressBarFactory $progressBarFactory, \Monolog\Logger $logger); +public function __construct(\Symfony\Component\Console\Style\OutputStyle $io, \BumbleDocGen\Core\Configuration\Configuration $configuration, \BumbleDocGen\Core\Plugin\PluginEventDispatcher $pluginEventDispatcher, \BumbleDocGen\Core\Parser\ProjectParser $parser, \BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper $parserHelper, \BumbleDocGen\Core\Renderer\Renderer $renderer, \BumbleDocGen\Core\Logger\Handler\GenerationErrorsHandler $generationErrorsHandler, \BumbleDocGen\Core\Parser\Entity\RootEntityCollectionsGroup $rootEntityCollectionsGroup, \BumbleDocGen\Console\ProgressBar\ProgressBarFactory $progressBarFactory, \DI\Container $diContainer, \Monolog\Logger $logger); ``` @@ -141,6 +149,11 @@ public function __construct(\Symfony\Component\Console\Style\OutputStyle $io, \B $progressBarFactory \BumbleDocGen\Console\ProgressBar\ProgressBarFactory - + + + $diContainer + \DI\Container + - $logger @@ -172,7 +185,7 @@ public function __construct(\Symfony\Component\Console\Style\OutputStyle $io, \B ```php @@ -223,10 +236,61 @@ public function addDocBlocks(\BumbleDocGen\AI\ProviderInterface $aiProvider): vo
    + + +```php +public function addPlugin(\BumbleDocGen\Core\Plugin\PluginInterface|string $plugin): void; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $plugin\BumbleDocGen\Core\Plugin\PluginInterface | string-
    + +Return value: void + + +Throws: + + +
    +
    +
    + ```php @@ -257,7 +321,7 @@ public function generate(): void; ```php @@ -301,6 +365,27 @@ public function generateReadmeTemplate(\BumbleDocGen\AI\ProviderInterface $aiPro +
    +
    +
    + + + +```php +public function getConfiguration(): \BumbleDocGen\Core\Configuration\Configuration; +``` + + + +Parameters: not specified + +Return value: \BumbleDocGen\Core\Configuration\Configuration + +

    @@ -308,7 +393,7 @@ public function generateReadmeTemplate(\BumbleDocGen\AI\ProviderInterface $aiPro ```php @@ -359,7 +444,7 @@ public function getConfigurationKey(string $key): void; ```php @@ -393,7 +478,7 @@ public function getConfigurationKeys(): void; ```php @@ -422,5 +507,56 @@ public function parseAndGetRootEntityCollectionsGroup(): \BumbleDocGen\Core\Pars

    +
    + + + +```php +public function serve(callable|null $afterPreparation = null, int $timeout = 1000000): void; +``` + +
    Serve documentation
    + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $afterPreparationcallable | null-
    $timeoutint-
    + +Return value: void + + +Throws: + + +
    +
    diff --git a/docs/classes/DocGeneratorFactory.md b/docs/classes/DocGeneratorFactory.md index 9851c4ab..884db17b 100644 --- a/docs/classes/DocGeneratorFactory.md +++ b/docs/classes/DocGeneratorFactory.md @@ -1,4 +1,3 @@ - BumbleDocGen / DocGeneratorFactory

    @@ -378,5 +377,3 @@ public function setCustomDiDefinitions(array $definitions): void;
    - - \ No newline at end of file diff --git a/docs/classes/InvalidConfigurationParameterException.md b/docs/classes/InvalidConfigurationParameterException.md index 7797ce0c..2a957a0a 100644 --- a/docs/classes/InvalidConfigurationParameterException.md +++ b/docs/classes/InvalidConfigurationParameterException.md @@ -1,4 +1,3 @@ - BumbleDocGen / InvalidConfigurationParameterException

    @@ -30,5 +29,3 @@ final class InvalidConfigurationParameterException extends \Exception - - \ No newline at end of file diff --git a/docs/shared_c.cache b/docs/shared_c.cache index 80402fad..ee26bd27 100644 --- a/docs/shared_c.cache +++ b/docs/shared_c.cache @@ -1 +1 @@ -eJzs/XlvG0maLwrPRzkoYHC67wW6Yl/cuHjhpRbj1OJje2b+uHXQiFVmlyQKJOUuT9/+7m8kF1miksFMZjKVynh6sZKUGJl84hfPvpgXAosX/1y+oPzFN/ObsDCr2fx6+bfL+cXfvl0F9+nbRTD+Kvzlyv9l9Y/ZxTd/NS9w9fcYv/jm5tPNd9er2WoWlt/89dcXMi3x6vbKXoY3c/dDuP7t9XwRfntnFsuw+G39h1/SW5eXwVX3+Gl+8evufr/dXS2//sE32xuh+w9W3R+9+Oe//vWv9Mj6xTdxdhmWf/PhJlz7cO3Skxx8bPrin7MXKD2nQHXP+b5aYZGe9PX8ehX+WP32Zrfol9++T3f5+vKbF2z9YGJz+7fpzxfX5vKn2fXv3/w1PZZ88c0//30Vrm4uzap6uNni3/9V/1BpEfXiG1fd8HqVbpIWeh8uwh/f/PWXv26++ZVZuU9v032377EX33wyy0/r+5AX31DJCaaRuoB4pIgYTxSOhKZNNQIT9c1f/zV7gQf4zqTuO7//7uWbn79r8nWXL3ha4ds//fPf//yn//H/+/OflmGVLv78p4SZy/DnP/2//+P/+T//d/rxP7/5P3/+01/+rz//6X/+f9+k3//7v/787Tc1hJq9UA9JlX6/pgSpKFGL0hwl3swWCZHzxZf75CAVOVR66H/rvNi/JWrtExTXgaj6hcS93PI+iHC0kcvALHdaKS24M9E55VzUlijKE+n+tfnLWgZxZW7GxB2wltUvSCKgu5xfh7sPC64kjcyZoLiqnkjok5/o9YOVt4dD1W/NCQv+2+3SXITX89vrVYVmnDZK0d4Wj7fX67/5xVyFNdbo+lAnAL768s6sPi3XOOO93c8sLpZbZFQM+O5ifUS/XS7cBmC6P/LN6wAzJAart1lC4GxVvR1258BrZDFVRBEbOApeRcFRxCpK4ll0Zv2Mp6Py7cO73cPnmlt1IfChpeuQqs9wm3DHSaoTjtb0pXuEevm24n7L+WX47aX36c1Xl3P3e9qvqytz7avHqzDHMx9LL9f3f5/k9M/h45b73lug+n5sH0Rpge0H54vlb3f3vXuv+iCp7rwvgx9+8P1aOdjd9MGnacWp8eNPv1vMP88S3//erPl79aes+tOar7j707WgicaF6o959XUy6y4r2F/fe6P6kKg+JB5/6OPCzFbL3z58MovgtzRLmztz619Un5Tpk4Q9gvd2y25udpKb76+++5vtqtX2zipYmMvtO/eP+eyFrp7wscLzcI1XZvlgZ9f86PHZe/ih9DrOLm43oLz/6TUwDn213ad38Lr/wTUw9rdg98FE9otFWC5fmcX963vbjelWdzr6+Q+rL5ez/w7+3nvrBSrAPDpK6xP72rhPYXtg19fpdF69m88v15+rsCPU4c/9NHdpezZL/OHCzYaL2r+nbfplvvo+cQx/9/56QVFPiboF15ebtdZvrD9foYvLw5+/A+ZN9fVDxSBurzaKaPi6iqo74ZtV7u/9w1frT65RV0+Qw5/8X2G9jQQdfvjDH04sNYnwSm6bi/Uqa/Zbq+k/XOXrhry9/mwuZ75+2Qf7Qw4g9dHi70PcnsWXN7PNr9afr5Aq6oH24PP/aS5vEwdOAP6c5MXLxcXnB++s16pAKxqQ6+FaOyX78XprMD8+RUfWS9/08VLi8LnILPXg1QMeTSpcy6bPlnjt9TLOF1e7NT/OX1+a5fLe++tFK5jLx/yq6aJf33j4rLqeey+qI3txkT7+Y+J7l+nnlhWmW3y3WCTpt31/LexQPUt7pENUHHzLnR6wf1odA1mLtD0lZM0X1v+mc3h3cSd6H3w3SrbWV8tV34Robi9XjxZfr1mdiUYK38M1d9be1tirX5sdxPTBtU36w827D796dTx4LaYbLHUn/qk4eGobLPNfC3Nz80DVodXJqDfnm6/39elUnXJ4fLWfw+rTfC3LqW5F8XuC9UP6SkmN/jFc3mzOAENNv9od8n9YzG9vfpobv1OeEzdJuFuvVh2Ieg/QYa28dqHqDPRnNlcrNj4BLU2eam3WlA8cMfkeHAbGt9Zxn4ZktW51OlQT9NSv+2F2fbHD9odgFu7TQ2KsD0sta364/I6UFQLC4p62+JAKaz2pwVmuYSdMN4RjJTOqI/Z+Pl/VMXreVFIcXAA3ZGx1CyzXJ269zGHV6NAyD82w9SHIEXPjLE3sfmP3rC2K+fX+u9+by8qm2b5cr1wdAZX7gg1XTjryx0rSJIFjZhV079+kOhEq9/Wb3aTS6lfBv71+uPr6XNSqKqesnmyP/RusFazcyWh2g4+L2z3iryVKjlM8Xnh79RVa+qDW3GiNj19uEk+4vVob7uvjkuO1B9d6AFdRnRqaA1XiGpVttnm1/gg5qBhuP/JhfrtwYb1J88VatXvwznqRwxZE7SI7v3diZo/XWmtHOVQ9XKs6ABtZM188XowfVNFrF3sf3O1iOfscsk8ojmkTDxfd8P/qOR8vteb9uQO6t9T9Vw+3XrXbggev9gSe0IcV6svbi9nmenv5k1kmOF2sXSezVXqix++sPUzo8Dd9tGb16SreEjZ4+/pyvRI+rKzmVqouf1xdXW5ebn6/Xo8cptyx9R6tRQ/L8mNrvV+uHi3HDkvBzRrffQ7Xq90OvwqxWj29SIhLJ90l9WC9zGEj+sEyd6Gql3EdAKxepZW+xorSUuLYNu4ttXmm14uQ9J3ri/T31TlYrySPkb12pbun2i61eaoM+Jus9eAbHgX/3lq/Xq+/Xdh5rYJ/YMasXacZo+HAmj+E1ZZX7/zOy8ST1k+o8EEXQWa13TJVHOnVl/chXVd8bu6qN9bLkpZbu1622tXKO7LmJusQaVqJHvS0HFrpzqr5Uj3R+o9eb6LR6wVZvQv464K/Xl9+2erZfyQevnZffN59mtf5xe9/evNj/YE3s+VNFbDebpyod1jvf/QBK1YVslnuuG1+7HFddcDBfj+G/KrKU3CL9AfL+9dfzVOlDyLt2CIf/zFLB+HzbDG/vtpSTh/GbduwfLXaYWO3RbpDtdBhh09uod3vvr51z2Wh6UGTtN2aD6CgWYsn3fKPOxfeAZ+PPuzzObhmDU/S4qDHoOkyewDWsi6UVr/inp9s/XF1nFZ3LOLwOw9ppY/vaoM1974oRuigmL9bZCfdt3J4/lCVuXt3sx4+vheP1/thtvp0a6v3lzVLNjgjj5d89M4DamK0Dnfm+cHuYvMBVhfHrP/AVyaGET+OpLv93ur+90NvqMI2zdNzJw93+ghG8jj/rXjk1harQp1VVtP16vvF/OqnEDdhdqSOM7n7q7y+Xa7mV5sXe8Q+7LQ8utI+YA/FUA+t9f3sjw+rxYfZf28eZRNEbU6at4m0c7/9LDkYfav97LtFuPi5ksCbT9N2m5I+fWMWO0Nrq4/gTSi1+TP879v5KlyFldl8mh/0FtR++n24mn+ubh5eLczvG60SZ4KotYsk8lcego/z/1hsorqbKGqt1le7QOUU+jh/nbZhnfSwWUMddMtl1vgxqQhJtdqsoJsCKakRq7SPaZmNv3ITU0cHjfu9j28zoXao3r58eELWUdUjbDi32v4pWQdSG5243XpvFuYfO+G4duj+HK5vN2vR46rT4bV2gvYOweu4aqNzsFuu4mtJP99q0RsQbqKpbci/S4yoBMM9XXGzmmi/2uoBtapVd/gmh+3B46vt6HW3mDroUDuwWAXSO7X8zvDA67hpvSlzYKF3yaB85JF+mST0crPiOohan8fwcMWfTTJJ/khPstzhcx0+bcJDqo/WqPN4HSkl+/fe/Pgan8Tr4CfdPwf3/+xBngurC8/9ZK4vbiuPyzasvPf64UGmtRz2yBL7p3cdxHzEIPcXeffpZucuqRJO5ssHigetTVXJrPEo4L1ZZq3K7qPm+DJ7Acx32zzdLw/IrevU/wZrV8kG955xE8jc3+SG6/w0+/3+992EMVuQfrvWG7Myd2l5d7xuHcs8YRMqb/r9h6KnfcE7aN5fi9WxgeNrvfuaab2H1nWwMmnprZf8cGvv70SVULYy16uHrw7dtDoiel857fOeW3JVx0gdYwm5+2xi97+9+XJtrmZu8+r+DVRd9OyEG9xbuYZcui7+1O0um+dfx0fVMYbXcuWHPHUdQdVd8JWMwMQX710cINM6yPooua37nbakoqfxu3X6yP112PrAtQDlo5jbfbTv//LtMgn+z+sU0nuBRsw3x7zFTre+azJV3KpKn3xwX9GWvbS97629nLm9m8r1TVvIgVY3/c/ZcmZnl2vF6sFtVS+3bXC7n+d+FmdbXWEdANYtuMP+DTZntyGQ1iFi3eIYNL9bLYDWoWTdAbcH71cDnHUQGqMWIr/Z3aqoQOWdeX27WCQdeIeu+3euuIvu/caHoLoObnfZxR2DbIqaDftpwZvb3LAeOKIjRTN3rIPOhufsm3o93K8BeCrGo89w64Pw0XX+m8wNNz/uGTibMHyL3UmX26tf5j6sc4wru2l2uVsQ1/k5Gi14d3X/+dbewkZC+tPNvdRkvI68P7KN8x/8sAlfbrwZm1h7oy/y6eZAJj1eR9pVI5nwKB1gHR74dPNhdWttWOy9/JoTgNch+GaK3bF7pMudB2W+qLmT7O3bpMv/uJ6tau7RXJN/dI+dAf/OuN+rKMjuZjV30c354KPb3IWD0jdI0t+/u0w6dv279265jvk/yp/N3HETE99qr79ev/4U3O9vl7tc5OtXYe1H3dQmrVMA2uzMgzyRdXpHtVqVJnLQQl3nAzxKHmx6j1+vX3p/z+dQuaIfLk+b2ohtInX3WIlijdXCzB3SrzdlGvOf/d2L3W/rfGzrbINGamHbu1Yv7v3R5m6iqafpkNd5try5NF/WN0i8bKPObDjiOo+hkdMj49FeL/yzudmsqJqeicMu382Cm8d8NfdfXu8CTUr/9V//WrefqCTkRVhtzsuvi016zi/hH1I6ymzExIZkJnNmuDGUax+pl4qRUBX5ninPe1OHrtnpBbiZ1WtKfc91p7B+d1ef3rrQd3MyzvFg+6XzBNVj4JutuDnHM+yV059Anxx6HdZWUEwFpkwjItNvLRJRc+61N1gCeluit0O9eWE47kCpHKIpNRg7JCUnXGluNMYEGa2pUTIiD4huzY/bN0AoDMknUCiHYC9dsMYoRBmRlnNuETKKOxlsei1Ao2jNk0/sxFEYjE8lU1a/8MQQI3ww2COheFKoI5KCOR2F41IDlltiuVFfmMKA24gmWRvOJFWBBiMkccopZpRHVrFANfWaEAQobYvSZi2JSsNpM6rkkBqEV8pgxSUmIjCnUJSEM8YZ8RFZDEhtq92264dVGGJbUidrlwWCCKUaESelCkwRTinnXuqkBqAAyG2N3BOaspUG3xNIlMWww5GQEJ1EThEmokFU20AkNZxiwwHDLTGcbw9YGFrzxMjiMjFQHomRFjstnLZMxvRCs6CQxIgCLtt6DDq1pCwMt92IlbXLrEVrj4FhNihhHbLpH0mQD45H7SeCaz6cztCqTWphOG5HnKyVppwhkUXqlY2EexRU1M4glNSGGHGcCG4H1HVP69RbGoBPo1IOycaz6JlQhhgquFYmSIYCIZY4TSMBJLdGcuuu0aWBuDWBspxYU0eEp8JabJCqgmmOECHTa+IkB824tWZ8avPywmB8Mp1yaCZWCkIYiWKtUxjMky6Mg0Ocp3fCVPThAdF8civ90uB8MqFyeNbCS0us1oawyDTWnCrnmTbGuAR1yHRorV20nexQGIxb0yevGwchAjYGWS9FpMpozIxHiiQoM9CNW6O3v/kihcG6P8Ll8M6NrEIdBMvgHbHK0OiiJ1FRxKg2oH30oEvXbdvj8TeFwftkOuXQLCJnKhLMOREIGxGlC4gZYRHGJlpAc2s0dxvGVBqmu1Erq1VjZKSuAic6UkytRRapEKwKlkstFCC7rVbdfkBYYWg+gUI5BCtBkLcx6Rs6KqQ49hKHIFgwkWFGoYajNYJPGlRXGohPIlI2+z2iwAzjoUpyMwJ5zLhmwkgnfHRSAI770TGazkwsDNAdqZWtUTLG8WQDIk0w5jFQ6b03XguNnSceMuHaIvs8czwLA/x5iJi1Ihm2NAoVhEtcPiqsiGRCYWyVltFORVMhT+0TOT5ytjCon0ynbHyRGhcZk5awGBFHXEkqvFOcBBUR+ETae7T7GIBcGLJ7oVkW5Tp4gyTGURFDE5fmxEREMBEUUeINoLwtyvsazV0a0vuiW9YbiJJeLj1xzGuqJSdSOCaIxJo5xynYoK3R3sPg+NKA3gPJchhHErEghGYsMXGEPBfRm0iVR1JjP5k6gSePxGc27MGrcku8+yNclqcrjaiJ3nMVpZHCOIqZ5oKgqt+Rglratnivn+Zbs213c/R2O/dxvmmj+PX94jDfL/Gy2dxO6WiD18hyyighlHEbTHDUGGsjRDZb47520FKjrfv6Rrncvm/yZa3W9FpbyygSkjMqRXQOE+oS+w+MBwbYb+tprB18lha7SDfZtY3dFpukT3+3WMwXy7vu4IUhvRuxjmQVEqFVRMxxKaj1WAejiYoOO0bkVHg6fcqahkc3+Tpa7OvtysP0yYTK8mkufVLOA3Oa6wrMkqqQdJZgFY8SejG011Fq/cF7N/k64+5/hS93Fz/smhQWrKL0S708JxdGIKo8FhgrGQTVlmHLtBbMIQZWaWvk18b4snv3JkRze7l6tIXl4b5P2uVQb5XgJmgpPeEhJMaPEONKoCgNlgGqgNqjvnbCbnbndoMd1kN2/wD0n4eG2Vo4SawNjFpHccTKYBxwslSZMgpZwcED30+U6eAOVpN9N++Wq+r0QbKs9zFwp2zQSnpsGENVH4moqtYSyYD1BDDe2lKtDZY02LAyu1l2JVc2U12FtZZubbSEII4CYsgLJpNOgzCCSvzW/Ls2t6PBZv3XwtzclNvLvTe6ZeOnmiLqEXKGUqxdMJRo6bnnAiPiJuNzHBDttfVfzXetTIbeE9WySOdER464ZjYhPQpjBJciJjtVahIjWKetdZZ2/rRqzzZzBYtDdwdK5RDNUFQM0egdwxFRwYhijAuLg1UmMMhnPJ+luXmxvv6QhGw1XXM7GbUwaPdBsqw3JXKsLFdOS+VEkFwEpKVmVBBuCeQznkc/ubvJD4v57U21KevfzMLyfVjeXoJ+ciLVspX+PHBhtOJaJ8BTKUK6NAYrbbFnoJ+0R3ptCeThmwDIOxMsGx0iGAvJFfU2cXEdZTBBYSKZk45KB36V1vhuEtmov8nry/l1+Eqf4oDeH+WyiKciUuZQoDaBnTOJdUj2pk//kUE6AohvifhGsbz6m7xdVVdhx7DKxf5ZaJg7BZEH5iVSFnEkJaGOER5EtNIyTriD/hitT0ETb0L9Te6uyg2N9ky9bCTJUGGFDUiYwNK/ifsjTyXVytmgQONpj/xWVlj93i0LTvPtnX5Z76Qg1BKFgqHUBcHS62CFIIymcyBhQmBr9J+JWKUdgnORMRt7okogo4kw1qbDQJxQ2kvlbSQqWAez31vbvrVFOA9vstNT17uxuDeJoVzlpy+yHen0iCIL6e+kFML5GA2XEmFqsdVYQNVHW6yzBnkgmx/lAvskGmUrOCjxnEjrNceWqoiFZ9F6541zLHFyQHFbjt3AuVwVUVbB7/fz+WrzVsHKeneCZTN4pTTYGYISm2ZaSYIYSvhGzAuJmZ2KbTpgt8YGxAJcdyJUtvto1Z6R2OCI8cZqGVA0QhqvNaHeCuDXrfHcIMW6bpuW6+B3eajuSK689ci8NI55RWlSoaPEWMboJaFGOR/AemyN7QYVkV83q1yt+mQ6ZSfZY+EUd8EzJK3x1mPGEAsuIMUS0CHjvLVXPGf7fD+7XK0rGf1svWw1Knh+vf/u9+aymue+fVkczs9AwWymF8YuqduKM5sAbzHTyCBMKJdCYW+g625rz3hO+Dbcv9ll+FgV+86vV2ZWRTlKPQznJWY2YuSxw0FSSznDWqUXhnupifTecupBz2l9LnLyu9lWVpMEV8G/vS74QJyHike6O1rvNLEIc4WRMhhZEpK6xD3BLEzFOzPgSahtT3jKHv4yXxV9GM5GyNx5oDJyTz2lgkciOa9c84J570w02lDo+NjaZsgFAptt48fFbckmQ+8EzMoDpHFEWAoSGbUhSG8Y0oyTSKW0HqqgWnuAcplQj7dve1Woa7MLrbK1fYFp7JPli3nScqKW1ISgNKPYWGmgX1j7GGsutzW/Ux+/3KRb3F4Vh+5eaJafUEAQw47YwKwMnAdjVCTCK4pZFAgiU615d66C4eCOFezF70qv7PRTLrEmnARvWQwOWR6EJs5hG1AUGNDdFt005357t5j/Pa2+eVUckNuQJjsjiQZFacK24I7QQCXFQkfrhBY0YRn8jK05cs4Y+jC/XbiwNvrni3UX8QfvFIfibsTKT3NkJASHg5DUak0CClUTL62Y9yQQyLztVZ9+uFVvZotQtVubhWXZ8O6FZllfIKYkcWweeORJqeaUGoYUIpQpai2HuqLWKM+5dB/uWBXY21QBzxeFw7wXomW1FOG1osShBHWNHXIcuWQ6WouNkk6Bd6S1zztHrIdb9j6428Vy9jkAW89OtjuVeDncY6wtZYEQjnlUkWDlrNXOOuoD8Rr4e2v+3nzrNotWDKtstPdBsqwO43SgjnFquGFGEIwqZwmKWmEcuQHe3hrjuRyNvQ27/6pcr2APFMtPwaBRR6Qljj6IYGU1JYAmexRJZT3Uz53TFn3wquR+F73QLOv9Ntor7GSMjijOqPaYVO0tqgxfx6UFlLfV0eu50uXtxWxzvb38ySxX79aPeHU1WyWO9Pid4tDeK+2yqI9CoUi8YUpIklQXhLWTVXm/iwn2kJ3Yk/byaOeqPfppdv172LiGv74sDus9UCzbw0JK7xkhKISkt1CW/lHRIJfArjFiECFqjfD6CpvcflWXP66uLjcvN78vD+d90S0/8ShyzXXQ1PpQVZR6SjHDkQRHLYc5vX3p6sd2rWyk90GzbDfeIJHh3kRsiLAKSU1oJKTyLnLMINuwPcrrA9nHduz9clU20HsiW9aHbnzVao4gmZAdqJMKKRyU1gn1TnCosW6d4VKferTZqe8+pz/e3fFViNUephdp8XeLuQvLZXEY70qu/Gx14jWTLkgfPYrWCu9k9JJhJASKMFu9p/jQ/c3aTUT+7WVchcXmVVp/vfoslIfvPkiWxTi3uBrH6BW3JjFyZ6V3yoqqYYDgEjDeq4dlb8M2LGm9F2n99PdVcK88iHenWD5XUVBMBK9aXwTqlaNVngtRInJuwIfYs81Zu193PGm7YQWy8T5olo3zV8xbBe10gjr3igjmrZCOY8OtNwhQPhzKy1VW+qBZNtbPuOFVSqKJRDnnpeXBRu+Epum/YG32GwXd27Ffrzf7kP7y9ir9JmyGsu0GIxeH9l5pl89Dt0IrjzBCihLkSNTaO2qF8VR5DLy9NW+vrzM/sHM/hNW25OtjuLq5THuyfDNbFMjd+6Fatl9d0lRi0FW/OpR0c0a0UdUgC4KEDFxDlktr/l5fPHB4z3ab9c6sPr368j6k6yq/eu6qN4qDfN/ky1ZhMM0cdl5JSam0yHqbeH3UjHLLjYBs9HN6YtabV7kU3oflJj9vdv17cXDvgWLZbC4VAxVVQ1JKuBWeeSoS4D2RRgZGoRtpa4QfD37c26+7McpfKn60/qOqbWa4LnD+dG+Ey3YZZUzFpL9Eqy1CLFIdGOeWGFRNqxMO8N4S76y+v8hm2369vvyyXeqP4G6rj693sjhwn0ilvG5ig5DMa+EDqpITXUJziEwL4ZK2IgDJbZGcS83Y/Fhvy5vZ8sas3KcC3SunkCibqcKd0ZY4F6XCTKdfYq6QxzEyqUSASGdrDNePjbq/QeUWvbUjTnbekHDYckWMUcggzhFHPinQFisbJPQqPwG3uZSKzY+SS9nakic7gYUZK3g11DDQBGKDvEFMqWTyVd4OLwG7LbFb39Lpa1AtEd67RfqD5f3rH8NliQGabsTK6sNWxaipw9gkzcFJaSJ2DEvDCCMEA0/uJyJzbKs+/mN28d3159lifn1VoqXXE9XyWnPkzIdgEtSdDYjF9K+KLJl9GgkO1fU9I33tWPpj9dubcFO9de2+3DUv+/L1PUD6aVTL1qZZSkxASBvjJAqWJxXFWS+JV5RzBd661kivNYFye1bluZUM8s4Ey88ZNyT9z1FnEu+WmgstEFeU6GgVhm5X7WPrtdGy3Hbtfvf1re/NmkcVB/VeaZfl6jxQHYjBGhMenEwKO/GJnQukGHYUvH6tUV+b49lu58p1C/ZMvazf0DvPK1dL0msUxchir6NjUqOAdOCgz5yL329TPD8uzPUyzhdXxu7WLxj3fdIuh/pItfZGCSGDDd4FSpy3jukglKYSOu639zjWpkoc3LnSk8K7kiufPyUNklRiQQ1lRMUYsEU8eB+rsCbkT7W2UGszJZpuVslBoh4pl6180EwKHm2ghnurqFEuRkyiswwnOxZ0mNbcvJmLYffG9nVx8D6VTNmuQAohhV0Vx49KIcxjYFEjohSNgSjg3j3r45sl0q8OvwP6eC+0y84kxAxVpWqaeh4VYoxaRDCjLHJqNAf/S8/+lwY7V7Le0jP1stq6Z1bzGJnigSDmOJEa8/Rfh1zVBRGQ31Zbz6dz7LqYbVs7zR/2Yb17tzjI90W2bI+VICKyzjNiBBaCRZL+JYFYynVSeKBus2fL9PGm/TBbfbq11fvLwuHeH+WylcpUMJT0dy0CF8IoLCpvezoC6U3MHAPE96vNP963R++ANt8L7bLedS8UY5YKR6skMGU5VVqkH0FSJCxkg7VFPc3nNe0uikN0Y7rkJ4YzlNQQoiQ2kvEoBeVIc4QQMVxGQGtbtLI8n9ldFJpu3pI6Wb83YsggJZM2IYTigsukbyBvuaUxKAEdf3r2e985tbbDU0tNyzqVTFkubDl3ManJWGjBHLLEJSwjwaxnwjvov9laZ8hbOLsWNEX2km1Fm6yma4PWVEgbJPbRY2+4j9ZEq4TF2kHFe2sOnHdDVUUpVTpzNSTspfdvq1S31feL+dVPIRYYf+xErGw9j7JJsdDIOkO8Eokxo4AIYZonk45C5Vp7T11eZN7fqte3y9X8avOiXGdFd4JlK45R1cIeM62D5cSh6AIRlliDsaPRQJS9Nb5riXV0u0oOMvZBsmwlD1KGGypFCAZprVVMEDfcKcact2AdtvdrHNEa723Y97M/PqwWH2b/XR7jPpFK2X7eDnPOqFE8qR6Gy+C1xQEJqZGnmIFt2BrJzRXHt8kUmvsCYXwCibK+OhJVdBZjYiIlnGjqLKeRBsJNSNo2YLgthvMp9Pc36N0iXPxcNf8qD8UnESmfrxSrZFQUlHYE8yicIEYpbAxXQjjIVzqjxyNt0Y1ZhA/lth7uRqysJy8oLCilimCDcODIYkU9tUYK41j0gOvz8ef/fTtfhauwMsXh+TQiZXPsMGdRcYFdFJ4jxwRD1AQqRODJIoRM6tb8OZ9jcH+L3oer+eeK14RXC/N7gZOdOtEqW6XuNI1IVdEWrqJEhlaj+bTDSXtOOjVUeLVGdT4L4f5OJRP945eb8HH+H4vL8hB9Kp2ynrmgBPHa0Og5JkIwoaxwmBlhsWcMPHOt0Vw7gKV2lz6GP1Yf56+Tvf7qcu4K1KA7kCrb6zJg55knSX9WwSZOzZTUTgvppdKcgP7cGtPNwwObjfoxGJ9WLw/RJxMqW4eLKIuCWioTR+bCCpQYtUACSUqdBj36PNGTxfx69bNZpb1ab0iB2aGnUSlbg8I5kwE5JyjRLikcAXGtFSMCYxkIeJ5bx7qbiNAtuHah2+3LgvM5eiFaVgPxVMiglWZJ7VCRSOKxdVQFySxFBLrIt8Z5E2dr/ZYVndfRE9myURitkQ4aK+2UVIRrKzWLLEZbjV+KgPXWWG+iRO427c3C/OPNtmfRerGfw/VteTjvgWR5vSVgHS0zWARKhPUxRidIcExGpBhgvDXGm3hn6zZs15eryJBjT1TLdx/GybZUhCDJQ5A2JoW9mkMWEFEBBagSP0tMfbdnVZXHD2G1ndVZYNCmE7GyPhRJhIvRcBU8N1HTiF1w6yFPiacrCrg+p+WZfl+tsm7Scm+uS3H47odoWU3FEYwcrxoIY2Z4uqaGYCFJeoWdAZyfGeerB5pltXUlhir7IVq2Sx8NLBiDXOLhCdbccWcpM1Kmi/QTovCtcZ7vM3dwy3aqZZEw74Nm2VwTo42VkqnABCEx6d8YccERtwQxISOgvK023iSmsduxajvuxoeulcziEN6ZXtn8QFpxcOkpY4TRWPUio84xJaSkjGOIa7bm4U1SOHe79W4xu15tVv1645fLn2bL8mDeH+GyuVYaJZArJjCTjhBGApGIM66kiIhq4Oat4/gN/GE/m9n1d38kZrScFRgAOoFC2V4MGpmAuNPKecN4ZMpJ5D3SUkfuEPQYaa2PNMjprPan9LnBJ9Mpi+aosMFcksgDdtxjLGJVDakJwRGDr6Q1msk+t9n8qP64wL6+R6iRn2FtVOTIIm6ISPqxFEwZmUAZPFMeojCtkUn3iXV/L0rtndeMKNk8J6QFpwppTIxxDhFDXMDCEo2pNQZ6M7XWB/Y9Sj+Z64vb9Cw/mmt/mW6097rcJL4OlMp3G1NIYqtdhWGToMyCUk5ogryQjAGiWyN6Xwoe2aeS0/U60SrLpx1zjNmk4xrGiInMBhS9sIISjpAFu601qvcDXPs79e7Tze6er+dXN/NlsU2mu5AqX4drkaQJx04jjiWTWBCHkUE0Kc1BTmWCCxkO07L5Rm3vWQ3e2VyWB+tu1Mr2Z+JaMFIV4ErjveBJHUmmoBRCRikszCZqjWy5794/vlevjfsUNv9WE73TH2x+UaqteA4SZjWWpHpTz9E6gylohaNWDFPqiSfcMqgUa83dT9jAS7NclsreO5IrH0VRiasTJKRCTBCLiQiYca+YYlRAdVj7uPc+sRpu1k+z30tVX/ogWQ7jwXMWveJJhRHUO8Fd5OmdYJRW0WsFGG+L8RZm1Paeb8zKVD7ddcuMMgtmeiFaVlc3CuPoESJROGKi0dVoAuKNlFzEADkdA1ih313fXhXKxjtSK1/DbgQSjGuJqfBGY5yYOUMMUYmkoRCDHEBLuQtaFArvPkiWzchjGHlCsNRU+upfZRLCFU2KS0DIQ/ez1hhvbzbt/AKzUHLopz/CZTOuCUI8KSsJ9dYpRxA1URKZuDtzQXuwPNviHaP2HOrDrb1vUb2eXy9X5nr18BUciWFpm62pjJIFZy1O0iKgELEyMhjPleE2SAN95tueGr0/UKvPjS1PSzo3ObO+TCaranouZNVgUzKKjDeI4BCCThYE+Onbng11LK8pt5k/h9Wnuf/tzZdrczVzm1eFHoqz0THbZYJET6hlXslkOksjlDSYGUVxTK81SIrWp6G9WvxoF+9tX9kK1XmJmc3VEZp4SZUTlBoXtcMqIE8ZJrLq/AlSonVGw36jnG5bWZ546J+A2WgY49JaGlxSkqxKhgPFpupD5GRV9UxgamBruXAsU7bl9pWbR39GSmbtBhK4jkRV2cecKxmiUZpgriIyTlnIcWttU3dxlrxbzNOy9y5AWxqAoNk5s1Yz6oRPmpMyTMdIkkHNGddO82qUFpyPthKji5OkfjvL05rOQ8RsfkWypzUyGmmHhAjGWeac4kbTqIU3cA5a51e0NwI/LsysVN9qV3JlvUXKEu+IJ8EyxKO0hsaImfQOYU8lzClqH41r4fTbzOF5Pb/2s/VtHri+93/5dvluMfuctu3ureJOwrDEzZ4bjDRhwnPvGDLM8HRouLMkJqXJJU0Jzk3rc9PCCGy9tfNVerjgSz45w5I3m/FEjNBBJuWp6urOhQ+YR02NFSpap+DsnDUDpO3m3trLmSv54AxI26wV4oLxRhKVVDbDqSSa4ySEKCKEs+BBU2t/alpk5rfa2f+cLWd2djmrmjOWe24GpW5WV2ORBsRkNWbYEINDOi9EE8+DoVhQiHwMf3Ia7OnPcz+LswKbVQxM3azMEQYphalTBiuKFFERCaxFcMQrrqETUesISYuQ7/4ubiJc4BV4HCUZhKi5c8KQV0yjSDURTEqa7BtnJGcucmliBAnT+py0cHk239LivQBDkTV7VhyKxFApvFfCEOaIc0QJmTQxGxGHquzWZ6WDZ+fgphZu9Q9C02y2IlFcRI88M5jgZK1Eb1yklCW7XysMmld7m6VFmXKzLf31+vLL94v51evbxSLdbGe0Fnpkhidwtl7K6mTrE6WSXuYUMRpHYxlzMvLgaIDz01rK9L674CUbjKrZelwRkvWCTVLFiDAUSx8kxdFKJRGScFIGtV12aUlg5fdqu7Qha3YytTBGxyCx1kgZ73nQgcVk5TNKJedQu95eK2uRzddmV4s39QekbHZGKonVKHdGgnXMKxWCkUERboUg0hmI9Q+ph2W2tXR7fxiqZqOUGnnpfLLvLXNeIGdlcFEwneQLRRG6uLWXLfuDQ3vYVLD5HwqZ4UmcO0MxIBG5cDpKpR1V6QgRhAV2WirlDMyYaC1tzrC/YPcPSNds/SP2mEVkiPHai2CoitxJzKucGCYVdIpoe1p4i1TBzY9S57GcTKgsng1lNPH5mMwNxqsaFk2F44KYYBWHet7WeBYttOJ0ub36Ze7Df5rL21BN0pldFgjv3uiWtaw1tUFF5rFlRCflRmuBpKsYOAqOQRy9NdpbxHy/7trdVaGsvCeqZb2uCenGmYgC94gKJUREiEdDNTXESeiQ2xbprFEV3aeb7cviMN2aPlmblCeFxFuBedDCUyOID1E6zqgMPhmlgN62Wvb+HPb87nwIq1Vae1kcik+mUzZazIj0QliCeeTUUeod44YpJQ3yGkMvhNZobiQ/P928D3F7o5c3s2Tgx9lFeYjuQqushoEFQZYokxRo45wQSkXqsKtGB5kAPfhbo1o1Ssm/vL2Ybe6/vaymU6bffFjdWpv+6OHLzd8UB/pzkjLf4SB4yoIXcV2f7alDUXtKRJAmnQoMZ6LlmWjWzOvYRqbL9PHbq7T2fFH2yTg/QbOziayyDmlsk6RAVFukiUIyII5UxOn/cD6eRGaky/+4nq3KPhnnJGXWOgiYIsujZoLhaBxTITguGRGRR4EpnIm2Z6JR0uOjjdzNsH9n3O/pj5e7HS38VJyVmFlfPaJcamFYZJhGTHFkxrjArZQqGdOgS7XP7WmU3fhoLzdrp48kxhZnwb+7TNtQ/26hh2RAyubr3wzSyd4wVHhvuUXUWCetY8EIiwJUVLc9MbJRxsl2Lz+nz+7u/Ov160/B/f52O1b8tbl+FTbbVdzZOAsNs34p5wymEgUfJDaE6BixChx7aoxRDjIazmljbHZw+wAv4yosqv1Jt4JpkW1tjLakzJ0JaQnB1gkaqbCeEqWwqgQDMpEn8QC+2tZnolGcqGYjf71+6f06PXdzm4/zko/Deah4JBYXg0tmRCDJ1HZWxcgo4opG6bVEYFW0PglN4v7vw7UPi7u7pr88/E6hOUFno2P2NFCHhdbUca6sR96hargwFi5QzDmCOub2NnaTPnSZbUy/XvO1j/Of/d2L3W8//mN28d3159lifl253os7IwNTN3dyvOTcV+0xIkUaEUSJDFKks4So1oZBVXPrSF8T1bjt1lYv7v1RcQdmGKJmO5cpJ7yM3BorLY+WWMeNZNFSKxQmcE5a+6SaOOTvNrDiab99v4Xmb29my5tL82W9iy9vZptmKOUl+Z2DhNne/UaJJCa8khopqbhihEQSpazyQzB072t9BkSXDVyYf6x372dzUxzy+yNcNgvKRMxUYAyn/yhBpaSaKhtwNDGICBXFZ4lDHNi2H8KmGnzLqV7N/ZfXc1/evNSz0DA7O1i6aAJmNDiSDAPPBBKMCiG5wEIEqBRudwp+KQ2wDL/45sOXqzi//rJJp7iuHKDVgIf5ZajeuUrA3f08ooSTwKiSTEuOKmePCUhU9QiOSU2cgJAYQDELRSpzUHx5c3M5c5vtzkehAvaBImarAaCcSymCRek/igtDPHMTgSEBGJ7Jm/Him+/+cOGmCdKSkUVttBJLikUgnChlhKVIG8s55BkD0o7K3p/n1/PL+cVvO/3wpV2uFsat3i3mLiyXablGpayCJQtfCaKMscEIgkjCI6dEWiu4EFNp5kcBimeSvfq+7L1eQ3C5iYZXviizcp+qG34+GrGQ1BLtUGSUEJvscsM9lRxrSrxymkPkG4CY54m6TgmsBeLX1xUk/1WhkiZSxdllWP7Nh5vKyr52s/Ti21Vwn769Mjd/ufJ/Wf2jqjk1L+jmlr++EPtpteuvdmekV8ch/LH67c1uxS9V36/w9eUWeHh777fpzxfX5vKn2fXvFelogsk//30Vrm4uEz3Tk80W//6vmidKKyQiu+puu8l678NF+GMDApwe8qr6tm/TTbfvpYU/meWn9U3SkTIhEoo4C6jaQMOCVJSZkIwvbYkUlfVWAff8X5jUfeH337188/N3Tb7uhrl8+6d//vuf//Q//n9//tMyrNLFn/+U8HMZ/vyn//d//D//5/9OP/7nN//nz3/6y//15z/9z//vm/T7f//Xn7/9poZQsxfqIanS79eUIANQQh7c+nS4/FUYDTkqjp6u5ruDufxbUkq254b95WadHPXhyzJ9lUdPvj686UZJmbn5mjNY8Xm5XxTenGfcXd1PPtze6MFzVvdPjCu9TxKx3WXiF3efFVxJGpmzVsu14BH73rnmD/T6wcrbfa8yy07lig8XrBEvVapOT4vvc3pM13hNGHv15Z1ZfVoH56rd6ul+e1w97dA94+rb5cJ9Wy29+6KV3Fm/uecr3cBS90fjeR2oBsQpPgZTZwXA9B5M1VeYrllrNC6cHatfVZFa4bBNFN38uHuq4rDqEHWA1XtY1WvlueqQ/HYzHHlm0m3OBNYk8CYIN5bgNltVb4edGmG9t4R7wRxBVGpJOXWIqRiJ987HNQQfxdyaP+Pbh3e7B0aytiU7EPjQ0nWw1Ge4TbhTxEySuunLyP00+Pvs7F654E9muXq3fsSrq9kqLf/4nerBa7tpHliy+nClE1fxz0q+r64uNy939YYbOoj95ORmy+0vVXnGxX5KWrOl3i9X+6tVLqdzNnqZvWB/HaJhxuwF7+2b1LcfmL0Qfz13KffshfzroJWwlb30r6//yaTqGu0VdjJGRxRnVHtMqA5RYewcl1OJfqrh0lH65FeFedF6pV22sTd3RlviXJQKM51+iblCHsfIpBJhMu5eNBjs21kdheG6vUl2kF0ncBJBoqFBImyRYsmsSaw6MMO4mEznYg1xivMgkavGcYoPt3bpFrOkxTTEJucWU6ydV9waU7mFpHfKCmYpE1xOhakOp0qInDjclPze+fxfhZh+ud6LtH76+8rjXxyj7YFi2e4ZUnrPCEEhMIYoS/+oaFAy8pHGiE2lInQo7tujJV4azvuiW1bXiEKhSLxhSsgE8YgSc5cWW+1isg2n0jGJjISh12/b2oVx97I8oHenWJahq8g110FT64Ny6ZeUYoYjCY5ajqbSXnJAht6HL7Q0jPdBs2zJWbIVDfcmYkOEVUhqQiMhylnLMSOTSfgdsMayJz99aUjviWwweWFAKxQmL/SG/6eavJBMU5aOgFdSUiotst4S5KJmlFtuxFSqLUeiyO/5GX69/mEzCOl9WM5vFy7s0iyLgn4PFIPuvkOGMaG77zBV9X129y1kws5wpwAm7PRdpQoTdqZ0PmDCzshsA5iw8/SpMDBip89jASN2JnMwYMbOuU7JSGbsGMYNl05FE4lyzkvLg43eCU3TfyfTy3GoHjZHEmIfeU02+7DTjIPf3OG/FubmpsDQca+0y6FeeYNi0Iozi4zjjGijjLWUICED11NJoR8Q9fuNzI/5Cj9uS9WrouBXX96HdD37XH24eqM84PdMvhz2KbZCK4+SAFIJ8I5Erb2jVhhPlcdTibYNh31RX7l4ePPeLeZ/T3fc7eHyzWxRXtPqnqhWIT1TPOwpg+LhGfRj2F2NtMbdCwxtQ+5zKHYfpovEDNb9iqtfD9eVoXWnspIAqzkCwEJThjM3ZWCOGsOVd8SigJQWBtvIvZMaVY69AE0ZmjRlSEL/n5s6siMK1/aWmzKb6kVS6LbtQe8aMdRbBrVq23rI5+ZVWui7uyfa9mDoXviz7cCQS8atXejumbYrLXftFzosdf/rsb59GZuWCj2pzJvuCX2bnJt+CT3kDG2CoY8me2QXqkyZOxfo5o9ebxrc7XLpz5LYsXXFn3MK7jZH+kyTRdPq5H7TiU3fCZZpbXm0Rd9QzS55be/HJs/Yuf0llx5JZqzDVbsgLL1BKHJkCMJRWESg/SW0v8y1v1QH2l/Svyy2BPn27qv8p1msNcnlqNpgrvWJQxk7SAtOFdKYJB3NIWKIC1hYojG1xkyl4na4yhV+bJLu3utym3Z0oFS2SwLDyBOCpabSV/8qwxBT1CseEJpMfcrI5t09vOcB9agwgPdHuK2uV5lzB3W9xvKID6TzVcsfEPMNn7Wz7ucNMVJIbjCjWgRDpJKRGOqDDIg4Dbof6H6HyUHPTw6mmpyR0VGGDWAxHh6PcI8yCP/t7k9GQ59KOREtrIbqKye5MiabgeZshkK69AyoYUGXntMUrCG69GgaWDAJ3g4HZyh33FnKjJTpIv2cytzAAdFe67Y/PPx238/+H4vL8pDeB82yOZaOYOS4dUxjZni6poZgIUl6hRPsAeVtUV4bsTm+Y+u1Ki5VJMx7IdrOWkYtreUaPWwoW5k3sgMOP2lnS9kpSqzFiHMqkLCYaEEt58JGhJHwFixlsJTBUgZLuXdLufJpNraU33y5Nlcz9+py7n4fVYytyvFaf5vcoMlW32gwL20j9Bx73s7yR1qazKvgCQ/MYcqsoFoKJoTBVJkqagPyB+QPyB+QPz3LH9bAUzu+0aY7ecMb2jiPvwEbSL70fW6a2jNEKSycMlFqiRFJPy12yAiVJEykAeQJyJMj8qT2KOfI8Wa2SMd2vvhynybr7KvKc1bjQGm52L8lku1TFddRdV3IUJ8O3/aW988UjjZyGZjlTiulBXcmOqeci9oSRXlzhR7xv1U7/fp2uZpf7Rw6o1LoE4r/maup8Sg4BjU1Y6hVrKB5V6z47Q7g31bOwm932NoRoKpaqath/Pbdp5uDHy2rWsxjskn7BGSPYtx0K5/4Q45a7BhqjykC7jyDisczVzwaHmm0FgUhokM+GiZi1ZlGCI1c0pSg4rFRxeOavPW1igf43JuF+ceD4N/P4fr2ruoxr7kfXmkXLd+VtlXfnteOVDiwWGUQ/RBW22q25V3NY7uw5vWaZlU481VlGblF+ujXosdeQqSbqsdesgo21Y68FuUHlqqCzJvUm+W9wr+qzrG+kPDAMu8Ws+vV5km+wu/l8qfZcrWrcJRNUrAPIWO2TEbVl3U53sub2c9h9WnulwdLHtusnDC3XvZnc9Oq5PHw1myW2zziq7lPBPFhW/LYbEy11kgHjZV2SirCtZWaRRajlczrKCH/4+id9vI/emBnpWV/9ECybI4TD1hHywwWgRJhfYzRCZIMeRmRYoDx1hjvR9CWBvN+qJbPWWVeGse8otRqHCXGMkYvCTXVEL6pZGizwZDO6zslPLjJ+/l8q40UXNN5Kp2yE8c4FkIoQpDkIUgbOZOYOxMQUQFtrKwJoHnAGuVONk1pkO5ErOw0GUmEi9FwFTw3UdOIXXA4UGyThqIg5/rMOdcH7OzC8N0P0aC2YLw4h9qCPmsLoFJsOJxDpVh7mJ+7UixIWXFtglyQTCtJEEPResS8kJjZqUyCHNC2bECsrzZTwf1UTidUdrKp0cZKyVRggpCY7EmMuOCI24RsIacys25A67JrKKg0WHelV3b6HK00EukpY4TRqKzz1DmmhJSUcTyZIVvD6SS9RSgLg3l/hMvhnSknvIzcJp5uebTEOm4ki5ZaoTCBGE9bvJ8jgl4Y8s9BwmwHRKNEpMgrqZGSiiuW9BoSpazmVePJTIkbWQfERrkehSG/P8JBx88hZ2RBx88z4r0R4bJxIxNxZa4ynP6jBE2qfMK8DTiaGEQUE8H7gDrOOXLvCoP+WWiYz+biTAbknKBEO45JQFzrpOsIjGUgBk5BW67fS6FJYbDvqzqnVfeQ4+WTQ1V3N+secux5O1d7E0ldtAZXHIB5a4kXXihKohYxxmqoJFR7/xWqvaF7SOvuTKhBMTe7f7rXTzmuUm5ypFiQawxjZ2ejKOVGmVLu9RPdFXLz5oXc2w8WVgLLt5lVgOpxlHHnBcxGUVw/3m/3OWm5Jdx8OzEU8Asl3Gcs4cbKaaOV88gz5atKboECDutaA6RJhBLuRiXcaD0wokmq/IbHvfS+Uj6TWruYX/0U4mpXvM2aZENs1vh+9seH1eLD7L/vRtSz5g/wNqni2xpZslXQG37y3SJc/Fxpz7uS7BZfO332xizChwcTVFm7+//v23kyJMLK3NVeNyko23z2fbiaf65uHF4tzO/hbr5sfd1O7RKJ5B+/3ISP8231d1VmzZt4QTYf/5jMqGqsqQ/rHqI746M+tyuzwo9hPYh1Uz7dqMQ52qA1FdIGiX302BvuozXRKmGxduA2b53o1em4F+Yo7EasbPgTKcMNlSIEg7TWKhJhDXeKJS3KiqmEP4fD9YkiqDBAn0ilHJKNw5wzahSnWBsug9cWBySkRp5iNpXU8gGRfII+VBqMTyBRDsOURBWdxZiYSAknmjrLaaSBcBOUhbBkawyfpJmXhuKTiJRtCOQjIkqhoLQjmEfhBDFKYWO4EsJxwPH5tOUaK7EwPHcjVtYKDAoLSqki2CAcOLJYUU+tkcI4Fj3g+nz8+Z7nojA8n0akbGEP5iwqLrCLwnPkmGCImkCFCDxZhFDY05o/d/GiFQbnTrTKFmM6TSNSlaeOqyiRSXqzEtrhpD0nnRpK6Fuj+lTHbmmIPpVOUCo/YGEClMo3hfNZSuV5UIJ4bWj0HBMhmFBWOMyMsNgzBp7m1njuEDcrDdEdSJXDNArYeeZJsgdVsEnzYEpqp4X0UmlOwB7sh0c3ieSWhuiTCbUrF2ANywWOJOgOVixQmx3f7mk7lwpwKkhkOBkW2nqHhalKiIjU1lmGfDX5BkoF/gqlAlAqcJZSAfo3v+03lqyoW7e6XYxyrGZjznrk+4yMs2aftjtnldjrYKKPwgdqkCUEYaS9C05rpgxwVuCswFlP4KyV6XOUs5K/2a/9eMfEU9d5zoesL8mMFZyquO56zU3SwBBTynuCmGYe2jX1HGW+17P5/vWP4fKmKpEqzQLrRCxo7T7W5gQ/QGv3Xlu7b9LqVUOd+KAkGkobro51A234wHN21oOxNZIapyTmQhscNAreKs89wtxjI0EPBj0Y9OBT9OAmk+Xx3+6+2Ji04J1ngTdt8XLge/CheGizxi61T9mZgxonRWAiCqG5tpbY9BNJSahH0lkbgYMCBwUO2p4yrKJMPnWrhjJvZovE3OaLL/fJs7bqKwumRpFtudi/JertExjX4W1d6l5fMN32lg/0tWgjl4FZ7rRSWnBnonPKuagtUZRvhQ8+IHzIX27W0uLb5SYDee5MutmYZM+R/jeBe0Kg08J4OoXkZih+uA+yh6+KbRUSBJUcAPyEDZzusFsJzK8NnDZrFwhHDfx0Bp1rzty5RnkkvOHSGuWiwgZ5hLi3VjDLvKABOtccuk24U8LM5mTVD02rFbk7bTJ9/MEvdv1r6n2utUtVJsfmGeeLR2tVX17mIgQP13of3O1iOfsccs9XJWqL5mtufM3VUz5aiTZruUKdDtQxTg03zAiCEYoCo6gVxpEbmK3VOgzSXTcsLQbShza9ATnPuO6OW4GDRT/oQd/EsYfs7LhjxFsfHI5EBK+5xQpzJJjExFlDJSRXguPuiR13h0ODd4djZHTZhl7zvqdFiFtO+fJm9ugbPL0LCueSgISkwhMbHDHeWC0DikZI47Um1FtBQEtoqSXw2mrz49Vfyx8W89vyplR1JdeuHIM00Q+OndTBUoZRE06Ye9buiRKMa69U+h/VjjlCEDFaek2VYsxTC9oCaAugLbQvxDiUJnHgXCeVYIQaw10pRi5hotU3Gip1IjMTp8XzduauIVhFLZFeiBAoltpVTW6lNRoHbTSUYwB3Be56WgrF89XMhpJBUraXQen/Hxdmtnp//zdjEkkqZ8RST6hGRiPtUOK4xlnmnOJG06iFN2wiRqyST2fFHh+musbP5hqs2JbkysVxsFZecIKEVIgJYjERIVlvXjHFqCBTKdPimg0Xydkn1/HtWs9I/Wn2eygU4X2QLN98ziJJA4pOI44lk1gQh5FBlBsSpJ0Iyimjw/Fw2XrLXpllqQDvSK1sK7rAXdVWUUmPDWOIECGjosJaIrSfTJsjNS4n+2vjPoXNv1XG0+bdtdQtD9sdyZVl3N55XhWNW0oUxchir6NjUqOAdAL+RMCN9WDglvl2mHcm7radSNqj62WcL66+blu5GSe90i4He02Zl8Yxryi1GkeJsYzRS0KNcj7oicCeDKiu5JKFHkUCy4X4yXTKwdlFhCIL6e+kFML5qn2ClAhTixO6xVR6Jgg1GJzZvj5Zc5PSoXwSjbJDrCSxNjBqHcURK4NxwBQJpoxCVvCpaNqEP52rpKnqWC6q+yDZNq2lqjo5JQB71J0vBorHVjUQ7eOxRx6/c3g2SioVM54FjYllyDJMQ7rAUTmOjYPwLIRnITwL4dlzUIk//ySYoQLZ6mjZf63ouBOjzzOYjbwRSWXlWmIqvNEYcy8ZYohKJA2FYPYQ4b47DBUaDemDZBDUfsEwBLWnhXIIatfERtRw/ggIao8kqF1I3G84/g1hPwj7jQX1A/JziPpB1O/c+gmBqN+IoAxRvxM9JhD0Gy+o+wn6FZ9DShHkkI4T4N1zSDcR7UaNnE706w8V1VYN2jyd9BW6t3UggQfDFQnOSsKIQ1pwInziFyo4FSCyDZFtiGxDZBsi209boi1Oimx/d3179TyD2tRUXUc9QiQKR0w0mhCmiTdSchHDZJqRouFcDSf49iv8QCTkFGpBLPsFw0/ogIBYNsSyIZYNsWyIZXfh4BDLfgY4h1g2xLKnjXCIZXfQTyCWPSYoQywbYtmTAzXEsiGWPWmA9xXLRifHsrOe/MGKsw9PUj756TtHsIVSJFRF2Fx7ahWzJlhJtMJUMWUZhgg2RLAhgg0RbIhgP8cm499tA9NfpfiYQtg8F8LmDCNPCJaaJr01/asMQ0xRr3hAyKOJaK14yJLV9m2z39VhqDgFtj/C5ew0TonnRFqvObZURSw8i9Y7b5xjRk9lNpwarsdhvXB5eJO09EVlcdRNPSsP6J0JlnVESGmwMwS5IJlWkiCGEsAR80JiZsNEAC4HbOLZgFoA7E6EynJsI4nQKiLmuBTUeqxDYtQqOuwYkWoigObDuY+b7NPXNAMA9AmEysaoE2M2jAtvaIgkGJeuSMI0sVJYHacC6KGai/9SGipxMlPfrqpfzxcvLy4W4SI9RB/tNfOG7Ojba+Yev/v0Q0RRCDS6KhVWaoUYqQbQO24jxcEJcOGCCxdcuODCBRfuc3ThrrPGn2cVEsLCUs8Rx8jRoBWOWjFMqSeecMvMRLRJPGCS2AmTD9cA2lyXZyV1JBfUIb1gA9bYQR1Se48t1CFBHdKUAQ51SFCHVALOoQ4J6pCmjXCoQ+qgn0Ad0pigDHVIUIc0OVBDHVIvGIc6pLECvK86pNPD2Hln/ujD2LnH7xzGNjYK7DShVWpgcII45pRMP6nAXHAIY0MYG8LYEMaGMPYTT4nkp4ex3y2qT66+jDacna1IMlYz6oQXQivDdIwkBM0Z105zjtxUJkXiAdN91f6ZO+7c/3Brt1c7NN1dFBohOQ8RISj4AusBKzkgKDiOoCB44sAT99TwPrcnDoImEDSZQNAEHMrgUJ6EQ1l3cygfNasHG9R02GHY/Wt0djBbzDGyiAditEsKncBUcIUtc8J6jgg4mMHBDA5mcDCDg/lpHcz0dAfzz2H1ae5H614WOfeyEJp4SZUTlBoXtcMqIE8ZJlJgLKdSLUXocFZZNffrZM/oBkvbH4X62fonILiV086CW3mccD+jWzkwLq2lwTktrOLKUGyC58bJqKwjU+l9hQecWqb2pXZH5lSuZ+6MlAQ39As2XCkKuKEhd/9saouAkOF4UQ3J+xBrmTTA+4q1yG6xliMepsEiLbxLpCX7JTrHWRTiKjLqMWNKRRQpZ9YIb5M0jJ7RCHEWiLNAnAXiLBBnebaJ/ImGy5W5Xo020pJN5FdRsuCsxQyjgEJls8m0PVwZboM0fCK6LCbDOR50lxz0B5B6+KpQR/S5yQlRGEjuHy34Ibn/ufS3B0/dCD11hURVhsM4BFUgtx/8zaUheiS5/Uct7eeR23/ka3T2OXOltXeUYe+YlEnkWeu8EAZT5pD0DnzO4HMGnzP4nMHn/KQ+Z8aO+5wfPvPTu5JxzpXsucSacBK8ZTE4ZHkQmjiHbUBR4KnM7MWDaak0p3a9W8z/nlbfvCpOI21Dmq32yVQz7XP/zLGBlMp+pWLTRoNRO+GUxEFjrCkXxshgvbQWWSMJ1IGCrnhMV6wVPTlyvJkt0umcL77cpwmpaFJJhxr20XKxf0sk26cqrqPquiwK93LL+2cKRxu5DMxyp5XSgjsTnVPORW2Jonzr7NHHxP9GGGz2NT2Gn1V/OSZtYL1nJFHWXc6vw91HBVeSRuapI24t9IU++XleP1h5e3RU/Z6dsGCNaK9KLntafF9y4o0EStv56qvrb7lGIe/tpnui8r4XJ7cNezD77e5qz0ep+6P9vA5rQyuzOfgqEgG+9+Cr14rfr9eXCb1rD9as8vSdCb/oxT+nBbej3FI5BHC7Bzf6lVu+M6tPwzHKtAHfLhfu22rpaXK9KkQ1W1Vvh53iYF2MBEdOtJWeEoKlJ9R5zAOTKKkw62c8HZpvH97tHkjX56ILgQ8tXQdXfYbbhDvVa9vVQOYCgI8F7dXV/Hr/3e/N5TLcvaweH23N664LJ5PjY1JoK73WzCrE3LvHmkS5yUTN7vHT3CVC+bfXDxavWh0o1tfiv8xXe+tXKUyPavTbr/9xcfuQ8NXIOJ47nAdVpx8W89ubzfytrQ8ix/4NZ8D+x8D+K+a45v97uVbfvvt08+3mVt/u7XkxUgLpYAm3WngZuUFGMREo8ihUzcC1ts9eSpAhpATeeIAQbZ7c94jJ3I8k7//y7fLdYvY5PcYjCYJRi/L21vecrxJFgn8kUzBqMZm37V1v7eXMPZI0GO2Lmr5u+Z+z5czOLhMGHokf3aJFzP6ymzq0Zju5nmLaYpx383vV7eA6c74DbA7e7fHOifXOtch5bXavymT9fjG/en27WKRzuNver/eV1Vfs/bYHkKI67t6uN2QzrOg1SVvk0Le5Xe2BRx2JmbnhY8TgDX/ZFzk93O4oaDYtlc9w5wO4wXSjRv5rq0weHGqrCGLYERuYlYHzYIyKRHhFMYsCQRy2dbZgV8dpYcHZHhzNa4AL2iRiezRMMlQAV+DjAdwjD9s5nquJdNEQjZg02CNvlEDBBuQJJcoxDvFciOdC7t8ZcrU2B3tU0dkjAQeGkQGP033Zye57nO50vurXAwZpGyhmXwfD33cOTdEDlUOvkJBcMIPo7LnDYqIKhVEZMPcUO8ecIQozrYRCnDH27B2eg4TF1tQVLXwe23u++yo678OiYpXH7WCeJJyvdk9T6at/lWGIKeoVDwh5NBU7eLiyuf52sDCLuD/C5aOIDBtEQSo+Q53ua9eGknW6YBygF3S6M+t0QVNLuSUmKi6ktZFrEZHTNFKmOQWdrpFOx/rX6VpGircLNu/29OiWuC6pqlvD90f3WEeJunyr+rHUj+5D76nEjFRi73rbgj4QomyM0SYt2DuV/o+SOROtY4RZbSfTxWo4Pbj9dq7B+NPs9ydoZFUxxq9gGFbvTbLxt66UOqbyRqlAaRiZytvHCZmi8lujjUSMLDe8CtsxZFBI+oizAkuHlfBYQeJ1c23kUZ+ahqjbIe7knnvfXd9efV0En3YA7gLgX1eqdIcTvtS67c7XVehfj3jKEBaWeo44Ro4GrXDUimFKPfGEWzaVcXsDZox0BGJh7rGu5MphmxqFcfQIkShcMvmMJoRp4o2UXMQQAdttsd2NPZYG7W7UynJtbwQSjGuJqfBGY8y9ZIghKpE0GzcGIPu8Zt0jmV0YvPsgWZZ7e0I1Mhpph4QIxlnmnOJG06gT5gHjA2gmD7TJwvDdlVzZ+LSRRGgVEXNcCmo91iFpJyo67BjZODUmgG0ihwP3yYG20mDdKSJ5sPAgSGYYT3yZhkgSs05XJGGaWCmsjlMB9FCzEn4pDZVVk6aNs2e+eHlxsQgX6SHykCMEIZ6MO4y8dcoRRE2URCZtmLmgvZwI5PBw02sGjcCVBvAhaZs7NqVMfRrs1MDMp14PylPOfLIkJqPTMq8kEkwaoaTBzCiKY3qtp3I2yHBpo+fNsCjsaJyXmI+TRzznKgRnJFOK4KqDpcfVGJ2ArTKIg/+89Wlo0UqhwQY+zaCdJ8wpUaJ9TklTAh5JNSEmQnb1bDQNTc94kgrJPVGSo8AQqfQarILzKKk7ggssjEZUCcg9aZJ7suld3aKZ0yEwvvlyba5m7j4md0kpjzrbdcT6hjhH8kJwUn9j1RVeOi2kZBQZbxDBIQSNvIG8kNay/1wgKU0JPhcds8OAhSZeUuUEpcZF7RLHRJ4yTKTAWMJpaHsa+udphR2D/gmYlQYkcB2JQtV44KQSh2iUJpiriIxT0ykjGHBS/NnLQgo7EOcnaHaittWs6oOaBIUyTMdIkp7EGddOc44cJKu0Vpe6uIHrt7M8IXEeImbnFUtpsDMEuSCZVpIghqL1iHkhMbMBzkHLc3B6U6DCsN6te1LhU+SHwzNMkT/bFPkWow43ezLWUYf7T9e5NaZljDOEtDEcaawcR4YGjgW2ViqFJbTGhNaY0BqzdWtMjg+0xsR/SY8VZxe3m189evSxdMg8mM2KkZEaYaV1pEnWW2SRCsGqYLnUYirZrANK/dptfX0fJA9flSfz21Mop7d6z6zmMTLFA6mqDIjUmKf/OuQin0wm04AFYrXjpe4EwLv0VBUzT7ayC8vlfLHOoX/0bnGw7otsWaxrjXRIep12SirCtZWaRRajlczrOJlE8OGwXkusu037mGT4b99v0fbbm4X5R/qz26u0xnqxn8P1bXk474Fk2axtHrCOlhksAiXC+hijEyQ4JiNSDDDeGuP52eWHNyxsA2Y71b0smPdDtWwOtiTCVW42FTyvUlAidsHhQLFN2FfgcWuN9NrBmwf2LP1+nfVUieBXldnmFumjy/KA3gvRshWTNLBgDHIJ285Q7rizlBkp00X66QDnbXG+nxiU37LVPmv6j8VleTDvg2bZxCmjjZWSqcAEIREFhhEXHHGbrFIhoYSgdTywNiX3wI5V2/Hu8vZiM+y58hMWh/DO9MqWINOKg0tPGSOMRmWdp84xJaSkjGMM6G7Lw2unnB/YrXeL2fWjcO7L5U+zZXkw749wWSvUEYwct45pzMy6ZaAh1TSe9AonJQbwfl7d/E7+rteq1M0ilZZeiJbN+uBYCKEIQZKHIG3kTGLuTEBEhaTDAM7bai15N/DDLasip2nbthK4PNuzG7FyuI42aE2FtEFiHz32hvtoTbRKWKydAFyfA9fr0PxvL72vAurXq2qw9E8hlqejdCNWtp0aUoYbKkUIBmmtq5nX1nCnGHPeismM+xouXt/Eatps1fezPz6sFh9m/11gnt5pVMrH7WPSMRQKSiddm0fhBDFKYWO4EsJB3P6MHPrdItyYRfgwv124UGR4pxuxsppHUFhQShXBBuHAkcWKemqNFMax6AHXbTl0E4N/s1X/+3a+CldhZYrD82lEynr8MGfV6DDsovBVYZdgiJpAhQg8aSHg8WvNn5tElDdb9D5czT9XvCa8WpjfQ4GGYRdaZaM01QA8pCrrkKsoq+x4ooR2mHBjMYZYZGtU48Y7ldTCj19uwsd5ia68k+mUtQaDEsRrQ6PnmAjBhLLCYWaExZ4xsAZbo7mJw3WzSx/DH6uP89dzH15dzl2BGnQHUmUHfgTsPPMk6c8q2MSpmZK66szjpdKcgP7cGtNNEjbvb9SPwfi0enmIPplQ2eEeJKrokm5R9dUjnGjqLKcx6R3cBGWhoc4Z7cFkul/8XBV4FYfl04iU7fvhMOeMGsUp1obL4LXFAQmpkaeYQb+D1jhu7oJ6e3VzmaRneSg+gUTZaLeU3jNCUAhJO6Ys/aOiQY4gpDFiGjDcEsOivn5/nVi2vt5e7uqcwqYQ6sfV1eXm5eb3xQG7N7pl0a6q+kcdNLU+KJd+SROjxpEERy1HkMPUGu21OcRHd61spPdBs10HV57p+HG8Ep8O1PiD04MtDo49ZOf+H0RI7rhYp7lwxZTn2kWiNTESax8d9P+A/h+ZPhesps+FWaa7Lb/1c/e35Wpx61a3i0D+cnM9iu4W6MU/N82ADrCGYw8/TCegWoaQebTObEA4TGXQ2jqECDHESyaNddhZYzUlZLvbqNluj26zWfPNHnyvaxnf4SfrzvEltVRSpyWOzpGIKMGWSU5wNNoZtdlqqrJbHf4w6YHHt9Hk6EY/fvJhthkd2eYHz9V5k5mVjgQhHQsWKUxFxMQpTYgzVgS8DeXTmvO8L3KffnOz/YhwVNhgLknkATvuMRax8pmmr4ojnkzdBWODGS1kf1s3P6o/LrBLyxFqZDuDc5MMamQRN0R4yqRgKmnVEQef9OzJlErw4aBJ96l1fzO+Ny79W14n42ZE2VrE9IAmVMv1BxGMXQ2/pn0uUaCM0CiZSwdQcMekoknpUZRIzelW6+GPtZ4HX/3l2+r7LueXocrDT2+u49NJiF1dmWs/BmHJcsKSBoIIpRoRJ6UKTBFOKec+UUBqFKaSojfcaPVH8YYEkPWk++VvHz6ZRfBbZKTlZ279i+LY0ykkyklVaW3VfTIiw2xQIhmsNv0jCfLB8ainku4xoMLHHjP4DYvb7sy68dwdiysNvq2Ik+//76IJmNHgiBDaM4EEo0LIarCcCFOpXxlqTswvxSExKRUfvlzF+XW13tXN/DpUg5z34NgIilI6ymzExIZoHGeGG0O59pF6qRiZSmqGHo6F7getjimKpWG3LX225opCteZKi6W2wb4rc/MUkb1nEtUaIr73bKJawwT52EFyPIDq00f4RHOTeOt1CO/Thv4cPm6/HBjHoxKKYByPSS6CcXwKhikF43gU8AXjuKVXB4zj0RvHDmsrKKYCU5aUAZl+a5GIOqkC2hs8lX7ywxnHPGP8HVEZC0NxB0ptDWbdzmDOLgqmM5jOYDp3MZ0fp1ftH8S7QP3ytzvP1b30kqc3mXnWZKYGY4ek5IQrzY3GmCCjNTVKRuSnIirVgDbz/rYex0hhMvIECmUtZpOQS4MRkjjlFDPKI6tYoJp6TchUOmKQ4XK0anSYd4v551ni/uXOLW5IlWw6IfaYRWSISXaICIaqyJ3EHAsamFRTMZGHQ+qj9g0/meuL26pqMim/l1Vd2aeb3T03P34Ml2mt4sB7OqHyU36Yl8Yxryi1GkeJsYzRS5K0B+fDVGqrh8vjqe8Y9fAm7+fz7XiDcnnxyXTKdqc1xnFiFdIEYx4Dld77xKmFxs4TD9y5LZpVrRX5cOrvd3+4cLO+env92VzO/INfpwdKa6Xdu/uz4qB+HiLukjPqi61aKefgYwIfE/iYuviYeBsf0/v1Xu78vKNyNGVzM7x0wRqjEGVEWs65RcioZP4Em16LqSQs8gGNn/0D1BAohQnQU8kELidwOT1/l1OQshpeR5ALkmklCWIoWo+YFxIzOxW2+4Qup6zpeU9qlgbe0wkFRvqADc7ASB+9kS7bGukHdBqw1MFSB0u9S6s0cdRS36lnd10bnt4szzbfSULTECN8MNgjofg69VwK5nQUjsuphHDIcLmSdD82UYeKwuRjI5qAwQ0G91PjtKnB/a9dXV0DxWwP6KCFgRYGWlgXLex4OWvNmX16PQzn9LBCBBxGA7aaAxHXWcTJZsUojxYAIQdCDoRcByHHm7salpUYur73xhiEXdbpUIiw48N58UHWnSt+KrxSBisuMRGBOYWiJJwxzoiPyE6lpQgesh9DxhlUw8sKw2xL6uz0tHauiEcLgb4G+hroa12SOB9P0dk/fMe6Aj290pb1UBTSXAsP54OH7lpn6q61SZugjURifjWQiyAXQS52kItU5+XiXd/Xm5sxSMCs24KRwKiSTEuONHXcBCSEsMQxqYkTdiISEDqcncsdIXMdztIJuJy5zXZnXRLU4UhIiE4ipwgT0SCqbSCSGk6xmUoK7IApO4QdaIK45kqFoTRPjF3qAz6uXN37HKhRoEaBGtVBjZJH3Av7bTJfej+r/tRcbt+5X18xcjVLB8kM48IbGiIJxqUrooMhVgqro5qIfIMpK2cSYDgxuberTcnDy4uLRbhID3FEpdIo8EiMtNhp4bRlMqYXmgWFJEZTGUGqBuxks++4acWhCkNsN2Lt+sY28He1WBdUNlDZQGXrksFzpK1HttH+yFW0QoZUkAFjQTCkIhMFgiEV7YA7VDJPcbZF6yEVm+ycBhXcGUiDKgaqGKhiXZJzWDtV7EFnhhHpZBR0shd0KL8Z6GSgk0FY/Tkgsb/BYUE5QyKL1CsbCfcoqKidQQg5FSOOAMW2LFQf4RL1orY0BJ9GpV2io2hvXdQtCGYGmBlgZnTx+DbMddwdwh+2o/vAwhiVdITRxCORimBhjFOtAwvjdAvDeBYT/pQhhgqulQmSoUCIJU7TSKZiYYjhWOihdNWDUrY08LYm0M6uaJHje2AtMCnApACTokvk4kgbmN35e7eYXyzCcvnKLO5fP5cutEHTpJl5KqzFBqlqOowjRMj0mjjJp5J/OWBDmJoJec2QUph0PJlOOSWvylQnhJEo1i5kg3kyknFwiPP0TpiKoTxcdlTNLInHu/Rh9eVy9t/B33uvPDifTKid0tegkUyzIwK6H+h+oPt10f1ke92v9mg/vfKXdStrqgQymghjLXWBOKG0l8rbSFSwbiojCAacDCge15M8uskOBuvtWNzDS7ntAvsiG6iGiXeCcjg6fHdRDjO1k5GIIGI0kbCIXPDGBuwjic5bZvhUgitDme7FBVfSfWZVtW660VcrRJ9mhdSAF8wQMEPADOmS1XJk3MaaLq+N+xS2XGF9/TZ9tXfz+eUYrI/sXHIZkWbSa+WskI4HYbkzNDKDaVBITCUgi0F+naurVwLHu+ViewQegL+hTaCFl5ZYrU3SoJjGmlPlPNPGGJfMhcnMaBYDltPud34/xqUKA21r+mTxi5GRukoN1JFiai2ySIVgVbBcajGVhj0DordWMD4cJ/zgVXn4bU8hmCoOU8WfF8jPO1UcNTGxc0IBLGuwrMGy7mBZVx3qG1rWP82dudyexLsT/6v9e2Ixv8xX3ycG7+8d8ac3udGLf665DEa8FZtp8z2B/wD/Af5z1uTSunO5vtwcyfUbY2A32eRSbmTVHJ1gGbxLSr6h0UVPoqKIUW2mEnLlwzXGqEmabIaUwhT4k+mUryAKQgRsDLJeikiV0ZgZjxRh6WIyFUTD2apCNdqlBnpXYfDuj3Ctkk+bHCHQDUE3BN2wy8AB0lg3vBuddlOlXASf/uL2avPcYTQaYjYDVUTOVCSYcyIQNiJKFxAzwiKMTbRT0RCxGLD/uzwsGxoApjBJ2pFaEJyD4NyI0AzBuXEjGIJzYw/OVThoYQgdFRFgDoE5BOZQF1c5amIO5STc05tAODvevRA9EWsFmuJohGjPmqKLKFSjA4PUXBqBPGZcM2GkEz46KSaC4QFL6+rt0sP7c6fTvDIXxaG5I7VyyC4khjkgsiGE+XQhzELGbQ6IZpi22QLSHadtFu+pwsN19wRX1YhdVYcPAlYVI7faWaKxwcImzq6c0AR5IRmbSkuXARn8vqH0k7m+uE3P8mNiT5fpRnuvlyXz9y60yqFaUcEQi1qLwIUwCgvnubLOpzcxcwxQ3RLVsla5vHMvvktPVbkK3y3mLiyX85p3ym1W1CvtcqgXwmHLFTFGIYM4Rxx5RInFygZJPfDy1m7BemJd3l7Mrrc/SmbfbcmTzZWVNOqItMTRBxFs0j0QoQEjJJX1mgB2W2JX1NaNb2/yYX67cKFyBazme69KBnQvNMuhXCLrrMRM62A5cSi6QIQl1mDsaDQGUN4W5bXEupOtH/8xu/htE4b87fXtcjW/2rwoGuQ9kCyHceSpkEErzZwWKhJJPLaOqiCZpYhIwHhbjNc2u9zbsC3Sdlu2fVk0znsi267igTRN9DkcRYLkHkjugeSeLsk9jerwDx/A/xVGMWElm96jBEHeRpNkaFRIcewlDkGwYCLDjE5FfsrhygZZffXbEZgUJi5PI9JOODbuHZFdD+QjyEeQj2evBWya5vT0gjJbC1hIDiGnkEU4TpF5xixCrTSiJnrPVZRGCuMoZpon1ZAbjRWeCLYHDGDWEuvhXv2nubwNHxfmehnni6t0880b89eXZrm8935xQO+XeJCX9UJCWtZzwv9IKgibCRYwosCIAiOqgxGleWsjqv3hf3rb6q7xJ5YnMaC23xn4EvAl4EtnbwL64Iy+D3HLBl7ezDa/GgPrycY/BMOWRqGCcDzIqLAikgmFsVVaRjuV+Afmw5U3HygNOw6VwvT8k+nUuivisSVBWIKwBGHZJRLSaBbeYw/W+7CcX35OpHq5uPj84J0xCM5sPARJxIIQmjFMBEKei+hNpMojqbHXU6k8x8M5zw60zc2g5sGrckte+iNcdkI3NS4yJi1hMSKOuJJUeKc4CSqi6TQDHa5dfH0CfEs2WRrW+6AZ9MqBXjkjxXfnKPd2vFDjKWZtTg7YSWAngZ3UZbJZ+4yxh0dy99XBVhqhTMXDtZEHW2nctpIO3iCJcVTEUBktJyYiktBPESV+KpWndDinumigFzVilaXhvS+6gc0ENtNIMd6XzXRaaliD0wN2E9hNYDd1iS/JjnbT+xDBZBqhSAWTafzidRiTSSNvvPTEMa+plpxI4ZggEmvmHKdT0SGHDC81rSPJcMnSoN4DycBQAkNppPDux1DSugc7af/cgIkEJhKYSF1CS+2b9TRT2p7eUCJgKL0gFAylsYvXYQwl0CFBh3z2OiRGp/WwanJ8QJUEVRJUyS6q5Ine9kb9SEauTgandLTBa2Q5ZZQQyrgNJjhqjLVxKuNeCRpMvEp2cjubr2+Uq1T2TT7og5X09OHAD42wxtMIa6t5dnBfNrgRaJ+gfYL22UX71H1pn7Xy7+n1z2w/jkL0TzZcWTHonyPTP7d9sHCfYrjmViCIQRCDIO6SdIkbCOLEWC4SVXYjZNP72w98t1jMF8vt+2MQu9l0Sxm4YtRGK7GkWATCiVJGWIq0sZzHiYjdoQaU/1KalGQJ1z/Pr+fpkNydhZd2uVoYt9oOlk3L3Z2GbO1Yeq2tZRQJyRmVIjqHCXVGisB4mMo0ZTXcRBpeO5usKecqDMndiJUDNtVMCp6MG2q4t4oa5WLEJDrLcIK3mwiwBwxcN9NUdm9sX5eH6BPJtEt3pA0NlWZnBMwSMEvALOnSmLdJdPohF3lllltmcc9OGLtJwo0kQquImONSUOuxDkYTFR12jMipeAIxHrAzbwNy1WOlNJF5MqGy4eUgq8RF4Q0NkQTj0hVJoCZWCqsn49seSgEszsiuRie8XVW/ni9eXlwswkV6iKPJsiiyBLUgpRDOx2i4lAhTi63GggLkWrJQVpv++fAmmx/lhkxOotGuqXnT7ITjzBgsDbA0wNLokonQpKv5Hvsw7lPY/Pu/wpe7i60vYD6uRIRsIizh0iNqAnOa68r2kFQFG3ywikeJJiM5hwqJLF/I2tbFJ+OnMKHaM/VySmMyvK0NjFpHccTKYBwwRYIpo5AVfDIlhYMhv76twsG9M3a3bLlw74Nkd6k2TZtBn3iaQNEERRMUzS6KZpNZc9nD+SZEc3u5enRGx6BmZr3chaiZA/Y5AzXzmaiZ3AgjEFUeC4yVDIJqy7BlWgvmEJtKtdWAHc9k7UTBExlnacDvk3ZgXYF1NWaw92ldoaZjSE86S2BbgW0FtlUH26riwd1sq73EQLCxRipxwcZ6JtJ3QBvLKsFN0FJ6wkNIZwAhxpVAURosA5lKXc+QNpZuvXnHGWhpB+AcNASbC2yuMYO+14iW6MPmOnamwPYC2wtsr3OP7WnHAZ7e1GI5U6uQfGPMh1M4IeP4bBnHxSuMmIHKOGJY96MyZgqSMDJSI6y0jjTxaIssUiFYFSyXWkylIGm4TgusVgZnmoMXB+kTKJRDcFIzDHaGoKRwMK0kQQxF6xHzQmJmw0QQPByXblL5+H4+X20uoUT0BEK1HSPVht+DyQ4mO5jsXUz2JmOkGpzIjwszW43BXM93Ww3cKRuS4PTYMIYIETIqKqwlQnsyGTNnwHb/vHYIUnPElCZGO5JrJ0ybjtNpujIIUhCkIEi71HSQfgTpfy3MTVrme+NW88WXMUjUbNmwU2Gdvm5ttIQgjkKySL1gkoeAMJqKQcqH86mIBr7dRsgpTLL2Rrd8DYcMRFKCZfCOWGVodNGTpEMiRrWZigI5oP+ltgxhs08/zZ25vHf5q/17utf6jeLQfTKd7tLWWX8a48MTA6ojqI6gOnZRHVGvquNoXDH5wYuFuGIYuGLGKlI7u2IykWZNEfUIOUMp1i4YSrT03HOBEXGTaeZKB0ynaMK0jnPFwjDeE9XulEjSuxIJ3kdQIUGF7NwkvVPrwupQ/hxWn+Z+DGpjNoKnOdGRI66ZTYI1CmMElyIGaqQmMU6lwEsN16aQt6vOu4+VwoRpB0rtwnadO7N9XRRkJshMkJlPUa2yebG+/rCaLxLf/jFc3oxj6mHW58JQVAzR6B3DEVHBiGKMC4uDVSYwMRHhifWA0brGKeuHUVOYGO2DZFnfi/DSEqu1ISwyjTWnynmmjTHOSjGVkPRwrhdWq/c82qK3iem/m88viwN0a/r0kRF96GyAWghqIaiFA0fj7pjID4v57U3FjXa63/uwvL0cfzTORI6V5cppqZwIkouAtNSMCsIt0VOJxvHhWkY18rwfx01horQnquXUQ8UDF0YrrnVCPE0KYbo0BittsWeT8SAOiPRayXH4JgDyzgTrGo87doJAiQQlEpTILr5F3kGJHKf+mA3LFSJUh+yDA2L1qcSqlh2lKghUEKggUPv1ypzQ1ruep7y+nF+Hr+JjBJI122Eu8sC8RMoijqQk1DHCg4hWWsYJd3wikpUO2NG4SRrHkW0tt0dXz9TLNvMmGAvJFfVWcqGjDCYoTCRz0lHpphLIw0gPp1Q26UTdjG8WhvseKZfDvDNUWGEDEiaw9K8OEXkqqVbOBjUZzA84uqFnIV4a7nunH7S3GxD90N6uIcw7t7fD6MQe9U1kBrgPwH0A7oOBp4LVH8y3q+oq7PwEo3IkZKeCFeJIIMMZU+BIeC6OBCoiZQ4FamUwnEmczKpAffqPDNKRiUAfD+lEO90cPsxBSzsB56AhmFfQPXx8UO9uXp06Aqzd+QFDCwwtMLS6xGlPaETQXMl7ehMrmwVViInFhmtOACbWqEysrSg+sYtB0zuBEAYhDEK4i7ezSwlbgxDe04vhbMqUTtatYVx4Q0Mkwbh0RXQwxEphdZxK8z01kBT+pTSxiRPf2xiI88XLi4tFuEgPAWkblYdRDOdbgcSNjsrfkIkbhVg+A6IfDJ8xGT7gUwef+thA3oNPvWv58FGpAaY8mPJgyncx5U9oUthekozdoi9EvaQU9MtnIXoH1C+ZINQShYKh1AXB0utghSCM6hClmQr0CR4ud+lM5CrtEJyLjNnenjTJAeOYV5RajaPEWMbok0gwyvmgJ3IaBiwQqZ0rd8iIKJfjn0wn8B2A72CEcO7uOzixeW3rhwcXArgQwIXQJSUPt3Yh7BwAaya1eLeYXyzCcvnKLJ5PLp6mSiCjiTDWJsOJOKG0l8rbSFSwbiqaohiwd4Q4Tq0mwClM1PZFtrs6Y3qS4D1+CxC0IGhB0HYZwkdOE7RfRiVVs0XELiIUWUiPKqUQzsdouJQIU4utxoJORKrK4TLcmWwoHgp2vpxEo6wbESMjNcJK60gTeC2ySIVgk2bIpRZTyRAdbgwWq2VOifXH2cXtdrUHr8rDcHsKgesQXIfjA3Jn12HVyvVUA+YLWCtgrYC18kQjChLTuKgGENcf76c3XdI7GduFU+I5kdZrji1VEQvPksh03jjHjJ5MFxgyXBZRk5b7edAUJjy7EwyUwhdYD5crBGrhAGphhmcbSYRWETHHpaDWYx0Sq1bRYceInIqhrtGoAP3KLAMA+mRCZT1PZdQmD8WgoTb5eG1yITmTcjgWCjmTzTjoOXImC6m0hzr754LyQevsjaRRR6Qljj6IYCVjiNCAEZLK+sn4MIZDv8hV8nyY3y5c+GnuKmn78FXJiO+FZlmNRRHEsCM2MCsD58EYFYlICgxmUSBAeWuNJddpeON9fj2/9rP1sndXBWsuXemV18eLyEwdcAA9JKaexMZ7S0wtfi70gFiHqdD9R1zyBOs2FToXzYEcBshhgByGLhnX7bujjDV3QeZSFwoJ7GpI9xud/IS4bhe9cFyAhrju+eK6EGSDINtkgmwQZoAww5MjG8IMzw3lEGaAMMOEXa8QZoAwQylYhzDDE4UZ1Gl91SC8AOEFCC/0XSJJewkvLH9YzG9vxhBk4Lkgg5BU+GQMOWK8sVoGFI2QxmtNqLdiKuaQGq4rBlen+c53gClMhnYlF5RGDtk4GgJoTxlAw0ohia12lmhssLAsKOWEJigBmrGpWPcD+q72RfBP5vriNj3Lj+baX6Yb7b0u2TPbiVbgsxoy7gA+q7H6rEzkWFmunJaJcQfJRUBaakYF4Ympe8B6W6y3MqLWOiM4rvqi2i5Jlvfmvdpo9eDDAh8W+LC6pMiKDj6sUTUmzk4IhMbEfYtTaEz8FI2Jy0gjVAP2O4I8wmY2/TnyCKHPdt9MGfpsH2PJ0Gd71FY6xA0GiBtsMklUR1scem2DEQ5GeB9GuG4xGehx3u/V1fx6/93vzeUy3L0cg3menRtUSKr9gOVRkGo/nlR7iYVT3AXPkLTGW48ZQyy4gBRLBv1UzJzhlESZ86ucxiALw/sZKJjtylmG+3W4EwDe17N5X7fzy1tOITrlzIDdBHYT2E0d7Kb1sOOeDadEkI+JehURzayybJ6LDaUwdoghxZlNSqXFTCODMKFcCoW9MRORsXg4b7rKJZx3hlNh0vi8xIQ6fnAujBb6Z3UugGkFptXzMq1IyyTQjsIBrCywssDK6hKdapEi2uysrjsxBf/2elTWVbb6mXnscJDUUs6wVumF4V5qIr23nPqpZN5hPZx1lcsoOx1HhUniM1ERsvaG1Dgha2/YrL1kM4VqzGaQmksjkMeMayaMdMJHJwUguK1HoNYeyOxPun/6aGJDr8xFcWjuSC3wBoA3YFR47r3MxRvjOLEKaYIxj4EmLdsbr4XGzhPPJ4LiASMZtbbsQ47z3R8u3Kyv3l5/NpczX8+C7v6sOJifh4h3CQct07FP1e3BHQbuMHCHdXGH6TO5w36Zr56TRyw4Zb3TxCLMFUbKYGRJkNZwTzALUyl9GtIjxvry5exDqTRJfTZCgl8M/GIjAjr4xcaNYPCLgV9smsgGvxj4xcAvBn6xs/vFCD6jX+yheg+uMXCNgWusi2sM9+0a+7i4hTYGY5PPUGkwVlF81koDKiP31FMqeCSSc8+JFMx7Z6LRhrKJoHs4G0rm2oifxB8Lg3v/BAQfAvgQRgXxbk0M6DlspwdHBmwmsJnAZuoyRBB1sZm2V6OZIJg1jwLSOCIsBYmM2hCkNwxpxkmkUlo/lZEmA3YoeDRpqQ1aCpOknWgF/QVeDJcHA1b/iKx+sHrA6nlWVk/VTLeb0XOf9YN9A/YN2Ddd7BvVl33z8ctN4h+3V2Owc3DOzjGBaewRJphzhaOW1ISgNKPYWGlInIjIHG7WlKAnq+5fQVOYCO2FZjtHIkJ9ytTd+iBbQbaCbO0iW1kPsnVUQxwJpFeAo2W0MhUcLeBomRaiOzlaRE9KIQwSA4UQFMI+FELeoh/+u8X874l9bF6NQfdTOd3Pc4k14SR4y2JwyPIgNHEO24CiwFPR/agaTDzSXEP2PXAUJhXbkAYqwqEifETQ7bkiHDEbhGReCx8QcgQ5FmmITCcLRVIKFeGtEVyfsnx5ezG73v747nP6yJvZ8qYS+QVy31NIlMOwkFR4YoMjxhurZVIYjJDGa02ot2IqqgMbzm2UE4/bm9SNnl4WmnjWkVwwfx7mz48Q1R3mzxff4WA4PEOHgxF3OMhYjlQJZDQRxlrqAnFCaS+Vt5Ek49FNZdzEcOdA5EoF7zu6Z2G53o1FsvMvFmG5fGUW5cYH+iJbDusmcqwsV05L5USQXASkpWZUEG6JnkpZyIBYb+WwXWuZ1abs9vF9WN5ersqDej9U2wbHZMshZw+8ihAHgzgYxMG6JEa1aETzYX67cGHdEGq++O2VWYYH74whMpbNiqJOB+oYp4YbZgTBqAqIoagVxpGbqWQb4+EiYyI3U+shXB68KlhN7E6xbBSCBkVp+jvBHaGBSoqFjtYJLagmfCrWEBvQzZXT649yxMLQ3Y1Yu2yplr04jqwLKiKoiKAiDlSX9vAsvpktEkeZL9LxHZ2mmO2/UYgYHTB/HqTocFK0eAtouLabYACNzAAimpEQHA5CUqs1CShgRJxWzHsSCNSGtEZ4rjq2qbgvDeN90OzUiuJm64NVBFYRWEVdrKIWww0fHsmKIG9X1SfnCzCLRihcwSwapVQFswjMosmC+8xmEcWUJG7NA4+c2MApNQwpRChT1FoO2aKtEZ4bnNpY3pcG8l6IdmcYtZx31fAGYBmBZQSWUQfLSMlTLaP3wd0ulrPPAQJH45azYCGNUr6ChQQW0mTBfe7MOeG1osShZCRp7JDjyBmjrMVGSaemgvDhLCSZI1ZruV8Y2Psl3p3FpLtYTEdvBJYTWE5gOXWJKZ1sOW2YS0UWsJdGKHXBXhqllAV7CeylyYL7zPYSxtpSFgjhmEcVCVbOWu2soz4QryGi1BrhzVX+g9K+NIj3QLJd0VEn0+jA6mAQgUEEBlEXg0icbBAdEGlPbw9lB2IVojcOZw+B3vgkeuNGpqpOMrV2cRCpIFJBpD5JNe+DV/cl3QiEatbJqINkhnHhDQ2RBOPSFdHBECuF1XEqzeWHmjL5S2kSESdet0sVfHlxsQgX6SGOdOqTNOqItMTRBxGsZAwRGpI6J5X1eiqdtDFGw2lyzYvqDnOqwpDbC83Azz1gx3iwV57OXulYanvoBIHJAiYLmCxdEsobeQE3U0+q6+3lT2a5erfm4ldXs1V67MfvjMF0YdlhbkZ7hZ2M0RHFGdUeE6pDTOLVOS7tROQrGS6QLOvFxWnoKUzU9kq7rFqpmRQ82pD0Sm8VNcrFiEl0lmHqjJsK7AdDPW8mS3ZvbF8XB/BTyQSjDWG04Yhg3PNoQ84tplg7r7g1xlpnpXfKCmYpE1xiQHA/Rv5GeK4n9n3lOa9CTL9c70VaP/19peQXh+geKHZn5DeOSp6i14CxD8Y+GPtnT/l5dDSrQ1h92bBJ1f76cgwmfnZeO+bOaEuci1JhptMvMVfI4xiZVCJMRboO50JntUfpwVTccr3l7YiTHUCZsEkEiYYGiXCyaRiNDGMX1rF2iQC3rXBbXFS9Gvb74ctVnF9X613dzK8rLW5vXvXm9Ydbu3SLmQ1NixN8FApF4g1TQhKEIkrmi7TYahed41MZ9quefNJPGzlcGL57oFgO4pIZKzhVEQeKLTfIG8SU8p4gppmXE4H4gC7S2mLAr1ZlZTa4RfqD5f3rH8PlTYHg7kasHK6FpMITGxwx3lgtA4pGSOO1JtRbMZXMqQFxrU4bP75cD+4sD9kdyZWfVR1YMAY5h4MzlDvuLGVGynSRfkJYq5+cwDs29PEfs4vfvt+i7Lcfwir91e1VWiJshtF++Y/FZXEA74VmEC6AcMGYMd5HuCCXlWMcJ1YhTTDmMVDpvU8qitDYeeKnUvuOB0O4qvVKPQxYfveHCzfrq7fXn83lzD/4dXqgtNYqLO7+rDjQn4eIrWv5mhu4ECuDWBnEyrokxpKusbLq8sfV1eXm5eb3Y4iYiWxSbBneXQLe3fEKW/DuPi8bCry74N2dJK7Buwve3YliG7y74N0tAOXg3QXvLnh3wbv7hN5djFgf7t06bxI4ecHJC07eszdsO3YswcE7PgkMDt4Ry1tw8D4vMwocvODgnSSuwcELDt6JYhscvODgLQDl4OAFBy84eMHB+6QO3satbdt4ksC5C85dcO52yeDFfTh33y9X4N8dnwAG/+6IxS34d5+XFQX+XfDvThLX4N8F/+5EsQ3+XfDvFoBy8O+Cfxf8u+DffVL/Lu3Lv7vnTAIXL7h4wcXbJX+XNnfxbmTflvdsJF/1IrGZd4u5C8vlGFy7ONvN3HiRlEqCJGYkUCcVUjgorZHUTvCpTLvRT+0faIyXwqRsV3Lt2h3xduL06MogRkGMghjtIkZlWzF6R6SXcf241at0IL+KzKcXpejFPzfsRp/Cbo58QWA5wHKA5Qw0iqiZ1+rpOQ7JKe+FuIapAN/waBX4M/uGC5ksPNy0LZgs3MwuPXmy8Entd5scFNAPQT8E/XCgzgy1B/LOZNueyFHZpK1LBpp9ReA6wHWA64yC64zRE9Yz1wFfGHAd4Dp9FCqd7gv79Xpjcu1nKv7XwtzcjGNAd9YrZhg3XDoVTSTKOS8tDzZ6JzRN/51MSBsPV60kW/h4jqKnMEdCr7TLecoi1dobJYQMNngXKHHeOqaDUJpKricC+wE9ZbWpCY9lCQA9k8nRnFx3mZHdXGdHzhAolqBYgmLZRbFEHRTLH8Lq3WL+98RqPu6+6pvZYhQGbTZLkmIrtPIoWbuKEuRITLLWUSuMp8pjNBHZSuRwgdb6bW2Lm8JkbE9UuxO1pKOoPXAHELIgZEHIdhGyupuQ3Z3Gd2b16dWX9yFdzz5XH67eGL20Vd6gGLTizCLjOCPaKGNtErzJtuXaTkTaDpjWJFlLuXEEQIWJ3b7Jt5O/1QHsKn+ztwJBDIIYBPHTpBSvT2eVvvU+LOe3Cxc2337ksrfqduWw80pKSqVF1ttk70bNKLfciKnU4o80pfgAZgoTtz1QrJ80zNrFQaaCTAWZ2sW4bV1gf+9AVpxpw0YqFXf9R68332UMopXmRKsw2lgpmQpMEBJRYBhxwRFPEpYJGSciWodrc8N1i9Zb1XZs8LK8A0xhcrUzvbJNnFQMVDjEECXcCs88FUmP9EQaGRg1E0E3Hy7/QBxvjdCQMRaG8/4Il+8+ybw0jnlFqdU4SoxljF6SqkbNB8i3ac3O69X+A61C1/pPNK68isuT6XQX9jupWUqjIwPGERhHYBx1MI4Ea24c/Xp9+WXLOf4I7rb6xPqojsESyjoZGWMqKmOj1RYhFqkOjCczyCBLFBJTKeomwzkZWa1qfxQnhUnOE6m0lZtKtBObhxYEGQkyEmRkFxnZYgjT5sf63L2ZLW+q9Z9BCZOklmiHIqOEWIyV4Z5KjjUlXjnNp9LYhw8kH38pUdB9+HIV59fVelc38+vKgts7Bfuv8+4OxGwQknktfEDIEeSS3hYi00I4SamYCiTpcDpb7dCfPN8qDccnkGinrbVssF67GqhqoKqBqtZBVeO8rap2z1/59ErarstF1cy2PTO5+yrARoCNABvpwkZaNJO+C1rfne4RMJJsYogOkhnGhTdJoSbBuHRFdDDESmF1nErDiqG8ocVZezidjrer6tfzxcuLi0W4SA9xZCyocNhyRYxRyCDOEUceUWKxskFSP5XgNabDha9ZPbkOMqXCQNqWPDn0Yu6MtsS5KBVmOv0Sc4U8jpFJJcJU3GMDho9qFY1DenlpyG1FnK37QbacEPHoBIDNADYD2AxdSreaRImajlh/egtCZONFzFjBqYo40KTXGeQNYkp5T6p6Li8nIhAxGa7nHa91PTfFS2Eishuxslm2GBmpEVZaR4qptcgiFYJVwXKpxVRsYzKcqlfLrx6OtX3wqjgwn0Ch7Px2IwORlGAZvCNWGRpd9CQqihjVxgOC23Lm2vzn18Z9Cr/9NHfm8t7lr7ZqTrR+ozgcn0ynbBqAVTFq6jA2ydB2UpqIHcPSMMIIwVNxHA2H5vqWXsdEZ1Wr9d3159lifl01uSwO2z1RDRJehtQ8IN/lPPkumaJMYxxPOgfSBGMeA5Xee5MgrbHzxE+lmwceruZY1bpXHiqH3/3hws366u31Z3M58w9+nR4orbUKi7s/Kw7m5yHirudH08SvZuYp+GHBDwt+2HM3jG6tuT29QzbfRqsMM2nAbGmwk57UTmrZMLrlHUDIgpAFITuYkK2hy5vZIvGa+eLLPeKMQMiynJB1PFAdiMEaEx6cTLI22bRcCaQYdnQqaUBDVcktX0ja9jjtfvf1rXLzhHqmXj4BLnLmQzBJv3Q2IBbTvyoyJ6lGgpOJIF+NRr1syjELg3xPVMu6MDlDQhCiEnuXjEcpKEeaI4SI4TJOBeoD5inXhgXv9mx3UWgmS0vqgPN9wAAS+N7H7ns/wUHQTEaAgwAcBOAg6JIN3aQQuwVdwDcwCuELvoHnIXUH9A04S4kJCOmkfkoULEdMO+sl8YqmAzCV5oqYDugc6CpFSoN7d4KBSwBcAiMBM7gEwCUwaYCfNx2vaeuk5tIBnAHgDABnQJdsgSZTLdsZJ9+btcduDH4BnvMLcGpI+p+jzkiqpeZCC8QVJTpahfVUJLDUwzkG8upRO/QUJnl7pR2YTEMWM4HJNIzJVEiqy2gKTiHTpd6jNUCmCzgHwDkwOuCfyzlQfABjQI4P4YvhwxfbfJimA+hP0vnBEQaOMHCEdXGEqd4dYaOaX5AdMlVIigwZLo4KOTLPJEcG3GHgDhuzO2yjPFb8/AzKI4ylAfUR1McnjKPO3W3V9ODjwlwv43xxZeyOk4xKeczOrBHeeV41mLaUKIqRxV5Hx6RGAenAp+KkwWK4jtNNg4GN4FOYhO2VdjnN0SqEFHbV4JyoFKr89CxqRJSiMRBlJoL74TTHIzu3WSL96vA7gPpeaJdDfZDSYGcIckEyrSRBDEXrEfNCYmYDoL4l6nkDYr2fz1eby3vCujSIn06oHlzwDaQF2FBgQ4EN1aUwlXaxoYLfnMf/Wpibm3EM6smWpUaqtTdKCBls8C5Q4rx1TAehNJV8Kn0h1XDpp1y10vwfAaY0edqRXNmhomX4BAaMJ4FHYPweAZjv0zdHh/k+zVj5Oeb7gH8L/FujQXjP/q1NPSrv6g7Y04nAAwAeAPAAdImish49AA9myD+9M0DlnAFeSYMklVhQQxlRMQZsEQ/ex2q2/VRkLRtujr3QXazbZcF+9h4pl1MvqWZS8GgDNdxbRY1yMWISnWWYOjMVF8GAxlIzKbJ7Y/u6OHifSiYw/MHwHx+Yz2H4S2as4FRFHCi23CBvEFOVNxcxzbwENLdFc+0sz2ZDB8uDdCdiwRhfGOM7JjT3PcZX08SAjWNeUWo1jhJjGaOXpNKffZhK1PipNY1DWUXlOmBPplMOzYXkQAyIZkiBGEsKRCE9XGDe+rNC/JlnvoieI2r3vIkQXIPgGgTXOgTXxElzXx75QZ8+kpatRiwkrCAkxBXGJVnPEVcopS/LcClY0JblebRlKcQzMFwCOXgGBvYMrC0idfLIiz05AdYPWD9g/QzWoGVzmpvmE4/cJCokkR+j0ZRjtYNPYaJ1sFYVheiQEF0aKdDPGV2CPADIA3hueQCnNmFpIxHATgI7CeykwfqgNziaIyvDyvZk0UEyw7jwhoZIgnHpiuhgiJXC6qgmIlX5QFL1l9KEI05c7+2q+vV88fLiYhEu0kMcUeQwQ45aoannUSHGqEUEM8oip0bzqYR41GhiPG1ZVmEQ7pl60GBiPE2CwCs1Bq8UWO5guT9Py739EIp20gJsd7DdwXbvYrvjNrb7u8Suq+/4bjF3YbmcL357ZZbh0btjMNqz4U3vmdU8RqZ4IIg5TqTGPP3XIRe5nkyhxXCVFiJfgtsYOIUJ2L7IltMeFRUMJStJi8CFMAqLqtGqdT69iZljEwH7cNnNR/T+x5v26J1yNcpeaZd3kiEjNcJK60gxtRZZpEKwKlgutZiKX3Y4m4nVCu6HZWAPXhWH7RModBfhpG3tpIaiAQwkMJDAQBqsv+TjU/nDbPXp1lbvL5+XjVSI2oiHimyC3vgs9EYSREQJ5YwYgYVgkaR/SSCWck2MsROBPRtOcTzSHLQNyywM9D1SDkwlMJVGhOwuplLrhiHNzwlYS2AtgbU0WMlcO63t6e0lDPbSC0LBXnoGArZne+nUOow29wHhC8IXhG8H4ctRG+G7uxiDYNXZCosyzNPhcn7BPD2LeZqpKvdCMWapcDSoyJTlVCXgWh4kRcKSiSCYDwdhWrtBNbytMOA2pkt2ErOkwhMbHDHeWC0DikZI47Um1FsxFbgOmG5eW9V/KI366+2WPyzmtzfFgbgruWCgBwz0GBOe+x7oUUi/2gH5M7SrbcSXz9CuFmtkAuJOK+cN40k5dhJ5j7TUkTsE/Lg1lvOOv4//mF389rOZXVcX311/ni3m11UnofLAfCqdspwZMWSQkh4xIRQXXCoqkLfc0hiUQIDmfjnzXR3ttoHC98alf7+UB+YTyZS1AiNnKhLMOREIGxGlC4gZYRHGJloYUNoay/Lw4M0Pn8wi+Nfzq5tFWC6Df7Nt8FZ5qgsdU9qNWjBmCcYsPS/An3XMkiRtI7e7C4jKQlQWorJdorKtUqJ2F7vhxE8fm812v/OcISEIURIbmcx3KShHmiOEiOEyTiVUgNFwVSIsb5juA6QwKdmSOhAKgFDAqODb92zvMnJjoHRjRBDuNzemEGN8OASDMT56Y7x1GvVDtQZMcjDJwSQfbKzxwejJ09vmOD/XuIxoJKbDGecQj3yyeCRkPUHW0wixfFLWE2RYQ4b1VDOsvZIGSSqxoIYyomIM2CIevI/EuTiVEQ3DYftIF5gjMwFLHkzSI+XACQtO2BEhu2cnLOT6Qa7fRHP9ykhQGJA3Q3rCMOkJnBqS/ueoM5JqqbnQAnFFiY5W4cnMqBgOuUda4tS4v3e/+/pWqQ69XmmXRb2RgUhKsAzeEasMjS56EhVFjGoDmkhrTaR25zay9ae5M5f3Ln+1f0/3KlQHOZVOOTQHTR0RngprsUGKc24dIUKm18RJTgHN3dF8vZxfpvss5heVgvjKLO5fl8qvT6YTJExCwuSYgNx3wiRJr7W1jCIhOaNSROcwqXRsERgPk+nSORxHrt2gtNhFusmP5tpfpp/p/e2nv1ss5ovl9v3i0NyNWJBG+WK45rOQRjn2NEolT02j3Ms7gXxKyKeEfMouJY6tZmR93H6jihhjSKLMFzhazl0UgWOhBXMo2e1UICSY9Uz4qjn2JOQqwcNpjDQflX8Ij8IEZivaQE7CCwE5CaPBbs85CYV4mwZEMHibhvY2gVUOVvn4UH7e4sbW49nuKzVgioMpDqZ4B1O8StRoYYpXXU43z/nbS++r1dNzL+ZXP4W4GoNtTnK2ebRBayqkDRL76LE33EdrolXCYu2moiHi4cRrfXyiKVwKE6PdiJVtiq2sQUoj6wzxSrgoUECEMM0dDRTrqQB7uHkxR+TD/b16fbtcza82L8qdH9idYFt9UNPW+mDu4ICCCAoiKIhdFMRWvS8anPOnVxKzY3kLkaVsOD8iyNInk6WtMx6Org3yFOQpyNMu8lT2IU8f1Jo/vUTNtpXSQTLDuPCGhkiCcemK6GCIlcLqOJXQshxIoP5SmjjE6cTsMvBeXlwswkV6iLxDRCb1zUrMtA6WE4eiC0RYYg3GjkYzlZ4iWKDhtLhacrVjVIUBtw+SgdtvwIwHsFSezFLRfVkq904P2Cpgq4Ct0qXvbbs87Xsn8vvZHx9Wiw+z/x6Fwy8bFeZIGW6oFCEYpLVWMamKhjvFmPN2Ql1vBxOj7EhS8gGcFCY7T6QSKIQQBx4xqnvTCFX7vMDaEwNKICiBoAR2UQJPzhB8m77c3I9fAzQOc86oUTzJSMNl8NrigITUyFPMplKzN6QG2DzV7Q4khQnKU0gEuh/ofiOGdH+6X6ccwO1xAcUPFD9Q/LoofvRUxe/dIlz8XN1j9KofJVFFZzEmJlLCiabOchppINyEJFGnIjUHVP1qR4Ucg0lhkvI0IoH6B+rfiEHdn/rHu6h/dwcGFEBQAEEBfJLa4HQGb8wifJjfLlzYfPGRK4LeR0SUQkFpRzCPwglilMLGcCWEm0rnjXHWBtfApTDZ2Y1YoBiCYjhicI+kNvjRwQEFERREUBCfxEP4v2/n6QuGlRm9YhiDwoJSqgg2CAeOLFbUU2ukMI7FqQwYGqeH8B5MCpOZpxEJFEFQBEcM6pF4CO8ODCiAoACCAtjFQ4hOVQDfh6v558oKC68W5vewHL0eSDBnUXGBk+D0HDkmGKImUCEC50jhqYjPAR2EtdvaEC2FSc5OtAKtELTCEWO7P/cg6aIV7p8bUA5BOQTlsIt3UJyqHH5YLT5+uQkf5/+xuByDYsiz7Y1oYMEY5BwOzlDuuLOUGSnTRfrpJiJBh9MLK6/yUaBsBdlvP4RV+qvbq7RE8JvV16ApTYb2QbOcniicphGpqoM6V1EiQwNRQjtMuLEYTwXlhAxn/tQOkG/ADwuD9sl0ArMHzJ4R47oPsyeTz8YZEoIQJbGRjEcpKEeaI4SI4TKSiQB8OHbN8mxod/FjuLwpcRBaO+rkkBukNDixZeSCZFpJghiK1iPmhcTMTqUae0BFowGx3s/nq81lwf0aTyfULiypujig7msv4HwC5xM4n7o4n/SpzqePiUAf56/nPry6nLvxVy7woATx2tDoOSZCMKGscJgZYbFnDPrXtReYrLFm/ggspYnMDqQC+xzs8xFDu7+wJO6iFe4dG1AMQTEExbCLYnjy/JXNSfwx7W5iI6NXC1HAzjNPFMEqWGUDU1I7LaSXSnMCdQs9+VGaQKUwyXk6oUAlBJVwxMDur36h07iLB4cGFEJQCEEhHHjIxSI9789mlR52zZAWY9AGWXaqLWdBKmKMlERSxbFFFMVIWTAsaYRyIsJzqFFRxc3gI4m7raG/wfv2R8NchIQ1FgW1VHrGuLACESEEEkhS6vSESmeGm8bXaHjIYy5VGGpPpFJ2siQzVnCqIk42h+UGeYOYUt4TxDTzU2GkA2Yn5DsfvaqUJ7dIf7C8f11omk03YmXzxYxxnFiFNMGYx5B4tffGa6Gx88RPpv/ZYLhWtfp1Uqvj7OJ2u9p3f7hws756e/3ZXM78g1+nB0prJb5092fF4f08ROw4YWhfYIAFDhY4WOBdugickKuzq2XZ+tm2L+8ZJE9vkOOcQa44ZzIg5wQl2nFMAuJaK0YExjKQyTSeV8N5s5ukohyFTWECth+ibQUqRidmOhy5AQhYELAgYDsIWHVCI+/6M3lf7o1AxNJsYXaQzDAuvKEhkmBcuiI6GGKlsDqqiYjYoSRscT5vnNjd21X16/ni5cXFIlykh8h7UZCnQgatNHNaqEgk8dg6qhISLUVkKt5BrIYKtGy6SPTBrAoDb19ky6G9EBtmQKyDCfPkJsyJLeaPHiUwYsCIASOmi5fwhMTt3al8szD/eLNtebP+/M/h+nYMBoyCzlIDxuSgs9QJ4vXcnaW81kgHjZV2SirCtZWaRRajlczrOBWbiQzYQK1J/v0R1lgaynsgGZhKgxYvgK30dLZSRmfByEiNEjfXkWJqLbJIhWBVsFxqMRWn63D5caxWE32YAvPgVXGgPoFCkOEJGZ7jBPP5MjypZlLwaAM13FtFjXIxYhKdZZi6yViTA+K6mWdm98b2dXmIPpFMOSxzakj6n0u4lVRLzYUWiKukW0ersJ5KtvJwWJb5/o01Xsbd776+9b1xq/niS3EA75V2kKMPOfrPC/5nzdHXJxbKZ101EIqDUByE4rrkE54w9q/uRO5iBBsKPH00LjvnRfGAk3rJDBaBEmF9jNEJEhyTESk2Gb/AgHGKJkPtjuOmMHnbE9UgWgHRirEj/fzRijIyLIbzI0CGxQkwP3eGhabMS+OYV5RajaNMXDxGL0nlA/ZhKp3zBvT81np8Ht7k66CIchn4yXQCLxh4wZ4X1M/qBcPoxMnGx8wA8ISBJww8YV2S0jtU1lYkSerc683jL8fgAMvW0zqOhRCKECR5CNJGziTmzgREVECBTUTwDjkCtk2R3iO4FCZhuxEL3F3g7ho5wM/v7nIxsWnDeJCaSyOQx4xrJox0wkcnxUSAPiADly1TT++U/FemwLkQ3ai1SwnoWKG7JxrABAITCEygJ+rel35ffTC8S+z7XjrzGEwhkTOFrCTCxWi4Cp6bqGnELrh1wQAWQdGpCNIBcwHaKD8HYVOYQO2HaGAagWk0JaCfZBpB1RdUfY3WtwVVXyPCNVR9NUI0VH2NH8tQ9QVVX2NBPeS7PCv4nznfpWMj+QO2Lvh6wdcLvt4n8/XeZS5vz/9FWKcuP72vNzs6VTmCkePWMY2Z4ek66aBYSJJeYWcm4+vl43SBHYRNYQK3H6KBrxd8vVMCOvh6x+BHAF/vKHy94CkAT8H48D52T0GtpgSeAvAUgKegi6dA9eIpeFDj/PSOAp1zFESqtTdKCBls8C5Q4nzlNQhCaSr5VMqshxO/XDU7THtY+a+FuSlSsexIrqxqqaRBkkosqKGMqBgDtogH7yNxLk7FNzBgvqPusllFT7brj3KQODMkN4fEmadKnCmlzdGAIQzoc9SecZ+7zxEEMCCAMQacnz2A4TlDQhCiJDaS8SgF5UhzhBAxXEYyEaAPF8Bg+WS+3UWhEYuW1IHxUDAeakzo7Xc8VJCySvshyAXJtJIEMRStR8wLiZkNgOC2dmEDYn1tEliw4+N0QkHQGILGzwvrZw4ao96CxveMU4gZQ8wYYsZdYsbs9Jhxxa7eXd5ezKo47vorjCFenE0sF0YbKyVTgSVbvmrNhREXHHGbdEoh40Qk75D9FPOhoeOIKUzKdqYXeGPBGztyjJ/fG4uS1S8kSyaTDwg5ghyLNESmhXCSUuiq2NqnVZshveE92x/ffU4feTNb3lSKRYku2RNIBCNCYETI6IDcYUTIphuo6GbKP9ZqwIwHMx7M+C7TQenpZvy7xez6kQP75fKn2XIU9nx2QCihVY6V9JQxwmhU1nnqHFNCSso4xlORoQMmyeYzmltApzCp2h/hwMIHC3/sYIcxoc/NOoL02RNgfu70WchsgcwWyGx5dniGzJZnhfUzZ7bwbu6wjC0AfjHwi4FfrINfTKDWfrGfzez6uz/SEy/Xp/zpHWDZqTjeE6OsRTwqZKTy2joVVDKTNCZB+qn4A4byf/1SmmisePwa9neQ/+2lXa4Wxq3uHYJsh3iNorKKCcykI4SRQCTijCspIqJ6KilVWAzng60vn8iyqcJgewKFoPEATOwYG4zP0ngAyv2g3G8M3Pjkcr9CnEjDhbjAiTRiJ9Lhc4CVQhJb7SzR2GBhWVDKCU2QF5IxSBBsrZXs86mfzPXFbXqWH821v0w32ntdcsuvTrTaukYrcJ7gGX2guIMLFFyg4ALt4gIVJ7lAq4vvrj/PFvPrKqI9ekco1sgExJ1WzhvGI1NOIu+Rljpyh6ZSEcLVcNIy34LmMFJKk5Sn0gmseLDiR4Tjnq34QuICT41giAqcLSoARaZQZPrci0xh7lbfWjHM3WqhGsPcLUg0LQjvZ000rb7Fid7UPdMTfKrgUwWfagefKjuSVrr5Uf1+vhiD5xTjrOs0KmwwlyTygB33GIvIiaaaEBzxZKZtSz2YMCX7+/oQEIVJxSPUADfokzuRwA16NjcoOJHAifTcnUieS6wJJ8FbFoNDlgehiXPYBhQFhtknbTFMa3uFbG/ybjH/e1p986o47LYhTTZ5DnvMIjLEeO1FMFRF7iTmWNDApJqKg+gJK+v3E8Lefbq526f1j1KdnicTKofn6IVizFLhaFCRKcupSgpwYsWSImGBB7fmwflg4e6iOPg2pksOrYnrBm0tS9CUnFEpYtIWCHVGisB4YIDWtty3VqVLi12km+wYy9aoTp/+brGYL5bb94uDcDdi5XAtJBWe2OASwI3VMum/RsikYmhCvRVT4cLDlabUD1B/eJO6NjTLHxbz25vykN2RXNleVJo6IjwV1mKDFOfcOkKETK+Jk3wqbuABefbjxNDr5fwyVGbMxSIsl6/M4v7198at5osv5YH6VDpBgsALAQkCzwnqwxcRSsOVpiFpKcQpp5hRHlnFAtXUa0LQRM7BcBoL3e8J+fJtxZw+z5JZVG5D2IZU2aayiAaFgfeDhJCwAgkrkLDSJWFFNk9YuVOvnj5vJdv7H3OjIkcWcVOZLUwKpozEEQfPlJ+Mj0kOlwNK96lVC4vSJFsjomRDUWXkVw2ngkF6FaRXjdPlA+lVA6dXCYYtjUIF4XiQidEqIplQGFulZbRQ39SD0/LR/rwPcXuTlzezza+Kw/HJdIJxEDAOYoRw7jAOYuPS0e1cOlvNGTw74NkBz06X9k4q79k50rbtnm925O4ehHRVyI40JsY4h4ghLmBR9Uak1pipdENkAwrHfZ99c6yUJh1PpxS0HR8ymwjajjeC8xnajktknU1GitbBcuJQdIEk5mwNxo5GM5VBJMNxZ1FLrL0ZUmuNYzdgc/2i5J61fZAsW8vnqZBBK82cFioSSTy2jqpkrFuKCDibWmM83x8mN0a2aJz3RDZwRYEranzo7uyK0ui4K6qpAg/+KfBPgX+qg39KHmmV02aswNN7qGjOQ6WTpDSMC29oiCQYl66IDoZYKayOU4mmD5VyXtwsRpx43NvVJjzy8uJiES7SQ8CImKoNIh3QhwRDYpqrat2GxBTv7B+uegd8/YP4+jf2R4PqhuYHBSwQsEDAAukSIdftLJB77Vlez69u5vcatDy9AcKyIXLHHGPWcW8YIyayqj+XF1ZQwhGyU+k1h9FwnTw5a97MZx8tpQnODqSCJHVIUh8RlHtOUo/cReKtwDxo4akRxIcoXdUYKXjlIDbemivvJ1/XsppPN9uXH8JqldZeFofjk+kEnTUGRDN01hhxZ42NRY/bW/QHtR0w6MGgB4O+S0iRnGzQbxnOK7Pc8pUx2PT56RzCWSRpMuSdRhxLJrEgLplEiHJDgrQTEbeSDKg+yuaWag1iCpOsHamVTTIL3CkbtJIeG8ZQ1W4wqqoDIRE66ZITwTZGaDhsN+gQ+dq4T2Hzr7G7ZT8uzKzAVPiO5Mqh20WEIgvGBSmFcD5Gw6VEmFpsNRZT6fshBvRc7bOimptsfpQbvzyJRjkYG0msDYxaR3HEymAcMEVVsyWFrOBTYdJkuKBCfZ1CA6ZTLqr7IBk4tdJeglfrOcF++H6xWCsvOEFCKsQEsZiIgBn3iilGxWRqnIbLvHrEuY6bT68vzXL50+z3Ui3OPkiWbRolNPGSKicoNS5qh1VAnjJMpMBYQjyuLcblfkHa8Q37cGu3Vz+H1ae53/4oFPH9EzCr0VvNqBM+nQNlmI6RhKA549ppzpGbSufUJ4zgtdm+d4vKHXzvotAzcB4i5s6BipIFZy1mGAUUKuNWBuO5MtwGaSaj9A92DnSXLVyL8Gr0x8pcrx6+KvREnJuckHX3Yrjm2pB1N3DWHU9c3ROCpabSV/8mXQcxRb3iASE/lcknw3F3sR8rOc6O3n2NqBdcJtcf4Xb5SKxTPtL2Hl+jtJCSBClJkJLUISVJ064pSXvBi935/zKiaSz5PCXKtWBEWOyl8V5wbHVSGaUQMkphzVTylLAYLoQi28uNozAqTPSeg4TZnA8V0jFwyNpoCUEcBcSQF0zyEBBG0DartdLZIJ2hNvD7Xwtzk9YsFfi90S3bpqGMgtMBM1Oh3PSpy025kYFISrAM3hGrDI0uehIVRYxqM5l0p+EwXT8pZc17fpo7c3nv8lf793Sv9RvlAfpUOkE6RzJWIJ9jvMg+dz4HxPEgjjdm/D9lHA+iIBAFGccp6DMKUnwi93Bxa8jjfp553EyaqCkX0mkhJaPIeIMIDiFo5GEeS/tzcKwvZIMUzTdfrs3VzBWd6no2OkLGN2R8P59jABnfzxr/kPE94ozvdY5U0v77SJI6Eg2GzCnInILMqS7NnLpnTlUusd3hf/osKUJyWVKFxGMEhQLbEQvesxfYltGzjOjh3HDQswx6lg2J7QEZOLQsG03LMk2Zl8Yxryi1GkeJsYzRS1LNpvdhKnOX5BMnPz28yddhpuX2dzqZTtCA7wUZDs7QgO8JGvAhLCz1PGnSyNGkeOCoFcOUJmWDcMsmE7x4Qo2jpZehMER3JRd0l3yB1dP5Q5rqh+Wy7HN3lyykmQYdTg+BZhrDNtMoZITVcFwaRlidaBj2McKqkKTo4YamQ1L0qZrHIEnRGHvMIjLEeO1FMFQlfi4xx4IGJtVUkqIHrGlsEUDb/Ci1SvdkQkHdOdSdjxLR5xpzrKkNKjKPLSPaGaG1QNJVbBoFx6ZiIw5YqLVvAeVYz6eb/atC4d0T1aDDAnRYGB22z9JhoZCCQz6ccw8qDp9lxSF0Yej5HEAXhl5PxFN2YSAEIe4RwshbpxxB1ERJpDeauaD9VNK+hzsbGLVPYW6+m2X7JAelbe7UJKUKKeyIMSoqhSrtikWNiFI0BqKmEnQasGq3VgG+qzraLJF+dfidcnMEeqUd1KpDrfozgv6gteqWRE+oZV5JJJg0QkmDmVEUx/Ragx3R2p5uH2PMbV/ZytF5iQk9HKCHwzM7D4NP7cMkcB2JqgK9nCsZolGaYK4iMk7ZyRSXDudn6mLu1W9h2TLi/ATdzYHqp8XJ11x9aGcC7UygnUmXdiayl3Ym9xstjKClSXbwUyktTTj0mB+xzIWWJv1ondDSZKQAh5Ym0NJkstiGlibQ0mRyoIaWJtDSZBpQ7r2lCXR9OLvJCF0foOsDdH0oDNLQ9eEUBEPXh7HhGLo+nI5m6PowenhD14dnmSgBXR+asm/o+vAs8AxdH6Drw8QwDV0fTlJIoOvDs0M6dH3oEoeBrg9N0MyfMBsfuj60xzp0fXj2bB26PvSbiw9dH6ZzNqDrw/kOCnR9mOqpga4P0PWhQNRD14eO0IeuD88Z/9D1oU+7Gro+TOZcQNcH6PoA5wC6PvTuaRqs64PurevD1+pX6PwAnR+g80OXzg+6a+eHN2Zlfkt//epy7n7fEODpez9kWz8Ez1n0ivtkr1HvBHeRp3dCEs0qej2Z7BU+XPpKizyjw7ApTPL2Q7StdMUI9yFeH90ABCwIWBCwXQQs6Spgv7u+vdrZmk8vWQmBrkqJdQ9XPghdldpLVuiq1IsCCV2VRgpw6KoEXZUmi+0zdlWiRmEcPUIkCkdMNJoQpok3UnIRQ5wIuAfUTk7gRPf12dKw3Y1a0DAMGoaND9PQMAwahk0DytAwDBqGTQ/V0DCsH4txOFYNDcOgYdgZEAwNw8aGY2gY1sHJMZzOAQ3DTtQ8oGHYc8yxhYZhTdk3NAx7FniGhmHQMGximIaGYScpJNAw7NkhHRqGdYnDQMOwJmjmw6XKQ8MwaBg23oMwYCEnNAzrtYwTGoZN52xAw7DzHRRoGDbVUwMNw6BhWIGoh4ZhHaEPDcOeM/6hYVifdjU0DJvMuYCGYdAwDM4BNAzr3dM0WMMw1kdHk6/1U9DKBFqZQCuTLq1MZNdWJndOgp0ohH4moxDHgg3X6QH6mbQWudDPpB+lE/qZjBTg0M8E+plMFttn7GcCTR8GSTZ8eBNo+gBNHzqpIdD0YUxQhqYP0PRheqiGpg/9qNXDsWpo+gBNH6DpQwE4hqYPp6MZmj6MHt7Q9OFZ5klA04em7BuaPjwLPEPTB2j6MDFMQ9OHkxQSaPrw7JAOTR+6xGGg6UMTNPMnTMaHpg/tsQ5NH549W4emD/2m4kPTh+mcDWj6cL6DAk0fpnpqoOkDNH0oEPXQ9KEj9KHpw3PGPzR96NOufrKmD8gbkQ4A1xJTkSwHjLmXDDFEJZKGTqXpg366RMkTSjILQ38fJIPGJtDY5HmhHhqbPPtzAI1N+vamDtbYRPfR2GRPCkF3E+huAt1NOnQ3UbRrd5MDaaxP3+ME61yPE06J50Rarzm2VEUsPIvWO2+cY0aTiUhmOmDueO2ZeniTtPRFVXX1tUq2YNHbnWBQG/ECS6iOGD/SB6mOCFIa7AxBLkimlSSIocTSEfNCYmbDRBAvhivPfJT1n214UDDATyfUkQRbIrSKiDkuBbUe65BUExUddozIqaSSMzQqQH/tsQSAPoFQUD8/oDsM6uehfv55Ixjq5xsy5HPUz6OkFQvJfIJysgld0pxZpCEyLYSTlEL9ZWt+vJ9hs7nJ5e3F7Hr747vP6SNvZsubyj9XYGHaKSTKYZhyLRgRFntpvBccW520CimEjFJYAyG21ml27Y31vZ5KO9v9y/fGreaL8gLN5yBhtiyBkRicCzwQ45izKkZGEVc0Sq8lwnAGWp6BKixydAPb5AwXWoV8NjpCBT5U4I8c+1CB//yQDhX4J1qjfVTglzJ2ZMyJ0TB05LxDRwrpMjFc/01oMvEsm0zADIdBNJdDEehyy3/PM8PBUGGFDUiYwNK/OkTkqaRauWSJuqlkngzog+w5R7Q0lPdOv/zoBxp1RFri6IMIVlYDp2jACEll/WRSaQf0t+x7ze7f5MP8duFCZVmt5nuvSkZ8LzTLaiyKIIYdsYFZGTgPVTcTIpICg1kUCFDeWmPRGWJtiiGSiuln62XvrgrWXLrSK6+PK4GMJsJYS10gTijtpfI2EhWsm4o+PmCueH2Y+8FN1j9mYbnejcW7xfxiEZbLV6bg7jx9kS3b4JAHLoxWXGtlOZUipEtjsNIWexYjYL0t1hsUsty/ibnrmfE+LG8vy5uO2Z1g26JajHgfVbW1xRZQWwu1tVBb26G2FmPZtbj25HaMT19+K3PVt4X0UWXDNUGCRqrnE9ejaaRaSkHYgE4IKAhr6H04S0FYISkfA7qOIeVjbCkfUDJ27lA3lIzVs+xzlIxBuU3foW4ot3lu5TaFTMgZLlEVJuT0eh6eckJOIQmuA5aiQYLreBNcN0EY2ktr0xM9RhCmgTANhGm6hGmqGOpQYZovYwjNYJyLzRSi3WLOQb99ntL8KfVb4SySNKDoNOJYMokFcRgZRLkhQU7G/6GHs/64bL2dXyMNxYG/I7WyDVQDd8oGraTHpkriJ0JGRYW1ROhkvE0E23RAaO97pupu8tAVtXn348LMysuL60qubI1WRCiyYFyQUgjnYzRcSoSpxVZjQScC7uEyTtg+IzqUqltwteFJNMrXWhFrA6PWUVxp5hgHTJFgyqhqxNBUWDQeroD8Ufi3Kc8pF9V9kAzaBL8Yro87tAk+yqj7bRNcSF7TE3JpyGt66rwmjD1mERlivPYiGKoir3rsJV06MKmm4id8wlzUXMO49Y9CO+udTihopgfN9MYH53M00yslD2M4Xx4kYow4EaP4OXgDlhjAFLwTFfIep+BtEo+IHDbxCOYtQ7IRJBt1STbSqr9co5/D6tPc//bmy7W5mrnNq53h/vRJRtnpy5hJEzXlQjotpGQUGW8QwSEEjZLqOhGhPGASRaNJC6cgqTAhfTY6Qmz6BR+uJREEp58gOB0Yl9bS4BJTt4orQ7EJnhsno7KOTKUNLlbDJVmoFkNEDrGj+3yoXLSfkZIQy4ZY9oiQ3ncsG+J8EOebUJyvkNwMGDM0YmSfOzdDCE28pMoJSo2L2mEVkKcMEykwllPxrwzYpWO/L3FH7bE4xPdPwKwlKqXBzhDkgmRaSYIYitYj5oXEzE7FEn1CnaXmJl/H5hQc5DudUJDN8QJDMsdzwvp5u2pUX7HP4PZh5zxEtSGqDVHtTi00aO9h7XsHdHS9zVUutm1J9IRa5pVEgkkjVNJFmVEUx/RaT0VWq+GCeap94lQLOJUmtM9KTOheDt3LRwh66F7+LLwM4EkenSe5kO7lw8WvoXt5Q5YN3cufAceG7uXdIyMDdy8vJEtvuDMAOXq92aZPk6NXSLR8OIcNRMufVbS8kOjigBIBooujjy72Mji5sWcUQowQYoQQY5fCWXzOCOMoKmYxyYUVC1FS01cBNfW5iOhh1dRiWu+j4ZzR0Hq/jUv6jK33y3DKpRMLbrlnh/sncsvBOIre2T2Mo2jF72EcRWdlZjhtHlp+PEHLD5hHcfYcqKZMp1xUwzyKfhSR4Vg19PAYuIdHGZmqMI9ixJCGeRT9aNTDWYvQp6ahnQjzKJ4FnmEeRTM4wzyK09EMLQyeFdZhHsWzZ+swj+JUhbz3eRSYnjupDnp1QCIdJNJ169WBzppJd8+n+vQpdTyXUVdICA4LmAk/JrELbfdPLF9SwwUoIHeoNwPraXKHCgl4QGuOEUP/3AGPQsLSw3nUICw9cFga2jSfO2RXcxNo09yJUHcFpOTsvq47XQecXuD0AqdXJ6eX7M/p9W5RrXTvos4l/vS+L5kdwEoC15EoVGXpciVDNEoTzFVExik7lVo6PlxGmG6v7beEVGEi+vwEhWa10Kx2hMCHZrXPwtYCj9joPGLQrPbcKZPQrLaeZUOz2mfAsaFZbfeOLwM3qzVWM+qEF0kXN0zHSELQnHHtNOfIsYmcgeFaADxKeO1uVZV3Cs5DREifhxadz/wc9JQ9v42w6H4jLA18QhBogUALBFq6tOnk546zjKNVJ84FVwpRWrEYMCET1NbnqLYW0rKTogHDKNCycyQtO6E9Yd/QhvaE0J4Q2hOWWywC7QmhPeH0UA3tCftRRIZj1VAHAu0Jz4BgaE84YkhDe8JnFsGD9oRN7URoT/gs8AztCZvBGdoTPgd/ByRYjDjBAtoTDqeKQ3vCExXy/tsTyiESiqBFISQRQRJRlyQiSbsmEa0jXDur/OnThUh2sm8h3i/BhptrCv6v0fm/CkkFInq4flWQCgSpQJAKBKlA500F0pR5aRzzilKrcZTJjorRS0KNcj7oiYB7OM9YvQPz4U2+9h4rN2/iZDpBYhskto0LypDYBolt00M1JLb1o1ZDYttoIN1zYlshDYmG49LQkOhE3bmPhkSFxIYZxIbHDu8+Y8OQsgkpm2PD93lSNpFjjjHruDeMEROZDSh6YQUlvGoEDXhui2fWfJtez69u5gUjugOpsjaipjaoyDy2jGhnhNYCSVexaRQcm4qNOGC+WouBXely/6pQePdENUi4h4T70WEbEu5PRzMfDs6QcP8sE+5VlCw4azHDKKBQBXNkMJ4rw22QZioHYbhzoLt0uVqntKX9XK7M9erhq81fFHcizk3O3NkgBCHuEcLIW6ccQdRESaQ3mrmg/VQyY4c7Gxh1GapzbDfL9kkOStvcqUlKFVLYEWNUVApV2hWLGhGlaAxETSXoNNypkbUK8F1hxmaJ9KvD75SbI9Ar7bLTMjyhGhmNtENCBOMsc05xo2nUwpvJNF0drojiUVJpy7qbwpDelVzZ4gmhiZdUOUGpcVE7rALylGEiBcYSWHprli46yOqaUb3Fob1/AmZVGhITe7fMK4kEk0YoaTAziuKYXmswkls7i9ozq9z2la35n5eYMB7pKcfCQJ/5HpyoZ+8zX8g46wGdqDDNumc36gDTrP+1m8DSvcnJPcsE2plAOxNoZ9KhnQmuHmC+Yw3t+plsHjjRys/WPOeBY3j/l2+X7xazz4kad2+NofkJzfU+scoS74gnwTLEo7SGxoiZ9A5hT+VUklrwcE0hMKLNJU1neBUmxYclbjbvURHEsCM2MCsD56GK9hDhFcUsCkQmcnAGrMrXGWI92srdVbmBnc70gir9Ae05KNI/W5H+prckQ53Mro6yAmw0sNHARutioxE0nI02TxRYBf+MrDSMNGHCc+8YMszwZKJxZ0k0VrsYp6JsDmqltSgY6QFghYnyockLlhpYaqM9DGCpgaU2LUR3s9TIsJbavrQAWw1sNbDVOsXT5GC22q29nLnnY6hxYoQOMmqBuTNc+IB51NRYoaJ1aiq65qCGWovEja7oKkyMD0pbMNHARBvtSQATDUy0aSG6k4lG9aAm2kNRAfYZ2Gdgn3Wyz/Qw9tl/zpYzO7tMPOT5WGjUJewaSZRV1nAqieYYI00RIZwFDwmPJ1hoLVoLdsdXYXJ8YOqClQZW2mjPAlhpYKVNC9HdAml4OCutRliAnQZ2GthpY7LTGhzan+d+FmdVq+Ont9NwNuWRRRoQk0EJYojBIVlnRBOftE5azX+YiDjGw8nj7pZEK3wVJskHpu45dYAWDwI6AOgAoAN00gFwbzrApoXRBIrSqTBIKUydMlhRpIiKSGAtgiNecT2VidcD+mh1i25xp8OqMJE/DFHBIwse2dEeAfDIgkd2WojuljdDe7XGmgoJsMLACgMrrJMV9v9v71ub28aRtf9RhvfLvp9iJ5lxvc7Ea3tmv6RqCiRBmxtJVFGUJ56q/e8HvMm6UBRAgjQlPufUTnSxuoFm99MXAA19gCzs7I6dG0rgGK4S6q5mGbatE8v1iW0afmjaJAwvpgY7YB4m0Km4i2JNzGkPJVbkYsjFRmsEyMWQi12WRnfLxbr1YW7vJpCNIRtDNtYpG5PXC+yo2Z7ZwXLDV0KN6LYVBI5FNMPXfF9zLJu5Xi9UTOdC/O+QqViHDlXcWjUxhz2ITJGEIQkbrQUgCUMSdlka3S0Jk9vri9NHIANDBoYMrFM3Zq3nDOzbYvb6JYnn1+skYbOszh6dSTaGMBNh5uWGmZbmmFYYKIFBVE3VXC0MiB/qumFrruuol7L9dsiTN/sxVN/4OTFzGF7ASNOQpo3KBLqdJDcGSNMaLQopG1I2pGydFs36TtnOsduX47ka0TTHcQzXdzTiqiHxDMO3Q5P6Or2UUHbIZTPpkRa6fA0mVSydoaYxWhvA0hlyssvS6G5LZ0PkZGjrhUwMmdh4D5PdJRmh9PUCmnpoFlUCRyVEMzSL6KodUFtXQ892bEWxkYq1SMU6nHoSUayJee2hxIpkDMnYaI0AyRiSscvS6DEdJuN3E8jGkI0hG+uUjZmDZGNn19zDtwhxQ2qrrqs4JAhM6lIj9EPT0HXbNO0LccKDXoSzb3S96dbEfPeAkkVWhqxstHaArAxZ2WVpdLeszB4sK0OTD+RlyMtGul+xwXDPrM2Hq4WW5WiGRj3fCByHUmJTRzM9y9Jsn1xKhHkm+xUF9GpibnsgqSIZQzI2WhtAMoZk7LI0ekz7Fbm9BDIxZGLIxDo1+zB6z8TQ7uMMnDFCzbE65l5DTc9VAtsPbM31DD+wFJ/puB9ahhv6oa6E4YVo93ChpqrsP67+EXRiBvEeIka6hnRtVEbQreWHNUi6hqYfSN2QuvW3iNZ/6naObT9CqlihafluaDuurzssotUU1VJ913Ycn1gX4o6HXEbrId5C448B5YqlNNQ3RmsFWEpDbnZZGt1tKW2Y3AzNP5CRISOTm5FZduuErPjnNzpjPx9DhmU1ZViqGrDYUCEaCdzAokR3QtO3VZP5U2rYjnkpTtXWhwsa98XFrSsT863tBdWYBKkKsV1FdVw31Flw6Cme4lDqOdQzbde6lBv2BgwTa3GKuYIwelqX1HbeTU6RW0ioSYMV3/ANw/PNgBiGRkLDo0oYWJ6la6aieJdS9RpOg02DH2iu4/kynjAmdxBVk06bxKbMCWuqTQNf8xyih34YaKGjK4bukgA6LarTai3mEP+Zfr+NfTLbevnN+y/jlX8wPYVuK6cmbVZdJ7BMTbFsRzEszVM1i6qGGTiGY+iWdik9F5zBtNkSCAUrntkS9G30o6Q/OcWWIbImHQ8I8U2G1IqrqaoZUt0OgoBliZar+oEWXEpmaA2m405tbWU3Svz806fL/NXN4oXMomDnazYgRiulyebPJqf1/QixLNg6bqd67XaOigIsCrAowHYowDrtj5Wzl+Wr3+OA/klma5qlKkwcZ1CPJbqhO44faoZmmIYd+K5u+aalEeo5puddiNc1htvxYgkccW7UnIl5Wmlya7yi1HK1wNYd39J14oeurzpUCXRD1WxLVW1yIeo+XFnAtoSzgoe1V74q7pYo/5loWiVfgE36TzzX0H0rYHbgEMMNQ41S1zRM13dNU/EN6H/XJEvk8VUbLDYvJmoD/QixyQ6c0Dao73mqoSpUoaHqEJuF56ZDTI/a5FKKDcPZgdvlEVanO1YpWaS77yZqEX2LE8XmAW0DxWYUm99Hx4fLelFsHnuxWVW6NdppyLlRfEbxGcXnLsVnRULxefNqPFuB1cbuOK7uUSc0AtUzNNcnlutaiu1nu4EV6hsXs3FywF0N+4+1nd5MzOtKktrGzWqS3OweBzhZOFk42Q5O1nRaONnnZfl2DO7UaXKniuJaps4yWlVjya2vaETzqWp5mqvqHiGXck+urgzmTk39hGPYez/dU6sdJNV4AptFiMQnoULNQNEtx7JCRTFDors6U25buRCVVnVzMJ02Tj2pfdSbmCYLy6fxEIKhKoGmqbar20H2X4cYiuHogWNSRQkuRX+N4RIcgSu2q+XBN1e95WGnptbyBNek76Hph1rgWapJXSvQiaUFNLR909BtGjj+peyuGU7fDw6TNKPRA01TRns1OfVuLacmbdZdw7bM0KM6MQPP0Ynjh6Gqhb5nqLpPfGizqDbzZaLVB+X76SlzSzE16bKteL5nq4brUs/UfCX0qcZSQ4+oqq+H5FKQ+R3X9Hcf0uPf0VPZT+f79XqVxvPizaRjEAkiw5r+e+5txJq+uNb3tabfUAgMdMumruMavms5oWZrger5ukNtw9MV7N8Sx/r9Ldp1wFXqXgVd5dtJ470ksVWHJZWW62qbsB8raFhBwwpalyZ1VpcVtLese+QraRMpY6n6gD3qUMh6v0KWHyrUIIZJbde0iaUEqmG6hkVs3wpC30Z/L2Ftrm3S29B/bRPCX5Gn6el0N2mhyxe6fI1Pp/vo8jWR6xSG2w+L6xQEtbrP6xQmUp5VUZ89K50fvj6LtTisxb231ve9Foc1CKxBjELPpa1BNF0AYCi+7lmuHpihoxiG7imaauhGaOrENVXouqCu2/t7cHcfWkGCfXX8kymrvGTpVatvTtfVt6pWiVU4rMJhFa7DKpzd5rD48/KehqVRf1xGRQIzhpU4s2klzjJUTw8th1q+Se3QUR3NNixHVT3HtUPvUsJIlgu+d4V3J9+tVZWJudHWcmoKFTVDswOLJfuqyYJDX9cD3zCJ4Tg2UQIWR16IPusDHmgzuU7vH4G/qel0F1nhDjTcgTYiXZZ8B9pUViewOHFOSj784gTWoLEGfe5r0HnBym3bhqk2/EHRCkUrFK06FK1URW1RtZqtn6JCZuXLK7Ki7JuHdO157I923xZ/M4ailt5U1PJVS1M8zSGK7RPftyzHCXVf9c3AJoReTFcQzR4u1uS6Q6OdMk3M/fYpysaLeTSiuKEbEN0KAs/0FJ14vu35BiWWp1B6KUYx3CLqfhzV8CA/v7DfVpy/La6fqf/jZlW8vyaLK1o8rskZQy8ybNw2Y7gG8wSBY9u6bnuKF3ia4oeuoZueSaxLqUIMuG2mtoq/88g2wdi3xa/FEvU9XcXrxKdVlDUpnZcgsaoTrqa3TMHauBdkaMjQkKF1ytDsHjI09pL9fD1ns4qT88rTPJUGukEDKwyoaoaB7issQNU1i9qEZWoXs69vuDzN5brVp4tKTcxZ9y9Q5GzI2c7KJJCznbsVIGd7z5zN7SlnO+5kkLkhc0PmNrq1Nfbyj0WUnlfOpniO5yuu6oUsW9NdT3E1R7GpYipOqLL/XYozPre1tXplmpib7lOUyNOQp52VMSBPO3crQJ52iWtrde4FGRoyNGRonTI0XUaGlt23HjNMuiP+D/bHq8pmR5ejGU05mkZVXfFM5nktQw2JbziU+qZtaFZohpaqX4gj1q3hcjSu273aqtPEnHS/wmyMUH3DNwzPNwNiGBoJDY8qYWB5lq6ZiuKhT6/w2RuD/9a76vlN9BL0LqJC7QG1h7NSdtQezt0KUHt4z9qDKav2wBU0ofqA6gOqD12qD6opo/pQAA37yR+LKIxocDcjPq3/9EwqEa6iZ+1piBEaqh6quhoahI3e9GzbsSzvUnb46sN1O1CVfaPrTbcm5r8HlGxTJEsMk5i274Qk1BzfD2zPpF4Y+Jars/830elJOJ8TisuK51BtpKNBweE/CVlOsWghVXaNV8GrnuU6gcKM0NFZ5qaFrhtkPZ9JoDuBejFH9ofL3+rd//Fs5C6Js1t0Hqtw61OUTO92OElSa9J0JyBKSF3HNDyF+KahucQhnseU3rKp6XrQdFF83y+snnpm1cO6I+nz1es9Za+jl+zH2QeTU3nZ4qtqGFkyK6eGIRxgoZ6BegbqGR3qGRlwtyxncFfz379yoTU2Rp/GspqBdbWzctZDr6u5uhHYxDcCR9c9Vw1tVbXDMLA1nTh+QN1LMYPhdkzUZ9Q7TO7jOC1eTrhLaVs5VfFn5YVbxp+c1oNQE6EmQs13OlpZ2GiJCR9DNvjMKBnK3L0FlFtx4NhDTt/3CUubFRpQWyWa5oah6lBTDXRCmLe9lMqQOtximch5QFFlmpg/7lOUTQGoaahKoGmq7ep2kP3XIYZiOHrgmFRRLqaX73ABqMW1+3qHJyxAkSo4SUfMxMwMkSoiVUSqXYqilpxA9dviYxBcz8iqzCYf43HFqI0bumyP+WLPt/RQt7xA1xxHdbKqqEJC0zfopbhjbbjrIp39QoccPZqYc+5Jik2RqWEYTugQL/RcT1GMUHepYZqeRrKrJxTLvxBTGK4RjlF/MVHx0L4tZq8lqZ/UX2c/z5/j5DS9pZSaNFl1ncAysw0ojmJYmqdqFlUNM3AMx9At7VIuAR4wx+LqGrvLM4Og2+hHSX9yai1DZKgjoI5wBpouvY6QZUay6ghN8RBKCCghoITQpYTgiJcQNmL6XG14PP5J1S/g/YsIZmN/GkMLqe9Tk2rEN3zPCUNDV0xHD+3AtZVLORXmDLjQpXP4lDaaNDHf3JscGzt42LoVaB71NRIQz7WpEhLLJoHranrgWZdyI/RwOw3N/Qirce/QG7vVr0m8Xk5O6buKq3n/IDUoIYrvq9QnuumbvqcbxLbZC/bvpRTJBjzXtY9Qu7HUI4t0vn8ptez7rzTdP433RzKbnIJLkVmTllPbJqpPNMWntuE6tqYYSugFihFYtmp4l7JZfEAE5xBWHSRNTrXbC6pJnwNCfFPzHMXVVNUMqW4HQcACEstV/UAL0E1JOD6vzYBZ4htGT+uS2uefPl3mr24WL2QWBTtfswExWixl3fzZ5HS9HyFuNuMo7Ypo4tkAymgoo6GM1qndkiu1jsa+zivej/HXYPOm+jaLDj8vXqIkXmQx4RiKa427yDXdVy3X1X3TdFgIGviK42uKavlUV01TuZQTW6Y+mPNWFZ7WrdL0a2JefWDpNq4Ru0roeI5hqYbta5qhUc1WTMN0bCtUdPdi7rYabkdPLSDuJt5fSbT4/JP5ktUUY9oWEqoCVkOVHrCKmBKiWESxiGI7RbEtTj6KGm/2ZuuPxhC9Ni4Ne46iOKqvEeKEjqNkxScjdBXNcfSQag65EBdsqIP54PoWfiJVi+k2IZAqu8aCq22aQUg8I9QVpu2KrtnUtlgax8JOlxiXsgNXVczB9N7lObDaGU4nZhDDCLXJUiZS3hguR0N1YyLVjZC5koA4lmVTjwbMXjQ/8HzDpZbj6rYJy5Gzzegwk0Ev6YZtRvziQpuyIXUbbcr4lLprmzK9ZQ+IjkEWqneo3qF61+UoR4v7ho/sOPwUrdh0X3Mz/biMvtL0OQ5Woy/VGY5vBXZoesSzPTP0NM83iW2Enu5Zjnoxp4a14RaabZ6TgYJKNDF/3IcIG29zME3DporvW7rm+qaqUcV0XcfQLBaBUu1S6tXqgOeKa+8jOPLIrterNJ5Xb6cbhsoRGg4pvXv1AIeUhKoHOKQ0St3GIaUWEN73IaWJHOoYbmUdhzpGf6hDbXmRtlCGgFoaammopXWopTkSa2kJ+Ts3z69kOYYKmtVUQTOJY4W6Eji2qzi2YzqGpoVaaNuB7ivqxVz1O+AdU1y9tbhUZ2JuWJ7gUC1DtWzsyt57tQwVBVQU3l/N+64ooCaMmvCl1oTRL/g9QvNdnugXLLtf8OSrw8NhOarDo68OK5Krw1t5MGrCqAmjJtxlf6UhrSbMUpvCLIvlmqs4YLFgQMdQHm68a8sjoWo41DBU9n+Opdu2zsJQj6ohCakVWpfikgfcYLl/d44MLZqYS+5Fhigao2g8cr3HFsuzS8FQThtNOW0i5QVsPjsrje9585kltbxwJHhCpQGVBlQauvRh0zjstACg4r687HX58pas0rvcAcznUcrGfvhJaZ/Gh2X+k4fXFRPKgUrAYmGx72yxZq1i8CjvGGxYa23DmbVmMsi8b+aJ0/mseFt8D/uF/cJ+e++FynGFLZ/9wnZhu7DdQX0vRyNyPtu9X6UwX5gvzHdI8217j8ChNV+RFWXfPKRrz2N/tPsWJg2ThkkPZNJ2TybNXlanBOIEhg3DhmFfhq9mL/9YRClMGiYNkx7WpFs2AD406et4voxXzHqJ/4P98aqybRg1jBpGPahRmy1PlhwadbGThf2EuecwosHdjPi0/lMYOAwcBj7QehWH196ueX9+YUOtdrBd0TAzcPYmWjzdJbFPVyuYLcwWZtu72XIUxg7NdiO7j2E+5uwds9zP5YExmC5MF6bbu+kK7tLcM93C5+bbzJnpsr/PJAfLheXCcse2t6vWcjdetzRdeF3YLmz3zGwXETNsF7Y71nNNe7b7bVEcytxvC1leyAobhg3Dhnu3YaWjDf9K07sk/i/108dKAp+iBB4Y1gvr7d963e7WW5ntHUmfr17vKXsdvWQ/zj6AGcOMYcYjLz3nZpxVne/pKl4nfn7iCZYLy4Xl9u6AW23T2LLcrD/RZrNV8UfXxYRgwDBgGHDfBpy1EeqwkbKw58KAs4LWM/V/3KyK99dkcUWL/mOwZdgybHnkh5d2tlDmO7Ey4812UNbddgGThknDpHt3zy1bXNaZ9LfFxyDIO1wW/vkxhjXDmmHNg1mzy3FoaTtZLv7ZNDeHjcJGYaNjqEXve9y99/sWq39IStH+shHKnySJCKO42rZcE5YLy31PyzWco+LYUuLRSUYfANOOt9vekoyi/rX5kxHJx+hfPhn50/Jpgr8RYL/etoBy+nJQuAK4ArgCuIL3lg9cAefCtrR+2Uf63deJIvuzaPEEPwA/AD8AP3DmfsDk0pzj4DcGL8CxO2JXaAdXiu2f7vkjmcEDwAPAA8ADwAOcgQfgXbM77QHK+yyfKFwAXABcAFzAu8sHLkDqIcMjLuBTQv7e8QFf6WJ96AAU869syrs32++sCRhwA3ADcANjdAMWnxs4YeIjALvM9mWBXVXy2DqOCbwD3gHvgHejkJRY/7WdPR73cZwWLxs2+wHhgHBAOCDcmRzRPxLRZVL7lablqfwVYA4wB5gDzI0N5nj27jYv1CxokrcBe6JXmSb4Cfsp4A5wB7gD3F0g3HGuSwPuAHeAO8DdO8OdMsxGTKAd0A5oB7R750UJ7rbWRxYlms6dAuIAcYA4QNyZ3J1zJKDLWhMW5ylX5coEkA5IB6QD0o0N6fSOJ0jukmhxENZ9XN1GK0AeIA+QB8gbHeQZHJBX10fp2J7iaMUk8pq3rv24jL7S9DkOsDIL8AP4AfxGB3488Z4I+CXk7xz5vpIlIA+QB8gD5F0K5LXqmwnIA+QB8gB575zitryY5fj+lCLIK3Lbqzh4vY4DnCkD+gH9gH6jQ7+uu49354YjtIA7wB3gbrRwp7WEu3yw3z8GQcaCDT6J57c0rFu2NbZlkP8MIAeQA8idAcgdv+yM28BHAHFqy07XBcR9iX4+pMlD9E9dCAdsA7YB24Bt74dtncK3Gzb7+lIcgA3ABmADsL0fsLVs7VQA211Cn75mjABtgDZAG6BtLHLqXnJj0LYkCX2I14lPj7QfBsQB4gBxgLgzjd7+vY6ZBGhKAG2ANkAboG0scsqjN6ULtN3TefyShW30KiE/aN1JLyAcEA4IB4R7v+CtZf+SAuEe0uTxdUkf4/omdEA3oBvQDej2fujW8srDAt0emQQf4+z8wtUs9lF7A8AB4ABwo5FTDnB2d4D7jT3+aPEEeAO8Ad4Ab2ORUw5vwj3ntq682X79G50taVIDcdpf3ttfAdwAbgC30YObaXGB2xHTHgGsdb3KkP+OL8Ab4A3wBngbZ9Wt7JtUbm+LfZLGyfdPUUJ99oL9ZOeLEt20D8v8V7+str8EtAHaxgNtxw14o72jk8sQwKaflssRqx4BqnHvBalFtUxQN2kWtcUJYA2wBlgDrL27eHJYc7rA2j3118kqeqGI2gBvgDfA29jgTe0Ebw/R4mlGM3EB1ABqADWA2ruLR2jXRz2obb/b71kJTAOmAdOAaeM9KH/6rujVr0m8Xu4DWkLD6tLBZXSgIMA14BpwbZS4lpE/LZcm4x4BvBkcqwenr5Z5TEhUwl0zvC2fl9n/8r+/3/5mG/EsIB4QD4gHxOtBSsa7tmVvQMXRScrsX1K220ZSJ/zHGJwqR7Pn0041v7DoNvpB4VjhWOFY4VjhWOFYJ+5YOVZNTzvWzdqCgGPd/AbOFc4VzhXOFc51qs7V4VjPauVDLsbBtslc4WDhYOFg4WDhYOFgL9jB6lIc7OfFei7gW7M/h1uFW4VbhVuFW52qW7WPd7Zo7T5G4FENjqY1/aSscKtwq3CrcKtwq3CrF+dWTSkbg++yabJX7Kdv5yA4nev+z+Bd4V3hXeFd4V3HIqkx72Rq8h8jcK9yzt3kWatAxpr/PVJWOFU4VThVOFU4VUGn2uQ/xuBU3+3cDRwrHCscKxwrHCsc6wU6VltKtvqw9qqycBIvabL1QtTVVr+Dy4XLhcuFy4XLnarLdY7DTnc/MgLXa0nJad9c71eaPsdB+Y+o2y1+BacLpwunC6cLpztZp2t2cbqNXmQELteRnO3mk2YiX6Vkke6+E3XA1e/gguGC4YLhguGCJ+uCO+W9J/zI+zthR/AqCZbI/5dNpHh36E/3m6rrcJNwk3CT4jssBG9DKEbJhBVE+Q3x1/F8Hi/2P/1CZiu6ebtvvTSPkfd+gxsSYMww5rHHvOppuZyw7hFgXsamB8xjFB+ZcDMZk2ixAvwB/gB/gL/RwZ9h9gF/+VVfNLhZAPeAe8A94N74cE/whmYh3Ps9TgF9gD5AH6BvjNDHsQAuDn2PyRpFPkAeIA+QNz7IU92ukFe+qr3jGegGdAO6Ad3e7RABx26Khh2NB2C3vYVk/8ub1V0SvTBhIdYDGgINgYbjQ0OOWE8mGsZMQCkNgIfAQ+Ah8HB8eGgNiodrbxb5AEOAIcAQYDg+MOx2QZcQGP4ZrSIvmjGJAA4Bh4BDwOH44JBjKVgADouj3ygZAgYBgyOQC2CQFwY5zoBIgUHUCgGEAEIA4ViB0JS7dnIUCFEkBAoCBYGC40RBm6MNQmcU/LaYvX5J4vn1OknYTKtKIhARiAhEBCKOCxGtIRAR6yXAQeAgcHDMOCi3UFj1p8eKCYAQQDgCuQAIh7m3QgQIsWYCKAQUAgpHC4Vyc+MGKMSqCXAQOAgcHCcO2vogOIh1E2AiMBGYeBaYaA2DiVg5ARICCYGEI0ZCjQMJuTpw5eIJiU+BcEA4IBwQbgxiynsMduvC9bm4TZR9kr9iP72OZ+XtbfVQB2wDtgHbRo5tPHLZN+cRgJkiBczy4tzn2kuQAWGAMEAYIKxHCOvW96qEsM+L9RwIBgQDggHBBs8ou+0sKRFsUzADjAHGAGOAsfPMJR8TEqWAMEAYIAwQNjSE6d36opQQ9rD2tgtj12Xf0N13gDhAHCAOEDd46ycpySY/xGGBE3AHuAPcvVdE1+0k/wHcFS1Nvn96XZB55BfvEMoB24BtwLbBsU1Kwe0A27ZADcEbAA4AB4B7r8MEZt8Ah6gNoAZQA6gNCWqS1xiqw6KbFwA2ABuADcA2NLAZklcW6oENKSlADiAHkHuvTW4cILd9vr3Esvs4Lnd8ALwAXgAvgNc7gJfLcVKqBruKf0704wBsAbYAW4Ctd425mHzC6GmdkKqV0Nu7ErXUD/72pwdaQP6lA7wAXu8JXqZ+VByntHcEtqpx7LfaldcdeaLZ3O+S2KerVZx8vyIrevApDBgGDAMe4DCyI2rAj2zo37+sF3lR4/unhPzN/mw9ZzPIJ/mVLtYwXhgvjHcA78sbKXMYLy13yGSSgf3CfmG/A9iv0s1+2feUzS6Pnq+y+fkJ++kK5gvzhfkOEDtzbO1qNt903/v+kcxgvbBeWO8A1sux27zJem9jEtzN1k/RYnVdzAOWC8uF5Q4QNnPcUttkuXdJtDjYnvNxdRutYMIwYZjwWWS+6U7VOcuAETvDfGG+w8TOwsu+u+abiYqZcBk3o2AFs4XZjths88F+/xgEGQs2+CSe39IQwTLMFmY7xIbIlpWqwmy/RD8f0uQh+ofCXmGvsNexu9m7hC5JQh/ideJT7MaA2cJsB3KzLcvKhdn+ex2zidOUwFxhrjDXcVyjdNxc7+k8fsncK71KyA+KEhSsFlY7kluDjlstS2QfX5f0McZaDywWFjuMn225VFtY7CMT3GN8HQf0ahb7yGVhtDDaIdxsy2N920b7G5tWtHiCycJkYbJjLz/dJfTpa8YI5gpzhbkOYK6dFnlu2KRZTAxjhbHCWAfYbqzztsLLD/Tkr8uXVWeasnXNb+l8VrwtvocFw4JhwSM6a3vSgmG9sF5Y76DWa3GUkIt/snYWWfO3fY0n/1Jhgbsy5VhI25bpF+Kz/75CtDJPp13vdCD9/NOny/zVzeKFzKJg5+s7kpA5ZbPZ/Nlf9XBG/qXhgcDbyKjuXxP/mX6/jX0yK16+qeg377/UT3+P0y/xehFAJ6GTnXTS4T2jsAuZO++ge9C9VhcddL2kZf+yA2ggNFBMAzt2AjvaSwiaCE0UjA15S91tmtJBHaGOYsAovA9pI549JfxPQpZLmkARoYjtcFHYRZ/QxMN7SaGUUEoxdBTeWl2Jp/qgfA8FhAL2lTnX3uH8vCzfPtA0jRZPK2ggNLC3fXSnrxG/npHV6jb6QYv30EZoYytt1Dk8ssil9rleMhGuUrJId99BU6GpXTS13YJLyzVq48MyL08+vK6YgLBBCuoqJI4hNkjVKgaP8o7AmNWOHc2Prh/AbmG3sNv+nHC7q6pbOmH9Q1JKHYYMQx6bIRvOUXE0KO4IjJj7JB/v9hHYKewUdjr+FTyYK8wV5vruhyjaL7jDcmG5sFz5jla4s2rztgSYKcwUZjq6onHjTl/YLGwWNit9v5Ul7ZQcDBQGCgOV7lQN3v7kUlZ0tA/LvKbMJBFW91Avo1+Wz8saozZh1DDqdzVq66g4thR5ZHLR+5dLRv60XLYNfHRSMgaQkiEqpToYHIGLUDnOtAltmocXgBeAF4AXeHcpwQsILG9xrEa3PbcChwCHAIcAh/DuUoJDEEgLeLcRnq7tAv+B/8B/4P+7Swn4L7csJLSNHF4AXgBeAF7g3aUEL8DvBUyO9eM+GkjAWcBZwFnAWby7lOAs5K4h9LLZCPsF4RDgECSclFH6y/lho7BR2OgwNtp2uxZsFDYKG5VQO2/bh1hsMw3MFeYKc+1+io334KnQTgcYJ4wTximhJ6GUjamdViBgyjBlmLIEU253XLxlffjUPfKwY9jxO9uxqR8VxyntHYE5izds2cirsYEhDBeGC8Ptc52W966N9q0MYcOwYdhwn8tAvLE0Z1NDGCwMFgbbZ7Q81AVX+5ZC/qXCcnefBeNPs/glewAJneWiXOW31Jn5/JjdFXo1J8ttQVp29nVOh0nVVbJ3hr4n0483mSBX8Yx+/xgE7MOrWez/YCHSfE4WQXkXXqYQ5SBe/1qwZ5iXdURJZRu0M1Fugq+KUkZ8+bz8XE6STbswn2PU2VvKNIreM7v5Sh/LJ8gx5A5EhQZvmId8Svpxsvq+Ec3ms0Y5ixMTk/S+me3Sv8/BqZIH14jbUhQadnb7zz6TuyR+iRg6fCE+I/jaNEaun4sNqEa5KoqbnWaNQ+IjIKaJDdNcff/GoHLrg0YtFCMkNkjrkPZjQqJ09f3hmSQ0KK3wNn6K/PyLxpG2oCY0XM048Esl6i2XTQNr/p2Yze7PsSJVzi0D4CijQmblJ285b6PldqIr9tAPvfsuqyuy4sF0MTpiQ3RPkN6JbnjG2o6g2KCPaVnFo3J0POMVpiWmxfuYUpFnOPKU0NXqiiTbrzlgvTVJsYFrHFwe0tdZ9A8Ntj5rHHlrmmLqse9kiiie+M+0XH3OX9+wuPgujmdCAeApUkIDtZzj1G9jnwFQwWiTcXzz/svI/h6nX+L1Ith83jQDeTy66n0d2/xlwTH/QFDv+UiKDdw+zmXjW5eZYtKgKr5mOdnp4Xcj3C04P7VbSig4P01MbLD1Gnqc/v+njfjYjp4MJTnOYlMWuCJPLZSEl7DQJJza2kO3YkfT3PrhJwOVdoZwv32wr/iqBSqdJinmKer90A6XP8lszVJ75lBfaPL9Y/L0svNJo5OQQV5sQhyKvsuxqm3xT0oWC7GJHcY4J7gy7eCfkwTqMkKUBoY777iKAvJ4CE3N5pUlS6AXqzBO5hXnxzjfpbj1edP05PIRm+JhcsPL+u0Drmcom1PXUkGSBYJPT4xJtQW1zOMYrc9JEier8nPBUoEA3a7p1sGpzizLL5MOvkpHa5piSlbrPPZOzuRhbv5fFm1tXmwKo3w6JpeR2CRr3Xwj7080JOtZejCExinKZCM2wcO6zSnOe+vWYhPtg50ER310BIT94efdI9XijlqMuhiA1DpRDoYni81dKUuICzmYlRufOOpn0liITaw2i+bnevIxSWLQbQXzNM+vNH2OxVYw+Yn2BABblb4H9uizcy10tmwTqYtRl69gG1K/JvF6eRuToKLBomnmRTor2GkGYpOqrRkc4yk4n860xabC4/G22D19W9Kq4jOLF3TztnFO8pjIjx7q+d6k+fJKRY5rmr2wkx/01o9g80pe0MvPSGySQhZfz3vFl6tIZyVWCuUB63ruD9HiqfKkD5Qk/jOXBvfFUQySavPb3UFUP8jwjyZbi3J8YbAkDmILChwBnkAo34qcdC+XVR2yUOettROfYXWnLb2OITqF9jSlZ1B1bFZ5qNM1g2qiLGGN42R/MPE1Dg6SYt6myc6Kbaks9Q+ichFsPo8X+59+IbNsI0z5ttHfyGcm5nGaVIKTfzSjj1khJF6kJMq8H8e8++UrJoImreIbSrbWn9LgZsE3934Yik26tk7eZgy/xynvvHvjKWbfTbEA3zAekzWneUvnJYbBTdHsIfvy1Wk/0oWshPVmLk6Pr0sWnK7n4uvNguTFnkhTxniUI5937EpaaCJ6E4Cz4Dnb91S8a9yHLUBFwlJcSfghXic+zbEkTvKlp51PxJfieOnK0/1dVp+ihGbFYPZT7plIIS82oSb83+WY+faiQhIn/DOSQl/C2n0ty3vqr5NV9ELbPCy5fOSVp3dZFxWBTLb8z0wCdbHpNAVfewy33/GVGboT7wsidt5xFsOkkJexvD1bP0XF6/LlLVkxv/CUb4aPUia8w09aLG+3YyND/Q44Zzyy05O08CNvb1uonwhxGYukTfyyl7+l81nxtvi+xSKpOAsZdnWKK/ekZJCXUWE9xfF+lXLPSRIHGaWygtPnFzbECq2uaJiNgb1hXoQFlj5drVqUyrgpy3Cx28w2R7E/hvmx6Owd4/dGRtjFClGXh3F7DAvpXSeUZJ3H2d9n/r01xvERlwcFtfw24isZNj8cGeSHmhCXtskgLy9m2OP4bZFrA/1U366odcwgykbGjoojnH+laZk4V8e+VywTaH5mchiIPbX6ZO04z4rZHUmfr17v8+YML9mPsw/EtwS359QbFubMM6TKdpTn4XTePkMOFh4hLjaZ005xi99mp8prJrr8j66L3h7im/Db8BBbq60vnhVsvy1mr+Vq90+WXWfE8pEInj/mISg26KaYq/gnJ/spWi2z/icn2g60oCY23Pol4G0GfAvhQnTEhtgUKxX/cObOopQkVDff/GrW5chP2B+stl+f3izYja4Ep3aK1ePfEQsTXqIkXsxPAYkcBjInVdNGqSrSvW71Umo/KV4GEnaFCPSGEt4VIkJbQqjYxK767u0jjp3dUtmITbA2+hbj3GE7YGtGvTzFMvjeHOwSPDohlY2EssZRzgJJTFfKYsBRGwLxMuOtUctjIvaM+JBr77CQUCsvTooybWcTSx//RIbtiLGRiYAcnHl3CstlJKGcu+FU1VjLamS8W+bffCpezhXnIBMwDpn+GqXPay/7fMU/M3lMZFreId+DT2RYnhgbsR0hzbFp9aJxOwgvCbGkrlkk1YvT6ZEgIZn+ZAOL5aYFnv5cLSmKPfRma6pKaaeq+kJkZKbKWb5Xbo7KGu5lHWIX6Zcknt/SsNlbd6IrMwHbZnW9XqXxvHjDt2OhM20JK10n2fHGghKoS6ga1jL8Ev18SJOH6J/m0lY7ghKqhrU8bpjZxUHziFtQExtuc8qyzeAuoU9fs9KkeFuuU/T6whzGYkmSakfTiXp/N7p9Sf3f6zilc5oSSVLfoicm9ebgYZvFPZ3HL5lY6FVCfjQvaHYiKzaB5vBimxOz/GwD8mP8R9LYN7I1SbGB166w1XLJDmw8xtcMBvJO2o1j70BVbPj8bqNg9BslQbRobsfWmqZ8B5TEi5TBGONVHG3s7IAOCYoFATwPdr3wi43qhaMu3/LFNFLoy0zIm1jyxjaSOMgP1yqmnxLyd1Vmy08Bf6WLdedw7QR1mcszxxlWVcOTC/JyGMgPNiqeWQL1K03LNfJmv9eJbn+A8GvZBzurW2wt3EkDhKP0+5xSuqPaGesTjl0OfbEpNRc8j7KsdPvUjGSQF7McHl9Xccw83WbZ/uQuls6kxZ4MT3BdcbtLosXBCe+Pq9to1WJfThseYgEOB6J+JdHi808mt9WpPRnixKQH8Bl9gV0MrUkKDVzbF0zxz+n2eSd+KFZK3A8HtmnxXDPD9XuxB7qPSfv3ye+95zun2Z5ot3z4BB/OQLQT2W5p5T6nu+dltQs/61kfr3iK+F2oig1//+hKA6MCK7e6oAo1ZxcjLLZqtQ/7p3nt9cS7KylybZzpgZvYM2sxgKw1MsdD60i5W97Gyew2+sGhfzKodwumTzP8RFKyua/tZNomhX7f4JB1G+gFHLYJ961mG2fWi5odUO8WRp9mePdGgrOMI42H0NRURVyYD2tv23qzO5JSskh334nNftBhCAnI3V8HlTmwRjXvm7OQGJxTsWnTYIrut98/vTIOkV+8Oz3/3liKTVzcLg9GscWe2yL65SsW6u0X/LoNpTnQk85L7GmfymEE2XPlfT0yFYO6Lhh8l8QsE9p6Iabu/fMW04Mu2Fs/nGas64Vf3xlO3pG9lwxnh7JgQCPgNg6aX237yf0vb1Z3SfSSX7TJ0eBt2HEIikgAcISHFqdsCNldgVxCGnYk/YXGooNbe7PI55TRgMMQFJBAeiw0sj+jVeRFs3yVgEtEgw5kYCFxjOlrHERh1FzeHHggYpGHQNS3P4oi8ukG1sPwFxOJgNPkH5IIOA81AjGxdHAYRwfFD8aDsBfEF4G6Ht+QsiYE2Y7063WSsPlXAMmDw0OPRUx3pI9O0E8NNIDBcKbKNzqC70AjEDQrgYxMZFRi4fFggxjMkBqGJQDDwwxAUGP2t/ZIGFQHKB5+NGI61MP4ROF4qCGI1WEE0r3iH46tDa1piq2TCZgle1m++j0OaH7RbrapIjpx4600FmITEwj73rhuXnFcxieHgdCkDK4C1fOS4x5iYVJiFrG/1a2Z+kPRzqx5D3NbkmID53qqz8t7GlZbIZfRdX4ldaeNVk1kxcrgXHnxQSvX/Mj/8/IhXXseTfbenu4Y2yfXHhZETg2Evay2JMcJtxD65/0OmsBe/rGI0oE1oZ5rD6vABwOptgneEf9H1iaiGhG/AHrl20dGdDCWYhWH/YQ9gzCiwd2M+LT+09PyGHAQYkvkXKHkdq/KcqHr2+L6mfo/bsrtfNdkcUXzs3ONNxD3wq43PNjpip03ks5YZk2xRTdJ9clVbPpc8UPNQL4tPgbB1v7N7HAq18z7YSh/D9DmBMLGuI5/cjou7o1lD2s4DcNgX+eP4DH+GmzeVN8KHPoYeCDy13BEh5a92fqjzms4nfmLeQUe733sEGi0Ws7Iaz4KFr4X5d/GnKYPbmJZcpcBJOTvnPtX0njDnDwe8v378SOJBddCqFdx8Hp9ondKL+wEJlx3vu7jTXUCNk5Wmx3uq53TYGo2n4O9TPnJtCL/XJdXRH/+6dNlUXZdvJBZFOx8zVwXGxrz2Js/E9o7JYWfmLQOWmrtSuuekmBOq2ZVENn/6spPxRjyUztVdMpe36R0fhfHs0nLqv6wZyGr7Gqt2dbLb152A0P+wUZm9Wd0D37/No2CyO9x+iVeLwIuOcnjISib2ougCmYPzyTJlrnmy+zGdhpUtZCsK8GuhKaoVfWnnnfHsPNu0tI6omfHpbVheUWeJi25xqscy8LE3mnN4tOd3fO5+FqprNip/0ZiggbWdId7OfHLmGl9t8jdmd7GT0/Zs72P44MWEJtp13u6XUJvBPiO1bclKYgPHFp+qVNvP/Iz1PWDUtz2bIVuq9+5qn7CDsJpup9ZSKIsmoRQC6GK3cM+WTFJuXd3utKTd9HvdGUo507h6cpP2hXG0xWhxPsbi1j2MjroSbhRb7o61dxT75r7yrvpSlDC/XqTFZ7kG/0mK0epd7VNVoqiVyCdUUVkmg9U+Oqoyap++/urJisywbuzJiunDveiFMvil9W4vMu1H5PVIYk3WVyYOk1UHzhawXNdBTJdi5J0aQcEKGjo+1eETFeAcoDYyCuZuHIdV65zU4R7bbXScMQ0T9xIM1l8a3X3zWSl1eHyncnK7OS9P5OVTLe7Z6YrNil33kxOcme1EtDbrUDTtZrOtw4ZkxTdGfcMurAbms4LvuQIHzYHm4PN9RgZ7l54BnODucHcenRxNVfzweZgc7C51kXvrvdHwvKqIwpncDp24Cs2J1ss6f+mTn2Soj0rtMWFrZtD1T3f2HpWSjE5ox3q5trJCfZsc4A+L/KdoBacEfz1fa/xGfZwGeyq4wlaxvniY6+3Pk9QE84LE7pfgI2q6FlZPKqi72tvHS46m2yRS+IVa5OVYYuLzyYrqw7QPl2ZcSVbR699m6zcerxfZrIy7ecKksmKU+YVJ5MVYk+XqUxUnmV3oV9S6j//YnxY5t3uHl5XKZ3/kuT3jnyYBx/SvwvnYmbzYGPO55SvZ9Y3yjpsn3hLVml2uDjrvxtlzSMOP2kSlFQ2YkmevB6l3LcSt2UhNjE5jUPF+k0IkhebkLROnkfnJImD2OIjbtHtPpA73KKLW3Rxi+5F36Jb3xGj7lbTKxpmw2Jvsgtdk9inq+ZyckfK3arKh8w20W1+MW3xjvF7IyNQVW5BXWw6TZHbHsNCetcs7szKQOzvqx51R2fTnbi8mKmW30Z8JcPmhyOD/FAT4tI2GeSFJtSYKBz0Is+1gX4S774jlY3YE6tdWDnGmSW85WUdVdvH1acoaX5mchiIPbX6K1yO86yY3ZH0+er1nrLX0Uv24+yDxgcnmVNvWJgzz5Dqnq7ideLTqjOcDCw8QlxsMhK7/ovdCtmGh5g68pSYdkZRLsAyU3+m/o+b8gj9NVlc0bxLZtCok32w6y2z2Il38hAhY5mFO42HTjpmFqJcxabPtUxVM5Bvi49BsNUz4THmnHk/DMWW++sv3SsrGPk/XOdgxOh0XK9uX3ybaH0XFwThgqD3FyEuCDq6+pJtJylWX/QPScmFvS9j6T9JEmV9jVbbqzDa9ipMLo5TS9977/nON7Yn2i2O7Hq8lSeObM2jhwVfHN29yKO75TUfx207cw8sgN22bGPLsvPl1YmtPh5ftt8vnoyu272stttHZySFPsLvcYTfwoqObuLoJi5IUawEMkXTxE0JHbeOGXZNgKOYf2XxzPV6lcbzSn47CYyqb8U5ar6pTOJFOtyrnmLUJazScDDcvwdGbJVGmMEUIvGTt/DuCitbRs32iRb5fPO+gE50+wwvj16LIym8PEJ/2hHzBWY1B6fsGu2TLzJrT1Ns6JdRI5R76YnYQmsbHmILrb2cLzm6ztoDN/mlTs7zH51KnVw8UMUV2A0gfuCk024AUXb9OebdMJ8r6JNDXzDXw0WdyP239UFWgjbR5L9TNniGLZ9wLSmKbVhIwEICFhIQTBy6wg5VkmI/03lWVnEjqxz9QZsNtNk4SyFi69olLpihyUoPK+Vm3Uq5sb1SHs0Yh6MbfVUlDxR4VhxzQt8/BsEN+3iRfkni+S0Nm0PDTnSFjMLgWTwpWH2Jfj6kyUP0T/MBlHYExQbNL5+b+XJ2osTbhprYcHmisoLBXUKfvpLUbzw12Y6e/DX6DYslSegD17HIbnT7kvq/13FKGaQQSVLfoicmdZ4yaMHins7jl0ws9CohP5rPfXciK8HF1nJilv/4uqSP8YkCfGuSYgPnqYcVXB5ZFp4d9Avo1Sz2m7W9A1UJGwMaGP1G8+Oa4hsDeGjKqFxz6Yx6gQtAeQ84ty480f7y3qrX24HJ9v49jSMu2SqCb79+67DZEr1P0J32DqvTTvXkY5lovI7lHgldJa0KUbQPyzw9/aVsNRH7JI2Tnf3AW3BiHkfYMst92Cbz/VOUsPHECeO880WLtjRi5CWASy3HbJ/oTZopVJzwz0gKfbFtMU1F712W99RfJ6usbUqLhyWXj9hT42f9wOKQGc1ky//MJFAXm05T7WiP4fY7vk093YmLllT0A4RJtnui/3LYv3YbaNTjC6GnV25WvybxunEfXlfKgsLIlKlRGOwn2f/yO2d2Wsc3x3Wdb7Xhlo8g5W6GfM43teCyIZkleVw29A4qfHa7v6QIHzYHm4PN8Yc0hxlkbUiziSD5w5oWot9w6eXBHlCfrp62m0/N4wHcAm4BtwhxYHOwuTHaXFmR4wlxPi/Wc4GijcAtn6XUMwYcNZtuhKermP+T8FAArYBWQCvCGdgcbG6MNiewCFX97G3V6+iu57xac6m9JXDMoh+0OpNjFgIWk8NIr8u2W5dKSF623aE8XTRvt2y791gQkCAgQUCCJAA2B5sbo81l+0IVgZDmLomXNElfj4Y2B8nAgWGcFv/D2qtC55Ld5sXpx90PPzEc63XOE0S2M7OoLEfktqji1DW/Pdlcl/Ad0a2CWfnPaVuSz0vMjnqbK2xo7DYk5JUYq1VKFsf3SR9YkdsFoXd47r47bVN9cxazsP7loMPexm5vMIcN7GhuDezsn0qx99FEbzo7Ul63XbxrEoUIFTErFxvfRM9ATq1DaodywWQ1BAUqFKhQoBoWp1qNdrIIhYAeAT0C+q1D58ZBQF8MuGgYxKgHUUbm6PJ8UXSrv1i1mMUeJfbdfB4v9j/9QmYrunnbWHWTz0xId5ymbIGTfzSjWcsn9klKiouUTs+7X75iImjKBPiGkrdLoMHNgm/u/TAUm3RTTxKhMfwep7zz7o2n0NQPCs3iw3hM1pzmLZ2XWBBe63mOsi9fnW6f0YWs0ARUZb8bUIOHOeC87VL2v7xZ3SXRC1Mmruc47DgERbT/NGQOLWbulBkcp5CGHYmgmAQyL9HBrb1Z5HPKaMBhCApoH55ljezPaBV50SzKOulwiWjQgYiF2gKLlPvci8XJbjg0DH8xkQjsm+QfkgjuDDUCMbF0wMKjg+LHmUHYC+KLwCE7viF9W8xes0bn1+skYfOvbJ8HYoYei5juSB+dIAQPNIDBcKbaXdURfAcagaBZCdRgREYlFvkNNojBDKlhWAIwPMwABDWG5/4QwUF1gOLhRyOmQz2MTxSOhxqCWHGh9mqPU1UAvhNeXUmLraP0VgGc7MpUn+XFiQq1fsNSMcydNrrm9o4l46LP6F7MYcqpdoUZc+O+C2mvjNVh8fqv8Gi4YXLQYYitCAqscBwMrDx/8emVcYh83iMnvbHstgTe7eAJtyr0y7fbkuilnjOa4BFFhsNdIKd+CNxK3j9vMZ/e4TJwsZvReGgKDd1o2im0Cd2yf7hS7FbkxJJAtM+Zbvsc9FPB1nlsnR/0iA96mMLcYG5DmRuuQYDNweYGdnG4WQ32BnsbzN5wvhDnC7GCtDGHgZeQJrrPof+VqLMyvkkqwBArcpMT7NlGgWgOONXYA+1VJ/70B1u6nqAmnK836LKKn0fV57uq2nIXwNm1rMsaGW6umFY/+NuUaro0qttNX7Xzi/Kt2j4R93QR0CQzG2ZCt9HiBwMyn65WcfL9iqzowaeNpS5JHLpV73aZPrKn9/3LepET+v4pIX+zP1vP2chzGX6li7VQ9a4FdbHp1GoBB0Nahp2ZLBtnJIeB2KRqj2oc4cm+p0zBc8W4yszQT9hPG32CHPpiU9ovIDSzTPel+Ecya5yRDPJirrr2PNQRjrcxCe5m66eiJVLKGIsftRIgLfZkats+HeF2l0SLAx/+cXUbrRpnJI9Hn3aU7oBRpu+ntE4KfTG1a/YZuyyzdlyMbakXzWFiJ7ryp5CfPPv+MQhu2MeLNDs5ekvDZrPpRFcsY+Ox0ILVl+jnQ5o8RP80b/1sR7Avud8ldEkS+hCvE5+e8pDd6IrJnQdHClb/XscpZckYaRR7K3piUueJHwoW93Qev2RiYX6W/KDN9tqFbLec9DgnppePr0v6GJ/AzdYkxQbOg84Fl6xn4WN8HQf0ahb7zdregarY8HlC6W1Gv7HYjKXu4vvieWj2ZaYMEZ6+ktR/lmSmW/TEhswPYjfz5Yw908YBt6AmFtnU1xzyODB/Xb6sssUynfwtnc+Kt8X3jcGNLBYS8oSTXLknJYO8YHmoTdFjsgvNEssTF5dyTlIfZNV3pmtRkopJ0xWgHBzJ97kebJfdpZVn1D/T7/sk/pOQ5bL59qKulMW8dHO6eoIZb/sSeUzEAu9anTvgW31Qvm98Ni0pwjuIHmftULucLr5JqpJOVoAdKiTqBQaqctPTyWqVpEx4uvKTGaNMVIr/K/74l/vPHz99/XzsRt/8tbafqBX/ZNlE8y6IEz8UioH0/erBNq0vxGf/bTzcwPd7MT08KZjp6pa2uWT6yCWvqJ3h/lSk5UjLkZafFRAh9OoFznFB9GnNwwXR0zt+gJYEaElwkfZ4RnqAlgRvh2TUKqvVPyRlzFOT4BodTz2dY8qGuBDr0Uh8kfheqmmiXinkKbOTs3uX5yQ0rFbml9Ev7Cc1ntOs9ZzIjpEdIztGdjyymBcuAUtYqJygcoLKyal48H/Fx34uyb+eyeq52pJhm5YTWNQzVMcnmuaZpm+T0A00SyFGSLz879hPowwPFmT2l0/8Z+Yo/1q9rlI6/+uFpV/5Y4n+pf2///0fHEF4dw== \ No newline at end of file +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 \ No newline at end of file diff --git a/docs/tech/1.configuration/readme.md b/docs/tech/01_configuration.md similarity index 75% rename from docs/tech/1.configuration/readme.md rename to docs/tech/01_configuration.md index fb658a97..6b542695 100644 --- a/docs/tech/1.configuration/readme.md +++ b/docs/tech/01_configuration.md @@ -1,4 +1,4 @@ - BumbleDocGen / Technical description of the project / Configuration files
    + BumbleDocGen / Technical description of the project / Configuration

    Configuration

    @@ -7,7 +7,7 @@ They can be in different formats: yaml, demo-5) -During the instance creation process, configuration data is loaded into Configuration class, and the code works directly with it. +During the instance creation process, configuration data is loaded into Configuration class, and the code works directly with it.

    Configuration file example

    @@ -36,6 +36,7 @@ Let's look at an example of a real configuration in more detail: - class: \SelfDocConfig\Twig\CustomFunction\FindEntitiesClassesByCollectionClassName - class: \SelfDocConfig\Twig\CustomFunction\PrintClassCollectionAsGroupedTable - class: \SelfDocConfig\Twig\CustomFunction\GetConfigParametersDescription + - class: \SelfDocConfig\Twig\CustomFunction\GetConsoleCommands plugins: - class: \SelfDocConfig\Plugin\TwigFilterClassParser\TwigFilterClassParserPlugin - class: \SelfDocConfig\Plugin\TwigFunctionClassParser\TwigFunctionClassParserPlugin @@ -118,6 +119,12 @@ The inheritance algorithm is as follows: scalar types can be overwritten by each 'git' Path to git client + + render_with_front_matter + bool + false + Do not remove the front matter block from templates when creating documents + check_file_in_git_before_creating_doc bool @@ -127,7 +134,7 @@ The inheritance algorithm is as follows: scalar types can be overwritten by each page_link_processor PageLinkProcessorInterface - BasePageLinkProcessor + BasePageLinkProcessor Link handler class on documentation pages @@ -153,21 +160,21 @@ The inheritance algorithm is as follows: scalar types can be overwritten by each array<CustomFunctionInterface> -- DrawDocumentationMenu +- DrawDocumentationMenu -- DrawDocumentedEntityLink +- DrawDocumentedEntityLink -- GeneratePageBreadcrumbs +- GeneratePageBreadcrumbs -- GetDocumentedEntityUrl +- GetDocumentedEntityUrl -- LoadPluginsContent +- LoadPluginsContent -- PrintEntityCollectionAsList +- PrintEntityCollectionAsList -- GetDocumentationPageUrl +- GetDocumentationPageUrl -- FileGetContents +- FileGetContents Functions that can be used in document templates @@ -177,25 +184,25 @@ The inheritance algorithm is as follows: scalar types can be overwritten by each array<CustomFilterInterface> -- AddIndentFromLeft +- AddIndentFromLeft -- FixStrSize +- FixStrSize -- PrepareSourceLink +- PrepareSourceLink -- Quotemeta +- Quotemeta -- RemoveLineBrakes +- RemoveLineBrakes -- StrTypeToUrl +- StrTypeToUrl -- TextToCodeBlock +- TextToCodeBlock -- TextToHeading +- TextToHeading -- PregMatch +- PregMatch -- Implode +- Implode Filters that can be used in document templates @@ -205,9 +212,9 @@ The inheritance algorithm is as follows: scalar types can be overwritten by each array<PluginInterface>|null -- PageHtmlLinkerPlugin +- PageHtmlLinkerPlugin -- PageLinkerPlugin +- PageLinkerPlugin List of plugins @@ -223,4 +230,4 @@ The inheritance algorithm is as follows: scalar types can be overwritten by each

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Dec 23 23:00:37 2023 +0300
    Page content update date: Sat Dec 23 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Wed Jan 10 23:55:33 2024 +0300
    Page content update date: Thu Jan 11 2024
    Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/classes/ClassConstantEntitiesCollection.md b/docs/tech/02_parser/classes/ClassConstantEntitiesCollection.md similarity index 95% rename from docs/tech/classes/ClassConstantEntitiesCollection.md rename to docs/tech/02_parser/classes/ClassConstantEntitiesCollection.md index e68b718a..a0ce2089 100644 --- a/docs/tech/classes/ClassConstantEntitiesCollection.md +++ b/docs/tech/02_parser/classes/ClassConstantEntitiesCollection.md @@ -1,5 +1,4 @@ - - BumbleDocGen / Technical description of the project / Class map / ClassConstantEntitiesCollection
    + BumbleDocGen / Technical description of the project / Parser / Entities and entities collections / ClassConstantEntitiesCollection

    ClassConstantEntitiesCollection class: @@ -309,7 +308,7 @@ public function loadConstantEntities(): void; \DI\DependencyException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -400,11 +399,9 @@ public function unsafeGet(string $constantName): null|\BumbleDocGen\LanguageHand \DI\DependencyException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    - - \ No newline at end of file diff --git a/docs/tech/classes/ClassConstantEntity.md b/docs/tech/02_parser/classes/ClassConstantEntity.md similarity index 89% rename from docs/tech/classes/ClassConstantEntity.md rename to docs/tech/02_parser/classes/ClassConstantEntity.md index 98e2b743..9d7979b8 100644 --- a/docs/tech/classes/ClassConstantEntity.md +++ b/docs/tech/02_parser/classes/ClassConstantEntity.md @@ -1,5 +1,4 @@ - - BumbleDocGen / Technical description of the project / Class map / ClassConstantEntity
    + BumbleDocGen / Technical description of the project / Parser / Entities and entities collections / ClassConstantEntity

    ClassConstantEntity class: @@ -285,7 +284,7 @@ public function getAbsoluteFileName(): null|string; Throws: @@ -313,7 +312,7 @@ public function getAst(): \PhpParser\Node\Stmt\ClassConst; Throws: @@ -369,7 +368,7 @@ public function getCachedEntityDependencies(): array; \Psr\Cache\InvalidArgumentException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -422,7 +421,7 @@ public function getDescription(): string; Throws: @@ -452,7 +451,7 @@ public function getDescriptionLinks(): array; Throws: @@ -1115,7 +1114,7 @@ public function hasExamples(): bool; Throws: @@ -1145,7 +1144,7 @@ public function hasThrows(): bool; Throws: @@ -1175,7 +1174,7 @@ public function isApi(): bool; Throws: @@ -1205,7 +1204,7 @@ public function isDeprecated(): bool; Throws: @@ -1288,7 +1287,7 @@ public function isEntityFileCanBeLoad(): bool; Throws: @@ -1318,7 +1317,7 @@ public function isInternal(): bool; Throws: @@ -1346,7 +1345,7 @@ public function isPrivate(): bool; Throws: @@ -1374,7 +1373,7 @@ public function isProtected(): bool; Throws: @@ -1402,7 +1401,7 @@ public function isPublic(): bool; Throws: @@ -1501,5 +1500,3 @@ public function removeNotUsedEntityDataCache(): void;
    - - \ No newline at end of file diff --git a/docs/tech/classes/ClassConstantEntity_2.md b/docs/tech/02_parser/classes/ClassConstantEntity_2.md similarity index 89% rename from docs/tech/classes/ClassConstantEntity_2.md rename to docs/tech/02_parser/classes/ClassConstantEntity_2.md index f18a2bc6..bbc713c9 100644 --- a/docs/tech/classes/ClassConstantEntity_2.md +++ b/docs/tech/02_parser/classes/ClassConstantEntity_2.md @@ -1,5 +1,4 @@ - - BumbleDocGen / Technical description of the project / ClassConstantEntity
    + BumbleDocGen / Technical description of the project / Parser / ClassConstantEntity

    ClassConstantEntity class: @@ -285,7 +284,7 @@ public function getAbsoluteFileName(): null|string; Throws: @@ -313,7 +312,7 @@ public function getAst(): \PhpParser\Node\Stmt\ClassConst; Throws: @@ -369,7 +368,7 @@ public function getCachedEntityDependencies(): array; \Psr\Cache\InvalidArgumentException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -422,7 +421,7 @@ public function getDescription(): string; Throws: @@ -452,7 +451,7 @@ public function getDescriptionLinks(): array; Throws: @@ -1115,7 +1114,7 @@ public function hasExamples(): bool; Throws: @@ -1145,7 +1144,7 @@ public function hasThrows(): bool; Throws: @@ -1175,7 +1174,7 @@ public function isApi(): bool; Throws: @@ -1205,7 +1204,7 @@ public function isDeprecated(): bool; Throws: @@ -1288,7 +1287,7 @@ public function isEntityFileCanBeLoad(): bool; Throws: @@ -1318,7 +1317,7 @@ public function isInternal(): bool; Throws: @@ -1346,7 +1345,7 @@ public function isPrivate(): bool; Throws: @@ -1374,7 +1373,7 @@ public function isProtected(): bool; Throws: @@ -1402,7 +1401,7 @@ public function isPublic(): bool; Throws: @@ -1501,5 +1500,3 @@ public function removeNotUsedEntityDataCache(): void;
    - - \ No newline at end of file diff --git a/docs/tech/2.parser/classes/ClassEntity.md b/docs/tech/02_parser/classes/ClassEntity.md similarity index 89% rename from docs/tech/2.parser/classes/ClassEntity.md rename to docs/tech/02_parser/classes/ClassEntity.md index 22fb40b1..ce12ff6b 100644 --- a/docs/tech/2.parser/classes/ClassEntity.md +++ b/docs/tech/02_parser/classes/ClassEntity.md @@ -1,5 +1,4 @@ - - BumbleDocGen / Technical description of the project / Parser / Entities and entities collections / ClassEntity
    + BumbleDocGen / Technical description of the project / Parser / Entities and entities collections / ClassEntity

    ClassEntity class: @@ -500,7 +499,7 @@ public function cursorToDocAttributeLinkFragment(string $cursor, bool $isForDocu \DI\NotFoundException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -530,7 +529,7 @@ public function getAbsoluteFileName(): null|string; Throws: @@ -560,7 +559,7 @@ public function getAst(): \PhpParser\Node\Stmt\Class_|\PhpParser\Node\Stmt\Inter Throws: @@ -616,7 +615,7 @@ public function getCachedEntityDependencies(): array; \Psr\Cache\InvalidArgumentException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -674,7 +673,7 @@ public function getConstant(string $constantName, bool $unsafe = false): null|\B \DI\DependencyException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -710,7 +709,7 @@ public function getConstantEntitiesCollection(): \BumbleDocGen\LanguageHandler\P \DI\DependencyException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -718,7 +717,7 @@ public function getConstantEntitiesCollection(): \BumbleDocGen\LanguageHandler\P See:
    @@ -769,7 +768,7 @@ public function getConstantValue(string $constantName): string|array|int|bool|nu \DI\DependencyException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • \DI\NotFoundException
  • @@ -805,7 +804,7 @@ public function getConstants(): array; \DI\DependencyException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • \DI\NotFoundException
  • @@ -816,9 +815,9 @@ public function getConstants(): array; See:
    @@ -868,7 +867,7 @@ public function getConstantsData(bool $onlyFromCurrentClassAndTraits = false, in Throws: @@ -926,7 +925,7 @@ public function getConstantsValues(bool $onlyFromCurrentClassAndTraits = false, \DI\DependencyException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • \PhpParser\ConstExprEvaluationException
  • @@ -982,7 +981,7 @@ public function getDescription(): string; Throws: @@ -1012,7 +1011,7 @@ public function getDescriptionLinks(): array; Throws: @@ -515,7 +514,7 @@ public function getAbsoluteFileName(): null|string; Throws: @@ -543,7 +542,7 @@ public function getAst(): \PhpParser\Node\Stmt\Class_|\PhpParser\Node\Stmt\Inter Throws: @@ -599,7 +598,7 @@ public function getCachedEntityDependencies(): array; \Psr\Cache\InvalidArgumentException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -655,7 +654,7 @@ public function getConstant(string $constantName, bool $unsafe = false): null|\B \DI\DependencyException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -689,7 +688,7 @@ public function getConstantEntitiesCollection(): \BumbleDocGen\LanguageHandler\P \DI\DependencyException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -697,7 +696,7 @@ public function getConstantEntitiesCollection(): \BumbleDocGen\LanguageHandler\P See:
    @@ -746,7 +745,7 @@ public function getConstantValue(string $constantName): string|array|int|bool|nu \DI\DependencyException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • \DI\NotFoundException
  • @@ -780,7 +779,7 @@ public function getConstants(): array; \DI\DependencyException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • \DI\NotFoundException
  • @@ -791,9 +790,9 @@ public function getConstants(): array; See:
    @@ -841,7 +840,7 @@ public function getConstantsData(bool $onlyFromCurrentClassAndTraits = false, in Throws: @@ -897,7 +896,7 @@ public function getConstantsValues(bool $onlyFromCurrentClassAndTraits = false, \DI\DependencyException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • \PhpParser\ConstExprEvaluationException
  • @@ -953,7 +952,7 @@ public function getDescription(): string; Throws: @@ -983,7 +982,7 @@ public function getDescriptionLinks(): array; Throws: @@ -210,7 +212,7 @@ public function getCacheDir(): null|string; Throws: @@ -242,7 +244,7 @@ public function getConfigurationVersion(): string; ```php @@ -280,7 +282,7 @@ public function getGitClientPath(): string; Throws: @@ -291,7 +293,7 @@ public function getGitClientPath(): string; ```php @@ -325,7 +327,7 @@ public function getIfExists(mixed $key): null|string; Throws: @@ -359,7 +361,7 @@ public function getLanguageHandlersCollection(): \BumbleDocGen\LanguageHandler\L \DI\NotFoundException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -387,7 +389,7 @@ public function getOutputDir(): string; Throws: @@ -415,7 +417,7 @@ public function getOutputDirBaseUrl(): string; Throws: @@ -446,7 +448,7 @@ public function getPageLinkProcessor(): \BumbleDocGen\Core\Renderer\PageLinkProc \DI\DependencyException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • \DI\NotFoundException
  • @@ -480,7 +482,7 @@ public function getPlugins(): \BumbleDocGen\Core\Plugin\PluginsCollection; \DI\DependencyException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • \DI\NotFoundException
  • @@ -511,7 +513,7 @@ public function getProjectRoot(): string; Throws: @@ -542,7 +544,7 @@ public function getSourceLocators(): \BumbleDocGen\Core\Parser\SourceLocator\Sou \DI\DependencyException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • \DI\NotFoundException
  • @@ -573,7 +575,7 @@ public function getTemplatesDir(): string; Throws: @@ -607,7 +609,7 @@ public function getTwigFilters(): \BumbleDocGen\Core\Renderer\Twig\Filter\Custom \DI\NotFoundException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -638,7 +640,7 @@ public function getTwigFunctions(): \BumbleDocGen\Core\Renderer\Twig\Function\Cu \DI\DependencyException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • \DI\NotFoundException
  • @@ -652,7 +654,7 @@ public function getTwigFunctions(): \BumbleDocGen\Core\Renderer\Twig\Function\Cu ```php @@ -680,7 +682,7 @@ public function getWorkingDir(): string; ```php @@ -697,7 +699,35 @@ public function isCheckFileInGitBeforeCreatingDocEnabled(): bool; Throws: + + +
    +
    + + + +```php +public function renderWithFrontMatter(): bool; +``` + + + +Parameters: not specified + +Return value: bool + + +Throws: + @@ -725,11 +755,9 @@ public function useSharedCache(): bool; Throws:

    - - \ No newline at end of file diff --git a/docs/tech/classes/DirectoriesSourceLocator.md b/docs/tech/02_parser/classes/DirectoriesSourceLocator.md similarity index 92% rename from docs/tech/classes/DirectoriesSourceLocator.md rename to docs/tech/02_parser/classes/DirectoriesSourceLocator.md index 7c906adc..d72ad4e5 100644 --- a/docs/tech/classes/DirectoriesSourceLocator.md +++ b/docs/tech/02_parser/classes/DirectoriesSourceLocator.md @@ -1,5 +1,4 @@ - - BumbleDocGen / Technical description of the project / Class map / DirectoriesSourceLocator
    + BumbleDocGen / Technical description of the project / Parser / Source locators / DirectoriesSourceLocator

    DirectoriesSourceLocator class: @@ -106,5 +105,3 @@ public function getFinder(): \Symfony\Component\Finder\Finder;
    - - \ No newline at end of file diff --git a/docs/tech/classes/DynamicMethodEntity.md b/docs/tech/02_parser/classes/DynamicMethodEntity.md similarity index 97% rename from docs/tech/classes/DynamicMethodEntity.md rename to docs/tech/02_parser/classes/DynamicMethodEntity.md index 8fea58ca..2cba8ff7 100644 --- a/docs/tech/classes/DynamicMethodEntity.md +++ b/docs/tech/02_parser/classes/DynamicMethodEntity.md @@ -1,5 +1,4 @@ - - BumbleDocGen / Technical description of the project / Class map / DynamicMethodEntity
    + BumbleDocGen / Technical description of the project / Parser / Entities and entities collections / DynamicMethodEntity

    DynamicMethodEntity class: @@ -509,7 +508,7 @@ public function getRelativeFileName(): null|string; See:
    @@ -706,7 +705,7 @@ public function isEntityCacheOutdated(): bool; \Psr\Cache\InvalidArgumentException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -838,5 +837,3 @@ public function isStatic(): bool;
    - - \ No newline at end of file diff --git a/docs/tech/classes/EntityInterface.md b/docs/tech/02_parser/classes/EntityInterface.md similarity index 93% rename from docs/tech/classes/EntityInterface.md rename to docs/tech/02_parser/classes/EntityInterface.md index bab90127..6d185a4e 100644 --- a/docs/tech/classes/EntityInterface.md +++ b/docs/tech/02_parser/classes/EntityInterface.md @@ -1,5 +1,4 @@ - - BumbleDocGen / Technical description of the project / Class map / EntityInterface
    + BumbleDocGen / Technical description of the project / Parser / Entities and entities collections / EntityInterface

    EntityInterface class: @@ -143,7 +142,7 @@ public function getRelativeFileName(): null|string; See:
    @@ -210,5 +209,3 @@ public function isEntityCacheOutdated(): bool;
    - - \ No newline at end of file diff --git a/docs/tech/classes/EnumEntity.md b/docs/tech/02_parser/classes/EnumEntity.md similarity index 89% rename from docs/tech/classes/EnumEntity.md rename to docs/tech/02_parser/classes/EnumEntity.md index 33a1d908..71ae969a 100644 --- a/docs/tech/classes/EnumEntity.md +++ b/docs/tech/02_parser/classes/EnumEntity.md @@ -1,5 +1,4 @@ - - BumbleDocGen / Technical description of the project / Class map / EnumEntity
    + BumbleDocGen / Technical description of the project / Parser / Entities and entities collections / EnumEntity

    EnumEntity class: @@ -506,7 +505,7 @@ public function cursorToDocAttributeLinkFragment(string $cursor, bool $isForDocu \DI\NotFoundException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -536,7 +535,7 @@ public function getAbsoluteFileName(): null|string; Throws: @@ -566,7 +565,7 @@ public function getAst(): \PhpParser\Node\Stmt\Class_|\PhpParser\Node\Stmt\Inter Throws: @@ -622,7 +621,7 @@ public function getCachedEntityDependencies(): array; \Psr\Cache\InvalidArgumentException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -650,7 +649,7 @@ public function getCasesNames(): array; Throws: @@ -747,7 +746,7 @@ public function getConstantEntitiesCollection(): \BumbleDocGen\LanguageHandler\P \DI\DependencyException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -755,7 +754,7 @@ public function getConstantEntitiesCollection(): \BumbleDocGen\LanguageHandler\P See:
    @@ -806,7 +805,7 @@ public function getConstantValue(string $constantName): string|array|int|bool|nu \DI\DependencyException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • \DI\NotFoundException
  • @@ -842,7 +841,7 @@ public function getConstants(): array; \DI\DependencyException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • \DI\NotFoundException
  • @@ -853,9 +852,9 @@ public function getConstants(): array; See:
    @@ -905,7 +904,7 @@ public function getConstantsData(bool $onlyFromCurrentClassAndTraits = false, in Throws: @@ -963,7 +962,7 @@ public function getConstantsValues(bool $onlyFromCurrentClassAndTraits = false, \DI\DependencyException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • \PhpParser\ConstExprEvaluationException
  • @@ -1019,7 +1018,7 @@ public function getDescription(): string; Throws: @@ -1049,7 +1048,7 @@ public function getDescriptionLinks(): array; Throws: @@ -707,7 +706,7 @@ public function getConstantEntitiesCollection(): \BumbleDocGen\LanguageHandler\P \DI\DependencyException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -715,7 +714,7 @@ public function getConstantEntitiesCollection(): \BumbleDocGen\LanguageHandler\P See:
    @@ -766,7 +765,7 @@ public function getConstantValue(string $constantName): string|array|int|bool|nu \DI\DependencyException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • \DI\NotFoundException
  • @@ -802,7 +801,7 @@ public function getConstants(): array; \DI\DependencyException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • \DI\NotFoundException
  • @@ -813,9 +812,9 @@ public function getConstants(): array; See:
    @@ -865,7 +864,7 @@ public function getConstantsData(bool $onlyFromCurrentClassAndTraits = false, in Throws: @@ -923,7 +922,7 @@ public function getConstantsValues(bool $onlyFromCurrentClassAndTraits = false, \DI\DependencyException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • \PhpParser\ConstExprEvaluationException
  • @@ -979,7 +978,7 @@ public function getDescription(): string; Throws: @@ -1009,7 +1008,7 @@ public function getDescriptionLinks(): array; Throws: @@ -370,7 +369,7 @@ public function loadMethodEntities(): void; See:
    @@ -459,11 +458,9 @@ public function unsafeGet(string $objectName): null|\BumbleDocGen\LanguageHandle \DI\DependencyException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    - - \ No newline at end of file diff --git a/docs/tech/classes/MethodEntity.md b/docs/tech/02_parser/classes/MethodEntity.md similarity index 92% rename from docs/tech/classes/MethodEntity.md rename to docs/tech/02_parser/classes/MethodEntity.md index d27ae752..abc48f0e 100644 --- a/docs/tech/classes/MethodEntity.md +++ b/docs/tech/02_parser/classes/MethodEntity.md @@ -1,5 +1,4 @@ - - BumbleDocGen / Technical description of the project / Class map / MethodEntity
    + BumbleDocGen / Technical description of the project / Parser / Entities and entities collections / MethodEntity

    MethodEntity class: @@ -329,7 +328,7 @@ public function getAbsoluteFileName(): null|string; Throws: @@ -357,7 +356,7 @@ public function getAst(): \PhpParser\Node\Stmt\ClassMethod; Throws: @@ -434,7 +433,7 @@ public function getCachedEntityDependencies(): array; \Psr\Cache\InvalidArgumentException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -487,7 +486,7 @@ public function getDescription(): string; Throws: @@ -517,7 +516,7 @@ public function getDescriptionLinks(): array; Throws: @@ -1041,7 +1040,7 @@ public function getRelativeFileName(): null|string; See:
    @@ -1216,7 +1215,7 @@ public function getThrows(): array; Throws: @@ -1246,7 +1245,7 @@ public function getThrowsDocBlockLinks(): array; Throws: @@ -1306,7 +1305,7 @@ public function hasExamples(): bool; Throws: @@ -1336,7 +1335,7 @@ public function hasThrows(): bool; Throws: @@ -1366,7 +1365,7 @@ public function isApi(): bool; Throws: @@ -1417,7 +1416,7 @@ public function isDeprecated(): bool; Throws: @@ -1521,7 +1520,7 @@ public function isEntityFileCanBeLoad(): bool; Throws: @@ -1593,7 +1592,7 @@ public function isInternal(): bool; Throws: @@ -1776,5 +1775,3 @@ public function removeNotUsedEntityDataCache(): void;
    - - \ No newline at end of file diff --git a/docs/tech/classes/OnlyFromCurrentClassCondition.md b/docs/tech/02_parser/classes/OnlyFromCurrentClassCondition.md similarity index 89% rename from docs/tech/classes/OnlyFromCurrentClassCondition.md rename to docs/tech/02_parser/classes/OnlyFromCurrentClassCondition.md index 2d3b716a..dfcd5eb3 100644 --- a/docs/tech/classes/OnlyFromCurrentClassCondition.md +++ b/docs/tech/02_parser/classes/OnlyFromCurrentClassCondition.md @@ -1,5 +1,4 @@ - - BumbleDocGen / Technical description of the project / Class map / OnlyFromCurrentClassCondition
    + BumbleDocGen / Technical description of the project / Parser / Entity filter conditions / OnlyFromCurrentClassCondition

    OnlyFromCurrentClassCondition class: @@ -77,5 +76,3 @@ public function canAddToCollection(\BumbleDocGen\Core\Parser\Entity\EntityInterf
    - - \ No newline at end of file diff --git a/docs/tech/classes/OnlyFromCurrentClassCondition_2.md b/docs/tech/02_parser/classes/OnlyFromCurrentClassCondition_2.md similarity index 89% rename from docs/tech/classes/OnlyFromCurrentClassCondition_2.md rename to docs/tech/02_parser/classes/OnlyFromCurrentClassCondition_2.md index df0aa797..6ca28f92 100644 --- a/docs/tech/classes/OnlyFromCurrentClassCondition_2.md +++ b/docs/tech/02_parser/classes/OnlyFromCurrentClassCondition_2.md @@ -1,5 +1,4 @@ - - BumbleDocGen / Technical description of the project / Class map / OnlyFromCurrentClassCondition
    + BumbleDocGen / Technical description of the project / Parser / Entity filter conditions / OnlyFromCurrentClassCondition

    OnlyFromCurrentClassCondition class: @@ -77,5 +76,3 @@ public function canAddToCollection(\BumbleDocGen\Core\Parser\Entity\EntityInterf
    - - \ No newline at end of file diff --git a/docs/tech/classes/PhpEntitiesCollection.md b/docs/tech/02_parser/classes/PhpEntitiesCollection.md similarity index 95% rename from docs/tech/classes/PhpEntitiesCollection.md rename to docs/tech/02_parser/classes/PhpEntitiesCollection.md index 19f1f69c..1e313547 100644 --- a/docs/tech/classes/PhpEntitiesCollection.md +++ b/docs/tech/02_parser/classes/PhpEntitiesCollection.md @@ -1,5 +1,4 @@ - - BumbleDocGen / Technical description of the project / Class map / PhpEntitiesCollection
    + BumbleDocGen / Technical description of the project / Parser / Entities and entities collections / PhpEntitiesCollection

    PhpEntitiesCollection class: @@ -244,7 +243,7 @@ public function add(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEnt Throws: @@ -312,7 +311,7 @@ public function filterByInterfaces(array $interfaces): \BumbleDocGen\LanguageHan Throws: @@ -395,7 +394,7 @@ public function filterByParentClassNames(array $parentClassNames): \BumbleDocGen Throws: @@ -440,7 +439,7 @@ public function filterByPaths(array $paths): \BumbleDocGen\LanguageHandler\Php\P Throws: @@ -671,7 +670,7 @@ public function getLoadedOrCreateNew(string $objectName, bool $withAddClassEntit See:
    @@ -697,7 +696,7 @@ public function getOnlyAbstractClasses(): \BumbleDocGen\LanguageHandler\Php\Pars Throws: @@ -939,7 +938,7 @@ public function internalGetLoadedOrCreateNew(string $objectName, bool $withAddCl \DI\NotFoundException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -1026,7 +1025,7 @@ public function loadEntities(\BumbleDocGen\Core\Parser\SourceLocator\SourceLocat \DI\NotFoundException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -1080,7 +1079,7 @@ public function loadEntitiesByConfiguration(\BumbleDocGen\Core\Parser\Entity\Ent \DI\DependencyException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -1179,5 +1178,3 @@ public function updateEntitiesCache(): void;
    - - \ No newline at end of file diff --git a/docs/tech/classes/PhpHandlerSettings.md b/docs/tech/02_parser/classes/PhpHandlerSettings.md similarity index 85% rename from docs/tech/classes/PhpHandlerSettings.md rename to docs/tech/02_parser/classes/PhpHandlerSettings.md index 5b3abf00..b3acb783 100644 --- a/docs/tech/classes/PhpHandlerSettings.md +++ b/docs/tech/02_parser/classes/PhpHandlerSettings.md @@ -1,5 +1,4 @@ - - BumbleDocGen / Technical description of the project / Class map / PhpHandlerSettings
    + BumbleDocGen / Technical description of the project / Parser / PhpHandlerSettings

    PhpHandlerSettings class: @@ -160,7 +159,7 @@ public function getClassConstantEntityFilter(): \BumbleDocGen\Core\Parser\Filter \DI\NotFoundException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -194,7 +193,7 @@ public function getClassEntityFilter(): \BumbleDocGen\Core\Parser\FilterConditio \DI\NotFoundException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -222,7 +221,7 @@ public function getComposerConfigFile(): null|string; Throws: @@ -250,7 +249,7 @@ public function getComposerVendorDir(): null|string; Throws: @@ -281,7 +280,7 @@ public function getCustomTwigFilters(): \BumbleDocGen\Core\Renderer\Twig\Filter\ \DI\DependencyException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • \DI\NotFoundException
  • @@ -315,7 +314,7 @@ public function getCustomTwigFunctions(): \BumbleDocGen\Core\Renderer\Twig\Funct \DI\DependencyException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • \DI\NotFoundException
  • @@ -349,7 +348,7 @@ public function getEntityDocRenderersCollection(): \BumbleDocGen\Core\Renderer\E \DI\DependencyException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • \DI\NotFoundException
  • @@ -380,7 +379,7 @@ public function getFileSourceBaseUrl(): null|string; Throws: @@ -411,7 +410,7 @@ public function getMethodEntityFilter(): \BumbleDocGen\Core\Parser\FilterConditi \DI\DependencyException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • \DI\NotFoundException
  • @@ -445,7 +444,7 @@ public function getPropertyEntityFilter(): \BumbleDocGen\Core\Parser\FilterCondi \DI\DependencyException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • \DI\NotFoundException
  • @@ -476,7 +475,7 @@ public function getPsr4Map(): array; Throws: @@ -504,11 +503,9 @@ public function getUseComposerAutoload(): bool; Throws:
    - - \ No newline at end of file diff --git a/docs/tech/classes/ProjectParser.md b/docs/tech/02_parser/classes/ProjectParser.md similarity index 92% rename from docs/tech/classes/ProjectParser.md rename to docs/tech/02_parser/classes/ProjectParser.md index 952b3e02..4b1e91cd 100644 --- a/docs/tech/classes/ProjectParser.md +++ b/docs/tech/02_parser/classes/ProjectParser.md @@ -1,5 +1,4 @@ - - BumbleDocGen / Technical description of the project / Class map / ProjectParser
    + BumbleDocGen / Technical description of the project / Parser / ProjectParser

    ProjectParser class: @@ -144,7 +143,7 @@ public function getEntityCollectionForPL(string $plHandlerClassName): null|\Bumb \DI\NotFoundException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -213,7 +212,7 @@ public function parse(\BumbleDocGen\Core\Parser\Entity\EntitiesLoaderProgressBar \DI\DependencyException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • \DI\NotFoundException
  • @@ -222,5 +221,3 @@ public function parse(\BumbleDocGen\Core\Parser\Entity\EntitiesLoaderProgressBar
    - - \ No newline at end of file diff --git a/docs/tech/classes/PropertyEntitiesCollection.md b/docs/tech/02_parser/classes/PropertyEntitiesCollection.md similarity index 94% rename from docs/tech/classes/PropertyEntitiesCollection.md rename to docs/tech/02_parser/classes/PropertyEntitiesCollection.md index a157f085..c759783c 100644 --- a/docs/tech/classes/PropertyEntitiesCollection.md +++ b/docs/tech/02_parser/classes/PropertyEntitiesCollection.md @@ -1,5 +1,4 @@ - - BumbleDocGen / Technical description of the project / Class map / PropertyEntitiesCollection
    + BumbleDocGen / Technical description of the project / Parser / Entities and entities collections / PropertyEntitiesCollection

    PropertyEntitiesCollection class: @@ -306,7 +305,7 @@ public function loadPropertyEntities(): void; \DI\DependencyException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • \DI\NotFoundException
  • @@ -317,7 +316,7 @@ public function loadPropertyEntities(): void; See:
    @@ -406,11 +405,9 @@ public function unsafeGet(string $objectName): null|\BumbleDocGen\LanguageHandle \DI\NotFoundException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    - - \ No newline at end of file diff --git a/docs/tech/classes/PropertyEntity.md b/docs/tech/02_parser/classes/PropertyEntity.md similarity index 89% rename from docs/tech/classes/PropertyEntity.md rename to docs/tech/02_parser/classes/PropertyEntity.md index 5c66e145..fe25d5b0 100644 --- a/docs/tech/classes/PropertyEntity.md +++ b/docs/tech/02_parser/classes/PropertyEntity.md @@ -1,5 +1,4 @@ - - BumbleDocGen / Technical description of the project / Class map / PropertyEntity
    + BumbleDocGen / Technical description of the project / Parser / Entities and entities collections / PropertyEntity

    PropertyEntity class: @@ -294,7 +293,7 @@ public function getAbsoluteFileName(): null|string; Throws: @@ -322,7 +321,7 @@ public function getAst(): \PhpParser\Node\Stmt\Property; Throws: @@ -378,7 +377,7 @@ public function getCachedEntityDependencies(): array; \Psr\Cache\InvalidArgumentException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -432,7 +431,7 @@ public function getDefaultValue(): string|array|int|bool|null|float; \PhpParser\ConstExprEvaluationException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -462,7 +461,7 @@ public function getDescription(): string; Throws: @@ -492,7 +491,7 @@ public function getDescriptionLinks(): array; Throws: @@ -941,7 +940,7 @@ public function getRelativeFileName(): null|string; See:
    @@ -1053,7 +1052,7 @@ public function getThrows(): array; Throws: @@ -1083,7 +1082,7 @@ public function getThrowsDocBlockLinks(): array; Throws: @@ -1117,7 +1116,7 @@ public function getType(): string; \DI\DependencyException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -1177,7 +1176,7 @@ public function hasExamples(): bool; Throws: @@ -1207,7 +1206,7 @@ public function hasThrows(): bool; Throws: @@ -1237,7 +1236,7 @@ public function isApi(): bool; Throws: @@ -1267,7 +1266,7 @@ public function isDeprecated(): bool; Throws: @@ -1350,7 +1349,7 @@ public function isEntityFileCanBeLoad(): bool; Throws: @@ -1401,7 +1400,7 @@ public function isInternal(): bool; Throws: @@ -1429,7 +1428,7 @@ public function isPrivate(): bool; Throws: @@ -1457,7 +1456,7 @@ public function isProtected(): bool; Throws: @@ -1485,7 +1484,7 @@ public function isPublic(): bool; Throws: @@ -1584,5 +1583,3 @@ public function removeNotUsedEntityDataCache(): void;
    - - \ No newline at end of file diff --git a/docs/tech/classes/RecursiveDirectoriesSourceLocator.md b/docs/tech/02_parser/classes/RecursiveDirectoriesSourceLocator.md similarity index 93% rename from docs/tech/classes/RecursiveDirectoriesSourceLocator.md rename to docs/tech/02_parser/classes/RecursiveDirectoriesSourceLocator.md index ecb033ca..5e15b9ba 100644 --- a/docs/tech/classes/RecursiveDirectoriesSourceLocator.md +++ b/docs/tech/02_parser/classes/RecursiveDirectoriesSourceLocator.md @@ -1,5 +1,4 @@ - - BumbleDocGen / Technical description of the project / Class map / RecursiveDirectoriesSourceLocator
    + BumbleDocGen / Technical description of the project / Parser / Source locators / RecursiveDirectoriesSourceLocator

    RecursiveDirectoriesSourceLocator class: @@ -116,5 +115,3 @@ public function getFinder(): \Symfony\Component\Finder\Finder;
    - - \ No newline at end of file diff --git a/docs/tech/classes/RootEntityCollection.md b/docs/tech/02_parser/classes/RootEntityCollection.md similarity index 97% rename from docs/tech/classes/RootEntityCollection.md rename to docs/tech/02_parser/classes/RootEntityCollection.md index 70ff0443..a9a13e80 100644 --- a/docs/tech/classes/RootEntityCollection.md +++ b/docs/tech/02_parser/classes/RootEntityCollection.md @@ -1,5 +1,4 @@ - - BumbleDocGen / Technical description of the project / Class map / RootEntityCollection
    + BumbleDocGen / Technical description of the project / Parser / Entities and entities collections / RootEntityCollection

    RootEntityCollection class: @@ -294,7 +293,7 @@ public function getLoadedOrCreateNew(string $objectName, bool $withAddClassEntit See:
    @@ -536,5 +535,3 @@ public function updateEntitiesCache(): void;
    - - \ No newline at end of file diff --git a/docs/tech/classes/RootEntityInterface_2.md b/docs/tech/02_parser/classes/RootEntityInterface.md similarity index 97% rename from docs/tech/classes/RootEntityInterface_2.md rename to docs/tech/02_parser/classes/RootEntityInterface.md index e5ba8b82..2d506c9b 100644 --- a/docs/tech/classes/RootEntityInterface_2.md +++ b/docs/tech/02_parser/classes/RootEntityInterface.md @@ -1,5 +1,4 @@ - - BumbleDocGen / Technical description of the project / RootEntityInterface
    + BumbleDocGen / Technical description of the project / Parser / RootEntityInterface

    RootEntityInterface class: @@ -256,7 +255,7 @@ public function getRelativeFileName(): null|string; See:
    @@ -468,5 +467,3 @@ public static function normalizeClassName(string $name): string;
    - - \ No newline at end of file diff --git a/docs/tech/classes/SingleFileSourceLocator.md b/docs/tech/02_parser/classes/SingleFileSourceLocator.md similarity index 92% rename from docs/tech/classes/SingleFileSourceLocator.md rename to docs/tech/02_parser/classes/SingleFileSourceLocator.md index 25505e07..8ec0205f 100644 --- a/docs/tech/classes/SingleFileSourceLocator.md +++ b/docs/tech/02_parser/classes/SingleFileSourceLocator.md @@ -1,5 +1,4 @@ - - BumbleDocGen / Technical description of the project / Class map / SingleFileSourceLocator
    + BumbleDocGen / Technical description of the project / Parser / Source locators / SingleFileSourceLocator

    SingleFileSourceLocator class: @@ -106,5 +105,3 @@ public function getFinder(): \Symfony\Component\Finder\Finder;
    - - \ No newline at end of file diff --git a/docs/tech/classes/SourceLocatorInterface.md b/docs/tech/02_parser/classes/SourceLocatorInterface.md similarity index 85% rename from docs/tech/classes/SourceLocatorInterface.md rename to docs/tech/02_parser/classes/SourceLocatorInterface.md index 0bb8e92b..65dbdcd1 100644 --- a/docs/tech/classes/SourceLocatorInterface.md +++ b/docs/tech/02_parser/classes/SourceLocatorInterface.md @@ -1,5 +1,4 @@ - - BumbleDocGen / Technical description of the project / Class map / SourceLocatorInterface
    + BumbleDocGen / Technical description of the project / Parser / Source locators / SourceLocatorInterface

    SourceLocatorInterface class: @@ -60,5 +59,3 @@ public function getFinder(): null|\Symfony\Component\Finder\Finder;
    - - \ No newline at end of file diff --git a/docs/tech/2.parser/classes/TraitEntity.md b/docs/tech/02_parser/classes/TraitEntity.md similarity index 89% rename from docs/tech/2.parser/classes/TraitEntity.md rename to docs/tech/02_parser/classes/TraitEntity.md index 397f5ffc..c3d74282 100644 --- a/docs/tech/2.parser/classes/TraitEntity.md +++ b/docs/tech/02_parser/classes/TraitEntity.md @@ -1,5 +1,4 @@ - - BumbleDocGen / Technical description of the project / Parser / Entities and entities collections / TraitEntity
    + BumbleDocGen / Technical description of the project / Parser / Entities and entities collections / TraitEntity

    TraitEntity class: @@ -497,7 +496,7 @@ public function cursorToDocAttributeLinkFragment(string $cursor, bool $isForDocu \DI\NotFoundException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -527,7 +526,7 @@ public function getAbsoluteFileName(): null|string; Throws: @@ -557,7 +556,7 @@ public function getAst(): \PhpParser\Node\Stmt\Class_|\PhpParser\Node\Stmt\Inter Throws: @@ -613,7 +612,7 @@ public function getCachedEntityDependencies(): array; \Psr\Cache\InvalidArgumentException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -671,7 +670,7 @@ public function getConstant(string $constantName, bool $unsafe = false): null|\B \DI\DependencyException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -707,7 +706,7 @@ public function getConstantEntitiesCollection(): \BumbleDocGen\LanguageHandler\P \DI\DependencyException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -715,7 +714,7 @@ public function getConstantEntitiesCollection(): \BumbleDocGen\LanguageHandler\P See:
    @@ -766,7 +765,7 @@ public function getConstantValue(string $constantName): string|array|int|bool|nu \DI\DependencyException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • \DI\NotFoundException
  • @@ -802,7 +801,7 @@ public function getConstants(): array; \DI\DependencyException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • \DI\NotFoundException
  • @@ -813,9 +812,9 @@ public function getConstants(): array; See:
    @@ -865,7 +864,7 @@ public function getConstantsData(bool $onlyFromCurrentClassAndTraits = false, in Throws: @@ -923,7 +922,7 @@ public function getConstantsValues(bool $onlyFromCurrentClassAndTraits = false, \DI\DependencyException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • \PhpParser\ConstExprEvaluationException
  • @@ -979,7 +978,7 @@ public function getDescription(): string; Throws: @@ -1009,7 +1008,7 @@ public function getDescriptionLinks(): array; Throws: @@ -422,7 +421,7 @@ public function getDescription(): string; Throws: @@ -452,7 +451,7 @@ public function getDescriptionLinks(): array; Throws: @@ -1115,7 +1114,7 @@ public function hasExamples(): bool; Throws: @@ -1145,7 +1144,7 @@ public function hasThrows(): bool; Throws: @@ -1175,7 +1174,7 @@ public function isApi(): bool; Throws: @@ -1205,7 +1204,7 @@ public function isDeprecated(): bool; Throws: @@ -1288,7 +1287,7 @@ public function isEntityFileCanBeLoad(): bool; Throws: @@ -1318,7 +1317,7 @@ public function isInternal(): bool; Throws: @@ -1346,7 +1345,7 @@ public function isPrivate(): bool; Throws: @@ -1374,7 +1373,7 @@ public function isProtected(): bool; Throws: @@ -1402,7 +1401,7 @@ public function isPublic(): bool; Throws: @@ -1501,5 +1500,3 @@ public function removeNotUsedEntityDataCache(): void;
    - - \ No newline at end of file diff --git a/docs/tech/2.parser/classes/ClassConstantEntity_2.md b/docs/tech/02_parser/reflectionApi/php/classes/ClassConstantEntity_2.md similarity index 87% rename from docs/tech/2.parser/classes/ClassConstantEntity_2.md rename to docs/tech/02_parser/reflectionApi/php/classes/ClassConstantEntity_2.md index 8e8b3deb..0254d7cc 100644 --- a/docs/tech/2.parser/classes/ClassConstantEntity_2.md +++ b/docs/tech/02_parser/reflectionApi/php/classes/ClassConstantEntity_2.md @@ -1,5 +1,4 @@ - - BumbleDocGen / Technical description of the project / Parser / ClassConstantEntity
    + BumbleDocGen / Technical description of the project / Parser / Reflection API / Reflection API for PHP / ClassConstantEntity

    ClassConstantEntity class: @@ -285,7 +284,7 @@ public function getAbsoluteFileName(): null|string; Throws: @@ -313,7 +312,7 @@ public function getAst(): \PhpParser\Node\Stmt\ClassConst; Throws: @@ -369,7 +368,7 @@ public function getCachedEntityDependencies(): array; \Psr\Cache\InvalidArgumentException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -422,7 +421,7 @@ public function getDescription(): string; Throws: @@ -452,7 +451,7 @@ public function getDescriptionLinks(): array; Throws: @@ -1115,7 +1114,7 @@ public function hasExamples(): bool; Throws: @@ -1145,7 +1144,7 @@ public function hasThrows(): bool; Throws: @@ -1175,7 +1174,7 @@ public function isApi(): bool; Throws: @@ -1205,7 +1204,7 @@ public function isDeprecated(): bool; Throws: @@ -1288,7 +1287,7 @@ public function isEntityFileCanBeLoad(): bool; Throws: @@ -1318,7 +1317,7 @@ public function isInternal(): bool; Throws: @@ -1346,7 +1345,7 @@ public function isPrivate(): bool; Throws: @@ -1374,7 +1373,7 @@ public function isProtected(): bool; Throws: @@ -1402,7 +1401,7 @@ public function isPublic(): bool; Throws: @@ -1501,5 +1500,3 @@ public function removeNotUsedEntityDataCache(): void;
    - - \ No newline at end of file diff --git a/docs/tech/classes/ClassEntity.md b/docs/tech/02_parser/reflectionApi/php/classes/ClassEntity.md similarity index 88% rename from docs/tech/classes/ClassEntity.md rename to docs/tech/02_parser/reflectionApi/php/classes/ClassEntity.md index 8535d10c..7401aedc 100644 --- a/docs/tech/classes/ClassEntity.md +++ b/docs/tech/02_parser/reflectionApi/php/classes/ClassEntity.md @@ -1,5 +1,4 @@ - - BumbleDocGen / Technical description of the project / Class map / ClassEntity
    + BumbleDocGen / Technical description of the project / Parser / Reflection API / Reflection API for PHP / PHP class reflection API / ClassEntity

    ClassEntity class: @@ -500,7 +499,7 @@ public function cursorToDocAttributeLinkFragment(string $cursor, bool $isForDocu \DI\NotFoundException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -530,7 +529,7 @@ public function getAbsoluteFileName(): null|string; Throws: @@ -560,7 +559,7 @@ public function getAst(): \PhpParser\Node\Stmt\Class_|\PhpParser\Node\Stmt\Inter Throws: @@ -616,7 +615,7 @@ public function getCachedEntityDependencies(): array; \Psr\Cache\InvalidArgumentException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -674,7 +673,7 @@ public function getConstant(string $constantName, bool $unsafe = false): null|\B \DI\DependencyException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -710,7 +709,7 @@ public function getConstantEntitiesCollection(): \BumbleDocGen\LanguageHandler\P \DI\DependencyException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -718,7 +717,7 @@ public function getConstantEntitiesCollection(): \BumbleDocGen\LanguageHandler\P See:
    @@ -769,7 +768,7 @@ public function getConstantValue(string $constantName): string|array|int|bool|nu \DI\DependencyException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • \DI\NotFoundException
  • @@ -805,7 +804,7 @@ public function getConstants(): array; \DI\DependencyException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • \DI\NotFoundException
  • @@ -816,9 +815,9 @@ public function getConstants(): array; See:
    @@ -868,7 +867,7 @@ public function getConstantsData(bool $onlyFromCurrentClassAndTraits = false, in Throws: @@ -926,7 +925,7 @@ public function getConstantsValues(bool $onlyFromCurrentClassAndTraits = false, \DI\DependencyException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • \PhpParser\ConstExprEvaluationException
  • @@ -982,7 +981,7 @@ public function getDescription(): string; Throws: @@ -1012,7 +1011,7 @@ public function getDescriptionLinks(): array; Throws: @@ -515,7 +514,7 @@ public function getAbsoluteFileName(): null|string; Throws: @@ -543,7 +542,7 @@ public function getAst(): \PhpParser\Node\Stmt\Class_|\PhpParser\Node\Stmt\Inter Throws: @@ -599,7 +598,7 @@ public function getCachedEntityDependencies(): array; \Psr\Cache\InvalidArgumentException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -655,7 +654,7 @@ public function getConstant(string $constantName, bool $unsafe = false): null|\B \DI\DependencyException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -689,7 +688,7 @@ public function getConstantEntitiesCollection(): \BumbleDocGen\LanguageHandler\P \DI\DependencyException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -697,7 +696,7 @@ public function getConstantEntitiesCollection(): \BumbleDocGen\LanguageHandler\P See:
    @@ -746,7 +745,7 @@ public function getConstantValue(string $constantName): string|array|int|bool|nu \DI\DependencyException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • \DI\NotFoundException
  • @@ -780,7 +779,7 @@ public function getConstants(): array; \DI\DependencyException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • \DI\NotFoundException
  • @@ -791,9 +790,9 @@ public function getConstants(): array; See:
    @@ -841,7 +840,7 @@ public function getConstantsData(bool $onlyFromCurrentClassAndTraits = false, in Throws: @@ -897,7 +896,7 @@ public function getConstantsValues(bool $onlyFromCurrentClassAndTraits = false, \DI\DependencyException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • \PhpParser\ConstExprEvaluationException
  • @@ -953,7 +952,7 @@ public function getDescription(): string; Throws: @@ -983,7 +982,7 @@ public function getDescriptionLinks(): array; Throws: @@ -515,7 +514,7 @@ public function getAbsoluteFileName(): null|string; Throws: @@ -543,7 +542,7 @@ public function getAst(): \PhpParser\Node\Stmt\Class_|\PhpParser\Node\Stmt\Inter Throws: @@ -599,7 +598,7 @@ public function getCachedEntityDependencies(): array; \Psr\Cache\InvalidArgumentException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -655,7 +654,7 @@ public function getConstant(string $constantName, bool $unsafe = false): null|\B \DI\DependencyException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -689,7 +688,7 @@ public function getConstantEntitiesCollection(): \BumbleDocGen\LanguageHandler\P \DI\DependencyException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -697,7 +696,7 @@ public function getConstantEntitiesCollection(): \BumbleDocGen\LanguageHandler\P See:
    @@ -746,7 +745,7 @@ public function getConstantValue(string $constantName): string|array|int|bool|nu \DI\DependencyException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • \DI\NotFoundException
  • @@ -780,7 +779,7 @@ public function getConstants(): array; \DI\DependencyException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • \DI\NotFoundException
  • @@ -791,9 +790,9 @@ public function getConstants(): array; See:
    @@ -841,7 +840,7 @@ public function getConstantsData(bool $onlyFromCurrentClassAndTraits = false, in Throws: @@ -897,7 +896,7 @@ public function getConstantsValues(bool $onlyFromCurrentClassAndTraits = false, \DI\DependencyException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • \PhpParser\ConstExprEvaluationException
  • @@ -953,7 +952,7 @@ public function getDescription(): string; Throws: @@ -983,7 +982,7 @@ public function getDescriptionLinks(): array; Throws: @@ -515,7 +514,7 @@ public function getAbsoluteFileName(): null|string; Throws: @@ -543,7 +542,7 @@ public function getAst(): \PhpParser\Node\Stmt\Class_|\PhpParser\Node\Stmt\Inter Throws: @@ -599,7 +598,7 @@ public function getCachedEntityDependencies(): array; \Psr\Cache\InvalidArgumentException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -655,7 +654,7 @@ public function getConstant(string $constantName, bool $unsafe = false): null|\B \DI\DependencyException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -689,7 +688,7 @@ public function getConstantEntitiesCollection(): \BumbleDocGen\LanguageHandler\P \DI\DependencyException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -697,7 +696,7 @@ public function getConstantEntitiesCollection(): \BumbleDocGen\LanguageHandler\P See:
    @@ -746,7 +745,7 @@ public function getConstantValue(string $constantName): string|array|int|bool|nu \DI\DependencyException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • \DI\NotFoundException
  • @@ -780,7 +779,7 @@ public function getConstants(): array; \DI\DependencyException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • \DI\NotFoundException
  • @@ -791,9 +790,9 @@ public function getConstants(): array; See:
    @@ -841,7 +840,7 @@ public function getConstantsData(bool $onlyFromCurrentClassAndTraits = false, in Throws: @@ -897,7 +896,7 @@ public function getConstantsValues(bool $onlyFromCurrentClassAndTraits = false, \DI\DependencyException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • \PhpParser\ConstExprEvaluationException
  • @@ -953,7 +952,7 @@ public function getDescription(): string; Throws: @@ -983,7 +982,7 @@ public function getDescriptionLinks(): array; Throws: @@ -515,7 +514,7 @@ public function getAbsoluteFileName(): null|string; Throws: @@ -543,7 +542,7 @@ public function getAst(): \PhpParser\Node\Stmt\Class_|\PhpParser\Node\Stmt\Inter Throws: @@ -599,7 +598,7 @@ public function getCachedEntityDependencies(): array; \Psr\Cache\InvalidArgumentException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -655,7 +654,7 @@ public function getConstant(string $constantName, bool $unsafe = false): null|\B \DI\DependencyException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -689,7 +688,7 @@ public function getConstantEntitiesCollection(): \BumbleDocGen\LanguageHandler\P \DI\DependencyException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -697,7 +696,7 @@ public function getConstantEntitiesCollection(): \BumbleDocGen\LanguageHandler\P See:
    @@ -746,7 +745,7 @@ public function getConstantValue(string $constantName): string|array|int|bool|nu \DI\DependencyException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • \DI\NotFoundException
  • @@ -780,7 +779,7 @@ public function getConstants(): array; \DI\DependencyException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • \DI\NotFoundException
  • @@ -791,9 +790,9 @@ public function getConstants(): array; See:
    @@ -841,7 +840,7 @@ public function getConstantsData(bool $onlyFromCurrentClassAndTraits = false, in Throws: @@ -897,7 +896,7 @@ public function getConstantsValues(bool $onlyFromCurrentClassAndTraits = false, \DI\DependencyException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • \PhpParser\ConstExprEvaluationException
  • @@ -953,7 +952,7 @@ public function getDescription(): string; Throws: @@ -983,7 +982,7 @@ public function getDescriptionLinks(): array; Throws: @@ -515,7 +514,7 @@ public function getAbsoluteFileName(): null|string; Throws: @@ -543,7 +542,7 @@ public function getAst(): \PhpParser\Node\Stmt\Class_|\PhpParser\Node\Stmt\Inter Throws: @@ -599,7 +598,7 @@ public function getCachedEntityDependencies(): array; \Psr\Cache\InvalidArgumentException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -655,7 +654,7 @@ public function getConstant(string $constantName, bool $unsafe = false): null|\B \DI\DependencyException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -689,7 +688,7 @@ public function getConstantEntitiesCollection(): \BumbleDocGen\LanguageHandler\P \DI\DependencyException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -697,7 +696,7 @@ public function getConstantEntitiesCollection(): \BumbleDocGen\LanguageHandler\P See:
    @@ -746,7 +745,7 @@ public function getConstantValue(string $constantName): string|array|int|bool|nu \DI\DependencyException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • \DI\NotFoundException
  • @@ -780,7 +779,7 @@ public function getConstants(): array; \DI\DependencyException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • \DI\NotFoundException
  • @@ -791,9 +790,9 @@ public function getConstants(): array; See:
    @@ -841,7 +840,7 @@ public function getConstantsData(bool $onlyFromCurrentClassAndTraits = false, in Throws: @@ -897,7 +896,7 @@ public function getConstantsValues(bool $onlyFromCurrentClassAndTraits = false, \DI\DependencyException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • \PhpParser\ConstExprEvaluationException
  • @@ -953,7 +952,7 @@ public function getDescription(): string; Throws: @@ -983,7 +982,7 @@ public function getDescriptionLinks(): array; Throws: @@ -210,7 +212,7 @@ public function getCacheDir(): null|string; Throws: @@ -242,7 +244,7 @@ public function getConfigurationVersion(): string; ```php @@ -280,7 +282,7 @@ public function getGitClientPath(): string; Throws: @@ -291,7 +293,7 @@ public function getGitClientPath(): string; ```php @@ -325,7 +327,7 @@ public function getIfExists(mixed $key): null|string; Throws: @@ -359,7 +361,7 @@ public function getLanguageHandlersCollection(): \BumbleDocGen\LanguageHandler\L \DI\NotFoundException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -387,7 +389,7 @@ public function getOutputDir(): string; Throws: @@ -415,7 +417,7 @@ public function getOutputDirBaseUrl(): string; Throws: @@ -446,7 +448,7 @@ public function getPageLinkProcessor(): \BumbleDocGen\Core\Renderer\PageLinkProc \DI\DependencyException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • \DI\NotFoundException
  • @@ -480,7 +482,7 @@ public function getPlugins(): \BumbleDocGen\Core\Plugin\PluginsCollection; \DI\DependencyException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • \DI\NotFoundException
  • @@ -511,7 +513,7 @@ public function getProjectRoot(): string; Throws: @@ -542,7 +544,7 @@ public function getSourceLocators(): \BumbleDocGen\Core\Parser\SourceLocator\Sou \DI\DependencyException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • \DI\NotFoundException
  • @@ -573,7 +575,7 @@ public function getTemplatesDir(): string; Throws: @@ -607,7 +609,7 @@ public function getTwigFilters(): \BumbleDocGen\Core\Renderer\Twig\Filter\Custom \DI\NotFoundException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -638,7 +640,7 @@ public function getTwigFunctions(): \BumbleDocGen\Core\Renderer\Twig\Function\Cu \DI\DependencyException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • \DI\NotFoundException
  • @@ -652,7 +654,7 @@ public function getTwigFunctions(): \BumbleDocGen\Core\Renderer\Twig\Function\Cu ```php @@ -680,7 +682,7 @@ public function getWorkingDir(): string; ```php @@ -697,7 +699,35 @@ public function isCheckFileInGitBeforeCreatingDocEnabled(): bool; Throws: + + +
    +
    + + + +```php +public function renderWithFrontMatter(): bool; +``` + + + +Parameters: not specified + +Return value: bool + + +Throws: + @@ -725,11 +755,9 @@ public function useSharedCache(): bool; Throws:

    - - \ No newline at end of file diff --git a/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md b/docs/tech/02_parser/reflectionApi/php/classes/EnumEntity.md similarity index 88% rename from docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md rename to docs/tech/02_parser/reflectionApi/php/classes/EnumEntity.md index 26d94b59..5ae0f989 100644 --- a/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md +++ b/docs/tech/02_parser/reflectionApi/php/classes/EnumEntity.md @@ -1,5 +1,4 @@ - - BumbleDocGen / Technical description of the project / Parser / Reflection API / Reflection API for PHP / PHP enum reflection API / EnumEntity
    + BumbleDocGen / Technical description of the project / Parser / Reflection API / Reflection API for PHP / PHP enum reflection API / EnumEntity

    EnumEntity class: @@ -506,7 +505,7 @@ public function cursorToDocAttributeLinkFragment(string $cursor, bool $isForDocu \DI\NotFoundException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -536,7 +535,7 @@ public function getAbsoluteFileName(): null|string; Throws: @@ -566,7 +565,7 @@ public function getAst(): \PhpParser\Node\Stmt\Class_|\PhpParser\Node\Stmt\Inter Throws: @@ -622,7 +621,7 @@ public function getCachedEntityDependencies(): array; \Psr\Cache\InvalidArgumentException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -650,7 +649,7 @@ public function getCasesNames(): array; Throws: @@ -747,7 +746,7 @@ public function getConstantEntitiesCollection(): \BumbleDocGen\LanguageHandler\P \DI\DependencyException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -755,7 +754,7 @@ public function getConstantEntitiesCollection(): \BumbleDocGen\LanguageHandler\P See:
    @@ -806,7 +805,7 @@ public function getConstantValue(string $constantName): string|array|int|bool|nu \DI\DependencyException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • \DI\NotFoundException
  • @@ -842,7 +841,7 @@ public function getConstants(): array; \DI\DependencyException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • \DI\NotFoundException
  • @@ -853,9 +852,9 @@ public function getConstants(): array; See:
    @@ -905,7 +904,7 @@ public function getConstantsData(bool $onlyFromCurrentClassAndTraits = false, in Throws: @@ -963,7 +962,7 @@ public function getConstantsValues(bool $onlyFromCurrentClassAndTraits = false, \DI\DependencyException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • \PhpParser\ConstExprEvaluationException
  • @@ -1019,7 +1018,7 @@ public function getDescription(): string; Throws: @@ -1049,7 +1048,7 @@ public function getDescriptionLinks(): array; Throws: @@ -707,7 +706,7 @@ public function getConstantEntitiesCollection(): \BumbleDocGen\LanguageHandler\P \DI\DependencyException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -715,7 +714,7 @@ public function getConstantEntitiesCollection(): \BumbleDocGen\LanguageHandler\P See:
    @@ -766,7 +765,7 @@ public function getConstantValue(string $constantName): string|array|int|bool|nu \DI\DependencyException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • \DI\NotFoundException
  • @@ -802,7 +801,7 @@ public function getConstants(): array; \DI\DependencyException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • \DI\NotFoundException
  • @@ -813,9 +812,9 @@ public function getConstants(): array; See:
    @@ -865,7 +864,7 @@ public function getConstantsData(bool $onlyFromCurrentClassAndTraits = false, in Throws: @@ -923,7 +922,7 @@ public function getConstantsValues(bool $onlyFromCurrentClassAndTraits = false, \DI\DependencyException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • \PhpParser\ConstExprEvaluationException
  • @@ -979,7 +978,7 @@ public function getDescription(): string; Throws: @@ -1009,7 +1008,7 @@ public function getDescriptionLinks(): array; Throws: @@ -487,7 +486,7 @@ public function getDescription(): string; Throws: @@ -517,7 +516,7 @@ public function getDescriptionLinks(): array; Throws: @@ -1041,7 +1040,7 @@ public function getRelativeFileName(): null|string; See:
    @@ -1216,7 +1215,7 @@ public function getThrows(): array; Throws: @@ -1246,7 +1245,7 @@ public function getThrowsDocBlockLinks(): array; Throws: @@ -1306,7 +1305,7 @@ public function hasExamples(): bool; Throws: @@ -1336,7 +1335,7 @@ public function hasThrows(): bool; Throws: @@ -1366,7 +1365,7 @@ public function isApi(): bool; Throws: @@ -1417,7 +1416,7 @@ public function isDeprecated(): bool; Throws: @@ -1521,7 +1520,7 @@ public function isEntityFileCanBeLoad(): bool; Throws: @@ -1593,7 +1592,7 @@ public function isInternal(): bool; Throws: @@ -1776,5 +1775,3 @@ public function removeNotUsedEntityDataCache(): void;
    - - \ No newline at end of file diff --git a/docs/tech/3.renderer/classes/PhpEntitiesCollection.md b/docs/tech/02_parser/reflectionApi/php/classes/PhpEntitiesCollection.md similarity index 94% rename from docs/tech/3.renderer/classes/PhpEntitiesCollection.md rename to docs/tech/02_parser/reflectionApi/php/classes/PhpEntitiesCollection.md index 0ff6447b..318205f0 100644 --- a/docs/tech/3.renderer/classes/PhpEntitiesCollection.md +++ b/docs/tech/02_parser/reflectionApi/php/classes/PhpEntitiesCollection.md @@ -1,5 +1,4 @@ - - BumbleDocGen / Technical description of the project / Renderer / How to create documentation templates? / Templates variables / PhpEntitiesCollection
    + BumbleDocGen / Technical description of the project / Parser / Reflection API / Reflection API for PHP / PHP entities collection / PhpEntitiesCollection

    PhpEntitiesCollection class: @@ -244,7 +243,7 @@ public function add(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEnt Throws: @@ -312,7 +311,7 @@ public function filterByInterfaces(array $interfaces): \BumbleDocGen\LanguageHan Throws: @@ -395,7 +394,7 @@ public function filterByParentClassNames(array $parentClassNames): \BumbleDocGen Throws: @@ -440,7 +439,7 @@ public function filterByPaths(array $paths): \BumbleDocGen\LanguageHandler\Php\P Throws: @@ -671,7 +670,7 @@ public function getLoadedOrCreateNew(string $objectName, bool $withAddClassEntit See:
    @@ -697,7 +696,7 @@ public function getOnlyAbstractClasses(): \BumbleDocGen\LanguageHandler\Php\Pars Throws: @@ -939,7 +938,7 @@ public function internalGetLoadedOrCreateNew(string $objectName, bool $withAddCl \DI\NotFoundException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -1026,7 +1025,7 @@ public function loadEntities(\BumbleDocGen\Core\Parser\SourceLocator\SourceLocat \DI\NotFoundException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -1080,7 +1079,7 @@ public function loadEntitiesByConfiguration(\BumbleDocGen\Core\Parser\Entity\Ent \DI\DependencyException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -1179,5 +1178,3 @@ public function updateEntitiesCache(): void;
    - - \ No newline at end of file diff --git a/docs/tech/2.parser/classes/PhpHandlerSettings.md b/docs/tech/02_parser/reflectionApi/php/classes/PhpHandlerSettings.md similarity index 83% rename from docs/tech/2.parser/classes/PhpHandlerSettings.md rename to docs/tech/02_parser/reflectionApi/php/classes/PhpHandlerSettings.md index d730afe6..0426fe22 100644 --- a/docs/tech/2.parser/classes/PhpHandlerSettings.md +++ b/docs/tech/02_parser/reflectionApi/php/classes/PhpHandlerSettings.md @@ -1,5 +1,4 @@ - - BumbleDocGen / Technical description of the project / Parser / PhpHandlerSettings
    + BumbleDocGen / Technical description of the project / Parser / Reflection API / Reflection API for PHP / PhpHandlerSettings

    PhpHandlerSettings class: @@ -160,7 +159,7 @@ public function getClassConstantEntityFilter(): \BumbleDocGen\Core\Parser\Filter \DI\NotFoundException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -194,7 +193,7 @@ public function getClassEntityFilter(): \BumbleDocGen\Core\Parser\FilterConditio \DI\NotFoundException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -222,7 +221,7 @@ public function getComposerConfigFile(): null|string; Throws: @@ -250,7 +249,7 @@ public function getComposerVendorDir(): null|string; Throws: @@ -281,7 +280,7 @@ public function getCustomTwigFilters(): \BumbleDocGen\Core\Renderer\Twig\Filter\ \DI\DependencyException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • \DI\NotFoundException
  • @@ -315,7 +314,7 @@ public function getCustomTwigFunctions(): \BumbleDocGen\Core\Renderer\Twig\Funct \DI\DependencyException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • \DI\NotFoundException
  • @@ -349,7 +348,7 @@ public function getEntityDocRenderersCollection(): \BumbleDocGen\Core\Renderer\E \DI\DependencyException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • \DI\NotFoundException
  • @@ -380,7 +379,7 @@ public function getFileSourceBaseUrl(): null|string; Throws: @@ -411,7 +410,7 @@ public function getMethodEntityFilter(): \BumbleDocGen\Core\Parser\FilterConditi \DI\DependencyException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • \DI\NotFoundException
  • @@ -445,7 +444,7 @@ public function getPropertyEntityFilter(): \BumbleDocGen\Core\Parser\FilterCondi \DI\DependencyException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • \DI\NotFoundException
  • @@ -476,7 +475,7 @@ public function getPsr4Map(): array; Throws: @@ -504,11 +503,9 @@ public function getUseComposerAutoload(): bool; Throws:
    - - \ No newline at end of file diff --git a/docs/tech/2.parser/classes/PropertyEntity.md b/docs/tech/02_parser/reflectionApi/php/classes/PropertyEntity.md similarity index 88% rename from docs/tech/2.parser/classes/PropertyEntity.md rename to docs/tech/02_parser/reflectionApi/php/classes/PropertyEntity.md index 1c21ee85..bb36e3bc 100644 --- a/docs/tech/2.parser/classes/PropertyEntity.md +++ b/docs/tech/02_parser/reflectionApi/php/classes/PropertyEntity.md @@ -1,5 +1,4 @@ - - BumbleDocGen / Technical description of the project / Parser / Entities and entities collections / PropertyEntity
    + BumbleDocGen / Technical description of the project / Parser / Reflection API / Reflection API for PHP / PHP class property reflection API / PropertyEntity

    PropertyEntity class: @@ -294,7 +293,7 @@ public function getAbsoluteFileName(): null|string; Throws: @@ -322,7 +321,7 @@ public function getAst(): \PhpParser\Node\Stmt\Property; Throws: @@ -378,7 +377,7 @@ public function getCachedEntityDependencies(): array; \Psr\Cache\InvalidArgumentException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -432,7 +431,7 @@ public function getDefaultValue(): string|array|int|bool|null|float; \PhpParser\ConstExprEvaluationException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -462,7 +461,7 @@ public function getDescription(): string; Throws: @@ -492,7 +491,7 @@ public function getDescriptionLinks(): array; Throws: @@ -941,7 +940,7 @@ public function getRelativeFileName(): null|string; See:
    @@ -1053,7 +1052,7 @@ public function getThrows(): array; Throws: @@ -1083,7 +1082,7 @@ public function getThrowsDocBlockLinks(): array; Throws: @@ -1117,7 +1116,7 @@ public function getType(): string; \DI\DependencyException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -1177,7 +1176,7 @@ public function hasExamples(): bool; Throws: @@ -1207,7 +1206,7 @@ public function hasThrows(): bool; Throws: @@ -1237,7 +1236,7 @@ public function isApi(): bool; Throws: @@ -1267,7 +1266,7 @@ public function isDeprecated(): bool; Throws: @@ -1350,7 +1349,7 @@ public function isEntityFileCanBeLoad(): bool; Throws: @@ -1401,7 +1400,7 @@ public function isInternal(): bool; Throws: @@ -1429,7 +1428,7 @@ public function isPrivate(): bool; Throws: @@ -1457,7 +1456,7 @@ public function isProtected(): bool; Throws: @@ -1485,7 +1484,7 @@ public function isPublic(): bool; Throws: @@ -1584,5 +1583,3 @@ public function removeNotUsedEntityDataCache(): void;
    - - \ No newline at end of file diff --git a/docs/tech/3.renderer/classes/RootEntityInterface_2.md b/docs/tech/02_parser/reflectionApi/php/classes/RootEntityInterface.md similarity index 96% rename from docs/tech/3.renderer/classes/RootEntityInterface_2.md rename to docs/tech/02_parser/reflectionApi/php/classes/RootEntityInterface.md index 0df09c9d..1b87c139 100644 --- a/docs/tech/3.renderer/classes/RootEntityInterface_2.md +++ b/docs/tech/02_parser/reflectionApi/php/classes/RootEntityInterface.md @@ -1,5 +1,4 @@ - - BumbleDocGen / Technical description of the project / Renderer / RootEntityInterface
    + BumbleDocGen / Technical description of the project / Parser / Reflection API / Reflection API for PHP / RootEntityInterface

    RootEntityInterface class: @@ -256,7 +255,7 @@ public function getRelativeFileName(): null|string; See:
    @@ -468,5 +467,3 @@ public static function normalizeClassName(string $name): string;
    - - \ No newline at end of file diff --git a/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md b/docs/tech/02_parser/reflectionApi/php/classes/TraitEntity.md similarity index 88% rename from docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md rename to docs/tech/02_parser/reflectionApi/php/classes/TraitEntity.md index 70c429eb..635487f6 100644 --- a/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md +++ b/docs/tech/02_parser/reflectionApi/php/classes/TraitEntity.md @@ -1,5 +1,4 @@ - - BumbleDocGen / Technical description of the project / Parser / Reflection API / Reflection API for PHP / PHP trait reflection API / TraitEntity
    + BumbleDocGen / Technical description of the project / Parser / Reflection API / Reflection API for PHP / PHP trait reflection API / TraitEntity

    TraitEntity class: @@ -497,7 +496,7 @@ public function cursorToDocAttributeLinkFragment(string $cursor, bool $isForDocu \DI\NotFoundException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -527,7 +526,7 @@ public function getAbsoluteFileName(): null|string; Throws: @@ -557,7 +556,7 @@ public function getAst(): \PhpParser\Node\Stmt\Class_|\PhpParser\Node\Stmt\Inter Throws: @@ -613,7 +612,7 @@ public function getCachedEntityDependencies(): array; \Psr\Cache\InvalidArgumentException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -671,7 +670,7 @@ public function getConstant(string $constantName, bool $unsafe = false): null|\B \DI\DependencyException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -707,7 +706,7 @@ public function getConstantEntitiesCollection(): \BumbleDocGen\LanguageHandler\P \DI\DependencyException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -715,7 +714,7 @@ public function getConstantEntitiesCollection(): \BumbleDocGen\LanguageHandler\P See:
    @@ -766,7 +765,7 @@ public function getConstantValue(string $constantName): string|array|int|bool|nu \DI\DependencyException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • \DI\NotFoundException
  • @@ -802,7 +801,7 @@ public function getConstants(): array; \DI\DependencyException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • \DI\NotFoundException
  • @@ -813,9 +812,9 @@ public function getConstants(): array; See:
    @@ -865,7 +864,7 @@ public function getConstantsData(bool $onlyFromCurrentClassAndTraits = false, in Throws: @@ -923,7 +922,7 @@ public function getConstantsValues(bool $onlyFromCurrentClassAndTraits = false, \DI\DependencyException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • \PhpParser\ConstExprEvaluationException
  • @@ -979,7 +978,7 @@ public function getDescription(): string; Throws: @@ -1009,7 +1008,7 @@ public function getDescriptionLinks(): array; Throws:
    • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    • \Exception
    • @@ -1042,7 +1041,7 @@ public function getDocBlock(): \phpDocumentor\Reflection\DocBlock; Throws: @@ -1072,7 +1071,7 @@ public function getDocComment(): string; Throws: @@ -1125,7 +1124,7 @@ public function getDocCommentLine(): null|int; Throws: @@ -1155,7 +1154,7 @@ public function getDocNote(): string; Throws: @@ -1185,7 +1184,7 @@ public function getDocRender(): \BumbleDocGen\Core\Renderer\EntityDocRenderer\En Throws: @@ -2472,7 +2471,7 @@ public function hasExamples(): bool; Throws: @@ -2527,7 +2526,7 @@ public function hasMethod(string $methodName, bool $unsafe = false): bool; \DI\DependencyException
    • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    • \DI\NotFoundException
    • @@ -2625,7 +2624,7 @@ public function hasProperty(string $propertyName, bool $unsafe = false): bool; \DI\DependencyException
    • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    • \DI\NotFoundException
    • @@ -2658,7 +2657,7 @@ public function hasThrows(): bool; Throws: @@ -2688,7 +2687,7 @@ public function hasTraits(): bool; Throws: @@ -2735,7 +2734,7 @@ public function implementsInterface(string $interfaceName): bool; Throws: @@ -2788,7 +2787,7 @@ public function isApi(): bool; Throws: @@ -2864,7 +2863,7 @@ public function isDeprecated(): bool; Throws: @@ -2894,7 +2893,7 @@ public function isDocumentCreationAllowed(): bool; Throws: @@ -2977,7 +2976,7 @@ public function isEntityDataCanBeLoaded(): bool; Throws: @@ -3007,7 +3006,7 @@ public function isEntityFileCanBeLoad(): bool; Throws: @@ -3192,7 +3191,7 @@ public function isInternal(): bool; Throws: @@ -3237,7 +3236,7 @@ public function isSubclassOf(string $className): bool; Throws: @@ -3437,5 +3436,3 @@ public function setCustomAst(\PhpParser\Node\Stmt\Trait_|\PhpParser\Node\Stmt\En
      - - \ No newline at end of file diff --git a/docs/tech/02_parser/reflectionApi/php/phpClassConstantReflectionApi.md b/docs/tech/02_parser/reflectionApi/php/phpClassConstantReflectionApi.md new file mode 100644 index 00000000..fb0cecd6 --- /dev/null +++ b/docs/tech/02_parser/reflectionApi/php/phpClassConstantReflectionApi.md @@ -0,0 +1,50 @@ + BumbleDocGen / Technical description of the project / Parser / Reflection API / Reflection API for PHP / PHP class constant reflection API
      + +

      PHP class constant reflection API

      + +Class constant reflection entity class: ClassConstantEntity. + +**Example of creating class constant reflection:** + +```php +$entitiesCollection = (new \BumbleDocGen\DocGeneratorFactory())->createRootEntitiesCollection($reflectionApiConfig); + +$classReflection = $entitiesCollection->getLoadedOrCreateNew('SomeClassName'); + +$constantReflection = $classReflection->getConstant('constantName'); +``` + +**Class constant reflection API methods:** + +- [getAbsoluteFileName()](/docs/tech/02_parser/reflectionApi/php/classes/ClassConstantEntity.md#mgetabsolutefilename): Returns the absolute path to a file if it can be retrieved and if the file is in the project directory +- [getAst()](/docs/tech/02_parser/reflectionApi/php/classes/ClassConstantEntity.md#mgetast): Get AST for this entity +- [getDescription()](/docs/tech/02_parser/reflectionApi/php/classes/ClassConstantEntity.md#mgetdescription): Get entity description +- [getDescriptionLinks()](/docs/tech/02_parser/reflectionApi/php/classes/ClassConstantEntity.md#mgetdescriptionlinks): Get parsed links from description and doc blocks `see` and `link` +- [getDocComment()](/docs/tech/02_parser/reflectionApi/php/classes/ClassConstantEntity.md#mgetdoccomment): Get the doc comment of an entity +- [getDocCommentLine()](/docs/tech/02_parser/reflectionApi/php/classes/ClassConstantEntity.md#mgetdoccommentline): Get the code line number where the docBlock of the current entity begins +- [getDocNote()](/docs/tech/02_parser/reflectionApi/php/classes/ClassConstantEntity.md#mgetdocnote): Get the note annotation value +- [getEndLine()](/docs/tech/02_parser/reflectionApi/php/classes/ClassConstantEntity.md#mgetendline): Get the line number of the end of a constant's code in a file +- [getExamples()](/docs/tech/02_parser/reflectionApi/php/classes/ClassConstantEntity.md#mgetexamples): Get parsed examples from `examples` doc block +- [getFirstExample()](/docs/tech/02_parser/reflectionApi/php/classes/ClassConstantEntity.md#mgetfirstexample): Get first example from `examples` doc block +- [getImplementingClass()](/docs/tech/02_parser/reflectionApi/php/classes/ClassConstantEntity.md#mgetimplementingclass): Get the class like entity in which the current entity was implemented +- [getNamespaceName()](/docs/tech/02_parser/reflectionApi/php/classes/ClassConstantEntity.md#mgetnamespacename): Get the name of the namespace where the current class is implemented +- [getObjectId()](/docs/tech/02_parser/reflectionApi/php/classes/ClassConstantEntity.md#mgetobjectid): Get entity unique ID +- [getRelativeFileName()](/docs/tech/02_parser/reflectionApi/php/classes/ClassConstantEntity.md#mgetrelativefilename): File name relative to project_root configuration parameter +- [getRootEntityCollection()](/docs/tech/02_parser/reflectionApi/php/classes/ClassConstantEntity.md#mgetrootentitycollection): Get the collection of root entities to which this entity belongs +- [getStartLine()](/docs/tech/02_parser/reflectionApi/php/classes/ClassConstantEntity.md#mgetstartline): Get the line number of the beginning of the constant code in a file +- [getThrows()](/docs/tech/02_parser/reflectionApi/php/classes/ClassConstantEntity.md#mgetthrows): Get parsed throws from `throws` doc block +- [getValue()](/docs/tech/02_parser/reflectionApi/php/classes/ClassConstantEntity.md#mgetvalue): Get the compiled value of a constant +- [hasDescriptionLinks()](/docs/tech/02_parser/reflectionApi/php/classes/ClassConstantEntity.md#mhasdescriptionlinks): Checking if an entity has links in its description +- [hasExamples()](/docs/tech/02_parser/reflectionApi/php/classes/ClassConstantEntity.md#mhasexamples): Checking if an entity has `example` docBlock +- [hasThrows()](/docs/tech/02_parser/reflectionApi/php/classes/ClassConstantEntity.md#mhasthrows): Checking if an entity has `throws` docBlock +- [isApi()](/docs/tech/02_parser/reflectionApi/php/classes/ClassConstantEntity.md#misapi): Checking if an entity has `api` docBlock +- [isDeprecated()](/docs/tech/02_parser/reflectionApi/php/classes/ClassConstantEntity.md#misdeprecated): Checking if an entity has `deprecated` docBlock +- [isEntityFileCanBeLoad()](/docs/tech/02_parser/reflectionApi/php/classes/ClassConstantEntity.md#misentityfilecanbeload): Checking if entity data can be retrieved +- [isInternal()](/docs/tech/02_parser/reflectionApi/php/classes/ClassConstantEntity.md#misinternal): Checking if an entity has `internal` docBlock +- [isPrivate()](/docs/tech/02_parser/reflectionApi/php/classes/ClassConstantEntity.md#misprivate): Check if a constant is a private constant +- [isProtected()](/docs/tech/02_parser/reflectionApi/php/classes/ClassConstantEntity.md#misprotected): Check if a constant is a protected constant +- [isPublic()](/docs/tech/02_parser/reflectionApi/php/classes/ClassConstantEntity.md#mispublic): Check if a constant is a public constant + +
      +
      +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
      Last modified date: Wed Jan 10 23:55:33 2024 +0300
      Page content update date: Thu Jan 11 2024
      Made with Bumble Documentation Generator
      \ No newline at end of file diff --git a/docs/tech/02_parser/reflectionApi/php/phpClassMethodReflectionApi.md b/docs/tech/02_parser/reflectionApi/php/phpClassMethodReflectionApi.md new file mode 100644 index 00000000..a4ac91e8 --- /dev/null +++ b/docs/tech/02_parser/reflectionApi/php/phpClassMethodReflectionApi.md @@ -0,0 +1,65 @@ + BumbleDocGen / Technical description of the project / Parser / Reflection API / Reflection API for PHP / PHP class method reflection API
      + +

      PHP class method reflection API

      + +Method reflection entity class: MethodEntity. + +**Example of creating class method reflection:** + +```php +$entitiesCollection = (new \BumbleDocGen\DocGeneratorFactory())->createRootEntitiesCollection($reflectionApiConfig); + +$classReflection = $entitiesCollection->getLoadedOrCreateNew('SomeClassName'); + +$methodReflection = $classReflection->getMethod('methodName'); +``` + +**Class method reflection API methods:** + +- [getAbsoluteFileName()](/docs/tech/02_parser/reflectionApi/php/classes/MethodEntity.md#mgetabsolutefilename): Returns the absolute path to a file if it can be retrieved and if the file is in the project directory +- [getAst()](/docs/tech/02_parser/reflectionApi/php/classes/MethodEntity.md#mgetast): Get AST for this entity +- [getBodyCode()](/docs/tech/02_parser/reflectionApi/php/classes/MethodEntity.md#mgetbodycode): Get the code for this method +- [getDescription()](/docs/tech/02_parser/reflectionApi/php/classes/MethodEntity.md#mgetdescription): Get entity description +- [getDescriptionLinks()](/docs/tech/02_parser/reflectionApi/php/classes/MethodEntity.md#mgetdescriptionlinks): Get parsed links from description and doc blocks `see` and `link` +- [getDocComment()](/docs/tech/02_parser/reflectionApi/php/classes/MethodEntity.md#mgetdoccomment): Get the doc comment of an entity +- [getDocNote()](/docs/tech/02_parser/reflectionApi/php/classes/MethodEntity.md#mgetdocnote): Get the note annotation value +- [getEndLine()](/docs/tech/02_parser/reflectionApi/php/classes/MethodEntity.md#mgetendline): Get the line number of the end of a method's code in a file +- [getExamples()](/docs/tech/02_parser/reflectionApi/php/classes/MethodEntity.md#mgetexamples): Get parsed examples from `examples` doc block +- [getFirstExample()](/docs/tech/02_parser/reflectionApi/php/classes/MethodEntity.md#mgetfirstexample): Get first example from `examples` doc block +- [getFirstReturnValue()](/docs/tech/02_parser/reflectionApi/php/classes/MethodEntity.md#mgetfirstreturnvalue): Get the compiled first return value of a method (if possible) +- [getImplementingClass()](/docs/tech/02_parser/reflectionApi/php/classes/MethodEntity.md#mgetimplementingclass): Get the class like entity in which the current entity was implemented +- [getImplementingClassName()](/docs/tech/02_parser/reflectionApi/php/classes/MethodEntity.md#mgetimplementingclassname): Get the name of the class in which this method is implemented +- [getModifiersString()](/docs/tech/02_parser/reflectionApi/php/classes/MethodEntity.md#mgetmodifiersstring): Get a text representation of method modifiers +- [getName()](/docs/tech/02_parser/reflectionApi/php/classes/MethodEntity.md#mgetname): Full name of the entity +- [getNamespaceName()](/docs/tech/02_parser/reflectionApi/php/classes/MethodEntity.md#mgetnamespacename): Namespace of the class that contains this method +- [getObjectId()](/docs/tech/02_parser/reflectionApi/php/classes/MethodEntity.md#mgetobjectid): Get entity unique ID +- [getParameters()](/docs/tech/02_parser/reflectionApi/php/classes/MethodEntity.md#mgetparameters): Get a list of method parameters +- [getParametersString()](/docs/tech/02_parser/reflectionApi/php/classes/MethodEntity.md#mgetparametersstring): Get a list of method parameters as a string +- [getParentMethod()](/docs/tech/02_parser/reflectionApi/php/classes/MethodEntity.md#mgetparentmethod): Get the parent method for this method +- [getRelativeFileName()](/docs/tech/02_parser/reflectionApi/php/classes/MethodEntity.md#mgetrelativefilename): File name relative to project_root configuration parameter +- [getReturnType()](/docs/tech/02_parser/reflectionApi/php/classes/MethodEntity.md#mgetreturntype): Get the return type of method +- [getRootEntityCollection()](/docs/tech/02_parser/reflectionApi/php/classes/MethodEntity.md#mgetrootentitycollection): Get the collection of root entities to which this entity belongs +- [getShortName()](/docs/tech/02_parser/reflectionApi/php/classes/MethodEntity.md#mgetshortname): Short name of the entity +- [getSignature()](/docs/tech/02_parser/reflectionApi/php/classes/MethodEntity.md#mgetsignature): Get the method signature as a string +- [getStartColumn()](/docs/tech/02_parser/reflectionApi/php/classes/MethodEntity.md#mgetstartcolumn): Get the column number of the beginning of the method code in a file +- [getStartLine()](/docs/tech/02_parser/reflectionApi/php/classes/MethodEntity.md#mgetstartline): Get the line number of the beginning of the entity code in a file +- [getThrows()](/docs/tech/02_parser/reflectionApi/php/classes/MethodEntity.md#mgetthrows): Get parsed throws from `throws` doc block +- [hasDescriptionLinks()](/docs/tech/02_parser/reflectionApi/php/classes/MethodEntity.md#mhasdescriptionlinks): Checking if an entity has links in its description +- [hasExamples()](/docs/tech/02_parser/reflectionApi/php/classes/MethodEntity.md#mhasexamples): Checking if an entity has `example` docBlock +- [hasThrows()](/docs/tech/02_parser/reflectionApi/php/classes/MethodEntity.md#mhasthrows): Checking if an entity has `throws` docBlock +- [isApi()](/docs/tech/02_parser/reflectionApi/php/classes/MethodEntity.md#misapi): Checking if an entity has `api` docBlock +- [isConstructor()](/docs/tech/02_parser/reflectionApi/php/classes/MethodEntity.md#misconstructor): Checking that a method is a constructor +- [isDeprecated()](/docs/tech/02_parser/reflectionApi/php/classes/MethodEntity.md#misdeprecated): Checking if an entity has `deprecated` docBlock +- [isDynamic()](/docs/tech/02_parser/reflectionApi/php/classes/MethodEntity.md#misdynamic): Check if a method is a dynamic method, that is, implementable using __call or __callStatic +- [isEntityFileCanBeLoad()](/docs/tech/02_parser/reflectionApi/php/classes/MethodEntity.md#misentityfilecanbeload): Checking if entity data can be retrieved +- [isImplementedInParentClass()](/docs/tech/02_parser/reflectionApi/php/classes/MethodEntity.md#misimplementedinparentclass): Check if this method is implemented in the parent class +- [isInitialization()](/docs/tech/02_parser/reflectionApi/php/classes/MethodEntity.md#misinitialization): Check if a method is an initialization method +- [isInternal()](/docs/tech/02_parser/reflectionApi/php/classes/MethodEntity.md#misinternal): Checking if an entity has `internal` docBlock +- [isPrivate()](/docs/tech/02_parser/reflectionApi/php/classes/MethodEntity.md#misprivate): Check if a method is a private method +- [isProtected()](/docs/tech/02_parser/reflectionApi/php/classes/MethodEntity.md#misprotected): Check if a method is a protected method +- [isPublic()](/docs/tech/02_parser/reflectionApi/php/classes/MethodEntity.md#mispublic): Check if a method is a public method +- [isStatic()](/docs/tech/02_parser/reflectionApi/php/classes/MethodEntity.md#misstatic): Check if this method is static + +
      +
      +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
      Last modified date: Wed Jan 10 23:55:33 2024 +0300
      Page content update date: Thu Jan 11 2024
      Made with Bumble Documentation Generator
      \ No newline at end of file diff --git a/docs/tech/02_parser/reflectionApi/php/phpClassPropertyReflectionApi.md b/docs/tech/02_parser/reflectionApi/php/phpClassPropertyReflectionApi.md new file mode 100644 index 00000000..0fd73fa8 --- /dev/null +++ b/docs/tech/02_parser/reflectionApi/php/phpClassPropertyReflectionApi.md @@ -0,0 +1,56 @@ + BumbleDocGen / Technical description of the project / Parser / Reflection API / Reflection API for PHP / PHP class property reflection API
      + +

      PHP class property reflection API

      + +Property reflection entity class: PropertyEntity. + +**Example of creating class property reflection:** + +```php +$entitiesCollection = (new \BumbleDocGen\DocGeneratorFactory())->createRootEntitiesCollection($reflectionApiConfig); + +$classReflection = $entitiesCollection->getLoadedOrCreateNew('SomeClassName'); + +$propertyReflection = $classReflection->getProperty('propertyName'); +``` + +**Class property reflection API methods:** + +- [getAbsoluteFileName()](/docs/tech/02_parser/reflectionApi/php/classes/PropertyEntity.md#mgetabsolutefilename): Returns the absolute path to a file if it can be retrieved and if the file is in the project directory +- [getAst()](/docs/tech/02_parser/reflectionApi/php/classes/PropertyEntity.md#mgetast): Get AST for this entity +- [getDefaultValue()](/docs/tech/02_parser/reflectionApi/php/classes/PropertyEntity.md#mgetdefaultvalue): Get the compiled default value of a property +- [getDescription()](/docs/tech/02_parser/reflectionApi/php/classes/PropertyEntity.md#mgetdescription): Get entity description +- [getDescriptionLinks()](/docs/tech/02_parser/reflectionApi/php/classes/PropertyEntity.md#mgetdescriptionlinks): Get parsed links from description and doc blocks `see` and `link` +- [getDocComment()](/docs/tech/02_parser/reflectionApi/php/classes/PropertyEntity.md#mgetdoccomment): Get the doc comment of an entity +- [getDocCommentLine()](/docs/tech/02_parser/reflectionApi/php/classes/PropertyEntity.md#mgetdoccommentline): Get the code line number where the docBlock of the current entity begins +- [getDocNote()](/docs/tech/02_parser/reflectionApi/php/classes/PropertyEntity.md#mgetdocnote): Get the note annotation value +- [getEndLine()](/docs/tech/02_parser/reflectionApi/php/classes/PropertyEntity.md#mgetendline): Get the line number of the end of a property's code in a file +- [getExamples()](/docs/tech/02_parser/reflectionApi/php/classes/PropertyEntity.md#mgetexamples): Get parsed examples from `examples` doc block +- [getFirstExample()](/docs/tech/02_parser/reflectionApi/php/classes/PropertyEntity.md#mgetfirstexample): Get first example from `examples` doc block +- [getImplementingClass()](/docs/tech/02_parser/reflectionApi/php/classes/PropertyEntity.md#mgetimplementingclass): Get the class like entity in which the current entity was implemented +- [getImplementingClassName()](/docs/tech/02_parser/reflectionApi/php/classes/PropertyEntity.md#mgetimplementingclassname): Get the name of the class in which this property is implemented +- [getModifiersString()](/docs/tech/02_parser/reflectionApi/php/classes/PropertyEntity.md#mgetmodifiersstring): Get a text representation of property modifiers +- [getName()](/docs/tech/02_parser/reflectionApi/php/classes/PropertyEntity.md#mgetname): Full name of the entity +- [getNamespaceName()](/docs/tech/02_parser/reflectionApi/php/classes/PropertyEntity.md#mgetnamespacename): Namespace of the class that contains this property +- [getObjectId()](/docs/tech/02_parser/reflectionApi/php/classes/PropertyEntity.md#mgetobjectid): Get entity unique ID +- [getRelativeFileName()](/docs/tech/02_parser/reflectionApi/php/classes/PropertyEntity.md#mgetrelativefilename): File name relative to project_root configuration parameter +- [getRootEntityCollection()](/docs/tech/02_parser/reflectionApi/php/classes/PropertyEntity.md#mgetrootentitycollection): Get the collection of root entities to which this entity belongs +- [getShortName()](/docs/tech/02_parser/reflectionApi/php/classes/PropertyEntity.md#mgetshortname): Short name of the entity +- [getStartLine()](/docs/tech/02_parser/reflectionApi/php/classes/PropertyEntity.md#mgetstartline): Get the line number of the beginning of the entity code in a file +- [getThrows()](/docs/tech/02_parser/reflectionApi/php/classes/PropertyEntity.md#mgetthrows): Get parsed throws from `throws` doc block +- [getType()](/docs/tech/02_parser/reflectionApi/php/classes/PropertyEntity.md#mgettype): Get current property type +- [hasDescriptionLinks()](/docs/tech/02_parser/reflectionApi/php/classes/PropertyEntity.md#mhasdescriptionlinks): Checking if an entity has links in its description +- [hasExamples()](/docs/tech/02_parser/reflectionApi/php/classes/PropertyEntity.md#mhasexamples): Checking if an entity has `example` docBlock +- [hasThrows()](/docs/tech/02_parser/reflectionApi/php/classes/PropertyEntity.md#mhasthrows): Checking if an entity has `throws` docBlock +- [isApi()](/docs/tech/02_parser/reflectionApi/php/classes/PropertyEntity.md#misapi): Checking if an entity has `api` docBlock +- [isDeprecated()](/docs/tech/02_parser/reflectionApi/php/classes/PropertyEntity.md#misdeprecated): Checking if an entity has `deprecated` docBlock +- [isEntityFileCanBeLoad()](/docs/tech/02_parser/reflectionApi/php/classes/PropertyEntity.md#misentityfilecanbeload): Checking if entity data can be retrieved +- [isImplementedInParentClass()](/docs/tech/02_parser/reflectionApi/php/classes/PropertyEntity.md#misimplementedinparentclass): Check if this property is implemented in the parent class +- [isInternal()](/docs/tech/02_parser/reflectionApi/php/classes/PropertyEntity.md#misinternal): Checking if an entity has `internal` docBlock +- [isPrivate()](/docs/tech/02_parser/reflectionApi/php/classes/PropertyEntity.md#misprivate): Check if a private is a public private +- [isProtected()](/docs/tech/02_parser/reflectionApi/php/classes/PropertyEntity.md#misprotected): Check if a protected is a public protected +- [isPublic()](/docs/tech/02_parser/reflectionApi/php/classes/PropertyEntity.md#mispublic): Check if a property is a public property + +
      +
      +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
      Last modified date: Wed Jan 10 23:55:33 2024 +0300
      Page content update date: Thu Jan 11 2024
      Made with Bumble Documentation Generator
      \ No newline at end of file diff --git a/docs/tech/02_parser/reflectionApi/php/phpClassReflectionApi.md b/docs/tech/02_parser/reflectionApi/php/phpClassReflectionApi.md new file mode 100644 index 00000000..f25aa036 --- /dev/null +++ b/docs/tech/02_parser/reflectionApi/php/phpClassReflectionApi.md @@ -0,0 +1,89 @@ + BumbleDocGen / Technical description of the project / Parser / Reflection API / Reflection API for PHP / PHP class reflection API
      + +

      PHP class reflection API

      + +PHP class reflection ClassEntity inherits from ClassLikeEntity. + +**Source class formats:** + +1) `class ` +2) `abstract class ` +3) `final class ` + +**Example of creating class reflection:** + +```php +$entitiesCollection = (new \BumbleDocGen\DocGeneratorFactory())->createRootEntitiesCollection($reflectionApiConfig); + +$classReflection = $entitiesCollection->getLoadedOrCreateNew('SomeClassName'); // or get() +``` + +**Class reflection API methods:** + +- [getAbsoluteFileName()](/docs/tech/02_parser/reflectionApi/php/classes/ClassEntity.md#mgetabsolutefilename): Returns the absolute path to a file if it can be retrieved and if the file is in the project directory +- [getAst()](/docs/tech/02_parser/reflectionApi/php/classes/ClassEntity.md#mgetast): Get AST for this entity +- [getConstant()](/docs/tech/02_parser/reflectionApi/php/classes/ClassEntity.md#mgetconstant): Get the method entity by its name +- [getConstantEntitiesCollection()](/docs/tech/02_parser/reflectionApi/php/classes/ClassEntity.md#mgetconstantentitiescollection): Get a collection of constant entities +- [getConstantValue()](/docs/tech/02_parser/reflectionApi/php/classes/ClassEntity.md#mgetconstantvalue): Get the compiled value of a constant +- [getConstants()](/docs/tech/02_parser/reflectionApi/php/classes/ClassEntity.md#mgetconstants): Get all constants that are available according to the configuration as an array +- [getConstantsValues()](/docs/tech/02_parser/reflectionApi/php/classes/ClassEntity.md#mgetconstantsvalues): Get class constant compiled values according to filters +- [getDescription()](/docs/tech/02_parser/reflectionApi/php/classes/ClassEntity.md#mgetdescription): Get entity description +- [getDescriptionLinks()](/docs/tech/02_parser/reflectionApi/php/classes/ClassEntity.md#mgetdescriptionlinks): Get parsed links from description and doc blocks `see` and `link` +- [getDocComment()](/docs/tech/02_parser/reflectionApi/php/classes/ClassEntity.md#mgetdoccomment): Get the doc comment of an entity +- [getDocCommentLine()](/docs/tech/02_parser/reflectionApi/php/classes/ClassEntity.md#mgetdoccommentline): Get the code line number where the docBlock of the current entity begins +- [getDocNote()](/docs/tech/02_parser/reflectionApi/php/classes/ClassEntity.md#mgetdocnote): Get the note annotation value +- [getEndLine()](/docs/tech/02_parser/reflectionApi/php/classes/ClassEntity.md#mgetendline): Get the line number of the end of a class code in a file +- [getExamples()](/docs/tech/02_parser/reflectionApi/php/classes/ClassEntity.md#mgetexamples): Get parsed examples from `examples` doc block +- [getFirstExample()](/docs/tech/02_parser/reflectionApi/php/classes/ClassEntity.md#mgetfirstexample): Get first example from `examples` doc block +- [getImplementingClass()](/docs/tech/02_parser/reflectionApi/php/classes/ClassEntity.md#mgetimplementingclass): Get the class like entity in which the current entity was implemented +- [getInterfaceNames()](/docs/tech/02_parser/reflectionApi/php/classes/ClassEntity.md#mgetinterfacenames): Get a list of class interface names +- [getInterfacesEntities()](/docs/tech/02_parser/reflectionApi/php/classes/ClassEntity.md#mgetinterfacesentities): Get a list of interface entities that the current class implements +- [getMethod()](/docs/tech/02_parser/reflectionApi/php/classes/ClassEntity.md#mgetmethod): Get the method entity by its name +- [getMethodEntitiesCollection()](/docs/tech/02_parser/reflectionApi/php/classes/ClassEntity.md#mgetmethodentitiescollection): Get a collection of method entities +- [getMethods()](/docs/tech/02_parser/reflectionApi/php/classes/ClassEntity.md#mgetmethods): Get all methods that are available according to the configuration as an array +- [getName()](/docs/tech/02_parser/reflectionApi/php/classes/ClassEntity.md#mgetname): Full name of the entity +- [getNamespaceName()](/docs/tech/02_parser/reflectionApi/php/classes/ClassEntity.md#mgetnamespacename): Get the entity namespace name +- [getObjectId()](/docs/tech/02_parser/reflectionApi/php/classes/ClassEntity.md#mgetobjectid): Get entity unique ID +- [getParentClass()](/docs/tech/02_parser/reflectionApi/php/classes/ClassEntity.md#mgetparentclass): Get the entity of the parent class if it exists +- [getParentClassEntities()](/docs/tech/02_parser/reflectionApi/php/classes/ClassEntity.md#mgetparentclassentities): Get a list of parent class entities +- [getParentClassName()](/docs/tech/02_parser/reflectionApi/php/classes/ClassEntity.md#mgetparentclassname): Get the name of the parent class entity if it exists +- [getParentClassNames()](/docs/tech/02_parser/reflectionApi/php/classes/ClassEntity.md#mgetparentclassnames): Get a list of entity names of parent classes +- [getPluginData()](/docs/tech/02_parser/reflectionApi/php/classes/ClassEntity.md#mgetplugindata): Get additional information added using the plugin +- [getProperties()](/docs/tech/02_parser/reflectionApi/php/classes/ClassEntity.md#mgetproperties): Get all properties that are available according to the configuration as an array +- [getProperty()](/docs/tech/02_parser/reflectionApi/php/classes/ClassEntity.md#mgetproperty): Get the property entity by its name +- [getPropertyDefaultValue()](/docs/tech/02_parser/reflectionApi/php/classes/ClassEntity.md#mgetpropertydefaultvalue): Get the compiled value of a property +- [getPropertyEntitiesCollection()](/docs/tech/02_parser/reflectionApi/php/classes/ClassEntity.md#mgetpropertyentitiescollection): Get a collection of property entities +- [getRelativeFileName()](/docs/tech/02_parser/reflectionApi/php/classes/ClassEntity.md#mgetrelativefilename): File name relative to project_root configuration parameter +- [getRootEntityCollection()](/docs/tech/02_parser/reflectionApi/php/classes/ClassEntity.md#mgetrootentitycollection): Get the collection of root entities to which this entity belongs +- [getShortName()](/docs/tech/02_parser/reflectionApi/php/classes/ClassEntity.md#mgetshortname): Short name of the entity +- [getStartLine()](/docs/tech/02_parser/reflectionApi/php/classes/ClassEntity.md#mgetstartline): Get the line number of the start of a class code in a file +- [getThrows()](/docs/tech/02_parser/reflectionApi/php/classes/ClassEntity.md#mgetthrows): Get parsed throws from `throws` doc block +- [getTraits()](/docs/tech/02_parser/reflectionApi/php/classes/ClassEntity.md#mgettraits): Get a list of trait entities of the current class +- [getTraitsNames()](/docs/tech/02_parser/reflectionApi/php/classes/ClassEntity.md#mgettraitsnames): Get a list of class traits names +- [hasConstant()](/docs/tech/02_parser/reflectionApi/php/classes/ClassEntity.md#mhasconstant): Check if a constant exists in a class +- [hasDescriptionLinks()](/docs/tech/02_parser/reflectionApi/php/classes/ClassEntity.md#mhasdescriptionlinks): Checking if an entity has links in its description +- [hasExamples()](/docs/tech/02_parser/reflectionApi/php/classes/ClassEntity.md#mhasexamples): Checking if an entity has `example` docBlock +- [hasMethod()](/docs/tech/02_parser/reflectionApi/php/classes/ClassEntity.md#mhasmethod): Check if a method exists in a class +- [hasParentClass()](/docs/tech/02_parser/reflectionApi/php/classes/ClassEntity.md#mhasparentclass): Check if a certain parent class exists in a chain of parent classes +- [hasProperty()](/docs/tech/02_parser/reflectionApi/php/classes/ClassEntity.md#mhasproperty): Check if a property exists in a class +- [hasThrows()](/docs/tech/02_parser/reflectionApi/php/classes/ClassEntity.md#mhasthrows): Checking if an entity has `throws` docBlock +- [hasTraits()](/docs/tech/02_parser/reflectionApi/php/classes/ClassEntity.md#mhastraits): Check if the class contains traits +- [implementsInterface()](/docs/tech/02_parser/reflectionApi/php/classes/ClassEntity.md#mimplementsinterface): Check if a class implements an interface +- [isAbstract()](/docs/tech/02_parser/reflectionApi/php/classes/ClassEntity.md#misabstract): Check that an entity is abstract +- [isApi()](/docs/tech/02_parser/reflectionApi/php/classes/ClassEntity.md#misapi): Checking if an entity has `api` docBlock +- [isAttribute()](/docs/tech/02_parser/reflectionApi/php/classes/ClassEntity.md#misattribute): Check if a class is an attribute +- [isClass()](/docs/tech/02_parser/reflectionApi/php/classes/ClassEntity.md#misclass): Check if an entity is a Class +- [isDeprecated()](/docs/tech/02_parser/reflectionApi/php/classes/ClassEntity.md#misdeprecated): Checking if an entity has `deprecated` docBlock +- [isEntityFileCanBeLoad()](/docs/tech/02_parser/reflectionApi/php/classes/ClassEntity.md#misentityfilecanbeload): Checking if entity data can be retrieved +- [isEnum()](/docs/tech/02_parser/reflectionApi/php/classes/ClassEntity.md#misenum): Check if an entity is an Enum +- [isInstantiable()](/docs/tech/02_parser/reflectionApi/php/classes/ClassEntity.md#misinstantiable): Check that an entity is instantiable +- [isInterface()](/docs/tech/02_parser/reflectionApi/php/classes/ClassEntity.md#misinterface): Check if an entity is an Interface +- [isInternal()](/docs/tech/02_parser/reflectionApi/php/classes/ClassEntity.md#misinternal): Checking if an entity has `internal` docBlock +- [isSubclassOf()](/docs/tech/02_parser/reflectionApi/php/classes/ClassEntity.md#missubclassof): Whether the given class is a subclass of the specified class +- [isTrait()](/docs/tech/02_parser/reflectionApi/php/classes/ClassEntity.md#mistrait): Check if an entity is a Trait +- [normalizeClassName()](/docs/tech/02_parser/reflectionApi/php/classes/ClassEntity.md#mnormalizeclassname): Bring the class name to the standard format used in the system + + +
      +
      +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
      Last modified date: Wed Jan 10 23:55:33 2024 +0300
      Page content update date: Thu Jan 11 2024
      Made with Bumble Documentation Generator
      \ No newline at end of file diff --git a/docs/tech/02_parser/reflectionApi/php/phpEntitiesCollection.md b/docs/tech/02_parser/reflectionApi/php/phpEntitiesCollection.md new file mode 100644 index 00000000..c06450df --- /dev/null +++ b/docs/tech/02_parser/reflectionApi/php/phpEntitiesCollection.md @@ -0,0 +1,28 @@ + BumbleDocGen / Technical description of the project / Parser / Reflection API / Reflection API for PHP / PHP entities collection
      + +

      PHP entities collection

      + +**PHP entities collection API methods:** + +- [add()](/docs/tech/02_parser/reflectionApi/php/classes/PhpEntitiesCollection.md#madd): Add an entity to the collection +- [filterByInterfaces()](/docs/tech/02_parser/reflectionApi/php/classes/PhpEntitiesCollection.md#mfilterbyinterfaces): Get a copy of the current collection only with entities filtered by interfaces names (filtering is only available for ClassLikeEntity) +- [filterByNameRegularExpression()](/docs/tech/02_parser/reflectionApi/php/classes/PhpEntitiesCollection.md#mfilterbynameregularexpression): Get a copy of the current collection with only entities whose names match the regular expression +- [filterByParentClassNames()](/docs/tech/02_parser/reflectionApi/php/classes/PhpEntitiesCollection.md#mfilterbyparentclassnames): Get a copy of the current collection only with entities filtered by parent classes names (filtering is only available for ClassLikeEntity) +- [filterByPaths()](/docs/tech/02_parser/reflectionApi/php/classes/PhpEntitiesCollection.md#mfilterbypaths): Get a copy of the current collection only with entities filtered by file paths (from project_root) +- [findEntity()](/docs/tech/02_parser/reflectionApi/php/classes/PhpEntitiesCollection.md#mfindentity): Find an entity in a collection +- [get()](/docs/tech/02_parser/reflectionApi/php/classes/PhpEntitiesCollection.md#mget): Get an entity from a collection (only previously added) +- [getEntityCollectionName()](/docs/tech/02_parser/reflectionApi/php/classes/PhpEntitiesCollection.md#mgetentitycollectionname): Get collection name +- [getLoadedOrCreateNew()](/docs/tech/02_parser/reflectionApi/php/classes/PhpEntitiesCollection.md#mgetloadedorcreatenew): Get an entity from the collection or create a new one if it has not yet been added +- [getOnlyAbstractClasses()](/docs/tech/02_parser/reflectionApi/php/classes/PhpEntitiesCollection.md#mgetonlyabstractclasses): Get a copy of the current collection with only abstract classes +- [getOnlyInstantiable()](/docs/tech/02_parser/reflectionApi/php/classes/PhpEntitiesCollection.md#mgetonlyinstantiable): Get a copy of the current collection with only instantiable entities +- [getOnlyInterfaces()](/docs/tech/02_parser/reflectionApi/php/classes/PhpEntitiesCollection.md#mgetonlyinterfaces): Get a copy of the current collection with only interfaces +- [getOnlyTraits()](/docs/tech/02_parser/reflectionApi/php/classes/PhpEntitiesCollection.md#mgetonlytraits): Get a copy of the current collection with only traits +- [has()](/docs/tech/02_parser/reflectionApi/php/classes/PhpEntitiesCollection.md#mhas): Check if an entity has been added to the collection +- [isEmpty()](/docs/tech/02_parser/reflectionApi/php/classes/PhpEntitiesCollection.md#misempty): Check if the collection is empty or not +- [loadEntities()](/docs/tech/02_parser/reflectionApi/php/classes/PhpEntitiesCollection.md#mloadentities): Load entities into a collection +- [remove()](/docs/tech/02_parser/reflectionApi/php/classes/PhpEntitiesCollection.md#mremove): Remove an entity from a collection +- [toArray()](/docs/tech/02_parser/reflectionApi/php/classes/PhpEntitiesCollection.md#mtoarray): Convert collection to array + +
      +
      +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
      Last modified date: Wed Jan 10 23:55:33 2024 +0300
      Page content update date: Thu Jan 11 2024
      Made with Bumble Documentation Generator
      \ No newline at end of file diff --git a/docs/tech/02_parser/reflectionApi/php/phpEnumReflectionApi.md b/docs/tech/02_parser/reflectionApi/php/phpEnumReflectionApi.md new file mode 100644 index 00000000..afa584e4 --- /dev/null +++ b/docs/tech/02_parser/reflectionApi/php/phpEnumReflectionApi.md @@ -0,0 +1,88 @@ + BumbleDocGen / Technical description of the project / Parser / Reflection API / Reflection API for PHP / PHP enum reflection API
      + +

      PHP enum reflection API

      + +PHP enum reflection EnumEntity inherits from ClassLikeEntity. + +**Source enum formats:** + +1) `enum ` + +**Example of creating enum reflection:** + +```php +$entitiesCollection = (new \BumbleDocGen\DocGeneratorFactory())->createRootEntitiesCollection($reflectionApiConfig); + +$enumReflection = $entitiesCollection->getLoadedOrCreateNew('SomeEnumName'); // or get() +``` + +**Enum reflection API methods:** + +- [getAbsoluteFileName()](/docs/tech/02_parser/reflectionApi/php/classes/EnumEntity.md#mgetabsolutefilename): Returns the absolute path to a file if it can be retrieved and if the file is in the project directory +- [getAst()](/docs/tech/02_parser/reflectionApi/php/classes/EnumEntity.md#mgetast): Get AST for this entity +- [getCasesNames()](/docs/tech/02_parser/reflectionApi/php/classes/EnumEntity.md#mgetcasesnames): Get enum cases names +- [getConstant()](/docs/tech/02_parser/reflectionApi/php/classes/EnumEntity.md#mgetconstant): Get the method entity by its name +- [getConstantEntitiesCollection()](/docs/tech/02_parser/reflectionApi/php/classes/EnumEntity.md#mgetconstantentitiescollection): Get a collection of constant entities +- [getConstantValue()](/docs/tech/02_parser/reflectionApi/php/classes/EnumEntity.md#mgetconstantvalue): Get the compiled value of a constant +- [getConstants()](/docs/tech/02_parser/reflectionApi/php/classes/EnumEntity.md#mgetconstants): Get all constants that are available according to the configuration as an array +- [getConstantsValues()](/docs/tech/02_parser/reflectionApi/php/classes/EnumEntity.md#mgetconstantsvalues): Get class constant compiled values according to filters +- [getDescription()](/docs/tech/02_parser/reflectionApi/php/classes/EnumEntity.md#mgetdescription): Get entity description +- [getDescriptionLinks()](/docs/tech/02_parser/reflectionApi/php/classes/EnumEntity.md#mgetdescriptionlinks): Get parsed links from description and doc blocks `see` and `link` +- [getDocComment()](/docs/tech/02_parser/reflectionApi/php/classes/EnumEntity.md#mgetdoccomment): Get the doc comment of an entity +- [getDocCommentLine()](/docs/tech/02_parser/reflectionApi/php/classes/EnumEntity.md#mgetdoccommentline): Get the code line number where the docBlock of the current entity begins +- [getDocNote()](/docs/tech/02_parser/reflectionApi/php/classes/EnumEntity.md#mgetdocnote): Get the note annotation value +- [getEndLine()](/docs/tech/02_parser/reflectionApi/php/classes/EnumEntity.md#mgetendline): Get the line number of the end of a class code in a file +- [getEnumCaseValue()](/docs/tech/02_parser/reflectionApi/php/classes/EnumEntity.md#mgetenumcasevalue): Get enum case value +- [getEnumCases()](/docs/tech/02_parser/reflectionApi/php/classes/EnumEntity.md#mgetenumcases): Get enum cases values +- [getExamples()](/docs/tech/02_parser/reflectionApi/php/classes/EnumEntity.md#mgetexamples): Get parsed examples from `examples` doc block +- [getFirstExample()](/docs/tech/02_parser/reflectionApi/php/classes/EnumEntity.md#mgetfirstexample): Get first example from `examples` doc block +- [getImplementingClass()](/docs/tech/02_parser/reflectionApi/php/classes/EnumEntity.md#mgetimplementingclass): Get the class like entity in which the current entity was implemented +- [getInterfaceNames()](/docs/tech/02_parser/reflectionApi/php/classes/EnumEntity.md#mgetinterfacenames): Get a list of class interface names +- [getInterfacesEntities()](/docs/tech/02_parser/reflectionApi/php/classes/EnumEntity.md#mgetinterfacesentities): Get a list of interface entities that the current class implements +- [getMethod()](/docs/tech/02_parser/reflectionApi/php/classes/EnumEntity.md#mgetmethod): Get the method entity by its name +- [getMethodEntitiesCollection()](/docs/tech/02_parser/reflectionApi/php/classes/EnumEntity.md#mgetmethodentitiescollection): Get a collection of method entities +- [getMethods()](/docs/tech/02_parser/reflectionApi/php/classes/EnumEntity.md#mgetmethods): Get all methods that are available according to the configuration as an array +- [getName()](/docs/tech/02_parser/reflectionApi/php/classes/EnumEntity.md#mgetname): Full name of the entity +- [getNamespaceName()](/docs/tech/02_parser/reflectionApi/php/classes/EnumEntity.md#mgetnamespacename): Get the entity namespace name +- [getObjectId()](/docs/tech/02_parser/reflectionApi/php/classes/EnumEntity.md#mgetobjectid): Get entity unique ID +- [getParentClass()](/docs/tech/02_parser/reflectionApi/php/classes/EnumEntity.md#mgetparentclass): Get the entity of the parent class if it exists +- [getParentClassEntities()](/docs/tech/02_parser/reflectionApi/php/classes/EnumEntity.md#mgetparentclassentities): Get a list of parent class entities +- [getParentClassName()](/docs/tech/02_parser/reflectionApi/php/classes/EnumEntity.md#mgetparentclassname): Get the name of the parent class entity if it exists +- [getParentClassNames()](/docs/tech/02_parser/reflectionApi/php/classes/EnumEntity.md#mgetparentclassnames): Get a list of entity names of parent classes +- [getPluginData()](/docs/tech/02_parser/reflectionApi/php/classes/EnumEntity.md#mgetplugindata): Get additional information added using the plugin +- [getProperties()](/docs/tech/02_parser/reflectionApi/php/classes/EnumEntity.md#mgetproperties): Get all properties that are available according to the configuration as an array +- [getProperty()](/docs/tech/02_parser/reflectionApi/php/classes/EnumEntity.md#mgetproperty): Get the property entity by its name +- [getPropertyDefaultValue()](/docs/tech/02_parser/reflectionApi/php/classes/EnumEntity.md#mgetpropertydefaultvalue): Get the compiled value of a property +- [getPropertyEntitiesCollection()](/docs/tech/02_parser/reflectionApi/php/classes/EnumEntity.md#mgetpropertyentitiescollection): Get a collection of property entities +- [getRelativeFileName()](/docs/tech/02_parser/reflectionApi/php/classes/EnumEntity.md#mgetrelativefilename): File name relative to project_root configuration parameter +- [getRootEntityCollection()](/docs/tech/02_parser/reflectionApi/php/classes/EnumEntity.md#mgetrootentitycollection): Get the collection of root entities to which this entity belongs +- [getShortName()](/docs/tech/02_parser/reflectionApi/php/classes/EnumEntity.md#mgetshortname): Short name of the entity +- [getStartLine()](/docs/tech/02_parser/reflectionApi/php/classes/EnumEntity.md#mgetstartline): Get the line number of the start of a class code in a file +- [getThrows()](/docs/tech/02_parser/reflectionApi/php/classes/EnumEntity.md#mgetthrows): Get parsed throws from `throws` doc block +- [getTraits()](/docs/tech/02_parser/reflectionApi/php/classes/EnumEntity.md#mgettraits): Get a list of trait entities of the current class +- [getTraitsNames()](/docs/tech/02_parser/reflectionApi/php/classes/EnumEntity.md#mgettraitsnames): Get a list of class traits names +- [hasConstant()](/docs/tech/02_parser/reflectionApi/php/classes/EnumEntity.md#mhasconstant): Check if a constant exists in a class +- [hasDescriptionLinks()](/docs/tech/02_parser/reflectionApi/php/classes/EnumEntity.md#mhasdescriptionlinks): Checking if an entity has links in its description +- [hasExamples()](/docs/tech/02_parser/reflectionApi/php/classes/EnumEntity.md#mhasexamples): Checking if an entity has `example` docBlock +- [hasMethod()](/docs/tech/02_parser/reflectionApi/php/classes/EnumEntity.md#mhasmethod): Check if a method exists in a class +- [hasParentClass()](/docs/tech/02_parser/reflectionApi/php/classes/EnumEntity.md#mhasparentclass): Check if a certain parent class exists in a chain of parent classes +- [hasProperty()](/docs/tech/02_parser/reflectionApi/php/classes/EnumEntity.md#mhasproperty): Check if a property exists in a class +- [hasThrows()](/docs/tech/02_parser/reflectionApi/php/classes/EnumEntity.md#mhasthrows): Checking if an entity has `throws` docBlock +- [hasTraits()](/docs/tech/02_parser/reflectionApi/php/classes/EnumEntity.md#mhastraits): Check if the class contains traits +- [implementsInterface()](/docs/tech/02_parser/reflectionApi/php/classes/EnumEntity.md#mimplementsinterface): Check if a class implements an interface +- [isAbstract()](/docs/tech/02_parser/reflectionApi/php/classes/EnumEntity.md#misabstract): Check that an entity is abstract +- [isApi()](/docs/tech/02_parser/reflectionApi/php/classes/EnumEntity.md#misapi): Checking if an entity has `api` docBlock +- [isClass()](/docs/tech/02_parser/reflectionApi/php/classes/EnumEntity.md#misclass): Check if an entity is a Class +- [isDeprecated()](/docs/tech/02_parser/reflectionApi/php/classes/EnumEntity.md#misdeprecated): Checking if an entity has `deprecated` docBlock +- [isEntityFileCanBeLoad()](/docs/tech/02_parser/reflectionApi/php/classes/EnumEntity.md#misentityfilecanbeload): Checking if entity data can be retrieved +- [isEnum()](/docs/tech/02_parser/reflectionApi/php/classes/EnumEntity.md#misenum): Check if an entity is an Enum +- [isInstantiable()](/docs/tech/02_parser/reflectionApi/php/classes/EnumEntity.md#misinstantiable): Check that an entity is instantiable +- [isInterface()](/docs/tech/02_parser/reflectionApi/php/classes/EnumEntity.md#misinterface): Check if an entity is an Interface +- [isInternal()](/docs/tech/02_parser/reflectionApi/php/classes/EnumEntity.md#misinternal): Checking if an entity has `internal` docBlock +- [isSubclassOf()](/docs/tech/02_parser/reflectionApi/php/classes/EnumEntity.md#missubclassof): Whether the given class is a subclass of the specified class +- [isTrait()](/docs/tech/02_parser/reflectionApi/php/classes/EnumEntity.md#mistrait): Check if an entity is a Trait +- [normalizeClassName()](/docs/tech/02_parser/reflectionApi/php/classes/EnumEntity.md#mnormalizeclassname): Bring the class name to the standard format used in the system + +
      +
      +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
      Last modified date: Wed Jan 10 23:55:33 2024 +0300
      Page content update date: Thu Jan 11 2024
      Made with Bumble Documentation Generator
      \ No newline at end of file diff --git a/docs/tech/02_parser/reflectionApi/php/phpInterfaceReflectionApi.md b/docs/tech/02_parser/reflectionApi/php/phpInterfaceReflectionApi.md new file mode 100644 index 00000000..a0d551ff --- /dev/null +++ b/docs/tech/02_parser/reflectionApi/php/phpInterfaceReflectionApi.md @@ -0,0 +1,85 @@ + BumbleDocGen / Technical description of the project / Parser / Reflection API / Reflection API for PHP / PHP interface reflection API
      + +

      PHP interface reflection API

      + +PHP interface reflection InterfaceEntity inherits from ClassLikeEntity. + +**Source interface formats:** + +1) `interface ` + +**Example of creating interface reflection:** + +```php +$entitiesCollection = (new \BumbleDocGen\DocGeneratorFactory())->createRootEntitiesCollection($reflectionApiConfig); + +$interfaceReflection = $entitiesCollection->getLoadedOrCreateNew('SomeInterfaceName'); // or get() +``` + +**Interface reflection API methods:** + +- [getAbsoluteFileName()](/docs/tech/02_parser/reflectionApi/php/classes/InterfaceEntity.md#mgetabsolutefilename): Returns the absolute path to a file if it can be retrieved and if the file is in the project directory +- [getAst()](/docs/tech/02_parser/reflectionApi/php/classes/InterfaceEntity.md#mgetast): Get AST for this entity +- [getConstant()](/docs/tech/02_parser/reflectionApi/php/classes/InterfaceEntity.md#mgetconstant): Get the method entity by its name +- [getConstantEntitiesCollection()](/docs/tech/02_parser/reflectionApi/php/classes/InterfaceEntity.md#mgetconstantentitiescollection): Get a collection of constant entities +- [getConstantValue()](/docs/tech/02_parser/reflectionApi/php/classes/InterfaceEntity.md#mgetconstantvalue): Get the compiled value of a constant +- [getConstants()](/docs/tech/02_parser/reflectionApi/php/classes/InterfaceEntity.md#mgetconstants): Get all constants that are available according to the configuration as an array +- [getConstantsValues()](/docs/tech/02_parser/reflectionApi/php/classes/InterfaceEntity.md#mgetconstantsvalues): Get class constant compiled values according to filters +- [getDescription()](/docs/tech/02_parser/reflectionApi/php/classes/InterfaceEntity.md#mgetdescription): Get entity description +- [getDescriptionLinks()](/docs/tech/02_parser/reflectionApi/php/classes/InterfaceEntity.md#mgetdescriptionlinks): Get parsed links from description and doc blocks `see` and `link` +- [getDocComment()](/docs/tech/02_parser/reflectionApi/php/classes/InterfaceEntity.md#mgetdoccomment): Get the doc comment of an entity +- [getDocCommentLine()](/docs/tech/02_parser/reflectionApi/php/classes/InterfaceEntity.md#mgetdoccommentline): Get the code line number where the docBlock of the current entity begins +- [getDocNote()](/docs/tech/02_parser/reflectionApi/php/classes/InterfaceEntity.md#mgetdocnote): Get the note annotation value +- [getEndLine()](/docs/tech/02_parser/reflectionApi/php/classes/InterfaceEntity.md#mgetendline): Get the line number of the end of a class code in a file +- [getExamples()](/docs/tech/02_parser/reflectionApi/php/classes/InterfaceEntity.md#mgetexamples): Get parsed examples from `examples` doc block +- [getFirstExample()](/docs/tech/02_parser/reflectionApi/php/classes/InterfaceEntity.md#mgetfirstexample): Get first example from `examples` doc block +- [getImplementingClass()](/docs/tech/02_parser/reflectionApi/php/classes/InterfaceEntity.md#mgetimplementingclass): Get the class like entity in which the current entity was implemented +- [getInterfaceNames()](/docs/tech/02_parser/reflectionApi/php/classes/InterfaceEntity.md#mgetinterfacenames): Get a list of class interface names +- [getInterfacesEntities()](/docs/tech/02_parser/reflectionApi/php/classes/InterfaceEntity.md#mgetinterfacesentities): Get a list of interface entities that the current class implements +- [getMethod()](/docs/tech/02_parser/reflectionApi/php/classes/InterfaceEntity.md#mgetmethod): Get the method entity by its name +- [getMethodEntitiesCollection()](/docs/tech/02_parser/reflectionApi/php/classes/InterfaceEntity.md#mgetmethodentitiescollection): Get a collection of method entities +- [getMethods()](/docs/tech/02_parser/reflectionApi/php/classes/InterfaceEntity.md#mgetmethods): Get all methods that are available according to the configuration as an array +- [getName()](/docs/tech/02_parser/reflectionApi/php/classes/InterfaceEntity.md#mgetname): Full name of the entity +- [getNamespaceName()](/docs/tech/02_parser/reflectionApi/php/classes/InterfaceEntity.md#mgetnamespacename): Get the entity namespace name +- [getObjectId()](/docs/tech/02_parser/reflectionApi/php/classes/InterfaceEntity.md#mgetobjectid): Get entity unique ID +- [getParentClass()](/docs/tech/02_parser/reflectionApi/php/classes/InterfaceEntity.md#mgetparentclass): Get the entity of the parent class if it exists +- [getParentClassEntities()](/docs/tech/02_parser/reflectionApi/php/classes/InterfaceEntity.md#mgetparentclassentities): Get a list of parent class entities +- [getParentClassName()](/docs/tech/02_parser/reflectionApi/php/classes/InterfaceEntity.md#mgetparentclassname): Get the name of the parent class entity if it exists +- [getParentClassNames()](/docs/tech/02_parser/reflectionApi/php/classes/InterfaceEntity.md#mgetparentclassnames): Get a list of entity names of parent classes +- [getPluginData()](/docs/tech/02_parser/reflectionApi/php/classes/InterfaceEntity.md#mgetplugindata): Get additional information added using the plugin +- [getProperties()](/docs/tech/02_parser/reflectionApi/php/classes/InterfaceEntity.md#mgetproperties): Get all properties that are available according to the configuration as an array +- [getProperty()](/docs/tech/02_parser/reflectionApi/php/classes/InterfaceEntity.md#mgetproperty): Get the property entity by its name +- [getPropertyDefaultValue()](/docs/tech/02_parser/reflectionApi/php/classes/InterfaceEntity.md#mgetpropertydefaultvalue): Get the compiled value of a property +- [getPropertyEntitiesCollection()](/docs/tech/02_parser/reflectionApi/php/classes/InterfaceEntity.md#mgetpropertyentitiescollection): Get a collection of property entities +- [getRelativeFileName()](/docs/tech/02_parser/reflectionApi/php/classes/InterfaceEntity.md#mgetrelativefilename): File name relative to project_root configuration parameter +- [getRootEntityCollection()](/docs/tech/02_parser/reflectionApi/php/classes/InterfaceEntity.md#mgetrootentitycollection): Get the collection of root entities to which this entity belongs +- [getShortName()](/docs/tech/02_parser/reflectionApi/php/classes/InterfaceEntity.md#mgetshortname): Short name of the entity +- [getStartLine()](/docs/tech/02_parser/reflectionApi/php/classes/InterfaceEntity.md#mgetstartline): Get the line number of the start of a class code in a file +- [getThrows()](/docs/tech/02_parser/reflectionApi/php/classes/InterfaceEntity.md#mgetthrows): Get parsed throws from `throws` doc block +- [getTraits()](/docs/tech/02_parser/reflectionApi/php/classes/InterfaceEntity.md#mgettraits): Get a list of trait entities of the current class +- [getTraitsNames()](/docs/tech/02_parser/reflectionApi/php/classes/InterfaceEntity.md#mgettraitsnames): Get a list of class traits names +- [hasConstant()](/docs/tech/02_parser/reflectionApi/php/classes/InterfaceEntity.md#mhasconstant): Check if a constant exists in a class +- [hasDescriptionLinks()](/docs/tech/02_parser/reflectionApi/php/classes/InterfaceEntity.md#mhasdescriptionlinks): Checking if an entity has links in its description +- [hasExamples()](/docs/tech/02_parser/reflectionApi/php/classes/InterfaceEntity.md#mhasexamples): Checking if an entity has `example` docBlock +- [hasMethod()](/docs/tech/02_parser/reflectionApi/php/classes/InterfaceEntity.md#mhasmethod): Check if a method exists in a class +- [hasParentClass()](/docs/tech/02_parser/reflectionApi/php/classes/InterfaceEntity.md#mhasparentclass): Check if a certain parent class exists in a chain of parent classes +- [hasProperty()](/docs/tech/02_parser/reflectionApi/php/classes/InterfaceEntity.md#mhasproperty): Check if a property exists in a class +- [hasThrows()](/docs/tech/02_parser/reflectionApi/php/classes/InterfaceEntity.md#mhasthrows): Checking if an entity has `throws` docBlock +- [hasTraits()](/docs/tech/02_parser/reflectionApi/php/classes/InterfaceEntity.md#mhastraits): Check if the class contains traits +- [implementsInterface()](/docs/tech/02_parser/reflectionApi/php/classes/InterfaceEntity.md#mimplementsinterface): Check if a class implements an interface +- [isAbstract()](/docs/tech/02_parser/reflectionApi/php/classes/InterfaceEntity.md#misabstract): Check that an entity is abstract +- [isApi()](/docs/tech/02_parser/reflectionApi/php/classes/InterfaceEntity.md#misapi): Checking if an entity has `api` docBlock +- [isClass()](/docs/tech/02_parser/reflectionApi/php/classes/InterfaceEntity.md#misclass): Check if an entity is a Class +- [isDeprecated()](/docs/tech/02_parser/reflectionApi/php/classes/InterfaceEntity.md#misdeprecated): Checking if an entity has `deprecated` docBlock +- [isEntityFileCanBeLoad()](/docs/tech/02_parser/reflectionApi/php/classes/InterfaceEntity.md#misentityfilecanbeload): Checking if entity data can be retrieved +- [isEnum()](/docs/tech/02_parser/reflectionApi/php/classes/InterfaceEntity.md#misenum): Check if an entity is an Enum +- [isInstantiable()](/docs/tech/02_parser/reflectionApi/php/classes/InterfaceEntity.md#misinstantiable): Check that an entity is instantiable +- [isInterface()](/docs/tech/02_parser/reflectionApi/php/classes/InterfaceEntity.md#misinterface): Check if an entity is an Interface +- [isInternal()](/docs/tech/02_parser/reflectionApi/php/classes/InterfaceEntity.md#misinternal): Checking if an entity has `internal` docBlock +- [isSubclassOf()](/docs/tech/02_parser/reflectionApi/php/classes/InterfaceEntity.md#missubclassof): Whether the given class is a subclass of the specified class +- [isTrait()](/docs/tech/02_parser/reflectionApi/php/classes/InterfaceEntity.md#mistrait): Check if an entity is a Trait +- [normalizeClassName()](/docs/tech/02_parser/reflectionApi/php/classes/InterfaceEntity.md#mnormalizeclassname): Bring the class name to the standard format used in the system + +
      +
      +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
      Last modified date: Wed Jan 10 23:55:33 2024 +0300
      Page content update date: Thu Jan 11 2024
      Made with Bumble Documentation Generator
      \ No newline at end of file diff --git a/docs/tech/02_parser/reflectionApi/php/phpTraitReflectionApi.md b/docs/tech/02_parser/reflectionApi/php/phpTraitReflectionApi.md new file mode 100644 index 00000000..0ff5faee --- /dev/null +++ b/docs/tech/02_parser/reflectionApi/php/phpTraitReflectionApi.md @@ -0,0 +1,85 @@ + BumbleDocGen / Technical description of the project / Parser / Reflection API / Reflection API for PHP / PHP trait reflection API
      + +

      PHP trait reflection API

      + +PHP trait reflection TraitEntity inherits from ClassLikeEntity. + +**Source trait formats:** + +1) `trait ` + +**Example of creating trait reflection:** + +```php +$entitiesCollection = (new \BumbleDocGen\DocGeneratorFactory())->createRootEntitiesCollection($reflectionApiConfig); + +$traitReflection = $entitiesCollection->getLoadedOrCreateNew('SomeTraitName'); // or get() +``` + +**Trait reflection API methods:** + +- [getAbsoluteFileName()](/docs/tech/02_parser/reflectionApi/php/classes/TraitEntity.md#mgetabsolutefilename): Returns the absolute path to a file if it can be retrieved and if the file is in the project directory +- [getAst()](/docs/tech/02_parser/reflectionApi/php/classes/TraitEntity.md#mgetast): Get AST for this entity +- [getConstant()](/docs/tech/02_parser/reflectionApi/php/classes/TraitEntity.md#mgetconstant): Get the method entity by its name +- [getConstantEntitiesCollection()](/docs/tech/02_parser/reflectionApi/php/classes/TraitEntity.md#mgetconstantentitiescollection): Get a collection of constant entities +- [getConstantValue()](/docs/tech/02_parser/reflectionApi/php/classes/TraitEntity.md#mgetconstantvalue): Get the compiled value of a constant +- [getConstants()](/docs/tech/02_parser/reflectionApi/php/classes/TraitEntity.md#mgetconstants): Get all constants that are available according to the configuration as an array +- [getConstantsValues()](/docs/tech/02_parser/reflectionApi/php/classes/TraitEntity.md#mgetconstantsvalues): Get class constant compiled values according to filters +- [getDescription()](/docs/tech/02_parser/reflectionApi/php/classes/TraitEntity.md#mgetdescription): Get entity description +- [getDescriptionLinks()](/docs/tech/02_parser/reflectionApi/php/classes/TraitEntity.md#mgetdescriptionlinks): Get parsed links from description and doc blocks `see` and `link` +- [getDocComment()](/docs/tech/02_parser/reflectionApi/php/classes/TraitEntity.md#mgetdoccomment): Get the doc comment of an entity +- [getDocCommentLine()](/docs/tech/02_parser/reflectionApi/php/classes/TraitEntity.md#mgetdoccommentline): Get the code line number where the docBlock of the current entity begins +- [getDocNote()](/docs/tech/02_parser/reflectionApi/php/classes/TraitEntity.md#mgetdocnote): Get the note annotation value +- [getEndLine()](/docs/tech/02_parser/reflectionApi/php/classes/TraitEntity.md#mgetendline): Get the line number of the end of a class code in a file +- [getExamples()](/docs/tech/02_parser/reflectionApi/php/classes/TraitEntity.md#mgetexamples): Get parsed examples from `examples` doc block +- [getFirstExample()](/docs/tech/02_parser/reflectionApi/php/classes/TraitEntity.md#mgetfirstexample): Get first example from `examples` doc block +- [getImplementingClass()](/docs/tech/02_parser/reflectionApi/php/classes/TraitEntity.md#mgetimplementingclass): Get the class like entity in which the current entity was implemented +- [getInterfaceNames()](/docs/tech/02_parser/reflectionApi/php/classes/TraitEntity.md#mgetinterfacenames): Get a list of class interface names +- [getInterfacesEntities()](/docs/tech/02_parser/reflectionApi/php/classes/TraitEntity.md#mgetinterfacesentities): Get a list of interface entities that the current class implements +- [getMethod()](/docs/tech/02_parser/reflectionApi/php/classes/TraitEntity.md#mgetmethod): Get the method entity by its name +- [getMethodEntitiesCollection()](/docs/tech/02_parser/reflectionApi/php/classes/TraitEntity.md#mgetmethodentitiescollection): Get a collection of method entities +- [getMethods()](/docs/tech/02_parser/reflectionApi/php/classes/TraitEntity.md#mgetmethods): Get all methods that are available according to the configuration as an array +- [getName()](/docs/tech/02_parser/reflectionApi/php/classes/TraitEntity.md#mgetname): Full name of the entity +- [getNamespaceName()](/docs/tech/02_parser/reflectionApi/php/classes/TraitEntity.md#mgetnamespacename): Get the entity namespace name +- [getObjectId()](/docs/tech/02_parser/reflectionApi/php/classes/TraitEntity.md#mgetobjectid): Get entity unique ID +- [getParentClass()](/docs/tech/02_parser/reflectionApi/php/classes/TraitEntity.md#mgetparentclass): Get the entity of the parent class if it exists +- [getParentClassEntities()](/docs/tech/02_parser/reflectionApi/php/classes/TraitEntity.md#mgetparentclassentities): Get a list of parent class entities +- [getParentClassName()](/docs/tech/02_parser/reflectionApi/php/classes/TraitEntity.md#mgetparentclassname): Get the name of the parent class entity if it exists +- [getParentClassNames()](/docs/tech/02_parser/reflectionApi/php/classes/TraitEntity.md#mgetparentclassnames): Get a list of entity names of parent classes +- [getPluginData()](/docs/tech/02_parser/reflectionApi/php/classes/TraitEntity.md#mgetplugindata): Get additional information added using the plugin +- [getProperties()](/docs/tech/02_parser/reflectionApi/php/classes/TraitEntity.md#mgetproperties): Get all properties that are available according to the configuration as an array +- [getProperty()](/docs/tech/02_parser/reflectionApi/php/classes/TraitEntity.md#mgetproperty): Get the property entity by its name +- [getPropertyDefaultValue()](/docs/tech/02_parser/reflectionApi/php/classes/TraitEntity.md#mgetpropertydefaultvalue): Get the compiled value of a property +- [getPropertyEntitiesCollection()](/docs/tech/02_parser/reflectionApi/php/classes/TraitEntity.md#mgetpropertyentitiescollection): Get a collection of property entities +- [getRelativeFileName()](/docs/tech/02_parser/reflectionApi/php/classes/TraitEntity.md#mgetrelativefilename): File name relative to project_root configuration parameter +- [getRootEntityCollection()](/docs/tech/02_parser/reflectionApi/php/classes/TraitEntity.md#mgetrootentitycollection): Get the collection of root entities to which this entity belongs +- [getShortName()](/docs/tech/02_parser/reflectionApi/php/classes/TraitEntity.md#mgetshortname): Short name of the entity +- [getStartLine()](/docs/tech/02_parser/reflectionApi/php/classes/TraitEntity.md#mgetstartline): Get the line number of the start of a class code in a file +- [getThrows()](/docs/tech/02_parser/reflectionApi/php/classes/TraitEntity.md#mgetthrows): Get parsed throws from `throws` doc block +- [getTraits()](/docs/tech/02_parser/reflectionApi/php/classes/TraitEntity.md#mgettraits): Get a list of trait entities of the current class +- [getTraitsNames()](/docs/tech/02_parser/reflectionApi/php/classes/TraitEntity.md#mgettraitsnames): Get a list of class traits names +- [hasConstant()](/docs/tech/02_parser/reflectionApi/php/classes/TraitEntity.md#mhasconstant): Check if a constant exists in a class +- [hasDescriptionLinks()](/docs/tech/02_parser/reflectionApi/php/classes/TraitEntity.md#mhasdescriptionlinks): Checking if an entity has links in its description +- [hasExamples()](/docs/tech/02_parser/reflectionApi/php/classes/TraitEntity.md#mhasexamples): Checking if an entity has `example` docBlock +- [hasMethod()](/docs/tech/02_parser/reflectionApi/php/classes/TraitEntity.md#mhasmethod): Check if a method exists in a class +- [hasParentClass()](/docs/tech/02_parser/reflectionApi/php/classes/TraitEntity.md#mhasparentclass): Check if a certain parent class exists in a chain of parent classes +- [hasProperty()](/docs/tech/02_parser/reflectionApi/php/classes/TraitEntity.md#mhasproperty): Check if a property exists in a class +- [hasThrows()](/docs/tech/02_parser/reflectionApi/php/classes/TraitEntity.md#mhasthrows): Checking if an entity has `throws` docBlock +- [hasTraits()](/docs/tech/02_parser/reflectionApi/php/classes/TraitEntity.md#mhastraits): Check if the class contains traits +- [implementsInterface()](/docs/tech/02_parser/reflectionApi/php/classes/TraitEntity.md#mimplementsinterface): Check if a class implements an interface +- [isAbstract()](/docs/tech/02_parser/reflectionApi/php/classes/TraitEntity.md#misabstract): Check that an entity is abstract +- [isApi()](/docs/tech/02_parser/reflectionApi/php/classes/TraitEntity.md#misapi): Checking if an entity has `api` docBlock +- [isClass()](/docs/tech/02_parser/reflectionApi/php/classes/TraitEntity.md#misclass): Check if an entity is a Class +- [isDeprecated()](/docs/tech/02_parser/reflectionApi/php/classes/TraitEntity.md#misdeprecated): Checking if an entity has `deprecated` docBlock +- [isEntityFileCanBeLoad()](/docs/tech/02_parser/reflectionApi/php/classes/TraitEntity.md#misentityfilecanbeload): Checking if entity data can be retrieved +- [isEnum()](/docs/tech/02_parser/reflectionApi/php/classes/TraitEntity.md#misenum): Check if an entity is an Enum +- [isInstantiable()](/docs/tech/02_parser/reflectionApi/php/classes/TraitEntity.md#misinstantiable): Check that an entity is instantiable +- [isInterface()](/docs/tech/02_parser/reflectionApi/php/classes/TraitEntity.md#misinterface): Check if an entity is an Interface +- [isInternal()](/docs/tech/02_parser/reflectionApi/php/classes/TraitEntity.md#misinternal): Checking if an entity has `internal` docBlock +- [isSubclassOf()](/docs/tech/02_parser/reflectionApi/php/classes/TraitEntity.md#missubclassof): Whether the given class is a subclass of the specified class +- [isTrait()](/docs/tech/02_parser/reflectionApi/php/classes/TraitEntity.md#mistrait): Check if an entity is a Trait +- [normalizeClassName()](/docs/tech/02_parser/reflectionApi/php/classes/TraitEntity.md#mnormalizeclassname): Bring the class name to the standard format used in the system + +
      +
      +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
      Last modified date: Wed Jan 10 23:55:33 2024 +0300
      Page content update date: Thu Jan 11 2024
      Made with Bumble Documentation Generator
      \ No newline at end of file diff --git a/docs/tech/2.parser/reflectionApi/php/readme.md b/docs/tech/02_parser/reflectionApi/php/readme.md similarity index 73% rename from docs/tech/2.parser/reflectionApi/php/readme.md rename to docs/tech/02_parser/reflectionApi/php/readme.md index 5b3f7b56..9cec2e3c 100644 --- a/docs/tech/2.parser/reflectionApi/php/readme.md +++ b/docs/tech/02_parser/reflectionApi/php/readme.md @@ -1,4 +1,4 @@ - BumbleDocGen / Technical description of the project / Parser / Reflection API / Reflection API for PHP
      + BumbleDocGen / Technical description of the project / Parser / Reflection API / Reflection API for PHP

      Reflection API for PHP

      @@ -10,10 +10,10 @@ In addition, our Reflection API is available for use in every documentation temp Using our PHP reflection API you can get information about project entities. Below is information about the available methods for working with each entity type: -1) Class reflection -2) Trait reflection -3) Interface reflection -4) Enum reflection +1) Class reflection +2) Trait reflection +3) Interface reflection +4) Enum reflection **Usage example:** @@ -36,7 +36,7 @@ Class reflections are stored in collections. The collection is filled either bef if the Reflection API is used to generate documentation, or when special methods are called that, under certain conditions, fill them with the required reflections. You can perform a number of filtering and searching operations on a collection of entities. -The collections API is presented on this page: PHP entities collection +The collections API is presented on this page: PHP entities collection **Usage example:** @@ -65,9 +65,9 @@ foreach($entitiesCollection as $classReflection) { PHP classes contain methods, properties and constants. Below is information about these child entities: -1) Class method reflection -2) Class property reflection -3) Class constant reflection +1) Class method reflection +2) Class property reflection +3) Class constant reflection **Usage example:** @@ -88,4 +88,4 @@ $firstMethodReturnValue = $methodReflection->getFirstReturnValue();

      -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
      Last modified date: Sat Dec 23 23:00:37 2023 +0300
      Page content update date: Sat Dec 23 2023
      Made with Bumble Documentation Generator
      \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
      Last modified date: Wed Jan 10 23:55:33 2024 +0300
      Page content update date: Thu Jan 11 2024
      Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/2.parser/reflectionApi/readme.md b/docs/tech/02_parser/reflectionApi/readme.md similarity index 81% rename from docs/tech/2.parser/reflectionApi/readme.md rename to docs/tech/02_parser/reflectionApi/readme.md index 4a171f25..507f3570 100644 --- a/docs/tech/2.parser/reflectionApi/readme.md +++ b/docs/tech/02_parser/reflectionApi/readme.md @@ -1,4 +1,4 @@ - BumbleDocGen / Technical description of the project / Parser / Reflection API
      + BumbleDocGen / Technical description of the project / Parser / Reflection API

      Reflection API

      @@ -6,7 +6,7 @@ The documentation generator has a convenient Reflection API for analyzing the so You can use the Reflection API both in documentation templates and simply in your code where necessary. **See:** -1) **Reflection API for PHP** +1) **Reflection API for PHP** 2) **[Demo](/demo/demo6-reflection-api/demoScript.php)**

      Example

      @@ -59,9 +59,9 @@ The only difference with the first example is that the first option is more conv The settings for which entities will be available to the reflector in this case are taken from the configuration file or configuration array, depending on the method of creating the documentation generator instance. -In addition, RootEntityCollectionsGroup is always available through DI, for example when you implement some twig function or plugin. +In addition, RootEntityCollectionsGroup is always available through DI, for example when you implement some twig function or plugin.

      -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
      Last modified date: Sat Dec 23 23:00:37 2023 +0300
      Page content update date: Sat Dec 23 2023
      Made with Bumble Documentation Generator
      \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
      Last modified date: Wed Jan 10 23:55:33 2024 +0300
      Page content update date: Thu Jan 11 2024
      Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/02_parser/sourceLocator.md b/docs/tech/02_parser/sourceLocator.md new file mode 100644 index 00000000..f4bdc619 --- /dev/null +++ b/docs/tech/02_parser/sourceLocator.md @@ -0,0 +1,28 @@ + BumbleDocGen / Technical description of the project / Parser / Source locators
      + +

      Source locators

      + +Source locators are needed so that the parser knows which files to parse, or to get data on a specific file after the primary parsing procedure + +Source locators are set in the configuration: + +```yaml + source_locators: + - class: \BumbleDocGen\Core\Parser\SourceLocator\RecursiveDirectoriesSourceLocator + arguments: + directories: + - "%project_root%/src" + - "%project_root%/selfdoc" +``` + + +You can create your own source locators or use any existing ones. All source locators must implement the SourceLocatorInterface interface. + +

      Built-in source locators

      + + + + +
      +
      +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
      Last modified date: Wed Jan 10 23:55:33 2024 +0300
      Page content update date: Thu Jan 11 2024
      Made with Bumble Documentation Generator
      \ No newline at end of file diff --git a/docs/tech/1.configuration/classes/Configuration.md b/docs/tech/03_renderer/01_howToCreateTemplates/classes/Configuration.md similarity index 79% rename from docs/tech/1.configuration/classes/Configuration.md rename to docs/tech/03_renderer/01_howToCreateTemplates/classes/Configuration.md index 67ad2cf2..b2770cc8 100644 --- a/docs/tech/1.configuration/classes/Configuration.md +++ b/docs/tech/03_renderer/01_howToCreateTemplates/classes/Configuration.md @@ -1,5 +1,4 @@ - - BumbleDocGen / Technical description of the project / Configuration files / Configuration
      + BumbleDocGen / Technical description of the project / Renderer / How to create documentation templates? / Configuration

      Configuration class: @@ -87,6 +86,9 @@ final class Configuration
    • isCheckFileInGitBeforeCreatingDocEnabled
    • +
    • + renderWithFrontMatter +
    • useSharedCache
    • @@ -159,7 +161,7 @@ public function __construct(\BumbleDocGen\Core\Configuration\ConfigurationParame ```php @@ -182,7 +184,7 @@ public function getAdditionalConsoleCommands(): \BumbleDocGen\Console\Command\Ad \DI\NotFoundException
    • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException

    @@ -210,7 +212,7 @@ public function getCacheDir(): null|string; Throws: @@ -242,7 +244,7 @@ public function getConfigurationVersion(): string; ```php @@ -280,7 +282,7 @@ public function getGitClientPath(): string; Throws: @@ -291,7 +293,7 @@ public function getGitClientPath(): string; ```php @@ -325,7 +327,7 @@ public function getIfExists(mixed $key): null|string; Throws: @@ -359,7 +361,7 @@ public function getLanguageHandlersCollection(): \BumbleDocGen\LanguageHandler\L \DI\NotFoundException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -387,7 +389,7 @@ public function getOutputDir(): string; Throws: @@ -415,7 +417,7 @@ public function getOutputDirBaseUrl(): string; Throws: @@ -446,7 +448,7 @@ public function getPageLinkProcessor(): \BumbleDocGen\Core\Renderer\PageLinkProc \DI\DependencyException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • \DI\NotFoundException
  • @@ -480,7 +482,7 @@ public function getPlugins(): \BumbleDocGen\Core\Plugin\PluginsCollection; \DI\DependencyException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • \DI\NotFoundException
  • @@ -511,7 +513,7 @@ public function getProjectRoot(): string; Throws: @@ -542,7 +544,7 @@ public function getSourceLocators(): \BumbleDocGen\Core\Parser\SourceLocator\Sou \DI\DependencyException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • \DI\NotFoundException
  • @@ -573,7 +575,7 @@ public function getTemplatesDir(): string; Throws: @@ -607,7 +609,7 @@ public function getTwigFilters(): \BumbleDocGen\Core\Renderer\Twig\Filter\Custom \DI\NotFoundException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -638,7 +640,7 @@ public function getTwigFunctions(): \BumbleDocGen\Core\Renderer\Twig\Function\Cu \DI\DependencyException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • \DI\NotFoundException
  • @@ -652,7 +654,7 @@ public function getTwigFunctions(): \BumbleDocGen\Core\Renderer\Twig\Function\Cu ```php @@ -680,7 +682,7 @@ public function getWorkingDir(): string; ```php @@ -697,7 +699,35 @@ public function isCheckFileInGitBeforeCreatingDocEnabled(): bool; Throws: + + +
    +
    + + + +```php +public function renderWithFrontMatter(): bool; +``` + + + +Parameters: not specified + +Return value: bool + + +Throws: + @@ -725,11 +755,9 @@ public function useSharedCache(): bool; Throws:

    - - \ No newline at end of file diff --git a/docs/tech/3.renderer/classes/DocumentedEntityWrapper.md b/docs/tech/03_renderer/01_howToCreateTemplates/classes/DocumentedEntityWrapper.md similarity index 97% rename from docs/tech/3.renderer/classes/DocumentedEntityWrapper.md rename to docs/tech/03_renderer/01_howToCreateTemplates/classes/DocumentedEntityWrapper.md index 9303aeb1..8ba4fd69 100644 --- a/docs/tech/3.renderer/classes/DocumentedEntityWrapper.md +++ b/docs/tech/03_renderer/01_howToCreateTemplates/classes/DocumentedEntityWrapper.md @@ -1,5 +1,4 @@ - - BumbleDocGen / Technical description of the project / Renderer / DocumentedEntityWrapper
    + BumbleDocGen / Technical description of the project / Renderer / How to create documentation templates? / DocumentedEntityWrapper

    DocumentedEntityWrapper class: @@ -299,5 +298,3 @@ public function setParentDocFilePath(string $parentDocFilePath): void;
    - - \ No newline at end of file diff --git a/docs/tech/3.renderer/classes/DocumentedEntityWrappersCollection.md b/docs/tech/03_renderer/01_howToCreateTemplates/classes/DocumentedEntityWrappersCollection.md similarity index 92% rename from docs/tech/3.renderer/classes/DocumentedEntityWrappersCollection.md rename to docs/tech/03_renderer/01_howToCreateTemplates/classes/DocumentedEntityWrappersCollection.md index c46e52b4..96e1dcaa 100644 --- a/docs/tech/3.renderer/classes/DocumentedEntityWrappersCollection.md +++ b/docs/tech/03_renderer/01_howToCreateTemplates/classes/DocumentedEntityWrappersCollection.md @@ -1,5 +1,4 @@ - - BumbleDocGen / Technical description of the project / Renderer / DocumentedEntityWrappersCollection
    + BumbleDocGen / Technical description of the project / Renderer / How to create documentation templates? / DocumentedEntityWrappersCollection

    DocumentedEntityWrappersCollection class: @@ -167,7 +166,7 @@ public function createAndAddDocumentedEntityWrapper(\BumbleDocGen\Core\Parser\En Throws: @@ -215,5 +214,3 @@ public function getIterator(): \Generator;
    - - \ No newline at end of file diff --git a/docs/tech/3.renderer/classes/GetDocumentationPageUrl.md b/docs/tech/03_renderer/01_howToCreateTemplates/classes/GetDocumentationPageUrl.md similarity index 90% rename from docs/tech/3.renderer/classes/GetDocumentationPageUrl.md rename to docs/tech/03_renderer/01_howToCreateTemplates/classes/GetDocumentationPageUrl.md index 026c1f00..18f448e9 100644 --- a/docs/tech/3.renderer/classes/GetDocumentationPageUrl.md +++ b/docs/tech/03_renderer/01_howToCreateTemplates/classes/GetDocumentationPageUrl.md @@ -1,5 +1,4 @@ - - BumbleDocGen / Technical description of the project / Renderer / How to create documentation templates? / Linking templates / GetDocumentationPageUrl
    + BumbleDocGen / Technical description of the project / Renderer / How to create documentation templates? / Linking templates / GetDocumentationPageUrl

    GetDocumentationPageUrl class: @@ -177,7 +176,7 @@ public function __invoke(string $key): string; \DI\DependencyException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • \DI\NotFoundException
  • @@ -228,5 +227,3 @@ public static function getOptions(): array;
    - - \ No newline at end of file diff --git a/docs/tech/3.renderer/classes/GetDocumentedEntityUrl.md b/docs/tech/03_renderer/01_howToCreateTemplates/classes/GetDocumentedEntityUrl.md similarity index 86% rename from docs/tech/3.renderer/classes/GetDocumentedEntityUrl.md rename to docs/tech/03_renderer/01_howToCreateTemplates/classes/GetDocumentedEntityUrl.md index a9924f6a..7f5fbfdb 100644 --- a/docs/tech/3.renderer/classes/GetDocumentedEntityUrl.md +++ b/docs/tech/03_renderer/01_howToCreateTemplates/classes/GetDocumentedEntityUrl.md @@ -1,5 +1,4 @@ - - BumbleDocGen / Technical description of the project / Renderer / How to create documentation templates? / Linking templates / GetDocumentedEntityUrl
    + BumbleDocGen / Technical description of the project / Renderer / How to create documentation templates? / Linking templates / GetDocumentedEntityUrl

    GetDocumentedEntityUrl class: @@ -21,11 +20,11 @@ the `EntityDocRendererInterface::getDocFileExtension()` directory will be create See: @@ -211,7 +210,7 @@ public function __invoke(\BumbleDocGen\Core\Parser\Entity\RootEntityCollection $ \DI\DependencyException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • \DI\NotFoundException
  • @@ -262,5 +261,3 @@ public static function getOptions(): array;
    - - \ No newline at end of file diff --git a/docs/tech/1.configuration/classes/InvalidConfigurationParameterException.md b/docs/tech/03_renderer/01_howToCreateTemplates/classes/InvalidConfigurationParameterException.md similarity index 66% rename from docs/tech/1.configuration/classes/InvalidConfigurationParameterException.md rename to docs/tech/03_renderer/01_howToCreateTemplates/classes/InvalidConfigurationParameterException.md index 7e71b968..7d350595 100644 --- a/docs/tech/1.configuration/classes/InvalidConfigurationParameterException.md +++ b/docs/tech/03_renderer/01_howToCreateTemplates/classes/InvalidConfigurationParameterException.md @@ -1,5 +1,4 @@ - - BumbleDocGen / Technical description of the project / Configuration files / InvalidConfigurationParameterException
    + BumbleDocGen / Technical description of the project / Renderer / How to create documentation templates? / InvalidConfigurationParameterException

    InvalidConfigurationParameterException class: @@ -30,5 +29,3 @@ final class InvalidConfigurationParameterException extends \Exception - - \ No newline at end of file diff --git a/docs/tech/3.renderer/classes/LanguageHandlerInterface.md b/docs/tech/03_renderer/01_howToCreateTemplates/classes/LanguageHandlerInterface.md similarity index 93% rename from docs/tech/3.renderer/classes/LanguageHandlerInterface.md rename to docs/tech/03_renderer/01_howToCreateTemplates/classes/LanguageHandlerInterface.md index f2ebf676..c0c9d8e4 100644 --- a/docs/tech/3.renderer/classes/LanguageHandlerInterface.md +++ b/docs/tech/03_renderer/01_howToCreateTemplates/classes/LanguageHandlerInterface.md @@ -1,5 +1,4 @@ - - BumbleDocGen / Technical description of the project / Renderer / How to create documentation templates? / Templates variables / LanguageHandlerInterface
    + BumbleDocGen / Technical description of the project / Renderer / How to create documentation templates? / Templates variables / LanguageHandlerInterface

    LanguageHandlerInterface class: @@ -166,5 +165,3 @@ public static function getLanguageKey(): string;
    - - \ No newline at end of file diff --git a/docs/tech/3.renderer/classes/PageHtmlLinkerPlugin.md b/docs/tech/03_renderer/01_howToCreateTemplates/classes/PageHtmlLinkerPlugin.md similarity index 91% rename from docs/tech/3.renderer/classes/PageHtmlLinkerPlugin.md rename to docs/tech/03_renderer/01_howToCreateTemplates/classes/PageHtmlLinkerPlugin.md index f426a7f2..514fbddc 100644 --- a/docs/tech/3.renderer/classes/PageHtmlLinkerPlugin.md +++ b/docs/tech/03_renderer/01_howToCreateTemplates/classes/PageHtmlLinkerPlugin.md @@ -1,5 +1,4 @@ - - BumbleDocGen / Technical description of the project / Renderer / How to create documentation templates? / Linking templates / PageHtmlLinkerPlugin
    + BumbleDocGen / Technical description of the project / Renderer / How to create documentation templates? / Linking templates / PageHtmlLinkerPlugin

    PageHtmlLinkerPlugin class: @@ -180,7 +179,7 @@ public function beforeCreatingDocFile(\BumbleDocGen\Core\Plugin\Event\Renderer\B \DI\DependencyException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -209,5 +208,3 @@ public static function getSubscribedEvents(): array;
    - - \ No newline at end of file diff --git a/docs/tech/3.renderer/classes/PhpEntitiesCollection_2.md b/docs/tech/03_renderer/01_howToCreateTemplates/classes/PhpEntitiesCollection.md similarity index 94% rename from docs/tech/3.renderer/classes/PhpEntitiesCollection_2.md rename to docs/tech/03_renderer/01_howToCreateTemplates/classes/PhpEntitiesCollection.md index 4fdbec17..cf2871c2 100644 --- a/docs/tech/3.renderer/classes/PhpEntitiesCollection_2.md +++ b/docs/tech/03_renderer/01_howToCreateTemplates/classes/PhpEntitiesCollection.md @@ -1,5 +1,4 @@ - - BumbleDocGen / Technical description of the project / Renderer / Template functions / PhpEntitiesCollection
    + BumbleDocGen / Technical description of the project / Renderer / How to create documentation templates? / Templates variables / PhpEntitiesCollection

    PhpEntitiesCollection class: @@ -244,7 +243,7 @@ public function add(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEnt Throws: @@ -312,7 +311,7 @@ public function filterByInterfaces(array $interfaces): \BumbleDocGen\LanguageHan Throws: @@ -395,7 +394,7 @@ public function filterByParentClassNames(array $parentClassNames): \BumbleDocGen Throws: @@ -440,7 +439,7 @@ public function filterByPaths(array $paths): \BumbleDocGen\LanguageHandler\Php\P Throws: @@ -671,7 +670,7 @@ public function getLoadedOrCreateNew(string $objectName, bool $withAddClassEntit See:
    @@ -697,7 +696,7 @@ public function getOnlyAbstractClasses(): \BumbleDocGen\LanguageHandler\Php\Pars Throws: @@ -939,7 +938,7 @@ public function internalGetLoadedOrCreateNew(string $objectName, bool $withAddCl \DI\NotFoundException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -1026,7 +1025,7 @@ public function loadEntities(\BumbleDocGen\Core\Parser\SourceLocator\SourceLocat \DI\NotFoundException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -1080,7 +1079,7 @@ public function loadEntitiesByConfiguration(\BumbleDocGen\Core\Parser\Entity\Ent \DI\DependencyException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -1179,5 +1178,3 @@ public function updateEntitiesCache(): void;
    - - \ No newline at end of file diff --git a/docs/tech/1.configuration/classes/RendererContext.md b/docs/tech/03_renderer/01_howToCreateTemplates/classes/RendererContext.md similarity index 96% rename from docs/tech/1.configuration/classes/RendererContext.md rename to docs/tech/03_renderer/01_howToCreateTemplates/classes/RendererContext.md index 26ebf8f4..c7b2bcdf 100644 --- a/docs/tech/1.configuration/classes/RendererContext.md +++ b/docs/tech/03_renderer/01_howToCreateTemplates/classes/RendererContext.md @@ -1,5 +1,4 @@ - - BumbleDocGen / Technical description of the project / Configuration files / RendererContext
    + BumbleDocGen / Technical description of the project / Renderer / How to create documentation templates? / RendererContext

    RendererContext class: @@ -255,5 +254,3 @@ public function setCurrentTemplateFilePatch(string $currentTemplateFilePath): vo
    - - \ No newline at end of file diff --git a/docs/tech/3.renderer/classes/RootEntityInterface.md b/docs/tech/03_renderer/01_howToCreateTemplates/classes/RootEntityInterface.md similarity index 96% rename from docs/tech/3.renderer/classes/RootEntityInterface.md rename to docs/tech/03_renderer/01_howToCreateTemplates/classes/RootEntityInterface.md index 03be8898..ad4becaf 100644 --- a/docs/tech/3.renderer/classes/RootEntityInterface.md +++ b/docs/tech/03_renderer/01_howToCreateTemplates/classes/RootEntityInterface.md @@ -1,5 +1,4 @@ - - BumbleDocGen / Technical description of the project / Renderer / Template functions / RootEntityInterface
    + BumbleDocGen / Technical description of the project / Renderer / How to create documentation templates? / RootEntityInterface

    RootEntityInterface class: @@ -256,7 +255,7 @@ public function getRelativeFileName(): null|string; See:
    @@ -468,5 +467,3 @@ public static function normalizeClassName(string $name): string;
    - - \ No newline at end of file diff --git a/docs/tech/3.renderer/01_templates.md b/docs/tech/03_renderer/01_howToCreateTemplates/readme.md similarity index 82% rename from docs/tech/3.renderer/01_templates.md rename to docs/tech/03_renderer/01_howToCreateTemplates/readme.md index a297791f..100cd786 100644 --- a/docs/tech/3.renderer/01_templates.md +++ b/docs/tech/03_renderer/01_howToCreateTemplates/readme.md @@ -1,4 +1,4 @@ - BumbleDocGen / Technical description of the project / Renderer / How to create documentation templates?
    + BumbleDocGen / Technical description of the project / Renderer / How to create documentation templates?

    How to create documentation templates?

    @@ -6,7 +6,7 @@ Templates are `twig` files in which you can write both static text and dynamic b **You can read more about template parts here:** - +

    Examples

    @@ -103,4 +103,4 @@ Result after starting the documentation generation process:

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Dec 23 23:12:46 2023 +0300
    Page content update date: Sat Dec 23 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Thu Jan 11 00:14:41 2024 +0300
    Page content update date: Thu Jan 11 2024
    Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/3.renderer/templatesDynamicBlocks.md b/docs/tech/03_renderer/01_howToCreateTemplates/templatesDynamicBlocks.md similarity index 52% rename from docs/tech/3.renderer/templatesDynamicBlocks.md rename to docs/tech/03_renderer/01_howToCreateTemplates/templatesDynamicBlocks.md index c9e776c0..057e7642 100644 --- a/docs/tech/3.renderer/templatesDynamicBlocks.md +++ b/docs/tech/03_renderer/01_howToCreateTemplates/templatesDynamicBlocks.md @@ -1,10 +1,10 @@ - BumbleDocGen / Technical description of the project / Renderer / How to create documentation templates? / Templates dynamic blocks
    + BumbleDocGen / Technical description of the project / Renderer / How to create documentation templates? / Templates dynamic blocks

    Templates dynamic blocks

    There are several ways to create dynamic blocks in templates. -* First of all, these are custom twig functions and filters. +* First of all, these are custom twig functions and filters. You can use the built-in functions and filters or add your own, so you can implement any logic for generating dynamically changing content. ```twig @@ -12,7 +12,7 @@ You can use the built-in functions and filters or add your own, so you can imple ``` -* The second way is to output data from variables directly to the template. For example, you can display a list of classes or methods of documented code according to certain rules. +* The second way is to output data from variables directly to the template. For example, you can display a list of classes or methods of documented code according to certain rules. ```twig {% for entity in phpEntities.filterByInterfaces(['\\BumbleDocGen\\Core\\Parser\\SourceLocator\\SourceLocatorInterface']).getOnlyInstantiable() %} @@ -26,4 +26,4 @@ You can use the built-in functions and filters or add your own, so you can imple

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Dec 23 23:00:37 2023 +0300
    Page content update date: Sat Dec 23 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Thu Jan 11 00:14:41 2024 +0300
    Page content update date: Thu Jan 11 2024
    Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/3.renderer/templatesLinking.md b/docs/tech/03_renderer/01_howToCreateTemplates/templatesLinking.md similarity index 57% rename from docs/tech/3.renderer/templatesLinking.md rename to docs/tech/03_renderer/01_howToCreateTemplates/templatesLinking.md index 039bd0d7..7fbf86fa 100644 --- a/docs/tech/3.renderer/templatesLinking.md +++ b/docs/tech/03_renderer/01_howToCreateTemplates/templatesLinking.md @@ -1,4 +1,4 @@ - BumbleDocGen / Technical description of the project / Renderer / How to create documentation templates? / Linking templates
    + BumbleDocGen / Technical description of the project / Renderer / How to create documentation templates? / Linking templates

    Linking templates

    @@ -7,7 +7,7 @@ We have several options for this, such as using special functions or using a spe

    Completing blank links

    -Plugin PageHtmlLinkerPlugin have been added to the basic configuration, +Plugin PageHtmlLinkerPlugin have been added to the basic configuration, which process the text of the filled template before its result is written to a file, and fill in all empty links. For example, an empty link: @@ -22,9 +22,9 @@ will be replaced with this link: The second way to relink templates is to generate links through functions. -There are a number of functions that allow you to get a link to an entity, for example GetDocumentedEntityUrl, and there are also functions for getting a link to other documents, for example GetDocumentationPageUrl. +There are a number of functions that allow you to get a link to an entity, for example GetDocumentedEntityUrl, and there are also functions for getting a link to other documents, for example GetDocumentationPageUrl. You can also implement your own functions for relinking if necessary.

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Dec 23 23:00:37 2023 +0300
    Page content update date: Sat Dec 23 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Thu Jan 11 00:14:41 2024 +0300
    Page content update date: Thu Jan 11 2024
    Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/03_renderer/01_howToCreateTemplates/templatesVariables.md b/docs/tech/03_renderer/01_howToCreateTemplates/templatesVariables.md new file mode 100644 index 00000000..f4463b1c --- /dev/null +++ b/docs/tech/03_renderer/01_howToCreateTemplates/templatesVariables.md @@ -0,0 +1,14 @@ + BumbleDocGen / Technical description of the project / Renderer / How to create documentation templates? / Templates variables
    + +

    Templates variables

    + +There are several variables available in each processed template. + +1) Firstly, these are built-in twig variables, for example `_self`, which returns the path to the processed template. + +2) Secondly, variables with collections of processed programming languages are available in the template (see LanguageHandlerInterface). For example, when processing a PHP project collection, a collection PhpEntitiesCollection will be available in the template under the name phpEntities + + +
    +
    +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Thu Jan 11 00:14:41 2024 +0300
    Page content update date: Thu Jan 11 2024
    Made with Bumble Documentation Generator
    \ No newline at end of file diff --git a/docs/tech/3.renderer/02_breadcrumbs.md b/docs/tech/03_renderer/02_breadcrumbs.md similarity index 80% rename from docs/tech/3.renderer/02_breadcrumbs.md rename to docs/tech/03_renderer/02_breadcrumbs.md index cbbaddb9..f2710817 100644 --- a/docs/tech/3.renderer/02_breadcrumbs.md +++ b/docs/tech/03_renderer/02_breadcrumbs.md @@ -1,8 +1,8 @@ - BumbleDocGen / Technical description of the project / Renderer / Documentation structure and breadcrumbs
    + BumbleDocGen / Technical description of the project / Renderer / Documentation structure and breadcrumbs

    Documentation structure and breadcrumbs

    -To work with breadcrumbs and get the structure of the documentation, we use the inner class BreadcrumbsHelper. +To work with breadcrumbs and get the structure of the documentation, we use the inner class BreadcrumbsHelper. To build the documentation structure, twig templates from the `templates_dir` configuration are used.

    Project structure definitions

    @@ -28,7 +28,7 @@ In this way, complex documentation structures can be created with less file nest

    Displaying breadcrumbs in documents

    -There is a built-in function to generate breadcrumbs in templates GeneratePageBreadcrumbs. +There is a built-in function to generate breadcrumbs in templates GeneratePageBreadcrumbs. Here is how it is used in twig templates: ```twig @@ -55,4 +55,4 @@ Here is an example of the result of the `generatePageBreadcrumbs` function:

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Dec 23 23:12:46 2023 +0300
    Page content update date: Sat Dec 23 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Wed Jan 10 23:55:33 2024 +0300
    Page content update date: Thu Jan 11 2024
    Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/3.renderer/03_documentStructure.md b/docs/tech/03_renderer/03_documentStructure.md similarity index 79% rename from docs/tech/3.renderer/03_documentStructure.md rename to docs/tech/03_renderer/03_documentStructure.md index 203a40bd..2b0d50f4 100644 --- a/docs/tech/3.renderer/03_documentStructure.md +++ b/docs/tech/03_renderer/03_documentStructure.md @@ -1,4 +1,4 @@ - BumbleDocGen / Technical description of the project / Renderer / Document structure of generated entities
    + BumbleDocGen / Technical description of the project / Renderer / Document structure of generated entities

    Document structure of generated entities

    @@ -19,4 +19,4 @@ plugins:

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Dec 23 23:00:37 2023 +0300
    Page content update date: Sat Dec 23 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Wed Jan 10 23:55:33 2024 +0300
    Page content update date: Thu Jan 11 2024
    Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/3.renderer/04_twigCustomFilters.md b/docs/tech/03_renderer/04_twigCustomFilters.md similarity index 88% rename from docs/tech/3.renderer/04_twigCustomFilters.md rename to docs/tech/03_renderer/04_twigCustomFilters.md index 798b17cb..86b04be5 100644 --- a/docs/tech/3.renderer/04_twigCustomFilters.md +++ b/docs/tech/03_renderer/04_twigCustomFilters.md @@ -1,9 +1,9 @@ - BumbleDocGen / Technical description of the project / Renderer / Template filters
    + BumbleDocGen / Technical description of the project / Renderer / Template filters

    Template filters

    When generating pages, you can use filters that allow you to modify the content. -Filters available during page generation are defined in the configuration ( `twig_filters` parameter ) +Filters available during page generation are defined in the configuration ( `twig_filters` parameter ) We use the twig template engine, you can get more information about working with filters here: https://twig.symfony.com/doc/1.x/advanced.html#filters @@ -28,7 +28,7 @@ twig_filters: ``` It is important to remember that when a template is inherited, custom filters are not overridden and augmented. -This information is detailed on page Configuration files. +This information is detailed on page Configuration.

    Defautl template filters

    @@ -55,7 +55,7 @@ Here is a list of filters available by default: - addIndentFromLeft
    + addIndentFromLeft
    Filter adds indent from left @@ -87,7 +87,7 @@ Here is a list of filters available by default: - fixStrSize
    + fixStrSize
    The filter pads the string with the specified characters on the right to the specified size @@ -119,7 +119,7 @@ Here is a list of filters available by default: - implode
    + implode
    Join array elements with a string @@ -139,7 +139,7 @@ Here is a list of filters available by default: - preg_match
    + preg_match
    Perform a regular expression match @@ -159,7 +159,7 @@ Here is a list of filters available by default: - prepareSourceLink
    + prepareSourceLink
    The filter converts the string into an anchor that can be used in a GitHub document link The filter does not accept any additional parameters @@ -168,7 +168,7 @@ Here is a list of filters available by default: - quotemeta
    + quotemeta
    Quote meta characters The filter does not accept any additional parameters @@ -177,7 +177,7 @@ Here is a list of filters available by default: - removeLineBrakes
    + removeLineBrakes
    The filter replaces all line breaks with a space The filter does not accept any additional parameters @@ -186,7 +186,7 @@ Here is a list of filters available by default: - strTypeToUrl
    + strTypeToUrl
    The filter converts the string with the data type into a link to the documented entity, if possible.
    :warning: This filter initiates the creation of documents for the displayed entities
    @@ -230,7 +230,7 @@ Here is a list of filters available by default: - textToCodeBlock
    + textToCodeBlock
    Convert text to code block @@ -250,7 +250,7 @@ Here is a list of filters available by default: - textToHeading
    + textToHeading
    Convert text to html header @@ -274,4 +274,4 @@ Here is a list of filters available by default:

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Dec 23 23:00:37 2023 +0300
    Page content update date: Sat Dec 23 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Wed Jan 10 23:55:33 2024 +0300
    Page content update date: Thu Jan 11 2024
    Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/3.renderer/05_twigCustomFunctions.md b/docs/tech/03_renderer/05_twigCustomFunctions.md similarity index 87% rename from docs/tech/3.renderer/05_twigCustomFunctions.md rename to docs/tech/03_renderer/05_twigCustomFunctions.md index 66dd903e..9ab207e0 100644 --- a/docs/tech/3.renderer/05_twigCustomFunctions.md +++ b/docs/tech/03_renderer/05_twigCustomFunctions.md @@ -1,14 +1,14 @@ - BumbleDocGen / Technical description of the project / Renderer / Template functions
    + BumbleDocGen / Technical description of the project / Renderer / Template functions

    Template functions

    When generating pages, you can use functions that allow you to modify the content. -Functions available during page generation are defined in the configuration ( `twig_functions` parameter ) +Functions available during page generation are defined in the configuration ( `twig_functions` parameter ) We use the twig template engine, you can get more information about working with functions here: https://twig.symfony.com/doc/1.x/advanced.html#functions You can also create your own functions and use them for any purpose, such as loading some additional information into a template, filtering data, or formatting the output of any information. -Each function must implement the CustomFunctionInterface interface, implement the `__invoke` magic method, and be added to the configuration. +Each function must implement the CustomFunctionInterface interface, implement the `__invoke` magic method, and be added to the configuration.

    How to use a function in a template

    @@ -26,7 +26,7 @@ twig_functions: ``` It is important to remember that when a template is inherited, custom functions are not overridden and augmented. -This information is detailed on page Configuration files. +This information is detailed on page Configuration.

    Defautl template functions

    @@ -53,7 +53,7 @@ Here is a list of functions available by default: - drawDocumentationMenu
    + drawDocumentationMenu
    Generate documentation menu in HTML format. To generate the menu, the start page is taken, and all links with this page are recursively collected for it, after which the html menu is created.
    :warning: This function initiates the creation of documents for the displayed entities
    @@ -81,14 +81,14 @@ Here is a list of functions available by default: - drawDocumentedEntityLink
    + drawDocumentedEntityLink
    Creates an entity link by object
    :warning: This function initiates the creation of documents for the displayed entities
    $entity - RootEntityInterface + RootEntityInterface The entity for which we want to get the link @@ -121,7 +121,7 @@ Here is a list of functions available by default: - fileGetContents
    + fileGetContents
    Displaying the content of a file or web resource @@ -137,7 +137,7 @@ Here is a list of functions available by default: - generatePageBreadcrumbs
    + generatePageBreadcrumbs
    Function to generate breadcrumbs on the page @@ -177,7 +177,7 @@ Here is a list of functions available by default: - getDocumentationPageUrl
    + getDocumentationPageUrl
    Creates an entity link by object @@ -193,14 +193,14 @@ Here is a list of functions available by default: - getDocumentedEntityUrl
    + getDocumentedEntityUrl
    Get the URL of a documented entity by its name. If the entity is found, next to the file where this method was called, the `EntityDocRendererInterface::getDocFileExtension()` directory will be created, in which the documented entity file will be created
    :warning: This function initiates the creation of documents for the displayed entities
    $rootEntityCollection - RootEntityCollection + RootEntityCollection Processed entity collection @@ -245,7 +245,7 @@ Here is a list of functions available by default: - loadPluginsContent
    + loadPluginsContent
    :warning: For internal use
    Process entity template blocks with plugins. The method returns the content processed by plugins. @@ -264,7 +264,7 @@ Here is a list of functions available by default: $entity - RootEntityInterface + RootEntityInterface The entity for which we process the content block @@ -285,14 +285,14 @@ Here is a list of functions available by default: - printEntityCollectionAsList
    + printEntityCollectionAsList
    Outputting entity data as HTML list
    :warning: This function initiates the creation of documents for the displayed entities
    $rootEntityCollection - RootEntityCollection + RootEntityCollection Processed entity collection @@ -337,7 +337,7 @@ Here is a list of functions available by default: - displayClassApiMethods
    + displayClassApiMethods
    Display all API methods of a class @@ -353,14 +353,14 @@ Here is a list of functions available by default: - drawClassMap
    + drawClassMap
    Generate class map in HTML format
    :warning: This function initiates the creation of documents for the displayed entities
    $entitiesCollections - PhpEntitiesCollection + PhpEntitiesCollection The collection of entities for which the class map will be generated @@ -369,7 +369,7 @@ Here is a list of functions available by default: - getClassMethodsBodyCode
    + getClassMethodsBodyCode
    Get the code of the specified class methods as a formatted string @@ -401,4 +401,4 @@ Here is a list of functions available by default:

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Dec 23 23:00:37 2023 +0300
    Page content update date: Sat Dec 23 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Wed Jan 10 23:55:33 2024 +0300
    Page content update date: Thu Jan 11 2024
    Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/1.configuration/classes/AddIndentFromLeft.md b/docs/tech/03_renderer/classes/AddIndentFromLeft.md similarity index 94% rename from docs/tech/1.configuration/classes/AddIndentFromLeft.md rename to docs/tech/03_renderer/classes/AddIndentFromLeft.md index 2e433da2..18504932 100644 --- a/docs/tech/1.configuration/classes/AddIndentFromLeft.md +++ b/docs/tech/03_renderer/classes/AddIndentFromLeft.md @@ -1,5 +1,4 @@ - - BumbleDocGen / Technical description of the project / Configuration files / AddIndentFromLeft
    + BumbleDocGen / Technical description of the project / Renderer / Template filters / AddIndentFromLeft

    AddIndentFromLeft class: @@ -149,5 +148,3 @@ public static function getOptions(): array;
    - - \ No newline at end of file diff --git a/docs/tech/classes/BreadcrumbsHelper.md b/docs/tech/03_renderer/classes/BreadcrumbsHelper.md similarity index 86% rename from docs/tech/classes/BreadcrumbsHelper.md rename to docs/tech/03_renderer/classes/BreadcrumbsHelper.md index 3b80e132..534edc34 100644 --- a/docs/tech/classes/BreadcrumbsHelper.md +++ b/docs/tech/03_renderer/classes/BreadcrumbsHelper.md @@ -1,8 +1,7 @@ - - BumbleDocGen / Technical description of the project / Class map / BreadcrumbsHelper
    + BumbleDocGen / Technical description of the project / Renderer / Documentation structure and breadcrumbs / BreadcrumbsHelper

    - BreadcrumbsHelper class: + BreadcrumbsHelper class:

    @@ -73,7 +72,7 @@ final class BreadcrumbsHelper @@ -88,7 +87,7 @@ final class BreadcrumbsHelper ```php @@ -145,7 +144,7 @@ public function __construct(\BumbleDocGen\Core\Configuration\Configuration $conf ```php @@ -168,7 +167,7 @@ public function getAllPageLinks(): array; \DI\DependencyException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -179,7 +178,7 @@ public function getAllPageLinks(): array; ```php @@ -224,7 +223,7 @@ public function getBreadcrumbs(string $filePatch, bool $fromCurrent = true): arr \DI\DependencyException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -235,7 +234,7 @@ public function getBreadcrumbs(string $filePatch, bool $fromCurrent = true): arr ```php @@ -280,7 +279,7 @@ public function getBreadcrumbsForTemplates(string $filePatch, bool $fromCurrent \DI\DependencyException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -291,7 +290,7 @@ public function getBreadcrumbsForTemplates(string $filePatch, bool $fromCurrent ```php @@ -325,7 +324,7 @@ public function getNearestIndexFile(string $templateName): string; Throws: @@ -336,7 +335,7 @@ public function getNearestIndexFile(string $templateName): string; ```php @@ -373,7 +372,7 @@ public function getPageDataByKey(string $key): null|array; \DI\DependencyException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • \DI\NotFoundException
  • @@ -387,7 +386,7 @@ public function getPageDataByKey(string $key): null|array; ```php @@ -424,7 +423,7 @@ public function getPageDocFileByKey(string $key): null|string; \DI\DependencyException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • \DI\NotFoundException
  • @@ -438,7 +437,7 @@ public function getPageDocFileByKey(string $key): null|string; ```php @@ -475,7 +474,7 @@ public function getPageLinkByKey(string $key): null|string; \DI\DependencyException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • \DI\NotFoundException
  • @@ -489,7 +488,7 @@ public function getPageLinkByKey(string $key): null|string; ```php @@ -523,7 +522,7 @@ public function getTemplateFrontMatter(string $templateName): array; Throws: @@ -534,7 +533,7 @@ public function getTemplateFrontMatter(string $templateName): array; ```php @@ -568,7 +567,7 @@ public function getTemplateLinkKey(string $templateName): null|string; Throws: @@ -579,7 +578,7 @@ public function getTemplateLinkKey(string $templateName): null|string; ```php @@ -613,7 +612,7 @@ public function getTemplateTitle(string $templateName): string; Throws: @@ -637,7 +636,7 @@ $breadcrumbsHelper->getTemplateTitle() == 'Some template title'; // is true ```php @@ -696,11 +695,9 @@ public function renderBreadcrumbs(string $currentPageTitle, string $filePatch, b \Twig\Error\LoaderError
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    - - \ No newline at end of file diff --git a/docs/tech/3.renderer/classes/Configuration.md b/docs/tech/03_renderer/classes/Configuration.md similarity index 81% rename from docs/tech/3.renderer/classes/Configuration.md rename to docs/tech/03_renderer/classes/Configuration.md index 87562f4e..111dc8b0 100644 --- a/docs/tech/3.renderer/classes/Configuration.md +++ b/docs/tech/03_renderer/classes/Configuration.md @@ -1,5 +1,4 @@ - - BumbleDocGen / Technical description of the project / Renderer / Configuration
    + BumbleDocGen / Technical description of the project / Renderer / Configuration

    Configuration class: @@ -87,6 +86,9 @@ final class Configuration
  • isCheckFileInGitBeforeCreatingDocEnabled
  • +
  • + renderWithFrontMatter +
  • useSharedCache
  • @@ -159,7 +161,7 @@ public function __construct(\BumbleDocGen\Core\Configuration\ConfigurationParame ```php @@ -182,7 +184,7 @@ public function getAdditionalConsoleCommands(): \BumbleDocGen\Console\Command\Ad \DI\NotFoundException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -210,7 +212,7 @@ public function getCacheDir(): null|string; Throws: @@ -242,7 +244,7 @@ public function getConfigurationVersion(): string; ```php @@ -280,7 +282,7 @@ public function getGitClientPath(): string; Throws: @@ -291,7 +293,7 @@ public function getGitClientPath(): string; ```php @@ -325,7 +327,7 @@ public function getIfExists(mixed $key): null|string; Throws: @@ -359,7 +361,7 @@ public function getLanguageHandlersCollection(): \BumbleDocGen\LanguageHandler\L \DI\NotFoundException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -387,7 +389,7 @@ public function getOutputDir(): string; Throws: @@ -415,7 +417,7 @@ public function getOutputDirBaseUrl(): string; Throws: @@ -446,7 +448,7 @@ public function getPageLinkProcessor(): \BumbleDocGen\Core\Renderer\PageLinkProc \DI\DependencyException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • \DI\NotFoundException
  • @@ -480,7 +482,7 @@ public function getPlugins(): \BumbleDocGen\Core\Plugin\PluginsCollection; \DI\DependencyException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • \DI\NotFoundException
  • @@ -511,7 +513,7 @@ public function getProjectRoot(): string; Throws: @@ -542,7 +544,7 @@ public function getSourceLocators(): \BumbleDocGen\Core\Parser\SourceLocator\Sou \DI\DependencyException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • \DI\NotFoundException
  • @@ -573,7 +575,7 @@ public function getTemplatesDir(): string; Throws: @@ -607,7 +609,7 @@ public function getTwigFilters(): \BumbleDocGen\Core\Renderer\Twig\Filter\Custom \DI\NotFoundException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -638,7 +640,7 @@ public function getTwigFunctions(): \BumbleDocGen\Core\Renderer\Twig\Function\Cu \DI\DependencyException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • \DI\NotFoundException
  • @@ -652,7 +654,7 @@ public function getTwigFunctions(): \BumbleDocGen\Core\Renderer\Twig\Function\Cu ```php @@ -680,7 +682,7 @@ public function getWorkingDir(): string; ```php @@ -697,7 +699,35 @@ public function isCheckFileInGitBeforeCreatingDocEnabled(): bool; Throws: + + +
    +
    + + + +```php +public function renderWithFrontMatter(): bool; +``` + + + +Parameters: not specified + +Return value: bool + + +Throws: + @@ -725,11 +755,9 @@ public function useSharedCache(): bool; Throws:

    - - \ No newline at end of file diff --git a/docs/tech/classes/CustomFunctionInterface.md b/docs/tech/03_renderer/classes/CustomFunctionInterface.md similarity index 88% rename from docs/tech/classes/CustomFunctionInterface.md rename to docs/tech/03_renderer/classes/CustomFunctionInterface.md index ed1b1e86..105d7b9d 100644 --- a/docs/tech/classes/CustomFunctionInterface.md +++ b/docs/tech/03_renderer/classes/CustomFunctionInterface.md @@ -1,5 +1,4 @@ - - BumbleDocGen / Technical description of the project / Class map / CustomFunctionInterface
    + BumbleDocGen / Technical description of the project / Renderer / Template functions / CustomFunctionInterface

    CustomFunctionInterface class: @@ -84,5 +83,3 @@ public static function getOptions(): array;
    - - \ No newline at end of file diff --git a/docs/tech/classes/DisplayClassApiMethods.md b/docs/tech/03_renderer/classes/DisplayClassApiMethods.md similarity index 92% rename from docs/tech/classes/DisplayClassApiMethods.md rename to docs/tech/03_renderer/classes/DisplayClassApiMethods.md index 9a2705d8..8a7238d7 100644 --- a/docs/tech/classes/DisplayClassApiMethods.md +++ b/docs/tech/03_renderer/classes/DisplayClassApiMethods.md @@ -1,5 +1,4 @@ - - BumbleDocGen / Technical description of the project / Class map / DisplayClassApiMethods
    + BumbleDocGen / Technical description of the project / Renderer / Template functions / DisplayClassApiMethods

    DisplayClassApiMethods class: @@ -157,7 +156,7 @@ public function __invoke(string $className): null|string; \DI\NotFoundException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -205,5 +204,3 @@ public static function getOptions(): array;
    - - \ No newline at end of file diff --git a/docs/tech/classes/DocumentedEntityWrapper_2.md b/docs/tech/03_renderer/classes/DocumentedEntityWrapper.md similarity index 98% rename from docs/tech/classes/DocumentedEntityWrapper_2.md rename to docs/tech/03_renderer/classes/DocumentedEntityWrapper.md index f5621eef..4a94b8bd 100644 --- a/docs/tech/classes/DocumentedEntityWrapper_2.md +++ b/docs/tech/03_renderer/classes/DocumentedEntityWrapper.md @@ -1,5 +1,4 @@ - - BumbleDocGen / Technical description of the project / DocumentedEntityWrapper
    + BumbleDocGen / Technical description of the project / Renderer / DocumentedEntityWrapper

    DocumentedEntityWrapper class: @@ -299,5 +298,3 @@ public function setParentDocFilePath(string $parentDocFilePath): void;
    - - \ No newline at end of file diff --git a/docs/tech/classes/DocumentedEntityWrappersCollection_2.md b/docs/tech/03_renderer/classes/DocumentedEntityWrappersCollection.md similarity index 94% rename from docs/tech/classes/DocumentedEntityWrappersCollection_2.md rename to docs/tech/03_renderer/classes/DocumentedEntityWrappersCollection.md index 54d652f1..5fea8107 100644 --- a/docs/tech/classes/DocumentedEntityWrappersCollection_2.md +++ b/docs/tech/03_renderer/classes/DocumentedEntityWrappersCollection.md @@ -1,5 +1,4 @@ - - BumbleDocGen / Technical description of the project / DocumentedEntityWrappersCollection
    + BumbleDocGen / Technical description of the project / Renderer / DocumentedEntityWrappersCollection

    DocumentedEntityWrappersCollection class: @@ -167,7 +166,7 @@ public function createAndAddDocumentedEntityWrapper(\BumbleDocGen\Core\Parser\En Throws: @@ -215,5 +214,3 @@ public function getIterator(): \Generator;
    - - \ No newline at end of file diff --git a/docs/tech/classes/DrawClassMap.md b/docs/tech/03_renderer/classes/DrawClassMap.md similarity index 93% rename from docs/tech/classes/DrawClassMap.md rename to docs/tech/03_renderer/classes/DrawClassMap.md index e8458489..52bd63fe 100644 --- a/docs/tech/classes/DrawClassMap.md +++ b/docs/tech/03_renderer/classes/DrawClassMap.md @@ -1,5 +1,4 @@ - - BumbleDocGen / Technical description of the project / Class map / DrawClassMap
    + BumbleDocGen / Technical description of the project / Renderer / Template functions / DrawClassMap

    DrawClassMap class: @@ -168,7 +167,7 @@ public function __invoke(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEnti \DI\DependencyException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -267,7 +266,7 @@ public function getDirectoryStructure(\BumbleDocGen\LanguageHandler\Php\Parser\E \DI\DependencyException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -315,5 +314,3 @@ public static function getOptions(): array;
    - - \ No newline at end of file diff --git a/docs/tech/1.configuration/classes/DrawDocumentationMenu.md b/docs/tech/03_renderer/classes/DrawDocumentationMenu.md similarity index 92% rename from docs/tech/1.configuration/classes/DrawDocumentationMenu.md rename to docs/tech/03_renderer/classes/DrawDocumentationMenu.md index 9d537a14..48dd97cd 100644 --- a/docs/tech/1.configuration/classes/DrawDocumentationMenu.md +++ b/docs/tech/03_renderer/classes/DrawDocumentationMenu.md @@ -1,5 +1,4 @@ - - BumbleDocGen / Technical description of the project / Configuration files / DrawDocumentationMenu
    + BumbleDocGen / Technical description of the project / Renderer / Template functions / DrawDocumentationMenu

    DrawDocumentationMenu class: @@ -21,7 +20,7 @@ and all links with this page are recursively collected for it, after which the h See: @@ -196,7 +195,7 @@ public function __invoke(string|null $startPageKey = null, int|null $maxDeep = n \DI\DependencyException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -244,5 +243,3 @@ public static function getOptions(): array;
    - - \ No newline at end of file diff --git a/docs/tech/1.configuration/classes/DrawDocumentedEntityLink.md b/docs/tech/03_renderer/classes/DrawDocumentedEntityLink.md similarity index 92% rename from docs/tech/1.configuration/classes/DrawDocumentedEntityLink.md rename to docs/tech/03_renderer/classes/DrawDocumentedEntityLink.md index 05e15fc4..2a73a6a7 100644 --- a/docs/tech/1.configuration/classes/DrawDocumentedEntityLink.md +++ b/docs/tech/03_renderer/classes/DrawDocumentedEntityLink.md @@ -1,5 +1,4 @@ - - BumbleDocGen / Technical description of the project / Configuration files / DrawDocumentedEntityLink
    + BumbleDocGen / Technical description of the project / Renderer / Template functions / DrawDocumentedEntityLink

    DrawDocumentedEntityLink class: @@ -172,7 +171,7 @@ public function __invoke(\BumbleDocGen\Core\Parser\Entity\RootEntityInterface $e \DI\DependencyException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -220,5 +219,3 @@ public static function getOptions(): array;
    - - \ No newline at end of file diff --git a/docs/tech/1.configuration/classes/FileGetContents.md b/docs/tech/03_renderer/classes/FileGetContents.md similarity index 95% rename from docs/tech/1.configuration/classes/FileGetContents.md rename to docs/tech/03_renderer/classes/FileGetContents.md index d94ec513..1758b51e 100644 --- a/docs/tech/1.configuration/classes/FileGetContents.md +++ b/docs/tech/03_renderer/classes/FileGetContents.md @@ -1,5 +1,4 @@ - - BumbleDocGen / Technical description of the project / Configuration files / FileGetContents
    + BumbleDocGen / Technical description of the project / Renderer / Template functions / FileGetContents

    FileGetContents class: @@ -199,5 +198,3 @@ public static function getOptions(): array;
    - - \ No newline at end of file diff --git a/docs/tech/1.configuration/classes/FixStrSize.md b/docs/tech/03_renderer/classes/FixStrSize.md similarity index 94% rename from docs/tech/1.configuration/classes/FixStrSize.md rename to docs/tech/03_renderer/classes/FixStrSize.md index 1e1c5851..029a7bd7 100644 --- a/docs/tech/1.configuration/classes/FixStrSize.md +++ b/docs/tech/03_renderer/classes/FixStrSize.md @@ -1,5 +1,4 @@ - - BumbleDocGen / Technical description of the project / Configuration files / FixStrSize
    + BumbleDocGen / Technical description of the project / Renderer / Template filters / FixStrSize

    FixStrSize class: @@ -149,5 +148,3 @@ public static function getOptions(): array;
    - - \ No newline at end of file diff --git a/docs/tech/1.configuration/classes/GeneratePageBreadcrumbs.md b/docs/tech/03_renderer/classes/GeneratePageBreadcrumbs.md similarity index 93% rename from docs/tech/1.configuration/classes/GeneratePageBreadcrumbs.md rename to docs/tech/03_renderer/classes/GeneratePageBreadcrumbs.md index e0b13380..0109274b 100644 --- a/docs/tech/1.configuration/classes/GeneratePageBreadcrumbs.md +++ b/docs/tech/03_renderer/classes/GeneratePageBreadcrumbs.md @@ -1,5 +1,4 @@ - - BumbleDocGen / Technical description of the project / Configuration files / GeneratePageBreadcrumbs
    + BumbleDocGen / Technical description of the project / Renderer / Template functions / GeneratePageBreadcrumbs

    GeneratePageBreadcrumbs class: @@ -175,7 +174,7 @@ public function __invoke(string $currentPageTitle, string $templatePath, bool $s \DI\NotFoundException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -223,5 +222,3 @@ public static function getOptions(): array;
    - - \ No newline at end of file diff --git a/docs/tech/3.renderer/classes/GeneratePageBreadcrumbs_2.md b/docs/tech/03_renderer/classes/GeneratePageBreadcrumbs_2.md similarity index 93% rename from docs/tech/3.renderer/classes/GeneratePageBreadcrumbs_2.md rename to docs/tech/03_renderer/classes/GeneratePageBreadcrumbs_2.md index cbfa1200..39ccc052 100644 --- a/docs/tech/3.renderer/classes/GeneratePageBreadcrumbs_2.md +++ b/docs/tech/03_renderer/classes/GeneratePageBreadcrumbs_2.md @@ -1,5 +1,4 @@ - - BumbleDocGen / Technical description of the project / Renderer / Documentation structure and breadcrumbs / GeneratePageBreadcrumbs
    + BumbleDocGen / Technical description of the project / Renderer / Documentation structure and breadcrumbs / GeneratePageBreadcrumbs

    GeneratePageBreadcrumbs class: @@ -175,7 +174,7 @@ public function __invoke(string $currentPageTitle, string $templatePath, bool $s \DI\NotFoundException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -223,5 +222,3 @@ public static function getOptions(): array;
    - - \ No newline at end of file diff --git a/docs/tech/classes/GetClassMethodsBodyCode.md b/docs/tech/03_renderer/classes/GetClassMethodsBodyCode.md similarity index 92% rename from docs/tech/classes/GetClassMethodsBodyCode.md rename to docs/tech/03_renderer/classes/GetClassMethodsBodyCode.md index 27178fd6..0ae3a972 100644 --- a/docs/tech/classes/GetClassMethodsBodyCode.md +++ b/docs/tech/03_renderer/classes/GetClassMethodsBodyCode.md @@ -1,5 +1,4 @@ - - BumbleDocGen / Technical description of the project / Class map / GetClassMethodsBodyCode
    + BumbleDocGen / Technical description of the project / Renderer / Template functions / GetClassMethodsBodyCode

    GetClassMethodsBodyCode class: @@ -157,7 +156,7 @@ public function __invoke(string $className, array $methodsNames): null|string; \DI\NotFoundException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -205,5 +204,3 @@ public static function getOptions(): array;
    - - \ No newline at end of file diff --git a/docs/tech/1.configuration/classes/GetDocumentationPageUrl.md b/docs/tech/03_renderer/classes/GetDocumentationPageUrl.md similarity index 92% rename from docs/tech/1.configuration/classes/GetDocumentationPageUrl.md rename to docs/tech/03_renderer/classes/GetDocumentationPageUrl.md index 79c2c4cb..af605e97 100644 --- a/docs/tech/1.configuration/classes/GetDocumentationPageUrl.md +++ b/docs/tech/03_renderer/classes/GetDocumentationPageUrl.md @@ -1,5 +1,4 @@ - - BumbleDocGen / Technical description of the project / Configuration files / GetDocumentationPageUrl
    + BumbleDocGen / Technical description of the project / Renderer / Template functions / GetDocumentationPageUrl

    GetDocumentationPageUrl class: @@ -177,7 +176,7 @@ public function __invoke(string $key): string; \DI\DependencyException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • \DI\NotFoundException
  • @@ -228,5 +227,3 @@ public static function getOptions(): array;
    - - \ No newline at end of file diff --git a/docs/tech/1.configuration/classes/GetDocumentedEntityUrl.md b/docs/tech/03_renderer/classes/GetDocumentedEntityUrl.md similarity index 89% rename from docs/tech/1.configuration/classes/GetDocumentedEntityUrl.md rename to docs/tech/03_renderer/classes/GetDocumentedEntityUrl.md index 7dc519c2..5fd48c82 100644 --- a/docs/tech/1.configuration/classes/GetDocumentedEntityUrl.md +++ b/docs/tech/03_renderer/classes/GetDocumentedEntityUrl.md @@ -1,5 +1,4 @@ - - BumbleDocGen / Technical description of the project / Configuration files / GetDocumentedEntityUrl
    + BumbleDocGen / Technical description of the project / Renderer / Template functions / GetDocumentedEntityUrl

    GetDocumentedEntityUrl class: @@ -21,11 +20,11 @@ the `EntityDocRendererInterface::getDocFileExtension()` directory will be create See: @@ -211,7 +210,7 @@ public function __invoke(\BumbleDocGen\Core\Parser\Entity\RootEntityCollection $ \DI\DependencyException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • \DI\NotFoundException
  • @@ -262,5 +261,3 @@ public static function getOptions(): array;
    - - \ No newline at end of file diff --git a/docs/tech/3.renderer/classes/GetDocumentedEntityUrl_2.md b/docs/tech/03_renderer/classes/GetDocumentedEntityUrl_2.md similarity index 88% rename from docs/tech/3.renderer/classes/GetDocumentedEntityUrl_2.md rename to docs/tech/03_renderer/classes/GetDocumentedEntityUrl_2.md index 64e3cb1b..1030ccf4 100644 --- a/docs/tech/3.renderer/classes/GetDocumentedEntityUrl_2.md +++ b/docs/tech/03_renderer/classes/GetDocumentedEntityUrl_2.md @@ -1,5 +1,4 @@ - - BumbleDocGen / Technical description of the project / Renderer / Template functions / GetDocumentedEntityUrl
    + BumbleDocGen / Technical description of the project / Renderer / GetDocumentedEntityUrl

    GetDocumentedEntityUrl class: @@ -21,11 +20,11 @@ the `EntityDocRendererInterface::getDocFileExtension()` directory will be create See: @@ -211,7 +210,7 @@ public function __invoke(\BumbleDocGen\Core\Parser\Entity\RootEntityCollection $ \DI\DependencyException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • \DI\NotFoundException
  • @@ -262,5 +261,3 @@ public static function getOptions(): array;
    - - \ No newline at end of file diff --git a/docs/tech/1.configuration/classes/Implode.md b/docs/tech/03_renderer/classes/Implode.md similarity index 94% rename from docs/tech/1.configuration/classes/Implode.md rename to docs/tech/03_renderer/classes/Implode.md index 78fd4b46..66445405 100644 --- a/docs/tech/1.configuration/classes/Implode.md +++ b/docs/tech/03_renderer/classes/Implode.md @@ -1,5 +1,4 @@ - - BumbleDocGen / Technical description of the project / Configuration files / Implode
    + BumbleDocGen / Technical description of the project / Renderer / Template filters / Implode

    Implode class: @@ -150,5 +149,3 @@ public static function getOptions(): array;
    - - \ No newline at end of file diff --git a/docs/tech/2.parser/classes/InvalidConfigurationParameterException.md b/docs/tech/03_renderer/classes/InvalidConfigurationParameterException.md similarity index 74% rename from docs/tech/2.parser/classes/InvalidConfigurationParameterException.md rename to docs/tech/03_renderer/classes/InvalidConfigurationParameterException.md index 8cc190c9..79d6a3b3 100644 --- a/docs/tech/2.parser/classes/InvalidConfigurationParameterException.md +++ b/docs/tech/03_renderer/classes/InvalidConfigurationParameterException.md @@ -1,5 +1,4 @@ - - BumbleDocGen / Technical description of the project / Parser / InvalidConfigurationParameterException
    + BumbleDocGen / Technical description of the project / Renderer / InvalidConfigurationParameterException

    InvalidConfigurationParameterException class: @@ -30,5 +29,3 @@ final class InvalidConfigurationParameterException extends \Exception - - \ No newline at end of file diff --git a/docs/tech/1.configuration/classes/LoadPluginsContent.md b/docs/tech/03_renderer/classes/LoadPluginsContent.md similarity index 95% rename from docs/tech/1.configuration/classes/LoadPluginsContent.md rename to docs/tech/03_renderer/classes/LoadPluginsContent.md index cc2c1850..c2dff34a 100644 --- a/docs/tech/1.configuration/classes/LoadPluginsContent.md +++ b/docs/tech/03_renderer/classes/LoadPluginsContent.md @@ -1,5 +1,4 @@ - - BumbleDocGen / Technical description of the project / Configuration files / LoadPluginsContent
    + BumbleDocGen / Technical description of the project / Renderer / Template functions / LoadPluginsContent

    LoadPluginsContent class: @@ -197,5 +196,3 @@ public static function getOptions(): array;
    - - \ No newline at end of file diff --git a/docs/tech/2.parser/classes/PhpEntitiesCollection.md b/docs/tech/03_renderer/classes/PhpEntitiesCollection.md similarity index 95% rename from docs/tech/2.parser/classes/PhpEntitiesCollection.md rename to docs/tech/03_renderer/classes/PhpEntitiesCollection.md index 19161dc2..33feca07 100644 --- a/docs/tech/2.parser/classes/PhpEntitiesCollection.md +++ b/docs/tech/03_renderer/classes/PhpEntitiesCollection.md @@ -1,5 +1,4 @@ - - BumbleDocGen / Technical description of the project / Parser / Entities and entities collections / PhpEntitiesCollection
    + BumbleDocGen / Technical description of the project / Renderer / Template functions / PhpEntitiesCollection

    PhpEntitiesCollection class: @@ -244,7 +243,7 @@ public function add(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEnt Throws: @@ -312,7 +311,7 @@ public function filterByInterfaces(array $interfaces): \BumbleDocGen\LanguageHan Throws: @@ -395,7 +394,7 @@ public function filterByParentClassNames(array $parentClassNames): \BumbleDocGen Throws: @@ -440,7 +439,7 @@ public function filterByPaths(array $paths): \BumbleDocGen\LanguageHandler\Php\P Throws: @@ -671,7 +670,7 @@ public function getLoadedOrCreateNew(string $objectName, bool $withAddClassEntit See:
    @@ -697,7 +696,7 @@ public function getOnlyAbstractClasses(): \BumbleDocGen\LanguageHandler\Php\Pars Throws: @@ -939,7 +938,7 @@ public function internalGetLoadedOrCreateNew(string $objectName, bool $withAddCl \DI\NotFoundException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -1026,7 +1025,7 @@ public function loadEntities(\BumbleDocGen\Core\Parser\SourceLocator\SourceLocat \DI\NotFoundException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -1080,7 +1079,7 @@ public function loadEntitiesByConfiguration(\BumbleDocGen\Core\Parser\Entity\Ent \DI\DependencyException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -1179,5 +1178,3 @@ public function updateEntitiesCache(): void;
    - - \ No newline at end of file diff --git a/docs/tech/1.configuration/classes/PregMatch.md b/docs/tech/03_renderer/classes/PregMatch.md similarity index 94% rename from docs/tech/1.configuration/classes/PregMatch.md rename to docs/tech/03_renderer/classes/PregMatch.md index 0c0d6c54..0e2f971b 100644 --- a/docs/tech/1.configuration/classes/PregMatch.md +++ b/docs/tech/03_renderer/classes/PregMatch.md @@ -1,5 +1,4 @@ - - BumbleDocGen / Technical description of the project / Configuration files / PregMatch
    + BumbleDocGen / Technical description of the project / Renderer / Template filters / PregMatch

    PregMatch class: @@ -150,5 +149,3 @@ public static function getOptions(): array;
    - - \ No newline at end of file diff --git a/docs/tech/1.configuration/classes/PrepareSourceLink.md b/docs/tech/03_renderer/classes/PrepareSourceLink.md similarity index 93% rename from docs/tech/1.configuration/classes/PrepareSourceLink.md rename to docs/tech/03_renderer/classes/PrepareSourceLink.md index 63e083a7..abb9f147 100644 --- a/docs/tech/1.configuration/classes/PrepareSourceLink.md +++ b/docs/tech/03_renderer/classes/PrepareSourceLink.md @@ -1,5 +1,4 @@ - - BumbleDocGen / Technical description of the project / Configuration files / PrepareSourceLink
    + BumbleDocGen / Technical description of the project / Renderer / Template filters / PrepareSourceLink

    PrepareSourceLink class: @@ -139,5 +138,3 @@ public static function getOptions(): array;
    - - \ No newline at end of file diff --git a/docs/tech/1.configuration/classes/PrintEntityCollectionAsList.md b/docs/tech/03_renderer/classes/PrintEntityCollectionAsList.md similarity index 93% rename from docs/tech/1.configuration/classes/PrintEntityCollectionAsList.md rename to docs/tech/03_renderer/classes/PrintEntityCollectionAsList.md index a7e315ef..d05b2538 100644 --- a/docs/tech/1.configuration/classes/PrintEntityCollectionAsList.md +++ b/docs/tech/03_renderer/classes/PrintEntityCollectionAsList.md @@ -1,5 +1,4 @@ - - BumbleDocGen / Technical description of the project / Configuration files / PrintEntityCollectionAsList
    + BumbleDocGen / Technical description of the project / Renderer / Template functions / PrintEntityCollectionAsList

    PrintEntityCollectionAsList class: @@ -168,7 +167,7 @@ public function __invoke(\BumbleDocGen\Core\Parser\Entity\RootEntityCollection $ Throws: @@ -216,5 +215,3 @@ public static function getOptions(): array;
    - - \ No newline at end of file diff --git a/docs/tech/1.configuration/classes/Quotemeta.md b/docs/tech/03_renderer/classes/Quotemeta.md similarity index 93% rename from docs/tech/1.configuration/classes/Quotemeta.md rename to docs/tech/03_renderer/classes/Quotemeta.md index 1b3182e8..1f61c598 100644 --- a/docs/tech/1.configuration/classes/Quotemeta.md +++ b/docs/tech/03_renderer/classes/Quotemeta.md @@ -1,5 +1,4 @@ - - BumbleDocGen / Technical description of the project / Configuration files / Quotemeta
    + BumbleDocGen / Technical description of the project / Renderer / Template filters / Quotemeta

    Quotemeta class: @@ -145,5 +144,3 @@ public static function getOptions(): array;
    - - \ No newline at end of file diff --git a/docs/tech/1.configuration/classes/RemoveLineBrakes.md b/docs/tech/03_renderer/classes/RemoveLineBrakes.md similarity index 93% rename from docs/tech/1.configuration/classes/RemoveLineBrakes.md rename to docs/tech/03_renderer/classes/RemoveLineBrakes.md index 9dff30be..6e98af5f 100644 --- a/docs/tech/1.configuration/classes/RemoveLineBrakes.md +++ b/docs/tech/03_renderer/classes/RemoveLineBrakes.md @@ -1,5 +1,4 @@ - - BumbleDocGen / Technical description of the project / Configuration files / RemoveLineBrakes
    + BumbleDocGen / Technical description of the project / Renderer / Template filters / RemoveLineBrakes

    RemoveLineBrakes class: @@ -139,5 +138,3 @@ public static function getOptions(): array;
    - - \ No newline at end of file diff --git a/docs/tech/classes/RendererContext_2.md b/docs/tech/03_renderer/classes/RendererContext.md similarity index 98% rename from docs/tech/classes/RendererContext_2.md rename to docs/tech/03_renderer/classes/RendererContext.md index c3a4868d..90e8f0a4 100644 --- a/docs/tech/classes/RendererContext_2.md +++ b/docs/tech/03_renderer/classes/RendererContext.md @@ -1,5 +1,4 @@ - - BumbleDocGen / Technical description of the project / RendererContext
    + BumbleDocGen / Technical description of the project / Renderer / RendererContext

    RendererContext class: @@ -255,5 +254,3 @@ public function setCurrentTemplateFilePatch(string $currentTemplateFilePath): vo
    - - \ No newline at end of file diff --git a/docs/tech/2.parser/classes/RootEntityCollection.md b/docs/tech/03_renderer/classes/RootEntityCollection.md similarity index 97% rename from docs/tech/2.parser/classes/RootEntityCollection.md rename to docs/tech/03_renderer/classes/RootEntityCollection.md index c7e3c95a..2f441a5f 100644 --- a/docs/tech/2.parser/classes/RootEntityCollection.md +++ b/docs/tech/03_renderer/classes/RootEntityCollection.md @@ -1,5 +1,4 @@ - - BumbleDocGen / Technical description of the project / Parser / Entities and entities collections / RootEntityCollection
    + BumbleDocGen / Technical description of the project / Renderer / Template functions / RootEntityCollection

    RootEntityCollection class: @@ -294,7 +293,7 @@ public function getLoadedOrCreateNew(string $objectName, bool $withAddClassEntit See:
    @@ -536,5 +535,3 @@ public function updateEntitiesCache(): void;
    - - \ No newline at end of file diff --git a/docs/tech/2.parser/classes/RootEntityInterface.md b/docs/tech/03_renderer/classes/RootEntityInterface.md similarity index 97% rename from docs/tech/2.parser/classes/RootEntityInterface.md rename to docs/tech/03_renderer/classes/RootEntityInterface.md index 2a65e853..d1d84406 100644 --- a/docs/tech/2.parser/classes/RootEntityInterface.md +++ b/docs/tech/03_renderer/classes/RootEntityInterface.md @@ -1,5 +1,4 @@ - - BumbleDocGen / Technical description of the project / Parser / RootEntityInterface
    + BumbleDocGen / Technical description of the project / Renderer / Template functions / RootEntityInterface

    RootEntityInterface class: @@ -256,7 +255,7 @@ public function getRelativeFileName(): null|string; See:
    @@ -468,5 +467,3 @@ public static function normalizeClassName(string $name): string;
    - - \ No newline at end of file diff --git a/docs/tech/classes/RootEntityInterface.md b/docs/tech/03_renderer/classes/RootEntityInterface_2.md similarity index 97% rename from docs/tech/classes/RootEntityInterface.md rename to docs/tech/03_renderer/classes/RootEntityInterface_2.md index 54e972b8..2e9bf66c 100644 --- a/docs/tech/classes/RootEntityInterface.md +++ b/docs/tech/03_renderer/classes/RootEntityInterface_2.md @@ -1,5 +1,4 @@ - - BumbleDocGen / Technical description of the project / Class map / RootEntityInterface
    + BumbleDocGen / Technical description of the project / Renderer / RootEntityInterface

    RootEntityInterface class: @@ -256,7 +255,7 @@ public function getRelativeFileName(): null|string; See:
    @@ -468,5 +467,3 @@ public static function normalizeClassName(string $name): string;
    - - \ No newline at end of file diff --git a/docs/tech/1.configuration/classes/StrTypeToUrl.md b/docs/tech/03_renderer/classes/StrTypeToUrl.md similarity index 93% rename from docs/tech/1.configuration/classes/StrTypeToUrl.md rename to docs/tech/03_renderer/classes/StrTypeToUrl.md index cda69c1d..19669341 100644 --- a/docs/tech/1.configuration/classes/StrTypeToUrl.md +++ b/docs/tech/03_renderer/classes/StrTypeToUrl.md @@ -1,5 +1,4 @@ - - BumbleDocGen / Technical description of the project / Configuration files / StrTypeToUrl
    + BumbleDocGen / Technical description of the project / Renderer / Template filters / StrTypeToUrl

    StrTypeToUrl class: @@ -20,7 +19,7 @@ final class StrTypeToUrl implements \BumbleDocGen\Core\Renderer\Twig\Filter\Cust See: @@ -214,5 +213,3 @@ public static function getOptions(): array;
    - - \ No newline at end of file diff --git a/docs/tech/1.configuration/classes/TextToCodeBlock.md b/docs/tech/03_renderer/classes/TextToCodeBlock.md similarity index 93% rename from docs/tech/1.configuration/classes/TextToCodeBlock.md rename to docs/tech/03_renderer/classes/TextToCodeBlock.md index 5e39cde4..60d661ef 100644 --- a/docs/tech/1.configuration/classes/TextToCodeBlock.md +++ b/docs/tech/03_renderer/classes/TextToCodeBlock.md @@ -1,5 +1,4 @@ - - BumbleDocGen / Technical description of the project / Configuration files / TextToCodeBlock
    + BumbleDocGen / Technical description of the project / Renderer / Template filters / TextToCodeBlock

    TextToCodeBlock class: @@ -144,5 +143,3 @@ public static function getOptions(): array;
    - - \ No newline at end of file diff --git a/docs/tech/1.configuration/classes/TextToHeading.md b/docs/tech/03_renderer/classes/TextToHeading.md similarity index 93% rename from docs/tech/1.configuration/classes/TextToHeading.md rename to docs/tech/03_renderer/classes/TextToHeading.md index 3b4bd050..e0b5cf0a 100644 --- a/docs/tech/1.configuration/classes/TextToHeading.md +++ b/docs/tech/03_renderer/classes/TextToHeading.md @@ -1,5 +1,4 @@ - - BumbleDocGen / Technical description of the project / Configuration files / TextToHeading
    + BumbleDocGen / Technical description of the project / Renderer / Template filters / TextToHeading

    TextToHeading class: @@ -144,5 +143,3 @@ public static function getOptions(): array;
    - - \ No newline at end of file diff --git a/docs/tech/3.renderer/readme.md b/docs/tech/03_renderer/readme.md similarity index 78% rename from docs/tech/3.renderer/readme.md rename to docs/tech/03_renderer/readme.md index 07fbe0af..ec528792 100644 --- a/docs/tech/3.renderer/readme.md +++ b/docs/tech/03_renderer/readme.md @@ -10,7 +10,7 @@ We use twig to process templates.

    More detailed description of renderer components

    - +

    Starting the rendering process

    @@ -60,4 +60,4 @@ This process is presented in the form of a diagram below.

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Dec 23 23:00:37 2023 +0300
    Page content update date: Sat Dec 23 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Wed Jan 10 23:55:33 2024 +0300
    Page content update date: Thu Jan 11 2024
    Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/04_pluginSystem.md b/docs/tech/04_pluginSystem.md new file mode 100644 index 00000000..f0cd8ed6 --- /dev/null +++ b/docs/tech/04_pluginSystem.md @@ -0,0 +1,208 @@ + BumbleDocGen / Technical description of the project / Plugin system
    + +

    Plugin system

    + +The documentation generator includes the ability to expand the functionality using plugins that allow you to add the necessary functionality to the system without changing its core. + +The system is built on the basis of an event model, each plugin class must implement PluginInterface. + +

    Configuration example

    + +You can add your plugins to the configuration like this: + +```yaml +plugins: + - class: \SelfDocConfig\Plugin\TwigFilterClassParser\TwigFilterClassParserPlugin + - class: \SelfDocConfig\Plugin\TwigFunctionClassParser\TwigFunctionClassParserPlugin +``` + +

    Default plugins

    + +Below are the plugins that are available by default when working with the library. +Plugins for any programming languages work regardless of which language handler is configured in the configuration. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PluginPLHandles eventsDescription
    LastPageCommitterany + + Plugin for adding a block with information about the last commit and date of page update to the generated document
    PageHtmlLinkerPluginany + + Adds URLs to empty links in HTML format; + Links may contain: + 1) Short entity name + 2) Full entity name + 3) Relative link to the entity file from the root directory of the project + 4) Page title ( title ) + 5) Template key ( BreadcrumbsHelper::getTemplateLinkKey() ) + 6) Relative reference to the entity document from the root directory of the documentation
    PageLinkerPluginany + + Adds URLs to empty links in HTML format; + Links may contain: + 1) Short entity name + 2) Full entity name + 3) Relative link to the entity file from the root directory of the project + 4) Page title ( title ) + 5) Template key ( BreadcrumbsHelper::getTemplateLinkKey() ) + 6) Relative reference to the entity document from the root directory of the documentation
    PageRstLinkerPluginany + + Adds URLs to empty links in rst format; + Links may contain: + 1) Short entity name + 2) Full entity name + 3) Relative link to the entity file from the root directory of the project + 4) Page title ( title ) + 5) Template key ( BreadcrumbsHelper::getTemplateLinkKey() ) + 6) Relative reference to the entity document from the root directory of the documentation
    BasePhpStubberPluginPHP + + Adding links to type documentation and documentation of built-in PHP classes
    PhpDocumentorStubberPluginPHP + + Adding links to the documentation of PHP classes in the \phpDocumentor namespace
    PhpUnitStubberPluginPHP + + Adding links to the documentation of PHP classes in the \PHPUnit namespace
    StubberPluginPHP + + The plugin allows you to automatically provide links to github repositories for documented classes from libraries included in composer
    DauxPHP + +
    EntityDocUnifiedPlacePluginPHP + + This plugin changes the algorithm for saving entity documents. The standard system stores each file +in a directory next to the file where it was requested. This behavior changes and all documents are saved +in a separate directory structure, so they are not duplicated.
    + +

    Default events

    + + + +

    Adding a new plugin

    + +If you decide to add a new plugin, there are a few things you need to do: + +

    1) Add plugin class and implement events handling

    + +```php +namespace Demo\Plugin\DemoFakeResourceLinkPlugin; + +final class DemoFakeResourceLinkPlugin implements \BumbleDocGen\Core\Plugin\PluginInterface +{ + public static function getSubscribedEvents(): array + { + return [ + \BumbleDocGen\Core\Plugin\Event\Renderer\OnGettingResourceLink::class => 'onGettingResourceLink', + ]; + } + + public function onGettingResourceLink(OnGettingResourceLink $event): void + { + if (!$event->getResourceUrl()) { + $event->setResourceUrl("https://google.com"); + } + } +} +``` + +

    2) Add the new plugin to the configuration

    + +```yaml +plugins: + - class: \Demo\Plugin\DemoFakeResourceLinkPlugin\DemoFakeResourceLinkPlugin +``` + + +
    +
    +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Wed Jan 10 23:55:33 2024 +0300
    Page content update date: Thu Jan 11 2024
    Made with Bumble Documentation Generator
    \ No newline at end of file diff --git a/docs/tech/05_console.md b/docs/tech/05_console.md new file mode 100644 index 00000000..6edb83a7 --- /dev/null +++ b/docs/tech/05_console.md @@ -0,0 +1,67 @@ + BumbleDocGen / Technical description of the project / Console app
    + +

    Console app

    + +The documentation generator provides the ability to work through a built-in console application. +It is available via composer: +```console +vendor/bin/bumbleDocGen list +``` + +We use [Symfony Console](https://github.com/symfony/console) as the basis of the console application. + +

    Built-in console commands

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    CommandParametersDescription
    help[--format FORMAT]
    [--raw]
    [<command_name>]
    Display help for a command
    list[--raw]
    [--format FORMAT]
    [--short]
    [<namespace>]
    List commands
    generate[--as-html]
    [--project_root [PROJECT_ROOT]]
    [--templates_dir [TEMPLATES_DIR]]
    [--output_dir [OUTPUT_DIR]]
    [--cache_dir [CACHE_DIR]]
    [--use_shared_cache [USE_SHARED_CACHE]]
    Generate documentation
    serve[--as-html]
    [--dev-server-host [DEV-SERVER-HOST]]
    [--dev-server-port [DEV-SERVER-PORT]]
    [--project_root [PROJECT_ROOT]]
    [--templates_dir [TEMPLATES_DIR]]
    [--use_shared_cache [USE_SHARED_CACHE]]
    Serve documentation
    ai:generate-readme-template[--project_root [PROJECT_ROOT]]
    [--templates_dir [TEMPLATES_DIR]]
    [--cache_dir [CACHE_DIR]]
    [--ai_provider [AI_PROVIDER]]
    [--ai_api_key [AI_API_KEY]]
    [--ai_model [AI_MODEL]]
    Leverage AI to generate content for a project readme.md file.
    ai:add-doc-blocks[--project_root [PROJECT_ROOT]]
    [--templates_dir [TEMPLATES_DIR]]
    [--cache_dir [CACHE_DIR]]
    [--ai_provider [AI_PROVIDER]]
    [--ai_api_key [AI_API_KEY]]
    [--ai_model [AI_MODEL]]
    Leverage AI to insert missing doc blocks in code.
    configuration[<key>]Display list of configured plugins, programming language handlers, etc
    + +

    Adding a custom command

    + +The system allows you to add custom commands to a standard console application. +This can be done using a special configuration option additional_console_commands (see Configuration page). + +After adding a new command to the configuration, it will be available in the application. Each added command must inherit the `\Symfony\Component\Console\Command\Command` class + +
    +
    +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Thu Jan 11 13:50:48 2024 +0300
    Page content update date: Thu Jan 11 2024
    Made with Bumble Documentation Generator
    \ No newline at end of file diff --git a/docs/tech/1.configuration/classes/BasePageLinkProcessor.md b/docs/tech/1.configuration/classes/BasePageLinkProcessor.md deleted file mode 100644 index f3d6bd9e..00000000 --- a/docs/tech/1.configuration/classes/BasePageLinkProcessor.md +++ /dev/null @@ -1,125 +0,0 @@ - - BumbleDocGen / Technical description of the project / Configuration files / BasePageLinkProcessor
    - -

    - BasePageLinkProcessor class: -

    - - - - - -```php -namespace BumbleDocGen\Core\Renderer\PageLinkProcessor; - -class BasePageLinkProcessor implements \BumbleDocGen\Core\Renderer\PageLinkProcessor\PageLinkProcessorInterface -``` - - - - - - - - -

    Initialization methods:

    - -
      -
    1. - __construct -
    2. -
    - -

    Methods:

    - -
      -
    1. - getAbsoluteUrl -
    2. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public function __construct(\BumbleDocGen\Core\Configuration\Configuration $configuration); -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $configuration\BumbleDocGen\Core\Configuration\Configuration-
    - - - -
    -
    -
    - - - -```php -public function getAbsoluteUrl(string $relativeUrl): string; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $relativeUrlstring-
    - -Return value: string - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/1.configuration/classes/DocumentedEntityWrapper.md b/docs/tech/1.configuration/classes/DocumentedEntityWrapper.md deleted file mode 100644 index 674254c8..00000000 --- a/docs/tech/1.configuration/classes/DocumentedEntityWrapper.md +++ /dev/null @@ -1,303 +0,0 @@ - - BumbleDocGen / Technical description of the project / Configuration files / DocumentedEntityWrapper
    - -

    - DocumentedEntityWrapper class: -

    - - - - - -```php -namespace BumbleDocGen\Core\Renderer\Context; - -final class DocumentedEntityWrapper -``` - -
    Wrapper for the entity that was requested for documentation
    - - - - - - -

    Initialization methods:

    - -
      -
    1. - __construct -
    2. -
    - -

    Methods:

    - -
      -
    1. - getDocRender -
    2. -
    3. - getDocUrl - - Get the relative path to the document to be generated
    4. -
    5. - getDocumentTransformableEntity - - Get entity that is allowed to be documented
    6. -
    7. - getEntityName -
    8. -
    9. - getFileName - - The name of the file to be generated
    10. -
    11. - getKey - - Get document key
    12. -
    13. - getParentDocFilePath -
    14. -
    15. - setParentDocFilePath -
    16. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public function __construct(\BumbleDocGen\Core\Renderer\Context\DocumentTransformableEntityInterface $documentTransformableEntity, \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache $localObjectCache, string $parentDocFilePath); -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $documentTransformableEntity\BumbleDocGen\Core\Renderer\Context\DocumentTransformableEntityInterfaceAn entity that is allowed to be documented
    $localObjectCache\BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache-
    $parentDocFilePathstringThe file in which the documentation of the entity was requested
    - - - -
    -
    -
    - - - -```php -public function getDocRender(): \BumbleDocGen\Core\Renderer\EntityDocRenderer\EntityDocRendererInterface; -``` - - - -Parameters: not specified - -Return value: \BumbleDocGen\Core\Renderer\EntityDocRenderer\EntityDocRendererInterface - - -
    -
    -
    - - - -```php -public function getDocUrl(): string; -``` - -
    Get the relative path to the document to be generated
    - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -public function getDocumentTransformableEntity(): \BumbleDocGen\Core\Renderer\Context\DocumentTransformableEntityInterface; -``` - -
    Get entity that is allowed to be documented
    - -Parameters: not specified - -Return value: \BumbleDocGen\Core\Renderer\Context\DocumentTransformableEntityInterface - - -
    -
    -
    - - - -```php -public function getEntityName(): string; -``` - - - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -public function getFileName(): string; -``` - -
    The name of the file to be generated
    - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -public function getKey(): string; -``` - -
    Get document key
    - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -public function getParentDocFilePath(): string; -``` - - - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -public function setParentDocFilePath(string $parentDocFilePath): void; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $parentDocFilePathstring-
    - -Return value: void - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/1.configuration/classes/DocumentedEntityWrappersCollection.md b/docs/tech/1.configuration/classes/DocumentedEntityWrappersCollection.md deleted file mode 100644 index bc31dee6..00000000 --- a/docs/tech/1.configuration/classes/DocumentedEntityWrappersCollection.md +++ /dev/null @@ -1,219 +0,0 @@ - - BumbleDocGen / Technical description of the project / Configuration files / DocumentedEntityWrappersCollection
    - -

    - DocumentedEntityWrappersCollection class: -

    - - - - - -```php -namespace BumbleDocGen\Core\Renderer\Context; - -final class DocumentedEntityWrappersCollection implements \IteratorAggregate, \Countable -``` - - - - - - - - -

    Initialization methods:

    - -
      -
    1. - __construct -
    2. -
    - -

    Methods:

    - -
      -
    1. - count -
    2. -
    3. - createAndAddDocumentedEntityWrapper -
    4. -
    5. - getDocumentedEntitiesRelations -
    6. -
    7. - getIterator -
    8. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public function __construct(\BumbleDocGen\Core\Renderer\Context\RendererContext $rendererContext, \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache $localObjectCache, \BumbleDocGen\Core\Renderer\Breadcrumbs\BreadcrumbsHelper $breadcrumbsHelper, \BumbleDocGen\Core\Plugin\PluginEventDispatcher $pluginEventDispatcher); -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $rendererContext\BumbleDocGen\Core\Renderer\Context\RendererContext-
    $localObjectCache\BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache-
    $breadcrumbsHelper\BumbleDocGen\Core\Renderer\Breadcrumbs\BreadcrumbsHelper-
    $pluginEventDispatcher\BumbleDocGen\Core\Plugin\PluginEventDispatcher-
    - - - -
    -
    -
    - - - -```php -public function count(): int; -``` - - - -Parameters: not specified - -Return value: int - - -
    -
    -
    - - - -```php -public function createAndAddDocumentedEntityWrapper(\BumbleDocGen\Core\Parser\Entity\RootEntityInterface $rootEntity): \BumbleDocGen\Core\Renderer\Context\DocumentedEntityWrapper; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $rootEntity\BumbleDocGen\Core\Parser\Entity\RootEntityInterface-
    - -Return value: \BumbleDocGen\Core\Renderer\Context\DocumentedEntityWrapper - - -Throws: - - -
    -
    -
    - - - -```php -public function getDocumentedEntitiesRelations(): array; -``` - - - -Parameters: not specified - -Return value: array - - -
    -
    -
    - - - -```php -public function getIterator(): \Generator; -``` - - - -Parameters: not specified - -Return value: \Generator - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/1.configuration/classes/PageHtmlLinkerPlugin.md b/docs/tech/1.configuration/classes/PageHtmlLinkerPlugin.md deleted file mode 100644 index 3e0ca02b..00000000 --- a/docs/tech/1.configuration/classes/PageHtmlLinkerPlugin.md +++ /dev/null @@ -1,213 +0,0 @@ - - BumbleDocGen / Technical description of the project / Configuration files / PageHtmlLinkerPlugin
    - -

    - PageHtmlLinkerPlugin class: -

    - - - - - -```php -namespace BumbleDocGen\Core\Plugin\CorePlugin\PageLinker; - -final class PageHtmlLinkerPlugin extends \BumbleDocGen\Core\Plugin\CorePlugin\PageLinker\BasePageLinker implements \BumbleDocGen\Core\Plugin\PluginInterface, \Symfony\Component\EventDispatcher\EventSubscriberInterface -``` - -
    Adds URLs to empty links in HTML format; - Links may contain: - 1) Short entity name - 2) Full entity name - 3) Relative link to the entity file from the root directory of the project - 4) Page title ( title ) - 5) Template key ( BreadcrumbsHelper::getTemplateLinkKey() ) - 6) Relative reference to the entity document from the root directory of the documentation
    - - -Examples of using: - -```php -Existent page name => Existent page name - -``` - -```php -\Namespace\ClassName => Custom title - -``` - -```php -\Namespace\ClassName => \Namespace\ClassName - -``` - -```php -Non-existent page name => Non-existent page name - -``` - - - - - - -

    Initialization methods:

    - -
      -
    1. - __construct -
    2. -
    - -

    Methods:

    - -
      -
    1. - beforeCreatingDocFile -
    2. -
    3. - getSubscribedEvents -
    4. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -// Implemented in BumbleDocGen\Core\Plugin\CorePlugin\PageLinker\BasePageLinker - -public function __construct(\BumbleDocGen\Core\Renderer\Breadcrumbs\BreadcrumbsHelper $breadcrumbsHelper, \BumbleDocGen\Core\Parser\Entity\RootEntityCollectionsGroup $rootEntityCollectionsGroup, \BumbleDocGen\Core\Renderer\Twig\Function\GetDocumentedEntityUrl $getDocumentedEntityUrlFunction, \Psr\Log\LoggerInterface $logger); -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $breadcrumbsHelper\BumbleDocGen\Core\Renderer\Breadcrumbs\BreadcrumbsHelper-
    $rootEntityCollectionsGroup\BumbleDocGen\Core\Parser\Entity\RootEntityCollectionsGroup-
    $getDocumentedEntityUrlFunction\BumbleDocGen\Core\Renderer\Twig\Function\GetDocumentedEntityUrl-
    $logger\Psr\Log\LoggerInterface-
    - - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\Core\Plugin\CorePlugin\PageLinker\BasePageLinker - -public function beforeCreatingDocFile(\BumbleDocGen\Core\Plugin\Event\Renderer\BeforeCreatingDocFile $event): void; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $event\BumbleDocGen\Core\Plugin\Event\Renderer\BeforeCreatingDocFile-
    - -Return value: void - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\Core\Plugin\CorePlugin\PageLinker\BasePageLinker - -public static function getSubscribedEvents(): array; -``` - - - -Parameters: not specified - -Return value: array - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/1.configuration/classes/PageLinkerPlugin.md b/docs/tech/1.configuration/classes/PageLinkerPlugin.md deleted file mode 100644 index ee8b126c..00000000 --- a/docs/tech/1.configuration/classes/PageLinkerPlugin.md +++ /dev/null @@ -1,213 +0,0 @@ - - BumbleDocGen / Technical description of the project / Configuration files / PageLinkerPlugin
    - -

    - PageLinkerPlugin class: -

    - - - - - -```php -namespace BumbleDocGen\Core\Plugin\CorePlugin\PageLinker; - -final class PageLinkerPlugin extends \BumbleDocGen\Core\Plugin\CorePlugin\PageLinker\BasePageLinker implements \BumbleDocGen\Core\Plugin\PluginInterface, \Symfony\Component\EventDispatcher\EventSubscriberInterface -``` - -
    Adds URLs to empty links in HTML format; - Links may contain: - 1) Short entity name - 2) Full entity name - 3) Relative link to the entity file from the root directory of the project - 4) Page title ( title ) - 5) Template key ( BreadcrumbsHelper::getTemplateLinkKey() ) - 6) Relative reference to the entity document from the root directory of the documentation
    - - -Examples of using: - -```php -[a]Existent page name[/a] => Existent page name - -``` - -```php -[a x-title="Custom title"]\Namespace\ClassName[/a] => Custom title - -``` - -```php -[a]\Namespace\ClassName[/a] => \Namespace\ClassName - -``` - -```php -[a]Non-existent page name[/a] => Non-existent page name - -``` - - - - - - -

    Initialization methods:

    - -
      -
    1. - __construct -
    2. -
    - -

    Methods:

    - -
      -
    1. - beforeCreatingDocFile -
    2. -
    3. - getSubscribedEvents -
    4. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -// Implemented in BumbleDocGen\Core\Plugin\CorePlugin\PageLinker\BasePageLinker - -public function __construct(\BumbleDocGen\Core\Renderer\Breadcrumbs\BreadcrumbsHelper $breadcrumbsHelper, \BumbleDocGen\Core\Parser\Entity\RootEntityCollectionsGroup $rootEntityCollectionsGroup, \BumbleDocGen\Core\Renderer\Twig\Function\GetDocumentedEntityUrl $getDocumentedEntityUrlFunction, \Psr\Log\LoggerInterface $logger); -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $breadcrumbsHelper\BumbleDocGen\Core\Renderer\Breadcrumbs\BreadcrumbsHelper-
    $rootEntityCollectionsGroup\BumbleDocGen\Core\Parser\Entity\RootEntityCollectionsGroup-
    $getDocumentedEntityUrlFunction\BumbleDocGen\Core\Renderer\Twig\Function\GetDocumentedEntityUrl-
    $logger\Psr\Log\LoggerInterface-
    - - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\Core\Plugin\CorePlugin\PageLinker\BasePageLinker - -public function beforeCreatingDocFile(\BumbleDocGen\Core\Plugin\Event\Renderer\BeforeCreatingDocFile $event): void; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $event\BumbleDocGen\Core\Plugin\Event\Renderer\BeforeCreatingDocFile-
    - -Return value: void - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\Core\Plugin\CorePlugin\PageLinker\BasePageLinker - -public static function getSubscribedEvents(): array; -``` - - - -Parameters: not specified - -Return value: array - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/2.parser/classes/ClassConstantEntitiesCollection.md b/docs/tech/2.parser/classes/ClassConstantEntitiesCollection.md deleted file mode 100644 index 280eb25d..00000000 --- a/docs/tech/2.parser/classes/ClassConstantEntitiesCollection.md +++ /dev/null @@ -1,410 +0,0 @@ - - BumbleDocGen / Technical description of the project / Parser / Entities and entities collections / ClassConstantEntitiesCollection
    - -

    - ClassConstantEntitiesCollection class: -

    - - - - - -```php -namespace BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant; - -final class ClassConstantEntitiesCollection extends \BumbleDocGen\Core\Parser\Entity\BaseEntityCollection implements \IteratorAggregate -``` - - - - - - - - -

    Initialization methods:

    - -
      -
    1. - __construct -
    2. -
    - -

    Methods:

    - -
      -
    1. - add -
    2. -
    3. - get -
    4. -
    5. - getIterator -
    6. -
    7. - has - - Check if an entity has been added to the collection
    8. -
    9. - isEmpty - - Check if the collection is empty or not
    10. -
    11. - loadConstantEntities -
    12. -
    13. - remove - - Remove an entity from a collection
    14. -
    15. - unsafeGet -
    16. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public function __construct(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity $classEntity, \BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings $phpHandlerSettings, \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Cache\CacheablePhpEntityFactory $cacheablePhpEntityFactory); -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $classEntity\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity-
    $phpHandlerSettings\BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings-
    $cacheablePhpEntityFactory\BumbleDocGen\LanguageHandler\Php\Parser\Entity\Cache\CacheablePhpEntityFactory-
    - - - -
    -
    -
    - - - -```php -public function add(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity $constantEntity, bool $reload = false): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntitiesCollection; -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $constantEntity\BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity-
    $reloadbool-
    - -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntitiesCollection - - -
    -
    -
    - - - -```php -public function get(string $objectName): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $objectNamestring-
    - -Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\Core\Parser\Entity\BaseEntityCollection - -public function getIterator(): \Generator; -``` - - - -Parameters: not specified - -Return value: \Generator - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\Core\Parser\Entity\BaseEntityCollection - -public function has(string $objectName): bool; -``` - -
    Check if an entity has been added to the collection
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $objectNamestring-
    - -Return value: bool - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\Core\Parser\Entity\BaseEntityCollection - -public function isEmpty(): bool; -``` - -
    Check if the collection is empty or not
    - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - -
      -
    • # - loadConstantEntities - :warning: Is internal | source code
    • -
    - -```php -public function loadConstantEntities(): void; -``` - - - -Parameters: not specified - -Return value: void - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\Core\Parser\Entity\BaseEntityCollection - -public function remove(string $objectName): void; -``` - -
    Remove an entity from a collection
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $objectNamestring-
    - -Return value: void - - -
    -
    -
    - - - -```php -public function unsafeGet(string $constantName): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $constantNamestring-
    - -Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity - - -Throws: - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/2.parser/classes/ConditionGroup.md b/docs/tech/2.parser/classes/ConditionGroup.md deleted file mode 100644 index ad12e4d8..00000000 --- a/docs/tech/2.parser/classes/ConditionGroup.md +++ /dev/null @@ -1,131 +0,0 @@ - - BumbleDocGen / Technical description of the project / Parser / Entity filter conditions / ConditionGroup
    - -

    - ConditionGroup class: -

    - - - - - -```php -namespace BumbleDocGen\Core\Parser\FilterCondition; - -final class ConditionGroup implements \BumbleDocGen\Core\Parser\FilterCondition\ConditionInterface -``` - -
    Filter condition to group other filter conditions. A group can have an OR/AND condition test; -In the case of OR, it is enough to successfully check at least one condition, in the case of AND, all checks must be successfully completed.
    - - - - - - -

    Initialization methods:

    - -
      -
    1. - __construct -
    2. -
    - -

    Methods:

    - -
      -
    1. - canAddToCollection -
    2. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public function __construct(string $groupType, \BumbleDocGen\Core\Parser\FilterCondition\ConditionInterface ...$conditions); -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $groupTypestring-
    $conditions (variadic)\BumbleDocGen\Core\Parser\FilterCondition\ConditionInterface-
    - - - -
    -
    -
    - - - -```php -public function canAddToCollection(\BumbleDocGen\Core\Parser\Entity\EntityInterface $entity): bool; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $entity\BumbleDocGen\Core\Parser\Entity\EntityInterface-
    - -Return value: bool - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/2.parser/classes/ConditionInterface.md b/docs/tech/2.parser/classes/ConditionInterface.md deleted file mode 100644 index 9e894110..00000000 --- a/docs/tech/2.parser/classes/ConditionInterface.md +++ /dev/null @@ -1,81 +0,0 @@ - - BumbleDocGen / Technical description of the project / Parser / Entity filter conditions / ConditionInterface
    - -

    - ConditionInterface class: -

    - - - - - -```php -namespace BumbleDocGen\Core\Parser\FilterCondition; - -interface ConditionInterface -``` - - - - - - - - - -

    Methods:

    - -
      -
    1. - canAddToCollection -
    2. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public function canAddToCollection(\BumbleDocGen\Core\Parser\Entity\EntityInterface $entity): bool; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $entity\BumbleDocGen\Core\Parser\Entity\EntityInterface-
    - -Return value: bool - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/2.parser/classes/DirectoriesSourceLocator.md b/docs/tech/2.parser/classes/DirectoriesSourceLocator.md deleted file mode 100644 index 2d981778..00000000 --- a/docs/tech/2.parser/classes/DirectoriesSourceLocator.md +++ /dev/null @@ -1,110 +0,0 @@ - - BumbleDocGen / Technical description of the project / Parser / Source locators / DirectoriesSourceLocator
    - -

    - DirectoriesSourceLocator class: -

    - - - - - -```php -namespace BumbleDocGen\Core\Parser\SourceLocator; - -final class DirectoriesSourceLocator extends \BumbleDocGen\Core\Parser\SourceLocator\BaseSourceLocator implements \BumbleDocGen\Core\Parser\SourceLocator\SourceLocatorInterface -``` - -
    Loads all files from the specified directory
    - - - - - - -

    Initialization methods:

    - -
      -
    1. - __construct -
    2. -
    - -

    Methods:

    - -
      -
    1. - getFinder -
    2. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public function __construct(array $directories); -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $directoriesarray-
    - - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\Core\Parser\SourceLocator\BaseSourceLocator - -public function getFinder(): \Symfony\Component\Finder\Finder; -``` - - - -Parameters: not specified - -Return value: \Symfony\Component\Finder\Finder - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/2.parser/classes/DynamicMethodEntity.md b/docs/tech/2.parser/classes/DynamicMethodEntity.md deleted file mode 100644 index 454baf21..00000000 --- a/docs/tech/2.parser/classes/DynamicMethodEntity.md +++ /dev/null @@ -1,842 +0,0 @@ - - BumbleDocGen / Technical description of the project / Parser / Entities and entities collections / DynamicMethodEntity
    - -

    - DynamicMethodEntity class: -

    - - - - - -```php -namespace BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method; - -class DynamicMethodEntity implements \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntityInterface, \BumbleDocGen\Core\Parser\Entity\EntityInterface -``` - -
    Method obtained by parsing the "method" annotation
    - - - - - - -

    Initialization methods:

    - -
      -
    1. - __construct -
    2. -
    - -

    Methods:

    - -
      -
    1. - getAbsoluteFileName - - Returns the absolute path to a file if it can be retrieved and if the file is in the project directory
    2. -
    3. - getBodyCode - - Get the code for this method
    4. -
    5. - getCallMethod - - Get the entity of the magic method that will be called instead of the current virtual one
    6. -
    7. - getDescription - - Get a description of this method
    8. -
    9. - getEndLine - - Get the line number of the end of a method's code in a file
    10. -
    11. - getFirstReturnValue - - Get the compiled first return value of a method (if possible)
    12. -
    13. - getImplementingClass - - Get the ClassLike entity in which this method was implemented
    14. -
    15. - getImplementingClassName - - Get the name of the class in which this method is implemented
    16. -
    17. - getModifiersString - - Get a text representation of method modifiers
    18. -
    19. - getName - - Full name of the entity
    20. -
    21. - getNamespaceName - - Namespace of the class that contains this method
    22. -
    23. - getObjectId - - Entity object ID
    24. -
    25. - getParameters - - Get a list of method parameters
    26. -
    27. - getParametersString - - Get a list of method parameters as a string
    28. -
    29. - getRelativeFileName - - File name relative to project_root configuration parameter
    30. -
    31. - getReturnType - - Get the return type of method
    32. -
    33. - getRootEntity - - Get the class like entity where this method was obtained
    34. -
    35. - getRootEntityCollection - - Get parent collection of entities
    36. -
    37. - getShortName - - Short name of the entity
    38. -
    39. - getSignature - - Get the method signature as a string
    40. -
    41. - getStartColumn - - Get the column number of the beginning of the method code in a file
    42. -
    43. - getStartLine - - Get the line number of the beginning of the method code in a file
    44. -
    45. - isDynamic - - Check if a method is a dynamic method, that is, implementable using __call or __callStatic
    46. -
    47. - isEntityCacheOutdated -
    48. -
    49. - isImplementedInParentClass - - Check if this method is implemented in the parent class
    50. -
    51. - isInitialization - - Check if a method is an initialization method
    52. -
    53. - isPrivate - - Check if a method is a private method
    54. -
    55. - isProtected - - Check if a method is a protected method
    56. -
    57. - isPublic - - Check if a method is a public method
    58. -
    59. - isStatic - - Check if this method is static
    60. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public function __construct(\BumbleDocGen\Core\Configuration\Configuration $configuration, \BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper $parserHelper, \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity $classEntity, \phpDocumentor\Reflection\DocBlock\Tags\Method $annotationMethod); -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $configuration\BumbleDocGen\Core\Configuration\Configuration-
    $parserHelper\BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper-
    $classEntity\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity-
    $annotationMethod\phpDocumentor\Reflection\DocBlock\Tags\Method-
    - - - -
    -
    -
    - - - -```php -public function getAbsoluteFileName(): null|string; -``` - -
    Returns the absolute path to a file if it can be retrieved and if the file is in the project directory
    - -Parameters: not specified - -Return value: null | string - - -
    -
    -
    - - - -```php -public function getBodyCode(): string; -``` - -
    Get the code for this method
    - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -public function getCallMethod(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntity; -``` - -
    Get the entity of the magic method that will be called instead of the current virtual one
    - -Parameters: not specified - -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntity - - -Throws: - - -
    -
    -
    - - - -```php -public function getDescription(): string; -``` - -
    Get a description of this method
    - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -public function getEndLine(): int; -``` - -
    Get the line number of the end of a method's code in a file
    - -Parameters: not specified - -Return value: int - - -
    -
    -
    - - - -```php -public function getFirstReturnValue(): mixed; -``` - -
    Get the compiled first return value of a method (if possible)
    - -Parameters: not specified - -Return value: mixed - - -
    -
    -
    - - - -```php -public function getImplementingClass(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; -``` - -
    Get the ClassLike entity in which this method was implemented
    - -Parameters: not specified - -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - - -
    -
    -
    - - - -```php -public function getImplementingClassName(): string; -``` - -
    Get the name of the class in which this method is implemented
    - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -public function getModifiersString(): string; -``` - -
    Get a text representation of method modifiers
    - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -public function getName(): string; -``` - -
    Full name of the entity
    - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -public function getNamespaceName(): string; -``` - -
    Namespace of the class that contains this method
    - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -public function getObjectId(): string; -``` - -
    Entity object ID
    - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -public function getParameters(): array; -``` - -
    Get a list of method parameters
    - -Parameters: not specified - -Return value: array - - -
    -
    -
    - - - -```php -public function getParametersString(): string; -``` - -
    Get a list of method parameters as a string
    - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -public function getRelativeFileName(): null|string; -``` - -
    File name relative to project_root configuration parameter
    - -Parameters: not specified - -Return value: null | string - - - -See: - -
    -
    -
    - - - -```php -public function getReturnType(): string; -``` - -
    Get the return type of method
    - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -public function getRootEntity(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; -``` - -
    Get the class like entity where this method was obtained
    - -Parameters: not specified - -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - - -
    -
    -
    - - - -```php -public function getRootEntityCollection(): \BumbleDocGen\Core\Parser\Entity\RootEntityCollection; -``` - -
    Get parent collection of entities
    - -Parameters: not specified - -Return value: \BumbleDocGen\Core\Parser\Entity\RootEntityCollection - - -
    -
    -
    - - - -```php -public function getShortName(): string; -``` - -
    Short name of the entity
    - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -public function getSignature(): string; -``` - -
    Get the method signature as a string
    - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -public function getStartColumn(): int; -``` - -
    Get the column number of the beginning of the method code in a file
    - -Parameters: not specified - -Return value: int - - -
    -
    -
    - - - -```php -public function getStartLine(): int; -``` - -
    Get the line number of the beginning of the method code in a file
    - -Parameters: not specified - -Return value: int - - -
    -
    -
    - - - -```php -public function isDynamic(): bool; -``` - -
    Check if a method is a dynamic method, that is, implementable using __call or __callStatic
    - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - -
      -
    • # - isEntityCacheOutdated - :warning: Is internal | source code
    • -
    - -```php -public function isEntityCacheOutdated(): bool; -``` - - - -Parameters: not specified - -Return value: bool - - -Throws: - - -
    -
    -
    - - - -```php -public function isImplementedInParentClass(): bool; -``` - -
    Check if this method is implemented in the parent class
    - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - - - -```php -public function isInitialization(): bool; -``` - -
    Check if a method is an initialization method
    - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - - - -```php -public function isPrivate(): bool; -``` - -
    Check if a method is a private method
    - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - - - -```php -public function isProtected(): bool; -``` - -
    Check if a method is a protected method
    - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - - - -```php -public function isPublic(): bool; -``` - -
    Check if a method is a public method
    - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - - - -```php -public function isStatic(): bool; -``` - -
    Check if this method is static
    - -Parameters: not specified - -Return value: bool - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/2.parser/classes/EntityInterface.md b/docs/tech/2.parser/classes/EntityInterface.md deleted file mode 100644 index 6709f42b..00000000 --- a/docs/tech/2.parser/classes/EntityInterface.md +++ /dev/null @@ -1,214 +0,0 @@ - - BumbleDocGen / Technical description of the project / Parser / Entities and entities collections / EntityInterface
    - -

    - EntityInterface class: -

    - - - - - -```php -namespace BumbleDocGen\Core\Parser\Entity; - -interface EntityInterface -``` - - - - - - - - - -

    Methods:

    - -
      -
    1. - getAbsoluteFileName - - Returns the absolute path to a file if it can be retrieved and if the file is in the project directory
    2. -
    3. - getName - - Full name of the entity
    4. -
    5. - getObjectId - - Entity object ID
    6. -
    7. - getRelativeFileName - - File name relative to project_root configuration parameter
    8. -
    9. - getRootEntityCollection - - Get parent collection of entities
    10. -
    11. - getShortName - - Short name of the entity
    12. -
    13. - isEntityCacheOutdated -
    14. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public function getAbsoluteFileName(): null|string; -``` - -
    Returns the absolute path to a file if it can be retrieved and if the file is in the project directory
    - -Parameters: not specified - -Return value: null | string - - -
    -
    -
    - - - -```php -public function getName(): string; -``` - -
    Full name of the entity
    - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -public function getObjectId(): string; -``` - -
    Entity object ID
    - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -public function getRelativeFileName(): null|string; -``` - -
    File name relative to project_root configuration parameter
    - -Parameters: not specified - -Return value: null | string - - - -See: - -
    -
    -
    - - - -```php -public function getRootEntityCollection(): \BumbleDocGen\Core\Parser\Entity\RootEntityCollection; -``` - -
    Get parent collection of entities
    - -Parameters: not specified - -Return value: \BumbleDocGen\Core\Parser\Entity\RootEntityCollection - - -
    -
    -
    - - - -```php -public function getShortName(): string; -``` - -
    Short name of the entity
    - -Parameters: not specified - -Return value: string - - -
    -
    -
    - -
      -
    • # - isEntityCacheOutdated - :warning: Is internal | source code
    • -
    - -```php -public function isEntityCacheOutdated(): bool; -``` - - - -Parameters: not specified - -Return value: bool - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/2.parser/classes/EnumEntity.md b/docs/tech/2.parser/classes/EnumEntity.md deleted file mode 100644 index 3687c4e3..00000000 --- a/docs/tech/2.parser/classes/EnumEntity.md +++ /dev/null @@ -1,3562 +0,0 @@ - - BumbleDocGen / Technical description of the project / Parser / Entities and entities collections / EnumEntity
    - -

    - EnumEntity class: -

    - - - - - -```php -namespace BumbleDocGen\LanguageHandler\Php\Parser\Entity; - -class EnumEntity extends \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity implements \BumbleDocGen\Core\Renderer\Context\DocumentTransformableEntityInterface, \BumbleDocGen\Core\Parser\Entity\RootEntityInterface, \BumbleDocGen\Core\Parser\Entity\EntityInterface, \BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityInterface -``` - -
    Enumeration
    - -See: - - - - - - - -

    Initialization methods:

    - -
      -
    1. - __construct -
    2. -
    - -

    Methods:

    - -
      -
    1. - addPluginData - - Add information to aт entity object
    2. -
    3. - cursorToDocAttributeLinkFragment -
    4. -
    5. - getAbsoluteFileName - - Returns the absolute path to a file if it can be retrieved and if the file is in the project directory
    6. -
    7. - getAst - - Get AST for this entity
    8. -
    9. - getCacheKey -
    10. -
    11. - getCachedEntityDependencies -
    12. -
    13. - getCasesNames - - Get enum cases names
    14. -
    15. - getConstant - - Get the method entity by its name
    16. -
    17. - getConstantEntitiesCollection - - Get a collection of constant entities
    18. -
    19. - getConstantValue - - Get the compiled value of a constant
    20. -
    21. - getConstants - - Get all constants that are available according to the configuration as an array
    22. -
    23. - getConstantsData - - Get a list of all constants and classes where they are implemented
    24. -
    25. - getConstantsValues - - Get class constant compiled values according to filters
    26. -
    27. - getCurrentRootEntity -
    28. -
    29. - getDescription - - Get entity description
    30. -
    31. - getDescriptionLinks - - Get parsed links from description and doc blocks `see` and `link`
    32. -
    33. - getDocBlock - - Get DocBlock for current entity
    34. -
    35. - getDocComment - - Get the doc comment of an entity
    36. -
    37. - getDocCommentEntity - - Link to an entity where docBlock is implemented for this entity
    38. -
    39. - getDocCommentLine - - Get the code line number where the docBlock of the current entity begins
    40. -
    41. - getDocNote - - Get the note annotation value
    42. -
    43. - getDocRender -
    44. -
    45. - getEndLine - - Get the line number of the end of a class code in a file
    46. -
    47. - getEntityDependencies -
    48. -
    49. - getEnumCaseValue - - Get enum case value
    50. -
    51. - getEnumCases - - Get enum cases values
    52. -
    53. - getExamples - - Get parsed examples from `examples` doc block
    54. -
    55. - getFileContent -
    56. -
    57. - getFileSourceLink -
    58. -
    59. - getFirstExample - - Get first example from `examples` doc block
    60. -
    61. - getImplementingClass - - Get the class like entity in which the current entity was implemented
    62. -
    63. - getInterfaceNames - - Get a list of class interface names
    64. -
    65. - getInterfacesEntities - - Get a list of interface entities that the current class implements
    66. -
    67. - getMethod - - Get the method entity by its name
    68. -
    69. - getMethodEntitiesCollection - - Get a collection of method entities
    70. -
    71. - getMethods - - Get all methods that are available according to the configuration as an array
    72. -
    73. - getMethodsData - - Get a list of all methods and classes where they are implemented
    74. -
    75. - getModifiersString - - Get entity modifiers as a string
    76. -
    77. - getName - - Full name of the entity
    78. -
    79. - getNamespaceName - - Get the entity namespace name
    80. -
    81. - getObjectId - - Get entity unique ID
    82. -
    83. - getParentClass - - Get the entity of the parent class if it exists
    84. -
    85. - getParentClassEntities - - Get a list of parent class entities
    86. -
    87. - getParentClassName - - Get the name of the parent class entity if it exists
    88. -
    89. - getParentClassNames - - Get a list of entity names of parent classes
    90. -
    91. - getPluginData - - Get additional information added using the plugin
    92. -
    93. - getProperties - - Get all properties that are available according to the configuration as an array
    94. -
    95. - getPropertiesData - - Get a list of all properties and classes where they are implemented
    96. -
    97. - getProperty - - Get the property entity by its name
    98. -
    99. - getPropertyDefaultValue - - Get the compiled value of a property
    100. -
    101. - getPropertyEntitiesCollection - - Get a collection of property entities
    102. -
    103. - getRelativeFileName - - File name relative to project_root configuration parameter
    104. -
    105. - getRootEntityCollection - - Get the collection of root entities to which this entity belongs
    106. -
    107. - getShortName - - Short name of the entity
    108. -
    109. - getStartLine - - Get the line number of the start of a class code in a file
    110. -
    111. - getThrows - - Get parsed throws from `throws` doc block
    112. -
    113. - getThrowsDocBlockLinks -
    114. -
    115. - getTraits - - Get a list of trait entities of the current class
    116. -
    117. - getTraitsNames - - Get a list of class traits names
    118. -
    119. - hasConstant - - Check if a constant exists in a class
    120. -
    121. - hasDescriptionLinks - - Checking if an entity has links in its description
    122. -
    123. - hasExamples - - Checking if an entity has `example` docBlock
    124. -
    125. - hasMethod - - Check if a method exists in a class
    126. -
    127. - hasParentClass - - Check if a certain parent class exists in a chain of parent classes
    128. -
    129. - hasProperty - - Check if a property exists in a class
    130. -
    131. - hasThrows - - Checking if an entity has `throws` docBlock
    132. -
    133. - hasTraits - - Check if the class contains traits
    134. -
    135. - implementsInterface - - Check if a class implements an interface
    136. -
    137. - isAbstract - - Check that an entity is abstract
    138. -
    139. - isApi - - Checking if an entity has `api` docBlock
    140. -
    141. - isClass - - Check if an entity is a Class
    142. -
    143. - isClassLoad -
    144. -
    145. - isDeprecated - - Checking if an entity has `deprecated` docBlock
    146. -
    147. - isDocumentCreationAllowed -
    148. -
    149. - isEntityCacheOutdated - - Checking if the entity cache is out of date
    150. -
    151. - isEntityDataCacheOutdated -
    152. -
    153. - isEntityDataCanBeLoaded -
    154. -
    155. - isEntityFileCanBeLoad - - Checking if entity data can be retrieved
    156. -
    157. - isEntityNameValid - - Check if the name is a valid name for ClassLikeEntity
    158. -
    159. - isEnum - - Check if an entity is an Enum
    160. -
    161. - isExternalLibraryEntity - - Check if a given entity is an entity from a third party library (connected via composer)
    162. -
    163. - isInGit - - Checking if class file is in git repository
    164. -
    165. - isInstantiable - - Check that an entity is instantiable
    166. -
    167. - isInterface - - Check if an entity is an Interface
    168. -
    169. - isInternal - - Checking if an entity has `internal` docBlock
    170. -
    171. - isSubclassOf - - Whether the given class is a subclass of the specified class
    172. -
    173. - isTrait - - Check if an entity is a Trait
    174. -
    175. - normalizeClassName - - Bring the class name to the standard format used in the system
    176. -
    177. - reloadEntityDependenciesCache - - Update entity dependency cache
    178. -
    179. - removeEntityValueFromCache -
    180. -
    181. - removeNotUsedEntityDataCache -
    182. -
    183. - setCustomAst -
    184. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function __construct(\BumbleDocGen\Core\Configuration\Configuration $configuration, \BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings $phpHandlerSettings, \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection $entitiesCollection, \BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper $parserHelper, \BumbleDocGen\LanguageHandler\Php\Parser\ComposerHelper $composerHelper, \BumbleDocGen\LanguageHandler\Php\Parser\PhpParser\PhpParserHelper $phpParserHelper, \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache $localObjectCache, \Psr\Log\LoggerInterface $logger, string $className, string|null $relativeFileName); -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $configuration\BumbleDocGen\Core\Configuration\Configuration-
    $phpHandlerSettings\BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings-
    $entitiesCollection\BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection-
    $parserHelper\BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper-
    $composerHelper\BumbleDocGen\LanguageHandler\Php\Parser\ComposerHelper-
    $phpParserHelper\BumbleDocGen\LanguageHandler\Php\Parser\PhpParser\PhpParserHelper-
    $localObjectCache\BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache-
    $logger\Psr\Log\LoggerInterface-
    $classNamestring-
    $relativeFileNamestring | null-
    - - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function addPluginData(string $pluginKey, mixed $data): void; -``` - -
    Add information to aт entity object
    - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $pluginKeystring-
    $datamixed-
    - -Return value: void - - -
    -
    -
    - -
      -
    • # - cursorToDocAttributeLinkFragment - :warning: Is internal | source code
    • -
    - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function cursorToDocAttributeLinkFragment(string $cursor, bool $isForDocument = true): string; -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $cursorstring-
    $isForDocumentbool-
    - -Return value: string - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getAbsoluteFileName(): null|string; -``` - -
    Returns the absolute path to a file if it can be retrieved and if the file is in the project directory
    - -Parameters: not specified - -Return value: null | string - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getAst(): \PhpParser\Node\Stmt\Class_|\PhpParser\Node\Stmt\Interface_|\PhpParser\Node\Stmt\Trait_|\PhpParser\Node\Stmt\Enum_; -``` - -
    Get AST for this entity
    - -Parameters: not specified - -Return value: \PhpParser\Node\Stmt\Class_ | \PhpParser\Node\Stmt\Interface_ | \PhpParser\Node\Stmt\Trait_ | \PhpParser\Node\Stmt\Enum_ - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait - -public function getCacheKey(): string; -``` - - - -Parameters: not specified - -Return value: string - - -
    -
    -
    - -
      -
    • # - getCachedEntityDependencies - :warning: Is internal | source code
    • -
    - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getCachedEntityDependencies(): array; -``` - - - -Parameters: not specified - -Return value: array - - -Throws: - - -
    -
    -
    - - - -```php -public function getCasesNames(): array; -``` - -
    Get enum cases names
    - -Parameters: not specified - -Return value: array - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getConstant(string $constantName, bool $unsafe = false): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity; -``` - -
    Get the method entity by its name
    - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $constantNamestringThe name of the constant whose entity you want to get
    $unsafeboolCheck all constants, not just the constants allowed in the configuration (@see PhpHandlerSettings::getClassConstantEntityFilter())
    - -Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getConstantEntitiesCollection(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntitiesCollection; -``` - -
    Get a collection of constant entities
    - -Parameters: not specified - -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntitiesCollection - - -Throws: - - - -See: - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getConstantValue(string $constantName): string|array|int|bool|null|float; -``` - -
    Get the compiled value of a constant
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $constantNamestringThe name of the constant for which you need to get the value
    - -Return value: string | array | int | bool | null | float - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getConstants(): array; -``` - -
    Get all constants that are available according to the configuration as an array
    - -Parameters: not specified - -Return value: array - - -Throws: - - - -See: - -
    -
    -
    - -
      -
    • # - getConstantsData - :warning: Is internal | source code
    • -
    - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getConstantsData(bool $onlyFromCurrentClassAndTraits = false, int $flags = \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity::VISIBILITY_MODIFIERS_FLAG_ANY): array; -``` - -
    Get a list of all constants and classes where they are implemented
    - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $onlyFromCurrentClassAndTraitsboolGet data only for constants from the current class
    $flagsintGet data only for constants corresponding to the visibility modifiers passed in this value
    - -Return value: array - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getConstantsValues(bool $onlyFromCurrentClassAndTraits = false, int $flags = \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity::VISIBILITY_MODIFIERS_FLAG_ANY): array; -``` - -
    Get class constant compiled values according to filters
    - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $onlyFromCurrentClassAndTraitsboolGet values only for constants from the current class
    $flagsintGet values only for constants corresponding to the visibility modifiers passed in this value
    - -Return value: array - - -Throws: - - -
    -
    -
    - -
      -
    • # - getCurrentRootEntity - :warning: Is internal | source code
    • -
    - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getCurrentRootEntity(): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; -``` - - - -Parameters: not specified - -Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getDescription(): string; -``` - -
    Get entity description
    - -Parameters: not specified - -Return value: string - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getDescriptionLinks(): array; -``` - -
    Get parsed links from description and doc blocks `see` and `link`
    - -Parameters: not specified - -Return value: array - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getDocBlock(): \phpDocumentor\Reflection\DocBlock; -``` - -
    Get DocBlock for current entity
    - -Parameters: not specified - -Return value: \phpDocumentor\Reflection\DocBlock - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getDocComment(): string; -``` - -
    Get the doc comment of an entity
    - -Parameters: not specified - -Return value: string - - -Throws: - - -
    -
    -
    - -
      -
    • # - getDocCommentEntity - :warning: Is internal | source code
    • -
    - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getDocCommentEntity(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; -``` - -
    Link to an entity where docBlock is implemented for this entity
    - -Parameters: not specified - -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getDocCommentLine(): null|int; -``` - -
    Get the code line number where the docBlock of the current entity begins
    - -Parameters: not specified - -Return value: null | int - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getDocNote(): string; -``` - -
    Get the note annotation value
    - -Parameters: not specified - -Return value: string - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getDocRender(): \BumbleDocGen\Core\Renderer\EntityDocRenderer\EntityDocRendererInterface; -``` - - - -Parameters: not specified - -Return value: \BumbleDocGen\Core\Renderer\EntityDocRenderer\EntityDocRendererInterface - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getEndLine(): int; -``` - -
    Get the line number of the end of a class code in a file
    - -Parameters: not specified - -Return value: int - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getEntityDependencies(): array; -``` - - - -Parameters: not specified - -Return value: array - - -
    -
    -
    - - - -```php -public function getEnumCaseValue(string $name): mixed; -``` - -
    Get enum case value
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $namestring-
    - -Return value: mixed - - -Throws: - - -
    -
    -
    - - - -```php -public function getEnumCases(): array; -``` - -
    Get enum cases values
    - -Parameters: not specified - -Return value: array - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getExamples(): array; -``` - -
    Get parsed examples from `examples` doc block
    - -Parameters: not specified - -Return value: array - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getFileContent(): string; -``` - - - -Parameters: not specified - -Return value: string - - -Throws: - - -
    -
    -
    - -
      -
    • # - getFileSourceLink - :warning: Is internal | source code
    • -
    - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getFileSourceLink(bool $withLine = true): null|string; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $withLinebool-
    - -Return value: null | string - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getFirstExample(): string; -``` - -
    Get first example from `examples` doc block
    - -Parameters: not specified - -Return value: string - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getImplementingClass(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; -``` - -
    Get the class like entity in which the current entity was implemented
    - -Parameters: not specified - -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - - -
    -
    -
    - - - -```php -public function getInterfaceNames(): array; -``` - -
    Get a list of class interface names
    - -Parameters: not specified - -Return value: array - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getInterfacesEntities(): array; -``` - -
    Get a list of interface entities that the current class implements
    - -Parameters: not specified - -Return value: array - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getMethod(string $methodName, bool $unsafe = false): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntity; -``` - -
    Get the method entity by its name
    - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $methodNamestringThe name of the method whose entity you want to get
    $unsafeboolCheck all methods, not just the methods allowed in the configuration (@see PhpHandlerSettings::getMethodEntityFilter())
    - -Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntity - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getMethodEntitiesCollection(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntitiesCollection; -``` - -
    Get a collection of method entities
    - -Parameters: not specified - -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntitiesCollection - - -Throws: - - - -See: - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getMethods(): array; -``` - -
    Get all methods that are available according to the configuration as an array
    - -Parameters: not specified - -Return value: array - - -Throws: - - - -See: - -
    -
    -
    - -
      -
    • # - getMethodsData - :warning: Is internal | source code
    • -
    - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getMethodsData(bool $onlyFromCurrentClassAndTraits = false, int $flags = \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntity::VISIBILITY_MODIFIERS_FLAG_ANY): array; -``` - -
    Get a list of all methods and classes where they are implemented
    - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $onlyFromCurrentClassAndTraitsboolGet data only for methods from the current class
    $flagsintGet data only for methods corresponding to the visibility modifiers passed in this value
    - -Return value: array - - -Throws: - - -
    -
    -
    - - - -```php -public function getModifiersString(): string; -``` - -
    Get entity modifiers as a string
    - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getName(): string; -``` - -
    Full name of the entity
    - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getNamespaceName(): string; -``` - -
    Get the entity namespace name
    - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getObjectId(): string; -``` - -
    Get entity unique ID
    - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getParentClass(): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; -``` - -
    Get the entity of the parent class if it exists
    - -Parameters: not specified - -Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getParentClassEntities(): array; -``` - -
    Get a list of parent class entities
    - -Parameters: not specified - -Return value: array - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getParentClassName(): null|string; -``` - -
    Get the name of the parent class entity if it exists
    - -Parameters: not specified - -Return value: null | string - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getParentClassNames(): array; -``` - -
    Get a list of entity names of parent classes
    - -Parameters: not specified - -Return value: array - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getPluginData(string $pluginKey): mixed; -``` - -
    Get additional information added using the plugin
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $pluginKeystring-
    - -Return value: mixed - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getProperties(): array; -``` - -
    Get all properties that are available according to the configuration as an array
    - -Parameters: not specified - -Return value: array - - -Throws: - - - -See: - -
    -
    -
    - -
      -
    • # - getPropertiesData - :warning: Is internal | source code
    • -
    - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getPropertiesData(bool $onlyFromCurrentClassAndTraits = false, int $flags = \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntity::VISIBILITY_MODIFIERS_FLAG_ANY): array; -``` - -
    Get a list of all properties and classes where they are implemented
    - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $onlyFromCurrentClassAndTraitsboolGet data only for properties from the current class
    $flagsintGet data only for properties corresponding to the visibility modifiers passed in this value
    - -Return value: array - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getProperty(string $propertyName, bool $unsafe = false): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntity; -``` - -
    Get the property entity by its name
    - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $propertyNamestringThe name of the property whose entity you want to get
    $unsafeboolCheck all properties, not just the properties allowed in the configuration (@see PhpHandlerSettings::getPropertyEntityFilter())
    - -Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntity - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getPropertyDefaultValue(string $propertyName): string|array|int|bool|null|float; -``` - -
    Get the compiled value of a property
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $propertyNamestringThe name of the property for which you need to get the value
    - -Return value: string | array | int | bool | null | float - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getPropertyEntitiesCollection(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntitiesCollection; -``` - -
    Get a collection of property entities
    - -Parameters: not specified - -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntitiesCollection - - -Throws: - - - -See: - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getRelativeFileName(): null|string; -``` - -
    File name relative to project_root configuration parameter
    - -Parameters: not specified - -Return value: null | string - - - -See: - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getRootEntityCollection(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; -``` - -
    Get the collection of root entities to which this entity belongs
    - -Parameters: not specified - -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getShortName(): string; -``` - -
    Short name of the entity
    - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getStartLine(): int; -``` - -
    Get the line number of the start of a class code in a file
    - -Parameters: not specified - -Return value: int - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getThrows(): array; -``` - -
    Get parsed throws from `throws` doc block
    - -Parameters: not specified - -Return value: array - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getThrowsDocBlockLinks(): array; -``` - - - -Parameters: not specified - -Return value: array - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getTraits(): array; -``` - -
    Get a list of trait entities of the current class
    - -Parameters: not specified - -Return value: array - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getTraitsNames(): array; -``` - -
    Get a list of class traits names
    - -Parameters: not specified - -Return value: array - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function hasConstant(string $constantName, bool $unsafe = false): bool; -``` - -
    Check if a constant exists in a class
    - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $constantNamestringThe name of the class whose entity you want to check
    $unsafeboolCheck all constants, not just the constants allowed in the configuration (@see PhpHandlerSettings::getClassConstantEntityFilter())
    - -Return value: bool - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function hasDescriptionLinks(): bool; -``` - -
    Checking if an entity has links in its description
    - -Parameters: not specified - -Return value: bool - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function hasExamples(): bool; -``` - -
    Checking if an entity has `example` docBlock
    - -Parameters: not specified - -Return value: bool - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function hasMethod(string $methodName, bool $unsafe = false): bool; -``` - -
    Check if a method exists in a class
    - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $methodNamestringThe name of the method whose entity you want to check
    $unsafeboolCheck all methods, not just the methods allowed in the configuration (@see PhpHandlerSettings::getMethodEntityFilter())
    - -Return value: bool - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function hasParentClass(string $parentClassName): bool; -``` - -
    Check if a certain parent class exists in a chain of parent classes
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $parentClassNamestringSearched parent class
    - -Return value: bool - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function hasProperty(string $propertyName, bool $unsafe = false): bool; -``` - -
    Check if a property exists in a class
    - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $propertyNamestringThe name of the property whose entity you want to check
    $unsafeboolCheck all properties, not just the properties allowed in the configuration (@see PhpHandlerSettings::getPropertyEntityFilter())
    - -Return value: bool - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function hasThrows(): bool; -``` - -
    Checking if an entity has `throws` docBlock
    - -Parameters: not specified - -Return value: bool - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function hasTraits(): bool; -``` - -
    Check if the class contains traits
    - -Parameters: not specified - -Return value: bool - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function implementsInterface(string $interfaceName): bool; -``` - -
    Check if a class implements an interface
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $interfaceNamestringName of the required interface in the interface chain
    - -Return value: bool - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function isAbstract(): bool; -``` - -
    Check that an entity is abstract
    - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function isApi(): bool; -``` - -
    Checking if an entity has `api` docBlock
    - -Parameters: not specified - -Return value: bool - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function isClass(): bool; -``` - -
    Check if an entity is a Class
    - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function isClassLoad(): bool; -``` - - - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function isDeprecated(): bool; -``` - -
    Checking if an entity has `deprecated` docBlock
    - -Parameters: not specified - -Return value: bool - - -Throws: - - -
    -
    -
    - -
      -
    • # - isDocumentCreationAllowed - :warning: Is internal | source code
    • -
    - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function isDocumentCreationAllowed(): bool; -``` - - - -Parameters: not specified - -Return value: bool - - -Throws: - - -
    -
    -
    - -
      -
    • # - isEntityCacheOutdated - :warning: Is internal | source code
    • -
    - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function isEntityCacheOutdated(): bool; -``` - -
    Checking if the entity cache is out of date
    - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - -
      -
    • # - isEntityDataCacheOutdated - :warning: Is internal | source code
    • -
    - -```php -// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait - -public function isEntityDataCacheOutdated(): bool; -``` - - - -Parameters: not specified - -Return value: bool - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function isEntityDataCanBeLoaded(): bool; -``` - - - -Parameters: not specified - -Return value: bool - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function isEntityFileCanBeLoad(): bool; -``` - -
    Checking if entity data can be retrieved
    - -Parameters: not specified - -Return value: bool - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public static function isEntityNameValid(string $entityName): bool; -``` - -
    Check if the name is a valid name for ClassLikeEntity
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $entityNamestring-
    - -Return value: bool - - -
    -
    -
    - - - -```php -public function isEnum(): bool; -``` - -
    Check if an entity is an Enum
    - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - -
      -
    • # - isExternalLibraryEntity - :warning: Is internal | source code
    • -
    - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function isExternalLibraryEntity(): bool; -``` - -
    Check if a given entity is an entity from a third party library (connected via composer)
    - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function isInGit(): bool; -``` - -
    Checking if class file is in git repository
    - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function isInstantiable(): bool; -``` - -
    Check that an entity is instantiable
    - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function isInterface(): bool; -``` - -
    Check if an entity is an Interface
    - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function isInternal(): bool; -``` - -
    Checking if an entity has `internal` docBlock
    - -Parameters: not specified - -Return value: bool - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function isSubclassOf(string $className): bool; -``` - -
    Whether the given class is a subclass of the specified class
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $classNamestring-
    - -Return value: bool - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function isTrait(): bool; -``` - -
    Check if an entity is a Trait
    - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public static function normalizeClassName(string $name): string; -``` - -
    Bring the class name to the standard format used in the system
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $namestring-
    - -Return value: string - - -
    -
    -
    - -
      -
    • # - reloadEntityDependenciesCache - :warning: Is internal | source code
    • -
    - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function reloadEntityDependenciesCache(): array; -``` - -
    Update entity dependency cache
    - -Parameters: not specified - -Return value: array - - -
    -
    -
    - -
      -
    • # - removeEntityValueFromCache - :warning: Is internal | source code
    • -
    - -```php -// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait - -public function removeEntityValueFromCache(string $key): void; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $keystring-
    - -Return value: void - - -
    -
    -
    - -
      -
    • # - removeNotUsedEntityDataCache - :warning: Is internal | source code
    • -
    - -```php -// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait - -public function removeNotUsedEntityDataCache(): void; -``` - - - -Parameters: not specified - -Return value: void - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function setCustomAst(\PhpParser\Node\Stmt\Trait_|\PhpParser\Node\Stmt\Enum_|\PhpParser\Node\Stmt\Interface_|\PhpParser\Node\Stmt\Class_|null $customAst): void; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $customAst\PhpParser\Node\Stmt\Trait_ | \PhpParser\Node\Stmt\Enum_ | \PhpParser\Node\Stmt\Interface_ | \PhpParser\Node\Stmt\Class_ | null-
    - -Return value: void - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/2.parser/classes/FalseCondition.md b/docs/tech/2.parser/classes/FalseCondition.md deleted file mode 100644 index dfd9997f..00000000 --- a/docs/tech/2.parser/classes/FalseCondition.md +++ /dev/null @@ -1,81 +0,0 @@ - - BumbleDocGen / Technical description of the project / Parser / Entity filter conditions / FalseCondition
    - -

    - FalseCondition class: -

    - - - - - -```php -namespace BumbleDocGen\Core\Parser\FilterCondition\CommonFilterCondition; - -final class FalseCondition implements \BumbleDocGen\Core\Parser\FilterCondition\ConditionInterface -``` - -
    False conditions, any object is not available
    - - - - - - - -

    Methods:

    - -
      -
    1. - canAddToCollection -
    2. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public function canAddToCollection(\BumbleDocGen\Core\Parser\Entity\EntityInterface $entity): bool; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $entity\BumbleDocGen\Core\Parser\Entity\EntityInterface-
    - -Return value: bool - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/2.parser/classes/FileIteratorSourceLocator.md b/docs/tech/2.parser/classes/FileIteratorSourceLocator.md deleted file mode 100644 index c01f841a..00000000 --- a/docs/tech/2.parser/classes/FileIteratorSourceLocator.md +++ /dev/null @@ -1,110 +0,0 @@ - - BumbleDocGen / Technical description of the project / Parser / Source locators / FileIteratorSourceLocator
    - -

    - FileIteratorSourceLocator class: -

    - - - - - -```php -namespace BumbleDocGen\Core\Parser\SourceLocator; - -final class FileIteratorSourceLocator extends \BumbleDocGen\Core\Parser\SourceLocator\BaseSourceLocator implements \BumbleDocGen\Core\Parser\SourceLocator\SourceLocatorInterface -``` - -
    Loads all files using an iterator
    - - - - - - -

    Initialization methods:

    - -
      -
    1. - __construct -
    2. -
    - -

    Methods:

    - -
      -
    1. - getFinder -
    2. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public function __construct(\Iterator $fileInfoIterator); -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $fileInfoIterator\Iterator-
    - - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\Core\Parser\SourceLocator\BaseSourceLocator - -public function getFinder(): \Symfony\Component\Finder\Finder; -``` - - - -Parameters: not specified - -Return value: \Symfony\Component\Finder\Finder - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/2.parser/classes/FileTextContainsCondition.md b/docs/tech/2.parser/classes/FileTextContainsCondition.md deleted file mode 100644 index 63465ee0..00000000 --- a/docs/tech/2.parser/classes/FileTextContainsCondition.md +++ /dev/null @@ -1,125 +0,0 @@ - - BumbleDocGen / Technical description of the project / Parser / Entity filter conditions / FileTextContainsCondition
    - -

    - FileTextContainsCondition class: -

    - - - - - -```php -namespace BumbleDocGen\Core\Parser\FilterCondition\CommonFilterCondition; - -final class FileTextContainsCondition implements \BumbleDocGen\Core\Parser\FilterCondition\ConditionInterface -``` - -
    Checking if a file contains a substring
    - - - - - - -

    Initialization methods:

    - -
      -
    1. - __construct -
    2. -
    - -

    Methods:

    - -
      -
    1. - canAddToCollection -
    2. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public function __construct(string $substring); -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $substringstring-
    - - - -
    -
    -
    - - - -```php -public function canAddToCollection(\BumbleDocGen\Core\Parser\Entity\EntityInterface $entity): bool; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $entity\BumbleDocGen\Core\Parser\Entity\EntityInterface-
    - -Return value: bool - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/2.parser/classes/InterfaceEntity.md b/docs/tech/2.parser/classes/InterfaceEntity.md deleted file mode 100644 index 2efbcfd1..00000000 --- a/docs/tech/2.parser/classes/InterfaceEntity.md +++ /dev/null @@ -1,3441 +0,0 @@ - - BumbleDocGen / Technical description of the project / Parser / Entities and entities collections / InterfaceEntity
    - -

    - InterfaceEntity class: -

    - - - - - -```php -namespace BumbleDocGen\LanguageHandler\Php\Parser\Entity; - -class InterfaceEntity extends \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity implements \BumbleDocGen\Core\Renderer\Context\DocumentTransformableEntityInterface, \BumbleDocGen\Core\Parser\Entity\RootEntityInterface, \BumbleDocGen\Core\Parser\Entity\EntityInterface, \BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityInterface -``` - -
    Object interface
    - -See: - - - - - - - -

    Initialization methods:

    - -
      -
    1. - __construct -
    2. -
    - -

    Methods:

    - -
      -
    1. - addPluginData - - Add information to aт entity object
    2. -
    3. - cursorToDocAttributeLinkFragment -
    4. -
    5. - getAbsoluteFileName - - Returns the absolute path to a file if it can be retrieved and if the file is in the project directory
    6. -
    7. - getAst - - Get AST for this entity
    8. -
    9. - getCacheKey -
    10. -
    11. - getCachedEntityDependencies -
    12. -
    13. - getConstant - - Get the method entity by its name
    14. -
    15. - getConstantEntitiesCollection - - Get a collection of constant entities
    16. -
    17. - getConstantValue - - Get the compiled value of a constant
    18. -
    19. - getConstants - - Get all constants that are available according to the configuration as an array
    20. -
    21. - getConstantsData - - Get a list of all constants and classes where they are implemented
    22. -
    23. - getConstantsValues - - Get class constant compiled values according to filters
    24. -
    25. - getCurrentRootEntity -
    26. -
    27. - getDescription - - Get entity description
    28. -
    29. - getDescriptionLinks - - Get parsed links from description and doc blocks `see` and `link`
    30. -
    31. - getDocBlock - - Get DocBlock for current entity
    32. -
    33. - getDocComment - - Get the doc comment of an entity
    34. -
    35. - getDocCommentEntity - - Link to an entity where docBlock is implemented for this entity
    36. -
    37. - getDocCommentLine - - Get the code line number where the docBlock of the current entity begins
    38. -
    39. - getDocNote - - Get the note annotation value
    40. -
    41. - getDocRender -
    42. -
    43. - getEndLine - - Get the line number of the end of a class code in a file
    44. -
    45. - getEntityDependencies -
    46. -
    47. - getExamples - - Get parsed examples from `examples` doc block
    48. -
    49. - getFileContent -
    50. -
    51. - getFileSourceLink -
    52. -
    53. - getFirstExample - - Get first example from `examples` doc block
    54. -
    55. - getImplementingClass - - Get the class like entity in which the current entity was implemented
    56. -
    57. - getInterfaceNames - - Get a list of class interface names
    58. -
    59. - getInterfacesEntities - - Get a list of interface entities that the current class implements
    60. -
    61. - getMethod - - Get the method entity by its name
    62. -
    63. - getMethodEntitiesCollection - - Get a collection of method entities
    64. -
    65. - getMethods - - Get all methods that are available according to the configuration as an array
    66. -
    67. - getMethodsData - - Get a list of all methods and classes where they are implemented
    68. -
    69. - getModifiersString - - Get entity modifiers as a string
    70. -
    71. - getName - - Full name of the entity
    72. -
    73. - getNamespaceName - - Get the entity namespace name
    74. -
    75. - getObjectId - - Get entity unique ID
    76. -
    77. - getParentClass - - Get the entity of the parent class if it exists
    78. -
    79. - getParentClassEntities - - Get a list of parent class entities
    80. -
    81. - getParentClassName - - Get the name of the parent class entity if it exists
    82. -
    83. - getParentClassNames - - Get a list of entity names of parent classes
    84. -
    85. - getPluginData - - Get additional information added using the plugin
    86. -
    87. - getProperties - - Get all properties that are available according to the configuration as an array
    88. -
    89. - getPropertiesData - - Get a list of all properties and classes where they are implemented
    90. -
    91. - getProperty - - Get the property entity by its name
    92. -
    93. - getPropertyDefaultValue - - Get the compiled value of a property
    94. -
    95. - getPropertyEntitiesCollection - - Get a collection of property entities
    96. -
    97. - getRelativeFileName - - File name relative to project_root configuration parameter
    98. -
    99. - getRootEntityCollection - - Get the collection of root entities to which this entity belongs
    100. -
    101. - getShortName - - Short name of the entity
    102. -
    103. - getStartLine - - Get the line number of the start of a class code in a file
    104. -
    105. - getThrows - - Get parsed throws from `throws` doc block
    106. -
    107. - getThrowsDocBlockLinks -
    108. -
    109. - getTraits - - Get a list of trait entities of the current class
    110. -
    111. - getTraitsNames - - Get a list of class traits names
    112. -
    113. - hasConstant - - Check if a constant exists in a class
    114. -
    115. - hasDescriptionLinks - - Checking if an entity has links in its description
    116. -
    117. - hasExamples - - Checking if an entity has `example` docBlock
    118. -
    119. - hasMethod - - Check if a method exists in a class
    120. -
    121. - hasParentClass - - Check if a certain parent class exists in a chain of parent classes
    122. -
    123. - hasProperty - - Check if a property exists in a class
    124. -
    125. - hasThrows - - Checking if an entity has `throws` docBlock
    126. -
    127. - hasTraits - - Check if the class contains traits
    128. -
    129. - implementsInterface - - Check if a class implements an interface
    130. -
    131. - isAbstract - - Check that an entity is abstract
    132. -
    133. - isApi - - Checking if an entity has `api` docBlock
    134. -
    135. - isClass - - Check if an entity is a Class
    136. -
    137. - isClassLoad -
    138. -
    139. - isDeprecated - - Checking if an entity has `deprecated` docBlock
    140. -
    141. - isDocumentCreationAllowed -
    142. -
    143. - isEntityCacheOutdated - - Checking if the entity cache is out of date
    144. -
    145. - isEntityDataCacheOutdated -
    146. -
    147. - isEntityDataCanBeLoaded -
    148. -
    149. - isEntityFileCanBeLoad - - Checking if entity data can be retrieved
    150. -
    151. - isEntityNameValid - - Check if the name is a valid name for ClassLikeEntity
    152. -
    153. - isEnum - - Check if an entity is an Enum
    154. -
    155. - isExternalLibraryEntity - - Check if a given entity is an entity from a third party library (connected via composer)
    156. -
    157. - isInGit - - Checking if class file is in git repository
    158. -
    159. - isInstantiable - - Check that an entity is instantiable
    160. -
    161. - isInterface - - Check if an entity is an Interface
    162. -
    163. - isInternal - - Checking if an entity has `internal` docBlock
    164. -
    165. - isSubclassOf - - Whether the given class is a subclass of the specified class
    166. -
    167. - isTrait - - Check if an entity is a Trait
    168. -
    169. - normalizeClassName - - Bring the class name to the standard format used in the system
    170. -
    171. - reloadEntityDependenciesCache - - Update entity dependency cache
    172. -
    173. - removeEntityValueFromCache -
    174. -
    175. - removeNotUsedEntityDataCache -
    176. -
    177. - setCustomAst -
    178. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function __construct(\BumbleDocGen\Core\Configuration\Configuration $configuration, \BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings $phpHandlerSettings, \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection $entitiesCollection, \BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper $parserHelper, \BumbleDocGen\LanguageHandler\Php\Parser\ComposerHelper $composerHelper, \BumbleDocGen\LanguageHandler\Php\Parser\PhpParser\PhpParserHelper $phpParserHelper, \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache $localObjectCache, \Psr\Log\LoggerInterface $logger, string $className, string|null $relativeFileName); -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $configuration\BumbleDocGen\Core\Configuration\Configuration-
    $phpHandlerSettings\BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings-
    $entitiesCollection\BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection-
    $parserHelper\BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper-
    $composerHelper\BumbleDocGen\LanguageHandler\Php\Parser\ComposerHelper-
    $phpParserHelper\BumbleDocGen\LanguageHandler\Php\Parser\PhpParser\PhpParserHelper-
    $localObjectCache\BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache-
    $logger\Psr\Log\LoggerInterface-
    $classNamestring-
    $relativeFileNamestring | null-
    - - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function addPluginData(string $pluginKey, mixed $data): void; -``` - -
    Add information to aт entity object
    - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $pluginKeystring-
    $datamixed-
    - -Return value: void - - -
    -
    -
    - -
      -
    • # - cursorToDocAttributeLinkFragment - :warning: Is internal | source code
    • -
    - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function cursorToDocAttributeLinkFragment(string $cursor, bool $isForDocument = true): string; -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $cursorstring-
    $isForDocumentbool-
    - -Return value: string - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getAbsoluteFileName(): null|string; -``` - -
    Returns the absolute path to a file if it can be retrieved and if the file is in the project directory
    - -Parameters: not specified - -Return value: null | string - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getAst(): \PhpParser\Node\Stmt\Class_|\PhpParser\Node\Stmt\Interface_|\PhpParser\Node\Stmt\Trait_|\PhpParser\Node\Stmt\Enum_; -``` - -
    Get AST for this entity
    - -Parameters: not specified - -Return value: \PhpParser\Node\Stmt\Class_ | \PhpParser\Node\Stmt\Interface_ | \PhpParser\Node\Stmt\Trait_ | \PhpParser\Node\Stmt\Enum_ - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait - -public function getCacheKey(): string; -``` - - - -Parameters: not specified - -Return value: string - - -
    -
    -
    - -
      -
    • # - getCachedEntityDependencies - :warning: Is internal | source code
    • -
    - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getCachedEntityDependencies(): array; -``` - - - -Parameters: not specified - -Return value: array - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getConstant(string $constantName, bool $unsafe = false): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity; -``` - -
    Get the method entity by its name
    - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $constantNamestringThe name of the constant whose entity you want to get
    $unsafeboolCheck all constants, not just the constants allowed in the configuration (@see PhpHandlerSettings::getClassConstantEntityFilter())
    - -Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getConstantEntitiesCollection(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntitiesCollection; -``` - -
    Get a collection of constant entities
    - -Parameters: not specified - -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntitiesCollection - - -Throws: - - - -See: - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getConstantValue(string $constantName): string|array|int|bool|null|float; -``` - -
    Get the compiled value of a constant
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $constantNamestringThe name of the constant for which you need to get the value
    - -Return value: string | array | int | bool | null | float - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getConstants(): array; -``` - -
    Get all constants that are available according to the configuration as an array
    - -Parameters: not specified - -Return value: array - - -Throws: - - - -See: - -
    -
    -
    - -
      -
    • # - getConstantsData - :warning: Is internal | source code
    • -
    - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getConstantsData(bool $onlyFromCurrentClassAndTraits = false, int $flags = \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity::VISIBILITY_MODIFIERS_FLAG_ANY): array; -``` - -
    Get a list of all constants and classes where they are implemented
    - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $onlyFromCurrentClassAndTraitsboolGet data only for constants from the current class
    $flagsintGet data only for constants corresponding to the visibility modifiers passed in this value
    - -Return value: array - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getConstantsValues(bool $onlyFromCurrentClassAndTraits = false, int $flags = \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity::VISIBILITY_MODIFIERS_FLAG_ANY): array; -``` - -
    Get class constant compiled values according to filters
    - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $onlyFromCurrentClassAndTraitsboolGet values only for constants from the current class
    $flagsintGet values only for constants corresponding to the visibility modifiers passed in this value
    - -Return value: array - - -Throws: - - -
    -
    -
    - -
      -
    • # - getCurrentRootEntity - :warning: Is internal | source code
    • -
    - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getCurrentRootEntity(): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; -``` - - - -Parameters: not specified - -Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getDescription(): string; -``` - -
    Get entity description
    - -Parameters: not specified - -Return value: string - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getDescriptionLinks(): array; -``` - -
    Get parsed links from description and doc blocks `see` and `link`
    - -Parameters: not specified - -Return value: array - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getDocBlock(): \phpDocumentor\Reflection\DocBlock; -``` - -
    Get DocBlock for current entity
    - -Parameters: not specified - -Return value: \phpDocumentor\Reflection\DocBlock - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getDocComment(): string; -``` - -
    Get the doc comment of an entity
    - -Parameters: not specified - -Return value: string - - -Throws: - - -
    -
    -
    - -
      -
    • # - getDocCommentEntity - :warning: Is internal | source code
    • -
    - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getDocCommentEntity(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; -``` - -
    Link to an entity where docBlock is implemented for this entity
    - -Parameters: not specified - -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getDocCommentLine(): null|int; -``` - -
    Get the code line number where the docBlock of the current entity begins
    - -Parameters: not specified - -Return value: null | int - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getDocNote(): string; -``` - -
    Get the note annotation value
    - -Parameters: not specified - -Return value: string - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getDocRender(): \BumbleDocGen\Core\Renderer\EntityDocRenderer\EntityDocRendererInterface; -``` - - - -Parameters: not specified - -Return value: \BumbleDocGen\Core\Renderer\EntityDocRenderer\EntityDocRendererInterface - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getEndLine(): int; -``` - -
    Get the line number of the end of a class code in a file
    - -Parameters: not specified - -Return value: int - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getEntityDependencies(): array; -``` - - - -Parameters: not specified - -Return value: array - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getExamples(): array; -``` - -
    Get parsed examples from `examples` doc block
    - -Parameters: not specified - -Return value: array - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getFileContent(): string; -``` - - - -Parameters: not specified - -Return value: string - - -Throws: - - -
    -
    -
    - -
      -
    • # - getFileSourceLink - :warning: Is internal | source code
    • -
    - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getFileSourceLink(bool $withLine = true): null|string; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $withLinebool-
    - -Return value: null | string - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getFirstExample(): string; -``` - -
    Get first example from `examples` doc block
    - -Parameters: not specified - -Return value: string - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getImplementingClass(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; -``` - -
    Get the class like entity in which the current entity was implemented
    - -Parameters: not specified - -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getInterfaceNames(): array; -``` - -
    Get a list of class interface names
    - -Parameters: not specified - -Return value: array - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getInterfacesEntities(): array; -``` - -
    Get a list of interface entities that the current class implements
    - -Parameters: not specified - -Return value: array - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getMethod(string $methodName, bool $unsafe = false): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntity; -``` - -
    Get the method entity by its name
    - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $methodNamestringThe name of the method whose entity you want to get
    $unsafeboolCheck all methods, not just the methods allowed in the configuration (@see PhpHandlerSettings::getMethodEntityFilter())
    - -Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntity - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getMethodEntitiesCollection(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntitiesCollection; -``` - -
    Get a collection of method entities
    - -Parameters: not specified - -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntitiesCollection - - -Throws: - - - -See: - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getMethods(): array; -``` - -
    Get all methods that are available according to the configuration as an array
    - -Parameters: not specified - -Return value: array - - -Throws: - - - -See: - -
    -
    -
    - -
      -
    • # - getMethodsData - :warning: Is internal | source code
    • -
    - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getMethodsData(bool $onlyFromCurrentClassAndTraits = false, int $flags = \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntity::VISIBILITY_MODIFIERS_FLAG_ANY): array; -``` - -
    Get a list of all methods and classes where they are implemented
    - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $onlyFromCurrentClassAndTraitsboolGet data only for methods from the current class
    $flagsintGet data only for methods corresponding to the visibility modifiers passed in this value
    - -Return value: array - - -Throws: - - -
    -
    -
    - - - -```php -public function getModifiersString(): string; -``` - -
    Get entity modifiers as a string
    - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getName(): string; -``` - -
    Full name of the entity
    - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getNamespaceName(): string; -``` - -
    Get the entity namespace name
    - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getObjectId(): string; -``` - -
    Get entity unique ID
    - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getParentClass(): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; -``` - -
    Get the entity of the parent class if it exists
    - -Parameters: not specified - -Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getParentClassEntities(): array; -``` - -
    Get a list of parent class entities
    - -Parameters: not specified - -Return value: array - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getParentClassName(): null|string; -``` - -
    Get the name of the parent class entity if it exists
    - -Parameters: not specified - -Return value: null | string - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getParentClassNames(): array; -``` - -
    Get a list of entity names of parent classes
    - -Parameters: not specified - -Return value: array - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getPluginData(string $pluginKey): mixed; -``` - -
    Get additional information added using the plugin
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $pluginKeystring-
    - -Return value: mixed - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getProperties(): array; -``` - -
    Get all properties that are available according to the configuration as an array
    - -Parameters: not specified - -Return value: array - - -Throws: - - - -See: - -
    -
    -
    - -
      -
    • # - getPropertiesData - :warning: Is internal | source code
    • -
    - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getPropertiesData(bool $onlyFromCurrentClassAndTraits = false, int $flags = \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntity::VISIBILITY_MODIFIERS_FLAG_ANY): array; -``` - -
    Get a list of all properties and classes where they are implemented
    - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $onlyFromCurrentClassAndTraitsboolGet data only for properties from the current class
    $flagsintGet data only for properties corresponding to the visibility modifiers passed in this value
    - -Return value: array - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getProperty(string $propertyName, bool $unsafe = false): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntity; -``` - -
    Get the property entity by its name
    - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $propertyNamestringThe name of the property whose entity you want to get
    $unsafeboolCheck all properties, not just the properties allowed in the configuration (@see PhpHandlerSettings::getPropertyEntityFilter())
    - -Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntity - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getPropertyDefaultValue(string $propertyName): string|array|int|bool|null|float; -``` - -
    Get the compiled value of a property
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $propertyNamestringThe name of the property for which you need to get the value
    - -Return value: string | array | int | bool | null | float - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getPropertyEntitiesCollection(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntitiesCollection; -``` - -
    Get a collection of property entities
    - -Parameters: not specified - -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntitiesCollection - - -Throws: - - - -See: - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getRelativeFileName(): null|string; -``` - -
    File name relative to project_root configuration parameter
    - -Parameters: not specified - -Return value: null | string - - - -See: - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getRootEntityCollection(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; -``` - -
    Get the collection of root entities to which this entity belongs
    - -Parameters: not specified - -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getShortName(): string; -``` - -
    Short name of the entity
    - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getStartLine(): int; -``` - -
    Get the line number of the start of a class code in a file
    - -Parameters: not specified - -Return value: int - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getThrows(): array; -``` - -
    Get parsed throws from `throws` doc block
    - -Parameters: not specified - -Return value: array - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getThrowsDocBlockLinks(): array; -``` - - - -Parameters: not specified - -Return value: array - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getTraits(): array; -``` - -
    Get a list of trait entities of the current class
    - -Parameters: not specified - -Return value: array - - -Throws: - - -
    -
    -
    - - - -```php -public function getTraitsNames(): array; -``` - -
    Get a list of class traits names
    - -Parameters: not specified - -Return value: array - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function hasConstant(string $constantName, bool $unsafe = false): bool; -``` - -
    Check if a constant exists in a class
    - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $constantNamestringThe name of the class whose entity you want to check
    $unsafeboolCheck all constants, not just the constants allowed in the configuration (@see PhpHandlerSettings::getClassConstantEntityFilter())
    - -Return value: bool - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function hasDescriptionLinks(): bool; -``` - -
    Checking if an entity has links in its description
    - -Parameters: not specified - -Return value: bool - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function hasExamples(): bool; -``` - -
    Checking if an entity has `example` docBlock
    - -Parameters: not specified - -Return value: bool - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function hasMethod(string $methodName, bool $unsafe = false): bool; -``` - -
    Check if a method exists in a class
    - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $methodNamestringThe name of the method whose entity you want to check
    $unsafeboolCheck all methods, not just the methods allowed in the configuration (@see PhpHandlerSettings::getMethodEntityFilter())
    - -Return value: bool - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function hasParentClass(string $parentClassName): bool; -``` - -
    Check if a certain parent class exists in a chain of parent classes
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $parentClassNamestringSearched parent class
    - -Return value: bool - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function hasProperty(string $propertyName, bool $unsafe = false): bool; -``` - -
    Check if a property exists in a class
    - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $propertyNamestringThe name of the property whose entity you want to check
    $unsafeboolCheck all properties, not just the properties allowed in the configuration (@see PhpHandlerSettings::getPropertyEntityFilter())
    - -Return value: bool - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function hasThrows(): bool; -``` - -
    Checking if an entity has `throws` docBlock
    - -Parameters: not specified - -Return value: bool - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function hasTraits(): bool; -``` - -
    Check if the class contains traits
    - -Parameters: not specified - -Return value: bool - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function implementsInterface(string $interfaceName): bool; -``` - -
    Check if a class implements an interface
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $interfaceNamestringName of the required interface in the interface chain
    - -Return value: bool - - -Throws: - - -
    -
    -
    - - - -```php -public function isAbstract(): bool; -``` - -
    Check that an entity is abstract
    - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function isApi(): bool; -``` - -
    Checking if an entity has `api` docBlock
    - -Parameters: not specified - -Return value: bool - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function isClass(): bool; -``` - -
    Check if an entity is a Class
    - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function isClassLoad(): bool; -``` - - - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function isDeprecated(): bool; -``` - -
    Checking if an entity has `deprecated` docBlock
    - -Parameters: not specified - -Return value: bool - - -Throws: - - -
    -
    -
    - -
      -
    • # - isDocumentCreationAllowed - :warning: Is internal | source code
    • -
    - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function isDocumentCreationAllowed(): bool; -``` - - - -Parameters: not specified - -Return value: bool - - -Throws: - - -
    -
    -
    - -
      -
    • # - isEntityCacheOutdated - :warning: Is internal | source code
    • -
    - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function isEntityCacheOutdated(): bool; -``` - -
    Checking if the entity cache is out of date
    - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - -
      -
    • # - isEntityDataCacheOutdated - :warning: Is internal | source code
    • -
    - -```php -// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait - -public function isEntityDataCacheOutdated(): bool; -``` - - - -Parameters: not specified - -Return value: bool - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function isEntityDataCanBeLoaded(): bool; -``` - - - -Parameters: not specified - -Return value: bool - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function isEntityFileCanBeLoad(): bool; -``` - -
    Checking if entity data can be retrieved
    - -Parameters: not specified - -Return value: bool - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public static function isEntityNameValid(string $entityName): bool; -``` - -
    Check if the name is a valid name for ClassLikeEntity
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $entityNamestring-
    - -Return value: bool - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function isEnum(): bool; -``` - -
    Check if an entity is an Enum
    - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - -
      -
    • # - isExternalLibraryEntity - :warning: Is internal | source code
    • -
    - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function isExternalLibraryEntity(): bool; -``` - -
    Check if a given entity is an entity from a third party library (connected via composer)
    - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function isInGit(): bool; -``` - -
    Checking if class file is in git repository
    - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function isInstantiable(): bool; -``` - -
    Check that an entity is instantiable
    - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - - - -```php -public function isInterface(): bool; -``` - -
    Check if an entity is an Interface
    - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function isInternal(): bool; -``` - -
    Checking if an entity has `internal` docBlock
    - -Parameters: not specified - -Return value: bool - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function isSubclassOf(string $className): bool; -``` - -
    Whether the given class is a subclass of the specified class
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $classNamestring-
    - -Return value: bool - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function isTrait(): bool; -``` - -
    Check if an entity is a Trait
    - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public static function normalizeClassName(string $name): string; -``` - -
    Bring the class name to the standard format used in the system
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $namestring-
    - -Return value: string - - -
    -
    -
    - -
      -
    • # - reloadEntityDependenciesCache - :warning: Is internal | source code
    • -
    - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function reloadEntityDependenciesCache(): array; -``` - -
    Update entity dependency cache
    - -Parameters: not specified - -Return value: array - - -
    -
    -
    - -
      -
    • # - removeEntityValueFromCache - :warning: Is internal | source code
    • -
    - -```php -// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait - -public function removeEntityValueFromCache(string $key): void; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $keystring-
    - -Return value: void - - -
    -
    -
    - -
      -
    • # - removeNotUsedEntityDataCache - :warning: Is internal | source code
    • -
    - -```php -// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait - -public function removeNotUsedEntityDataCache(): void; -``` - - - -Parameters: not specified - -Return value: void - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function setCustomAst(\PhpParser\Node\Stmt\Trait_|\PhpParser\Node\Stmt\Enum_|\PhpParser\Node\Stmt\Interface_|\PhpParser\Node\Stmt\Class_|null $customAst): void; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $customAst\PhpParser\Node\Stmt\Trait_ | \PhpParser\Node\Stmt\Enum_ | \PhpParser\Node\Stmt\Interface_ | \PhpParser\Node\Stmt\Class_ | null-
    - -Return value: void - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/2.parser/classes/IsPrivateCondition.md b/docs/tech/2.parser/classes/IsPrivateCondition.md deleted file mode 100644 index ff5141f1..00000000 --- a/docs/tech/2.parser/classes/IsPrivateCondition.md +++ /dev/null @@ -1,108 +0,0 @@ - - BumbleDocGen / Technical description of the project / Parser / Entity filter conditions / IsPrivateCondition
    - -

    - IsPrivateCondition class: -

    - - - - - -```php -namespace BumbleDocGen\LanguageHandler\Php\Parser\FilterCondition\ClassConstantFilterCondition; - -final class IsPrivateCondition implements \BumbleDocGen\Core\Parser\FilterCondition\ConditionInterface -``` - -
    Check is a private constant or not
    - - - - - - -

    Initialization methods:

    - -
      -
    1. - __construct -
    2. -
    - -

    Methods:

    - -
      -
    1. - canAddToCollection -
    2. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public function __construct(); -``` - - - -Parameters: not specified - - - -
    -
    -
    - - - -```php -public function canAddToCollection(\BumbleDocGen\Core\Parser\Entity\EntityInterface $entity): bool; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $entity\BumbleDocGen\Core\Parser\Entity\EntityInterface-
    - -Return value: bool - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/2.parser/classes/IsPrivateCondition_2.md b/docs/tech/2.parser/classes/IsPrivateCondition_2.md deleted file mode 100644 index 4cc8afd7..00000000 --- a/docs/tech/2.parser/classes/IsPrivateCondition_2.md +++ /dev/null @@ -1,108 +0,0 @@ - - BumbleDocGen / Technical description of the project / Parser / Entity filter conditions / IsPrivateCondition
    - -

    - IsPrivateCondition class: -

    - - - - - -```php -namespace BumbleDocGen\LanguageHandler\Php\Parser\FilterCondition\MethodFilterCondition; - -final class IsPrivateCondition implements \BumbleDocGen\Core\Parser\FilterCondition\ConditionInterface -``` - -
    Check is a private method or not
    - - - - - - -

    Initialization methods:

    - -
      -
    1. - __construct -
    2. -
    - -

    Methods:

    - -
      -
    1. - canAddToCollection -
    2. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public function __construct(); -``` - - - -Parameters: not specified - - - -
    -
    -
    - - - -```php -public function canAddToCollection(\BumbleDocGen\Core\Parser\Entity\EntityInterface $entity): bool; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $entity\BumbleDocGen\Core\Parser\Entity\EntityInterface-
    - -Return value: bool - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/2.parser/classes/IsPrivateCondition_3.md b/docs/tech/2.parser/classes/IsPrivateCondition_3.md deleted file mode 100644 index d2439ee5..00000000 --- a/docs/tech/2.parser/classes/IsPrivateCondition_3.md +++ /dev/null @@ -1,108 +0,0 @@ - - BumbleDocGen / Technical description of the project / Parser / Entity filter conditions / IsPrivateCondition
    - -

    - IsPrivateCondition class: -

    - - - - - -```php -namespace BumbleDocGen\LanguageHandler\Php\Parser\FilterCondition\PropertyFilterCondition; - -final class IsPrivateCondition implements \BumbleDocGen\Core\Parser\FilterCondition\ConditionInterface -``` - -
    Check is a private property or not
    - - - - - - -

    Initialization methods:

    - -
      -
    1. - __construct -
    2. -
    - -

    Methods:

    - -
      -
    1. - canAddToCollection -
    2. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public function __construct(); -``` - - - -Parameters: not specified - - - -
    -
    -
    - - - -```php -public function canAddToCollection(\BumbleDocGen\Core\Parser\Entity\EntityInterface $entity): bool; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $entity\BumbleDocGen\Core\Parser\Entity\EntityInterface-
    - -Return value: bool - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/2.parser/classes/IsProtectedCondition.md b/docs/tech/2.parser/classes/IsProtectedCondition.md deleted file mode 100644 index 4c045b51..00000000 --- a/docs/tech/2.parser/classes/IsProtectedCondition.md +++ /dev/null @@ -1,108 +0,0 @@ - - BumbleDocGen / Technical description of the project / Parser / Entity filter conditions / IsProtectedCondition
    - -

    - IsProtectedCondition class: -

    - - - - - -```php -namespace BumbleDocGen\LanguageHandler\Php\Parser\FilterCondition\ClassConstantFilterCondition; - -final class IsProtectedCondition implements \BumbleDocGen\Core\Parser\FilterCondition\ConditionInterface -``` - -
    Check is a protected constant or not
    - - - - - - -

    Initialization methods:

    - -
      -
    1. - __construct -
    2. -
    - -

    Methods:

    - -
      -
    1. - canAddToCollection -
    2. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public function __construct(); -``` - - - -Parameters: not specified - - - -
    -
    -
    - - - -```php -public function canAddToCollection(\BumbleDocGen\Core\Parser\Entity\EntityInterface $entity): bool; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $entity\BumbleDocGen\Core\Parser\Entity\EntityInterface-
    - -Return value: bool - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/2.parser/classes/IsProtectedCondition_2.md b/docs/tech/2.parser/classes/IsProtectedCondition_2.md deleted file mode 100644 index a76e0135..00000000 --- a/docs/tech/2.parser/classes/IsProtectedCondition_2.md +++ /dev/null @@ -1,108 +0,0 @@ - - BumbleDocGen / Technical description of the project / Parser / Entity filter conditions / IsProtectedCondition
    - -

    - IsProtectedCondition class: -

    - - - - - -```php -namespace BumbleDocGen\LanguageHandler\Php\Parser\FilterCondition\MethodFilterCondition; - -final class IsProtectedCondition implements \BumbleDocGen\Core\Parser\FilterCondition\ConditionInterface -``` - -
    Check is a protected method or not
    - - - - - - -

    Initialization methods:

    - -
      -
    1. - __construct -
    2. -
    - -

    Methods:

    - -
      -
    1. - canAddToCollection -
    2. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public function __construct(); -``` - - - -Parameters: not specified - - - -
    -
    -
    - - - -```php -public function canAddToCollection(\BumbleDocGen\Core\Parser\Entity\EntityInterface $entity): bool; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $entity\BumbleDocGen\Core\Parser\Entity\EntityInterface-
    - -Return value: bool - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/2.parser/classes/IsProtectedCondition_3.md b/docs/tech/2.parser/classes/IsProtectedCondition_3.md deleted file mode 100644 index e2e2beb9..00000000 --- a/docs/tech/2.parser/classes/IsProtectedCondition_3.md +++ /dev/null @@ -1,108 +0,0 @@ - - BumbleDocGen / Technical description of the project / Parser / Entity filter conditions / IsProtectedCondition
    - -

    - IsProtectedCondition class: -

    - - - - - -```php -namespace BumbleDocGen\LanguageHandler\Php\Parser\FilterCondition\PropertyFilterCondition; - -final class IsProtectedCondition implements \BumbleDocGen\Core\Parser\FilterCondition\ConditionInterface -``` - -
    Check is a protected property or not
    - - - - - - -

    Initialization methods:

    - -
      -
    1. - __construct -
    2. -
    - -

    Methods:

    - -
      -
    1. - canAddToCollection -
    2. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public function __construct(); -``` - - - -Parameters: not specified - - - -
    -
    -
    - - - -```php -public function canAddToCollection(\BumbleDocGen\Core\Parser\Entity\EntityInterface $entity): bool; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $entity\BumbleDocGen\Core\Parser\Entity\EntityInterface-
    - -Return value: bool - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/2.parser/classes/IsPublicCondition.md b/docs/tech/2.parser/classes/IsPublicCondition.md deleted file mode 100644 index e2f61b40..00000000 --- a/docs/tech/2.parser/classes/IsPublicCondition.md +++ /dev/null @@ -1,108 +0,0 @@ - - BumbleDocGen / Technical description of the project / Parser / Entity filter conditions / IsPublicCondition
    - -

    - IsPublicCondition class: -

    - - - - - -```php -namespace BumbleDocGen\LanguageHandler\Php\Parser\FilterCondition\ClassConstantFilterCondition; - -final class IsPublicCondition implements \BumbleDocGen\Core\Parser\FilterCondition\ConditionInterface -``` - -
    Check is a public constant or not
    - - - - - - -

    Initialization methods:

    - -
      -
    1. - __construct -
    2. -
    - -

    Methods:

    - -
      -
    1. - canAddToCollection -
    2. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public function __construct(); -``` - - - -Parameters: not specified - - - -
    -
    -
    - - - -```php -public function canAddToCollection(\BumbleDocGen\Core\Parser\Entity\EntityInterface $entity): bool; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $entity\BumbleDocGen\Core\Parser\Entity\EntityInterface-
    - -Return value: bool - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/2.parser/classes/IsPublicCondition_2.md b/docs/tech/2.parser/classes/IsPublicCondition_2.md deleted file mode 100644 index 319c2db1..00000000 --- a/docs/tech/2.parser/classes/IsPublicCondition_2.md +++ /dev/null @@ -1,108 +0,0 @@ - - BumbleDocGen / Technical description of the project / Parser / Entity filter conditions / IsPublicCondition
    - -

    - IsPublicCondition class: -

    - - - - - -```php -namespace BumbleDocGen\LanguageHandler\Php\Parser\FilterCondition\MethodFilterCondition; - -final class IsPublicCondition implements \BumbleDocGen\Core\Parser\FilterCondition\ConditionInterface -``` - -
    Check is a public method or not
    - - - - - - -

    Initialization methods:

    - -
      -
    1. - __construct -
    2. -
    - -

    Methods:

    - -
      -
    1. - canAddToCollection -
    2. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public function __construct(); -``` - - - -Parameters: not specified - - - -
    -
    -
    - - - -```php -public function canAddToCollection(\BumbleDocGen\Core\Parser\Entity\EntityInterface $entity): bool; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $entity\BumbleDocGen\Core\Parser\Entity\EntityInterface-
    - -Return value: bool - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/2.parser/classes/IsPublicCondition_3.md b/docs/tech/2.parser/classes/IsPublicCondition_3.md deleted file mode 100644 index f4eef9de..00000000 --- a/docs/tech/2.parser/classes/IsPublicCondition_3.md +++ /dev/null @@ -1,108 +0,0 @@ - - BumbleDocGen / Technical description of the project / Parser / Entity filter conditions / IsPublicCondition
    - -

    - IsPublicCondition class: -

    - - - - - -```php -namespace BumbleDocGen\LanguageHandler\Php\Parser\FilterCondition\PropertyFilterCondition; - -final class IsPublicCondition implements \BumbleDocGen\Core\Parser\FilterCondition\ConditionInterface -``` - -
    Check is a public property or not
    - - - - - - -

    Initialization methods:

    - -
      -
    1. - __construct -
    2. -
    - -

    Methods:

    - -
      -
    1. - canAddToCollection -
    2. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public function __construct(); -``` - - - -Parameters: not specified - - - -
    -
    -
    - - - -```php -public function canAddToCollection(\BumbleDocGen\Core\Parser\Entity\EntityInterface $entity): bool; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $entity\BumbleDocGen\Core\Parser\Entity\EntityInterface-
    - -Return value: bool - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/2.parser/classes/LocatedInCondition.md b/docs/tech/2.parser/classes/LocatedInCondition.md deleted file mode 100644 index 928c362e..00000000 --- a/docs/tech/2.parser/classes/LocatedInCondition.md +++ /dev/null @@ -1,142 +0,0 @@ - - BumbleDocGen / Technical description of the project / Parser / Entity filter conditions / LocatedInCondition
    - -

    - LocatedInCondition class: -

    - - - - - -```php -namespace BumbleDocGen\Core\Parser\FilterCondition\CommonFilterCondition; - -final class LocatedInCondition implements \BumbleDocGen\Core\Parser\FilterCondition\ConditionInterface -``` - -
    Checking the existence of an entity in the specified directories
    - - - - - - -

    Initialization methods:

    - -
      -
    1. - __construct -
    2. -
    - -

    Methods:

    - -
      -
    1. - canAddToCollection -
    2. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public function __construct(\BumbleDocGen\Core\Configuration\Configuration $configuration, \BumbleDocGen\Core\Configuration\ConfigurationParameterBag $parameterBag, array $directories = []); -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $configuration\BumbleDocGen\Core\Configuration\Configuration-
    $parameterBag\BumbleDocGen\Core\Configuration\ConfigurationParameterBag-
    $directoriesarray-
    - - - -
    -
    -
    - - - -```php -public function canAddToCollection(\BumbleDocGen\Core\Parser\Entity\EntityInterface $entity): bool; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $entity\BumbleDocGen\Core\Parser\Entity\EntityInterface-
    - -Return value: bool - - -Throws: - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/2.parser/classes/LocatedNotInCondition.md b/docs/tech/2.parser/classes/LocatedNotInCondition.md deleted file mode 100644 index 2becdf60..00000000 --- a/docs/tech/2.parser/classes/LocatedNotInCondition.md +++ /dev/null @@ -1,142 +0,0 @@ - - BumbleDocGen / Technical description of the project / Parser / Entity filter conditions / LocatedNotInCondition
    - -

    - LocatedNotInCondition class: -

    - - - - - -```php -namespace BumbleDocGen\Core\Parser\FilterCondition\CommonFilterCondition; - -final class LocatedNotInCondition implements \BumbleDocGen\Core\Parser\FilterCondition\ConditionInterface -``` - -
    Checking the existence of an entity not in the specified directories
    - - - - - - -

    Initialization methods:

    - -
      -
    1. - __construct -
    2. -
    - -

    Methods:

    - -
      -
    1. - canAddToCollection -
    2. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public function __construct(\BumbleDocGen\Core\Configuration\Configuration $configuration, \BumbleDocGen\Core\Configuration\ConfigurationParameterBag $parameterBag, array $directories = []); -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $configuration\BumbleDocGen\Core\Configuration\Configuration-
    $parameterBag\BumbleDocGen\Core\Configuration\ConfigurationParameterBag-
    $directoriesarray-
    - - - -
    -
    -
    - - - -```php -public function canAddToCollection(\BumbleDocGen\Core\Parser\Entity\EntityInterface $entity): bool; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $entity\BumbleDocGen\Core\Parser\Entity\EntityInterface-
    - -Return value: bool - - -Throws: - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/2.parser/classes/MethodEntitiesCollection.md b/docs/tech/2.parser/classes/MethodEntitiesCollection.md deleted file mode 100644 index e6d5c296..00000000 --- a/docs/tech/2.parser/classes/MethodEntitiesCollection.md +++ /dev/null @@ -1,469 +0,0 @@ - - BumbleDocGen / Technical description of the project / Parser / Entities and entities collections / MethodEntitiesCollection
    - -

    - MethodEntitiesCollection class: -

    - - - - - -```php -namespace BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method; - -final class MethodEntitiesCollection extends \BumbleDocGen\Core\Parser\Entity\BaseEntityCollection implements \IteratorAggregate -``` - -
    Collection of PHP class method entities
    - - - - - - -

    Initialization methods:

    - -
      -
    1. - __construct -
    2. -
    - -

    Methods:

    - -
      -
    1. - add - - Add an entity to a collection
    2. -
    3. - get - - Get the loaded method entity if it exists
    4. -
    5. - getAllExceptInitializations - - Get a copy of the collection containing only those methods that are not initialization methods
    6. -
    7. - getInitializations - - Get a copy of the collection containing only those methods that are initialization methods
    8. -
    9. - getIterator -
    10. -
    11. - has - - Check if an entity has been added to the collection
    12. -
    13. - isEmpty - - Check if the collection is empty or not
    14. -
    15. - loadMethodEntities - - Load method entities into the collection according to the project configuration
    16. -
    17. - remove - - Remove an entity from a collection
    18. -
    19. - unsafeGet - - Get the method entity if it exists. If the method exists but has not been loaded into the collection, a new entity object will be created
    20. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public function __construct(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity $classEntity, \BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings $phpHandlerSettings, \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Cache\CacheablePhpEntityFactory $cacheablePhpEntityFactory, \Psr\Log\LoggerInterface $logger); -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $classEntity\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity-
    $phpHandlerSettings\BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings-
    $cacheablePhpEntityFactory\BumbleDocGen\LanguageHandler\Php\Parser\Entity\Cache\CacheablePhpEntityFactory-
    $logger\Psr\Log\LoggerInterface-
    - - - -
    -
    -
    - - - -```php -public function add(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntityInterface $methodEntity, bool $reload = false): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntitiesCollection; -``` - -
    Add an entity to a collection
    - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $methodEntity\BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntityInterfaceEntity to be added to the collection
    $reloadboolReplace an entity with a new one if one has already been loaded previously
    - -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntitiesCollection - - -
    -
    -
    - - - -```php -public function get(string $objectName): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntity; -``` - -
    Get the loaded method entity if it exists
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $objectNamestringMethod entity name
    - -Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntity - - -
    -
    -
    - - - -```php -public function getAllExceptInitializations(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntitiesCollection; -``` - -
    Get a copy of the collection containing only those methods that are not initialization methods
    - -Parameters: not specified - -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntitiesCollection - - -
    -
    -
    - - - -```php -public function getInitializations(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntitiesCollection; -``` - -
    Get a copy of the collection containing only those methods that are initialization methods
    - -Parameters: not specified - -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntitiesCollection - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\Core\Parser\Entity\BaseEntityCollection - -public function getIterator(): \Generator; -``` - - - -Parameters: not specified - -Return value: \Generator - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\Core\Parser\Entity\BaseEntityCollection - -public function has(string $objectName): bool; -``` - -
    Check if an entity has been added to the collection
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $objectNamestring-
    - -Return value: bool - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\Core\Parser\Entity\BaseEntityCollection - -public function isEmpty(): bool; -``` - -
    Check if the collection is empty or not
    - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - -
      -
    • # - loadMethodEntities - :warning: Is internal | source code
    • -
    - -```php -public function loadMethodEntities(): void; -``` - -
    Load method entities into the collection according to the project configuration
    - -Parameters: not specified - -Return value: void - - -Throws: - - - -See: - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\Core\Parser\Entity\BaseEntityCollection - -public function remove(string $objectName): void; -``` - -
    Remove an entity from a collection
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $objectNamestring-
    - -Return value: void - - -
    -
    -
    - - - -```php -public function unsafeGet(string $objectName): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntity; -``` - -
    Get the method entity if it exists. If the method exists but has not been loaded into the collection, a new entity object will be created
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $objectNamestringMethod entity name
    - -Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntity - - -Throws: - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/2.parser/classes/OnlyFromCurrentClassCondition.md b/docs/tech/2.parser/classes/OnlyFromCurrentClassCondition.md deleted file mode 100644 index 3dc6206a..00000000 --- a/docs/tech/2.parser/classes/OnlyFromCurrentClassCondition.md +++ /dev/null @@ -1,81 +0,0 @@ - - BumbleDocGen / Technical description of the project / Parser / Entity filter conditions / OnlyFromCurrentClassCondition
    - -

    - OnlyFromCurrentClassCondition class: -

    - - - - - -```php -namespace BumbleDocGen\LanguageHandler\Php\Parser\FilterCondition\MethodFilterCondition; - -final class OnlyFromCurrentClassCondition implements \BumbleDocGen\Core\Parser\FilterCondition\ConditionInterface -``` - -
    Only methods that belong to the current class (not parent)
    - - - - - - - -

    Methods:

    - -
      -
    1. - canAddToCollection -
    2. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public function canAddToCollection(\BumbleDocGen\Core\Parser\Entity\EntityInterface $entity): bool; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $entity\BumbleDocGen\Core\Parser\Entity\EntityInterface-
    - -Return value: bool - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/2.parser/classes/OnlyFromCurrentClassCondition_2.md b/docs/tech/2.parser/classes/OnlyFromCurrentClassCondition_2.md deleted file mode 100644 index ef66d1df..00000000 --- a/docs/tech/2.parser/classes/OnlyFromCurrentClassCondition_2.md +++ /dev/null @@ -1,81 +0,0 @@ - - BumbleDocGen / Technical description of the project / Parser / Entity filter conditions / OnlyFromCurrentClassCondition
    - -

    - OnlyFromCurrentClassCondition class: -

    - - - - - -```php -namespace BumbleDocGen\LanguageHandler\Php\Parser\FilterCondition\PropertyFilterCondition; - -final class OnlyFromCurrentClassCondition implements \BumbleDocGen\Core\Parser\FilterCondition\ConditionInterface -``` - -
    Only properties that belong to the current class (not parent)
    - - - - - - - -

    Methods:

    - -
      -
    1. - canAddToCollection -
    2. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public function canAddToCollection(\BumbleDocGen\Core\Parser\Entity\EntityInterface $entity): bool; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $entity\BumbleDocGen\Core\Parser\Entity\EntityInterface-
    - -Return value: bool - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/2.parser/classes/ProjectParser.md b/docs/tech/2.parser/classes/ProjectParser.md deleted file mode 100644 index a92102f2..00000000 --- a/docs/tech/2.parser/classes/ProjectParser.md +++ /dev/null @@ -1,226 +0,0 @@ - - BumbleDocGen / Technical description of the project / Parser / ProjectParser
    - -

    - ProjectParser class: -

    - - - - - -```php -namespace BumbleDocGen\Core\Parser; - -final class ProjectParser -``` - -
    Entity for project parsing using source locators
    - - - - - - -

    Initialization methods:

    - -
      -
    1. - __construct -
    2. -
    - -

    Methods:

    - -
      -
    1. - getEntityCollectionForPL -
    2. -
    3. - getRootEntityCollectionsGroup -
    4. -
    5. - parse -
    6. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public function __construct(\BumbleDocGen\Core\Configuration\Configuration $configuration, \BumbleDocGen\Core\Plugin\PluginEventDispatcher $pluginEventDispatcher, \BumbleDocGen\Core\Parser\Entity\RootEntityCollectionsGroup $rootEntityCollectionsGroup); -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $configuration\BumbleDocGen\Core\Configuration\Configuration-
    $pluginEventDispatcher\BumbleDocGen\Core\Plugin\PluginEventDispatcher-
    $rootEntityCollectionsGroup\BumbleDocGen\Core\Parser\Entity\RootEntityCollectionsGroup-
    - - - -
    -
    -
    - - - -```php -public function getEntityCollectionForPL(string $plHandlerClassName): null|\BumbleDocGen\Core\Parser\Entity\RootEntityCollection; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $plHandlerClassNamestring-
    - -Return value: null | \BumbleDocGen\Core\Parser\Entity\RootEntityCollection - - -Throws: - - -
    -
    -
    - - - -```php -public function getRootEntityCollectionsGroup(): \BumbleDocGen\Core\Parser\Entity\RootEntityCollectionsGroup; -``` - - - -Parameters: not specified - -Return value: \BumbleDocGen\Core\Parser\Entity\RootEntityCollectionsGroup - - -
    -
    -
    - - - -```php -public function parse(\BumbleDocGen\Core\Parser\Entity\EntitiesLoaderProgressBarInterface|null $progressBar = null): \BumbleDocGen\Core\Parser\Entity\CollectionGroupLoadEntitiesResult; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $progressBar\BumbleDocGen\Core\Parser\Entity\EntitiesLoaderProgressBarInterface | null-
    - -Return value: \BumbleDocGen\Core\Parser\Entity\CollectionGroupLoadEntitiesResult - - -Throws: - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/2.parser/classes/PropertyEntitiesCollection.md b/docs/tech/2.parser/classes/PropertyEntitiesCollection.md deleted file mode 100644 index 501bf6b7..00000000 --- a/docs/tech/2.parser/classes/PropertyEntitiesCollection.md +++ /dev/null @@ -1,416 +0,0 @@ - - BumbleDocGen / Technical description of the project / Parser / Entities and entities collections / PropertyEntitiesCollection
    - -

    - PropertyEntitiesCollection class: -

    - - - - - -```php -namespace BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property; - -final class PropertyEntitiesCollection extends \BumbleDocGen\Core\Parser\Entity\BaseEntityCollection implements \IteratorAggregate -``` - - - - - - - - -

    Initialization methods:

    - -
      -
    1. - __construct -
    2. -
    - -

    Methods:

    - -
      -
    1. - add - - Add an entity to a collection
    2. -
    3. - get - - Get the loaded property entity if it exists
    4. -
    5. - getIterator -
    6. -
    7. - has - - Check if an entity has been added to the collection
    8. -
    9. - isEmpty - - Check if the collection is empty or not
    10. -
    11. - loadPropertyEntities - - Load property entities into the collection according to the project configuration
    12. -
    13. - remove - - Remove an entity from a collection
    14. -
    15. - unsafeGet - - Get the property entity if it exists. If the property exists but has not been loaded into the collection, a new entity object will be created
    16. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public function __construct(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity $classEntity, \BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings $phpHandlerSettings, \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Cache\CacheablePhpEntityFactory $cacheablePhpEntityFactory); -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $classEntity\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity-
    $phpHandlerSettings\BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings-
    $cacheablePhpEntityFactory\BumbleDocGen\LanguageHandler\Php\Parser\Entity\Cache\CacheablePhpEntityFactory-
    - - - -
    -
    -
    - - - -```php -public function add(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntity $propertyEntity, bool $reload = false): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntitiesCollection; -``` - -
    Add an entity to a collection
    - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $propertyEntity\BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntityEntity to be added to the collection
    $reloadboolReplace an entity with a new one if one has already been loaded previously
    - -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntitiesCollection - - -
    -
    -
    - - - -```php -public function get(string $objectName): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntity; -``` - -
    Get the loaded property entity if it exists
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $objectNamestringProperty entity name
    - -Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntity - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\Core\Parser\Entity\BaseEntityCollection - -public function getIterator(): \Generator; -``` - - - -Parameters: not specified - -Return value: \Generator - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\Core\Parser\Entity\BaseEntityCollection - -public function has(string $objectName): bool; -``` - -
    Check if an entity has been added to the collection
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $objectNamestring-
    - -Return value: bool - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\Core\Parser\Entity\BaseEntityCollection - -public function isEmpty(): bool; -``` - -
    Check if the collection is empty or not
    - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - -
      -
    • # - loadPropertyEntities - :warning: Is internal | source code
    • -
    - -```php -public function loadPropertyEntities(): void; -``` - -
    Load property entities into the collection according to the project configuration
    - -Parameters: not specified - -Return value: void - - -Throws: - - - -See: - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\Core\Parser\Entity\BaseEntityCollection - -public function remove(string $objectName): void; -``` - -
    Remove an entity from a collection
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $objectNamestring-
    - -Return value: void - - -
    -
    -
    - - - -```php -public function unsafeGet(string $objectName): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntity; -``` - -
    Get the property entity if it exists. If the property exists but has not been loaded into the collection, a new entity object will be created
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $objectNamestringProperty entity name
    - -Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntity - - -Throws: - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/2.parser/classes/RecursiveDirectoriesSourceLocator.md b/docs/tech/2.parser/classes/RecursiveDirectoriesSourceLocator.md deleted file mode 100644 index 185836e9..00000000 --- a/docs/tech/2.parser/classes/RecursiveDirectoriesSourceLocator.md +++ /dev/null @@ -1,120 +0,0 @@ - - BumbleDocGen / Technical description of the project / Parser / Source locators / RecursiveDirectoriesSourceLocator
    - -

    - RecursiveDirectoriesSourceLocator class: -

    - - - - - -```php -namespace BumbleDocGen\Core\Parser\SourceLocator; - -final class RecursiveDirectoriesSourceLocator extends \BumbleDocGen\Core\Parser\SourceLocator\BaseSourceLocator implements \BumbleDocGen\Core\Parser\SourceLocator\SourceLocatorInterface -``` - -
    Loads all files from the specified directories, which are traversed recursively
    - - - - - - -

    Initialization methods:

    - -
      -
    1. - __construct -
    2. -
    - -

    Methods:

    - -
      -
    1. - getFinder -
    2. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public function __construct(array $directories, array $exclude = [], bool $abortExecutionIfPartOfDirsNotExists = true); -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $directoriesarray-
    $excludearray-
    $abortExecutionIfPartOfDirsNotExistsbool-
    - - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\Core\Parser\SourceLocator\BaseSourceLocator - -public function getFinder(): \Symfony\Component\Finder\Finder; -``` - - - -Parameters: not specified - -Return value: \Symfony\Component\Finder\Finder - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/2.parser/classes/SingleFileSourceLocator.md b/docs/tech/2.parser/classes/SingleFileSourceLocator.md deleted file mode 100644 index de423c67..00000000 --- a/docs/tech/2.parser/classes/SingleFileSourceLocator.md +++ /dev/null @@ -1,110 +0,0 @@ - - BumbleDocGen / Technical description of the project / Parser / Source locators / SingleFileSourceLocator
    - -

    - SingleFileSourceLocator class: -

    - - - - - -```php -namespace BumbleDocGen\Core\Parser\SourceLocator; - -final class SingleFileSourceLocator extends \BumbleDocGen\Core\Parser\SourceLocator\BaseSourceLocator implements \BumbleDocGen\Core\Parser\SourceLocator\SourceLocatorInterface -``` - -
    Loads one specific file by its path
    - - - - - - -

    Initialization methods:

    - -
      -
    1. - __construct -
    2. -
    - -

    Methods:

    - -
      -
    1. - getFinder -
    2. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public function __construct(string $filename); -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $filenamestring-
    - - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\Core\Parser\SourceLocator\BaseSourceLocator - -public function getFinder(): \Symfony\Component\Finder\Finder; -``` - - - -Parameters: not specified - -Return value: \Symfony\Component\Finder\Finder - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/2.parser/classes/SourceLocatorInterface.md b/docs/tech/2.parser/classes/SourceLocatorInterface.md deleted file mode 100644 index ab585951..00000000 --- a/docs/tech/2.parser/classes/SourceLocatorInterface.md +++ /dev/null @@ -1,64 +0,0 @@ - - BumbleDocGen / Technical description of the project / Parser / Source locators / SourceLocatorInterface
    - -

    - SourceLocatorInterface class: -

    - - - - - -```php -namespace BumbleDocGen\Core\Parser\SourceLocator; - -interface SourceLocatorInterface -``` - - - - - - - - - -

    Methods:

    - -
      -
    1. - getFinder -
    2. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public function getFinder(): null|\Symfony\Component\Finder\Finder; -``` - - - -Parameters: not specified - -Return value: null | \Symfony\Component\Finder\Finder - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/2.parser/classes/TrueCondition.md b/docs/tech/2.parser/classes/TrueCondition.md deleted file mode 100644 index 9151afff..00000000 --- a/docs/tech/2.parser/classes/TrueCondition.md +++ /dev/null @@ -1,81 +0,0 @@ - - BumbleDocGen / Technical description of the project / Parser / Entity filter conditions / TrueCondition
    - -

    - TrueCondition class: -

    - - - - - -```php -namespace BumbleDocGen\Core\Parser\FilterCondition\CommonFilterCondition; - -final class TrueCondition implements \BumbleDocGen\Core\Parser\FilterCondition\ConditionInterface -``` - -
    True conditions, any object is available
    - - - - - - - -

    Methods:

    - -
      -
    1. - canAddToCollection -
    2. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public function canAddToCollection(\BumbleDocGen\Core\Parser\Entity\EntityInterface $entity): bool; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $entity\BumbleDocGen\Core\Parser\Entity\EntityInterface-
    - -Return value: bool - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/2.parser/classes/VisibilityCondition.md b/docs/tech/2.parser/classes/VisibilityCondition.md deleted file mode 100644 index 2d3b88e5..00000000 --- a/docs/tech/2.parser/classes/VisibilityCondition.md +++ /dev/null @@ -1,125 +0,0 @@ - - BumbleDocGen / Technical description of the project / Parser / Entity filter conditions / VisibilityCondition
    - -

    - VisibilityCondition class: -

    - - - - - -```php -namespace BumbleDocGen\LanguageHandler\Php\Parser\FilterCondition\ClassConstantFilterCondition; - -final class VisibilityCondition implements \BumbleDocGen\Core\Parser\FilterCondition\ConditionInterface -``` - -
    Constant access modifier check
    - - - - - - -

    Initialization methods:

    - -
      -
    1. - __construct -
    2. -
    - -

    Methods:

    - -
      -
    1. - canAddToCollection -
    2. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public function __construct(string ...$visibilityModifiers); -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $visibilityModifiers (variadic)string-
    - - - -
    -
    -
    - - - -```php -public function canAddToCollection(\BumbleDocGen\Core\Parser\Entity\EntityInterface $entity): bool; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $entity\BumbleDocGen\Core\Parser\Entity\EntityInterface-
    - -Return value: bool - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/2.parser/classes/VisibilityCondition_2.md b/docs/tech/2.parser/classes/VisibilityCondition_2.md deleted file mode 100644 index 36c9d792..00000000 --- a/docs/tech/2.parser/classes/VisibilityCondition_2.md +++ /dev/null @@ -1,125 +0,0 @@ - - BumbleDocGen / Technical description of the project / Parser / Entity filter conditions / VisibilityCondition
    - -

    - VisibilityCondition class: -

    - - - - - -```php -namespace BumbleDocGen\LanguageHandler\Php\Parser\FilterCondition\MethodFilterCondition; - -final class VisibilityCondition implements \BumbleDocGen\Core\Parser\FilterCondition\ConditionInterface -``` - -
    Method access modifier check
    - - - - - - -

    Initialization methods:

    - -
      -
    1. - __construct -
    2. -
    - -

    Methods:

    - -
      -
    1. - canAddToCollection -
    2. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public function __construct(string ...$visibilityModifiers); -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $visibilityModifiers (variadic)string-
    - - - -
    -
    -
    - - - -```php -public function canAddToCollection(\BumbleDocGen\Core\Parser\Entity\EntityInterface $entity): bool; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $entity\BumbleDocGen\Core\Parser\Entity\EntityInterface-
    - -Return value: bool - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/2.parser/classes/VisibilityCondition_3.md b/docs/tech/2.parser/classes/VisibilityCondition_3.md deleted file mode 100644 index 6cea98a3..00000000 --- a/docs/tech/2.parser/classes/VisibilityCondition_3.md +++ /dev/null @@ -1,125 +0,0 @@ - - BumbleDocGen / Technical description of the project / Parser / Entity filter conditions / VisibilityCondition
    - -

    - VisibilityCondition class: -

    - - - - - -```php -namespace BumbleDocGen\LanguageHandler\Php\Parser\FilterCondition\PropertyFilterCondition; - -final class VisibilityCondition implements \BumbleDocGen\Core\Parser\FilterCondition\ConditionInterface -``` - -
    Property access modifier check
    - - - - - - -

    Initialization methods:

    - -
      -
    1. - __construct -
    2. -
    - -

    Methods:

    - -
      -
    1. - canAddToCollection -
    2. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public function __construct(string ...$visibilityModifiers); -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $visibilityModifiers (variadic)string-
    - - - -
    -
    -
    - - - -```php -public function canAddToCollection(\BumbleDocGen\Core\Parser\Entity\EntityInterface $entity): bool; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $entity\BumbleDocGen\Core\Parser\Entity\EntityInterface-
    - -Return value: bool - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/2.parser/reflectionApi/classes/RootEntityCollectionsGroup.md b/docs/tech/2.parser/reflectionApi/classes/RootEntityCollectionsGroup.md deleted file mode 100644 index 763c1bdf..00000000 --- a/docs/tech/2.parser/reflectionApi/classes/RootEntityCollectionsGroup.md +++ /dev/null @@ -1,336 +0,0 @@ - - BumbleDocGen / Technical description of the project / Parser / Reflection API / RootEntityCollectionsGroup
    - -

    - RootEntityCollectionsGroup class: -

    - - - - - -```php -namespace BumbleDocGen\Core\Parser\Entity; - -final class RootEntityCollectionsGroup implements \IteratorAggregate -``` - - - - - - - - - -

    Methods:

    - -
      -
    1. - add -
    2. -
    3. - clearOperationsLog -
    4. -
    5. - get -
    6. -
    7. - getIterator -
    8. -
    9. - getOperationsLog -
    10. -
    11. - getOperationsLogWithoutDuplicates -
    12. -
    13. - isFoundEntitiesOperationsLogCacheOutdated -
    14. -
    15. - loadByLanguageHandlers -
    16. -
    17. - updateAllEntitiesCache -
    18. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public function add(\BumbleDocGen\Core\Parser\Entity\RootEntityCollection $rootEntityCollection): void; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $rootEntityCollection\BumbleDocGen\Core\Parser\Entity\RootEntityCollection-
    - -Return value: void - - -
    -
    -
    - - - -```php -public function clearOperationsLog(): void; -``` - - - -Parameters: not specified - -Return value: void - - -
    -
    -
    - - - -```php -public function get(string $collectionName): null|\BumbleDocGen\Core\Parser\Entity\RootEntityCollection; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $collectionNamestring-
    - -Return value: null | \BumbleDocGen\Core\Parser\Entity\RootEntityCollection - - -
    -
    -
    - - - -```php -public function getIterator(): \Generator; -``` - - - -Parameters: not specified - -Return value: \Generator - - -
    -
    -
    - - - -```php -public function getOperationsLog(): array; -``` - - - -Parameters: not specified - -Return value: array - - -
    -
    -
    - - - -```php -public function getOperationsLogWithoutDuplicates(): array; -``` - - - -Parameters: not specified - -Return value: array - - -
    -
    -
    - -
      -
    • # - isFoundEntitiesOperationsLogCacheOutdated - | source code
    • -
    - -```php -public function isFoundEntitiesOperationsLogCacheOutdated(array $entitiesCollectionOperationsLog): bool; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $entitiesCollectionOperationsLogarray-
    - -Return value: bool - - -
    -
    -
    - - - -```php -public function loadByLanguageHandlers(\BumbleDocGen\LanguageHandler\LanguageHandlersCollection $languageHandlersCollection, \BumbleDocGen\Core\Parser\Entity\EntitiesLoaderProgressBarInterface|null $progressBar = null): \BumbleDocGen\Core\Parser\Entity\CollectionGroupLoadEntitiesResult; -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $languageHandlersCollection\BumbleDocGen\LanguageHandler\LanguageHandlersCollection-
    $progressBar\BumbleDocGen\Core\Parser\Entity\EntitiesLoaderProgressBarInterface | null-
    - -Return value: \BumbleDocGen\Core\Parser\Entity\CollectionGroupLoadEntitiesResult - - -
    -
    -
    - - - -```php -public function updateAllEntitiesCache(): void; -``` - - - -Parameters: not specified - -Return value: void - - -Throws: - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/2.parser/reflectionApi/php/classes/ClassConstantEntity.md b/docs/tech/2.parser/reflectionApi/php/classes/ClassConstantEntity.md deleted file mode 100644 index 41b34c30..00000000 --- a/docs/tech/2.parser/reflectionApi/php/classes/ClassConstantEntity.md +++ /dev/null @@ -1,1505 +0,0 @@ - - BumbleDocGen / Technical description of the project / Parser / Reflection API / Reflection API for PHP / PHP class constant reflection API / ClassConstantEntity
    - -

    - ClassConstantEntity class: -

    - - - - - -```php -namespace BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant; - -class ClassConstantEntity extends \BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity implements \BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityInterface, \BumbleDocGen\Core\Parser\Entity\EntityInterface -``` - -
    Class constant entity
    - - - - - - -

    Initialization methods:

    - -
      -
    1. - __construct -
    2. -
    - -

    Methods:

    - -
      -
    1. - getAbsoluteFileName - - Returns the absolute path to a file if it can be retrieved and if the file is in the project directory
    2. -
    3. - getAst - - Get AST for this entity
    4. -
    5. - getCacheKey -
    6. -
    7. - getCachedEntityDependencies -
    8. -
    9. - getCurrentRootEntity -
    10. -
    11. - getDescription - - Get entity description
    12. -
    13. - getDescriptionLinks - - Get parsed links from description and doc blocks `see` and `link`
    14. -
    15. - getDocBlock - - Get DocBlock for current entity
    16. -
    17. - getDocComment - - Get the doc comment of an entity
    18. -
    19. - getDocCommentEntity - - Link to an entity where docBlock is implemented for this entity
    20. -
    21. - getDocCommentLine - - Get the code line number where the docBlock of the current entity begins
    22. -
    23. - getDocNote - - Get the note annotation value
    24. -
    25. - getEndLine - - Get the line number of the end of a constant's code in a file
    26. -
    27. - getExamples - - Get parsed examples from `examples` doc block
    28. -
    29. - getFileSourceLink -
    30. -
    31. - getFirstExample - - Get first example from `examples` doc block
    32. -
    33. - getImplementingClass - - Get the class like entity in which the current entity was implemented
    34. -
    35. - getImplementingClassName -
    36. -
    37. - getName - - Constant name
    38. -
    39. - getNamespaceName - - Get the name of the namespace where the current class is implemented
    40. -
    41. - getObjectId - - Get entity unique ID
    42. -
    43. - getRelativeFileName - - File name relative to project_root configuration parameter
    44. -
    45. - getRootEntity - - Get the class like entity where this constant was obtained
    46. -
    47. - getRootEntityCollection - - Get the collection of root entities to which this entity belongs
    48. -
    49. - getShortName - - Constant short name
    50. -
    51. - getStartLine - - Get the line number of the beginning of the constant code in a file
    52. -
    53. - getThrows - - Get parsed throws from `throws` doc block
    54. -
    55. - getThrowsDocBlockLinks -
    56. -
    57. - getValue - - Get the compiled value of a constant
    58. -
    59. - hasDescriptionLinks - - Checking if an entity has links in its description
    60. -
    61. - hasExamples - - Checking if an entity has `example` docBlock
    62. -
    63. - hasThrows - - Checking if an entity has `throws` docBlock
    64. -
    65. - isApi - - Checking if an entity has `api` docBlock
    66. -
    67. - isDeprecated - - Checking if an entity has `deprecated` docBlock
    68. -
    69. - isEntityCacheOutdated - - Checking if the entity cache is out of date
    70. -
    71. - isEntityDataCacheOutdated -
    72. -
    73. - isEntityFileCanBeLoad - - Checking if entity data can be retrieved
    74. -
    75. - isInternal - - Checking if an entity has `internal` docBlock
    76. -
    77. - isPrivate - - Check if a constant is a private constant
    78. -
    79. - isProtected - - Check if a constant is a protected constant
    80. -
    81. - isPublic - - Check if a constant is a public constant
    82. -
    83. - reloadEntityDependenciesCache - - Update entity dependency cache
    84. -
    85. - removeEntityValueFromCache -
    86. -
    87. - removeNotUsedEntityDataCache -
    88. -
    - - -

    Constants:

    - - - - - - -

    Method details:

    - -
    - - - -```php -public function __construct(\BumbleDocGen\Core\Configuration\Configuration $configuration, \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity $classEntity, \BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper $parserHelper, \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache $localObjectCache, \Psr\Log\LoggerInterface $logger, string $constantName, string $implementingClassName); -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $configuration\BumbleDocGen\Core\Configuration\Configuration-
    $classEntity\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity-
    $parserHelper\BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper-
    $localObjectCache\BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache-
    $logger\Psr\Log\LoggerInterface-
    $constantNamestring-
    $implementingClassNamestring-
    - - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getAbsoluteFileName(): null|string; -``` - -
    Returns the absolute path to a file if it can be retrieved and if the file is in the project directory
    - -Parameters: not specified - -Return value: null | string - - -Throws: - - -
    -
    -
    - - - -```php -public function getAst(): \PhpParser\Node\Stmt\ClassConst; -``` - -
    Get AST for this entity
    - -Parameters: not specified - -Return value: \PhpParser\Node\Stmt\ClassConst - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait - -public function getCacheKey(): string; -``` - - - -Parameters: not specified - -Return value: string - - -
    -
    -
    - -
      -
    • # - getCachedEntityDependencies - :warning: Is internal | source code
    • -
    - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getCachedEntityDependencies(): array; -``` - - - -Parameters: not specified - -Return value: array - - -Throws: - - -
    -
    -
    - -
      -
    • # - getCurrentRootEntity - :warning: Is internal | source code
    • -
    - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getCurrentRootEntity(): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; -``` - - - -Parameters: not specified - -Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getDescription(): string; -``` - -
    Get entity description
    - -Parameters: not specified - -Return value: string - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getDescriptionLinks(): array; -``` - -
    Get parsed links from description and doc blocks `see` and `link`
    - -Parameters: not specified - -Return value: array - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getDocBlock(): \phpDocumentor\Reflection\DocBlock; -``` - -
    Get DocBlock for current entity
    - -Parameters: not specified - -Return value: \phpDocumentor\Reflection\DocBlock - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getDocComment(): string; -``` - -
    Get the doc comment of an entity
    - -Parameters: not specified - -Return value: string - - -Throws: - - -
    -
    -
    - -
      -
    • # - getDocCommentEntity - :warning: Is internal | source code
    • -
    - -```php -public function getDocCommentEntity(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity; -``` - -
    Link to an entity where docBlock is implemented for this entity
    - -Parameters: not specified - -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getDocCommentLine(): null|int; -``` - -
    Get the code line number where the docBlock of the current entity begins
    - -Parameters: not specified - -Return value: null | int - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getDocNote(): string; -``` - -
    Get the note annotation value
    - -Parameters: not specified - -Return value: string - - -Throws: - - -
    -
    -
    - - - -```php -public function getEndLine(): int; -``` - -
    Get the line number of the end of a constant's code in a file
    - -Parameters: not specified - -Return value: int - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getExamples(): array; -``` - -
    Get parsed examples from `examples` doc block
    - -Parameters: not specified - -Return value: array - - -Throws: - - -
    -
    -
    - -
      -
    • # - getFileSourceLink - :warning: Is internal | source code
    • -
    - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getFileSourceLink(bool $withLine = true): null|string; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $withLinebool-
    - -Return value: null | string - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getFirstExample(): string; -``` - -
    Get first example from `examples` doc block
    - -Parameters: not specified - -Return value: string - - -Throws: - - -
    -
    -
    - - - -```php -public function getImplementingClass(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; -``` - -
    Get the class like entity in which the current entity was implemented
    - -Parameters: not specified - -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - - -
    -
    -
    - - - -```php -public function getImplementingClassName(): string; -``` - - - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -public function getName(): string; -``` - -
    Constant name
    - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -public function getNamespaceName(): string; -``` - -
    Get the name of the namespace where the current class is implemented
    - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getObjectId(): string; -``` - -
    Get entity unique ID
    - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getRelativeFileName(): null|string; -``` - -
    File name relative to project_root configuration parameter
    - -Parameters: not specified - -Return value: null | string - - - -See: - -
    -
    -
    - - - -```php -public function getRootEntity(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; -``` - -
    Get the class like entity where this constant was obtained
    - -Parameters: not specified - -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - - -
    -
    -
    - - - -```php -public function getRootEntityCollection(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; -``` - -
    Get the collection of root entities to which this entity belongs
    - -Parameters: not specified - -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection - - -
    -
    -
    - - - -```php -public function getShortName(): string; -``` - -
    Constant short name
    - -Parameters: not specified - -Return value: string - - - -See: - -
    -
    -
    - - - -```php -public function getStartLine(): int; -``` - -
    Get the line number of the beginning of the constant code in a file
    - -Parameters: not specified - -Return value: int - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getThrows(): array; -``` - -
    Get parsed throws from `throws` doc block
    - -Parameters: not specified - -Return value: array - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getThrowsDocBlockLinks(): array; -``` - - - -Parameters: not specified - -Return value: array - - -Throws: - - -
    -
    -
    - - - -```php -public function getValue(): string|array|int|bool|null|float; -``` - -
    Get the compiled value of a constant
    - -Parameters: not specified - -Return value: string | array | int | bool | null | float - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function hasDescriptionLinks(): bool; -``` - -
    Checking if an entity has links in its description
    - -Parameters: not specified - -Return value: bool - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function hasExamples(): bool; -``` - -
    Checking if an entity has `example` docBlock
    - -Parameters: not specified - -Return value: bool - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function hasThrows(): bool; -``` - -
    Checking if an entity has `throws` docBlock
    - -Parameters: not specified - -Return value: bool - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function isApi(): bool; -``` - -
    Checking if an entity has `api` docBlock
    - -Parameters: not specified - -Return value: bool - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function isDeprecated(): bool; -``` - -
    Checking if an entity has `deprecated` docBlock
    - -Parameters: not specified - -Return value: bool - - -Throws: - - -
    -
    -
    - -
      -
    • # - isEntityCacheOutdated - :warning: Is internal | source code
    • -
    - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function isEntityCacheOutdated(): bool; -``` - -
    Checking if the entity cache is out of date
    - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - -
      -
    • # - isEntityDataCacheOutdated - :warning: Is internal | source code
    • -
    - -```php -// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait - -public function isEntityDataCacheOutdated(): bool; -``` - - - -Parameters: not specified - -Return value: bool - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function isEntityFileCanBeLoad(): bool; -``` - -
    Checking if entity data can be retrieved
    - -Parameters: not specified - -Return value: bool - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function isInternal(): bool; -``` - -
    Checking if an entity has `internal` docBlock
    - -Parameters: not specified - -Return value: bool - - -Throws: - - -
    -
    -
    - - - -```php -public function isPrivate(): bool; -``` - -
    Check if a constant is a private constant
    - -Parameters: not specified - -Return value: bool - - -Throws: - - -
    -
    -
    - - - -```php -public function isProtected(): bool; -``` - -
    Check if a constant is a protected constant
    - -Parameters: not specified - -Return value: bool - - -Throws: - - -
    -
    -
    - - - -```php -public function isPublic(): bool; -``` - -
    Check if a constant is a public constant
    - -Parameters: not specified - -Return value: bool - - -Throws: - - -
    -
    -
    - -
      -
    • # - reloadEntityDependenciesCache - :warning: Is internal | source code
    • -
    - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function reloadEntityDependenciesCache(): array; -``` - -
    Update entity dependency cache
    - -Parameters: not specified - -Return value: array - - -
    -
    -
    - -
      -
    • # - removeEntityValueFromCache - :warning: Is internal | source code
    • -
    - -```php -// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait - -public function removeEntityValueFromCache(string $key): void; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $keystring-
    - -Return value: void - - -
    -
    -
    - -
      -
    • # - removeNotUsedEntityDataCache - :warning: Is internal | source code
    • -
    - -```php -// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait - -public function removeNotUsedEntityDataCache(): void; -``` - - - -Parameters: not specified - -Return value: void - - -Throws: - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/2.parser/reflectionApi/php/classes/ClassConstantEntity_2.md b/docs/tech/2.parser/reflectionApi/php/classes/ClassConstantEntity_2.md deleted file mode 100644 index 8054691b..00000000 --- a/docs/tech/2.parser/reflectionApi/php/classes/ClassConstantEntity_2.md +++ /dev/null @@ -1,1505 +0,0 @@ - - BumbleDocGen / Technical description of the project / Parser / Reflection API / Reflection API for PHP / ClassConstantEntity
    - -

    - ClassConstantEntity class: -

    - - - - - -```php -namespace BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant; - -class ClassConstantEntity extends \BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity implements \BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityInterface, \BumbleDocGen\Core\Parser\Entity\EntityInterface -``` - -
    Class constant entity
    - - - - - - -

    Initialization methods:

    - -
      -
    1. - __construct -
    2. -
    - -

    Methods:

    - -
      -
    1. - getAbsoluteFileName - - Returns the absolute path to a file if it can be retrieved and if the file is in the project directory
    2. -
    3. - getAst - - Get AST for this entity
    4. -
    5. - getCacheKey -
    6. -
    7. - getCachedEntityDependencies -
    8. -
    9. - getCurrentRootEntity -
    10. -
    11. - getDescription - - Get entity description
    12. -
    13. - getDescriptionLinks - - Get parsed links from description and doc blocks `see` and `link`
    14. -
    15. - getDocBlock - - Get DocBlock for current entity
    16. -
    17. - getDocComment - - Get the doc comment of an entity
    18. -
    19. - getDocCommentEntity - - Link to an entity where docBlock is implemented for this entity
    20. -
    21. - getDocCommentLine - - Get the code line number where the docBlock of the current entity begins
    22. -
    23. - getDocNote - - Get the note annotation value
    24. -
    25. - getEndLine - - Get the line number of the end of a constant's code in a file
    26. -
    27. - getExamples - - Get parsed examples from `examples` doc block
    28. -
    29. - getFileSourceLink -
    30. -
    31. - getFirstExample - - Get first example from `examples` doc block
    32. -
    33. - getImplementingClass - - Get the class like entity in which the current entity was implemented
    34. -
    35. - getImplementingClassName -
    36. -
    37. - getName - - Constant name
    38. -
    39. - getNamespaceName - - Get the name of the namespace where the current class is implemented
    40. -
    41. - getObjectId - - Get entity unique ID
    42. -
    43. - getRelativeFileName - - File name relative to project_root configuration parameter
    44. -
    45. - getRootEntity - - Get the class like entity where this constant was obtained
    46. -
    47. - getRootEntityCollection - - Get the collection of root entities to which this entity belongs
    48. -
    49. - getShortName - - Constant short name
    50. -
    51. - getStartLine - - Get the line number of the beginning of the constant code in a file
    52. -
    53. - getThrows - - Get parsed throws from `throws` doc block
    54. -
    55. - getThrowsDocBlockLinks -
    56. -
    57. - getValue - - Get the compiled value of a constant
    58. -
    59. - hasDescriptionLinks - - Checking if an entity has links in its description
    60. -
    61. - hasExamples - - Checking if an entity has `example` docBlock
    62. -
    63. - hasThrows - - Checking if an entity has `throws` docBlock
    64. -
    65. - isApi - - Checking if an entity has `api` docBlock
    66. -
    67. - isDeprecated - - Checking if an entity has `deprecated` docBlock
    68. -
    69. - isEntityCacheOutdated - - Checking if the entity cache is out of date
    70. -
    71. - isEntityDataCacheOutdated -
    72. -
    73. - isEntityFileCanBeLoad - - Checking if entity data can be retrieved
    74. -
    75. - isInternal - - Checking if an entity has `internal` docBlock
    76. -
    77. - isPrivate - - Check if a constant is a private constant
    78. -
    79. - isProtected - - Check if a constant is a protected constant
    80. -
    81. - isPublic - - Check if a constant is a public constant
    82. -
    83. - reloadEntityDependenciesCache - - Update entity dependency cache
    84. -
    85. - removeEntityValueFromCache -
    86. -
    87. - removeNotUsedEntityDataCache -
    88. -
    - - -

    Constants:

    - - - - - - -

    Method details:

    - -
    - - - -```php -public function __construct(\BumbleDocGen\Core\Configuration\Configuration $configuration, \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity $classEntity, \BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper $parserHelper, \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache $localObjectCache, \Psr\Log\LoggerInterface $logger, string $constantName, string $implementingClassName); -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $configuration\BumbleDocGen\Core\Configuration\Configuration-
    $classEntity\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity-
    $parserHelper\BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper-
    $localObjectCache\BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache-
    $logger\Psr\Log\LoggerInterface-
    $constantNamestring-
    $implementingClassNamestring-
    - - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getAbsoluteFileName(): null|string; -``` - -
    Returns the absolute path to a file if it can be retrieved and if the file is in the project directory
    - -Parameters: not specified - -Return value: null | string - - -Throws: - - -
    -
    -
    - - - -```php -public function getAst(): \PhpParser\Node\Stmt\ClassConst; -``` - -
    Get AST for this entity
    - -Parameters: not specified - -Return value: \PhpParser\Node\Stmt\ClassConst - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait - -public function getCacheKey(): string; -``` - - - -Parameters: not specified - -Return value: string - - -
    -
    -
    - -
      -
    • # - getCachedEntityDependencies - :warning: Is internal | source code
    • -
    - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getCachedEntityDependencies(): array; -``` - - - -Parameters: not specified - -Return value: array - - -Throws: - - -
    -
    -
    - -
      -
    • # - getCurrentRootEntity - :warning: Is internal | source code
    • -
    - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getCurrentRootEntity(): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; -``` - - - -Parameters: not specified - -Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getDescription(): string; -``` - -
    Get entity description
    - -Parameters: not specified - -Return value: string - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getDescriptionLinks(): array; -``` - -
    Get parsed links from description and doc blocks `see` and `link`
    - -Parameters: not specified - -Return value: array - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getDocBlock(): \phpDocumentor\Reflection\DocBlock; -``` - -
    Get DocBlock for current entity
    - -Parameters: not specified - -Return value: \phpDocumentor\Reflection\DocBlock - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getDocComment(): string; -``` - -
    Get the doc comment of an entity
    - -Parameters: not specified - -Return value: string - - -Throws: - - -
    -
    -
    - -
      -
    • # - getDocCommentEntity - :warning: Is internal | source code
    • -
    - -```php -public function getDocCommentEntity(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity; -``` - -
    Link to an entity where docBlock is implemented for this entity
    - -Parameters: not specified - -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getDocCommentLine(): null|int; -``` - -
    Get the code line number where the docBlock of the current entity begins
    - -Parameters: not specified - -Return value: null | int - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getDocNote(): string; -``` - -
    Get the note annotation value
    - -Parameters: not specified - -Return value: string - - -Throws: - - -
    -
    -
    - - - -```php -public function getEndLine(): int; -``` - -
    Get the line number of the end of a constant's code in a file
    - -Parameters: not specified - -Return value: int - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getExamples(): array; -``` - -
    Get parsed examples from `examples` doc block
    - -Parameters: not specified - -Return value: array - - -Throws: - - -
    -
    -
    - -
      -
    • # - getFileSourceLink - :warning: Is internal | source code
    • -
    - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getFileSourceLink(bool $withLine = true): null|string; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $withLinebool-
    - -Return value: null | string - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getFirstExample(): string; -``` - -
    Get first example from `examples` doc block
    - -Parameters: not specified - -Return value: string - - -Throws: - - -
    -
    -
    - - - -```php -public function getImplementingClass(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; -``` - -
    Get the class like entity in which the current entity was implemented
    - -Parameters: not specified - -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - - -
    -
    -
    - - - -```php -public function getImplementingClassName(): string; -``` - - - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -public function getName(): string; -``` - -
    Constant name
    - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -public function getNamespaceName(): string; -``` - -
    Get the name of the namespace where the current class is implemented
    - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getObjectId(): string; -``` - -
    Get entity unique ID
    - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getRelativeFileName(): null|string; -``` - -
    File name relative to project_root configuration parameter
    - -Parameters: not specified - -Return value: null | string - - - -See: - -
    -
    -
    - - - -```php -public function getRootEntity(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; -``` - -
    Get the class like entity where this constant was obtained
    - -Parameters: not specified - -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - - -
    -
    -
    - - - -```php -public function getRootEntityCollection(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; -``` - -
    Get the collection of root entities to which this entity belongs
    - -Parameters: not specified - -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection - - -
    -
    -
    - - - -```php -public function getShortName(): string; -``` - -
    Constant short name
    - -Parameters: not specified - -Return value: string - - - -See: - -
    -
    -
    - - - -```php -public function getStartLine(): int; -``` - -
    Get the line number of the beginning of the constant code in a file
    - -Parameters: not specified - -Return value: int - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getThrows(): array; -``` - -
    Get parsed throws from `throws` doc block
    - -Parameters: not specified - -Return value: array - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getThrowsDocBlockLinks(): array; -``` - - - -Parameters: not specified - -Return value: array - - -Throws: - - -
    -
    -
    - - - -```php -public function getValue(): string|array|int|bool|null|float; -``` - -
    Get the compiled value of a constant
    - -Parameters: not specified - -Return value: string | array | int | bool | null | float - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function hasDescriptionLinks(): bool; -``` - -
    Checking if an entity has links in its description
    - -Parameters: not specified - -Return value: bool - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function hasExamples(): bool; -``` - -
    Checking if an entity has `example` docBlock
    - -Parameters: not specified - -Return value: bool - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function hasThrows(): bool; -``` - -
    Checking if an entity has `throws` docBlock
    - -Parameters: not specified - -Return value: bool - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function isApi(): bool; -``` - -
    Checking if an entity has `api` docBlock
    - -Parameters: not specified - -Return value: bool - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function isDeprecated(): bool; -``` - -
    Checking if an entity has `deprecated` docBlock
    - -Parameters: not specified - -Return value: bool - - -Throws: - - -
    -
    -
    - -
      -
    • # - isEntityCacheOutdated - :warning: Is internal | source code
    • -
    - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function isEntityCacheOutdated(): bool; -``` - -
    Checking if the entity cache is out of date
    - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - -
      -
    • # - isEntityDataCacheOutdated - :warning: Is internal | source code
    • -
    - -```php -// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait - -public function isEntityDataCacheOutdated(): bool; -``` - - - -Parameters: not specified - -Return value: bool - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function isEntityFileCanBeLoad(): bool; -``` - -
    Checking if entity data can be retrieved
    - -Parameters: not specified - -Return value: bool - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function isInternal(): bool; -``` - -
    Checking if an entity has `internal` docBlock
    - -Parameters: not specified - -Return value: bool - - -Throws: - - -
    -
    -
    - - - -```php -public function isPrivate(): bool; -``` - -
    Check if a constant is a private constant
    - -Parameters: not specified - -Return value: bool - - -Throws: - - -
    -
    -
    - - - -```php -public function isProtected(): bool; -``` - -
    Check if a constant is a protected constant
    - -Parameters: not specified - -Return value: bool - - -Throws: - - -
    -
    -
    - - - -```php -public function isPublic(): bool; -``` - -
    Check if a constant is a public constant
    - -Parameters: not specified - -Return value: bool - - -Throws: - - -
    -
    -
    - -
      -
    • # - reloadEntityDependenciesCache - :warning: Is internal | source code
    • -
    - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function reloadEntityDependenciesCache(): array; -``` - -
    Update entity dependency cache
    - -Parameters: not specified - -Return value: array - - -
    -
    -
    - -
      -
    • # - removeEntityValueFromCache - :warning: Is internal | source code
    • -
    - -```php -// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait - -public function removeEntityValueFromCache(string $key): void; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $keystring-
    - -Return value: void - - -
    -
    -
    - -
      -
    • # - removeNotUsedEntityDataCache - :warning: Is internal | source code
    • -
    - -```php -// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait - -public function removeNotUsedEntityDataCache(): void; -``` - - - -Parameters: not specified - -Return value: void - - -Throws: - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md b/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md deleted file mode 100644 index bccd53d5..00000000 --- a/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md +++ /dev/null @@ -1,3466 +0,0 @@ - - BumbleDocGen / Technical description of the project / Parser / Reflection API / Reflection API for PHP / PHP class reflection API / ClassEntity
    - -

    - ClassEntity class: -

    - - - - - -```php -namespace BumbleDocGen\LanguageHandler\Php\Parser\Entity; - -class ClassEntity extends \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity implements \BumbleDocGen\Core\Renderer\Context\DocumentTransformableEntityInterface, \BumbleDocGen\Core\Parser\Entity\RootEntityInterface, \BumbleDocGen\Core\Parser\Entity\EntityInterface, \BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityInterface -``` - -
    PHP Class
    - -See: - - - - - - - -

    Initialization methods:

    - -
      -
    1. - __construct -
    2. -
    - -

    Methods:

    - -
      -
    1. - addPluginData - - Add information to aт entity object
    2. -
    3. - cursorToDocAttributeLinkFragment -
    4. -
    5. - getAbsoluteFileName - - Returns the absolute path to a file if it can be retrieved and if the file is in the project directory
    6. -
    7. - getAst - - Get AST for this entity
    8. -
    9. - getCacheKey -
    10. -
    11. - getCachedEntityDependencies -
    12. -
    13. - getConstant - - Get the method entity by its name
    14. -
    15. - getConstantEntitiesCollection - - Get a collection of constant entities
    16. -
    17. - getConstantValue - - Get the compiled value of a constant
    18. -
    19. - getConstants - - Get all constants that are available according to the configuration as an array
    20. -
    21. - getConstantsData - - Get a list of all constants and classes where they are implemented
    22. -
    23. - getConstantsValues - - Get class constant compiled values according to filters
    24. -
    25. - getCurrentRootEntity -
    26. -
    27. - getDescription - - Get entity description
    28. -
    29. - getDescriptionLinks - - Get parsed links from description and doc blocks `see` and `link`
    30. -
    31. - getDocBlock - - Get DocBlock for current entity
    32. -
    33. - getDocComment - - Get the doc comment of an entity
    34. -
    35. - getDocCommentEntity - - Link to an entity where docBlock is implemented for this entity
    36. -
    37. - getDocCommentLine - - Get the code line number where the docBlock of the current entity begins
    38. -
    39. - getDocNote - - Get the note annotation value
    40. -
    41. - getDocRender -
    42. -
    43. - getEndLine - - Get the line number of the end of a class code in a file
    44. -
    45. - getEntityDependencies -
    46. -
    47. - getExamples - - Get parsed examples from `examples` doc block
    48. -
    49. - getFileContent -
    50. -
    51. - getFileSourceLink -
    52. -
    53. - getFirstExample - - Get first example from `examples` doc block
    54. -
    55. - getImplementingClass - - Get the class like entity in which the current entity was implemented
    56. -
    57. - getInterfaceNames - - Get a list of class interface names
    58. -
    59. - getInterfacesEntities - - Get a list of interface entities that the current class implements
    60. -
    61. - getMethod - - Get the method entity by its name
    62. -
    63. - getMethodEntitiesCollection - - Get a collection of method entities
    64. -
    65. - getMethods - - Get all methods that are available according to the configuration as an array
    66. -
    67. - getMethodsData - - Get a list of all methods and classes where they are implemented
    68. -
    69. - getModifiersString - - Get entity modifiers as a string
    70. -
    71. - getName - - Full name of the entity
    72. -
    73. - getNamespaceName - - Get the entity namespace name
    74. -
    75. - getObjectId - - Get entity unique ID
    76. -
    77. - getParentClass - - Get the entity of the parent class if it exists
    78. -
    79. - getParentClassEntities - - Get a list of parent class entities
    80. -
    81. - getParentClassName - - Get the name of the parent class entity if it exists
    82. -
    83. - getParentClassNames - - Get a list of entity names of parent classes
    84. -
    85. - getPluginData - - Get additional information added using the plugin
    86. -
    87. - getProperties - - Get all properties that are available according to the configuration as an array
    88. -
    89. - getPropertiesData - - Get a list of all properties and classes where they are implemented
    90. -
    91. - getProperty - - Get the property entity by its name
    92. -
    93. - getPropertyDefaultValue - - Get the compiled value of a property
    94. -
    95. - getPropertyEntitiesCollection - - Get a collection of property entities
    96. -
    97. - getRelativeFileName - - File name relative to project_root configuration parameter
    98. -
    99. - getRootEntityCollection - - Get the collection of root entities to which this entity belongs
    100. -
    101. - getShortName - - Short name of the entity
    102. -
    103. - getStartLine - - Get the line number of the start of a class code in a file
    104. -
    105. - getThrows - - Get parsed throws from `throws` doc block
    106. -
    107. - getThrowsDocBlockLinks -
    108. -
    109. - getTraits - - Get a list of trait entities of the current class
    110. -
    111. - getTraitsNames - - Get a list of class traits names
    112. -
    113. - hasConstant - - Check if a constant exists in a class
    114. -
    115. - hasDescriptionLinks - - Checking if an entity has links in its description
    116. -
    117. - hasExamples - - Checking if an entity has `example` docBlock
    118. -
    119. - hasMethod - - Check if a method exists in a class
    120. -
    121. - hasParentClass - - Check if a certain parent class exists in a chain of parent classes
    122. -
    123. - hasProperty - - Check if a property exists in a class
    124. -
    125. - hasThrows - - Checking if an entity has `throws` docBlock
    126. -
    127. - hasTraits - - Check if the class contains traits
    128. -
    129. - implementsInterface - - Check if a class implements an interface
    130. -
    131. - isAbstract - - Check that an entity is abstract
    132. -
    133. - isApi - - Checking if an entity has `api` docBlock
    134. -
    135. - isAttribute - - Check if a class is an attribute
    136. -
    137. - isClass - - Check if an entity is a Class
    138. -
    139. - isClassLoad -
    140. -
    141. - isDeprecated - - Checking if an entity has `deprecated` docBlock
    142. -
    143. - isDocumentCreationAllowed -
    144. -
    145. - isEntityCacheOutdated - - Checking if the entity cache is out of date
    146. -
    147. - isEntityDataCacheOutdated -
    148. -
    149. - isEntityDataCanBeLoaded -
    150. -
    151. - isEntityFileCanBeLoad - - Checking if entity data can be retrieved
    152. -
    153. - isEntityNameValid - - Check if the name is a valid name for ClassLikeEntity
    154. -
    155. - isEnum - - Check if an entity is an Enum
    156. -
    157. - isExternalLibraryEntity - - Check if a given entity is an entity from a third party library (connected via composer)
    158. -
    159. - isInGit - - Checking if class file is in git repository
    160. -
    161. - isInstantiable - - Check that an entity is instantiable
    162. -
    163. - isInterface - - Check if an entity is an Interface
    164. -
    165. - isInternal - - Checking if an entity has `internal` docBlock
    166. -
    167. - isSubclassOf - - Whether the given class is a subclass of the specified class
    168. -
    169. - isTrait - - Check if an entity is a Trait
    170. -
    171. - normalizeClassName - - Bring the class name to the standard format used in the system
    172. -
    173. - reloadEntityDependenciesCache - - Update entity dependency cache
    174. -
    175. - removeEntityValueFromCache -
    176. -
    177. - removeNotUsedEntityDataCache -
    178. -
    179. - setCustomAst -
    180. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function __construct(\BumbleDocGen\Core\Configuration\Configuration $configuration, \BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings $phpHandlerSettings, \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection $entitiesCollection, \BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper $parserHelper, \BumbleDocGen\LanguageHandler\Php\Parser\ComposerHelper $composerHelper, \BumbleDocGen\LanguageHandler\Php\Parser\PhpParser\PhpParserHelper $phpParserHelper, \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache $localObjectCache, \Psr\Log\LoggerInterface $logger, string $className, string|null $relativeFileName); -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $configuration\BumbleDocGen\Core\Configuration\Configuration-
    $phpHandlerSettings\BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings-
    $entitiesCollection\BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection-
    $parserHelper\BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper-
    $composerHelper\BumbleDocGen\LanguageHandler\Php\Parser\ComposerHelper-
    $phpParserHelper\BumbleDocGen\LanguageHandler\Php\Parser\PhpParser\PhpParserHelper-
    $localObjectCache\BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache-
    $logger\Psr\Log\LoggerInterface-
    $classNamestring-
    $relativeFileNamestring | null-
    - - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function addPluginData(string $pluginKey, mixed $data): void; -``` - -
    Add information to aт entity object
    - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $pluginKeystring-
    $datamixed-
    - -Return value: void - - -
    -
    -
    - -
      -
    • # - cursorToDocAttributeLinkFragment - :warning: Is internal | source code
    • -
    - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function cursorToDocAttributeLinkFragment(string $cursor, bool $isForDocument = true): string; -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $cursorstring-
    $isForDocumentbool-
    - -Return value: string - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getAbsoluteFileName(): null|string; -``` - -
    Returns the absolute path to a file if it can be retrieved and if the file is in the project directory
    - -Parameters: not specified - -Return value: null | string - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getAst(): \PhpParser\Node\Stmt\Class_|\PhpParser\Node\Stmt\Interface_|\PhpParser\Node\Stmt\Trait_|\PhpParser\Node\Stmt\Enum_; -``` - -
    Get AST for this entity
    - -Parameters: not specified - -Return value: \PhpParser\Node\Stmt\Class_ | \PhpParser\Node\Stmt\Interface_ | \PhpParser\Node\Stmt\Trait_ | \PhpParser\Node\Stmt\Enum_ - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait - -public function getCacheKey(): string; -``` - - - -Parameters: not specified - -Return value: string - - -
    -
    -
    - -
      -
    • # - getCachedEntityDependencies - :warning: Is internal | source code
    • -
    - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getCachedEntityDependencies(): array; -``` - - - -Parameters: not specified - -Return value: array - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getConstant(string $constantName, bool $unsafe = false): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity; -``` - -
    Get the method entity by its name
    - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $constantNamestringThe name of the constant whose entity you want to get
    $unsafeboolCheck all constants, not just the constants allowed in the configuration (@see PhpHandlerSettings::getClassConstantEntityFilter())
    - -Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getConstantEntitiesCollection(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntitiesCollection; -``` - -
    Get a collection of constant entities
    - -Parameters: not specified - -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntitiesCollection - - -Throws: - - - -See: - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getConstantValue(string $constantName): string|array|int|bool|null|float; -``` - -
    Get the compiled value of a constant
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $constantNamestringThe name of the constant for which you need to get the value
    - -Return value: string | array | int | bool | null | float - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getConstants(): array; -``` - -
    Get all constants that are available according to the configuration as an array
    - -Parameters: not specified - -Return value: array - - -Throws: - - - -See: - -
    -
    -
    - -
      -
    • # - getConstantsData - :warning: Is internal | source code
    • -
    - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getConstantsData(bool $onlyFromCurrentClassAndTraits = false, int $flags = \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity::VISIBILITY_MODIFIERS_FLAG_ANY): array; -``` - -
    Get a list of all constants and classes where they are implemented
    - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $onlyFromCurrentClassAndTraitsboolGet data only for constants from the current class
    $flagsintGet data only for constants corresponding to the visibility modifiers passed in this value
    - -Return value: array - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getConstantsValues(bool $onlyFromCurrentClassAndTraits = false, int $flags = \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity::VISIBILITY_MODIFIERS_FLAG_ANY): array; -``` - -
    Get class constant compiled values according to filters
    - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $onlyFromCurrentClassAndTraitsboolGet values only for constants from the current class
    $flagsintGet values only for constants corresponding to the visibility modifiers passed in this value
    - -Return value: array - - -Throws: - - -
    -
    -
    - -
      -
    • # - getCurrentRootEntity - :warning: Is internal | source code
    • -
    - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getCurrentRootEntity(): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; -``` - - - -Parameters: not specified - -Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getDescription(): string; -``` - -
    Get entity description
    - -Parameters: not specified - -Return value: string - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getDescriptionLinks(): array; -``` - -
    Get parsed links from description and doc blocks `see` and `link`
    - -Parameters: not specified - -Return value: array - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getDocBlock(): \phpDocumentor\Reflection\DocBlock; -``` - -
    Get DocBlock for current entity
    - -Parameters: not specified - -Return value: \phpDocumentor\Reflection\DocBlock - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getDocComment(): string; -``` - -
    Get the doc comment of an entity
    - -Parameters: not specified - -Return value: string - - -Throws: - - -
    -
    -
    - -
      -
    • # - getDocCommentEntity - :warning: Is internal | source code
    • -
    - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getDocCommentEntity(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; -``` - -
    Link to an entity where docBlock is implemented for this entity
    - -Parameters: not specified - -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getDocCommentLine(): null|int; -``` - -
    Get the code line number where the docBlock of the current entity begins
    - -Parameters: not specified - -Return value: null | int - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getDocNote(): string; -``` - -
    Get the note annotation value
    - -Parameters: not specified - -Return value: string - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getDocRender(): \BumbleDocGen\Core\Renderer\EntityDocRenderer\EntityDocRendererInterface; -``` - - - -Parameters: not specified - -Return value: \BumbleDocGen\Core\Renderer\EntityDocRenderer\EntityDocRendererInterface - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getEndLine(): int; -``` - -
    Get the line number of the end of a class code in a file
    - -Parameters: not specified - -Return value: int - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getEntityDependencies(): array; -``` - - - -Parameters: not specified - -Return value: array - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getExamples(): array; -``` - -
    Get parsed examples from `examples` doc block
    - -Parameters: not specified - -Return value: array - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getFileContent(): string; -``` - - - -Parameters: not specified - -Return value: string - - -Throws: - - -
    -
    -
    - -
      -
    • # - getFileSourceLink - :warning: Is internal | source code
    • -
    - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getFileSourceLink(bool $withLine = true): null|string; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $withLinebool-
    - -Return value: null | string - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getFirstExample(): string; -``` - -
    Get first example from `examples` doc block
    - -Parameters: not specified - -Return value: string - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getImplementingClass(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; -``` - -
    Get the class like entity in which the current entity was implemented
    - -Parameters: not specified - -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getInterfaceNames(): array; -``` - -
    Get a list of class interface names
    - -Parameters: not specified - -Return value: array - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getInterfacesEntities(): array; -``` - -
    Get a list of interface entities that the current class implements
    - -Parameters: not specified - -Return value: array - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getMethod(string $methodName, bool $unsafe = false): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntity; -``` - -
    Get the method entity by its name
    - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $methodNamestringThe name of the method whose entity you want to get
    $unsafeboolCheck all methods, not just the methods allowed in the configuration (@see PhpHandlerSettings::getMethodEntityFilter())
    - -Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntity - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getMethodEntitiesCollection(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntitiesCollection; -``` - -
    Get a collection of method entities
    - -Parameters: not specified - -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntitiesCollection - - -Throws: - - - -See: - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getMethods(): array; -``` - -
    Get all methods that are available according to the configuration as an array
    - -Parameters: not specified - -Return value: array - - -Throws: - - - -See: - -
    -
    -
    - -
      -
    • # - getMethodsData - :warning: Is internal | source code
    • -
    - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getMethodsData(bool $onlyFromCurrentClassAndTraits = false, int $flags = \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntity::VISIBILITY_MODIFIERS_FLAG_ANY): array; -``` - -
    Get a list of all methods and classes where they are implemented
    - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $onlyFromCurrentClassAndTraitsboolGet data only for methods from the current class
    $flagsintGet data only for methods corresponding to the visibility modifiers passed in this value
    - -Return value: array - - -Throws: - - -
    -
    -
    - - - -```php -public function getModifiersString(): string; -``` - -
    Get entity modifiers as a string
    - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getName(): string; -``` - -
    Full name of the entity
    - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getNamespaceName(): string; -``` - -
    Get the entity namespace name
    - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getObjectId(): string; -``` - -
    Get entity unique ID
    - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -public function getParentClass(): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; -``` - -
    Get the entity of the parent class if it exists
    - -Parameters: not specified - -Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getParentClassEntities(): array; -``` - -
    Get a list of parent class entities
    - -Parameters: not specified - -Return value: array - - -
    -
    -
    - - - -```php -public function getParentClassName(): null|string; -``` - -
    Get the name of the parent class entity if it exists
    - -Parameters: not specified - -Return value: null | string - - -
    -
    -
    - - - -```php -public function getParentClassNames(): array; -``` - -
    Get a list of entity names of parent classes
    - -Parameters: not specified - -Return value: array - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getPluginData(string $pluginKey): mixed; -``` - -
    Get additional information added using the plugin
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $pluginKeystring-
    - -Return value: mixed - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getProperties(): array; -``` - -
    Get all properties that are available according to the configuration as an array
    - -Parameters: not specified - -Return value: array - - -Throws: - - - -See: - -
    -
    -
    - -
      -
    • # - getPropertiesData - :warning: Is internal | source code
    • -
    - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getPropertiesData(bool $onlyFromCurrentClassAndTraits = false, int $flags = \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntity::VISIBILITY_MODIFIERS_FLAG_ANY): array; -``` - -
    Get a list of all properties and classes where they are implemented
    - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $onlyFromCurrentClassAndTraitsboolGet data only for properties from the current class
    $flagsintGet data only for properties corresponding to the visibility modifiers passed in this value
    - -Return value: array - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getProperty(string $propertyName, bool $unsafe = false): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntity; -``` - -
    Get the property entity by its name
    - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $propertyNamestringThe name of the property whose entity you want to get
    $unsafeboolCheck all properties, not just the properties allowed in the configuration (@see PhpHandlerSettings::getPropertyEntityFilter())
    - -Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntity - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getPropertyDefaultValue(string $propertyName): string|array|int|bool|null|float; -``` - -
    Get the compiled value of a property
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $propertyNamestringThe name of the property for which you need to get the value
    - -Return value: string | array | int | bool | null | float - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getPropertyEntitiesCollection(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntitiesCollection; -``` - -
    Get a collection of property entities
    - -Parameters: not specified - -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntitiesCollection - - -Throws: - - - -See: - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getRelativeFileName(): null|string; -``` - -
    File name relative to project_root configuration parameter
    - -Parameters: not specified - -Return value: null | string - - - -See: - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getRootEntityCollection(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; -``` - -
    Get the collection of root entities to which this entity belongs
    - -Parameters: not specified - -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getShortName(): string; -``` - -
    Short name of the entity
    - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getStartLine(): int; -``` - -
    Get the line number of the start of a class code in a file
    - -Parameters: not specified - -Return value: int - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getThrows(): array; -``` - -
    Get parsed throws from `throws` doc block
    - -Parameters: not specified - -Return value: array - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getThrowsDocBlockLinks(): array; -``` - - - -Parameters: not specified - -Return value: array - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getTraits(): array; -``` - -
    Get a list of trait entities of the current class
    - -Parameters: not specified - -Return value: array - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getTraitsNames(): array; -``` - -
    Get a list of class traits names
    - -Parameters: not specified - -Return value: array - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function hasConstant(string $constantName, bool $unsafe = false): bool; -``` - -
    Check if a constant exists in a class
    - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $constantNamestringThe name of the class whose entity you want to check
    $unsafeboolCheck all constants, not just the constants allowed in the configuration (@see PhpHandlerSettings::getClassConstantEntityFilter())
    - -Return value: bool - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function hasDescriptionLinks(): bool; -``` - -
    Checking if an entity has links in its description
    - -Parameters: not specified - -Return value: bool - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function hasExamples(): bool; -``` - -
    Checking if an entity has `example` docBlock
    - -Parameters: not specified - -Return value: bool - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function hasMethod(string $methodName, bool $unsafe = false): bool; -``` - -
    Check if a method exists in a class
    - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $methodNamestringThe name of the method whose entity you want to check
    $unsafeboolCheck all methods, not just the methods allowed in the configuration (@see PhpHandlerSettings::getMethodEntityFilter())
    - -Return value: bool - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function hasParentClass(string $parentClassName): bool; -``` - -
    Check if a certain parent class exists in a chain of parent classes
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $parentClassNamestringSearched parent class
    - -Return value: bool - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function hasProperty(string $propertyName, bool $unsafe = false): bool; -``` - -
    Check if a property exists in a class
    - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $propertyNamestringThe name of the property whose entity you want to check
    $unsafeboolCheck all properties, not just the properties allowed in the configuration (@see PhpHandlerSettings::getPropertyEntityFilter())
    - -Return value: bool - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function hasThrows(): bool; -``` - -
    Checking if an entity has `throws` docBlock
    - -Parameters: not specified - -Return value: bool - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function hasTraits(): bool; -``` - -
    Check if the class contains traits
    - -Parameters: not specified - -Return value: bool - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function implementsInterface(string $interfaceName): bool; -``` - -
    Check if a class implements an interface
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $interfaceNamestringName of the required interface in the interface chain
    - -Return value: bool - - -Throws: - - -
    -
    -
    - - - -```php -public function isAbstract(): bool; -``` - -
    Check that an entity is abstract
    - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function isApi(): bool; -``` - -
    Checking if an entity has `api` docBlock
    - -Parameters: not specified - -Return value: bool - - -Throws: - - -
    -
    -
    - - - -```php -public function isAttribute(): bool; -``` - -
    Check if a class is an attribute
    - -Parameters: not specified - -Return value: bool - - -Throws: - - -
    -
    -
    - - - -```php -public function isClass(): bool; -``` - -
    Check if an entity is a Class
    - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function isClassLoad(): bool; -``` - - - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function isDeprecated(): bool; -``` - -
    Checking if an entity has `deprecated` docBlock
    - -Parameters: not specified - -Return value: bool - - -Throws: - - -
    -
    -
    - -
      -
    • # - isDocumentCreationAllowed - :warning: Is internal | source code
    • -
    - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function isDocumentCreationAllowed(): bool; -``` - - - -Parameters: not specified - -Return value: bool - - -Throws: - - -
    -
    -
    - -
      -
    • # - isEntityCacheOutdated - :warning: Is internal | source code
    • -
    - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function isEntityCacheOutdated(): bool; -``` - -
    Checking if the entity cache is out of date
    - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - -
      -
    • # - isEntityDataCacheOutdated - :warning: Is internal | source code
    • -
    - -```php -// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait - -public function isEntityDataCacheOutdated(): bool; -``` - - - -Parameters: not specified - -Return value: bool - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function isEntityDataCanBeLoaded(): bool; -``` - - - -Parameters: not specified - -Return value: bool - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function isEntityFileCanBeLoad(): bool; -``` - -
    Checking if entity data can be retrieved
    - -Parameters: not specified - -Return value: bool - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public static function isEntityNameValid(string $entityName): bool; -``` - -
    Check if the name is a valid name for ClassLikeEntity
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $entityNamestring-
    - -Return value: bool - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function isEnum(): bool; -``` - -
    Check if an entity is an Enum
    - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - -
      -
    • # - isExternalLibraryEntity - :warning: Is internal | source code
    • -
    - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function isExternalLibraryEntity(): bool; -``` - -
    Check if a given entity is an entity from a third party library (connected via composer)
    - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function isInGit(): bool; -``` - -
    Checking if class file is in git repository
    - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - - - -```php -public function isInstantiable(): bool; -``` - -
    Check that an entity is instantiable
    - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function isInterface(): bool; -``` - -
    Check if an entity is an Interface
    - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function isInternal(): bool; -``` - -
    Checking if an entity has `internal` docBlock
    - -Parameters: not specified - -Return value: bool - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function isSubclassOf(string $className): bool; -``` - -
    Whether the given class is a subclass of the specified class
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $classNamestring-
    - -Return value: bool - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function isTrait(): bool; -``` - -
    Check if an entity is a Trait
    - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public static function normalizeClassName(string $name): string; -``` - -
    Bring the class name to the standard format used in the system
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $namestring-
    - -Return value: string - - -
    -
    -
    - -
      -
    • # - reloadEntityDependenciesCache - :warning: Is internal | source code
    • -
    - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function reloadEntityDependenciesCache(): array; -``` - -
    Update entity dependency cache
    - -Parameters: not specified - -Return value: array - - -
    -
    -
    - -
      -
    • # - removeEntityValueFromCache - :warning: Is internal | source code
    • -
    - -```php -// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait - -public function removeEntityValueFromCache(string $key): void; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $keystring-
    - -Return value: void - - -
    -
    -
    - -
      -
    • # - removeNotUsedEntityDataCache - :warning: Is internal | source code
    • -
    - -```php -// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait - -public function removeNotUsedEntityDataCache(): void; -``` - - - -Parameters: not specified - -Return value: void - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function setCustomAst(\PhpParser\Node\Stmt\Trait_|\PhpParser\Node\Stmt\Enum_|\PhpParser\Node\Stmt\Interface_|\PhpParser\Node\Stmt\Class_|null $customAst): void; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $customAst\PhpParser\Node\Stmt\Trait_ | \PhpParser\Node\Stmt\Enum_ | \PhpParser\Node\Stmt\Interface_ | \PhpParser\Node\Stmt\Class_ | null-
    - -Return value: void - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/2.parser/reflectionApi/php/classes/ClassLikeEntity_2.md b/docs/tech/2.parser/reflectionApi/php/classes/ClassLikeEntity_2.md deleted file mode 100644 index d9a4de24..00000000 --- a/docs/tech/2.parser/reflectionApi/php/classes/ClassLikeEntity_2.md +++ /dev/null @@ -1,3317 +0,0 @@ - - BumbleDocGen / Technical description of the project / Parser / Reflection API / Reflection API for PHP / PHP interface reflection API / ClassLikeEntity
    - -

    - ClassLikeEntity class: -

    - - - - - -```php -namespace BumbleDocGen\LanguageHandler\Php\Parser\Entity; - -abstract class ClassLikeEntity extends \BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity implements \BumbleDocGen\Core\Renderer\Context\DocumentTransformableEntityInterface, \BumbleDocGen\Core\Parser\Entity\RootEntityInterface, \BumbleDocGen\Core\Parser\Entity\EntityInterface, \BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityInterface -``` - - - - - - - - -

    Initialization methods:

    - -
      -
    1. - __construct -
    2. -
    - -

    Methods:

    - -
      -
    1. - addPluginData - - Add information to aт entity object
    2. -
    3. - cursorToDocAttributeLinkFragment -
    4. -
    5. - getAbsoluteFileName - - Returns the absolute path to a file if it can be retrieved and if the file is in the project directory
    6. -
    7. - getAst - - Get AST for this entity
    8. -
    9. - getCacheKey -
    10. -
    11. - getCachedEntityDependencies -
    12. -
    13. - getConstant - - Get the method entity by its name
    14. -
    15. - getConstantEntitiesCollection - - Get a collection of constant entities
    16. -
    17. - getConstantValue - - Get the compiled value of a constant
    18. -
    19. - getConstants - - Get all constants that are available according to the configuration as an array
    20. -
    21. - getConstantsData - - Get a list of all constants and classes where they are implemented
    22. -
    23. - getConstantsValues - - Get class constant compiled values according to filters
    24. -
    25. - getCurrentRootEntity -
    26. -
    27. - getDescription - - Get entity description
    28. -
    29. - getDescriptionLinks - - Get parsed links from description and doc blocks `see` and `link`
    30. -
    31. - getDocBlock - - Get DocBlock for current entity
    32. -
    33. - getDocComment - - Get the doc comment of an entity
    34. -
    35. - getDocCommentEntity - - Link to an entity where docBlock is implemented for this entity
    36. -
    37. - getDocCommentLine - - Get the code line number where the docBlock of the current entity begins
    38. -
    39. - getDocNote - - Get the note annotation value
    40. -
    41. - getDocRender -
    42. -
    43. - getEndLine - - Get the line number of the end of a class code in a file
    44. -
    45. - getEntityDependencies -
    46. -
    47. - getExamples - - Get parsed examples from `examples` doc block
    48. -
    49. - getFileContent -
    50. -
    51. - getFileSourceLink -
    52. -
    53. - getFirstExample - - Get first example from `examples` doc block
    54. -
    55. - getImplementingClass - - Get the class like entity in which the current entity was implemented
    56. -
    57. - getInterfaceNames - - Get a list of class interface names
    58. -
    59. - getInterfacesEntities - - Get a list of interface entities that the current class implements
    60. -
    61. - getMethod - - Get the method entity by its name
    62. -
    63. - getMethodEntitiesCollection - - Get a collection of method entities
    64. -
    65. - getMethods - - Get all methods that are available according to the configuration as an array
    66. -
    67. - getMethodsData - - Get a list of all methods and classes where they are implemented
    68. -
    69. - getModifiersString - - Get entity modifiers as a string
    70. -
    71. - getName - - Full name of the entity
    72. -
    73. - getNamespaceName - - Get the entity namespace name
    74. -
    75. - getObjectId - - Get entity unique ID
    76. -
    77. - getParentClass - - Get the entity of the parent class if it exists
    78. -
    79. - getParentClassEntities - - Get a list of parent class entities
    80. -
    81. - getParentClassName - - Get the name of the parent class entity if it exists
    82. -
    83. - getParentClassNames - - Get a list of entity names of parent classes
    84. -
    85. - getPluginData - - Get additional information added using the plugin
    86. -
    87. - getProperties - - Get all properties that are available according to the configuration as an array
    88. -
    89. - getPropertiesData - - Get a list of all properties and classes where they are implemented
    90. -
    91. - getProperty - - Get the property entity by its name
    92. -
    93. - getPropertyDefaultValue - - Get the compiled value of a property
    94. -
    95. - getPropertyEntitiesCollection - - Get a collection of property entities
    96. -
    97. - getRelativeFileName - - File name relative to project_root configuration parameter
    98. -
    99. - getRootEntityCollection - - Get the collection of root entities to which this entity belongs
    100. -
    101. - getShortName - - Short name of the entity
    102. -
    103. - getStartLine - - Get the line number of the start of a class code in a file
    104. -
    105. - getThrows - - Get parsed throws from `throws` doc block
    106. -
    107. - getThrowsDocBlockLinks -
    108. -
    109. - getTraits - - Get a list of trait entities of the current class
    110. -
    111. - getTraitsNames - - Get a list of class traits names
    112. -
    113. - hasConstant - - Check if a constant exists in a class
    114. -
    115. - hasDescriptionLinks - - Checking if an entity has links in its description
    116. -
    117. - hasExamples - - Checking if an entity has `example` docBlock
    118. -
    119. - hasMethod - - Check if a method exists in a class
    120. -
    121. - hasParentClass - - Check if a certain parent class exists in a chain of parent classes
    122. -
    123. - hasProperty - - Check if a property exists in a class
    124. -
    125. - hasThrows - - Checking if an entity has `throws` docBlock
    126. -
    127. - hasTraits - - Check if the class contains traits
    128. -
    129. - implementsInterface - - Check if a class implements an interface
    130. -
    131. - isAbstract - - Check that an entity is abstract
    132. -
    133. - isApi - - Checking if an entity has `api` docBlock
    134. -
    135. - isClass - - Check if an entity is a Class
    136. -
    137. - isClassLoad -
    138. -
    139. - isDeprecated - - Checking if an entity has `deprecated` docBlock
    140. -
    141. - isDocumentCreationAllowed -
    142. -
    143. - isEntityCacheOutdated - - Checking if the entity cache is out of date
    144. -
    145. - isEntityDataCacheOutdated -
    146. -
    147. - isEntityDataCanBeLoaded -
    148. -
    149. - isEntityFileCanBeLoad - - Checking if entity data can be retrieved
    150. -
    151. - isEntityNameValid - - Check if the name is a valid name for ClassLikeEntity
    152. -
    153. - isEnum - - Check if an entity is an Enum
    154. -
    155. - isExternalLibraryEntity - - Check if a given entity is an entity from a third party library (connected via composer)
    156. -
    157. - isInGit - - Checking if class file is in git repository
    158. -
    159. - isInstantiable - - Check that an entity is instantiable
    160. -
    161. - isInterface - - Check if an entity is an Interface
    162. -
    163. - isInternal - - Checking if an entity has `internal` docBlock
    164. -
    165. - isSubclassOf - - Whether the given class is a subclass of the specified class
    166. -
    167. - isTrait - - Check if an entity is a Trait
    168. -
    169. - normalizeClassName - - Bring the class name to the standard format used in the system
    170. -
    171. - reloadEntityDependenciesCache - - Update entity dependency cache
    172. -
    173. - removeEntityValueFromCache -
    174. -
    175. - removeNotUsedEntityDataCache -
    176. -
    177. - setCustomAst -
    178. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public function __construct(\BumbleDocGen\Core\Configuration\Configuration $configuration, \BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings $phpHandlerSettings, \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection $entitiesCollection, \BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper $parserHelper, \BumbleDocGen\LanguageHandler\Php\Parser\ComposerHelper $composerHelper, \BumbleDocGen\LanguageHandler\Php\Parser\PhpParser\PhpParserHelper $phpParserHelper, \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache $localObjectCache, \Psr\Log\LoggerInterface $logger, string $className, string|null $relativeFileName); -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $configuration\BumbleDocGen\Core\Configuration\Configuration-
    $phpHandlerSettings\BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings-
    $entitiesCollection\BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection-
    $parserHelper\BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper-
    $composerHelper\BumbleDocGen\LanguageHandler\Php\Parser\ComposerHelper-
    $phpParserHelper\BumbleDocGen\LanguageHandler\Php\Parser\PhpParser\PhpParserHelper-
    $localObjectCache\BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache-
    $logger\Psr\Log\LoggerInterface-
    $classNamestring-
    $relativeFileNamestring | null-
    - - - -
    -
    -
    - - - -```php -public function addPluginData(string $pluginKey, mixed $data): void; -``` - -
    Add information to aт entity object
    - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $pluginKeystring-
    $datamixed-
    - -Return value: void - - -
    -
    -
    - -
      -
    • # - cursorToDocAttributeLinkFragment - :warning: Is internal | source code
    • -
    - -```php -public function cursorToDocAttributeLinkFragment(string $cursor, bool $isForDocument = true): string; -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $cursorstring-
    $isForDocumentbool-
    - -Return value: string - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getAbsoluteFileName(): null|string; -``` - -
    Returns the absolute path to a file if it can be retrieved and if the file is in the project directory
    - -Parameters: not specified - -Return value: null | string - - -Throws: - - -
    -
    -
    - - - -```php -public function getAst(): \PhpParser\Node\Stmt\Class_|\PhpParser\Node\Stmt\Interface_|\PhpParser\Node\Stmt\Trait_|\PhpParser\Node\Stmt\Enum_; -``` - -
    Get AST for this entity
    - -Parameters: not specified - -Return value: \PhpParser\Node\Stmt\Class_ | \PhpParser\Node\Stmt\Interface_ | \PhpParser\Node\Stmt\Trait_ | \PhpParser\Node\Stmt\Enum_ - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait - -public function getCacheKey(): string; -``` - - - -Parameters: not specified - -Return value: string - - -
    -
    -
    - -
      -
    • # - getCachedEntityDependencies - :warning: Is internal | source code
    • -
    - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getCachedEntityDependencies(): array; -``` - - - -Parameters: not specified - -Return value: array - - -Throws: - - -
    -
    -
    - - - -```php -public function getConstant(string $constantName, bool $unsafe = false): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity; -``` - -
    Get the method entity by its name
    - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $constantNamestringThe name of the constant whose entity you want to get
    $unsafeboolCheck all constants, not just the constants allowed in the configuration (@see PhpHandlerSettings::getClassConstantEntityFilter())
    - -Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity - - -Throws: - - -
    -
    -
    - - - -```php -public function getConstantEntitiesCollection(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntitiesCollection; -``` - -
    Get a collection of constant entities
    - -Parameters: not specified - -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntitiesCollection - - -Throws: - - - -See: - -
    -
    -
    - - - -```php -public function getConstantValue(string $constantName): string|array|int|bool|null|float; -``` - -
    Get the compiled value of a constant
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $constantNamestringThe name of the constant for which you need to get the value
    - -Return value: string | array | int | bool | null | float - - -Throws: - - -
    -
    -
    - - - -```php -public function getConstants(): array; -``` - -
    Get all constants that are available according to the configuration as an array
    - -Parameters: not specified - -Return value: array - - -Throws: - - - -See: - -
    -
    -
    - -
      -
    • # - getConstantsData - :warning: Is internal | source code
    • -
    - -```php -public function getConstantsData(bool $onlyFromCurrentClassAndTraits = false, int $flags = \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity::VISIBILITY_MODIFIERS_FLAG_ANY): array; -``` - -
    Get a list of all constants and classes where they are implemented
    - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $onlyFromCurrentClassAndTraitsboolGet data only for constants from the current class
    $flagsintGet data only for constants corresponding to the visibility modifiers passed in this value
    - -Return value: array - - -Throws: - - -
    -
    -
    - - - -```php -public function getConstantsValues(bool $onlyFromCurrentClassAndTraits = false, int $flags = \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity::VISIBILITY_MODIFIERS_FLAG_ANY): array; -``` - -
    Get class constant compiled values according to filters
    - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $onlyFromCurrentClassAndTraitsboolGet values only for constants from the current class
    $flagsintGet values only for constants corresponding to the visibility modifiers passed in this value
    - -Return value: array - - -Throws: - - -
    -
    -
    - -
      -
    • # - getCurrentRootEntity - :warning: Is internal | source code
    • -
    - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getCurrentRootEntity(): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; -``` - - - -Parameters: not specified - -Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getDescription(): string; -``` - -
    Get entity description
    - -Parameters: not specified - -Return value: string - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getDescriptionLinks(): array; -``` - -
    Get parsed links from description and doc blocks `see` and `link`
    - -Parameters: not specified - -Return value: array - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getDocBlock(): \phpDocumentor\Reflection\DocBlock; -``` - -
    Get DocBlock for current entity
    - -Parameters: not specified - -Return value: \phpDocumentor\Reflection\DocBlock - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getDocComment(): string; -``` - -
    Get the doc comment of an entity
    - -Parameters: not specified - -Return value: string - - -Throws: - - -
    -
    -
    - -
      -
    • # - getDocCommentEntity - :warning: Is internal | source code
    • -
    - -```php -public function getDocCommentEntity(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; -``` - -
    Link to an entity where docBlock is implemented for this entity
    - -Parameters: not specified - -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getDocCommentLine(): null|int; -``` - -
    Get the code line number where the docBlock of the current entity begins
    - -Parameters: not specified - -Return value: null | int - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getDocNote(): string; -``` - -
    Get the note annotation value
    - -Parameters: not specified - -Return value: string - - -Throws: - - -
    -
    -
    - - - -```php -public function getDocRender(): \BumbleDocGen\Core\Renderer\EntityDocRenderer\EntityDocRendererInterface; -``` - - - -Parameters: not specified - -Return value: \BumbleDocGen\Core\Renderer\EntityDocRenderer\EntityDocRendererInterface - - -Throws: - - -
    -
    -
    - - - -```php -public function getEndLine(): int; -``` - -
    Get the line number of the end of a class code in a file
    - -Parameters: not specified - -Return value: int - - -Throws: - - -
    -
    -
    - - - -```php -public function getEntityDependencies(): array; -``` - - - -Parameters: not specified - -Return value: array - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getExamples(): array; -``` - -
    Get parsed examples from `examples` doc block
    - -Parameters: not specified - -Return value: array - - -Throws: - - -
    -
    -
    - - - -```php -public function getFileContent(): string; -``` - - - -Parameters: not specified - -Return value: string - - -Throws: - - -
    -
    -
    - -
      -
    • # - getFileSourceLink - :warning: Is internal | source code
    • -
    - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getFileSourceLink(bool $withLine = true): null|string; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $withLinebool-
    - -Return value: null | string - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getFirstExample(): string; -``` - -
    Get first example from `examples` doc block
    - -Parameters: not specified - -Return value: string - - -Throws: - - -
    -
    -
    - - - -```php -public function getImplementingClass(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; -``` - -
    Get the class like entity in which the current entity was implemented
    - -Parameters: not specified - -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - - -
    -
    -
    - - - -```php -public function getInterfaceNames(): array; -``` - -
    Get a list of class interface names
    - -Parameters: not specified - -Return value: array - - -Throws: - - -
    -
    -
    - - - -```php -public function getInterfacesEntities(): array; -``` - -
    Get a list of interface entities that the current class implements
    - -Parameters: not specified - -Return value: array - - -Throws: - - -
    -
    -
    - - - -```php -public function getMethod(string $methodName, bool $unsafe = false): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntity; -``` - -
    Get the method entity by its name
    - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $methodNamestringThe name of the method whose entity you want to get
    $unsafeboolCheck all methods, not just the methods allowed in the configuration (@see PhpHandlerSettings::getMethodEntityFilter())
    - -Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntity - - -Throws: - - -
    -
    -
    - - - -```php -public function getMethodEntitiesCollection(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntitiesCollection; -``` - -
    Get a collection of method entities
    - -Parameters: not specified - -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntitiesCollection - - -Throws: - - - -See: - -
    -
    -
    - - - -```php -public function getMethods(): array; -``` - -
    Get all methods that are available according to the configuration as an array
    - -Parameters: not specified - -Return value: array - - -Throws: - - - -See: - -
    -
    -
    - -
      -
    • # - getMethodsData - :warning: Is internal | source code
    • -
    - -```php -public function getMethodsData(bool $onlyFromCurrentClassAndTraits = false, int $flags = \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntity::VISIBILITY_MODIFIERS_FLAG_ANY): array; -``` - -
    Get a list of all methods and classes where they are implemented
    - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $onlyFromCurrentClassAndTraitsboolGet data only for methods from the current class
    $flagsintGet data only for methods corresponding to the visibility modifiers passed in this value
    - -Return value: array - - -Throws: - - -
    -
    -
    - - - -```php -public function getModifiersString(): string; -``` - -
    Get entity modifiers as a string
    - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -public function getName(): string; -``` - -
    Full name of the entity
    - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -public function getNamespaceName(): string; -``` - -
    Get the entity namespace name
    - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -public function getObjectId(): string; -``` - -
    Get entity unique ID
    - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -public function getParentClass(): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; -``` - -
    Get the entity of the parent class if it exists
    - -Parameters: not specified - -Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - - -
    -
    -
    - - - -```php -public function getParentClassEntities(): array; -``` - -
    Get a list of parent class entities
    - -Parameters: not specified - -Return value: array - - -
    -
    -
    - - - -```php -public function getParentClassName(): null|string; -``` - -
    Get the name of the parent class entity if it exists
    - -Parameters: not specified - -Return value: null | string - - -
    -
    -
    - - - -```php -public function getParentClassNames(): array; -``` - -
    Get a list of entity names of parent classes
    - -Parameters: not specified - -Return value: array - - -
    -
    -
    - - - -```php -public function getPluginData(string $pluginKey): mixed; -``` - -
    Get additional information added using the plugin
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $pluginKeystring-
    - -Return value: mixed - - -
    -
    -
    - - - -```php -public function getProperties(): array; -``` - -
    Get all properties that are available according to the configuration as an array
    - -Parameters: not specified - -Return value: array - - -Throws: - - - -See: - -
    -
    -
    - -
      -
    • # - getPropertiesData - :warning: Is internal | source code
    • -
    - -```php -public function getPropertiesData(bool $onlyFromCurrentClassAndTraits = false, int $flags = \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntity::VISIBILITY_MODIFIERS_FLAG_ANY): array; -``` - -
    Get a list of all properties and classes where they are implemented
    - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $onlyFromCurrentClassAndTraitsboolGet data only for properties from the current class
    $flagsintGet data only for properties corresponding to the visibility modifiers passed in this value
    - -Return value: array - - -Throws: - - -
    -
    -
    - - - -```php -public function getProperty(string $propertyName, bool $unsafe = false): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntity; -``` - -
    Get the property entity by its name
    - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $propertyNamestringThe name of the property whose entity you want to get
    $unsafeboolCheck all properties, not just the properties allowed in the configuration (@see PhpHandlerSettings::getPropertyEntityFilter())
    - -Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntity - - -Throws: - - -
    -
    -
    - - - -```php -public function getPropertyDefaultValue(string $propertyName): string|array|int|bool|null|float; -``` - -
    Get the compiled value of a property
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $propertyNamestringThe name of the property for which you need to get the value
    - -Return value: string | array | int | bool | null | float - - -Throws: - - -
    -
    -
    - - - -```php -public function getPropertyEntitiesCollection(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntitiesCollection; -``` - -
    Get a collection of property entities
    - -Parameters: not specified - -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntitiesCollection - - -Throws: - - - -See: - -
    -
    -
    - - - -```php -public function getRelativeFileName(): null|string; -``` - -
    File name relative to project_root configuration parameter
    - -Parameters: not specified - -Return value: null | string - - - -See: - -
    -
    -
    - - - -```php -public function getRootEntityCollection(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; -``` - -
    Get the collection of root entities to which this entity belongs
    - -Parameters: not specified - -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection - - -
    -
    -
    - - - -```php -public function getShortName(): string; -``` - -
    Short name of the entity
    - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -public function getStartLine(): int; -``` - -
    Get the line number of the start of a class code in a file
    - -Parameters: not specified - -Return value: int - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getThrows(): array; -``` - -
    Get parsed throws from `throws` doc block
    - -Parameters: not specified - -Return value: array - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getThrowsDocBlockLinks(): array; -``` - - - -Parameters: not specified - -Return value: array - - -Throws: - - -
    -
    -
    - - - -```php -public function getTraits(): array; -``` - -
    Get a list of trait entities of the current class
    - -Parameters: not specified - -Return value: array - - -Throws: - - -
    -
    -
    - - - -```php -public function getTraitsNames(): array; -``` - -
    Get a list of class traits names
    - -Parameters: not specified - -Return value: array - - -Throws: - - -
    -
    -
    - - - -```php -public function hasConstant(string $constantName, bool $unsafe = false): bool; -``` - -
    Check if a constant exists in a class
    - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $constantNamestringThe name of the class whose entity you want to check
    $unsafeboolCheck all constants, not just the constants allowed in the configuration (@see PhpHandlerSettings::getClassConstantEntityFilter())
    - -Return value: bool - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function hasDescriptionLinks(): bool; -``` - -
    Checking if an entity has links in its description
    - -Parameters: not specified - -Return value: bool - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function hasExamples(): bool; -``` - -
    Checking if an entity has `example` docBlock
    - -Parameters: not specified - -Return value: bool - - -Throws: - - -
    -
    -
    - - - -```php -public function hasMethod(string $methodName, bool $unsafe = false): bool; -``` - -
    Check if a method exists in a class
    - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $methodNamestringThe name of the method whose entity you want to check
    $unsafeboolCheck all methods, not just the methods allowed in the configuration (@see PhpHandlerSettings::getMethodEntityFilter())
    - -Return value: bool - - -Throws: - - -
    -
    -
    - - - -```php -public function hasParentClass(string $parentClassName): bool; -``` - -
    Check if a certain parent class exists in a chain of parent classes
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $parentClassNamestringSearched parent class
    - -Return value: bool - - -
    -
    -
    - - - -```php -public function hasProperty(string $propertyName, bool $unsafe = false): bool; -``` - -
    Check if a property exists in a class
    - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $propertyNamestringThe name of the property whose entity you want to check
    $unsafeboolCheck all properties, not just the properties allowed in the configuration (@see PhpHandlerSettings::getPropertyEntityFilter())
    - -Return value: bool - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function hasThrows(): bool; -``` - -
    Checking if an entity has `throws` docBlock
    - -Parameters: not specified - -Return value: bool - - -Throws: - - -
    -
    -
    - - - -```php -public function hasTraits(): bool; -``` - -
    Check if the class contains traits
    - -Parameters: not specified - -Return value: bool - - -Throws: - - -
    -
    -
    - - - -```php -public function implementsInterface(string $interfaceName): bool; -``` - -
    Check if a class implements an interface
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $interfaceNamestringName of the required interface in the interface chain
    - -Return value: bool - - -Throws: - - -
    -
    -
    - - - -```php -public function isAbstract(): bool; -``` - -
    Check that an entity is abstract
    - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function isApi(): bool; -``` - -
    Checking if an entity has `api` docBlock
    - -Parameters: not specified - -Return value: bool - - -Throws: - - -
    -
    -
    - - - -```php -public function isClass(): bool; -``` - -
    Check if an entity is a Class
    - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - - - -```php -public function isClassLoad(): bool; -``` - - - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function isDeprecated(): bool; -``` - -
    Checking if an entity has `deprecated` docBlock
    - -Parameters: not specified - -Return value: bool - - -Throws: - - -
    -
    -
    - -
      -
    • # - isDocumentCreationAllowed - :warning: Is internal | source code
    • -
    - -```php -public function isDocumentCreationAllowed(): bool; -``` - - - -Parameters: not specified - -Return value: bool - - -Throws: - - -
    -
    -
    - -
      -
    • # - isEntityCacheOutdated - :warning: Is internal | source code
    • -
    - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function isEntityCacheOutdated(): bool; -``` - -
    Checking if the entity cache is out of date
    - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - -
      -
    • # - isEntityDataCacheOutdated - :warning: Is internal | source code
    • -
    - -```php -// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait - -public function isEntityDataCacheOutdated(): bool; -``` - - - -Parameters: not specified - -Return value: bool - - -Throws: - - -
    -
    -
    - - - -```php -public function isEntityDataCanBeLoaded(): bool; -``` - - - -Parameters: not specified - -Return value: bool - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function isEntityFileCanBeLoad(): bool; -``` - -
    Checking if entity data can be retrieved
    - -Parameters: not specified - -Return value: bool - - -Throws: - - -
    -
    -
    - - - -```php -public static function isEntityNameValid(string $entityName): bool; -``` - -
    Check if the name is a valid name for ClassLikeEntity
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $entityNamestring-
    - -Return value: bool - - -
    -
    -
    - - - -```php -public function isEnum(): bool; -``` - -
    Check if an entity is an Enum
    - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - -
      -
    • # - isExternalLibraryEntity - :warning: Is internal | source code
    • -
    - -```php -public function isExternalLibraryEntity(): bool; -``` - -
    Check if a given entity is an entity from a third party library (connected via composer)
    - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - - - -```php -public function isInGit(): bool; -``` - -
    Checking if class file is in git repository
    - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - - - -```php -public function isInstantiable(): bool; -``` - -
    Check that an entity is instantiable
    - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - - - -```php -public function isInterface(): bool; -``` - -
    Check if an entity is an Interface
    - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function isInternal(): bool; -``` - -
    Checking if an entity has `internal` docBlock
    - -Parameters: not specified - -Return value: bool - - -Throws: - - -
    -
    -
    - - - -```php -public function isSubclassOf(string $className): bool; -``` - -
    Whether the given class is a subclass of the specified class
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $classNamestring-
    - -Return value: bool - - -Throws: - - -
    -
    -
    - - - -```php -public function isTrait(): bool; -``` - -
    Check if an entity is a Trait
    - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - - - -```php -public static function normalizeClassName(string $name): string; -``` - -
    Bring the class name to the standard format used in the system
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $namestring-
    - -Return value: string - - -
    -
    -
    - -
      -
    • # - reloadEntityDependenciesCache - :warning: Is internal | source code
    • -
    - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function reloadEntityDependenciesCache(): array; -``` - -
    Update entity dependency cache
    - -Parameters: not specified - -Return value: array - - -
    -
    -
    - -
      -
    • # - removeEntityValueFromCache - :warning: Is internal | source code
    • -
    - -```php -// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait - -public function removeEntityValueFromCache(string $key): void; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $keystring-
    - -Return value: void - - -
    -
    -
    - -
      -
    • # - removeNotUsedEntityDataCache - :warning: Is internal | source code
    • -
    - -```php -// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait - -public function removeNotUsedEntityDataCache(): void; -``` - - - -Parameters: not specified - -Return value: void - - -Throws: - - -
    -
    -
    - - - -```php -public function setCustomAst(\PhpParser\Node\Stmt\Trait_|\PhpParser\Node\Stmt\Enum_|\PhpParser\Node\Stmt\Interface_|\PhpParser\Node\Stmt\Class_|null $customAst): void; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $customAst\PhpParser\Node\Stmt\Trait_ | \PhpParser\Node\Stmt\Enum_ | \PhpParser\Node\Stmt\Interface_ | \PhpParser\Node\Stmt\Class_ | null-
    - -Return value: void - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/2.parser/reflectionApi/php/classes/InvalidConfigurationParameterException.md b/docs/tech/2.parser/reflectionApi/php/classes/InvalidConfigurationParameterException.md deleted file mode 100644 index e87b8428..00000000 --- a/docs/tech/2.parser/reflectionApi/php/classes/InvalidConfigurationParameterException.md +++ /dev/null @@ -1,34 +0,0 @@ - - BumbleDocGen / Technical description of the project / Parser / Reflection API / Reflection API for PHP / InvalidConfigurationParameterException
    - -

    - InvalidConfigurationParameterException class: -

    - - - - - -```php -namespace BumbleDocGen\Core\Configuration\Exception; - -final class InvalidConfigurationParameterException extends \Exception -``` - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md b/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md deleted file mode 100644 index 3eb71769..00000000 --- a/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md +++ /dev/null @@ -1,1780 +0,0 @@ - - BumbleDocGen / Technical description of the project / Parser / Reflection API / Reflection API for PHP / PHP class method reflection API / MethodEntity
    - -

    - MethodEntity class: -

    - - - - - -```php -namespace BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method; - -class MethodEntity extends \BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity implements \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntityInterface, \BumbleDocGen\Core\Parser\Entity\EntityInterface, \BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityInterface -``` - -
    Class method entity
    - - - - - - -

    Initialization methods:

    - -
      -
    1. - __construct -
    2. -
    - -

    Methods:

    - -
      -
    1. - getAbsoluteFileName - - Returns the absolute path to a file if it can be retrieved and if the file is in the project directory
    2. -
    3. - getAst - - Get AST for this entity
    4. -
    5. - getBodyCode - - Get the code for this method
    6. -
    7. - getCacheKey -
    8. -
    9. - getCachedEntityDependencies -
    10. -
    11. - getCurrentRootEntity -
    12. -
    13. - getDescription - - Get entity description
    14. -
    15. - getDescriptionLinks - - Get parsed links from description and doc blocks `see` and `link`
    16. -
    17. - getDocBlock - - Get DocBlock for current entity
    18. -
    19. - getDocComment - - Get the doc comment of an entity
    20. -
    21. - getDocCommentEntity - - Link to an entity where docBlock is implemented for this entity
    22. -
    23. - getDocCommentLine -
    24. -
    25. - getDocNote - - Get the note annotation value
    26. -
    27. - getEndLine - - Get the line number of the end of a method's code in a file
    28. -
    29. - getExamples - - Get parsed examples from `examples` doc block
    30. -
    31. - getFileSourceLink -
    32. -
    33. - getFirstExample - - Get first example from `examples` doc block
    34. -
    35. - getFirstReturnValue - - Get the compiled first return value of a method (if possible)
    36. -
    37. - getImplementingClass - - Get the class like entity in which the current entity was implemented
    38. -
    39. - getImplementingClassName - - Get the name of the class in which this method is implemented
    40. -
    41. - getModifiersString - - Get a text representation of method modifiers
    42. -
    43. - getName - - Full name of the entity
    44. -
    45. - getNamespaceName - - Namespace of the class that contains this method
    46. -
    47. - getObjectId - - Get entity unique ID
    48. -
    49. - getParameters - - Get a list of method parameters
    50. -
    51. - getParametersString - - Get a list of method parameters as a string
    52. -
    53. - getParentMethod - - Get the parent method for this method
    54. -
    55. - getRelativeFileName - - File name relative to project_root configuration parameter
    56. -
    57. - getReturnType - - Get the return type of method
    58. -
    59. - getRootEntity -
    60. -
    61. - getRootEntityCollection - - Get the collection of root entities to which this entity belongs
    62. -
    63. - getShortName - - Short name of the entity
    64. -
    65. - getSignature - - Get the method signature as a string
    66. -
    67. - getStartColumn - - Get the column number of the beginning of the method code in a file
    68. -
    69. - getStartLine - - Get the line number of the beginning of the entity code in a file
    70. -
    71. - getThrows - - Get parsed throws from `throws` doc block
    72. -
    73. - getThrowsDocBlockLinks -
    74. -
    75. - hasDescriptionLinks - - Checking if an entity has links in its description
    76. -
    77. - hasExamples - - Checking if an entity has `example` docBlock
    78. -
    79. - hasThrows - - Checking if an entity has `throws` docBlock
    80. -
    81. - isApi - - Checking if an entity has `api` docBlock
    82. -
    83. - isConstructor - - Checking that a method is a constructor
    84. -
    85. - isDeprecated - - Checking if an entity has `deprecated` docBlock
    86. -
    87. - isDynamic - - Check if a method is a dynamic method, that is, implementable using __call or __callStatic
    88. -
    89. - isEntityCacheOutdated - - Checking if the entity cache is out of date
    90. -
    91. - isEntityDataCacheOutdated -
    92. -
    93. - isEntityFileCanBeLoad - - Checking if entity data can be retrieved
    94. -
    95. - isImplementedInParentClass - - Check if this method is implemented in the parent class
    96. -
    97. - isInitialization - - Check if a method is an initialization method
    98. -
    99. - isInternal - - Checking if an entity has `internal` docBlock
    100. -
    101. - isPrivate - - Check if a method is a private method
    102. -
    103. - isProtected - - Check if a method is a protected method
    104. -
    105. - isPublic - - Check if a method is a public method
    106. -
    107. - isStatic - - Check if this method is static
    108. -
    109. - reloadEntityDependenciesCache - - Update entity dependency cache
    110. -
    111. - removeEntityValueFromCache -
    112. -
    113. - removeNotUsedEntityDataCache -
    114. -
    - - -

    Constants:

    - - - - - - -

    Method details:

    - -
    - - - -```php -public function __construct(\BumbleDocGen\Core\Configuration\Configuration $configuration, \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity $classEntity, \BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper $parserHelper, \PhpParser\PrettyPrinter\Standard $astPrinter, \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache $localObjectCache, \Psr\Log\LoggerInterface $logger, string $methodName, string $implementingClassName); -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $configuration\BumbleDocGen\Core\Configuration\Configuration-
    $classEntity\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity-
    $parserHelper\BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper-
    $astPrinter\PhpParser\PrettyPrinter\Standard-
    $localObjectCache\BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache-
    $logger\Psr\Log\LoggerInterface-
    $methodNamestring-
    $implementingClassNamestring-
    - - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getAbsoluteFileName(): null|string; -``` - -
    Returns the absolute path to a file if it can be retrieved and if the file is in the project directory
    - -Parameters: not specified - -Return value: null | string - - -Throws: - - -
    -
    -
    - - - -```php -public function getAst(): \PhpParser\Node\Stmt\ClassMethod; -``` - -
    Get AST for this entity
    - -Parameters: not specified - -Return value: \PhpParser\Node\Stmt\ClassMethod - - -Throws: - - -
    -
    -
    - - - -```php -public function getBodyCode(): string; -``` - -
    Get the code for this method
    - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait - -public function getCacheKey(): string; -``` - - - -Parameters: not specified - -Return value: string - - -
    -
    -
    - -
      -
    • # - getCachedEntityDependencies - :warning: Is internal | source code
    • -
    - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getCachedEntityDependencies(): array; -``` - - - -Parameters: not specified - -Return value: array - - -Throws: - - -
    -
    -
    - -
      -
    • # - getCurrentRootEntity - :warning: Is internal | source code
    • -
    - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getCurrentRootEntity(): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; -``` - - - -Parameters: not specified - -Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getDescription(): string; -``` - -
    Get entity description
    - -Parameters: not specified - -Return value: string - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getDescriptionLinks(): array; -``` - -
    Get parsed links from description and doc blocks `see` and `link`
    - -Parameters: not specified - -Return value: array - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getDocBlock(): \phpDocumentor\Reflection\DocBlock; -``` - -
    Get DocBlock for current entity
    - -Parameters: not specified - -Return value: \phpDocumentor\Reflection\DocBlock - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getDocComment(): string; -``` - -
    Get the doc comment of an entity
    - -Parameters: not specified - -Return value: string - - -Throws: - - -
    -
    -
    - -
      -
    • # - getDocCommentEntity - :warning: Is internal | source code
    • -
    - -```php -public function getDocCommentEntity(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntity; -``` - -
    Link to an entity where docBlock is implemented for this entity
    - -Parameters: not specified - -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntity - - -
    -
    -
    - - - -```php -public function getDocCommentLine(): null|int; -``` - - - -Parameters: not specified - -Return value: null | int - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getDocNote(): string; -``` - -
    Get the note annotation value
    - -Parameters: not specified - -Return value: string - - -Throws: - - -
    -
    -
    - - - -```php -public function getEndLine(): int; -``` - -
    Get the line number of the end of a method's code in a file
    - -Parameters: not specified - -Return value: int - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getExamples(): array; -``` - -
    Get parsed examples from `examples` doc block
    - -Parameters: not specified - -Return value: array - - -Throws: - - -
    -
    -
    - -
      -
    • # - getFileSourceLink - :warning: Is internal | source code
    • -
    - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getFileSourceLink(bool $withLine = true): null|string; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $withLinebool-
    - -Return value: null | string - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getFirstExample(): string; -``` - -
    Get first example from `examples` doc block
    - -Parameters: not specified - -Return value: string - - -Throws: - - -
    -
    -
    - - - -```php -public function getFirstReturnValue(): mixed; -``` - -
    Get the compiled first return value of a method (if possible)
    - -Parameters: not specified - -Return value: mixed - - -
    -
    -
    - - - -```php -public function getImplementingClass(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; -``` - -
    Get the class like entity in which the current entity was implemented
    - -Parameters: not specified - -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - - -
    -
    -
    - - - -```php -public function getImplementingClassName(): string; -``` - -
    Get the name of the class in which this method is implemented
    - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -public function getModifiersString(): string; -``` - -
    Get a text representation of method modifiers
    - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -public function getName(): string; -``` - -
    Full name of the entity
    - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -public function getNamespaceName(): string; -``` - -
    Namespace of the class that contains this method
    - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getObjectId(): string; -``` - -
    Get entity unique ID
    - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -public function getParameters(): array; -``` - -
    Get a list of method parameters
    - -Parameters: not specified - -Return value: array - - -
    -
    -
    - - - -```php -public function getParametersString(): string; -``` - -
    Get a list of method parameters as a string
    - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -public function getParentMethod(): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntity; -``` - -
    Get the parent method for this method
    - -Parameters: not specified - -Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntity - - -Throws: - - -
    -
    -
    - - - -```php -public function getRelativeFileName(): null|string; -``` - -
    File name relative to project_root configuration parameter
    - -Parameters: not specified - -Return value: null | string - - - -See: - -
    -
    -
    - - - -```php -public function getReturnType(): string; -``` - -
    Get the return type of method
    - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -public function getRootEntity(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; -``` - - - -Parameters: not specified - -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - - -
    -
    -
    - - - -```php -public function getRootEntityCollection(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; -``` - -
    Get the collection of root entities to which this entity belongs
    - -Parameters: not specified - -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection - - -
    -
    -
    - - - -```php -public function getShortName(): string; -``` - -
    Short name of the entity
    - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -public function getSignature(): string; -``` - -
    Get the method signature as a string
    - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -public function getStartColumn(): int; -``` - -
    Get the column number of the beginning of the method code in a file
    - -Parameters: not specified - -Return value: int - - -
    -
    -
    - - - -```php -public function getStartLine(): int; -``` - -
    Get the line number of the beginning of the entity code in a file
    - -Parameters: not specified - -Return value: int - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getThrows(): array; -``` - -
    Get parsed throws from `throws` doc block
    - -Parameters: not specified - -Return value: array - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getThrowsDocBlockLinks(): array; -``` - - - -Parameters: not specified - -Return value: array - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function hasDescriptionLinks(): bool; -``` - -
    Checking if an entity has links in its description
    - -Parameters: not specified - -Return value: bool - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function hasExamples(): bool; -``` - -
    Checking if an entity has `example` docBlock
    - -Parameters: not specified - -Return value: bool - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function hasThrows(): bool; -``` - -
    Checking if an entity has `throws` docBlock
    - -Parameters: not specified - -Return value: bool - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function isApi(): bool; -``` - -
    Checking if an entity has `api` docBlock
    - -Parameters: not specified - -Return value: bool - - -Throws: - - -
    -
    -
    - - - -```php -public function isConstructor(): bool; -``` - -
    Checking that a method is a constructor
    - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function isDeprecated(): bool; -``` - -
    Checking if an entity has `deprecated` docBlock
    - -Parameters: not specified - -Return value: bool - - -Throws: - - -
    -
    -
    - - - -```php -public function isDynamic(): bool; -``` - -
    Check if a method is a dynamic method, that is, implementable using __call or __callStatic
    - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - -
      -
    • # - isEntityCacheOutdated - :warning: Is internal | source code
    • -
    - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function isEntityCacheOutdated(): bool; -``` - -
    Checking if the entity cache is out of date
    - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - -
      -
    • # - isEntityDataCacheOutdated - :warning: Is internal | source code
    • -
    - -```php -// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait - -public function isEntityDataCacheOutdated(): bool; -``` - - - -Parameters: not specified - -Return value: bool - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function isEntityFileCanBeLoad(): bool; -``` - -
    Checking if entity data can be retrieved
    - -Parameters: not specified - -Return value: bool - - -Throws: - - -
    -
    -
    - - - -```php -public function isImplementedInParentClass(): bool; -``` - -
    Check if this method is implemented in the parent class
    - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - - - -```php -public function isInitialization(): bool; -``` - -
    Check if a method is an initialization method
    - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function isInternal(): bool; -``` - -
    Checking if an entity has `internal` docBlock
    - -Parameters: not specified - -Return value: bool - - -Throws: - - -
    -
    -
    - - - -```php -public function isPrivate(): bool; -``` - -
    Check if a method is a private method
    - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - - - -```php -public function isProtected(): bool; -``` - -
    Check if a method is a protected method
    - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - - - -```php -public function isPublic(): bool; -``` - -
    Check if a method is a public method
    - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - - - -```php -public function isStatic(): bool; -``` - -
    Check if this method is static
    - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - -
      -
    • # - reloadEntityDependenciesCache - :warning: Is internal | source code
    • -
    - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function reloadEntityDependenciesCache(): array; -``` - -
    Update entity dependency cache
    - -Parameters: not specified - -Return value: array - - -
    -
    -
    - -
      -
    • # - removeEntityValueFromCache - :warning: Is internal | source code
    • -
    - -```php -// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait - -public function removeEntityValueFromCache(string $key): void; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $keystring-
    - -Return value: void - - -
    -
    -
    - -
      -
    • # - removeNotUsedEntityDataCache - :warning: Is internal | source code
    • -
    - -```php -// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait - -public function removeNotUsedEntityDataCache(): void; -``` - - - -Parameters: not specified - -Return value: void - - -Throws: - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/2.parser/reflectionApi/php/classes/PhpEntitiesCollection.md b/docs/tech/2.parser/reflectionApi/php/classes/PhpEntitiesCollection.md deleted file mode 100644 index 2107e294..00000000 --- a/docs/tech/2.parser/reflectionApi/php/classes/PhpEntitiesCollection.md +++ /dev/null @@ -1,1183 +0,0 @@ - - BumbleDocGen / Technical description of the project / Parser / Reflection API / Reflection API for PHP / PHP entities collection / PhpEntitiesCollection
    - -

    - PhpEntitiesCollection class: -

    - - - - - -```php -namespace BumbleDocGen\LanguageHandler\Php\Parser\Entity; - -final class PhpEntitiesCollection extends \BumbleDocGen\Core\Parser\Entity\LoggableRootEntityCollection implements \IteratorAggregate -``` - -
    Collection of php root entities
    - - - - - - -

    Initialization methods:

    - -
      -
    1. - __construct -
    2. -
    - -

    Methods:

    - -
      -
    1. - add - - Add an entity to the collection
    2. -
    3. - clearOperationsLogCollection -
    4. -
    5. - filterByInterfaces - - Get a copy of the current collection only with entities filtered by interfaces names (filtering is only available for ClassLikeEntity)
    6. -
    7. - filterByNameRegularExpression - - Get a copy of the current collection with only entities whose names match the regular expression
    8. -
    9. - filterByParentClassNames - - Get a copy of the current collection only with entities filtered by parent classes names (filtering is only available for ClassLikeEntity)
    10. -
    11. - filterByPaths - - Get a copy of the current collection only with entities filtered by file paths (from project_root)
    12. -
    13. - findEntity - - Find an entity in a collection
    14. -
    15. - get - - Get an entity from a collection (only previously added)
    16. -
    17. - getEntityCollectionName - - Get collection name
    18. -
    19. - getEntityLinkData -
    20. -
    21. - getIterator -
    22. -
    23. - getLoadedOrCreateNew - - Get an entity from the collection or create a new one if it has not yet been added
    24. -
    25. - getOnlyAbstractClasses - - Get a copy of the current collection with only abstract classes
    26. -
    27. - getOnlyInstantiable - - Get a copy of the current collection with only instantiable entities
    28. -
    29. - getOnlyInterfaces - - Get a copy of the current collection with only interfaces
    30. -
    31. - getOnlyTraits - - Get a copy of the current collection with only traits
    32. -
    33. - getOperationsLogCollection -
    34. -
    35. - has - - Check if an entity has been added to the collection
    36. -
    37. - internalFindEntity -
    38. -
    39. - internalGetLoadedOrCreateNew -
    40. -
    41. - isEmpty - - Check if the collection is empty or not
    42. -
    43. - loadEntities - - Load entities into a collection
    44. -
    45. - loadEntitiesByConfiguration - - Load entities into a collection by configuration
    46. -
    47. - remove - - Remove an entity from a collection
    48. -
    49. - toArray - - Convert collection to array
    50. -
    51. - updateEntitiesCache -
    52. -
    - - -

    Constants:

    - - - - - - -

    Method details:

    - -
    - - - -```php -public function __construct(\BumbleDocGen\Core\Configuration\Configuration $configuration, \BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings $phpHandlerSettings, \BumbleDocGen\Core\Plugin\PluginEventDispatcher $pluginEventDispatcher, \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Cache\CacheablePhpEntityFactory $cacheablePhpEntityFactory, \BumbleDocGen\LanguageHandler\Php\Renderer\EntityDocRenderer\EntityDocRendererHelper $docRendererHelper, \BumbleDocGen\LanguageHandler\Php\Parser\PhpParser\PhpParserHelper $phpParserHelper, \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache $localObjectCache, \Psr\Log\LoggerInterface $logger); -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $configuration\BumbleDocGen\Core\Configuration\Configuration-
    $phpHandlerSettings\BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings-
    $pluginEventDispatcher\BumbleDocGen\Core\Plugin\PluginEventDispatcher-
    $cacheablePhpEntityFactory\BumbleDocGen\LanguageHandler\Php\Parser\Entity\Cache\CacheablePhpEntityFactory-
    $docRendererHelper\BumbleDocGen\LanguageHandler\Php\Renderer\EntityDocRenderer\EntityDocRendererHelper-
    $phpParserHelper\BumbleDocGen\LanguageHandler\Php\Parser\PhpParser\PhpParserHelper-
    $localObjectCache\BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache-
    $logger\Psr\Log\LoggerInterface-
    - - - -
    -
    -
    - - - -```php -public function add(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity $classEntity, bool $reload = false): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; -``` - -
    Add an entity to the collection
    - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $classEntity\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity-
    $reloadbool-
    - -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\Core\Parser\Entity\LoggableRootEntityCollection - -public function clearOperationsLogCollection(): void; -``` - - - -Parameters: not specified - -Return value: void - - -
    -
    -
    - - - -```php -public function filterByInterfaces(array $interfaces): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; -``` - -
    Get a copy of the current collection only with entities filtered by interfaces names (filtering is only available for ClassLikeEntity)
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $interfacesstring[]-
    - -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection - - -Throws: - - -
    -
    -
    - - - -```php -public function filterByNameRegularExpression(string $regexPattern): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; -``` - -
    Get a copy of the current collection with only entities whose names match the regular expression
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $regexPatternstring-
    - -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection - - -
    -
    -
    - - - -```php -public function filterByParentClassNames(array $parentClassNames): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; -``` - -
    Get a copy of the current collection only with entities filtered by parent classes names (filtering is only available for ClassLikeEntity)
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $parentClassNamesarray-
    - -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection - - -Throws: - - -
    -
    -
    - - - -```php -public function filterByPaths(array $paths): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; -``` - -
    Get a copy of the current collection only with entities filtered by file paths (from project_root)
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $pathsarray-
    - -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\Core\Parser\Entity\LoggableRootEntityCollection - -public function findEntity(string $search, bool $useUnsafeKeys = true): null|\BumbleDocGen\Core\Parser\Entity\RootEntityInterface; -``` - -
    Find an entity in a collection
    - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $searchstring-
    $useUnsafeKeysbool-
    - -Return value: null | \BumbleDocGen\Core\Parser\Entity\RootEntityInterface - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\Core\Parser\Entity\LoggableRootEntityCollection - -public function get(string $objectName): null|\BumbleDocGen\Core\Parser\Entity\RootEntityInterface; -``` - -
    Get an entity from a collection (only previously added)
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $objectNamestring-
    - -Return value: null | \BumbleDocGen\Core\Parser\Entity\RootEntityInterface - - -
    -
    -
    - - - -```php -public function getEntityCollectionName(): string; -``` - -
    Get collection name
    - -Parameters: not specified - -Return value: string - - -
    -
    -
    - -
      -
    • # - getEntityLinkData - :warning: Is internal | source code
    • -
    - -```php -public function getEntityLinkData(string $rawLink, string|null $defaultEntityName = null, bool $useUnsafeKeys = true): array; -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $rawLinkstringRaw link to an entity or entity element
    $defaultEntityNamestring | nullEntity name to use if the link does not contain a valid or existing entity name, - but only a cursor on an entity element
    $useUnsafeKeysbool-
    - -Return value: array - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\Core\Parser\Entity\LoggableRootEntityCollection - -public function getIterator(): \Generator; -``` - - - -Parameters: not specified - -Return value: \Generator - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\Core\Parser\Entity\LoggableRootEntityCollection - -public function getLoadedOrCreateNew(string $objectName, bool $withAddClassEntityToCollectionEvent = false): \BumbleDocGen\Core\Parser\Entity\RootEntityInterface; -``` - -
    Get an entity from the collection or create a new one if it has not yet been added
    - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $objectNamestring-
    $withAddClassEntityToCollectionEventbool-
    - -Return value: \BumbleDocGen\Core\Parser\Entity\RootEntityInterface - - - -See: - -
    -
    -
    - - - -```php -public function getOnlyAbstractClasses(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; -``` - -
    Get a copy of the current collection with only abstract classes
    - -Parameters: not specified - -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection - - -Throws: - - -
    -
    -
    - - - -```php -public function getOnlyInstantiable(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; -``` - -
    Get a copy of the current collection with only instantiable entities
    - -Parameters: not specified - -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection - - -
    -
    -
    - - - -```php -public function getOnlyInterfaces(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; -``` - -
    Get a copy of the current collection with only interfaces
    - -Parameters: not specified - -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection - - -
    -
    -
    - - - -```php -public function getOnlyTraits(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; -``` - -
    Get a copy of the current collection with only traits
    - -Parameters: not specified - -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\Core\Parser\Entity\LoggableRootEntityCollection - -public function getOperationsLogCollection(): \BumbleDocGen\Core\Parser\Entity\CollectionLogOperation\OperationsCollection; -``` - - - -Parameters: not specified - -Return value: \BumbleDocGen\Core\Parser\Entity\CollectionLogOperation\OperationsCollection - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\Core\Parser\Entity\BaseEntityCollection - -public function has(string $objectName): bool; -``` - -
    Check if an entity has been added to the collection
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $objectNamestring-
    - -Return value: bool - - -
    -
    -
    - -
      -
    • # - internalFindEntity - :warning: Is internal | source code
    • -
    - -```php -public function internalFindEntity(string $search, bool $useUnsafeKeys = true): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $searchstringSearch query. For the search, only the main part is taken, up to the characters: `::`, `->`, `#`. - If the request refers to multiple existing entities and if unsafe keys are allowed, - a warning will be shown and the first entity found will be used.
    $useUnsafeKeysboolWhether to use search keys that can be used to find several entities
    - -Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - - - - -Examples of using: - -```php -$entitiesCollection->findEntity('App'); // class name -$entitiesCollection->findEntity('BumbleDocGen\Console\App'); // class with namespace -$entitiesCollection->findEntity('\BumbleDocGen\Console\App'); // class with namespace -$entitiesCollection->findEntity('\BumbleDocGen\Console\App::test()'); // class with namespace and optional part -$entitiesCollection->findEntity('App.php'); // filename -$entitiesCollection->findEntity('/src/Console/App.php'); // relative path -$entitiesCollection->findEntity('/Users/someuser/Desktop/projects/bumble-doc-gen/src/Console/App.php'); // absolute path -$entitiesCollection->findEntity('https://github.com/bumble-tech/bumble-doc-gen/blob/master/src/Console/App.php'); // source link -``` - -
    -
    -
    - -
      -
    • # - internalGetLoadedOrCreateNew - :warning: Is internal | source code
    • -
    - -```php -public function internalGetLoadedOrCreateNew(string $objectName, bool $withAddClassEntityToCollectionEvent = false): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $objectNamestring-
    $withAddClassEntityToCollectionEventbool-
    - -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\Core\Parser\Entity\BaseEntityCollection - -public function isEmpty(): bool; -``` - -
    Check if the collection is empty or not
    - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - - - -```php -public function loadEntities(\BumbleDocGen\Core\Parser\SourceLocator\SourceLocatorsCollection $sourceLocatorsCollection, \BumbleDocGen\Core\Parser\FilterCondition\ConditionInterface|null $filters = null, \BumbleDocGen\Core\Parser\Entity\EntitiesLoaderProgressBarInterface|null $progressBar = null): \BumbleDocGen\Core\Parser\Entity\CollectionLoadEntitiesResult; -``` - -
    Load entities into a collection
    - -Parameters: - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $sourceLocatorsCollection\BumbleDocGen\Core\Parser\SourceLocator\SourceLocatorsCollection-
    $filters\BumbleDocGen\Core\Parser\FilterCondition\ConditionInterface | null-
    $progressBar\BumbleDocGen\Core\Parser\Entity\EntitiesLoaderProgressBarInterface | null-
    - -Return value: \BumbleDocGen\Core\Parser\Entity\CollectionLoadEntitiesResult - - -Throws: - - -
    -
    -
    - -
      -
    • # - loadEntitiesByConfiguration - :warning: Is internal | source code
    • -
    - -```php -public function loadEntitiesByConfiguration(\BumbleDocGen\Core\Parser\Entity\EntitiesLoaderProgressBarInterface|null $progressBar = null): \BumbleDocGen\Core\Parser\Entity\CollectionLoadEntitiesResult; -``` - -
    Load entities into a collection by configuration
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $progressBar\BumbleDocGen\Core\Parser\Entity\EntitiesLoaderProgressBarInterface | null-
    - -Return value: \BumbleDocGen\Core\Parser\Entity\CollectionLoadEntitiesResult - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\Core\Parser\Entity\BaseEntityCollection - -public function remove(string $objectName): void; -``` - -
    Remove an entity from a collection
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $objectNamestring-
    - -Return value: void - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\Core\Parser\Entity\RootEntityCollection - -public function toArray(): array; -``` - -
    Convert collection to array
    - -Parameters: not specified - -Return value: array - - -
    -
    -
    - -
      -
    • # - updateEntitiesCache - :warning: Is internal | source code
    • -
    - -```php -// Implemented in BumbleDocGen\Core\Parser\Entity\RootEntityCollection - -public function updateEntitiesCache(): void; -``` - - - -Parameters: not specified - -Return value: void - - -Throws: - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/2.parser/reflectionApi/php/classes/PhpHandlerSettings.md b/docs/tech/2.parser/reflectionApi/php/classes/PhpHandlerSettings.md deleted file mode 100644 index 6ce8f0b4..00000000 --- a/docs/tech/2.parser/reflectionApi/php/classes/PhpHandlerSettings.md +++ /dev/null @@ -1,514 +0,0 @@ - - BumbleDocGen / Technical description of the project / Parser / Reflection API / Reflection API for PHP / PhpHandlerSettings
    - -

    - PhpHandlerSettings class: -

    - - - - - -```php -namespace BumbleDocGen\LanguageHandler\Php; - -final class PhpHandlerSettings -``` - - - - - - - - -

    Initialization methods:

    - -
      -
    1. - __construct -
    2. -
    - -

    Methods:

    - -
      -
    1. - getClassConstantEntityFilter -
    2. -
    3. - getClassEntityFilter -
    4. -
    5. - getComposerConfigFile -
    6. -
    7. - getComposerVendorDir -
    8. -
    9. - getCustomTwigFilters -
    10. -
    11. - getCustomTwigFunctions -
    12. -
    13. - getEntityDocRenderersCollection -
    14. -
    15. - getFileSourceBaseUrl -
    16. -
    17. - getMethodEntityFilter -
    18. -
    19. - getPropertyEntityFilter -
    20. -
    21. - getPsr4Map -
    22. -
    23. - getUseComposerAutoload -
    24. -
    - - -

    Constants:

    - - - - - - -

    Method details:

    - -
    - - - -```php -public function __construct(\BumbleDocGen\Core\Configuration\ConfigurationParameterBag $parameterBag, \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache $localObjectCache); -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $parameterBag\BumbleDocGen\Core\Configuration\ConfigurationParameterBag-
    $localObjectCache\BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache-
    - - - -
    -
    -
    - - - -```php -public function getClassConstantEntityFilter(): \BumbleDocGen\Core\Parser\FilterCondition\ConditionInterface; -``` - - - -Parameters: not specified - -Return value: \BumbleDocGen\Core\Parser\FilterCondition\ConditionInterface - - -Throws: - - -
    -
    -
    - - - -```php -public function getClassEntityFilter(): \BumbleDocGen\Core\Parser\FilterCondition\ConditionInterface; -``` - - - -Parameters: not specified - -Return value: \BumbleDocGen\Core\Parser\FilterCondition\ConditionInterface - - -Throws: - - -
    -
    -
    - - - -```php -public function getComposerConfigFile(): null|string; -``` - - - -Parameters: not specified - -Return value: null | string - - -Throws: - - -
    -
    -
    - - - -```php -public function getComposerVendorDir(): null|string; -``` - - - -Parameters: not specified - -Return value: null | string - - -Throws: - - -
    -
    -
    - - - -```php -public function getCustomTwigFilters(): \BumbleDocGen\Core\Renderer\Twig\Filter\CustomFiltersCollection; -``` - - - -Parameters: not specified - -Return value: \BumbleDocGen\Core\Renderer\Twig\Filter\CustomFiltersCollection - - -Throws: - - -
    -
    -
    - - - -```php -public function getCustomTwigFunctions(): \BumbleDocGen\Core\Renderer\Twig\Function\CustomFunctionsCollection; -``` - - - -Parameters: not specified - -Return value: \BumbleDocGen\Core\Renderer\Twig\Function\CustomFunctionsCollection - - -Throws: - - -
    -
    -
    - - - -```php -public function getEntityDocRenderersCollection(): \BumbleDocGen\Core\Renderer\EntityDocRenderer\EntityDocRenderersCollection; -``` - - - -Parameters: not specified - -Return value: \BumbleDocGen\Core\Renderer\EntityDocRenderer\EntityDocRenderersCollection - - -Throws: - - -
    -
    -
    - - - -```php -public function getFileSourceBaseUrl(): null|string; -``` - - - -Parameters: not specified - -Return value: null | string - - -Throws: - - -
    -
    -
    - - - -```php -public function getMethodEntityFilter(): \BumbleDocGen\Core\Parser\FilterCondition\ConditionInterface; -``` - - - -Parameters: not specified - -Return value: \BumbleDocGen\Core\Parser\FilterCondition\ConditionInterface - - -Throws: - - -
    -
    -
    - - - -```php -public function getPropertyEntityFilter(): \BumbleDocGen\Core\Parser\FilterCondition\ConditionInterface; -``` - - - -Parameters: not specified - -Return value: \BumbleDocGen\Core\Parser\FilterCondition\ConditionInterface - - -Throws: - - -
    -
    -
    - - - -```php -public function getPsr4Map(): array; -``` - - - -Parameters: not specified - -Return value: array - - -Throws: - - -
    -
    -
    - - - -```php -public function getUseComposerAutoload(): bool; -``` - - - -Parameters: not specified - -Return value: bool - - -Throws: - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md b/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md deleted file mode 100644 index 8a8bed06..00000000 --- a/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md +++ /dev/null @@ -1,1588 +0,0 @@ - - BumbleDocGen / Technical description of the project / Parser / Reflection API / Reflection API for PHP / PHP class property reflection API / PropertyEntity
    - -

    - PropertyEntity class: -

    - - - - - -```php -namespace BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property; - -class PropertyEntity extends \BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity implements \BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityInterface, \BumbleDocGen\Core\Parser\Entity\EntityInterface -``` - -
    Class property entity
    - - - - - - -

    Initialization methods:

    - -
      -
    1. - __construct -
    2. -
    - -

    Methods:

    - -
      -
    1. - getAbsoluteFileName - - Returns the absolute path to a file if it can be retrieved and if the file is in the project directory
    2. -
    3. - getAst - - Get AST for this entity
    4. -
    5. - getCacheKey -
    6. -
    7. - getCachedEntityDependencies -
    8. -
    9. - getCurrentRootEntity -
    10. -
    11. - getDefaultValue - - Get the compiled default value of a property
    12. -
    13. - getDescription - - Get entity description
    14. -
    15. - getDescriptionLinks - - Get parsed links from description and doc blocks `see` and `link`
    16. -
    17. - getDocBlock - - Get DocBlock for current entity
    18. -
    19. - getDocComment - - Get the doc comment of an entity
    20. -
    21. - getDocCommentEntity - - Link to an entity where docBlock is implemented for this entity
    22. -
    23. - getDocCommentLine - - Get the code line number where the docBlock of the current entity begins
    24. -
    25. - getDocNote - - Get the note annotation value
    26. -
    27. - getEndLine - - Get the line number of the end of a property's code in a file
    28. -
    29. - getExamples - - Get parsed examples from `examples` doc block
    30. -
    31. - getFileSourceLink -
    32. -
    33. - getFirstExample - - Get first example from `examples` doc block
    34. -
    35. - getImplementingClass - - Get the class like entity in which the current entity was implemented
    36. -
    37. - getImplementingClassName - - Get the name of the class in which this property is implemented
    38. -
    39. - getModifiersString - - Get a text representation of property modifiers
    40. -
    41. - getName - - Full name of the entity
    42. -
    43. - getNamespaceName - - Namespace of the class that contains this property
    44. -
    45. - getObjectId - - Get entity unique ID
    46. -
    47. - getRelativeFileName - - File name relative to project_root configuration parameter
    48. -
    49. - getRootEntity -
    50. -
    51. - getRootEntityCollection - - Get the collection of root entities to which this entity belongs
    52. -
    53. - getShortName - - Short name of the entity
    54. -
    55. - getStartLine - - Get the line number of the beginning of the entity code in a file
    56. -
    57. - getThrows - - Get parsed throws from `throws` doc block
    58. -
    59. - getThrowsDocBlockLinks -
    60. -
    61. - getType - - Get current property type
    62. -
    63. - hasDescriptionLinks - - Checking if an entity has links in its description
    64. -
    65. - hasExamples - - Checking if an entity has `example` docBlock
    66. -
    67. - hasThrows - - Checking if an entity has `throws` docBlock
    68. -
    69. - isApi - - Checking if an entity has `api` docBlock
    70. -
    71. - isDeprecated - - Checking if an entity has `deprecated` docBlock
    72. -
    73. - isEntityCacheOutdated - - Checking if the entity cache is out of date
    74. -
    75. - isEntityDataCacheOutdated -
    76. -
    77. - isEntityFileCanBeLoad - - Checking if entity data can be retrieved
    78. -
    79. - isImplementedInParentClass - - Check if this property is implemented in the parent class
    80. -
    81. - isInternal - - Checking if an entity has `internal` docBlock
    82. -
    83. - isPrivate - - Check if a private is a public private
    84. -
    85. - isProtected - - Check if a protected is a public protected
    86. -
    87. - isPublic - - Check if a property is a public property
    88. -
    89. - reloadEntityDependenciesCache - - Update entity dependency cache
    90. -
    91. - removeEntityValueFromCache -
    92. -
    93. - removeNotUsedEntityDataCache -
    94. -
    - - -

    Constants:

    - - - - - - -

    Method details:

    - -
    - - - -```php -public function __construct(\BumbleDocGen\Core\Configuration\Configuration $configuration, \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity $classEntity, \BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper $parserHelper, \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache $localObjectCache, \Psr\Log\LoggerInterface $logger, string $propertyName, string $implementingClassName); -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $configuration\BumbleDocGen\Core\Configuration\Configuration-
    $classEntity\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity-
    $parserHelper\BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper-
    $localObjectCache\BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache-
    $logger\Psr\Log\LoggerInterface-
    $propertyNamestring-
    $implementingClassNamestring-
    - - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getAbsoluteFileName(): null|string; -``` - -
    Returns the absolute path to a file if it can be retrieved and if the file is in the project directory
    - -Parameters: not specified - -Return value: null | string - - -Throws: - - -
    -
    -
    - - - -```php -public function getAst(): \PhpParser\Node\Stmt\Property; -``` - -
    Get AST for this entity
    - -Parameters: not specified - -Return value: \PhpParser\Node\Stmt\Property - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait - -public function getCacheKey(): string; -``` - - - -Parameters: not specified - -Return value: string - - -
    -
    -
    - -
      -
    • # - getCachedEntityDependencies - :warning: Is internal | source code
    • -
    - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getCachedEntityDependencies(): array; -``` - - - -Parameters: not specified - -Return value: array - - -Throws: - - -
    -
    -
    - -
      -
    • # - getCurrentRootEntity - :warning: Is internal | source code
    • -
    - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getCurrentRootEntity(): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; -``` - - - -Parameters: not specified - -Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - - -
    -
    -
    - - - -```php -public function getDefaultValue(): string|array|int|bool|null|float; -``` - -
    Get the compiled default value of a property
    - -Parameters: not specified - -Return value: string | array | int | bool | null | float - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getDescription(): string; -``` - -
    Get entity description
    - -Parameters: not specified - -Return value: string - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getDescriptionLinks(): array; -``` - -
    Get parsed links from description and doc blocks `see` and `link`
    - -Parameters: not specified - -Return value: array - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getDocBlock(): \phpDocumentor\Reflection\DocBlock; -``` - -
    Get DocBlock for current entity
    - -Parameters: not specified - -Return value: \phpDocumentor\Reflection\DocBlock - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getDocComment(): string; -``` - -
    Get the doc comment of an entity
    - -Parameters: not specified - -Return value: string - - -Throws: - - -
    -
    -
    - -
      -
    • # - getDocCommentEntity - :warning: Is internal | source code
    • -
    - -```php -public function getDocCommentEntity(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntity; -``` - -
    Link to an entity where docBlock is implemented for this entity
    - -Parameters: not specified - -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntity - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getDocCommentLine(): null|int; -``` - -
    Get the code line number where the docBlock of the current entity begins
    - -Parameters: not specified - -Return value: null | int - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getDocNote(): string; -``` - -
    Get the note annotation value
    - -Parameters: not specified - -Return value: string - - -Throws: - - -
    -
    -
    - - - -```php -public function getEndLine(): int; -``` - -
    Get the line number of the end of a property's code in a file
    - -Parameters: not specified - -Return value: int - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getExamples(): array; -``` - -
    Get parsed examples from `examples` doc block
    - -Parameters: not specified - -Return value: array - - -Throws: - - -
    -
    -
    - -
      -
    • # - getFileSourceLink - :warning: Is internal | source code
    • -
    - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getFileSourceLink(bool $withLine = true): null|string; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $withLinebool-
    - -Return value: null | string - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getFirstExample(): string; -``` - -
    Get first example from `examples` doc block
    - -Parameters: not specified - -Return value: string - - -Throws: - - -
    -
    -
    - - - -```php -public function getImplementingClass(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; -``` - -
    Get the class like entity in which the current entity was implemented
    - -Parameters: not specified - -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - - -
    -
    -
    - - - -```php -public function getImplementingClassName(): string; -``` - -
    Get the name of the class in which this property is implemented
    - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -public function getModifiersString(): string; -``` - -
    Get a text representation of property modifiers
    - -Parameters: not specified - -Return value: string - - -Throws: - - -
    -
    -
    - - - -```php -public function getName(): string; -``` - -
    Full name of the entity
    - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -public function getNamespaceName(): string; -``` - -
    Namespace of the class that contains this property
    - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getObjectId(): string; -``` - -
    Get entity unique ID
    - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -public function getRelativeFileName(): null|string; -``` - -
    File name relative to project_root configuration parameter
    - -Parameters: not specified - -Return value: null | string - - - -See: - -
    -
    -
    - - - -```php -public function getRootEntity(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; -``` - - - -Parameters: not specified - -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - - -
    -
    -
    - - - -```php -public function getRootEntityCollection(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; -``` - -
    Get the collection of root entities to which this entity belongs
    - -Parameters: not specified - -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection - - -
    -
    -
    - - - -```php -public function getShortName(): string; -``` - -
    Short name of the entity
    - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -public function getStartLine(): int; -``` - -
    Get the line number of the beginning of the entity code in a file
    - -Parameters: not specified - -Return value: int - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getThrows(): array; -``` - -
    Get parsed throws from `throws` doc block
    - -Parameters: not specified - -Return value: array - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getThrowsDocBlockLinks(): array; -``` - - - -Parameters: not specified - -Return value: array - - -Throws: - - -
    -
    -
    - - - -```php -public function getType(): string; -``` - -
    Get current property type
    - -Parameters: not specified - -Return value: string - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function hasDescriptionLinks(): bool; -``` - -
    Checking if an entity has links in its description
    - -Parameters: not specified - -Return value: bool - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function hasExamples(): bool; -``` - -
    Checking if an entity has `example` docBlock
    - -Parameters: not specified - -Return value: bool - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function hasThrows(): bool; -``` - -
    Checking if an entity has `throws` docBlock
    - -Parameters: not specified - -Return value: bool - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function isApi(): bool; -``` - -
    Checking if an entity has `api` docBlock
    - -Parameters: not specified - -Return value: bool - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function isDeprecated(): bool; -``` - -
    Checking if an entity has `deprecated` docBlock
    - -Parameters: not specified - -Return value: bool - - -Throws: - - -
    -
    -
    - -
      -
    • # - isEntityCacheOutdated - :warning: Is internal | source code
    • -
    - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function isEntityCacheOutdated(): bool; -``` - -
    Checking if the entity cache is out of date
    - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - -
      -
    • # - isEntityDataCacheOutdated - :warning: Is internal | source code
    • -
    - -```php -// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait - -public function isEntityDataCacheOutdated(): bool; -``` - - - -Parameters: not specified - -Return value: bool - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function isEntityFileCanBeLoad(): bool; -``` - -
    Checking if entity data can be retrieved
    - -Parameters: not specified - -Return value: bool - - -Throws: - - -
    -
    -
    - - - -```php -public function isImplementedInParentClass(): bool; -``` - -
    Check if this property is implemented in the parent class
    - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function isInternal(): bool; -``` - -
    Checking if an entity has `internal` docBlock
    - -Parameters: not specified - -Return value: bool - - -Throws: - - -
    -
    -
    - - - -```php -public function isPrivate(): bool; -``` - -
    Check if a private is a public private
    - -Parameters: not specified - -Return value: bool - - -Throws: - - -
    -
    -
    - - - -```php -public function isProtected(): bool; -``` - -
    Check if a protected is a public protected
    - -Parameters: not specified - -Return value: bool - - -Throws: - - -
    -
    -
    - - - -```php -public function isPublic(): bool; -``` - -
    Check if a property is a public property
    - -Parameters: not specified - -Return value: bool - - -Throws: - - -
    -
    -
    - -
      -
    • # - reloadEntityDependenciesCache - :warning: Is internal | source code
    • -
    - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function reloadEntityDependenciesCache(): array; -``` - -
    Update entity dependency cache
    - -Parameters: not specified - -Return value: array - - -
    -
    -
    - -
      -
    • # - removeEntityValueFromCache - :warning: Is internal | source code
    • -
    - -```php -// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait - -public function removeEntityValueFromCache(string $key): void; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $keystring-
    - -Return value: void - - -
    -
    -
    - -
      -
    • # - removeNotUsedEntityDataCache - :warning: Is internal | source code
    • -
    - -```php -// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait - -public function removeNotUsedEntityDataCache(): void; -``` - - - -Parameters: not specified - -Return value: void - - -Throws: - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/2.parser/reflectionApi/php/classes/RootEntityInterface.md b/docs/tech/2.parser/reflectionApi/php/classes/RootEntityInterface.md deleted file mode 100644 index 05d2e4a0..00000000 --- a/docs/tech/2.parser/reflectionApi/php/classes/RootEntityInterface.md +++ /dev/null @@ -1,472 +0,0 @@ - - BumbleDocGen / Technical description of the project / Parser / Reflection API / Reflection API for PHP / RootEntityInterface
    - -

    - RootEntityInterface class: -

    - - - - - -```php -namespace BumbleDocGen\Core\Parser\Entity; - -interface RootEntityInterface extends \BumbleDocGen\Core\Parser\Entity\EntityInterface -``` - -
    Since the documentation generator supports several programming languages, -their entities need to correspond to the same interfaces
    - - - - - - - -

    Methods:

    - -
      -
    1. - getAbsoluteFileName - - Returns the absolute path to a file if it can be retrieved and if the file is in the project directory
    2. -
    3. - getEntityDependencies -
    4. -
    5. - getFileContent -
    6. -
    7. - getFileSourceLink -
    8. -
    9. - getName - - Full name of the entity
    10. -
    11. - getObjectId - - Entity object ID
    12. -
    13. - getRelativeFileName - - File name relative to project_root configuration parameter
    14. -
    15. - getRootEntityCollection - - Get parent collection of entities
    16. -
    17. - getShortName - - Short name of the entity
    18. -
    19. - isEntityCacheOutdated -
    20. -
    21. - isEntityDataCanBeLoaded - - Checking if it is possible to get the entity data
    22. -
    23. - isEntityNameValid - - Check if entity name is valid
    24. -
    25. - isExternalLibraryEntity - - The entity is loaded from a third party library and should not be treated the same as a standard one
    26. -
    27. - isInGit - - The entity file is in the git repository
    28. -
    29. - normalizeClassName -
    30. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -// Implemented in BumbleDocGen\Core\Parser\Entity\EntityInterface - -public function getAbsoluteFileName(): null|string; -``` - -
    Returns the absolute path to a file if it can be retrieved and if the file is in the project directory
    - -Parameters: not specified - -Return value: null | string - - -
    -
    -
    - - - -```php -public function getEntityDependencies(): array; -``` - - - -Parameters: not specified - -Return value: array - - -
    -
    -
    - - - -```php -public function getFileContent(): string; -``` - - - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -public function getFileSourceLink(bool $withLine = true): null|string; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $withLinebool-
    - -Return value: null | string - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\Core\Parser\Entity\EntityInterface - -public function getName(): string; -``` - -
    Full name of the entity
    - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\Core\Parser\Entity\EntityInterface - -public function getObjectId(): string; -``` - -
    Entity object ID
    - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\Core\Parser\Entity\EntityInterface - -public function getRelativeFileName(): null|string; -``` - -
    File name relative to project_root configuration parameter
    - -Parameters: not specified - -Return value: null | string - - - -See: - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\Core\Parser\Entity\EntityInterface - -public function getRootEntityCollection(): \BumbleDocGen\Core\Parser\Entity\RootEntityCollection; -``` - -
    Get parent collection of entities
    - -Parameters: not specified - -Return value: \BumbleDocGen\Core\Parser\Entity\RootEntityCollection - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\Core\Parser\Entity\EntityInterface - -public function getShortName(): string; -``` - -
    Short name of the entity
    - -Parameters: not specified - -Return value: string - - -
    -
    -
    - -
      -
    • # - isEntityCacheOutdated - :warning: Is internal | source code
    • -
    - -```php -// Implemented in BumbleDocGen\Core\Parser\Entity\EntityInterface - -public function isEntityCacheOutdated(): bool; -``` - - - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - - - -```php -public function isEntityDataCanBeLoaded(): bool; -``` - -
    Checking if it is possible to get the entity data
    - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - - - -```php -public static function isEntityNameValid(string $entityName): bool; -``` - -
    Check if entity name is valid
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $entityNamestring-
    - -Return value: bool - - -
    -
    -
    - - - -```php -public function isExternalLibraryEntity(): bool; -``` - -
    The entity is loaded from a third party library and should not be treated the same as a standard one
    - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - - - -```php -public function isInGit(): bool; -``` - -
    The entity file is in the git repository
    - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - - - -```php -public static function normalizeClassName(string $name): string; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $namestring-
    - -Return value: string - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/2.parser/reflectionApi/php/phpClassConstantReflectionApi.md b/docs/tech/2.parser/reflectionApi/php/phpClassConstantReflectionApi.md deleted file mode 100644 index f292594c..00000000 --- a/docs/tech/2.parser/reflectionApi/php/phpClassConstantReflectionApi.md +++ /dev/null @@ -1,50 +0,0 @@ - BumbleDocGen / Technical description of the project / Parser / Reflection API / Reflection API for PHP / PHP class constant reflection API
    - -

    PHP class constant reflection API

    - -Class constant reflection entity class: ClassConstantEntity. - -**Example of creating class constant reflection:** - -```php -$entitiesCollection = (new \BumbleDocGen\DocGeneratorFactory())->createRootEntitiesCollection($reflectionApiConfig); - -$classReflection = $entitiesCollection->getLoadedOrCreateNew('SomeClassName'); - -$constantReflection = $classReflection->getConstant('constantName'); -``` - -**Class constant reflection API methods:** - -- [getAbsoluteFileName()](/docs/tech/2.parser/reflectionApi/php/classes/ClassConstantEntity.md#mgetabsolutefilename): Returns the absolute path to a file if it can be retrieved and if the file is in the project directory -- [getAst()](/docs/tech/2.parser/reflectionApi/php/classes/ClassConstantEntity.md#mgetast): Get AST for this entity -- [getDescription()](/docs/tech/2.parser/reflectionApi/php/classes/ClassConstantEntity.md#mgetdescription): Get entity description -- [getDescriptionLinks()](/docs/tech/2.parser/reflectionApi/php/classes/ClassConstantEntity.md#mgetdescriptionlinks): Get parsed links from description and doc blocks `see` and `link` -- [getDocComment()](/docs/tech/2.parser/reflectionApi/php/classes/ClassConstantEntity.md#mgetdoccomment): Get the doc comment of an entity -- [getDocCommentLine()](/docs/tech/2.parser/reflectionApi/php/classes/ClassConstantEntity.md#mgetdoccommentline): Get the code line number where the docBlock of the current entity begins -- [getDocNote()](/docs/tech/2.parser/reflectionApi/php/classes/ClassConstantEntity.md#mgetdocnote): Get the note annotation value -- [getEndLine()](/docs/tech/2.parser/reflectionApi/php/classes/ClassConstantEntity.md#mgetendline): Get the line number of the end of a constant's code in a file -- [getExamples()](/docs/tech/2.parser/reflectionApi/php/classes/ClassConstantEntity.md#mgetexamples): Get parsed examples from `examples` doc block -- [getFirstExample()](/docs/tech/2.parser/reflectionApi/php/classes/ClassConstantEntity.md#mgetfirstexample): Get first example from `examples` doc block -- [getImplementingClass()](/docs/tech/2.parser/reflectionApi/php/classes/ClassConstantEntity.md#mgetimplementingclass): Get the class like entity in which the current entity was implemented -- [getNamespaceName()](/docs/tech/2.parser/reflectionApi/php/classes/ClassConstantEntity.md#mgetnamespacename): Get the name of the namespace where the current class is implemented -- [getObjectId()](/docs/tech/2.parser/reflectionApi/php/classes/ClassConstantEntity.md#mgetobjectid): Get entity unique ID -- [getRelativeFileName()](/docs/tech/2.parser/reflectionApi/php/classes/ClassConstantEntity.md#mgetrelativefilename): File name relative to project_root configuration parameter -- [getRootEntityCollection()](/docs/tech/2.parser/reflectionApi/php/classes/ClassConstantEntity.md#mgetrootentitycollection): Get the collection of root entities to which this entity belongs -- [getStartLine()](/docs/tech/2.parser/reflectionApi/php/classes/ClassConstantEntity.md#mgetstartline): Get the line number of the beginning of the constant code in a file -- [getThrows()](/docs/tech/2.parser/reflectionApi/php/classes/ClassConstantEntity.md#mgetthrows): Get parsed throws from `throws` doc block -- [getValue()](/docs/tech/2.parser/reflectionApi/php/classes/ClassConstantEntity.md#mgetvalue): Get the compiled value of a constant -- [hasDescriptionLinks()](/docs/tech/2.parser/reflectionApi/php/classes/ClassConstantEntity.md#mhasdescriptionlinks): Checking if an entity has links in its description -- [hasExamples()](/docs/tech/2.parser/reflectionApi/php/classes/ClassConstantEntity.md#mhasexamples): Checking if an entity has `example` docBlock -- [hasThrows()](/docs/tech/2.parser/reflectionApi/php/classes/ClassConstantEntity.md#mhasthrows): Checking if an entity has `throws` docBlock -- [isApi()](/docs/tech/2.parser/reflectionApi/php/classes/ClassConstantEntity.md#misapi): Checking if an entity has `api` docBlock -- [isDeprecated()](/docs/tech/2.parser/reflectionApi/php/classes/ClassConstantEntity.md#misdeprecated): Checking if an entity has `deprecated` docBlock -- [isEntityFileCanBeLoad()](/docs/tech/2.parser/reflectionApi/php/classes/ClassConstantEntity.md#misentityfilecanbeload): Checking if entity data can be retrieved -- [isInternal()](/docs/tech/2.parser/reflectionApi/php/classes/ClassConstantEntity.md#misinternal): Checking if an entity has `internal` docBlock -- [isPrivate()](/docs/tech/2.parser/reflectionApi/php/classes/ClassConstantEntity.md#misprivate): Check if a constant is a private constant -- [isProtected()](/docs/tech/2.parser/reflectionApi/php/classes/ClassConstantEntity.md#misprotected): Check if a constant is a protected constant -- [isPublic()](/docs/tech/2.parser/reflectionApi/php/classes/ClassConstantEntity.md#mispublic): Check if a constant is a public constant - -
    -
    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Dec 23 23:00:37 2023 +0300
    Page content update date: Sat Dec 23 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file diff --git a/docs/tech/2.parser/reflectionApi/php/phpClassMethodReflectionApi.md b/docs/tech/2.parser/reflectionApi/php/phpClassMethodReflectionApi.md deleted file mode 100644 index 1e6d58b5..00000000 --- a/docs/tech/2.parser/reflectionApi/php/phpClassMethodReflectionApi.md +++ /dev/null @@ -1,65 +0,0 @@ - BumbleDocGen / Technical description of the project / Parser / Reflection API / Reflection API for PHP / PHP class method reflection API
    - -

    PHP class method reflection API

    - -Method reflection entity class: MethodEntity. - -**Example of creating class method reflection:** - -```php -$entitiesCollection = (new \BumbleDocGen\DocGeneratorFactory())->createRootEntitiesCollection($reflectionApiConfig); - -$classReflection = $entitiesCollection->getLoadedOrCreateNew('SomeClassName'); - -$methodReflection = $classReflection->getMethod('methodName'); -``` - -**Class method reflection API methods:** - -- [getAbsoluteFileName()](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#mgetabsolutefilename): Returns the absolute path to a file if it can be retrieved and if the file is in the project directory -- [getAst()](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#mgetast): Get AST for this entity -- [getBodyCode()](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#mgetbodycode): Get the code for this method -- [getDescription()](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#mgetdescription): Get entity description -- [getDescriptionLinks()](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#mgetdescriptionlinks): Get parsed links from description and doc blocks `see` and `link` -- [getDocComment()](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#mgetdoccomment): Get the doc comment of an entity -- [getDocNote()](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#mgetdocnote): Get the note annotation value -- [getEndLine()](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#mgetendline): Get the line number of the end of a method's code in a file -- [getExamples()](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#mgetexamples): Get parsed examples from `examples` doc block -- [getFirstExample()](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#mgetfirstexample): Get first example from `examples` doc block -- [getFirstReturnValue()](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#mgetfirstreturnvalue): Get the compiled first return value of a method (if possible) -- [getImplementingClass()](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#mgetimplementingclass): Get the class like entity in which the current entity was implemented -- [getImplementingClassName()](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#mgetimplementingclassname): Get the name of the class in which this method is implemented -- [getModifiersString()](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#mgetmodifiersstring): Get a text representation of method modifiers -- [getName()](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#mgetname): Full name of the entity -- [getNamespaceName()](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#mgetnamespacename): Namespace of the class that contains this method -- [getObjectId()](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#mgetobjectid): Get entity unique ID -- [getParameters()](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#mgetparameters): Get a list of method parameters -- [getParametersString()](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#mgetparametersstring): Get a list of method parameters as a string -- [getParentMethod()](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#mgetparentmethod): Get the parent method for this method -- [getRelativeFileName()](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#mgetrelativefilename): File name relative to project_root configuration parameter -- [getReturnType()](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#mgetreturntype): Get the return type of method -- [getRootEntityCollection()](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#mgetrootentitycollection): Get the collection of root entities to which this entity belongs -- [getShortName()](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#mgetshortname): Short name of the entity -- [getSignature()](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#mgetsignature): Get the method signature as a string -- [getStartColumn()](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#mgetstartcolumn): Get the column number of the beginning of the method code in a file -- [getStartLine()](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#mgetstartline): Get the line number of the beginning of the entity code in a file -- [getThrows()](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#mgetthrows): Get parsed throws from `throws` doc block -- [hasDescriptionLinks()](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#mhasdescriptionlinks): Checking if an entity has links in its description -- [hasExamples()](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#mhasexamples): Checking if an entity has `example` docBlock -- [hasThrows()](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#mhasthrows): Checking if an entity has `throws` docBlock -- [isApi()](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#misapi): Checking if an entity has `api` docBlock -- [isConstructor()](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#misconstructor): Checking that a method is a constructor -- [isDeprecated()](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#misdeprecated): Checking if an entity has `deprecated` docBlock -- [isDynamic()](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#misdynamic): Check if a method is a dynamic method, that is, implementable using __call or __callStatic -- [isEntityFileCanBeLoad()](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#misentityfilecanbeload): Checking if entity data can be retrieved -- [isImplementedInParentClass()](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#misimplementedinparentclass): Check if this method is implemented in the parent class -- [isInitialization()](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#misinitialization): Check if a method is an initialization method -- [isInternal()](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#misinternal): Checking if an entity has `internal` docBlock -- [isPrivate()](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#misprivate): Check if a method is a private method -- [isProtected()](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#misprotected): Check if a method is a protected method -- [isPublic()](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#mispublic): Check if a method is a public method -- [isStatic()](/docs/tech/2.parser/reflectionApi/php/classes/MethodEntity.md#misstatic): Check if this method is static - -
    -
    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Dec 23 23:00:37 2023 +0300
    Page content update date: Sat Dec 23 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file diff --git a/docs/tech/2.parser/reflectionApi/php/phpClassPropertyReflectionApi.md b/docs/tech/2.parser/reflectionApi/php/phpClassPropertyReflectionApi.md deleted file mode 100644 index 6f4ac037..00000000 --- a/docs/tech/2.parser/reflectionApi/php/phpClassPropertyReflectionApi.md +++ /dev/null @@ -1,56 +0,0 @@ - BumbleDocGen / Technical description of the project / Parser / Reflection API / Reflection API for PHP / PHP class property reflection API
    - -

    PHP class property reflection API

    - -Property reflection entity class: PropertyEntity. - -**Example of creating class property reflection:** - -```php -$entitiesCollection = (new \BumbleDocGen\DocGeneratorFactory())->createRootEntitiesCollection($reflectionApiConfig); - -$classReflection = $entitiesCollection->getLoadedOrCreateNew('SomeClassName'); - -$propertyReflection = $classReflection->getProperty('propertyName'); -``` - -**Class property reflection API methods:** - -- [getAbsoluteFileName()](/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md#mgetabsolutefilename): Returns the absolute path to a file if it can be retrieved and if the file is in the project directory -- [getAst()](/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md#mgetast): Get AST for this entity -- [getDefaultValue()](/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md#mgetdefaultvalue): Get the compiled default value of a property -- [getDescription()](/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md#mgetdescription): Get entity description -- [getDescriptionLinks()](/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md#mgetdescriptionlinks): Get parsed links from description and doc blocks `see` and `link` -- [getDocComment()](/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md#mgetdoccomment): Get the doc comment of an entity -- [getDocCommentLine()](/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md#mgetdoccommentline): Get the code line number where the docBlock of the current entity begins -- [getDocNote()](/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md#mgetdocnote): Get the note annotation value -- [getEndLine()](/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md#mgetendline): Get the line number of the end of a property's code in a file -- [getExamples()](/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md#mgetexamples): Get parsed examples from `examples` doc block -- [getFirstExample()](/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md#mgetfirstexample): Get first example from `examples` doc block -- [getImplementingClass()](/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md#mgetimplementingclass): Get the class like entity in which the current entity was implemented -- [getImplementingClassName()](/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md#mgetimplementingclassname): Get the name of the class in which this property is implemented -- [getModifiersString()](/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md#mgetmodifiersstring): Get a text representation of property modifiers -- [getName()](/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md#mgetname): Full name of the entity -- [getNamespaceName()](/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md#mgetnamespacename): Namespace of the class that contains this property -- [getObjectId()](/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md#mgetobjectid): Get entity unique ID -- [getRelativeFileName()](/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md#mgetrelativefilename): File name relative to project_root configuration parameter -- [getRootEntityCollection()](/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md#mgetrootentitycollection): Get the collection of root entities to which this entity belongs -- [getShortName()](/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md#mgetshortname): Short name of the entity -- [getStartLine()](/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md#mgetstartline): Get the line number of the beginning of the entity code in a file -- [getThrows()](/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md#mgetthrows): Get parsed throws from `throws` doc block -- [getType()](/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md#mgettype): Get current property type -- [hasDescriptionLinks()](/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md#mhasdescriptionlinks): Checking if an entity has links in its description -- [hasExamples()](/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md#mhasexamples): Checking if an entity has `example` docBlock -- [hasThrows()](/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md#mhasthrows): Checking if an entity has `throws` docBlock -- [isApi()](/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md#misapi): Checking if an entity has `api` docBlock -- [isDeprecated()](/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md#misdeprecated): Checking if an entity has `deprecated` docBlock -- [isEntityFileCanBeLoad()](/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md#misentityfilecanbeload): Checking if entity data can be retrieved -- [isImplementedInParentClass()](/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md#misimplementedinparentclass): Check if this property is implemented in the parent class -- [isInternal()](/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md#misinternal): Checking if an entity has `internal` docBlock -- [isPrivate()](/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md#misprivate): Check if a private is a public private -- [isProtected()](/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md#misprotected): Check if a protected is a public protected -- [isPublic()](/docs/tech/2.parser/reflectionApi/php/classes/PropertyEntity.md#mispublic): Check if a property is a public property - -
    -
    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Dec 23 23:00:37 2023 +0300
    Page content update date: Sat Dec 23 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file diff --git a/docs/tech/2.parser/reflectionApi/php/phpClassReflectionApi.md b/docs/tech/2.parser/reflectionApi/php/phpClassReflectionApi.md deleted file mode 100644 index 2ed81ce9..00000000 --- a/docs/tech/2.parser/reflectionApi/php/phpClassReflectionApi.md +++ /dev/null @@ -1,89 +0,0 @@ - BumbleDocGen / Technical description of the project / Parser / Reflection API / Reflection API for PHP / PHP class reflection API
    - -

    PHP class reflection API

    - -PHP class reflection ClassEntity inherits from ClassLikeEntity. - -**Source class formats:** - -1) `class ` -2) `abstract class ` -3) `final class ` - -**Example of creating class reflection:** - -```php -$entitiesCollection = (new \BumbleDocGen\DocGeneratorFactory())->createRootEntitiesCollection($reflectionApiConfig); - -$classReflection = $entitiesCollection->getLoadedOrCreateNew('SomeClassName'); // or get() -``` - -**Class reflection API methods:** - -- [getAbsoluteFileName()](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetabsolutefilename): Returns the absolute path to a file if it can be retrieved and if the file is in the project directory -- [getAst()](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetast): Get AST for this entity -- [getConstant()](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetconstant): Get the method entity by its name -- [getConstantEntitiesCollection()](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetconstantentitiescollection): Get a collection of constant entities -- [getConstantValue()](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetconstantvalue): Get the compiled value of a constant -- [getConstants()](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetconstants): Get all constants that are available according to the configuration as an array -- [getConstantsValues()](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetconstantsvalues): Get class constant compiled values according to filters -- [getDescription()](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetdescription): Get entity description -- [getDescriptionLinks()](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetdescriptionlinks): Get parsed links from description and doc blocks `see` and `link` -- [getDocComment()](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetdoccomment): Get the doc comment of an entity -- [getDocCommentLine()](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetdoccommentline): Get the code line number where the docBlock of the current entity begins -- [getDocNote()](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetdocnote): Get the note annotation value -- [getEndLine()](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetendline): Get the line number of the end of a class code in a file -- [getExamples()](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetexamples): Get parsed examples from `examples` doc block -- [getFirstExample()](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetfirstexample): Get first example from `examples` doc block -- [getImplementingClass()](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetimplementingclass): Get the class like entity in which the current entity was implemented -- [getInterfaceNames()](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetinterfacenames): Get a list of class interface names -- [getInterfacesEntities()](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetinterfacesentities): Get a list of interface entities that the current class implements -- [getMethod()](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetmethod): Get the method entity by its name -- [getMethodEntitiesCollection()](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetmethodentitiescollection): Get a collection of method entities -- [getMethods()](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetmethods): Get all methods that are available according to the configuration as an array -- [getName()](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetname): Full name of the entity -- [getNamespaceName()](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetnamespacename): Get the entity namespace name -- [getObjectId()](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetobjectid): Get entity unique ID -- [getParentClass()](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetparentclass): Get the entity of the parent class if it exists -- [getParentClassEntities()](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetparentclassentities): Get a list of parent class entities -- [getParentClassName()](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetparentclassname): Get the name of the parent class entity if it exists -- [getParentClassNames()](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetparentclassnames): Get a list of entity names of parent classes -- [getPluginData()](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetplugindata): Get additional information added using the plugin -- [getProperties()](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetproperties): Get all properties that are available according to the configuration as an array -- [getProperty()](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetproperty): Get the property entity by its name -- [getPropertyDefaultValue()](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetpropertydefaultvalue): Get the compiled value of a property -- [getPropertyEntitiesCollection()](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetpropertyentitiescollection): Get a collection of property entities -- [getRelativeFileName()](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetrelativefilename): File name relative to project_root configuration parameter -- [getRootEntityCollection()](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetrootentitycollection): Get the collection of root entities to which this entity belongs -- [getShortName()](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetshortname): Short name of the entity -- [getStartLine()](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetstartline): Get the line number of the start of a class code in a file -- [getThrows()](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgetthrows): Get parsed throws from `throws` doc block -- [getTraits()](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgettraits): Get a list of trait entities of the current class -- [getTraitsNames()](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mgettraitsnames): Get a list of class traits names -- [hasConstant()](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mhasconstant): Check if a constant exists in a class -- [hasDescriptionLinks()](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mhasdescriptionlinks): Checking if an entity has links in its description -- [hasExamples()](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mhasexamples): Checking if an entity has `example` docBlock -- [hasMethod()](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mhasmethod): Check if a method exists in a class -- [hasParentClass()](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mhasparentclass): Check if a certain parent class exists in a chain of parent classes -- [hasProperty()](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mhasproperty): Check if a property exists in a class -- [hasThrows()](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mhasthrows): Checking if an entity has `throws` docBlock -- [hasTraits()](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mhastraits): Check if the class contains traits -- [implementsInterface()](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mimplementsinterface): Check if a class implements an interface -- [isAbstract()](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#misabstract): Check that an entity is abstract -- [isApi()](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#misapi): Checking if an entity has `api` docBlock -- [isAttribute()](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#misattribute): Check if a class is an attribute -- [isClass()](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#misclass): Check if an entity is a Class -- [isDeprecated()](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#misdeprecated): Checking if an entity has `deprecated` docBlock -- [isEntityFileCanBeLoad()](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#misentityfilecanbeload): Checking if entity data can be retrieved -- [isEnum()](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#misenum): Check if an entity is an Enum -- [isInstantiable()](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#misinstantiable): Check that an entity is instantiable -- [isInterface()](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#misinterface): Check if an entity is an Interface -- [isInternal()](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#misinternal): Checking if an entity has `internal` docBlock -- [isSubclassOf()](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#missubclassof): Whether the given class is a subclass of the specified class -- [isTrait()](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mistrait): Check if an entity is a Trait -- [normalizeClassName()](/docs/tech/2.parser/reflectionApi/php/classes/ClassEntity.md#mnormalizeclassname): Bring the class name to the standard format used in the system - - -
    -
    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Dec 23 23:00:37 2023 +0300
    Page content update date: Sat Dec 23 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file diff --git a/docs/tech/2.parser/reflectionApi/php/phpEntitiesCollection.md b/docs/tech/2.parser/reflectionApi/php/phpEntitiesCollection.md deleted file mode 100644 index f2287023..00000000 --- a/docs/tech/2.parser/reflectionApi/php/phpEntitiesCollection.md +++ /dev/null @@ -1,28 +0,0 @@ - BumbleDocGen / Technical description of the project / Parser / Reflection API / Reflection API for PHP / PHP entities collection
    - -

    PHP entities collection

    - -**PHP entities collection API methods:** - -- [add()](/docs/tech/2.parser/reflectionApi/php/classes/PhpEntitiesCollection.md#madd): Add an entity to the collection -- [filterByInterfaces()](/docs/tech/2.parser/reflectionApi/php/classes/PhpEntitiesCollection.md#mfilterbyinterfaces): Get a copy of the current collection only with entities filtered by interfaces names (filtering is only available for ClassLikeEntity) -- [filterByNameRegularExpression()](/docs/tech/2.parser/reflectionApi/php/classes/PhpEntitiesCollection.md#mfilterbynameregularexpression): Get a copy of the current collection with only entities whose names match the regular expression -- [filterByParentClassNames()](/docs/tech/2.parser/reflectionApi/php/classes/PhpEntitiesCollection.md#mfilterbyparentclassnames): Get a copy of the current collection only with entities filtered by parent classes names (filtering is only available for ClassLikeEntity) -- [filterByPaths()](/docs/tech/2.parser/reflectionApi/php/classes/PhpEntitiesCollection.md#mfilterbypaths): Get a copy of the current collection only with entities filtered by file paths (from project_root) -- [findEntity()](/docs/tech/2.parser/reflectionApi/php/classes/PhpEntitiesCollection.md#mfindentity): Find an entity in a collection -- [get()](/docs/tech/2.parser/reflectionApi/php/classes/PhpEntitiesCollection.md#mget): Get an entity from a collection (only previously added) -- [getEntityCollectionName()](/docs/tech/2.parser/reflectionApi/php/classes/PhpEntitiesCollection.md#mgetentitycollectionname): Get collection name -- [getLoadedOrCreateNew()](/docs/tech/2.parser/reflectionApi/php/classes/PhpEntitiesCollection.md#mgetloadedorcreatenew): Get an entity from the collection or create a new one if it has not yet been added -- [getOnlyAbstractClasses()](/docs/tech/2.parser/reflectionApi/php/classes/PhpEntitiesCollection.md#mgetonlyabstractclasses): Get a copy of the current collection with only abstract classes -- [getOnlyInstantiable()](/docs/tech/2.parser/reflectionApi/php/classes/PhpEntitiesCollection.md#mgetonlyinstantiable): Get a copy of the current collection with only instantiable entities -- [getOnlyInterfaces()](/docs/tech/2.parser/reflectionApi/php/classes/PhpEntitiesCollection.md#mgetonlyinterfaces): Get a copy of the current collection with only interfaces -- [getOnlyTraits()](/docs/tech/2.parser/reflectionApi/php/classes/PhpEntitiesCollection.md#mgetonlytraits): Get a copy of the current collection with only traits -- [has()](/docs/tech/2.parser/reflectionApi/php/classes/PhpEntitiesCollection.md#mhas): Check if an entity has been added to the collection -- [isEmpty()](/docs/tech/2.parser/reflectionApi/php/classes/PhpEntitiesCollection.md#misempty): Check if the collection is empty or not -- [loadEntities()](/docs/tech/2.parser/reflectionApi/php/classes/PhpEntitiesCollection.md#mloadentities): Load entities into a collection -- [remove()](/docs/tech/2.parser/reflectionApi/php/classes/PhpEntitiesCollection.md#mremove): Remove an entity from a collection -- [toArray()](/docs/tech/2.parser/reflectionApi/php/classes/PhpEntitiesCollection.md#mtoarray): Convert collection to array - -
    -
    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Dec 23 23:00:37 2023 +0300
    Page content update date: Sat Dec 23 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file diff --git a/docs/tech/2.parser/reflectionApi/php/phpEnumReflectionApi.md b/docs/tech/2.parser/reflectionApi/php/phpEnumReflectionApi.md deleted file mode 100644 index 80b2bbaa..00000000 --- a/docs/tech/2.parser/reflectionApi/php/phpEnumReflectionApi.md +++ /dev/null @@ -1,88 +0,0 @@ - BumbleDocGen / Technical description of the project / Parser / Reflection API / Reflection API for PHP / PHP enum reflection API
    - -

    PHP enum reflection API

    - -PHP enum reflection EnumEntity inherits from ClassLikeEntity. - -**Source enum formats:** - -1) `enum ` - -**Example of creating enum reflection:** - -```php -$entitiesCollection = (new \BumbleDocGen\DocGeneratorFactory())->createRootEntitiesCollection($reflectionApiConfig); - -$enumReflection = $entitiesCollection->getLoadedOrCreateNew('SomeEnumName'); // or get() -``` - -**Enum reflection API methods:** - -- [getAbsoluteFileName()](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetabsolutefilename): Returns the absolute path to a file if it can be retrieved and if the file is in the project directory -- [getAst()](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetast): Get AST for this entity -- [getCasesNames()](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetcasesnames): Get enum cases names -- [getConstant()](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetconstant): Get the method entity by its name -- [getConstantEntitiesCollection()](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetconstantentitiescollection): Get a collection of constant entities -- [getConstantValue()](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetconstantvalue): Get the compiled value of a constant -- [getConstants()](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetconstants): Get all constants that are available according to the configuration as an array -- [getConstantsValues()](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetconstantsvalues): Get class constant compiled values according to filters -- [getDescription()](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetdescription): Get entity description -- [getDescriptionLinks()](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetdescriptionlinks): Get parsed links from description and doc blocks `see` and `link` -- [getDocComment()](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetdoccomment): Get the doc comment of an entity -- [getDocCommentLine()](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetdoccommentline): Get the code line number where the docBlock of the current entity begins -- [getDocNote()](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetdocnote): Get the note annotation value -- [getEndLine()](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetendline): Get the line number of the end of a class code in a file -- [getEnumCaseValue()](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetenumcasevalue): Get enum case value -- [getEnumCases()](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetenumcases): Get enum cases values -- [getExamples()](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetexamples): Get parsed examples from `examples` doc block -- [getFirstExample()](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetfirstexample): Get first example from `examples` doc block -- [getImplementingClass()](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetimplementingclass): Get the class like entity in which the current entity was implemented -- [getInterfaceNames()](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetinterfacenames): Get a list of class interface names -- [getInterfacesEntities()](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetinterfacesentities): Get a list of interface entities that the current class implements -- [getMethod()](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetmethod): Get the method entity by its name -- [getMethodEntitiesCollection()](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetmethodentitiescollection): Get a collection of method entities -- [getMethods()](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetmethods): Get all methods that are available according to the configuration as an array -- [getName()](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetname): Full name of the entity -- [getNamespaceName()](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetnamespacename): Get the entity namespace name -- [getObjectId()](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetobjectid): Get entity unique ID -- [getParentClass()](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetparentclass): Get the entity of the parent class if it exists -- [getParentClassEntities()](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetparentclassentities): Get a list of parent class entities -- [getParentClassName()](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetparentclassname): Get the name of the parent class entity if it exists -- [getParentClassNames()](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetparentclassnames): Get a list of entity names of parent classes -- [getPluginData()](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetplugindata): Get additional information added using the plugin -- [getProperties()](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetproperties): Get all properties that are available according to the configuration as an array -- [getProperty()](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetproperty): Get the property entity by its name -- [getPropertyDefaultValue()](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetpropertydefaultvalue): Get the compiled value of a property -- [getPropertyEntitiesCollection()](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetpropertyentitiescollection): Get a collection of property entities -- [getRelativeFileName()](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetrelativefilename): File name relative to project_root configuration parameter -- [getRootEntityCollection()](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetrootentitycollection): Get the collection of root entities to which this entity belongs -- [getShortName()](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetshortname): Short name of the entity -- [getStartLine()](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetstartline): Get the line number of the start of a class code in a file -- [getThrows()](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgetthrows): Get parsed throws from `throws` doc block -- [getTraits()](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgettraits): Get a list of trait entities of the current class -- [getTraitsNames()](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mgettraitsnames): Get a list of class traits names -- [hasConstant()](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mhasconstant): Check if a constant exists in a class -- [hasDescriptionLinks()](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mhasdescriptionlinks): Checking if an entity has links in its description -- [hasExamples()](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mhasexamples): Checking if an entity has `example` docBlock -- [hasMethod()](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mhasmethod): Check if a method exists in a class -- [hasParentClass()](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mhasparentclass): Check if a certain parent class exists in a chain of parent classes -- [hasProperty()](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mhasproperty): Check if a property exists in a class -- [hasThrows()](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mhasthrows): Checking if an entity has `throws` docBlock -- [hasTraits()](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mhastraits): Check if the class contains traits -- [implementsInterface()](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mimplementsinterface): Check if a class implements an interface -- [isAbstract()](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#misabstract): Check that an entity is abstract -- [isApi()](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#misapi): Checking if an entity has `api` docBlock -- [isClass()](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#misclass): Check if an entity is a Class -- [isDeprecated()](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#misdeprecated): Checking if an entity has `deprecated` docBlock -- [isEntityFileCanBeLoad()](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#misentityfilecanbeload): Checking if entity data can be retrieved -- [isEnum()](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#misenum): Check if an entity is an Enum -- [isInstantiable()](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#misinstantiable): Check that an entity is instantiable -- [isInterface()](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#misinterface): Check if an entity is an Interface -- [isInternal()](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#misinternal): Checking if an entity has `internal` docBlock -- [isSubclassOf()](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#missubclassof): Whether the given class is a subclass of the specified class -- [isTrait()](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mistrait): Check if an entity is a Trait -- [normalizeClassName()](/docs/tech/2.parser/reflectionApi/php/classes/EnumEntity.md#mnormalizeclassname): Bring the class name to the standard format used in the system - -
    -
    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Dec 23 23:00:37 2023 +0300
    Page content update date: Sat Dec 23 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file diff --git a/docs/tech/2.parser/reflectionApi/php/phpInterfaceReflectionApi.md b/docs/tech/2.parser/reflectionApi/php/phpInterfaceReflectionApi.md deleted file mode 100644 index f991a69d..00000000 --- a/docs/tech/2.parser/reflectionApi/php/phpInterfaceReflectionApi.md +++ /dev/null @@ -1,85 +0,0 @@ - BumbleDocGen / Technical description of the project / Parser / Reflection API / Reflection API for PHP / PHP interface reflection API
    - -

    PHP interface reflection API

    - -PHP interface reflection InterfaceEntity inherits from ClassLikeEntity. - -**Source interface formats:** - -1) `interface ` - -**Example of creating interface reflection:** - -```php -$entitiesCollection = (new \BumbleDocGen\DocGeneratorFactory())->createRootEntitiesCollection($reflectionApiConfig); - -$interfaceReflection = $entitiesCollection->getLoadedOrCreateNew('SomeInterfaceName'); // or get() -``` - -**Interface reflection API methods:** - -- [getAbsoluteFileName()](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetabsolutefilename): Returns the absolute path to a file if it can be retrieved and if the file is in the project directory -- [getAst()](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetast): Get AST for this entity -- [getConstant()](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetconstant): Get the method entity by its name -- [getConstantEntitiesCollection()](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetconstantentitiescollection): Get a collection of constant entities -- [getConstantValue()](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetconstantvalue): Get the compiled value of a constant -- [getConstants()](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetconstants): Get all constants that are available according to the configuration as an array -- [getConstantsValues()](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetconstantsvalues): Get class constant compiled values according to filters -- [getDescription()](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetdescription): Get entity description -- [getDescriptionLinks()](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetdescriptionlinks): Get parsed links from description and doc blocks `see` and `link` -- [getDocComment()](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetdoccomment): Get the doc comment of an entity -- [getDocCommentLine()](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetdoccommentline): Get the code line number where the docBlock of the current entity begins -- [getDocNote()](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetdocnote): Get the note annotation value -- [getEndLine()](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetendline): Get the line number of the end of a class code in a file -- [getExamples()](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetexamples): Get parsed examples from `examples` doc block -- [getFirstExample()](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetfirstexample): Get first example from `examples` doc block -- [getImplementingClass()](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetimplementingclass): Get the class like entity in which the current entity was implemented -- [getInterfaceNames()](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetinterfacenames): Get a list of class interface names -- [getInterfacesEntities()](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetinterfacesentities): Get a list of interface entities that the current class implements -- [getMethod()](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetmethod): Get the method entity by its name -- [getMethodEntitiesCollection()](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetmethodentitiescollection): Get a collection of method entities -- [getMethods()](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetmethods): Get all methods that are available according to the configuration as an array -- [getName()](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetname): Full name of the entity -- [getNamespaceName()](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetnamespacename): Get the entity namespace name -- [getObjectId()](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetobjectid): Get entity unique ID -- [getParentClass()](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetparentclass): Get the entity of the parent class if it exists -- [getParentClassEntities()](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetparentclassentities): Get a list of parent class entities -- [getParentClassName()](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetparentclassname): Get the name of the parent class entity if it exists -- [getParentClassNames()](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetparentclassnames): Get a list of entity names of parent classes -- [getPluginData()](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetplugindata): Get additional information added using the plugin -- [getProperties()](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetproperties): Get all properties that are available according to the configuration as an array -- [getProperty()](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetproperty): Get the property entity by its name -- [getPropertyDefaultValue()](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetpropertydefaultvalue): Get the compiled value of a property -- [getPropertyEntitiesCollection()](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetpropertyentitiescollection): Get a collection of property entities -- [getRelativeFileName()](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetrelativefilename): File name relative to project_root configuration parameter -- [getRootEntityCollection()](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetrootentitycollection): Get the collection of root entities to which this entity belongs -- [getShortName()](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetshortname): Short name of the entity -- [getStartLine()](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetstartline): Get the line number of the start of a class code in a file -- [getThrows()](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgetthrows): Get parsed throws from `throws` doc block -- [getTraits()](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgettraits): Get a list of trait entities of the current class -- [getTraitsNames()](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mgettraitsnames): Get a list of class traits names -- [hasConstant()](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mhasconstant): Check if a constant exists in a class -- [hasDescriptionLinks()](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mhasdescriptionlinks): Checking if an entity has links in its description -- [hasExamples()](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mhasexamples): Checking if an entity has `example` docBlock -- [hasMethod()](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mhasmethod): Check if a method exists in a class -- [hasParentClass()](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mhasparentclass): Check if a certain parent class exists in a chain of parent classes -- [hasProperty()](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mhasproperty): Check if a property exists in a class -- [hasThrows()](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mhasthrows): Checking if an entity has `throws` docBlock -- [hasTraits()](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mhastraits): Check if the class contains traits -- [implementsInterface()](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mimplementsinterface): Check if a class implements an interface -- [isAbstract()](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#misabstract): Check that an entity is abstract -- [isApi()](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#misapi): Checking if an entity has `api` docBlock -- [isClass()](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#misclass): Check if an entity is a Class -- [isDeprecated()](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#misdeprecated): Checking if an entity has `deprecated` docBlock -- [isEntityFileCanBeLoad()](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#misentityfilecanbeload): Checking if entity data can be retrieved -- [isEnum()](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#misenum): Check if an entity is an Enum -- [isInstantiable()](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#misinstantiable): Check that an entity is instantiable -- [isInterface()](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#misinterface): Check if an entity is an Interface -- [isInternal()](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#misinternal): Checking if an entity has `internal` docBlock -- [isSubclassOf()](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#missubclassof): Whether the given class is a subclass of the specified class -- [isTrait()](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mistrait): Check if an entity is a Trait -- [normalizeClassName()](/docs/tech/2.parser/reflectionApi/php/classes/InterfaceEntity.md#mnormalizeclassname): Bring the class name to the standard format used in the system - -
    -
    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Dec 23 23:00:37 2023 +0300
    Page content update date: Sat Dec 23 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file diff --git a/docs/tech/2.parser/reflectionApi/php/phpTraitReflectionApi.md b/docs/tech/2.parser/reflectionApi/php/phpTraitReflectionApi.md deleted file mode 100644 index 3e471ed4..00000000 --- a/docs/tech/2.parser/reflectionApi/php/phpTraitReflectionApi.md +++ /dev/null @@ -1,85 +0,0 @@ - BumbleDocGen / Technical description of the project / Parser / Reflection API / Reflection API for PHP / PHP trait reflection API
    - -

    PHP trait reflection API

    - -PHP trait reflection TraitEntity inherits from ClassLikeEntity. - -**Source trait formats:** - -1) `trait ` - -**Example of creating trait reflection:** - -```php -$entitiesCollection = (new \BumbleDocGen\DocGeneratorFactory())->createRootEntitiesCollection($reflectionApiConfig); - -$traitReflection = $entitiesCollection->getLoadedOrCreateNew('SomeTraitName'); // or get() -``` - -**Trait reflection API methods:** - -- [getAbsoluteFileName()](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetabsolutefilename): Returns the absolute path to a file if it can be retrieved and if the file is in the project directory -- [getAst()](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetast): Get AST for this entity -- [getConstant()](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetconstant): Get the method entity by its name -- [getConstantEntitiesCollection()](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetconstantentitiescollection): Get a collection of constant entities -- [getConstantValue()](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetconstantvalue): Get the compiled value of a constant -- [getConstants()](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetconstants): Get all constants that are available according to the configuration as an array -- [getConstantsValues()](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetconstantsvalues): Get class constant compiled values according to filters -- [getDescription()](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetdescription): Get entity description -- [getDescriptionLinks()](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetdescriptionlinks): Get parsed links from description and doc blocks `see` and `link` -- [getDocComment()](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetdoccomment): Get the doc comment of an entity -- [getDocCommentLine()](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetdoccommentline): Get the code line number where the docBlock of the current entity begins -- [getDocNote()](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetdocnote): Get the note annotation value -- [getEndLine()](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetendline): Get the line number of the end of a class code in a file -- [getExamples()](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetexamples): Get parsed examples from `examples` doc block -- [getFirstExample()](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetfirstexample): Get first example from `examples` doc block -- [getImplementingClass()](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetimplementingclass): Get the class like entity in which the current entity was implemented -- [getInterfaceNames()](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetinterfacenames): Get a list of class interface names -- [getInterfacesEntities()](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetinterfacesentities): Get a list of interface entities that the current class implements -- [getMethod()](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetmethod): Get the method entity by its name -- [getMethodEntitiesCollection()](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetmethodentitiescollection): Get a collection of method entities -- [getMethods()](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetmethods): Get all methods that are available according to the configuration as an array -- [getName()](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetname): Full name of the entity -- [getNamespaceName()](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetnamespacename): Get the entity namespace name -- [getObjectId()](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetobjectid): Get entity unique ID -- [getParentClass()](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetparentclass): Get the entity of the parent class if it exists -- [getParentClassEntities()](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetparentclassentities): Get a list of parent class entities -- [getParentClassName()](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetparentclassname): Get the name of the parent class entity if it exists -- [getParentClassNames()](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetparentclassnames): Get a list of entity names of parent classes -- [getPluginData()](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetplugindata): Get additional information added using the plugin -- [getProperties()](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetproperties): Get all properties that are available according to the configuration as an array -- [getProperty()](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetproperty): Get the property entity by its name -- [getPropertyDefaultValue()](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetpropertydefaultvalue): Get the compiled value of a property -- [getPropertyEntitiesCollection()](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetpropertyentitiescollection): Get a collection of property entities -- [getRelativeFileName()](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetrelativefilename): File name relative to project_root configuration parameter -- [getRootEntityCollection()](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetrootentitycollection): Get the collection of root entities to which this entity belongs -- [getShortName()](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetshortname): Short name of the entity -- [getStartLine()](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetstartline): Get the line number of the start of a class code in a file -- [getThrows()](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgetthrows): Get parsed throws from `throws` doc block -- [getTraits()](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgettraits): Get a list of trait entities of the current class -- [getTraitsNames()](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mgettraitsnames): Get a list of class traits names -- [hasConstant()](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mhasconstant): Check if a constant exists in a class -- [hasDescriptionLinks()](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mhasdescriptionlinks): Checking if an entity has links in its description -- [hasExamples()](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mhasexamples): Checking if an entity has `example` docBlock -- [hasMethod()](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mhasmethod): Check if a method exists in a class -- [hasParentClass()](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mhasparentclass): Check if a certain parent class exists in a chain of parent classes -- [hasProperty()](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mhasproperty): Check if a property exists in a class -- [hasThrows()](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mhasthrows): Checking if an entity has `throws` docBlock -- [hasTraits()](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mhastraits): Check if the class contains traits -- [implementsInterface()](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mimplementsinterface): Check if a class implements an interface -- [isAbstract()](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#misabstract): Check that an entity is abstract -- [isApi()](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#misapi): Checking if an entity has `api` docBlock -- [isClass()](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#misclass): Check if an entity is a Class -- [isDeprecated()](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#misdeprecated): Checking if an entity has `deprecated` docBlock -- [isEntityFileCanBeLoad()](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#misentityfilecanbeload): Checking if entity data can be retrieved -- [isEnum()](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#misenum): Check if an entity is an Enum -- [isInstantiable()](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#misinstantiable): Check that an entity is instantiable -- [isInterface()](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#misinterface): Check if an entity is an Interface -- [isInternal()](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#misinternal): Checking if an entity has `internal` docBlock -- [isSubclassOf()](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#missubclassof): Whether the given class is a subclass of the specified class -- [isTrait()](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mistrait): Check if an entity is a Trait -- [normalizeClassName()](/docs/tech/2.parser/reflectionApi/php/classes/TraitEntity.md#mnormalizeclassname): Bring the class name to the standard format used in the system - -
    -
    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Dec 23 23:00:37 2023 +0300
    Page content update date: Sat Dec 23 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file diff --git a/docs/tech/2.parser/sourceLocator.md b/docs/tech/2.parser/sourceLocator.md deleted file mode 100644 index f1d794bc..00000000 --- a/docs/tech/2.parser/sourceLocator.md +++ /dev/null @@ -1,28 +0,0 @@ - BumbleDocGen / Technical description of the project / Parser / Source locators
    - -

    Source locators

    - -Source locators are needed so that the parser knows which files to parse, or to get data on a specific file after the primary parsing procedure - -Source locators are set in the configuration: - -```yaml - source_locators: - - class: \BumbleDocGen\Core\Parser\SourceLocator\RecursiveDirectoriesSourceLocator - arguments: - directories: - - "%project_root%/src" - - "%project_root%/selfdoc" -``` - - -You can create your own source locators or use any existing ones. All source locators must implement the SourceLocatorInterface interface. - -

    Built-in source locators

    - - - - -
    -
    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Dec 23 23:00:37 2023 +0300
    Page content update date: Sat Dec 23 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file diff --git a/docs/tech/3.renderer/classes/AddIndentFromLeft.md b/docs/tech/3.renderer/classes/AddIndentFromLeft.md deleted file mode 100644 index 423b69fa..00000000 --- a/docs/tech/3.renderer/classes/AddIndentFromLeft.md +++ /dev/null @@ -1,153 +0,0 @@ - - BumbleDocGen / Technical description of the project / Renderer / Template filters / AddIndentFromLeft
    - -

    - AddIndentFromLeft class: -

    - - - - - -```php -namespace BumbleDocGen\Core\Renderer\Twig\Filter; - -final class AddIndentFromLeft implements \BumbleDocGen\Core\Renderer\Twig\Filter\CustomFilterInterface -``` - -
    Filter adds indent from left
    - - - - -

    Settings:

    - - - - - - - - - - -
    namevalue
    Filter name:addIndentFromLeft
    - - - - - -

    Methods:

    - -
      -
    1. - __invoke -
    2. -
    3. - getName -
    4. -
    5. - getOptions -
    6. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public function __invoke(string $text, int $identLength = 4, bool $skipFirstIdent = false): string; -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $textstringProcessed text
    $identLengthintIndent size
    $skipFirstIdentboolSkip indent for first line in text or not
    - -Return value: string - - -
    -
    -
    - - - -```php -public static function getName(): string; -``` - - - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -public static function getOptions(): array; -``` - - - -Parameters: not specified - -Return value: array - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/3.renderer/classes/BreadcrumbsHelper.md b/docs/tech/3.renderer/classes/BreadcrumbsHelper.md deleted file mode 100644 index 9a55fc96..00000000 --- a/docs/tech/3.renderer/classes/BreadcrumbsHelper.md +++ /dev/null @@ -1,706 +0,0 @@ - - BumbleDocGen / Technical description of the project / Renderer / Documentation structure and breadcrumbs / BreadcrumbsHelper
    - -

    - BreadcrumbsHelper class: -

    - - - - - -```php -namespace BumbleDocGen\Core\Renderer\Breadcrumbs; - -final class BreadcrumbsHelper -``` - -
    Helper entity for working with breadcrumbs
    - - - - - - -

    Initialization methods:

    - -
      -
    1. - __construct -
    2. -
    - -

    Methods:

    - -
      -
    1. - getAllPageLinks -
    2. -
    3. - getBreadcrumbs - - Get breadcrumbs as an array
    4. -
    5. - getBreadcrumbsForTemplates -
    6. -
    7. - getNearestIndexFile -
    8. -
    9. - getPageDataByKey -
    10. -
    11. - getPageDocFileByKey -
    12. -
    13. - getPageLinkByKey -
    14. -
    15. - getTemplateFrontMatter -
    16. -
    17. - getTemplateLinkKey -
    18. -
    19. - getTemplateTitle - - Get the name of a template by its URL.
    20. -
    21. - renderBreadcrumbs - - Returns an HTML string with rendered breadcrumbs
    22. -
    - - -

    Constants:

    - - - - - - -

    Method details:

    - -
    - - - -```php -public function __construct(\BumbleDocGen\Core\Configuration\Configuration $configuration, \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache $localObjectCache, \BumbleDocGen\Core\Renderer\Breadcrumbs\BreadcrumbsTwigEnvironment $breadcrumbsTwig, \BumbleDocGen\Core\Plugin\PluginEventDispatcher $pluginEventDispatcher, string $prevPageNameTemplate = self::DEFAULT_PREV_PAGE_NAME_TEMPLATE); -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $configuration\BumbleDocGen\Core\Configuration\Configuration-
    $localObjectCache\BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache-
    $breadcrumbsTwig\BumbleDocGen\Core\Renderer\Breadcrumbs\BreadcrumbsTwigEnvironment-
    $pluginEventDispatcher\BumbleDocGen\Core\Plugin\PluginEventDispatcher-
    $prevPageNameTemplatestringIndex page for each child section
    - - - -
    -
    -
    - - - -```php -public function getAllPageLinks(): array; -``` - - - -Parameters: not specified - -Return value: array - - -Throws: - - -
    -
    -
    - - - -```php -public function getBreadcrumbs(string $filePatch, bool $fromCurrent = true): array; -``` - -
    Get breadcrumbs as an array
    - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $filePatchstring-
    $fromCurrentbool-
    - -Return value: array - - -Throws: - - -
    -
    -
    - - - -```php -public function getBreadcrumbsForTemplates(string $filePatch, bool $fromCurrent = true): array; -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $filePatchstring-
    $fromCurrentbool-
    - -Return value: array - - -Throws: - - -
    -
    -
    - - - -```php -public function getNearestIndexFile(string $templateName): string; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $templateNamestring-
    - -Return value: string - - -Throws: - - -
    -
    -
    - - - -```php -public function getPageDataByKey(string $key): null|array; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $keystring-
    - -Return value: null | array - - -Throws: - - -
    -
    -
    - - - -```php -public function getPageDocFileByKey(string $key): null|string; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $keystring-
    - -Return value: null | string - - -Throws: - - -
    -
    -
    - - - -```php -public function getPageLinkByKey(string $key): null|string; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $keystring-
    - -Return value: null | string - - -Throws: - - -
    -
    -
    - - - -```php -public function getTemplateFrontMatter(string $templateName): array; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $templateNamestring-
    - -Return value: array - - -Throws: - - -
    -
    -
    - - - -```php -public function getTemplateLinkKey(string $templateName): null|string; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $templateNamestring-
    - -Return value: null | string - - -Throws: - - -
    -
    -
    - - - -```php -public function getTemplateTitle(string $templateName): string; -``` - -
    Get the name of a template by its URL.
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $templateNamestring-
    - -Return value: string - - -Throws: - - - - -Examples of using: - -```php -# Front matter in template: -# --- -# title: Some template title -# --- - -$breadcrumbsHelper->getTemplateTitle() == 'Some template title'; // is true -``` - -
    -
    -
    - - - -```php -public function renderBreadcrumbs(string $currentPageTitle, string $filePatch, bool $fromCurrent = true): string; -``` - -
    Returns an HTML string with rendered breadcrumbs
    - -Parameters: - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $currentPageTitlestring-
    $filePatchstring-
    $fromCurrentbool-
    - -Return value: string - - -Throws: - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/3.renderer/classes/CustomFunctionInterface.md b/docs/tech/3.renderer/classes/CustomFunctionInterface.md deleted file mode 100644 index f2f47483..00000000 --- a/docs/tech/3.renderer/classes/CustomFunctionInterface.md +++ /dev/null @@ -1,88 +0,0 @@ - - BumbleDocGen / Technical description of the project / Renderer / Template functions / CustomFunctionInterface
    - -

    - CustomFunctionInterface class: -

    - - - - - -```php -namespace BumbleDocGen\Core\Renderer\Twig\Function; - -interface CustomFunctionInterface -``` - - - - - - - - - -

    Methods:

    - -
      -
    1. - getName -
    2. -
    3. - getOptions -
    4. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public static function getName(): string; -``` - - - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -public static function getOptions(): array; -``` - - - -Parameters: not specified - -Return value: array - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/3.renderer/classes/DisplayClassApiMethods.md b/docs/tech/3.renderer/classes/DisplayClassApiMethods.md deleted file mode 100644 index ba7189bd..00000000 --- a/docs/tech/3.renderer/classes/DisplayClassApiMethods.md +++ /dev/null @@ -1,209 +0,0 @@ - - BumbleDocGen / Technical description of the project / Renderer / Template functions / DisplayClassApiMethods
    - -

    - DisplayClassApiMethods class: -

    - - - - - -```php -namespace BumbleDocGen\LanguageHandler\Php\Renderer\Twig\Function; - -final class DisplayClassApiMethods implements \BumbleDocGen\Core\Renderer\Twig\Function\CustomFunctionInterface -``` - -
    Display all API methods of a class
    - - -Examples of using: - -```php -{{ displayClassApiMethods('\\BumbleDocGen\\LanguageHandler\\Php\\Parser\\Entity\\ClassEntity') }} - -``` - - - - -

    Settings:

    - - - - - - -
    Function name:displayClassApiMethods
    - - - - -

    Initialization methods:

    - -
      -
    1. - __construct -
    2. -
    - -

    Methods:

    - -
      -
    1. - __invoke -
    2. -
    3. - getName -
    4. -
    5. - getOptions -
    6. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public function __construct(\BumbleDocGen\Core\Parser\Entity\RootEntityCollectionsGroup $rootEntityCollectionsGroup, \BumbleDocGen\Core\Renderer\Twig\Function\GetDocumentedEntityUrl $getDocumentedEntityUrlFunction); -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $rootEntityCollectionsGroup\BumbleDocGen\Core\Parser\Entity\RootEntityCollectionsGroup-
    $getDocumentedEntityUrlFunction\BumbleDocGen\Core\Renderer\Twig\Function\GetDocumentedEntityUrl-
    - - - -
    -
    -
    - - - -```php -public function __invoke(string $className): null|string; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $classNamestringName of the class for which API methods need to be displayed
    - -Return value: null | string - - -Throws: - - -
    -
    -
    - - - -```php -public static function getName(): string; -``` - - - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -public static function getOptions(): array; -``` - - - -Parameters: not specified - -Return value: array - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/3.renderer/classes/DrawClassMap.md b/docs/tech/3.renderer/classes/DrawClassMap.md deleted file mode 100644 index 0025cafb..00000000 --- a/docs/tech/3.renderer/classes/DrawClassMap.md +++ /dev/null @@ -1,319 +0,0 @@ - - BumbleDocGen / Technical description of the project / Renderer / Template functions / DrawClassMap
    - -

    - DrawClassMap class: -

    - - - - - -```php -namespace BumbleDocGen\LanguageHandler\Php\Renderer\Twig\Function; - -final class DrawClassMap implements \BumbleDocGen\Core\Renderer\Twig\Function\CustomFunctionInterface -``` - -
    Generate class map in HTML format
    - - -Examples of using: - -```php -{{ drawClassMap(phpEntities.filterByPaths(['/src/Renderer'])) }} - -``` - -```php -{{ drawClassMap(phpEntities) }} - -``` - - - - -

    Settings:

    - - - - - - -
    Function name:drawClassMap
    - - - - -

    Initialization methods:

    - -
      -
    1. - __construct -
    2. -
    - -

    Methods:

    - -
      -
    1. - __invoke -
    2. -
    3. - convertDirectoryStructureToFormattedString -
    4. -
    5. - getDirectoryStructure -
    6. -
    7. - getName -
    8. -
    9. - getOptions -
    10. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public function __construct(\BumbleDocGen\Core\Renderer\Twig\Function\GetDocumentedEntityUrl $getDocumentedEntityUrlFunction, \BumbleDocGen\Core\Parser\Entity\RootEntityCollectionsGroup $rootEntityCollectionsGroup); -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $getDocumentedEntityUrlFunction\BumbleDocGen\Core\Renderer\Twig\Function\GetDocumentedEntityUrl-
    $rootEntityCollectionsGroup\BumbleDocGen\Core\Parser\Entity\RootEntityCollectionsGroup-
    - - - -
    -
    -
    - - - -```php -public function __invoke(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection ...$entitiesCollections): string; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $entitiesCollections (variadic)\BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollectionThe collection of entities for which the class map will be generated
    - -Return value: string - - -Throws: - - -
    -
    -
    - -
      -
    • # - convertDirectoryStructureToFormattedString - | source code
    • -
    - -```php -public function convertDirectoryStructureToFormattedString(array $structure, string $prefix = '│', string $path = '/'): string; -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $structurearray-
    $prefixstring-
    $pathstring-
    - -Return value: string - - -
    -
    -
    - - - -```php -public function getDirectoryStructure(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection ...$entitiesCollections): array; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $entitiesCollections (variadic)\BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection-
    - -Return value: array - - -Throws: - - -
    -
    -
    - - - -```php -public static function getName(): string; -``` - - - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -public static function getOptions(): array; -``` - - - -Parameters: not specified - -Return value: array - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/3.renderer/classes/DrawDocumentationMenu.md b/docs/tech/3.renderer/classes/DrawDocumentationMenu.md deleted file mode 100644 index 39e7b383..00000000 --- a/docs/tech/3.renderer/classes/DrawDocumentationMenu.md +++ /dev/null @@ -1,248 +0,0 @@ - - BumbleDocGen / Technical description of the project / Renderer / Template functions / DrawDocumentationMenu
    - -

    - DrawDocumentationMenu class: -

    - - - - - -```php -namespace BumbleDocGen\Core\Renderer\Twig\Function; - -final class DrawDocumentationMenu implements \BumbleDocGen\Core\Renderer\Twig\Function\CustomFunctionInterface -``` - -
    Generate documentation menu in HTML format. To generate the menu, the start page is taken, -and all links with this page are recursively collected for it, after which the html menu is created.
    - -See: - - - -Examples of using: - -```php -{{ drawDocumentationMenu() }} - The menu contains links to all documents - -``` - -```php -{{ drawDocumentationMenu('/render/index.md') }} - The menu contains links to all child documents from the /render/index.md file (for example /render/test/index.md) - -``` - -```php -{{ drawDocumentationMenu(_self) }} - The menu contains links to all child documents from the file where this function was called - -``` - -```php -{{ drawDocumentationMenu(_self, 2) }} - The menu contains links to all child documents from the file where this function was called, but no more than 2 in depth - -``` - - - - -

    Settings:

    - - - - - - -
    Function name:drawDocumentationMenu
    - - - - -

    Initialization methods:

    - -
      -
    1. - __construct -
    2. -
    - -

    Methods:

    - -
      -
    1. - __invoke -
    2. -
    3. - getName -
    4. -
    5. - getOptions -
    6. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public function __construct(\BumbleDocGen\Core\Configuration\Configuration $configuration, \BumbleDocGen\Core\Renderer\Breadcrumbs\BreadcrumbsHelper $breadcrumbsHelper, \BumbleDocGen\Core\Renderer\Context\RendererContext $rendererContext, \BumbleDocGen\Core\Renderer\Context\Dependency\RendererDependencyFactory $dependencyFactory); -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $configuration\BumbleDocGen\Core\Configuration\Configuration-
    $breadcrumbsHelper\BumbleDocGen\Core\Renderer\Breadcrumbs\BreadcrumbsHelper-
    $rendererContext\BumbleDocGen\Core\Renderer\Context\RendererContext-
    $dependencyFactory\BumbleDocGen\Core\Renderer\Context\Dependency\RendererDependencyFactory-
    - - - -
    -
    -
    - - - -```php -public function __invoke(string|null $startPageKey = null, int|null $maxDeep = null): string; -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $startPageKeystring | nullRelative path to the page from which the menu will be generated (only child pages will be taken into account). - By default, the main documentation page (readme.md) is used.
    $maxDeepint | nullMaximum parsing depth of documented links starting from the current page. - By default, this restriction is disabled.
    - -Return value: string - - -Throws: - - -
    -
    -
    - - - -```php -public static function getName(): string; -``` - - - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -public static function getOptions(): array; -``` - - - -Parameters: not specified - -Return value: array - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/3.renderer/classes/DrawDocumentedEntityLink.md b/docs/tech/3.renderer/classes/DrawDocumentedEntityLink.md deleted file mode 100644 index 904b17d8..00000000 --- a/docs/tech/3.renderer/classes/DrawDocumentedEntityLink.md +++ /dev/null @@ -1,224 +0,0 @@ - - BumbleDocGen / Technical description of the project / Renderer / Template functions / DrawDocumentedEntityLink
    - -

    - DrawDocumentedEntityLink class: -

    - - - - - -```php -namespace BumbleDocGen\Core\Renderer\Twig\Function; - -final class DrawDocumentedEntityLink implements \BumbleDocGen\Core\Renderer\Twig\Function\CustomFunctionInterface -``` - -
    Creates an entity link by object
    - - -Examples of using: - -```php -{{ drawDocumentedEntityLink($entity, 'getFunctions()') }} - -``` - -```php -{{ drawDocumentedEntityLink($entity) }} - -``` - -```php -{{ drawDocumentedEntityLink($entity, '', false) }} - -``` - - - - -

    Settings:

    - - - - - - -
    Function name:drawDocumentedEntityLink
    - - - - -

    Initialization methods:

    - -
      -
    1. - __construct -
    2. -
    - -

    Methods:

    - -
      -
    1. - __invoke -
    2. -
    3. - getName -
    4. -
    5. - getOptions -
    6. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public function __construct(\BumbleDocGen\Core\Renderer\Twig\Function\GetDocumentedEntityUrl $getDocumentedEntityUrlFunction); -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $getDocumentedEntityUrlFunction\BumbleDocGen\Core\Renderer\Twig\Function\GetDocumentedEntityUrl-
    - - - -
    -
    -
    - - - -```php -public function __invoke(\BumbleDocGen\Core\Parser\Entity\RootEntityInterface $entity, string $cursor = '', bool $useShortName = true): string; -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $entity\BumbleDocGen\Core\Parser\Entity\RootEntityInterfaceThe entity for which we want to get the link
    $cursorstringReference to an element inside an entity, for example, the name of a function/constant/property
    $useShortNameboolUse the full or short entity name in the link
    - -Return value: string - - -Throws: - - -
    -
    -
    - - - -```php -public static function getName(): string; -``` - - - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -public static function getOptions(): array; -``` - - - -Parameters: not specified - -Return value: array - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/3.renderer/classes/FileGetContents.md b/docs/tech/3.renderer/classes/FileGetContents.md deleted file mode 100644 index 751fa10e..00000000 --- a/docs/tech/3.renderer/classes/FileGetContents.md +++ /dev/null @@ -1,203 +0,0 @@ - - BumbleDocGen / Technical description of the project / Renderer / Template functions / FileGetContents
    - -

    - FileGetContents class: -

    - - - - - -```php -namespace BumbleDocGen\Core\Renderer\Twig\Function; - -final class FileGetContents implements \BumbleDocGen\Core\Renderer\Twig\Function\CustomFunctionInterface -``` - -
    Displaying the content of a file or web resource
    - -See: - - - -Examples of using: - -```php -{{ fileGetContents('https://www.php.net/manual/en/function.file-get-contents.php') }} - -``` - -```php -{{ fileGetContents('%templates_dir%/../config.yaml') }} - -``` - - - - -

    Settings:

    - - - - - - -
    Function name:fileGetContents
    - - - - -

    Initialization methods:

    - -
      -
    1. - __construct -
    2. -
    - -

    Methods:

    - -
      -
    1. - __invoke -
    2. -
    3. - getName -
    4. -
    5. - getOptions -
    6. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public function __construct(\BumbleDocGen\Core\Configuration\ConfigurationParameterBag $parameterBag); -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $parameterBag\BumbleDocGen\Core\Configuration\ConfigurationParameterBag-
    - - - -
    -
    -
    - - - -```php -public function __invoke(string $resourceName): string; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $resourceNamestringResource name, url or path to the resource. - The path can contain shortcodes with parameters from the configuration (%param_name%)
    - -Return value: string - - -
    -
    -
    - - - -```php -public static function getName(): string; -``` - - - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -public static function getOptions(): array; -``` - - - -Parameters: not specified - -Return value: array - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/3.renderer/classes/FixStrSize.md b/docs/tech/3.renderer/classes/FixStrSize.md deleted file mode 100644 index 10df8270..00000000 --- a/docs/tech/3.renderer/classes/FixStrSize.md +++ /dev/null @@ -1,153 +0,0 @@ - - BumbleDocGen / Technical description of the project / Renderer / Template filters / FixStrSize
    - -

    - FixStrSize class: -

    - - - - - -```php -namespace BumbleDocGen\Core\Renderer\Twig\Filter; - -final class FixStrSize implements \BumbleDocGen\Core\Renderer\Twig\Filter\CustomFilterInterface -``` - -
    The filter pads the string with the specified characters on the right to the specified size
    - - - - -

    Settings:

    - - - - - - - - - - -
    namevalue
    Filter name:fixStrSize
    - - - - - -

    Methods:

    - -
      -
    1. - __invoke -
    2. -
    3. - getName -
    4. -
    5. - getOptions -
    6. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public function __invoke(string $text, int $size, string $symbol = ' '): string; -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $textstringProcessed text
    $sizeintRequired string size
    $symbolstringThe character to be used to complete the string
    - -Return value: string - - -
    -
    -
    - - - -```php -public static function getName(): string; -``` - - - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -public static function getOptions(): array; -``` - - - -Parameters: not specified - -Return value: array - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/3.renderer/classes/GeneratePageBreadcrumbs.md b/docs/tech/3.renderer/classes/GeneratePageBreadcrumbs.md deleted file mode 100644 index b251ade9..00000000 --- a/docs/tech/3.renderer/classes/GeneratePageBreadcrumbs.md +++ /dev/null @@ -1,227 +0,0 @@ - - BumbleDocGen / Technical description of the project / Renderer / Template functions / GeneratePageBreadcrumbs
    - -

    - GeneratePageBreadcrumbs class: -

    - - - - - -```php -namespace BumbleDocGen\Core\Renderer\Twig\Function; - -final class GeneratePageBreadcrumbs implements \BumbleDocGen\Core\Renderer\Twig\Function\CustomFunctionInterface -``` - -
    Function to generate breadcrumbs on the page
    - - - - -

    Settings:

    - - - - - - -
    Function name:generatePageBreadcrumbs
    - - - - -

    Initialization methods:

    - -
      -
    1. - __construct -
    2. -
    - -

    Methods:

    - -
      -
    1. - __invoke -
    2. -
    3. - getName -
    4. -
    5. - getOptions -
    6. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public function __construct(\BumbleDocGen\Core\Renderer\Breadcrumbs\BreadcrumbsHelper $breadcrumbsHelper, \BumbleDocGen\Core\Renderer\Context\RendererContext $rendererContext, \BumbleDocGen\Core\Renderer\Context\Dependency\RendererDependencyFactory $dependencyFactory); -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $breadcrumbsHelper\BumbleDocGen\Core\Renderer\Breadcrumbs\BreadcrumbsHelper-
    $rendererContext\BumbleDocGen\Core\Renderer\Context\RendererContext-
    $dependencyFactory\BumbleDocGen\Core\Renderer\Context\Dependency\RendererDependencyFactory-
    - - - -
    -
    -
    - - - -```php -public function __invoke(string $currentPageTitle, string $templatePath, bool $skipFirstTemplatePage = true): string; -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $currentPageTitlestringTitle of the current page
    $templatePathstringPath to the template from which the breadcrumbs will be generated
    $skipFirstTemplatePageboolIf set to true, the page from which parsing starts will not participate in the formation of breadcrumbs - This option is useful when working with the _self value in a template, as it returns the full path to the - current template, and the reference to it in breadcrumbs should not be clickable.
    - -Return value: string - - -Throws: - - -
    -
    -
    - - - -```php -public static function getName(): string; -``` - - - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -public static function getOptions(): array; -``` - - - -Parameters: not specified - -Return value: array - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/3.renderer/classes/GetClassMethodsBodyCode.md b/docs/tech/3.renderer/classes/GetClassMethodsBodyCode.md deleted file mode 100644 index 1174a970..00000000 --- a/docs/tech/3.renderer/classes/GetClassMethodsBodyCode.md +++ /dev/null @@ -1,209 +0,0 @@ - - BumbleDocGen / Technical description of the project / Renderer / Template functions / GetClassMethodsBodyCode
    - -

    - GetClassMethodsBodyCode class: -

    - - - - - -```php -namespace BumbleDocGen\LanguageHandler\Php\Renderer\Twig\Function; - -final class GetClassMethodsBodyCode implements \BumbleDocGen\Core\Renderer\Twig\Function\CustomFunctionInterface -``` - -
    Get the code of the specified class methods as a formatted string
    - - -Examples of using: - -```php -{{ getClassMethodsBodyCode('\\BumbleDocGen\\Renderer\\Twig\\MainExtension', ['getFunctions']) }} - -``` - - - - -

    Settings:

    - - - - - - -
    Function name:getClassMethodsBodyCode
    - - - - -

    Initialization methods:

    - -
      -
    1. - __construct -
    2. -
    - -

    Methods:

    - -
      -
    1. - __invoke -
    2. -
    3. - getName -
    4. -
    5. - getOptions -
    6. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public function __construct(\BumbleDocGen\Core\Parser\Entity\RootEntityCollectionsGroup $rootEntityCollectionsGroup); -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $rootEntityCollectionsGroup\BumbleDocGen\Core\Parser\Entity\RootEntityCollectionsGroup-
    - - - -
    -
    -
    - - - -```php -public function __invoke(string $className, array $methodsNames): null|string; -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $classNamestringThe name of the class whose methods are to be retrieved
    $methodsNamesarrayList of class methods whose code needs to be retrieved
    - -Return value: null | string - - -Throws: - - -
    -
    -
    - - - -```php -public static function getName(): string; -``` - - - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -public static function getOptions(): array; -``` - - - -Parameters: not specified - -Return value: array - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/3.renderer/classes/GetDocumentationPageUrl_2.md b/docs/tech/3.renderer/classes/GetDocumentationPageUrl_2.md deleted file mode 100644 index 13464c1f..00000000 --- a/docs/tech/3.renderer/classes/GetDocumentationPageUrl_2.md +++ /dev/null @@ -1,232 +0,0 @@ - - BumbleDocGen / Technical description of the project / Renderer / Template functions / GetDocumentationPageUrl
    - -

    - GetDocumentationPageUrl class: -

    - - - - - -```php -namespace BumbleDocGen\Core\Renderer\Twig\Function; - -final class GetDocumentationPageUrl implements \BumbleDocGen\Core\Renderer\Twig\Function\CustomFunctionInterface -``` - -
    Creates an entity link by object
    - - -Examples of using: - -```php -{{ getDocumentationPageUrl('Page name') }} - -``` - -```php -{{ getDocumentationPageUrl('/someDir/someTemplate.md.twig') }} - -``` - -```php -{{ getDocumentationPageUrl('/docs/someDir/someDocFile.md') }} - -``` - -```php -{{ getDocumentationPageUrl('readme.md') }} - -``` - - - - -

    Settings:

    - - - - - - -
    Function name:getDocumentationPageUrl
    - - - - -

    Initialization methods:

    - -
      -
    1. - __construct -
    2. -
    - -

    Methods:

    - -
      -
    1. - __invoke -
    2. -
    3. - getName -
    4. -
    5. - getOptions -
    6. -
    - - -

    Constants:

    - - - - - - -

    Method details:

    - -
    - - - -```php -public function __construct(\BumbleDocGen\Core\Renderer\Breadcrumbs\BreadcrumbsHelper $breadcrumbsHelper, \Psr\Log\LoggerInterface $logger); -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $breadcrumbsHelper\BumbleDocGen\Core\Renderer\Breadcrumbs\BreadcrumbsHelper-
    $logger\Psr\Log\LoggerInterface-
    - - - -
    -
    -
    - - - -```php -public function __invoke(string $key): string; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $keystringThe key by which to look up the URL of the page. - Can be the title of a page, a path to a template, or a generated document
    - -Return value: string - - -Throws: - - -
    -
    -
    - - - -```php -public static function getName(): string; -``` - - - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -public static function getOptions(): array; -``` - - - -Parameters: not specified - -Return value: array - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/3.renderer/classes/GetDocumentedEntityUrl_3.md b/docs/tech/3.renderer/classes/GetDocumentedEntityUrl_3.md deleted file mode 100644 index 41960113..00000000 --- a/docs/tech/3.renderer/classes/GetDocumentedEntityUrl_3.md +++ /dev/null @@ -1,266 +0,0 @@ - - BumbleDocGen / Technical description of the project / Renderer / GetDocumentedEntityUrl
    - -

    - GetDocumentedEntityUrl class: -

    - - - - - -```php -namespace BumbleDocGen\Core\Renderer\Twig\Function; - -final class GetDocumentedEntityUrl implements \BumbleDocGen\Core\Renderer\Twig\Function\CustomFunctionInterface -``` - -
    Get the URL of a documented entity by its name. If the entity is found, next to the file where this method was called, -the `EntityDocRendererInterface::getDocFileExtension()` directory will be created, in which the documented entity file will be created
    - -See: - - - -Examples of using: - -```php -{{ getDocumentedEntityUrl(phpEntities, '\\BumbleDocGen\\Renderer\\Twig\\MainExtension', 'getFunctions') }} -The function returns a reference to the documented entity, anchored to the getFunctions method - -``` - -```php -{{ getDocumentedEntityUrl(phpEntities, '\\BumbleDocGen\\Renderer\\Twig\\MainExtension') }} -The function returns a reference to the documented entity MainExtension - -``` - -```php -{{ getDocumentedEntityUrl(phpEntities, '\\BumbleDocGen\\Renderer\\Twig\\MainExtension', '', false) }} -The function returns a link to the file MainExtension - -``` - - - - -

    Settings:

    - - - - - - -
    Function name:getDocumentedEntityUrl
    - - - - -

    Initialization methods:

    - -
      -
    1. - __construct -
    2. -
    - -

    Methods:

    - -
      -
    1. - __invoke -
    2. -
    3. - getName -
    4. -
    5. - getOptions -
    6. -
    - - -

    Constants:

    - - - - - - -

    Method details:

    - -
    - - - -```php -public function __construct(\BumbleDocGen\Core\Renderer\RendererHelper $rendererHelper, \BumbleDocGen\Core\Renderer\Context\DocumentedEntityWrappersCollection $documentedEntityWrappersCollection, \BumbleDocGen\Core\Configuration\Configuration $configuration, \Monolog\Logger $logger); -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $rendererHelper\BumbleDocGen\Core\Renderer\RendererHelper-
    $documentedEntityWrappersCollection\BumbleDocGen\Core\Renderer\Context\DocumentedEntityWrappersCollection-
    $configuration\BumbleDocGen\Core\Configuration\Configuration-
    $logger\Monolog\Logger-
    - - - -
    -
    -
    - - - -```php -public function __invoke(\BumbleDocGen\Core\Parser\Entity\RootEntityCollection $rootEntityCollection, string $entityName, string $cursor = '', bool $createDocument = true): string; -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $rootEntityCollection\BumbleDocGen\Core\Parser\Entity\RootEntityCollectionProcessed entity collection
    $entityNamestringThe full name of the entity for which the URL will be retrieved. - If the entity is not found, the DEFAULT_URL value will be returned.
    $cursorstringCursor on the page of the documented entity (for example, the name of a method or property)
    $createDocumentboolIf true, creates an entity document. Otherwise, just gives a reference to the entity code
    - -Return value: string - - -Throws: - - -
    -
    -
    - - - -```php -public static function getName(): string; -``` - - - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -public static function getOptions(): array; -``` - - - -Parameters: not specified - -Return value: array - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/3.renderer/classes/Implode.md b/docs/tech/3.renderer/classes/Implode.md deleted file mode 100644 index 0dc078f4..00000000 --- a/docs/tech/3.renderer/classes/Implode.md +++ /dev/null @@ -1,154 +0,0 @@ - - BumbleDocGen / Technical description of the project / Renderer / Template filters / Implode
    - -

    - Implode class: -

    - - - - - -```php -namespace BumbleDocGen\Core\Renderer\Twig\Filter; - -final class Implode implements \BumbleDocGen\Core\Renderer\Twig\Filter\CustomFilterInterface -``` - -
    Join array elements with a string
    - -See: - - - - - -

    Settings:

    - - - - - - - - - - -
    namevalue
    Filter name:implode
    - - - - - -

    Methods:

    - -
      -
    1. - __invoke -
    2. -
    3. - getName -
    4. -
    5. - getOptions -
    6. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public function __invoke(array $elements, string $separator = ', '): string; -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $elementsarrayThe array to implode
    $separatorstringElement separator in result string
    - -Return value: string - - -
    -
    -
    - - - -```php -public static function getName(): string; -``` - - - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -public static function getOptions(): array; -``` - - - -Parameters: not specified - -Return value: array - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/3.renderer/classes/LoadPluginsContent.md b/docs/tech/3.renderer/classes/LoadPluginsContent.md deleted file mode 100644 index ceaccca5..00000000 --- a/docs/tech/3.renderer/classes/LoadPluginsContent.md +++ /dev/null @@ -1,201 +0,0 @@ - - BumbleDocGen / Technical description of the project / Renderer / Template functions / LoadPluginsContent
    - -

    - LoadPluginsContent class: -

    - - - - -:warning: Is internal -```php -namespace BumbleDocGen\Core\Renderer\Twig\Function; - -final class LoadPluginsContent implements \BumbleDocGen\Core\Renderer\Twig\Function\CustomFunctionInterface -``` - -
    Process entity template blocks with plugins. The method returns the content processed by plugins.
    - - -Examples of using: - -```php -{{ loadPluginsContent('some text', entity, constant('BumbleDocGen\\Plugin\\BaseTemplatePluginInterface::BLOCK_AFTER_HEADER')) }} - -``` - - - - -

    Settings:

    - - - - - - -
    Function name:loadPluginsContent
    - - - - -

    Initialization methods:

    - -
      -
    1. - __construct -
    2. -
    - -

    Methods:

    - -
      -
    1. - __invoke -
    2. -
    3. - getName -
    4. -
    5. - getOptions -
    6. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public function __construct(\BumbleDocGen\Core\Plugin\PluginEventDispatcher $pluginEventDispatcher); -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $pluginEventDispatcher\BumbleDocGen\Core\Plugin\PluginEventDispatcher-
    - - - -
    -
    -
    - - - -```php -public function __invoke(string $content, \BumbleDocGen\Core\Parser\Entity\RootEntityInterface $entity, string $blockType): string; -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $contentstringContent to be processed by plugins
    $entity\BumbleDocGen\Core\Parser\Entity\RootEntityInterfaceThe entity for which we process the content block
    $blockTypestringContent block type. @see BaseTemplatePluginInterface::BLOCK_*
    - -Return value: string - - -
    -
    -
    - - - -```php -public static function getName(): string; -``` - - - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -public static function getOptions(): array; -``` - - - -Parameters: not specified - -Return value: array - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/3.renderer/classes/PregMatch.md b/docs/tech/3.renderer/classes/PregMatch.md deleted file mode 100644 index 8594dfd6..00000000 --- a/docs/tech/3.renderer/classes/PregMatch.md +++ /dev/null @@ -1,154 +0,0 @@ - - BumbleDocGen / Technical description of the project / Renderer / Template filters / PregMatch
    - -

    - PregMatch class: -

    - - - - - -```php -namespace BumbleDocGen\Core\Renderer\Twig\Filter; - -final class PregMatch implements \BumbleDocGen\Core\Renderer\Twig\Filter\CustomFilterInterface -``` - -
    Perform a regular expression match
    - -See: - - - - - -

    Settings:

    - - - - - - - - - - -
    namevalue
    Filter name:preg_match
    - - - - - -

    Methods:

    - -
      -
    1. - __invoke -
    2. -
    3. - getName -
    4. -
    5. - getOptions -
    6. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public function __invoke(string $text, string $pattern): array; -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $textstringProcessed text
    $patternstringThe pattern to search for, as a string.
    - -Return value: array - - -
    -
    -
    - - - -```php -public static function getName(): string; -``` - - - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -public static function getOptions(): array; -``` - - - -Parameters: not specified - -Return value: array - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/3.renderer/classes/PrepareSourceLink.md b/docs/tech/3.renderer/classes/PrepareSourceLink.md deleted file mode 100644 index 479ebd63..00000000 --- a/docs/tech/3.renderer/classes/PrepareSourceLink.md +++ /dev/null @@ -1,143 +0,0 @@ - - BumbleDocGen / Technical description of the project / Renderer / Template filters / PrepareSourceLink
    - -

    - PrepareSourceLink class: -

    - - - - - -```php -namespace BumbleDocGen\Core\Renderer\Twig\Filter; - -final class PrepareSourceLink implements \BumbleDocGen\Core\Renderer\Twig\Filter\CustomFilterInterface -``` - -
    The filter converts the string into an anchor that can be used in a GitHub document link
    - - - - -

    Settings:

    - - - - - - - - - - -
    namevalue
    Filter name:prepareSourceLink
    - - - - - -

    Methods:

    - -
      -
    1. - __invoke -
    2. -
    3. - getName -
    4. -
    5. - getOptions -
    6. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public function __invoke(string $text): string; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $textstringProcessed text
    - -Return value: string - - -
    -
    -
    - - - -```php -public static function getName(): string; -``` - - - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -public static function getOptions(): array; -``` - - - -Parameters: not specified - -Return value: array - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/3.renderer/classes/PrintEntityCollectionAsList.md b/docs/tech/3.renderer/classes/PrintEntityCollectionAsList.md deleted file mode 100644 index 3f73562b..00000000 --- a/docs/tech/3.renderer/classes/PrintEntityCollectionAsList.md +++ /dev/null @@ -1,220 +0,0 @@ - - BumbleDocGen / Technical description of the project / Renderer / Template functions / PrintEntityCollectionAsList
    - -

    - PrintEntityCollectionAsList class: -

    - - - - - -```php -namespace BumbleDocGen\Core\Renderer\Twig\Function; - -final class PrintEntityCollectionAsList implements \BumbleDocGen\Core\Renderer\Twig\Function\CustomFunctionInterface -``` - -
    Outputting entity data as HTML list
    - - -Examples of using: - -```php -{{ printEntityCollectionAsList(phpEntities.filterByInterfaces(['ScriptFramework\\ScriptInterface', 'ScriptFramework\\TestScriptInterface'])) }} -The function will output a list of PHP classes that match the ScriptFramework\ScriptInterface and ScriptFramework\TestScriptInterface interfaces - -``` - -```php -{{ printEntityCollectionAsList(phpEntities) }} -The function will list all documented PHP classes - -``` - - - - -

    Settings:

    - - - - - - -
    Function name:printEntityCollectionAsList
    - - - - -

    Initialization methods:

    - -
      -
    1. - __construct -
    2. -
    - -

    Methods:

    - -
      -
    1. - __invoke -
    2. -
    3. - getName -
    4. -
    5. - getOptions -
    6. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public function __construct(\BumbleDocGen\Core\Renderer\Twig\Function\GetDocumentedEntityUrl $getDocumentedEntityUrlFunction); -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $getDocumentedEntityUrlFunction\BumbleDocGen\Core\Renderer\Twig\Function\GetDocumentedEntityUrl-
    - - - -
    -
    -
    - - - -```php -public function __invoke(\BumbleDocGen\Core\Parser\Entity\RootEntityCollection $rootEntityCollection, string $type = 'ul', bool $skipDescription = false, bool $useFullName = false): string; -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $rootEntityCollection\BumbleDocGen\Core\Parser\Entity\RootEntityCollectionProcessed entity collection
    $typestringList tag type (
      /
        )
    $skipDescriptionboolDon't print description of this entities
    $useFullNameboolUse the full name of the entity in the list
    - -Return value: string - - -Throws: - - -
    -
    -
    - - - -```php -public static function getName(): string; -``` - - - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -public static function getOptions(): array; -``` - - - -Parameters: not specified - -Return value: array - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/3.renderer/classes/Quotemeta.md b/docs/tech/3.renderer/classes/Quotemeta.md deleted file mode 100644 index 7e722aff..00000000 --- a/docs/tech/3.renderer/classes/Quotemeta.md +++ /dev/null @@ -1,149 +0,0 @@ - - BumbleDocGen / Technical description of the project / Renderer / Template filters / Quotemeta
    - -

    - Quotemeta class: -

    - - - - - -```php -namespace BumbleDocGen\Core\Renderer\Twig\Filter; - -final class Quotemeta implements \BumbleDocGen\Core\Renderer\Twig\Filter\CustomFilterInterface -``` - -
    Quote meta characters
    - -See: - - - - - -

    Settings:

    - - - - - - - - - - -
    namevalue
    Filter name:quotemeta
    - - - - - -

    Methods:

    - -
      -
    1. - __invoke -
    2. -
    3. - getName -
    4. -
    5. - getOptions -
    6. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public function __invoke(string $text): string; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $textstringProcessed text
    - -Return value: string - - -
    -
    -
    - - - -```php -public static function getName(): string; -``` - - - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -public static function getOptions(): array; -``` - - - -Parameters: not specified - -Return value: array - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/3.renderer/classes/RemoveLineBrakes.md b/docs/tech/3.renderer/classes/RemoveLineBrakes.md deleted file mode 100644 index 237cbdee..00000000 --- a/docs/tech/3.renderer/classes/RemoveLineBrakes.md +++ /dev/null @@ -1,143 +0,0 @@ - - BumbleDocGen / Technical description of the project / Renderer / Template filters / RemoveLineBrakes
    - -

    - RemoveLineBrakes class: -

    - - - - - -```php -namespace BumbleDocGen\Core\Renderer\Twig\Filter; - -final class RemoveLineBrakes implements \BumbleDocGen\Core\Renderer\Twig\Filter\CustomFilterInterface -``` - -
    The filter replaces all line breaks with a space
    - - - - -

    Settings:

    - - - - - - - - - - -
    namevalue
    Filter name:removeLineBrakes
    - - - - - -

    Methods:

    - -
      -
    1. - __invoke -
    2. -
    3. - getName -
    4. -
    5. - getOptions -
    6. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public function __invoke(string $text): string; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $textstringProcessed text
    - -Return value: string - - -
    -
    -
    - - - -```php -public static function getName(): string; -``` - - - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -public static function getOptions(): array; -``` - - - -Parameters: not specified - -Return value: array - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/3.renderer/classes/RendererContext.md b/docs/tech/3.renderer/classes/RendererContext.md deleted file mode 100644 index 0d882f70..00000000 --- a/docs/tech/3.renderer/classes/RendererContext.md +++ /dev/null @@ -1,259 +0,0 @@ - - BumbleDocGen / Technical description of the project / Renderer / RendererContext
    - -

    - RendererContext class: -

    - - - - - -```php -namespace BumbleDocGen\Core\Renderer\Context; - -final class RendererContext -``` - -
    Document rendering context
    - - - - - - - -

    Methods:

    - -
      -
    1. - addDependency -
    2. -
    3. - clearDependencies -
    4. -
    5. - getCurrentDocumentedEntityWrapper -
    6. -
    7. - getCurrentTemplateFilePatch - - Getting the path to the template file that is currently being worked on
    8. -
    9. - getDependencies -
    10. -
    11. - setCurrentDocumentedEntityWrapper -
    12. -
    13. - setCurrentTemplateFilePatch - - Saving the path to the template file that is currently being worked on in the context
    14. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public function addDependency(\BumbleDocGen\Core\Renderer\Context\Dependency\RendererDependencyInterface $dependency): void; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $dependency\BumbleDocGen\Core\Renderer\Context\Dependency\RendererDependencyInterface-
    - -Return value: void - - -
    -
    -
    - - - -```php -public function clearDependencies(): void; -``` - - - -Parameters: not specified - -Return value: void - - -
    -
    -
    - - - -```php -public function getCurrentDocumentedEntityWrapper(): null|\BumbleDocGen\Core\Renderer\Context\DocumentedEntityWrapper; -``` - - - -Parameters: not specified - -Return value: null | \BumbleDocGen\Core\Renderer\Context\DocumentedEntityWrapper - - -
    -
    -
    - - - -```php -public function getCurrentTemplateFilePatch(): string; -``` - -
    Getting the path to the template file that is currently being worked on
    - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -public function getDependencies(): array; -``` - - - -Parameters: not specified - -Return value: array - - -
    -
    -
    - - - -```php -public function setCurrentDocumentedEntityWrapper(\BumbleDocGen\Core\Renderer\Context\DocumentedEntityWrapper $currentDocumentedEntityWrapper): void; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $currentDocumentedEntityWrapper\BumbleDocGen\Core\Renderer\Context\DocumentedEntityWrapper-
    - -Return value: void - - -
    -
    -
    - - - -```php -public function setCurrentTemplateFilePatch(string $currentTemplateFilePath): void; -``` - -
    Saving the path to the template file that is currently being worked on in the context
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $currentTemplateFilePathstring-
    - -Return value: void - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/3.renderer/classes/RootEntityCollection.md b/docs/tech/3.renderer/classes/RootEntityCollection.md deleted file mode 100644 index 39cf71c5..00000000 --- a/docs/tech/3.renderer/classes/RootEntityCollection.md +++ /dev/null @@ -1,540 +0,0 @@ - - BumbleDocGen / Technical description of the project / Renderer / Template functions / RootEntityCollection
    - -

    - RootEntityCollection class: -

    - - - - - -```php -namespace BumbleDocGen\Core\Parser\Entity; - -abstract class RootEntityCollection extends \BumbleDocGen\Core\Parser\Entity\BaseEntityCollection implements \IteratorAggregate -``` - - - - - - - - - -

    Methods:

    - -
      -
    1. - findEntity - - Find an entity in a collection
    2. -
    3. - get - - Get an entity from a collection (only previously added)
    4. -
    5. - getEntityCollectionName - - Get collection name
    6. -
    7. - getEntityLinkData -
    8. -
    9. - getIterator -
    10. -
    11. - getLoadedOrCreateNew - - Get an entity from the collection or create a new one if it has not yet been added
    12. -
    13. - has - - Check if an entity has been added to the collection
    14. -
    15. - isEmpty - - Check if the collection is empty or not
    16. -
    17. - loadEntities -
    18. -
    19. - loadEntitiesByConfiguration -
    20. -
    21. - remove - - Remove an entity from a collection
    22. -
    23. - toArray - - Convert collection to array
    24. -
    25. - updateEntitiesCache -
    26. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public function findEntity(string $search, bool $useUnsafeKeys = true): null|\BumbleDocGen\Core\Parser\Entity\RootEntityInterface; -``` - -
    Find an entity in a collection
    - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $searchstring-
    $useUnsafeKeysbool-
    - -Return value: null | \BumbleDocGen\Core\Parser\Entity\RootEntityInterface - - -
    -
    -
    - - - -```php -public function get(string $objectName): null|\BumbleDocGen\Core\Parser\Entity\RootEntityInterface; -``` - -
    Get an entity from a collection (only previously added)
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $objectNamestring-
    - -Return value: null | \BumbleDocGen\Core\Parser\Entity\RootEntityInterface - - -
    -
    -
    - - - -```php -public function getEntityCollectionName(): string; -``` - -
    Get collection name
    - -Parameters: not specified - -Return value: string - - -
    -
    -
    - -
      -
    • # - getEntityLinkData - :warning: Is internal | source code
    • -
    - -```php -public function getEntityLinkData(string $rawLink, string|null $defaultEntityName = null, bool $useUnsafeKeys = true): array; -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $rawLinkstringRaw link to an entity or entity element
    $defaultEntityNamestring | nullEntity name to use if the link does not contain a valid or existing entity name, - but only a cursor on an entity element
    $useUnsafeKeysbool-
    - -Return value: array - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\Core\Parser\Entity\BaseEntityCollection - -public function getIterator(): \Generator; -``` - - - -Parameters: not specified - -Return value: \Generator - - -
    -
    -
    - - - -```php -public function getLoadedOrCreateNew(string $objectName, bool $withAddClassEntityToCollectionEvent = false): \BumbleDocGen\Core\Parser\Entity\RootEntityInterface; -``` - -
    Get an entity from the collection or create a new one if it has not yet been added
    - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $objectNamestring-
    $withAddClassEntityToCollectionEventbool-
    - -Return value: \BumbleDocGen\Core\Parser\Entity\RootEntityInterface - - - -See: - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\Core\Parser\Entity\BaseEntityCollection - -public function has(string $objectName): bool; -``` - -
    Check if an entity has been added to the collection
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $objectNamestring-
    - -Return value: bool - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\Core\Parser\Entity\BaseEntityCollection - -public function isEmpty(): bool; -``` - -
    Check if the collection is empty or not
    - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - - - -```php -public function loadEntities(\BumbleDocGen\Core\Parser\SourceLocator\SourceLocatorsCollection $sourceLocatorsCollection, \BumbleDocGen\Core\Parser\FilterCondition\ConditionInterface|null $filters = null, \BumbleDocGen\Core\Parser\Entity\EntitiesLoaderProgressBarInterface|null $progressBar = null): \BumbleDocGen\Core\Parser\Entity\CollectionLoadEntitiesResult; -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $sourceLocatorsCollection\BumbleDocGen\Core\Parser\SourceLocator\SourceLocatorsCollection-
    $filters\BumbleDocGen\Core\Parser\FilterCondition\ConditionInterface | null-
    $progressBar\BumbleDocGen\Core\Parser\Entity\EntitiesLoaderProgressBarInterface | null-
    - -Return value: \BumbleDocGen\Core\Parser\Entity\CollectionLoadEntitiesResult - - -
    -
    -
    - - - -```php -public function loadEntitiesByConfiguration(\BumbleDocGen\Core\Parser\Entity\EntitiesLoaderProgressBarInterface|null $progressBar = null): \BumbleDocGen\Core\Parser\Entity\CollectionLoadEntitiesResult; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $progressBar\BumbleDocGen\Core\Parser\Entity\EntitiesLoaderProgressBarInterface | null-
    - -Return value: \BumbleDocGen\Core\Parser\Entity\CollectionLoadEntitiesResult - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\Core\Parser\Entity\BaseEntityCollection - -public function remove(string $objectName): void; -``` - -
    Remove an entity from a collection
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $objectNamestring-
    - -Return value: void - - -
    -
    -
    - - - -```php -public function toArray(): array; -``` - -
    Convert collection to array
    - -Parameters: not specified - -Return value: array - - -
    -
    -
    - -
      -
    • # - updateEntitiesCache - :warning: Is internal | source code
    • -
    - -```php -public function updateEntitiesCache(): void; -``` - - - -Parameters: not specified - -Return value: void - - -Throws: - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/3.renderer/classes/StrTypeToUrl.md b/docs/tech/3.renderer/classes/StrTypeToUrl.md deleted file mode 100644 index 3ceef34f..00000000 --- a/docs/tech/3.renderer/classes/StrTypeToUrl.md +++ /dev/null @@ -1,218 +0,0 @@ - - BumbleDocGen / Technical description of the project / Renderer / Template filters / StrTypeToUrl
    - -

    - StrTypeToUrl class: -

    - - - - - -```php -namespace BumbleDocGen\Core\Renderer\Twig\Filter; - -final class StrTypeToUrl implements \BumbleDocGen\Core\Renderer\Twig\Filter\CustomFilterInterface -``` - -
    The filter converts the string with the data type into a link to the documented entity, if possible.
    - -See: - - - - - -

    Settings:

    - - - - - - - - - - -
    namevalue
    Filter name:strTypeToUrl
    - - - - -

    Initialization methods:

    - -
      -
    1. - __construct -
    2. -
    - -

    Methods:

    - -
      -
    1. - __invoke -
    2. -
    3. - getName -
    4. -
    5. - getOptions -
    6. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public function __construct(\BumbleDocGen\Core\Renderer\RendererHelper $rendererHelper, \BumbleDocGen\Core\Renderer\Twig\Function\GetDocumentedEntityUrl $getDocumentedEntityUrlFunction, \Monolog\Logger $logger); -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $rendererHelper\BumbleDocGen\Core\Renderer\RendererHelper-
    $getDocumentedEntityUrlFunction\BumbleDocGen\Core\Renderer\Twig\Function\GetDocumentedEntityUrl-
    $logger\Monolog\Logger-
    - - - -
    -
    -
    - - - -```php -public function __invoke(string $text, \BumbleDocGen\Core\Parser\Entity\RootEntityCollection $rootEntityCollection, bool $useShortLinkVersion = false, bool $createDocument = false): string; -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $textstringProcessed text
    $rootEntityCollection\BumbleDocGen\Core\Parser\Entity\RootEntityCollection-
    $useShortLinkVersionboolShorten or not the link name. When shortening, only the shortName of the entity will be shown
    $createDocumentboolIf true, creates an entity document. Otherwise, just gives a reference to the entity code
    - -Return value: string - - -
    -
    -
    - - - -```php -public static function getName(): string; -``` - - - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -public static function getOptions(): array; -``` - - - -Parameters: not specified - -Return value: array - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/3.renderer/classes/TextToCodeBlock.md b/docs/tech/3.renderer/classes/TextToCodeBlock.md deleted file mode 100644 index e24d5d55..00000000 --- a/docs/tech/3.renderer/classes/TextToCodeBlock.md +++ /dev/null @@ -1,148 +0,0 @@ - - BumbleDocGen / Technical description of the project / Renderer / Template filters / TextToCodeBlock
    - -

    - TextToCodeBlock class: -

    - - - - - -```php -namespace BumbleDocGen\Core\Renderer\Twig\Filter; - -final class TextToCodeBlock implements \BumbleDocGen\Core\Renderer\Twig\Filter\CustomFilterInterface -``` - -
    Convert text to code block
    - - - - -

    Settings:

    - - - - - - - - - - -
    namevalue
    Filter name:textToCodeBlock
    - - - - - -

    Methods:

    - -
      -
    1. - __invoke -
    2. -
    3. - getName -
    4. -
    5. - getOptions -
    6. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public function __invoke(string $text, string $codeBlockType): string; -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $textstringProcessed text
    $codeBlockTypestringCode block type (e.g. php or console )
    - -Return value: string - - -
    -
    -
    - - - -```php -public static function getName(): string; -``` - - - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -public static function getOptions(): array; -``` - - - -Parameters: not specified - -Return value: array - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/3.renderer/classes/TextToHeading.md b/docs/tech/3.renderer/classes/TextToHeading.md deleted file mode 100644 index 503e117a..00000000 --- a/docs/tech/3.renderer/classes/TextToHeading.md +++ /dev/null @@ -1,148 +0,0 @@ - - BumbleDocGen / Technical description of the project / Renderer / Template filters / TextToHeading
    - -

    - TextToHeading class: -

    - - - - - -```php -namespace BumbleDocGen\Core\Renderer\Twig\Filter; - -final class TextToHeading implements \BumbleDocGen\Core\Renderer\Twig\Filter\CustomFilterInterface -``` - -
    Convert text to html header
    - - - - -

    Settings:

    - - - - - - - - - - -
    namevalue
    Filter name:textToHeading
    - - - - - -

    Methods:

    - -
      -
    1. - __invoke -
    2. -
    3. - getName -
    4. -
    5. - getOptions -
    6. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public function __invoke(string $text, string $headingType): string; -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $textstring-
    $headingTypestringChoose heading type: H1, H2, H3
    - -Return value: string - - -
    -
    -
    - - - -```php -public static function getName(): string; -``` - - - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -public static function getOptions(): array; -``` - - - -Parameters: not specified - -Return value: array - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/3.renderer/templatesVariables.md b/docs/tech/3.renderer/templatesVariables.md deleted file mode 100644 index 25123956..00000000 --- a/docs/tech/3.renderer/templatesVariables.md +++ /dev/null @@ -1,14 +0,0 @@ - BumbleDocGen / Technical description of the project / Renderer / How to create documentation templates? / Templates variables
    - -

    Templates variables

    - -There are several variables available in each processed template. - -1) Firstly, these are built-in twig variables, for example `_self`, which returns the path to the processed template. - -2) Secondly, variables with collections of processed programming languages are available in the template (see LanguageHandlerInterface). For example, when processing a PHP project collection, a collection PhpEntitiesCollection will be available in the template under the name phpEntities - - -
    -
    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Dec 23 23:00:37 2023 +0300
    Page content update date: Sat Dec 23 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file diff --git a/docs/tech/4.pluginSystem/classes/AfterLoadingPhpEntitiesCollection.md b/docs/tech/4.pluginSystem/classes/AfterLoadingPhpEntitiesCollection.md deleted file mode 100644 index 3e574f81..00000000 --- a/docs/tech/4.pluginSystem/classes/AfterLoadingPhpEntitiesCollection.md +++ /dev/null @@ -1,108 +0,0 @@ - - BumbleDocGen / Technical description of the project / Plugin system / AfterLoadingPhpEntitiesCollection
    - -

    - AfterLoadingPhpEntitiesCollection class: -

    - - - - - -```php -namespace BumbleDocGen\LanguageHandler\Php\Plugin\Event\Parser; - -final class AfterLoadingPhpEntitiesCollection extends \Symfony\Contracts\EventDispatcher\Event -``` - -
    The event is called after the initial creation of a collection of PHP entities
    - - - - - - -

    Initialization methods:

    - -
      -
    1. - __construct -
    2. -
    - -

    Methods:

    - -
      -
    1. - getPhpEntitiesCollection -
    2. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public function __construct(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection $entitiesCollection); -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $entitiesCollection\BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection-
    - - - -
    -
    -
    - - - -```php -public function getPhpEntitiesCollection(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; -``` - - - -Parameters: not specified - -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/4.pluginSystem/classes/AfterRenderingEntities.md b/docs/tech/4.pluginSystem/classes/AfterRenderingEntities.md deleted file mode 100644 index ef0e7529..00000000 --- a/docs/tech/4.pluginSystem/classes/AfterRenderingEntities.md +++ /dev/null @@ -1,34 +0,0 @@ - - BumbleDocGen / Technical description of the project / Plugin system / AfterRenderingEntities
    - -

    - AfterRenderingEntities class: -

    - - - - - -```php -namespace BumbleDocGen\Core\Plugin\Event\Renderer; - -final class AfterRenderingEntities extends \Symfony\Contracts\EventDispatcher\Event -``` - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/tech/4.pluginSystem/classes/BasePhpStubberPlugin.md b/docs/tech/4.pluginSystem/classes/BasePhpStubberPlugin.md deleted file mode 100644 index 1b67ebf2..00000000 --- a/docs/tech/4.pluginSystem/classes/BasePhpStubberPlugin.md +++ /dev/null @@ -1,146 +0,0 @@ - - BumbleDocGen / Technical description of the project / Plugin system / BasePhpStubberPlugin
    - -

    - BasePhpStubberPlugin class: -

    - - - - - -```php -namespace BumbleDocGen\LanguageHandler\Php\Plugin\CorePlugin\BasePhpStubber; - -final class BasePhpStubberPlugin implements \BumbleDocGen\Core\Plugin\PluginInterface, \Symfony\Component\EventDispatcher\EventSubscriberInterface -``` - -
    Adding links to type documentation and documentation of built-in PHP classes
    - - - - - - - -

    Methods:

    - -
      -
    1. - getSubscribedEvents -
    2. -
    3. - onCheckIsEntityCanBeLoaded -
    4. -
    5. - onGettingResourceLink -
    6. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public static function getSubscribedEvents(): array; -``` - - - -Parameters: not specified - -Return value: array - - -
    -
    -
    - - - -```php -public function onCheckIsEntityCanBeLoaded(\BumbleDocGen\LanguageHandler\Php\Plugin\Event\Entity\OnCheckIsEntityCanBeLoaded $event): void; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $event\BumbleDocGen\LanguageHandler\Php\Plugin\Event\Entity\OnCheckIsEntityCanBeLoaded-
    - -Return value: void - - -
    -
    -
    - - - -```php -public function onGettingResourceLink(\BumbleDocGen\Core\Plugin\Event\Renderer\OnGettingResourceLink $event): void; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $event\BumbleDocGen\Core\Plugin\Event\Renderer\OnGettingResourceLink-
    - -Return value: void - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/4.pluginSystem/classes/BeforeParsingProcess.md b/docs/tech/4.pluginSystem/classes/BeforeParsingProcess.md deleted file mode 100644 index 3dfa8e1a..00000000 --- a/docs/tech/4.pluginSystem/classes/BeforeParsingProcess.md +++ /dev/null @@ -1,63 +0,0 @@ - - BumbleDocGen / Technical description of the project / Plugin system / BeforeParsingProcess
    - -

    - BeforeParsingProcess class: -

    - - - - - -```php -namespace BumbleDocGen\Core\Plugin\Event\Parser; - -final class BeforeParsingProcess extends \Symfony\Contracts\EventDispatcher\Event -``` - - - - - - - - -

    Initialization methods:

    - -
      -
    1. - __construct -
    2. -
    - - - - - - - - -

    Method details:

    - -
    - - - -```php -public function __construct(); -``` - - - -Parameters: not specified - - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/4.pluginSystem/classes/BeforeRenderingDocFiles.md b/docs/tech/4.pluginSystem/classes/BeforeRenderingDocFiles.md deleted file mode 100644 index 56d1b6d4..00000000 --- a/docs/tech/4.pluginSystem/classes/BeforeRenderingDocFiles.md +++ /dev/null @@ -1,34 +0,0 @@ - - BumbleDocGen / Technical description of the project / Plugin system / BeforeRenderingDocFiles
    - -

    - BeforeRenderingDocFiles class: -

    - - - - - -```php -namespace BumbleDocGen\Core\Plugin\Event\Renderer; - -final class BeforeRenderingDocFiles extends \Symfony\Contracts\EventDispatcher\Event -``` - -
    The event occurs before the main documents begin rendering
    - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/tech/4.pluginSystem/classes/BeforeRenderingEntities.md b/docs/tech/4.pluginSystem/classes/BeforeRenderingEntities.md deleted file mode 100644 index 701664b0..00000000 --- a/docs/tech/4.pluginSystem/classes/BeforeRenderingEntities.md +++ /dev/null @@ -1,34 +0,0 @@ - - BumbleDocGen / Technical description of the project / Plugin system / BeforeRenderingEntities
    - -

    - BeforeRenderingEntities class: -

    - - - - - -```php -namespace BumbleDocGen\Core\Plugin\Event\Renderer; - -final class BeforeRenderingEntities extends \Symfony\Contracts\EventDispatcher\Event -``` - -
    The event occurs before the rendering of entity documents begins, after the main documents have been created
    - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/tech/4.pluginSystem/classes/EntityDocUnifiedPlacePlugin.md b/docs/tech/4.pluginSystem/classes/EntityDocUnifiedPlacePlugin.md deleted file mode 100644 index a50338c3..00000000 --- a/docs/tech/4.pluginSystem/classes/EntityDocUnifiedPlacePlugin.md +++ /dev/null @@ -1,196 +0,0 @@ - - BumbleDocGen / Technical description of the project / Plugin system / EntityDocUnifiedPlacePlugin
    - -

    - EntityDocUnifiedPlacePlugin class: -

    - - - - - -```php -namespace BumbleDocGen\LanguageHandler\Php\Plugin\CorePlugin\EntityDocUnifiedPlace; - -final class EntityDocUnifiedPlacePlugin implements \BumbleDocGen\Core\Plugin\PluginInterface, \Symfony\Component\EventDispatcher\EventSubscriberInterface -``` - -
    This plugin changes the algorithm for saving entity documents. The standard system stores each file -in a directory next to the file where it was requested. This behavior changes and all documents are saved -in a separate directory structure, so they are not duplicated.
    - - - - - - - -

    Methods:

    - -
      -
    1. - getSubscribedEvents -
    2. -
    3. - onCreateDocumentedEntityWrapper -
    4. -
    5. - onGetProjectTemplatesDirs -
    6. -
    7. - onGetTemplatePathByRelativeDocPath -
    8. -
    - - -

    Constants:

    - - - - - - -

    Method details:

    - -
    - - - -```php -public static function getSubscribedEvents(): array; -``` - - - -Parameters: not specified - -Return value: array - - -
    -
    -
    - - - -```php -public function onCreateDocumentedEntityWrapper(\BumbleDocGen\Core\Plugin\Event\Renderer\OnCreateDocumentedEntityWrapper $event): void; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $event\BumbleDocGen\Core\Plugin\Event\Renderer\OnCreateDocumentedEntityWrapper-
    - -Return value: void - - -
    -
    -
    - - - -```php -public function onGetProjectTemplatesDirs(\BumbleDocGen\Core\Plugin\Event\Renderer\OnGetProjectTemplatesDirs $event): void; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $event\BumbleDocGen\Core\Plugin\Event\Renderer\OnGetProjectTemplatesDirs-
    - -Return value: void - - -
    -
    -
    - - - -```php -public function onGetTemplatePathByRelativeDocPath(\BumbleDocGen\Core\Plugin\Event\Renderer\OnGetTemplatePathByRelativeDocPath $event): void; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $event\BumbleDocGen\Core\Plugin\Event\Renderer\OnGetTemplatePathByRelativeDocPath-
    - -Return value: void - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/4.pluginSystem/classes/InvalidConfigurationParameterException.md b/docs/tech/4.pluginSystem/classes/InvalidConfigurationParameterException.md deleted file mode 100644 index 789262bc..00000000 --- a/docs/tech/4.pluginSystem/classes/InvalidConfigurationParameterException.md +++ /dev/null @@ -1,34 +0,0 @@ - - BumbleDocGen / Technical description of the project / Plugin system / InvalidConfigurationParameterException
    - -

    - InvalidConfigurationParameterException class: -

    - - - - - -```php -namespace BumbleDocGen\Core\Configuration\Exception; - -final class InvalidConfigurationParameterException extends \Exception -``` - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/tech/4.pluginSystem/classes/LastPageCommitter.md b/docs/tech/4.pluginSystem/classes/LastPageCommitter.md deleted file mode 100644 index 1f23c02c..00000000 --- a/docs/tech/4.pluginSystem/classes/LastPageCommitter.md +++ /dev/null @@ -1,154 +0,0 @@ - - BumbleDocGen / Technical description of the project / Plugin system / LastPageCommitter
    - -

    - LastPageCommitter class: -

    - - - - - -```php -namespace BumbleDocGen\Core\Plugin\CorePlugin\LastPageCommitter; - -final class LastPageCommitter implements \BumbleDocGen\Core\Plugin\PluginInterface, \Symfony\Component\EventDispatcher\EventSubscriberInterface -``` - -
    Plugin for adding a block with information about the last commit and date of page update to the generated document
    - - - - - - -

    Initialization methods:

    - -
      -
    1. - __construct -
    2. -
    - -

    Methods:

    - -
      -
    1. - beforeCreatingDocFile -
    2. -
    3. - getSubscribedEvents -
    4. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public function __construct(\BumbleDocGen\Core\Renderer\Context\RendererContext $context, \BumbleDocGen\Core\Configuration\Configuration $configuration); -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $context\BumbleDocGen\Core\Renderer\Context\RendererContext-
    $configuration\BumbleDocGen\Core\Configuration\Configuration-
    - - - -
    -
    -
    - - - -```php -public function beforeCreatingDocFile(\BumbleDocGen\Core\Plugin\Event\Renderer\BeforeCreatingDocFile $event): void; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $event\BumbleDocGen\Core\Plugin\Event\Renderer\BeforeCreatingDocFile-
    - -Return value: void - - -
    -
    -
    - - - -```php -public static function getSubscribedEvents(): array; -``` - - - -Parameters: not specified - -Return value: array - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/4.pluginSystem/classes/LoadPluginsContent.md b/docs/tech/4.pluginSystem/classes/LoadPluginsContent.md deleted file mode 100644 index 86042ae0..00000000 --- a/docs/tech/4.pluginSystem/classes/LoadPluginsContent.md +++ /dev/null @@ -1,201 +0,0 @@ - - BumbleDocGen / Technical description of the project / Plugin system / LoadPluginsContent
    - -

    - LoadPluginsContent class: -

    - - - - -:warning: Is internal -```php -namespace BumbleDocGen\Core\Renderer\Twig\Function; - -final class LoadPluginsContent implements \BumbleDocGen\Core\Renderer\Twig\Function\CustomFunctionInterface -``` - -
    Process entity template blocks with plugins. The method returns the content processed by plugins.
    - - -Examples of using: - -```php -{{ loadPluginsContent('some text', entity, constant('BumbleDocGen\\Plugin\\BaseTemplatePluginInterface::BLOCK_AFTER_HEADER')) }} - -``` - - - - -

    Settings:

    - - - - - - -
    Function name:loadPluginsContent
    - - - - -

    Initialization methods:

    - -
      -
    1. - __construct -
    2. -
    - -

    Methods:

    - -
      -
    1. - __invoke -
    2. -
    3. - getName -
    4. -
    5. - getOptions -
    6. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public function __construct(\BumbleDocGen\Core\Plugin\PluginEventDispatcher $pluginEventDispatcher); -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $pluginEventDispatcher\BumbleDocGen\Core\Plugin\PluginEventDispatcher-
    - - - -
    -
    -
    - - - -```php -public function __invoke(string $content, \BumbleDocGen\Core\Parser\Entity\RootEntityInterface $entity, string $blockType): string; -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $contentstringContent to be processed by plugins
    $entity\BumbleDocGen\Core\Parser\Entity\RootEntityInterfaceThe entity for which we process the content block
    $blockTypestringContent block type. @see BaseTemplatePluginInterface::BLOCK_*
    - -Return value: string - - -
    -
    -
    - - - -```php -public static function getName(): string; -``` - - - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -public static function getOptions(): array; -``` - - - -Parameters: not specified - -Return value: array - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/4.pluginSystem/classes/OnAddClassEntityToCollection.md b/docs/tech/4.pluginSystem/classes/OnAddClassEntityToCollection.md deleted file mode 100644 index 80e0d3d9..00000000 --- a/docs/tech/4.pluginSystem/classes/OnAddClassEntityToCollection.md +++ /dev/null @@ -1,161 +0,0 @@ - - BumbleDocGen / Technical description of the project / Plugin system / OnAddClassEntityToCollection
    - -

    - OnAddClassEntityToCollection class: -

    - - - - - -```php -namespace BumbleDocGen\LanguageHandler\Php\Plugin\Event\Parser; - -final class OnAddClassEntityToCollection extends \Symfony\Contracts\EventDispatcher\Event implements \BumbleDocGen\Core\Plugin\OnlySingleExecutionEvent -``` - -
    Called when each class entity is added to the entity collection
    - - - - - - -

    Initialization methods:

    - -
      -
    1. - __construct -
    2. -
    - -

    Methods:

    - -
      -
    1. - getClassEntityCollection -
    2. -
    3. - getRootEntity -
    4. -
    5. - getUniqueExecutionId -
    6. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public function __construct(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity $classEntity, \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection $entitiesCollection); -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $classEntity\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity-
    $entitiesCollection\BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection-
    - - - -
    -
    -
    - - - -```php -public function getClassEntityCollection(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; -``` - - - -Parameters: not specified - -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection - - -
    -
    -
    - - - -```php -public function getRootEntity(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; -``` - - - -Parameters: not specified - -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - - -
    -
    -
    - - - -```php -public function getUniqueExecutionId(): string; -``` - - - -Parameters: not specified - -Return value: string - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/4.pluginSystem/classes/OnCheckIsEntityCanBeLoaded.md b/docs/tech/4.pluginSystem/classes/OnCheckIsEntityCanBeLoaded.md deleted file mode 100644 index c322fe3d..00000000 --- a/docs/tech/4.pluginSystem/classes/OnCheckIsEntityCanBeLoaded.md +++ /dev/null @@ -1,175 +0,0 @@ - - BumbleDocGen / Technical description of the project / Plugin system / OnCheckIsEntityCanBeLoaded
    - -

    - OnCheckIsEntityCanBeLoaded class: -

    - - - - - -```php -namespace BumbleDocGen\LanguageHandler\Php\Plugin\Event\Entity; - -final class OnCheckIsEntityCanBeLoaded extends \Symfony\Contracts\EventDispatcher\Event -``` - - - - - - - - -

    Initialization methods:

    - -
      -
    1. - __construct -
    2. -
    - -

    Methods:

    - -
      -
    1. - disableEntityLoading -
    2. -
    3. - getEntity -
    4. -
    5. - isEntityCanBeLoaded -
    6. -
    - - - -

    Properties:

    - -
      -
    1. - isEntityCanBeLoaded
    2. -
    - - - -

    Property details:

    - - -* # - $isEntityCanBeLoaded - **|** source code -```php -public bool $isEntityCanBeLoaded; - -``` - - - - -

    Method details:

    - -
    - - - -```php -public function __construct(\BumbleDocGen\Core\Parser\Entity\RootEntityInterface $entity); -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $entity\BumbleDocGen\Core\Parser\Entity\RootEntityInterface-
    - - - -
    -
    -
    - - - -```php -public function disableEntityLoading(): void; -``` - - - -Parameters: not specified - -Return value: void - - -
    -
    -
    - - - -```php -public function getEntity(): \BumbleDocGen\Core\Parser\Entity\RootEntityInterface; -``` - - - -Parameters: not specified - -Return value: \BumbleDocGen\Core\Parser\Entity\RootEntityInterface - - -
    -
    -
    - - - -```php -public function isEntityCanBeLoaded(): bool; -``` - - - -Parameters: not specified - -Return value: bool - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/4.pluginSystem/classes/OnCreateDocumentedEntityWrapper.md b/docs/tech/4.pluginSystem/classes/OnCreateDocumentedEntityWrapper.md deleted file mode 100644 index df37da81..00000000 --- a/docs/tech/4.pluginSystem/classes/OnCreateDocumentedEntityWrapper.md +++ /dev/null @@ -1,108 +0,0 @@ - - BumbleDocGen / Technical description of the project / Plugin system / OnCreateDocumentedEntityWrapper
    - -

    - OnCreateDocumentedEntityWrapper class: -

    - - - - - -```php -namespace BumbleDocGen\Core\Plugin\Event\Renderer; - -final class OnCreateDocumentedEntityWrapper extends \Symfony\Contracts\EventDispatcher\Event -``` - -
    The event occurs when an entity is added to the list for documentation
    - - - - - - -

    Initialization methods:

    - -
      -
    1. - __construct -
    2. -
    - -

    Methods:

    - -
      -
    1. - getDocumentedEntityWrapper -
    2. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public function __construct(\BumbleDocGen\Core\Renderer\Context\DocumentedEntityWrapper $documentedEntityWrapper); -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $documentedEntityWrapper\BumbleDocGen\Core\Renderer\Context\DocumentedEntityWrapper-
    - - - -
    -
    -
    - - - -```php -public function getDocumentedEntityWrapper(): \BumbleDocGen\Core\Renderer\Context\DocumentedEntityWrapper; -``` - - - -Parameters: not specified - -Return value: \BumbleDocGen\Core\Renderer\Context\DocumentedEntityWrapper - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/4.pluginSystem/classes/OnGetProjectTemplatesDirs.md b/docs/tech/4.pluginSystem/classes/OnGetProjectTemplatesDirs.md deleted file mode 100644 index 8eb40ac3..00000000 --- a/docs/tech/4.pluginSystem/classes/OnGetProjectTemplatesDirs.md +++ /dev/null @@ -1,149 +0,0 @@ - - BumbleDocGen / Technical description of the project / Plugin system / OnGetProjectTemplatesDirs
    - -

    - OnGetProjectTemplatesDirs class: -

    - - - - - -```php -namespace BumbleDocGen\Core\Plugin\Event\Renderer; - -final class OnGetProjectTemplatesDirs extends \Symfony\Contracts\EventDispatcher\Event -``` - -
    This event occurs when all directories containing document templates are retrieved
    - - - - - - -

    Initialization methods:

    - -
      -
    1. - __construct -
    2. -
    - -

    Methods:

    - -
      -
    1. - addTemplatesDir -
    2. -
    3. - getTemplatesDirs -
    4. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public function __construct(array $templatesDirs); -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $templatesDirsarray-
    - - - -
    -
    -
    - - - -```php -public function addTemplatesDir(string $dirName): void; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $dirNamestring-
    - -Return value: void - - -
    -
    -
    - - - -```php -public function getTemplatesDirs(): array; -``` - - - -Parameters: not specified - -Return value: array - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/4.pluginSystem/classes/OnGetTemplatePathByRelativeDocPath.md b/docs/tech/4.pluginSystem/classes/OnGetTemplatePathByRelativeDocPath.md deleted file mode 100644 index 8a31a6dd..00000000 --- a/docs/tech/4.pluginSystem/classes/OnGetTemplatePathByRelativeDocPath.md +++ /dev/null @@ -1,173 +0,0 @@ - - BumbleDocGen / Technical description of the project / Plugin system / OnGetTemplatePathByRelativeDocPath
    - -

    - OnGetTemplatePathByRelativeDocPath class: -

    - - - - - -```php -namespace BumbleDocGen\Core\Plugin\Event\Renderer; - -final class OnGetTemplatePathByRelativeDocPath extends \Symfony\Contracts\EventDispatcher\Event -``` - -
    The event occurs when the path to the template file is obtained relative to the path to the document
    - - - - - - -

    Initialization methods:

    - -
      -
    1. - __construct -
    2. -
    - -

    Methods:

    - -
      -
    1. - getCustomTemplateFilePath -
    2. -
    3. - getTemplateName -
    4. -
    5. - setCustomTemplateFilePath -
    6. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public function __construct(string $templateName); -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $templateNamestring-
    - - - -
    -
    -
    - - - -```php -public function getCustomTemplateFilePath(): null|string; -``` - - - -Parameters: not specified - -Return value: null | string - - -
    -
    -
    - - - -```php -public function getTemplateName(): string; -``` - - - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -public function setCustomTemplateFilePath(string|null $customTemplateFilePath): void; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $customTemplateFilePathstring | null-
    - -Return value: void - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/4.pluginSystem/classes/OnGettingResourceLink.md b/docs/tech/4.pluginSystem/classes/OnGettingResourceLink.md deleted file mode 100644 index f18c7386..00000000 --- a/docs/tech/4.pluginSystem/classes/OnGettingResourceLink.md +++ /dev/null @@ -1,173 +0,0 @@ - - BumbleDocGen / Technical description of the project / Plugin system / OnGettingResourceLink
    - -

    - OnGettingResourceLink class: -

    - - - - - -```php -namespace BumbleDocGen\Core\Plugin\Event\Renderer; - -final class OnGettingResourceLink extends \Symfony\Contracts\EventDispatcher\Event -``` - -
    Event occurs when a reference to an entity (resource) is received
    - - - - - - -

    Initialization methods:

    - -
      -
    1. - __construct -
    2. -
    - -

    Methods:

    - -
      -
    1. - getResourceName -
    2. -
    3. - getResourceUrl -
    4. -
    5. - setResourceUrl -
    6. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public function __construct(string $resourceName); -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $resourceNamestring-
    - - - -
    -
    -
    - - - -```php -public function getResourceName(): string; -``` - - - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -public function getResourceUrl(): null|string; -``` - - - -Parameters: not specified - -Return value: null | string - - -
    -
    -
    - - - -```php -public function setResourceUrl(string|null $resourceUrl): void; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $resourceUrlstring | null-
    - -Return value: void - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/4.pluginSystem/classes/OnLoadEntityDocPluginContent.md b/docs/tech/4.pluginSystem/classes/OnLoadEntityDocPluginContent.md deleted file mode 100644 index 219477a2..00000000 --- a/docs/tech/4.pluginSystem/classes/OnLoadEntityDocPluginContent.md +++ /dev/null @@ -1,237 +0,0 @@ - - BumbleDocGen / Technical description of the project / Plugin system / OnLoadEntityDocPluginContent
    - -

    - OnLoadEntityDocPluginContent class: -

    - - - - - -```php -namespace BumbleDocGen\Core\Plugin\Event\Renderer; - -final class OnLoadEntityDocPluginContent extends \Symfony\Contracts\EventDispatcher\Event -``` - -
    Called when entity documentation is generated (plugin content loading)
    - -See: - - - - - - - -

    Initialization methods:

    - -
      -
    1. - __construct -
    2. -
    - -

    Methods:

    - -
      -
    1. - addBlockContentPluginResult -
    2. -
    3. - getBlockContent -
    4. -
    5. - getBlockContentPluginResults -
    6. -
    7. - getBlockType -
    8. -
    9. - getEntity -
    10. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public function __construct(string $blockContent, \BumbleDocGen\Core\Parser\Entity\RootEntityInterface $entity, string $blockType); -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $blockContentstring-
    $entity\BumbleDocGen\Core\Parser\Entity\RootEntityInterface-
    $blockTypestring-
    - - - -
    -
    -
    - - - -```php -public function addBlockContentPluginResult(string $pluginResult): void; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $pluginResultstring-
    - -Return value: void - - -
    -
    -
    - - - -```php -public function getBlockContent(): string; -``` - - - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -public function getBlockContentPluginResults(): array; -``` - - - -Parameters: not specified - -Return value: array - - -
    -
    -
    - - - -```php -public function getBlockType(): string; -``` - - - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -public function getEntity(): \BumbleDocGen\Core\Parser\Entity\RootEntityInterface; -``` - - - -Parameters: not specified - -Return value: \BumbleDocGen\Core\Parser\Entity\RootEntityInterface - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/4.pluginSystem/classes/PageRstLinkerPlugin.md b/docs/tech/4.pluginSystem/classes/PageRstLinkerPlugin.md deleted file mode 100644 index c953ad87..00000000 --- a/docs/tech/4.pluginSystem/classes/PageRstLinkerPlugin.md +++ /dev/null @@ -1,203 +0,0 @@ - - BumbleDocGen / Technical description of the project / Plugin system / PageRstLinkerPlugin
    - -

    - PageRstLinkerPlugin class: -

    - - - - - -```php -namespace BumbleDocGen\Core\Plugin\CorePlugin\PageLinker; - -final class PageRstLinkerPlugin extends \BumbleDocGen\Core\Plugin\CorePlugin\PageLinker\BasePageLinker implements \BumbleDocGen\Core\Plugin\PluginInterface, \Symfony\Component\EventDispatcher\EventSubscriberInterface -``` - -
    Adds URLs to empty links in rst format; - Links may contain: - 1) Short entity name - 2) Full entity name - 3) Relative link to the entity file from the root directory of the project - 4) Page title ( title ) - 5) Template key ( BreadcrumbsHelper::getTemplateLinkKey() ) - 6) Relative reference to the entity document from the root directory of the documentation
    - - -Examples of using: - -```php -`Existent page name`_ => `Existent page name `_ - -``` - -```php -`Non-existent page name`_ => Non-existent page name - -``` - - - - - - -

    Initialization methods:

    - -
      -
    1. - __construct -
    2. -
    - -

    Methods:

    - -
      -
    1. - beforeCreatingDocFile -
    2. -
    3. - getSubscribedEvents -
    4. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -// Implemented in BumbleDocGen\Core\Plugin\CorePlugin\PageLinker\BasePageLinker - -public function __construct(\BumbleDocGen\Core\Renderer\Breadcrumbs\BreadcrumbsHelper $breadcrumbsHelper, \BumbleDocGen\Core\Parser\Entity\RootEntityCollectionsGroup $rootEntityCollectionsGroup, \BumbleDocGen\Core\Renderer\Twig\Function\GetDocumentedEntityUrl $getDocumentedEntityUrlFunction, \Psr\Log\LoggerInterface $logger); -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $breadcrumbsHelper\BumbleDocGen\Core\Renderer\Breadcrumbs\BreadcrumbsHelper-
    $rootEntityCollectionsGroup\BumbleDocGen\Core\Parser\Entity\RootEntityCollectionsGroup-
    $getDocumentedEntityUrlFunction\BumbleDocGen\Core\Renderer\Twig\Function\GetDocumentedEntityUrl-
    $logger\Psr\Log\LoggerInterface-
    - - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\Core\Plugin\CorePlugin\PageLinker\BasePageLinker - -public function beforeCreatingDocFile(\BumbleDocGen\Core\Plugin\Event\Renderer\BeforeCreatingDocFile $event): void; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $event\BumbleDocGen\Core\Plugin\Event\Renderer\BeforeCreatingDocFile-
    - -Return value: void - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\Core\Plugin\CorePlugin\PageLinker\BasePageLinker - -public static function getSubscribedEvents(): array; -``` - - - -Parameters: not specified - -Return value: array - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/4.pluginSystem/classes/PhpDocumentorStubberPlugin.md b/docs/tech/4.pluginSystem/classes/PhpDocumentorStubberPlugin.md deleted file mode 100644 index e8daf4f2..00000000 --- a/docs/tech/4.pluginSystem/classes/PhpDocumentorStubberPlugin.md +++ /dev/null @@ -1,146 +0,0 @@ - - BumbleDocGen / Technical description of the project / Plugin system / PhpDocumentorStubberPlugin
    - -

    - PhpDocumentorStubberPlugin class: -

    - - - - - -```php -namespace BumbleDocGen\LanguageHandler\Php\Plugin\CorePlugin\BasePhpStubber; - -final class PhpDocumentorStubberPlugin implements \BumbleDocGen\Core\Plugin\PluginInterface, \Symfony\Component\EventDispatcher\EventSubscriberInterface -``` - -
    Adding links to the documentation of PHP classes in the \phpDocumentor namespace
    - - - - - - - -

    Methods:

    - -
      -
    1. - getSubscribedEvents -
    2. -
    3. - onCheckIsEntityCanBeLoaded -
    4. -
    5. - onGettingResourceLink -
    6. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public static function getSubscribedEvents(): array; -``` - - - -Parameters: not specified - -Return value: array - - -
    -
    -
    - - - -```php -public function onCheckIsEntityCanBeLoaded(\BumbleDocGen\LanguageHandler\Php\Plugin\Event\Entity\OnCheckIsEntityCanBeLoaded $event): void; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $event\BumbleDocGen\LanguageHandler\Php\Plugin\Event\Entity\OnCheckIsEntityCanBeLoaded-
    - -Return value: void - - -
    -
    -
    - - - -```php -public function onGettingResourceLink(\BumbleDocGen\Core\Plugin\Event\Renderer\OnGettingResourceLink $event): void; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $event\BumbleDocGen\Core\Plugin\Event\Renderer\OnGettingResourceLink-
    - -Return value: void - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/4.pluginSystem/classes/PhpUnitStubberPlugin.md b/docs/tech/4.pluginSystem/classes/PhpUnitStubberPlugin.md deleted file mode 100644 index a8f98010..00000000 --- a/docs/tech/4.pluginSystem/classes/PhpUnitStubberPlugin.md +++ /dev/null @@ -1,146 +0,0 @@ - - BumbleDocGen / Technical description of the project / Plugin system / PhpUnitStubberPlugin
    - -

    - PhpUnitStubberPlugin class: -

    - - - - - -```php -namespace BumbleDocGen\LanguageHandler\Php\Plugin\CorePlugin\BasePhpStubber; - -final class PhpUnitStubberPlugin implements \BumbleDocGen\Core\Plugin\PluginInterface, \Symfony\Component\EventDispatcher\EventSubscriberInterface -``` - -
    Adding links to the documentation of PHP classes in the \PHPUnit namespace
    - - - - - - - -

    Methods:

    - -
      -
    1. - getSubscribedEvents -
    2. -
    3. - onCheckIsEntityCanBeLoaded -
    4. -
    5. - onGettingResourceLink -
    6. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public static function getSubscribedEvents(): array; -``` - - - -Parameters: not specified - -Return value: array - - -
    -
    -
    - - - -```php -public function onCheckIsEntityCanBeLoaded(\BumbleDocGen\LanguageHandler\Php\Plugin\Event\Entity\OnCheckIsEntityCanBeLoaded $event): void; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $event\BumbleDocGen\LanguageHandler\Php\Plugin\Event\Entity\OnCheckIsEntityCanBeLoaded-
    - -Return value: void - - -
    -
    -
    - - - -```php -public function onGettingResourceLink(\BumbleDocGen\Core\Plugin\Event\Renderer\OnGettingResourceLink $event): void; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $event\BumbleDocGen\Core\Plugin\Event\Renderer\OnGettingResourceLink-
    - -Return value: void - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/4.pluginSystem/classes/PluginInterface.md b/docs/tech/4.pluginSystem/classes/PluginInterface.md deleted file mode 100644 index a1bd1f20..00000000 --- a/docs/tech/4.pluginSystem/classes/PluginInterface.md +++ /dev/null @@ -1,34 +0,0 @@ - - BumbleDocGen / Technical description of the project / Plugin system / PluginInterface
    - -

    - PluginInterface class: -

    - - - - - -```php -namespace BumbleDocGen\Core\Plugin; - -interface PluginInterface extends \Symfony\Component\EventDispatcher\EventSubscriberInterface -``` - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/tech/4.pluginSystem/classes/StubberPlugin.md b/docs/tech/4.pluginSystem/classes/StubberPlugin.md deleted file mode 100644 index f3710d17..00000000 --- a/docs/tech/4.pluginSystem/classes/StubberPlugin.md +++ /dev/null @@ -1,204 +0,0 @@ - - BumbleDocGen / Technical description of the project / Plugin system / StubberPlugin
    - -

    - StubberPlugin class: -

    - - - - - -```php -namespace BumbleDocGen\LanguageHandler\Php\Plugin\CorePlugin\ComposerPackagesStubber; - -final class StubberPlugin implements \BumbleDocGen\Core\Plugin\PluginInterface, \Symfony\Component\EventDispatcher\EventSubscriberInterface -``` - -
    The plugin allows you to automatically provide links to github repositories for documented classes from libraries included in composer
    - - - - - - -

    Initialization methods:

    - -
      -
    1. - __construct -
    2. -
    - -

    Methods:

    - -
      -
    1. - getSubscribedEvents -
    2. -
    3. - onCheckIsEntityCanBeLoaded -
    4. -
    5. - onGettingResourceLink -
    6. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public function __construct(\BumbleDocGen\LanguageHandler\Php\Parser\ComposerHelper $composerHelper); -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $composerHelper\BumbleDocGen\LanguageHandler\Php\Parser\ComposerHelper-
    - - - -
    -
    -
    - - - -```php -public static function getSubscribedEvents(): array; -``` - - - -Parameters: not specified - -Return value: array - - -
    -
    -
    - - - -```php -public function onCheckIsEntityCanBeLoaded(\BumbleDocGen\LanguageHandler\Php\Plugin\Event\Entity\OnCheckIsEntityCanBeLoaded $event): void; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $event\BumbleDocGen\LanguageHandler\Php\Plugin\Event\Entity\OnCheckIsEntityCanBeLoaded-
    - -Return value: void - - -Throws: - - -
    -
    -
    - - - -```php -public function onGettingResourceLink(\BumbleDocGen\Core\Plugin\Event\Renderer\OnGettingResourceLink $event): void; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $event\BumbleDocGen\Core\Plugin\Event\Renderer\OnGettingResourceLink-
    - -Return value: void - - -Throws: - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/4.pluginSystem/readme.md b/docs/tech/4.pluginSystem/readme.md deleted file mode 100644 index d939d498..00000000 --- a/docs/tech/4.pluginSystem/readme.md +++ /dev/null @@ -1,193 +0,0 @@ - BumbleDocGen / Technical description of the project / Plugin system
    - -

    Plugin system

    - -The documentation generator includes the ability to expand the functionality using plugins that allow you to add the necessary functionality to the system without changing its core. - -The system is built on the basis of an event model, each plugin class must implement PluginInterface. - -

    Configuration example

    - -You can add your plugins to the configuration like this: - -```yaml -plugins: - - class: \SelfDocConfig\Plugin\TwigFilterClassParser\TwigFilterClassParserPlugin - - class: \SelfDocConfig\Plugin\TwigFunctionClassParser\TwigFunctionClassParserPlugin -``` - -

    Default plugins

    - -Below are the plugins that are available by default when working with the library. -Plugins for any programming languages work regardless of which language handler is configured in the configuration. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    PluginPLHandles eventsDescription
    LastPageCommitterany - - Plugin for adding a block with information about the last commit and date of page update to the generated document
    PageHtmlLinkerPluginany - - Adds URLs to empty links in HTML format; - Links may contain: - 1) Short entity name - 2) Full entity name - 3) Relative link to the entity file from the root directory of the project - 4) Page title ( title ) - 5) Template key ( BreadcrumbsHelper::getTemplateLinkKey() ) - 6) Relative reference to the entity document from the root directory of the documentation
    PageLinkerPluginany - - Adds URLs to empty links in HTML format; - Links may contain: - 1) Short entity name - 2) Full entity name - 3) Relative link to the entity file from the root directory of the project - 4) Page title ( title ) - 5) Template key ( BreadcrumbsHelper::getTemplateLinkKey() ) - 6) Relative reference to the entity document from the root directory of the documentation
    PageRstLinkerPluginany - - Adds URLs to empty links in rst format; - Links may contain: - 1) Short entity name - 2) Full entity name - 3) Relative link to the entity file from the root directory of the project - 4) Page title ( title ) - 5) Template key ( BreadcrumbsHelper::getTemplateLinkKey() ) - 6) Relative reference to the entity document from the root directory of the documentation
    BasePhpStubberPluginPHP - - Adding links to type documentation and documentation of built-in PHP classes
    PhpDocumentorStubberPluginPHP - - Adding links to the documentation of PHP classes in the \phpDocumentor namespace
    PhpUnitStubberPluginPHP - - Adding links to the documentation of PHP classes in the \PHPUnit namespace
    StubberPluginPHP - - The plugin allows you to automatically provide links to github repositories for documented classes from libraries included in composer
    EntityDocUnifiedPlacePluginPHP - - This plugin changes the algorithm for saving entity documents. The standard system stores each file -in a directory next to the file where it was requested. This behavior changes and all documents are saved -in a separate directory structure, so they are not duplicated.
    - -

    Default events

    - - - -

    Adding a new plugin

    - -If you decide to add a new plugin, there are a few things you need to do: - -

    1) Add plugin class and implement events handling

    - -```php -namespace Demo\Plugin\DemoFakeResourceLinkPlugin; - -final class DemoFakeResourceLinkPlugin implements \BumbleDocGen\Core\Plugin\PluginInterface -{ - public static function getSubscribedEvents(): array - { - return [ - \BumbleDocGen\Core\Plugin\Event\Renderer\OnGettingResourceLink::class => 'onGettingResourceLink', - ]; - } - - public function onGettingResourceLink(OnGettingResourceLink $event): void - { - if (!$event->getResourceUrl()) { - $event->setResourceUrl("https://google.com"); - } - } -} -``` - -

    2) Add the new plugin to the configuration

    - -```yaml -plugins: - - class: \Demo\Plugin\DemoFakeResourceLinkPlugin\DemoFakeResourceLinkPlugin -``` - - -
    -
    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Dec 23 23:00:37 2023 +0300
    Page content update date: Sat Dec 23 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file diff --git a/docs/tech/classes/AddDocBlocksCommand.md b/docs/tech/classes/AddDocBlocksCommand.md index 54f70a3f..63cd8403 100644 --- a/docs/tech/classes/AddDocBlocksCommand.md +++ b/docs/tech/classes/AddDocBlocksCommand.md @@ -1,5 +1,4 @@ - - BumbleDocGen / Technical description of the project / Class map / AddDocBlocksCommand
    + BumbleDocGen / Technical description of the project / Console app / AddDocBlocksCommand

    AddDocBlocksCommand class: @@ -90,5 +89,3 @@ public function __construct(string $name = null);
    - - \ No newline at end of file diff --git a/docs/tech/classes/AddIndentFromLeft.md b/docs/tech/classes/AddIndentFromLeft.md index 67c77eb5..28632e5e 100644 --- a/docs/tech/classes/AddIndentFromLeft.md +++ b/docs/tech/classes/AddIndentFromLeft.md @@ -1,5 +1,4 @@ - - BumbleDocGen / Technical description of the project / Class map / AddIndentFromLeft
    + BumbleDocGen / Technical description of the project / Configuration / AddIndentFromLeft

    AddIndentFromLeft class: @@ -149,5 +148,3 @@ public static function getOptions(): array;
    - - \ No newline at end of file diff --git a/docs/tech/classes/AdditionalCommandCollection.md b/docs/tech/classes/AdditionalCommandCollection.md deleted file mode 100644 index 45baf846..00000000 --- a/docs/tech/classes/AdditionalCommandCollection.md +++ /dev/null @@ -1,146 +0,0 @@ - - BumbleDocGen / Technical description of the project / Class map / AdditionalCommandCollection
    - -

    - AdditionalCommandCollection class: -

    - - - - - -```php -namespace BumbleDocGen\Console\Command; - -final class AdditionalCommandCollection implements \IteratorAggregate -``` - - - - - - - - - -

    Methods:

    - -
      -
    1. - add -
    2. -
    3. - create -
    4. -
    5. - getIterator -
    6. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public function add(\Symfony\Component\Console\Command\Command $command): \BumbleDocGen\Console\Command\AdditionalCommandCollection; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $command\Symfony\Component\Console\Command\Command-
    - -Return value: \BumbleDocGen\Console\Command\AdditionalCommandCollection - - -
    -
    -
    - - - -```php -public static function create(\Symfony\Component\Console\Command\Command ...$commands): \BumbleDocGen\Console\Command\AdditionalCommandCollection; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $commands (variadic)\Symfony\Component\Console\Command\Command-
    - -Return value: \BumbleDocGen\Console\Command\AdditionalCommandCollection - - -
    -
    -
    - - - -```php -public function getIterator(): \Generator; -``` - - - -Parameters: not specified - -Return value: \Generator - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/classes/AfterLoadingPhpEntitiesCollection.md b/docs/tech/classes/AfterLoadingPhpEntitiesCollection.md index 111f85c2..966601ce 100644 --- a/docs/tech/classes/AfterLoadingPhpEntitiesCollection.md +++ b/docs/tech/classes/AfterLoadingPhpEntitiesCollection.md @@ -1,5 +1,4 @@ - - BumbleDocGen / Technical description of the project / Class map / AfterLoadingPhpEntitiesCollection
    + BumbleDocGen / Technical description of the project / Plugin system / AfterLoadingPhpEntitiesCollection

    AfterLoadingPhpEntitiesCollection class: @@ -104,5 +103,3 @@ public function getPhpEntitiesCollection(): \BumbleDocGen\LanguageHandler\Php\Pa
    - - \ No newline at end of file diff --git a/docs/tech/classes/AfterRenderingEntities.md b/docs/tech/classes/AfterRenderingEntities.md index 68c4a830..3c6ad6c5 100644 --- a/docs/tech/classes/AfterRenderingEntities.md +++ b/docs/tech/classes/AfterRenderingEntities.md @@ -1,5 +1,4 @@ - - BumbleDocGen / Technical description of the project / Class map / AfterRenderingEntities
    + BumbleDocGen / Technical description of the project / Plugin system / AfterRenderingEntities

    AfterRenderingEntities class: @@ -30,5 +29,3 @@ final class AfterRenderingEntities extends \Symfony\Contracts\EventDispatcher\Ev - - \ No newline at end of file diff --git a/docs/tech/classes/App.md b/docs/tech/classes/App.md index 158fab37..9983c68f 100644 --- a/docs/tech/classes/App.md +++ b/docs/tech/classes/App.md @@ -1,8 +1,7 @@ - - BumbleDocGen / Technical description of the project / Class map / App
    + BumbleDocGen / Technical description of the project / Console app / App

    - App class: + App class:

    @@ -44,7 +43,7 @@ class App extends \Symfony\Component\Console\Application ```php @@ -59,5 +58,3 @@ public function __construct();
    - - \ No newline at end of file diff --git a/docs/tech/classes/ArgvValueResolver.md b/docs/tech/classes/ArgvValueResolver.md deleted file mode 100644 index a6abd8d6..00000000 --- a/docs/tech/classes/ArgvValueResolver.md +++ /dev/null @@ -1,100 +0,0 @@ - - BumbleDocGen / Technical description of the project / Class map / ArgvValueResolver
    - -

    - ArgvValueResolver class: -

    - - - - - -```php -namespace BumbleDocGen\Core\Configuration\ValueResolver; - -final class ArgvValueResolver implements \BumbleDocGen\Core\Configuration\ValueResolver\ValueResolverInterface -``` - -
    We supplement the values by replacing the shortcodes with real values by -the arguments passed to the script when running from the command line; -Template: %argv:param_num% , where param_num is the number of the argument passed to the script
    - - -Examples of using: - -```php -# Configuration processing example. -# In case passing argument 3 => 'test' -output_dir: "%argv:3%/docs" - -# After the value processing procedure, output_dir => "test/docs" - -``` - - - - - - - -

    Methods:

    - -
      -
    1. - resolveValue -
    2. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public function resolveValue(\BumbleDocGen\Core\Configuration\ConfigurationParameterBag $parameterBag, mixed $value): mixed; -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $parameterBag\BumbleDocGen\Core\Configuration\ConfigurationParameterBag-
    $valuemixed-
    - -Return value: mixed - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/classes/BaseEntity.md b/docs/tech/classes/BaseEntity.md deleted file mode 100644 index 7856d386..00000000 --- a/docs/tech/classes/BaseEntity.md +++ /dev/null @@ -1,1128 +0,0 @@ - - BumbleDocGen / Technical description of the project / Class map / BaseEntity
    - -

    - BaseEntity class: -

    - - - - - -```php -namespace BumbleDocGen\LanguageHandler\Php\Parser\Entity; - -abstract class BaseEntity implements \BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityInterface, \BumbleDocGen\Core\Parser\Entity\EntityInterface -``` - - - - - - - - - -

    Methods:

    - -
      -
    1. - getAbsoluteFileName - - Returns the absolute path to a file if it can be retrieved and if the file is in the project directory
    2. -
    3. - getAst - - Get AST for this entity
    4. -
    5. - getCacheKey -
    6. -
    7. - getCachedEntityDependencies -
    8. -
    9. - getCurrentRootEntity -
    10. -
    11. - getDescription - - Get entity description
    12. -
    13. - getDescriptionLinks - - Get parsed links from description and doc blocks `see` and `link`
    14. -
    15. - getDocBlock - - Get DocBlock for current entity
    16. -
    17. - getDocComment - - Get the doc comment of an entity
    18. -
    19. - getDocCommentEntity - - Link to an entity where docBlock is implemented for this entity
    20. -
    21. - getDocCommentLine - - Get the code line number where the docBlock of the current entity begins
    22. -
    23. - getDocNote - - Get the note annotation value
    24. -
    25. - getExamples - - Get parsed examples from `examples` doc block
    26. -
    27. - getFileSourceLink -
    28. -
    29. - getFirstExample - - Get first example from `examples` doc block
    30. -
    31. - getImplementingClass - - Get the class like entity in which the current entity was implemented
    32. -
    33. - getName - - Full name of the entity
    34. -
    35. - getObjectId - - Get entity unique ID
    36. -
    37. - getRelativeFileName - - File name relative to project_root configuration parameter
    38. -
    39. - getRootEntityCollection - - Get the collection of root entities to which this entity belongs
    40. -
    41. - getShortName - - Short name of the entity
    42. -
    43. - getStartLine - - Get the line number of the beginning of the entity code in a file
    44. -
    45. - getThrows - - Get parsed throws from `throws` doc block
    46. -
    47. - getThrowsDocBlockLinks -
    48. -
    49. - hasDescriptionLinks - - Checking if an entity has links in its description
    50. -
    51. - hasExamples - - Checking if an entity has `example` docBlock
    52. -
    53. - hasThrows - - Checking if an entity has `throws` docBlock
    54. -
    55. - isApi - - Checking if an entity has `api` docBlock
    56. -
    57. - isDeprecated - - Checking if an entity has `deprecated` docBlock
    58. -
    59. - isEntityCacheOutdated - - Checking if the entity cache is out of date
    60. -
    61. - isEntityDataCacheOutdated -
    62. -
    63. - isEntityFileCanBeLoad - - Checking if entity data can be retrieved
    64. -
    65. - isInternal - - Checking if an entity has `internal` docBlock
    66. -
    67. - reloadEntityDependenciesCache - - Update entity dependency cache
    68. -
    69. - removeEntityValueFromCache -
    70. -
    71. - removeNotUsedEntityDataCache -
    72. -
    - -

    Traits:

    - - - - - - - - -

    Method details:

    - -
    - - - -```php -public function getAbsoluteFileName(): null|string; -``` - -
    Returns the absolute path to a file if it can be retrieved and if the file is in the project directory
    - -Parameters: not specified - -Return value: null | string - - -Throws: - - -
    -
    -
    - - - -```php -public function getAst(): \PhpParser\Node\Stmt; -``` - -
    Get AST for this entity
    - -Parameters: not specified - -Return value: \PhpParser\Node\Stmt - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait - -public function getCacheKey(): string; -``` - - - -Parameters: not specified - -Return value: string - - -
    -
    -
    - -
      -
    • # - getCachedEntityDependencies - :warning: Is internal | source code
    • -
    - -```php -public function getCachedEntityDependencies(): array; -``` - - - -Parameters: not specified - -Return value: array - - -Throws: - - -
    -
    -
    - -
      -
    • # - getCurrentRootEntity - :warning: Is internal | source code
    • -
    - -```php -public function getCurrentRootEntity(): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; -``` - - - -Parameters: not specified - -Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - - -
    -
    -
    - - - -```php -public function getDescription(): string; -``` - -
    Get entity description
    - -Parameters: not specified - -Return value: string - - -Throws: - - -
    -
    -
    - - - -```php -public function getDescriptionLinks(): array; -``` - -
    Get parsed links from description and doc blocks `see` and `link`
    - -Parameters: not specified - -Return value: array - - -Throws: - - -
    -
    -
    - - - -```php -public function getDocBlock(): \phpDocumentor\Reflection\DocBlock; -``` - -
    Get DocBlock for current entity
    - -Parameters: not specified - -Return value: \phpDocumentor\Reflection\DocBlock - - -Throws: - - -
    -
    -
    - - - -```php -public function getDocComment(): string; -``` - -
    Get the doc comment of an entity
    - -Parameters: not specified - -Return value: string - - -Throws: - - -
    -
    -
    - -
      -
    • # - getDocCommentEntity - :warning: Is internal | source code
    • -
    - -```php -public function getDocCommentEntity(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntity|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntity|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity; -``` - -
    Link to an entity where docBlock is implemented for this entity
    - -Parameters: not specified - -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntity | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntity | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity - - -
    -
    -
    - - - -```php -public function getDocCommentLine(): null|int; -``` - -
    Get the code line number where the docBlock of the current entity begins
    - -Parameters: not specified - -Return value: null | int - - -Throws: - - -
    -
    -
    - - - -```php -public function getDocNote(): string; -``` - -
    Get the note annotation value
    - -Parameters: not specified - -Return value: string - - -Throws: - - -
    -
    -
    - - - -```php -public function getExamples(): array; -``` - -
    Get parsed examples from `examples` doc block
    - -Parameters: not specified - -Return value: array - - -Throws: - - -
    -
    -
    - -
      -
    • # - getFileSourceLink - :warning: Is internal | source code
    • -
    - -```php -public function getFileSourceLink(bool $withLine = true): null|string; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $withLinebool-
    - -Return value: null | string - - -Throws: - - -
    -
    -
    - - - -```php -public function getFirstExample(): string; -``` - -
    Get first example from `examples` doc block
    - -Parameters: not specified - -Return value: string - - -Throws: - - -
    -
    -
    - - - -```php -public function getImplementingClass(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; -``` - -
    Get the class like entity in which the current entity was implemented
    - -Parameters: not specified - -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\Core\Parser\Entity\EntityInterface - -public function getName(): string; -``` - -
    Full name of the entity
    - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -public function getObjectId(): string; -``` - -
    Get entity unique ID
    - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -public function getRelativeFileName(): null|string; -``` - -
    File name relative to project_root configuration parameter
    - -Parameters: not specified - -Return value: null | string - - - -See: - -
    -
    -
    - - - -```php -public function getRootEntityCollection(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; -``` - -
    Get the collection of root entities to which this entity belongs
    - -Parameters: not specified - -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\Core\Parser\Entity\EntityInterface - -public function getShortName(): string; -``` - -
    Short name of the entity
    - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -public function getStartLine(): int; -``` - -
    Get the line number of the beginning of the entity code in a file
    - -Parameters: not specified - -Return value: int - - -
    -
    -
    - - - -```php -public function getThrows(): array; -``` - -
    Get parsed throws from `throws` doc block
    - -Parameters: not specified - -Return value: array - - -Throws: - - -
    -
    -
    - - - -```php -public function getThrowsDocBlockLinks(): array; -``` - - - -Parameters: not specified - -Return value: array - - -Throws: - - -
    -
    -
    - - - -```php -public function hasDescriptionLinks(): bool; -``` - -
    Checking if an entity has links in its description
    - -Parameters: not specified - -Return value: bool - - -Throws: - - -
    -
    -
    - - - -```php -public function hasExamples(): bool; -``` - -
    Checking if an entity has `example` docBlock
    - -Parameters: not specified - -Return value: bool - - -Throws: - - -
    -
    -
    - - - -```php -public function hasThrows(): bool; -``` - -
    Checking if an entity has `throws` docBlock
    - -Parameters: not specified - -Return value: bool - - -Throws: - - -
    -
    -
    - - - -```php -public function isApi(): bool; -``` - -
    Checking if an entity has `api` docBlock
    - -Parameters: not specified - -Return value: bool - - -Throws: - - -
    -
    -
    - - - -```php -public function isDeprecated(): bool; -``` - -
    Checking if an entity has `deprecated` docBlock
    - -Parameters: not specified - -Return value: bool - - -Throws: - - -
    -
    -
    - -
      -
    • # - isEntityCacheOutdated - :warning: Is internal | source code
    • -
    - -```php -public function isEntityCacheOutdated(): bool; -``` - -
    Checking if the entity cache is out of date
    - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - -
      -
    • # - isEntityDataCacheOutdated - :warning: Is internal | source code
    • -
    - -```php -// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait - -public function isEntityDataCacheOutdated(): bool; -``` - - - -Parameters: not specified - -Return value: bool - - -Throws: - - -
    -
    -
    - - - -```php -public function isEntityFileCanBeLoad(): bool; -``` - -
    Checking if entity data can be retrieved
    - -Parameters: not specified - -Return value: bool - - -Throws: - - -
    -
    -
    - - - -```php -public function isInternal(): bool; -``` - -
    Checking if an entity has `internal` docBlock
    - -Parameters: not specified - -Return value: bool - - -Throws: - - -
    -
    -
    - -
      -
    • # - reloadEntityDependenciesCache - :warning: Is internal | source code
    • -
    - -```php -public function reloadEntityDependenciesCache(): array; -``` - -
    Update entity dependency cache
    - -Parameters: not specified - -Return value: array - - -
    -
    -
    - -
      -
    • # - removeEntityValueFromCache - :warning: Is internal | source code
    • -
    - -```php -// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait - -public function removeEntityValueFromCache(string $key): void; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $keystring-
    - -Return value: void - - -
    -
    -
    - -
      -
    • # - removeNotUsedEntityDataCache - :warning: Is internal | source code
    • -
    - -```php -// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait - -public function removeNotUsedEntityDataCache(): void; -``` - - - -Parameters: not specified - -Return value: void - - -Throws: - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/classes/BaseEntityCollection.md b/docs/tech/classes/BaseEntityCollection.md deleted file mode 100644 index 96229446..00000000 --- a/docs/tech/classes/BaseEntityCollection.md +++ /dev/null @@ -1,211 +0,0 @@ - - BumbleDocGen / Technical description of the project / Class map / BaseEntityCollection
    - -

    - BaseEntityCollection class: -

    - - - - - -```php -namespace BumbleDocGen\Core\Parser\Entity; - -abstract class BaseEntityCollection implements \IteratorAggregate -``` - - - - - - - - - -

    Methods:

    - -
      -
    1. - get - - Get an entity from a collection (only previously added)
    2. -
    3. - getIterator -
    4. -
    5. - has - - Check if an entity has been added to the collection
    6. -
    7. - isEmpty - - Check if the collection is empty or not
    8. -
    9. - remove - - Remove an entity from a collection
    10. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public function get(string $objectName): null|\BumbleDocGen\Core\Parser\Entity\EntityInterface; -``` - -
    Get an entity from a collection (only previously added)
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $objectNamestring-
    - -Return value: null | \BumbleDocGen\Core\Parser\Entity\EntityInterface - - -
    -
    -
    - - - -```php -public function getIterator(): \Generator; -``` - - - -Parameters: not specified - -Return value: \Generator - - -
    -
    -
    - - - -```php -public function has(string $objectName): bool; -``` - -
    Check if an entity has been added to the collection
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $objectNamestring-
    - -Return value: bool - - -
    -
    -
    - - - -```php -public function isEmpty(): bool; -``` - -
    Check if the collection is empty or not
    - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - - - -```php -public function remove(string $objectName): void; -``` - -
    Remove an entity from a collection
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $objectNamestring-
    - -Return value: void - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/classes/BasePageLinkProcessor.md b/docs/tech/classes/BasePageLinkProcessor.md index 69e95f28..99837dc9 100644 --- a/docs/tech/classes/BasePageLinkProcessor.md +++ b/docs/tech/classes/BasePageLinkProcessor.md @@ -1,5 +1,4 @@ - - BumbleDocGen / Technical description of the project / Class map / BasePageLinkProcessor
    + BumbleDocGen / Technical description of the project / Configuration / BasePageLinkProcessor

    BasePageLinkProcessor class: @@ -121,5 +120,3 @@ public function getAbsoluteUrl(string $relativeUrl): string;
    - - \ No newline at end of file diff --git a/docs/tech/classes/BasePageLinker.md b/docs/tech/classes/BasePageLinker.md deleted file mode 100644 index 62d9f0cb..00000000 --- a/docs/tech/classes/BasePageLinker.md +++ /dev/null @@ -1,177 +0,0 @@ - - BumbleDocGen / Technical description of the project / Class map / BasePageLinker
    - -

    - BasePageLinker class: -

    - - - - - -```php -namespace BumbleDocGen\Core\Plugin\CorePlugin\PageLinker; - -abstract class BasePageLinker implements \BumbleDocGen\Core\Plugin\PluginInterface, \Symfony\Component\EventDispatcher\EventSubscriberInterface -``` - - - - - - - - -

    Initialization methods:

    - -
      -
    1. - __construct -
    2. -
    - -

    Methods:

    - -
      -
    1. - beforeCreatingDocFile -
    2. -
    3. - getSubscribedEvents -
    4. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public function __construct(\BumbleDocGen\Core\Renderer\Breadcrumbs\BreadcrumbsHelper $breadcrumbsHelper, \BumbleDocGen\Core\Parser\Entity\RootEntityCollectionsGroup $rootEntityCollectionsGroup, \BumbleDocGen\Core\Renderer\Twig\Function\GetDocumentedEntityUrl $getDocumentedEntityUrlFunction, \Psr\Log\LoggerInterface $logger); -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $breadcrumbsHelper\BumbleDocGen\Core\Renderer\Breadcrumbs\BreadcrumbsHelper-
    $rootEntityCollectionsGroup\BumbleDocGen\Core\Parser\Entity\RootEntityCollectionsGroup-
    $getDocumentedEntityUrlFunction\BumbleDocGen\Core\Renderer\Twig\Function\GetDocumentedEntityUrl-
    $logger\Psr\Log\LoggerInterface-
    - - - -
    -
    -
    - - - -```php -public function beforeCreatingDocFile(\BumbleDocGen\Core\Plugin\Event\Renderer\BeforeCreatingDocFile $event): void; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $event\BumbleDocGen\Core\Plugin\Event\Renderer\BeforeCreatingDocFile-
    - -Return value: void - - -Throws: - - -
    -
    -
    - - - -```php -public static function getSubscribedEvents(): array; -``` - - - -Parameters: not specified - -Return value: array - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/classes/BasePhpStubberPlugin.md b/docs/tech/classes/BasePhpStubberPlugin.md index 86f43d74..73144fff 100644 --- a/docs/tech/classes/BasePhpStubberPlugin.md +++ b/docs/tech/classes/BasePhpStubberPlugin.md @@ -1,5 +1,4 @@ - - BumbleDocGen / Technical description of the project / Class map / BasePhpStubberPlugin
    + BumbleDocGen / Technical description of the project / Plugin system / BasePhpStubberPlugin

    BasePhpStubberPlugin class: @@ -142,5 +141,3 @@ public function onGettingResourceLink(\BumbleDocGen\Core\Plugin\Event\Renderer\O
    - - \ No newline at end of file diff --git a/docs/tech/classes/BaseSourceLocator.md b/docs/tech/classes/BaseSourceLocator.md deleted file mode 100644 index 6342776f..00000000 --- a/docs/tech/classes/BaseSourceLocator.md +++ /dev/null @@ -1,91 +0,0 @@ - - BumbleDocGen / Technical description of the project / Class map / BaseSourceLocator
    - -

    - BaseSourceLocator class: -

    - - - - - -```php -namespace BumbleDocGen\Core\Parser\SourceLocator; - -abstract class BaseSourceLocator implements \BumbleDocGen\Core\Parser\SourceLocator\SourceLocatorInterface -``` - - - - - - - - -

    Initialization methods:

    - -
      -
    1. - __construct -
    2. -
    - -

    Methods:

    - -
      -
    1. - getFinder -
    2. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public function __construct(); -``` - - - -Parameters: not specified - - - -
    -
    -
    - - - -```php -public function getFinder(): \Symfony\Component\Finder\Finder; -``` - - - -Parameters: not specified - -Return value: \Symfony\Component\Finder\Finder - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/classes/BeforeCreatingDocFile.md b/docs/tech/classes/BeforeCreatingDocFile.md index fbf329c8..82c24d16 100644 --- a/docs/tech/classes/BeforeCreatingDocFile.md +++ b/docs/tech/classes/BeforeCreatingDocFile.md @@ -1,8 +1,7 @@ - - BumbleDocGen / Technical description of the project / Class map / BeforeCreatingDocFile
    + BumbleDocGen / Technical description of the project / Plugin system / BeforeCreatingDocFile

    - BeforeCreatingDocFile class: + BeforeCreatingDocFile class:

    @@ -37,11 +36,14 @@ final class BeforeCreatingDocFile extends \Symfony\Contracts\EventDispatcher\Eve getContent
  • - getContext + getOutputFilePatch
  • setContent
  • +
  • + setOutputFilePatch +
  • @@ -57,11 +59,11 @@ final class BeforeCreatingDocFile extends \Symfony\Contracts\EventDispatcher\Eve ```php -public function __construct(string $content, \BumbleDocGen\Core\Renderer\Context\RendererContext $context); +public function __construct(string $content, string $outputFilePatch); ``` @@ -83,8 +85,8 @@ public function __construct(string $content, \BumbleDocGen\Core\Renderer\Context - - $context - \BumbleDocGen\Core\Renderer\Context\RendererContext + $outputFilePatch + string - @@ -99,7 +101,7 @@ public function __construct(string $content, \BumbleDocGen\Core\Renderer\Context ```php @@ -118,20 +120,20 @@ public function getContent(): string;
    ```php -public function getContext(): \BumbleDocGen\Core\Renderer\Context\RendererContext; +public function getOutputFilePatch(): string; ``` Parameters: not specified -Return value: \BumbleDocGen\Core\Renderer\Context\RendererContext +Return value: string
    @@ -141,7 +143,7 @@ public function getContext(): \BumbleDocGen\Core\Renderer\Context\RendererContex ```php @@ -174,5 +176,41 @@ public function setContent(string $content): void;
    +
    + + + +```php +public function setOutputFilePatch(string $outputFilePatch): void; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $outputFilePatchstring-
    - \ No newline at end of file +Return value: void + + +
    +
    diff --git a/docs/tech/4.pluginSystem/classes/BeforeCreatingDocFile.md b/docs/tech/classes/BeforeCreatingEntityDocFile.md similarity index 53% rename from docs/tech/4.pluginSystem/classes/BeforeCreatingDocFile.md rename to docs/tech/classes/BeforeCreatingEntityDocFile.md index b6625576..7271253d 100644 --- a/docs/tech/4.pluginSystem/classes/BeforeCreatingDocFile.md +++ b/docs/tech/classes/BeforeCreatingEntityDocFile.md @@ -1,8 +1,7 @@ - - BumbleDocGen / Technical description of the project / Plugin system / BeforeCreatingDocFile
    + BumbleDocGen / Technical description of the project / Plugin system / BeforeCreatingEntityDocFile

    - BeforeCreatingDocFile class: + BeforeCreatingEntityDocFile class:

    @@ -12,10 +11,10 @@ ```php namespace BumbleDocGen\Core\Plugin\Event\Renderer; -final class BeforeCreatingDocFile extends \Symfony\Contracts\EventDispatcher\Event +final class BeforeCreatingEntityDocFile extends \Symfony\Contracts\EventDispatcher\Event ``` -
    Called before the content of the documentation document is saved to a file
    + @@ -37,11 +36,14 @@ final class BeforeCreatingDocFile extends \Symfony\Contracts\EventDispatcher\Eve getContent
  • - getContext + getOutputFilePatch
  • setContent
  • +
  • + setOutputFilePatch +
  • @@ -57,11 +59,11 @@ final class BeforeCreatingDocFile extends \Symfony\Contracts\EventDispatcher\Eve ```php -public function __construct(string $content, \BumbleDocGen\Core\Renderer\Context\RendererContext $context); +public function __construct(string $content, string $outputFilePatch); ``` @@ -83,8 +85,8 @@ public function __construct(string $content, \BumbleDocGen\Core\Renderer\Context - - $context - \BumbleDocGen\Core\Renderer\Context\RendererContext + $outputFilePatch + string - @@ -99,7 +101,7 @@ public function __construct(string $content, \BumbleDocGen\Core\Renderer\Context ```php @@ -118,20 +120,20 @@ public function getContent(): string;
    ```php -public function getContext(): \BumbleDocGen\Core\Renderer\Context\RendererContext; +public function getOutputFilePatch(): string; ``` Parameters: not specified -Return value: \BumbleDocGen\Core\Renderer\Context\RendererContext +Return value: string
    @@ -141,7 +143,7 @@ public function getContext(): \BumbleDocGen\Core\Renderer\Context\RendererContex ```php @@ -174,5 +176,41 @@ public function setContent(string $content): void;
    +
    - \ No newline at end of file + + +```php +public function setOutputFilePatch(string $outputFilePatch): void; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $outputFilePatchstring-
    + +Return value: void + + +
    +
    diff --git a/docs/tech/classes/BeforeParsingProcess.md b/docs/tech/classes/BeforeParsingProcess.md index 287a3404..17b80f01 100644 --- a/docs/tech/classes/BeforeParsingProcess.md +++ b/docs/tech/classes/BeforeParsingProcess.md @@ -1,5 +1,4 @@ - - BumbleDocGen / Technical description of the project / Class map / BeforeParsingProcess
    + BumbleDocGen / Technical description of the project / Plugin system / BeforeParsingProcess

    BeforeParsingProcess class: @@ -59,5 +58,3 @@ public function __construct();
    - - \ No newline at end of file diff --git a/docs/tech/classes/BeforeRenderingDocFiles.md b/docs/tech/classes/BeforeRenderingDocFiles.md index 1699883e..7a23f72c 100644 --- a/docs/tech/classes/BeforeRenderingDocFiles.md +++ b/docs/tech/classes/BeforeRenderingDocFiles.md @@ -1,5 +1,4 @@ - - BumbleDocGen / Technical description of the project / Class map / BeforeRenderingDocFiles
    + BumbleDocGen / Technical description of the project / Plugin system / BeforeRenderingDocFiles

    BeforeRenderingDocFiles class: @@ -30,5 +29,3 @@ final class BeforeRenderingDocFiles extends \Symfony\Contracts\EventDispatcher\E - - \ No newline at end of file diff --git a/docs/tech/classes/BeforeRenderingEntities.md b/docs/tech/classes/BeforeRenderingEntities.md index cf806bd3..1647e0f6 100644 --- a/docs/tech/classes/BeforeRenderingEntities.md +++ b/docs/tech/classes/BeforeRenderingEntities.md @@ -1,5 +1,4 @@ - - BumbleDocGen / Technical description of the project / Class map / BeforeRenderingEntities
    + BumbleDocGen / Technical description of the project / Plugin system / BeforeRenderingEntities

    BeforeRenderingEntities class: @@ -30,5 +29,3 @@ final class BeforeRenderingEntities extends \Symfony\Contracts\EventDispatcher\E - - \ No newline at end of file diff --git a/docs/tech/classes/BreadcrumbsTwigEnvironment.md b/docs/tech/classes/BreadcrumbsTwigEnvironment.md deleted file mode 100644 index 3a0f342c..00000000 --- a/docs/tech/classes/BreadcrumbsTwigEnvironment.md +++ /dev/null @@ -1,126 +0,0 @@ - - BumbleDocGen / Technical description of the project / Class map / BreadcrumbsTwigEnvironment
    - -

    - BreadcrumbsTwigEnvironment class: -

    - - - - - -```php -namespace BumbleDocGen\Core\Renderer\Breadcrumbs; - -final class BreadcrumbsTwigEnvironment -``` - - - - - - - - -

    Initialization methods:

    - -
      -
    1. - __construct -
    2. -
    - -

    Methods:

    - -
      -
    1. - render -
    2. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public function __construct(); -``` - - - -Parameters: not specified - - - -
    -
    -
    - - - -```php -public function render(mixed $name, array $context = []): string; -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $namemixed-
    $contextarray-
    - -Return value: string - - -Throws: - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/classes/CacheKeyGeneratorInterface.md b/docs/tech/classes/CacheKeyGeneratorInterface.md deleted file mode 100644 index 243fbc46..00000000 --- a/docs/tech/classes/CacheKeyGeneratorInterface.md +++ /dev/null @@ -1,91 +0,0 @@ - - BumbleDocGen / Technical description of the project / Class map / CacheKeyGeneratorInterface
    - -

    - CacheKeyGeneratorInterface class: -

    - - - - - -```php -namespace BumbleDocGen\Core\Parser\Entity\Cache\CacheKey; - -interface CacheKeyGeneratorInterface -``` - - - - - - - - - -

    Methods:

    - -
      -
    1. - generateKey -
    2. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public static function generateKey(string $cacheNamespace, \BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityInterface $entity, array $args): string; -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $cacheNamespacestring-
    $entity\BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityInterface-
    $argsarray-
    - -Return value: string - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/classes/CacheableEntityInterface.md b/docs/tech/classes/CacheableEntityInterface.md deleted file mode 100644 index 8860bd51..00000000 --- a/docs/tech/classes/CacheableEntityInterface.md +++ /dev/null @@ -1,346 +0,0 @@ - - BumbleDocGen / Technical description of the project / Class map / CacheableEntityInterface
    - -

    - CacheableEntityInterface class: -

    - - - - - -```php -namespace BumbleDocGen\Core\Parser\Entity\Cache; - -interface CacheableEntityInterface extends \BumbleDocGen\Core\Parser\Entity\EntityInterface -``` - - - - - - - - - -

    Methods:

    - -
      -
    1. - getAbsoluteFileName - - Returns the absolute path to a file if it can be retrieved and if the file is in the project directory
    2. -
    3. - getCacheKey - - Get the cache key
    4. -
    5. - getName - - Full name of the entity
    6. -
    7. - getObjectId - - Entity object ID
    8. -
    9. - getRelativeFileName - - File name relative to project_root configuration parameter
    10. -
    11. - getRootEntityCollection - - Get parent collection of entities
    12. -
    13. - getShortName - - Short name of the entity
    14. -
    15. - isEntityCacheOutdated - - Checking if the entity cache is out of date
    16. -
    17. - isEntityDataCacheOutdated - - Checking if the local entity cache is out of date
    18. -
    19. - isEntityFileCanBeLoad - - Checking if the current entity file can be loaded
    20. -
    21. - reloadEntityDependenciesCache - - Update entity dependency cache
    22. -
    23. - removeNotUsedEntityDataCache - - Delete current entity cache that was not used the last time documentation was generated
    24. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -// Implemented in BumbleDocGen\Core\Parser\Entity\EntityInterface - -public function getAbsoluteFileName(): null|string; -``` - -
    Returns the absolute path to a file if it can be retrieved and if the file is in the project directory
    - -Parameters: not specified - -Return value: null | string - - -
    -
    -
    - - - -```php -public function getCacheKey(): string; -``` - -
    Get the cache key
    - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\Core\Parser\Entity\EntityInterface - -public function getName(): string; -``` - -
    Full name of the entity
    - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\Core\Parser\Entity\EntityInterface - -public function getObjectId(): string; -``` - -
    Entity object ID
    - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\Core\Parser\Entity\EntityInterface - -public function getRelativeFileName(): null|string; -``` - -
    File name relative to project_root configuration parameter
    - -Parameters: not specified - -Return value: null | string - - - -See: - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\Core\Parser\Entity\EntityInterface - -public function getRootEntityCollection(): \BumbleDocGen\Core\Parser\Entity\RootEntityCollection; -``` - -
    Get parent collection of entities
    - -Parameters: not specified - -Return value: \BumbleDocGen\Core\Parser\Entity\RootEntityCollection - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\Core\Parser\Entity\EntityInterface - -public function getShortName(): string; -``` - -
    Short name of the entity
    - -Parameters: not specified - -Return value: string - - -
    -
    -
    - -
      -
    • # - isEntityCacheOutdated - :warning: Is internal | source code
    • -
    - -```php -public function isEntityCacheOutdated(): bool; -``` - -
    Checking if the entity cache is out of date
    - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - -
      -
    • # - isEntityDataCacheOutdated - :warning: Is internal | source code
    • -
    - -```php -public function isEntityDataCacheOutdated(): bool; -``` - -
    Checking if the local entity cache is out of date
    - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - -
      -
    • # - isEntityFileCanBeLoad - :warning: Is internal | source code
    • -
    - -```php -public function isEntityFileCanBeLoad(): bool; -``` - -
    Checking if the current entity file can be loaded
    - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - -
      -
    • # - reloadEntityDependenciesCache - :warning: Is internal | source code
    • -
    - -```php -public function reloadEntityDependenciesCache(): array; -``` - -
    Update entity dependency cache
    - -Parameters: not specified - -Return value: array - - -
    -
    -
    - -
      -
    • # - removeNotUsedEntityDataCache - :warning: Is internal | source code
    • -
    - -```php -public function removeNotUsedEntityDataCache(): void; -``` - -
    Delete current entity cache that was not used the last time documentation was generated
    - -Parameters: not specified - -Return value: void - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/classes/CacheableEntityTrait.md b/docs/tech/classes/CacheableEntityTrait.md deleted file mode 100644 index f6ba520a..00000000 --- a/docs/tech/classes/CacheableEntityTrait.md +++ /dev/null @@ -1,191 +0,0 @@ - - BumbleDocGen / Technical description of the project / Class map / CacheableEntityTrait
    - -

    - CacheableEntityTrait class: -

    - - - - - -```php -namespace BumbleDocGen\Core\Parser\Entity\Cache; - -trait CacheableEntityTrait -``` - - - - - - - - - -

    Methods:

    - -
      -
    1. - getCacheKey -
    2. -
    3. - isEntityCacheOutdated -
    4. -
    5. - isEntityDataCacheOutdated -
    6. -
    7. - removeEntityValueFromCache -
    8. -
    9. - removeNotUsedEntityDataCache -
    10. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public function getCacheKey(): string; -``` - - - -Parameters: not specified - -Return value: string - - -
    -
    -
    - -
      -
    • # - isEntityCacheOutdated - :warning: Is internal | source code
    • -
    - -```php -public function isEntityCacheOutdated(): bool; -``` - - - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - -
      -
    • # - isEntityDataCacheOutdated - :warning: Is internal | source code
    • -
    - -```php -public function isEntityDataCacheOutdated(): bool; -``` - - - -Parameters: not specified - -Return value: bool - - -Throws: - - -
    -
    -
    - -
      -
    • # - removeEntityValueFromCache - :warning: Is internal | source code
    • -
    - -```php -public function removeEntityValueFromCache(string $key): void; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $keystring-
    - -Return value: void - - -
    -
    -
    - -
      -
    • # - removeNotUsedEntityDataCache - :warning: Is internal | source code
    • -
    - -```php -public function removeNotUsedEntityDataCache(): void; -``` - - - -Parameters: not specified - -Return value: void - - -Throws: - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/classes/CacheableEntityWrapperFactory.md b/docs/tech/classes/CacheableEntityWrapperFactory.md deleted file mode 100644 index 58aa8849..00000000 --- a/docs/tech/classes/CacheableEntityWrapperFactory.md +++ /dev/null @@ -1,130 +0,0 @@ - - BumbleDocGen / Technical description of the project / Class map / CacheableEntityWrapperFactory
    - -

    - CacheableEntityWrapperFactory class: -

    - - - - - -```php -namespace BumbleDocGen\Core\Parser\Entity\Cache; - -final class CacheableEntityWrapperFactory -``` - - - - - - - - -

    Initialization methods:

    - -
      -
    1. - __construct -
    2. -
    - -

    Methods:

    - -
      -
    1. - createWrappedEntityClass -
    2. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public function __construct(\BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache $localObjectCache); -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $localObjectCache\BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache-
    - - - -
    -
    -
    - - - -```php -public function createWrappedEntityClass(string $className, string $wrapperName): string; -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $classNamestring-
    $wrapperNamestring-
    - -Return value: string - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/classes/CacheableEntityWrapperTrait.md b/docs/tech/classes/CacheableEntityWrapperTrait.md deleted file mode 100644 index 5bd27c12..00000000 --- a/docs/tech/classes/CacheableEntityWrapperTrait.md +++ /dev/null @@ -1,230 +0,0 @@ - - BumbleDocGen / Technical description of the project / Class map / CacheableEntityWrapperTrait
    - -

    - CacheableEntityWrapperTrait class: -

    - - - - - -```php -namespace BumbleDocGen\Core\Parser\Entity\Cache; - -trait CacheableEntityWrapperTrait -``` - - - - - - - - - -

    Methods:

    - -
      -
    1. - getCacheKey -
    2. -
    3. - isEntityCacheOutdated -
    4. -
    5. - isEntityDataCacheOutdated -
    6. -
    7. - isEntityFileCanBeLoad -
    8. -
    9. - removeEntityValueFromCache -
    10. -
    11. - removeNotUsedEntityDataCache -
    12. -
    - -

    Traits:

    - - - - - - - - -

    Method details:

    - -
    - - - -```php -// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait - -public function getCacheKey(): string; -``` - - - -Parameters: not specified - -Return value: string - - -
    -
    -
    - -
      -
    • # - isEntityCacheOutdated - :warning: Is internal | source code
    • -
    - -```php -// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait - -public function isEntityCacheOutdated(): bool; -``` - - - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - -
      -
    • # - isEntityDataCacheOutdated - :warning: Is internal | source code
    • -
    - -```php -// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait - -public function isEntityDataCacheOutdated(): bool; -``` - - - -Parameters: not specified - -Return value: bool - - -Throws: - - -
    -
    -
    - - - -```php -public function isEntityFileCanBeLoad(): bool; -``` - - - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - -
      -
    • # - removeEntityValueFromCache - :warning: Is internal | source code
    • -
    - -```php -// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait - -public function removeEntityValueFromCache(string $key): void; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $keystring-
    - -Return value: void - - -
    -
    -
    - -
      -
    • # - removeNotUsedEntityDataCache - :warning: Is internal | source code
    • -
    - -```php -// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait - -public function removeNotUsedEntityDataCache(): void; -``` - - - -Parameters: not specified - -Return value: void - - -Throws: - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/classes/CacheableMethod.md b/docs/tech/classes/CacheableMethod.md deleted file mode 100644 index f1c6d804..00000000 --- a/docs/tech/classes/CacheableMethod.md +++ /dev/null @@ -1,152 +0,0 @@ - - BumbleDocGen / Technical description of the project / Class map / CacheableMethod
    - -

    - CacheableMethod class: -

    - - - - - -```php -namespace BumbleDocGen\Core\Parser\Entity\Cache; - -final class CacheableMethod -``` - - - - - - - - -

    Initialization methods:

    - -
      -
    1. - __construct -
    2. -
    - -

    Methods:

    - -
      -
    1. - getCacheKeyGeneratorClass -
    2. -
    3. - getCacheSeconds -
    4. -
    - - -

    Constants:

    - - - - - - -

    Method details:

    - -
    - - - -```php -public function __construct(int $cacheSeconds = self::MONTH_SECONDS, string $cacheKeyGeneratorClass = \BumbleDocGen\Core\Parser\Entity\Cache\CacheKey\DefaultCacheKeyGenerator::class); -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $cacheSecondsint-
    $cacheKeyGeneratorClassstring-
    - - - -
    -
    -
    - - - -```php -public function getCacheKeyGeneratorClass(): string; -``` - - - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -public function getCacheSeconds(): int; -``` - - - -Parameters: not specified - -Return value: int - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/classes/CacheablePhpEntityFactory.md b/docs/tech/classes/CacheablePhpEntityFactory.md deleted file mode 100644 index e7c3a40a..00000000 --- a/docs/tech/classes/CacheablePhpEntityFactory.md +++ /dev/null @@ -1,412 +0,0 @@ - - BumbleDocGen / Technical description of the project / Class map / CacheablePhpEntityFactory
    - -

    - CacheablePhpEntityFactory class: -

    - - - - - -```php -namespace BumbleDocGen\LanguageHandler\Php\Parser\Entity\Cache; - -final class CacheablePhpEntityFactory -``` - - - - - - - - -

    Initialization methods:

    - -
      -
    1. - __construct -
    2. -
    - -

    Methods:

    - -
      -
    1. - createClassConstantEntity -
    2. -
    3. - createClassLikeEntity - - Create a child entity ClassLikeEntity in which the CacheableMethod attributes will be processed to cache the results of the methods
    4. -
    5. - createDynamicMethodEntity -
    6. -
    7. - createMethodEntity -
    8. -
    9. - createPropertyEntity -
    10. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public function __construct(\BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityWrapperFactory $cacheableEntityWrapperFactory, \BumbleDocGen\LanguageHandler\Php\Parser\ComposerHelper $composerHelper, \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache $localObjectCache, \DI\Container $diContainer); -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $cacheableEntityWrapperFactory\BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityWrapperFactory-
    $composerHelper\BumbleDocGen\LanguageHandler\Php\Parser\ComposerHelper-
    $localObjectCache\BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache-
    $diContainer\DI\Container-
    - - - -
    -
    -
    - -
      -
    • # - createClassConstantEntity - :warning: Is internal | source code
    • -
    - -```php -public function createClassConstantEntity(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity $classEntity, string $constantName, string $implementingClassName, bool $reloadCache = false): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity; -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $classEntity\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity-
    $constantNamestring-
    $implementingClassNamestring-
    $reloadCachebool-
    - -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity - - -Throws: - - -
    -
    -
    - - - -```php -public function createClassLikeEntity(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection $entitiesCollection, string $className, string|null $relativeFileName = null, string|null $entityClassName = null): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; -``` - -
    Create a child entity ClassLikeEntity in which the CacheableMethod attributes will be processed to cache the results of the methods
    - -Parameters: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $entitiesCollection\BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection-
    $classNamestring-
    $relativeFileNamestring | null-
    $entityClassNamestring | null-
    - -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - - -Throws: - - -
    -
    -
    - -
      -
    • # - createDynamicMethodEntity - :warning: Is internal | source code
    • -
    - -```php -public function createDynamicMethodEntity(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity $classEntity, \phpDocumentor\Reflection\DocBlock\Tags\Method $annotationMethod): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\DynamicMethodEntity; -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $classEntity\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity-
    $annotationMethod\phpDocumentor\Reflection\DocBlock\Tags\Method-
    - -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\DynamicMethodEntity - - -Throws: - - -
    -
    -
    - -
      -
    • # - createMethodEntity - :warning: Is internal | source code
    • -
    - -```php -public function createMethodEntity(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity $classEntity, string $methodName, string $implementingClassName): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntity; -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $classEntity\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity-
    $methodNamestring-
    $implementingClassNamestring-
    - -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntity - - -Throws: - - -
    -
    -
    - -
      -
    • # - createPropertyEntity - :warning: Is internal | source code
    • -
    - -```php -public function createPropertyEntity(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity $classEntity, string $propertyName, string $implementingClassName): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntity; -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $classEntity\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity-
    $propertyNamestring-
    $implementingClassNamestring-
    - -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntity - - -Throws: - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/classes/ClassLikeEntity.md b/docs/tech/classes/ClassLikeEntity.md deleted file mode 100644 index 046924ac..00000000 --- a/docs/tech/classes/ClassLikeEntity.md +++ /dev/null @@ -1,3317 +0,0 @@ - - BumbleDocGen / Technical description of the project / Class map / ClassLikeEntity
    - -

    - ClassLikeEntity class: -

    - - - - - -```php -namespace BumbleDocGen\LanguageHandler\Php\Parser\Entity; - -abstract class ClassLikeEntity extends \BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity implements \BumbleDocGen\Core\Renderer\Context\DocumentTransformableEntityInterface, \BumbleDocGen\Core\Parser\Entity\RootEntityInterface, \BumbleDocGen\Core\Parser\Entity\EntityInterface, \BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityInterface -``` - - - - - - - - -

    Initialization methods:

    - -
      -
    1. - __construct -
    2. -
    - -

    Methods:

    - -
      -
    1. - addPluginData - - Add information to aт entity object
    2. -
    3. - cursorToDocAttributeLinkFragment -
    4. -
    5. - getAbsoluteFileName - - Returns the absolute path to a file if it can be retrieved and if the file is in the project directory
    6. -
    7. - getAst - - Get AST for this entity
    8. -
    9. - getCacheKey -
    10. -
    11. - getCachedEntityDependencies -
    12. -
    13. - getConstant - - Get the method entity by its name
    14. -
    15. - getConstantEntitiesCollection - - Get a collection of constant entities
    16. -
    17. - getConstantValue - - Get the compiled value of a constant
    18. -
    19. - getConstants - - Get all constants that are available according to the configuration as an array
    20. -
    21. - getConstantsData - - Get a list of all constants and classes where they are implemented
    22. -
    23. - getConstantsValues - - Get class constant compiled values according to filters
    24. -
    25. - getCurrentRootEntity -
    26. -
    27. - getDescription - - Get entity description
    28. -
    29. - getDescriptionLinks - - Get parsed links from description and doc blocks `see` and `link`
    30. -
    31. - getDocBlock - - Get DocBlock for current entity
    32. -
    33. - getDocComment - - Get the doc comment of an entity
    34. -
    35. - getDocCommentEntity - - Link to an entity where docBlock is implemented for this entity
    36. -
    37. - getDocCommentLine - - Get the code line number where the docBlock of the current entity begins
    38. -
    39. - getDocNote - - Get the note annotation value
    40. -
    41. - getDocRender -
    42. -
    43. - getEndLine - - Get the line number of the end of a class code in a file
    44. -
    45. - getEntityDependencies -
    46. -
    47. - getExamples - - Get parsed examples from `examples` doc block
    48. -
    49. - getFileContent -
    50. -
    51. - getFileSourceLink -
    52. -
    53. - getFirstExample - - Get first example from `examples` doc block
    54. -
    55. - getImplementingClass - - Get the class like entity in which the current entity was implemented
    56. -
    57. - getInterfaceNames - - Get a list of class interface names
    58. -
    59. - getInterfacesEntities - - Get a list of interface entities that the current class implements
    60. -
    61. - getMethod - - Get the method entity by its name
    62. -
    63. - getMethodEntitiesCollection - - Get a collection of method entities
    64. -
    65. - getMethods - - Get all methods that are available according to the configuration as an array
    66. -
    67. - getMethodsData - - Get a list of all methods and classes where they are implemented
    68. -
    69. - getModifiersString - - Get entity modifiers as a string
    70. -
    71. - getName - - Full name of the entity
    72. -
    73. - getNamespaceName - - Get the entity namespace name
    74. -
    75. - getObjectId - - Get entity unique ID
    76. -
    77. - getParentClass - - Get the entity of the parent class if it exists
    78. -
    79. - getParentClassEntities - - Get a list of parent class entities
    80. -
    81. - getParentClassName - - Get the name of the parent class entity if it exists
    82. -
    83. - getParentClassNames - - Get a list of entity names of parent classes
    84. -
    85. - getPluginData - - Get additional information added using the plugin
    86. -
    87. - getProperties - - Get all properties that are available according to the configuration as an array
    88. -
    89. - getPropertiesData - - Get a list of all properties and classes where they are implemented
    90. -
    91. - getProperty - - Get the property entity by its name
    92. -
    93. - getPropertyDefaultValue - - Get the compiled value of a property
    94. -
    95. - getPropertyEntitiesCollection - - Get a collection of property entities
    96. -
    97. - getRelativeFileName - - File name relative to project_root configuration parameter
    98. -
    99. - getRootEntityCollection - - Get the collection of root entities to which this entity belongs
    100. -
    101. - getShortName - - Short name of the entity
    102. -
    103. - getStartLine - - Get the line number of the start of a class code in a file
    104. -
    105. - getThrows - - Get parsed throws from `throws` doc block
    106. -
    107. - getThrowsDocBlockLinks -
    108. -
    109. - getTraits - - Get a list of trait entities of the current class
    110. -
    111. - getTraitsNames - - Get a list of class traits names
    112. -
    113. - hasConstant - - Check if a constant exists in a class
    114. -
    115. - hasDescriptionLinks - - Checking if an entity has links in its description
    116. -
    117. - hasExamples - - Checking if an entity has `example` docBlock
    118. -
    119. - hasMethod - - Check if a method exists in a class
    120. -
    121. - hasParentClass - - Check if a certain parent class exists in a chain of parent classes
    122. -
    123. - hasProperty - - Check if a property exists in a class
    124. -
    125. - hasThrows - - Checking if an entity has `throws` docBlock
    126. -
    127. - hasTraits - - Check if the class contains traits
    128. -
    129. - implementsInterface - - Check if a class implements an interface
    130. -
    131. - isAbstract - - Check that an entity is abstract
    132. -
    133. - isApi - - Checking if an entity has `api` docBlock
    134. -
    135. - isClass - - Check if an entity is a Class
    136. -
    137. - isClassLoad -
    138. -
    139. - isDeprecated - - Checking if an entity has `deprecated` docBlock
    140. -
    141. - isDocumentCreationAllowed -
    142. -
    143. - isEntityCacheOutdated - - Checking if the entity cache is out of date
    144. -
    145. - isEntityDataCacheOutdated -
    146. -
    147. - isEntityDataCanBeLoaded -
    148. -
    149. - isEntityFileCanBeLoad - - Checking if entity data can be retrieved
    150. -
    151. - isEntityNameValid - - Check if the name is a valid name for ClassLikeEntity
    152. -
    153. - isEnum - - Check if an entity is an Enum
    154. -
    155. - isExternalLibraryEntity - - Check if a given entity is an entity from a third party library (connected via composer)
    156. -
    157. - isInGit - - Checking if class file is in git repository
    158. -
    159. - isInstantiable - - Check that an entity is instantiable
    160. -
    161. - isInterface - - Check if an entity is an Interface
    162. -
    163. - isInternal - - Checking if an entity has `internal` docBlock
    164. -
    165. - isSubclassOf - - Whether the given class is a subclass of the specified class
    166. -
    167. - isTrait - - Check if an entity is a Trait
    168. -
    169. - normalizeClassName - - Bring the class name to the standard format used in the system
    170. -
    171. - reloadEntityDependenciesCache - - Update entity dependency cache
    172. -
    173. - removeEntityValueFromCache -
    174. -
    175. - removeNotUsedEntityDataCache -
    176. -
    177. - setCustomAst -
    178. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public function __construct(\BumbleDocGen\Core\Configuration\Configuration $configuration, \BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings $phpHandlerSettings, \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection $entitiesCollection, \BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper $parserHelper, \BumbleDocGen\LanguageHandler\Php\Parser\ComposerHelper $composerHelper, \BumbleDocGen\LanguageHandler\Php\Parser\PhpParser\PhpParserHelper $phpParserHelper, \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache $localObjectCache, \Psr\Log\LoggerInterface $logger, string $className, string|null $relativeFileName); -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $configuration\BumbleDocGen\Core\Configuration\Configuration-
    $phpHandlerSettings\BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings-
    $entitiesCollection\BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection-
    $parserHelper\BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper-
    $composerHelper\BumbleDocGen\LanguageHandler\Php\Parser\ComposerHelper-
    $phpParserHelper\BumbleDocGen\LanguageHandler\Php\Parser\PhpParser\PhpParserHelper-
    $localObjectCache\BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache-
    $logger\Psr\Log\LoggerInterface-
    $classNamestring-
    $relativeFileNamestring | null-
    - - - -
    -
    -
    - - - -```php -public function addPluginData(string $pluginKey, mixed $data): void; -``` - -
    Add information to aт entity object
    - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $pluginKeystring-
    $datamixed-
    - -Return value: void - - -
    -
    -
    - -
      -
    • # - cursorToDocAttributeLinkFragment - :warning: Is internal | source code
    • -
    - -```php -public function cursorToDocAttributeLinkFragment(string $cursor, bool $isForDocument = true): string; -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $cursorstring-
    $isForDocumentbool-
    - -Return value: string - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getAbsoluteFileName(): null|string; -``` - -
    Returns the absolute path to a file if it can be retrieved and if the file is in the project directory
    - -Parameters: not specified - -Return value: null | string - - -Throws: - - -
    -
    -
    - - - -```php -public function getAst(): \PhpParser\Node\Stmt\Class_|\PhpParser\Node\Stmt\Interface_|\PhpParser\Node\Stmt\Trait_|\PhpParser\Node\Stmt\Enum_; -``` - -
    Get AST for this entity
    - -Parameters: not specified - -Return value: \PhpParser\Node\Stmt\Class_ | \PhpParser\Node\Stmt\Interface_ | \PhpParser\Node\Stmt\Trait_ | \PhpParser\Node\Stmt\Enum_ - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait - -public function getCacheKey(): string; -``` - - - -Parameters: not specified - -Return value: string - - -
    -
    -
    - -
      -
    • # - getCachedEntityDependencies - :warning: Is internal | source code
    • -
    - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getCachedEntityDependencies(): array; -``` - - - -Parameters: not specified - -Return value: array - - -Throws: - - -
    -
    -
    - - - -```php -public function getConstant(string $constantName, bool $unsafe = false): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity; -``` - -
    Get the method entity by its name
    - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $constantNamestringThe name of the constant whose entity you want to get
    $unsafeboolCheck all constants, not just the constants allowed in the configuration (@see PhpHandlerSettings::getClassConstantEntityFilter())
    - -Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity - - -Throws: - - -
    -
    -
    - - - -```php -public function getConstantEntitiesCollection(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntitiesCollection; -``` - -
    Get a collection of constant entities
    - -Parameters: not specified - -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntitiesCollection - - -Throws: - - - -See: - -
    -
    -
    - - - -```php -public function getConstantValue(string $constantName): string|array|int|bool|null|float; -``` - -
    Get the compiled value of a constant
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $constantNamestringThe name of the constant for which you need to get the value
    - -Return value: string | array | int | bool | null | float - - -Throws: - - -
    -
    -
    - - - -```php -public function getConstants(): array; -``` - -
    Get all constants that are available according to the configuration as an array
    - -Parameters: not specified - -Return value: array - - -Throws: - - - -See: - -
    -
    -
    - -
      -
    • # - getConstantsData - :warning: Is internal | source code
    • -
    - -```php -public function getConstantsData(bool $onlyFromCurrentClassAndTraits = false, int $flags = \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity::VISIBILITY_MODIFIERS_FLAG_ANY): array; -``` - -
    Get a list of all constants and classes where they are implemented
    - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $onlyFromCurrentClassAndTraitsboolGet data only for constants from the current class
    $flagsintGet data only for constants corresponding to the visibility modifiers passed in this value
    - -Return value: array - - -Throws: - - -
    -
    -
    - - - -```php -public function getConstantsValues(bool $onlyFromCurrentClassAndTraits = false, int $flags = \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity::VISIBILITY_MODIFIERS_FLAG_ANY): array; -``` - -
    Get class constant compiled values according to filters
    - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $onlyFromCurrentClassAndTraitsboolGet values only for constants from the current class
    $flagsintGet values only for constants corresponding to the visibility modifiers passed in this value
    - -Return value: array - - -Throws: - - -
    -
    -
    - -
      -
    • # - getCurrentRootEntity - :warning: Is internal | source code
    • -
    - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getCurrentRootEntity(): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; -``` - - - -Parameters: not specified - -Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getDescription(): string; -``` - -
    Get entity description
    - -Parameters: not specified - -Return value: string - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getDescriptionLinks(): array; -``` - -
    Get parsed links from description and doc blocks `see` and `link`
    - -Parameters: not specified - -Return value: array - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getDocBlock(): \phpDocumentor\Reflection\DocBlock; -``` - -
    Get DocBlock for current entity
    - -Parameters: not specified - -Return value: \phpDocumentor\Reflection\DocBlock - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getDocComment(): string; -``` - -
    Get the doc comment of an entity
    - -Parameters: not specified - -Return value: string - - -Throws: - - -
    -
    -
    - -
      -
    • # - getDocCommentEntity - :warning: Is internal | source code
    • -
    - -```php -public function getDocCommentEntity(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; -``` - -
    Link to an entity where docBlock is implemented for this entity
    - -Parameters: not specified - -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getDocCommentLine(): null|int; -``` - -
    Get the code line number where the docBlock of the current entity begins
    - -Parameters: not specified - -Return value: null | int - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getDocNote(): string; -``` - -
    Get the note annotation value
    - -Parameters: not specified - -Return value: string - - -Throws: - - -
    -
    -
    - - - -```php -public function getDocRender(): \BumbleDocGen\Core\Renderer\EntityDocRenderer\EntityDocRendererInterface; -``` - - - -Parameters: not specified - -Return value: \BumbleDocGen\Core\Renderer\EntityDocRenderer\EntityDocRendererInterface - - -Throws: - - -
    -
    -
    - - - -```php -public function getEndLine(): int; -``` - -
    Get the line number of the end of a class code in a file
    - -Parameters: not specified - -Return value: int - - -Throws: - - -
    -
    -
    - - - -```php -public function getEntityDependencies(): array; -``` - - - -Parameters: not specified - -Return value: array - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getExamples(): array; -``` - -
    Get parsed examples from `examples` doc block
    - -Parameters: not specified - -Return value: array - - -Throws: - - -
    -
    -
    - - - -```php -public function getFileContent(): string; -``` - - - -Parameters: not specified - -Return value: string - - -Throws: - - -
    -
    -
    - -
      -
    • # - getFileSourceLink - :warning: Is internal | source code
    • -
    - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getFileSourceLink(bool $withLine = true): null|string; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $withLinebool-
    - -Return value: null | string - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getFirstExample(): string; -``` - -
    Get first example from `examples` doc block
    - -Parameters: not specified - -Return value: string - - -Throws: - - -
    -
    -
    - - - -```php -public function getImplementingClass(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; -``` - -
    Get the class like entity in which the current entity was implemented
    - -Parameters: not specified - -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - - -
    -
    -
    - - - -```php -public function getInterfaceNames(): array; -``` - -
    Get a list of class interface names
    - -Parameters: not specified - -Return value: array - - -Throws: - - -
    -
    -
    - - - -```php -public function getInterfacesEntities(): array; -``` - -
    Get a list of interface entities that the current class implements
    - -Parameters: not specified - -Return value: array - - -Throws: - - -
    -
    -
    - - - -```php -public function getMethod(string $methodName, bool $unsafe = false): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntity; -``` - -
    Get the method entity by its name
    - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $methodNamestringThe name of the method whose entity you want to get
    $unsafeboolCheck all methods, not just the methods allowed in the configuration (@see PhpHandlerSettings::getMethodEntityFilter())
    - -Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntity - - -Throws: - - -
    -
    -
    - - - -```php -public function getMethodEntitiesCollection(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntitiesCollection; -``` - -
    Get a collection of method entities
    - -Parameters: not specified - -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntitiesCollection - - -Throws: - - - -See: - -
    -
    -
    - - - -```php -public function getMethods(): array; -``` - -
    Get all methods that are available according to the configuration as an array
    - -Parameters: not specified - -Return value: array - - -Throws: - - - -See: - -
    -
    -
    - -
      -
    • # - getMethodsData - :warning: Is internal | source code
    • -
    - -```php -public function getMethodsData(bool $onlyFromCurrentClassAndTraits = false, int $flags = \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntity::VISIBILITY_MODIFIERS_FLAG_ANY): array; -``` - -
    Get a list of all methods and classes where they are implemented
    - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $onlyFromCurrentClassAndTraitsboolGet data only for methods from the current class
    $flagsintGet data only for methods corresponding to the visibility modifiers passed in this value
    - -Return value: array - - -Throws: - - -
    -
    -
    - - - -```php -public function getModifiersString(): string; -``` - -
    Get entity modifiers as a string
    - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -public function getName(): string; -``` - -
    Full name of the entity
    - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -public function getNamespaceName(): string; -``` - -
    Get the entity namespace name
    - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -public function getObjectId(): string; -``` - -
    Get entity unique ID
    - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -public function getParentClass(): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; -``` - -
    Get the entity of the parent class if it exists
    - -Parameters: not specified - -Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - - -
    -
    -
    - - - -```php -public function getParentClassEntities(): array; -``` - -
    Get a list of parent class entities
    - -Parameters: not specified - -Return value: array - - -
    -
    -
    - - - -```php -public function getParentClassName(): null|string; -``` - -
    Get the name of the parent class entity if it exists
    - -Parameters: not specified - -Return value: null | string - - -
    -
    -
    - - - -```php -public function getParentClassNames(): array; -``` - -
    Get a list of entity names of parent classes
    - -Parameters: not specified - -Return value: array - - -
    -
    -
    - - - -```php -public function getPluginData(string $pluginKey): mixed; -``` - -
    Get additional information added using the plugin
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $pluginKeystring-
    - -Return value: mixed - - -
    -
    -
    - - - -```php -public function getProperties(): array; -``` - -
    Get all properties that are available according to the configuration as an array
    - -Parameters: not specified - -Return value: array - - -Throws: - - - -See: - -
    -
    -
    - -
      -
    • # - getPropertiesData - :warning: Is internal | source code
    • -
    - -```php -public function getPropertiesData(bool $onlyFromCurrentClassAndTraits = false, int $flags = \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntity::VISIBILITY_MODIFIERS_FLAG_ANY): array; -``` - -
    Get a list of all properties and classes where they are implemented
    - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $onlyFromCurrentClassAndTraitsboolGet data only for properties from the current class
    $flagsintGet data only for properties corresponding to the visibility modifiers passed in this value
    - -Return value: array - - -Throws: - - -
    -
    -
    - - - -```php -public function getProperty(string $propertyName, bool $unsafe = false): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntity; -``` - -
    Get the property entity by its name
    - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $propertyNamestringThe name of the property whose entity you want to get
    $unsafeboolCheck all properties, not just the properties allowed in the configuration (@see PhpHandlerSettings::getPropertyEntityFilter())
    - -Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntity - - -Throws: - - -
    -
    -
    - - - -```php -public function getPropertyDefaultValue(string $propertyName): string|array|int|bool|null|float; -``` - -
    Get the compiled value of a property
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $propertyNamestringThe name of the property for which you need to get the value
    - -Return value: string | array | int | bool | null | float - - -Throws: - - -
    -
    -
    - - - -```php -public function getPropertyEntitiesCollection(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntitiesCollection; -``` - -
    Get a collection of property entities
    - -Parameters: not specified - -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntitiesCollection - - -Throws: - - - -See: - -
    -
    -
    - - - -```php -public function getRelativeFileName(): null|string; -``` - -
    File name relative to project_root configuration parameter
    - -Parameters: not specified - -Return value: null | string - - - -See: - -
    -
    -
    - - - -```php -public function getRootEntityCollection(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; -``` - -
    Get the collection of root entities to which this entity belongs
    - -Parameters: not specified - -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection - - -
    -
    -
    - - - -```php -public function getShortName(): string; -``` - -
    Short name of the entity
    - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -public function getStartLine(): int; -``` - -
    Get the line number of the start of a class code in a file
    - -Parameters: not specified - -Return value: int - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getThrows(): array; -``` - -
    Get parsed throws from `throws` doc block
    - -Parameters: not specified - -Return value: array - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getThrowsDocBlockLinks(): array; -``` - - - -Parameters: not specified - -Return value: array - - -Throws: - - -
    -
    -
    - - - -```php -public function getTraits(): array; -``` - -
    Get a list of trait entities of the current class
    - -Parameters: not specified - -Return value: array - - -Throws: - - -
    -
    -
    - - - -```php -public function getTraitsNames(): array; -``` - -
    Get a list of class traits names
    - -Parameters: not specified - -Return value: array - - -Throws: - - -
    -
    -
    - - - -```php -public function hasConstant(string $constantName, bool $unsafe = false): bool; -``` - -
    Check if a constant exists in a class
    - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $constantNamestringThe name of the class whose entity you want to check
    $unsafeboolCheck all constants, not just the constants allowed in the configuration (@see PhpHandlerSettings::getClassConstantEntityFilter())
    - -Return value: bool - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function hasDescriptionLinks(): bool; -``` - -
    Checking if an entity has links in its description
    - -Parameters: not specified - -Return value: bool - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function hasExamples(): bool; -``` - -
    Checking if an entity has `example` docBlock
    - -Parameters: not specified - -Return value: bool - - -Throws: - - -
    -
    -
    - - - -```php -public function hasMethod(string $methodName, bool $unsafe = false): bool; -``` - -
    Check if a method exists in a class
    - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $methodNamestringThe name of the method whose entity you want to check
    $unsafeboolCheck all methods, not just the methods allowed in the configuration (@see PhpHandlerSettings::getMethodEntityFilter())
    - -Return value: bool - - -Throws: - - -
    -
    -
    - - - -```php -public function hasParentClass(string $parentClassName): bool; -``` - -
    Check if a certain parent class exists in a chain of parent classes
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $parentClassNamestringSearched parent class
    - -Return value: bool - - -
    -
    -
    - - - -```php -public function hasProperty(string $propertyName, bool $unsafe = false): bool; -``` - -
    Check if a property exists in a class
    - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $propertyNamestringThe name of the property whose entity you want to check
    $unsafeboolCheck all properties, not just the properties allowed in the configuration (@see PhpHandlerSettings::getPropertyEntityFilter())
    - -Return value: bool - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function hasThrows(): bool; -``` - -
    Checking if an entity has `throws` docBlock
    - -Parameters: not specified - -Return value: bool - - -Throws: - - -
    -
    -
    - - - -```php -public function hasTraits(): bool; -``` - -
    Check if the class contains traits
    - -Parameters: not specified - -Return value: bool - - -Throws: - - -
    -
    -
    - - - -```php -public function implementsInterface(string $interfaceName): bool; -``` - -
    Check if a class implements an interface
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $interfaceNamestringName of the required interface in the interface chain
    - -Return value: bool - - -Throws: - - -
    -
    -
    - - - -```php -public function isAbstract(): bool; -``` - -
    Check that an entity is abstract
    - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function isApi(): bool; -``` - -
    Checking if an entity has `api` docBlock
    - -Parameters: not specified - -Return value: bool - - -Throws: - - -
    -
    -
    - - - -```php -public function isClass(): bool; -``` - -
    Check if an entity is a Class
    - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - - - -```php -public function isClassLoad(): bool; -``` - - - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function isDeprecated(): bool; -``` - -
    Checking if an entity has `deprecated` docBlock
    - -Parameters: not specified - -Return value: bool - - -Throws: - - -
    -
    -
    - -
      -
    • # - isDocumentCreationAllowed - :warning: Is internal | source code
    • -
    - -```php -public function isDocumentCreationAllowed(): bool; -``` - - - -Parameters: not specified - -Return value: bool - - -Throws: - - -
    -
    -
    - -
      -
    • # - isEntityCacheOutdated - :warning: Is internal | source code
    • -
    - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function isEntityCacheOutdated(): bool; -``` - -
    Checking if the entity cache is out of date
    - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - -
      -
    • # - isEntityDataCacheOutdated - :warning: Is internal | source code
    • -
    - -```php -// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait - -public function isEntityDataCacheOutdated(): bool; -``` - - - -Parameters: not specified - -Return value: bool - - -Throws: - - -
    -
    -
    - - - -```php -public function isEntityDataCanBeLoaded(): bool; -``` - - - -Parameters: not specified - -Return value: bool - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function isEntityFileCanBeLoad(): bool; -``` - -
    Checking if entity data can be retrieved
    - -Parameters: not specified - -Return value: bool - - -Throws: - - -
    -
    -
    - - - -```php -public static function isEntityNameValid(string $entityName): bool; -``` - -
    Check if the name is a valid name for ClassLikeEntity
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $entityNamestring-
    - -Return value: bool - - -
    -
    -
    - - - -```php -public function isEnum(): bool; -``` - -
    Check if an entity is an Enum
    - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - -
      -
    • # - isExternalLibraryEntity - :warning: Is internal | source code
    • -
    - -```php -public function isExternalLibraryEntity(): bool; -``` - -
    Check if a given entity is an entity from a third party library (connected via composer)
    - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - - - -```php -public function isInGit(): bool; -``` - -
    Checking if class file is in git repository
    - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - - - -```php -public function isInstantiable(): bool; -``` - -
    Check that an entity is instantiable
    - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - - - -```php -public function isInterface(): bool; -``` - -
    Check if an entity is an Interface
    - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function isInternal(): bool; -``` - -
    Checking if an entity has `internal` docBlock
    - -Parameters: not specified - -Return value: bool - - -Throws: - - -
    -
    -
    - - - -```php -public function isSubclassOf(string $className): bool; -``` - -
    Whether the given class is a subclass of the specified class
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $classNamestring-
    - -Return value: bool - - -Throws: - - -
    -
    -
    - - - -```php -public function isTrait(): bool; -``` - -
    Check if an entity is a Trait
    - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - - - -```php -public static function normalizeClassName(string $name): string; -``` - -
    Bring the class name to the standard format used in the system
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $namestring-
    - -Return value: string - - -
    -
    -
    - -
      -
    • # - reloadEntityDependenciesCache - :warning: Is internal | source code
    • -
    - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function reloadEntityDependenciesCache(): array; -``` - -
    Update entity dependency cache
    - -Parameters: not specified - -Return value: array - - -
    -
    -
    - -
      -
    • # - removeEntityValueFromCache - :warning: Is internal | source code
    • -
    - -```php -// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait - -public function removeEntityValueFromCache(string $key): void; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $keystring-
    - -Return value: void - - -
    -
    -
    - -
      -
    • # - removeNotUsedEntityDataCache - :warning: Is internal | source code
    • -
    - -```php -// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait - -public function removeNotUsedEntityDataCache(): void; -``` - - - -Parameters: not specified - -Return value: void - - -Throws: - - -
    -
    -
    - - - -```php -public function setCustomAst(\PhpParser\Node\Stmt\Trait_|\PhpParser\Node\Stmt\Enum_|\PhpParser\Node\Stmt\Interface_|\PhpParser\Node\Stmt\Class_|null $customAst): void; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $customAst\PhpParser\Node\Stmt\Trait_ | \PhpParser\Node\Stmt\Enum_ | \PhpParser\Node\Stmt\Interface_ | \PhpParser\Node\Stmt\Class_ | null-
    - -Return value: void - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/classes/CloneOperation.md b/docs/tech/classes/CloneOperation.md deleted file mode 100644 index a1d104b0..00000000 --- a/docs/tech/classes/CloneOperation.md +++ /dev/null @@ -1,207 +0,0 @@ - - BumbleDocGen / Technical description of the project / Class map / CloneOperation
    - -

    - CloneOperation class: -

    - - - - - -```php -namespace BumbleDocGen\Core\Parser\Entity\CollectionLogOperation; - -final class CloneOperation implements \BumbleDocGen\Core\Parser\Entity\CollectionLogOperation\OperationInterface -``` - - - - - - - - -

    Initialization methods:

    - -
      -
    1. - __construct -
    2. -
    - -

    Methods:

    - -
      -
    1. - call -
    2. -
    3. - getKey -
    4. -
    5. - getOperationsCollection -
    6. -
    7. - incrementUsageCount -
    8. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public function __construct(string $functionName, array $args, \BumbleDocGen\Core\Parser\Entity\CollectionLogOperation\OperationsCollection $operationsCollection); -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $functionNamestring-
    $argsarray-
    $operationsCollection\BumbleDocGen\Core\Parser\Entity\CollectionLogOperation\OperationsCollection-
    - - - -
    -
    -
    - - - -```php -public function call(\BumbleDocGen\Core\Parser\Entity\RootEntityCollection $rootEntityCollection): \BumbleDocGen\Core\Parser\Entity\RootEntityCollection; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $rootEntityCollection\BumbleDocGen\Core\Parser\Entity\RootEntityCollection-
    - -Return value: \BumbleDocGen\Core\Parser\Entity\RootEntityCollection - - -
    -
    -
    - - - -```php -public function getKey(): string; -``` - - - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -public function getOperationsCollection(): \BumbleDocGen\Core\Parser\Entity\CollectionLogOperation\OperationsCollection; -``` - - - -Parameters: not specified - -Return value: \BumbleDocGen\Core\Parser\Entity\CollectionLogOperation\OperationsCollection - - -
    -
    -
    - - - -```php -public function incrementUsageCount(): void; -``` - - - -Parameters: not specified - -Return value: void - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/classes/CollectionGroupLoadEntitiesResult.md b/docs/tech/classes/CollectionGroupLoadEntitiesResult.md deleted file mode 100644 index ebaef5dd..00000000 --- a/docs/tech/classes/CollectionGroupLoadEntitiesResult.md +++ /dev/null @@ -1,110 +0,0 @@ - - BumbleDocGen / Technical description of the project / Class map / CollectionGroupLoadEntitiesResult
    - -

    - CollectionGroupLoadEntitiesResult class: -

    - - - - - -```php -namespace BumbleDocGen\Core\Parser\Entity; - -final class CollectionGroupLoadEntitiesResult -``` - - - - - - - - - -

    Methods:

    - -
      -
    1. - addResult -
    2. -
    3. - getSummary -
    4. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public function addResult(string $collectionName, \BumbleDocGen\Core\Parser\Entity\CollectionLoadEntitiesResult $collectionLoadEntitiesResult): void; -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $collectionNamestring-
    $collectionLoadEntitiesResult\BumbleDocGen\Core\Parser\Entity\CollectionLoadEntitiesResult-
    - -Return value: void - - -
    -
    -
    - - - -```php -public function getSummary(): \BumbleDocGen\Core\Parser\Entity\CollectionLoadEntitiesResult; -``` - - - -Parameters: not specified - -Return value: \BumbleDocGen\Core\Parser\Entity\CollectionLoadEntitiesResult - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/classes/CollectionLoadEntitiesResult.md b/docs/tech/classes/CollectionLoadEntitiesResult.md deleted file mode 100644 index 47ed6628..00000000 --- a/docs/tech/classes/CollectionLoadEntitiesResult.md +++ /dev/null @@ -1,224 +0,0 @@ - - BumbleDocGen / Technical description of the project / Class map / CollectionLoadEntitiesResult
    - -

    - CollectionLoadEntitiesResult class: -

    - - - - - -```php -namespace BumbleDocGen\Core\Parser\Entity; - -final class CollectionLoadEntitiesResult -``` - - - - - - - - -

    Initialization methods:

    - -
      -
    1. - __construct -
    2. -
    - -

    Methods:

    - -
      -
    1. - getEntitiesAddedByPluginsCount -
    2. -
    3. - getProcessedEntitiesCount -
    4. -
    5. - getProcessedFilesCount -
    6. -
    7. - getSkippedEntitiesCount -
    8. -
    9. - getTotalAddedEntities -
    10. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public function __construct(int $processedFilesCount, int $processedEntitiesCount, int $skippedEntitiesCount, int $entitiesAddedByPluginsCount, int $totalAddedEntities); -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $processedFilesCountint-
    $processedEntitiesCountint-
    $skippedEntitiesCountint-
    $entitiesAddedByPluginsCountint-
    $totalAddedEntitiesint-
    - - - -
    -
    -
    - - - -```php -public function getEntitiesAddedByPluginsCount(): int; -``` - - - -Parameters: not specified - -Return value: int - - -
    -
    -
    - - - -```php -public function getProcessedEntitiesCount(): int; -``` - - - -Parameters: not specified - -Return value: int - - -
    -
    -
    - - - -```php -public function getProcessedFilesCount(): int; -``` - - - -Parameters: not specified - -Return value: int - - -
    -
    -
    - - - -```php -public function getSkippedEntitiesCount(): int; -``` - - - -Parameters: not specified - -Return value: int - - -
    -
    -
    - - - -```php -public function getTotalAddedEntities(): int; -``` - - - -Parameters: not specified - -Return value: int - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/classes/ComposerHelper.md b/docs/tech/classes/ComposerHelper.md deleted file mode 100644 index 3a54c39a..00000000 --- a/docs/tech/classes/ComposerHelper.md +++ /dev/null @@ -1,192 +0,0 @@ - - BumbleDocGen / Technical description of the project / Class map / ComposerHelper
    - -

    - ComposerHelper class: -

    - - - - - -```php -namespace BumbleDocGen\LanguageHandler\Php\Parser; - -final class ComposerHelper -``` - - - - - - - - -

    Initialization methods:

    - -
      -
    1. - __construct -
    2. -
    - -

    Methods:

    - -
      -
    1. - getComposerClassLoader -
    2. -
    3. - getComposerPackageDataByClassName -
    4. -
    5. - getComposerPackages -
    6. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public function __construct(\BumbleDocGen\Core\Configuration\Configuration $configuration, \BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings $phpHandlerSettings); -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $configuration\BumbleDocGen\Core\Configuration\Configuration-
    $phpHandlerSettings\BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings-
    - - - -
    -
    -
    - - - -```php -public function getComposerClassLoader(): \Composer\Autoload\ClassLoader; -``` - - - -Parameters: not specified - -Return value: \Composer\Autoload\ClassLoader - - -Throws: - - -
    -
    -
    - - - -```php -public function getComposerPackageDataByClassName(string $className): null|array; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $classNamestring-
    - -Return value: null | array - - -
    -
    -
    - - - -```php -public function getComposerPackages(): array; -``` - - - -Parameters: not specified - -Return value: array - - -Throws: - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/classes/ConditionGroupTypeEnum.md b/docs/tech/classes/ConditionGroupTypeEnum.md deleted file mode 100644 index 6be4dc28..00000000 --- a/docs/tech/classes/ConditionGroupTypeEnum.md +++ /dev/null @@ -1,45 +0,0 @@ - - BumbleDocGen / Technical description of the project / Class map / ConditionGroupTypeEnum
    - -

    - ConditionGroupTypeEnum class: -

    - - - - - -```php -namespace BumbleDocGen\Core\Parser\FilterCondition; - -final class ConditionGroupTypeEnum -``` - - - - - - - - - - - -

    Constants:

    - - - - - - - - \ No newline at end of file diff --git a/docs/tech/classes/Configuration.md b/docs/tech/classes/Configuration.md index 150df3a5..e8777dd1 100644 --- a/docs/tech/classes/Configuration.md +++ b/docs/tech/classes/Configuration.md @@ -1,5 +1,4 @@ - - BumbleDocGen / Technical description of the project / Class map / Configuration
    + BumbleDocGen / Technical description of the project / Console app / Configuration

    Configuration class: @@ -87,6 +86,9 @@ final class Configuration
  • isCheckFileInGitBeforeCreatingDocEnabled
  • +
  • + renderWithFrontMatter +
  • useSharedCache
  • @@ -159,7 +161,7 @@ public function __construct(\BumbleDocGen\Core\Configuration\ConfigurationParame ```php @@ -182,7 +184,7 @@ public function getAdditionalConsoleCommands(): \BumbleDocGen\Console\Command\Ad \DI\NotFoundException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -210,7 +212,7 @@ public function getCacheDir(): null|string; Throws: @@ -242,7 +244,7 @@ public function getConfigurationVersion(): string; ```php @@ -280,7 +282,7 @@ public function getGitClientPath(): string; Throws: @@ -291,7 +293,7 @@ public function getGitClientPath(): string; ```php @@ -325,7 +327,7 @@ public function getIfExists(mixed $key): null|string; Throws: @@ -359,7 +361,7 @@ public function getLanguageHandlersCollection(): \BumbleDocGen\LanguageHandler\L \DI\NotFoundException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -387,7 +389,7 @@ public function getOutputDir(): string; Throws: @@ -415,7 +417,7 @@ public function getOutputDirBaseUrl(): string; Throws: @@ -446,7 +448,7 @@ public function getPageLinkProcessor(): \BumbleDocGen\Core\Renderer\PageLinkProc \DI\DependencyException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • \DI\NotFoundException
  • @@ -480,7 +482,7 @@ public function getPlugins(): \BumbleDocGen\Core\Plugin\PluginsCollection; \DI\DependencyException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • \DI\NotFoundException
  • @@ -511,7 +513,7 @@ public function getProjectRoot(): string; Throws: @@ -542,7 +544,7 @@ public function getSourceLocators(): \BumbleDocGen\Core\Parser\SourceLocator\Sou \DI\DependencyException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • \DI\NotFoundException
  • @@ -573,7 +575,7 @@ public function getTemplatesDir(): string; Throws: @@ -607,7 +609,7 @@ public function getTwigFilters(): \BumbleDocGen\Core\Renderer\Twig\Filter\Custom \DI\NotFoundException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -638,7 +640,7 @@ public function getTwigFunctions(): \BumbleDocGen\Core\Renderer\Twig\Function\Cu \DI\DependencyException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • \DI\NotFoundException
  • @@ -652,7 +654,7 @@ public function getTwigFunctions(): \BumbleDocGen\Core\Renderer\Twig\Function\Cu ```php @@ -680,7 +682,7 @@ public function getWorkingDir(): string; ```php @@ -697,7 +699,35 @@ public function isCheckFileInGitBeforeCreatingDocEnabled(): bool; Throws: + + +
    +
    + + + +```php +public function renderWithFrontMatter(): bool; +``` + + + +Parameters: not specified + +Return value: bool + + +Throws: + @@ -725,11 +755,9 @@ public function useSharedCache(): bool; Throws:

    - - \ No newline at end of file diff --git a/docs/tech/classes/ConfigurationCommand.md b/docs/tech/classes/ConfigurationCommand.md index 7ff6f270..d398575c 100644 --- a/docs/tech/classes/ConfigurationCommand.md +++ b/docs/tech/classes/ConfigurationCommand.md @@ -1,5 +1,4 @@ - - BumbleDocGen / Technical description of the project / Class map / ConfigurationCommand
    + BumbleDocGen / Technical description of the project / Console app / ConfigurationCommand

    ConfigurationCommand class: @@ -78,5 +77,3 @@ public function __construct(string $name = null);
    - - \ No newline at end of file diff --git a/docs/tech/classes/ConfigurationKey.md b/docs/tech/classes/ConfigurationKey.md deleted file mode 100644 index dd30d878..00000000 --- a/docs/tech/classes/ConfigurationKey.md +++ /dev/null @@ -1,127 +0,0 @@ - - BumbleDocGen / Technical description of the project / Class map / ConfigurationKey
    - -

    - ConfigurationKey class: -

    - - - - - -```php -namespace BumbleDocGen\Core\Configuration; - -final class ConfigurationKey -``` - - - - - - - - - -

    Methods:

    - -
      -
    1. - all -
    2. -
    - - -

    Constants:

    - - - - - - -

    Method details:

    - -
    - - - -```php -public static function all(): array; -``` - - - -Parameters: not specified - -Return value: array - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/classes/ConfigurationParameterBag.md b/docs/tech/classes/ConfigurationParameterBag.md deleted file mode 100644 index ed6207ea..00000000 --- a/docs/tech/classes/ConfigurationParameterBag.md +++ /dev/null @@ -1,984 +0,0 @@ - - BumbleDocGen / Technical description of the project / Class map / ConfigurationParameterBag
    - -

    - ConfigurationParameterBag class: -

    - - - - - -```php -namespace BumbleDocGen\Core\Configuration; - -final class ConfigurationParameterBag -``` - -
    Wrapper for getting raw configuration file data
    - - - - - - -

    Initialization methods:

    - -
      -
    1. - __construct -
    2. -
    - -

    Methods:

    - -
      -
    1. - addValueFromFileIfNotExists -
    2. -
    3. - addValueIfNotExists -
    4. -
    5. - get -
    6. -
    7. - getAll -
    8. -
    9. - getConfigValues -
    10. -
    11. - getConfigVersion -
    12. -
    13. - getSubConfigurationParameterBag -
    14. -
    15. - has -
    16. -
    17. - loadFromArray -
    18. -
    19. - loadFromFiles -
    20. -
    21. - resolveValue -
    22. -
    23. - set -
    24. -
    25. - validateAndGetBooleanValue -
    26. -
    27. - validateAndGetClassListValue -
    28. -
    29. - validateAndGetClassValue -
    30. -
    31. - validateAndGetDirectoryPathValue -
    32. -
    33. - validateAndGetFilePathValue -
    34. -
    35. - validateAndGetStringListValue -
    36. -
    37. - validateAndGetStringValue -
    38. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public function __construct(\BumbleDocGen\Core\Configuration\ValueTransformer\ValueToClassTransformer $valueToClassTransformer, array $resolvers); -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $valueToClassTransformer\BumbleDocGen\Core\Configuration\ValueTransformer\ValueToClassTransformer-
    $resolversarray-
    - - - -
    -
    -
    - - - -```php -public function addValueFromFileIfNotExists(string $name, string ...$fileNames): void; -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $namestring-
    $fileNames (variadic)string-
    - -Return value: void - - -
    -
    -
    - - - -```php -public function addValueIfNotExists(string $name, mixed $value): void; -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $namestring-
    $valuemixed-
    - -Return value: void - - -
    -
    -
    - - - -```php -public function get(string $name, bool $useResolvers = true): mixed; -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $namestring-
    $useResolversbool-
    - -Return value: mixed - - -Throws: - - -
    -
    -
    - - - -```php -public function getAll(bool $useResolvers = true): array; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $useResolversbool-
    - -Return value: array - - -
    -
    -
    - - - -```php -public function getConfigValues(string ...$configurationFiles): array; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $configurationFiles (variadic)string-
    - -Return value: array - - -
    -
    -
    - - - -```php -public function getConfigVersion(): string; -``` - - - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -public function getSubConfigurationParameterBag(string $parentKey): \BumbleDocGen\Core\Configuration\ConfigurationParameterBag; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $parentKeystring-
    - -Return value: \BumbleDocGen\Core\Configuration\ConfigurationParameterBag - - -
    -
    -
    - - - -```php -public function has(mixed $name): bool; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $namemixed-
    - -Return value: bool - - -
    -
    -
    - - - -```php -public function loadFromArray(array $parameters): void; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $parametersarray-
    - -Return value: void - - -
    -
    -
    - - - -```php -public function loadFromFiles(string ...$fileNames): void; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $fileNames (variadic)string-
    - -Return value: void - - -
    -
    -
    - - - -```php -public function resolveValue(mixed $value): mixed; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $valuemixed-
    - -Return value: mixed - - -
    -
    -
    - - - -```php -public function set(string $name, mixed $value): void; -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $namestring-
    $valuemixed-
    - -Return value: void - - -
    -
    -
    - - - -```php -public function validateAndGetBooleanValue(string $parameterName): bool; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $parameterNamestring-
    - -Return value: bool - - -Throws: - - -
    -
    -
    - - - -```php -public function validateAndGetClassListValue(string $parameterName, string $classInterfaceName, bool $nullable = true): array; -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $parameterNamestring-
    $classInterfaceNamestring-
    $nullablebool-
    - -Return value: array - - -Throws: - - -
    -
    -
    - - - -```php -public function validateAndGetClassValue(string $parameterName, string $classInterfaceName): object; -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $parameterNamestring-
    $classInterfaceNamestring-
    - -Return value: object - - -Throws: - - -
    -
    -
    - - - -```php -public function validateAndGetDirectoryPathValue(string $parameterName, bool $nullable = true): null|string; -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $parameterNamestring-
    $nullablebool-
    - -Return value: null | string - - -Throws: - - -
    -
    -
    - - - -```php -public function validateAndGetFilePathValue(string $parameterName, array $fileExtensions, bool $nullable = true): null|string; -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $parameterNamestring-
    $fileExtensionsstring[]-
    $nullablebool-
    - -Return value: null | string - - -Throws: - - -
    -
    -
    - - - -```php -public function validateAndGetStringListValue(string $parameterName, bool $associative = true, bool $nullable = true): array; -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $parameterNamestring-
    $associativebool-
    $nullablebool-
    - -Return value: array - - -Throws: - - -
    -
    -
    - - - -```php -public function validateAndGetStringValue(string $parameterName, bool $nullable = true): null|string; -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $parameterNamestring-
    $nullablebool-
    - -Return value: null | string - - -Throws: - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/classes/Configuration_2.md b/docs/tech/classes/Configuration_2.md deleted file mode 100644 index 11ece911..00000000 --- a/docs/tech/classes/Configuration_2.md +++ /dev/null @@ -1,735 +0,0 @@ - - BumbleDocGen / Technical description of the project / Configuration
    - -

    - Configuration class: -

    - - - - - -```php -namespace BumbleDocGen\Core\Configuration; - -final class Configuration -``` - -
    Configuration project documentation
    - - - - - - -

    Initialization methods:

    - -
      -
    1. - __construct -
    2. -
    - -

    Methods:

    - -
      -
    1. - getAdditionalConsoleCommands -
    2. -
    3. - getCacheDir -
    4. -
    5. - getConfigurationVersion -
    6. -
    7. - getDocGenLibDir -
    8. -
    9. - getGitClientPath -
    10. -
    11. - getIfExists -
    12. -
    13. - getLanguageHandlersCollection -
    14. -
    15. - getOutputDir -
    16. -
    17. - getOutputDirBaseUrl -
    18. -
    19. - getPageLinkProcessor -
    20. -
    21. - getPlugins -
    22. -
    23. - getProjectRoot -
    24. -
    25. - getSourceLocators -
    26. -
    27. - getTemplatesDir -
    28. -
    29. - getTwigFilters -
    30. -
    31. - getTwigFunctions -
    32. -
    33. - getWorkingDir -
    34. -
    35. - isCheckFileInGitBeforeCreatingDocEnabled -
    36. -
    37. - useSharedCache -
    38. -
    - - -

    Constants:

    - - - - - - -

    Method details:

    - -
    - - - -```php -public function __construct(\BumbleDocGen\Core\Configuration\ConfigurationParameterBag $parameterBag, \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache $localObjectCache, \Psr\Log\LoggerInterface $logger); -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $parameterBag\BumbleDocGen\Core\Configuration\ConfigurationParameterBag-
    $localObjectCache\BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache-
    $logger\Psr\Log\LoggerInterface-
    - - - -
    -
    -
    - - - -```php -public function getAdditionalConsoleCommands(): \BumbleDocGen\Console\Command\AdditionalCommandCollection; -``` - - - -Parameters: not specified - -Return value: \BumbleDocGen\Console\Command\AdditionalCommandCollection - - -Throws: - - -
    -
    -
    - - - -```php -public function getCacheDir(): null|string; -``` - - - -Parameters: not specified - -Return value: null | string - - -Throws: - - -
    -
    -
    - - - -```php -public function getConfigurationVersion(): string; -``` - - - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -public function getDocGenLibDir(): string; -``` - - - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -public function getGitClientPath(): string; -``` - - - -Parameters: not specified - -Return value: string - - -Throws: - - -
    -
    -
    - - - -```php -public function getIfExists(mixed $key): null|string; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $keymixed-
    - -Return value: null | string - - -Throws: - - -
    -
    -
    - - - -```php -public function getLanguageHandlersCollection(): \BumbleDocGen\LanguageHandler\LanguageHandlersCollection; -``` - - - -Parameters: not specified - -Return value: \BumbleDocGen\LanguageHandler\LanguageHandlersCollection - - -Throws: - - -
    -
    -
    - - - -```php -public function getOutputDir(): string; -``` - - - -Parameters: not specified - -Return value: string - - -Throws: - - -
    -
    -
    - - - -```php -public function getOutputDirBaseUrl(): string; -``` - - - -Parameters: not specified - -Return value: string - - -Throws: - - -
    -
    -
    - - - -```php -public function getPageLinkProcessor(): \BumbleDocGen\Core\Renderer\PageLinkProcessor\PageLinkProcessorInterface; -``` - - - -Parameters: not specified - -Return value: \BumbleDocGen\Core\Renderer\PageLinkProcessor\PageLinkProcessorInterface - - -Throws: - - -
    -
    -
    - - - -```php -public function getPlugins(): \BumbleDocGen\Core\Plugin\PluginsCollection; -``` - - - -Parameters: not specified - -Return value: \BumbleDocGen\Core\Plugin\PluginsCollection - - -Throws: - - -
    -
    -
    - - - -```php -public function getProjectRoot(): string; -``` - - - -Parameters: not specified - -Return value: string - - -Throws: - - -
    -
    -
    - - - -```php -public function getSourceLocators(): \BumbleDocGen\Core\Parser\SourceLocator\SourceLocatorsCollection; -``` - - - -Parameters: not specified - -Return value: \BumbleDocGen\Core\Parser\SourceLocator\SourceLocatorsCollection - - -Throws: - - -
    -
    -
    - - - -```php -public function getTemplatesDir(): string; -``` - - - -Parameters: not specified - -Return value: string - - -Throws: - - -
    -
    -
    - - - -```php -public function getTwigFilters(): \BumbleDocGen\Core\Renderer\Twig\Filter\CustomFiltersCollection; -``` - - - -Parameters: not specified - -Return value: \BumbleDocGen\Core\Renderer\Twig\Filter\CustomFiltersCollection - - -Throws: - - -
    -
    -
    - - - -```php -public function getTwigFunctions(): \BumbleDocGen\Core\Renderer\Twig\Function\CustomFunctionsCollection; -``` - - - -Parameters: not specified - -Return value: \BumbleDocGen\Core\Renderer\Twig\Function\CustomFunctionsCollection - - -Throws: - - -
    -
    -
    - - - -```php -public function getWorkingDir(): string; -``` - - - -Parameters: not specified - -Return value: string - - -Throws: - - -
    -
    -
    - -
      -
    • # - isCheckFileInGitBeforeCreatingDocEnabled - | source code
    • -
    - -```php -public function isCheckFileInGitBeforeCreatingDocEnabled(): bool; -``` - - - -Parameters: not specified - -Return value: bool - - -Throws: - - -
    -
    -
    - - - -```php -public function useSharedCache(): bool; -``` - - - -Parameters: not specified - -Return value: bool - - -Throws: - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/classes/CustomFilterInterface.md b/docs/tech/classes/CustomFilterInterface.md deleted file mode 100644 index 8f04c4ce..00000000 --- a/docs/tech/classes/CustomFilterInterface.md +++ /dev/null @@ -1,88 +0,0 @@ - - BumbleDocGen / Technical description of the project / Class map / CustomFilterInterface
    - -

    - CustomFilterInterface class: -

    - - - - - -```php -namespace BumbleDocGen\Core\Renderer\Twig\Filter; - -interface CustomFilterInterface -``` - - - - - - - - - -

    Methods:

    - -
      -
    1. - getName -
    2. -
    3. - getOptions -
    4. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public static function getName(): string; -``` - - - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -public static function getOptions(): array; -``` - - - -Parameters: not specified - -Return value: array - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/classes/CustomFiltersCollection.md b/docs/tech/classes/CustomFiltersCollection.md deleted file mode 100644 index 59618bdf..00000000 --- a/docs/tech/classes/CustomFiltersCollection.md +++ /dev/null @@ -1,235 +0,0 @@ - - BumbleDocGen / Technical description of the project / Class map / CustomFiltersCollection
    - -

    - CustomFiltersCollection class: -

    - - - - - -```php -namespace BumbleDocGen\Core\Renderer\Twig\Filter; - -final class CustomFiltersCollection implements \IteratorAggregate -``` - - - - - - - - - -

    Methods:

    - -
      -
    1. - add -
    2. -
    3. - create -
    4. -
    5. - get -
    6. -
    7. - getIterator -
    8. -
    9. - getTwigFilters -
    10. -
    11. - keys -
    12. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public function add(\BumbleDocGen\Core\Renderer\Twig\Filter\CustomFilterInterface ...$filters): \BumbleDocGen\Core\Renderer\Twig\Filter\CustomFiltersCollection; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $filters (variadic)\BumbleDocGen\Core\Renderer\Twig\Filter\CustomFilterInterface-
    - -Return value: \BumbleDocGen\Core\Renderer\Twig\Filter\CustomFiltersCollection - - -
    -
    -
    - - - -```php -public static function create(\BumbleDocGen\Core\Renderer\Twig\Filter\CustomFilterInterface ...$filters): \BumbleDocGen\Core\Renderer\Twig\Filter\CustomFiltersCollection; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $filters (variadic)\BumbleDocGen\Core\Renderer\Twig\Filter\CustomFilterInterface-
    - -Return value: \BumbleDocGen\Core\Renderer\Twig\Filter\CustomFiltersCollection - - -
    -
    -
    - - - -```php -public function get(string $key): null|\BumbleDocGen\Core\Renderer\Twig\Filter\CustomFilterInterface; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $keystring-
    - -Return value: null | \BumbleDocGen\Core\Renderer\Twig\Filter\CustomFilterInterface - - -
    -
    -
    - - - -```php -public function getIterator(): \Generator; -``` - - - -Parameters: not specified - -Return value: \Generator - - -
    -
    -
    - - - -```php -public function getTwigFilters(): \Generator; -``` - - - -Parameters: not specified - -Return value: \Generator - - -
    -
    -
    - - - -```php -public function keys(): array; -``` - - - -Parameters: not specified - -Return value: array - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/classes/CustomFunctionsCollection.md b/docs/tech/classes/CustomFunctionsCollection.md deleted file mode 100644 index f641c7d6..00000000 --- a/docs/tech/classes/CustomFunctionsCollection.md +++ /dev/null @@ -1,276 +0,0 @@ - - BumbleDocGen / Technical description of the project / Class map / CustomFunctionsCollection
    - -

    - CustomFunctionsCollection class: -

    - - - - - -```php -namespace BumbleDocGen\Core\Renderer\Twig\Function; - -final class CustomFunctionsCollection implements \IteratorAggregate -``` - - - - - - - - - -

    Methods:

    - -
      -
    1. - add -
    2. -
    3. - create -
    4. -
    5. - get -
    6. -
    7. - getIterator -
    8. -
    9. - getTwigFunctions -
    10. -
    11. - has -
    12. -
    13. - keys -
    14. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public function add(\BumbleDocGen\Core\Renderer\Twig\Function\CustomFunctionInterface ...$filters): \BumbleDocGen\Core\Renderer\Twig\Function\CustomFunctionsCollection; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $filters (variadic)\BumbleDocGen\Core\Renderer\Twig\Function\CustomFunctionInterface-
    - -Return value: \BumbleDocGen\Core\Renderer\Twig\Function\CustomFunctionsCollection - - -
    -
    -
    - - - -```php -public static function create(\BumbleDocGen\Core\Renderer\Twig\Function\CustomFunctionInterface ...$filters): \BumbleDocGen\Core\Renderer\Twig\Function\CustomFunctionsCollection; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $filters (variadic)\BumbleDocGen\Core\Renderer\Twig\Function\CustomFunctionInterface-
    - -Return value: \BumbleDocGen\Core\Renderer\Twig\Function\CustomFunctionsCollection - - -
    -
    -
    - - - -```php -public function get(string $key): null|\BumbleDocGen\Core\Renderer\Twig\Function\CustomFunctionInterface; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $keystring-
    - -Return value: null | \BumbleDocGen\Core\Renderer\Twig\Function\CustomFunctionInterface - - -
    -
    -
    - - - -```php -public function getIterator(): \Generator; -``` - - - -Parameters: not specified - -Return value: \Generator - - -
    -
    -
    - - - -```php -public function getTwigFunctions(): \Generator; -``` - - - -Parameters: not specified - -Return value: \Generator - - -
    -
    -
    - - - -```php -public function has(string $key): bool; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $keystring-
    - -Return value: bool - - -
    -
    -
    - - - -```php -public function keys(): array; -``` - - - -Parameters: not specified - -Return value: array - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/classes/Daux.md b/docs/tech/classes/Daux.md new file mode 100644 index 00000000..9f6f0b59 --- /dev/null +++ b/docs/tech/classes/Daux.md @@ -0,0 +1,319 @@ + BumbleDocGen / Technical description of the project / Plugin system / Daux
    + +

    + Daux class: +

    + + + + +:warning: Is internal +```php +namespace BumbleDocGen\LanguageHandler\Php\Plugin\CorePlugin\Daux; + +final class Daux implements \BumbleDocGen\Core\Plugin\PluginInterface, \Symfony\Component\EventDispatcher\EventSubscriberInterface +``` + + + + + + + + +

    Initialization methods:

    + +
      +
    1. + __construct +
    2. +
    + +

    Methods:

    + +
      +
    1. + afterRenderingEntities +
    2. +
    3. + beforeCreatingDocFile +
    4. +
    5. + getSubscribedEvents +
    6. +
    7. + onCreateDocumentedEntityWrapper +
    8. +
    9. + onGetProjectTemplatesDirs +
    10. +
    11. + onGetTemplatePathByRelativeDocPath +
    12. +
    + + +

    Constants:

    + + + + + + +

    Method details:

    + +
    + + + +```php +public function __construct(\BumbleDocGen\Core\Configuration\Configuration $configuration, \BumbleDocGen\Core\Renderer\Breadcrumbs\BreadcrumbsHelper $breadcrumbsHelper); +``` + + + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $configuration\BumbleDocGen\Core\Configuration\Configuration-
    $breadcrumbsHelper\BumbleDocGen\Core\Renderer\Breadcrumbs\BreadcrumbsHelper-
    + + + +
    +
    +
    + + + +```php +public function afterRenderingEntities(): void; +``` + + + +Parameters: not specified + +Return value: void + + +Throws: + + +
    +
    +
    + + + +```php +public function beforeCreatingDocFile(\BumbleDocGen\Core\Plugin\Event\Renderer\BeforeCreatingDocFile|\BumbleDocGen\Core\Plugin\Event\Renderer\BeforeCreatingEntityDocFile $event): void; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $event\BumbleDocGen\Core\Plugin\Event\Renderer\BeforeCreatingDocFile | \BumbleDocGen\Core\Plugin\Event\Renderer\BeforeCreatingEntityDocFile-
    + +Return value: void + + +Throws: + + +
    +
    +
    + + + +```php +public static function getSubscribedEvents(): array; +``` + + + +Parameters: not specified + +Return value: array + + +
    +
    +
    + + + +```php +public function onCreateDocumentedEntityWrapper(\BumbleDocGen\Core\Plugin\Event\Renderer\OnCreateDocumentedEntityWrapper $event): void; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $event\BumbleDocGen\Core\Plugin\Event\Renderer\OnCreateDocumentedEntityWrapper-
    + +Return value: void + + +
    +
    +
    + + + +```php +public function onGetProjectTemplatesDirs(\BumbleDocGen\Core\Plugin\Event\Renderer\OnGetProjectTemplatesDirs $event): void; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $event\BumbleDocGen\Core\Plugin\Event\Renderer\OnGetProjectTemplatesDirs-
    + +Return value: void + + +
    +
    +
    + + + +```php +public function onGetTemplatePathByRelativeDocPath(\BumbleDocGen\Core\Plugin\Event\Renderer\OnGetTemplatePathByRelativeDocPath $event): void; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $event\BumbleDocGen\Core\Plugin\Event\Renderer\OnGetTemplatePathByRelativeDocPath-
    + +Return value: void + + +
    +
    diff --git a/docs/tech/classes/DefaultCacheKeyGenerator.md b/docs/tech/classes/DefaultCacheKeyGenerator.md deleted file mode 100644 index c1b6a6d9..00000000 --- a/docs/tech/classes/DefaultCacheKeyGenerator.md +++ /dev/null @@ -1,91 +0,0 @@ - - BumbleDocGen / Technical description of the project / Class map / DefaultCacheKeyGenerator
    - -

    - DefaultCacheKeyGenerator class: -

    - - - - - -```php -namespace BumbleDocGen\Core\Parser\Entity\Cache\CacheKey; - -final class DefaultCacheKeyGenerator implements \BumbleDocGen\Core\Parser\Entity\Cache\CacheKey\CacheKeyGeneratorInterface -``` - - - - - - - - - -

    Methods:

    - -
      -
    1. - generateKey -
    2. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public static function generateKey(string $cacheNamespace, \BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityInterface $entity, array $args): string; -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $cacheNamespacestring-
    $entity\BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityInterface-
    $argsarray-
    - -Return value: string - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/classes/DirectoryDependency.md b/docs/tech/classes/DirectoryDependency.md deleted file mode 100644 index 36aae44d..00000000 --- a/docs/tech/classes/DirectoryDependency.md +++ /dev/null @@ -1,190 +0,0 @@ - - BumbleDocGen / Technical description of the project / Class map / DirectoryDependency
    - -

    - DirectoryDependency class: -

    - - - - - -```php -namespace BumbleDocGen\Core\Renderer\Context\Dependency; - -final class DirectoryDependency implements \BumbleDocGen\Core\Renderer\Context\Dependency\RendererDependencyInterface -``` - - - - - - - - -

    Initialization methods:

    - -
      -
    1. - __construct -
    2. -
    - -

    Methods:

    - -
      -
    1. - create -
    2. -
    3. - isChanged -
    4. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public function __construct(string $dirInternalLink, string $hash); -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $dirInternalLinkstring-
    $hashstring-
    - - - -
    -
    -
    - - - -```php -public static function create(\BumbleDocGen\Core\Renderer\RendererHelper $rendererHelper, string $dirPath): \BumbleDocGen\Core\Renderer\Context\Dependency\DirectoryDependency; -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $rendererHelper\BumbleDocGen\Core\Renderer\RendererHelper-
    $dirPathstring-
    - -Return value: \BumbleDocGen\Core\Renderer\Context\Dependency\DirectoryDependency - - -Throws: - - -
    -
    -
    - - - -```php -public function isChanged(\BumbleDocGen\Core\Renderer\RendererHelper $rendererHelper): bool; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $rendererHelper\BumbleDocGen\Core\Renderer\RendererHelper-
    - -Return value: bool - - -Throws: - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/classes/DocBlockLink.md b/docs/tech/classes/DocBlockLink.md deleted file mode 100644 index 6b4c3e98..00000000 --- a/docs/tech/classes/DocBlockLink.md +++ /dev/null @@ -1,95 +0,0 @@ - - BumbleDocGen / Technical description of the project / Class map / DocBlockLink
    - -

    - DocBlockLink class: -

    - - - - - -```php -namespace BumbleDocGen\LanguageHandler\Php\Parser\Entity\Data; - -final class DocBlockLink -``` - - - - - - - - -

    Initialization methods:

    - -
      -
    1. - __construct -
    2. -
    - - - - - - - - -

    Method details:

    - -
    - - - -```php -public function __construct(string $name, string $description = '', string|null $className = null, string|null $url = null); -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $namestring-
    $descriptionstring-
    $classNamestring | null-
    $urlstring | null-
    - - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/classes/DocBlocksGenerator.md b/docs/tech/classes/DocBlocksGenerator.md deleted file mode 100644 index d26f4391..00000000 --- a/docs/tech/classes/DocBlocksGenerator.md +++ /dev/null @@ -1,216 +0,0 @@ - - BumbleDocGen / Technical description of the project / Class map / DocBlocksGenerator
    - -

    - DocBlocksGenerator class: -

    - - - - - -```php -namespace BumbleDocGen\AI\Generators; - -final class DocBlocksGenerator -``` - - - - - - - - -

    Initialization methods:

    - -
      -
    1. - __construct -
    2. -
    - -

    Methods:

    - -
      -
    1. - generateDocBlocksForMethodsWithoutIt -
    2. -
    3. - hasMethodsWithoutDocBlocks -
    4. -
    - - -

    Constants:

    - - - - - - -

    Method details:

    - -
    - - - -```php -public function __construct(\BumbleDocGen\AI\ProviderInterface $aiProvider, \BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper $parserHelper); -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $aiProvider\BumbleDocGen\AI\ProviderInterface-
    $parserHelper\BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper-
    - - - -
    -
    -
    - -
      -
    • # - generateDocBlocksForMethodsWithoutIt - | source code
    • -
    - -```php -public function generateDocBlocksForMethodsWithoutIt(\BumbleDocGen\Core\Parser\Entity\RootEntityInterface $rootEntity, int $mode = self::MODE_READ_ONLY_SIGNATURES): array; -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $rootEntity\BumbleDocGen\Core\Parser\Entity\RootEntityInterface-
    $modeint-
    - -Return value: array - - -Throws: - - -
    -
    -
    - - - -```php -public function hasMethodsWithoutDocBlocks(\BumbleDocGen\Core\Parser\Entity\RootEntityInterface $rootEntity): bool; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $rootEntity\BumbleDocGen\Core\Parser\Entity\RootEntityInterface-
    - -Return value: bool - - -Throws: - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/classes/DocGenerator.md b/docs/tech/classes/DocGenerator.md deleted file mode 100644 index 6a0c9d0d..00000000 --- a/docs/tech/classes/DocGenerator.md +++ /dev/null @@ -1,426 +0,0 @@ - - BumbleDocGen / Technical description of the project / Class map / DocGenerator
    - -

    - DocGenerator class: -

    - - - - - -```php -namespace BumbleDocGen; - -final class DocGenerator -``` - -
    Class for generating documentation.
    - - - - - - -

    Initialization methods:

    - -
      -
    1. - __construct -
    2. -
    - -

    Methods:

    - -
      -
    1. - addDocBlocks - - Generate missing docBlocks with LLM for project class methods that are available for documentation
    2. -
    3. - generate - - Generates documentation using configuration
    4. -
    5. - generateReadmeTemplate - - Creates a `README.md` template filled with basic information using LLM
    6. -
    7. - getConfigurationKey -
    8. -
    9. - getConfigurationKeys -
    10. -
    11. - parseAndGetRootEntityCollectionsGroup -
    12. -
    - - -

    Constants:

    - - - - - - -

    Method details:

    - -
    - - - -```php -public function __construct(\Symfony\Component\Console\Style\OutputStyle $io, \BumbleDocGen\Core\Configuration\Configuration $configuration, \BumbleDocGen\Core\Plugin\PluginEventDispatcher $pluginEventDispatcher, \BumbleDocGen\Core\Parser\ProjectParser $parser, \BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper $parserHelper, \BumbleDocGen\Core\Renderer\Renderer $renderer, \BumbleDocGen\Core\Logger\Handler\GenerationErrorsHandler $generationErrorsHandler, \BumbleDocGen\Core\Parser\Entity\RootEntityCollectionsGroup $rootEntityCollectionsGroup, \BumbleDocGen\Console\ProgressBar\ProgressBarFactory $progressBarFactory, \Monolog\Logger $logger); -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $io\Symfony\Component\Console\Style\OutputStyle-
    $configuration\BumbleDocGen\Core\Configuration\Configuration-
    $pluginEventDispatcher\BumbleDocGen\Core\Plugin\PluginEventDispatcher-
    $parser\BumbleDocGen\Core\Parser\ProjectParser-
    $parserHelper\BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper-
    $renderer\BumbleDocGen\Core\Renderer\Renderer-
    $generationErrorsHandler\BumbleDocGen\Core\Logger\Handler\GenerationErrorsHandler-
    $rootEntityCollectionsGroup\BumbleDocGen\Core\Parser\Entity\RootEntityCollectionsGroup-
    $progressBarFactory\BumbleDocGen\Console\ProgressBar\ProgressBarFactory-
    $logger\Monolog\Logger-
    - - - -Throws: - - -
    -
    -
    - - - -```php -public function addDocBlocks(\BumbleDocGen\AI\ProviderInterface $aiProvider): void; -``` - -
    Generate missing docBlocks with LLM for project class methods that are available for documentation
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $aiProvider\BumbleDocGen\AI\ProviderInterface-
    - -Return value: void - - -Throws: - - -
    -
    -
    - - - -```php -public function generate(): void; -``` - -
    Generates documentation using configuration
    - -Parameters: not specified - -Return value: void - - -Throws: - - -
    -
    -
    - - - -```php -public function generateReadmeTemplate(\BumbleDocGen\AI\ProviderInterface $aiProvider): void; -``` - -
    Creates a `README.md` template filled with basic information using LLM
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $aiProvider\BumbleDocGen\AI\ProviderInterface-
    - -Return value: void - - -Throws: - - -
    -
    -
    - - - -```php -public function getConfigurationKey(string $key): void; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $keystring-
    - -Return value: void - - -Throws: - - -
    -
    -
    - - - -```php -public function getConfigurationKeys(): void; -``` - - - -Parameters: not specified - -Return value: void - - -Throws: - - -
    -
    -
    - -
      -
    • # - parseAndGetRootEntityCollectionsGroup - | source code
    • -
    - -```php -public function parseAndGetRootEntityCollectionsGroup(): \BumbleDocGen\Core\Parser\Entity\RootEntityCollectionsGroup; -``` - - - -Parameters: not specified - -Return value: \BumbleDocGen\Core\Parser\Entity\RootEntityCollectionsGroup - - -Throws: - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/classes/DocGeneratorFactory.md b/docs/tech/classes/DocGeneratorFactory.md deleted file mode 100644 index 306a6720..00000000 --- a/docs/tech/classes/DocGeneratorFactory.md +++ /dev/null @@ -1,382 +0,0 @@ - - BumbleDocGen / Technical description of the project / Class map / DocGeneratorFactory
    - -

    - DocGeneratorFactory class: -

    - - - - - -```php -namespace BumbleDocGen; - -final class DocGeneratorFactory -``` - - - - - - - - -

    Initialization methods:

    - -
      -
    1. - __construct -
    2. -
    - -

    Methods:

    - -
      -
    1. - create - - Creates a documentation generator instance using configuration files
    2. -
    3. - createByConfigArray - - Creates a documentation generator instance using an array containing the configuration
    4. -
    5. - createConfiguration - - Creating a project configuration instance
    6. -
    7. - createRootEntitiesCollection - - Creating a collection of entities (see `ReflectionAPI`)
    8. -
    9. - setCustomConfigurationParameters -
    10. -
    11. - setCustomDiDefinitions -
    12. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public function __construct(string $diConfig = __DIR__ . '/di-config.php'); -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $diConfigstring-
    - - - -
    -
    -
    - - - -```php -public function create(string|null ...$configurationFiles): \BumbleDocGen\DocGenerator; -``` - -
    Creates a documentation generator instance using configuration files
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $configurationFiles (variadic)string | null-
    - -Return value: \BumbleDocGen\DocGenerator - - -Throws: - - -
    -
    -
    - - - -```php -public function createByConfigArray(array $config): \BumbleDocGen\DocGenerator; -``` - -
    Creates a documentation generator instance using an array containing the configuration
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $configarray-
    - -Return value: \BumbleDocGen\DocGenerator - - -Throws: - - -
    -
    -
    - - - -```php -public function createConfiguration(string ...$configurationFiles): \BumbleDocGen\Core\Configuration\Configuration; -``` - -
    Creating a project configuration instance
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $configurationFiles (variadic)string-
    - -Return value: \BumbleDocGen\Core\Configuration\Configuration - - -Throws: - - -
    -
    -
    - - - -```php -public function createRootEntitiesCollection(\BumbleDocGen\Core\Configuration\ReflectionApiConfig $reflectionApiConfig): \BumbleDocGen\Core\Parser\Entity\RootEntityCollection; -``` - -
    Creating a collection of entities (see `ReflectionAPI`)
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $reflectionApiConfig\BumbleDocGen\Core\Configuration\ReflectionApiConfig-
    - -Return value: \BumbleDocGen\Core\Parser\Entity\RootEntityCollection - - -Throws: - - -
    -
    -
    - - - -```php -public function setCustomConfigurationParameters(array $customConfigurationParameters): void; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $customConfigurationParametersarray-
    - -Return value: void - - -
    -
    -
    - - - -```php -public function setCustomDiDefinitions(array $definitions): void; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $definitionsarray-
    - -Return value: void - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/classes/DocumentTransformableEntityInterface.md b/docs/tech/classes/DocumentTransformableEntityInterface.md deleted file mode 100644 index b1c2d48e..00000000 --- a/docs/tech/classes/DocumentTransformableEntityInterface.md +++ /dev/null @@ -1,230 +0,0 @@ - - BumbleDocGen / Technical description of the project / Class map / DocumentTransformableEntityInterface
    - -

    - DocumentTransformableEntityInterface class: -

    - - - - - -```php -namespace BumbleDocGen\Core\Renderer\Context; - -interface DocumentTransformableEntityInterface -``` - -
    Interface for entities that can be generated into documents
    - - - - - - - -

    Methods:

    - -
      -
    1. - cursorToDocAttributeLinkFragment -
    2. -
    3. - getDocRender -
    4. -
    5. - getName -
    6. -
    7. - getRootEntityCollection -
    8. -
    9. - getShortName -
    10. -
    11. - isDocumentCreationAllowed -
    12. -
    13. - isEntityCacheOutdated -
    14. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public function cursorToDocAttributeLinkFragment(string $cursor, bool $isForDocument = true): string; -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $cursorstring-
    $isForDocumentbool-
    - -Return value: string - - -
    -
    -
    - - - -```php -public function getDocRender(): \BumbleDocGen\Core\Renderer\EntityDocRenderer\EntityDocRendererInterface; -``` - - - -Parameters: not specified - -Return value: \BumbleDocGen\Core\Renderer\EntityDocRenderer\EntityDocRendererInterface - - -
    -
    -
    - - - -```php -public function getName(): string; -``` - - - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -public function getRootEntityCollection(): \BumbleDocGen\Core\Parser\Entity\RootEntityCollection; -``` - - - -Parameters: not specified - -Return value: \BumbleDocGen\Core\Parser\Entity\RootEntityCollection - - -
    -
    -
    - - - -```php -public function getShortName(): string; -``` - - - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -public function isDocumentCreationAllowed(): bool; -``` - - - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - - - -```php -public function isEntityCacheOutdated(): bool; -``` - - - -Parameters: not specified - -Return value: bool - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/classes/DocumentedEntityWrapper.md b/docs/tech/classes/DocumentedEntityWrapper.md index 0ef5de59..fa9c1245 100644 --- a/docs/tech/classes/DocumentedEntityWrapper.md +++ b/docs/tech/classes/DocumentedEntityWrapper.md @@ -1,5 +1,4 @@ - - BumbleDocGen / Technical description of the project / Class map / DocumentedEntityWrapper
    + BumbleDocGen / Technical description of the project / DocumentedEntityWrapper

    DocumentedEntityWrapper class: @@ -299,5 +298,3 @@ public function setParentDocFilePath(string $parentDocFilePath): void;
    - - \ No newline at end of file diff --git a/docs/tech/classes/DocumentedEntityWrappersCollection.md b/docs/tech/classes/DocumentedEntityWrappersCollection.md index 59eb5c36..e592e977 100644 --- a/docs/tech/classes/DocumentedEntityWrappersCollection.md +++ b/docs/tech/classes/DocumentedEntityWrappersCollection.md @@ -1,5 +1,4 @@ - - BumbleDocGen / Technical description of the project / Class map / DocumentedEntityWrappersCollection
    + BumbleDocGen / Technical description of the project / DocumentedEntityWrappersCollection

    DocumentedEntityWrappersCollection class: @@ -167,7 +166,7 @@ public function createAndAddDocumentedEntityWrapper(\BumbleDocGen\Core\Parser\En Throws: @@ -215,5 +214,3 @@ public function getIterator(): \Generator;
    - - \ No newline at end of file diff --git a/docs/tech/classes/DrawDocumentationMenu.md b/docs/tech/classes/DrawDocumentationMenu.md index c322dbcb..fa98e83c 100644 --- a/docs/tech/classes/DrawDocumentationMenu.md +++ b/docs/tech/classes/DrawDocumentationMenu.md @@ -1,5 +1,4 @@ - - BumbleDocGen / Technical description of the project / Class map / DrawDocumentationMenu
    + BumbleDocGen / Technical description of the project / Configuration / DrawDocumentationMenu

    DrawDocumentationMenu class: @@ -196,7 +195,7 @@ public function __invoke(string|null $startPageKey = null, int|null $maxDeep = n \DI\DependencyException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -244,5 +243,3 @@ public static function getOptions(): array;
    - - \ No newline at end of file diff --git a/docs/tech/classes/DrawDocumentedEntityLink.md b/docs/tech/classes/DrawDocumentedEntityLink.md index 2676cae9..ea1f469a 100644 --- a/docs/tech/classes/DrawDocumentedEntityLink.md +++ b/docs/tech/classes/DrawDocumentedEntityLink.md @@ -1,5 +1,4 @@ - - BumbleDocGen / Technical description of the project / Class map / DrawDocumentedEntityLink
    + BumbleDocGen / Technical description of the project / Configuration / DrawDocumentedEntityLink

    DrawDocumentedEntityLink class: @@ -172,7 +171,7 @@ public function __invoke(\BumbleDocGen\Core\Parser\Entity\RootEntityInterface $e \DI\DependencyException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -220,5 +219,3 @@ public static function getOptions(): array;
    - - \ No newline at end of file diff --git a/docs/tech/classes/EntitiesLoaderProgressBarInterface.md b/docs/tech/classes/EntitiesLoaderProgressBarInterface.md deleted file mode 100644 index b9d7702d..00000000 --- a/docs/tech/classes/EntitiesLoaderProgressBarInterface.md +++ /dev/null @@ -1,168 +0,0 @@ - - BumbleDocGen / Technical description of the project / Class map / EntitiesLoaderProgressBarInterface
    - -

    - EntitiesLoaderProgressBarInterface class: -

    - - - - - -```php -namespace BumbleDocGen\Core\Parser\Entity; - -interface EntitiesLoaderProgressBarInterface -``` - - - - - - - - - -

    Methods:

    - -
      -
    1. - iterate -
    2. -
    3. - setName -
    4. -
    5. - setStepDescription -
    6. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public function iterate(iterable $iterable, int|null $max = null): \Generator; -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $iterableiterable-
    $maxint | null-
    - -Return value: \Generator - - -
    -
    -
    - - - -```php -public function setName(string $name): void; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $namestring-
    - -Return value: void - - -
    -
    -
    - - - -```php -public function setStepDescription(string $stepDescription): void; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $stepDescriptionstring-
    - -Return value: void - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/classes/EntityCacheItemPool.md b/docs/tech/classes/EntityCacheItemPool.md deleted file mode 100644 index 030cee81..00000000 --- a/docs/tech/classes/EntityCacheItemPool.md +++ /dev/null @@ -1,426 +0,0 @@ - - BumbleDocGen / Technical description of the project / Class map / EntityCacheItemPool
    - -

    - EntityCacheItemPool class: -

    - - - - -:warning: Is internal -```php -namespace BumbleDocGen\Core\Cache; - -final class EntityCacheItemPool implements \Psr\Cache\CacheItemPoolInterface -``` - - - - - - - - -

    Initialization methods:

    - -
      -
    1. - __construct -
    2. -
    - -

    Methods:

    - -
      -
    1. - clear -
    2. -
    3. - commit -
    4. -
    5. - deleteItem -
    6. -
    7. - deleteItems -
    8. -
    9. - getItem -
    10. -
    11. - getItems -
    12. -
    13. - hasItem -
    14. -
    15. - save -
    16. -
    17. - saveDeferred -
    18. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public function __construct(\BumbleDocGen\Core\Configuration\Configuration $configuration); -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $configuration\BumbleDocGen\Core\Configuration\Configuration-
    - - - -Throws: - - -
    -
    -
    - - - -```php -public function clear(): bool; -``` - - - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - - - -```php -public function commit(): bool; -``` - - - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - - - -```php -public function deleteItem(string $key): bool; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $keystring-
    - -Return value: bool - - -
    -
    -
    - - - -```php -public function deleteItems(array $keys): bool; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $keysarray-
    - -Return value: bool - - -
    -
    -
    - - - -```php -public function getItem(string $key): \Psr\Cache\CacheItemInterface; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $keystring-
    - -Return value: \Psr\Cache\CacheItemInterface - - -
    -
    -
    - - - -```php -public function getItems(array $keys = []): iterable; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $keysarray-
    - -Return value: iterable - - -
    -
    -
    - - - -```php -public function hasItem(string $key): bool; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $keystring-
    - -Return value: bool - - -
    -
    -
    - - - -```php -public function save(\Psr\Cache\CacheItemInterface $item): bool; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $item\Psr\Cache\CacheItemInterface-
    - -Return value: bool - - -
    -
    -
    - - - -```php -public function saveDeferred(\Psr\Cache\CacheItemInterface $item): bool; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $item\Psr\Cache\CacheItemInterface-
    - -Return value: bool - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/classes/EntityCacheStorageHelper.md b/docs/tech/classes/EntityCacheStorageHelper.md deleted file mode 100644 index c2dea98a..00000000 --- a/docs/tech/classes/EntityCacheStorageHelper.md +++ /dev/null @@ -1,366 +0,0 @@ - - BumbleDocGen / Technical description of the project / Class map / EntityCacheStorageHelper
    - -

    - EntityCacheStorageHelper class: -

    - - - - -:warning: Is internal -```php -namespace BumbleDocGen\Core\Parser\Entity\Cache; - -final class EntityCacheStorageHelper -``` - - - - - - - - -

    Initialization methods:

    - -
      -
    1. - __construct -
    2. -
    - -

    Methods:

    - -
      -
    1. - addItemValueToCache -
    2. -
    3. - getItemValueFromCache -
    4. -
    5. - getItemValues -
    6. -
    7. - getUsedCacheItemsKeys -
    8. -
    9. - removeItemValueFromCache -
    10. -
    11. - saveCache -
    12. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public function __construct(\BumbleDocGen\Core\Cache\EntityCacheItemPool $cacheItemPool); -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $cacheItemPool\BumbleDocGen\Core\Cache\EntityCacheItemPool-
    - - - -
    -
    -
    - - - -```php -public function addItemValueToCache(string $cacheKey, string $itemKey, mixed $value, int $expiresAfter): void; -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $cacheKeystring-
    $itemKeystring-
    $valuemixed-
    $expiresAfterint-
    - -Return value: void - - -Throws: - - -
    -
    -
    - - - -```php -public function getItemValueFromCache(string $cacheKey, string $itemKey): mixed; -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $cacheKeystring-
    $itemKeystring-
    - -Return value: mixed - - -Throws: - - -
    -
    -
    - - - -```php -public function getItemValues(string $cacheKey): array; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $cacheKeystring-
    - -Return value: array - - -Throws: - - -
    -
    -
    - - - -```php -public function getUsedCacheItemsKeys(string $cacheKey): array; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $cacheKeystring-
    - -Return value: array - - -
    -
    -
    - - - -```php -public function removeItemValueFromCache(string $cacheKey, string $itemKey): void; -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $cacheKeystring-
    $itemKeystring-
    - -Return value: void - - -
    -
    -
    - - - -```php -public function saveCache(): void; -``` - - - -Parameters: not specified - -Return value: void - - -Throws: - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/classes/EntityDocRendererHelper.md b/docs/tech/classes/EntityDocRendererHelper.md deleted file mode 100644 index 2984064f..00000000 --- a/docs/tech/classes/EntityDocRendererHelper.md +++ /dev/null @@ -1,225 +0,0 @@ - - BumbleDocGen / Technical description of the project / Class map / EntityDocRendererHelper
    - -

    - EntityDocRendererHelper class: -

    - - - - - -```php -namespace BumbleDocGen\LanguageHandler\Php\Renderer\EntityDocRenderer; - -final class EntityDocRendererHelper -``` - - - - - - - - -

    Initialization methods:

    - -
      -
    1. - __construct -
    2. -
    - -

    Methods:

    - -
      -
    1. - getEntityDataByLink -
    2. -
    3. - getEntityUrlDataByLink -
    4. -
    - - -

    Constants:

    - - - - - - -

    Method details:

    - -
    - - - -```php -public function __construct(\BumbleDocGen\Core\Parser\Entity\RootEntityCollectionsGroup $rootEntityCollectionsGroup, \BumbleDocGen\Core\Renderer\Twig\Function\GetDocumentedEntityUrl $getDocumentedEntityUrlFunction); -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $rootEntityCollectionsGroup\BumbleDocGen\Core\Parser\Entity\RootEntityCollectionsGroup-
    $getDocumentedEntityUrlFunction\BumbleDocGen\Core\Renderer\Twig\Function\GetDocumentedEntityUrl-
    - - - -
    -
    -
    - - - -```php -public function getEntityDataByLink(string $linkString, \BumbleDocGen\Core\Parser\Entity\RootEntityCollection $rootEntityCollection, string|null $defaultEntityName = null, bool $useUnsafeKeys = true): array; -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $linkStringstring-
    $rootEntityCollection\BumbleDocGen\Core\Parser\Entity\RootEntityCollection-
    $defaultEntityNamestring | null-
    $useUnsafeKeysbool-
    - -Return value: array - - -Throws: - - -
    -
    -
    - - - -```php -public function getEntityUrlDataByLink(string $linkString, string|null $defaultEntityClassName = null, bool $createDocument = true): array; -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $linkStringstring-
    $defaultEntityClassNamestring | null-
    $createDocumentbool-
    - -Return value: array - - -Throws: - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/classes/EntityDocRendererInterface.md b/docs/tech/classes/EntityDocRendererInterface.md deleted file mode 100644 index c882bbcc..00000000 --- a/docs/tech/classes/EntityDocRendererInterface.md +++ /dev/null @@ -1,170 +0,0 @@ - - BumbleDocGen / Technical description of the project / Class map / EntityDocRendererInterface
    - -

    - EntityDocRendererInterface class: -

    - - - - - -```php -namespace BumbleDocGen\Core\Renderer\EntityDocRenderer; - -interface EntityDocRendererInterface -``` - -
    Entity documentation renderer interface
    - - - - - - - -

    Methods:

    - -
      -
    1. - getDocFileExtension -
    2. -
    3. - getDocFileNamespace -
    4. -
    5. - getRenderedText - - Get rendered documentation for an entity
    6. -
    7. - isAvailableForEntity - - Can this render be used to create entity documentation
    8. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public function getDocFileExtension(): string; -``` - - - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -public function getDocFileNamespace(): string; -``` - - - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -public function getRenderedText(\BumbleDocGen\Core\Renderer\Context\DocumentedEntityWrapper $entityWrapper): string; -``` - -
    Get rendered documentation for an entity
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $entityWrapper\BumbleDocGen\Core\Renderer\Context\DocumentedEntityWrapperThe entity whose documentation was requested
    - -Return value: string - - -
    -
    -
    - - - -```php -public function isAvailableForEntity(\BumbleDocGen\Core\Parser\Entity\RootEntityInterface $entity): bool; -``` - -
    Can this render be used to create entity documentation
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $entity\BumbleDocGen\Core\Parser\Entity\RootEntityInterfaceThe entity whose documentation was requested
    - -Return value: bool - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/classes/EntityDocRenderersCollection.md b/docs/tech/classes/EntityDocRenderersCollection.md deleted file mode 100644 index 58ae0334..00000000 --- a/docs/tech/classes/EntityDocRenderersCollection.md +++ /dev/null @@ -1,146 +0,0 @@ - - BumbleDocGen / Technical description of the project / Class map / EntityDocRenderersCollection
    - -

    - EntityDocRenderersCollection class: -

    - - - - - -```php -namespace BumbleDocGen\Core\Renderer\EntityDocRenderer; - -final class EntityDocRenderersCollection implements \IteratorAggregate -``` - - - - - - - - - -

    Methods:

    - -
      -
    1. - add -
    2. -
    3. - getFirstMatchingRender -
    4. -
    5. - getIterator -
    6. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public function add(\BumbleDocGen\Core\Renderer\EntityDocRenderer\EntityDocRendererInterface $entityDocRenderer): \BumbleDocGen\Core\Renderer\EntityDocRenderer\EntityDocRenderersCollection; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $entityDocRenderer\BumbleDocGen\Core\Renderer\EntityDocRenderer\EntityDocRendererInterface-
    - -Return value: \BumbleDocGen\Core\Renderer\EntityDocRenderer\EntityDocRenderersCollection - - -
    -
    -
    - - - -```php -public function getFirstMatchingRender(\BumbleDocGen\Core\Parser\Entity\RootEntityInterface $entity): null|\BumbleDocGen\Core\Renderer\EntityDocRenderer\EntityDocRendererInterface; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $entity\BumbleDocGen\Core\Parser\Entity\RootEntityInterface-
    - -Return value: null | \BumbleDocGen\Core\Renderer\EntityDocRenderer\EntityDocRendererInterface - - -
    -
    -
    - - - -```php -public function getIterator(): \Generator; -``` - - - -Parameters: not specified - -Return value: \Generator - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/classes/EntityDocUnifiedPlacePlugin.md b/docs/tech/classes/EntityDocUnifiedPlacePlugin.md index c6be906b..f382d939 100644 --- a/docs/tech/classes/EntityDocUnifiedPlacePlugin.md +++ b/docs/tech/classes/EntityDocUnifiedPlacePlugin.md @@ -1,5 +1,4 @@ - - BumbleDocGen / Technical description of the project / Class map / EntityDocUnifiedPlacePlugin
    + BumbleDocGen / Technical description of the project / Plugin system / EntityDocUnifiedPlacePlugin

    EntityDocUnifiedPlacePlugin class: @@ -192,5 +191,3 @@ public function onGetTemplatePathByRelativeDocPath(\BumbleDocGen\Core\Plugin\Eve
    - - \ No newline at end of file diff --git a/docs/tech/classes/FileDependency.md b/docs/tech/classes/FileDependency.md deleted file mode 100644 index c99dd680..00000000 --- a/docs/tech/classes/FileDependency.md +++ /dev/null @@ -1,275 +0,0 @@ - - BumbleDocGen / Technical description of the project / Class map / FileDependency
    - -

    - FileDependency class: -

    - - - - - -```php -namespace BumbleDocGen\Core\Renderer\Context\Dependency; - -final class FileDependency implements \BumbleDocGen\Core\Renderer\Context\Dependency\RendererDependencyInterface -``` - - - - - - - - -

    Initialization methods:

    - -
      -
    1. - __construct -
    2. -
    - -

    Methods:

    - -
      -
    1. - __serialize -
    2. -
    3. - __unserialize -
    4. -
    5. - create -
    6. -
    7. - isChanged -
    8. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public function __construct(string $fileInternalLink, string $hash, string|null $contentFilterRegex, int|null $matchIndex); -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $fileInternalLinkstring-
    $hashstring-
    $contentFilterRegexstring | null-
    $matchIndexint | null-
    - - - -
    -
    -
    - - - -```php -public function __serialize(): array; -``` - - - -Parameters: not specified - -Return value: array - - -
    -
    -
    - - - -```php -public function __unserialize(array $data): void; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $dataarray-
    - -Return value: void - - -
    -
    -
    - - - -```php -public static function create(\BumbleDocGen\Core\Renderer\RendererHelper $rendererHelper, string $filePath, string|null $contentFilterRegex, int|null $matchIndex): \BumbleDocGen\Core\Renderer\Context\Dependency\FileDependency; -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $rendererHelper\BumbleDocGen\Core\Renderer\RendererHelper-
    $filePathstring-
    $contentFilterRegexstring | null-
    $matchIndexint | null-
    - -Return value: \BumbleDocGen\Core\Renderer\Context\Dependency\FileDependency - - -Throws: - - -
    -
    -
    - - - -```php -public function isChanged(\BumbleDocGen\Core\Renderer\RendererHelper $rendererHelper): bool; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $rendererHelper\BumbleDocGen\Core\Renderer\RendererHelper-
    - -Return value: bool - - -Throws: - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/classes/FileGetContents.md b/docs/tech/classes/FileGetContents.md index e7151d18..2a0337f8 100644 --- a/docs/tech/classes/FileGetContents.md +++ b/docs/tech/classes/FileGetContents.md @@ -1,5 +1,4 @@ - - BumbleDocGen / Technical description of the project / Class map / FileGetContents
    + BumbleDocGen / Technical description of the project / Configuration / FileGetContents

    FileGetContents class: @@ -199,5 +198,3 @@ public static function getOptions(): array;
    - - \ No newline at end of file diff --git a/docs/tech/classes/FixStrSize.md b/docs/tech/classes/FixStrSize.md index 3459be87..4592ad8c 100644 --- a/docs/tech/classes/FixStrSize.md +++ b/docs/tech/classes/FixStrSize.md @@ -1,5 +1,4 @@ - - BumbleDocGen / Technical description of the project / Class map / FixStrSize
    + BumbleDocGen / Technical description of the project / Configuration / FixStrSize

    FixStrSize class: @@ -149,5 +148,3 @@ public static function getOptions(): array;
    - - \ No newline at end of file diff --git a/docs/tech/classes/FrontMatterLoader.md b/docs/tech/classes/FrontMatterLoader.md deleted file mode 100644 index 64d0ec96..00000000 --- a/docs/tech/classes/FrontMatterLoader.md +++ /dev/null @@ -1,273 +0,0 @@ - - BumbleDocGen / Technical description of the project / Class map / FrontMatterLoader
    - -

    - FrontMatterLoader class: -

    - - - - - -```php -namespace BumbleDocGen\Core\Renderer\Twig; - -final class FrontMatterLoader implements \Twig\Loader\LoaderInterface -``` - - - - - - - - -

    Initialization methods:

    - -
      -
    1. - __construct -
    2. -
    - -

    Methods:

    - -
      -
    1. - exists -
    2. -
    3. - getCacheKey -
    4. -
    5. - getSourceContext -
    6. -
    7. - isFresh -
    8. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public function __construct(\Twig\Loader\LoaderInterface $loader, \BumbleDocGen\Core\Renderer\Breadcrumbs\BreadcrumbsHelper $breadcrumbsHelper, bool $removeFrontMatterFromTemplate = true); -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $loader\Twig\Loader\LoaderInterface-
    $breadcrumbsHelper\BumbleDocGen\Core\Renderer\Breadcrumbs\BreadcrumbsHelper-
    $removeFrontMatterFromTemplatebool-
    - - - -
    -
    -
    - - - -```php -public function exists(string $name): bool; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $namestring-
    - -Return value: bool - - -
    -
    -
    - - - -```php -public function getCacheKey(string $name): string; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $namestring-
    - -Return value: string - - -
    -
    -
    - - - -```php -public function getSourceContext(string $name): \Twig\Source; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $namestring-
    - -Return value: \Twig\Source - - -Throws: - - -
    -
    -
    - - - -```php -public function isFresh(string $name, int $time): bool; -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $namestring-
    $timeint-
    - -Return value: bool - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/classes/GenerateCommand.md b/docs/tech/classes/GenerateCommand.md index f59ebcbb..a4a8406b 100644 --- a/docs/tech/classes/GenerateCommand.md +++ b/docs/tech/classes/GenerateCommand.md @@ -1,8 +1,7 @@ - - BumbleDocGen / Technical description of the project / Class map / GenerateCommand
    + BumbleDocGen / Technical description of the project / Console app / GenerateCommand

    - GenerateCommand class: + GenerateCommand class:

    @@ -78,5 +77,3 @@ public function __construct(string $name = null);
    - - \ No newline at end of file diff --git a/docs/tech/classes/GeneratePageBreadcrumbs.md b/docs/tech/classes/GeneratePageBreadcrumbs.md index ade4f717..9eab4df2 100644 --- a/docs/tech/classes/GeneratePageBreadcrumbs.md +++ b/docs/tech/classes/GeneratePageBreadcrumbs.md @@ -1,5 +1,4 @@ - - BumbleDocGen / Technical description of the project / Class map / GeneratePageBreadcrumbs
    + BumbleDocGen / Technical description of the project / Configuration / GeneratePageBreadcrumbs

    GeneratePageBreadcrumbs class: @@ -175,7 +174,7 @@ public function __invoke(string $currentPageTitle, string $templatePath, bool $s \DI\NotFoundException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -223,5 +222,3 @@ public static function getOptions(): array;
    - - \ No newline at end of file diff --git a/docs/tech/classes/GenerateReadMeTemplateCommand.md b/docs/tech/classes/GenerateReadMeTemplateCommand.md index 1cff47aa..590d8ba4 100644 --- a/docs/tech/classes/GenerateReadMeTemplateCommand.md +++ b/docs/tech/classes/GenerateReadMeTemplateCommand.md @@ -1,5 +1,4 @@ - - BumbleDocGen / Technical description of the project / Class map / GenerateReadMeTemplateCommand
    + BumbleDocGen / Technical description of the project / Console app / GenerateReadMeTemplateCommand

    GenerateReadMeTemplateCommand class: @@ -90,5 +89,3 @@ public function __construct(string $name = null);
    - - \ No newline at end of file diff --git a/docs/tech/classes/GenerationErrorsHandler.md b/docs/tech/classes/GenerationErrorsHandler.md deleted file mode 100644 index 8c5ca29a..00000000 --- a/docs/tech/classes/GenerationErrorsHandler.md +++ /dev/null @@ -1,159 +0,0 @@ - - BumbleDocGen / Technical description of the project / Class map / GenerationErrorsHandler
    - -

    - GenerationErrorsHandler class: -

    - - - - - -```php -namespace BumbleDocGen\Core\Logger\Handler; - -final class GenerationErrorsHandler extends \Monolog\Handler\AbstractProcessingHandler -``` - - - - - - - - -

    Initialization methods:

    - -
      -
    1. - __construct -
    2. -
    - -

    Methods:

    - -
      -
    1. - addRecords -
    2. -
    3. - getRecords -
    4. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public function __construct(\BumbleDocGen\Core\Renderer\Context\RendererContext $rendererContext, mixed $level = \Monolog\Logger::WARNING, bool $bubble = true); -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $rendererContext\BumbleDocGen\Core\Renderer\Context\RendererContext-
    $levelmixed-
    $bubblebool-
    - - - -
    -
    -
    - - - -```php -public function addRecords(array $records): void; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $recordsarray-
    - -Return value: void - - -
    -
    -
    - - - -```php -public function getRecords(): array; -``` - - - -Parameters: not specified - -Return value: array - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/classes/GetDocumentationPageUrl.md b/docs/tech/classes/GetDocumentationPageUrl.md index f2bbb34c..54a9df97 100644 --- a/docs/tech/classes/GetDocumentationPageUrl.md +++ b/docs/tech/classes/GetDocumentationPageUrl.md @@ -1,5 +1,4 @@ - - BumbleDocGen / Technical description of the project / Class map / GetDocumentationPageUrl
    + BumbleDocGen / Technical description of the project / Configuration / GetDocumentationPageUrl

    GetDocumentationPageUrl class: @@ -177,7 +176,7 @@ public function __invoke(string $key): string; \DI\DependencyException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • \DI\NotFoundException
  • @@ -228,5 +227,3 @@ public static function getOptions(): array;
    - - \ No newline at end of file diff --git a/docs/tech/classes/GetDocumentedEntityUrl.md b/docs/tech/classes/GetDocumentedEntityUrl.md index e13597ea..7dffaff6 100644 --- a/docs/tech/classes/GetDocumentedEntityUrl.md +++ b/docs/tech/classes/GetDocumentedEntityUrl.md @@ -1,5 +1,4 @@ - - BumbleDocGen / Technical description of the project / Class map / GetDocumentedEntityUrl
    + BumbleDocGen / Technical description of the project / Configuration / GetDocumentedEntityUrl

    GetDocumentedEntityUrl class: @@ -21,11 +20,11 @@ the `EntityDocRendererInterface::getDocFileExtension()` directory will be create See: @@ -211,7 +210,7 @@ public function __invoke(\BumbleDocGen\Core\Parser\Entity\RootEntityCollection $ \DI\DependencyException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • \DI\NotFoundException
  • @@ -262,5 +261,3 @@ public static function getOptions(): array;
    - - \ No newline at end of file diff --git a/docs/tech/classes/GetDocumentedEntityUrl_2.md b/docs/tech/classes/GetDocumentedEntityUrl_2.md index a3009846..d7de8173 100644 --- a/docs/tech/classes/GetDocumentedEntityUrl_2.md +++ b/docs/tech/classes/GetDocumentedEntityUrl_2.md @@ -1,4 +1,3 @@ - BumbleDocGen / Technical description of the project / GetDocumentedEntityUrl

    @@ -21,11 +20,11 @@ the `EntityDocRendererInterface::getDocFileExtension()` directory will be create See: @@ -211,7 +210,7 @@ public function __invoke(\BumbleDocGen\Core\Parser\Entity\RootEntityCollection $ \DI\DependencyException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • \DI\NotFoundException
  • @@ -262,5 +261,3 @@ public static function getOptions(): array;
    - - \ No newline at end of file diff --git a/docs/tech/classes/GithubPagesLinkProcessor.md b/docs/tech/classes/GithubPagesLinkProcessor.md deleted file mode 100644 index 00b899d8..00000000 --- a/docs/tech/classes/GithubPagesLinkProcessor.md +++ /dev/null @@ -1,130 +0,0 @@ - - BumbleDocGen / Technical description of the project / Class map / GithubPagesLinkProcessor
    - -

    - GithubPagesLinkProcessor class: -

    - - - - - -```php -namespace BumbleDocGen\Core\Renderer\PageLinkProcessor; - -class GithubPagesLinkProcessor implements \BumbleDocGen\Core\Renderer\PageLinkProcessor\PageLinkProcessorInterface -``` - - - - - - - - -

    Initialization methods:

    - -
      -
    1. - __construct -
    2. -
    - -

    Methods:

    - -
      -
    1. - getAbsoluteUrl -
    2. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public function __construct(\BumbleDocGen\Core\Configuration\Configuration $configuration, array $docFilesExtensions = ['md', 'html']); -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $configuration\BumbleDocGen\Core\Configuration\Configuration-
    $docFilesExtensionsarray-
    - - - -
    -
    -
    - - - -```php -public function getAbsoluteUrl(string $relativeUrl): string; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $relativeUrlstring-
    - -Return value: string - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/classes/Implode.md b/docs/tech/classes/Implode.md index e71465b3..5e6494a8 100644 --- a/docs/tech/classes/Implode.md +++ b/docs/tech/classes/Implode.md @@ -1,5 +1,4 @@ - - BumbleDocGen / Technical description of the project / Class map / Implode
    + BumbleDocGen / Technical description of the project / Configuration / Implode

    Implode class: @@ -150,5 +149,3 @@ public static function getOptions(): array;
    - - \ No newline at end of file diff --git a/docs/tech/classes/InternalValueResolver.md b/docs/tech/classes/InternalValueResolver.md deleted file mode 100644 index 06ee3a6a..00000000 --- a/docs/tech/classes/InternalValueResolver.md +++ /dev/null @@ -1,142 +0,0 @@ - - BumbleDocGen / Technical description of the project / Class map / InternalValueResolver
    - -

    - InternalValueResolver class: -

    - - - - - -```php -namespace BumbleDocGen\Core\Configuration\ValueResolver; - -final class InternalValueResolver implements \BumbleDocGen\Core\Configuration\ValueResolver\ValueResolverInterface -``` - -
    We supplement the values by replacing the shortcodes with real values by internalValuesMap
    - - -Examples of using: - -```php -# Configuration processing example. -# $internalValuesMap = ['WORKING_DIR' => 'someValue']; -output_dir: "%WORKING_DIR%/docs" - -# After the value processing procedure, output_dir => "someValue/docs" - -``` - - - - - - -

    Initialization methods:

    - -
      -
    1. - __construct -
    2. -
    - -

    Methods:

    - -
      -
    1. - resolveValue -
    2. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public function __construct(array $internalValuesMap); -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $internalValuesMaparraysee BumbleDocGen/di-config.php
    - - - -
    -
    -
    - - - -```php -public function resolveValue(\BumbleDocGen\Core\Configuration\ConfigurationParameterBag $parameterBag, mixed $value): mixed; -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $parameterBag\BumbleDocGen\Core\Configuration\ConfigurationParameterBag-
    $valuemixed-
    - -Return value: mixed - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/classes/InvalidConfigurationParameterException.md b/docs/tech/classes/InvalidConfigurationParameterException.md index d5a4b912..cc00b206 100644 --- a/docs/tech/classes/InvalidConfigurationParameterException.md +++ b/docs/tech/classes/InvalidConfigurationParameterException.md @@ -1,5 +1,4 @@ - - BumbleDocGen / Technical description of the project / Class map / InvalidConfigurationParameterException
    + BumbleDocGen / Technical description of the project / InvalidConfigurationParameterException

    InvalidConfigurationParameterException class: @@ -30,5 +29,3 @@ final class InvalidConfigurationParameterException extends \Exception - - \ No newline at end of file diff --git a/docs/tech/classes/IterateEntitiesOperation.md b/docs/tech/classes/IterateEntitiesOperation.md deleted file mode 100644 index 6ce745be..00000000 --- a/docs/tech/classes/IterateEntitiesOperation.md +++ /dev/null @@ -1,238 +0,0 @@ - - BumbleDocGen / Technical description of the project / Class map / IterateEntitiesOperation
    - -

    - IterateEntitiesOperation class: -

    - - - - - -```php -namespace BumbleDocGen\Core\Parser\Entity\CollectionLogOperation; - -final class IterateEntitiesOperation implements \BumbleDocGen\Core\Parser\Entity\CollectionLogOperation\OperationInterface -``` - - - - - - - - -

    Initialization methods:

    - -
      -
    1. - __construct -
    2. -
    - -

    Methods:

    - -
      -
    1. - call -
    2. -
    3. - getEntitiesData -
    4. -
    5. - getKey -
    6. -
    7. - hasEntity -
    8. -
    9. - incrementUsageCount -
    10. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public function __construct(array $entities); -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $entitiesarray-
    - - - -
    -
    -
    - - - -```php -public function call(\BumbleDocGen\Core\Parser\Entity\RootEntityCollection $rootEntityCollection): array; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $rootEntityCollection\BumbleDocGen\Core\Parser\Entity\RootEntityCollection-
    - -Return value: array - - -
    -
    -
    - - - -```php -public function getEntitiesData(): array; -``` - - - -Parameters: not specified - -Return value: array - - -
    -
    -
    - - - -```php -public function getKey(): string; -``` - - - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -public function hasEntity(string $entityName): bool; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $entityNamestring-
    - -Return value: bool - - -
    -
    -
    - - - -```php -public function incrementUsageCount(): void; -``` - - - -Parameters: not specified - -Return value: void - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/classes/LanguageHandlerInterface.md b/docs/tech/classes/LanguageHandlerInterface.md deleted file mode 100644 index d418c29a..00000000 --- a/docs/tech/classes/LanguageHandlerInterface.md +++ /dev/null @@ -1,170 +0,0 @@ - - BumbleDocGen / Technical description of the project / Class map / LanguageHandlerInterface
    - -

    - LanguageHandlerInterface class: -

    - - - - - -```php -namespace BumbleDocGen\LanguageHandler; - -interface LanguageHandlerInterface -``` - - - - - - - - - -

    Methods:

    - -
      -
    1. - getCustomTwigFilters - - Additional twig filters that are added to the built-in ones when a language handler is included
    2. -
    3. - getCustomTwigFunctions - - Additional twig functions that are added to the built-in ones when a language handler is included
    4. -
    5. - getEntityCollection -
    6. -
    7. - getLanguageKey - - Unique language handler key
    8. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public function getCustomTwigFilters(\BumbleDocGen\Core\Renderer\Context\RendererContext $context): \BumbleDocGen\Core\Renderer\Twig\Filter\CustomFiltersCollection; -``` - -
    Additional twig filters that are added to the built-in ones when a language handler is included
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $context\BumbleDocGen\Core\Renderer\Context\RendererContext-
    - -Return value: \BumbleDocGen\Core\Renderer\Twig\Filter\CustomFiltersCollection - - -
    -
    -
    - - - -```php -public function getCustomTwigFunctions(\BumbleDocGen\Core\Renderer\Context\RendererContext $context): \BumbleDocGen\Core\Renderer\Twig\Function\CustomFunctionsCollection; -``` - -
    Additional twig functions that are added to the built-in ones when a language handler is included
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $context\BumbleDocGen\Core\Renderer\Context\RendererContext-
    - -Return value: \BumbleDocGen\Core\Renderer\Twig\Function\CustomFunctionsCollection - - -
    -
    -
    - - - -```php -public function getEntityCollection(): \BumbleDocGen\Core\Parser\Entity\RootEntityCollection; -``` - - - -Parameters: not specified - -Return value: \BumbleDocGen\Core\Parser\Entity\RootEntityCollection - - -
    -
    -
    - - - -```php -public static function getLanguageKey(): string; -``` - -
    Unique language handler key
    - -Parameters: not specified - -Return value: string - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/classes/LanguageHandlersCollection.md b/docs/tech/classes/LanguageHandlersCollection.md deleted file mode 100644 index c2407460..00000000 --- a/docs/tech/classes/LanguageHandlersCollection.md +++ /dev/null @@ -1,211 +0,0 @@ - - BumbleDocGen / Technical description of the project / Class map / LanguageHandlersCollection
    - -

    - LanguageHandlersCollection class: -

    - - - - - -```php -namespace BumbleDocGen\LanguageHandler; - -final class LanguageHandlersCollection implements \IteratorAggregate -``` - - - - - - - - - -

    Methods:

    - -
      -
    1. - add -
    2. -
    3. - create -
    4. -
    5. - get -
    6. -
    7. - getIterator -
    8. -
    9. - keys -
    10. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public function add(\BumbleDocGen\LanguageHandler\LanguageHandlerInterface $languageHandler): \BumbleDocGen\LanguageHandler\LanguageHandlersCollection; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $languageHandler\BumbleDocGen\LanguageHandler\LanguageHandlerInterface-
    - -Return value: \BumbleDocGen\LanguageHandler\LanguageHandlersCollection - - -
    -
    -
    - - - -```php -public static function create(\BumbleDocGen\LanguageHandler\LanguageHandlerInterface ...$languageHandlers): \BumbleDocGen\LanguageHandler\LanguageHandlersCollection; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $languageHandlers (variadic)\BumbleDocGen\LanguageHandler\LanguageHandlerInterface-
    - -Return value: \BumbleDocGen\LanguageHandler\LanguageHandlersCollection - - -
    -
    -
    - - - -```php -public function get(string $key): null|\BumbleDocGen\LanguageHandler\LanguageHandlerInterface; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $keystring-
    - -Return value: null | \BumbleDocGen\LanguageHandler\LanguageHandlerInterface - - -
    -
    -
    - - - -```php -public function getIterator(): \Generator; -``` - - - -Parameters: not specified - -Return value: \Generator - - -
    -
    -
    - - - -```php -public function keys(): array; -``` - - - -Parameters: not specified - -Return value: array - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/classes/LastPageCommitter.md b/docs/tech/classes/LastPageCommitter.md index c9fbd657..94264247 100644 --- a/docs/tech/classes/LastPageCommitter.md +++ b/docs/tech/classes/LastPageCommitter.md @@ -1,5 +1,4 @@ - - BumbleDocGen / Technical description of the project / Class map / LastPageCommitter
    + BumbleDocGen / Technical description of the project / Plugin system / LastPageCommitter

    LastPageCommitter class: @@ -150,5 +149,3 @@ public static function getSubscribedEvents(): array;
    - - \ No newline at end of file diff --git a/docs/tech/classes/LoadPluginsContent.md b/docs/tech/classes/LoadPluginsContent.md index 4ca2e164..a40c7e0d 100644 --- a/docs/tech/classes/LoadPluginsContent.md +++ b/docs/tech/classes/LoadPluginsContent.md @@ -1,5 +1,4 @@ - - BumbleDocGen / Technical description of the project / Class map / LoadPluginsContent
    + BumbleDocGen / Technical description of the project / Configuration / LoadPluginsContent

    LoadPluginsContent class: @@ -197,5 +196,3 @@ public static function getOptions(): array;
    - - \ No newline at end of file diff --git a/docs/tech/classes/LoadPluginsContent_2.md b/docs/tech/classes/LoadPluginsContent_2.md index c6a8a8d9..8ac665ef 100644 --- a/docs/tech/classes/LoadPluginsContent_2.md +++ b/docs/tech/classes/LoadPluginsContent_2.md @@ -1,4 +1,3 @@ - BumbleDocGen / Technical description of the project / LoadPluginsContent

    @@ -197,5 +196,3 @@ public static function getOptions(): array;
    - - \ No newline at end of file diff --git a/docs/tech/classes/LocalObjectCache.md b/docs/tech/classes/LocalObjectCache.md deleted file mode 100644 index 55533ee7..00000000 --- a/docs/tech/classes/LocalObjectCache.md +++ /dev/null @@ -1,144 +0,0 @@ - - BumbleDocGen / Technical description of the project / Class map / LocalObjectCache
    - -

    - LocalObjectCache class: -

    - - - - - -```php -namespace BumbleDocGen\Core\Cache\LocalCache; - -final class LocalObjectCache -``` - - - - - - - - - -

    Methods:

    - -
      -
    1. - cacheMethodResult -
    2. -
    3. - getMethodCachedResult -
    4. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public function cacheMethodResult(string $methodKey, string $objectId, mixed $methodResult): void; -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $methodKeystring-
    $objectIdstring-
    $methodResultmixed-
    - -Return value: void - - -
    -
    -
    - - - -```php -public function getMethodCachedResult(string $methodKey, string $objectId): mixed; -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $methodKeystring-
    $objectIdstring-
    - -Return value: mixed - - -Throws: - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/classes/LoggableRootEntityCollection.md b/docs/tech/classes/LoggableRootEntityCollection.md deleted file mode 100644 index 46c3d0c2..00000000 --- a/docs/tech/classes/LoggableRootEntityCollection.md +++ /dev/null @@ -1,625 +0,0 @@ - - BumbleDocGen / Technical description of the project / Class map / LoggableRootEntityCollection
    - -

    - LoggableRootEntityCollection class: -

    - - - - - -```php -namespace BumbleDocGen\Core\Parser\Entity; - -abstract class LoggableRootEntityCollection extends \BumbleDocGen\Core\Parser\Entity\RootEntityCollection implements \IteratorAggregate -``` - - - - - - - - -

    Initialization methods:

    - -
      -
    1. - __construct -
    2. -
    - -

    Methods:

    - -
      -
    1. - clearOperationsLogCollection -
    2. -
    3. - findEntity - - Find an entity in a collection
    4. -
    5. - get - - Get an entity from a collection (only previously added)
    6. -
    7. - getEntityCollectionName - - Get collection name
    8. -
    9. - getEntityLinkData -
    10. -
    11. - getIterator -
    12. -
    13. - getLoadedOrCreateNew - - Get an entity from the collection or create a new one if it has not yet been added
    14. -
    15. - getOperationsLogCollection -
    16. -
    17. - has - - Check if an entity has been added to the collection
    18. -
    19. - isEmpty - - Check if the collection is empty or not
    20. -
    21. - loadEntities -
    22. -
    23. - loadEntitiesByConfiguration -
    24. -
    25. - remove - - Remove an entity from a collection
    26. -
    27. - toArray - - Convert collection to array
    28. -
    29. - updateEntitiesCache -
    30. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public function __construct(); -``` - - - -Parameters: not specified - - - -
    -
    -
    - - - -```php -public function clearOperationsLogCollection(): void; -``` - - - -Parameters: not specified - -Return value: void - - -
    -
    -
    - - - -```php -public function findEntity(string $search, bool $useUnsafeKeys = true): null|\BumbleDocGen\Core\Parser\Entity\RootEntityInterface; -``` - -
    Find an entity in a collection
    - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $searchstring-
    $useUnsafeKeysbool-
    - -Return value: null | \BumbleDocGen\Core\Parser\Entity\RootEntityInterface - - -
    -
    -
    - - - -```php -public function get(string $objectName): null|\BumbleDocGen\Core\Parser\Entity\RootEntityInterface; -``` - -
    Get an entity from a collection (only previously added)
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $objectNamestring-
    - -Return value: null | \BumbleDocGen\Core\Parser\Entity\RootEntityInterface - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\Core\Parser\Entity\RootEntityCollection - -public function getEntityCollectionName(): string; -``` - -
    Get collection name
    - -Parameters: not specified - -Return value: string - - -
    -
    -
    - -
      -
    • # - getEntityLinkData - :warning: Is internal | source code
    • -
    - -```php -// Implemented in BumbleDocGen\Core\Parser\Entity\RootEntityCollection - -public function getEntityLinkData(string $rawLink, string|null $defaultEntityName = null, bool $useUnsafeKeys = true): array; -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $rawLinkstringRaw link to an entity or entity element
    $defaultEntityNamestring | nullEntity name to use if the link does not contain a valid or existing entity name, - but only a cursor on an entity element
    $useUnsafeKeysbool-
    - -Return value: array - - -
    -
    -
    - - - -```php -public function getIterator(): \Generator; -``` - - - -Parameters: not specified - -Return value: \Generator - - -
    -
    -
    - - - -```php -public function getLoadedOrCreateNew(string $objectName, bool $withAddClassEntityToCollectionEvent = false): \BumbleDocGen\Core\Parser\Entity\RootEntityInterface; -``` - -
    Get an entity from the collection or create a new one if it has not yet been added
    - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $objectNamestring-
    $withAddClassEntityToCollectionEventbool-
    - -Return value: \BumbleDocGen\Core\Parser\Entity\RootEntityInterface - - - -See: - -
    -
    -
    - - - -```php -public function getOperationsLogCollection(): \BumbleDocGen\Core\Parser\Entity\CollectionLogOperation\OperationsCollection; -``` - - - -Parameters: not specified - -Return value: \BumbleDocGen\Core\Parser\Entity\CollectionLogOperation\OperationsCollection - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\Core\Parser\Entity\BaseEntityCollection - -public function has(string $objectName): bool; -``` - -
    Check if an entity has been added to the collection
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $objectNamestring-
    - -Return value: bool - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\Core\Parser\Entity\BaseEntityCollection - -public function isEmpty(): bool; -``` - -
    Check if the collection is empty or not
    - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\Core\Parser\Entity\RootEntityCollection - -public function loadEntities(\BumbleDocGen\Core\Parser\SourceLocator\SourceLocatorsCollection $sourceLocatorsCollection, \BumbleDocGen\Core\Parser\FilterCondition\ConditionInterface|null $filters = null, \BumbleDocGen\Core\Parser\Entity\EntitiesLoaderProgressBarInterface|null $progressBar = null): \BumbleDocGen\Core\Parser\Entity\CollectionLoadEntitiesResult; -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $sourceLocatorsCollection\BumbleDocGen\Core\Parser\SourceLocator\SourceLocatorsCollection-
    $filters\BumbleDocGen\Core\Parser\FilterCondition\ConditionInterface | null-
    $progressBar\BumbleDocGen\Core\Parser\Entity\EntitiesLoaderProgressBarInterface | null-
    - -Return value: \BumbleDocGen\Core\Parser\Entity\CollectionLoadEntitiesResult - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\Core\Parser\Entity\RootEntityCollection - -public function loadEntitiesByConfiguration(\BumbleDocGen\Core\Parser\Entity\EntitiesLoaderProgressBarInterface|null $progressBar = null): \BumbleDocGen\Core\Parser\Entity\CollectionLoadEntitiesResult; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $progressBar\BumbleDocGen\Core\Parser\Entity\EntitiesLoaderProgressBarInterface | null-
    - -Return value: \BumbleDocGen\Core\Parser\Entity\CollectionLoadEntitiesResult - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\Core\Parser\Entity\BaseEntityCollection - -public function remove(string $objectName): void; -``` - -
    Remove an entity from a collection
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $objectNamestring-
    - -Return value: void - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\Core\Parser\Entity\RootEntityCollection - -public function toArray(): array; -``` - -
    Convert collection to array
    - -Parameters: not specified - -Return value: array - - -
    -
    -
    - -
      -
    • # - updateEntitiesCache - :warning: Is internal | source code
    • -
    - -```php -// Implemented in BumbleDocGen\Core\Parser\Entity\RootEntityCollection - -public function updateEntitiesCache(): void; -``` - - - -Parameters: not specified - -Return value: void - - -Throws: - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/classes/MainExtension.md b/docs/tech/classes/MainExtension.md deleted file mode 100644 index ac6c0d97..00000000 --- a/docs/tech/classes/MainExtension.md +++ /dev/null @@ -1,237 +0,0 @@ - - BumbleDocGen / Technical description of the project / Class map / MainExtension
    - -

    - MainExtension class: -

    - - - - - -```php -namespace BumbleDocGen\Core\Renderer\Twig; - -final class MainExtension extends \Twig\Extension\AbstractExtension -``` - -
    This is an extension that is used to generate documents from templates
    - - - - - - -

    Initialization methods:

    - -
      -
    1. - __construct -
    2. -
    - -

    Methods:

    - -
      -
    1. - getFilters - - List of twig filters
    2. -
    3. - getFunctions - - List of twig functions
    4. -
    5. - getLanguageHandlersCollection -
    6. -
    7. - setDefaultFilters -
    8. -
    9. - setDefaultFunctions -
    10. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public function __construct(\BumbleDocGen\Core\Renderer\Context\RendererContext $context, \BumbleDocGen\Core\Configuration\Configuration $configuration); -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $context\BumbleDocGen\Core\Renderer\Context\RendererContext-
    $configuration\BumbleDocGen\Core\Configuration\Configuration-
    - - - -Throws: - - -
    -
    -
    - - - -```php -public function getFilters(): \Generator; -``` - -
    List of twig filters
    - -Parameters: not specified - -Return value: \Generator - - -
    -
    -
    - - - -```php -public function getFunctions(): \Generator; -``` - -
    List of twig functions
    - -Parameters: not specified - -Return value: \Generator - - -
    -
    -
    - - - -```php -public function getLanguageHandlersCollection(): \BumbleDocGen\LanguageHandler\LanguageHandlersCollection; -``` - - - -Parameters: not specified - -Return value: \BumbleDocGen\LanguageHandler\LanguageHandlersCollection - - -Throws: - - -
    -
    -
    - - - -```php -public function setDefaultFilters(): void; -``` - - - -Parameters: not specified - -Return value: void - - -Throws: - - -
    -
    -
    - - - -```php -public function setDefaultFunctions(): void; -``` - - - -Parameters: not specified - -Return value: void - - -Throws: - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/classes/MainTwigEnvironment.md b/docs/tech/classes/MainTwigEnvironment.md deleted file mode 100644 index 485ccc01..00000000 --- a/docs/tech/classes/MainTwigEnvironment.md +++ /dev/null @@ -1,161 +0,0 @@ - - BumbleDocGen / Technical description of the project / Class map / MainTwigEnvironment
    - -

    - MainTwigEnvironment class: -

    - - - - - -```php -namespace BumbleDocGen\Core\Renderer\Twig; - -final class MainTwigEnvironment -``` - - - - - - - - -

    Initialization methods:

    - -
      -
    1. - __construct -
    2. -
    - -

    Methods:

    - -
      -
    1. - render -
    2. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public function __construct(\BumbleDocGen\Core\Configuration\Configuration $configuration, \BumbleDocGen\Core\Renderer\Twig\MainExtension $mainExtension, \BumbleDocGen\Core\Plugin\PluginEventDispatcher $pluginEventDispatcher, \BumbleDocGen\Core\Renderer\Breadcrumbs\BreadcrumbsHelper $breadcrumbsHelper); -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $configuration\BumbleDocGen\Core\Configuration\Configuration-
    $mainExtension\BumbleDocGen\Core\Renderer\Twig\MainExtension-
    $pluginEventDispatcher\BumbleDocGen\Core\Plugin\PluginEventDispatcher-
    $breadcrumbsHelper\BumbleDocGen\Core\Renderer\Breadcrumbs\BreadcrumbsHelper-
    - - - -
    -
    -
    - - - -```php -public function render(mixed $name, array $context = []): string; -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $namemixed-
    $contextarray-
    - -Return value: string - - -Throws: - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/classes/MethodEntityInterface.md b/docs/tech/classes/MethodEntityInterface.md deleted file mode 100644 index e0aac297..00000000 --- a/docs/tech/classes/MethodEntityInterface.md +++ /dev/null @@ -1,732 +0,0 @@ - - BumbleDocGen / Technical description of the project / Class map / MethodEntityInterface
    - -

    - MethodEntityInterface class: -

    - - - - - -```php -namespace BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method; - -interface MethodEntityInterface extends \BumbleDocGen\Core\Parser\Entity\EntityInterface -``` - - - - - - - - - -

    Methods:

    - -
      -
    1. - getAbsoluteFileName - - Returns the absolute path to a file if it can be retrieved and if the file is in the project directory
    2. -
    3. - getBodyCode - - Get the code for this method
    4. -
    5. - getDescription - - Get a description of this method
    6. -
    7. - getEndLine - - Get the line number of the end of a method's code in a file
    8. -
    9. - getFirstReturnValue - - Get the compiled first return value of a method (if possible)
    10. -
    11. - getImplementingClass - - Get the ClassLike entity in which this method was implemented
    12. -
    13. - getImplementingClassName - - Get the name of the class in which this method is implemented
    14. -
    15. - getModifiersString - - Get a text representation of method modifiers
    16. -
    17. - getName - - Full name of the entity
    18. -
    19. - getNamespaceName - - Namespace of the class that contains this method
    20. -
    21. - getObjectId - - Entity object ID
    22. -
    23. - getParameters - - Get a list of method parameters
    24. -
    25. - getParametersString - - Get a list of method parameters as a string
    26. -
    27. - getRelativeFileName - - File name relative to project_root configuration parameter
    28. -
    29. - getReturnType - - Get the return type of method
    30. -
    31. - getRootEntityCollection - - Get parent collection of entities
    32. -
    33. - getShortName - - Short name of the entity
    34. -
    35. - getSignature - - Get the method signature as a string
    36. -
    37. - getStartColumn - - Get the column number of the beginning of the method code in a file
    38. -
    39. - getStartLine - - Get the line number of the beginning of the method code in a file
    40. -
    41. - isDynamic - - Check if a method is a dynamic method, that is, implementable using __call or __callStatic
    42. -
    43. - isEntityCacheOutdated -
    44. -
    45. - isImplementedInParentClass - - Check if this method is implemented in the parent class
    46. -
    47. - isInitialization - - Check if a method is an initialization method
    48. -
    49. - isPrivate - - Check if a method is a private method
    50. -
    51. - isProtected - - Check if a method is a protected method
    52. -
    53. - isPublic - - Check if a method is a public method
    54. -
    55. - isStatic - - Check if this method is static
    56. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -// Implemented in BumbleDocGen\Core\Parser\Entity\EntityInterface - -public function getAbsoluteFileName(): null|string; -``` - -
    Returns the absolute path to a file if it can be retrieved and if the file is in the project directory
    - -Parameters: not specified - -Return value: null | string - - -
    -
    -
    - - - -```php -public function getBodyCode(): string; -``` - -
    Get the code for this method
    - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -public function getDescription(): string; -``` - -
    Get a description of this method
    - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -public function getEndLine(): int; -``` - -
    Get the line number of the end of a method's code in a file
    - -Parameters: not specified - -Return value: int - - -
    -
    -
    - - - -```php -public function getFirstReturnValue(): mixed; -``` - -
    Get the compiled first return value of a method (if possible)
    - -Parameters: not specified - -Return value: mixed - - -
    -
    -
    - - - -```php -public function getImplementingClass(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; -``` - -
    Get the ClassLike entity in which this method was implemented
    - -Parameters: not specified - -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - - -
    -
    -
    - - - -```php -public function getImplementingClassName(): string; -``` - -
    Get the name of the class in which this method is implemented
    - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -public function getModifiersString(): string; -``` - -
    Get a text representation of method modifiers
    - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\Core\Parser\Entity\EntityInterface - -public function getName(): string; -``` - -
    Full name of the entity
    - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -public function getNamespaceName(): string; -``` - -
    Namespace of the class that contains this method
    - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\Core\Parser\Entity\EntityInterface - -public function getObjectId(): string; -``` - -
    Entity object ID
    - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -public function getParameters(): array; -``` - -
    Get a list of method parameters
    - -Parameters: not specified - -Return value: array - - -
    -
    -
    - - - -```php -public function getParametersString(): string; -``` - -
    Get a list of method parameters as a string
    - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\Core\Parser\Entity\EntityInterface - -public function getRelativeFileName(): null|string; -``` - -
    File name relative to project_root configuration parameter
    - -Parameters: not specified - -Return value: null | string - - - -See: - -
    -
    -
    - - - -```php -public function getReturnType(): string; -``` - -
    Get the return type of method
    - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\Core\Parser\Entity\EntityInterface - -public function getRootEntityCollection(): \BumbleDocGen\Core\Parser\Entity\RootEntityCollection; -``` - -
    Get parent collection of entities
    - -Parameters: not specified - -Return value: \BumbleDocGen\Core\Parser\Entity\RootEntityCollection - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\Core\Parser\Entity\EntityInterface - -public function getShortName(): string; -``` - -
    Short name of the entity
    - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -public function getSignature(): string; -``` - -
    Get the method signature as a string
    - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -public function getStartColumn(): int; -``` - -
    Get the column number of the beginning of the method code in a file
    - -Parameters: not specified - -Return value: int - - -
    -
    -
    - - - -```php -public function getStartLine(): int; -``` - -
    Get the line number of the beginning of the method code in a file
    - -Parameters: not specified - -Return value: int - - -
    -
    -
    - - - -```php -public function isDynamic(): bool; -``` - -
    Check if a method is a dynamic method, that is, implementable using __call or __callStatic
    - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - -
      -
    • # - isEntityCacheOutdated - :warning: Is internal | source code
    • -
    - -```php -// Implemented in BumbleDocGen\Core\Parser\Entity\EntityInterface - -public function isEntityCacheOutdated(): bool; -``` - - - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - - - -```php -public function isImplementedInParentClass(): bool; -``` - -
    Check if this method is implemented in the parent class
    - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - - - -```php -public function isInitialization(): bool; -``` - -
    Check if a method is an initialization method
    - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - - - -```php -public function isPrivate(): bool; -``` - -
    Check if a method is a private method
    - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - - - -```php -public function isProtected(): bool; -``` - -
    Check if a method is a protected method
    - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - - - -```php -public function isPublic(): bool; -``` - -
    Check if a method is a public method
    - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - - - -```php -public function isStatic(): bool; -``` - -
    Check if this method is static
    - -Parameters: not specified - -Return value: bool - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/classes/NodeValueCompiler.md b/docs/tech/classes/NodeValueCompiler.md deleted file mode 100644 index 82d07338..00000000 --- a/docs/tech/classes/NodeValueCompiler.md +++ /dev/null @@ -1,96 +0,0 @@ - - BumbleDocGen / Technical description of the project / Class map / NodeValueCompiler
    - -

    - NodeValueCompiler class: -

    - - - - - -```php -namespace BumbleDocGen\LanguageHandler\Php\Parser\PhpParser; - -final class NodeValueCompiler -``` - - - - - - - - - -

    Methods:

    - -
      -
    1. - compile - - Compile an expression from a node into a value if it possible
    2. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public static function compile(\PhpParser\Node\Stmt\Expression|\PhpParser\Node $node, \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntity|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntity|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity $entity): mixed; -``` - -
    Compile an expression from a node into a value if it possible
    - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $node\PhpParser\Node\Stmt\Expression | \PhpParser\Node-
    $entity\BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntity | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntity | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity-
    - -Return value: mixed - - -Throws: - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/classes/ObjectNotFoundException.md b/docs/tech/classes/ObjectNotFoundException.md deleted file mode 100644 index f9062fa3..00000000 --- a/docs/tech/classes/ObjectNotFoundException.md +++ /dev/null @@ -1,34 +0,0 @@ - - BumbleDocGen / Technical description of the project / Class map / ObjectNotFoundException
    - -

    - ObjectNotFoundException class: -

    - - - - - -```php -namespace BumbleDocGen\Core\Cache\LocalCache\Exception; - -final class ObjectNotFoundException extends \Exception -``` - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/tech/classes/ObjectNotFoundException_2.md b/docs/tech/classes/ObjectNotFoundException_2.md deleted file mode 100644 index 65ac0f00..00000000 --- a/docs/tech/classes/ObjectNotFoundException_2.md +++ /dev/null @@ -1,34 +0,0 @@ - - BumbleDocGen / Technical description of the project / ObjectNotFoundException
    - -

    - ObjectNotFoundException class: -

    - - - - - -```php -namespace BumbleDocGen\Core\Cache\LocalCache\Exception; - -final class ObjectNotFoundException extends \Exception -``` - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/tech/classes/OnAddClassEntityToCollection.md b/docs/tech/classes/OnAddClassEntityToCollection.md index e851a3f5..9af8d0dd 100644 --- a/docs/tech/classes/OnAddClassEntityToCollection.md +++ b/docs/tech/classes/OnAddClassEntityToCollection.md @@ -1,5 +1,4 @@ - - BumbleDocGen / Technical description of the project / Class map / OnAddClassEntityToCollection
    + BumbleDocGen / Technical description of the project / Plugin system / OnAddClassEntityToCollection

    OnAddClassEntityToCollection class: @@ -157,5 +156,3 @@ public function getUniqueExecutionId(): string;
    - - \ No newline at end of file diff --git a/docs/tech/classes/OnCheckIsEntityCanBeLoaded.md b/docs/tech/classes/OnCheckIsEntityCanBeLoaded.md index f6c3419b..a4728fee 100644 --- a/docs/tech/classes/OnCheckIsEntityCanBeLoaded.md +++ b/docs/tech/classes/OnCheckIsEntityCanBeLoaded.md @@ -1,5 +1,4 @@ - - BumbleDocGen / Technical description of the project / Class map / OnCheckIsEntityCanBeLoaded
    + BumbleDocGen / Technical description of the project / Plugin system / OnCheckIsEntityCanBeLoaded

    OnCheckIsEntityCanBeLoaded class: @@ -171,5 +170,3 @@ public function isEntityCanBeLoaded(): bool;
    - - \ No newline at end of file diff --git a/docs/tech/classes/OnCreateDocumentedEntityWrapper.md b/docs/tech/classes/OnCreateDocumentedEntityWrapper.md index 2b67bd7a..7e9dea4d 100644 --- a/docs/tech/classes/OnCreateDocumentedEntityWrapper.md +++ b/docs/tech/classes/OnCreateDocumentedEntityWrapper.md @@ -1,5 +1,4 @@ - - BumbleDocGen / Technical description of the project / Class map / OnCreateDocumentedEntityWrapper
    + BumbleDocGen / Technical description of the project / Plugin system / OnCreateDocumentedEntityWrapper

    OnCreateDocumentedEntityWrapper class: @@ -104,5 +103,3 @@ public function getDocumentedEntityWrapper(): \BumbleDocGen\Core\Renderer\Contex
    - - \ No newline at end of file diff --git a/docs/tech/classes/OnGetProjectTemplatesDirs.md b/docs/tech/classes/OnGetProjectTemplatesDirs.md index 92f0d160..db1c1275 100644 --- a/docs/tech/classes/OnGetProjectTemplatesDirs.md +++ b/docs/tech/classes/OnGetProjectTemplatesDirs.md @@ -1,5 +1,4 @@ - - BumbleDocGen / Technical description of the project / Class map / OnGetProjectTemplatesDirs
    + BumbleDocGen / Technical description of the project / Plugin system / OnGetProjectTemplatesDirs

    OnGetProjectTemplatesDirs class: @@ -145,5 +144,3 @@ public function getTemplatesDirs(): array;
    - - \ No newline at end of file diff --git a/docs/tech/classes/OnGetTemplatePathByRelativeDocPath.md b/docs/tech/classes/OnGetTemplatePathByRelativeDocPath.md index f4e148cb..0ee6845a 100644 --- a/docs/tech/classes/OnGetTemplatePathByRelativeDocPath.md +++ b/docs/tech/classes/OnGetTemplatePathByRelativeDocPath.md @@ -1,5 +1,4 @@ - - BumbleDocGen / Technical description of the project / Class map / OnGetTemplatePathByRelativeDocPath
    + BumbleDocGen / Technical description of the project / Plugin system / OnGetTemplatePathByRelativeDocPath

    OnGetTemplatePathByRelativeDocPath class: @@ -169,5 +168,3 @@ public function setCustomTemplateFilePath(string|null $customTemplateFilePath):
    - - \ No newline at end of file diff --git a/docs/tech/classes/OnGettingResourceLink.md b/docs/tech/classes/OnGettingResourceLink.md index 7972d9c9..a11b45e7 100644 --- a/docs/tech/classes/OnGettingResourceLink.md +++ b/docs/tech/classes/OnGettingResourceLink.md @@ -1,5 +1,4 @@ - - BumbleDocGen / Technical description of the project / Class map / OnGettingResourceLink
    + BumbleDocGen / Technical description of the project / Plugin system / OnGettingResourceLink

    OnGettingResourceLink class: @@ -169,5 +168,3 @@ public function setResourceUrl(string|null $resourceUrl): void;
    - - \ No newline at end of file diff --git a/docs/tech/classes/OnLoadEntityDocPluginContent.md b/docs/tech/classes/OnLoadEntityDocPluginContent.md index ee63f5ab..9cb57f4d 100644 --- a/docs/tech/classes/OnLoadEntityDocPluginContent.md +++ b/docs/tech/classes/OnLoadEntityDocPluginContent.md @@ -1,5 +1,4 @@ - - BumbleDocGen / Technical description of the project / Class map / OnLoadEntityDocPluginContent
    + BumbleDocGen / Technical description of the project / Plugin system / OnLoadEntityDocPluginContent

    OnLoadEntityDocPluginContent class: @@ -233,5 +232,3 @@ public function getEntity(): \BumbleDocGen\Core\Parser\Entity\RootEntityInterfac
    - - \ No newline at end of file diff --git a/docs/tech/classes/OnlySingleExecutionEvent.md b/docs/tech/classes/OnlySingleExecutionEvent.md deleted file mode 100644 index 8331bc82..00000000 --- a/docs/tech/classes/OnlySingleExecutionEvent.md +++ /dev/null @@ -1,64 +0,0 @@ - - BumbleDocGen / Technical description of the project / Class map / OnlySingleExecutionEvent
    - -

    - OnlySingleExecutionEvent class: -

    - - - - - -```php -namespace BumbleDocGen\Core\Plugin; - -interface OnlySingleExecutionEvent -``` - - - - - - - - - -

    Methods:

    - -
      -
    1. - getUniqueExecutionId -
    2. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public function getUniqueExecutionId(): string; -``` - - - -Parameters: not specified - -Return value: string - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/classes/OperationInterface.md b/docs/tech/classes/OperationInterface.md deleted file mode 100644 index d55d761c..00000000 --- a/docs/tech/classes/OperationInterface.md +++ /dev/null @@ -1,88 +0,0 @@ - - BumbleDocGen / Technical description of the project / Class map / OperationInterface
    - -

    - OperationInterface class: -

    - - - - - -```php -namespace BumbleDocGen\Core\Parser\Entity\CollectionLogOperation; - -interface OperationInterface -``` - - - - - - - - - -

    Methods:

    - -
      -
    1. - getKey -
    2. -
    3. - incrementUsageCount -
    4. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public function getKey(): string; -``` - - - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -public function incrementUsageCount(): void; -``` - - - -Parameters: not specified - -Return value: void - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/classes/OperationsCollection.md b/docs/tech/classes/OperationsCollection.md deleted file mode 100644 index 53100a16..00000000 --- a/docs/tech/classes/OperationsCollection.md +++ /dev/null @@ -1,235 +0,0 @@ - - BumbleDocGen / Technical description of the project / Class map / OperationsCollection
    - -

    - OperationsCollection class: -

    - - - - - -```php -namespace BumbleDocGen\Core\Parser\Entity\CollectionLogOperation; - -final class OperationsCollection implements \IteratorAggregate -``` - - - - - - - - - -

    Methods:

    - -
      -
    1. - __serialize -
    2. -
    3. - __unserialize -
    4. -
    5. - add -
    6. -
    7. - getIterator -
    8. -
    9. - isFoundEntitiesCacheOutdated -
    10. -
    11. - removeSearchDuplicates -
    12. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public function __serialize(): array; -``` - - - -Parameters: not specified - -Return value: array - - -
    -
    -
    - - - -```php -public function __unserialize(array $data): void; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $dataarray-
    - -Return value: void - - -
    -
    -
    - - - -```php -public function add(\BumbleDocGen\Core\Parser\Entity\CollectionLogOperation\OperationInterface $operation): void; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $operation\BumbleDocGen\Core\Parser\Entity\CollectionLogOperation\OperationInterface-
    - -Return value: void - - -
    -
    -
    - - - -```php -public function getIterator(): \Traversable; -``` - - - -Parameters: not specified - -Return value: \Traversable - - -
    -
    -
    - - - -```php -public function isFoundEntitiesCacheOutdated(\BumbleDocGen\Core\Parser\Entity\RootEntityCollection $rootEntityCollection): bool; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $rootEntityCollection\BumbleDocGen\Core\Parser\Entity\RootEntityCollection-
    - -Return value: bool - - -
    -
    -
    - - - -```php -public function removeSearchDuplicates(): void; -``` - - - -Parameters: not specified - -Return value: void - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/classes/PageHtmlLinkerPlugin.md b/docs/tech/classes/PageHtmlLinkerPlugin.md index 786801d2..c1d8724f 100644 --- a/docs/tech/classes/PageHtmlLinkerPlugin.md +++ b/docs/tech/classes/PageHtmlLinkerPlugin.md @@ -1,5 +1,4 @@ - - BumbleDocGen / Technical description of the project / Class map / PageHtmlLinkerPlugin
    + BumbleDocGen / Technical description of the project / Plugin system / PageHtmlLinkerPlugin

    PageHtmlLinkerPlugin class: @@ -180,7 +179,7 @@ public function beforeCreatingDocFile(\BumbleDocGen\Core\Plugin\Event\Renderer\B \DI\DependencyException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -209,5 +208,3 @@ public static function getSubscribedEvents(): array;
    - - \ No newline at end of file diff --git a/docs/tech/4.pluginSystem/classes/PageHtmlLinkerPlugin.md b/docs/tech/classes/PageHtmlLinkerPlugin_2.md similarity index 94% rename from docs/tech/4.pluginSystem/classes/PageHtmlLinkerPlugin.md rename to docs/tech/classes/PageHtmlLinkerPlugin_2.md index d8b981e2..a9550bf2 100644 --- a/docs/tech/4.pluginSystem/classes/PageHtmlLinkerPlugin.md +++ b/docs/tech/classes/PageHtmlLinkerPlugin_2.md @@ -1,5 +1,4 @@ - - BumbleDocGen / Technical description of the project / Plugin system / PageHtmlLinkerPlugin
    + BumbleDocGen / Technical description of the project / Configuration / PageHtmlLinkerPlugin

    PageHtmlLinkerPlugin class: @@ -180,7 +179,7 @@ public function beforeCreatingDocFile(\BumbleDocGen\Core\Plugin\Event\Renderer\B \DI\DependencyException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -209,5 +208,3 @@ public static function getSubscribedEvents(): array;
    - - \ No newline at end of file diff --git a/docs/tech/classes/PageLinkProcessorInterface.md b/docs/tech/classes/PageLinkProcessorInterface.md deleted file mode 100644 index db6775fa..00000000 --- a/docs/tech/classes/PageLinkProcessorInterface.md +++ /dev/null @@ -1,81 +0,0 @@ - - BumbleDocGen / Technical description of the project / Class map / PageLinkProcessorInterface
    - -

    - PageLinkProcessorInterface class: -

    - - - - - -```php -namespace BumbleDocGen\Core\Renderer\PageLinkProcessor; - -interface PageLinkProcessorInterface -``` - - - - - - - - - -

    Methods:

    - -
      -
    1. - getAbsoluteUrl -
    2. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public function getAbsoluteUrl(string $relativeUrl): string; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $relativeUrlstring-
    - -Return value: string - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/classes/PageLinkerPlugin.md b/docs/tech/classes/PageLinkerPlugin.md index 06e9fea3..94884832 100644 --- a/docs/tech/classes/PageLinkerPlugin.md +++ b/docs/tech/classes/PageLinkerPlugin.md @@ -1,5 +1,4 @@ - - BumbleDocGen / Technical description of the project / Class map / PageLinkerPlugin
    + BumbleDocGen / Technical description of the project / Plugin system / PageLinkerPlugin

    PageLinkerPlugin class: @@ -180,7 +179,7 @@ public function beforeCreatingDocFile(\BumbleDocGen\Core\Plugin\Event\Renderer\B \DI\DependencyException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -209,5 +208,3 @@ public static function getSubscribedEvents(): array;
    - - \ No newline at end of file diff --git a/docs/tech/4.pluginSystem/classes/PageLinkerPlugin.md b/docs/tech/classes/PageLinkerPlugin_2.md similarity index 94% rename from docs/tech/4.pluginSystem/classes/PageLinkerPlugin.md rename to docs/tech/classes/PageLinkerPlugin_2.md index 84bf4b89..6806c5aa 100644 --- a/docs/tech/4.pluginSystem/classes/PageLinkerPlugin.md +++ b/docs/tech/classes/PageLinkerPlugin_2.md @@ -1,5 +1,4 @@ - - BumbleDocGen / Technical description of the project / Plugin system / PageLinkerPlugin
    + BumbleDocGen / Technical description of the project / Configuration / PageLinkerPlugin

    PageLinkerPlugin class: @@ -180,7 +179,7 @@ public function beforeCreatingDocFile(\BumbleDocGen\Core\Plugin\Event\Renderer\B \DI\DependencyException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -209,5 +208,3 @@ public static function getSubscribedEvents(): array;
    - - \ No newline at end of file diff --git a/docs/tech/classes/PageRstLinkerPlugin.md b/docs/tech/classes/PageRstLinkerPlugin.md index 7f3e3d27..db29a47c 100644 --- a/docs/tech/classes/PageRstLinkerPlugin.md +++ b/docs/tech/classes/PageRstLinkerPlugin.md @@ -1,5 +1,4 @@ - - BumbleDocGen / Technical description of the project / Class map / PageRstLinkerPlugin
    + BumbleDocGen / Technical description of the project / Plugin system / PageRstLinkerPlugin

    PageRstLinkerPlugin class: @@ -170,7 +169,7 @@ public function beforeCreatingDocFile(\BumbleDocGen\Core\Plugin\Event\Renderer\B \DI\DependencyException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -199,5 +198,3 @@ public static function getSubscribedEvents(): array;
    - - \ No newline at end of file diff --git a/docs/tech/classes/ParserHelper.md b/docs/tech/classes/ParserHelper.md deleted file mode 100644 index 52798d89..00000000 --- a/docs/tech/classes/ParserHelper.md +++ /dev/null @@ -1,523 +0,0 @@ - - BumbleDocGen / Technical description of the project / Class map / ParserHelper
    - -

    - ParserHelper class: -

    - - - - - -```php -namespace BumbleDocGen\LanguageHandler\Php\Parser; - -final class ParserHelper -``` - - - - - - - - -

    Initialization methods:

    - -
      -
    1. - __construct -
    2. -
    - -

    Methods:

    - -
      -
    1. - getDocBlock -
    2. -
    3. - getDocBlockContext -
    4. -
    5. - getFilesInGit -
    6. -
    7. - getUsesListByClassEntity -
    8. -
    9. - isBuiltInClass -
    10. -
    11. - isBuiltInType -
    12. -
    13. - isClassLoaded -
    14. -
    15. - isCorrectClassName -
    16. -
    17. - parseFullClassName -
    18. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public function __construct(\BumbleDocGen\Core\Configuration\Configuration $configuration, \BumbleDocGen\LanguageHandler\Php\Parser\ComposerHelper $composerHelper, \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache $localObjectCache, \Monolog\Logger $logger); -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $configuration\BumbleDocGen\Core\Configuration\Configuration-
    $composerHelper\BumbleDocGen\LanguageHandler\Php\Parser\ComposerHelper-
    $localObjectCache\BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache-
    $logger\Monolog\Logger-
    - - - -
    -
    -
    - - - -```php -public function getDocBlock(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity $classEntity, string $docComment, int|null $lineNumber = null): \phpDocumentor\Reflection\DocBlock; -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $classEntity\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity-
    $docCommentstring-
    $lineNumberint | null-
    - -Return value: \phpDocumentor\Reflection\DocBlock - - -Throws: - - -
    -
    -
    - - - -```php -public function getDocBlockContext(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity $classEntity): \phpDocumentor\Reflection\Types\Context; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $classEntity\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity-
    - -Return value: \phpDocumentor\Reflection\Types\Context - - -Throws: - - -
    -
    -
    - - - -```php -public function getFilesInGit(): array; -``` - - - -Parameters: not specified - -Return value: array - - -Throws: - - -
    -
    -
    - - - -```php -public function getUsesListByClassEntity(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity $classEntity, bool $extended = true): array; -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $classEntity\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity-
    $extendedbool-
    - -Return value: array - - -Throws: - - -
    -
    -
    - - - -```php -public static function isBuiltInClass(string $className): bool; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $classNamestring-
    - -Return value: bool - - -
    -
    -
    - - - -```php -public static function isBuiltInType(string $name): bool; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $namestring-
    - -Return value: bool - - -
    -
    -
    - - - -```php -public function isClassLoaded(string $className): bool; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $classNamestring-
    - -Return value: bool - - -Throws: - - -
    -
    -
    - - - -```php -public static function isCorrectClassName(string $className, bool $checkBuiltIns = true): bool; -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $classNamestring-
    $checkBuiltInsbool-
    - -Return value: bool - - -
    -
    -
    - - - -```php -public function parseFullClassName(string $searchClassName, \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity $parentClassEntity, bool $extended = true): string; -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $searchClassNamestring-
    $parentClassEntity\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity-
    $extendedbool-
    - -Return value: string - - -Throws: - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/classes/PhpClassRendererTwigEnvironment.md b/docs/tech/classes/PhpClassRendererTwigEnvironment.md deleted file mode 100644 index 69a3c240..00000000 --- a/docs/tech/classes/PhpClassRendererTwigEnvironment.md +++ /dev/null @@ -1,143 +0,0 @@ - - BumbleDocGen / Technical description of the project / Class map / PhpClassRendererTwigEnvironment
    - -

    - PhpClassRendererTwigEnvironment class: -

    - - - - - -```php -namespace BumbleDocGen\LanguageHandler\Php\Renderer\EntityDocRenderer\PhpClassToMd; - -final class PhpClassRendererTwigEnvironment -``` - - - - - - - - -

    Initialization methods:

    - -
      -
    1. - __construct -
    2. -
    - -

    Methods:

    - -
      -
    1. - render -
    2. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public function __construct(\BumbleDocGen\Core\Renderer\Twig\MainExtension $mainExtension); -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $mainExtension\BumbleDocGen\Core\Renderer\Twig\MainExtension-
    - - - -
    -
    -
    - - - -```php -public function render(mixed $name, array $context = []): string; -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $namemixed-
    $contextarray-
    - -Return value: string - - -Throws: - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/classes/PhpClassToMdDocRenderer.md b/docs/tech/classes/PhpClassToMdDocRenderer.md deleted file mode 100644 index 458dd2b7..00000000 --- a/docs/tech/classes/PhpClassToMdDocRenderer.md +++ /dev/null @@ -1,242 +0,0 @@ - - BumbleDocGen / Technical description of the project / Class map / PhpClassToMdDocRenderer
    - -

    - PhpClassToMdDocRenderer class: -

    - - - - - -```php -namespace BumbleDocGen\LanguageHandler\Php\Renderer\EntityDocRenderer\PhpClassToMd; - -class PhpClassToMdDocRenderer implements \BumbleDocGen\Core\Renderer\EntityDocRenderer\EntityDocRendererInterface -``` - -
    Rendering PHP classes into md format documents (for display on GitHub)
    - - - - - - -

    Initialization methods:

    - -
      -
    1. - __construct -
    2. -
    - -

    Methods:

    - -
      -
    1. - getDocFileExtension -
    2. -
    3. - getDocFileNamespace -
    4. -
    5. - getRenderedText -
    6. -
    7. - isAvailableForEntity - - Can this render be used to create entity documentation
    8. -
    - - -

    Constants:

    - - - - - - -

    Method details:

    - -
    - - - -```php -public function __construct(\BumbleDocGen\LanguageHandler\Php\Renderer\EntityDocRenderer\PhpClassToMd\PhpClassRendererTwigEnvironment $classRendererTwig); -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $classRendererTwig\BumbleDocGen\LanguageHandler\Php\Renderer\EntityDocRenderer\PhpClassToMd\PhpClassRendererTwigEnvironment-
    - - - -
    -
    -
    - - - -```php -public function getDocFileExtension(): string; -``` - - - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -public function getDocFileNamespace(): string; -``` - - - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -public function getRenderedText(\BumbleDocGen\Core\Renderer\Context\DocumentedEntityWrapper $entityWrapper): string; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $entityWrapper\BumbleDocGen\Core\Renderer\Context\DocumentedEntityWrapper-
    - -Return value: string - - -Throws: - - -
    -
    -
    - - - -```php -public function isAvailableForEntity(\BumbleDocGen\Core\Parser\Entity\RootEntityInterface $entity): bool; -``` - -
    Can this render be used to create entity documentation
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $entity\BumbleDocGen\Core\Parser\Entity\RootEntityInterfaceThe entity whose documentation was requested
    - -Return value: bool - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/classes/PhpDocumentorStubberPlugin.md b/docs/tech/classes/PhpDocumentorStubberPlugin.md index 30f250b7..41917541 100644 --- a/docs/tech/classes/PhpDocumentorStubberPlugin.md +++ b/docs/tech/classes/PhpDocumentorStubberPlugin.md @@ -1,5 +1,4 @@ - - BumbleDocGen / Technical description of the project / Class map / PhpDocumentorStubberPlugin
    + BumbleDocGen / Technical description of the project / Plugin system / PhpDocumentorStubberPlugin

    PhpDocumentorStubberPlugin class: @@ -142,5 +141,3 @@ public function onGettingResourceLink(\BumbleDocGen\Core\Plugin\Event\Renderer\O
    - - \ No newline at end of file diff --git a/docs/tech/classes/PhpHandler.md b/docs/tech/classes/PhpHandler.md deleted file mode 100644 index c169860c..00000000 --- a/docs/tech/classes/PhpHandler.md +++ /dev/null @@ -1,269 +0,0 @@ - - BumbleDocGen / Technical description of the project / Class map / PhpHandler
    - -

    - PhpHandler class: -

    - - - - - -```php -namespace BumbleDocGen\LanguageHandler\Php; - -final class PhpHandler implements \BumbleDocGen\LanguageHandler\LanguageHandlerInterface -``` - - - - - - - - -

    Initialization methods:

    - -
      -
    1. - __construct -
    2. -
    - -

    Methods:

    - -
      -
    1. - getCustomTwigFilters -
    2. -
    3. - getCustomTwigFunctions -
    4. -
    5. - getEntityCollection -
    6. -
    7. - getLanguageKey - - Unique language handler key
    8. -
    9. - getPhpHandlerSettings -
    10. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public function __construct(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection $entitiesCollection, \BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings $phpHandlerSettings); -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $entitiesCollection\BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection-
    $phpHandlerSettings\BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings-
    - - - -
    -
    -
    - - - -```php -public function getCustomTwigFilters(\BumbleDocGen\Core\Renderer\Context\RendererContext $context): \BumbleDocGen\Core\Renderer\Twig\Filter\CustomFiltersCollection; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $context\BumbleDocGen\Core\Renderer\Context\RendererContext-
    - -Return value: \BumbleDocGen\Core\Renderer\Twig\Filter\CustomFiltersCollection - - -Throws: - - -
    -
    -
    - - - -```php -public function getCustomTwigFunctions(\BumbleDocGen\Core\Renderer\Context\RendererContext $context): \BumbleDocGen\Core\Renderer\Twig\Function\CustomFunctionsCollection; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $context\BumbleDocGen\Core\Renderer\Context\RendererContext-
    - -Return value: \BumbleDocGen\Core\Renderer\Twig\Function\CustomFunctionsCollection - - -Throws: - - -
    -
    -
    - - - -```php -public function getEntityCollection(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; -``` - - - -Parameters: not specified - -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection - - -
    -
    -
    - - - -```php -public static function getLanguageKey(): string; -``` - -
    Unique language handler key
    - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -public function getPhpHandlerSettings(): \BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings; -``` - - - -Parameters: not specified - -Return value: \BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/classes/PhpHandlerSettings_2.md b/docs/tech/classes/PhpHandlerSettings_2.md deleted file mode 100644 index fd2a8151..00000000 --- a/docs/tech/classes/PhpHandlerSettings_2.md +++ /dev/null @@ -1,514 +0,0 @@ - - BumbleDocGen / Technical description of the project / PhpHandlerSettings
    - -

    - PhpHandlerSettings class: -

    - - - - - -```php -namespace BumbleDocGen\LanguageHandler\Php; - -final class PhpHandlerSettings -``` - - - - - - - - -

    Initialization methods:

    - -
      -
    1. - __construct -
    2. -
    - -

    Methods:

    - -
      -
    1. - getClassConstantEntityFilter -
    2. -
    3. - getClassEntityFilter -
    4. -
    5. - getComposerConfigFile -
    6. -
    7. - getComposerVendorDir -
    8. -
    9. - getCustomTwigFilters -
    10. -
    11. - getCustomTwigFunctions -
    12. -
    13. - getEntityDocRenderersCollection -
    14. -
    15. - getFileSourceBaseUrl -
    16. -
    17. - getMethodEntityFilter -
    18. -
    19. - getPropertyEntityFilter -
    20. -
    21. - getPsr4Map -
    22. -
    23. - getUseComposerAutoload -
    24. -
    - - -

    Constants:

    - - - - - - -

    Method details:

    - -
    - - - -```php -public function __construct(\BumbleDocGen\Core\Configuration\ConfigurationParameterBag $parameterBag, \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache $localObjectCache); -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $parameterBag\BumbleDocGen\Core\Configuration\ConfigurationParameterBag-
    $localObjectCache\BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache-
    - - - -
    -
    -
    - - - -```php -public function getClassConstantEntityFilter(): \BumbleDocGen\Core\Parser\FilterCondition\ConditionInterface; -``` - - - -Parameters: not specified - -Return value: \BumbleDocGen\Core\Parser\FilterCondition\ConditionInterface - - -Throws: - - -
    -
    -
    - - - -```php -public function getClassEntityFilter(): \BumbleDocGen\Core\Parser\FilterCondition\ConditionInterface; -``` - - - -Parameters: not specified - -Return value: \BumbleDocGen\Core\Parser\FilterCondition\ConditionInterface - - -Throws: - - -
    -
    -
    - - - -```php -public function getComposerConfigFile(): null|string; -``` - - - -Parameters: not specified - -Return value: null | string - - -Throws: - - -
    -
    -
    - - - -```php -public function getComposerVendorDir(): null|string; -``` - - - -Parameters: not specified - -Return value: null | string - - -Throws: - - -
    -
    -
    - - - -```php -public function getCustomTwigFilters(): \BumbleDocGen\Core\Renderer\Twig\Filter\CustomFiltersCollection; -``` - - - -Parameters: not specified - -Return value: \BumbleDocGen\Core\Renderer\Twig\Filter\CustomFiltersCollection - - -Throws: - - -
    -
    -
    - - - -```php -public function getCustomTwigFunctions(): \BumbleDocGen\Core\Renderer\Twig\Function\CustomFunctionsCollection; -``` - - - -Parameters: not specified - -Return value: \BumbleDocGen\Core\Renderer\Twig\Function\CustomFunctionsCollection - - -Throws: - - -
    -
    -
    - - - -```php -public function getEntityDocRenderersCollection(): \BumbleDocGen\Core\Renderer\EntityDocRenderer\EntityDocRenderersCollection; -``` - - - -Parameters: not specified - -Return value: \BumbleDocGen\Core\Renderer\EntityDocRenderer\EntityDocRenderersCollection - - -Throws: - - -
    -
    -
    - - - -```php -public function getFileSourceBaseUrl(): null|string; -``` - - - -Parameters: not specified - -Return value: null | string - - -Throws: - - -
    -
    -
    - - - -```php -public function getMethodEntityFilter(): \BumbleDocGen\Core\Parser\FilterCondition\ConditionInterface; -``` - - - -Parameters: not specified - -Return value: \BumbleDocGen\Core\Parser\FilterCondition\ConditionInterface - - -Throws: - - -
    -
    -
    - - - -```php -public function getPropertyEntityFilter(): \BumbleDocGen\Core\Parser\FilterCondition\ConditionInterface; -``` - - - -Parameters: not specified - -Return value: \BumbleDocGen\Core\Parser\FilterCondition\ConditionInterface - - -Throws: - - -
    -
    -
    - - - -```php -public function getPsr4Map(): array; -``` - - - -Parameters: not specified - -Return value: array - - -Throws: - - -
    -
    -
    - - - -```php -public function getUseComposerAutoload(): bool; -``` - - - -Parameters: not specified - -Return value: bool - - -Throws: - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/classes/PhpParserHelper.md b/docs/tech/classes/PhpParserHelper.md deleted file mode 100644 index b1759862..00000000 --- a/docs/tech/classes/PhpParserHelper.md +++ /dev/null @@ -1,64 +0,0 @@ - - BumbleDocGen / Technical description of the project / Class map / PhpParserHelper
    - -

    - PhpParserHelper class: -

    - - - - - -```php -namespace BumbleDocGen\LanguageHandler\Php\Parser\PhpParser; - -final class PhpParserHelper -``` - - - - - - - - - -

    Methods:

    - -
      -
    1. - phpParser -
    2. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public function phpParser(): \PhpParser\Parser; -``` - - - -Parameters: not specified - -Return value: \PhpParser\Parser - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/classes/PhpReflectionApiConfig.md b/docs/tech/classes/PhpReflectionApiConfig.md deleted file mode 100644 index c5247abf..00000000 --- a/docs/tech/classes/PhpReflectionApiConfig.md +++ /dev/null @@ -1,643 +0,0 @@ - - BumbleDocGen / Technical description of the project / Class map / PhpReflectionApiConfig
    - -

    - PhpReflectionApiConfig class: -

    - - - - - -```php -namespace BumbleDocGen\LanguageHandler\Php; - -final class PhpReflectionApiConfig extends \BumbleDocGen\Core\Configuration\ReflectionApiConfig -``` - - - - - - - - -

    Initialization methods:

    - -
      -
    1. - create -
    2. -
    3. - createByConfiguration -
    4. -
    - -

    Methods:

    - -
      -
    1. - disableComposerAutoload -
    2. -
    3. - getCacheDir -
    4. -
    5. - getLanguageHandlerClassName -
    6. -
    7. - getProjectRoot -
    8. -
    9. - setCacheDir -
    10. -
    11. - setClassConstantFilter -
    12. -
    13. - setClassFilter -
    14. -
    15. - setComposerConfigFile -
    16. -
    17. - setComposerVendorPath -
    18. -
    19. - setMethodFilter -
    20. -
    21. - setProjectRoot -
    22. -
    23. - setPropertyFilter -
    24. -
    25. - setPsr4Map -
    26. -
    27. - toConfigArray -
    28. -
    29. - useComposerAutoload -
    30. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public static function create(): self; -``` - - - -Parameters: not specified - -Return value: self - - -
    -
    -
    - - - -```php -public static function createByConfiguration(\BumbleDocGen\Core\Configuration\Configuration $configuration): self; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $configuration\BumbleDocGen\Core\Configuration\Configuration-
    - -Return value: self - - -Throws: - - -
    -
    -
    - - - -```php -public function disableComposerAutoload(): void; -``` - - - -Parameters: not specified - -Return value: void - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\Core\Configuration\ReflectionApiConfig - -public function getCacheDir(): null|string; -``` - - - -Parameters: not specified - -Return value: null | string - - -
    -
    -
    - - - -```php -public function getLanguageHandlerClassName(): string; -``` - - - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\Core\Configuration\ReflectionApiConfig - -public function getProjectRoot(): string; -``` - - - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\Core\Configuration\ReflectionApiConfig - -public function setCacheDir(string|null $cacheDir): void; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $cacheDirstring | null-
    - -Return value: void - - -
    -
    -
    - - - -```php -public function setClassConstantFilter(\BumbleDocGen\Core\Parser\FilterCondition\ConditionInterface $classConstantFilter): void; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $classConstantFilter\BumbleDocGen\Core\Parser\FilterCondition\ConditionInterface-
    - -Return value: void - - -
    -
    -
    - - - -```php -public function setClassFilter(\BumbleDocGen\Core\Parser\FilterCondition\ConditionInterface $classFilter): void; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $classFilter\BumbleDocGen\Core\Parser\FilterCondition\ConditionInterface-
    - -Return value: void - - -
    -
    -
    - - - -```php -public function setComposerConfigFile(string $composerConfigFile): void; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $composerConfigFilestring-
    - -Return value: void - - -
    -
    -
    - - - -```php -public function setComposerVendorPath(string $composerInstalledFile): void; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $composerInstalledFilestring-
    - -Return value: void - - -
    -
    -
    - - - -```php -public function setMethodFilter(\BumbleDocGen\Core\Parser\FilterCondition\ConditionInterface $methodFilter): void; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $methodFilter\BumbleDocGen\Core\Parser\FilterCondition\ConditionInterface-
    - -Return value: void - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\Core\Configuration\ReflectionApiConfig - -public function setProjectRoot(string $projectRoot): void; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $projectRootstring-
    - -Return value: void - - -
    -
    -
    - - - -```php -public function setPropertyFilter(\BumbleDocGen\Core\Parser\FilterCondition\ConditionInterface $propertyFilter): void; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $propertyFilter\BumbleDocGen\Core\Parser\FilterCondition\ConditionInterface-
    - -Return value: void - - -
    -
    -
    - - - -```php -public function setPsr4Map(array $psr4Map): void; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $psr4Maparray-
    - -Return value: void - - -
    -
    -
    - - - -```php -public function toConfigArray(): array; -``` - - - -Parameters: not specified - -Return value: array - - -
    -
    -
    - - - -```php -public function useComposerAutoload(): void; -``` - - - -Parameters: not specified - -Return value: void - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/classes/PhpUnitStubberPlugin.md b/docs/tech/classes/PhpUnitStubberPlugin.md index 968ac2aa..baaea168 100644 --- a/docs/tech/classes/PhpUnitStubberPlugin.md +++ b/docs/tech/classes/PhpUnitStubberPlugin.md @@ -1,5 +1,4 @@ - - BumbleDocGen / Technical description of the project / Class map / PhpUnitStubberPlugin
    + BumbleDocGen / Technical description of the project / Plugin system / PhpUnitStubberPlugin

    PhpUnitStubberPlugin class: @@ -142,5 +141,3 @@ public function onGettingResourceLink(\BumbleDocGen\Core\Plugin\Event\Renderer\O
    - - \ No newline at end of file diff --git a/docs/tech/classes/PluginEventDispatcher.md b/docs/tech/classes/PluginEventDispatcher.md deleted file mode 100644 index 326c9ebd..00000000 --- a/docs/tech/classes/PluginEventDispatcher.md +++ /dev/null @@ -1,130 +0,0 @@ - - BumbleDocGen / Technical description of the project / Class map / PluginEventDispatcher
    - -

    - PluginEventDispatcher class: -

    - - - - - -```php -namespace BumbleDocGen\Core\Plugin; - -class PluginEventDispatcher extends \Symfony\Component\EventDispatcher\EventDispatcher -``` - - - - - - - - -

    Initialization methods:

    - -
      -
    1. - __construct -
    2. -
    - -

    Methods:

    - -
      -
    1. - dispatch -
    2. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public function __construct(\Monolog\Logger $logger); -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $logger\Monolog\Logger-
    - - - -
    -
    -
    - - - -```php -public function dispatch(object $event, string $eventName = null): object; -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $eventobject-
    $eventNamestring-
    - -Return value: object - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/classes/PluginInterface.md b/docs/tech/classes/PluginInterface.md index 1d51a6af..f940bb33 100644 --- a/docs/tech/classes/PluginInterface.md +++ b/docs/tech/classes/PluginInterface.md @@ -1,5 +1,4 @@ - - BumbleDocGen / Technical description of the project / Class map / PluginInterface
    + BumbleDocGen / Technical description of the project / Plugin system / PluginInterface

    PluginInterface class: @@ -30,5 +29,3 @@ interface PluginInterface extends \Symfony\Component\EventDispatcher\EventSubscr - - \ No newline at end of file diff --git a/docs/tech/classes/PluginsCollection.md b/docs/tech/classes/PluginsCollection.md deleted file mode 100644 index d3ad1f00..00000000 --- a/docs/tech/classes/PluginsCollection.md +++ /dev/null @@ -1,211 +0,0 @@ - - BumbleDocGen / Technical description of the project / Class map / PluginsCollection
    - -

    - PluginsCollection class: -

    - - - - - -```php -namespace BumbleDocGen\Core\Plugin; - -final class PluginsCollection implements \IteratorAggregate -``` - - - - - - - - - -

    Methods:

    - -
      -
    1. - add -
    2. -
    3. - create -
    4. -
    5. - get -
    6. -
    7. - getIterator -
    8. -
    9. - keys -
    10. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public function add(\BumbleDocGen\Core\Plugin\PluginInterface ...$plugins): \BumbleDocGen\Core\Plugin\PluginsCollection; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $plugins (variadic)\BumbleDocGen\Core\Plugin\PluginInterface-
    - -Return value: \BumbleDocGen\Core\Plugin\PluginsCollection - - -
    -
    -
    - - - -```php -public static function create(\BumbleDocGen\Core\Plugin\PluginInterface ...$plugins): \BumbleDocGen\Core\Plugin\PluginsCollection; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $plugins (variadic)\BumbleDocGen\Core\Plugin\PluginInterface-
    - -Return value: \BumbleDocGen\Core\Plugin\PluginsCollection - - -
    -
    -
    - - - -```php -public function get(string $key): null|\BumbleDocGen\Core\Plugin\PluginInterface; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $keystring-
    - -Return value: null | \BumbleDocGen\Core\Plugin\PluginInterface - - -
    -
    -
    - - - -```php -public function getIterator(): \Generator; -``` - - - -Parameters: not specified - -Return value: \Generator - - -
    -
    -
    - - - -```php -public function keys(): array; -``` - - - -Parameters: not specified - -Return value: array - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/classes/PregMatch.md b/docs/tech/classes/PregMatch.md index ca5699ee..18159999 100644 --- a/docs/tech/classes/PregMatch.md +++ b/docs/tech/classes/PregMatch.md @@ -1,5 +1,4 @@ - - BumbleDocGen / Technical description of the project / Class map / PregMatch
    + BumbleDocGen / Technical description of the project / Configuration / PregMatch

    PregMatch class: @@ -150,5 +149,3 @@ public static function getOptions(): array;
    - - \ No newline at end of file diff --git a/docs/tech/classes/PrepareSourceLink.md b/docs/tech/classes/PrepareSourceLink.md index 54fa8d78..9e834b34 100644 --- a/docs/tech/classes/PrepareSourceLink.md +++ b/docs/tech/classes/PrepareSourceLink.md @@ -1,5 +1,4 @@ - - BumbleDocGen / Technical description of the project / Class map / PrepareSourceLink
    + BumbleDocGen / Technical description of the project / Configuration / PrepareSourceLink

    PrepareSourceLink class: @@ -139,5 +138,3 @@ public static function getOptions(): array;
    - - \ No newline at end of file diff --git a/docs/tech/classes/PrintEntityCollectionAsList.md b/docs/tech/classes/PrintEntityCollectionAsList.md index 16259fe2..46347db8 100644 --- a/docs/tech/classes/PrintEntityCollectionAsList.md +++ b/docs/tech/classes/PrintEntityCollectionAsList.md @@ -1,5 +1,4 @@ - - BumbleDocGen / Technical description of the project / Class map / PrintEntityCollectionAsList
    + BumbleDocGen / Technical description of the project / Configuration / PrintEntityCollectionAsList

    PrintEntityCollectionAsList class: @@ -168,7 +167,7 @@ public function __invoke(\BumbleDocGen\Core\Parser\Entity\RootEntityCollection $ Throws: @@ -216,5 +215,3 @@ public static function getOptions(): array;
    - - \ No newline at end of file diff --git a/docs/tech/classes/ProgressBarFactory.md b/docs/tech/classes/ProgressBarFactory.md deleted file mode 100644 index 40b8c933..00000000 --- a/docs/tech/classes/ProgressBarFactory.md +++ /dev/null @@ -1,108 +0,0 @@ - - BumbleDocGen / Technical description of the project / Class map / ProgressBarFactory
    - -

    - ProgressBarFactory class: -

    - - - - - -```php -namespace BumbleDocGen\Console\ProgressBar; - -final class ProgressBarFactory -``` - - - - - - - - -

    Initialization methods:

    - -
      -
    1. - __construct -
    2. -
    - -

    Methods:

    - -
      -
    1. - createStylizedProgressBar -
    2. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public function __construct(\Symfony\Component\Console\Style\OutputStyle $io); -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $io\Symfony\Component\Console\Style\OutputStyle-
    - - - -
    -
    -
    - - - -```php -public function createStylizedProgressBar(): \BumbleDocGen\Console\ProgressBar\StylizedProgressBar; -``` - - - -Parameters: not specified - -Return value: \BumbleDocGen\Console\ProgressBar\StylizedProgressBar - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/classes/Provider.md b/docs/tech/classes/Provider.md deleted file mode 100644 index 140ee025..00000000 --- a/docs/tech/classes/Provider.md +++ /dev/null @@ -1,287 +0,0 @@ - - BumbleDocGen / Technical description of the project / Class map / Provider
    - -

    - Provider class: -

    - - - - - -```php -namespace BumbleDocGen\AI\Providers\OpenAI; - -final class Provider implements \BumbleDocGen\AI\ProviderInterface -``` - - - - - - - - -

    Initialization methods:

    - -
      -
    1. - __construct -
    2. -
    - -

    Methods:

    - -
      -
    1. - formatDataPrompt -
    2. -
    3. - getAvailableModels -
    4. -
    5. - getName -
    6. -
    7. - getSystemPrompt -
    8. -
    9. - sendPrompts -
    10. -
    - - -

    Constants:

    - - - - - - -

    Method details:

    - -
    - - - -```php -public function __construct(string $bearerToken, string|null $model); -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $bearerTokenstring-
    $modelstring | null-
    - - - -
    -
    -
    - - - -```php -public function formatDataPrompt(string $title, string $content): string; -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $titlestring-
    $contentstring-
    - -Return value: string - - -
    -
    -
    - - - -```php -public function getAvailableModels(): array; -``` - - - -Parameters: not specified - -Return value: array - - -Throws: - - -
    -
    -
    - - - -```php -public function getName(): string; -``` - - - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -public function getSystemPrompt(string $fileName): string; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $fileNamestring-
    - -Return value: string - - -
    -
    -
    - - - -```php -public function sendPrompts(array $prompts, string $system): string; -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $promptsarray-
    $systemstring-
    - -Return value: string - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/classes/ProviderFactory.md b/docs/tech/classes/ProviderFactory.md deleted file mode 100644 index 7e4b91dc..00000000 --- a/docs/tech/classes/ProviderFactory.md +++ /dev/null @@ -1,98 +0,0 @@ - - BumbleDocGen / Technical description of the project / Class map / ProviderFactory
    - -

    - ProviderFactory class: -

    - - - - - -```php -namespace BumbleDocGen\AI; - -final class ProviderFactory -``` - - - - - - - - - -

    Methods:

    - -
      -
    1. - create -
    2. -
    - - -

    Constants:

    - - - - - - -

    Method details:

    - -
    - - - -```php -public static function create(string $provider, string $apiKey, string|null $model = null): \BumbleDocGen\AI\ProviderInterface; -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $providerstring-
    $apiKeystring-
    $modelstring | null-
    - -Return value: \BumbleDocGen\AI\ProviderInterface - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/classes/ProviderInterface.md b/docs/tech/classes/ProviderInterface.md deleted file mode 100644 index 003f029a..00000000 --- a/docs/tech/classes/ProviderInterface.md +++ /dev/null @@ -1,197 +0,0 @@ - - BumbleDocGen / Technical description of the project / Class map / ProviderInterface
    - -

    - ProviderInterface class: -

    - - - - - -```php -namespace BumbleDocGen\AI; - -interface ProviderInterface -``` - - - - - - - - - -

    Methods:

    - -
      -
    1. - formatDataPrompt -
    2. -
    3. - getName -
    4. -
    5. - getSystemPrompt -
    6. -
    7. - sendPrompts -
    8. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public function formatDataPrompt(string $title, string $content): string; -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $titlestring-
    $contentstring-
    - -Return value: string - - -
    -
    -
    - - - -```php -public function getName(): string; -``` - - - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -public function getSystemPrompt(string $fileName): string; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $fileNamestring-
    - -Return value: string - - -
    -
    -
    - - - -```php -public function sendPrompts(array $prompts, string $system): string; -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $promptsarray-
    $systemstring-
    - -Return value: string - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/classes/Quotemeta.md b/docs/tech/classes/Quotemeta.md index 7c0fd891..34599b99 100644 --- a/docs/tech/classes/Quotemeta.md +++ b/docs/tech/classes/Quotemeta.md @@ -1,5 +1,4 @@ - - BumbleDocGen / Technical description of the project / Class map / Quotemeta
    + BumbleDocGen / Technical description of the project / Configuration / Quotemeta

    Quotemeta class: @@ -145,5 +144,3 @@ public static function getOptions(): array;
    - - \ No newline at end of file diff --git a/docs/tech/classes/ReadmeTemplateGenerator.md b/docs/tech/classes/ReadmeTemplateGenerator.md deleted file mode 100644 index d365ebf2..00000000 --- a/docs/tech/classes/ReadmeTemplateGenerator.md +++ /dev/null @@ -1,153 +0,0 @@ - - BumbleDocGen / Technical description of the project / Class map / ReadmeTemplateGenerator
    - -

    - ReadmeTemplateGenerator class: -

    - - - - - -```php -namespace BumbleDocGen\AI\Generators; - -final class ReadmeTemplateGenerator -``` - - - - - - - - -

    Initialization methods:

    - -
      -
    1. - __construct -
    2. -
    - -

    Methods:

    - -
      -
    1. - generateReadmeFileContent -
    2. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public function __construct(\BumbleDocGen\AI\ProviderInterface $aiProvider); -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $aiProvider\BumbleDocGen\AI\ProviderInterface-
    - - - -
    -
    -
    - - - -```php -public function generateReadmeFileContent(\BumbleDocGen\Core\Parser\Entity\RootEntityCollection $rootEntityCollection, array $entryPoints = [], string|null $composerJsonFile = null, string|null $additionalPrompt = null): string; -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $rootEntityCollection\BumbleDocGen\Core\Parser\Entity\RootEntityCollection-
    $entryPointsarray-
    $composerJsonFilestring | null-
    $additionalPromptstring | null-
    - -Return value: string - - -Throws: - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/classes/RefValueResolver.md b/docs/tech/classes/RefValueResolver.md deleted file mode 100644 index 532619f8..00000000 --- a/docs/tech/classes/RefValueResolver.md +++ /dev/null @@ -1,98 +0,0 @@ - - BumbleDocGen / Technical description of the project / Class map / RefValueResolver
    - -

    - RefValueResolver class: -

    - - - - - -```php -namespace BumbleDocGen\Core\Configuration\ValueResolver; - -final class RefValueResolver implements \BumbleDocGen\Core\Configuration\ValueResolver\ValueResolverInterface -``` - -
    We supplement the values by replacing the shortcodes with real values by the configuration key
    - - -Examples of using: - -```php -# Configuration processing example -project_root: "test" -output_dir: "%project_root%/docs" - -# After the value processing procedure, output_dir => "test/docs" - -``` - - - - - - - -

    Methods:

    - -
      -
    1. - resolveValue -
    2. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public function resolveValue(\BumbleDocGen\Core\Configuration\ConfigurationParameterBag $parameterBag, mixed $value): mixed; -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $parameterBag\BumbleDocGen\Core\Configuration\ConfigurationParameterBag-
    $valuemixed-
    - -Return value: mixed - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/classes/ReflectionApiConfig.md b/docs/tech/classes/ReflectionApiConfig.md deleted file mode 100644 index 0137673b..00000000 --- a/docs/tech/classes/ReflectionApiConfig.md +++ /dev/null @@ -1,218 +0,0 @@ - - BumbleDocGen / Technical description of the project / Class map / ReflectionApiConfig
    - -

    - ReflectionApiConfig class: -

    - - - - - -```php -namespace BumbleDocGen\Core\Configuration; - -abstract class ReflectionApiConfig -``` - - - - - - - - - -

    Methods:

    - -
      -
    1. - getCacheDir -
    2. -
    3. - getLanguageHandlerClassName -
    4. -
    5. - getProjectRoot -
    6. -
    7. - setCacheDir -
    8. -
    9. - setProjectRoot -
    10. -
    11. - toConfigArray -
    12. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public function getCacheDir(): null|string; -``` - - - -Parameters: not specified - -Return value: null | string - - -
    -
    -
    - - - -```php -public function getLanguageHandlerClassName(): string; -``` - - - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -public function getProjectRoot(): string; -``` - - - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -public function setCacheDir(string|null $cacheDir): void; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $cacheDirstring | null-
    - -Return value: void - - -
    -
    -
    - - - -```php -public function setProjectRoot(string $projectRoot): void; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $projectRootstring-
    - -Return value: void - - -
    -
    -
    - - - -```php -public function toConfigArray(): array; -``` - - - -Parameters: not specified - -Return value: array - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/classes/RemoveLineBrakes.md b/docs/tech/classes/RemoveLineBrakes.md index 99ff30fc..d7191502 100644 --- a/docs/tech/classes/RemoveLineBrakes.md +++ b/docs/tech/classes/RemoveLineBrakes.md @@ -1,5 +1,4 @@ - - BumbleDocGen / Technical description of the project / Class map / RemoveLineBrakes
    + BumbleDocGen / Technical description of the project / Configuration / RemoveLineBrakes

    RemoveLineBrakes class: @@ -139,5 +138,3 @@ public static function getOptions(): array;
    - - \ No newline at end of file diff --git a/docs/tech/classes/Renderer.md b/docs/tech/classes/Renderer.md deleted file mode 100644 index 463791c8..00000000 --- a/docs/tech/classes/Renderer.md +++ /dev/null @@ -1,181 +0,0 @@ - - BumbleDocGen / Technical description of the project / Class map / Renderer
    - -

    - Renderer class: -

    - - - - - -```php -namespace BumbleDocGen\Core\Renderer; - -final class Renderer -``` - -
    Generates and processes files from directory TemplatesDir saving them to directory OutputDir
    - -See: - - - - - - - -

    Initialization methods:

    - -
      -
    1. - __construct -
    2. -
    - -

    Methods:

    - -
      -
    1. - run - - Starting the rendering process
    2. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public function __construct(\BumbleDocGen\Core\Configuration\Configuration $configuration, \BumbleDocGen\Core\Parser\Entity\RootEntityCollectionsGroup $rootEntityCollectionsGroup, \BumbleDocGen\Core\Plugin\PluginEventDispatcher $pluginEventDispatcher, \BumbleDocGen\Core\Renderer\Context\RendererContext $rendererContext, \BumbleDocGen\Core\Renderer\Twig\MainTwigEnvironment $twig, \BumbleDocGen\Core\Renderer\RendererIteratorFactory $renderIteratorFactory, \BumbleDocGen\Core\Cache\SharedCompressedDocumentFileCache $sharedCompressedDocumentFileCache, \Symfony\Component\Filesystem\Filesystem $fs, \Psr\Log\LoggerInterface $logger); -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $configuration\BumbleDocGen\Core\Configuration\Configuration-
    $rootEntityCollectionsGroup\BumbleDocGen\Core\Parser\Entity\RootEntityCollectionsGroup-
    $pluginEventDispatcher\BumbleDocGen\Core\Plugin\PluginEventDispatcher-
    $rendererContext\BumbleDocGen\Core\Renderer\Context\RendererContext-
    $twig\BumbleDocGen\Core\Renderer\Twig\MainTwigEnvironment-
    $renderIteratorFactory\BumbleDocGen\Core\Renderer\RendererIteratorFactory-
    $sharedCompressedDocumentFileCache\BumbleDocGen\Core\Cache\SharedCompressedDocumentFileCache-
    $fs\Symfony\Component\Filesystem\Filesystem-
    $logger\Psr\Log\LoggerInterface-
    - - - -
    -
    -
    - - - -```php -public function run(): void; -``` - -
    Starting the rendering process
    - -Parameters: not specified - -Return value: void - - -Throws: - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/classes/RendererContext.md b/docs/tech/classes/RendererContext.md index f6191b17..b0f4450e 100644 --- a/docs/tech/classes/RendererContext.md +++ b/docs/tech/classes/RendererContext.md @@ -1,5 +1,4 @@ - - BumbleDocGen / Technical description of the project / Class map / RendererContext
    + BumbleDocGen / Technical description of the project / RendererContext

    RendererContext class: @@ -255,5 +254,3 @@ public function setCurrentTemplateFilePatch(string $currentTemplateFilePath): vo
    - - \ No newline at end of file diff --git a/docs/tech/classes/RendererContextCacheKeyGenerator.md b/docs/tech/classes/RendererContextCacheKeyGenerator.md deleted file mode 100644 index c53040c5..00000000 --- a/docs/tech/classes/RendererContextCacheKeyGenerator.md +++ /dev/null @@ -1,91 +0,0 @@ - - BumbleDocGen / Technical description of the project / Class map / RendererContextCacheKeyGenerator
    - -

    - RendererContextCacheKeyGenerator class: -

    - - - - - -```php -namespace BumbleDocGen\Core\Parser\Entity\Cache\CacheKey; - -final class RendererContextCacheKeyGenerator implements \BumbleDocGen\Core\Parser\Entity\Cache\CacheKey\CacheKeyGeneratorInterface -``` - - - - - - - - - -

    Methods:

    - -
      -
    1. - generateKey -
    2. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public static function generateKey(string $cacheNamespace, \BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityInterface $entity, array $args): string; -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $cacheNamespacestring-
    $entity\BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityInterface-
    $argsarray-
    - -Return value: string - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/classes/RendererDependencyFactory.md b/docs/tech/classes/RendererDependencyFactory.md deleted file mode 100644 index 5f9a2866..00000000 --- a/docs/tech/classes/RendererDependencyFactory.md +++ /dev/null @@ -1,190 +0,0 @@ - - BumbleDocGen / Technical description of the project / Class map / RendererDependencyFactory
    - -

    - RendererDependencyFactory class: -

    - - - - - -```php -namespace BumbleDocGen\Core\Renderer\Context\Dependency; - -final class RendererDependencyFactory -``` - - - - - - - - -

    Initialization methods:

    - -
      -
    1. - __construct -
    2. -
    - -

    Methods:

    - -
      -
    1. - createDirectoryDependency -
    2. -
    3. - createFileDependency -
    4. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public function __construct(\BumbleDocGen\Core\Renderer\RendererHelper $rendererHelper); -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $rendererHelper\BumbleDocGen\Core\Renderer\RendererHelper-
    - - - -
    -
    -
    - - - -```php -public function createDirectoryDependency(string $dirPath): \BumbleDocGen\Core\Renderer\Context\Dependency\DirectoryDependency; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $dirPathstring-
    - -Return value: \BumbleDocGen\Core\Renderer\Context\Dependency\DirectoryDependency - - -Throws: - - -
    -
    -
    - - - -```php -public function createFileDependency(string $filePath, string|null $contentFilterRegex = null, int|null $matchIndex = null): \BumbleDocGen\Core\Renderer\Context\Dependency\FileDependency; -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $filePathstring-
    $contentFilterRegexstring | null-
    $matchIndexint | null-
    - -Return value: \BumbleDocGen\Core\Renderer\Context\Dependency\FileDependency - - -Throws: - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/classes/RendererDependencyInterface.md b/docs/tech/classes/RendererDependencyInterface.md deleted file mode 100644 index 4a83c70c..00000000 --- a/docs/tech/classes/RendererDependencyInterface.md +++ /dev/null @@ -1,81 +0,0 @@ - - BumbleDocGen / Technical description of the project / Class map / RendererDependencyInterface
    - -

    - RendererDependencyInterface class: -

    - - - - - -```php -namespace BumbleDocGen\Core\Renderer\Context\Dependency; - -interface RendererDependencyInterface -``` - - - - - - - - - -

    Methods:

    - -
      -
    1. - isChanged -
    2. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public function isChanged(\BumbleDocGen\Core\Renderer\RendererHelper $rendererHelper): bool; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $rendererHelper\BumbleDocGen\Core\Renderer\RendererHelper-
    - -Return value: bool - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/classes/RendererHelper.md b/docs/tech/classes/RendererHelper.md deleted file mode 100644 index 566881e5..00000000 --- a/docs/tech/classes/RendererHelper.md +++ /dev/null @@ -1,232 +0,0 @@ - - BumbleDocGen / Technical description of the project / Class map / RendererHelper
    - -

    - RendererHelper class: -

    - - - - - -```php -namespace BumbleDocGen\Core\Renderer; - -final class RendererHelper -``` - - - - - - - - -

    Initialization methods:

    - -
      -
    1. - __construct -
    2. -
    - -

    Methods:

    - -
      -
    1. - fileInternalLinkToFilePath -
    2. -
    3. - filePathToFileInternalLink -
    4. -
    5. - getPreloadResourceLink -
    6. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public function __construct(\BumbleDocGen\Core\Plugin\PluginEventDispatcher $pluginEventDispatcher, \BumbleDocGen\Core\Configuration\Configuration $configuration); -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $pluginEventDispatcher\BumbleDocGen\Core\Plugin\PluginEventDispatcher-
    $configuration\BumbleDocGen\Core\Configuration\Configuration-
    - - - -
    -
    -
    - - - -```php -public function fileInternalLinkToFilePath(string $fileInternalLink): string; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $fileInternalLinkstring-
    - -Return value: string - - -Throws: - - -
    -
    -
    - - - -```php -public function filePathToFileInternalLink(string $fileName): string; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $fileNamestring-
    - -Return value: string - - -Throws: - - -
    -
    -
    - - - -```php -public function getPreloadResourceLink(string $resourceName): null|string; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $resourceNamestring-
    - -Return value: null | string - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/classes/RendererIteratorFactory.md b/docs/tech/classes/RendererIteratorFactory.md deleted file mode 100644 index 9b2f1a5d..00000000 --- a/docs/tech/classes/RendererIteratorFactory.md +++ /dev/null @@ -1,237 +0,0 @@ - - BumbleDocGen / Technical description of the project / Class map / RendererIteratorFactory
    - -

    - RendererIteratorFactory class: -

    - - - - - -```php -namespace BumbleDocGen\Core\Renderer; - -final class RendererIteratorFactory -``` - - - - - - - - -

    Initialization methods:

    - -
      -
    1. - __construct -
    2. -
    - -

    Methods:

    - -
      -
    1. - getDocumentedEntityWrappersWithOutdatedCache -
    2. -
    3. - getFilesToRemove -
    4. -
    5. - getTemplatesWithOutdatedCache -
    6. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public function __construct(\BumbleDocGen\Core\Renderer\Context\RendererContext $rendererContext, \BumbleDocGen\Core\Parser\Entity\RootEntityCollectionsGroup $rootEntityCollectionsGroup, \BumbleDocGen\Core\Renderer\Context\DocumentedEntityWrappersCollection $documentedEntityWrappersCollection, \BumbleDocGen\Core\Configuration\Configuration $configuration, \BumbleDocGen\Core\Cache\SharedCompressedDocumentFileCache $sharedCompressedDocumentFileCache, \BumbleDocGen\Core\Renderer\RendererHelper $rendererHelper, \BumbleDocGen\Core\Renderer\Context\Dependency\RendererDependencyFactory $dependencyFactory, \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache $localObjectCache, \BumbleDocGen\Console\ProgressBar\ProgressBarFactory $progressBarFactory, \BumbleDocGen\Core\Plugin\PluginEventDispatcher $pluginEventDispatcher, \Symfony\Component\Console\Style\OutputStyle $io, \Monolog\Logger $logger, \BumbleDocGen\Core\Logger\Handler\GenerationErrorsHandler $generationErrorsHandler); -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $rendererContext\BumbleDocGen\Core\Renderer\Context\RendererContext-
    $rootEntityCollectionsGroup\BumbleDocGen\Core\Parser\Entity\RootEntityCollectionsGroup-
    $documentedEntityWrappersCollection\BumbleDocGen\Core\Renderer\Context\DocumentedEntityWrappersCollection-
    $configuration\BumbleDocGen\Core\Configuration\Configuration-
    $sharedCompressedDocumentFileCache\BumbleDocGen\Core\Cache\SharedCompressedDocumentFileCache-
    $rendererHelper\BumbleDocGen\Core\Renderer\RendererHelper-
    $dependencyFactory\BumbleDocGen\Core\Renderer\Context\Dependency\RendererDependencyFactory-
    $localObjectCache\BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache-
    $progressBarFactory\BumbleDocGen\Console\ProgressBar\ProgressBarFactory-
    $pluginEventDispatcher\BumbleDocGen\Core\Plugin\PluginEventDispatcher-
    $io\Symfony\Component\Console\Style\OutputStyle-
    $logger\Monolog\Logger-
    $generationErrorsHandler\BumbleDocGen\Core\Logger\Handler\GenerationErrorsHandler-
    - - - -
    -
    -
    - -
      -
    • # - getDocumentedEntityWrappersWithOutdatedCache - | source code
    • -
    - -```php -public function getDocumentedEntityWrappersWithOutdatedCache(): \Generator; -``` - - - -Parameters: not specified - -Return value: \Generator - - -Throws: - - -
    -
    -
    - - - -```php -public function getFilesToRemove(): \Generator; -``` - - - -Parameters: not specified - -Return value: \Generator - - -Throws: - - -
    -
    -
    - - - -```php -public function getTemplatesWithOutdatedCache(): \Generator; -``` - - - -Parameters: not specified - -Return value: \Generator - - -Throws: - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/classes/BaseCommand.md b/docs/tech/classes/ServeCommand.md similarity index 78% rename from docs/tech/classes/BaseCommand.md rename to docs/tech/classes/ServeCommand.md index 927d42d9..cdd320d1 100644 --- a/docs/tech/classes/BaseCommand.md +++ b/docs/tech/classes/ServeCommand.md @@ -1,8 +1,7 @@ - - BumbleDocGen / Technical description of the project / Class map / BaseCommand
    + BumbleDocGen / Technical description of the project / Console app / ServeCommand

    - BaseCommand class: + ServeCommand class:

    @@ -12,7 +11,7 @@ ```php namespace BumbleDocGen\Console\Command; -abstract class BaseCommand extends \Symfony\Component\Console\Command\Command +final class ServeCommand extends \BumbleDocGen\Console\Command\BaseCommand ``` @@ -48,6 +47,8 @@ abstract class BaseCommand extends \Symfony\Component\Console\Command\Command ```php +// Implemented in BumbleDocGen\Console\Command\BaseCommand + public function __construct(string $name = null); ``` @@ -76,5 +77,3 @@ public function __construct(string $name = null);
    - - \ No newline at end of file diff --git a/docs/tech/classes/SharedCommandLogicTrait.md b/docs/tech/classes/SharedCommandLogicTrait.md deleted file mode 100644 index de7e9de7..00000000 --- a/docs/tech/classes/SharedCommandLogicTrait.md +++ /dev/null @@ -1,34 +0,0 @@ - - BumbleDocGen / Technical description of the project / Class map / SharedCommandLogicTrait
    - -

    - SharedCommandLogicTrait class: -

    - - - - - -```php -namespace BumbleDocGen\AI\Traits; - -trait SharedCommandLogicTrait -``` - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/tech/classes/SharedCompressedDocumentFileCache.md b/docs/tech/classes/SharedCompressedDocumentFileCache.md deleted file mode 100644 index e5a8aa08..00000000 --- a/docs/tech/classes/SharedCompressedDocumentFileCache.md +++ /dev/null @@ -1,262 +0,0 @@ - - BumbleDocGen / Technical description of the project / Class map / SharedCompressedDocumentFileCache
    - -

    - SharedCompressedDocumentFileCache class: -

    - - - - - -```php -namespace BumbleDocGen\Core\Cache; - -final class SharedCompressedDocumentFileCache -``` - - - - - - - - -

    Initialization methods:

    - -
      -
    1. - __construct -
    2. -
    - -

    Methods:

    - -
      -
    1. - get -
    2. -
    3. - getCacheFileName -
    4. -
    5. - removeNotUsedKeys -
    6. -
    7. - saveChanges -
    8. -
    9. - set -
    10. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public function __construct(\BumbleDocGen\Core\Configuration\Configuration $configuration); -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $configuration\BumbleDocGen\Core\Configuration\Configuration-
    - - - -Throws: - - -
    -
    -
    - - - -```php -public function get(string $key, mixed $defaultValue = null): mixed; -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $keystring-
    $defaultValuemixed-
    - -Return value: mixed - - -
    -
    -
    - - - -```php -public function getCacheFileName(): string; -``` - - - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -public function removeNotUsedKeys(): void; -``` - - - -Parameters: not specified - -Return value: void - - -
    -
    -
    - - - -```php -public function saveChanges(): void; -``` - - - -Parameters: not specified - -Return value: void - - -Throws: - - -
    -
    -
    - - - -```php -public function set(string $key, mixed $data): void; -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $keystring-
    $datamixed-
    - -Return value: void - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/classes/SingleEntitySearchOperation.md b/docs/tech/classes/SingleEntitySearchOperation.md deleted file mode 100644 index 364566c1..00000000 --- a/docs/tech/classes/SingleEntitySearchOperation.md +++ /dev/null @@ -1,303 +0,0 @@ - - BumbleDocGen / Technical description of the project / Class map / SingleEntitySearchOperation
    - -

    - SingleEntitySearchOperation class: -

    - - - - - -```php -namespace BumbleDocGen\Core\Parser\Entity\CollectionLogOperation; - -final class SingleEntitySearchOperation implements \BumbleDocGen\Core\Parser\Entity\CollectionLogOperation\OperationInterface -``` - - - - - - - - -

    Initialization methods:

    - -
      -
    1. - __construct -
    2. -
    - -

    Methods:

    - -
      -
    1. - call -
    2. -
    3. - getArgs -
    4. -
    5. - getArgsHash -
    6. -
    7. - getEntityName -
    8. -
    9. - getFunctionName -
    10. -
    11. - getKey -
    12. -
    13. - getRequestedEntityName -
    14. -
    15. - incrementUsageCount -
    16. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public function __construct(string $functionName, array $args, \BumbleDocGen\Core\Parser\Entity\RootEntityInterface|null $entity); -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $functionNamestring-
    $argsarray-
    $entity\BumbleDocGen\Core\Parser\Entity\RootEntityInterface | null-
    - - - -
    -
    -
    - - - -```php -public function call(\BumbleDocGen\Core\Parser\Entity\RootEntityCollection $rootEntityCollection): null|\BumbleDocGen\Core\Parser\Entity\RootEntityInterface; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $rootEntityCollection\BumbleDocGen\Core\Parser\Entity\RootEntityCollection-
    - -Return value: null | \BumbleDocGen\Core\Parser\Entity\RootEntityInterface - - -
    -
    -
    - - - -```php -public function getArgs(): array; -``` - - - -Parameters: not specified - -Return value: array - - -
    -
    -
    - - - -```php -public function getArgsHash(): string; -``` - - - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -public function getEntityName(): null|string; -``` - - - -Parameters: not specified - -Return value: null | string - - -
    -
    -
    - - - -```php -public function getFunctionName(): string; -``` - - - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -public function getKey(): string; -``` - - - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -public function getRequestedEntityName(): string; -``` - - - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -public function incrementUsageCount(): void; -``` - - - -Parameters: not specified - -Return value: void - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/classes/SourceLocatorsCollection.md b/docs/tech/classes/SourceLocatorsCollection.md deleted file mode 100644 index d665a4a9..00000000 --- a/docs/tech/classes/SourceLocatorsCollection.md +++ /dev/null @@ -1,170 +0,0 @@ - - BumbleDocGen / Technical description of the project / Class map / SourceLocatorsCollection
    - -

    - SourceLocatorsCollection class: -

    - - - - - -```php -namespace BumbleDocGen\Core\Parser\SourceLocator; - -final class SourceLocatorsCollection implements \IteratorAggregate -``` - - - - - - - - - -

    Methods:

    - -
      -
    1. - add -
    2. -
    3. - create -
    4. -
    5. - getCommonFinder -
    6. -
    7. - getIterator -
    8. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public function add(\BumbleDocGen\Core\Parser\SourceLocator\SourceLocatorInterface $sourceLocator): \BumbleDocGen\Core\Parser\SourceLocator\SourceLocatorsCollection; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $sourceLocator\BumbleDocGen\Core\Parser\SourceLocator\SourceLocatorInterface-
    - -Return value: \BumbleDocGen\Core\Parser\SourceLocator\SourceLocatorsCollection - - -
    -
    -
    - - - -```php -public static function create(\BumbleDocGen\Core\Parser\SourceLocator\SourceLocatorInterface ...$sourceLocators): \BumbleDocGen\Core\Parser\SourceLocator\SourceLocatorsCollection; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $sourceLocators (variadic)\BumbleDocGen\Core\Parser\SourceLocator\SourceLocatorInterface-
    - -Return value: \BumbleDocGen\Core\Parser\SourceLocator\SourceLocatorsCollection - - -
    -
    -
    - - - -```php -public function getCommonFinder(): \Symfony\Component\Finder\Finder; -``` - - - -Parameters: not specified - -Return value: \Symfony\Component\Finder\Finder - - -
    -
    -
    - - - -```php -public function getIterator(): \Generator; -``` - - - -Parameters: not specified - -Return value: \Generator - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/classes/StrTypeToUrl.md b/docs/tech/classes/StrTypeToUrl.md index 83d9592e..d4f1dc39 100644 --- a/docs/tech/classes/StrTypeToUrl.md +++ b/docs/tech/classes/StrTypeToUrl.md @@ -1,5 +1,4 @@ - - BumbleDocGen / Technical description of the project / Class map / StrTypeToUrl
    + BumbleDocGen / Technical description of the project / Configuration / StrTypeToUrl

    StrTypeToUrl class: @@ -214,5 +213,3 @@ public static function getOptions(): array;
    - - \ No newline at end of file diff --git a/docs/tech/classes/StubberPlugin.md b/docs/tech/classes/StubberPlugin.md index af09eca5..17e5683d 100644 --- a/docs/tech/classes/StubberPlugin.md +++ b/docs/tech/classes/StubberPlugin.md @@ -1,5 +1,4 @@ - - BumbleDocGen / Technical description of the project / Class map / StubberPlugin
    + BumbleDocGen / Technical description of the project / Plugin system / StubberPlugin

    StubberPlugin class: @@ -200,5 +199,3 @@ public function onGettingResourceLink(\BumbleDocGen\Core\Plugin\Event\Renderer\O
    - - \ No newline at end of file diff --git a/docs/tech/classes/StylizedProgressBar.md b/docs/tech/classes/StylizedProgressBar.md deleted file mode 100644 index e39a2a6e..00000000 --- a/docs/tech/classes/StylizedProgressBar.md +++ /dev/null @@ -1,359 +0,0 @@ - - BumbleDocGen / Technical description of the project / Class map / StylizedProgressBar
    - -

    - StylizedProgressBar class: -

    - - - - - -```php -namespace BumbleDocGen\Console\ProgressBar; - -final class StylizedProgressBar implements \BumbleDocGen\Core\Parser\Entity\EntitiesLoaderProgressBarInterface -``` - - - - - - - - -

    Initialization methods:

    - -
      -
    1. - __construct -
    2. -
    - -

    Methods:

    - -
      -
    1. - advance -
    2. -
    3. - finish -
    4. -
    5. - iterate -
    6. -
    7. - setMaxSteps -
    8. -
    9. - setName -
    10. -
    11. - setStepDescription -
    12. -
    13. - start -
    14. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public function __construct(\Symfony\Component\Console\Style\OutputStyle $io); -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $io\Symfony\Component\Console\Style\OutputStyle-
    - - - -
    -
    -
    - - - -```php -public function advance(int $step): void; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $stepint-
    - -Return value: void - - -
    -
    -
    - - - -```php -public function finish(): void; -``` - - - -Parameters: not specified - -Return value: void - - -
    -
    -
    - - - -```php -public function iterate(iterable $iterable, int|null $max = null): \Generator; -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $iterableiterable-
    $maxint | null-
    - -Return value: \Generator - - -
    -
    -
    - - - -```php -public function setMaxSteps(int $maxSteps): void; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $maxStepsint-
    - -Return value: void - - -
    -
    -
    - - - -```php -public function setName(string $name): void; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $namestring-
    - -Return value: void - - -
    -
    -
    - - - -```php -public function setStepDescription(string $stepDescription): void; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $stepDescriptionstring-
    - -Return value: void - - -
    -
    -
    - - - -```php -public function start(int|null $max = null): void; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $maxint | null-
    - -Return value: void - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/classes/TemplateFile.md b/docs/tech/classes/TemplateFile.md deleted file mode 100644 index d9d4bd18..00000000 --- a/docs/tech/classes/TemplateFile.md +++ /dev/null @@ -1,359 +0,0 @@ - - BumbleDocGen / Technical description of the project / Class map / TemplateFile
    - -

    - TemplateFile class: -

    - - - - - -```php -namespace BumbleDocGen\Core\Renderer; - -final class TemplateFile -``` - - - - - - - - -

    Initialization methods:

    - -
      -
    1. - __construct -
    2. -
    3. - create -
    4. -
    - -

    Methods:

    - -
      -
    1. - getRealPath -
    2. -
    3. - getRelativeDocPath -
    4. -
    5. - getRelativeDocPathByTemplatePath -
    6. -
    7. - getRelativeTemplatePath -
    8. -
    9. - getTemplatePathByRelativeDocPath -
    10. -
    11. - isTemplate -
    12. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public function __construct(string $realPath, string $relativeDocPath); -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $realPathstring-
    $relativeDocPathstring-
    - - - -
    -
    -
    - - - -```php -public static function create(\Symfony\Component\Finder\SplFileInfo $fileInfo, \BumbleDocGen\Core\Configuration\Configuration $configuration, \BumbleDocGen\Core\Plugin\PluginEventDispatcher $pluginEventDispatcher): self; -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $fileInfo\Symfony\Component\Finder\SplFileInfo-
    $configuration\BumbleDocGen\Core\Configuration\Configuration-
    $pluginEventDispatcher\BumbleDocGen\Core\Plugin\PluginEventDispatcher-
    - -Return value: self - - -Throws: - - -
    -
    -
    - - - -```php -public function getRealPath(): string; -``` - - - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -public function getRelativeDocPath(): string; -``` - - - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -public static function getRelativeDocPathByTemplatePath(string $templatePath, \BumbleDocGen\Core\Configuration\Configuration $configuration, \BumbleDocGen\Core\Plugin\PluginEventDispatcher $pluginEventDispatcher): string; -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $templatePathstring-
    $configuration\BumbleDocGen\Core\Configuration\Configuration-
    $pluginEventDispatcher\BumbleDocGen\Core\Plugin\PluginEventDispatcher-
    - -Return value: string - - -Throws: - - -
    -
    -
    - - - -```php -public function getRelativeTemplatePath(): null|string; -``` - - - -Parameters: not specified - -Return value: null | string - - -
    -
    -
    - - - -```php -public static function getTemplatePathByRelativeDocPath(string $relativeDocPath, \BumbleDocGen\Core\Configuration\Configuration $configuration, \BumbleDocGen\Core\Plugin\PluginEventDispatcher $pluginEventDispatcher): string; -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $relativeDocPathstring-
    $configuration\BumbleDocGen\Core\Configuration\Configuration-
    $pluginEventDispatcher\BumbleDocGen\Core\Plugin\PluginEventDispatcher-
    - -Return value: string - - -Throws: - - -
    -
    -
    - - - -```php -public function isTemplate(): bool; -``` - - - -Parameters: not specified - -Return value: bool - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/classes/TextToCodeBlock.md b/docs/tech/classes/TextToCodeBlock.md index 6eb6b88b..195e471b 100644 --- a/docs/tech/classes/TextToCodeBlock.md +++ b/docs/tech/classes/TextToCodeBlock.md @@ -1,5 +1,4 @@ - - BumbleDocGen / Technical description of the project / Class map / TextToCodeBlock
    + BumbleDocGen / Technical description of the project / Configuration / TextToCodeBlock

    TextToCodeBlock class: @@ -144,5 +143,3 @@ public static function getOptions(): array;
    - - \ No newline at end of file diff --git a/docs/tech/classes/TextToHeading.md b/docs/tech/classes/TextToHeading.md index c4503270..285a8efc 100644 --- a/docs/tech/classes/TextToHeading.md +++ b/docs/tech/classes/TextToHeading.md @@ -1,5 +1,4 @@ - - BumbleDocGen / Technical description of the project / Class map / TextToHeading
    + BumbleDocGen / Technical description of the project / Configuration / TextToHeading

    TextToHeading class: @@ -144,5 +143,3 @@ public static function getOptions(): array;
    - - \ No newline at end of file diff --git a/docs/tech/classes/TraitEntity.md b/docs/tech/classes/TraitEntity.md deleted file mode 100644 index 586b3d52..00000000 --- a/docs/tech/classes/TraitEntity.md +++ /dev/null @@ -1,3441 +0,0 @@ - - BumbleDocGen / Technical description of the project / Class map / TraitEntity
    - -

    - TraitEntity class: -

    - - - - - -```php -namespace BumbleDocGen\LanguageHandler\Php\Parser\Entity; - -class TraitEntity extends \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity implements \BumbleDocGen\Core\Renderer\Context\DocumentTransformableEntityInterface, \BumbleDocGen\Core\Parser\Entity\RootEntityInterface, \BumbleDocGen\Core\Parser\Entity\EntityInterface, \BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityInterface -``` - -
    Trait
    - -See: - - - - - - - -

    Initialization methods:

    - -
      -
    1. - __construct -
    2. -
    - -

    Methods:

    - -
      -
    1. - addPluginData - - Add information to aт entity object
    2. -
    3. - cursorToDocAttributeLinkFragment -
    4. -
    5. - getAbsoluteFileName - - Returns the absolute path to a file if it can be retrieved and if the file is in the project directory
    6. -
    7. - getAst - - Get AST for this entity
    8. -
    9. - getCacheKey -
    10. -
    11. - getCachedEntityDependencies -
    12. -
    13. - getConstant - - Get the method entity by its name
    14. -
    15. - getConstantEntitiesCollection - - Get a collection of constant entities
    16. -
    17. - getConstantValue - - Get the compiled value of a constant
    18. -
    19. - getConstants - - Get all constants that are available according to the configuration as an array
    20. -
    21. - getConstantsData - - Get a list of all constants and classes where they are implemented
    22. -
    23. - getConstantsValues - - Get class constant compiled values according to filters
    24. -
    25. - getCurrentRootEntity -
    26. -
    27. - getDescription - - Get entity description
    28. -
    29. - getDescriptionLinks - - Get parsed links from description and doc blocks `see` and `link`
    30. -
    31. - getDocBlock - - Get DocBlock for current entity
    32. -
    33. - getDocComment - - Get the doc comment of an entity
    34. -
    35. - getDocCommentEntity - - Link to an entity where docBlock is implemented for this entity
    36. -
    37. - getDocCommentLine - - Get the code line number where the docBlock of the current entity begins
    38. -
    39. - getDocNote - - Get the note annotation value
    40. -
    41. - getDocRender -
    42. -
    43. - getEndLine - - Get the line number of the end of a class code in a file
    44. -
    45. - getEntityDependencies -
    46. -
    47. - getExamples - - Get parsed examples from `examples` doc block
    48. -
    49. - getFileContent -
    50. -
    51. - getFileSourceLink -
    52. -
    53. - getFirstExample - - Get first example from `examples` doc block
    54. -
    55. - getImplementingClass - - Get the class like entity in which the current entity was implemented
    56. -
    57. - getInterfaceNames - - Get a list of class interface names
    58. -
    59. - getInterfacesEntities - - Get a list of interface entities that the current class implements
    60. -
    61. - getMethod - - Get the method entity by its name
    62. -
    63. - getMethodEntitiesCollection - - Get a collection of method entities
    64. -
    65. - getMethods - - Get all methods that are available according to the configuration as an array
    66. -
    67. - getMethodsData - - Get a list of all methods and classes where they are implemented
    68. -
    69. - getModifiersString - - Get entity modifiers as a string
    70. -
    71. - getName - - Full name of the entity
    72. -
    73. - getNamespaceName - - Get the entity namespace name
    74. -
    75. - getObjectId - - Get entity unique ID
    76. -
    77. - getParentClass - - Get the entity of the parent class if it exists
    78. -
    79. - getParentClassEntities - - Get a list of parent class entities
    80. -
    81. - getParentClassName - - Get the name of the parent class entity if it exists
    82. -
    83. - getParentClassNames - - Get a list of entity names of parent classes
    84. -
    85. - getPluginData - - Get additional information added using the plugin
    86. -
    87. - getProperties - - Get all properties that are available according to the configuration as an array
    88. -
    89. - getPropertiesData - - Get a list of all properties and classes where they are implemented
    90. -
    91. - getProperty - - Get the property entity by its name
    92. -
    93. - getPropertyDefaultValue - - Get the compiled value of a property
    94. -
    95. - getPropertyEntitiesCollection - - Get a collection of property entities
    96. -
    97. - getRelativeFileName - - File name relative to project_root configuration parameter
    98. -
    99. - getRootEntityCollection - - Get the collection of root entities to which this entity belongs
    100. -
    101. - getShortName - - Short name of the entity
    102. -
    103. - getStartLine - - Get the line number of the start of a class code in a file
    104. -
    105. - getThrows - - Get parsed throws from `throws` doc block
    106. -
    107. - getThrowsDocBlockLinks -
    108. -
    109. - getTraits - - Get a list of trait entities of the current class
    110. -
    111. - getTraitsNames - - Get a list of class traits names
    112. -
    113. - hasConstant - - Check if a constant exists in a class
    114. -
    115. - hasDescriptionLinks - - Checking if an entity has links in its description
    116. -
    117. - hasExamples - - Checking if an entity has `example` docBlock
    118. -
    119. - hasMethod - - Check if a method exists in a class
    120. -
    121. - hasParentClass - - Check if a certain parent class exists in a chain of parent classes
    122. -
    123. - hasProperty - - Check if a property exists in a class
    124. -
    125. - hasThrows - - Checking if an entity has `throws` docBlock
    126. -
    127. - hasTraits - - Check if the class contains traits
    128. -
    129. - implementsInterface - - Check if a class implements an interface
    130. -
    131. - isAbstract - - Check that an entity is abstract
    132. -
    133. - isApi - - Checking if an entity has `api` docBlock
    134. -
    135. - isClass - - Check if an entity is a Class
    136. -
    137. - isClassLoad -
    138. -
    139. - isDeprecated - - Checking if an entity has `deprecated` docBlock
    140. -
    141. - isDocumentCreationAllowed -
    142. -
    143. - isEntityCacheOutdated - - Checking if the entity cache is out of date
    144. -
    145. - isEntityDataCacheOutdated -
    146. -
    147. - isEntityDataCanBeLoaded -
    148. -
    149. - isEntityFileCanBeLoad - - Checking if entity data can be retrieved
    150. -
    151. - isEntityNameValid - - Check if the name is a valid name for ClassLikeEntity
    152. -
    153. - isEnum - - Check if an entity is an Enum
    154. -
    155. - isExternalLibraryEntity - - Check if a given entity is an entity from a third party library (connected via composer)
    156. -
    157. - isInGit - - Checking if class file is in git repository
    158. -
    159. - isInstantiable - - Check that an entity is instantiable
    160. -
    161. - isInterface - - Check if an entity is an Interface
    162. -
    163. - isInternal - - Checking if an entity has `internal` docBlock
    164. -
    165. - isSubclassOf - - Whether the given class is a subclass of the specified class
    166. -
    167. - isTrait - - Check if an entity is a Trait
    168. -
    169. - normalizeClassName - - Bring the class name to the standard format used in the system
    170. -
    171. - reloadEntityDependenciesCache - - Update entity dependency cache
    172. -
    173. - removeEntityValueFromCache -
    174. -
    175. - removeNotUsedEntityDataCache -
    176. -
    177. - setCustomAst -
    178. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function __construct(\BumbleDocGen\Core\Configuration\Configuration $configuration, \BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings $phpHandlerSettings, \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection $entitiesCollection, \BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper $parserHelper, \BumbleDocGen\LanguageHandler\Php\Parser\ComposerHelper $composerHelper, \BumbleDocGen\LanguageHandler\Php\Parser\PhpParser\PhpParserHelper $phpParserHelper, \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache $localObjectCache, \Psr\Log\LoggerInterface $logger, string $className, string|null $relativeFileName); -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $configuration\BumbleDocGen\Core\Configuration\Configuration-
    $phpHandlerSettings\BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings-
    $entitiesCollection\BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection-
    $parserHelper\BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper-
    $composerHelper\BumbleDocGen\LanguageHandler\Php\Parser\ComposerHelper-
    $phpParserHelper\BumbleDocGen\LanguageHandler\Php\Parser\PhpParser\PhpParserHelper-
    $localObjectCache\BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache-
    $logger\Psr\Log\LoggerInterface-
    $classNamestring-
    $relativeFileNamestring | null-
    - - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function addPluginData(string $pluginKey, mixed $data): void; -``` - -
    Add information to aт entity object
    - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $pluginKeystring-
    $datamixed-
    - -Return value: void - - -
    -
    -
    - -
      -
    • # - cursorToDocAttributeLinkFragment - :warning: Is internal | source code
    • -
    - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function cursorToDocAttributeLinkFragment(string $cursor, bool $isForDocument = true): string; -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $cursorstring-
    $isForDocumentbool-
    - -Return value: string - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getAbsoluteFileName(): null|string; -``` - -
    Returns the absolute path to a file if it can be retrieved and if the file is in the project directory
    - -Parameters: not specified - -Return value: null | string - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getAst(): \PhpParser\Node\Stmt\Class_|\PhpParser\Node\Stmt\Interface_|\PhpParser\Node\Stmt\Trait_|\PhpParser\Node\Stmt\Enum_; -``` - -
    Get AST for this entity
    - -Parameters: not specified - -Return value: \PhpParser\Node\Stmt\Class_ | \PhpParser\Node\Stmt\Interface_ | \PhpParser\Node\Stmt\Trait_ | \PhpParser\Node\Stmt\Enum_ - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait - -public function getCacheKey(): string; -``` - - - -Parameters: not specified - -Return value: string - - -
    -
    -
    - -
      -
    • # - getCachedEntityDependencies - :warning: Is internal | source code
    • -
    - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getCachedEntityDependencies(): array; -``` - - - -Parameters: not specified - -Return value: array - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getConstant(string $constantName, bool $unsafe = false): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity; -``` - -
    Get the method entity by its name
    - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $constantNamestringThe name of the constant whose entity you want to get
    $unsafeboolCheck all constants, not just the constants allowed in the configuration (@see PhpHandlerSettings::getClassConstantEntityFilter())
    - -Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getConstantEntitiesCollection(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntitiesCollection; -``` - -
    Get a collection of constant entities
    - -Parameters: not specified - -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntitiesCollection - - -Throws: - - - -See: - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getConstantValue(string $constantName): string|array|int|bool|null|float; -``` - -
    Get the compiled value of a constant
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $constantNamestringThe name of the constant for which you need to get the value
    - -Return value: string | array | int | bool | null | float - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getConstants(): array; -``` - -
    Get all constants that are available according to the configuration as an array
    - -Parameters: not specified - -Return value: array - - -Throws: - - - -See: - -
    -
    -
    - -
      -
    • # - getConstantsData - :warning: Is internal | source code
    • -
    - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getConstantsData(bool $onlyFromCurrentClassAndTraits = false, int $flags = \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity::VISIBILITY_MODIFIERS_FLAG_ANY): array; -``` - -
    Get a list of all constants and classes where they are implemented
    - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $onlyFromCurrentClassAndTraitsboolGet data only for constants from the current class
    $flagsintGet data only for constants corresponding to the visibility modifiers passed in this value
    - -Return value: array - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getConstantsValues(bool $onlyFromCurrentClassAndTraits = false, int $flags = \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\ClassConstant\ClassConstantEntity::VISIBILITY_MODIFIERS_FLAG_ANY): array; -``` - -
    Get class constant compiled values according to filters
    - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $onlyFromCurrentClassAndTraitsboolGet values only for constants from the current class
    $flagsintGet values only for constants corresponding to the visibility modifiers passed in this value
    - -Return value: array - - -Throws: - - -
    -
    -
    - -
      -
    • # - getCurrentRootEntity - :warning: Is internal | source code
    • -
    - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getCurrentRootEntity(): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; -``` - - - -Parameters: not specified - -Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getDescription(): string; -``` - -
    Get entity description
    - -Parameters: not specified - -Return value: string - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getDescriptionLinks(): array; -``` - -
    Get parsed links from description and doc blocks `see` and `link`
    - -Parameters: not specified - -Return value: array - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getDocBlock(): \phpDocumentor\Reflection\DocBlock; -``` - -
    Get DocBlock for current entity
    - -Parameters: not specified - -Return value: \phpDocumentor\Reflection\DocBlock - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getDocComment(): string; -``` - -
    Get the doc comment of an entity
    - -Parameters: not specified - -Return value: string - - -Throws: - - -
    -
    -
    - -
      -
    • # - getDocCommentEntity - :warning: Is internal | source code
    • -
    - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getDocCommentEntity(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; -``` - -
    Link to an entity where docBlock is implemented for this entity
    - -Parameters: not specified - -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getDocCommentLine(): null|int; -``` - -
    Get the code line number where the docBlock of the current entity begins
    - -Parameters: not specified - -Return value: null | int - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getDocNote(): string; -``` - -
    Get the note annotation value
    - -Parameters: not specified - -Return value: string - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getDocRender(): \BumbleDocGen\Core\Renderer\EntityDocRenderer\EntityDocRendererInterface; -``` - - - -Parameters: not specified - -Return value: \BumbleDocGen\Core\Renderer\EntityDocRenderer\EntityDocRendererInterface - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getEndLine(): int; -``` - -
    Get the line number of the end of a class code in a file
    - -Parameters: not specified - -Return value: int - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getEntityDependencies(): array; -``` - - - -Parameters: not specified - -Return value: array - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getExamples(): array; -``` - -
    Get parsed examples from `examples` doc block
    - -Parameters: not specified - -Return value: array - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getFileContent(): string; -``` - - - -Parameters: not specified - -Return value: string - - -Throws: - - -
    -
    -
    - -
      -
    • # - getFileSourceLink - :warning: Is internal | source code
    • -
    - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getFileSourceLink(bool $withLine = true): null|string; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $withLinebool-
    - -Return value: null | string - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getFirstExample(): string; -``` - -
    Get first example from `examples` doc block
    - -Parameters: not specified - -Return value: string - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getImplementingClass(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; -``` - -
    Get the class like entity in which the current entity was implemented
    - -Parameters: not specified - -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - - -
    -
    -
    - - - -```php -public function getInterfaceNames(): array; -``` - -
    Get a list of class interface names
    - -Parameters: not specified - -Return value: array - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getInterfacesEntities(): array; -``` - -
    Get a list of interface entities that the current class implements
    - -Parameters: not specified - -Return value: array - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getMethod(string $methodName, bool $unsafe = false): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntity; -``` - -
    Get the method entity by its name
    - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $methodNamestringThe name of the method whose entity you want to get
    $unsafeboolCheck all methods, not just the methods allowed in the configuration (@see PhpHandlerSettings::getMethodEntityFilter())
    - -Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntity - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getMethodEntitiesCollection(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntitiesCollection; -``` - -
    Get a collection of method entities
    - -Parameters: not specified - -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntitiesCollection - - -Throws: - - - -See: - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getMethods(): array; -``` - -
    Get all methods that are available according to the configuration as an array
    - -Parameters: not specified - -Return value: array - - -Throws: - - - -See: - -
    -
    -
    - -
      -
    • # - getMethodsData - :warning: Is internal | source code
    • -
    - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getMethodsData(bool $onlyFromCurrentClassAndTraits = false, int $flags = \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Method\MethodEntity::VISIBILITY_MODIFIERS_FLAG_ANY): array; -``` - -
    Get a list of all methods and classes where they are implemented
    - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $onlyFromCurrentClassAndTraitsboolGet data only for methods from the current class
    $flagsintGet data only for methods corresponding to the visibility modifiers passed in this value
    - -Return value: array - - -Throws: - - -
    -
    -
    - - - -```php -public function getModifiersString(): string; -``` - -
    Get entity modifiers as a string
    - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getName(): string; -``` - -
    Full name of the entity
    - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getNamespaceName(): string; -``` - -
    Get the entity namespace name
    - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getObjectId(): string; -``` - -
    Get entity unique ID
    - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getParentClass(): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity; -``` - -
    Get the entity of the parent class if it exists
    - -Parameters: not specified - -Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getParentClassEntities(): array; -``` - -
    Get a list of parent class entities
    - -Parameters: not specified - -Return value: array - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getParentClassName(): null|string; -``` - -
    Get the name of the parent class entity if it exists
    - -Parameters: not specified - -Return value: null | string - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getParentClassNames(): array; -``` - -
    Get a list of entity names of parent classes
    - -Parameters: not specified - -Return value: array - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getPluginData(string $pluginKey): mixed; -``` - -
    Get additional information added using the plugin
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $pluginKeystring-
    - -Return value: mixed - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getProperties(): array; -``` - -
    Get all properties that are available according to the configuration as an array
    - -Parameters: not specified - -Return value: array - - -Throws: - - - -See: - -
    -
    -
    - -
      -
    • # - getPropertiesData - :warning: Is internal | source code
    • -
    - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getPropertiesData(bool $onlyFromCurrentClassAndTraits = false, int $flags = \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntity::VISIBILITY_MODIFIERS_FLAG_ANY): array; -``` - -
    Get a list of all properties and classes where they are implemented
    - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $onlyFromCurrentClassAndTraitsboolGet data only for properties from the current class
    $flagsintGet data only for properties corresponding to the visibility modifiers passed in this value
    - -Return value: array - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getProperty(string $propertyName, bool $unsafe = false): null|\BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntity; -``` - -
    Get the property entity by its name
    - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $propertyNamestringThe name of the property whose entity you want to get
    $unsafeboolCheck all properties, not just the properties allowed in the configuration (@see PhpHandlerSettings::getPropertyEntityFilter())
    - -Return value: null | \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntity - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getPropertyDefaultValue(string $propertyName): string|array|int|bool|null|float; -``` - -
    Get the compiled value of a property
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $propertyNamestringThe name of the property for which you need to get the value
    - -Return value: string | array | int | bool | null | float - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getPropertyEntitiesCollection(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntitiesCollection; -``` - -
    Get a collection of property entities
    - -Parameters: not specified - -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\SubEntity\Property\PropertyEntitiesCollection - - -Throws: - - - -See: - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getRelativeFileName(): null|string; -``` - -
    File name relative to project_root configuration parameter
    - -Parameters: not specified - -Return value: null | string - - - -See: - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getRootEntityCollection(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection; -``` - -
    Get the collection of root entities to which this entity belongs
    - -Parameters: not specified - -Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\PhpEntitiesCollection - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getShortName(): string; -``` - -
    Short name of the entity
    - -Parameters: not specified - -Return value: string - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getStartLine(): int; -``` - -
    Get the line number of the start of a class code in a file
    - -Parameters: not specified - -Return value: int - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getThrows(): array; -``` - -
    Get parsed throws from `throws` doc block
    - -Parameters: not specified - -Return value: array - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function getThrowsDocBlockLinks(): array; -``` - - - -Parameters: not specified - -Return value: array - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getTraits(): array; -``` - -
    Get a list of trait entities of the current class
    - -Parameters: not specified - -Return value: array - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function getTraitsNames(): array; -``` - -
    Get a list of class traits names
    - -Parameters: not specified - -Return value: array - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function hasConstant(string $constantName, bool $unsafe = false): bool; -``` - -
    Check if a constant exists in a class
    - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $constantNamestringThe name of the class whose entity you want to check
    $unsafeboolCheck all constants, not just the constants allowed in the configuration (@see PhpHandlerSettings::getClassConstantEntityFilter())
    - -Return value: bool - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function hasDescriptionLinks(): bool; -``` - -
    Checking if an entity has links in its description
    - -Parameters: not specified - -Return value: bool - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function hasExamples(): bool; -``` - -
    Checking if an entity has `example` docBlock
    - -Parameters: not specified - -Return value: bool - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function hasMethod(string $methodName, bool $unsafe = false): bool; -``` - -
    Check if a method exists in a class
    - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $methodNamestringThe name of the method whose entity you want to check
    $unsafeboolCheck all methods, not just the methods allowed in the configuration (@see PhpHandlerSettings::getMethodEntityFilter())
    - -Return value: bool - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function hasParentClass(string $parentClassName): bool; -``` - -
    Check if a certain parent class exists in a chain of parent classes
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $parentClassNamestringSearched parent class
    - -Return value: bool - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function hasProperty(string $propertyName, bool $unsafe = false): bool; -``` - -
    Check if a property exists in a class
    - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $propertyNamestringThe name of the property whose entity you want to check
    $unsafeboolCheck all properties, not just the properties allowed in the configuration (@see PhpHandlerSettings::getPropertyEntityFilter())
    - -Return value: bool - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function hasThrows(): bool; -``` - -
    Checking if an entity has `throws` docBlock
    - -Parameters: not specified - -Return value: bool - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function hasTraits(): bool; -``` - -
    Check if the class contains traits
    - -Parameters: not specified - -Return value: bool - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function implementsInterface(string $interfaceName): bool; -``` - -
    Check if a class implements an interface
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $interfaceNamestringName of the required interface in the interface chain
    - -Return value: bool - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function isAbstract(): bool; -``` - -
    Check that an entity is abstract
    - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function isApi(): bool; -``` - -
    Checking if an entity has `api` docBlock
    - -Parameters: not specified - -Return value: bool - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function isClass(): bool; -``` - -
    Check if an entity is a Class
    - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function isClassLoad(): bool; -``` - - - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function isDeprecated(): bool; -``` - -
    Checking if an entity has `deprecated` docBlock
    - -Parameters: not specified - -Return value: bool - - -Throws: - - -
    -
    -
    - -
      -
    • # - isDocumentCreationAllowed - :warning: Is internal | source code
    • -
    - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function isDocumentCreationAllowed(): bool; -``` - - - -Parameters: not specified - -Return value: bool - - -Throws: - - -
    -
    -
    - -
      -
    • # - isEntityCacheOutdated - :warning: Is internal | source code
    • -
    - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function isEntityCacheOutdated(): bool; -``` - -
    Checking if the entity cache is out of date
    - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - -
      -
    • # - isEntityDataCacheOutdated - :warning: Is internal | source code
    • -
    - -```php -// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait - -public function isEntityDataCacheOutdated(): bool; -``` - - - -Parameters: not specified - -Return value: bool - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function isEntityDataCanBeLoaded(): bool; -``` - - - -Parameters: not specified - -Return value: bool - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function isEntityFileCanBeLoad(): bool; -``` - -
    Checking if entity data can be retrieved
    - -Parameters: not specified - -Return value: bool - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public static function isEntityNameValid(string $entityName): bool; -``` - -
    Check if the name is a valid name for ClassLikeEntity
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $entityNamestring-
    - -Return value: bool - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function isEnum(): bool; -``` - -
    Check if an entity is an Enum
    - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - -
      -
    • # - isExternalLibraryEntity - :warning: Is internal | source code
    • -
    - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function isExternalLibraryEntity(): bool; -``` - -
    Check if a given entity is an entity from a third party library (connected via composer)
    - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function isInGit(): bool; -``` - -
    Checking if class file is in git repository
    - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function isInstantiable(): bool; -``` - -
    Check that an entity is instantiable
    - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function isInterface(): bool; -``` - -
    Check if an entity is an Interface
    - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function isInternal(): bool; -``` - -
    Checking if an entity has `internal` docBlock
    - -Parameters: not specified - -Return value: bool - - -Throws: - - -
    -
    -
    - - - -```php -public function isSubclassOf(string $className): bool; -``` - -
    Whether the given class is a subclass of the specified class
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $classNamestring-
    - -Return value: bool - - -Throws: - - -
    -
    -
    - - - -```php -public function isTrait(): bool; -``` - -
    Check if an entity is a Trait
    - -Parameters: not specified - -Return value: bool - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public static function normalizeClassName(string $name): string; -``` - -
    Bring the class name to the standard format used in the system
    - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $namestring-
    - -Return value: string - - -
    -
    -
    - -
      -
    • # - reloadEntityDependenciesCache - :warning: Is internal | source code
    • -
    - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity - -public function reloadEntityDependenciesCache(): array; -``` - -
    Update entity dependency cache
    - -Parameters: not specified - -Return value: array - - -
    -
    -
    - -
      -
    • # - removeEntityValueFromCache - :warning: Is internal | source code
    • -
    - -```php -// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait - -public function removeEntityValueFromCache(string $key): void; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $keystring-
    - -Return value: void - - -
    -
    -
    - -
      -
    • # - removeNotUsedEntityDataCache - :warning: Is internal | source code
    • -
    - -```php -// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait - -public function removeNotUsedEntityDataCache(): void; -``` - - - -Parameters: not specified - -Return value: void - - -Throws: - - -
    -
    -
    - - - -```php -// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassLikeEntity - -public function setCustomAst(\PhpParser\Node\Stmt\Trait_|\PhpParser\Node\Stmt\Enum_|\PhpParser\Node\Stmt\Interface_|\PhpParser\Node\Stmt\Class_|null $customAst): void; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $customAst\PhpParser\Node\Stmt\Trait_ | \PhpParser\Node\Stmt\Enum_ | \PhpParser\Node\Stmt\Interface_ | \PhpParser\Node\Stmt\Class_ | null-
    - -Return value: void - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/classes/ValueResolverInterface.md b/docs/tech/classes/ValueResolverInterface.md deleted file mode 100644 index a76cafb4..00000000 --- a/docs/tech/classes/ValueResolverInterface.md +++ /dev/null @@ -1,86 +0,0 @@ - - BumbleDocGen / Technical description of the project / Class map / ValueResolverInterface
    - -

    - ValueResolverInterface class: -

    - - - - - -```php -namespace BumbleDocGen\Core\Configuration\ValueResolver; - -interface ValueResolverInterface -``` - -
    Class interface to resolve value from config file
    - - - - - - - -

    Methods:

    - -
      -
    1. - resolveValue -
    2. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public function resolveValue(\BumbleDocGen\Core\Configuration\ConfigurationParameterBag $parameterBag, mixed $value): mixed; -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $parameterBag\BumbleDocGen\Core\Configuration\ConfigurationParameterBag-
    $valuemixed-
    - -Return value: mixed - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/classes/ValueToClassTransformer.md b/docs/tech/classes/ValueToClassTransformer.md deleted file mode 100644 index f2a4508c..00000000 --- a/docs/tech/classes/ValueToClassTransformer.md +++ /dev/null @@ -1,204 +0,0 @@ - - BumbleDocGen / Technical description of the project / Class map / ValueToClassTransformer
    - -

    - ValueToClassTransformer class: -

    - - - - - -```php -namespace BumbleDocGen\Core\Configuration\ValueTransformer; - -final class ValueToClassTransformer implements \BumbleDocGen\Core\Configuration\ValueTransformer\ValueTransformerInterface -``` - -
    Standard text-to-class transformer
    - - -Examples of using: - -```php -# The list of class names will be converted to an array of objects -someKey: - - class: \Namespace\ClassName - - class: \Namespace\ClassName2 - -``` - -```php -# One class in configuration will be converted to one object -someKey: - class: \Namespace\ClassName - -``` - -```php -# One class in configuration will be converted to one object. The constructor takes arguments to be passed (not via DI) -someKey: - class: \Namespace\ClassName - arguments: - - arg1: value1 - - arg2: value2 - -``` - - - - - - -

    Initialization methods:

    - -
      -
    1. - __construct -
    2. -
    - -

    Methods:

    - -
      -
    1. - canTransform -
    2. -
    3. - transform -
    4. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public function __construct(\DI\Container $diContainer); -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $diContainer\DI\Container-
    - - - -
    -
    -
    - - - -```php -public function canTransform(mixed $value): bool; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $valuemixed-
    - -Return value: bool - - -
    -
    -
    - - - -```php -public function transform(mixed $value): null|object; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $valuemixed-
    - -Return value: null | object - - -Throws: - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/classes/ValueTransformerInterface.md b/docs/tech/classes/ValueTransformerInterface.md deleted file mode 100644 index 4c6575d8..00000000 --- a/docs/tech/classes/ValueTransformerInterface.md +++ /dev/null @@ -1,122 +0,0 @@ - - BumbleDocGen / Technical description of the project / Class map / ValueTransformerInterface
    - -

    - ValueTransformerInterface class: -

    - - - - - -```php -namespace BumbleDocGen\Core\Configuration\ValueTransformer; - -interface ValueTransformerInterface -``` - -
    Interface defining classes that transform text configuration values into objects
    - - - - - - - -

    Methods:

    - -
      -
    1. - canTransform -
    2. -
    3. - transform -
    4. -
    - - - - - - - -

    Method details:

    - -
    - - - -```php -public function canTransform(mixed $value): bool; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $valuemixed-
    - -Return value: bool - - -
    -
    -
    - - - -```php -public function transform(mixed $value): mixed; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $valuemixed-
    - -Return value: mixed - - -
    -
    - - \ No newline at end of file diff --git a/docs/tech/classes/VisibilityConditionModifier.md b/docs/tech/classes/VisibilityConditionModifier.md deleted file mode 100644 index 7d959cab..00000000 --- a/docs/tech/classes/VisibilityConditionModifier.md +++ /dev/null @@ -1,53 +0,0 @@ - - BumbleDocGen / Technical description of the project / Class map / VisibilityConditionModifier
    - -

    - VisibilityConditionModifier class: -

    - - - - - -```php -namespace BumbleDocGen\LanguageHandler\Php\Parser\FilterCondition\ClassFilterCondition; - -final class VisibilityConditionModifier -``` - - - - - - - - - - - -

    Constants:

    - - - - - - - - \ No newline at end of file diff --git a/docs/tech/map.md b/docs/tech/map.md deleted file mode 100644 index 52c6e911..00000000 --- a/docs/tech/map.md +++ /dev/null @@ -1,272 +0,0 @@ - BumbleDocGen / Technical description of the project / Class map
    - -Directory layout ( only documented files shown ): - -
    └──src/
    -│  ├──AI/
    -│  │  ├──Console/
    -│  │  │  ├── AddDocBlocksCommand.php 
    -│  │  │  └── GenerateReadMeTemplateCommand.php 
    -│  │  ├──Generators/
    -│  │  │  ├── DocBlocksGenerator.php 
    -│  │  │  └── ReadmeTemplateGenerator.php 
    -│  │  ├──Providers/
    -│  │  │  └──OpenAI/
    -│  │  │  │  └── Provider.php 
    -│  │  ├──Traits/
    -│  │  │  └── SharedCommandLogicTrait.php 
    -│  │  ├── ProviderFactory.php 
    -│  │  └── ProviderInterface.php 
    -│  ├──Console/
    -│  │  ├──Command/
    -│  │  │  ├── AdditionalCommandCollection.php 
    -│  │  │  ├── BaseCommand.php 
    -│  │  │  ├── ConfigurationCommand.php 
    -│  │  │  └── GenerateCommand.php 
    -│  │  ├──ProgressBar/
    -│  │  │  ├── ProgressBarFactory.php 
    -│  │  │  └── StylizedProgressBar.php 
    -│  │  └── App.php 
    -│  ├──Core/
    -│  │  ├──Cache/
    -│  │  │  ├──LocalCache/
    -│  │  │  │  ├──Exception/
    -│  │  │  │  │  └── ObjectNotFoundException.php 
    -│  │  │  │  └── LocalObjectCache.php 
    -│  │  │  ├── EntityCacheItemPool.php 
    -│  │  │  └── SharedCompressedDocumentFileCache.php 
    -│  │  ├──Configuration/
    -│  │  │  ├──Exception/
    -│  │  │  │  └── InvalidConfigurationParameterException.php 
    -│  │  │  ├──ValueResolver/
    -│  │  │  │  ├── ArgvValueResolver.php We supplement the values by replacing the shortcodes with real values by the arguments passed to ...
    -│  │  │  │  ├── InternalValueResolver.php We supplement the values by replacing the shortcodes with real values by internalValuesMap
    -│  │  │  │  ├── RefValueResolver.php We supplement the values by replacing the shortcodes with real values by the configuration key
    -│  │  │  │  └── ValueResolverInterface.php Class interface to resolve value from config file
    -│  │  │  ├──ValueTransformer/
    -│  │  │  │  ├── ValueToClassTransformer.php Standard text-to-class transformer
    -│  │  │  │  └── ValueTransformerInterface.php Interface defining classes that transform text configuration values into objects
    -│  │  │  ├── Configuration.php Configuration project documentation
    -│  │  │  ├── ConfigurationKey.php 
    -│  │  │  ├── ConfigurationParameterBag.php Wrapper for getting raw configuration file data
    -│  │  │  └── ReflectionApiConfig.php 
    -│  │  ├──Logger/
    -│  │  │  └──Handler/
    -│  │  │  │  └── GenerationErrorsHandler.php 
    -│  │  ├──Parser/
    -│  │  │  ├──Entity/
    -│  │  │  │  ├──Cache/
    -│  │  │  │  │  ├──CacheKey/
    -│  │  │  │  │  │  ├── CacheKeyGeneratorInterface.php 
    -│  │  │  │  │  │  ├── DefaultCacheKeyGenerator.php 
    -│  │  │  │  │  │  └── RendererContextCacheKeyGenerator.php 
    -│  │  │  │  │  ├── CacheableEntityInterface.php 
    -│  │  │  │  │  ├── CacheableEntityTrait.php 
    -│  │  │  │  │  ├── CacheableEntityWrapperFactory.php 
    -│  │  │  │  │  ├── CacheableEntityWrapperTrait.php 
    -│  │  │  │  │  ├── CacheableMethod.php 
    -│  │  │  │  │  └── EntityCacheStorageHelper.php 
    -│  │  │  │  ├──CollectionLogOperation/
    -│  │  │  │  │  ├── CloneOperation.php 
    -│  │  │  │  │  ├── IterateEntitiesOperation.php 
    -│  │  │  │  │  ├── OperationInterface.php 
    -│  │  │  │  │  ├── OperationsCollection.php 
    -│  │  │  │  │  └── SingleEntitySearchOperation.php 
    -│  │  │  │  ├── BaseEntityCollection.php 
    -│  │  │  │  ├── CollectionGroupLoadEntitiesResult.php 
    -│  │  │  │  ├── CollectionLoadEntitiesResult.php 
    -│  │  │  │  ├── EntitiesLoaderProgressBarInterface.php 
    -│  │  │  │  ├── EntityInterface.php 
    -│  │  │  │  ├── LoggableRootEntityCollection.php 
    -│  │  │  │  ├── RootEntityCollection.php 
    -│  │  │  │  ├── RootEntityCollectionsGroup.php 
    -│  │  │  │  └── RootEntityInterface.php Since the documentation generator supports several programming languages, their entities need to ...
    -│  │  │  ├──FilterCondition/
    -│  │  │  │  ├──CommonFilterCondition/
    -│  │  │  │  │  ├── FalseCondition.php False conditions, any object is not available
    -│  │  │  │  │  ├── FileTextContainsCondition.php Checking if a file contains a substring
    -│  │  │  │  │  ├── LocatedInCondition.php Checking the existence of an entity in the specified directories
    -│  │  │  │  │  ├── LocatedNotInCondition.php Checking the existence of an entity not in the specified directories
    -│  │  │  │  │  └── TrueCondition.php True conditions, any object is available
    -│  │  │  │  ├── ConditionGroup.php Filter condition to group other filter conditions. A group can have an OR/AND condition test; In ...
    -│  │  │  │  ├── ConditionGroupTypeEnum.php 
    -│  │  │  │  └── ConditionInterface.php 
    -│  │  │  ├──SourceLocator/
    -│  │  │  │  ├── BaseSourceLocator.php 
    -│  │  │  │  ├── DirectoriesSourceLocator.php Loads all files from the specified directory
    -│  │  │  │  ├── FileIteratorSourceLocator.php Loads all files using an iterator
    -│  │  │  │  ├── RecursiveDirectoriesSourceLocator.php Loads all files from the specified directories, which are traversed recursively
    -│  │  │  │  ├── SingleFileSourceLocator.php Loads one specific file by its path
    -│  │  │  │  ├── SourceLocatorInterface.php 
    -│  │  │  │  └── SourceLocatorsCollection.php 
    -│  │  │  └── ProjectParser.php Entity for project parsing using source locators
    -│  │  ├──Plugin/
    -│  │  │  ├──CorePlugin/
    -│  │  │  │  ├──LastPageCommitter/
    -│  │  │  │  │  └── LastPageCommitter.php Plugin for adding a block with information about the last commit and date of page update to the g...
    -│  │  │  │  └──PageLinker/
    -│  │  │  │  │  ├── BasePageLinker.php 
    -│  │  │  │  │  ├── PageHtmlLinkerPlugin.php Adds URLs to empty links in HTML format; Links may contain: 1) Short entity name 2) Full entity n...
    -│  │  │  │  │  ├── PageLinkerPlugin.php Adds URLs to empty links in HTML format; Links may contain: 1) Short entity name 2) Full entity n...
    -│  │  │  │  │  └── PageRstLinkerPlugin.php Adds URLs to empty links in rst format; Links may contain: 1) Short entity name 2) Full entity na...
    -│  │  │  ├──Event/
    -│  │  │  │  ├──Parser/
    -│  │  │  │  │  └── BeforeParsingProcess.php 
    -│  │  │  │  └──Renderer/
    -│  │  │  │  │  ├── AfterRenderingEntities.php 
    -│  │  │  │  │  ├── BeforeCreatingDocFile.php Called before the content of the documentation document is saved to a file
    -│  │  │  │  │  ├── BeforeRenderingDocFiles.php The event occurs before the main documents begin rendering
    -│  │  │  │  │  ├── BeforeRenderingEntities.php The event occurs before the rendering of entity documents begins, after the main documents have b...
    -│  │  │  │  │  ├── OnCreateDocumentedEntityWrapper.php The event occurs when an entity is added to the list for documentation
    -│  │  │  │  │  ├── OnGetProjectTemplatesDirs.php This event occurs when all directories containing document templates are retrieved
    -│  │  │  │  │  ├── OnGetTemplatePathByRelativeDocPath.php The event occurs when the path to the template file is obtained relative to the path to the document
    -│  │  │  │  │  ├── OnGettingResourceLink.php Event occurs when a reference to an entity (resource) is received
    -│  │  │  │  │  └── OnLoadEntityDocPluginContent.php Called when entity documentation is generated (plugin content loading)
    -│  │  │  ├── OnlySingleExecutionEvent.php 
    -│  │  │  ├── PluginEventDispatcher.php 
    -│  │  │  ├── PluginInterface.php 
    -│  │  │  └── PluginsCollection.php 
    -│  │  └──Renderer/
    -│  │  │  ├──Breadcrumbs/
    -│  │  │  │  ├── BreadcrumbsHelper.php Helper entity for working with breadcrumbs
    -│  │  │  │  └── BreadcrumbsTwigEnvironment.php 
    -│  │  │  ├──Context/
    -│  │  │  │  ├──Dependency/
    -│  │  │  │  │  ├── DirectoryDependency.php 
    -│  │  │  │  │  ├── FileDependency.php 
    -│  │  │  │  │  ├── RendererDependencyFactory.php 
    -│  │  │  │  │  └── RendererDependencyInterface.php 
    -│  │  │  │  ├── DocumentTransformableEntityInterface.php Interface for entities that can be generated into documents
    -│  │  │  │  ├── DocumentedEntityWrapper.php Wrapper for the entity that was requested for documentation
    -│  │  │  │  ├── DocumentedEntityWrappersCollection.php 
    -│  │  │  │  └── RendererContext.php Document rendering context
    -│  │  │  ├──EntityDocRenderer/
    -│  │  │  │  ├── EntityDocRendererInterface.php Entity documentation renderer interface
    -│  │  │  │  └── EntityDocRenderersCollection.php 
    -│  │  │  ├──PageLinkProcessor/
    -│  │  │  │  ├── BasePageLinkProcessor.php 
    -│  │  │  │  ├── GithubPagesLinkProcessor.php 
    -│  │  │  │  └── PageLinkProcessorInterface.php 
    -│  │  │  ├──Twig/
    -│  │  │  │  ├──Filter/
    -│  │  │  │  │  ├── AddIndentFromLeft.php Filter adds indent from left
    -│  │  │  │  │  ├── CustomFilterInterface.php 
    -│  │  │  │  │  ├── CustomFiltersCollection.php 
    -│  │  │  │  │  ├── FixStrSize.php The filter pads the string with the specified characters on the right to the specified size
    -│  │  │  │  │  ├── Implode.php Join array elements with a string
    -│  │  │  │  │  ├── PregMatch.php Perform a regular expression match
    -│  │  │  │  │  ├── PrepareSourceLink.php The filter converts the string into an anchor that can be used in a GitHub document link
    -│  │  │  │  │  ├── Quotemeta.php Quote meta characters
    -│  │  │  │  │  ├── RemoveLineBrakes.php The filter replaces all line breaks with a space
    -│  │  │  │  │  ├── StrTypeToUrl.php The filter converts the string with the data type into a link to the documented entity, if possible.
    -│  │  │  │  │  ├── TextToCodeBlock.php Convert text to code block
    -│  │  │  │  │  └── TextToHeading.php Convert text to html header
    -│  │  │  │  ├──Function/
    -│  │  │  │  │  ├── CustomFunctionInterface.php 
    -│  │  │  │  │  ├── CustomFunctionsCollection.php 
    -│  │  │  │  │  ├── DrawDocumentationMenu.php Generate documentation menu in HTML format. To generate the menu, the start page is taken, and al...
    -│  │  │  │  │  ├── DrawDocumentedEntityLink.php Creates an entity link by object
    -│  │  │  │  │  ├── FileGetContents.php Displaying the content of a file or web resource
    -│  │  │  │  │  ├── GeneratePageBreadcrumbs.php Function to generate breadcrumbs on the page
    -│  │  │  │  │  ├── GetDocumentationPageUrl.php Creates an entity link by object
    -│  │  │  │  │  ├── GetDocumentedEntityUrl.php Get the URL of a documented entity by its name. If the entity is found, next to the file where th...
    -│  │  │  │  │  ├── LoadPluginsContent.php Process entity template blocks with plugins. The method returns the content processed by plugins.
    -│  │  │  │  │  └── PrintEntityCollectionAsList.php Outputting entity data as HTML list
    -│  │  │  │  ├── FrontMatterLoader.php 
    -│  │  │  │  ├── MainExtension.php This is an extension that is used to generate documents from templates
    -│  │  │  │  └── MainTwigEnvironment.php 
    -│  │  │  ├── Renderer.php Generates and processes files from directory TemplatesDir saving them to directory OutputDir
    -│  │  │  ├── RendererHelper.php 
    -│  │  │  ├── RendererIteratorFactory.php 
    -│  │  │  └── TemplateFile.php 
    -│  ├──LanguageHandler/
    -│  │  ├──Php/
    -│  │  │  ├──Parser/
    -│  │  │  │  ├──Entity/
    -│  │  │  │  │  ├──Cache/
    -│  │  │  │  │  │  └── CacheablePhpEntityFactory.php 
    -│  │  │  │  │  ├──Data/
    -│  │  │  │  │  │  └── DocBlockLink.php 
    -│  │  │  │  │  ├──SubEntity/
    -│  │  │  │  │  │  ├──ClassConstant/
    -│  │  │  │  │  │  │  ├── ClassConstantEntitiesCollection.php 
    -│  │  │  │  │  │  │  └── ClassConstantEntity.php Class constant entity
    -│  │  │  │  │  │  ├──Method/
    -│  │  │  │  │  │  │  ├── DynamicMethodEntity.php Method obtained by parsing the "method" annotation
    -│  │  │  │  │  │  │  ├── MethodEntitiesCollection.php Collection of PHP class method entities
    -│  │  │  │  │  │  │  ├── MethodEntity.php Class method entity
    -│  │  │  │  │  │  │  └── MethodEntityInterface.php 
    -│  │  │  │  │  │  └──Property/
    -│  │  │  │  │  │  │  ├── PropertyEntitiesCollection.php 
    -│  │  │  │  │  │  │  └── PropertyEntity.php Class property entity
    -│  │  │  │  │  ├── BaseEntity.php 
    -│  │  │  │  │  ├── ClassEntity.php PHP Class
    -│  │  │  │  │  ├── ClassLikeEntity.php 
    -│  │  │  │  │  ├── EnumEntity.php Enumeration
    -│  │  │  │  │  ├── InterfaceEntity.php Object interface
    -│  │  │  │  │  ├── PhpEntitiesCollection.php Collection of php root entities
    -│  │  │  │  │  └── TraitEntity.php Trait
    -│  │  │  │  ├──FilterCondition/
    -│  │  │  │  │  ├──ClassConstantFilterCondition/
    -│  │  │  │  │  │  ├── IsPrivateCondition.php Check is a private constant or not
    -│  │  │  │  │  │  ├── IsProtectedCondition.php Check is a protected constant or not
    -│  │  │  │  │  │  ├── IsPublicCondition.php Check is a public constant or not
    -│  │  │  │  │  │  └── VisibilityCondition.php Constant access modifier check
    -│  │  │  │  │  ├──ClassFilterCondition/
    -│  │  │  │  │  │  └── VisibilityConditionModifier.php 
    -│  │  │  │  │  ├──MethodFilterCondition/
    -│  │  │  │  │  │  ├── IsPrivateCondition.php Check is a private method or not
    -│  │  │  │  │  │  ├── IsProtectedCondition.php Check is a protected method or not
    -│  │  │  │  │  │  ├── IsPublicCondition.php Check is a public method or not
    -│  │  │  │  │  │  ├── OnlyFromCurrentClassCondition.php Only methods that belong to the current class (not parent)
    -│  │  │  │  │  │  └── VisibilityCondition.php Method access modifier check
    -│  │  │  │  │  └──PropertyFilterCondition/
    -│  │  │  │  │  │  ├── IsPrivateCondition.php Check is a private property or not
    -│  │  │  │  │  │  ├── IsProtectedCondition.php Check is a protected property or not
    -│  │  │  │  │  │  ├── IsPublicCondition.php Check is a public property or not
    -│  │  │  │  │  │  ├── OnlyFromCurrentClassCondition.php Only properties that belong to the current class (not parent)
    -│  │  │  │  │  │  └── VisibilityCondition.php Property access modifier check
    -│  │  │  │  ├──PhpParser/
    -│  │  │  │  │  ├── NodeValueCompiler.php 
    -│  │  │  │  │  └── PhpParserHelper.php 
    -│  │  │  │  ├── ComposerHelper.php 
    -│  │  │  │  └── ParserHelper.php 
    -│  │  │  ├──Plugin/
    -│  │  │  │  ├──CorePlugin/
    -│  │  │  │  │  ├──BasePhpStubber/
    -│  │  │  │  │  │  ├── BasePhpStubberPlugin.php Adding links to type documentation and documentation of built-in PHP classes
    -│  │  │  │  │  │  ├── PhpDocumentorStubberPlugin.php Adding links to the documentation of PHP classes in the \phpDocumentor namespace
    -│  │  │  │  │  │  └── PhpUnitStubberPlugin.php Adding links to the documentation of PHP classes in the \PHPUnit namespace
    -│  │  │  │  │  ├──ComposerPackagesStubber/
    -│  │  │  │  │  │  └── StubberPlugin.php The plugin allows you to automatically provide links to github repositories for documented classe...
    -│  │  │  │  │  └──EntityDocUnifiedPlace/
    -│  │  │  │  │  │  └── EntityDocUnifiedPlacePlugin.php This plugin changes the algorithm for saving entity documents. The standard system stores each fi...
    -│  │  │  │  └──Event/
    -│  │  │  │  │  ├──Entity/
    -│  │  │  │  │  │  └── OnCheckIsEntityCanBeLoaded.php 
    -│  │  │  │  │  └──Parser/
    -│  │  │  │  │  │  ├── AfterLoadingPhpEntitiesCollection.php The event is called after the initial creation of a collection of PHP entities
    -│  │  │  │  │  │  └── OnAddClassEntityToCollection.php Called when each class entity is added to the entity collection
    -│  │  │  ├──Renderer/
    -│  │  │  │  ├──EntityDocRenderer/
    -│  │  │  │  │  ├──PhpClassToMd/
    -│  │  │  │  │  │  ├── PhpClassRendererTwigEnvironment.php 
    -│  │  │  │  │  │  └── PhpClassToMdDocRenderer.php Rendering PHP classes into md format documents (for display on GitHub)
    -│  │  │  │  │  └── EntityDocRendererHelper.php 
    -│  │  │  │  └──Twig/
    -│  │  │  │  │  └──Function/
    -│  │  │  │  │  │  ├── DisplayClassApiMethods.php Display all API methods of a class
    -│  │  │  │  │  │  ├── DrawClassMap.php Generate class map in HTML format
    -│  │  │  │  │  │  └── GetClassMethodsBodyCode.php Get the code of the specified class methods as a formatted string
    -│  │  │  ├── PhpHandler.php 
    -│  │  │  ├── PhpHandlerSettings.php 
    -│  │  │  └── PhpReflectionApiConfig.php 
    -│  │  ├── LanguageHandlerInterface.php 
    -│  │  └── LanguageHandlersCollection.php 
    -│  ├── DocGenerator.php Class for generating documentation.
    -│  └── DocGeneratorFactory.php 
    -
    - -
    -
    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Dec 23 23:00:37 2023 +0300
    Page content update date: Sat Dec 23 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file diff --git a/docs/tech/readme.md b/docs/tech/readme.md index ff224193..01d73598 100644 --- a/docs/tech/readme.md +++ b/docs/tech/readme.md @@ -6,7 +6,7 @@ This documentation generator is a library that allows you to create handwritten

    Documentation sections

    - +

    How it works

    @@ -44,4 +44,4 @@ After that, the process of parsing the project code according to the configurati

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Dec 23 23:00:37 2023 +0300
    Page content update date: Sat Dec 23 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Dec 23 23:00:37 2023 +0300
    Page content update date: Thu Jan 11 2024
    Made with Bumble Documentation Generator \ No newline at end of file From 0b60d623f57b017b805bc01e505203e8c257541f Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Thu, 11 Jan 2024 16:01:07 +0300 Subject: [PATCH 188/210] Adding page about doc debugging --- selfdoc/templates/assets/error_example.png | Bin 0 -> 56515 bytes selfdoc/templates/tech/06_debugging.md.twig | 24 ++++++++++++++++++++ 2 files changed, 24 insertions(+) create mode 100644 selfdoc/templates/assets/error_example.png create mode 100644 selfdoc/templates/tech/06_debugging.md.twig diff --git a/selfdoc/templates/assets/error_example.png b/selfdoc/templates/assets/error_example.png new file mode 100644 index 0000000000000000000000000000000000000000..c070254f75933f1566fd02d82fe26e1edb2317da GIT binary patch literal 56515 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 literal 0 HcmV?d00001 diff --git a/selfdoc/templates/tech/06_debugging.md.twig b/selfdoc/templates/tech/06_debugging.md.twig new file mode 100644 index 00000000..c7894ad4 --- /dev/null +++ b/selfdoc/templates/tech/06_debugging.md.twig @@ -0,0 +1,24 @@ +--- +title: Debugging +prevPage: Technical description of the project +--- +{{ generatePageBreadcrumbs(title, _self) }} + +{{ "Debugging documentation" | textToHeading('H1') }} + +Our tool provides several options for debugging documentation. + +1) Firstly, after each generation of documents, you can make sure that the linking of documents was normal and no problems arose: after completing the documentation generation process, we display a list of all errors that occurred in the console: + + **Here is an example of error output:** + + + +2) To track exactly how documentation is generated, you can use the interactive mode: + + `bin/bumbleDocGen serve` - So that the generated documentation changes automatically with changes in templates + + **or** + + `bin/bumbleDocGen serve --as-html` - So that the generated documentation changes automatically with changes in templates and is displayed as HTML on the local development server +3) Logs are saved to a special file `last_run.log` which is located in the working directory From a218e5838b72abfb8a750f0328a62c4970c3afd0 Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Thu, 11 Jan 2024 20:18:48 +0300 Subject: [PATCH 189/210] Adding method to clear all local cache --- src/Core/Cache/LocalCache/LocalObjectCache.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/Core/Cache/LocalCache/LocalObjectCache.php b/src/Core/Cache/LocalCache/LocalObjectCache.php index 17f76888..040b2543 100644 --- a/src/Core/Cache/LocalCache/LocalObjectCache.php +++ b/src/Core/Cache/LocalCache/LocalObjectCache.php @@ -25,4 +25,9 @@ public function getMethodCachedResult(string $methodKey, string $objectId): mixe } return $this->cache[$methodKey][$objectId]; } + + public function clear(): void + { + $this->cache = []; + } } From e98d6396352c80b6e6ed988826c20f196fd46734 Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Thu, 11 Jan 2024 20:19:31 +0300 Subject: [PATCH 190/210] Fix for potential wrapper override bug --- .../Entity/Cache/CacheableEntityWrapperFactory.php | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/Core/Parser/Entity/Cache/CacheableEntityWrapperFactory.php b/src/Core/Parser/Entity/Cache/CacheableEntityWrapperFactory.php index ac3c12ad..29491b54 100644 --- a/src/Core/Parser/Entity/Cache/CacheableEntityWrapperFactory.php +++ b/src/Core/Parser/Entity/Cache/CacheableEntityWrapperFactory.php @@ -11,7 +11,7 @@ final class CacheableEntityWrapperFactory { public function __construct( - private LocalObjectCache $localObjectCache + private readonly LocalObjectCache $localObjectCache ) { } @@ -23,6 +23,12 @@ public function createWrappedEntityClass(string $className, string $wrapperName) } $namespaceName = 'BumbleDocGen\\Core\\Parser\\Entity\\Cache'; + $entityWrapperClassName = "{$namespaceName}\\$wrapperName"; + + if (class_exists($entityWrapperClassName)) { + $this->localObjectCache->cacheMethodResult(__METHOD__, $wrapperName, $entityWrapperClassName); + return $entityWrapperClassName; + } $namespace = new \Nette\PhpGenerator\PhpNamespace($namespaceName); $class = $namespace->addClass($wrapperName); @@ -66,7 +72,6 @@ public function createWrappedEntityClass(string $className, string $wrapperName) } eval((string)$namespace); - $entityWrapperClassName = "{$namespaceName}\\$wrapperName"; $this->localObjectCache->cacheMethodResult(__METHOD__, $wrapperName, $entityWrapperClassName); return $entityWrapperClassName; } From 857ec9d55aa8a8f1ef2f5353d70cb5f2731437a6 Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Thu, 11 Jan 2024 20:28:13 +0300 Subject: [PATCH 191/210] Changing the live documentation generation system --- src/Console/Command/ServeCommand.php | 65 +++++++++++++++---- .../Breadcrumbs/BreadcrumbsHelper.php | 2 +- src/Core/Renderer/Renderer.php | 8 +-- .../Renderer/Twig/MainTwigEnvironment.php | 31 ++++----- src/DocGenerator.php | 20 ++++-- 5 files changed, 78 insertions(+), 48 deletions(-) diff --git a/src/Console/Command/ServeCommand.php b/src/Console/Command/ServeCommand.php index da6a819f..77603660 100644 --- a/src/Console/Command/ServeCommand.php +++ b/src/Console/Command/ServeCommand.php @@ -13,7 +13,9 @@ use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Output\OutputInterface; use Symfony\Component\Filesystem\Filesystem; +use Symfony\Component\Process\PhpExecutableFinder; use Symfony\Component\Process\Process; +use Todaymade\Daux\ConfigBuilder; final class ServeCommand extends BaseCommand { @@ -61,37 +63,72 @@ protected function execute( ): void { $asHtml = $input->getOption('as-html'); if ($asHtml) { - $tmpDir = sys_get_temp_dir() . '/~bumbleDocGen'; - $process = new Process([ - PHP_BINARY, - dirname(__DIR__, 3) . DIRECTORY_SEPARATOR . 'vendor/bin/daux', - 'serve', - "--source={$tmpDir}" - ]); - $process->setTimeout(3600); - $process->disableOutput(); + $tmpDir = sys_get_temp_dir(); + $tmpDocDir = "{$tmpDir}/~bumbleDocGen"; + if (!is_dir($tmpDocDir)) { + mkdir($tmpDocDir); + } + $host = $input->getOption('dev-server-host'); + $port = $input->getOption('dev-server-port'); + $process = $this->createDauxProcess($tmpDir, $tmpDocDir, $input, $output); try { $filesystem = new Filesystem(); - $filesystem->remove($tmpDir); + $filesystem->remove($tmpDocDir); $docGen = $this->createDocGenInstance($input, $output, [ - 'output_dir' => $tmpDir, + 'output_dir' => $tmpDocDir, 'render_with_front_matter' => true ]); $docGen->addPlugin(Daux::class); - $host = $input->getOption('dev-server-host'); - $port = $input->getOption('dev-server-port'); $docGen->serve(function () use ($process, $output, $host, $port) { $process->start(); $output->writeln("Development server started on: http://{$host}:{$port}/"); + }, function () use (&$process, $tmpDir, $tmpDocDir, $input, $output) { + $process->stop(0, 9); + $process = $this->createDauxProcess($tmpDir, $tmpDocDir, $input, $output); + $process->restart(); }); } finally { - $process->signal(9); + $process->stop(0, 9); } } else { $docGen = $this->createDocGenInstance($input, $output); $docGen->serve(); } } + + private function createDauxProcess( + string $tmpConfigDir, + string $tmpDocDir, + InputInterface $input, + OutputInterface $output + ): Process { + $builder = ConfigBuilder::withMode(\Todaymade\Daux\Daux::LIVE_MODE); + $builder->withFormat('html'); + $builder->withDocumentationDirectory($tmpDocDir); + $builder->withCache(false); + $daux = new \Todaymade\Daux\Daux($builder->build(), $output); + + $path = "{$tmpConfigDir}/bumbleDocGenDaux.config"; + file_put_contents($path, serialize($daux->getConfig())); + + $host = $input->getOption('dev-server-host'); + $port = $input->getOption('dev-server-port'); + $binary = escapeshellarg((new PhpExecutableFinder())->find(false)); + + $script = << $path, + 'DAUX_VERBOSITY' => $output->getVerbosity() + ]); + $process->setTimeout(3600); + $process->disableOutput(); + return $process; + } } diff --git a/src/Core/Renderer/Breadcrumbs/BreadcrumbsHelper.php b/src/Core/Renderer/Breadcrumbs/BreadcrumbsHelper.php index 46d8f578..83059873 100644 --- a/src/Core/Renderer/Breadcrumbs/BreadcrumbsHelper.php +++ b/src/Core/Renderer/Breadcrumbs/BreadcrumbsHelper.php @@ -270,7 +270,7 @@ public function getAllPageLinks(): array foreach ($finder->files() as $file) { $filePatch = str_replace($templatesDirs, '', $file->getRealPath()); - if (!str_ends_with($filePatch, '.twig') || str_contains($filePatch, DIRECTORY_SEPARATOR . MainTwigEnvironment::TMP_TEMPLATE_PREFIX)) { + if (!str_ends_with($filePatch, '.twig')) { continue; } diff --git a/src/Core/Renderer/Renderer.php b/src/Core/Renderer/Renderer.php index d38b9f8d..ea4607bd 100644 --- a/src/Core/Renderer/Renderer.php +++ b/src/Core/Renderer/Renderer.php @@ -48,19 +48,15 @@ public function __construct( /** * Starting the rendering process * - * @param bool $enableDynamicTemplatesMode Less productive mode, which is necessary to avoid caching twig templates within one script run - * * @throws InvalidArgumentException * @throws RuntimeError * @throws LoaderError * @throws SyntaxError * @throws InvalidConfigurationParameterException */ - public function run(bool $enableDynamicTemplatesMode = false): void + public function run(): void { - if ($enableDynamicTemplatesMode) { - $this->twig->enableDynamicTemplatesMode(); - } + $this->twig->reloadTemplates(); $outputDir = $this->configuration->getOutputDir(); $templateParams = []; diff --git a/src/Core/Renderer/Twig/MainTwigEnvironment.php b/src/Core/Renderer/Twig/MainTwigEnvironment.php index ee98fb35..e691f8f9 100644 --- a/src/Core/Renderer/Twig/MainTwigEnvironment.php +++ b/src/Core/Renderer/Twig/MainTwigEnvironment.php @@ -9,7 +9,6 @@ use BumbleDocGen\Core\Plugin\Event\Renderer\OnGetProjectTemplatesDirs; use BumbleDocGen\Core\Plugin\PluginEventDispatcher; use BumbleDocGen\Core\Renderer\Breadcrumbs\BreadcrumbsHelper; -use BumbleDocGen\Core\Renderer\TemplateFile; use Twig\Environment; use Twig\Error\LoaderError; use Twig\Error\RuntimeError; @@ -22,7 +21,8 @@ final class MainTwigEnvironment private Environment $twig; private bool $isEnvLoaded = false; - private bool $dynamicTemplatesMode = false; + private ?string $twigTemplatePrefixKey = null; + private bool $prefixChanged = false; public function __construct( private readonly Configuration $configuration, @@ -47,20 +47,19 @@ private function loadMainTwigEnvironment(): void $this->breadcrumbsHelper, $removeFrontMatterFromTemplate ); - $this->twig = new Environment($loader); + $this->twig = new Environment($loader, ['auto_reload' => true, 'cache' => false]); $this->twig->addExtension($this->mainExtension); $this->isEnvLoaded = true; } } /** - * To avoid template caching in Twig - * * @internal */ - public function enableDynamicTemplatesMode(): void + public function reloadTemplates(): void { - $this->dynamicTemplatesMode = true; + $this->twigTemplatePrefixKey = uniqid(); + $this->prefixChanged = true; } /** @@ -72,19 +71,11 @@ public function enableDynamicTemplatesMode(): void public function render($name, array $context = []): string { $this->loadMainTwigEnvironment(); - // To avoid template caching in Twig - if ($this->dynamicTemplatesMode) { - $tmpFileName = self::TMP_TEMPLATE_PREFIX . uniqid() . '.twig'; - $tmpTemplate = dirname($name) . DIRECTORY_SEPARATOR . $tmpFileName; - $path = TemplateFile::getTemplatePathByRelativeDocPath($name, $this->configuration, $this->pluginEventDispatcher); - $tmpFile = dirname($path) . DIRECTORY_SEPARATOR . $tmpFileName; - try { - file_put_contents($tmpFile, file_get_contents($path)); - $data = $this->twig->render($tmpTemplate, $context); - } finally { - unlink($tmpFile); - } - return $data; + if ($this->twigTemplatePrefixKey && $this->prefixChanged) { + $this->prefixChanged = false; + $reflection = new \ReflectionClass($this->twig); + $reflectionProperty = $reflection->getProperty('templateClassPrefix'); + $reflectionProperty->setValue($this->twig, "__TwigTemplate_" . md5($this->twigTemplatePrefixKey)); } return $this->twig->render($name, $context); diff --git a/src/DocGenerator.php b/src/DocGenerator.php index 9c987cd1..12581b46 100644 --- a/src/DocGenerator.php +++ b/src/DocGenerator.php @@ -8,6 +8,7 @@ use BumbleDocGen\AI\Generators\ReadmeTemplateGenerator; use BumbleDocGen\AI\ProviderInterface; use BumbleDocGen\Console\ProgressBar\ProgressBarFactory; +use BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache; use BumbleDocGen\Core\Configuration\Configuration; use BumbleDocGen\Core\Configuration\ConfigurationKey; use BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException; @@ -62,6 +63,7 @@ public function __construct( private readonly RootEntityCollectionsGroup $rootEntityCollectionsGroup, private readonly ProgressBarFactory $progressBarFactory, private readonly Container $diContainer, + private readonly LocalObjectCache $localObjectCache, private readonly Logger $logger ) { if (file_exists(self::LOG_FILE_NAME)) { @@ -361,8 +363,11 @@ public function generate(): void * @throws Exception * @throws InvalidArgumentException */ - public function serve(?callable $afterPreparation = null, int $timeout = 1000000): void - { + public function serve( + ?callable $afterPreparation = null, + ?callable $afterDocChanged = null, + int $timeout = 1000000 + ): void { $templatesDir = $this->configuration->getTemplatesDir(); $event = $this->pluginEventDispatcher->dispatch(new OnGetProjectTemplatesDirs([$templatesDir])); $templatesDirs = $event->getTemplatesDirs(); @@ -379,9 +384,6 @@ public function serve(?callable $afterPreparation = null, int $timeout = 1000000 $files = []; foreach ($finder as $f) { - if (str_contains($f->getPathname(), MainTwigEnvironment::TMP_TEMPLATE_PREFIX)) { - continue; - } try { $files[$f->getPathname()] = $f->getMTime(); } catch (\Exception) { @@ -394,7 +396,7 @@ public function serve(?callable $afterPreparation = null, int $timeout = 1000000 $pb = $this->progressBarFactory->createStylizedProgressBar(); $this->parser->parse($pb); - $this->renderer->run(true); + $this->renderer->run(); $checkIsTemplatesChanged(); if ($afterPreparation) { call_user_func($afterPreparation); @@ -403,7 +405,11 @@ public function serve(?callable $afterPreparation = null, int $timeout = 1000000 while (true) { if ($checkIsTemplatesChanged()) { try { - $this->renderer->run(true); + $this->localObjectCache->clear(); + $this->renderer->run(); + if ($afterDocChanged) { + call_user_func($afterDocChanged); + } $this->io->success('Documentation updated'); } catch (\Exception $e) { $this->io->error($e->getMessage()); From fd34cf56f7ce12d39080b84d065f4eec31ac6d50 Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Thu, 11 Jan 2024 20:29:21 +0300 Subject: [PATCH 192/210] Updating doc --- docs/assets/error_example.png | Bin 0 -> 56515 bytes docs/classes/DocGenerator.md | 40 +++++++++++++++++++----------- docs/shared_c.cache | 2 +- docs/tech/06_debugging.md | 25 +++++++++++++++++++ docs/tech/classes/ServeCommand.md | 2 +- docs/tech/readme.md | 2 +- 6 files changed, 53 insertions(+), 18 deletions(-) create mode 100644 docs/assets/error_example.png create mode 100644 docs/tech/06_debugging.md diff --git a/docs/assets/error_example.png b/docs/assets/error_example.png new file mode 100644 index 0000000000000000000000000000000000000000..c070254f75933f1566fd02d82fe26e1edb2317da GIT binary patch literal 56515 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 literal 0 HcmV?d00001 diff --git a/docs/classes/DocGenerator.md b/docs/classes/DocGenerator.md index 024290d8..525ad77e 100644 --- a/docs/classes/DocGenerator.md +++ b/docs/classes/DocGenerator.md @@ -1,7 +1,7 @@ BumbleDocGen / DocGenerator


    - DocGenerator class: + DocGenerator class:

    @@ -66,11 +66,11 @@ final class DocGenerator @@ -85,11 +85,11 @@ final class DocGenerator ```php -public function __construct(\Symfony\Component\Console\Style\OutputStyle $io, \BumbleDocGen\Core\Configuration\Configuration $configuration, \BumbleDocGen\Core\Plugin\PluginEventDispatcher $pluginEventDispatcher, \BumbleDocGen\Core\Parser\ProjectParser $parser, \BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper $parserHelper, \BumbleDocGen\Core\Renderer\Renderer $renderer, \BumbleDocGen\Core\Logger\Handler\GenerationErrorsHandler $generationErrorsHandler, \BumbleDocGen\Core\Parser\Entity\RootEntityCollectionsGroup $rootEntityCollectionsGroup, \BumbleDocGen\Console\ProgressBar\ProgressBarFactory $progressBarFactory, \DI\Container $diContainer, \Monolog\Logger $logger); +public function __construct(\Symfony\Component\Console\Style\OutputStyle $io, \BumbleDocGen\Core\Configuration\Configuration $configuration, \BumbleDocGen\Core\Plugin\PluginEventDispatcher $pluginEventDispatcher, \BumbleDocGen\Core\Parser\ProjectParser $parser, \BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper $parserHelper, \BumbleDocGen\Core\Renderer\Renderer $renderer, \BumbleDocGen\Core\Logger\Handler\GenerationErrorsHandler $generationErrorsHandler, \BumbleDocGen\Core\Parser\Entity\RootEntityCollectionsGroup $rootEntityCollectionsGroup, \BumbleDocGen\Console\ProgressBar\ProgressBarFactory $progressBarFactory, \DI\Container $diContainer, \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache $localObjectCache, \Monolog\Logger $logger); ``` @@ -154,6 +154,11 @@ public function __construct(\Symfony\Component\Console\Style\OutputStyle $io, \B $diContainer \DI\Container - + + + $localObjectCache + \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache + - $logger @@ -185,7 +190,7 @@ public function __construct(\Symfony\Component\Console\Style\OutputStyle $io, \B ```php @@ -239,7 +244,7 @@ public function addDocBlocks(\BumbleDocGen\AI\ProviderInterface $aiProvider): vo ```php @@ -290,7 +295,7 @@ public function addPlugin(\BumbleDocGen\Core\Plugin\PluginInterface|string $plug ```php @@ -321,7 +326,7 @@ public function generate(): void; ```php @@ -372,7 +377,7 @@ public function generateReadmeTemplate(\BumbleDocGen\AI\ProviderInterface $aiPro ```php @@ -393,7 +398,7 @@ public function getConfiguration(): \BumbleDocGen\Core\Configuration\Configurati ```php @@ -444,7 +449,7 @@ public function getConfigurationKey(string $key): void; ```php @@ -478,7 +483,7 @@ public function getConfigurationKeys(): void; ```php @@ -512,11 +517,11 @@ public function parseAndGetRootEntityCollectionsGroup(): \BumbleDocGen\Core\Pars ```php -public function serve(callable|null $afterPreparation = null, int $timeout = 1000000): void; +public function serve(callable|null $afterPreparation = null, callable|null $afterDocChanged = null, int $timeout = 1000000): void; ```
    Serve documentation
    @@ -536,6 +541,11 @@ public function serve(callable|null $afterPreparation = null, int $timeout = 100 $afterPreparation callable | null - + + + $afterDocChanged + callable | null + - $timeout diff --git a/docs/shared_c.cache b/docs/shared_c.cache index ee26bd27..5e3037ca 100644 --- a/docs/shared_c.cache +++ b/docs/shared_c.cache @@ -1 +1 @@ -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 \ No newline at end of file +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 \ No newline at end of file diff --git a/docs/tech/06_debugging.md b/docs/tech/06_debugging.md new file mode 100644 index 00000000..96076a8c --- /dev/null +++ b/docs/tech/06_debugging.md @@ -0,0 +1,25 @@ + BumbleDocGen / Technical description of the project / Debugging
    + +

    Debugging documentation

    + +Our tool provides several options for debugging documentation. + +1) Firstly, after each generation of documents, you can make sure that the linking of documents was normal and no problems arose: after completing the documentation generation process, we display a list of all errors that occurred in the console: + + **Here is an example of error output:** + + + +2) To track exactly how documentation is generated, you can use the interactive mode: + + `bin/bumbleDocGen serve` - So that the generated documentation changes automatically with changes in templates + + **or** + + `bin/bumbleDocGen serve --as-html` - So that the generated documentation changes automatically with changes in templates and is displayed as HTML on the local development server +3) Logs are saved to a special file `last_run.log` which is located in the working directory + + +
    +
    +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Thu Jan 11 16:01:07 2024 +0300
    Page content update date: Thu Jan 11 2024
    Made with Bumble Documentation Generator
    \ No newline at end of file diff --git a/docs/tech/classes/ServeCommand.md b/docs/tech/classes/ServeCommand.md index cdd320d1..690c7964 100644 --- a/docs/tech/classes/ServeCommand.md +++ b/docs/tech/classes/ServeCommand.md @@ -1,7 +1,7 @@ BumbleDocGen / Technical description of the project / Console app / ServeCommand

    - ServeCommand class: + ServeCommand class:

    diff --git a/docs/tech/readme.md b/docs/tech/readme.md index 01d73598..2cbdffc7 100644 --- a/docs/tech/readme.md +++ b/docs/tech/readme.md @@ -6,7 +6,7 @@ This documentation generator is a library that allows you to create handwritten

    Documentation sections

    - +

    How it works

    From 8f443d2f3de9aa5eadde9cf8979d4491ea0d1ef1 Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Thu, 11 Jan 2024 22:56:52 +0300 Subject: [PATCH 193/210] Fix life update doc removing --- .../SharedCompressedDocumentFileCache.php | 24 +++++++++---------- src/Core/Renderer/Renderer.php | 2 +- src/Core/Renderer/RendererIteratorFactory.php | 5 ++++ 3 files changed, 18 insertions(+), 13 deletions(-) diff --git a/src/Core/Cache/SharedCompressedDocumentFileCache.php b/src/Core/Cache/SharedCompressedDocumentFileCache.php index e16ecea0..12079cfd 100644 --- a/src/Core/Cache/SharedCompressedDocumentFileCache.php +++ b/src/Core/Cache/SharedCompressedDocumentFileCache.php @@ -19,7 +19,7 @@ final class SharedCompressedDocumentFileCache * @throws InvalidConfigurationParameterException */ public function __construct( - private Configuration $configuration + private readonly Configuration $configuration ) { $this->cacheFileName = $this->configuration->getOutputDir() . '/' . self::FILE_NAME; if (!$this->configuration->useSharedCache()) { @@ -53,19 +53,10 @@ public function set(string $key, mixed $data): void $this->cacheData[$key] = $data; } - public function removeNotUsedKeys(): void - { - $this->cacheData = array_filter( - $this->cacheData, - fn(string $key) => array_key_exists($key, $this->usedKeys), - ARRAY_FILTER_USE_KEY - ); - } - /** * @throws InvalidConfigurationParameterException */ - public function saveChanges(): void + public function saveChanges(bool $clearUsedKeysCounter = true): void { $gitAttributesFile = $this->configuration->getOutputDir() . '/.gitattributes'; file_put_contents($gitAttributesFile, self::FILE_NAME . ' merge=ours'); @@ -75,6 +66,15 @@ public function saveChanges(): void } return; } - file_put_contents($this->cacheFileName, base64_encode(gzcompress(serialize($this->cacheData)))); + $cacheData = array_filter( + $this->cacheData, + fn(string $key) => array_key_exists($key, $this->usedKeys), + ARRAY_FILTER_USE_KEY + ); + file_put_contents($this->cacheFileName, base64_encode(gzcompress(serialize($cacheData)))); + + if ($clearUsedKeysCounter) { + $this->usedKeys = []; + } } } diff --git a/src/Core/Renderer/Renderer.php b/src/Core/Renderer/Renderer.php index ea4607bd..ddb96db4 100644 --- a/src/Core/Renderer/Renderer.php +++ b/src/Core/Renderer/Renderer.php @@ -126,7 +126,7 @@ public function run(): void } $this->rootEntityCollectionsGroup->updateAllEntitiesCache(); - $this->sharedCompressedDocumentFileCache->removeNotUsedKeys(); $this->sharedCompressedDocumentFileCache->saveChanges(); + $this->renderIteratorFactory->clearCounters(); } } diff --git a/src/Core/Renderer/RendererIteratorFactory.php b/src/Core/Renderer/RendererIteratorFactory.php index 8bf93571..c4933e70 100644 --- a/src/Core/Renderer/RendererIteratorFactory.php +++ b/src/Core/Renderer/RendererIteratorFactory.php @@ -396,4 +396,9 @@ private function getFilesDependenciesCacheKey(string $key): string { return "files_dependencies_{$key}"; } + + public function clearCounters(): void + { + $this->renderedFileNames = []; + } } From 199a75ee57d2433ee0970ec7f26536eafd511b44 Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Thu, 11 Jan 2024 23:06:50 +0300 Subject: [PATCH 194/210] Adding method to remove records --- src/Core/Logger/Handler/GenerationErrorsHandler.php | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/Core/Logger/Handler/GenerationErrorsHandler.php b/src/Core/Logger/Handler/GenerationErrorsHandler.php index d2406095..84fcd2ad 100644 --- a/src/Core/Logger/Handler/GenerationErrorsHandler.php +++ b/src/Core/Logger/Handler/GenerationErrorsHandler.php @@ -6,7 +6,6 @@ use BumbleDocGen\Core\Renderer\Context\RendererContext; use Monolog\Handler\AbstractProcessingHandler; -use Monolog\Logger; use Monolog\LogRecord; final class GenerationErrorsHandler extends AbstractProcessingHandler @@ -14,8 +13,8 @@ final class GenerationErrorsHandler extends AbstractProcessingHandler private array $records = []; public function __construct( - private RendererContext $rendererContext, - $level = Logger::WARNING, + private readonly RendererContext $rendererContext, + $level = \Monolog\Level::Warning, bool $bubble = true ) { parent::__construct($level, $bubble); @@ -56,4 +55,9 @@ public function addRecords(array $records): void { $this->records = array_merge($this->records, $records); } + + public function removeRecords(): void + { + $this->records = []; + } } From 1b86c41ede11838d221462c23380b967c6522525 Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Thu, 11 Jan 2024 23:07:50 +0300 Subject: [PATCH 195/210] Adding method to display errors --- src/DocGenerator.php | 69 +++++++++++++++++++++++++------------------- 1 file changed, 40 insertions(+), 29 deletions(-) diff --git a/src/DocGenerator.php b/src/DocGenerator.php index 12581b46..e7ed436c 100644 --- a/src/DocGenerator.php +++ b/src/DocGenerator.php @@ -312,39 +312,11 @@ public function generate(): void $memory = memory_get_usage(true) - $memory; $warningMessages = $this->generationErrorsHandler->getRecords(); - if (empty($warningMessages)) { $this->io->writeln("Documentation successfully generated"); } else { $this->io->writeln("Generation completed with errors"); - - $this->io->getFormatter()->setStyle('warning', new OutputFormatterStyle('yellow')); - $badErrorStyle = new OutputFormatterStyle('red', '#ff0', ['bold']); - $this->io->getFormatter()->setStyle('critical', $badErrorStyle); - $this->io->getFormatter()->setStyle('alert', $badErrorStyle); - $this->io->getFormatter()->setStyle('emergency', $badErrorStyle); - $table = $this->io->createTable(); - - $rows = []; - $warningMessagesCount = count($warningMessages); - foreach ($warningMessages as $i => $warningMessage) { - $tag = strtolower($warningMessage['type']); - $rows[] = ["<{$tag}>{$warningMessage['type']}", "<{$tag}>{$warningMessage['msg']}"]; - if ($warningMessage['isRenderingError']) { - $rows[] = [ - '', - 'This error occurs during the document rendering process' - ]; - } - $rows[] = ['', $warningMessage['initiator']]; - if ($warningMessagesCount - $i !== 1) { - $rows[] = new TableSeparator(); - } - } - $table->setStyle('box'); - $table->addRows($rows); - $table->render(); - $this->io->newLine(); + $this->displayErrors(); } $this->io->writeln("Performance"); @@ -398,6 +370,7 @@ public function serve( $this->parser->parse($pb); $this->renderer->run(); $checkIsTemplatesChanged(); + $this->displayErrors(); if ($afterPreparation) { call_user_func($afterPreparation); } @@ -407,6 +380,7 @@ public function serve( try { $this->localObjectCache->clear(); $this->renderer->run(); + $this->displayErrors(); if ($afterDocChanged) { call_user_func($afterDocChanged); } @@ -543,4 +517,41 @@ public function getConfiguration(): Configuration { return $this->configuration; } + + private function displayErrors(bool $removeRecordsAfterDisplaying = true): void + { + $warningMessages = $this->generationErrorsHandler->getRecords(); + if ($warningMessages) { + $this->io->getFormatter()->setStyle('warning', new OutputFormatterStyle('yellow')); + $badErrorStyle = new OutputFormatterStyle('red', '#ff0', ['bold']); + $this->io->getFormatter()->setStyle('critical', $badErrorStyle); + $this->io->getFormatter()->setStyle('alert', $badErrorStyle); + $this->io->getFormatter()->setStyle('emergency', $badErrorStyle); + $table = $this->io->createTable(); + + $rows = []; + $warningMessagesCount = count($warningMessages); + foreach ($warningMessages as $i => $warningMessage) { + $tag = strtolower($warningMessage['type']); + $rows[] = ["<{$tag}>{$warningMessage['type']}", "<{$tag}>{$warningMessage['msg']}"]; + if ($warningMessage['isRenderingError']) { + $rows[] = [ + '', + 'This error occurs during the document rendering process' + ]; + } + $rows[] = ['', $warningMessage['initiator']]; + if ($warningMessagesCount - $i !== 1) { + $rows[] = new TableSeparator(); + } + } + $table->setStyle('box'); + $table->addRows($rows); + $table->render(); + $this->io->newLine(); + if ($removeRecordsAfterDisplaying) { + $this->generationErrorsHandler->removeRecords(); + } + } + } } From 96d9612704b9cfcb723c5a9e14e0dc3577c117d1 Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Fri, 12 Jan 2024 01:10:36 +0300 Subject: [PATCH 196/210] Fixing breadcrumbs file dependency checker --- src/Core/Renderer/Twig/Function/GeneratePageBreadcrumbs.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Core/Renderer/Twig/Function/GeneratePageBreadcrumbs.php b/src/Core/Renderer/Twig/Function/GeneratePageBreadcrumbs.php index da2aa43f..4b499068 100644 --- a/src/Core/Renderer/Twig/Function/GeneratePageBreadcrumbs.php +++ b/src/Core/Renderer/Twig/Function/GeneratePageBreadcrumbs.php @@ -69,8 +69,8 @@ public function __invoke( foreach ($templatesBreadcrumbs as $templateBreadcrumb) { $fileDependency = $this->dependencyFactory->createFileDependency( filePath: $templateBreadcrumb['template'], - contentFilterRegex: '/({%)( ?)(set)( )(title)([ =]+)([\'"])(.*)(\'|")( %})/', - matchIndex: 8 + contentFilterRegex: '/^---([^-]+)(---)/', + matchIndex: 1 ); $this->rendererContext->addDependency($fileDependency); } From ee229f7dfa8b3d83c48df25f0dd8647120aa020b Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Fri, 12 Jan 2024 01:11:04 +0300 Subject: [PATCH 197/210] Fixing template --- selfdoc/templates/tech/06_debugging.md.twig | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/selfdoc/templates/tech/06_debugging.md.twig b/selfdoc/templates/tech/06_debugging.md.twig index c7894ad4..80c64f51 100644 --- a/selfdoc/templates/tech/06_debugging.md.twig +++ b/selfdoc/templates/tech/06_debugging.md.twig @@ -1,10 +1,10 @@ --- -title: Debugging +title: Debug documents prevPage: Technical description of the project --- {{ generatePageBreadcrumbs(title, _self) }} -{{ "Debugging documentation" | textToHeading('H1') }} +{{ "Debug documents" | textToHeading('H1') }} Our tool provides several options for debugging documentation. @@ -16,9 +16,9 @@ Our tool provides several options for debugging documentation. 2) To track exactly how documentation is generated, you can use the interactive mode: - `bin/bumbleDocGen serve` - So that the generated documentation changes automatically with changes in templates + `vendor/bin/bumbleDocGen serve` - So that the generated documentation changes automatically with changes in templates **or** - `bin/bumbleDocGen serve --as-html` - So that the generated documentation changes automatically with changes in templates and is displayed as HTML on the local development server + `vendor/bin/bumbleDocGen serve --as-html` - So that the generated documentation changes automatically with changes in templates and is displayed as HTML on the local development server 3) Logs are saved to a special file `last_run.log` which is located in the working directory From ffb332cc0842c2670ffb498e52b5fcaf80945d9e Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Fri, 12 Jan 2024 01:12:20 +0300 Subject: [PATCH 198/210] Updating doc --- docs/classes/DocGenerator.md | 8 ++++---- docs/shared_c.cache | 2 +- docs/tech/06_debugging.md | 10 +++++----- docs/tech/readme.md | 2 +- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/docs/classes/DocGenerator.md b/docs/classes/DocGenerator.md index 525ad77e..5cf27736 100644 --- a/docs/classes/DocGenerator.md +++ b/docs/classes/DocGenerator.md @@ -377,7 +377,7 @@ public function generateReadmeTemplate(\BumbleDocGen\AI\ProviderInterface $aiPro ```php @@ -398,7 +398,7 @@ public function getConfiguration(): \BumbleDocGen\Core\Configuration\Configurati ```php @@ -449,7 +449,7 @@ public function getConfigurationKey(string $key): void; ```php @@ -517,7 +517,7 @@ public function parseAndGetRootEntityCollectionsGroup(): \BumbleDocGen\Core\Pars ```php diff --git a/docs/shared_c.cache b/docs/shared_c.cache index 5e3037ca..b0c728f2 100644 --- a/docs/shared_c.cache +++ b/docs/shared_c.cache @@ -1 +1 @@ -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 \ No newline at end of file +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 \ No newline at end of file diff --git a/docs/tech/06_debugging.md b/docs/tech/06_debugging.md index 96076a8c..96f37a4b 100644 --- a/docs/tech/06_debugging.md +++ b/docs/tech/06_debugging.md @@ -1,6 +1,6 @@ - BumbleDocGen / Technical description of the project / Debugging
    + BumbleDocGen / Technical description of the project / Debug documents
    -

    Debugging documentation

    +

    Debug documents

    Our tool provides several options for debugging documentation. @@ -12,14 +12,14 @@ Our tool provides several options for debugging documentation. 2) To track exactly how documentation is generated, you can use the interactive mode: - `bin/bumbleDocGen serve` - So that the generated documentation changes automatically with changes in templates + `vendor/bin/bumbleDocGen serve` - So that the generated documentation changes automatically with changes in templates **or** - `bin/bumbleDocGen serve --as-html` - So that the generated documentation changes automatically with changes in templates and is displayed as HTML on the local development server + `vendor/bin/bumbleDocGen serve --as-html` - So that the generated documentation changes automatically with changes in templates and is displayed as HTML on the local development server 3) Logs are saved to a special file `last_run.log` which is located in the working directory

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Thu Jan 11 16:01:07 2024 +0300
    Page content update date: Thu Jan 11 2024
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Fri Jan 12 01:11:04 2024 +0300
    Page content update date: Thu Jan 11 2024
    Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/readme.md b/docs/tech/readme.md index 2cbdffc7..e45d1a9b 100644 --- a/docs/tech/readme.md +++ b/docs/tech/readme.md @@ -6,7 +6,7 @@ This documentation generator is a library that allows you to create handwritten

    Documentation sections

    - +

    How it works

    From 43b0597fcc97bbf8bbb961803a3daa0e807751f9 Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Fri, 12 Jan 2024 01:40:01 +0300 Subject: [PATCH 199/210] Fixing linking description --- docs/shared_c.cache | 2 +- .../01_howToCreateTemplates/templatesLinking.md | 11 +++++++++++ .../01_howToCreateTemplates/templatesLinking.md.twig | 11 +++++++++++ 3 files changed, 23 insertions(+), 1 deletion(-) diff --git a/docs/shared_c.cache b/docs/shared_c.cache index b0c728f2..f81a91f1 100644 --- a/docs/shared_c.cache +++ b/docs/shared_c.cache @@ -1 +1 @@ -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 \ No newline at end of file +eJztvelyG0mSLjrPUmbH7By7NlOxL+pfWmqRmaqLI6lnflzdI4uVQhcJ0ABQXZq2fvcbiYUiwUQgE7kwmenTUyJAEBGZnp97+BZfmBeUoxf/XKUfL35Y3ISlWc8W89Xnq8Xl5x/XwX35cRmMvw7/ce3/Y/2P2eUPfzEvcPH3GL/44ebLzU/z9Ww9C6sf/vL7C5mGeHV7ba/Cm4X7Jcw/vV4sw6cLs1yF5afNH35Lv7q6Cq6Y493i8vf9fJ/uXq2+/8EPu4nQ/Qsr5k/X+69//Stdsn7xQ5xdhdVnH27C3Ie5S1dy9LLpi3/OXqB0nQKVXef7YoRlutLXi/k6/Ln+9GY/6LdPP6dZvr/94QXbXJjYTv82/flybq7ezeZ//PCXdFnyxQ///F/rcH1zZdbFxc2W/+tf5ReVBlEvfnDFhPN1miQN9D5chj9/+Mtf/7K982uzdl/epnl3v2MvfvhiVl8285AXP1DJCaaRuoB4pIgYTxSOhAosjMBE/fCXf81e4B7umZTd8/ufXr757acqt7v95Mf/++///u//+//9v//+//0//+d/p5f/58cfSsRQ3NAjQSCp0307LJjRQUjhNCdCUy+oN8E7txEEKQRRCtKcIN7MlgmQi+W3+9IghTRUmvjfGg/2b0lYh/LEZRgqPpC4lSnvi84iZJhkAWmuTBBeGC4IVYwwrg2nBYaSsjF8xD4gkdTP3l5ezuaXQ7QSjGesxLGL78tWMHrUVpRfWmOLIWgMCPvAfSAKUUON8UYiTKizhFgMFuORxXgGy0VjaYiIadJ4ETWh3HOdACEic9HKZBpwiFsjUKy45UaAf06XtVpcDcpRkMWvebq7y7B+tzA++N+Xr5NQ1+Gv4R/Gs+iZUIYYKrhOpk8yFJIKEKdpJLG40MLAn3mhH5LaXoXt33wIZum+3H22A4Rmpaa86ej/drsyl+H14na+3j/rrmYKm9/+1VyHjS1jj4S1QUT6eX1t5v5T+l3xzbB7X3xHi26uLN7ON1/YXxtB5SAoPlOqm2swy8vVTguKteQcARU6dxS/Mrl7AgVHhVTUJ1NBQog6cI65plwDfuviF594PB/C8ut0wVtPOjnkOqytoDgFKZRpRGT61KK08nDutTdYAnJrIpfTA2G9fHv3ePY25X0yEL+Fjzs3Y6oobiCpHKKldJTZiIkN0TjODDcmmWAfqZcpkAqA6Lq2OPOcXnqffvnqauH+WE0Vx7Xlk0NvUM6QyBJYlY2EexRU1M4ghJyKEYMnXBu9+sRamd7H2eXt9suTxfB5UsohmboU0pMQnUzQLaJZg6i2gUhqOMWGA5JrIpkcC1le3txMDrB5YeRwqTEyUiOstI7J8bUWWaRCsCpYLrVQI8Elo/2Z2NIU0gOL8fDd5NB6hoT+9a9txpzmMualmb7e8uX4eL685MIaZ8u1YRF7woKn1OiopFFcIca8MlRFqyFbDtnyo9nyIt9Xni1nn2+ubi9n8w/fVulWhpQyJxvpkyRld7WYh7vvCm6QkEZYbsUmQSMee29VL+j1g5F3D1yVFzbPGLDEWVK0tcEPbT3eGssErlffLsz6y2pTpeWtzXdg101Red4a+PQAflwt3Y/F0PsbLVaezS/fmfnlbRLDr8lnvgrLLSB1ezJelIGqR5ziUzD1kQJM78FUfYfpxqZG40LnWP3ujJSuChcbI7j7cXdVk8OqwNIDVu9hVW/c59/nVwmqq7VJY5k0TUdgLfpExgc3luA2W2/y2Xs3QiqPHYo4ShGST8sDoZEww2hkycm1myS1PB+Cbx/Odg+Mm16pJgI+NnQZLHUH04Q7R8wU8v7ntg3rqD0rXu9evjOr9cXmGq+vZ+s0/uPfFFdemEghqw1ZfLnwhtNYxctf19dX27fbz/eCEIcZ4mrDHQ5FiqHEWUO9X60PRyvyA+pwtANX5dPFl5uSwV+ZVUiffFjfWpv+6OHb7zOwwjE6zKScNUN6mb5+e50e/mL5aB7e2p2kl3+bz9aPZhC7ZMEZMyRs3SwS3i+M+yP98Wo/1aM5ZPF0D5fmanO8Mbd/bv4pxlGbwOm8gbY6mb6SpBBnwV9cJR+g/LffL1xvcxX/2mUsjuXdvNFeYSdjdERxRrXHhOoQFcbOcWlHkndTvaXdWrV7E0vItSq7HOoxd0Zb4lyUCjOdPsRcIY9jZFKltX8kqMc9FvRqhS8Tw3X92O6ouU7gJIJEQ4NE2CJV+KbJVIfkpXIh0ViAi3oC7l+nBkWeJvrw7Tou5t+2TtA8iePTT1/Tv29mq5sirVtMWLz/cGtXbjlL7lBFcHJuMcXaecWtMdY6K71TVjBLmeByNFa1L3AmzzO3IG4e0ve6wasQ04ebh5HGT39fVA0mZ2pbkFi2MVNK7xkhKATGEGXpHxUNcgQhjREbS0ux7g/hbcX0U8N5W3LLehtRKBSJN0wJmSAeUbLu0mKrXUzR4ViaNkl/0WHWPJU/tk0y5O7t9IDeXGJZg64i11wHTa0PyvmijQEzHElw1HJERwLxHg16G1nVqWG8DZnlUG5TtGi4NxEbIqxCUheVDaKctRyz8ezk6y/f0VbGf2pIb0ls+c1TgiBLlEHSGeeEUCpShx330pjgx5Ij6c9p6bIeNTH8dynKnE6k0JQlFfBKSkqlRdZbglzUjHLLjRhL2/9AHPmDPMPv81/CukgxvA+rxe3ShX2r5qSg34LEcggXxCAdtTdUeG+5RdTYFKs6FoywKIwlVu2xkHnY6JIxVdvHt5v59/nrL8H98Xa1ff/azF+F7eOaHOY7kWHW0ccpgGXBi+gD5tFTh5JOUCKCNMn7GUsKvj8t6L5TZmIq0b1As36QVdYhjW2KCIqNj0iTFA0HxJGKOP0H+vEksUF5h9fENKNLUeZ0ggRMkeUpGBAMR+OYCsFxyYiIPAo8lhRoj2XbbpsSp6YWnQozpxjMecuioRaL4GWKKzQxRblAUs/STzYWxRD9Rc2NO2knBv7mAssSpDFuuHQqmkiUc15aHmz0Tmia/sdHs+l+GM2/j3Ic2+ew92OD387w30tzczPBQm+rssuhXnmDYtCKM4sKKiqijTLWUoKEDFyPpeW9R9Q/Zv3IZ/b2zGHFbuBX396H9Hr2tfhy8YvpAb9l8WXpf7AVWnmEEVIJ8I5Erb2jVhhPlcdjqY31h/1ysvTMw7tYLv6eZtw/w9Wb2XI1Oci3JLVsVGsC5TFqpzGT0sXAqSGWsILAHYdoRoJ0MoxOzWxn7Xb0yXYktyW3bOu9IV4z6YL00aNorfBORi8ZRkKgOJa8f49oLxdW6VN7GTfEOcW7/VObhQka9RZElqWIQ7SggjMsMkwjpjgyY1zgVkolhB0LxnvMU/a4IXliutCjZAuVyVCnaM8IUKcAG9X+1UAZfnQ0AmB6z4qx+zBdJrv9+sqsVsXH/XFSFYfZfN8sOl8vjVuvyjeLTg6whmy9agAsUFK1BbcSSioSNYrc64AEDcFZFQRTiFNiORfUR6CkqkRJtVEtflhJfhyg7KbcxuHFm+T0XSwXLqxWdyxULYQ5OwKq5nuVd/RTbaUYtvxT2e1IpcPd3eJupNU+CdtgqPvS4m3Xh7bkUS2lIbcsUW2n8bddXC10TW93/4nT4L83UBE93WFj+0evtzTBdyFqJ72tuz1cdVqhHijuRuGKwQq9/c4PfN+mpykKnVGHgq06xe/zl95vnLHt9X9cHIxOqzFvCYa5UoIoY2wwgiCCRUiGXVoruBBkJOmMvkoxk2Nyqemcb3nrVY63/jjndm/k9eI4ef2xq2vMYI+io8nHMtL4KH3gzhhJdVSEY6qxD8BgDwz2xxns5TEGe/p5uRPIo6t+ehL7/dHPHOcMQvYWWF82QR+3CZkLbGwWHFEKC6dMlFpiRNJPix0yIhmGECmYBTALR8xCEUX9fiS4qHkM/S4OL/zAEqei7pn2SWKHQsVlQt23MrYw5X3RWYRMElJAmhddGF4YLghVSZpcG07V1qIWIeNJi4r45+JJv75drRfXP+/cs9WQLGxCcTaB6JhWwGk/iMJMgc27ysyPe4T/+DEh6cc9tu6sgSwv2PyYwsWjX51Watwxp6DkOBvMySKiNDF1Z8gLrH7aY/XTQ4s62RNHEoZdAAxDeafj8o7hkUZrURAiOuSjKU5ktZYKoZGTgUF5p1J5ZyPe8sLMETv3Zmn+sa8ObAb8Lcxv70o8edf9+Ej7OsM+8V7cPS+lvDoyWBEQ/RLWu1z76q7AU8eE/7I7pb0gznpVREZumb66uqvu1Btr/UBKxZh/W17lyzunx9rLaTdUUd7hpSg/MlSRed3m5lf3yhLiaJnjyDAXy9l8vatC3MHv5erdbLW+q+pU2X16DBmzVYqqvm1qBS9vZr+F9ZeFX91VdpqMnDC3GfY3c7Mv8FSqxxx/NNvhtpf4auGTQHzY1XqqHSSiNdJBY6WdkopwbaVmkcUiMPY6ypGUM3pkGGzBnE2sJNKGyLI7B3nAOlpmsAiUCOtjjE6Q4JiMSDHAeG2Mt7PQTg3m7Ugt22tPmZfGMa8otRpHibGM0UtCTUGSPBae+/72CfLyPo4Hk7xfLHbeyHSPyjlbTllGWI6FEIoQJHkI0kbOZHEEVEBEBRRGQ+TRH5obxTRTg3QjYWXZ/iQRLkbDVfDcRE0jdsHhQHFBWaNGw9zUnz/SSpw9MXy3I7Ss3+0IRo5bxzRmhqfX1BAsJEnvsDOA845xfiQHBDg/Q2h5rzuwYAxyyYYnWHPHnaXMSJlepJ8OcF4X523kJ6cG8zZklkN5kLKw2gS5IJlWkiCGovWIeSExs2Nh6u4xtqwgrO8x0/0C2MSgfb6gso38RhsrJVOBCUJiiicx4oIjbhOyhRwLp3CP0WXTUtDUYN1UXlkeJVp4JNJTxgijUVnnqXPFgYCSMo5Hw7rRn0/SWoVyYjBvT3BZ0l/lhJeR22TTLY+WWMeNZNFSKxQmUOOpi/cuKugTQ34XIsyziSkRKfJKaqSk4oolv4ZEKYvzRPBoeIGf0Oaf3esxMeS3J7gs3pPH7gnBUlPpi3+VYYgp6hUPCI3mxMAe2fMqcfY/mPPIbm3A+5mCy9aNTMRFuMpw+j8laHLlE+ZtwNHEIKIYCd579HG66L2bGPQ7kWG+m4szGZBzghLtOCYBca2TryMwloGMhSF4oFWloxtNJgb7tnbnbJpzCyKgStu5T++f7Gt7d9HMVmF796kLbrzdW0ochXGYWGtRCv5VsIF5yrxgUkRpYbs3bPfObvd+ZiwIjSUTFWLSYCsIogIpiY1EBHtOnIvUe7fbzY2r7OZm95V7c5XD2stNTuwWjNpS2C04iL3cKLOXe3NFd3Dm1Xdy7744sT2w0ZkIqB7OPu78CrP1FDeX9+m+JZ3uHu6YlmnAL+zh7ngPN1ZOG62cR54pX2zlFijgsNlsgDQBit5qe7jRhqK3Sq/81sa99L5wT5Nbu1xcvwtxvd+9zaq0Q2zH+Hn254f18sPsf+4I+Vn1C3ibfPHdJtkis86qlKe337xYhsvfCv96vye7xm2n796YZfjwgOCV1Zv/P28XKZIIa3O3+brKjrLtd9+H68XXYuLwamn+2NLzFhuvyzfulA6RRP7x2034uNht/y72WfMqaZDt1z+mOKogXfXh1dXC/bHfT13e3JUZ4dewoYnd7p+utMc52qA1FdIGiX302BvuozXRKmGxdpA3r93p1UjdJ5YpbCasbP0TKcMNlSIEg7TWKhJhDXeKFUdgi7HUP/vD9ZlL0MQAfaaUsidaO8w5o0ZxirXhMnhtcUjhgEaeYjaW3vIekXyGPzQ1GJ8houwZvSSq6CzGxERKONHUWU4jDYSboCzUJWtj+CzPfGooPktIWUYgHxFRCgWlHcE8CieIUQobw5UQjgOOu/OWS6LEieG5mbCyUWBQWFBKFcEG4cCRxYp6ao0UxrHoAdfd2ed7mYuJ4fk8IWV39mDOouICuyg8R44JhqgJVIjAU0QIO3tq2+cmWbSJwbmRrLK7MZ2mEakiU8dVlMgkv1kJ7XDynpNPDXvoa6P63MTu1BB9rpxgr3yPOxNgr3xVOHeyV54HJYjXhkbPMRGCCWWFw8wIiz1jkGmujecGdbOpIbqBqHKYRgE7zzxJ8aAKNnkeTEnttJBeKs0JxIPt2OgqldypIfpsQe33C/Cq+wVOdOj2tluAVtstkL3cxnsFFBMoGsS0Rj4QayQmVmspHTYYyQh7BWCvAOwV6GqvAP3sd4xjKYy6devb5SBP1qxuWk/c0NBMa/ZyG5tWLrHXwUQfhQ/UIEsIwkh7F5zWTBkwrWBawbTWNq1FuvW0aSWf7XdK3iEZ1U2n87H4SzJjBacqboivuUE+uWZKeU+Sh8Y8MDa1XGe+R9t8//Wv4eqm2CQ1tRiskbCA3X2o/AS/ALt7q+zu28Z6XdUpProU9eUO8+N+T5ULbewIY2skNS4t6Fxog4NGwVvluUeY+7TIgyMMjjA4wrUdYVXpdHn8+cviHx8XW4v7cX+TP97d7n+Z5Wbr5PNxkhHShY+MNCbGOIeIIS5gYYnG1BozlgO9enSSD2nyD+mqDt5Pl+GogaSAtHFoJKUP5wTSxrZJGzdusqpM43XWQsV7cqFVRWqvM26isXvtDTFSSG4wo1oEQ6SSkRjqgwyIOA3uNbjX4F7Xc68LHoLOJSMrlqmOGJUeJcZlEN5HFZD3jCfXmxKLGYnGW08R4ruApFLR85SJLKSTlqwhhSM0F444KZNQCEEhMIYoS/+oaJAjKU7BiEE4Utt5k6XC2hz0snm9e1lk5gqwFF5J4aGsr6+2b7efT893a0tucK4fnOs3bKR3fa4fnNL6tPUqOKW1zVNat4F45SauMxy03sLwZh7z8VtoHIQHjNNK6J2IhBEZlHAkMkNj8gJpoFZAEA5BOAThEIR3H4TLNoLwN9/m5nrmNluGBlUZ3PckF1yh7SxnR2+1t0Wtmm6eeyPNj5OwNMV6wRMemEvmzAqqpWBCGEyVKapTsLTB0gZLGyxtHS9tskl++fBuhrOUyaaR2eNb62vp6g1hFZcqg6XAgWHJvCJUCC6QDRRRHiyPGEEUBksVLFXnLVV5kqMSybyZLZMBXCy/3RfPprGvyJyWJNBqDvZvSXqHAsZlcNsYqvKjBepOeV90FiGT4BOQ5sqk5UsYLghVCWdcG07V9wxz+ZpFPt9slpQfV1uyvoUzabYhLVAnjooKnlEFh5IM51CdUtam3Rwf7oPs4bvJnqpTMGrDqVCzJzzr7A67xYr5/ayz7dgThKNnAEc45KnjQ56UR8IbLq1RLipskE8RtrdWMMtSgBDgkKdj04Q7J8xsNau8EaF0yd27k+nrDz7YH/VUXuwtHaqIObbXuFg+Gqu4eZlrTXg41vvgbper2deQuz5SXF/1MbdF7uIqH41Eq51ORJ0O1DFODTfMCIIRigKjqBXGkW+PcoT+izr9F819w6k1X7ThTW9BLnL5vdNhYG/bhNnx7MSpq2ycuWPEWx8cjqTwg7jFCnMkmMTEWUMlbGKAzN2TZu4yW+jvdKNHuTDnrObcY+sUI1x6EbhILpyTkTJJ9S75pE8mn5Yh7kzly5vZAIskONd6LyQVntjgiPHGahlQNCmS8jqhxVtBwE2o6Sbw0pMZTjMlr35ZLm5vJucjNBXXnrqUVnIQTqlqb+x6uJItzF1sc0oRxrVXKv0/1Y45QhAxWnpNlWLMU6AtBXcB3IW67oI4SihyRK2TTzBAl+GOtjS79bzWLfXVTyEy28xrXHDzbvZgFbUk4USEQLHUrjgTWlqjcdBGA3UpmFcwr7XMay8Nf516Zo2l5JWzzCHBqfTWOG+Q46gwMZaQoKLYNfmpMxah9N/HpZmt39//ZEhrksqFsdQTqpHRSCfpiGAKMTnFjaZRC2/YSMJYJZ8ujj1NY7PBz/Y1xLE1xZUr5WCtvOAECakQE8SmJSOk6M0rphgVZCyUxlyz/oo5h+I6/bheX5nV6t3sjzBRhLchsvxRjRZJGlB0GnGc3CEskteIDKLckCDtSFBOWX8o54d0Fqcf2SuzmirAG0ore3Bj4K44hFRJjw1jiBAho6LJwU2hkB/NoWBqWGn218Z9Cdt/i6an7W83q+70sN1QXFnD7Z3nxQELlhJFMbLY6+iY1CggnYA/EnBj3Ru4Zf7w2LsYd0dWkZ7RfBUXy+vvj226TSetyi5P48S8NI55RanVOEqMZYxeEmqU82EspGWE9mfTc/1Cj2qB04X42XLKwdlFhCIL6e+kFML54qgRKRGmFid0i7HwNQnVG5xZOZncg0mmDuWzZJSDsZHE2sCodRRHrAzGAVMkmDIKWcHH4mkT/nSpkqqu43RR3YbI9pxj5MwK7Ml8vuiLmwWdVZA9cf2N67NRUqmY8SxoTCxDlmEa0gsclePYOKjPQn0W6rNQn227Pjt7wUfQBNNYUlpgJDnSEXnkbEwxs1AYkWRyhEXJAu2Y2E5v/S9dOe7W0edZzUbeiOSzci0xFd5ojLmXDDFEJZKGQjW7j3rfHYYmWg5pQ2RQ1X7BMFS1x4VyqGqXFEdUfwkJqGoPpKo9kcJff/Yb6n5Q9xsK6nu051D2g7Jf1/4JgbLfgKAMZb8zMyZQ9RsuqNup+k2+iZQiaCIdJsCbN5FuS9rVyJzOTOz3VtauQvV01j00Z3YggQfDFQnOSsKIQ1pwInyyGCo4FaC0DaVtKG1DaRtK209Y2pZHDxnLrx4/zW+vn2dVOwkC4+gRIlE4YqLRhDCd5CIlFzGMhpEU9ZdrOCO5X+AHSiHnSAuK2S8YfsIMBBSzoZgNxWwoZkMxu4kFh2L2M8A5FLOhmD1uhEMxu4F/AsXsIUEZitlQzB4dqKGYDcXsUQO8rWI2Pr+YnU3l91XHlpkDlc++/MYlbKEUCcU2bK49tYpZE6wkWmGqmLIMQwkbSthQwoYSNpSwn7KEfSbP+E+7yvT3ZXxINWyeq2FzhpEnBEudMFT8qwxDTFGveEBJWCNxW3Gfm1brM2dflGFoch5se4LLBWqcEs+JtF5zbKmKWHgWrU/W07nkk4zlgDjVH81h+erycJI09GURcpQdfTY9oDcWWDYTIaXBzhDkgmRaSYIYSgBHzAuJmQ0jAbjskXa8grQA2I0ElbXYRqYQUUXEHJeCWo91SIZaRYcdI1KNBNC8v/xxlef0vc8AAH2GoLJF6mSYDePCGxoiCcalVyRhmlgprI5jAXRf/OJ/nRoqsXzxw9t18fFi+fLychku00W0wrCZj2SHz7CZu/7mJyAiikKg0RXdsFIrxEhxDL3jNlIcnIAcLuRwIYcLOVzI4T7DHO6mb/x57kNCWFjqOeIYORq0wlErhin1xBNumRmJO4l7bBM74/TDDYC2r6cXJjUUF+xEesF63GUHO5Hqp2xhJxLsRBozwGEnEuxEmgLOYScS7EQaN8JhJ1ID/wR2Ig0JyrATCXYijQ7UsBOpFYzDTqShArytnUgN6tj5bP7w69i5629cxzY2Cuw0oUV3YHCCOOaUTD+pwFxwqGNDHRvq2FDHhjr2k54UKRrUsS+WxVfX3wZbz87uSTJWM+pEwo5WhukYSQiaM66TfebIjeW0SNxjw686VLrT2f0Pt3b3ao+muxcTLZF0I0SoCr7Aur/NSlAVHEhVEFJxkIp7anh3nYqDqglUTUZQNYGMMmSUx5BR1qhhRvlkXN1bZlk1yiyfuI/GGWaLOUYW8UCMdsmlE5gKrrBlTljPEYEMM2SYIcMMGWbIMD9lhpk1yDD/FtZfFn6w+WWRyy8LoYmXVDlBqXFRO6wC8pRhIgXGciz7pQjtLyyTokFqdIul3Y+JJtraFyDkldOThbzyMOHeYV45MC6tpcE5LaziylCcXG1ukjOlrCNjob/CPZ5cpg5X7YbGabqpuQ4lCXnoF6y/zSiQh4bu/c7cFgE1w+GiGtr3odgyaoC31b6vGhZbTqSYeiu1iEalluxdNC60KMRVZNRjxpSKKFLOrBHepvUwekYjFFqg0AKFFii0QKHlubbyJyGu1ma+HmypJdvKr6JkwVmLGUYBhSJok+nxcGW4DdLwkTizmPSXedBNutAfQOrhu4lmorsWJ5RhoL1/sOCH9v7nwnEPqboBpuomUlbpD+NQVYHufkg4Tw3RQ+nuPxlqP5Pu/hP30TjpzJXW3lGGvWNSpkXPWueFMJgyh6R3kHSGpDMknSHpDEnnJ0w6M14h6fzwmp8+l4xzuWTPJdaEk+Ati8Ehy4PQxDlsA4oCj+XgXtybm0pzftfFcvH3NPr23eRc0jqi2bmfTFd0Pw+VjvXkVba8LlYlG4zaCackDhpjTbkwRgbrpbXIGklgKyg4i3lnsXTpyUnjzWyZtHOx/HZfJKQQSbE6lJiPmoP9W5LYoVBxmVA3G6NwK1M+2FyNkElCCmmtV2nN98JwQWhyLRnXhlO1Xf8FOrn+b1eD7XNN1+FnxZ8OyR3YPDSSROuuFvNw91XBDRLSSOaV2GSnhD77el4/GHmnOqr8oZ0xYMnarmhrgx8unXjbcpce56vvyb/VBoa8tUkP1sr7eZzcYziA2ae7VwdZSt2e7BdlWOvbm83BNwU6AN978NUbz+/3+VVC7yaDNStyfR3hF73457jgdtJaBqIBbvfgRr9bywuz/tKfoUwP4MfV0v1YDD1Oq1fEGrN18euwdxysi5HgyIm20lNCsPSEOo95YBJxt7GE8nxovn042z2QbvSiiYCPDV0GV93BNOHO9doRG8hcCfDxQnt9vZgf/vZnc7UKd2+Ly0e7+LrpwCnk+Jg82sKxNbMCMffm2IgodzxRtTneLVwSlH87fzB4wXZQcFq0M/hfF+uD8Ysmpkfb9OuP/3F5+1DwxblxPKecR12nX5aL25vtIVy7JETG/AeHMJj/IZj/wjhu7P9Bt9WPF19uftxO9ePBM5/MKoF0sIRbLbyMCblGMREo8igUhOBa22e/SpA+Vgm8zQAhWr2975GRuV9JPvzw7epiOfuaLuPRCoJRjR3utedcrJNEgn+0pmBU43jeurPe2quZe7TSYHS41LQ15X/NVjM7u0oYeLT86BosMYfDbjeiVXuSm6NMa5zpXX2usie46Z1vAJujsz1+cmLz5Gp0vVabqwhZf14url/fLpdJD/eP9/u8srjF1qc9ghTV8Ont2SGrYUVvRFqji77OdKUKjxoKMzPhY8TgrX05XHJamO4kaLa0yh3MfAQ3mG7dyH/tnMmjJ9sqghh2xAZmZeA8GKMiEV5RzKJAUIit3S/YNHE6sepsC4nmDcAFq1SyPVkn6auCK0prmPWutnFBVxPpoiEaMWmwR94ogYINyBNKlGMcCrpQ0IXuvzrdf9W6tbZ6Pajy7ImKA+c4IEg53Vs82f2U053TV3zcY5W2gmf2/Xj4+9mhMaagcugVQQF6oTzbdV1MFLUwKgPmnmLnmDNEYaaVUIgzxp59xrOXuthGuqJG0mM358X3pfM+LApTeToQ5gwntzc9PU2lL/5VhiGmqFc8IOTRWALh/nbOtfcEJxYStye4fBmRc8MkrIrP0Kf7TtwwZZ9ux6oC6AWfrkOfLmhqKbfERMWFtDZyLSJymqaYX3MKPl0ln46179PVLBXvBqxO+PRoSlzWVdWM9P3RHJsyUZO7Kj+b+tE89J5LzEix7M13NPSBEGVjjDZ5wd6p9B9K4Uy0jhFmtR0NkVV/fnD9x7kB47vZH0/AZYXRfTD06/emtfFTU0mdcnkjh865obm8bWjIGJ3fEm8kYmS54UXVjiGDQvJHnBVYOqyExwo6r6t7I4+oaiqibo+4s2n3fprfXn8fBJ+nAHcV8O8jFb7DGTe1Yd75Pgr9y4lMGcLCUs8Rx8jRoBWOWjFMqSeecMvGcuRejy0jDYE4sfRYU3HlsE2Nwjh6hEgULoV8RhPCNPFGSi5iUfkGbNfDdjPzODVoN5NW1mp7I5BgXEtMhTcaY+4lQwxRiaTZpjEA2d2GdY/W7InBuw2RZa23J1Qjo5F2SIhgChYqp7jRNOqEecB4D57JA29yYvhuKq5sfdpIIrSKiDkuBbUe65C8ExUddoxINRJsk/4Iis8vtE0N1o0qkkd3HgTJDOPJLtMQSTLW6RVJmCZWCqvjWADd13EJf50aKguapm2yZ7F8eXm5DJfpIvKQIwQhnoI7jLx1yhFETZREJm+YuaC9HAnkcH8H2PRagZsawPuUbU5tpnLwU29aA8c+taooT3nskyUxBZ2WeSWRYNIIJQ1mRlEc03s9Ft0g/bWNdtthMTHV6FaYj5tHPOcqBGckU4pgbYnyuDhJJ2CrDOKQP6+tDTW4FCo8wKc5a+cJe0qK8zrr9pRUFeCJVhPJooNWk8EwmnaoSRPpPVGSo8AQKfwarILzKLk7ggssjEZUCeg9qdJ7smWvrsHmdAyMb77NzfXM3cfkvinlEbVdQ6xvhXOiLwQn9zcWrPDSaSElo8h4gwgOIWjkDfSF1F77uwLJ1JzgruSYPQ9YaOIlVU5QalzULllM5CnDRAqMJWhDXW1o36ZNTA3aF2B2NSCB60gUKk4I5kqGaJQmmKuIjFPj2UbQ42HxnW8LmZhCdC/Q7KHaVrOCCDUtFMowHSNJfhJnXDvNOXLQrFLbXWqSBi5/nNNbJLoRYvbIYikNdoYgFyTTShLEULQeMS8kZjaAHtTUg/NJgSaG9WbsSRM/SL4/PMNB8p0dJF/nsMPtQxnsYYeHl9eYG9MyxhlC2hiONFaOI0MDxwJbK5XCErgxgRsTuDFb48bEn9Nlxdnl7fazQXFj5o8y9izdeIxM8UCK7myS9IWn/znkIh9NB0iPG2tKz+W5U5yLdFWFEqQYw4XVarHc9B4/+u3kXIC2xJbzbb3WSIe0GmqnpCJcW6lZZLGwfl7H0TTQ9of1UmHdPbSPyQJ++nmHtk9vluYf6c9ur9MYm8F+C/Pb6eG8BZFlu115wDpaZrAIlAibArjoBAmOyYgUA4zXxnj+1OfjDyzsCg17l2daMG9HatneVUmEK9ITKnhelO4jdsHhQLFN2FeQqaiN9NITC488s/T5plukWIJfFY66W6avrqYH9FaElt1pRgMLxiCXsO0M5Y47S5mRMr1IPx3gvC7ODxsq8o9sfWia/ra8mh7M25BZtuHEaGOlZCowQUhEgWHEBUfcpqhUSGi9rl1HKW1lPPLEisdxcXV7uT0lt0ivTA7hjeWV3bpJCwsuPWWMMBqVdZ46x5SQkjKOMaC7rg0vPR76yNO6WM7mj8pgL1fvZqvpwbw9wWWjUEcwctw6pjEzG6o1Q7CQJL3DyYkBvHfrm9+tv5uxCndzkk5LK0LLVss5FkIoQpDkIUgbOZOYOxMQUSH5MIDzul5LPg388JEVFaf02HYr8PRiz2bCyuE62qA1FdIGiX302BvuozXRKmGxdgJw3QWuNxXNTy+9LyqV83VxIu+7EKfnozQTVpaGCinDDZUiBIO01sVhwdZwpxhz3orRHJPUX3dTlahp+6h+nv35Yb38MPufCfY3nSelbC3Tx+RjKBSUTr42j8IJYpTCxnAlhIO6fYcW+mIZbswyfFjcLl2YZHmnmbCynkdQWFBKFcEG4cCRxYp6ao0UxrHoAdd1LXSVgH/7qP7zdrEO12FtJofn84SUzfhhzoojl7CLwhcbYgRD1AQqRODJC4GMX237XKWivH1E78P14mtha8KrpfkjTDAwbCKrbJWmODgMqSI65CrKoqeYKKEdJtxYjKEWWRvVuPKTSm7hx2834eNiiqm8s+WUjQaDEsRrQ6PnmAjBhLLCYWaExZ4xiAZro7lKwnX7lD6GP9cfF68XPry6WrgJetANRJU9KCFg55knyX9WwSZLzZTUBaOJl0pzAv5zbUxXadi8/6B+Dcan0aeH6LMFlT0UgUQVXfItiImUcKKps5zG5HdwE5QFIpIO48EUul/+VuycmRyWzxNSli/BYc4ZNYpTrA2XwWuLAxJSI08xg33itXFcPQX19vrmKq2e00PxGSLKVrul9J4RgkJI3jFl6R8VDXIEIY0R04DhmhgW5fueN41lm9e7l/t9TmG7EerX9fXV9u3288kBuzW5ZdGuiv2PujhA3Qfl0oc0GWocSXDUcgQ9TLXRXtpDfPKpTRvpbcisElNCZgczHQBTwtHLa8yUwEKx+dlj7EWKm21kThjnneBaeLVlmgCmBGBKKGFKKHQKPWYEMKtVWK9+DMvlYvk5/GnSfYT/uJkPggwAvfjn1hawcltw4tr7MQOlinD8yppzpUiCiKBMRspt+mkts4Erp5M5kJrS3aPGRx+1X7jPq/Xy1q1vl4EM7lnz7LM+evH9PGyaedhll9b4aQuHqQxaW4cQIYb4pNDGOuyssZoSclKxH1zV4B52XrGPXfvTK3bJlTV+1ERSSyV1WuLoHImIEmyZ5ARHo51R20dNVfZRD9WCk5MP+qnsNzrxmNu13sxKR5K/4liwSGGaFm7ilCbEGSsC3vVp0BJ9PvStnv7hkhxVD44KG8wliTxgV3isIhYJ8XSrOOLRbKoR/XESk8PHuv1R/PEEKXhOSCNLl82NihxZxA0RPnlSgimTjC4Onik/mn0wnPUGTXoorfsP42fj0r/To/etJpRduoMe8YRKrX4vC2PTCL9qOINCilxplClaxUFwx6SiyelRlEjN6c7rKfY7HyyIB7c+Xy2uQvp5fW3m/o67Yvd+CKslza2W0lqElY7IpGBOieTt2/RPivR8cDzqsTRCsP5WS/ZYOx5CpKBku4PHxExTPeHkGcVdNAEzGhwRQnsmkGBUCFkcVSXCWHZ2iJ5wO7mTxYs81Ydv13ExL8a7vlnMQ3E07AEcK0HReBYT/pQhhgqulQmSoUCIJUUfMBkLKUtfUNxmZ+qtslMDb20B7bw9pUq9vTpj7SthvCg1FX/4FDWw51EF6qMc9lyqQL3UxAqjfqw0WoLXDiViIwnM0mQkuBEU88iSN02CDZ4EpYozYzcriqgXXXwIy68QWgxrWaT9ZTsgtIDQosWYGEKL4YcWEhEjUHBUSEV9WtFJCFEHzjHXlI+ll1T1Z0If75DLLbETRG4N6eyDivLOicoDQUQBEQVEFO1EFOJxl8YD6bx8e6eK+7j+fXqqv4WPu1scUHTBILqA6GIoK2Nr0QUNBBFKNSJOShWYIpxSzr3UXGoUxkJ5IvvD7eH+rWTjPi7NbL369OGLWQa/eyxp+JnbfDA99J4hIoiQIUJ+BhGyw9omd4iK5C8mmyrTpxYltzFZVO0NHstJTro3c8oP91JVdxknhuIGktpFzlqejpyrDgpRNETREEW3VJerHkW/9D79ckM5tILYeVBrJsTOw1gnIXaG2PkZoxdiZ4idh4TH9mJnKR1lNmJiQzSOM8ONoVz7SL1UjIyFbau/2JllIsJSR3Fq2K0rn32FuV6cXDIURMcQHUN03FKNmdXrWn19n5JoQDEydK+mGLnHXR0QI0P3KsQXg0die/FFUM6QyFI4odLKwj0KKmpnEEJOxYjHsjGuxzTj4xPSqiy1U0PweVLa1+Ro/W7WsgEh4oCIAyKOdiIOWpGF4+XNzRACiyw/FUs3TJVkWnKkqeMmICGEJY5JTZywI1kU+yLcmJx/Vliy4/5Z0oCrmds+7nwpzSW7TEJ0MjljhUkyiGobiKSGU2zGEiaQ/pK/5Nim/I1VmhhK88LYuVqiBhtB+h54VOBRgUfVUg73MdHnY+k8CGsevhuCm4Vxzs/SGBmpixyujhRTa5FFKgSrguVSCzWWBQ71uHm29MFmUTKxZe8MCWWb2yMKzDAeigYnI5DHjGsmjHTCJ89NjAXDvSGYlx6Jk3k+af701WSeX5kJnlXYTFrZQ2WNLGINgmXyWYhVhkYXPYmKIka1GUt5rUdklx79+9q4L+HTu4UzV/de/m7/nuba/GJ6mD5XTtlgWqPAIzHSYqeTR26ZjOmNZkEhiUdzCFaPaH58Jt/DjPtL72fF99Lz2v7mnr84OUg3ElYO194Yx5N1RprgFEkEKr33xmuhsfPEjyVJhPtruFalYejDJfWnP1242bx6O/9qrma+fI29+7PJAb4bIWaZ+1VhyK12lmhssLDJsisnNEFeSDaaMz17NPCHgdI7M7+8LU6fTObpKk108H41ZfveRFY5VCsqGGJRaxG4EEZh4TxX1vn0S8zcWM6j6A/VstS5vEsy7s+cvFguXFitFiW/2eQV4+Y8xYmhvFXZ5VAvhMOWK2KMQgZxjjjyiBKLlQ2SerDltdOC5cLaHbm6+TFl811XPHk+SBp1RMVJbT6IYJPvgQgNGCGprNcEsFsTu0dODt5O8mFxu3ShSAWsFwfvpgzoVmSW3ZeGrLMSM62D5cSh6AIRlliDsaPRGEB5XZSXCutubf34j9nlp20V8tPr29V6cb19M2mQtyCyHMaRp0IGrTRzWqhIJPHYOqqCZJYiMhbeoh4x/jgL9viB7ZC2f2S7t5PGeUti2+/U1FVaevJVJOjzgT4f6PNpp89HnTxh5HssUrzevXxnVuuLjR2/vp6t15sc08FvhtABJHINQN5or7CTMTqiOKPaY0J1iCp5kY7LsTRaS/zE6a0z0TOxdbZV2eUPGXZGW+JclCqFUOlDzBXyOEYmlRgNR9KTcnsd5m+mm7WtJ5xsrTlhkwgSDQ0SYYsUo5ElU71pgBMSjQS3sC+mqyqZKtsX89PX9O+b2eqmcKeKCYv3H27tyi1nNlQtGVDNpODRBmq4t4oa5WLEJDrLMHXGjQSbPZZ/q3np+1/s3k/Oup4rphyWp9IX359/AF3x/XbFc24xxdp5xa0xtqgVeKesSNEwE1yOxcPtMXWai002K+Z3m/MqxPTh5lmk8dPfF+mTySG6BYntEqa4uJ9KGdOzYsV9LpV9vtl858O31TpcQ0IVEqpDSaiK4wnVY6DtUCwyOKQ4s9oIag0X3jiFfdQJLMFrondZVXJWVnXfsbRrZ/p1fX21fbv9fPgZ1SgUisQbpoQkCEWUVmFpi77Y6BwfC18s6W9HZXYdKUdOQQT3/S2svPUllm09YcYKTlXEgWLLDfIGMaW8J4hp5qEsXzvSz9eXXxVLnlumP1jdf/1ruLqZILibCSvb9Cqp8MQGR4w3VsuAohHSeJ2Wf28FNA7WxrU6Laz3i8V6+/L7dKtflovb6fHBNBVXNqNFAwvGIOdwcIZyx52lzEiZXqSfkJ2t7ZWUNnge6Qn6JazTX91epyGC347+t+XV5ADeiswg6wVZryFjvI2sF+w27g3hsNl4wJuNt9nffVrsjOzviWwSZH4h8wuZ37Yzv/LEyaDVdBWyvsNbliHrO+BFGLK+zyu2gqwvZH1HiWvI+kLWd6TYhqwvZH0ngHLI+kLWF7K+kPV90qwvaSvrCxlfyPhCxrfTXl/cRsb3/Wo9tKSvgqTvC9kf8zMkfQeW9J0IUQLtDeFAlJABMxAlDBS3QJTQIlECFNKgkAaFNMA1FNKgkDZZbEMh7YxYDwppzw3lUEiDQhoU0qCQ9qSFNN5WIe0gQQ+1NKilQS2t7VoaRieKaYcn2118uSlR3U2W/8vNh/Wttfuk/93b4RTYeK7AlvSJIEuUQdIZ54RQKlKHHffSJLUaSxZX9sfTrA6zPy2CaWqLdoeihJIccJcPA+VQkhsobqEk12JJThCDdNTeUOG95RZRY520jgUjLApj6eTpL/EldfXFcZvV2c38+/z1l+D+eLvaZenN/FXYPq7Jmd5OZJg9bo9plrxrr6SkVFpkvSXIRc0ot9yIsSTHhpn+/X3+S1gXecz3YbU9EHQXxE4K8y1IbJ/2ohXSXq257JAKg1QYpMLaT4XJDlJh6eW+MrpYPq+EmMXBUxa8iD5gHj11KHmtlIggjTRmLLG/7G+J1ofSah1SE1vBuxcoJMcgOTYMrENybKC4heQYJMeGmxaA5Bgkx0ALIDn2hMkxhjtKjh133CFFBikySJE9j26x9PJv89n6eSXHkFXWIY1tpA5RbZEmCsmAOFIRp/9GskL3mBxrp8WpHEwTW7u7FCUkxCAhNgyUQ0JsoLiFhBgkxIabCoCEGCTEQAsgITbGbrEylx1SYZAKg1RY+6kw2kYqbOMtJkN1Ydwf6Y9Xe0UeXDIseyAVCZgiy9NyLBhOLi1TITguWcITjwLTkazOuj9uUnVIL9QqnCa2cncrTEiIAaPpMHAOCbGB4hYSYi0mxJBjjjHruDeMEROZDSh6YQUlHCErRoLN/lIBnFVZHrdz7tfEqfKZNhAVJHkhyfuswA5J3ueuBZDkfcokr2wryVspEIU0L6R5Ic3bdpq3SK82z/K+Mbd/bv4ZQiYX41wqlzlvWYr7LRbBFxz7mhgVuZbUs/STjWQNxrK/nNUjvaoNmqktwo0FBjnZFwJyskPAMuRkB4pbyMm2mJPVGBmZPEuldaSY2hS7IxWCVcFyqYUaCTb7i9xZqTP4kKT9wbvpGdb6EoJz0uCctGGCubtz0iZyBkmP29TgDJIWOnI6OoMETpsaZG0BTpvq4bQpYgLlsUhgYiali4FTQyxhygSBQzSA8LoIl+c+r+3ok8V5W3LLod0wbrh0KppIlHNeWh5s9E5omv7HIeKs3TFRq/K5fQ5vDs58/O+luZmi+96q7HKoT6Gp0MojjJCiBDkStfaOWmE8VR6PJQfYo40vL7odr/dfLBd/TzN+3Jcx38yWq8nhvSWp5ZCuvEEx6KJCi1IEy4g2KrntCfRCBq4tIL2ufT9sXTz1zPYP68Ksv7z69j6k17OvxZeLX0wO8m2Lb98lhHRbXUJ35U/oBIJOIOgEan3DJ26lFeguxPnbfBZnwV9cGRfKf/tMNn9qRIsan2GRYZoQhiMz6eq5lVIJYceSWUsud29rdZrrrA6YM8A1sWW8R8lCD9ILDj1IQwA99CANFLfQg9RiDxJkhCEjPBigQ0b4uaIeMsKQEZ4G0iEjPMiMMGstI1w7aIXMMWSOIXPc+h7SE0yBj+3Gzlhtm2OKN8kupQXThdVqCOlgkksHC4a5UoIoY2wwgiCCReCUSGsFF4KMZJkGLvWOllWq76cI5uulcetVeYrgRI7VeJH8Q4IkZiRQJxVSOCitk2l3Yjz5gP6SrPyQR7Gm5ZoYkpuK665FoAKRSK2hwc0DNw/cvNbdPFnXzbuT18u4udri3b4LeuPSPb2rl+UKmYirByyhw3D1tqshrnCYaG1VgxURVkRYEVtfEcXZK+KR/W9PvyBC7mP2QsGCOIgFcfK7nTHR/dWFYb/zU+x33jl9qJHTVzo6+Hzg84HP17bPV6wqrfh8d2Vq8PyGs+CC5zd0z28iLCC9en7AA3Ke/9ceD8jOCxQteoEP5gBfEHxB8AVbz/+phr7gXZ5+p6ZQEhvI8gslsWH4gbt1kbSwLj7SNVgTYU2ENXG4a+L3tQ/WRFgTYU3sck3c6xSsibAmwprYes3g/D6Rk3unn35tpLA2AqHGQNbGybNncNxb2QDoM54BfUakWnujhJDBJq8lUOK8dSx5NEpTyfVIYN/XbsVjm54e+zcA9Mweseri2oc7pFmD1AkdgrAHwh4Ie1oPe1CDsOcohc7TBzzQKAWnmA4/4JkIcZqUvbl+wJx2VpdUW8xpu7w3a+gIHpkBXEBwAcEFbN0F1M1cwBOUcuALDmIJBl9w4L7gRKhFMeqPKwrIRZslwDsiFyW0uXuYnQr8RPATwU8cEJPGRmWLDS/vw2pxu3RhKwhwDYewIoNrOHTXEDHNHHZeSUmptMh6S5CLmlFuuRF8JEDs0zWswwtxxHpNDM0tSKwlJo3S0cHnA58PfL7Wc4O1aePvaWlhr7bGpYjLNn/0ensrQ3D9GLh+L/riLwDX71zXz6sYqHCIIUq4FZ55KpIn6Ik0MjA6GioN3mOJ+DQlekUjNjFQtye4HOKF0cZKyVRggpCIAktxgeCIp5iHCRnHgvje8M511q/5mDyNTz/v8PapeBzbh7WaKswbyyuHbk2Zl8Yxryi1yU2XGMsYvSTUKOcD9HrXRnd5WPpgkveLxXr7crrnL58tp7ug/awTQCotCBC7Q+wOsXvbsXthf3Oxe+b8xq3u7qzC7/PXX4L74+1q+/61mb8KW1s2hDAedrYCI+bww3hBDNJRe0OF95ZbRI110jqWUGlRCCMBIib9OX7y0E1vw55NDN+dyBDCHwh/Bof0xuEPUY1OxK6oPRAJQSQEkVDbkRBGuGEotDMUm4PbCk1Npufie7xzL0yBiGgQCzBw/Qw9InLOGUwlCj5IbAjRMWIVOPbUmOQLjmW7Q49cPwWDWVdWbWIo71KU2SPTGEaeECw1lb74VxmGmKJe8YCQH8t+8P7Co0cl69IH+WBO0IDSWv/ZgtsHUJS3EEBVVTOIoyCOgjiq9YrSiR1AVdX39/lL719fmdUuAfJxMawIikMEBbuCBh9BMcZUVMZGqy1CLFIdGOeWGGSJQsKNBIgE9eYtstLOr50F+31+9W031J/B3RZf3z2kiQH4TCnloCxtCnqsEzRSYT0lSmFVVEeRidyxMJa4R5P+kgGH9Y521uaJQb0jKeZUAWvlBS9IPxRigtjknwbMuFdMMSqIHIkq9JgCOBTW6Uh28+Dezf7YjT852LchMkhzQZrrGSC9/TRXhb3NbawikOGCDBdkuNrOcHFefb/z9se9VqGnT1xlj8DzyZEkgkRDg0TYouRPRoaxC8wwLuRYVt2+Cq6TS1wVx0R8T1xd3yzmxVJVmrj6cGtXbjmzYfm4k66gG62zj+hAzWDdg3UP1r3Wud1khXXvyBbYN0vzjze7M1s23/8tzG+HsBqq3GqoaWDBGOQcDs5Q7rizlBkp04v0cyzZ8/7ajwStsW36l7B+c3DMz9+WV9MLP9uQWZY+RGukg8ZKOyUV4dpKzSKLhVX0Oo4lm0j6Ove4JDd2hmmcGspbEFmWOZtzJkOy5IIS7TgmAXGtFSMCYxnIaDhyeswnljI/H3lir29X68X1/u10txi1I7Ts7jmMjEyOrdI6UkytRSmKD8GqYLnUYizno/ZXJWWlnmiKAOLs8nY32oN3kwP1GRLKFvqZsYJTFXGg2HKDvEFMKe9JwXHrR+OP9IZgftip/tDovCoCcLdMf7C6//rXcHUzxYNOGwkre5CbZlLwaAM13FtV7GaOEZPoLMPUjSaa7BHX1ZI0+1/s3k8P0WeKKVudp4ak/3cJt5JqqbnQAnGVfOtoFdZjYRvvD8vlB4nnEo77z77/6mfj1ovl9FpRWpVdNlNijOPEKqQJxjwGKr33xmuhsfPEjwX1PW5HLDVNDz3Hn/504Wbz6u38q7ma+QcfpwtKY6XI6O7PJgf/boRYp1eldq5mX6Cjn5e7b/2I+OeizvEw5l3dr9kxqNlBze4Ja3b6eM3uHo57lExUiEmDrSCICqQkNhIR7DlxLlLvtzih3UumOBm4gmROaXiHkgrKcMVQ8lJJSJFXUi0lBEnKxYKXjrAa59xXMHP7ystQDrDKblVTPODktDODRaBEWB9jdIIEx2REio0m29Jj9af0sdbGzcS8mJakBjUgqAENHend14Cm0bfSX3YG+lbOgHnXfSsT4QntMZ8OPKHVEurn84RCbhFyi88J6h3nFqse8l4zDID0IqQXIb0I6cVhpRfFCWasql7E0ycUs8eiuohQTOGnC1IK4XyMhkuJMLU4eemCjsSRkaI3T4bJ09Kauk9+lowgukwOHoSXA4NyJ+HlRNrC+wsvoS2857bw5E4Y7AxBybFgWkmCGIrWI+aFxMyO5XisHtN9FYT13c5MmADofEHdnYtamc/glJWH1AakNiC1AamNYaU25Imzk3JJ3EJgv4T17pjn1RDyG9nTkRzHQghFCJI8BGkjZxJzZwIiKqDAxuKHDGZ/2gm4TM0ZaSQsaI+C9qiBA7z79igX0YbPLkjNpRHIY8Y1E0Y64aOTYiRA79GAlyZfM5H+XVH4lbmcHMAbSuvusFnWrHh+sDZAYAmBJQSWEFgOLLDU5weW6fPii+EiLYr3qBqGEGCKXIBpJRGuqJqr4LmJmkbsgtuQoWAR1FgK6H3uyKnjUh6FzcTclHaEBgEnBJxjAvpZAScwWgGj1WAzhsBoNSBcA6NVJUQDo9XwsQyMVsBoNRTUw66zZwX/jnedkWaJ8yOxLiTQIYEOCXRIoI8pgX5HyrAzqpdhw8rw9An07A405QhGjlvHNGaGp9fJscdCkvQOOzOaBDofZl7xKGwm5sW0IzRIoEMCfUxAhwT6EJIzkEAfRAId0i+Qfhke3oeefin1lCD9AukXSL9A+mVg6RfVSvrlASfm02dfdC77EqnW3iRhyGCTaQmUOF+kYoJQmko+FuKU/nwarqqp2gFW/ntpbibprTcUV9ZfV9IgSSUW1KQVRMUYsEU8eB8LCzmWhEuPnbm6ycO6b6umBvMWJQctXn1ac2jxeqoWr6nQ4vdYFwJe/PqGu2tefKgKQVVoCDjvvCrkOUMp5iabNAXjUQrKkeYIIWK4jGQkQO+vKsTybaf7FxMtA9WUDrBx9olcYOMENs5njWBg46waGTZg44RKPFTinxPWO67E49Yq8feCUyjEQyEeCvFQiB9WIV7IBofv3Hcinr76LnPV94n45Roc88E5K9045tzItECqiJjjUlDrsQ5GExUddozIsaRK2LAA/cqsAgD6bEHBwVIvZH94hnOlqsG5i3OljKRRR6Qljj6IkBx3hggNGCGprNdQg2mnpL6b5MPidunCu4Uz68XBu0n3QrUhs6zNVsmPxo7YwKwMnAdjVCQimXDMokCA8to2u7R7bTfJNj5MkaufbYa9ezVh291UXnmPRAmUfGphrKUuECeU9lJ5G4kK1o3FI+mxX6R0w+DDSfaZg83TWF4sF5fLsFq9MsvpgrwtseWbowIXRquiI8pyKkVIL43BSlvsWYyA9bpYL80/Hp/E+P0jfB9Wt1fT62xtLrC7EyBQw1MFv08DRRso2kDRBoo2wyraSHb+7snCcF5c3V7OiprK5g6GULvJ8lYlv8RYKZkKTBBSHFKFk4Q44jZFn0KOxTfp82TB/Cap04iZmG/SWF6wLwH2JQwc493vS0DMJi+ReS18QMgR5FikITIthJOUwvmCdXHOyhMDG9uz+/HT1/SVN7PVTeF5THFzwhkigiplnxlvqFJ2XaXcZUVks67Wx24NJEcgOQLJEUiODCs5ouj5yZGL5Wz+KAf8cvVuthpEloTnsiSEFhwO0lOW9IxGZZ2nzjElpKSMYzwWz6RHEp48Y1IN6EzMV2lPcJA3gbzJ0MHeed5kKvw8/eEc6Hnqw7xrep6J7NAZ1n4G2KDTSFCwcx52zj8vrHe8c140yzFmYgFINkKyEZKNkGwcVrJRn0g2vjPzy9u0XP5q5v4qye3iy80x21dUIK/Mt9dXZrV6eTP7Lay/LPxq8GlHppzwMnJrrLQ8WmIdN5JFS61QmIzlCCopevNz5GH2rAUQTczL6UKEkIp8QfpTAkhFDjIVKSQVntjgiPHG6oT5aIRMUW3ytHzyKsYC9P6SNKWlktO5h9Uvy8XtzeQQ3lRckGaHNPugAd55mh3SkpCWHB7su01LsgppycYRAiQoIUEJCUpIUA4rQXmqG7KO2Vuaf2xs3m/mZghpSZFLS3KjRKTIK6kTilSSFCGRRCk9dQjzsdAjYqL7c+ebJNUeYGdizk17goMc5AvSH4Ei5CAHmYOEPA3kaZ4e5l3naSDTDpn2sWbaOcPIE4KlptIX/yrDEFPUKx4Q8mgk2O5x40YVD/PhnBffg7YJt/62JzjIufdoyyHnPvice5VW4DPjYMi0Q6YdMu2QaX/+mfZKnsXTZ9qxzqbaaXJhiLRec2ypilh4Fq133jiXbNBYIlU6LO7oNPSlSX8BO/haERiEqy+whIB1+EjvJWCdyF5s0R+XDGzGrpp3hNMSG2Qc0aAADaclNhJUtgiKkZEpmlVaR4qptcgiFVJ4EiyXWowF0P2lFFlpLPUwG/bg3eSAfIaEcgiO3EXircA8aOGpEcSHKB1nVAav3Gj6VfqzyIcMsaWu4Zeb3dsPYb1OY09vc+jZcgJuc+A2HxKQ2+Y2p1wLRoTFXhrvBcdWJ69CCiGjFNZYwHBNDFfahn4wp0nPaftvkazax+7ffjZuvVh+mxzGuxBhTgcIIzE4F3ggxjFnVYyMIq5olF5LNBoW3f5K9YeNctmi73bE9JfHf/NruLqZoLHvTI7ZKFNTG1RkHltGtDNCa4GkcxJzFByDKLN23vswhsqYs/Ty8NVEsd+S1E4kCAORlOAUfDpilaHRRU+ioohRbTwgvWk0us0WbNbm4pj5q3svf7d/T3NtfjE5bJ8tpxyasVbJfydISIWYIBYTETDjXjHFqBgNKVePdESHwqrghhbdau9mf+zGnxyw2xAZNNW+UNBU+5xQ31VT7eRPpOtv2yecSNfEc6kgpxyanaHCChuQMIGlf3WIyFNJtXIpEnVj6TzpMQfZco/o1FDeuvxy6DeSRh2Rljj6IIKVjCFCA0ZIKutH00r71Fubd5N8WNwuXSgiq/Xi4N2UEd+KzLIeiyKIYUdsYFYGzoMxKhKRHBjMokCA8toeS+nx9LtJtnshkovpZ5th715N2HNpKq+8P64EMpoIYy11gTihtJfK20hUsG4s/niPveLlZe4Hk2x+zMJq8zSWF8vF5TKsVq/Mcrogb0tsec6hwIXRqiAaspxKEdJLY7DSFnsWI2C9LtYrbGS5P4nx+0f4PqxuryZ41GhjgTXdsPxwrtLNFrBhGTYsV5UGbFiGDcs9nV3EWqMG/SWst+QMWyrkVwv/7fXChyHsXWa5rcvWRMxUYAyn/1OCSkmT+24DjiYGEcfStdvn4UWHoVUbKJqYT9OJDIE6FI4vGjju4fii55d5BFLFoZAqTqQfBg52eVaI7/hgF9kqydwR5wnSN5C+gfQNpG+Glb4posRc+uYs5/np8zU4l6+ZSKDKIFAdtFPTVqC6KzyR007MGROA1wJeC3gt4LUMzGvB9b2WzWV+eul9MX267OXi+l2I6yF4KyTnrUQbtKZC2iCxjx57w320JlolLNZuLNUl3COLYmlPU1W4TMxLaSas7PZSZQ1SGllniFfCRYECIoRp7migeCwtjvip+75Kn9XOtm/eTNgFbyywvftNznS/j2hOmdvN7i/Km++B0w1ONzjdg3e6aTWnO6vfHcpJ0iC5NUwwHbiNwUjlNTcsGiFo0LtiuDjR53XcuP08+/PDevlh9j+DyAxmfW2OUvhhig70YJDWuthQZA13ijHnrRgNR39/vjYr3SRzEicT80POlBJ41+BdDxjV7XnXmDfxrr+rDLjV4FaDWw1u9YDc6rMz2W/TjQ9kd0TWpzYOc86oUTx5HYbL4LXFAQmpkaeYjYWLpU+funpK9g4kE3M9zhEReNPgTQ8Y0i16041y1Tt9AVcaXGlwpcGVHpArfeLo5OMm7WIZLn8rLmLwzjQlUUVnkwk3kRJONHWW00gD4SYkH2UsfkiPznTpZqpTMJmY73GekMChBod6wKBu0aFmTRzqO40BlxpcanCpwaUejkt9fp91Mmo3Zhl21K4boQzctfY+IqIUCko7gnkUThCjFDaGKyHcaHa+D7LPugQuE/NGmgkLXG1wtQcM7qH0WT/SHHC5weUGlxtc7uG43Odnsf/zdpFuPqzN4F3tGBQWlFJFsEE4cGSxop5aI4VxLI7lmMxhZrHvwWRiXsh5QgLXGlzrAYN6KFnsO40BlxpcanCpwaUejkst0bku9ftwvfhaJArCq6X5I6wG71kTzFlUXODkiniOXJIMoiZQIQLnSOGxOCQ9JrFLH2tFtEzMF2kkK/Czwc8eMLZbTGHjJn72oeKAuw3uNrjb4G4Px90ujow8z93+sF5+/HYTPi7+trwagqvNc662poEFY5BzODhDuePOUmakTC/STzcSn6Q/T7v8xOjjJPvpr26v0xBhexjjtw1opuaVtCGz7Fk3TtOIVMFByVWUyNBAlNAOE24sxmNBOSH9BZS4siP50B5ODNpnywkCSQgkB4zrNgLJTBcrZ0gIQjZOLONRCsqR5gghYriMcDZZ7cp63gztX/wartIAkwNzTenkkBtkCsGSWUYuSKaVJIihaD1iXkjM7Fh4Qnp0NCoIq+yYuMmB+HxB3ZXOK5wgVs19gXQepPMgnQfpvAGl8844IWxr1z4m4X1cFGcfvrpauOHvAONBCeK1odHzpEyCCWWFw8wIiz1jwP5b3wWpcsTVEbBMzQlpICrIeEDGY8DQbrF0jpr42Qd6A642uNrgaoOrPSBXWzZztX9NDz4Z5sE72ihg55knimAVrLKBKamdFtJLlQwN7P9qKddXBSoT80XOFxQ42eBkDxjYLe4DU82d7J3WgIsNLja42OBiD8fFrsdo9qp4zm6Z/mB1//W+nP30brbIudmSGSs4VREnH8Ryg7xBTCnvCWKaeTkSr4RS0Z+fnWfpOoGXibkkzYSV87c1RkamNUJpHSmm1iKLVEihZLBcaqFGguweu5xK7VVaMuLs8nY32oN3kwPzGRLKIZgbGYikBMvk6xGrDI0uehIVRYxqM5YUyFO3Vb827kv49G7hzNW9l7/bv6e5Nr+YHI7PllMOzciqGDV1GBsRsJPSROwYlia59ISMJv/RH5pFfif1kaWziMN/mn+dLRfzYpPH5LDdktSySGc2BevMa+EDQo4gxyINkWkhnEyeKCC9rudR6iReXN1ezua7Hz99TV95M1vdFCHgBP3oc0SU3SNgjOPJ50CaYMxjoNJ7bxKkNXae+NEwXePeQKxKUy8PncOf/nThZvPq7fyruZr5Bx+nC0pjrcPy7s8mB/NuhHiX1RZ1s9rZ+LQss00+2+9/BjltyGlDTnvgOW1+HCdVNLtDCWmJkTaIWs4E8c5HExFXRjLHbBKc2q7wmJzJ2fh9S/i8sMfhIi2c92wcWDewbmDdwLo9rXUTKl+re2fml7fJcP1q5v4qyevg/b3Whqcv1GWpZBDSRZ0OaUxSaOYQMcQFLCzRmFpjxpI+w6i//iF+SIxSHSwTC7saSCqXZKCaScGjDdRwbxU1ysWISXSWYepGQ4/UI6KrLRb7X+zeTw/OZ4oph2WJrLMSM62DTas4ii6QZJ3TUoUdjWYspy73WN6o3oX7oJFowiQFbYgsW9jwVMiglWZOCxWJJB5bR1WQzFJExtIs1CPGqxzot4/Dd49s93bSOG9JbEA1A1Qzw0N3c6oZVoE9uqoHX5bmw5+/LP7xcbEVz8d97uDHuyzCf5nlzKSpHqQAOaQAIQUIKcDhpQBlxab9I1rfo8S4DML7qALynnGFNCUWMxKNt54ixDcSY91LTPFGEsvZyQ6lZ6zwXPIYkeaKEmqxE8RyxD3GlEa3KxfxCkXww8Xj4svNwQJ18T2F+n2FgrUE1hJYS2AtgbVkKmsJrdh6sGtULF7vexbT8lLIqFhdipVmfX21fbv9/JylpPh+CsRgIYGFBBYSWEjGtpA0k9hxK9mh7FTkFCNvtfI4oSty5xWzFDvmtQtC75aRQk2adbCVHWoCSwgsIbCEwBICS8gElhB+JitoyRKy20ZyGWANgTUE1hBYQ2ANmcQaIk+0mt8v039Y3C5dKAgS1ovlpzezZXDpRVpxHnwwhKZzmm06p0FRGo0T3BEaqKRY6Gid0IJqwsfSdE7VX56WHKoUNa/MKhzAZWqdMI2Ele08dzpQxzg13DAjCEYoCoyiVhhHbuJIgI11b8AWpZwxpc/qwbvpbqpoQWI5iBPNSAgOJzebWq1JQAEj4rRi3pNA6Fgg3iPfcOlByjVX/KmBvA2Z1T7ao9b4+xiefL7ZfO3H1f1PYRczhOlDCdMze3XvwNujXJhzVnNe7AFRjHDpReDCWuFkpExS3dseZlZBLkeUusschtUmcIUFx8oyFoI0wVChXfotUoTtosoqR+eV2rNCRm/XxTcXSwgrB+ia0P7IpSCshLBynD43hJXDCisppiTZax545MQGTqlhSCFCmaLW8tEQA/YI8dJTPesu+VNDeStCuwssK2yYO2MCiCwhsoTIEiLLp4ksVZWTIksN2vvgbper2dcAhctheykQYQ7TO4EI8xm53xBhDivCRMJrRYlDKcjU2CHHkTNGWYuNkk4BxGtDXOakVXvpnxja2xXeXcRZdUvLeRNB5AmRJ0SeEHk+UU3z7Mhza5kLSUG8OUCfBeLNYfooEG8+H2cc4s2BxZsYa0tZIIRjHlUkWDlrtbOO+kC8hopmfYhXD5mOLvhTw3gLIrs7xqxRbHlkeIgoIaKEiBIiyieKKMXZEeURj+DpA0qcCygn4ncTCn73cH2SNvzunUuiGrkkpaODRwIeCXgk4JE8kUdCq3skO5tcdmjD6pfl4vZmCO6IyLkjOkhmGBfe0BBJMC69IjoYYqWwOqqRuCMY9eSO/HVqvgRONnDfI/3y8nIZLtNF5PNyQlLhiQ2OGG+slgFFI6TxOplzbwUZCeYIFf0VVdR5R8vsrdTEQNtUXHC+VJ9nX8L5UhVR3eB8qUwVRSkkcVE3IRobLCwLSjmhCUqAZmwsFXDSH54P/b4TJ3ZN+UDARrLKoVpTJZDRRBhrqQvECaW9VN5GooJ1gOraWbhcp8Jukn30s3kay4vlIrmLq9UrM+VUXEtiy2HdxCLg5cppmQx3kFwEpKVmVBCejLoHrNfFeq3IfeMzFg9l/xzfh9Xt1fQO525JaneN1qRe5vmkW/8o7bwMcfcHL29mj/J4kH2G7DNknweYfS6qWxXkktPtDqXklbPMIcGp9NY4b4ptUElWwhISVBTVktCnz2n8uDSznaEbQhI6WetMFhpr5QUnSEiFmCA2aVTAjHvFVOGljOX8ecH6SkOX9J2dhszrK7NavZv9EfawmZqD0oLIsnlvZ5GkAUWnEcdptcAiLarIIMoNCdKOBOVE97iZQNZ+ZEWf/EQB3lBa2ax34E7ZoJX02DCGCBEyKprW/+QpejKWGHNgJZ3Xxn0J23+LI0K3v92s/NPDdkNx5ZOFzEvjmFeU2hQKSYxljF4SapTzYSzJQtkftnMNaI8C9elmB8+WUw7NLiIUWUh/J6UQzsdouJQIU4sTuMVY+ONJf3Bmh+vqsSTuhKF8loyyWW1JrA2MWkdxxMpgHDBFgimjkBV8LB4H7u8Im+xWpdwSOl1UtyGyrOeRwkOpEVZaR5ostEUWqRCsCpZLLcbSntffZgFWmu96vZjH2eXtbrQH7yYH6TMklENw5C4Sb0XB+SQ8NYL4EKXjjMrglTMjQXCPB40d+oSlQfyXm93bD2G9TmOvJofjs+WUQzNnGHlCsNRU+uJfZRhiinrFA0IejQTNPe4oPwzbT6ekLr5XMCbcGdWe4PIUCh6ziAwxXnsRDFXJnkvMU5gYmFRjoVDosfmvRo1h++PXcJXGmhy+zxdUloLSMceYddwbxoiJzAYUvbCCEo5S2Ah4rovnQ7r+zGN6vbi+WUwY0Q1ElY0RNbVBReaxZUQ7I7QWSLrCTKPg2FhixCds78uZni83h68mCu+WpJb1vo0MRNLkfgfviFWGRhc9iYoiRrUZS8qvR+tdWl/YJqyKnblX917+bv+e5tr8YnLYPltOOTR7YxxPKEaaYMxjSBGl98nPFho7T/xYfGveH5xVaWPhw9TVT3+6cLN59Xb+1VzN/IOP0wWlsdZhefdnk8N6N0LMKYKKkgVnLWYYBRSKYo4MxnNluA3SjEUR+tMDffgIT+cGPtza/exFS1t6nqu1ma8fvtv+xeQ0omtxZg97JwhxjxBG3jrlCKImSiK90cwF7cfSGdufbmBUv8uz+tOcdk6yV9nmtCY5VUhhR4xRUSlUeFcsakSUojEQNZaiU39aI0sd4LstG9sh0kfHfzPdHoFWZZel9PaEamQ00g4JEUyx0cQpbjSNWnjDRoL63rh8SppKa+67mRjSm4oru3lCaOIlVU5QalzUDquAPGWYSIGxBJNe26Qf7jyvs1b/FtZfFn73Y6Job1+AWZeGxGTeLfNKIsGkEUoazIyiOKb3oyGz7zFZVN9Y5R7ftD3/boWZbQO2mlEnfFoflGE6RhKC5oxrpzlHbixOzxMmUes8yovlIg1778VE14ZuhJjt1CGB60hU0cXAuZIhGqUJ5ioi45QdzebS/pKoTXIZ5Y9w2mtE9wLdU8MwfJoaplZocoIa5ubLTfHf5gvv739yny1GAFsMsMUAWwywxbTMFlN0a3cvJV5bSoVR7FFSWmAkOdIReeRspEYJhRFJJkdYlCzQRlK8e0kVnt8ZkjqxfHQoOIcxI5JyqzQ3DvlgRSA4Wh8JYR6Raie/nkGVMgBSouxJPVMhJeJASjRgrxlIidqJG4GUaKAAB1IiICUaLbaBlAhIiUYHaiAlAlKicUAZSImAlGh8qAZSonbc6v5MNZASASlRBwgGUqKh4RhIic5HM5ASDR7eQEr0LFudgJSoqvkGUqJngWcgJQJSopFhGkiJznJIgJTo2SEdSIma1GGAlKgKmoGU6HlhHUiJnr1ZB1KidnfTACnReHQDSIm6UxQgJRqr1gAp0TMgJQLelrZRD7wtDaEPvC3PGf/A29JmXA28LaPRC+BtAd4W0APgbWk909Qfbwtvg7flYPsrcLcAdwtwtwB3C3C3AHcLcLecx91yl+vbe7QD4G4hwN3yQrD+WC2Au6W25wzcLe3EjsDdMlCAA3cLcLeMFtvA3QLcLaMDNXC3AHfLOKAM3C3A3TI+VAN3SztudX+mGrhbgLulAwQDd8vQcAzcLeejGbhbBg9v4G55lu1OwN1S1XwDd8uzwDNwtwB3y8gwDdwtZzkkwN3y7JAO3C1N6jDA3VIFzcDd8rywDtwtz96sA3dLuztqgLtlPLoB3C3dKQpwt4xVa4C7BbhbJoh64G5pCH3gbnnO+Afuljbj6ifjbkHeiKQAXEtMRYocMOZeMsQQlUgaOhbuFv10jZJnbMmcGPrbEBnwEwE/0fNCPfATPXs9AH6itrOp/fET6Tb4iQ6WoWr8RHdfAo4i4CgCjiLgKAKOoolyFLFzOYpOLSEdCk8iymIgVlgfZIIW1UppbqXWjiSB2q0L2tL6ehb/H6yvsL7C+grrK6yvsL6OdX2VpCkP4E/z2+t90ggoAAeRuBKsv73uQAHYR5kCKABL0rNAAThQgAMFIFAAjhbbHVIAJgcX4+gRIlE4YqLRhDCd/F0puYhFXDkKcPfonZxhie77s1PDdjNpAbslsFsOD9PAbgnsluOAMrBbArvl+FAN7JbtRIz9mWpgtwR2yw4QDOyWQ8MxsFs2SHL053MAu+WZngewWz7HZnlgt6xqvoHd8lngGdgtgd1yZJgGdsuzHBJgt3x2SAd2yyZ1GGC3rIJmznuDM7BbArvlcBWhP7MO7Jbt7scGdsvx6AawW3anKMBuOVatAXZLYLecIOqB3bIh9IHd8jnjH9gt24yrn4zdEpj/us4zAfNfC3kmYP57bnoAzH9tZ5p6Y/6jrTATfd9AVY2UqPh74CMCPiLgIwI+IuAjmiYfkdTn8hFlVo8O5WZlCpSSqALxjBlDMA5OSaQ8RdiQDcI2VH/syaj+YFWFVRVWVVhVYVWFVXVkq2rReNd8VS3d+FJ1bT38HiyusLjC4gqLKyyuk1lci1LFuYvr8eWjQ8FxpATmjhusg5ZpkWXeJM0UgRhLbUHxs6HPpU3pczfh6r70Avy5gyj/iB7pF4E/t3aJB/hz2ylyAn/uQAEO/LnAnztabHfInwsko71sbn04CZCMAsloIzcESEaHBOXWSUYRFpZ6njxp5GhyPHDUimFKk7NBuGWj2VLxhB5HzSzDxBDdVFzAoAsMuoMGODDothMz9ueHAIMuMOh2gGBg0B0ajoFB93w0A4Pu4OENDLrPctMZMOhWNd/AoPss8AwMusCgOzJMA4PuWQ4JMOg+O6QDg26TIiMw6FZBM+8vuQcMusCgO1xF6M+sA4Nuu7wmwKA7Ht0ABt3uFAUYdMeqNcCgCwy6E0Q9MOg2hD4w6D5n/AODbptxNTDojkYvgEEXGHRBD4BBt/VMU28MuqwVaqJ7zfrVCIk2XwC2PyAkAkIiICQCQiIgJKpHSJRbPjoUnEM6OCdMEhRCjOjAMfU8GsdEWkip3ZPo8icj0YV1FdZVWFdhXYV1FdbVsa2rmjcl+quQN3p6+j+Mc/R/E8nhYvGE3YKQxX0OWdyJUARS1GMbOFAEAkUgUAQCRWCnFIFAqtY6mQmQqvVPqga8U63vtwTeKeCdehpHpD9TDbxT/fJOTeS8hCe00nBaQm0r3fJpCcDO03a0COw8FePETth5gN+hbTwDv0M1OAO/w3PIdwC/w7Pkd5gIaWZ/Zh1IM891yFskzdz20ctW+uhPlkRrdAHuvwjdgNANCN2A0A0I3YAT7QZUjboBTywjXR7/y5MmShwZZyyFTC4Gjzy1Mf0SWabcrisQt9cVWMo0MICOwOyBwBNh+0i30ptfDXwfz4rvYyKdgEQj6AQcJNy77ARkXFpLg3NaWMWVoTjFLNwkr1RZR8JIsJ00tr/sYQ2C6irGabrdJx1KErpjoTt2sLiH7tjnVC2C7ljojoXu2CmiGrpj23FE+jPV0B0L3bHQHTstSEN3bDsedX/RInTHVowToTv2WeAZumOrwRm6Y89HM+4vvw3dsdAdO1xF6M8Vh+7YMx3y1rtjRSuMmNnaUY3O2O3XoC8W+mKhLxb6YqEvdqJ9saJRX2x2EemyK5ZSbzWTggahJLOes6Bl5IEzE3E0Ow5q1CJZZoWjSwfQJJulzZzI0cKY897cazhcuFWn+ykPF55MA22PHVXQQDuQBlpoFoRmQWgWfNbg1tArOCBAQ68g9AqOD9XQK9iOHwK9goOBNPQKQq/gyCANvYLPrAgPvYJVw0ToFXwWeIZewWpwhl7B89HcXy4PegWhV3DAigC9gkPHfvu9gqplJs2TtdEanYP7L0LvIPQOQu8g9A5C7+BEewebcWqeWEY6FKDVRmDhXaARCa2JjIaRGJPp4tbEwHZuJ803D973JS6WiyJ6274bQiOgyvUBei6xJpwEb1kMDlkehCbOYRtQFJiMxHHGqL8+QJrrbzhAx8Sc4zqigdphj+Ee1A57rh0iZlOUwLwWPiDkCHIs0hCZFskXpFQAgusi+JBhdzvJ1e3lbL778dPX9JU3s9VN4RRM0PqeI6Jsl7SkwhMbHDHeWC2Tx2CEND65UdRbMRbfgfVXS6nQGfl+sdilab5Pt/plubi9mRyem4or2yUtpcHOJLscJNNKEsRQtB4xLyROtnsk2H7CunfFhzU9VJ8tKKgU9ohnKBQ+y0Khpkogo4kw1lIXiBNKe6m8jSQFj06DHtTUA1HuVD5ufp+F1eZpLFOcf7kMq9Urs5xwd3VLYstuI4gcK8uV01I5ESQXAWmpi95UbomGXqfaWK+Vsd14mcVD2T/H92F1ezW9/V4tSW1XDi8u+1Q1/GhWsaSy/bBUY15QKFhDwRoK1jUK1sWZc6R6fWx7fUlOfrZLml5fL+aHv/3ZXK3C3dshlNForoymFUEMO2IDszJwHoxRkQivKGZRoLGkwno8co7rjLQeY2j3aroOZWN55TxJiYVT3AXPkLTGW48ZQyy4gBSjzI+l3ob7KxLL3J7h80zkxADfgQSBWaDPgh0wC3TFLLDtG2akXqR0js48Cqi2z/jgS/fjKwbxFcRXEF8NriG4VF3qKXeXfa6aSYWsNsijgB1VVmESkTcpuEqrr96TPNbo06xo7pKsPibBFvI1syJQhJB0UA5Ljz47hKQDCkkVxg4xpDizKQK1mGlk0qJCuRQKe2NGAm/W3xHnKtdO09haTgz73QoTAlUIVAcF90aBarG7poNA9Zj6QMwKMSvErBCzDiNmLZaJdkPWgkJmHfzb+aBiVQGxao9ckBCqDihUZR47HCS1lDOsVXpjuJeaSO8tp34sPae8x+brUjKtxlZyYqDvSIqwcRc27g4I5S1v3HURBWYYD1JzaQTymHHNhJFO+OgkbNyt7aqUpg4yz+duy8crczk5NDeUFiQOIXE4KDy3fnbGRDY6wunpzwrmXW103HV6iS4S6I99e8icQ+YcMueQOR9I5lx3lDn/62INyfPBeTyQPB+qc9Np8jw4Zb3TxCLMFUbKYGSLI3gN9wSzMBYinj6T56yttO+hoZwY7rsTJKTQIYU+IKBDCn3YCIYUOqTQx4lsSKFDCh1S6JBC7z6FrjtMoT907yGLDll0yKJDFn0gWXTcdhb94/IWmLsG5+z0yGIP6fPhpM+pjNxTT6ngkchkNDmRgnnvTDTaUDYWePfI3JVj7j3LQk4M7+0LEFIykJIZFMSb8XZVOO+3ocpACAohKISgEIIOIwSVqEkIunu1O9MJos0heCPAEz1Y16TbZq2k1RFhKUhk1IYgvWFIM04ildL6sZw4wnos7ees1iljODVoN5EVxJAQQw4KzY1iyOIOmsWQ97UDwkUIFyFchHBxGOEiLmbJxYvvzPzyNi1sv5q5v0pSu/hyc9TOXZlVwQy4Wpv9zXz/8O3qYjn7mgQF1cyBeSpA+jxYt6XT+NIqS7wjngTLEI/SGhojZtI7hD2VEF/WhveGMr836zkxXehXuBDBQgQ7KPg3imBFhXNeu9MmiHgh4oWIFyLegUS85ESFtE1DuEjCWQcPMe/AfBuIeQfr6HQb82Kk0wLjuXcMGWZ4Cni5syQaq12MY4F3rzHvodnq1n5OTBv6Fi/EvRD3DkoBGsW9skLltkt9gsgXIl+IfCHyHUjki2Vvke+tvZo5CHsH5tpA2DtYP6fTsJcTI3SQUQvMneHCB8yjpsYKFZNlHQu8ew17D8XVofGcmCr0KlsIeCHgHRT6mxV6Za8B70NlgmgXol2IdiHaHUq0e+JIg7bs4H/NVjM7u0rCgHh3YJ4NxLuDdXO6JWpyyWgbSZJlsIZTSTTHGGmKCOEswNbZc+LdQ37+Ts3nxJShZ+lCzAsx76Dw3yzmrcA23KE6QdQLUS9EvRD1DiXqPUFBXMMS/hbWXxYeNvI+F58Got3BOjjdRrvCIKUwdcpgRZEiKiKBtQiOeMW1Hgm8e4x29SGrbidWc2I60I9QIbaF2HZQsG8W21agL+5AjSCmhZgWYlqIaYcS09IeYlrYqjtMbwai2sG6Np1GtQx5xTSKVBPBpKRGaGckT4sLlybGsZxV32dUq7oIwCa/RbcvsUJkC5HtoIDfLLKlPUW2sCcXYluIbSG2HWps2x4b1VEbCJtxh+jMQGA7WM+m28DWoUgMlcJ7JQxhjjhHlJDJJbIRcTUSePcZ2DbgSKpsNCemAr3IFEJaCGkHhfpmIW27bFMVtQjiWYhnIZ6FeHYg8SwhHcezv8+vvv28XFy/vl0u003ut2tAbDskrwYziG0H6uJ0GtsKoriIHnlmMMFEk+iNizTZUaK1wmNpRe4xdYPRoUvatQWdmD70L2CIeiHqHZQKNONYJj1EvVmNgggYImCIgCECHkgEjLuOgIFwarB+DdR0B+vkdBr3KquJIUQpxbRTxKRV11jGkgHlwdEwlri3z5pu61EZEE31JlWIcCHCHRTum9V1+4hwgVkK4lqIayGuHXBc294u3ItlMdCjuwVuqcG6MxDYDta36TSwJSIgr7AxhBFhKJY+SIrTyqIkQhIC2zMC2wbbRevYzYlpQV9ihdAWQttBAX9Iu3CrKxLEthDbQmwLse1QYlveS2wLHFPD9Ggguh2se9NpdOuEMToGibVGynjPgw4susgZpZJzORJ493pO0OFy05npnJgi9ChZiHEhxh0U9pvFuLy3GBe4piDKhSgXotyhRrntdSZnrCCwTQ3RoYEQd7DeTachriZRCEUYCdYxr1QIRgZFuBWCSGfGAu9n0plcw2xOTAl6kiqEthDaDgr3Q+pMrqxHENdCXAtxLcS1A4lrCes8rgXWqWfg2QDr1GDdnE5jXKuRl85Loi1zXiCXQO6iYDq6SFGMY4F3n6xTh8+rexs6MY14ChFD9AvR76CUoBnzFOsl+gXuKYiEIRKGSPg5RMK4+0gY2KcG69tAjXewjk6n8W8MSESeFtgolS5sgwwEYYGdlko5I0YC7z5rvB3EZsA/1aNcIdKFSHdQyG9W5+0n0gUOKohvIb6F+Haw8a08Ed7WdaqfPmwlELa+IBTC1oF6Ld3uvgU/HPzwZ+WHkwp+eD0NAf8a/Gvwr8G/HoZ/jYtZGiQadvbz4rsv/d1kH7F0YNrAtIFpG7RpqySXQ23uFC/BMp8iBUUwURJbTxyXmmLjJQqE72wZasWWbdp9tq/BgoEFAwsGFqw/CybbsGA/zW+vwYCBAQMDBgasZwOGm+1P3hmwu2QZWDGwYmDFwIo9y0Dy49LM1mDBwIKBBQML1rMFY6gNC/bh1t5PiiVZrtZmvn74DiwcWDiwcGDh+o405dkb32pbtwdlzSE0EapcEyEhCHGPEEY+QcsRRE2URHqjmQvaj+WMA9wrO8ahvDqE18T6s3qVba47kRuZlmkVEUv2RlDrsQ5GExUddoxINRa9QT1uGq0grldmtRtrwkpwvqCyVMBBMsO48IaGSIJx6RVJoCZWCqvjWBDdVzf5X6eGysLHersuPl4sX15eLsNluog85LBWXnCChFSICWKTsx8w414xxaggY3E+SG8mVNRfHTer4LvZH7vxJ2dM2xBZdvc9d5F4KzAPWnhqBPEhSscZlcErZwDjdd0EXOWBfbnZvf0Q1us09mpywD5bTjk0U64FI8JiL41PthtbjSySQsiYvARjAc010SxrHEy+n9O4L2H7r0nf27dTf/vZuLT0Ts+CdyHCnA6oKFlw1mKGUUAhYmVkMJ4rw22Qho9EB0RvOqBrHF1Yv9gwOX3oWpw53fDGOE6sQppgzGOg0ntvvBYaO0/8WHSjv/VBlebz0yOJs8vb3Wg//enCzebV2/lXczXzDz5OF5TGSoHZ3Z9NTiO6EeJ+2ydvpY3tzCwllFKhlAqlVCil9lVK1aq9SupvYf1l4T+9+TY31zO3fbd3Mp6+bKpzZdPAuLSWBue0sCq5/klMwXOTQKSsI2Ekfg5F/UUB6vC5ngGl+xiaLolFh5IEwpaCRbk3nQDKls4oWzJVKSZN1JQLmYy7lIwi4w0iOISgUQpwR4JjjnuMYmlzi1TqJkwM653JMdsYgJGRKXxQWkearLlFFqkQrAo2+YcCGgNqW/VSD/ZhOuLBu8nh/AwJZS069phFZIjxOoV7hqrIncQ8OSWBSQVZycatWhk7tP3xa7hKY00OyOcLCvpmeqxAQd9MbWR33TcjhCZeUuUEpcZF7bAKyFOGiRQYy7F44T12Goh2swKTQ3z7AszhP0hpsDMEuSCZVpIghqL1iHkhMbNjyTA+oc9SMsn7xWJX5ob28jMEBZ0Bm8IKdAY8G6x32xlAabudAcczONAGAG0A0AYAbQB9tQFgRFvvA7hnzwa3hzrbDGBJ9IQmqSmJBJNGqOS6M6Mojum9Ho1rI1V/zk39nu4aeJqak9OpMGGXNOySHiLqYZd0A0TDLmnYJT3aTCBUe2rDFnZJPyuzCrukYZf0mCw27JJ+drukJ7JDosceWtgf8bz3R0yko6W/3RHQ0fKsOlom0gEA3ADPSgc67gBo5XCIytl4aAOANgBoA4A2gN7aAIjo2r5BaxPYNLBpYNP6s2m05eNwLpZFL9G9F2DXwK6BXQO79gTnRbfVsllu0wbXtpk9+gaTwHUkCiErOFcyRKM0wVxFZJyyY6nSYdJfRlY3OZ2lEqYmlp3qXqDQvgntm0NEPrRvNkA0tG9C++Zoy17QvlkbttC++azMKrRvQvvmmCw2tG8+u/ZNYzWjyTsWKf4zTMfkLAfNGddOc44cG4kO9Ehv3eRUliMlhMlpQTdChKY1aFp75nrQatMaa/lAmwp5SCiGQjEUiqFQDO2vGFrBxlXkvQPbBbYLbBfYrr5sV5HMzfVxlJit7Y97+9SevjWD5lozpnKUkEC9xV1wlNATHCU0kaNT+iO9haNTej46BWjIn6ABCGjIGwlql8fS8qwQ78DAQ3QH0R1EdxDd9RXdKVwhuruT0UVaxIr7vVguXFitFstNT+Sj3w4+4FNUMMSi1gVWhFE4BX1cWZccjYjZaMrNuD8GZXnYGXMKOI9+M904sFXZZavLniVTGSNTPJCiy56kFZan/znkIh8NczjrL80hDiltzrSXE0N8W2KDZEiPoSQkQzpJhmybIPZe5cnosa6S7ANK/Nndn/l+QEkhoISAcpgB5VHUdigXzA2y1hGFLNcKCcmSPKhxgmnEBLe7kj6uWtK/E9THdOWfft4Zrk9vluYf6c9ur9MNbG7utzC/BW0FbQVt7UJbeXvaGnZUUYVIQGFBYUFhu1BY1kxh0+eFn75xiF8Vj90t01dXoK+gr6CvXehrhcNn8/q6Plxf/7a8AnUFdQV17UBdkW6mrkWi7eLq9nJWFOM2twGqCqoKqtrFylqB1D2nqhfL2fxR29LL1bvZCnQWdBZ0dpjR6/pBbriIYsEdBn0Ffe3IHa5dfn2or4WMks7uXGHIMoGegp4OSU831/rppffFNaRrXy6u34UI/i/oKehpB3qqz8wubdX059mfH9bLD7P/CaCfoJ+gn4NbRy+W4cYsw4fF7dIF6IIAPQU97WgdPTP1u1XT/7xdpBsOawPqCeoJ6tnFMnpmV+FWP9+H68XXYv0Mr5bmjwBZI1BTUNNO1BQ3UdMUi378dhM+LqAAAyoKKtqRip5ZMN2q6McksY+L1wsfXl0tHISjoKWgpZ1o6Zl73u5r6a/pac/ml6CjoKOgo0NLGV0sw+VvxYWAeoJ6gnp2oJ6NCi9v080mJxeUE5QTlLOLtt3KHJ6brS+b17uXe+KVHTPLr+vrq+3b7eegsqCyoLJPue/0pMqCuoK6grp2q64M5elmtz+Kz4fBIouzNLI4KmwwlyTygB33GIvIiaaaEByxGcu5IYT2xyNLDh/sQ0RMjFDwhDSA/vIF6w2ZQH/Z81kgiNnkbjCvhQ8IOYIcizREpoVwklIxEgST/hBcyrq7d4Y3P376mr7yZra6KZb7MD2De46IsozbXGJNOAneshhc8o2C0MQ5bAOKAhPAcE0MU5UR1sVy8fc0+vbd5LBbRzQ5zGLsMYvIEOO1F8FQFbmTmGNBA5NqLCzx/WH20dFCmdOstz9+DVc3E0Tw+YLK4Tl6oRizVDgaVGTKcqqSA5xMsaRIWLDBtW1wqZ93l9nYv5gcfCvLJYfWZHWDtpYlaErOqBQxeQuEOiNFYDyM5WiaHq1vqUuXBrtMk+wNyy6oTt/+ablcLFe7308Ows2ElcO1kFR4YoNLADdWy+T/GiGTi6EJ9VaMxQr3l4/gOXdvN0nZgYWrX5aL25vpIbuhuLKnlmrqiPBUWIsNUpxz6wgRMr0nTvLR5IH7w/bjE7Hmq8VVKMKYy2VYrV6Z5f3XPxu3Xiy/TQ/U58oph2ZuZCCSEiyDd8QqQ6OLnkRFEaPaeEBzczQXeVHjvhRLqzNX917+boswffMLQHNVOWUzcMY4nlCMNMGYx0Cl9z65HUJj54kfSzZD9oZmVVrXfpjl/+lPF242r97Ov5qrmX/wcbqgNNY6LO/+bHJQ70aIOT2QhitNQ/K5iVNOMaM8sooFqqnXhKCR6EF//jelB8J6+bZYar/OUpA/3bNMK0olm3/mzujkOLsoFWY6fYi5Qh7HyKQSAY8EqT3W/UqNzYOi1nQBW084u+Mai96uU02H91s1Pj/q17u7Augf3HWGyeqdYXdhzNM3iPFsfxg3KnJkETdFeoBJwZSROOLgmfKjyeVigftbdQ/FVYqLidmwakLJrrnT6GTszzuEPkboYxyoNwh9jP32MQqGLY1CBeF4kMnQKiKZUBhbpWW0EhBcE8FH8oQPns/7EPcn3dzMth9NDsdnyylb65LSYGcIckEyrSRBDEXrEfNCYmYDoLkumisIq6wwOT04ny2ofdReYXdviecMwfvJ4F3zfPDeSnb76YN99OKfGyBhUiH/08I9fy7f3WheEIAf7D0t3Xva4PCF21NHewIOAYc1cIjxmezIt5WOhKafl7uvlQATNucDMJ9yc74+vjk/g9sOJRMVYilws4IgKpCS2EhEsOdFmZV6v/PjMK1K8NiKYwM6DDoMOtyyDuuqHFaZhCboJ+gn6Gc3+ilphVzJYykdOML/vTQ3N2EQHDks1wIRqdbeKCFksElXAiXOW8eSHilNJdcjSRcr3V++uHQjS3XATC1r3FBc2cqed54r74mlRFGMLPY6OiY1CkgH7kYC7v66JmRpxerow/q4NPNVXCyvjd2PP91GxlZlB/uDnr6eDfuD+tgfZBVCCjtijIpKoWKLEIsaEaVoDEQZQHO7Nnw7RPro+G/Ahrciu13VG+OqxcqqThFkByA7ANmBbrIDirWYHbgfvQ8gUaByiQKvpEGSSiyoSQhSMQZsEQ/ex0JCY1mHmehtIRa6SeT7ADsTW4ZblFzO9aSaScGjDdRwbxU1ysWISXSWYerMWNIHPQZS1daU/S927ycH73PFBEkBSAoMD8xdJAUkM1ZwqiIOFFtukDeIqSLTi5hmHrZs1EZzKa/cncl5Vfjhbpn+YHX/9VRpUBsJCyjVgVJ9SGhum1Jd02SAjWNeUWo1jhJjGaOXpPCffRhLRfmpPY1j+2qmm5w9W05Zcupp9Ef0iGZojxhKe8REqPf6Iz8B6r0BU+/tdgbilott97KJUHeDuhvU3bqpu4kqO5hPp0ifvsiWPbByIhUH0R8bLpQcnqzk4HigOhCDNSY8uKTYIjmVXCUlZ9hR4Amt3bl1yN16cmnYf/b9V9NND7QsPUgaPPlZKpA06CxpsA2WUNXdxqcWCoiMIDKCyKgjTgBEK2rpyVQ4qCmoKahpR2rKxVNRdyD8+cviHx8XW2fk4150JbrNQLdBt0G3a+n27AXtXjJF8FpBMlU1vUOJcRmE91EF5D3jCmlKLGYkGm89RYjvrCGpyoJyjtMCBg8MHhg8MHhDMniUdb/LE+we2D2we2D3hmT3WG2S2UYNN2ACwQSCCQQTOCQTSKpm/s4oo4G9A3sH9g7s3ZDsHVO9VjrI55tNjjBJ4t5ZWT/efLkpsYIcrCBYwSe0gselcR/HvcmFOWc15x5bpxjh0ovAhbXCyUiZpLovGyhwJbnc1+8epeSVs8whwan01jhvkOMoyUpYQoKKYiMl1oOUeG0plVnBDiWlBUaSIx2RR85GapRQGJFkcoRFyQLtmvlFvpn/nZlf3prL8KuZ+6skt4svN8V/u7cfwno9m9+1vK0GS5kVuYvEW4F50MLTov05ROk4ozIkSI2FMgtT+pcn2wtdFSpT6wA9V07Zhv6IAjOMB6m5NAJ5zLhmwkgnfHQS2Clqo1nWPMj4zgl+ZSZ4XG4zaQE71pNzVgA7Vi/sWFoRxHDCcWBWBs5DwZ1NhFcUsygQGQmaVX9oLuWb3E2ydaCT4fGzvQnavpruVqvG8gLWihe4P2MNtBUDpq3IkCAi66zETOtgOXEoukCEJdZg7Gg0Ywkv+9MDUSqsg8NvN9br0+vb1XpxvX0zaSbmFkSWJUT0VMiglWZOi+TESFKkKqkKklmKCBB91sZ4nrvy4QHPu0e2eztpnLcktqzbjhly1BZFGl7UJhm1iGBGWeTUaA58CS3zJWyHeJM7rWXKkG9Zenen3ejTxeFqyUqo/0L9F+q/UP+F+u9zq/9iWuHIs9JF4OEqd2VWq3ezP3YrGqwHsB7AegDrAawHz249wFUpbDLVXjD/YP7B/IP5B/P//Mx/hZxQPTIQWARgEYBFABYBWASezSLAK+waO50T+nBr72eHknRXazNfP3wH+SJYK2CtgLUC1opnulZUqR90s8MY2JBhPYD1oMl6sKEsr3oK2zkBP6goqCioaB8qenafFqgoqCioaFMVxRWO52mjiwa0FbQVtLWhtuqqPKj1WhxAN0E3QTebrqSslX7UZrUH0GTQZNDkxmFr1U7CI3v3fgnrNwe8439bXn0uh4F5QUBJQUlLlbRw+aryoNY88gNgCDCsAUOMqrbXnX8EA0ASIFnHMlat31ZkxAf4AfzqWER8XjKmfv/AIRDu9tcDMPeHY1QtBVfIi8G5GGApnl2cDediTOVcjDRJ2HGUp8u/+s4iTkQhB5JG3d0e/5yuc7W4OnRpVi/S5RSvZfGasUfy33wp/by+NnP/Kf2uoHcJu/d3gxSE6WGbh5zvKGfqj5WG4YU87yKB/VCP6NjTvbPHPKcPh/8Qll8rXWe9gWpdJD9kvHn59m74/e2/T6j67Q5lFS64waD1JJyZ56X36Zevrhbuj1UVGdcdqt6FPiYHffgEHyztVS73vAFrXTQ5ph4vb25y15b/Xj25lR5pkPGKsjKrP1iNiz33ajeHLHRDpHlcFF2xn1aXVoEvfWf72eebq9vL2fzDt1Va++4vAOLeAkB48UaW0kdfbL6/eb17+c6s1hcbErbr69k6Xenj3+RE1Oo0tUAvSjnfH89czFH4DUVdrqjRra+vtm+3n+durrUp6t1YKbvayVkr31Qbw9e7oVKGxJMzvl+tK99TSzPUui11OGlpGfjRNbwyq5A++bC+tTb90cO3p2+1y1lr3b4+5Js860LSy30mebGsLITu534CJKSXf5vP1j0joXzWerevzrqQZPhvFqs0p3F/pD9e7a+ougA6nbeeiTv0FKpdyhtz++fmn6xxazx2rVvB6Lz5ftpzfCY4xVnwF1fGhfLfnn60PV5EvTjwEHL3F5qfvqa72Df+vAqxuKz0Zja/vFguXFitssFgw5HrwbWcK/j+ZHe5mpdxkw4p3qX5vg+TAWwLo9e7nZwTejDhVnqbjFCaMP19kXjK3k3zwdvza7Pz3cH85C21NUV7fm3prHe42E2YR10bw/d1Q5XUqI3ha91QNpg7mPH3+TareqQP4OyYse409Z5Y+dmPR2b+JayTeS1OVrpLHb+ZLfPPrJ0J6j21x4mk/Jz7yS7M+surb+836eavxZeLX2QfXMszdWbkN5MX9up9WC1uly5sCwftGPkjg9e7mdOr/b35Crb3O8u7/aPX22JF9p5am6MeHA9zrhnPbXsV22kLVf8S3B9vV9v3r838Vdjy3Gcx2cV0nUV/Dxy5je9TTFn4cd8HvU+N3070V3fWerdf6TzRkgv5ff7S+00D/PYJfFxUvPNuJqyXcS/NDO+zTJsf984syyTba41TL8/eYoJ0otn31nKx05Vfa6nf6YqwhdTSdIXXop+1EWL5+ZVHdowU422HWVXw1xoPXbOwyNRdYfF+zwz/XBQVDw6qetCmSO8VG/Gm2FjprLf9pb9Zmn/sw7nNY/4tzG/r55Pqjd5CmFhhwn10ejLcaGeCeqnL8hDnFItOFrHnDlnvwuscsFbkcVJ4ttOJfMa10bj1AFUaOB/dZ7Zt/SkWwldFq5pbpq/m0w6tjN/lLa0f6GQx9d+WVy3e0pHxW8jn1doNWD+fV3P4eppT4UjA7/pZLfo6f8x6lz6OdfaYB3JktovlbP5Ici9X72arMzI958xRL9NTpf56bFGbrW6uzLdNNP7yZvZbWH9Z+KyN62K2Zk+yzgWkNXwz+28m2xTY3hzt39pDHa+dsGpvjvbTkceN8FagW7y8WvikMj7rEnUyXXcL80M3v5LT1874NcO49uKL0S3ykwzr2wrQJpsYaRANbmT2vFrO24q/JguXtqK96QqwnWVnsyuuvFXs8ea6+p0ZTUeu56jk47DqRBPZ9bi9SerFr9U2QO5/sXuffTZnjgjOxKmlsEGWZFsTeJ6Z1ZaTE5M17d2kQSYrzjbTLCDEthI6kxPiczbrHeW8JqpNRalclJbK2f1S+YY2YnWMlQGjjadQpeS4GajYTV/wSszXPy8X1+9CzPuGjcat1/lWpXqynern2Z8f1ssPs//Jt8CdN2C9i64un7fXN1cncrznjFbvcqu4ZdsJLpbh8reChCR7wWeN136R/m6KG7MMHyo1Zjcbtyup/+ftYh2STTEtSf3eePWkXiUPup3ifbhefC3EEl4tzR/5nSeNhm1hjS2dKWn+x2834ePiRAb+7CHrXXiVhNh2lo8pDC9ajX3YcKNkr73BqC10BmQm+jVsGsbrdwZUGbON1HUlzOARVoD+tWtHL/FPyGf7PX99QCD/nS6kgmNyLw1+//Wv4epUQrHRuNPusTq9qp58LBP12KHg0zzkEeXdwUcY9e6o+P7LLGcmXfnRQGhrbg5t5GGAevC+WnB9/qDQLAN5o8nnjXbbdc5Q+iLYSo7cAXXuncpvvI2J0XU9W3dyhJ3dsBeyHZ8KWhighQFaGAapmtCe1TDcKZjnD48w27F7LJxZL5YHBzXcOTf8eEpp5599uD/MpzezZbqgxTJN/eCDM5iA6g3fgg9QOmOxM+7tugigF8vqd9TK+LVuSebafB5O+T642+WqYKo542G1O0+9p1Z96g/JX78KhWyrP7MWRq93O7mo52DC+++qbWNoPnjdJC17bGKWIe4bqW5mPz4+geS+pcHHHafTzWqrX5aL2+zWo6Yj1w016SlppO8U/31cmtn6/f1P8pns+hmMzQzb17UEVHPkZqpc+7T2Wqp8xug1M9mNHwubpG9SkvspldyXm93bD1tusnx999whpwvhZ7fjpRXhg86BzoHOVfdpSoLIUp/mzoms7tecIfu7WTp5so9Gny5Qz7ufkscD9hbsLdhb8HFA50DnhqhzO+lX8nF+mt9e10jbHBZoT4u9mKBC1qbZwNNF5r9aeChgW8G2gm0FfwZ0DnRuiDpXpw61/973ytfRvZ6bfA10CUOX8Ei7hKuqzMaQdFq6vXeaR8ul2wcjT9een1e6PXgs4JKASwIuCYQBoHOgc0PUud3Rl9V9movl4iYs19+O+jaPwoFHmnFa/h9u7d553k139+L08+5mvnqGrNN7nqBpe2YqVexbqa5SW76p6golK51/eARc28l2P04rU/tz1VOkzu4VlGjoSlRvXUpzrdZmfrxd+pEa6SY2+sGcD9+dVqquZ66nYt3LgYLCDV3hQB2+74dDZXbncHuKPDQnNLeJZHfW+fZdThZ1Rqmn5vWub6LbIad2OkSDlMFkEQJJKkhSQZKqXzt11tVO1kKBRw8ePXj097af88ce/faKt2SpaXg/K8Y5WqPf5t3KmZS2t3EwUvrs+noxP/ztz+ZqFe7eZhNv7U9WCzwqFy5UnH92FQq62/SbtdmeInv6vrudt54IcqFAtUvZMCcE/3Ze7d67mbDeTefoSWpdw18X66r33dmctW79Ua65/mV8XN5WVO/W56rnhZcuPUen3706TaTRZNhaN4DRKcrTe0vMo5nvrymHH75dXSxnXxOYKj3Hfq+jpogOn0abl7ZI62lSuIpC6vdKaoqpRuhV9+Ju7dXMVZRRj5dRU0CH5rmtK/uv2WpmZ1ezglOnkoh6vZB6vnaNOuXh7Nv6ZDM71M/89URSo3my+iXVsTt9XUE9sTSwhUcvqrqd6WX6mvalxl67apf0+/zqW3HI0+vb5TLd/173q5iYvq+lHnZav7qaJrinC+jNzuw7rBoa356uoKZa1UjC1Lmqep5fbxfRmyJlLquGGe7nAmoipsrhiTUvqoEp7v9q6mGog+ura477uoR6yYVS1u5TWYBq+7yaDl2vkNJZBnCypaku04sTFeqRlqXtdT5g1OX3e5bYqLfqjmZL5VTZYYbM4DcSomWoD9dPANe+mspmstfLqFcSrFHieHRhuz0Yb76lGWau6raTzqZsVgNvtvmkMhS6nbdZTXSse40muE8x2eEmJqf8EiqDvPu5663puSM+drOWnQGRXc3PHrPWpbNcq9Cd61b8qBRjnzVcvSgQWHSmy6IDrCrQPA/N871u8gEuU1A3ULe+1A3OQwCdA53reYmDM9ZA30DfetM32GEIOwyhgnSnDj2XkCba6NB9JepZKd8kAdBHRW5ygn22XiAQBE7V9wCO1Yk//d5K1xNEwvNdDZpU8Tde9fOtqp7ZBfDsSOsetjvjz+7+UA/andEjBhdRyrrwPsx9WBYYTHh8N5v/kayCC6vVYvnplVmFR7/N5o1amqFZKuzhpB+TQD79fDvfDPTpzdL8I/3Z7XW68o3Mfgvz21qpsDNGr3c7pQCqMGHY+XCFLLN31M4E9W6qdOPDkTnT5yEBegOMVwX3qFumr2YNbDvj17ulw2g8P+X6UIp/W15l76iN4eute6W7i47M+G5h/MXV7eWWYGidJq6/canG0PWeTCmJ0pHZLpaz+aMF8eXq3WyVvaP25uhSj9YPjFGB91Ooa2X8erDLrxkPpyzIrdK0O1zkfa5G47Z/C5t9XJ9eev82/Xq+LvZhvgsxrzaNxq0X/lTR0O1UP8/+/LBefpj9T76P8rwBu5L7xTLcmGX4sLhdunBqhWw2bj25V7Ej26n+83axDimyMVmxnzVePalX8R+2U7wP14uvhVjSOmv+CHl9bTJsswDv+EwJlx+/3YSPixN28+wh6114Feu8naVgAPy4eL3w4dXVwuXR3mDUepdfxZW+P9GvyTdLcXD9JvMqY3alpskiXP5m1u5LS2p6b7x6l1zdiL29vrlKzzR7wWeMVs+zKQ/gN37g5vXu5T5a3IWTv66vr7Zvt59nnZu2pmghTjg5a+WbamP4ermWFgPu0QVRk8uXtpmxmGxlv630yHQF2I4d2bRBPuqmfDjWJkb8c/3pcIj/Xpqbm/zxNk1Hrrfu5AOwE5NVZbdob5J6rmQp5h7Nu//F7n322Zw5IqwOdXc7NsjGTde+tZT3m6wAG8T8eISOarsB12RR1VJsN1H5/Wv7xz++/+nlm99+OnZa6eY1OQwxtj8KPzhfkT7xxVqrNz2Me++P9bNx6d9s13a179dD4EnBTBdbhbh3fRL083JnSn98fJYla9G+QwABAQQEEO0usnD6XS2XpE2tnawUp3QO7q6Q/nipRPjzl8U/Pi5epzVzHT6G65ur9HNVsoTShs2jz05moGdg25/ApS3Kxo8PZ4/7PNnN7Mf0nRL95KX6Caddn9ZyOO16ejspgF3hSVdWWBPAUz12t8C8AfsfgXnju0NI7vaCPXb62mywgrwm5DUhrwmZuqFJcVNDxMVfF4N+/mJWX/aVNkGjdsRjxQVTTCmrVBScMS+lxRz7zd+lr84Kl2hurj47476kWOHz6ttqHa4/f00y3lzP7AX5y7/+f9S8RFA= \ No newline at end of file diff --git a/docs/tech/03_renderer/01_howToCreateTemplates/templatesLinking.md b/docs/tech/03_renderer/01_howToCreateTemplates/templatesLinking.md index 7fbf86fa..6f627399 100644 --- a/docs/tech/03_renderer/01_howToCreateTemplates/templatesLinking.md +++ b/docs/tech/03_renderer/01_howToCreateTemplates/templatesLinking.md @@ -18,6 +18,17 @@ will be replaced with this link:
    <a href="/docs/some/page/targetPage.md">Existent page name</a>
    +Sometimes the use of standard empty links is not entirely obvious or has insufficient capabilities. For example, in standard empty links it is not obvious which link text will be used in the end. + +To fix this, we implemented a special mechanism with link tags:
    [a][/a]
    + +Examples: + +
    [a]Existent page name[/a] => <a href="/docs/some/page/targetPage.md">Existent page name</a>
    + +
    [a x-title="test"]Existent page name[/a] => <a href="/docs/some/page/targetPage.md">test</a>
    + +

    Generating links through functions

    The second way to relink templates is to generate links through functions. diff --git a/selfdoc/templates/tech/03_renderer/01_howToCreateTemplates/templatesLinking.md.twig b/selfdoc/templates/tech/03_renderer/01_howToCreateTemplates/templatesLinking.md.twig index cc845e3b..d3b7a65f 100644 --- a/selfdoc/templates/tech/03_renderer/01_howToCreateTemplates/templatesLinking.md.twig +++ b/selfdoc/templates/tech/03_renderer/01_howToCreateTemplates/templatesLinking.md.twig @@ -22,6 +22,17 @@ will be replaced with this link: {{ '
    <a href="/docs/some/page/targetPage.md">Existent page name</a>
    ' }} +Sometimes the use of standard empty links is not entirely obvious or has insufficient capabilities. For example, in standard empty links it is not obvious which link text will be used in the end. + +To fix this, we implemented a special mechanism with link tags: {{ '
    [a][/a]
    ' }} + +Examples: + +{{ '
    [a]Existent page name[/a] => <a href="/docs/some/page/targetPage.md">Existent page name</a>
    ' }} + +{{ '
    [a x-title="test"]Existent page name[/a] => <a href="/docs/some/page/targetPage.md">test</a>
    ' }} + + {{ "Generating links through functions" | textToHeading('H2') }} The second way to relink templates is to generate links through functions. From e29235c55e482334c2638a79292db59c78092c33 Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Fri, 12 Jan 2024 18:53:16 +0300 Subject: [PATCH 200/210] Updating doc --- docs/shared_c.cache | 2 +- docs/tech/01_configuration.md | 9 +- docs/tech/02_parser/readme.md | 2 +- .../classes/Configuration.md | 2 +- .../classes/Configuration_2.md | 763 ++++++++++++++++++ .../classes/DrawDocumentationMenu.md | 245 ++++++ .../classes/GetDocumentedEntityUrl_2.md | 263 ++++++ .../01_howToCreateTemplates/frontMatter.md | 25 + .../01_howToCreateTemplates/readme.md | 4 +- .../templatesVariables.md | 4 +- docs/tech/03_renderer/02_breadcrumbs.md | 6 +- docs/tech/03_renderer/readme.md | 4 +- docs/tech/07_outputFormat.md | 35 + docs/tech/classes/DocGenerator.md | 572 +++++++++++++ docs/tech/readme.md | 4 +- .../templates/tech/01_configuration.md.twig | 3 + .../frontMatter.md.twig | 29 + .../templatesVariables.md.twig | 2 + .../tech/03_renderer/02_breadcrumbs.md.twig | 2 +- .../templates/tech/03_renderer/readme.md.twig | 2 +- .../templates/tech/07_outputFormat.md.twig | 39 + 21 files changed, 1999 insertions(+), 18 deletions(-) create mode 100644 docs/tech/03_renderer/01_howToCreateTemplates/classes/Configuration_2.md create mode 100644 docs/tech/03_renderer/01_howToCreateTemplates/classes/DrawDocumentationMenu.md create mode 100644 docs/tech/03_renderer/01_howToCreateTemplates/classes/GetDocumentedEntityUrl_2.md create mode 100644 docs/tech/03_renderer/01_howToCreateTemplates/frontMatter.md create mode 100644 docs/tech/07_outputFormat.md create mode 100644 docs/tech/classes/DocGenerator.md create mode 100644 selfdoc/templates/tech/03_renderer/01_howToCreateTemplates/frontMatter.md.twig create mode 100644 selfdoc/templates/tech/07_outputFormat.md.twig diff --git a/docs/shared_c.cache b/docs/shared_c.cache index f81a91f1..a97295ab 100644 --- a/docs/shared_c.cache +++ b/docs/shared_c.cache @@ -1 +1 @@ -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 \ No newline at end of file +eJztvWlz20iWLty/pSImYibe6Fu5L+5PXmpxhKtLY7tnPlzfceQqs0sSFSTlKk9H/fc3wUULBSYBYhEEnOkpixTFTODgOSfPlk+aF5SrF/9aph8vvptfh4VZzeZXy88X8/PP36+C+/L9Ihh/Gf7Ppf8/q99n59/9zbzAxd9j/OK76y/XP1ytZqtZWH73t19fyDTEq5tLexHezN1P4erT6/kifDozi2VYfFr/4bf0q4uL4Io53s3Pf93N9+n21fLuD77bToTuX1gxP3rxrz///DNdsn7xXZxdhOVnH67DlQ9XLl3JwcumL/41e4HSdQpUdp3vixEW6Upfz69W4Y/Vpze7Qb99+jHNcvf2uxdsfWFiM/3b9OeLK3Pxbnb123d/S5clX3z3r39bhcvrC7MqLm62+Lc/yy8qDaJefOeKCa9WaZI00PtwHv747m9//9vmzi/Nyn15m+bd/o69+O6LWX5Zz0NefEclJ5hG6gLikSJiPFE4EiqwMAIT9d3f/py9wD3cMym75/c/vHzzyw9Vbnfzyff/89e//vXf/+///PX//X//8e/p5X98/12JGIobeiQIJHW6b4cFMzoIKZzmRGjqBfUmeOfWgiCFIEpBmhPEm9kiAXK++HZfGqSQhkoT/6XxYH9JwtqXJy7DUPGBxK1MeV90VgkviNZceqa1NcaREH0MCicwMeOT6JKyMXzAPiCR1M/enJ/Prs6HaCUYz1iJQxffl61g9KCtKL+0xhZD0BgQ9oH7QBSihhrjjUSYUGcJsRgsxiOL8QyWi8bSEBFTRpiImlDuuU6AEJG5aCWTDIe4MQLFiltuBPjndFnL+cWgHAVZ/JqnuzsPq3dz44P/dfE6CXUV/h5+N55Fz4QyxFDBtTJBMhSSChCnaSSxuNDCwJ94oR+S2l6Ezd98CGbhvtx+tgWEZqWmvOnof7lZmvPwen5ztdo9665mCuvf/t1chrUtY4+EtUZE+nl5aa78p/S74pth+774jhbdXFm8uVp/YXdtBJWDoPhMqW6uwSzOl1stKNaSUwRU6NxB/Mrk7gkUHBVSUZ9MBQkh6sA55ppyDfiti1985PF8CIuv0wVvPenkkOuwtoLiFKRQphGR6VOL0srDudfeYAnIrYlcTveE9fLt7ePZ2ZT3yUD8Ej5u3YyporiBpHKIltJRZiMmNkTjODPcmGSCfaReKkYCILquLc48p5fep1++upi735ZTxXFt+eTQG5QzJLIEVmUj4R4FFbUzCCGnYsTgCddGrz6yVqb3cXZ+s/nyZDF8mpRySKYuhfQkRCcTdIto1iCqbSCSGk6x4YDkmkgmh0KWl9fXkwNsXhg5XGqMjNQIK61jcnytRRapEKwKlkst1EhwyWh/JrY0hfTAYjx8Nzm0niChP//cZMxpLmNemunrLV+OD+fLSy6scbZcGxaxJyx4So2OShrFFWLMK0NVtBqy5ZAtP5gtL/J95dly9vn64uZ8dvXh2zLdypBS5mQtfZKk7C7mV+H2u4IbJKQRlluxTtCIx95b1Qt6/WDk7QNX5YXNEwYscZYUbW3wfVuPN8YygevVtzOz+rJcV2l5a/Pt2XVTVJ43Bj49gO+XC/d9MfTuRouVZ/3Ld+bq/CaJ4efkM1+ExQaQuj0Zz8tA1SNO8TGY+kgBpvdgqu5gurap0bjQOVbvnJHSVeFsbQS3P26vanJYFVh6wOo9rOq1+/zr1UWC6nJl0lgmTdMRWIs+kfHBjSW4zVbrfPbOjZDKY4cijlKE5NPyQGgkzDAaWXJy7TpJLU+H4NuHs90D47pXqomADw1dBkvdwTTh1hEzhbz/tWnDOmjPitfbl+/McnW2vsbLy9kqjf/4N8WVFyZSyGpDFl8uvOE0VvHy59Xlxebt5vOdIMR+hrjacPtDkWIocdJQ75er/dGK/IDaH23PVfl09uW6ZPBXZhnSJx9WN9amP3r49m4GVjhG+5mUk2ZIL9PXby7Tw58vHs3DW7uT9PIfV7PVoxnENllwwgwJW9fzhPcz435Lf7zcTfVoDlk83f2ludocb8zNH+t/inHUOnA6baCNTqavJCnEWfBnF8kHKP/t3YXrTa7iz23G4lDezRvtFXYyRkcUZ1R7TKgOUWHsHJd2JHk31VvarVW7N7GEXKuyy6Eec2e0Jc5FqTDT6UPMFfI4RiZVWvtHgnrcY0GvVvgyMVzXj+0OmusETiJINDRIhC1ShW+aTHVIXioXEo0FuKgn4P59alDkaaIP3y7j/Orbxgm6SuL49MPX9O+b2fK6SOsWExbvP9zYpVvMkjtUEZycW0yxdl5xa4y1zkrvlBXMUia4HI1V7QucyfPMLYjrh3RXN3gVYvpw/TDS+Onvi6rB5ExtCxLLNmZK6T0jBIXAGKIs/aOiQY4gpDFiY2kp1v0hvK2Yfmo4b0tuWW8jCoUi8YYpIRPEI0rWXVpstYspOhxL0ybpLzrMmqfyx7ZOhty+nR7Qm0ssa9BV5JrroKn1QTlftDFghiMJjlqO6Egg3qNBbyOrOjWMtyGzHMptihYN9yZiQ4RVSOqiskGUs5ZjNp6dfP3lO9rK+E8N6S2JLb95ShBkiTJIOuOcEEpF6rDjXhoT/FhyJP05LV3WoyaG/y5FmdOJFJqypAJeSUmptMh6S5CLmlFuuRFjafsfiCO/l2f49eqnsCpSDO/Dcn6zcGHXqjkp6LcgsRzCBTFIR+0NFd5bbhE1NsWqjgUjLApjiVV7LGTuN7pkTNXm8W1n/vXq9Zfgfnu73Lx/ba5ehc3jmhzmO5Fh1tHHKYBlwYvoA+bRU4eSTlAigjTJ+xlLCr4/Lei+U2ZiKtG9QLN+kFXWIY1tigiKjY9IkxQNB8SRijj9B/rxJLFBeYfXxDSjS1HmdIIETJHlKRgQDEfjmArBccmIiDwKPJYUaI9l226bEqemFp0KM6cYzHnLoqEWi+Bliis0MUW5QFLP0k82FsUQ/UXNjTtpJwb+5gLLEqQxbrh0KppIlHNeWh5s9E5omv7HR7PpfhjNv49yHJvnsPNjg9/M8N8Lc309wUJvq7LLoV55g2LQijOLCioqoo0y1lKChAxcj6XlvUfUP2b9yGf2dsxhxW7gV9/eh/R69rX4cvGL6QG/ZfFl6X+wFVp5hBFSCfCORK29o1YYT5XHY6mN9Yf9crL0zMM7W8z/mWbcPcPlm9liOTnItyS1bFRrAuUxaqcxk9LFwKkhljBlgsAhmpEgnQyjUzPbWbsZfbIdyW3JLdt6b4jXTLogffQoWiu8k9FLhpEQKI4l798j2suFVfrUXsY1cU7xbvfUZmGCRr0FkWUp4hAtqOAMiwzTiCmOzBgXuJVSCWHHgvEe85Q9bkiemC70KNlCZTLUKdozAtQpwEa1ezVQhh8djQCY3rNi7D5MF8luv74wy2XxcX+cVMVhNnebRa9WC+NWy/LNopMDrCEbrxoAC5RUbcGthJKKRI0i9zogQUNwVgXBFOKUWM4F9REoqSpRUq1Vi+9Xkh8HKNspN3F48SY5fWeLuQvL5S0LVQthzpaAqvle5S39VFsphg3/VHY7Uulwt7e4HWm5S8I2GOq+tHjb9aENeVRLacgNS1TbafxNF1cLXdOb3X/iOPjvDVRET7fY2PzR6w1N8G2I2klv63YPV51WqAeKu1a4YrBCb+/4ge/b9DRFoTNqX7BVp/j16qX3a2dsc/0f53uj02rMW4JhrpQgyhgbjCCIYBGSYZfWCi4EGUk6o69SzOSYXGo65xveepXjrT/Mud0beb04TF5/6OoaM9ij6GjysYw0PkofuDNGUh0V4Zhq7AMw2AOD/WEGe3mIwZ5+XmwF8uiqn57Efnf0M8c5g5C9BdaXTdCHbULmAhubhRRqGaYxtjRS5HHCAJOEUms4Rg5xODgezMIBs1BEUb8eCC5qHkO/jcMLP7DEqah7pn2S2L5QcZlQd62MLUz5UKOEF0RrLj3T2hrjSIg+BoU9Ucxst7YVIeNRi4r45+JJv75ZruaXP27ds+WQLGxCcTaB6JhWwGk/iMJMgc3bysz3O4R//zEh6fsdtm6tgSwv2HyfwsWDX51Watwxp6DkOBvMySKiNDF1a8gLrH7aYfXTQ4s62RNHEoZdAAxDeafj8o7hkUZrURAiOuSjKU5ktZYKoZGTgUF5p1J5Zy3e8sLMATv3ZmF+31UH1gP+Eq5ubks8edf98Ei7OsMu8V7cPS+lvDowWBEQ/RRW21z78rbAU8eE/7Q9pb0gznpVREZukb66vK3u1Btr9UBKxZj/WFzkyzvHx9rJaTtUUd7hpSg/MFSRed3k5pf3yhLiYJnjwDBni9nValuFuIXfy+W72XJ1W9Wpsvv0EDJmyxRVfVvXCl5ez34Jqy9zv7yt7DQZOWFuPewv5npX4KlUjzn8aDbDbS7x1dwngfiwrfVUO0hEa6SDxko7JRXh2krNIotFYOx1lCMpZ/TIMNiCOZtYSaQNkWV3DvKAdbTMYBEoEdbHGJ0gwTEZkWKA8doYb2ehnRrM25FatteeMi+NY15RajWOEmMZo5eEmoIkeSw89/3tE+TlfRwPJnk/n2+9kekelXOynLKMsBwLIRQhSPIQpI2cyeIIqICICiiMhsijPzQ3immmBulGwsqy/UkiXIyGq+C5iZpG7ILDgeKCskaNhrmpP3+klTh7YvhuR2hZv9sRjBy3jmnM1vV3aggWkqR32BnAecc4P5ADApyfILS81x1YMAa5ZMMTrLnjzlJmpEwv0k8HOK+L8zbyk1ODeRsyy6E8SFlYbYJckEwrSRBD0XrEvJCY2bEwdfcYW1YQ1l3MdL8ANjFony6obCO/0cZKyVRggpCY4kmMuOCI24RsIcfCKdxjdNm0FDQ1WDeVV5ZHiRYeifSUMcJoVNZ56lxxIKCkjOPRsG7055O0VqGcGMzbE1yW9Fc54WXkNtl0y6Ml1nEjWbTUCoUJ1Hjq4r2LCvrEkN+FCPNsYkoUmx6U1EhJxRVLfg2JUhbnieDR8AI/oc0/uddjYshvT3BZvCeP3ROCpabSF/8qwxBT1CseEBrNiYE9sudV4ux/MOeB3dqA9xMFl60bmYiLcJXh9H9K0OTKJ8zbgKOJQUQxErz36ON00Xs3Meh3IsN8NxdnMiDnBCXacUwC4lonX0dgLAMZC0PwQKtKBzeaTAz2be3OWTfnFkRAlbZzH98/2df27qKZrcL27mMX3Hi7t5Q4CuMwsdaiFPyrYAPzlHnBpIjSwnZv2O6d3e79zFgQGksmKsSkwVYQRAVSEhuJCPacOBep9267mxtX2c3N7iv3+iqHtZebHNktGLWlsFtwEHu5UWYv9/qKbuHMq+/k3n5xYntgozMRUD2cfdz5FWbjKa4v79N9SzrdPdwxLdOAX9jD3fEebqycNlo5jzxTvtjKLVDAYb3ZAGkCFL3V9nCjNUVvlV75jY176X3hnia3djG/fBfiard7m1Vph9iM8ePsjw+rxYfZ/94S8rPqF/A2+eLbTbJFZp1VKU9vvnm2COe/FP71bk92jdtO3702i/DhAcErqzf/f97MUyQRVuZ283WVHWWb774Pl/OvxcTh1cL8tqHnLTZel2/cKR0iifzjt+vwcb7d/l3ss+ZV0iCbr39McVRBuurDq4u5+223n7q8uSszws9hTRO72T9daY9ztEFrKqQNEvvosTfcR2uiVcJi7SBvXrvTq5G6TyxT2ExY2fonUoYbKkUIBmmtVSTCGu4UK47AFmOpf/aH6xOXoIkB+kQpZU+0dphzRo3iFGvDZfDa4pDCAY08xWwsveU9IvkEf2hqMD5BRNkzeklU0VmMiYmUcKKps5xGGgg3QVmoS9bG8Eme+dRQfJKQsoxAPiKiFApKO4J5FE4QoxQ2hishHAccd+ctl0SJE8NzM2Flo8CgsKCUKoINwoEjixX11BopjGPRA667s8/3MhcTw/NpQsru7MGcRcUFdlF4jhwTDFETqBCBp4gQdvbUts9NsmgTg3MjWWV3YzpNI1JFpo6rKJFJfrMS2uHkPSefGvbQ10b1qYndqSH6VDnBXvkedybAXvmqcO5krzwPShCvDY2eYyIEE8oKh5kRFnvGINNcG88N6mZTQ3QDUeUwjQJ2nnmS4kEVbPI8mJLaaSG9VJoTiAfbsdFVKrlTQ/TJgtrtF+BV9wsc6dDtbbcArbZbIHu5jfcKKCZQNIhpjXwg1khMrNZSOmwwkhH2CsBeAdgr0NVeAfrZbxnHUhh141Y3i0GerFndtB65oaGZ1uzlNjatXGKvg4k+Ch+oQZYQhJH2LjitmTJgWsG0gmmtbVqLdOtx00o+2ztK3iEZ1XWn86H4SzJjBacqromvuUE+uWZKeU+Sh8Y8MDa1XGe+R9t8//XP4eK62CQ1tRiskbCA3X2o/AQ/Abt7q+zum8Z6XdUpPrgU9eUO88N+T5ULbewIMxYdMYpFbERwUTCrpUHpHeckphUfHGFwhMERru0Iq0qny+PPX+a/f5xvLO7H3U1+f3u7/2UW662Tz8dJRkgXPjLSmBjjHCKGuICFJRpTa8xYDvTq0Unep8nfp6vaez9dhqMGkgLSxqGRlD6cE0gb2yZtXLvJqjKN10kLFe/JhVYVqb1OuInG7rURXmPnQvIRkrOgrPBeMO5I8qkwikaCew3uNbjX9dzrgoegc8nIimWqA0alR4lxGZJViSog7xlPrjclFjMSjbeeIsS3AUmloucxE1lIJy1ZQwpHaC4ccVImoRCCQmAMUZb+UdEgR1KcghGDcKS28yZLhbU+6GX9evuyyMwVYCm8ksJDWV1ebN5uPp+e79aW3OBcPzjXb9hI7/pcPzil9WnrVXBKa5untG4C8cpNXCc4aL2F4c085sO30DgIDxinldA7EQkjMijhSGSGxuQF0kCtgCAcgnAIwiEI7z4Il20E4W++XZnLmVtvGRpUZXDXk1xwhbaznB281d4WtWq6eeqNND9OwtIU6wVPeGAumTMrqJaCCWEwVaaoTsHSBksbLG2wtHW8tMkm+eX9uxnOUiabRmaPb62vpas3hFUthWIpcGBYMq8IFYILZANFlAfLI0YQhcFSBUvVaUtVnuSoRDJvZotkAOeLb/fFs27sKzKnJQm0moP9JUlvX8C4DG5rQ1V+tEDdKe+LzirhBdGaS8+0tsY4EqIvGPU8Ucz4uwxz+ZpFPl+vl5TvlxuyvrkzabYhLVBHjooKnlEFh5IM51CdUtam7Rwf7oPs4bvJnqpTMGrDqVCzJzzr7Ba7xYp5d9bZZuwJwtEzgCMc8tTxIU/KI+ENl9YoFxU2yKcI21srmGUpQAhwyNOhacKtE2Y2mlXeiFC65O7cyfT1Bx/sjnoqL/aWDlXEHJtrnC8ejVXcvMy1Jjwc631wN4vl7GvIXR8prq/6mJsid3GVj0ai1U4nok4H6hinhhtmBMEIRYFR1ArjyDdHOUL/RZ3+i+a+4dSaL9rwpjcgF7n83vEwsLdtwuxwduLYVTbfI0y89cHhSAo/iFusMEeCSUycNVRqyNxB5u4pM3eZLfS3utGjXJhzVnPusXWKES69CFwkF87JSJmkept80keTT4sQt6by5fVsgEUSnGu9F5IKT2xwxHhjtQwomhRJeZ3Q4q0g4CbUdBN46ckMx5mSlz8t5jfXk/MRmoprR11KKzkIx1S1N3Y9XMkW5i62sbuAGddeqfT/VDvmCEHEaOk1VYoxT4G2FNwFcBfqugviIKHIAbVOPsEAXYZb2tLs1vNat9RXP4XIbDOvccHNu9mDVdSShBMRAsVSu+JMaGmNxkEbDYxNYF7BvNYyr700/HXqmTWWklfOMocEp9Jb47xBjqPCxFhCgopi2+SnTliE0n8fF2a2en//kyGtSSoXxlJPqEZGI52kI4IpxOQUN5pGLbxhIwljlXy6OPY4jc0aP5vXEMfWFFeulIO18oITJKRCTBCbloyQojevmGJUkLFQGnPN+ivm7Ivr+ON6fWGWy3ez38JEEd6GyPJHNVokaUDRacRxcoewSF4jMohyQ4K0I0E5Zf2hnO/TWRx/ZK/McqoAbyit7MGNgbviEFIlPTaMIUKEjIomBzeFQn40h4KpYaXZXxv3JWz+LZqeNr9dr7rTw3ZDcWUNt3eeFwcsWEoUxchir6NjUqOAdAL+SMCNdW/glvnDY29j3C1ZRXpGV8s4X1zePbbpNp20Krs8jRPz0jjmFaVW4ygxljF6SahRzoexkJYR2p9Nz/ULPaoFThfiJ8spB2cXEYospL+TUgjni6NGpESYWpzQLcbC1yRUb3Bm5WRyDyaZOpRPklEOxkYSawOj1lEcsTIYB0yRYMooZAUfi6dN+NOlSqq6jtNFdRsi23GOkRMrsEfz+aIvbhZ0UkH2yPU3rs9GSWWxx5QFjYllyDJMQ3qBo3IcGwf1WajPQn0W6rNt12dnL/gImmAaS0oLjCRHOiKPnI0pZhYKI5JMjrAoWaAtE9vxrf+lK8ftOvo8q9nIG5F8Vq4lpsIbjTH3kiGGqETSUKhm91Hvu8XQRMshbYgMqtovGIaq9rhQDlXtkuKI6i8hAVXtgVS1J1L4689+Q90P6n5DQX2P9hzKflD269o/IVD2GxCUoex3YsYEqn7DBXU7Vb/JN5FSBE2kwwR48ybSTUm7GpnTiYn93sraVaieTrqH5swOJPBguCLBWUkYcUgLToRPFkMFpwKUtqG0DaVtKG1DafsJS9vy4CFj+dXjh6uby+dZ1U6CwDh6hEgUjphoNCFMJ7lIyUUMo2EkRf3lGk5I7hf4gVLIKdKCYvYLhp8wAwHFbChmQzEbitlQzG5iwaGY/QxwDsVsKGaPG+FQzG7gn0Axe0hQhmI2FLNHB2ooZkMxe9QAb6uYjU8vZmdT+X3VsWXmQOWTL79xCVsoRUKxDZtrT61i1gQriVaYKqYsw1DChhI2lLChhA0l7KcsYZ/IM/7DtjJ9t4wPqYbNczVszjDyhGCpE4aKf5VhiCnqFQ8oCWskbivuc9NqfebsszIMTc6DbU9wuUCNU+I5kdZrji1VEQvPovXJejqXfJKxHBCn+qM5LF9dHk6Shj4vQo6yo8+mB/TGAstmIqQ02BmCXJBMK0kQQwngiHkhMbNhJACXPdKOV5AWALuRoLIW28gUIqqImONSUOuxDslQq+iwY0SqkQCa95c/rvKc7voMANAnCCpbpE6G2TAuvKEhkmBcekUSpomVwuo4FkD3xS/+96mhEssX371dFR/PFy/PzxfhPF1EKwyb+Uh2+AybuetvfgIioigEGl3RDSu1QowUx9A7biPFwQnI4UIOF3K4kMOFHO4zzOGu+8af5z4khIWlniOOkaNBKxy1YphSTzzhlpmRuJO4xzaxE04/XANo83p6YVJDccFOpBesx112sBOpfsoWdiLBTqQxAxx2IsFOpCngHHYiwU6kcSMcdiI18E9gJ9KQoAw7kWAn0uhADTuRWsE47EQaKsDb2onUoI6dz+YPv46du/7GdWxjo8BOE1p0BwYniGNOyfSTCswFhzo21LGhjg11bKhjP+lJkaJBHftsUXx19W2w9ezsniRjNaNOJOxoZZiOkYSgOeM62WeO3FhOi8Q9NvyqfaU7nt3/cGO3r3Zoun0x0RJJN0KEquALrPvbrARVwYFUBSEVB6m4p4Z316k4qJpA1WQEVRPIKENGeQwZZY0aZpSPxtW9ZZZVo8zykftonGG2mGNkEQ/EaJdcOoGp4Apb5oT1HBHIMEOGGTLMkGGGDPNTZphZgwzzL2H1Ze4Hm18WufyyEJp4SZUTlBoXtcMqIE8ZJlJgLMeyX4rQ/sIyKRqkRjdY2v6YaKKtfQFCXjk9WcgrDxPuHeaVA+PSWhqc08IqrgzFydXmJjlTyjoyFvor3OPJZWp/1W5onKabmutQkpCHfsH624wCeWjo3u/MbRFQMxwuqqF9H4otowZ4W+37qmGx5UiKqbdSi2hUasneReNCi0JcRUY9ZkypiCLlzBrhbVoPo2c0QqEFCi1QaIFCCxRanmsrfxLicmWuVoMttWRb+VWULDhrMcMooFAEbTI9Hq4Mt0EaPhJnFpP+Mg+6SRf6A0g9fDfRTHTX4oQyDLT3Dxb80N7/XDjuIVU3wFTdRMoq/WEcqirQ3Q8J56kheijd/UdD7WfS3X/kPhonnbnS2jvKsHdMyrToWeu8EAZT5pD0DpLOkHSGpDMknSHp/IRJZ8YrJJ0fXvPT55JxLpfsucSacBK8ZTE4ZHkQmjiHbUBR4LEc3It7c1Npzu86W8z/mUbfvJucS1pHNFv3k+mK7ue+0rGevMqW18WqZINRO+GUxEFjrCkXxshgvbQWWSMJbAUFZzHvLJYuPTlpvJktknbOF9/ui4QUIilWhxLzUXOwvySJ7QsVlwl1vTEKtzLlg83VSnhBtE6eJNPaGuNIiD4GhT1RzPjN+i/Q0fV/sxpsnmu6Dj8r/nRI7sD6oZEkWncxvwq3XxXcICGNZD5JorgeoU++ntcPRt6qjip/aCcMWLK2K9ra4PtLJ9603KXH+eou+bdcw5C3NuneWnk/j5N7DHsw+3T7ai9LqduT/bwMa317szn4pkAH4HsPvnrt+f16dZHQu85gzYpcX0f4RS/+NS64HbWWgWiA2z240TtreWZWX/ozlOkBfL9cuO+Locdp9YpYY7Yqfh12joN1MRIcOdFWekoIlp5Q5zEPTCLu1pZQng7Ntw9nuwfStV40EfChocvgqjuYJty6XltiA5krAT5eaC8v51f7v/3RXCzD7dvi8tE2vm46cAo5PiaPtnBszaxAzL051iLKHU9UbY53c5cE5d9ePRi8YDsoOC3aGfzv89Xe+EUT06Nt+vXH/7i4eSj44tw4nlPOg67TT4v5zfXmEK5tEiJj/oNDGMz/EMx/YRzX9n+v2+r7sy/X32+m+n7vmU9mlUA6WMKtFl7GhFyjmAgUeRQKQvAU7T77VYL0sUrgTQYI0ertfY+MzP1K8v6Hb5dni9nXdBmPVhCMauxwrz3nfJUkEvyjNQWjGsfz1p31xl7M3KOVBqP9paatKf9rtpzZ2UXCwKPlR9dgidkfdrMRrdqTXB9lWuNM7+pzlT3Bde98A9gcnO3xkxPrJ1ej67XaXEXI+uNifvn6ZrFIerh7vHfzyuIWW5/2AFJUw6e3Y4eshhW9FmmNLvo605UqPGoozMyEjxGDN/Zlf8lpYbqjoNnQKncw8wHcYLpxI//cOpMHT7ZVBDHsiA3MysB5MEZFIryimEWBoBBbu1+waeJ0YtXZFhLNa4ALVqlke7RO0lcFV5TWMOtdbeOCribSRUM0YtJgj7xRAgUbkCeUKMc4FHShoAvdf3W6/6p1a230elDl2SMVB85xQJByurd4svspp1unr/i4xyptBc/s7nj4+9mhMaagcugVQQF6oTzbdV1MFLUwKgPmnmLnmDNEYaaVUIgzxp59xrOXuthauqJG0mM759nd0nkfFoWpPB4Ic4aT25uenqbSF/8qwxBT1CseEPJoLIFwfzvn2nuCEwuJ2xNcvozIuWESVsVn6NPdETdM2afbsqoAesGn69CnC5payi0xUXEhrY1ci4icpinm15yCT1fJp2Pt+3Q1S8XbAasTPj2aEpd1VTUjfX80x7pM1OSuys+mfjQPvecSM1Ise1dbGvpAiLIxRpu8YO9U+g+lcCZaxwiz2o6GyKo/P7j+41yD8d3styfgssLoPhj69XvT2vipqaSOubyRQ+fc0FzeNjRkjM5viTcSMbLc8KJqx5BBIfkjzgosHVbCYwWd19W9kUdUNRVRt0PcybR7P1zdXN4Ngk9TgNsK+N1Ihe9wwk2tmXfuRqF/O5IpQ1hY6jniGDkatMJRK4Yp9cQTbtlYjtzrsWWkIRAnlh5rKq4ctqlRGEePEInCpZDPaEKYJt5IyUUsKt+A7XrYbmYepwbtZtLKWm1vBBKMa4mp8EZjzL1kiCEqkTSbNAYgu9uw7tGaPTF4tyGyrPX2hGpkNNIOCRFMwULlFDeaRp0wDxjvwTN54E1ODN9NxZWtTxtJhFYRMceloNZjHZJ3oqLDjhGpRoJt0h9B8emFtqnBulFF8uDOgyCZYTzZZRoiScY6vSIJ08RKYXUcC6D7Oi7h71NDZUHTtEn2zBcvz88X4TxdRB5yhCDEU3CHkbdOOYKoiZLI5A0zF7SXI4Ec7u8Am14rcFMDeJ+yzanNVA5+6k1r4NinVhXlKY99siSmoNMyryQSTBqhpMHMKIpjeq/Hohukv7bRbjssJqYa3QrzcfOI51yF4IxkShGsLVEeFyfpBGyVQRzy57W1oQaXQoUH+DRn7TxhT0lxXmfdnpKqAjzSaiJZdNBqMhhG0w41aSK9J0pyFBgihV+DVXAeJXdHcIGF0YgqAb0nVXpPNuzVNdicDoHxzbcrczlz9zG5a0p5RG3XEOsb4RzpC8HJ/Y0FK7x0WkjJKDLeIIJDCBp5A30htdf+rkAyNSe4KzlmzwMWmnhJlROUGhe1SxYTecowkQJjCdpQVxvat2kTU4P2BZhdDUjgOhKFihOCuZIhGqUJ5ioi49R4thH0eFh859tCJqYQ3Qs0e6i21awgQk0LhTJMx0iSn8QZ105zjhw0q9R2l5qkgcsf5/QWiW6EmD2yWEqDnSHIBcm0kgQxFK1HzAuJmQ2gBzX14HRSoIlhvRl70sQPku8Pz3CQfGcHydc57HDzUAZ72OH+5TXmxrSMcYaQNoYjjZXjyNDAscDWSqWwBG5M4MYEbszWuDHx53RZcXZ+s/lsUNyY+aOMPUs3HiNTPJCiO5skfeHpfw65yEfTAdLjxprSc3luFecsXVWhBCnGcGG5nC/WvcePfjs5F6AtseV8W6810iGthtopqQjXVmoWWSysn9dxNA20/WG9VFi3D+1jsoCfftyi7dObhfk9/dnNZRpjPdgv4epmejhvQWTZblcesI6WGSwCJcKmAC46QYJjMiLFAOO1MZ4/9fnwAwvbQsPO5ZkWzNuRWrZ3VRLhivSECp4XpfuIXXA4UGwT9hVkKmojvfTEwgPPLH2+7hYpluBXhaPuFumry+kBvRWhZXea0cCCMcglbDtDuePOUmakTC/STwc4r4vz/YaK/CNb7ZumfywupgfzNmSWbTgx2lgpmQpMEBJRYBhxwRG3KSoVElqva9dRSlsZDzyx4nGcXdycb07JLdIrk0N4Y3llt27SwoJLTxkjjEZlnafOMSWkpIxjDOiua8NLj4c+8LTOFrOrR2Wwl8t3s+X0YN6e4LJRqCMYOW4d05iZNdWaIVhIkt7h5MQA3rv1zW/X3/VYhbs5SaelFaFlq+UcCyEUIUjyEKSNnEnMnQmIqJB8GMB5Xa8lnwZ++MiKilN6bNsVeHqxZzNh5XAdbdCaCmmDxD567A330ZpolbBYOwG47gLX64rmp5feF5XKq1VxIu+7EKfnozQTVpaGCinDDZUiBIO01sVhwdZwpxhz3orRHJPUX3dTlahp86h+nP3xYbX4MPvfCfY3nSalbC3Tx+RjKBSUTr42j8IJYpTCxnAlhIO6fYcW+mwRrs0ifJjfLFyYZHmnmbCynkdQWFBKFcEG4cCRxYp6ao0UxrHoAdd1LXSVgH/zqP7zZr4Kl2FlJofn04SUzfhhzoojl7CLwhcbYgRD1AQqRODJC4GMX237XKWivHlE78Pl/Gtha8KrhfktTDAwbCKrbJWmODgMqSI65CrKoqeYKKEdJtxYjKEWWRvVuPKTSm7hx2/X4eN8iqm8k+WUjQaDEsRrQ6PnmAjBhLLCYWaExZ4xiAZro7lKwnXzlD6GP1Yf56/nPry6mLsJetANRJU9KCFg55knyX9WwSZLzZTUBaOJl0pzAv5zbUxXadi8/6B+Dsan0aeH6JMFlT0UgUQVXfItiImUcKKps5zG5HdwE5QFIpIO48EUup//UuycmRyWTxNSli/BYc4ZNYpTrA2XwWuLAxJSI08xg33itXFcPQX19vL6Iq2e00PxCSLKVrul9J4RgkJI3jFl6R8VDXIEIY0R04DhmhgW5fue141l69fbl7t9TmGzEern1eXF5u3m88kBuzW5ZdGuiv2PujhA3Qfl0oc0GWocSXDUcgQ9TLXRXtpDfPSpTRvpbcisElNCZgczHQBTwsHLa8yUkFTc2siTugcmo0j/owIzgS3WNr3HwJQATAnlTAmFTqHHjABmuQyr5fdhsZgvPoc/TLqP8H+urwZBBoBe/GtjC1i5LThy7f2YgVJFOHxlzblSJEFE0KT9lNv001pmA1dOe2KlpnT7qPHBR+3n7vNytbhxq5tFIIN71jz7rA9efD8Pm2YedtmlNX7awmEqg9bWIUSIIT4ptLEOO2uspoQcVewHVzW4h51X7EPX/vSKXXJljR81kdRSSZ2WODpHIqIEWyY5wdFoZ9TmUVOVfdRDteDk6IN+KvuNjjzmdq03s9KR5K84FixSmKaFmzilCXHGioC3fRq0RJ/3faunf7gkR9WDo8IGc0kiD9hxj7GIRUI83SqOeDSbakR/nMRk/7FufhR/PEEKniPSyNJlc6MiRxZxQ4RPnpRgyiSji4Nnyo9mHwxnvUGT7kvr/sP40bj07/TofasJZZvuoAc8oVKr38vC2DTCrxrOoJAiVxplilZxENwxqWhyehQlUnO69XqK/c57C+LerV8t5xch/by8NFf+lrti+34IqyXNrZbSWoSVjsikYE6J5O3b9E+K9HxwPOqxNEKw/lZL9lg7HkKkoGS7hcfETFM94eQZxV00ATMaHBFCeyaQYFQIWRxVJcJYdnaInnA7uZPFizzVh2+XcX5VjHd5Pb8KxdGwe3CsBEXjWUz4U4YYKrhWJkiGAiGWFH3AZCykLH1BcZOdqbfKTg28tQW09faUKvX26oy1q4TxotRU/OFT1MCeRxWoj3LYc6kC9VITK4z6odJoCV47lIiNJDBLk5HgRlDMI0veNAk2eBKUKs6MXa8ool508SEsvkJoMaxlkfaX7YDQAkKLFmNiCC2GH1pIRIxAwVEhFfVpRSchRB04x1xTPpZeUtWfCX28Qy63xE4QuTWkswsqyjsnKg8EEQVEFBBRtBNRiMddGg+k8/LtrSru4vr36an+Ej5ub3FA0QWD6AKii6GsjK1FFzQQRCjViDgpVWCKcEo591JzqVEYC+WJ7A+3+/u3ko37uDCz1fLThy9mEfz2saThZ279wfTQe4KIIEKGCPkZRMgOa5vcISqSv5hsqkyfWpTcxmRRtTd4LCc56d7MKd/fS1XdZZwYihtIahs5a3k8cq46KETREEVDFN1SXa56FP3S+/TLNeXQEmLnQa2ZEDsPY52E2Bli52eMXoidIXYeEh7bi52ldJTZiIkN0TjODDeGcu0j9VIxMha2rf5iZ5aJCEsdxalht658dhXmenFyyVAQHUN0DNFxSzVmVq9r9fV9SqIBxcjQvZpi5B53dUCMDN2rEF8MHontxRdBOUMiS+GESisL9yioqJ1BCDkVIx7Lxrge04yPT0irstRODcGnSWlXk6P1u1nLBoSIAyIOiDjaiThoRRaOl9fXQwgssvxULN0wVZJpyZGmjpuAhBCWOCY1ccKOZFHsi3Bjcv5ZYckO+2dJAy5mbvO486U0l+wyCdHJ5IwVJskgqm0gkhpOsRlLmED6S/6SQ5vy11ZpYijNC2PraokabATpe+BRgUcFHlVLOdzHRJ+PpfMgrHn4bghuFsY5P0tjZKQucrg6UkytRRapEKwKlkst1FgWONTj5tnSB5tFycSWvRMklG1ujygww3goGpyMQB4zrpkw0gmfPDcxFgz3hmBeeiRO5vmk+dNXk3l+ZSZ4VmEzaWUPlTWyiDUIlslnIVYZGl30JCqKGNVmLOW1HpFdevTva+O+hE/v5s5c3Hv5q/1nmmv9i+lh+lQ5ZYNpjQKPxEiLnU4euWUypjeaBYUkHs0hWD2i+fGZfA8z7i+9nxXfS89r85t7/uLkIN1IWDlce2McT9YZaYJTJBGo9N4br4XGzhM/liQR7q/hWpWGoQ+X1B/+cOF6/ert1VdzMfPla+ztn00O8N0IMcvcrwpDbrWzRGODhU2WXTmhCfJCstGc6dmjgd8PlN6Zq/Ob4vTJZJ4u0kR775dTtu9NZJVDtaKCIRa1FoELYRQWznNlnU+/xMyN5TyK/lAtS53L2yTj7szJs8XcheVyXvKbdV4xGjc9x7xV2eVQL4TDlitijEIGcY448ogSi5UNknqw5bXTguXC2h65uv4xZfNdVzx5PkgadUTFSW0+iGCT74EIDRghqazXBLBbE7sHTg7eTPJhfrNwoUgFrOZ776YM6FZklt2XhqyzEjOtg+XEoegCEZZYg7Gj0RhAeV2Ulwrrdm39+Pvs/NOmCvnp9c1yNb/cvJk0yFsQWQ7jyFMhg1aaOS1UJJJ4bB1VQTJLERkLb1GPGH+cBXv8wLZI2z2y7dtJ47wlse12auoqLT35KhL0+UCfD/T5tNPno46eMHIXixSvty/fmeXqbG3HLy9nq9U6x7T3myF0AIlcA5A32ivsZIyOKM6o9phQHaJKXqTjciyN1hI/cXrrRPRMbJ1tVXb5Q4ad0ZY4F6VKIVT6EHOFPI6RSSVGw5H0pNxe+/mb6WZt6wknW2tO2CSCREODRNgixWhkyVSvG+CERCPBLeyL6apKpsr2xfzwNf37Zra8LtypYsLi/Ycbu3SLmQ1VSwZUMyl4tIEa7q2iRrkYMYnOMkydcSPBZo/l32pe+u4X2/eTs66niimH5an0xffnH0BXfL9d8ZxbTLF2XnFrjC1qBd4pK1I0zASXY/Fwe0yd5mKT9Yp5Z3NehZg+XD+LNH76+yJ9MjlEtyCxbcIUF/dTKWN6Uqy4y6Wyz9fr73z4tlyFS0ioQkJ1KAlVcTihegi0HYpFBocUZ1YbQa3hwhunsI86gSV4TfQ2q0pOyqruOpa27Uw/ry4vNm83nw8/oxqFQpF4w5SQBKGI0iosbdEXG53jY+GLJf3tqMyuI+XIKYjg7t7CyltfYtnWE2as4FRFHCi23CBvEFPKe4KYZh7K8rUj/Xx9+VWx5LlF+oPl/dc/h4vrCYK7mbCyTa+SCk9scMR4Y7UMKBohjddp+fdWQONgbVyr48J6P5+vNi/vplv+tJjfTI8Ppqm4shktGlgwBjmHgzOUO+4sZUbK9CL9hOxsba+ktMHzQE/QT2GV/urmMg0R/Gb0fywuJgfwVmQGWS/Ieg0Z421kvWC3cW8Ih83GA95svMn+7tJiJ2R/j2STIPMLmV/I/Lad+ZVHTgatpquQ9R3esgxZ3wEvwpD1fV6xFWR9Ies7SlxD1heyviPFNmR9Ies7AZRD1heyvpD1hazvk2Z9SVtZX8j4QsYXMr6d9vriNjK+75eroSV9FSR9X8j+mJ8h6TuwpO9EiBJobwgHooQMmIEoYaC4BaKEFokSoJAGhTQopAGuoZAGhbTJYhsKaSfEelBIe24oh0IaFNKgkAaFtCctpPG2Cml7CXqopUEtDWppbdfSMDpSTNs/2e7sy3WJ6q6z/F+uP6xurN0l/W/fDqfAxnMFtqRPBFmiDJLOOCeEUpE67LiXJqnVWLK4sj+eZrWf/WkRTFNbtDsUJZTkgLt8GCiHktxAcQsluRZLcoIYpKP2hgrvLbeIGuukdSwYYVEYSydPf4kvqasvjpusznbmX69efwnut7fLbZbeXL0Km8c1OdPbiQyzx+0xzZJ37ZWUlEqLrLcEuagZ5ZYbMZbk2DDTv79e/RRWRR7zfVhuDgTdBrGTwnwLEtulvWiFtFdrLjukwiAVBqmw9lNhsoNUWHq5q4zOF88rIWZx8JQFL6IPmEdPHUpeKyUiSCONGUvsL/tbovW+tFqH1MRW8O4FCskxSI4NA+uQHBsobiE5Bsmx4aYFIDkGyTHQAkiOPWFyjOGOkmOHHXdIkUGKDFJkz6NbLL38x9Vs9bySY8gq65DGNlKHqLZIE4VkQBypiNN/I1mhe0yOtdPiVA6mia3dXYoSEmKQEBsGyiEhNlDcQkIMEmLDTQVAQgwSYqAFkBAbY7dYmcsOqTBIhUEqrP1UGG0jFbb2FpOhOjPut/THy50iDy4Zlj2QigRMkeVpORYMJ5eWqRAclyzhiUeB6UhWZ90fN6napxdqFU4TW7m7FSYkxIDRdBg4h4TYQHELCbEWE2LIMceYddwbxoiJzAYUvbCCEo6QFSPBZn+pAM6qLI+bOXdr4lT5TBuICpK8kOR9VmCHJO9z1wJI8j5lkle2leStFIhCmhfSvJDmbTvNW6RXm2d535ibP9b/DCGTi3EulcuctyzF/RaL4AuOfU2MilxL6ln6yUayBmPZX87qkV7VBs3UFuHGAoOc7AsBOdkhYBlysgPFLeRkW8zJaoyMTJ6l0jpSTG2K3ZEKwapgudRCjQSb/UXurNQZfEjS/uDd9AxrfQnBOWlwTtowwdzdOWkTOYOkx21qcAZJCx05HZ1BAqdNDbK2AKdN9XDaFDGB8lgkMDGT0sXAqSGWMGWCwCEaQHhdhMtTn9dm9MnivC255dBuGDdcOhVNJMo5Ly0PNnonNE3/4xBx1u6YqFX53DyHN3tnPv73wlxP0X1vVXY51KfQVGjlEUZIUYIciVp7R60wniqPx5ID7NHGlxfdDtf7zxbzf6YZP+7KmG9mi+Xk8N6S1HJIV96gGHRRoUUpgmVEG5Xc9gR6IQPXFpBe177vty4ee2a7h3VmVl9efXsf0uvZ1+LLxS8mB/m2xbfrEkK6rS6h2/IndAJBJxB0ArW+4RO30gp0G+L842oWZ8GfXRgXyn/7TDZ/akSLGp9hkWGaEIYjM+nquZVSCWHHkllLLndva3Wa66QOmBPANbFlvEfJQg/SCw49SEMAPfQgDRS30IPUYg8SZIQhIzwYoENG+LmiHjLCkBGeBtIhIzzIjDBrLSNcO2iFzDFkjiFz3Poe0iNMgY/txtZYbZpjijfJLqUF04XlcgjpYJJLBwuGuVKCKGNsMIIggkXglEhrBReCjGSZBi71jpZVqu+nCK5WC+NWy/IUwZEcq/Ei+YcEScxIoE4qpHBQWifT7sR48gH9JVn5Po9iTcs1MSQ3Fddti0AFIpFaQ4ObB24euHmtu3myrpt3K6+XcX21xbtdF/TapXt6Vy/LFTIRVw9YQofh6m1WQ1zhMNHaqgYrIqyIsCK2viKKk1fEA/vfnn5BhNzH7IWCBXEQC+LkdztjovurC8N+56fY77x1+lAjp690dPD5wOcDn69tn69YVVrx+W7L1OD5DWfBBc9v6J7fRFhAevX8gAfkNP+vPR6QrRcoWvQCH8wBviD4guALtp7/Uw19wds8/VZNoSQ2kOUXSmLD8AO36yJpYV18pGuwJsKaCGvicNfEu7UP1kRYE2FN7HJN3OkUrImwJsKa2HrN4PQ+kaN7p59+baSwNgKhxkDWxsmzZ3DcW9kA6DOeAX1GpFp7o4SQwSavJVDivHUseTRKU8n1SGDf127FQ5ueHvs3APTMHrHq4tqFO6RZg9QRHYKwB8IeCHtaD3tQg7DnIIXO0wc80CgFp5gOP+CZCHGalL25fsCcdlKXVFvMadu8N2voCB6YAVxAcAHBBWzdBdTNXMAjlHLgCw5iCQZfcOC+4ESoRTHqjysKyEWbJcA7IhcltLl7mJ0K/ETwE8FPHBCTxlpliw0v78NyfrNwYSMIcA2HsCKDazh01xAxzRx2XklJqbTIekuQi5pRbrkRfCRA7NM1rMMLccB6TQzNLUisJSaN0tHB5wOfD3y+1nODtWnj72lpYa82xqWIy9Z/9HpzK0Nw/Ri4fi/64i8A1+9U18+rGKhwiCFKuBWeeSqSJ+iJNDIwOhoqDd5jifg4JXpFIzYxULcnuBzihdHGSslUYIKQiAJLcYHgiKeYhwkZx4L43vDOddav+Zg8jU8/bvH2qXgcm4e1nCrMG8srh25NmZfGMa8otclNlxjLGL0k1CjnA/R610Z3eVj6YJL38/lq83K65y+fLKfboP2kE0AqLQgQu0PsDrF727F7YX9zsXvm/MaN7m6twq9Xr78E99vb5eb9a3P1Kmxs2RDCeNjZCoyYww/jBTFIR+0NFd5bbhE11knrWEKlRSGMBIiY9Of4yX03vQ17NjF8dyJDCH8g/Bkc0huHP0Q1OhG7ovZAJASREERCbUdCGOGGodDWUKwPbis0NZmes7t4516YAhHRIBZg4PoZekTknDOYShR8kNgQomPEKnDsqTHJFxzLdoceuX4KBrOurNrEUN6lKLNHpjGMPCFYaip98a8yDDFFveIBIT+W/eD9hUePStalD/LBnKABpbX+kwW3C6AobyGAqqpmEEdBHAVxVOsVpSM7gKqq769XL71/fWGW2wTIx/mwIigOERTsChp8BMUYU1EZG622CLFIdWCcW2KQJQoJNxIgEtSbt8hKO7+2FuzXq4tv26H+CO6m+Pr2IU0MwCdKKQdlaVPQY52gkQrrKVEKq6I6ikzkjoWxxD2a9JcM2K93tLM2TwzqHUkxpwpYKy94QfqhEBPEJv80YMa9YopRQeRIVKHHFMC+sI5HsusH927223b8ycG+DZFBmgvSXM8A6e2nuSrsbW5jFYEMF2S4IMPVdoaL8+r7nTc/7rUKPX3iKnsEnk+OJBEkGhokwhYlfzIyjF1ghnEhx7Lq9lVwnVziqjgm4i5xdXk9vyqWqtLE1Ycbu3SLmQ2Lx510Bd1onX1Ee2oG6x6se7Dutc7tJiusewe2wL5ZmN/fbM9sWX//l3B1M4TVUOVWQ8U5kwE5JyjRjmMSENdaMSIwloGMhViB9pdyFKV0oQdA8/pmuZpf7t5Oty+9HaHlt1wEFoxJSMfBGcodd5YyI2V6kX6OpUzUX5+doDUe2U9h9WbvPKt/LC6mB/M2ZJblydEa6aCx0k5JRbi2UrPIYrH8ex3HkjaXfZ3pU5IEPsEHmBrKWxBZ1pRjZGRybJXWkWJqLUpRfAhWBculFmM5H7U/l4WVeqIpAoiz85vtaA/eTQ7SJ0goW+hnxgpOVcSBYssN8gYxpbwnBcetH4uZ7g/BfL9T/aHJeVUE4G6R/mB5//XP4eJ6igedNhJW9iA3zaTg0QZquLeq2M0cIybRWYapG42T3SOuqyVpdr/Yvp8eok8UU7Y6Tw1J/+8SbiXVUnOhBeKKEh2twnosbOP9Ybn8IPFcwnH32d2vfjRuNV9MrxWlVdllA0hjHCdWIU0w5jFQ6b03XguNnSd+LKjvcTtiqWl66Dn+8IcL1+tXb6++mouZf/BxuqA01iosbv9scvDvRoh1elVqh7C7Ah39vNh+63vEPxd1jofpy+X9mh2Dmh3U7J6wZqcP1+zu4bhHyUSFmDTYCoKoQEpiIxHBnhPnIvV+gxPavWSKk4ErSOaYhncoqaAMVwwlL5WEFHkl1VJCkKRcLHjpCKtxzn0FM7dLSA/lAKvsVjXFA05OOzNYBEqE9TFGJ0hwTEak2GiyLbS/pHjpY62Nm4l5MS1JLXt66jTK+bjHnnIo55+AdCjnP7fsDJTzT4B51+X8ifCE9phPB57Qagn103lCIbcIucXnBPWOc4tVD3mvGQZAehHSi5BehPTisNKL4ggzVlUv4ukTitljUV1EKKbw0wUphXA+RsOlRJhanLx0QUfiyPTYZcvkcWlN3Sc/SUYQXSYHD8LLgUG5k/ByIm3h/YWX0Bbec1t4cicMdoag5FgwrSRBDEXrEfNCYmbHcjxWj+m+CsK6szMTJgA6XVC356JW5jM4ZuUhtQGpDUhtQGpjWKkNeeTspFwStxDYT2G1PeZ5OYT8RvZ0JMexEEIRgiQPQdrImcTcmYCICiiwsfghg9mfdgQuU3NGGgkL2qOgPWrgAO++PcpFtOazC1JzaQTymHHNhJFO+OikGAnQezTgpcnXTKR/WxR+Zc4nB/CG0ro9bJY1K57vrQ0QWEJgCYElBJYDCyz16YFl+rz4YjhLi+I9qoYhBJgiF2BaSYQrquYqeG6iphG74NZkKFgENZYCep87cuq4lAdhMzE3pR2hQcAJAeeYgH5SwAmMVsBoNdiMITBaDQjXwGhVCdHAaDV8LAOjFTBaDQX1sOvsWcG/411npFni/ECsCwl0SKBDAh0S6GNKoN+SMmyN6nlYszI8fQI9uwNNOYKR49YxjZnh6XVy7LGQJL3Dzowmgc6HmVc8CJuJeTHtCA0S6JBAHxPQIYE+hOQMJNAHkUCH9AukX4aH96GnX0o9JUi/QPoF0i+QfhlY+kW1kn55wIn59NkXDYcmvyA9nrIJQekQg9KJsCxL3R/QgWa5Ps67plmOVGtv0uImg02uYqDE+SK1HoTSVPKxEGH1F6NyVc112ntQ/70w15PMvjQUVzb/oqRBkkosqEkRgYoxYIt48D4WHu9YfJUed1roJg/rvu85NZi3KDlo2X1BejTn0LNbyYx30LPrOUMp6CbrPAXjUQrKkeYIIWK4jGQsYO4Nyyzfd7p7MdE6UE3pAB1nn8gFOk6g43zWCAY6zqqeRAM6TijFQyn+OWG941I8bq0Ufy+dCJV4qMRDJR4q8cOqxAvZ4PSd+07E05ffZa78PhG/XINjPjhnpRvHnBuZFkgVEXNcCmo91sFooqLDjhE5llQJGxagX5llAECfLCg4WeqF7A/PcLBUNTh3cbCUkTTqiLTE0QcRkuPOEKEBIySV9RpqMO00QW0n+TC/Wbjwbu7Mar73btLF8zZklrXZKvnR2BEbmJWB82CMikQkE45ZFAhQXttml7Y7bCfZxIcpcvWz9bC3ryZsu5vKK++RKIGSTy2MtdQF4oTSXipvI1HBurF4JD1uIy7dMfhwkl3mYP00FmeL+fkiLJevzGK6IG9LbPk984ELo1WxJ8FyKkVIL43BSlvsWYyA9bpYL80/Hp7E+N0jfB+WNxfT64RqLrDbIyBQw2MF76aBog0UbaBoA0WbYRVtJDt9+2RhOM8ubs5nRU1lfQdDqN1kiauSX2KslEwFJggpTqnCSUIccZuiTyHH4pv0ebRgvqv+OGIm5ps0lhfQVQFd1cAx3v3OYMRs8hKZ18IHhBxBjkUaItNCOEkpHDBYF+esPDGwtj3bHz98TV95M1teF57HFDcnnCAiqFL2mfGGKmXXVcptVkQ262p97NZAcgSSI5AcgeTIsJIjip6eHDlbzK4e5YBfLt/NloPIkvBcloTQgnVHesqSntGorPPUOaaElJRxjMfimfTI2pCn2KgBnYn5Ku0JDvImkDcZOtiBUe25xZxAqHYCzLsmVJvIDp1h7WeADTqNBAU752Hn/PPCesc750WzHGMmFoBkIyQbIdkIycZhJRv1kWTjO3N1fpOWy5/Nlb9Icjv7cn3I9hUVyAvz7fWFWS5fXs9+Casvc78cfNqRKSe8jNwaKy2PlljHjWTRUisUJmM5g0r2x2sv97NnLYBoYl5OFyKEVCQc7jBw2HefihSSCk9scMR4Y3XCfDRCpqg2eVo+eRVjAXp/SZrSUsnx3MPyp8X85npyCG8qLkizQ5p90ADvPM0OaUlISw4P9t2mJVmFtGTjCAESlJCghAQlJCiHlaA81g1Zx+wtzO9rm/eLuR5CWlLk0pLcKBEp8krqhCKVJEVIJFFKTx3CfCz0iJj0eAxhk6TaA+xMzLlpT3CQg3xB+iNQhBzkIHOQkKeBPM3Tw7zrPA1k2iHTPtZMO2cYeUKw1FT64l9lGGKKesUDQh6NBNs9btyo4mE+nPPsLmibcOtve4KDnHuPthxy7oPPuVdpBT4xDoZMO2TaIdMOmfbnn2mv5Fk8faYd62yqnSYXhkjrNceWqoiFZ9F6541zyQaNJVKlw+KOTkOfm/QXsIOvFYFBuPoCSwhYh4/0XgLWiezFFv1xycBm7Kp5RzgtsUHGEQ0K0HBaYiNBZYugGBmZolmldaSYWossUiGFJ8FyqcVYAN1fSpGVxlIPs2EP3k0OyCdIKIfgyF0k3grMgxaeGkF8iNJxRmXwyo2mX6U/i7zPEFvqGn653r79EFarNPb0NoeeLCfgNgdu8yEBuW1uc8q1YERY7KXxXnBsdfIqpBAySmGNBQzXxHClbeh7c5r0nDb/FsmqXez+7UfjVvPFt8lhvAsR5nSAMBKDc4EHYhxzVsXIKOKKRum1RKNh0e2vVL/fKJct+m5GTH95+Dc/h4vrCRr7zuSYjTI1tUFF5rFlRDsjtBZIOicxR8ExiDJr5733Y6iMOUsv919NFPstSe1IgjAQSQlOwacjVhkaXfQkKooY1cYD0ptGo5tswXptLo6Zv7j38lf7zzTX+heTw/bJcsqhGWuV/HeChFSICWIxEQEz7hVTjIrRkHL1SEe0L6wKbmjRrfZu9tt2/MkBuw2RQVPtCwVNtc8J9V011U7+RLr+tn3CiXRNPJcKcsqh2RkqrLABCRNY+leHiDyVVCuXIlE3ls6THnOQLfeITg3lrcsvh34jadQRaYmjDyJYyRgiNGCEpLJ+NK20T721eTvJh/nNwoUislrN995NGfGtyCzrsSiCGHbEBmZl4DwYoyIRyYHBLAoEKK/tsZQeT7+dZLMXIrmYfrYe9vbVhD2XpvLK++NKIKOJMNZSF4gTSnupvI1EBevG4o/32CteXuZ+MMn6xyws109jcbaYny/CcvnKLKYL8rbEluccClwYrQqiIcupFCG9NAYrbbFnMQLW62K9wkaW+5MYv3uE78Py5mKCR402FljTDcsP5yrdbAEblmHDclVpwIZl2LDc09lFrDVq0J/CakPOsKFCfjX3317PfRjC3mWW27psTcRMBcZw+j8lqJQ0ue824GhiEHEsXbt9Hl60H1q1gaKJ+TSdyBCoQ+H4ooHjHo4ven6ZRyBVHAqp4kT6YeBgl2eF+I4PdpGtkswdcJ4gfQPpG0jfQPpmWOmbIkrMpW9Ocp6fPl+Dc/maiQSqDALVQTs1bQWq28ITOe7EnDABeC3gtYDXAl7LwLwWXN9rWV/mp5feF9Ony17ML9+FuBqCt0Jy3kq0QWsqpA0S++ixN9xHa6JVwmLtxlJdwj2yKJb2NFWFy8S8lGbCym4vVdYgpZF1hnglXBQoIEKY5o4GisfS4oifuu+r9Fltbfv6zYRd8MYC27nf5ET3+4DmlLnd7P6ivP4eON3gdIPTPXinm1ZzurP63aGcJA2SW8ME04HbGIxUXnPDohGCBr0thosjfV6HjduPsz8+rBYfZv87iMxg1tfmKIUfpuhADwZprYsNRdZwpxhz3orRcPT352uz0k0yR3EyMT/kRCmBdw3e9YBR3Z53jXkT7/pOZcCtBrca3GpwqwfkVp+cyX6bbnwguyOyPrVxmHNGjeLJ6zBcBq8tDkhIjTzFbCxcLH361NVTsrcgmZjrcYqIwJsGb3rAkG7Rm26Uq97qC7jS4EqDKw2u9IBc6SNHJx82aWeLcP5LcRGDd6YpiSo6m0y4iZRwoqmznEYaCDch+Shj8UN6dKZLN1Mdg8nEfI/ThAQONTjUAwZ1iw41a+JQ32oMuNTgUoNLDS71cFzq0/usk1G7NouwpXZdC2XgrrX3ERGlUFDaEcyjcIIYpbAxXAnhRrPzfZB91iVwmZg30kxY4GqDqz1gcA+lz/qR5oDLDS43uNzgcg/H5T49i/2fN/N082FlBu9qx6CwoJQqgg3CgSOLFfXUGimMY3Esx2QOM4t9DyYT80JOExK41uBaDxjUQ8li32oMuNTgUoNLDS71cFxqiU51qd+Hy/nXIlEQXi3Mb2E5eM+aYM6i4gInV8Rz5JJkEDWBChE4RwqPxSHpMYld+lgromVivkgjWYGfDX72gLHdYgobN/Gz9xUH3G1wt8HdBnd7OO52cWTkae72h9Xi47fr8HH+j8XFEFxtnnO1NQ0sGIOcw8EZyh13ljIjZXqRfrqR+CT9edrlJ0YfJtlPf3VzmYYIm8MYv61BMzWvpA2ZZc+6cZpGpAoOSq6iRIYGooR2mHBjMR4LygnpL6DElR3Jh/ZwYtA+WU4QSEIgOWBctxFIZrpYOUNCELJ2YhmPUlCONEcIEcNlhLPJalfW82Zo9+LncJEGmByYa0onh9wgUwiWzDJyQTKtJEEMResR80JiZsfCE9Kjo1FBWGXHxE0OxKcL6rZ0XuEEsWruC6TzIJ0H6TxI5w0onXfCCWEbu/YxCe/jvDj78NXF3A1/BxgPShCvDY2eJ2USTCgrHGZGWOwZA/bf+i5IlSOuDoBlak5IA1FBxgMyHgOGdoulc9TEz97TG3C1wdUGVxtc7QG52rKZq/1zevDJMA/e0UYBO888UQSrYJUNTEnttJBeqmRoYP9XS7m+KlCZmC9yuqDAyQYne8DAbnEfmGruZG+1BlxscLHBxQYXezgudj1Gs1fFc3aL9AfL+6935eynd7NFzs2WzFjBqYo4+SCWG+QNYkp5TxDTzMuReCWUiv787DxL1xG8TMwlaSasnL+tMTIyrRFK60gxtRZZpEIKJYPlUgs1EmT32OVUaq/SkhFn5zfb0R68mxyYT5BQDsHcyEAkJVgmX49YZWh00ZOoKGJUm7GkQJ66rfq1cV/Cp3dzZy7uvfzV/jPNtf7F5HB8spxyaEZWxaipw9iIgJ2UJmLHsDTJpSdkNPmP/tAs8jupDyydRRz+w9XX2WJ+VWzymBy2W5JaFunMpmCdeS18QMgR5FikITIthJPJEwWk1/U8Sp3Es4ub89nV9scPX9NX3syW10UIOEE/+hQRZfcIGON48jmQJhjzGKj03psEaY2dJ340TNe4NxCr0tTLQ+fwhz9cuF6/env11VzM/IOP0wWlsVZhcftnk4N5N0K8zWqLulntbHxaltkmn+3dn0FOG3LakNMeeE6bH8ZJFc3uUEJaYqQNopYzQbzz0UTElZHMMZsEpzYrPCYncjbebQm/KuxxOEsL5z0bB9YNrBtYN7BuT2vdhMrX6t6Zq/ObZLh+Nlf+Islr7/291oanL9RlqWQQ0kWdDmlMUmjmEDHEBSws0ZhaY8aSPsOov/4hvk+MUh0sEwu7Gkgql2SgmknBow3UcG8VNcrFiEl0lmHqRkOP1COiqy0Wu19s308PzieKKYdliayzEjOtg02rOIoukGSd01KFHY1mLKcu91jeqN6F+6CRaMIkBW2ILFvY8FTIoJVmTgsViSQeW0dVkMxSRMbSLNQjxqsc6LeLw7ePbPt20jhvSWxANQNUM8NDd3OqGVaBPbqqB1+W5sOfv8x//zjfiOfjLnfw/W0W4b/MYmbSVA9SgBxSgJAChBTg8FKAsmLT/gGt71FiXAbhfVQBec+4QpoSixmJxltPEeJribHuJaZ4I4nl7GSH0jNWeC55jEhzRQm12AliOeIeY0qj25aLeIUi+P7icfblem+BOrtLod6tULCWwFoCawmsJbCWTGUtoRVbD7aNisXrXc9iWl4KGRWrS7HSrC4vNm83n5+ylBTfT4EYLCSwkMBCAgvJ2BaSZhI7bCU7lJ2KnGLkrVYeJ3RF7rxilmLHvHZB6O0yUqhJsw62skNNYAmBJQSWEFhCYAmZwBLCT2QFLVlCtttIzgOsIbCGwBoCawisIZNYQ+SRVvP7ZfoP85uFCwVBwmq++PRmtgguvUgrzoMPhtB0TrNN5zQoSqNxgjtCA5UUCx2tE1pQTfhYms6p+tvTkkOVouaVWYY9uEytE6aRsLKd504H6hinhhtmBMEIRYFR1ArjyE0cCbCx7g3YopQzpvRZPXg33U0VLUgsB3GiGQnB4eRmU6s1CShgRJxWzHsSCB0LxHvkGy49SLnmij81kLchs9pHe9QafxfDk8/X6699v7z/KexihjB9KGF6Zq/uLXh7lAtzzmrOiz0gihEuvQhcWCucjJRJqnvbw8wqyOWAUneZw7DaBK6w4FhZxkKQJhgqtEu/RYqwbVRZ5ei8UntWyOjtqvjmfAFh5QBdE9ofuRSElRBWjtPnhrByWGElxZQke80Dj5zYwCk1DClEKFPUWj4aYsAeIV56qmfdJX9qKG9FaLeBZYUNcydMAJElRJYQWUJk+TSRpapyUmSpQXsf3M1iOfsaoHA5bC8FIsxheicQYT4j9xsizGFFmEh4rShxKAWZGjvkOHLGKGuxUdIpgHhtiMuctGov/RNDe7vCu404q25pOW0iiDwh8oTIEyLPJ6ppnhx5bixzISmINwfos0C8OUwfBeLN5+OMQ7w5sHgTY20pC4RwzKOKBCtnrXbWUR+I11DRrA/x6iHTwQV/ahhvQWS3x5g1ii0PDA8RJUSUEFFCRPlEEaU4OaI84BE8fUCJcwHlRPxuQsHvHq5P0obfvXVJVCOXpHR08EjAIwGPBDySJ/JIaHWPZGuTyw5tWP60mN9cD8EdETl3RAfJDOPCGxoiCcalV0QHQ6wUVkc1EncEo57ckb9PzZfAyQbueqRfnp8vwnm6iHxeTkgqPLHBEeON1TKgaIQ0Xidz7q0gI8EcoaK/ooo67WiZnZWaGGibigvOl+rz7Es4X6oiqhucL5WpoiiFJC7qJkRjg4VlQSknNEEJ0IyNpQJO+sPzvt935MSuKR8I2EhWOVRrqgQymghjLXWBOKG0l8rbSFSwDlBdOwuX61TYTrKLftZPY3G2mCd3cbl8ZaacimtJbDmsm1gEvFw5LZPhDpKLgLTUjArCk1H3gPW6WK8Vua99xuKh7J7j+7C8uZje4dwtSe220ZrUyzwfdesfpZ0XIW7/4OX17FEeD7LPkH2G7PMAs89FdauCXHK63aGUvHKWOSQ4ld4a502xDSrJSlhCgoqiWhL6+DmNHxdmtjV0Q0hCJ2udyUJjrbzgBAmpEBPEJo0KmHGvmCq8lLGcPy9YX2nokr6z45B5fWGWy3ez38IONlNzUFoQWTbv7SySNKDoNOI4rRZYpEUVGUS5IUHakaCc6B43E8jaj6zok58owBtKK5v1DtwpG7SSHhvGECFCRkXT+p88RU/GEmMOrKTz2rgvYfNvcUTo5rfrlX962G4ornyykHlpHPOKUptCIYmxjNFLQo1yPowlWSj7w3auAe1RoD7d7ODJcsqh2UWEIgvp76QUwvkYDZcSYWpxArcYC3886Q/ObH9dPZTEnTCUT5JRNqstibWBUesojlgZjAOmSDBlFLKCj8XjwP0dYZPdqpRbQqeL6jZElvU8UngoNcJK60iThbbIIhWCVcFyqcVY2vP62yzASvNdr+dXcXZ+sx3twbvJQfoECeUQHLmLxFtRcD4JT40gPkTpOKMyeOXMSBDc40Fj+z5haRD/5Xr79kNYrdLYy8nh+GQ55dDMGUaeECw1lb74VxmGmKJe8YCQRyNBc487yvfD9uMpqbO7CsaEO6PaE1yeQsFjFpEhxmsvgqEq2XOJeQoTA5NqLBQKPTb/1agxbH78HC7SWJPD9+mCylJQOuYYs457wxgxkdmAohdWUMJRChsBz3XxvE/Xn3lMr+eX1/MJI7qBqLIxoqY2qMg8toxoZ4TWAklXmGkUHBtLjPiE7X050/Plev/VROHdktSy3reRgUia3O/gHbHK0OiiJ1FRxKg2Y0n59Wi9S+sLm4RVsTP34t7LX+0/01zrX0wO2yfLKYdmb4zjCcVIE4x5DCmi9D752UJj54kfi2/N+4OzKm0sfJi6+uEPF67Xr95efTUXM//g43RBaaxVWNz+2eSw3o0Qc4qgomTBWYsZRgGFopgjg/FcGW6DNGNRhP70QO8/wuO5gQ83djd70dKWnudyZa5WD99t/mJyGtG1OLOHvROEuEcII2+dcgRREyWR3mjmgvZj6YztTzcwqt/lWf1pTjsn2atsc1qTnCqksCPGqKgUKrwrFjUiStEYiBpL0ak/rZGlDvDtlo3NEOmjw7+Zbo9Aq7LLUnp7QjUyGmmHhAim2GjiFDeaRi28YSNBfW9cPiVNpTX33UwM6U3Fld08ITTxkionKDUuaodVQJ4yTKTAWIJJr23S93ee11mrfwmrL3O//TFRtLcvwKxLQ2Iy75Z5JZFg0gglDWZGURzT+9GQ2feYLKpvrHKPb9qef7fCzLYBW82oEz6tD8owHSMJQXPGtdOcIzcWp+cJk6h1HuXZYp6GvfdiomtDN0LMduqQwHUkquhi4FzJEI3SBHMVkXHKjmZzaX9J1Ca5jPJHOO01onuB7qhhGD5ODVMrNDlCDXP95br4b/2F9/c/uc8WI4AtBthigC0G2GJaZospurW7lxKvLaXCKPYoKS0wkhzpiDxyNlKjhMKIJJMjLEoWaC0p3r2kCs/vBEkdWT46FJzDmBFJuVWaG4d8sCIQHK2PhDCPSLWTX0+gShkAKVH2pJ6pkBJxICUasNcMpETtxI1ASjRQgAMpEZASjRbbQEoEpESjAzWQEgEp0TigDKREQEo0PlQDKVE7bnV/phpIiYCUqAMEAynR0HAMpESnoxlIiQYPbyAlepatTkBKVNV8AynRs8AzkBIBKdHIMA2kRCc5JEBK9OyQDqRETeowQEpUBc1ASvS8sA6kRM/erAMpUbu7aYCUaDy6AaRE3SkKkBKNVWuAlOgZkBIBb0vbqAfelobQB96W54x/4G1pM64G3pbR6AXwtgBvC+gB8La0nmnqj7eFt8Hbsrf9FbhbgLsFuFuAuwW4W4C7BbhbTuNuuc317TzaAXC3EOBueSFYf6wWwN1S23MG7pZ2YkfgbhkowIG7BbhbRott4G4B7pbRgRq4W4C7ZRxQBu4W4G4ZH6qBu6Udt7o/Uw3cLcDd0gGCgbtlaDgG7pbT0QzcLYOHN3C3PMt2J+BuqWq+gbvlWeAZuFuAu2VkmAbulpMcEuBueXZIB+6WJnUY4G6pgmbgbnleWAfulmdv1oG7pd0dNcDdMh7dAO6W7hQFuFvGqjXA3QLcLRNEPXC3NIQ+cLc8Z/wDd0ubcfWTcbcgb0RSAK4lpiJFDhhzLxliiEokDR0Ld4t+ukbJE7ZkTgz9bYgM+ImAn+h5oR74iZ69HgA/UdvZ1P74iXQb/ER7y1A1fqLbLwFHEXAUAUcRcBQBR9FEOYrYqRxFx5aQDoUnEWUxECusDzJBi2qlNLdSa0eSQO3GBW1pfT2J/w/WV1hfYX2F9RXWV1hfx7q+StKUB/CHq5vLXdIIKAAHkbgSrL+97kAB2EeZAigAS9KzQAE4UIADBSBQAI4W2x1SACYHF+PoESJROGKi0YQwnfxdKbmIRVw5CnD36J2cYInu+7NTw3YzaQG7JbBbDg/TwG4J7JbjgDKwWwK75fhQDeyW7USM/ZlqYLcEdssOEAzslkPDMbBbNkhy9OdzALvliZ4HsFs+x2Z5YLesar6B3fJZ4BnYLYHdcmSYBnbLkxwSYLd8dkgHdssmdRhgt6yCZs57gzOwWwK75XAVoT+zDuyW7e7HBnbL8egGsFt2pyjAbjlWrQF2S2C3nCDqgd2yIfSB3fI54x/YLduMq5+M3RKY/7rOMwHzXwt5JmD+e256AMx/bWeaemP+o60wE91toKpGSlT8PfARAR8R8BEBHxHwEU2Tj0jqU/mIMqtHh3KzMgVKSVSBeMaMIRgHpyRSniJsyBpha6o/9mRUf7CqwqoKqyqsqrCqwqo6slW1aLxrvqqWbnypurbufw8WV1hcYXGFxRUW18ksrkWp4tTF9fDy0aHgOFICc8cN1kHLtMgyb5JmikCMpbag+FnT59Km9LnrcHVXegH+3EGUf0SP9IvAn1u7xAP8ue0UOYE/d6AAB/5c4M8dLbY75M8FktFeNrc+nARIRoFktJEbAiSjQ4Jy6ySjCAtLPU+eNHI0OR44asUwpcnZINyy0WypeEKPo2aWYWKIbiouYNAFBt1BAxwYdNuJGfvzQ4BBFxh0O0AwMOgODcfAoHs6moFBd/DwBgbdZ7npDBh0q5pvYNB9FngGBl1g0B0ZpoFB9ySHBBh0nx3SgUG3SZERGHSroJn3l9wDBl1g0B2uIvRn1oFBt11eE2DQHY9uAINud4oCDLpj1Rpg0AUG3QmiHhh0G0IfGHSfM/6BQbfNuBoYdEejF8CgCwy6oAfAoNt6pqk3Bl3WCjXRvWb9aoRE6y8A2x8QEgEhERASASEREBLVIyTKLR8dCs4hHZwTJgkKIUZ04Jh6Ho1jIi2k1O5IdPmTkejCugrrKqyrsK7Cugrr6tjWVc2bEv1VyBs9Pf0fxjn6v4nkcLF4wm5ByOI+hyzuRCgCKeqxDRwoAoEiECgCgSKwU4pAIFVrncwESNX6J1UD3qnW91sC7xTwTj2NI9KfqQbeqX55pyZyXsITWmk4LaG2lW75tARg52k7WgR2nopxYifsPMDv0Daegd+hGpyB3+E55DuA3+FZ8jtMhDSzP7MOpJmnOuQtkmZu+uhlK330R0uiNboAd1+EbkDoBoRuQOgGhG7AiXYDqkbdgEeWkS6P/+VJEyWOjDOWQiYXg0ee2ph+iSxTbtsViNvrCixlGhhAR2D2QOCJsH2kW+nNrwa+j2fF9zGRTkCiEXQCDhLuXXYCMi6tpcE5LaziylCcYhZukleqrCNhJNhOGttf9rAGQXUV4zTd7pMOJQndsdAdO1jcQ3fsc6oWQXcsdMdCd+wUUQ3dse04Iv2ZauiOhe5Y6I6dFqShO7Ydj7q/aBG6YyvGidAd+yzwDN2x1eAM3bGnoxn3l9+G7ljojh2uIvTnikN37IkOeevdsaIVRsxs7ahGZ+zma9AXC32x0BcLfbHQFzvRvljRqC82u4h02RVLqbeaSUGDUJJZz1nQMvLAmYk4mi0HNWqRLLPC0aUDaJLN0mZO5GhhzHlv7jUcLtyq0/2UhwtPpoG2x44qaKAdSAMtNAtCsyA0Cz5rcGvoFRwQoKFXEHoFx4dq6BVsxw+BXsHBQBp6BaFXcGSQhl7BZ1aEh17BqmEi9Ao+CzxDr2A1OEOv4Olo7i+XB72C0Cs4YEWAXsGhY7/9XkHVMpPm0dpojc7B3RehdxB6B6F3EHoHoXdwor2DzTg1jywjHQrQaiOw8C7QiITWREbDSIzJdHFrYmBbt5Pmmwfv+xJni3kRvW3eDaERUOX6AD2XWBNOgrcsBocsD0IT57ANKApMRuI4Y9RfHyDN9TfsoWNiznEd0UDtsMdwD2qHPdcOEbMpSmBeCx8QcgQ5FmmITIvkC1IqAMF1EbzPsLuZ5OLmfHa1/fHD1/SVN7PldeEUTND6niKibJe0pMITGxwx3lgtk8dghDQ+uVHUWzEW34H1V0up0Bn5fj7fpmnuplv+tJjfXE8Oz03Fle2SltJgZ5JdDpJpJQliKFqPmBcSJ9s9Emw/Yd274sOaHqpPFhRUCnvEMxQKn2WhUFMlkNFEGGupC8QJpb1U3kaSgkenQQ9q6oEodyofN7/PwnL9NBYpzj9fhOXylVlMuLu6JbFltxFEjpXlymmpnAiSi4C01EVvKrdEQ69TbazXytiuvczioeye4/uwvLmY3n6vlqS2LYcXl32sGn4wq1hS2X5YqjEvKBSsoWANBesaBevizDlSvT62ub4kJz/bJk0vL+dX+7/90Vwsw+3bIZTRaK6MphVBDDtiA7MycB6MUZEIryhmUaCxpMJ6PHKO64y0HmNo+2q6DmVjeeU8SYmFU9wFz5C0xluPGUMsuIAUo8yPpd6G+ysSy9ye4dNM5MQA34EEgVmgz4IdMAt0xSyw6RtmpF6kdIrOPAqoNs9470v34ysG8RXEVxBfDa4huFRd6il3l32umkmFrDbIo4AdVVZhEpE3KbhKq6/ekTzW6NOsaO6SrD4mwRbyNbMiUISQdFAOS48+O4SkAwpJFcYOMaQ4sykCtZhpZNKiQrkUCntjRgJv1t8R5yrXTtPYWk4M+90KEwJVCFQHBfdGgWqxu6aDQPWQ+kDMCjErxKwQsw4jZi2WiXZD1oJCZhX826tBxaoCYtUeuSAhVB1QqMo8djhIailnWKv0xnAvNZHeW079WHpOeY/N16VkWo2t5MRA35EUYeMubNwdEMpb3rjrIgrMMB6k5tII5DHjmgkjnfDRSdi4W9tVKU0dZJ7P7ZaPV+Z8cmhuKC1IHELicFB4bv3sjIlsdITT058VzLva6Ljt9BJdJNAf+/aQOYfMOWTOIXM+kMy57ihz/vf5CpLng/N4IHk+VOem0+R5cMp6p4lFmCuMlMHIFkfwGu4JZmEsRDx9Js9ZW2nffUM5Mdx3J0hIoUMKfUBAhxT6sBEMKXRIoY8T2ZBChxQ6pNAhhd59Cl13mEJ/6N5DFh2y6JBFhyz6QLLouO0s+sfFDTB3Dc7Z6ZHFHtLnw0mfUxm5p55SwSORyWhyIgXz3plotKFsLPDukbkrx9x7koWcGN7bFyCkZCAlMyiIN+PtqnDeb0OVgRAUQlAIQSEEHUYIKlGTEHT7anumE0SbQ/BGgCd6sK5Jt81aSasjwlKQyKgNQXrDkGacRCql9WM5cYT1WNrPWa1jxnBq0G4iK4ghIYYcFJobxZDFHTSLIe9rB4SLEC5CuAjh4jDCRVzMkosX35mr85u0sP1srvxFktrZl+uDdu7CLAtmwOXK7G7m7sO3y7PF7GsSFFQzB+apAOnzYN2WTuNLqyzxjngSLEM8SmtojJhJ7xD2VEJ8WRvea8r83qznxHShX+FCBAsR7KDg3yiCFRXOee1OmyDihYgXIl6IeAcS8ZIjFdI2DeE8CWcVPMS8A/NtIOYdrKPTbcyLkU4LjOfeMWSY4Sng5c6SaKx2MY4F3r3GvPtmq1v7OTFt6Fu8EPdC3DsoBWgU98oKldsu9QkiX4h8IfKFyHcgkS+WvUW+N/Zi5iDsHZhrA2HvYP2cTsNeTozQQUYtMHeGCx8wj5oaK1RMlnUs8O417N0XV4fGc2Kq0KtsIeCFgHdQ6G9W6JW9BrwPlQmiXYh2IdqFaHco0e6RIw3asoP/NVvO7OwiCQPi3YF5NhDvDtbN6ZaoySWjbSRJlsEaTiXRHGOkKSKEswBbZ0+Jd/f5+Ts1nxNThp6lCzEvxLyDwn+zmLcC23CH6gRRL0S9EPVC1DuUqPcIBXENS/hLWH2Ze9jI+1x8Goh2B+vgdBvtCoOUwtQpgxVFiqiIBNYiOOIV13ok8O4x2tX7rLqdWM2J6UA/QoXYFmLbQcG+WWxbgb64AzWCmBZiWohpIaYdSkxLe4hpYavuML0ZiGoH69p0GtUy5BXTKFJNBJOSGqGdkTwtLlyaGMdyVn2fUa3qIgCb/BbdvsQKkS1EtoMCfrPIlvYU2cKeXIhtIbaF2HaosW17bFQHbSBsxh2iMwOB7WA9m24DW4ciMVQK75UwhDniHFFCJpfIRsTVSODdZ2DbgCOpstGcmAr0IlMIaSGkHRTqm4W07bJNVdQiiGchnoV4FuLZgcSzhHQcz/56dfHtx8X88vXNYpFucrddA2LbIXk1mEFsO1AXp9PYVhDFRfTIM4MJJppEb1ykyY4SrRUeSytyj6kbjPZd0q4t6MT0oX8BQ9QLUe+gVKAZxzLpIerNahREwBABQwQMEfBAImDcdQQMhFOD9WugpjtYJ6fTuFdZTQwhSimmnSImrbrGMpYMKA+OhrHEvX3WdFuPyoBoqjepQoQLEe6gcN+srttHhAvMUhDXQlwLce2A49r2duGeLYqBHt0tcEsN1p2BwHawvk2ngS0RAXmFjSGMCEOx9EFSnFYWJRGSENieENg22C5ax25OTAv6EiuEthDaDgr4Q9qFW12RILaF2BZiW4hthxLb8l5iW+CYGqZHA9HtYN2bTqNbJ4zRMUisNVLGex50YNFFziiVnMuRwLvXc4L2l5vOTOfEFKFHyUKMCzHuoLDfLMblvcW4wDUFUS5EuRDlDjXKba8zOWMFgW1qiA4NhLiD9W46DXE1iUIowkiwjnmlQjAyKMKtEEQ6MxZ4P5PO5Bpmc2JK0JNUIbSF0HZQuB9SZ3JlPYK4FuJaiGshrh1IXEtY53EtsE49A88GWKcG6+Z0GuNajbx0XhJtmfMCuQRyFwXT0UWKYhwLvPtkndp/Xt3b0IlpxFOIGKJfiH4HpQTNmKdYL9EvcE9BJAyRMETCzyESxt1HwsA+NVjfBmq8g3V0Oo1/Y0Ai8rTARql0YRtkIAgL7LRUyhkxEnj3WePtIDYD/qke5QqRLkS6g0J+szpvP5EucFBBfAvxLcS3g41v5ZHwtq5T/fRhK4Gw9QWhELYO1Gvpdvct+OHghz8rP5xU8MPraQj41+Bfg38N/vUw/GtczNIg0bC1n2d3vvSdyT5g6cC0gWkD0zZo01ZJLvva3ClegmU+RQqKYKIktp44LjXFxksUCN/aMtSKLVu3+2xegwUDCwYWDCxYfxZMtmHBfri6uQQDBgYMDBgYsJ4NGG62P3lrwG6TZWDFwIqBFQMr9iwDyY8LM1uBBQMLBhYMLFjPFoyhNizYhxt7PymWZLlcmavVw3dg4cDCgYUDC9d3pClP3vhW27o9KGsOoYlQ5ZoICUGIe4Qw8glajiBqoiTSG81c0H4sZxzgXtkx9uXVIbwm1p/Vq2xz3YncyLRMq4hYsjeCWo91MJqo6LBjRKqx6A3qcdNoBXG9MsvtWBNWgtMFlaUCDpIZxoU3NEQSjEuvSAI1sVJYHceC6L66yf8+NVQWPtbbVfHxfPHy/HwRztNF5CGHtfKCEySkQkwQm5z9gBn3iilGBRmL80F6M6Gi/uq4XgXfzX7bjj85Y9qGyLK777mLxFuBedDCUyOID1E6zqgMXjkDGK/rJuAqD+zL9fbth7BapbGXkwP2yXLKoZlyLRgRFntpfLLd2GpkkRRCxuQlGAtorolmWeNg8t2cxn0Jm39N+t6unfrbj8alpXd6FrwLEeZ0QEXJgrMWM4wCChErI4PxXBlugzR8JDogetMBXePowvrFhsnpQ9fizOmGN8ZxYhXSBGMeA5Xee+O10Nh54seiG/2tD6o0n58eSZyd32xH++EPF67Xr95efTUXM//g43RBaawUmN3+2eQ0ohsh7rZ98lba2E7MUkIpFUqpUEqFUmpfpVSt2quk/hJWX+b+05tvV+Zy5jbvdk7G05dNda5sGhiX1tLgnBZWJdc/iSl4bhKIlHUkjMTPoai/KEDtP9cToHQfQ9MlsehQkkDYUrAo96YTQNnSGWVLpirFpImaciGTcZeSUWS8QQSHEDRKAe5IcMxxj1EsbW6RSt2EiWG9MzlmGwMwMjKFD0rrSJM1t8giFYJVwSb/UEBjQG2rXurBPkxHPHg3OZyfIKGsRcces4gMMV6ncM9QFbmTmCenJDCpICvZuFUrY4c2P34OF2msyQH5dEFB30yPFSjom6mN7K77ZoTQxEuqnKDUuKgdVgF5yjCRAmM5Fi+8x04D0W5WYHKIb1+AOfwHKQ12hiAXJNNKEsRQtB4xLyRmdiwZxif0WUomeT+fb8vc0F5+gqCgM2BdWIHOgGeD9W47AyhttzPgcAYH2gCgDQDaAKANoK82AIxo630A9+zZ4PZQZ5sBLIme0CQ1JZFg0giVXHdmFMUxvdejcW2k6s+5qd/TXQNPU3NyOhUm7JKGXdJDRD3skm6AaNglDbukR5sJhGpPbdjCLulnZVZhlzTskh6TxYZd0s9ul/REdkj02EML+yOe9/6IiXS09Lc7AjpanlVHy0Q6AIAb4FnpQMcdAK0cDlE5Gw9tANAGAG0A0AbQWxsAEV3bN2htApsGNg1sWn82jbZ8HM7ZougluvcC7BrYNbBrYNee4Lzotlo2y23a4No2s0ffYBK4jkQhZAXnSoZolCaYq4iMU3YsVTpM+svI6ians1TC1MSyU90LFNo3oX1ziMiH9s0GiIb2TWjfHG3ZC9o3a8MW2jeflVmF9k1o3xyTxYb2zWfXvmmsZjR5xyLFf4bpmJzloDnj2mnOkWMj0YEe6a2bnMpyoIQwOS3oRojQtAZNa89cD1ptWmMtH2hTIQ8JxVAohkIxFIqh/RVDK9i4irx3YLvAdoHtAtvVl+0qkrm5Po4Ss7X5cW+f2tO3ZtBca8ZUjhISqLe4C44SeoKjhCZydEp/pLdwdErPR6cADfkTNAABDXkjQW3zWFqeFOLtGXiI7iC6g+gOoru+ojuFK0R3tzI6S4tYcb9ni7kLy+V8se6JfPTbwQd8igqGWNS6wIowCqegjyvrkqMRMRtNuRn3x6As9ztjjgHn0W+mGwe2KrtsddmzZCpjZIoHUnTZk7TC8vQ/h1zko2EOZ/2lOcQ+pc2J9nJiiG9LbJAM6TGUhGRIJ8mQTRPEzqs8Gj3WVZJdQIk/u/sz3w8oKQSUEFAOM6A8iNoO5YK5QdY6opDlWiEhWZIHNU4wjZjgdlvSx1VL+reC+piu/NOPW8P16c3C/J7+7OYy3cD65n4JVzegraCtoK1daCtvT1vDliqqEAkoLCgsKGwXCsuaKWz6vPDT1w7xq+Kxu0X66hL0FfQV9LULfa1w+GxeX1f76+s/FhegrqCuoK4dqCvSzdS1SLSdXdycz4pi3Po2QFVBVUFVu1hZK5C651T1bDG7etS29HL5brYEnQWdBZ0dZvS6epAbLqJYcIdBX0FfO3KHa5dfH+prIaOks1tXGLJMoKegp0PS0/W1fnrpfXEN6doX88t3IYL/C3oKetqBnuoTs0sbNf1x9seH1eLD7H8D6CfoJ+jn4NbRs0W4NovwYX6zcAG6IEBPQU87WkdPTP1u1PQ/b+bphsPKgHqCeoJ6drGMnthVuNHP9+Fy/rVYP8OrhfktQNYI1BTUtBM1xU3UNMWiH79dh49zKMCAioKKdqSiJxZMNyr6MUns4/z13IdXF3MH4ShoKWhpJ1p64p63+1r6c3ras6tz0FHQUdDRoaWMzhbh/JfiQkA9QT1BPTtQz0aFl7fpZpOTC8oJygnK2UXbbmUOz/XWl/Xr7csd8cqWmeXn1eXF5u3mc1BZUFlQ2afcd3pUZUFdQV1BXbtVV4bydLObH8Xnw2CRxVkaWRwVNphLEnnAjnuMReREU00IjtiM5dwQ0uO5IWT/wT5ExMQIBY9IA+gvX7DekAn0lz2fBYKYTe4G81r4gJAjyLFIQ2RaCCcpFSNBMOkPwaWsuztneP3jh6/pK29my+tiuQ/TM7iniCjLuM0l1oST4C2LwSXfKAhNnMM2oCgwAQzXxDBVGWGdLeb/TKNv3k0Ou3VEk8Msxh6ziAwxXnsRDFWRO4k5FjQwqcbCEt8fZh8dLZQ5zXrz4+dwcT1BBJ8uqByeoxeKMUuFo0FFpiynKjnAyRRLioQFG1zbBpf6ebeZjd2LycG3slxyaE1WN2hrWYKm5IxKEZO3QKgzUgTGw1iOpunR+pa6dGmw8zTJzrBsg+r07R8Wi/liuf395CDcTFg5XAtJhSc2uARwY7VM/q8RMrkYmlBvxViscH/5CJ5z97aTlB1YuPxpMb+5nh6yG4ore2qppo4IT4W12CDFObeOECHTe+IkH00euD9sPz4R62o5vwhFGHO+CMvlK7O4//pH41bzxbfpgfpUOeXQzI0MRFKCZfCOWGVodNGTqChiVBsPaG6O5iIvatyXYml15uLey19tEaavfwForiqnbAbOGMcTipEmGPMYqPTeJ7dDaOw88WPJZsje0KxK69oPs/w//OHC9frV26uv5mLmH3ycLiiNtQqL2z+bHNS7EWJOD6ThStOQfG7ilFPMKI+sYoFq6jUhaCR60J//TemesF6+LZbar7MU5E/3LNOKUsnmn7kzOjnOLkqFmU4fYq6QxzEyqUTAI0Fqj3W/UmPzoKg1XcDWE872uMait+tY0+H9Vo3Pj/r1bq8A+ge3nWGyemfYbRjz9A1iPNsfxo2KHFnETZEeYFIwZSSOOHim/GhyuVjg/lbdfXGV4mJiNqyaULJr7jQ6GfvzDqGPEfoYB+oNQh9jv32MgmFLo1BBOB5kMrSKSCYUxlZpGa0EBNdE8IE84YPn8z7E3Uk317PNR5PD8clyyta6pDTYGYJckEwrSRBD0XrEvJCY2QBorovmCsIqK0xOD84nC2oXtVfY3VviOUPwfjR41zwfvLeS3X76YB+9+NcaSJhUyP+0cM+fy3c3mhcE4Ad7T0v3njY4fOHm2NGegEPAYQ0cYnwiO/JNpSOh6efF9mslwITN+QDMp9ycrw9vzs/gtkPJRIVYCtysIIgKpCQ2EhHseVFmpd5v/ThMqxI8tuLYgA6DDoMOt6zDuiqHVSahCfoJ+gn62Y1+SlohV/JYSnuO8H8vzPV1GARHDsu1QESqtTdKCBls0pVAifPWsaRHSlPJ9UjSxUr3ly8u3chSHTBTyxo3FFe2sued58p7YilRFCOLvY6OSY0C0oG7kYC7v64JWVqxOviwPi7M1TLOF5fG7safbiNjq7KD/UFPX8+G/UF97A+yCiGFHTFGRaVQsUWIRY2IUjQGogyguV0bvhkifXT4N2DDW5HdtuqNcdViZVWnCLIDkB2A7EA32QHFWswO3I/eB5AoULlEgVfSIEklFtQkBKkYA7aIB+9jIaGxrMNM9LYQC90k8n2AnYktwy1KLud6Us2k4NEGari3ihrlYsQkOsswdWYs6YMeA6lqa8ruF9v3k4P3qWKCpAAkBYYH5i6SApIZKzhVEQeKLTfIG8RUkelFTDMPWzZqo7mUV+7W5Lwq/HC3SH+wvP96qjSojYQFlOpAqT4kNLdNqa5pMsDGMa8otRpHibGM0UtS+M8+jKWi/NSexqF9NdNNzp4spyw59TT6I3pEM7RHDKU9YiLUe/2RnwD13oCp97Y7A3HLxbZ72USou0HdDepu3dTdRJUdzMdTpE9fZMseWDmRioPojw0XSg5PVnJwPFAdiMEaEx5cUmyRnEqukpIz7CjwhNbu3Nrnbj26NOw+u/vVdNMDLUsPkgZPfpYKJA06SxpsgiVUdbfxsYUCIiOIjCAy6ogTANGKWno0FQ5qCmoKatqRmnLxVNQdCH/+Mv/943zjjHzcia5EtxnoNug26HYt3Z69oN1LpgheK0imqqZ3KDEug/A+qoC8Z1whTYnFjETjracI8a01JFVZUE5xWsDggcEDgwcGb0gGj7Lud3mC3QO7B3YP7N6Q7B6rTTLbqOEGTCCYQDCBYAKHZAJJ1czfCWU0sHdg78Degb0bkr1jqtdKB/l8vc4RJkncOyvr++sv1yVWkIMVBCv4hFbwsDTu47g3uTDnrObcY+sUI1x6EbiwVjgZKZNU92UDBa4kl/v63aOUvHKWOSQ4ld4a5w1yHCVZCUtIUFGspcR6kBKvLaUyK9ihpLTASHKkI/LI2UiNEgojkkyOsChZoG0zv8g3878zV+c35jz8bK78RZLb2Zfr4r/t2w9htZpd3ba8LQdLmRW5i8RbgXnQwtOi/TlE6TijMiRIjYUyC1P6tyfbC10VKlPrAD1VTtmG/ogCM4wHqbk0AnnMuGbCSCd8dBLYKWqjWdY8yPjWCX5lJnhcbjNpATvWk3NWADtWL+xYWhHEcMJxYFYGzkPBnU2EVxSzKBAZCZpVf2gu5ZvcTrJxoJPh8bOdCdq8mu5Wq8byAtaKF7g/Yw20FQOmrciQICLrrMRM62A5cSi6QIQl1mDsaDRjCS/70wNRKqy9w2/X1uvT65vlan65eTNpJuYWRJYlRPRUyKCVZk6L5MRIUqQqqQqSWYoIEH3Wxnieu/LhAc/bR7Z9O2mctyS2rNuOGXLUFkUaXtQmGbWIYEZZ5NRoDnwJLfMlbIZ4kzutZcqQb1l6t6fd6OPF4WrJSqj/Qv0X6r9Q/4X673Or/2Ja4ciz0kXg4Sp3YZbLd7PftisarAewHsB6AOsBrAfPbj3AVSlsMtVeMP9g/sH8g/kH8//8zH+FnFA9MhBYBGARgEUAFgFYBJ7NIsAr7Bo7nhP6cGPvZ4eSdJcrc7V6+A7yRbBWwFoBawWsFc90rahSP+hmhzGwIcN6AOtBk/VgTVle9RS2UwJ+UFFQUVDRPlT05D4tUFFQUVDRpiqKKxzP00YXDWgraCtoa0Nt1VV5UOu1OIBugm6CbjZdSVkr/ajNag+gyaDJoMmNw9aqnYQH9u79FFZv9njH/7G4+FwOA/OCgJKCkpYqaeHyVeVBrXnkB8AQYFgDhhhVba87/QgGgCRAso5lrFq/rciID/AD+NWxiPi0ZEz9/oF9INzurwdg7g7HqFoKrpAXg3MxwFI8uzgbzsWYyrkYaZKw5ShPl39xxyJO1jTiJCFhe3vy8/xmdX2z+nG+SJPv+TXLF+mabsnPyT7T+eZHQesyX9x+o6BID5vM49WOZCb/xfQdXojr1tHffe8R23pxb0evYn2t3XDkHb7FrogNq0umEA27faz8c4Lfcn6x76nePlFZvGbs0VWvv5R+Xl6aK/9pK9iwfZ+TQP2xatxdGv4xfe3D4T+ExddK11lvoFoXyfeJjF6+vR1+d/vvk7H45dZ4VLjgBoPWk3Bmnpfep1++upi735ZVZFx3qHoX+pjz9eETfKBXVS73tAFrXTQ5pB4vr6+ztjP7vXpyKz2pIuPsZmVWf7B6dv6kq52w7b9b0tnn64ub89nVh2/L5NLcXwDEvQUgraPpjSxlBT9bf3/9evvynVmuztbcepeXs1W60se/yYmo1WlqgV6UUvk/nrmYo3AHi3JrUXpdXV5s3m4+z91ca1PUu7FS0ryjs1a+qTaGr3dDpcSXR2d8v1xVvqeWZqh1W2p/0tLq/qNreGWWIX3yYXVjbfqjh2+P32qXs9a6fb1PI3rShaSXuwLBfFFZCN3P/QRISC//cTVb9YyE8lnr3b466UKS4b+eL9Ocxv2W/ni5u6LqAuh03nombt9TqHYpb8zNH+t/ssat8di1bgWj0+b7YUfdmuAUZ8GfXRgXyn97/NH2eBH14sB9yN1faH74mu5i18/1KsTistKb2dX52WLuwnKZDQYbjlwPruUU0Pcnu03BvYzrLFfxLs13N0wGsC2MXu92ck7o3oQb6a0TfWnC9PdFPjF7N80Hb8+vzc53C/Ojt9TWFO35taWz3uJiO2EedW0M39cNVVKjNoavdUPZYG5vxl+vNsnyA+0dJ8eMdaep98TKj/Q8MPNPYZXMa3Fg1m1F4M1skX9m7UxQ76k9TiTl59xNdmZWX159e7+uInwtvlz8IvvgWp6pMyO/nrywV+/Dcn6zcGFTD2rHyB8YvN7NHF/t781XkPjfWt7NH73e1KCy99TaHPXguJ9zzXhum6vYTFuo+pfgfnu73Lx/ba5ehc3xBVlMdjFdZ9HfA0du7fsUUxZ+3N2g9088aCf6qztrvduvdExsyYX8evXS+/W+hs0T+DiveOfdTFgv416aGd5lmdY/7h1Fl0m21xqnXp69xQTpRLPvreVipyu/1lK/0xVhC6ml6QqvRT9rLcTyY0kPbAQqxtsMs6zgrzUeumZhkanbwuL9Vij+uSgq7p0/9qD7lN7vH1oXGysd4be79DcL8/sunFs/5l/C1U39fFK90VsIEytMuItOj4Yb7UxQL3VZHuIcI0fKIvbUIetdeJ1z84o8TgrPtjqRz7g2GrceoEoD54PbBzetP8VC+KroQHSL9NV82qGV8bu8pdUDnSym/sfiosVbOjB+C/m8Wps86+fzag5fT3MqnPR4p5/Voq/Tx6x36eNYZw95IAdmO1vMrh5J7uXy3Wx5QqbnlDnqZXqq1F8PLWqz5fWF+baOxl9ez34Jqy9zn7VxXczW7EnWuYC0hq9n/8VkmwLbm6P9W3uo47UTVu3N0X468rAR3gh0g5dXc59Uxmddok6m625hfujmV3L62hm/ZhjXXnwxukV+kmF9WwHaZBMjDaLBtcyeV8t5W/HXZOHSVrQ3XQG2s+ysNzuWt4o93jNZvzOj6cj1HJV8HFadPyS7Hrc3Sb34tdq+1t0vtu+zz+bEEcGZOLYUNsiSbGoCzzOz2nJyYrKmvZs0yGTF2WaaBYTYVkJnckJ8zma9o5zXRLWpKJWL0lI5u18qX7OBLA/ybKC1p1Cl5LgeqNhNX9CFXK1+XMwv34WY9w0bjVuv861K9WQz1Y+zPz6sFh9m/5tvgTttwHoXXV0+by+vL47keE8Zrd7lVnHLNhOcLcL5LwW3TPaCTxqv/SL97RTXZhE+VGrMbjZuV1L/z5v5KiSbYlqS+r3x6km9Sh50M8X7cDn/WoglvFqY3/I7TxoN28IaWzpT0vyP367Dx/mRDPzJQ9a78CoJsc0sH1MYXrQa+7DmRslee4NRW+gMyEz0c1g3jNfvDKgyZhup60qYwSOsAP25bUcv8U/IZ3uXv947F+COLqSCY3IvDX7/9c/h4lhCsdG40+6xOr6qHn0sE/XYoeDTPOQR5d3BB4gSbxkW/8ssZiZd+cFAaGNu9m3kfoC6975acH36oNAsA3mjyeeNttt1TlD6IthKjtweI/Ktyq+9jYnRdT1bd3KEnd2wF7IdnwpaGKCFAVoYBqma0J7VNNzBdTyfuEjQ/MUUrKXZtMoz6pIc2SZO4Bmua0KgxR6WlPsWsThiZf+szi3f0dwVRzLsnUh0a/n4YQxsI9YP94f59Ga2SBc0X6SpH3xwAjdaveFbiIpKZyz2Cr9dbc6tqH5HrYxf65ZkrvHx4ZTvg7tZLAvurhMeVrvztLCmlU79YXZ1fhEK2VZ/Zi2MXu92cnmgvQnvv6u2sav54HXLVuyxiVmEuGstvZ59//iorfuWBh8OJY+37y5/Wsxvspsxm45c1wWlx6SRvlP893FhZqv39z/J1/bq53TXM2xe1xJQzZGbqfLxydaNbO9mv4Xjt9LG6DVre40fC5ukr1qSDS+V3Jfr7dsPG7bGfMfLqUNOF8LPKrptTfigc6BzoHPVfZqSILLUp7l1Iqv7NSfI/naWTp7so9GnC9TT7qfk8YC9BXsL9hZ8HNA50Lkh6txW+pV8nB+ubi5rpG32W1aOi72YoELWptnA00Xmny08FLCtYFvBtoI/AzoHOjdEnatTh9p9767ydXD3+zpfA/smYN9EHXP1jPZNVFWZtSHptHR773yjlku3D0aerj0/rXS791jAJQGXBFwSCANA50Dnhqhz28OAq/s0Z4v5dVisvh30bR6FA48047j8P9zYnfO8ne72xfHn3c189QxZp/c8QdP2zFSq2MlXXaU2DHzVFUpWOhH2ALg2k21/HFem9ueqp0id3Sso0dCVqN66lOZarszV4XbpR2qkm9joB3M+fHdcqbqeuZ6KdS8HCgo3dIUDdbjbD4fK7M7+9hS5b05obhNJ8uT+mSbfvMvJos4o9dS83vVNdnvstM7LaZAymCxCIEkFSSpIUvVrp4DiATz6pxfts9Ia8Ojvtp/zxx795oo39NFpeD8rxjlYo9/k3cq55Ta3sTdS+uzycn61/9sfzcUy3L7NJt7an6wWeFQuXKg4/+wiFATg6TcrszlX+/h9dztvPRHkQoFql7JmTgj+7VW1e+9mwno3naMnqXUNf5+vqt53Z3PWuvVHueb6l/FxcVNRvVufq54XXrr0HJx+++o4kUaTYWvdAEbHSKDvLTGPZr6/pux/+HZ5tph9TWCq9Bz7vY6aItp/Gm1e2jytp0nhKgqp3yupKaYaoVfdi7uxFzNXUUY9XkZNAe2b57au7L9my5mdXcwKTp1KIur1Qur52jXqlPuzb+qTzexQP/PXE0mN5snql1TH7vR1BfXE0sAWHryo6naml+lr2pcae+2qXdKvVxffimPvXt8sFun+d7pfxcT0fS31sNP61dU0wT1dQG92Ztdh1dD49nQFNdWqRhKmzlXV8/x6u4jeFClzWTXMcD8XUBMxVY6TrXlRDUxx/1dTD0MdXF9dc9zXJdRLLpSeY3AsC1Btn1fToesVUjrLAE62NNVlenGiQj3QsrS5zgeMuvx+zxIb9Vbd0WypnCo7zJAZ/EZCtAz14foJ4NpXU9lM9noZ9UqCNUocjy5suwfjzbc0w8xV3XbS2ZTNauDNNp9UhkK38zariY51r9EE9ykmO9zE5JRfQmWQdz93vTU9d8THdtayMyCyq/nJY9a6dJZrFbp13YoflWLsk4arFwUCi850WXSAVQWa56F5vtdNPsBlCuoG6taXusF5CKBzoHM9L3FwxhroG+hbb/oGOwxhhyFUkG7VoecS0kQbHbqvRD0r5ZskAPqoyE1OsM/WCwSCwKn6HsCxOvGn31vpeoJIeL6rQZMq/tqrfr5V1RO7AJ4dad3Ddmf82d0f6kG7M3rE4CJKWRfehysfFgUGEx7fza5+S1bBheVyvvj0yizDo99m80YtzdAsFfZw0o9JIJ9+vLlaD/TpzcL8nv7s5jJd+Vpmv4Srm1qpsBNGr3c7pQCqMGHY+nCFLLN31M4E9W6qdOPDgTnT5yEBeg2MVwX3qFukr2YNbDvj17ul/Wg8P+VqX4r/WFxk76iN4eute6W7iw7M+G5u/NnFzfmGYGiVJq6/canG0PWeTCmJ0oHZzhazq0cL4svlu9kye0ftzdGlHq0eGKMC78dQ18r49WCXXzMeTlmQW6Vpt7jI+1yNxm3/Ftb7uD699P5t+vXVqtiH+S7EvNo0Grde+FNFQzdT/Tj748Nq8WH2v/k+ytMG7EruZ4twbRbhw/xm4cKxFbLZuPXkXsWObKb6z5v5KqTIxmTFftJ49aRexX/YTPE+XM6/FmJJ66z5LeT1tcmwzQK8wzMlXH78dh0+zo/YzZOHrHfhVazzZpaCAfDj/PXch1cXc5dHe4NR611+FVf6/kQ/J98sxcH1m8yrjNmVmiaLcP6LWbkvLanpvfHqXXJ1I/b28voiPdPsBZ8wWj3PpjyAX/uB69fbl7tocRtO/ry6vNi83XyedW7amqKFOOHorJVvqo3h6+VaWgy4RxdETS5f2mbGYrKV/bbSI9MVYDt2ZN0G+aib8uFY6xjxj9Wn/SH+e2Gur/PH2zQdud66kw/AjkxWld2ivUnquZKlmHs07+4X2/fZZ3PiiLA61N3t2CAbN1371lLeb7ICbBDz4xE6qu0GXJNFVUux3UTl9+fmj79//8PLN7/8cOi00vVrsh9ibH4UfnC+In3ki7VWb7of994f60fj0r/Zru1q36+HwKOCmS62CnFv+yTo58XWlH7/+CxL1qJ9hwACAggIINpdZOH0u1ouSZtaO1kpTukc3G0h/fFSifDnL/PfP85fpzVzFT6Gy+uL9HN5aAmdksxAzyBvC24XuF0jVk1wu+qdsqoek5AvQtylsK9n36fvlCydvHTphIPojy8dcBD9yeJ7tpucgPjkSZ1eWBMgiDx0t0CKA1uTgRTnziEkt9s0Hzt9bfY+QuwLsS/EvpBEH5oU1+V9XPx1MejnL2b5ZVcEFzRqRzxWXDDFlLJKRcEZ81JazLFf/1366qxwia7MxWdn3JcUK3xefluuwuXnr0nG6+uZvSDFksZefFcQWawve/n5Yn7+eRuJy8/zm9X1zerH+eLSrB5sj9/J7cFV//pCli6Pex7/7f2/m5//upv40+2r+89/OxG6f4V3dAtJFudhVWx4Df7XxSbP/vfwO44KG8wliTxgxz3GInKiqSYER2xocaGqAtfDgQv9kER5sQ1XPgSzcF9uP/tus5zoJNG/tD/6X26WaTl+Pb8ptvSmZ0f/1t1UG334e9U2kOIE8S4uI24X8NsLQeWPfK2zqptrMIvbVNHsBToujT//vM1oxdlFWH724bowfVcuKclx1aKbaX59IaotT292o39bb8O9e7sFIxab63i7tQa7XZbFlqR//dtqV5b67GeLf/vzyNWl0dTaJBXbfDf9fu/Defjju7/9/W8bNb0stloVW2m3v0vwvG+6iEBCyMCw4E7rKLSUHiFvLIqaOJye8Z+zF7j7my+u5fHN73dSHb7dzSff/89f//rXf/+///PX//f//ce/p5f/8f13JWIobuiRIJDUOKY7FszoIKRwmhOhqRfUm+CdWwuC9CAIeRAF+353h9IQEVNGmEggoNxzjTARkbloJZMMh3jH1la+UFWousZFuvBfzCpd9ZAWMpJbyDRGRiZhqKQqFFNrkUUqBKuC5VILNZKFjPW3kJ0Uvk9qcTtBQjvurLJr91ojHXSCsFNSEa6t1CyyWKi211GOBMK4NwS3Q6g0KUi3IbKtU1fEhYedutOXId6T0yfVYafv1Ktv7BRaQpJPyDEzjHEtCEPBWhqZpcFjwh04heAUljuFsxe0h0BJV9KZHiUTFWLSYCsIogIpiY1EBHtOnIvU+w1OWA/WhDayJj1KjMsgvI8qIO8ZV0hTYjEj0XjrKUJ8G2CwUut+MNYfTjD/PExXHzb8+ZiuHgx5uzmexmLBURgZOTFWcy1ldMigIK3iwqAkGbM9D4OI42p4LCp5Pi4ZqC6o7ni8jh78sVF5Hf34ab1Gfc2BJmKBKKMVVZTJYJVR2kbMhTCUILRdJhituEzUifRh3YB1A9YNWDdg3RjtukF1s3WjvJewxsJRugEU1gxYM2DNgDWjywznn/8/p9OYxg== \ No newline at end of file diff --git a/docs/tech/01_configuration.md b/docs/tech/01_configuration.md index 6b542695..105707ca 100644 --- a/docs/tech/01_configuration.md +++ b/docs/tech/01_configuration.md @@ -56,6 +56,9 @@ In this example, we see the real configuration of the self-documentation of this // Multiple files $docGenerator = (new DocGeneratorFactory())->create('config.yaml', 'config2.yaml', 'config3.xml'); + // Passing configuration as an array + $docGenerator = (new DocGeneratorFactory())->createByConfigArray($configArray); + ``` @@ -212,9 +215,9 @@ The inheritance algorithm is as follows: scalar types can be overwritten by each array<PluginInterface>|null -- PageHtmlLinkerPlugin +- PageHtmlLinkerPlugin -- PageLinkerPlugin +- PageLinkerPlugin List of plugins @@ -230,4 +233,4 @@ The inheritance algorithm is as follows: scalar types can be overwritten by each

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Wed Jan 10 23:55:33 2024 +0300
    Page content update date: Thu Jan 11 2024
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Wed Jan 10 23:55:33 2024 +0300
    Page content update date: Fri Jan 12 2024
    Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/02_parser/readme.md b/docs/tech/02_parser/readme.md index 9966c454..4aa9d87b 100644 --- a/docs/tech/02_parser/readme.md +++ b/docs/tech/02_parser/readme.md @@ -42,4 +42,4 @@ In this section, we show how the parser works and what components it consists of

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Wed Jan 10 23:55:33 2024 +0300
    Page content update date: Thu Jan 11 2024
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Wed Jan 10 23:55:33 2024 +0300
    Page content update date: Fri Jan 12 2024
    Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/03_renderer/01_howToCreateTemplates/classes/Configuration.md b/docs/tech/03_renderer/01_howToCreateTemplates/classes/Configuration.md index b2770cc8..0d1a5a5f 100644 --- a/docs/tech/03_renderer/01_howToCreateTemplates/classes/Configuration.md +++ b/docs/tech/03_renderer/01_howToCreateTemplates/classes/Configuration.md @@ -1,4 +1,4 @@ - BumbleDocGen / Technical description of the project / Renderer / How to create documentation templates? / Configuration
    + BumbleDocGen / Technical description of the project / Renderer / How to create documentation templates? / Front Matter / Configuration

    Configuration class: diff --git a/docs/tech/03_renderer/01_howToCreateTemplates/classes/Configuration_2.md b/docs/tech/03_renderer/01_howToCreateTemplates/classes/Configuration_2.md new file mode 100644 index 00000000..b2770cc8 --- /dev/null +++ b/docs/tech/03_renderer/01_howToCreateTemplates/classes/Configuration_2.md @@ -0,0 +1,763 @@ + BumbleDocGen / Technical description of the project / Renderer / How to create documentation templates? / Configuration
    + +

    + Configuration class: +

    + + + + + +```php +namespace BumbleDocGen\Core\Configuration; + +final class Configuration +``` + +
    Configuration project documentation
    + + + + + + +

    Initialization methods:

    + +
      +
    1. + __construct +
    2. +
    + +

    Methods:

    + +
      +
    1. + getAdditionalConsoleCommands +
    2. +
    3. + getCacheDir +
    4. +
    5. + getConfigurationVersion +
    6. +
    7. + getDocGenLibDir +
    8. +
    9. + getGitClientPath +
    10. +
    11. + getIfExists +
    12. +
    13. + getLanguageHandlersCollection +
    14. +
    15. + getOutputDir +
    16. +
    17. + getOutputDirBaseUrl +
    18. +
    19. + getPageLinkProcessor +
    20. +
    21. + getPlugins +
    22. +
    23. + getProjectRoot +
    24. +
    25. + getSourceLocators +
    26. +
    27. + getTemplatesDir +
    28. +
    29. + getTwigFilters +
    30. +
    31. + getTwigFunctions +
    32. +
    33. + getWorkingDir +
    34. +
    35. + isCheckFileInGitBeforeCreatingDocEnabled +
    36. +
    37. + renderWithFrontMatter +
    38. +
    39. + useSharedCache +
    40. +
    + + +

    Constants:

    + + + + + + +

    Method details:

    + +
    + + + +```php +public function __construct(\BumbleDocGen\Core\Configuration\ConfigurationParameterBag $parameterBag, \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache $localObjectCache, \Psr\Log\LoggerInterface $logger); +``` + + + +Parameters: + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $parameterBag\BumbleDocGen\Core\Configuration\ConfigurationParameterBag-
    $localObjectCache\BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache-
    $logger\Psr\Log\LoggerInterface-
    + + + +
    +
    +
    + + + +```php +public function getAdditionalConsoleCommands(): \BumbleDocGen\Console\Command\AdditionalCommandCollection; +``` + + + +Parameters: not specified + +Return value: \BumbleDocGen\Console\Command\AdditionalCommandCollection + + +Throws: + + +
    +
    +
    + + + +```php +public function getCacheDir(): null|string; +``` + + + +Parameters: not specified + +Return value: null | string + + +Throws: + + +
    +
    +
    + + + +```php +public function getConfigurationVersion(): string; +``` + + + +Parameters: not specified + +Return value: string + + +
    +
    +
    + + + +```php +public function getDocGenLibDir(): string; +``` + + + +Parameters: not specified + +Return value: string + + +
    +
    +
    + + + +```php +public function getGitClientPath(): string; +``` + + + +Parameters: not specified + +Return value: string + + +Throws: + + +
    +
    +
    + + + +```php +public function getIfExists(mixed $key): null|string; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $keymixed-
    + +Return value: null | string + + +Throws: + + +
    +
    +
    + + + +```php +public function getLanguageHandlersCollection(): \BumbleDocGen\LanguageHandler\LanguageHandlersCollection; +``` + + + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\LanguageHandlersCollection + + +Throws: + + +
    +
    +
    + + + +```php +public function getOutputDir(): string; +``` + + + +Parameters: not specified + +Return value: string + + +Throws: + + +
    +
    +
    + + + +```php +public function getOutputDirBaseUrl(): string; +``` + + + +Parameters: not specified + +Return value: string + + +Throws: + + +
    +
    +
    + + + +```php +public function getPageLinkProcessor(): \BumbleDocGen\Core\Renderer\PageLinkProcessor\PageLinkProcessorInterface; +``` + + + +Parameters: not specified + +Return value: \BumbleDocGen\Core\Renderer\PageLinkProcessor\PageLinkProcessorInterface + + +Throws: + + +
    +
    +
    + + + +```php +public function getPlugins(): \BumbleDocGen\Core\Plugin\PluginsCollection; +``` + + + +Parameters: not specified + +Return value: \BumbleDocGen\Core\Plugin\PluginsCollection + + +Throws: + + +
    +
    +
    + + + +```php +public function getProjectRoot(): string; +``` + + + +Parameters: not specified + +Return value: string + + +Throws: + + +
    +
    +
    + + + +```php +public function getSourceLocators(): \BumbleDocGen\Core\Parser\SourceLocator\SourceLocatorsCollection; +``` + + + +Parameters: not specified + +Return value: \BumbleDocGen\Core\Parser\SourceLocator\SourceLocatorsCollection + + +Throws: + + +
    +
    +
    + + + +```php +public function getTemplatesDir(): string; +``` + + + +Parameters: not specified + +Return value: string + + +Throws: + + +
    +
    +
    + + + +```php +public function getTwigFilters(): \BumbleDocGen\Core\Renderer\Twig\Filter\CustomFiltersCollection; +``` + + + +Parameters: not specified + +Return value: \BumbleDocGen\Core\Renderer\Twig\Filter\CustomFiltersCollection + + +Throws: + + +
    +
    +
    + + + +```php +public function getTwigFunctions(): \BumbleDocGen\Core\Renderer\Twig\Function\CustomFunctionsCollection; +``` + + + +Parameters: not specified + +Return value: \BumbleDocGen\Core\Renderer\Twig\Function\CustomFunctionsCollection + + +Throws: + + +
    +
    +
    + + + +```php +public function getWorkingDir(): string; +``` + + + +Parameters: not specified + +Return value: string + + +Throws: + + +
    +
    +
    + +
      +
    • # + isCheckFileInGitBeforeCreatingDocEnabled + | source code
    • +
    + +```php +public function isCheckFileInGitBeforeCreatingDocEnabled(): bool; +``` + + + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +public function renderWithFrontMatter(): bool; +``` + + + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    +
    + + + +```php +public function useSharedCache(): bool; +``` + + + +Parameters: not specified + +Return value: bool + + +Throws: + + +
    +
    diff --git a/docs/tech/03_renderer/01_howToCreateTemplates/classes/DrawDocumentationMenu.md b/docs/tech/03_renderer/01_howToCreateTemplates/classes/DrawDocumentationMenu.md new file mode 100644 index 00000000..6da79a1e --- /dev/null +++ b/docs/tech/03_renderer/01_howToCreateTemplates/classes/DrawDocumentationMenu.md @@ -0,0 +1,245 @@ + BumbleDocGen / Technical description of the project / Renderer / How to create documentation templates? / Front Matter / DrawDocumentationMenu
    + +

    + DrawDocumentationMenu class: +

    + + + + + +```php +namespace BumbleDocGen\Core\Renderer\Twig\Function; + +final class DrawDocumentationMenu implements \BumbleDocGen\Core\Renderer\Twig\Function\CustomFunctionInterface +``` + +
    Generate documentation menu in HTML format. To generate the menu, the start page is taken, +and all links with this page are recursively collected for it, after which the html menu is created.
    + +See: + + + +Examples of using: + +```php +{{ drawDocumentationMenu() }} - The menu contains links to all documents + +``` + +```php +{{ drawDocumentationMenu('/render/index.md') }} - The menu contains links to all child documents from the /render/index.md file (for example /render/test/index.md) + +``` + +```php +{{ drawDocumentationMenu(_self) }} - The menu contains links to all child documents from the file where this function was called + +``` + +```php +{{ drawDocumentationMenu(_self, 2) }} - The menu contains links to all child documents from the file where this function was called, but no more than 2 in depth + +``` + + + + +

    Settings:

    + + + + + + +
    Function name:drawDocumentationMenu
    + + + + +

    Initialization methods:

    + +
      +
    1. + __construct +
    2. +
    + +

    Methods:

    + +
      +
    1. + __invoke +
    2. +
    3. + getName +
    4. +
    5. + getOptions +
    6. +
    + + + + + + + +

    Method details:

    + +
    + + + +```php +public function __construct(\BumbleDocGen\Core\Configuration\Configuration $configuration, \BumbleDocGen\Core\Renderer\Breadcrumbs\BreadcrumbsHelper $breadcrumbsHelper, \BumbleDocGen\Core\Renderer\Context\RendererContext $rendererContext, \BumbleDocGen\Core\Renderer\Context\Dependency\RendererDependencyFactory $dependencyFactory); +``` + + + +Parameters: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $configuration\BumbleDocGen\Core\Configuration\Configuration-
    $breadcrumbsHelper\BumbleDocGen\Core\Renderer\Breadcrumbs\BreadcrumbsHelper-
    $rendererContext\BumbleDocGen\Core\Renderer\Context\RendererContext-
    $dependencyFactory\BumbleDocGen\Core\Renderer\Context\Dependency\RendererDependencyFactory-
    + + + +
    +
    +
    + + + +```php +public function __invoke(string|null $startPageKey = null, int|null $maxDeep = null): string; +``` + + + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $startPageKeystring | nullRelative path to the page from which the menu will be generated (only child pages will be taken into account). + By default, the main documentation page (readme.md) is used.
    $maxDeepint | nullMaximum parsing depth of documented links starting from the current page. + By default, this restriction is disabled.
    + +Return value: string + + +Throws: + + +
    +
    +
    + + + +```php +public static function getName(): string; +``` + + + +Parameters: not specified + +Return value: string + + +
    +
    +
    + + + +```php +public static function getOptions(): array; +``` + + + +Parameters: not specified + +Return value: array + + +
    +
    diff --git a/docs/tech/03_renderer/01_howToCreateTemplates/classes/GetDocumentedEntityUrl_2.md b/docs/tech/03_renderer/01_howToCreateTemplates/classes/GetDocumentedEntityUrl_2.md new file mode 100644 index 00000000..3e39559c --- /dev/null +++ b/docs/tech/03_renderer/01_howToCreateTemplates/classes/GetDocumentedEntityUrl_2.md @@ -0,0 +1,263 @@ + BumbleDocGen / Technical description of the project / Renderer / How to create documentation templates? / GetDocumentedEntityUrl
    + +

    + GetDocumentedEntityUrl class: +

    + + + + + +```php +namespace BumbleDocGen\Core\Renderer\Twig\Function; + +final class GetDocumentedEntityUrl implements \BumbleDocGen\Core\Renderer\Twig\Function\CustomFunctionInterface +``` + +
    Get the URL of a documented entity by its name. If the entity is found, next to the file where this method was called, +the `EntityDocRendererInterface::getDocFileExtension()` directory will be created, in which the documented entity file will be created
    + +See: + + + +Examples of using: + +```php +{{ getDocumentedEntityUrl(phpEntities, '\\BumbleDocGen\\Renderer\\Twig\\MainExtension', 'getFunctions') }} +The function returns a reference to the documented entity, anchored to the getFunctions method + +``` + +```php +{{ getDocumentedEntityUrl(phpEntities, '\\BumbleDocGen\\Renderer\\Twig\\MainExtension') }} +The function returns a reference to the documented entity MainExtension + +``` + +```php +{{ getDocumentedEntityUrl(phpEntities, '\\BumbleDocGen\\Renderer\\Twig\\MainExtension', '', false) }} +The function returns a link to the file MainExtension + +``` + + + + +

    Settings:

    + + + + + + +
    Function name:getDocumentedEntityUrl
    + + + + +

    Initialization methods:

    + +
      +
    1. + __construct +
    2. +
    + +

    Methods:

    + +
      +
    1. + __invoke +
    2. +
    3. + getName +
    4. +
    5. + getOptions +
    6. +
    + + +

    Constants:

    + + + + + + +

    Method details:

    + +
    + + + +```php +public function __construct(\BumbleDocGen\Core\Renderer\RendererHelper $rendererHelper, \BumbleDocGen\Core\Renderer\Context\DocumentedEntityWrappersCollection $documentedEntityWrappersCollection, \BumbleDocGen\Core\Configuration\Configuration $configuration, \Monolog\Logger $logger); +``` + + + +Parameters: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $rendererHelper\BumbleDocGen\Core\Renderer\RendererHelper-
    $documentedEntityWrappersCollection\BumbleDocGen\Core\Renderer\Context\DocumentedEntityWrappersCollection-
    $configuration\BumbleDocGen\Core\Configuration\Configuration-
    $logger\Monolog\Logger-
    + + + +
    +
    +
    + + + +```php +public function __invoke(\BumbleDocGen\Core\Parser\Entity\RootEntityCollection $rootEntityCollection, string $entityName, string $cursor = '', bool $createDocument = true): string; +``` + + + +Parameters: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $rootEntityCollection\BumbleDocGen\Core\Parser\Entity\RootEntityCollectionProcessed entity collection
    $entityNamestringThe full name of the entity for which the URL will be retrieved. + If the entity is not found, the DEFAULT_URL value will be returned.
    $cursorstringCursor on the page of the documented entity (for example, the name of a method or property)
    $createDocumentboolIf true, creates an entity document. Otherwise, just gives a reference to the entity code
    + +Return value: string + + +Throws: + + +
    +
    +
    + + + +```php +public static function getName(): string; +``` + + + +Parameters: not specified + +Return value: string + + +
    +
    +
    + + + +```php +public static function getOptions(): array; +``` + + + +Parameters: not specified + +Return value: array + + +
    +
    diff --git a/docs/tech/03_renderer/01_howToCreateTemplates/frontMatter.md b/docs/tech/03_renderer/01_howToCreateTemplates/frontMatter.md new file mode 100644 index 00000000..81c21e9a --- /dev/null +++ b/docs/tech/03_renderer/01_howToCreateTemplates/frontMatter.md @@ -0,0 +1,25 @@ + BumbleDocGen / Technical description of the project / Renderer / How to create documentation templates? / Front Matter
    + +

    Front Matter

    + +Front Matter is a special block at the top of a document template or generated document that contains certain important meta information. + +This block must be located strictly at the top of the template, its beginning and end are indicated by a combination of symbols `---`: + +```twig +--- +title: Front Matter +prevPage: How to create documentation templates? +someVariable: 123 +--- + +some template content ... +``` + +The content of this block must be in YAML format. +During the template generation process, this block is parsed, and all values become available in the form of twig variables. +By default, this block is hidden from generated MD files, but it can be displayed by enabling the special option render_with_front_matter in the configuration + +Some Front Matter block variables are used internally in our system, for example `title` and `prevPage` are used to generate breadcrumbs and documentation menus. + +This block is also used when generating HTML documentation. You can learn about the variables used in this block when generating HTML content [in the documentation of the library](https://daux.io/Features/Front_Matter.html) that we use to create HTML pages. diff --git a/docs/tech/03_renderer/01_howToCreateTemplates/readme.md b/docs/tech/03_renderer/01_howToCreateTemplates/readme.md index 100cd786..105fa9fb 100644 --- a/docs/tech/03_renderer/01_howToCreateTemplates/readme.md +++ b/docs/tech/03_renderer/01_howToCreateTemplates/readme.md @@ -6,7 +6,7 @@ Templates are `twig` files in which you can write both static text and dynamic b **You can read more about template parts here:** - +

    Examples

    @@ -103,4 +103,4 @@ Result after starting the documentation generation process:

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Thu Jan 11 00:14:41 2024 +0300
    Page content update date: Thu Jan 11 2024
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Thu Jan 11 00:14:41 2024 +0300
    Page content update date: Fri Jan 12 2024
    Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/03_renderer/01_howToCreateTemplates/templatesVariables.md b/docs/tech/03_renderer/01_howToCreateTemplates/templatesVariables.md index f4463b1c..cc8de8c3 100644 --- a/docs/tech/03_renderer/01_howToCreateTemplates/templatesVariables.md +++ b/docs/tech/03_renderer/01_howToCreateTemplates/templatesVariables.md @@ -8,7 +8,9 @@ There are several variables available in each processed template. 2) Secondly, variables with collections of processed programming languages are available in the template (see LanguageHandlerInterface). For example, when processing a PHP project collection, a collection PhpEntitiesCollection will be available in the template under the name phpEntities +3) Thirdly, all variables specified in **Front Matter** are automatically converted into template variables and are available in it +

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Thu Jan 11 00:14:41 2024 +0300
    Page content update date: Thu Jan 11 2024
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Thu Jan 11 00:14:41 2024 +0300
    Page content update date: Fri Jan 12 2024
    Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/03_renderer/02_breadcrumbs.md b/docs/tech/03_renderer/02_breadcrumbs.md index f2710817..483d4c58 100644 --- a/docs/tech/03_renderer/02_breadcrumbs.md +++ b/docs/tech/03_renderer/02_breadcrumbs.md @@ -28,7 +28,7 @@ In this way, complex documentation structures can be created with less file nest

    Displaying breadcrumbs in documents

    -There is a built-in function to generate breadcrumbs in templates GeneratePageBreadcrumbs. +There is a built-in function to generate breadcrumbs in templates GeneratePageBreadcrumbs. Here is how it is used in twig templates: ```twig @@ -49,10 +49,10 @@ The template name can be specified using the `title` front matter variable: Here is an example of the result of the `generatePageBreadcrumbs` function: ```twig - BumbleDocGen / Technical description of the project / Renderer / Documentation structure and breadcrumbs
    + BumbleDocGen / Technical description of the project / Renderer / Some page title
    ```

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Wed Jan 10 23:55:33 2024 +0300
    Page content update date: Thu Jan 11 2024
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Wed Jan 10 23:55:33 2024 +0300
    Page content update date: Fri Jan 12 2024
    Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/03_renderer/readme.md b/docs/tech/03_renderer/readme.md index ec528792..c7f777f4 100644 --- a/docs/tech/03_renderer/readme.md +++ b/docs/tech/03_renderer/readme.md @@ -10,7 +10,7 @@ We use twig to process templates.

    More detailed description of renderer components

    - +

    Starting the rendering process

    @@ -60,4 +60,4 @@ This process is presented in the form of a diagram below.

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Wed Jan 10 23:55:33 2024 +0300
    Page content update date: Thu Jan 11 2024
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Wed Jan 10 23:55:33 2024 +0300
    Page content update date: Fri Jan 12 2024
    Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/07_outputFormat.md b/docs/tech/07_outputFormat.md new file mode 100644 index 00000000..393c129d --- /dev/null +++ b/docs/tech/07_outputFormat.md @@ -0,0 +1,35 @@ + BumbleDocGen / Technical description of the project / Output formats
    + +

    Output formats

    + +At the moment, the documentation generator is focused on creating documentation in two formats: [GitHub Flavored Markdown](https://github.github.com/gfm/) and HTML. +However, it is possible to create other files with some restrictions. + +1) Creating **GFM** documentation is possible both using a console application and using the built-in commands of the documentation generator. + + * Generate GFM doc by console command: + ```bash + # Generate GFM files ( see {output_dir}) + vendor/bin/bumbleDocGen generate + + # Serve GFM documentation ( see {output_dir}) + vendor/bin/bumbleDocGen serve + ``` + * Generate GFM doc by docGen PHP API: + ```php + # Generate GFM files ( see {output_dir}) + (new DocGeneratorFactory())->create($configFile)->generate() + + # Serve GFM documentation ( see {output_dir}) + (new DocGeneratorFactory())->create($configFile)->serve() + ``` + +2) Creating **HTML** documentation is only possible through a console application. The [Daux.io](https://daux.io/) library is used to generate HTML pages. + * Generate HTML doc by console command: + ```bash + # Generate static HTML files ( see {output_dir}/html) + vendor/bin/bumbleDocGen generate --as-html + + # Serve HTML documentation (see generated content in browser) + vendor/bin/bumbleDocGen serve --as-html + ``` diff --git a/docs/tech/classes/DocGenerator.md b/docs/tech/classes/DocGenerator.md new file mode 100644 index 00000000..5caecd97 --- /dev/null +++ b/docs/tech/classes/DocGenerator.md @@ -0,0 +1,572 @@ + BumbleDocGen / Technical description of the project / Output formats / DocGenerator
    + +

    + DocGenerator class: +

    + + + + + +```php +namespace BumbleDocGen; + +final class DocGenerator +``` + +
    Class for generating documentation.
    + + + + + + +

    Initialization methods:

    + +
      +
    1. + __construct +
    2. +
    + +

    Methods:

    + +
      +
    1. + addDocBlocks + - Generate missing docBlocks with LLM for project class methods that are available for documentation
    2. +
    3. + addPlugin +
    4. +
    5. + generate + - Generates documentation using configuration
    6. +
    7. + generateReadmeTemplate + - Creates a `README.md` template filled with basic information using LLM
    8. +
    9. + getConfiguration +
    10. +
    11. + getConfigurationKey +
    12. +
    13. + getConfigurationKeys +
    14. +
    15. + parseAndGetRootEntityCollectionsGroup +
    16. +
    17. + serve + - Serve documentation
    18. +
    + + +

    Constants:

    + + + + + + +

    Method details:

    + +
    + + + +```php +public function __construct(\Symfony\Component\Console\Style\OutputStyle $io, \BumbleDocGen\Core\Configuration\Configuration $configuration, \BumbleDocGen\Core\Plugin\PluginEventDispatcher $pluginEventDispatcher, \BumbleDocGen\Core\Parser\ProjectParser $parser, \BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper $parserHelper, \BumbleDocGen\Core\Renderer\Renderer $renderer, \BumbleDocGen\Core\Logger\Handler\GenerationErrorsHandler $generationErrorsHandler, \BumbleDocGen\Core\Parser\Entity\RootEntityCollectionsGroup $rootEntityCollectionsGroup, \BumbleDocGen\Console\ProgressBar\ProgressBarFactory $progressBarFactory, \DI\Container $diContainer, \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache $localObjectCache, \Monolog\Logger $logger); +``` + + + +Parameters: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $io\Symfony\Component\Console\Style\OutputStyle-
    $configuration\BumbleDocGen\Core\Configuration\Configuration-
    $pluginEventDispatcher\BumbleDocGen\Core\Plugin\PluginEventDispatcher-
    $parser\BumbleDocGen\Core\Parser\ProjectParser-
    $parserHelper\BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper-
    $renderer\BumbleDocGen\Core\Renderer\Renderer-
    $generationErrorsHandler\BumbleDocGen\Core\Logger\Handler\GenerationErrorsHandler-
    $rootEntityCollectionsGroup\BumbleDocGen\Core\Parser\Entity\RootEntityCollectionsGroup-
    $progressBarFactory\BumbleDocGen\Console\ProgressBar\ProgressBarFactory-
    $diContainer\DI\Container-
    $localObjectCache\BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache-
    $logger\Monolog\Logger-
    + + + +Throws: + + +
    +
    +
    + + + +```php +public function addDocBlocks(\BumbleDocGen\AI\ProviderInterface $aiProvider): void; +``` + +
    Generate missing docBlocks with LLM for project class methods that are available for documentation
    + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $aiProvider\BumbleDocGen\AI\ProviderInterface-
    + +Return value: void + + +Throws: + + +
    +
    +
    + + + +```php +public function addPlugin(\BumbleDocGen\Core\Plugin\PluginInterface|string $plugin): void; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $plugin\BumbleDocGen\Core\Plugin\PluginInterface | string-
    + +Return value: void + + +Throws: + + +
    +
    +
    + + + +```php +public function generate(): void; +``` + +
    Generates documentation using configuration
    + +Parameters: not specified + +Return value: void + + +Throws: + + +
    +
    +
    + + + +```php +public function generateReadmeTemplate(\BumbleDocGen\AI\ProviderInterface $aiProvider): void; +``` + +
    Creates a `README.md` template filled with basic information using LLM
    + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $aiProvider\BumbleDocGen\AI\ProviderInterface-
    + +Return value: void + + +Throws: + + +
    +
    +
    + + + +```php +public function getConfiguration(): \BumbleDocGen\Core\Configuration\Configuration; +``` + + + +Parameters: not specified + +Return value: \BumbleDocGen\Core\Configuration\Configuration + + +
    +
    +
    + + + +```php +public function getConfigurationKey(string $key): void; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $keystring-
    + +Return value: void + + +Throws: + + +
    +
    +
    + + + +```php +public function getConfigurationKeys(): void; +``` + + + +Parameters: not specified + +Return value: void + + +Throws: + + +
    +
    +
    + +
      +
    • # + parseAndGetRootEntityCollectionsGroup + | source code
    • +
    + +```php +public function parseAndGetRootEntityCollectionsGroup(): \BumbleDocGen\Core\Parser\Entity\RootEntityCollectionsGroup; +``` + + + +Parameters: not specified + +Return value: \BumbleDocGen\Core\Parser\Entity\RootEntityCollectionsGroup + + +Throws: + + +
    +
    +
    + + + +```php +public function serve(callable|null $afterPreparation = null, callable|null $afterDocChanged = null, int $timeout = 1000000): void; +``` + +
    Serve documentation
    + +Parameters: + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $afterPreparationcallable | null-
    $afterDocChangedcallable | null-
    $timeoutint-
    + +Return value: void + + +Throws: + + +
    +
    diff --git a/docs/tech/readme.md b/docs/tech/readme.md index e45d1a9b..bb6bbcc7 100644 --- a/docs/tech/readme.md +++ b/docs/tech/readme.md @@ -6,7 +6,7 @@ This documentation generator is a library that allows you to create handwritten

    Documentation sections

    - +

    How it works

    @@ -44,4 +44,4 @@ After that, the process of parsing the project code according to the configurati

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Dec 23 23:00:37 2023 +0300
    Page content update date: Thu Jan 11 2024
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Dec 23 23:00:37 2023 +0300
    Page content update date: Fri Jan 12 2024
    Made with Bumble Documentation Generator \ No newline at end of file diff --git a/selfdoc/templates/tech/01_configuration.md.twig b/selfdoc/templates/tech/01_configuration.md.twig index a9214cc8..ff3ad1be 100644 --- a/selfdoc/templates/tech/01_configuration.md.twig +++ b/selfdoc/templates/tech/01_configuration.md.twig @@ -28,6 +28,9 @@ $docGenerator = (new DocGeneratorFactory())->create('config.yaml'); // Multiple files $docGenerator = (new DocGeneratorFactory())->create('config.yaml', 'config2.yaml', 'config3.xml'); + +// Passing configuration as an array +$docGenerator = (new DocGeneratorFactory())->createByConfigArray($configArray); " | textToCodeBlock('php') }} {{ "Handling and inheritance of configuration files" | textToHeading('H2') }} diff --git a/selfdoc/templates/tech/03_renderer/01_howToCreateTemplates/frontMatter.md.twig b/selfdoc/templates/tech/03_renderer/01_howToCreateTemplates/frontMatter.md.twig new file mode 100644 index 00000000..264f45a3 --- /dev/null +++ b/selfdoc/templates/tech/03_renderer/01_howToCreateTemplates/frontMatter.md.twig @@ -0,0 +1,29 @@ +--- +title: Front Matter +prevPage: How to create documentation templates? +--- +{{ generatePageBreadcrumbs(title, _self) }} + +{{ "Front Matter" | textToHeading('H1') }} + +Front Matter is a special block at the top of a document template or generated document that contains certain important meta information. + +This block must be located strictly at the top of the template, its beginning and end are indicated by a combination of symbols `---`: + +```twig +--- +title: Front Matter +prevPage: How to create documentation templates? +someVariable: 123 +--- + +some template content ... +``` + +The content of this block must be in YAML format. +During the template generation process, this block is parsed, and all values become available in the form of twig variables. +By default, this block is hidden from generated MD files, but it can be displayed by enabling the special option [a x-title="render_with_front_matter"]Configuration::renderWithFrontMatter()[/a] in the configuration + +Some Front Matter block variables are used internally in our system, for example `title` and `prevPage` are used to generate [a x-title="breadcrumbs"]Documentation structure and breadcrumbs[/a] and [a x-title="documentation menus"]DrawDocumentationMenu[/a]. + +This block is also used when generating HTML documentation. You can learn about the variables used in this block when generating HTML content [in the documentation of the library](https://daux.io/Features/Front_Matter.html) that we use to create HTML pages. diff --git a/selfdoc/templates/tech/03_renderer/01_howToCreateTemplates/templatesVariables.md.twig b/selfdoc/templates/tech/03_renderer/01_howToCreateTemplates/templatesVariables.md.twig index aea301ff..af9addba 100644 --- a/selfdoc/templates/tech/03_renderer/01_howToCreateTemplates/templatesVariables.md.twig +++ b/selfdoc/templates/tech/03_renderer/01_howToCreateTemplates/templatesVariables.md.twig @@ -11,3 +11,5 @@ There are several variables available in each processed template. 1) Firstly, these are built-in twig variables, for example `_self`, which returns the path to the processed template. 2) Secondly, variables with collections of processed programming languages are available in the template (see [a]LanguageHandlerInterface[/a]). For example, when processing a PHP project collection, a collection [a]PhpEntitiesCollection[/a] will be available in the template under the name phpEntities + +3) Thirdly, all variables specified in **Front Matter** are automatically converted into template variables and are available in it diff --git a/selfdoc/templates/tech/03_renderer/02_breadcrumbs.md.twig b/selfdoc/templates/tech/03_renderer/02_breadcrumbs.md.twig index 513922a7..eb418465 100644 --- a/selfdoc/templates/tech/03_renderer/02_breadcrumbs.md.twig +++ b/selfdoc/templates/tech/03_renderer/02_breadcrumbs.md.twig @@ -43,4 +43,4 @@ title: Some page title Here is an example of the result of the `generatePageBreadcrumbs` function: -{{ ' BumbleDocGen / Technical description of the project / Renderer / Documentation structure and breadcrumbs
    ' | textToCodeBlock('twig') }} \ No newline at end of file +{{ ' BumbleDocGen / Technical description of the project / Renderer / Some page title
    ' | textToCodeBlock('twig') }} \ No newline at end of file diff --git a/selfdoc/templates/tech/03_renderer/readme.md.twig b/selfdoc/templates/tech/03_renderer/readme.md.twig index 5b34b4b5..5f1411b8 100644 --- a/selfdoc/templates/tech/03_renderer/readme.md.twig +++ b/selfdoc/templates/tech/03_renderer/readme.md.twig @@ -13,7 +13,7 @@ We use twig to process templates. {{ "More detailed description of renderer components" | textToHeading('H2') }} -{{ drawDocumentationMenu(_self, 1) }} +{{ drawDocumentationMenu(_self) }} {{ "Starting the rendering process" | textToHeading('H2') }} diff --git a/selfdoc/templates/tech/07_outputFormat.md.twig b/selfdoc/templates/tech/07_outputFormat.md.twig new file mode 100644 index 00000000..0c23f5a2 --- /dev/null +++ b/selfdoc/templates/tech/07_outputFormat.md.twig @@ -0,0 +1,39 @@ +--- +title: Output formats +prevPage: Technical description of the project +--- +{{ generatePageBreadcrumbs(title, _self) }} + +{{ "Output formats" | textToHeading('H1') }} + +At the moment, the documentation generator is focused on creating documentation in two formats: [GitHub Flavored Markdown](https://github.github.com/gfm/) and HTML. +However, it is possible to create other files with some restrictions. + +1) Creating **GFM** documentation is possible both using a [a x-title="console application"]Console app[/a] and using the [a x-title="built-in commands"]DocGenerator::generate()[/a] of the documentation generator. + + * Generate GFM doc by console command: + ```bash + # Generate GFM files ( see {output_dir}) + vendor/bin/bumbleDocGen generate + + # Serve GFM documentation ( see {output_dir}) + vendor/bin/bumbleDocGen serve + ``` + * Generate GFM doc by docGen PHP API: + ```php + # Generate GFM files ( see {output_dir}) + (new DocGeneratorFactory())->create($configFile)->generate() + + # Serve GFM documentation ( see {output_dir}) + (new DocGeneratorFactory())->create($configFile)->serve() + ``` + +2) Creating **HTML** documentation is only possible through a [a x-title="console application"]Console app[/a]. The [Daux.io](https://daux.io/) library is used to generate HTML pages. + * Generate HTML doc by console command: + ```bash + # Generate static HTML files ( see {output_dir}/html) + vendor/bin/bumbleDocGen generate --as-html + + # Serve HTML documentation (see generated content in browser) + vendor/bin/bumbleDocGen serve --as-html + ``` From d24bb38c503dc89e2bde364a9c7018b5c9e41bf2 Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Fri, 12 Jan 2024 18:54:20 +0300 Subject: [PATCH 201/210] Updating doc --- docs/shared_c.cache | 2 +- docs/tech/07_outputFormat.md | 9 +++++++-- selfdoc/templates/tech/07_outputFormat.md.twig | 4 ++-- 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/docs/shared_c.cache b/docs/shared_c.cache index a97295ab..89fb80fc 100644 --- a/docs/shared_c.cache +++ b/docs/shared_c.cache @@ -1 +1 @@ -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 \ No newline at end of file +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 \ No newline at end of file diff --git a/docs/tech/07_outputFormat.md b/docs/tech/07_outputFormat.md index 393c129d..db6cabb8 100644 --- a/docs/tech/07_outputFormat.md +++ b/docs/tech/07_outputFormat.md @@ -18,10 +18,10 @@ However, it is possible to create other files with some restrictions. * Generate GFM doc by docGen PHP API: ```php # Generate GFM files ( see {output_dir}) - (new DocGeneratorFactory())->create($configFile)->generate() + (new DocGeneratorFactory())->create($configFile)->generate(); # Serve GFM documentation ( see {output_dir}) - (new DocGeneratorFactory())->create($configFile)->serve() + (new DocGeneratorFactory())->create($configFile)->serve(); ``` 2) Creating **HTML** documentation is only possible through a console application. The [Daux.io](https://daux.io/) library is used to generate HTML pages. @@ -33,3 +33,8 @@ However, it is possible to create other files with some restrictions. # Serve HTML documentation (see generated content in browser) vendor/bin/bumbleDocGen serve --as-html ``` + + +
    +
    +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Fri Jan 12 18:53:16 2024 +0300
    Page content update date: Fri Jan 12 2024
    Made with Bumble Documentation Generator
    \ No newline at end of file diff --git a/selfdoc/templates/tech/07_outputFormat.md.twig b/selfdoc/templates/tech/07_outputFormat.md.twig index 0c23f5a2..4feabc66 100644 --- a/selfdoc/templates/tech/07_outputFormat.md.twig +++ b/selfdoc/templates/tech/07_outputFormat.md.twig @@ -22,10 +22,10 @@ However, it is possible to create other files with some restrictions. * Generate GFM doc by docGen PHP API: ```php # Generate GFM files ( see {output_dir}) - (new DocGeneratorFactory())->create($configFile)->generate() + (new DocGeneratorFactory())->create($configFile)->generate(); # Serve GFM documentation ( see {output_dir}) - (new DocGeneratorFactory())->create($configFile)->serve() + (new DocGeneratorFactory())->create($configFile)->serve(); ``` 2) Creating **HTML** documentation is only possible through a [a x-title="console application"]Console app[/a]. The [Daux.io](https://daux.io/) library is used to generate HTML pages. From 22ec58ad1d47fdc7d88867ee0addbe2f791358c8 Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Mon, 15 Jan 2024 19:41:59 +0300 Subject: [PATCH 202/210] Changing method to load cache --- .../SharedCompressedDocumentFileCache.php | 23 ++++++++++++++----- src/Core/Renderer/Renderer.php | 1 + 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/src/Core/Cache/SharedCompressedDocumentFileCache.php b/src/Core/Cache/SharedCompressedDocumentFileCache.php index 12079cfd..e7fc2ed5 100644 --- a/src/Core/Cache/SharedCompressedDocumentFileCache.php +++ b/src/Core/Cache/SharedCompressedDocumentFileCache.php @@ -15,12 +15,18 @@ final class SharedCompressedDocumentFileCache private array $cacheData = []; private array $usedKeys = []; - /** - * @throws InvalidConfigurationParameterException - */ public function __construct( private readonly Configuration $configuration ) { + } + + /** + * @throws InvalidConfigurationParameterException + */ + public function reloadDataFromFile(): void + { + $this->usedKeys = []; + $this->cacheData = []; $this->cacheFileName = $this->configuration->getOutputDir() . '/' . self::FILE_NAME; if (!$this->configuration->useSharedCache()) { return; @@ -61,9 +67,7 @@ public function saveChanges(bool $clearUsedKeysCounter = true): void $gitAttributesFile = $this->configuration->getOutputDir() . '/.gitattributes'; file_put_contents($gitAttributesFile, self::FILE_NAME . ' merge=ours'); if (!$this->configuration->useSharedCache()) { - if (file_exists($this->cacheFileName)) { - unlink($this->cacheFileName); - } + $this->removeFile(); return; } $cacheData = array_filter( @@ -77,4 +81,11 @@ public function saveChanges(bool $clearUsedKeysCounter = true): void $this->usedKeys = []; } } + + public function removeFile(): void + { + if (file_exists($this->cacheFileName)) { + unlink($this->cacheFileName); + } + } } diff --git a/src/Core/Renderer/Renderer.php b/src/Core/Renderer/Renderer.php index ddb96db4..2d8dfd8c 100644 --- a/src/Core/Renderer/Renderer.php +++ b/src/Core/Renderer/Renderer.php @@ -56,6 +56,7 @@ public function __construct( */ public function run(): void { + $this->sharedCompressedDocumentFileCache->reloadDataFromFile(); $this->twig->reloadTemplates(); $outputDir = $this->configuration->getOutputDir(); From dff226cfe350c9b28455f98488f925d9c747e603 Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Mon, 15 Jan 2024 19:42:36 +0300 Subject: [PATCH 203/210] Adding method to remove all not loaded entities from collection --- src/Core/Parser/Entity/RootEntityCollection.php | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/Core/Parser/Entity/RootEntityCollection.php b/src/Core/Parser/Entity/RootEntityCollection.php index 6a9ea146..24a04460 100644 --- a/src/Core/Parser/Entity/RootEntityCollection.php +++ b/src/Core/Parser/Entity/RootEntityCollection.php @@ -128,4 +128,13 @@ public function toArray(): array { return $this->entities; } + + public function removeAllNotLoadedEntities(): void + { + foreach ($this->entities as $k => $entity) { + if (!$entity->isEntityDataCanBeLoaded()) { + unset($this->entities[$k]); + } + } + } } From 0b5c11dc553874a8daeb333d1fce1aef660f5aaf Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Mon, 15 Jan 2024 19:46:21 +0300 Subject: [PATCH 204/210] Changing method to handle errors --- src/DocGenerator.php | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/src/DocGenerator.php b/src/DocGenerator.php index e7ed436c..65ff92c4 100644 --- a/src/DocGenerator.php +++ b/src/DocGenerator.php @@ -9,6 +9,7 @@ use BumbleDocGen\AI\ProviderInterface; use BumbleDocGen\Console\ProgressBar\ProgressBarFactory; use BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache; +use BumbleDocGen\Core\Cache\SharedCompressedDocumentFileCache; use BumbleDocGen\Core\Configuration\Configuration; use BumbleDocGen\Core\Configuration\ConfigurationKey; use BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException; @@ -63,6 +64,7 @@ public function __construct( private readonly RootEntityCollectionsGroup $rootEntityCollectionsGroup, private readonly ProgressBarFactory $progressBarFactory, private readonly Container $diContainer, + private readonly SharedCompressedDocumentFileCache $sharedCompressedDocumentFileCache, private readonly LocalObjectCache $localObjectCache, private readonly Logger $logger ) { @@ -344,8 +346,24 @@ public function serve( $event = $this->pluginEventDispatcher->dispatch(new OnGetProjectTemplatesDirs([$templatesDir])); $templatesDirs = $event->getTemplatesDirs(); + // todo This code is temporary. + // Why is it needed? The thing is that in live mode there is some problem with the cache, + // which I did not have time to debug. If you add a reference to a non-existent entity to the template, + // the error will persist even when it is actually corrected. + // This happens because a reference to this object is stored in the operation log and is not deleted. + // Need to investigate later and fix + $handleErrors = function (): void { + if ($this->generationErrorsHandler->getRecords()) { + $this->sharedCompressedDocumentFileCache->removeFile(); + foreach ($this->rootEntityCollectionsGroup as $collection) { + $collection->removeAllNotLoadedEntities(); + } + $this->displayErrors(); + } + }; + $checkedFiles = []; - $checkIsTemplatesChanged = function () use ($templatesDirs, &$checkedFiles) { + $checkIsTemplatesChanged = function () use ($templatesDirs, &$checkedFiles, $handleErrors) { $finder = Finder::create() ->ignoreVCS(true) ->ignoreDotFiles(true) @@ -370,7 +388,7 @@ public function serve( $this->parser->parse($pb); $this->renderer->run(); $checkIsTemplatesChanged(); - $this->displayErrors(); + $handleErrors(); if ($afterPreparation) { call_user_func($afterPreparation); } @@ -380,7 +398,7 @@ public function serve( try { $this->localObjectCache->clear(); $this->renderer->run(); - $this->displayErrors(); + $handleErrors(); if ($afterDocChanged) { call_user_func($afterDocChanged); } From b7afaa90299fc6a9c1da25f81c0ef061fff30971 Mon Sep 17 00:00:00 2001 From: fshcherbanich Date: Mon, 15 Jan 2024 19:52:20 +0300 Subject: [PATCH 205/210] Updating doc --- docs/README.md | 2 +- docs/classes/DocGenerator.md | 33 +++++++++++-------- docs/shared_c.cache | 2 +- docs/tech/01_configuration.md | 6 ++-- .../classes/PhpEntitiesCollection.md | 26 +++++++++++++++ .../02_parser/classes/RootEntityCollection.md | 24 ++++++++++++++ docs/tech/02_parser/entity.md | 2 +- docs/tech/02_parser/entityFilterCondition.md | 2 +- docs/tech/02_parser/readme.md | 2 +- .../php/classes/PhpEntitiesCollection.md | 26 +++++++++++++++ .../php/phpClassConstantReflectionApi.md | 2 +- .../php/phpClassMethodReflectionApi.md | 2 +- .../php/phpClassPropertyReflectionApi.md | 2 +- .../php/phpClassReflectionApi.md | 2 +- .../php/phpEntitiesCollection.md | 2 +- .../reflectionApi/php/phpEnumReflectionApi.md | 2 +- .../php/phpInterfaceReflectionApi.md | 2 +- .../php/phpTraitReflectionApi.md | 2 +- .../02_parser/reflectionApi/php/readme.md | 2 +- docs/tech/02_parser/reflectionApi/readme.md | 2 +- docs/tech/02_parser/sourceLocator.md | 2 +- .../classes/PhpEntitiesCollection.md | 26 +++++++++++++++ .../classes/RootEntityInterface.md | 2 +- .../01_howToCreateTemplates/frontMatter.md | 5 +++ .../01_howToCreateTemplates/readme.md | 2 +- .../templatesDynamicBlocks.md | 2 +- .../templatesLinking.md | 2 +- .../templatesVariables.md | 2 +- docs/tech/03_renderer/02_breadcrumbs.md | 4 +-- docs/tech/03_renderer/03_documentStructure.md | 2 +- docs/tech/03_renderer/04_twigCustomFilters.md | 2 +- .../03_renderer/05_twigCustomFunctions.md | 2 +- .../classes/PhpEntitiesCollection.md | 26 +++++++++++++++ .../classes/RootEntityCollection.md | 24 ++++++++++++++ docs/tech/03_renderer/readme.md | 2 +- docs/tech/04_pluginSystem.md | 2 +- docs/tech/05_console.md | 2 +- docs/tech/06_debugging.md | 2 +- docs/tech/07_outputFormat.md | 2 +- docs/tech/classes/DocGenerator.md | 33 +++++++++++-------- docs/tech/readme.md | 2 +- 41 files changed, 230 insertions(+), 63 deletions(-) diff --git a/docs/README.md b/docs/README.md index 0c496496..df55c273 100644 --- a/docs/README.md +++ b/docs/README.md @@ -96,4 +96,4 @@ To update this documentation, run the following command:

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Dec 23 23:00:37 2023 +0300
    Page content update date: Thu Jan 11 2024
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Dec 23 23:00:37 2023 +0300
    Page content update date: Mon Jan 15 2024
    Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/classes/DocGenerator.md b/docs/classes/DocGenerator.md index 5cf27736..fed1ae00 100644 --- a/docs/classes/DocGenerator.md +++ b/docs/classes/DocGenerator.md @@ -1,7 +1,7 @@ BumbleDocGen / DocGenerator

    - DocGenerator class: + DocGenerator class:

    @@ -66,11 +66,11 @@ final class DocGenerator @@ -85,11 +85,11 @@ final class DocGenerator ```php -public function __construct(\Symfony\Component\Console\Style\OutputStyle $io, \BumbleDocGen\Core\Configuration\Configuration $configuration, \BumbleDocGen\Core\Plugin\PluginEventDispatcher $pluginEventDispatcher, \BumbleDocGen\Core\Parser\ProjectParser $parser, \BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper $parserHelper, \BumbleDocGen\Core\Renderer\Renderer $renderer, \BumbleDocGen\Core\Logger\Handler\GenerationErrorsHandler $generationErrorsHandler, \BumbleDocGen\Core\Parser\Entity\RootEntityCollectionsGroup $rootEntityCollectionsGroup, \BumbleDocGen\Console\ProgressBar\ProgressBarFactory $progressBarFactory, \DI\Container $diContainer, \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache $localObjectCache, \Monolog\Logger $logger); +public function __construct(\Symfony\Component\Console\Style\OutputStyle $io, \BumbleDocGen\Core\Configuration\Configuration $configuration, \BumbleDocGen\Core\Plugin\PluginEventDispatcher $pluginEventDispatcher, \BumbleDocGen\Core\Parser\ProjectParser $parser, \BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper $parserHelper, \BumbleDocGen\Core\Renderer\Renderer $renderer, \BumbleDocGen\Core\Logger\Handler\GenerationErrorsHandler $generationErrorsHandler, \BumbleDocGen\Core\Parser\Entity\RootEntityCollectionsGroup $rootEntityCollectionsGroup, \BumbleDocGen\Console\ProgressBar\ProgressBarFactory $progressBarFactory, \DI\Container $diContainer, \BumbleDocGen\Core\Cache\SharedCompressedDocumentFileCache $sharedCompressedDocumentFileCache, \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache $localObjectCache, \Monolog\Logger $logger); ``` @@ -154,6 +154,11 @@ public function __construct(\Symfony\Component\Console\Style\OutputStyle $io, \B $diContainer \DI\Container - + + + $sharedCompressedDocumentFileCache + \BumbleDocGen\Core\Cache\SharedCompressedDocumentFileCache + - $localObjectCache @@ -190,7 +195,7 @@ public function __construct(\Symfony\Component\Console\Style\OutputStyle $io, \B ```php @@ -244,7 +249,7 @@ public function addDocBlocks(\BumbleDocGen\AI\ProviderInterface $aiProvider): vo ```php @@ -295,7 +300,7 @@ public function addPlugin(\BumbleDocGen\Core\Plugin\PluginInterface|string $plug ```php @@ -326,7 +331,7 @@ public function generate(): void; ```php @@ -377,7 +382,7 @@ public function generateReadmeTemplate(\BumbleDocGen\AI\ProviderInterface $aiPro ```php @@ -398,7 +403,7 @@ public function getConfiguration(): \BumbleDocGen\Core\Configuration\Configurati ```php @@ -449,7 +454,7 @@ public function getConfigurationKey(string $key): void; ```php @@ -483,7 +488,7 @@ public function getConfigurationKeys(): void; ```php @@ -517,7 +522,7 @@ public function parseAndGetRootEntityCollectionsGroup(): \BumbleDocGen\Core\Pars ```php diff --git a/docs/shared_c.cache b/docs/shared_c.cache index 89fb80fc..bb842d99 100644 --- a/docs/shared_c.cache +++ b/docs/shared_c.cache @@ -1 +1 @@ -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 \ No newline at end of file +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 \ No newline at end of file diff --git a/docs/tech/01_configuration.md b/docs/tech/01_configuration.md index 105707ca..26daec63 100644 --- a/docs/tech/01_configuration.md +++ b/docs/tech/01_configuration.md @@ -215,9 +215,9 @@ The inheritance algorithm is as follows: scalar types can be overwritten by each array<PluginInterface>|null -- PageHtmlLinkerPlugin +- PageHtmlLinkerPlugin -- PageLinkerPlugin +- PageLinkerPlugin List of plugins @@ -233,4 +233,4 @@ The inheritance algorithm is as follows: scalar types can be overwritten by each

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Wed Jan 10 23:55:33 2024 +0300
    Page content update date: Fri Jan 12 2024
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Fri Jan 12 18:53:16 2024 +0300
    Page content update date: Mon Jan 15 2024
    Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/02_parser/classes/PhpEntitiesCollection.md b/docs/tech/02_parser/classes/PhpEntitiesCollection.md index 1e313547..b6328938 100644 --- a/docs/tech/02_parser/classes/PhpEntitiesCollection.md +++ b/docs/tech/02_parser/classes/PhpEntitiesCollection.md @@ -104,6 +104,9 @@ final class PhpEntitiesCollection extends \BumbleDocGen\Core\Parser\Entity\Logga
  • remove - Remove an entity from a collection
  • +
  • + removeAllNotLoadedEntities +
  • toArray - Convert collection to array
  • @@ -1123,6 +1126,29 @@ public function remove(string $objectName): void; Return value: void + +
    +
    + + + +```php +// Implemented in BumbleDocGen\Core\Parser\Entity\RootEntityCollection + +public function removeAllNotLoadedEntities(): void; +``` + + + +Parameters: not specified + +Return value: void + +

    diff --git a/docs/tech/02_parser/classes/RootEntityCollection.md b/docs/tech/02_parser/classes/RootEntityCollection.md index a9a13e80..9c667f81 100644 --- a/docs/tech/02_parser/classes/RootEntityCollection.md +++ b/docs/tech/02_parser/classes/RootEntityCollection.md @@ -58,6 +58,9 @@ abstract class RootEntityCollection extends \BumbleDocGen\Core\Parser\Entity\Bas
  • remove - Remove an entity from a collection
  • +
  • + removeAllNotLoadedEntities +
  • toArray - Convert collection to array
  • @@ -484,6 +487,27 @@ public function remove(string $objectName): void; Return value: void +
    +
    +
    + + + +```php +public function removeAllNotLoadedEntities(): void; +``` + + + +Parameters: not specified + +Return value: void + +

    diff --git a/docs/tech/02_parser/entity.md b/docs/tech/02_parser/entity.md index 8f449b7c..5491e99f 100644 --- a/docs/tech/02_parser/entity.md +++ b/docs/tech/02_parser/entity.md @@ -144,4 +144,4 @@ These classes are a convenient wrapper for accessing data in templates:

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Wed Jan 10 23:55:33 2024 +0300
    Page content update date: Thu Jan 11 2024
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Wed Jan 10 23:55:33 2024 +0300
    Page content update date: Mon Jan 15 2024
    Made with Bumble Documentation Generator
    \ No newline at end of file diff --git a/docs/tech/02_parser/entityFilterCondition.md b/docs/tech/02_parser/entityFilterCondition.md index a5a626e8..c8dbf646 100644 --- a/docs/tech/02_parser/entityFilterCondition.md +++ b/docs/tech/02_parser/entityFilterCondition.md @@ -78,4 +78,4 @@ Filter condition for working with entities PHP language handler:

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Wed Jan 10 23:55:33 2024 +0300
    Page content update date: Thu Jan 11 2024
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Wed Jan 10 23:55:33 2024 +0300
    Page content update date: Mon Jan 15 2024
    Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/02_parser/readme.md b/docs/tech/02_parser/readme.md index 4aa9d87b..eb86f695 100644 --- a/docs/tech/02_parser/readme.md +++ b/docs/tech/02_parser/readme.md @@ -42,4 +42,4 @@ In this section, we show how the parser works and what components it consists of

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Wed Jan 10 23:55:33 2024 +0300
    Page content update date: Fri Jan 12 2024
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Wed Jan 10 23:55:33 2024 +0300
    Page content update date: Mon Jan 15 2024
    Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/02_parser/reflectionApi/php/classes/PhpEntitiesCollection.md b/docs/tech/02_parser/reflectionApi/php/classes/PhpEntitiesCollection.md index 318205f0..b1cf22c2 100644 --- a/docs/tech/02_parser/reflectionApi/php/classes/PhpEntitiesCollection.md +++ b/docs/tech/02_parser/reflectionApi/php/classes/PhpEntitiesCollection.md @@ -104,6 +104,9 @@ final class PhpEntitiesCollection extends \BumbleDocGen\Core\Parser\Entity\Logga
  • remove - Remove an entity from a collection
  • +
  • + removeAllNotLoadedEntities +
  • toArray - Convert collection to array
  • @@ -1123,6 +1126,29 @@ public function remove(string $objectName): void; Return value: void + +
    +
    + + + +```php +// Implemented in BumbleDocGen\Core\Parser\Entity\RootEntityCollection + +public function removeAllNotLoadedEntities(): void; +``` + + + +Parameters: not specified + +Return value: void + +

    diff --git a/docs/tech/02_parser/reflectionApi/php/phpClassConstantReflectionApi.md b/docs/tech/02_parser/reflectionApi/php/phpClassConstantReflectionApi.md index fb0cecd6..b90b25ed 100644 --- a/docs/tech/02_parser/reflectionApi/php/phpClassConstantReflectionApi.md +++ b/docs/tech/02_parser/reflectionApi/php/phpClassConstantReflectionApi.md @@ -47,4 +47,4 @@ $constantReflection = $classReflection->getConstant('constantName');

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Wed Jan 10 23:55:33 2024 +0300
    Page content update date: Thu Jan 11 2024
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Wed Jan 10 23:55:33 2024 +0300
    Page content update date: Mon Jan 15 2024
    Made with Bumble Documentation Generator
    \ No newline at end of file diff --git a/docs/tech/02_parser/reflectionApi/php/phpClassMethodReflectionApi.md b/docs/tech/02_parser/reflectionApi/php/phpClassMethodReflectionApi.md index a4ac91e8..a972c962 100644 --- a/docs/tech/02_parser/reflectionApi/php/phpClassMethodReflectionApi.md +++ b/docs/tech/02_parser/reflectionApi/php/phpClassMethodReflectionApi.md @@ -62,4 +62,4 @@ $methodReflection = $classReflection->getMethod('methodName');

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Wed Jan 10 23:55:33 2024 +0300
    Page content update date: Thu Jan 11 2024
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Wed Jan 10 23:55:33 2024 +0300
    Page content update date: Mon Jan 15 2024
    Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/02_parser/reflectionApi/php/phpClassPropertyReflectionApi.md b/docs/tech/02_parser/reflectionApi/php/phpClassPropertyReflectionApi.md index 0fd73fa8..a0dba3d1 100644 --- a/docs/tech/02_parser/reflectionApi/php/phpClassPropertyReflectionApi.md +++ b/docs/tech/02_parser/reflectionApi/php/phpClassPropertyReflectionApi.md @@ -53,4 +53,4 @@ $propertyReflection = $classReflection->getProperty('propertyName');

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Wed Jan 10 23:55:33 2024 +0300
    Page content update date: Thu Jan 11 2024
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Wed Jan 10 23:55:33 2024 +0300
    Page content update date: Mon Jan 15 2024
    Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/02_parser/reflectionApi/php/phpClassReflectionApi.md b/docs/tech/02_parser/reflectionApi/php/phpClassReflectionApi.md index f25aa036..77561997 100644 --- a/docs/tech/02_parser/reflectionApi/php/phpClassReflectionApi.md +++ b/docs/tech/02_parser/reflectionApi/php/phpClassReflectionApi.md @@ -86,4 +86,4 @@ $classReflection = $entitiesCollection->getLoadedOrCreateNew('SomeClassName'); /

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Wed Jan 10 23:55:33 2024 +0300
    Page content update date: Thu Jan 11 2024
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Wed Jan 10 23:55:33 2024 +0300
    Page content update date: Mon Jan 15 2024
    Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/02_parser/reflectionApi/php/phpEntitiesCollection.md b/docs/tech/02_parser/reflectionApi/php/phpEntitiesCollection.md index c06450df..8d8df162 100644 --- a/docs/tech/02_parser/reflectionApi/php/phpEntitiesCollection.md +++ b/docs/tech/02_parser/reflectionApi/php/phpEntitiesCollection.md @@ -25,4 +25,4 @@

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Wed Jan 10 23:55:33 2024 +0300
    Page content update date: Thu Jan 11 2024
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Wed Jan 10 23:55:33 2024 +0300
    Page content update date: Mon Jan 15 2024
    Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/02_parser/reflectionApi/php/phpEnumReflectionApi.md b/docs/tech/02_parser/reflectionApi/php/phpEnumReflectionApi.md index afa584e4..6084c478 100644 --- a/docs/tech/02_parser/reflectionApi/php/phpEnumReflectionApi.md +++ b/docs/tech/02_parser/reflectionApi/php/phpEnumReflectionApi.md @@ -85,4 +85,4 @@ $enumReflection = $entitiesCollection->getLoadedOrCreateNew('SomeEnumName'); //

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Wed Jan 10 23:55:33 2024 +0300
    Page content update date: Thu Jan 11 2024
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Wed Jan 10 23:55:33 2024 +0300
    Page content update date: Mon Jan 15 2024
    Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/02_parser/reflectionApi/php/phpInterfaceReflectionApi.md b/docs/tech/02_parser/reflectionApi/php/phpInterfaceReflectionApi.md index a0d551ff..8f6cd7f7 100644 --- a/docs/tech/02_parser/reflectionApi/php/phpInterfaceReflectionApi.md +++ b/docs/tech/02_parser/reflectionApi/php/phpInterfaceReflectionApi.md @@ -82,4 +82,4 @@ $interfaceReflection = $entitiesCollection->getLoadedOrCreateNew('SomeInterfaceN

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Wed Jan 10 23:55:33 2024 +0300
    Page content update date: Thu Jan 11 2024
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Wed Jan 10 23:55:33 2024 +0300
    Page content update date: Mon Jan 15 2024
    Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/02_parser/reflectionApi/php/phpTraitReflectionApi.md b/docs/tech/02_parser/reflectionApi/php/phpTraitReflectionApi.md index 0ff5faee..0d06f9b9 100644 --- a/docs/tech/02_parser/reflectionApi/php/phpTraitReflectionApi.md +++ b/docs/tech/02_parser/reflectionApi/php/phpTraitReflectionApi.md @@ -82,4 +82,4 @@ $traitReflection = $entitiesCollection->getLoadedOrCreateNew('SomeTraitName'); /

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Wed Jan 10 23:55:33 2024 +0300
    Page content update date: Thu Jan 11 2024
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Wed Jan 10 23:55:33 2024 +0300
    Page content update date: Mon Jan 15 2024
    Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/02_parser/reflectionApi/php/readme.md b/docs/tech/02_parser/reflectionApi/php/readme.md index 9cec2e3c..f489a1d3 100644 --- a/docs/tech/02_parser/reflectionApi/php/readme.md +++ b/docs/tech/02_parser/reflectionApi/php/readme.md @@ -88,4 +88,4 @@ $firstMethodReturnValue = $methodReflection->getFirstReturnValue();

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Wed Jan 10 23:55:33 2024 +0300
    Page content update date: Thu Jan 11 2024
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Wed Jan 10 23:55:33 2024 +0300
    Page content update date: Mon Jan 15 2024
    Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/02_parser/reflectionApi/readme.md b/docs/tech/02_parser/reflectionApi/readme.md index 507f3570..f30625e1 100644 --- a/docs/tech/02_parser/reflectionApi/readme.md +++ b/docs/tech/02_parser/reflectionApi/readme.md @@ -64,4 +64,4 @@ In addition, remove - Remove an entity from a collection +
  • + removeAllNotLoadedEntities +
  • toArray - Convert collection to array
  • @@ -1123,6 +1126,29 @@ public function remove(string $objectName): void; Return value: void + +
    +
    + + + +```php +// Implemented in BumbleDocGen\Core\Parser\Entity\RootEntityCollection + +public function removeAllNotLoadedEntities(): void; +``` + + + +Parameters: not specified + +Return value: void + +

    diff --git a/docs/tech/03_renderer/01_howToCreateTemplates/classes/RootEntityInterface.md b/docs/tech/03_renderer/01_howToCreateTemplates/classes/RootEntityInterface.md index ad4becaf..5a9d1055 100644 --- a/docs/tech/03_renderer/01_howToCreateTemplates/classes/RootEntityInterface.md +++ b/docs/tech/03_renderer/01_howToCreateTemplates/classes/RootEntityInterface.md @@ -255,7 +255,7 @@ public function getRelativeFileName(): null|string; See:

    diff --git a/docs/tech/03_renderer/01_howToCreateTemplates/frontMatter.md b/docs/tech/03_renderer/01_howToCreateTemplates/frontMatter.md index 81c21e9a..278c0591 100644 --- a/docs/tech/03_renderer/01_howToCreateTemplates/frontMatter.md +++ b/docs/tech/03_renderer/01_howToCreateTemplates/frontMatter.md @@ -23,3 +23,8 @@ By default, this block is hidden from generated MD files, but it can be displaye Some Front Matter block variables are used internally in our system, for example `title` and `prevPage` are used to generate breadcrumbs and documentation menus. This block is also used when generating HTML documentation. You can learn about the variables used in this block when generating HTML content [in the documentation of the library](https://daux.io/Features/Front_Matter.html) that we use to create HTML pages. + + +
    +
    +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Fri Jan 12 18:53:16 2024 +0300
    Page content update date: Mon Jan 15 2024
    Made with Bumble Documentation Generator
    \ No newline at end of file diff --git a/docs/tech/03_renderer/01_howToCreateTemplates/readme.md b/docs/tech/03_renderer/01_howToCreateTemplates/readme.md index 105fa9fb..95f8c7c0 100644 --- a/docs/tech/03_renderer/01_howToCreateTemplates/readme.md +++ b/docs/tech/03_renderer/01_howToCreateTemplates/readme.md @@ -103,4 +103,4 @@ Result after starting the documentation generation process:

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Thu Jan 11 00:14:41 2024 +0300
    Page content update date: Fri Jan 12 2024
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Thu Jan 11 00:14:41 2024 +0300
    Page content update date: Mon Jan 15 2024
    Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/03_renderer/01_howToCreateTemplates/templatesDynamicBlocks.md b/docs/tech/03_renderer/01_howToCreateTemplates/templatesDynamicBlocks.md index 057e7642..2af0eedd 100644 --- a/docs/tech/03_renderer/01_howToCreateTemplates/templatesDynamicBlocks.md +++ b/docs/tech/03_renderer/01_howToCreateTemplates/templatesDynamicBlocks.md @@ -26,4 +26,4 @@ You can use the built-in functions and filters or add your own, so you can imple

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Thu Jan 11 00:14:41 2024 +0300
    Page content update date: Thu Jan 11 2024
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Thu Jan 11 00:14:41 2024 +0300
    Page content update date: Mon Jan 15 2024
    Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/03_renderer/01_howToCreateTemplates/templatesLinking.md b/docs/tech/03_renderer/01_howToCreateTemplates/templatesLinking.md index 6f627399..70c54f40 100644 --- a/docs/tech/03_renderer/01_howToCreateTemplates/templatesLinking.md +++ b/docs/tech/03_renderer/01_howToCreateTemplates/templatesLinking.md @@ -38,4 +38,4 @@ You can also implement your own functions for relinking if necessary.

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Thu Jan 11 00:14:41 2024 +0300
    Page content update date: Thu Jan 11 2024
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Fri Jan 12 01:40:01 2024 +0300
    Page content update date: Mon Jan 15 2024
    Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/03_renderer/01_howToCreateTemplates/templatesVariables.md b/docs/tech/03_renderer/01_howToCreateTemplates/templatesVariables.md index cc8de8c3..b409bc19 100644 --- a/docs/tech/03_renderer/01_howToCreateTemplates/templatesVariables.md +++ b/docs/tech/03_renderer/01_howToCreateTemplates/templatesVariables.md @@ -13,4 +13,4 @@ There are several variables available in each processed template.

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Thu Jan 11 00:14:41 2024 +0300
    Page content update date: Fri Jan 12 2024
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Fri Jan 12 18:53:16 2024 +0300
    Page content update date: Mon Jan 15 2024
    Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/03_renderer/02_breadcrumbs.md b/docs/tech/03_renderer/02_breadcrumbs.md index 483d4c58..4af6af8e 100644 --- a/docs/tech/03_renderer/02_breadcrumbs.md +++ b/docs/tech/03_renderer/02_breadcrumbs.md @@ -28,7 +28,7 @@ In this way, complex documentation structures can be created with less file nest

    Displaying breadcrumbs in documents

    -There is a built-in function to generate breadcrumbs in templates GeneratePageBreadcrumbs. +There is a built-in function to generate breadcrumbs in templates GeneratePageBreadcrumbs. Here is how it is used in twig templates: ```twig @@ -55,4 +55,4 @@ Here is an example of the result of the `generatePageBreadcrumbs` function:

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Wed Jan 10 23:55:33 2024 +0300
    Page content update date: Fri Jan 12 2024
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Fri Jan 12 18:53:16 2024 +0300
    Page content update date: Mon Jan 15 2024
    Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/03_renderer/03_documentStructure.md b/docs/tech/03_renderer/03_documentStructure.md index 2b0d50f4..b8d84d88 100644 --- a/docs/tech/03_renderer/03_documentStructure.md +++ b/docs/tech/03_renderer/03_documentStructure.md @@ -19,4 +19,4 @@ plugins:

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Wed Jan 10 23:55:33 2024 +0300
    Page content update date: Thu Jan 11 2024
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Wed Jan 10 23:55:33 2024 +0300
    Page content update date: Mon Jan 15 2024
    Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/03_renderer/04_twigCustomFilters.md b/docs/tech/03_renderer/04_twigCustomFilters.md index 86b04be5..84d544ee 100644 --- a/docs/tech/03_renderer/04_twigCustomFilters.md +++ b/docs/tech/03_renderer/04_twigCustomFilters.md @@ -274,4 +274,4 @@ Here is a list of filters available by default:

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Wed Jan 10 23:55:33 2024 +0300
    Page content update date: Thu Jan 11 2024
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Wed Jan 10 23:55:33 2024 +0300
    Page content update date: Mon Jan 15 2024
    Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/03_renderer/05_twigCustomFunctions.md b/docs/tech/03_renderer/05_twigCustomFunctions.md index 9ab207e0..b3449148 100644 --- a/docs/tech/03_renderer/05_twigCustomFunctions.md +++ b/docs/tech/03_renderer/05_twigCustomFunctions.md @@ -401,4 +401,4 @@ Here is a list of functions available by default:

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Wed Jan 10 23:55:33 2024 +0300
    Page content update date: Thu Jan 11 2024
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Wed Jan 10 23:55:33 2024 +0300
    Page content update date: Mon Jan 15 2024
    Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/03_renderer/classes/PhpEntitiesCollection.md b/docs/tech/03_renderer/classes/PhpEntitiesCollection.md index 33feca07..da8bcd02 100644 --- a/docs/tech/03_renderer/classes/PhpEntitiesCollection.md +++ b/docs/tech/03_renderer/classes/PhpEntitiesCollection.md @@ -104,6 +104,9 @@ final class PhpEntitiesCollection extends \BumbleDocGen\Core\Parser\Entity\Logga
  • remove - Remove an entity from a collection
  • +
  • + removeAllNotLoadedEntities +
  • toArray - Convert collection to array
  • @@ -1123,6 +1126,29 @@ public function remove(string $objectName): void; Return value: void + +
    +
    + + + +```php +// Implemented in BumbleDocGen\Core\Parser\Entity\RootEntityCollection + +public function removeAllNotLoadedEntities(): void; +``` + + + +Parameters: not specified + +Return value: void + +

    diff --git a/docs/tech/03_renderer/classes/RootEntityCollection.md b/docs/tech/03_renderer/classes/RootEntityCollection.md index 2f441a5f..2ba67046 100644 --- a/docs/tech/03_renderer/classes/RootEntityCollection.md +++ b/docs/tech/03_renderer/classes/RootEntityCollection.md @@ -58,6 +58,9 @@ abstract class RootEntityCollection extends \BumbleDocGen\Core\Parser\Entity\Bas
  • remove - Remove an entity from a collection
  • +
  • + removeAllNotLoadedEntities +
  • toArray - Convert collection to array
  • @@ -484,6 +487,27 @@ public function remove(string $objectName): void; Return value: void +
    +
    +
    + + + +```php +public function removeAllNotLoadedEntities(): void; +``` + + + +Parameters: not specified + +Return value: void + +

    diff --git a/docs/tech/03_renderer/readme.md b/docs/tech/03_renderer/readme.md index c7f777f4..63222f4f 100644 --- a/docs/tech/03_renderer/readme.md +++ b/docs/tech/03_renderer/readme.md @@ -60,4 +60,4 @@ This process is presented in the form of a diagram below.

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Wed Jan 10 23:55:33 2024 +0300
    Page content update date: Fri Jan 12 2024
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Fri Jan 12 18:53:16 2024 +0300
    Page content update date: Mon Jan 15 2024
    Made with Bumble Documentation Generator
    \ No newline at end of file diff --git a/docs/tech/04_pluginSystem.md b/docs/tech/04_pluginSystem.md index f0cd8ed6..d9276374 100644 --- a/docs/tech/04_pluginSystem.md +++ b/docs/tech/04_pluginSystem.md @@ -205,4 +205,4 @@ plugins:

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Wed Jan 10 23:55:33 2024 +0300
    Page content update date: Thu Jan 11 2024
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Wed Jan 10 23:55:33 2024 +0300
    Page content update date: Mon Jan 15 2024
    Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/05_console.md b/docs/tech/05_console.md index 6edb83a7..bcc4148b 100644 --- a/docs/tech/05_console.md +++ b/docs/tech/05_console.md @@ -64,4 +64,4 @@ After adding a new command to the configuration, it will be available in the app

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Thu Jan 11 13:50:48 2024 +0300
    Page content update date: Thu Jan 11 2024
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Thu Jan 11 13:50:48 2024 +0300
    Page content update date: Mon Jan 15 2024
    Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/06_debugging.md b/docs/tech/06_debugging.md index 96f37a4b..7fa6640b 100644 --- a/docs/tech/06_debugging.md +++ b/docs/tech/06_debugging.md @@ -22,4 +22,4 @@ Our tool provides several options for debugging documentation.

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Fri Jan 12 01:11:04 2024 +0300
    Page content update date: Thu Jan 11 2024
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Fri Jan 12 01:11:04 2024 +0300
    Page content update date: Mon Jan 15 2024
    Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/07_outputFormat.md b/docs/tech/07_outputFormat.md index db6cabb8..c36f6c2b 100644 --- a/docs/tech/07_outputFormat.md +++ b/docs/tech/07_outputFormat.md @@ -37,4 +37,4 @@ However, it is possible to create other files with some restrictions.

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Fri Jan 12 18:53:16 2024 +0300
    Page content update date: Fri Jan 12 2024
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Fri Jan 12 18:54:20 2024 +0300
    Page content update date: Mon Jan 15 2024
    Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/classes/DocGenerator.md b/docs/tech/classes/DocGenerator.md index 5caecd97..9fb2b361 100644 --- a/docs/tech/classes/DocGenerator.md +++ b/docs/tech/classes/DocGenerator.md @@ -1,7 +1,7 @@ BumbleDocGen / Technical description of the project / Output formats / DocGenerator

    - DocGenerator class: + DocGenerator class:

    @@ -66,11 +66,11 @@ final class DocGenerator @@ -85,11 +85,11 @@ final class DocGenerator ```php -public function __construct(\Symfony\Component\Console\Style\OutputStyle $io, \BumbleDocGen\Core\Configuration\Configuration $configuration, \BumbleDocGen\Core\Plugin\PluginEventDispatcher $pluginEventDispatcher, \BumbleDocGen\Core\Parser\ProjectParser $parser, \BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper $parserHelper, \BumbleDocGen\Core\Renderer\Renderer $renderer, \BumbleDocGen\Core\Logger\Handler\GenerationErrorsHandler $generationErrorsHandler, \BumbleDocGen\Core\Parser\Entity\RootEntityCollectionsGroup $rootEntityCollectionsGroup, \BumbleDocGen\Console\ProgressBar\ProgressBarFactory $progressBarFactory, \DI\Container $diContainer, \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache $localObjectCache, \Monolog\Logger $logger); +public function __construct(\Symfony\Component\Console\Style\OutputStyle $io, \BumbleDocGen\Core\Configuration\Configuration $configuration, \BumbleDocGen\Core\Plugin\PluginEventDispatcher $pluginEventDispatcher, \BumbleDocGen\Core\Parser\ProjectParser $parser, \BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper $parserHelper, \BumbleDocGen\Core\Renderer\Renderer $renderer, \BumbleDocGen\Core\Logger\Handler\GenerationErrorsHandler $generationErrorsHandler, \BumbleDocGen\Core\Parser\Entity\RootEntityCollectionsGroup $rootEntityCollectionsGroup, \BumbleDocGen\Console\ProgressBar\ProgressBarFactory $progressBarFactory, \DI\Container $diContainer, \BumbleDocGen\Core\Cache\SharedCompressedDocumentFileCache $sharedCompressedDocumentFileCache, \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache $localObjectCache, \Monolog\Logger $logger); ``` @@ -154,6 +154,11 @@ public function __construct(\Symfony\Component\Console\Style\OutputStyle $io, \B $diContainer \DI\Container - + + + $sharedCompressedDocumentFileCache + \BumbleDocGen\Core\Cache\SharedCompressedDocumentFileCache + - $localObjectCache @@ -190,7 +195,7 @@ public function __construct(\Symfony\Component\Console\Style\OutputStyle $io, \B ```php @@ -244,7 +249,7 @@ public function addDocBlocks(\BumbleDocGen\AI\ProviderInterface $aiProvider): vo ```php @@ -295,7 +300,7 @@ public function addPlugin(\BumbleDocGen\Core\Plugin\PluginInterface|string $plug ```php @@ -326,7 +331,7 @@ public function generate(): void; ```php @@ -377,7 +382,7 @@ public function generateReadmeTemplate(\BumbleDocGen\AI\ProviderInterface $aiPro ```php @@ -398,7 +403,7 @@ public function getConfiguration(): \BumbleDocGen\Core\Configuration\Configurati ```php @@ -449,7 +454,7 @@ public function getConfigurationKey(string $key): void; ```php @@ -483,7 +488,7 @@ public function getConfigurationKeys(): void; ```php @@ -517,7 +522,7 @@ public function parseAndGetRootEntityCollectionsGroup(): \BumbleDocGen\Core\Pars ```php diff --git a/docs/tech/readme.md b/docs/tech/readme.md index bb6bbcc7..48729cc9 100644 --- a/docs/tech/readme.md +++ b/docs/tech/readme.md @@ -44,4 +44,4 @@ After that, the process of parsing the project code according to the configurati

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Dec 23 23:00:37 2023 +0300
    Page content update date: Fri Jan 12 2024
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Dec 23 23:00:37 2023 +0300
    Page content update date: Mon Jan 15 2024
    Made with Bumble Documentation Generator \ No newline at end of file From 317410cd75e1ca232efdbe47de264a291e3158b8 Mon Sep 17 00:00:00 2001 From: Sean McNamara Date: Fri, 5 Apr 2024 11:17:26 +0100 Subject: [PATCH 206/210] Changelog for 2.0.0 --- CHANGELOG.md | 50 +++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 43 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 881774b7..2ec3ec6b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,15 +1,51 @@ # Changelog -# [1.6.0](https://github.com/bumble-tech/bumble-doc-gen/releases/tag/v1.6.0) +## [2.0.0](https://github.com/bumble-tech/bumble-doc-gen/releases/tag/v1.6.0) +### Features +- Adds the ability to generate HTML documentation + live mode for previewing changes. + +### Breaking Changes +- ⚠️ Minimum PHP version is now 8.1 +- ⚠️ Changes when working with templates: + - Variable `phpClassEntityCollection` renamed to `phpEntities` + - Instead of variables in the template with title and previous page, the Front Matter block is used +- ⚠️ PHP ReflectionAPI has been completely changed. See information about the current version here: [ReflectionAPI](https://github.com/bumble-tech/bumble-doc-gen/tree/master/docs/tech/2.parser/reflectionApi) +- The BetterReflection library and classes that depend on it in the code have been removed: + - `\BumbleDocGen\Core\Cache\SourceLocatorCacheItemPool` + - `\BumbleDocGen\Core\Plugin\Event\Parser\OnLoadSourceLocatorsCollection` + - `\BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException` + - `\BumbleDocGen\LanguageHandler\Php\Parser\Entity\Reflection\ReflectorWrapper` + - `\BumbleDocGen\LanguageHandler\Php\Parser\SourceLocator\AsyncSourceLocator` + - `\BumbleDocGen\LanguageHandler\Php\Parser\SourceLocator\CustomSourceLocatorInterface` + - `\BumbleDocGen\LanguageHandler\Php\Parser\SourceLocator\Internal\CachedSourceLocator` + - `\BumbleDocGen\LanguageHandler\Php\Parser\SourceLocator\Internal\SystemAsyncSourceLocator` +- Class `\BumbleDocGen\LanguageHandler\Php\Parser\ComposerParser` renamed to `\BumbleDocGen\LanguageHandler\Php\Parser\ComposerHelper` +- Doc block parsing has been removed: + - `\Roave\BetterReflection\Reflection\ReflectionMethod::getDocBlockReturnTypes()` + - `\Roave\BetterReflection\Reflection\ReflectionFunction::getDocBlockReturnTypes()` + - `\Roave\BetterReflection\Reflection\ReflectionParameter::getDocBlockTypes()` + - `\Roave\BetterReflection\Reflection\ReflectionParameter::getDocBlockTypeStrings()` + - `\Roave\BetterReflection\Reflection\ReflectionProperty::getDocBlockTypes()` + - `\Roave\BetterReflection\Reflection\ReflectionProperty::getDocBlockTypeStrings()` +- Method `\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity::hasAnnotationKey()` has been removed. +- Method `\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity::getExtends()` has been removed. +- Method `\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity::getInterfacesString()` has been removed. +- Now documentation for built classes does not load automatically +- Removed the `async_source_loading_enabled` configuration option (Method `\BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings::asyncSourceLoadingEnabled()`) +- Class `\BumbleDocGen\LanguageHandler\Php\Plugin\Event\Entity\AfterLoadingClassEntityCollection` has been removed. Use `\BumbleDocGen\LanguageHandler\Php\Plugin\Event\Entity\AfterLoadingPhpEntitiesCollection` instead. +- Class `\BumbleDocGen\LanguageHandler\Php\Plugin\Event\Entity\OnCheckIsClassEntityCanBeLoad` has been removed. Use `\BumbleDocGen\LanguageHandler\Php\Plugin\Event\Entity\OnCheckIsEntityCanBeLoaded` +- Method `\BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings::getComposerInstalledFile()` renamed to `\BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings::getComposerVendorDir()` + +## [1.6.0](https://github.com/bumble-tech/bumble-doc-gen/releases/tag/v1.6.0) - Updating composer scripts [#66](https://github.com/bumble-tech/bumble-doc-gen/pull/66) - Configuration console command [#54](https://github.com/bumble-tech/bumble-doc-gen/pull/54) -# [1.5.0](https://github.com/bumble-tech/bumble-doc-gen/releases/tag/v1.5.0) +## [1.5.0](https://github.com/bumble-tech/bumble-doc-gen/releases/tag/v1.5.0) - Caching system refactoring [#62](https://github.com/bumble-tech/bumble-doc-gen/pull/62) - Ai refactor [#61](https://github.com/bumble-tech/bumble-doc-gen/pull/61) - Optimization of the caching and error handling [#63](https://github.com/bumble-tech/bumble-doc-gen/pull/63) - Fixing generation problems [#64](https://github.com/bumble-tech/bumble-doc-gen/pull/64) -# [1.4.0](https://github.com/bumble-tech/bumble-doc-gen/releases/tag/v1.4.0) +## [1.4.0](https://github.com/bumble-tech/bumble-doc-gen/releases/tag/v1.4.0) - Fixed config errors [#52](https://github.com/bumble-tech/bumble-doc-gen/pull/52) - Fixed method type getter bug [#53](https://github.com/bumble-tech/bumble-doc-gen/pull/53) - Changed errors output [#55](https://github.com/bumble-tech/bumble-doc-gen/pull/55) @@ -18,14 +54,14 @@ - Changed default plugins list [#57](https://github.com/bumble-tech/bumble-doc-gen/pull/57) - Fixed link finder errors [#59](https://github.com/bumble-tech/bumble-doc-gen/pull/59) -# [1.3.0](https://github.com/bumble-tech/bumble-doc-gen/releases/tag/v1.3.0) +## [1.3.0](https://github.com/bumble-tech/bumble-doc-gen/releases/tag/v1.3.0) - Add Unit Tests for BumbleDocGen\Core\Configuration\ValueTransformer [#45](https://github.com/bumble-tech/bumble-doc-gen/pull/45) - Add Unit Tests for ValueResolver Namespace [#47](https://github.com/bumble-tech/bumble-doc-gen/pull/47) - Adding entity doc generation modes [#46](https://github.com/bumble-tech/bumble-doc-gen/pull/46) - Adding new filter condition [#50](https://github.com/bumble-tech/bumble-doc-gen/pull/50) - Removing empty doc dirs [#49](https://github.com/bumble-tech/bumble-doc-gen/pull/49) -# [1.2.0](https://github.com/bumble-tech/bumble-doc-gen/releases/tag/v1.2.0) +## [1.2.0](https://github.com/bumble-tech/bumble-doc-gen/releases/tag/v1.2.0) - Fixing contributing rules [#9](https://github.com/bumble-tech/bumble-doc-gen/pull/9) - Adds issue templates for Bug reports & feature requests [#13](https://github.com/bumble-tech/bumble-doc-gen/pull/13) - Adds Code of Conduct & PR template [#15](https://github.com/bumble-tech/bumble-doc-gen/pull/15) @@ -39,10 +75,10 @@ - Removing ocramius proxy manager [#37](https://github.com/bumble-tech/bumble-doc-gen/pull/37) - Use shared cache option [#38](https://github.com/bumble-tech/bumble-doc-gen/pull/38) -# [1.1.0](https://github.com/bumble-tech/bumble-doc-gen/releases/tag/v1.1.0) +## [1.1.0](https://github.com/bumble-tech/bumble-doc-gen/releases/tag/v1.1.0) - Implementation of the ability to add custom commands to a standard console application [#4](https://github.com/bumble-tech/bumble-doc-gen/pull/4) - Fixing console app bugs [#5](https://github.com/bumble-tech/bumble-doc-gen/pull/5) - Adding new console commands [#6](https://github.com/bumble-tech/bumble-doc-gen/pull/6) -# [1.0.0](https://github.com/bumble-tech/bumble-doc-gen/releases/tag/v1.0.0) +## [1.0.0](https://github.com/bumble-tech/bumble-doc-gen/releases/tag/v1.0.0) - First public version of documentation generator. From fe8210479917e2aee143ba596ec844940848da7b Mon Sep 17 00:00:00 2001 From: Sean McNamara Date: Fri, 5 Apr 2024 11:17:41 +0100 Subject: [PATCH 207/210] Update security policy for 2.0.x --- SECURITY.md | 41 ++++++++++++++++++++++++++--------------- 1 file changed, 26 insertions(+), 15 deletions(-) diff --git a/SECURITY.md b/SECURITY.md index dc3abb25..06fe4ce3 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -1,28 +1,37 @@ # Security Policy -Your security is of utmost importance to us. This document outlines our commitment to ensuring that our software remains secure, how we handle vulnerabilities, and what you can do if you find one. +Your security is of utmost importance to us. This document outlines our commitment to ensuring that our software remains +secure, how we handle vulnerabilities, and what you can do if you find one. ## Supported Versions -Security updates will be applied to certain versions of our software. Please refer to the table below to understand which versions are currently supported for security patches. +Security updates will be applied to certain versions of our software. Please refer to the table below to understand +which versions are currently supported for security patches. | Version | Supported | Notes | |---------|--------------------|----------------------------------------| -| 1.6.x | :white_check_mark: | Current version, fully supported. | -| 1.5.x | :x: | Not supported, please upgrade to 1.6.x | -| 1.4.x | :x: | Not supported, please upgrade to 1.6.x | -| 1.3.x | :x: | Not supported, please upgrade to 1.6.x | -| 1.2.x | :x: | Not supported, please upgrade to 1.6.x | -| 1.1.x | :x: | Not supported, please upgrade to 1.6.x | -| 1.0.x | :x: | Not supported, please upgrade to 1.6.x | +| 2.0.x | :white_check_mark: | Current version, fully supported. | +| 1.6.x | :x: | Not supported, please upgrade to 2.0.x | +| 1.5.x | :x: | Not supported, please upgrade to 2.0.x | +| 1.4.x | :x: | Not supported, please upgrade to 2.0.x | +| 1.3.x | :x: | Not supported, please upgrade to 2.0.x | +| 1.2.x | :x: | Not supported, please upgrade to 2.0.x | +| 1.1.x | :x: | Not supported, please upgrade to 2.0.x | +| 1.0.x | :x: | Not supported, please upgrade to 2.0.x | ## Reporting a Vulnerability -We appreciate the effort of security researchers and the general public in helping us maintain the security of our software. Here’s how you can report a vulnerability: +We appreciate the effort of security researchers and the general public in helping us maintain the security of our +software. Here’s how you can report a vulnerability: -1. **Creating an Issue**: Visit our GitHub repository and [create an issue](https://github.com/bumble-tech/bumble-doc-gen/issues) detailing the vulnerability. Please label the issue as "security" for quicker identification. -2. **Details Matter**: When reporting, please provide as much detail as possible. This includes steps to reproduce, potential impact, and any other information that might help us understand the severity and nature of the vulnerability. -3. **Stay Responsible**: Avoid disclosing public details about the vulnerability until we've had a chance to address it. This ensures that our users remain protected. +1. **Creating an Issue**: Visit our GitHub repository + and [create an issue](https://github.com/bumble-tech/bumble-doc-gen/issues) detailing the vulnerability. Please label + the issue as "security" for quicker identification. +2. **Details Matter**: When reporting, please provide as much detail as possible. This includes steps to reproduce, + potential impact, and any other information that might help us understand the severity and nature of the + vulnerability. +3. **Stay Responsible**: Avoid disclosing public details about the vulnerability until we've had a chance to address it. + This ensures that our users remain protected. ## Our Commitment @@ -31,7 +40,8 @@ Upon receiving a security vulnerability report: 1. We will confirm the receipt of the report and begin an initial assessment. 2. We will work to verify the vulnerability and ascertain its potential impact. 3. If required, we will release patches for the affected versions. -4. We will recognize your efforts in our changelog and other public communications, unless you prefer to remain anonymous. +4. We will recognize your efforts in our changelog and other public communications, unless you prefer to remain + anonymous. ## Further Recommendations @@ -43,4 +53,5 @@ We recommend all users to: --- -Your security is a collaborative effort, and we are grateful for your trust and participation in keeping our library safe and reliable. +Your security is a collaborative effort, and we are grateful for your trust and participation in keeping our library +safe and reliable. From 09782d2f0a9c11a34133a4f0c9aece0a026f9d96 Mon Sep 17 00:00:00 2001 From: Sean McNamara Date: Fri, 5 Apr 2024 11:34:43 +0100 Subject: [PATCH 208/210] Add frontmatter to feature list of changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2ec3ec6b..e77775df 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ ## [2.0.0](https://github.com/bumble-tech/bumble-doc-gen/releases/tag/v1.6.0) ### Features - Adds the ability to generate HTML documentation + live mode for previewing changes. +- Templates now use Frontmatter instead of variables ### Breaking Changes - ⚠️ Minimum PHP version is now 8.1 From e6c59c68c73da382d6c3eaa4cb2ea30c2aa8341d Mon Sep 17 00:00:00 2001 From: Sean McNamara Date: Fri, 5 Apr 2024 12:55:30 +0100 Subject: [PATCH 209/210] Updates GitHub build to use PHP 8.1 --- .github/workflows/php.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/php.yml b/.github/workflows/php.yml index 7b7789ae..40d0be42 100644 --- a/.github/workflows/php.yml +++ b/.github/workflows/php.yml @@ -4,7 +4,7 @@ on: push: branches: [ "master"] pull_request: - branches: [ "1.x.x" ] + branches: [ "1.x.x", "2.x.x" ] permissions: contents: read @@ -18,7 +18,7 @@ jobs: - name: Setup PHP uses: shivammathur/setup-php@v2 with: - php-version: 8.0 + php-version: 8.1 - name: Validate composer.json and composer.lock run: composer validate --strict From 472597e9c23c75b88b0a7aaf28905c5bd30cd0f7 Mon Sep 17 00:00:00 2001 From: Sean McNamara Date: Wed, 8 May 2024 16:17:42 +0100 Subject: [PATCH 210/210] Update to demo 1 config --- demo/demo1/demo-config.yaml | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/demo/demo1/demo-config.yaml b/demo/demo1/demo-config.yaml index 8a6c865e..c9e06eed 100644 --- a/demo/demo1/demo-config.yaml +++ b/demo/demo1/demo-config.yaml @@ -1,7 +1,7 @@ -project_root: '%WORKING_DIR%/vendor/doctrine' +project_root: '%WORKING_DIR%' templates_dir: '%WORKING_DIR%/demo/demo1/templates' -cache_dir: '%WORKING_DIR%/demo/demo1/__cache' output_dir: "%WORKING_DIR%/demo/demo1/docs" +cache_dir: '%WORKING_DIR%/demo/demo1/__cache' output_dir_base_url: "/demo/demo1/docs" check_file_in_git_before_creating_doc: false language_handlers: @@ -13,4 +13,6 @@ source_locators: - class: \BumbleDocGen\Core\Parser\SourceLocator\RecursiveDirectoriesSourceLocator arguments: directories: - - "%project_root%" \ No newline at end of file + - "%project_root%/src" + - "%project_root%/demo/demo1/docs" + - "%project_root%/vendor/doctrine"