rector/src/Rector/Dynamic/ClassReplacerRector.php

83 lines
1.9 KiB
PHP
Raw Normal View History

2017-10-05 10:40:19 +00:00
<?php declare(strict_types=1);
namespace Rector\Rector\Dynamic;
2017-10-06 06:34:58 +00:00
use PhpParser\Node;
use PhpParser\Node\Name;
use PhpParser\Node\Name\FullyQualified;
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;
}
$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
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);
return new FullyQualified($newName);
}
return null;
2017-10-06 06:34:58 +00:00
}
private function resolveNewNameFromNode(Node $node): string
{
$nameNode = $this->resolveNameNodeFromNode($node);
2018-01-18 21:21:22 +00:00
if ($nameNode !== null) {
return $this->oldToNewClasses[$nameNode->toString()];
}
}
private function resolveNameNodeFromNode(Node $node): ?Name
{
if ($node instanceof Name) {
// resolved name has priority, as it is FQN
$resolvedName = $node->getAttribute(Attribute::RESOLVED_NAME);
if ($resolvedName instanceof FullyQualified) {
return $resolvedName;
}
return $node;
}
if ($node instanceof Use_) {
return $node->uses[0]->name;
}
return null;
}
2017-10-05 10:40:19 +00:00
}