2019-10-13 05:59:52 +00:00
|
|
|
<?php
|
|
|
|
|
2021-05-09 20:15:43 +00:00
|
|
|
declare (strict_types=1);
|
2022-06-06 17:12:56 +00:00
|
|
|
namespace Rector\Renaming\Rector\Name;
|
2017-10-05 10:41:37 +00:00
|
|
|
|
2022-06-06 17:12:56 +00:00
|
|
|
use PhpParser\Node;
|
|
|
|
use PhpParser\Node\FunctionLike;
|
2023-11-22 17:40:48 +00:00
|
|
|
use PhpParser\Node\Name\FullyQualified;
|
2022-06-06 17:12:56 +00:00
|
|
|
use PhpParser\Node\Stmt\ClassLike;
|
|
|
|
use PhpParser\Node\Stmt\Expression;
|
2023-11-14 11:48:19 +00:00
|
|
|
use PhpParser\Node\Stmt\If_;
|
2022-06-06 17:12:56 +00:00
|
|
|
use PhpParser\Node\Stmt\Namespace_;
|
|
|
|
use PhpParser\Node\Stmt\Property;
|
2024-01-02 02:40:38 +00:00
|
|
|
use Rector\Configuration\RenamedClassesDataCollector;
|
|
|
|
use Rector\Contract\Rector\ConfigurableRectorInterface;
|
2023-07-05 12:18:11 +00:00
|
|
|
use Rector\NodeTypeResolver\Node\AttributeKey;
|
2024-01-02 02:40:38 +00:00
|
|
|
use Rector\Rector\AbstractRector;
|
2022-06-06 17:12:56 +00:00
|
|
|
use Rector\Renaming\NodeManipulator\ClassRenamer;
|
2022-06-07 09:18:30 +00:00
|
|
|
use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample;
|
|
|
|
use Symplify\RuleDocGenerator\ValueObject\RuleDefinition;
|
2024-03-01 20:02:28 +00:00
|
|
|
use RectorPrefix202403\Webmozart\Assert\Assert;
|
2019-09-03 09:11:45 +00:00
|
|
|
/**
|
2021-03-12 22:20:25 +00:00
|
|
|
* @see \Rector\Tests\Renaming\Rector\Name\RenameClassRector\RenameClassRectorTest
|
2019-09-03 09:11:45 +00:00
|
|
|
*/
|
2023-07-05 12:18:11 +00:00
|
|
|
final class RenameClassRector extends AbstractRector implements ConfigurableRectorInterface
|
2017-10-05 10:40:19 +00:00
|
|
|
{
|
2019-05-03 14:14:53 +00:00
|
|
|
/**
|
2023-06-11 23:01:39 +00:00
|
|
|
* @readonly
|
2024-01-02 02:40:38 +00:00
|
|
|
* @var \Rector\Configuration\RenamedClassesDataCollector
|
2019-08-30 18:21:21 +00:00
|
|
|
*/
|
2021-05-10 23:39:21 +00:00
|
|
|
private $renamedClassesDataCollector;
|
2017-10-05 10:40:19 +00:00
|
|
|
/**
|
2023-06-11 23:01:39 +00:00
|
|
|
* @readonly
|
2021-05-10 23:39:21 +00:00
|
|
|
* @var \Rector\Renaming\NodeManipulator\ClassRenamer
|
2017-10-05 10:40:19 +00:00
|
|
|
*/
|
2021-05-10 23:39:21 +00:00
|
|
|
private $classRenamer;
|
2023-08-09 16:15:16 +00:00
|
|
|
public function __construct(RenamedClassesDataCollector $renamedClassesDataCollector, ClassRenamer $classRenamer)
|
2020-07-29 13:55:33 +00:00
|
|
|
{
|
2020-12-12 12:08:34 +00:00
|
|
|
$this->renamedClassesDataCollector = $renamedClassesDataCollector;
|
2021-05-10 23:39:21 +00:00
|
|
|
$this->classRenamer = $classRenamer;
|
2017-10-05 10:40:19 +00:00
|
|
|
}
|
2022-06-07 08:22:29 +00:00
|
|
|
public function getRuleDefinition() : RuleDefinition
|
2018-04-08 11:51:26 +00:00
|
|
|
{
|
2022-06-07 08:22:29 +00:00
|
|
|
return new RuleDefinition('Replaces defined classes by new ones.', [new ConfiguredCodeSample(<<<'CODE_SAMPLE'
|
2019-05-01 18:51:58 +00:00
|
|
|
namespace App;
|
|
|
|
|
2018-10-17 10:51:28 +00:00
|
|
|
use SomeOldClass;
|
|
|
|
|
2019-03-15 19:36:58 +00:00
|
|
|
function someFunction(SomeOldClass $someOldClass): SomeOldClass
|
2018-10-17 10:51:28 +00:00
|
|
|
{
|
|
|
|
if ($someOldClass instanceof SomeOldClass) {
|
2019-12-27 17:26:20 +00:00
|
|
|
return new SomeOldClass;
|
2018-10-17 10:51:28 +00:00
|
|
|
}
|
|
|
|
}
|
2020-09-15 08:23:13 +00:00
|
|
|
CODE_SAMPLE
|
2021-05-09 20:15:43 +00:00
|
|
|
, <<<'CODE_SAMPLE'
|
2019-05-01 18:51:58 +00:00
|
|
|
namespace App;
|
|
|
|
|
2018-10-17 10:51:28 +00:00
|
|
|
use SomeNewClass;
|
|
|
|
|
2019-03-15 19:36:58 +00:00
|
|
|
function someFunction(SomeNewClass $someOldClass): SomeNewClass
|
2018-10-17 10:51:28 +00:00
|
|
|
{
|
|
|
|
if ($someOldClass instanceof SomeNewClass) {
|
|
|
|
return new SomeNewClass;
|
|
|
|
}
|
|
|
|
}
|
2020-09-15 08:23:13 +00:00
|
|
|
CODE_SAMPLE
|
2022-06-07 09:46:15 +00:00
|
|
|
, ['App\\SomeOldClass' => 'App\\SomeNewClass'])]);
|
2018-04-08 11:51:26 +00:00
|
|
|
}
|
2018-08-14 22:12:41 +00:00
|
|
|
/**
|
2021-02-27 00:06:15 +00:00
|
|
|
* @return array<class-string<Node>>
|
2018-08-14 22:12:41 +00:00
|
|
|
*/
|
2021-05-09 20:15:43 +00:00
|
|
|
public function getNodeTypes() : array
|
2017-10-06 06:34:58 +00:00
|
|
|
{
|
2024-01-21 21:13:24 +00:00
|
|
|
return [FullyQualified::class, Property::class, FunctionLike::class, Expression::class, ClassLike::class, If_::class];
|
2017-10-06 06:34:58 +00:00
|
|
|
}
|
2017-10-05 10:40:19 +00:00
|
|
|
/**
|
2023-11-22 17:40:48 +00:00
|
|
|
* @param FunctionLike|FullyQualified|ClassLike|Expression|Namespace_|Property|If_ $node
|
2017-10-05 10:40:19 +00:00
|
|
|
*/
|
2023-07-05 12:18:11 +00:00
|
|
|
public function refactor(Node $node) : ?Node
|
2017-10-06 06:34:58 +00:00
|
|
|
{
|
2021-06-26 18:33:28 +00:00
|
|
|
$oldToNewClasses = $this->renamedClassesDataCollector->getOldToNewClasses();
|
2023-03-08 07:33:37 +00:00
|
|
|
if ($oldToNewClasses !== []) {
|
2023-07-05 12:18:11 +00:00
|
|
|
$scope = $node->getAttribute(AttributeKey::SCOPE);
|
2024-01-21 21:13:24 +00:00
|
|
|
return $this->classRenamer->renameNode($node, $oldToNewClasses, $scope);
|
2021-09-26 09:29:01 +00:00
|
|
|
}
|
2023-03-08 07:33:37 +00:00
|
|
|
return null;
|
2019-10-30 09:49:07 +00:00
|
|
|
}
|
2021-03-19 14:33:58 +00:00
|
|
|
/**
|
2021-11-28 17:01:20 +00:00
|
|
|
* @param mixed[] $configuration
|
2021-03-19 14:33:58 +00:00
|
|
|
*/
|
2021-12-10 10:22:23 +00:00
|
|
|
public function configure(array $configuration) : void
|
2020-07-29 13:55:33 +00:00
|
|
|
{
|
2022-06-07 08:22:29 +00:00
|
|
|
Assert::allString($configuration);
|
|
|
|
Assert::allString(\array_keys($configuration));
|
2023-08-09 16:15:16 +00:00
|
|
|
$this->renamedClassesDataCollector->addOldToNewClasses($configuration);
|
2020-07-29 13:55:33 +00:00
|
|
|
}
|
2017-10-05 10:40:19 +00:00
|
|
|
}
|