rector/vendor/rector/rector-doctrine/rules/CodeQuality/AnnotationTransformer/YamlToAnnotationTransformer.php
Tomas Votruba 12e1b38e32 Updated Rector to commit df8d2b78edd46542e6426fec606c3ea98d712532
df8d2b78ed Copy subtype phpdoc on ClassPropertyAssignToConstructorPromotionRector (#8438) (#5603)
2024-02-11 23:33:46 +00:00

77 lines
3.2 KiB
PHP

<?php
declare (strict_types=1);
namespace Rector\Doctrine\CodeQuality\AnnotationTransformer;
use PhpParser\Node\Stmt\Class_;
use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory;
use Rector\Comments\NodeDocBlock\DocBlockUpdater;
use Rector\Doctrine\CodeQuality\Contract\ClassAnnotationTransformerInterface;
use Rector\Doctrine\CodeQuality\Contract\PropertyAnnotationTransformerInterface;
use Rector\Doctrine\CodeQuality\ValueObject\EntityMapping;
final class YamlToAnnotationTransformer
{
/**
* @var ClassAnnotationTransformerInterface[]
* @readonly
*/
private $classAnnotationTransformers;
/**
* @var PropertyAnnotationTransformerInterface[]
* @readonly
*/
private $propertyAnnotationTransformers;
/**
* @readonly
* @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory
*/
private $phpDocInfoFactory;
/**
* @readonly
* @var \Rector\Comments\NodeDocBlock\DocBlockUpdater
*/
private $docBlockUpdater;
/**
* @param ClassAnnotationTransformerInterface[] $classAnnotationTransformers
* @param PropertyAnnotationTransformerInterface[] $propertyAnnotationTransformers
*/
public function __construct(iterable $classAnnotationTransformers, iterable $propertyAnnotationTransformers, PhpDocInfoFactory $phpDocInfoFactory, DocBlockUpdater $docBlockUpdater)
{
$this->classAnnotationTransformers = $classAnnotationTransformers;
$this->propertyAnnotationTransformers = $propertyAnnotationTransformers;
$this->phpDocInfoFactory = $phpDocInfoFactory;
$this->docBlockUpdater = $docBlockUpdater;
}
public function transform(Class_ $class, EntityMapping $entityMapping) : void
{
$this->transformClass($class, $entityMapping);
$this->transformProperties($class, $entityMapping);
}
private function transformClass(Class_ $class, EntityMapping $entityMapping) : void
{
$classPhpDocInfo = $this->phpDocInfoFactory->createFromNodeOrEmpty($class);
foreach ($this->classAnnotationTransformers as $classAnnotationTransformer) {
// already added
if ($classPhpDocInfo->hasByAnnotationClass($classAnnotationTransformer->getClassName())) {
continue;
}
$classAnnotationTransformer->transform($entityMapping, $classPhpDocInfo);
}
$this->docBlockUpdater->updateRefactoredNodeWithPhpDocInfo($class);
}
private function transformProperties(Class_ $class, EntityMapping $entityMapping) : void
{
foreach ($class->getProperties() as $property) {
$propertyPhpDocInfo = $this->phpDocInfoFactory->createFromNodeOrEmpty($property);
foreach ($this->propertyAnnotationTransformers as $propertyAnnotationTransformer) {
// already added
if ($propertyPhpDocInfo->hasByAnnotationClass($propertyAnnotationTransformer->getClassName())) {
continue;
}
$propertyAnnotationTransformer->transform($entityMapping, $propertyPhpDocInfo, $property);
}
$this->docBlockUpdater->updateRefactoredNodeWithPhpDocInfo($property);
}
}
}