mirror of
https://github.com/rectorphp/rector.git
synced 2024-06-05 02:40:50 +00:00
72 lines
2.0 KiB
PHP
72 lines
2.0 KiB
PHP
<?php declare(strict_types=1);
|
|
|
|
namespace Rector\NodeVisitor\DependencyInjection\NamedServicesToConstructor;
|
|
|
|
use PhpParser\Node;
|
|
use PhpParser\Node\Stmt\Class_;
|
|
use PhpParser\NodeVisitorAbstract;
|
|
use Rector\Builder\Class_\ClassPropertyCollector;
|
|
use Rector\Builder\ConstructorMethodBuilder;
|
|
use Rector\Builder\PropertyBuilder;
|
|
|
|
/**
|
|
* Add new propertis to class and to contructor.
|
|
*/
|
|
final class AddPropertiesToClassNodeVisitor extends NodeVisitorAbstract
|
|
{
|
|
/**
|
|
* @var ConstructorMethodBuilder
|
|
*/
|
|
private $constructorMethodBuilder;
|
|
|
|
/**
|
|
* @var PropertyBuilder
|
|
*/
|
|
private $propertyBuilder;
|
|
|
|
/**
|
|
* @var string
|
|
*/
|
|
private $className;
|
|
|
|
/**
|
|
* @var ClassPropertyCollector
|
|
*/
|
|
private $newClassPropertyCollector;
|
|
|
|
public function __construct(
|
|
ConstructorMethodBuilder $constructorMethodBuilder,
|
|
PropertyBuilder $propertyBuilder,
|
|
ClassPropertyCollector $newClassPropertyCollector
|
|
) {
|
|
$this->constructorMethodBuilder = $constructorMethodBuilder;
|
|
$this->propertyBuilder = $propertyBuilder;
|
|
$this->newClassPropertyCollector = $newClassPropertyCollector;
|
|
}
|
|
|
|
/**
|
|
* @param Node[] $nodes
|
|
* @return Node[]
|
|
*/
|
|
public function afterTraverse(array $nodes): array
|
|
{
|
|
foreach ($nodes as $node) {
|
|
if ($node instanceof Class_) {
|
|
$this->className = (string) $node->name;
|
|
$this->reconstruct($node);
|
|
}
|
|
}
|
|
|
|
return $nodes;
|
|
}
|
|
|
|
private function reconstruct(Class_ $classNode): void
|
|
{
|
|
$propertiesForClass = $this->newClassPropertyCollector->getPropertiesforClass($this->className);
|
|
foreach ($propertiesForClass as $propertyType => $propertyName) {
|
|
$this->constructorMethodBuilder->addPropertyAssignToClass($classNode, $propertyType, $propertyName);
|
|
$this->propertyBuilder->addPropertyToClass($classNode, $propertyType, $propertyName);
|
|
}
|
|
}
|
|
}
|