move node-replacing to PostRector

This commit is contained in:
TomasVotruba 2020-03-31 20:30:56 +02:00
parent af3c92b3d5
commit 18feee456e
5 changed files with 120 additions and 84 deletions

View File

@ -1,4 +1,4 @@
# All 477 Rectors Overview
# All 481 Rectors Overview
- [Projects](#projects)
- [General](#general)
@ -7854,6 +7854,14 @@ Remove php version checks if they are passed
## PostRector
### `NameImportingRector`
- class: [`Rector\PostRector\Rector\NameImportingRector`](/../master/packages/post-rector/src/Rector/NameImportingRector.php)
Imports names
<br>
### `NodeRemovingRector`
- class: [`Rector\PostRector\Rector\NodeRemovingRector`](/../master/packages/post-rector/src/Rector/NodeRemovingRector.php)
@ -7862,6 +7870,30 @@ PostRector that removes nodes
<br>
### `NodeToReplacePostRector`
- class: [`Rector\PostRector\Rector\NodeToReplacePostRector`](/../master/packages/post-rector/src/Rector/NodeToReplacePostRector.php)
Post Rector that replaces one nodes with another
<br>
### `PropertyAddingPostRector`
- class: [`Rector\PostRector\Rector\PropertyAddingPostRector`](/../master/packages/post-rector/src/Rector/PropertyAddingPostRector.php)
Post Rector that adds properties
<br>
### `UseAddingPostRector`
- class: [`Rector\PostRector\Rector\UseAddingPostRector`](/../master/packages/post-rector/src/Rector/UseAddingPostRector.php)
Post Rector that adds use statements
<br>
## Privatization
### `PrivatizeLocalClassConstantRector`

View File

@ -0,0 +1,32 @@
<?php
declare(strict_types=1);
namespace Rector\PostRector\Collector;
use PhpParser\Node;
use Rector\PostRector\Contract\Collector\NodeCollectorInterface;
final class NodesToReplaceCollector implements NodeCollectorInterface
{
/**
* @todo use value object
* @var Node[][]
*/
private $nodesToReplace = [];
public function addReplaceNodeWithAnotherNode(Node $node, Node $replaceWith): void
{
$this->nodesToReplace[] = [$node, $replaceWith];
}
public function isActive(): bool
{
return count($this->nodesToReplace) > 0;
}
public function getNodes()
{
return $this->nodesToReplace;
}
}

View File

@ -13,10 +13,10 @@ use PHPStan\Type\ObjectType;
use PHPStan\Type\Type;
use Rector\ChangesReporting\Collector\RectorChangeCollector;
use Rector\Core\PhpParser\Node\Commander\NodeAddingCommander;
use Rector\Core\PhpParser\Node\Commander\NodeReplacingCommander;
use Rector\PHPStan\Type\AliasedObjectType;
use Rector\PHPStan\Type\FullyQualifiedObjectType;
use Rector\PostRector\Collector\NodesToRemoveCollector;
use Rector\PostRector\Collector\NodesToReplaceCollector;
use Rector\PostRector\Collector\PropertyToAddCollector;
use Rector\PostRector\Collector\UseNodesToAddCollector;
@ -47,9 +47,9 @@ trait NodeCommandersTrait
private $propertyToAddCollector;
/**
* @var NodeReplacingCommander
* @var NodesToReplaceCollector
*/
private $nodeReplacingCommander;
private $nodesToReplaceCollector;
/**
* @var RectorChangeCollector
@ -64,14 +64,14 @@ trait NodeCommandersTrait
NodeAddingCommander $nodeAddingCommander,
PropertyToAddCollector $propertyToAddCollector,
UseNodesToAddCollector $useNodesToAddCollector,
NodeReplacingCommander $nodeReplacingCommander,
NodesToReplaceCollector $nodesToReplaceCollector,
RectorChangeCollector $rectorChangeCollector
): void {
$this->nodesToRemoveCollector = $nodesToRemoveCollector;
$this->nodeAddingCommander = $nodeAddingCommander;
$this->propertyToAddCollector = $propertyToAddCollector;
$this->useNodesToAddCollector = $useNodesToAddCollector;
$this->nodeReplacingCommander = $nodeReplacingCommander;
$this->nodesToReplaceCollector = $nodesToReplaceCollector;
$this->rectorChangeCollector = $rectorChangeCollector;
}
@ -128,8 +128,7 @@ trait NodeCommandersTrait
protected function replaceNode(Node $node, Node $replaceWith): void
{
$this->nodeReplacingCommander->replaceNode($node, $replaceWith);
$this->nodesToReplaceCollector->addReplaceNodeWithAnotherNode($node, $replaceWith);
$this->rectorChangeCollector->notifyNodeFileInfo($replaceWith);
}

View File

@ -0,0 +1,49 @@
<?php
declare(strict_types=1);
namespace Rector\PostRector\Rector;
use PhpParser\Node;
use Rector\Core\RectorDefinition\RectorDefinition;
use Rector\PostRector\Collector\NodesToReplaceCollector;
final class NodeToReplacePostRector extends AbstractPostRector
{
/**
* @var NodesToReplaceCollector
*/
private $nodesToReplaceCollector;
public function __construct(NodesToReplaceCollector $nodesToReplaceCollector)
{
$this->nodesToReplaceCollector = $nodesToReplaceCollector;
}
public function getPriority(): int
{
return 1100;
}
public function refactor(Node $node): ?Node
{
// used in leave node
return null;
// TODO: Implement refactor() method.
}
public function leaveNode(Node $node): ?Node
{
foreach ($this->nodesToReplaceCollector->getNodes() as [$nodeToFind, $replacement]) {
if ($node === $nodeToFind) {
return $replacement;
}
}
return null;
}
public function getDefinition(): RectorDefinition
{
return new RectorDefinition('Post Rector that replaces one nodes with another');
}
}

View File

@ -1,76 +0,0 @@
<?php
declare(strict_types=1);
namespace Rector\Core\PhpParser\Node\Commander;
use PhpParser\Node;
use PhpParser\NodeTraverser;
use PhpParser\NodeVisitor;
use PhpParser\NodeVisitorAbstract;
use Rector\Core\Contract\PhpParser\Node\CommanderInterface;
/**
* Adds new private properties to class + to constructor
*/
final class NodeReplacingCommander implements CommanderInterface
{
/**
* @var Node[][]
*/
private $nodesToReplace = [];
public function replaceNode(Node $node, Node $replaceWith): void
{
$this->nodesToReplace[] = [$node, $replaceWith];
}
/**
* @param Node[] $nodes
* @return Node[]
*/
public function traverseNodes(array $nodes): array
{
$nodeTraverser = new NodeTraverser();
$nodeTraverser->addVisitor($this->createNodeVisitor());
return $nodeTraverser->traverse($nodes);
}
public function isActive(): bool
{
return count($this->nodesToReplace) > 0;
}
public function getPriority(): int
{
return 1100;
}
private function createNodeVisitor(): NodeVisitor
{
return new class($this->nodesToReplace) extends NodeVisitorAbstract {
/**
* @var Node[][]
*/
private $nodesToReplace = [];
/**
* @param Node[][] $nodesToReplace
*/
public function __construct(array $nodesToReplace)
{
$this->nodesToReplace = $nodesToReplace;
}
public function leaveNode(Node $node): ?Node
{
foreach ($this->nodesToReplace as [$nodeToFind, $replacement]) {
if ($node === $nodeToFind) {
return $replacement;
}
}
return null;
}
};
}
}