2017-10-05 10:40:19 +00:00
|
|
|
<?php declare(strict_types=1);
|
|
|
|
|
2017-10-05 10:41:37 +00:00
|
|
|
namespace Rector\Rector\Dynamic;
|
|
|
|
|
2017-10-06 06:34:58 +00:00
|
|
|
use PhpParser\Node;
|
|
|
|
use PhpParser\Node\Name;
|
|
|
|
use PhpParser\Node\Name\FullyQualified;
|
2017-10-06 07:30:34 +00:00
|
|
|
use PhpParser\Node\Stmt\Use_;
|
|
|
|
use Rector\Node\Attribute;
|
2017-10-06 06:34:58 +00:00
|
|
|
use Rector\Rector\AbstractRector;
|
2017-10-05 10:40:19 +00:00
|
|
|
|
2017-10-06 06:34:58 +00:00
|
|
|
final class ClassReplacerRector extends AbstractRector
|
2017-10-05 10:40:19 +00:00
|
|
|
{
|
|
|
|
/**
|
|
|
|
* @var string[]
|
|
|
|
*/
|
|
|
|
private $oldToNewClasses = [];
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @param string[] $oldToNewClasses
|
|
|
|
*/
|
2017-11-09 02:33:17 +00:00
|
|
|
public function __construct(array $oldToNewClasses)
|
|
|
|
{
|
2017-10-05 10:40:19 +00:00
|
|
|
$this->oldToNewClasses = $oldToNewClasses;
|
|
|
|
}
|
|
|
|
|
2017-10-06 06:34:58 +00:00
|
|
|
public function isCandidate(Node $node): bool
|
|
|
|
{
|
2017-11-09 02:33:17 +00:00
|
|
|
if (! $node instanceof Name) {
|
2017-10-06 06:34:58 +00:00
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2017-10-26 10:42:56 +00:00
|
|
|
$nameNode = $this->resolveNameNodeFromNode($node);
|
2017-11-06 13:54:16 +00:00
|
|
|
if ($nameNode === null) {
|
|
|
|
return false;
|
|
|
|
}
|
2017-10-06 06:34:58 +00:00
|
|
|
|
2017-10-26 10:42:56 +00:00
|
|
|
return isset($this->oldToNewClasses[$nameNode->toString()]);
|
2017-10-06 06:34:58 +00:00
|
|
|
}
|
|
|
|
|
2017-10-05 10:40:19 +00:00
|
|
|
/**
|
2017-11-09 02:33:17 +00:00
|
|
|
* @param Name $nameNode
|
2017-10-05 10:40:19 +00:00
|
|
|
*/
|
2017-11-09 02:33:17 +00:00
|
|
|
public function refactor(Node $nameNode): ?Node
|
2017-10-06 06:34:58 +00:00
|
|
|
{
|
2017-11-09 02:33:17 +00:00
|
|
|
if ($nameNode instanceof Name) {
|
|
|
|
$newName = $this->resolveNewNameFromNode($nameNode);
|
2017-10-06 07:30:34 +00:00
|
|
|
|
2017-11-09 02:28:52 +00:00
|
|
|
return new FullyQualified($newName);
|
2017-10-06 07:30:34 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return null;
|
2017-10-06 06:34:58 +00:00
|
|
|
}
|
|
|
|
|
2017-10-06 12:42:52 +00:00
|
|
|
private function resolveNewNameFromNode(Node $node): string
|
|
|
|
{
|
2017-10-26 10:42:56 +00:00
|
|
|
$nameNode = $this->resolveNameNodeFromNode($node);
|
2017-10-06 12:42:52 +00:00
|
|
|
|
2018-01-18 21:21:22 +00:00
|
|
|
if ($nameNode !== null) {
|
|
|
|
return $this->oldToNewClasses[$nameNode->toString()];
|
|
|
|
}
|
2017-10-06 12:42:52 +00:00
|
|
|
}
|
|
|
|
|
2017-10-26 10:42:56 +00:00
|
|
|
private function resolveNameNodeFromNode(Node $node): ?Name
|
2017-10-06 07:30:34 +00:00
|
|
|
{
|
|
|
|
if ($node instanceof Name) {
|
2017-10-06 12:37:20 +00:00
|
|
|
// resolved name has priority, as it is FQN
|
|
|
|
$resolvedName = $node->getAttribute(Attribute::RESOLVED_NAME);
|
|
|
|
if ($resolvedName instanceof FullyQualified) {
|
2017-10-26 10:42:56 +00:00
|
|
|
return $resolvedName;
|
2017-10-06 12:37:20 +00:00
|
|
|
}
|
|
|
|
|
2017-10-26 10:42:56 +00:00
|
|
|
return $node;
|
2017-10-06 07:30:34 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if ($node instanceof Use_) {
|
2017-10-26 10:42:56 +00:00
|
|
|
return $node->uses[0]->name;
|
2017-10-06 07:30:34 +00:00
|
|
|
}
|
|
|
|
|
2017-10-26 10:42:56 +00:00
|
|
|
return null;
|
2017-10-06 07:30:34 +00:00
|
|
|
}
|
2017-10-05 10:40:19 +00:00
|
|
|
}
|