2021-02-09 00:42:47 +01:00
|
|
|
<?php
|
|
|
|
|
2021-05-09 20:15:43 +00:00
|
|
|
declare (strict_types=1);
|
2021-02-09 00:42:47 +01:00
|
|
|
namespace Rector\PostRector\DependencyInjection;
|
|
|
|
|
|
|
|
use PhpParser\Node\Stmt\Class_;
|
|
|
|
use PhpParser\Node\Stmt\Property;
|
|
|
|
use PHPStan\Type\ObjectType;
|
|
|
|
use PHPStan\Type\Type;
|
|
|
|
use PHPStan\Type\UnionType;
|
|
|
|
use Rector\ChangesReporting\Collector\RectorChangeCollector;
|
|
|
|
use Rector\Naming\Naming\PropertyNaming;
|
|
|
|
use Rector\NodeNameResolver\NodeNameResolver;
|
|
|
|
use Rector\NodeTypeResolver\Node\AttributeKey;
|
|
|
|
use Rector\NodeTypeResolver\NodeTypeResolver;
|
|
|
|
use Rector\PostRector\Collector\PropertyToAddCollector;
|
|
|
|
final class PropertyAdder
|
|
|
|
{
|
|
|
|
/**
|
2021-05-10 23:39:21 +00:00
|
|
|
* @var \Rector\NodeTypeResolver\NodeTypeResolver
|
2021-02-09 00:42:47 +01:00
|
|
|
*/
|
|
|
|
private $nodeTypeResolver;
|
|
|
|
/**
|
2021-05-10 23:39:21 +00:00
|
|
|
* @var \Rector\NodeNameResolver\NodeNameResolver
|
2021-02-09 00:42:47 +01:00
|
|
|
*/
|
|
|
|
private $nodeNameResolver;
|
|
|
|
/**
|
2021-05-10 23:39:21 +00:00
|
|
|
* @var \Rector\PostRector\Collector\PropertyToAddCollector
|
2021-02-09 00:42:47 +01:00
|
|
|
*/
|
|
|
|
private $propertyToAddCollector;
|
|
|
|
/**
|
2021-05-10 23:39:21 +00:00
|
|
|
* @var \Rector\ChangesReporting\Collector\RectorChangeCollector
|
2021-02-09 00:42:47 +01:00
|
|
|
*/
|
|
|
|
private $rectorChangeCollector;
|
|
|
|
/**
|
2021-05-10 23:39:21 +00:00
|
|
|
* @var \Rector\Naming\Naming\PropertyNaming
|
2021-02-09 00:42:47 +01:00
|
|
|
*/
|
|
|
|
private $propertyNaming;
|
2021-05-10 22:23:08 +00:00
|
|
|
public function __construct(\Rector\NodeTypeResolver\NodeTypeResolver $nodeTypeResolver, \Rector\NodeNameResolver\NodeNameResolver $nodeNameResolver, \Rector\PostRector\Collector\PropertyToAddCollector $propertyToAddCollector, \Rector\ChangesReporting\Collector\RectorChangeCollector $rectorChangeCollector, \Rector\Naming\Naming\PropertyNaming $propertyNaming)
|
2021-05-09 20:15:43 +00:00
|
|
|
{
|
2021-02-09 00:42:47 +01:00
|
|
|
$this->nodeTypeResolver = $nodeTypeResolver;
|
|
|
|
$this->nodeNameResolver = $nodeNameResolver;
|
|
|
|
$this->propertyToAddCollector = $propertyToAddCollector;
|
|
|
|
$this->rectorChangeCollector = $rectorChangeCollector;
|
|
|
|
$this->propertyNaming = $propertyNaming;
|
|
|
|
}
|
2021-05-10 22:23:08 +00:00
|
|
|
public function addPropertyToCollector(\PhpParser\Node\Stmt\Property $property) : void
|
2021-02-09 00:42:47 +01:00
|
|
|
{
|
2021-05-10 22:23:08 +00:00
|
|
|
$classNode = $property->getAttribute(\Rector\NodeTypeResolver\Node\AttributeKey::CLASS_NODE);
|
|
|
|
if (!$classNode instanceof \PhpParser\Node\Stmt\Class_) {
|
2021-02-09 00:42:47 +01:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
$propertyType = $this->nodeTypeResolver->resolve($property);
|
|
|
|
// use first type - hard assumption @todo improve
|
2021-05-10 22:23:08 +00:00
|
|
|
if ($propertyType instanceof \PHPStan\Type\UnionType) {
|
2021-02-09 00:42:47 +01:00
|
|
|
$propertyType = $propertyType->getTypes()[0];
|
|
|
|
}
|
|
|
|
$propertyName = $this->nodeNameResolver->getName($property);
|
|
|
|
$this->addConstructorDependencyToClass($classNode, $propertyType, $propertyName, $property->flags);
|
|
|
|
}
|
2021-05-10 22:23:08 +00:00
|
|
|
public function addConstructorDependencyToClass(\PhpParser\Node\Stmt\Class_ $class, \PHPStan\Type\Type $propertyType, string $propertyName, int $propertyFlags = 0) : void
|
2021-05-09 20:15:43 +00:00
|
|
|
{
|
2021-02-09 00:42:47 +01:00
|
|
|
$this->propertyToAddCollector->addPropertyToClass($class, $propertyName, $propertyType, $propertyFlags);
|
|
|
|
$this->rectorChangeCollector->notifyNodeFileInfo($class);
|
|
|
|
}
|
2021-05-10 22:23:08 +00:00
|
|
|
public function addServiceConstructorDependencyToClass(\PhpParser\Node\Stmt\Class_ $class, \PHPStan\Type\ObjectType $objectType) : void
|
2021-02-09 00:42:47 +01:00
|
|
|
{
|
2021-03-13 16:15:10 +01:00
|
|
|
$propertyName = $this->propertyNaming->fqnToVariableName($objectType);
|
|
|
|
$this->addConstructorDependencyToClass($class, $objectType, $propertyName);
|
2021-02-09 00:42:47 +01:00
|
|
|
}
|
|
|
|
}
|