mirror of https://github.com/rectorphp/rector.git
99 lines
3.1 KiB
PHP
99 lines
3.1 KiB
PHP
<?php
|
|
|
|
declare (strict_types=1);
|
|
namespace Rector\Renaming\Rector\Name;
|
|
|
|
use PhpParser\Node;
|
|
use PhpParser\Node\FunctionLike;
|
|
use PhpParser\Node\Name\FullyQualified;
|
|
use PhpParser\Node\Stmt\ClassLike;
|
|
use PhpParser\Node\Stmt\Expression;
|
|
use PhpParser\Node\Stmt\If_;
|
|
use PhpParser\Node\Stmt\Namespace_;
|
|
use PhpParser\Node\Stmt\Property;
|
|
use Rector\Configuration\RenamedClassesDataCollector;
|
|
use Rector\Contract\Rector\ConfigurableRectorInterface;
|
|
use Rector\NodeTypeResolver\Node\AttributeKey;
|
|
use Rector\Rector\AbstractRector;
|
|
use Rector\Renaming\NodeManipulator\ClassRenamer;
|
|
use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample;
|
|
use Symplify\RuleDocGenerator\ValueObject\RuleDefinition;
|
|
use RectorPrefix202403\Webmozart\Assert\Assert;
|
|
/**
|
|
* @see \Rector\Tests\Renaming\Rector\Name\RenameClassRector\RenameClassRectorTest
|
|
*/
|
|
final class RenameClassRector extends AbstractRector implements ConfigurableRectorInterface
|
|
{
|
|
/**
|
|
* @readonly
|
|
* @var \Rector\Configuration\RenamedClassesDataCollector
|
|
*/
|
|
private $renamedClassesDataCollector;
|
|
/**
|
|
* @readonly
|
|
* @var \Rector\Renaming\NodeManipulator\ClassRenamer
|
|
*/
|
|
private $classRenamer;
|
|
public function __construct(RenamedClassesDataCollector $renamedClassesDataCollector, ClassRenamer $classRenamer)
|
|
{
|
|
$this->renamedClassesDataCollector = $renamedClassesDataCollector;
|
|
$this->classRenamer = $classRenamer;
|
|
}
|
|
public function getRuleDefinition() : RuleDefinition
|
|
{
|
|
return new RuleDefinition('Replaces defined classes by new ones.', [new ConfiguredCodeSample(<<<'CODE_SAMPLE'
|
|
namespace App;
|
|
|
|
use SomeOldClass;
|
|
|
|
function someFunction(SomeOldClass $someOldClass): SomeOldClass
|
|
{
|
|
if ($someOldClass instanceof SomeOldClass) {
|
|
return new SomeOldClass;
|
|
}
|
|
}
|
|
CODE_SAMPLE
|
|
, <<<'CODE_SAMPLE'
|
|
namespace App;
|
|
|
|
use SomeNewClass;
|
|
|
|
function someFunction(SomeNewClass $someOldClass): SomeNewClass
|
|
{
|
|
if ($someOldClass instanceof SomeNewClass) {
|
|
return new SomeNewClass;
|
|
}
|
|
}
|
|
CODE_SAMPLE
|
|
, ['App\\SomeOldClass' => 'App\\SomeNewClass'])]);
|
|
}
|
|
/**
|
|
* @return array<class-string<Node>>
|
|
*/
|
|
public function getNodeTypes() : array
|
|
{
|
|
return [FullyQualified::class, Property::class, FunctionLike::class, Expression::class, ClassLike::class, If_::class];
|
|
}
|
|
/**
|
|
* @param FunctionLike|FullyQualified|ClassLike|Expression|Namespace_|Property|If_ $node
|
|
*/
|
|
public function refactor(Node $node) : ?Node
|
|
{
|
|
$oldToNewClasses = $this->renamedClassesDataCollector->getOldToNewClasses();
|
|
if ($oldToNewClasses !== []) {
|
|
$scope = $node->getAttribute(AttributeKey::SCOPE);
|
|
return $this->classRenamer->renameNode($node, $oldToNewClasses, $scope);
|
|
}
|
|
return null;
|
|
}
|
|
/**
|
|
* @param mixed[] $configuration
|
|
*/
|
|
public function configure(array $configuration) : void
|
|
{
|
|
Assert::allString($configuration);
|
|
Assert::allString(\array_keys($configuration));
|
|
$this->renamedClassesDataCollector->addOldToNewClasses($configuration);
|
|
}
|
|
}
|