mirror of
https://github.com/rectorphp/rector.git
synced 2024-06-07 11:50:51 +00:00
move NodeRemovingRector to collector
This commit is contained in:
parent
7f2aef3d7d
commit
629042eeb4
|
@ -51,6 +51,7 @@
|
|||
"autoload": {
|
||||
"psr-4": {
|
||||
"Rector\\Architecture\\": "rules/architecture/src",
|
||||
"Rector\\PostRector\\": "packages/post-rector/src",
|
||||
"Rector\\AttributeAwarePhpDoc\\": "packages/attribute-aware-php-doc/src",
|
||||
"Rector\\Autodiscovery\\": "rules/autodiscovery/src",
|
||||
"Rector\\BetterPhpDocParser\\": "packages/better-php-doc-parser/src",
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
# All 476 Rectors Overview
|
||||
# All 477 Rectors Overview
|
||||
|
||||
- [Projects](#projects)
|
||||
- [General](#general)
|
||||
|
@ -48,6 +48,7 @@
|
|||
- [PhpDeglobalize](#phpdeglobalize)
|
||||
- [PhpSpecToPHPUnit](#phpspectophpunit)
|
||||
- [Polyfill](#polyfill)
|
||||
- [PostRector](#postrector)
|
||||
- [Privatization](#privatization)
|
||||
- [Refactoring](#refactoring)
|
||||
- [RemovingStatic](#removingstatic)
|
||||
|
@ -7851,6 +7852,16 @@ Remove php version checks if they are passed
|
|||
|
||||
<br>
|
||||
|
||||
## PostRector
|
||||
|
||||
### `NodeRemovingRector`
|
||||
|
||||
- class: [`Rector\PostRector\Rector\NodeRemovingRector`](/../master/packages/post-rector/src/Rector/NodeRemovingRector.php)
|
||||
|
||||
PostRector that removes nodes
|
||||
|
||||
<br>
|
||||
|
||||
## Privatization
|
||||
|
||||
### `PrivatizeLocalClassConstantRector`
|
||||
|
|
2
ecs.yaml
2
ecs.yaml
|
@ -20,7 +20,6 @@ services:
|
|||
Symplify\CodingStandard\Sniffs\Naming\ClassNameSuffixByParentSniff:
|
||||
extra_parent_types_to_suffixes:
|
||||
- 'Rector'
|
||||
- 'NodeVisitorAbstract'
|
||||
|
||||
parameters:
|
||||
paths:
|
||||
|
@ -83,6 +82,7 @@ parameters:
|
|||
Symplify\CodingStandard\Sniffs\Naming\ClassNameSuffixByParentSniff:
|
||||
# hidden API
|
||||
- 'src/Rector/AbstractRector.php'
|
||||
- 'packages/post-rector/src/Rector/AbstractPostRector.php'
|
||||
|
||||
Symplify\CodingStandard\Sniffs\CleanCode\ClassCognitiveComplexitySniff:
|
||||
# node printing
|
||||
|
|
|
@ -5,14 +5,15 @@ declare(strict_types=1);
|
|||
namespace Rector\ChangesReporting\Application;
|
||||
|
||||
use PhpParser\Node;
|
||||
use PhpParser\Node\Stmt;
|
||||
use PHPStan\AnalysedCodeException;
|
||||
use Rector\ChangesReporting\Collector\RectorChangeCollector;
|
||||
use Rector\ConsoleDiffer\DifferAndFormatter;
|
||||
use Rector\Core\Application\FileSystem\RemovedAndAddedFilesCollector;
|
||||
use Rector\Core\Error\ExceptionCorrector;
|
||||
use Rector\Core\PhpParser\Node\Commander\NodeRemovingCommander;
|
||||
use Rector\Core\ValueObject\Application\Error;
|
||||
use Rector\Core\ValueObject\Reporting\FileDiff;
|
||||
use Rector\PostRector\Collector\NodesToRemoveCollector;
|
||||
use Symplify\SmartFileSystem\SmartFileInfo;
|
||||
use Throwable;
|
||||
|
||||
|
@ -49,22 +50,22 @@ final class ErrorAndDiffCollector
|
|||
private $removedAndAddedFilesCollector;
|
||||
|
||||
/**
|
||||
* @var NodeRemovingCommander
|
||||
* @var NodesToRemoveCollector
|
||||
*/
|
||||
private $nodeRemovingCommander;
|
||||
private $nodesToRemoveCollector;
|
||||
|
||||
public function __construct(
|
||||
DifferAndFormatter $differAndFormatter,
|
||||
RectorChangeCollector $rectorChangeCollector,
|
||||
ExceptionCorrector $exceptionCorrector,
|
||||
RemovedAndAddedFilesCollector $removedAndAddedFilesCollector,
|
||||
NodeRemovingCommander $nodeRemovingCommander
|
||||
NodesToRemoveCollector $nodesToRemoveCollector
|
||||
) {
|
||||
$this->differAndFormatter = $differAndFormatter;
|
||||
$this->rectorChangeCollector = $rectorChangeCollector;
|
||||
$this->exceptionCorrector = $exceptionCorrector;
|
||||
$this->removedAndAddedFilesCollector = $removedAndAddedFilesCollector;
|
||||
$this->nodeRemovingCommander = $nodeRemovingCommander;
|
||||
$this->nodesToRemoveCollector = $nodesToRemoveCollector;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -82,15 +83,15 @@ final class ErrorAndDiffCollector
|
|||
|
||||
public function getRemovedNodeCount(): int
|
||||
{
|
||||
return $this->nodeRemovingCommander->getCount();
|
||||
return $this->nodesToRemoveCollector->getCount();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return Node[]
|
||||
* @return Node[]|Stmt[]
|
||||
*/
|
||||
public function getRemovedNodes(): array
|
||||
{
|
||||
return $this->nodeRemovingCommander->getNodesToRemove();
|
||||
return $this->nodesToRemoveCollector->getNodesToRemove();
|
||||
}
|
||||
|
||||
public function addFileDiff(SmartFileInfo $smartFileInfo, string $newContent, string $oldContent): void
|
||||
|
|
8
packages/post-rector/config/config.yaml
Normal file
8
packages/post-rector/config/config.yaml
Normal file
|
@ -0,0 +1,8 @@
|
|||
services:
|
||||
_defaults:
|
||||
public: true
|
||||
autowire: true
|
||||
autoconfigure: true
|
||||
|
||||
Rector\PostRector\:
|
||||
resource: '../src'
|
|
@ -2,19 +2,22 @@
|
|||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Rector\Core\Application;
|
||||
namespace Rector\PostRector\Application;
|
||||
|
||||
use PhpParser\Node;
|
||||
use PhpParser\NodeTraverser;
|
||||
use Rector\Core\Contract\PhpParser\Node\CommanderInterface;
|
||||
use Rector\Core\Exception\ShouldNotHappenException;
|
||||
use Rector\Core\Tests\Rector\Architecture\DoctrineRepositoryAsService\Source\Entity\Post;
|
||||
use Rector\NodeTypeResolver\FileSystem\CurrentFileInfoProvider;
|
||||
use Rector\NodeTypeResolver\Node\AttributeKey;
|
||||
use Rector\PostRector\Contract\Rector\PostRectorInterface;
|
||||
use Symplify\SmartFileSystem\SmartFileInfo;
|
||||
|
||||
final class PostFileProcessor
|
||||
final class PostFileProcessor extends NodeTraverser
|
||||
{
|
||||
/**
|
||||
* @var CommanderInterface[]
|
||||
* @var CommanderInterface[]|PostRectorInterface[]
|
||||
*/
|
||||
private $commanders = [];
|
||||
|
||||
|
@ -25,11 +28,22 @@ final class PostFileProcessor
|
|||
|
||||
/**
|
||||
* @param CommanderInterface[] $commanders
|
||||
* @param PostRectorInterface[] $postRectors
|
||||
*/
|
||||
public function __construct(CurrentFileInfoProvider $currentFileInfoProvider, array $commanders)
|
||||
public function __construct(CurrentFileInfoProvider $currentFileInfoProvider, array $commanders, array $postRectors)
|
||||
{
|
||||
// A. slowly remove...
|
||||
$commanders = array_merge($commanders, $postRectors);
|
||||
|
||||
$this->sortByPriorityAndSetCommanders($commanders);
|
||||
$this->currentFileInfoProvider = $currentFileInfoProvider;
|
||||
|
||||
// B. refactor into ↓
|
||||
foreach ($commanders as $commander) {
|
||||
if ($commander instanceof PostRectorInterface) {
|
||||
$this->addVisitor($commander);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -40,7 +54,12 @@ final class PostFileProcessor
|
|||
{
|
||||
$this->setCurrentFileInfo($nodes);
|
||||
|
||||
// A. commanders
|
||||
foreach ($this->commanders as $commander) {
|
||||
if (! $commander instanceof CommanderInterface) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (! $commander->isActive()) {
|
||||
continue;
|
||||
}
|
||||
|
@ -48,11 +67,12 @@ final class PostFileProcessor
|
|||
$nodes = $commander->traverseNodes($nodes);
|
||||
}
|
||||
|
||||
return $nodes;
|
||||
// B. post rectors
|
||||
return parent::traverse($nodes);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param CommanderInterface[] $commanders
|
||||
* @param CommanderInterface[]|PostRectorInterface[] $commanders
|
||||
*/
|
||||
private function sortByPriorityAndSetCommanders(array $commanders): void
|
||||
{
|
|
@ -2,46 +2,36 @@
|
|||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Rector\Core\PhpParser\Node\Commander;
|
||||
namespace Rector\PostRector\Collector;
|
||||
|
||||
use PhpParser\Node;
|
||||
use PhpParser\Node\Expr\MethodCall;
|
||||
use PhpParser\Node\Stmt;
|
||||
use PhpParser\Node\Stmt\Expression;
|
||||
use PhpParser\NodeTraverser;
|
||||
use Rector\ChangesReporting\Collector\AffectedFilesCollector;
|
||||
use Rector\Core\Contract\PhpParser\Node\CommanderInterface;
|
||||
use Rector\Core\Exception\ShouldNotHappenException;
|
||||
use Rector\Core\PhpParser\Node\NodeVisitorFactory\NodeRemovingNodeVisitorFactory;
|
||||
use Rector\NodeTypeResolver\Node\AttributeKey;
|
||||
use Rector\PostRector\Contract\Collector\NodeCollectorInterface;
|
||||
use Symplify\SmartFileSystem\SmartFileInfo;
|
||||
|
||||
final class NodeRemovingCommander implements CommanderInterface
|
||||
final class NodesToRemoveCollector implements NodeCollectorInterface
|
||||
{
|
||||
/**
|
||||
* @var Stmt[]
|
||||
*/
|
||||
private $nodesToRemove = [];
|
||||
|
||||
/**
|
||||
* @var NodeRemovingNodeVisitorFactory
|
||||
*/
|
||||
private $nodeRemovingNodeVisitorFactory;
|
||||
|
||||
/**
|
||||
* @var AffectedFilesCollector
|
||||
*/
|
||||
private $affectedFilesCollector;
|
||||
|
||||
public function __construct(
|
||||
NodeRemovingNodeVisitorFactory $nodeRemovingNodeVisitorFactory,
|
||||
AffectedFilesCollector $affectedFilesCollector
|
||||
) {
|
||||
$this->nodeRemovingNodeVisitorFactory = $nodeRemovingNodeVisitorFactory;
|
||||
/**
|
||||
* @var Stmt[]|Node[]
|
||||
*/
|
||||
private $nodesToRemove = [];
|
||||
|
||||
public function __construct(AffectedFilesCollector $affectedFilesCollector)
|
||||
{
|
||||
$this->affectedFilesCollector = $affectedFilesCollector;
|
||||
}
|
||||
|
||||
public function addNode(Node $node): void
|
||||
public function addNodeToRemove(Node $node): void
|
||||
{
|
||||
// chain call: "->method()->another()"
|
||||
$this->ensureIsNotPartOfChainMethodCall($node);
|
||||
|
@ -62,20 +52,6 @@ final class NodeRemovingCommander implements CommanderInterface
|
|||
$this->nodesToRemove[] = $node;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param Node[] $nodes
|
||||
* @return Node[]
|
||||
*/
|
||||
public function traverseNodes(array $nodes): array
|
||||
{
|
||||
$nodeTraverser = new NodeTraverser();
|
||||
|
||||
$nodeRemovingNodeVisitor = $this->nodeRemovingNodeVisitorFactory->createFromNodesToRemove($this->nodesToRemove);
|
||||
$nodeTraverser->addVisitor($nodeRemovingNodeVisitor);
|
||||
|
||||
return $nodeTraverser->traverse($nodes);
|
||||
}
|
||||
|
||||
public function isNodeRemoved(Node $node): bool
|
||||
{
|
||||
return in_array($node, $this->nodesToRemove, true);
|
||||
|
@ -92,16 +68,16 @@ final class NodeRemovingCommander implements CommanderInterface
|
|||
}
|
||||
|
||||
/**
|
||||
* @return Node[]
|
||||
* @return Node[]|Stmt[]
|
||||
*/
|
||||
public function getNodesToRemove(): array
|
||||
{
|
||||
return $this->nodesToRemove;
|
||||
}
|
||||
|
||||
public function getPriority(): int
|
||||
public function unset(int $key): void
|
||||
{
|
||||
return 800;
|
||||
unset($this->nodesToRemove[$key]);
|
||||
}
|
||||
|
||||
private function ensureIsNotPartOfChainMethodCall(Node $node): void
|
|
@ -0,0 +1,10 @@
|
|||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Rector\PostRector\Contract\Collector;
|
||||
|
||||
interface NodeCollectorInterface
|
||||
{
|
||||
public function isActive(): bool;
|
||||
}
|
|
@ -0,0 +1,22 @@
|
|||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Rector\PostRector\Contract\Rector;
|
||||
|
||||
use PhpParser\Node;
|
||||
use PhpParser\NodeVisitor;
|
||||
use Rector\Core\Contract\Rector\RectorInterface;
|
||||
|
||||
interface PostRectorInterface extends NodeVisitor, RectorInterface
|
||||
{
|
||||
/**
|
||||
* Higher values are executed first
|
||||
*/
|
||||
public function getPriority(): int;
|
||||
|
||||
/**
|
||||
* Process Node of matched type
|
||||
*/
|
||||
public function refactor(Node $node): ?Node;
|
||||
}
|
23
packages/post-rector/src/Rector/AbstractPostRector.php
Normal file
23
packages/post-rector/src/Rector/AbstractPostRector.php
Normal file
|
@ -0,0 +1,23 @@
|
|||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Rector\PostRector\Rector;
|
||||
|
||||
use PhpParser\Node;
|
||||
use PhpParser\NodeVisitorAbstract;
|
||||
use Rector\Core\Rector\AbstractRector\NameResolverTrait;
|
||||
use Rector\PostRector\Contract\Rector\PostRectorInterface;
|
||||
|
||||
abstract class AbstractPostRector extends NodeVisitorAbstract implements PostRectorInterface
|
||||
{
|
||||
use NameResolverTrait;
|
||||
|
||||
/**
|
||||
* @return int|Node|null
|
||||
*/
|
||||
final public function enterNode(Node $node)
|
||||
{
|
||||
return $this->refactor($node);
|
||||
}
|
||||
}
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Rector\Core\Rector\AbstractRector;
|
||||
namespace Rector\PostRector\Rector\AbstractRector;
|
||||
|
||||
use PhpParser\Node;
|
||||
use PhpParser\Node\FunctionLike;
|
||||
|
@ -15,11 +15,11 @@ use Rector\ChangesReporting\Collector\RectorChangeCollector;
|
|||
use Rector\CodingStyle\Application\NameImportingCommander;
|
||||
use Rector\CodingStyle\Application\UseAddingCommander;
|
||||
use Rector\Core\PhpParser\Node\Commander\NodeAddingCommander;
|
||||
use Rector\Core\PhpParser\Node\Commander\NodeRemovingCommander;
|
||||
use Rector\Core\PhpParser\Node\Commander\NodeReplacingCommander;
|
||||
use Rector\Core\PhpParser\Node\Commander\PropertyAddingCommander;
|
||||
use Rector\PHPStan\Type\AliasedObjectType;
|
||||
use Rector\PHPStan\Type\FullyQualifiedObjectType;
|
||||
use Rector\PostRector\Collector\NodesToRemoveCollector;
|
||||
|
||||
/**
|
||||
* This could be part of @see AbstractRector, but decopuling to trait
|
||||
|
@ -38,9 +38,9 @@ trait NodeCommandersTrait
|
|||
protected $useAddingCommander;
|
||||
|
||||
/**
|
||||
* @var NodeRemovingCommander
|
||||
* @var NodesToRemoveCollector
|
||||
*/
|
||||
private $nodeRemovingCommander;
|
||||
private $nodesToRemoveCollector;
|
||||
|
||||
/**
|
||||
* @var NodeAddingCommander
|
||||
|
@ -66,7 +66,7 @@ trait NodeCommandersTrait
|
|||
* @required
|
||||
*/
|
||||
public function autowireNodeCommandersTrait(
|
||||
NodeRemovingCommander $nodeRemovingCommander,
|
||||
NodesToRemoveCollector $nodesToRemoveCollector,
|
||||
NodeAddingCommander $nodeAddingCommander,
|
||||
PropertyAddingCommander $propertyAddingCommander,
|
||||
UseAddingCommander $useAddingCommander,
|
||||
|
@ -74,7 +74,7 @@ trait NodeCommandersTrait
|
|||
NodeReplacingCommander $nodeReplacingCommander,
|
||||
RectorChangeCollector $rectorChangeCollector
|
||||
): void {
|
||||
$this->nodeRemovingCommander = $nodeRemovingCommander;
|
||||
$this->nodesToRemoveCollector = $nodesToRemoveCollector;
|
||||
$this->nodeAddingCommander = $nodeAddingCommander;
|
||||
$this->propertyAddingCommander = $propertyAddingCommander;
|
||||
$this->useAddingCommander = $useAddingCommander;
|
||||
|
@ -131,8 +131,7 @@ trait NodeCommandersTrait
|
|||
|
||||
protected function removeNode(Node $node): void
|
||||
{
|
||||
$this->nodeRemovingCommander->addNode($node);
|
||||
|
||||
$this->nodesToRemoveCollector->addNodeToRemove($node);
|
||||
$this->rectorChangeCollector->notifyNodeFileInfo($node);
|
||||
}
|
||||
|
||||
|
@ -160,7 +159,7 @@ trait NodeCommandersTrait
|
|||
|
||||
protected function isNodeRemoved(Node $node): bool
|
||||
{
|
||||
return $this->nodeRemovingCommander->isNodeRemoved($node);
|
||||
return $this->nodesToRemoveCollector->isNodeRemoved($node);
|
||||
}
|
||||
|
||||
/**
|
104
packages/post-rector/src/Rector/NodeRemovingRector.php
Normal file
104
packages/post-rector/src/Rector/NodeRemovingRector.php
Normal file
|
@ -0,0 +1,104 @@
|
|||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Rector\PostRector\Rector;
|
||||
|
||||
use PhpParser\Node;
|
||||
use PhpParser\Node\Expr\MethodCall;
|
||||
use PhpParser\NodeTraverser;
|
||||
use Rector\Core\PhpParser\Node\NodeFactory;
|
||||
use Rector\Core\RectorDefinition\RectorDefinition;
|
||||
use Rector\PostRector\Collector\NodesToRemoveCollector;
|
||||
|
||||
final class NodeRemovingRector extends AbstractPostRector
|
||||
{
|
||||
/**
|
||||
* @var NodesToRemoveCollector
|
||||
*/
|
||||
private $nodesToRemoveCollector;
|
||||
|
||||
/**
|
||||
* @var NodeFactory
|
||||
*/
|
||||
private $nodeFactory;
|
||||
|
||||
public function __construct(NodesToRemoveCollector $nodesToRemoveCollector, NodeFactory $nodeFactory)
|
||||
{
|
||||
$this->nodesToRemoveCollector = $nodesToRemoveCollector;
|
||||
$this->nodeFactory = $nodeFactory;
|
||||
}
|
||||
|
||||
public function getDefinition(): RectorDefinition
|
||||
{
|
||||
return new RectorDefinition('PostRector that removes nodes');
|
||||
}
|
||||
|
||||
public function getPriority(): int
|
||||
{
|
||||
return 800;
|
||||
}
|
||||
|
||||
public function refactor(Node $node): ?Node
|
||||
{
|
||||
if (! $this->nodesToRemoveCollector->isActive()) {
|
||||
return null;
|
||||
}
|
||||
|
||||
// special case for fluent methods
|
||||
foreach ($this->nodesToRemoveCollector->getNodesToRemove() as $key => $nodeToRemove) {
|
||||
// replace chain method call by non-chain method call
|
||||
if (! $this->isChainMethodCallNodeToBeRemoved($node, $nodeToRemove)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$this->nodesToRemoveCollector->unset($key);
|
||||
|
||||
/** @var MethodCall $node */
|
||||
$methodName = $this->getName($node->name);
|
||||
|
||||
/** @var MethodCall $nestedMethodCall */
|
||||
$nestedMethodCall = $node->var;
|
||||
|
||||
/** @var string $methodName */
|
||||
return $this->nodeFactory->createMethodCall($nestedMethodCall->var, $methodName, $node->args);
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return int|Node|Node[]|null
|
||||
*/
|
||||
public function leaveNode(Node $node)
|
||||
{
|
||||
foreach ($this->nodesToRemoveCollector->getNodesToRemove() as $key => $nodeToRemove) {
|
||||
if ($node === $nodeToRemove) {
|
||||
$this->nodesToRemoveCollector->unset($key);
|
||||
|
||||
return NodeTraverser::REMOVE_NODE;
|
||||
}
|
||||
}
|
||||
|
||||
return $node;
|
||||
}
|
||||
|
||||
private function isChainMethodCallNodeToBeRemoved(Node $node, Node $nodeToRemove): bool
|
||||
{
|
||||
if (! $nodeToRemove instanceof MethodCall) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (! $node instanceof MethodCall || ! $node->var instanceof MethodCall) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if ($nodeToRemove !== $node->var) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$methodName = $this->getName($node->name);
|
||||
|
||||
return $methodName !== null;
|
||||
}
|
||||
}
|
|
@ -249,3 +249,4 @@ parameters:
|
|||
|
||||
- '#Parameter \#1 \$node of method Rector\\Core\\Rector\\AbstractRector\:\:isVariableName\(\) expects PhpParser\\Node, PhpParser\\Node\\Expr\|null given#'
|
||||
- '#Parameter \#2 \$name of method Rector\\Core\\Rector\\AbstractRector\:\:isVariableName\(\) expects string, string\|null given#'
|
||||
- '#Method Rector\\PostRector\\Rector\\AbstractPostRector\:\:wrapToArg\(\) should return array<PhpParser\\Node\\Arg\> but returns array<PhpParser\\Node\\Arg\|PhpParser\\Node\\Expr\>#'
|
||||
|
|
|
@ -8,11 +8,11 @@ use Nette\Utils\Strings;
|
|||
use PhpParser\Node;
|
||||
use PhpParser\Node\Expr\Assign;
|
||||
use PhpParser\Node\Stmt\ClassMethod;
|
||||
use Rector\Core\PhpParser\Node\Commander\NodeRemovingCommander;
|
||||
use Rector\Core\PhpParser\Node\Manipulator\PropertyFetchManipulator;
|
||||
use Rector\Core\PhpParser\Node\Value\ValueResolver;
|
||||
use Rector\Core\PhpParser\NodeTraverser\CallableNodeTraverser;
|
||||
use Rector\NodeTypeResolver\Node\AttributeKey;
|
||||
use Rector\PostRector\Collector\NodesToRemoveCollector;
|
||||
|
||||
final class TemplatePathResolver
|
||||
{
|
||||
|
@ -32,20 +32,20 @@ final class TemplatePathResolver
|
|||
private $valueResolver;
|
||||
|
||||
/**
|
||||
* @var NodeRemovingCommander
|
||||
* @var NodesToRemoveCollector
|
||||
*/
|
||||
private $nodeRemovingCommander;
|
||||
private $nodesToRemoveCollector;
|
||||
|
||||
public function __construct(
|
||||
CallableNodeTraverser $callableNodeTraverser,
|
||||
PropertyFetchManipulator $propertyFetchManipulator,
|
||||
ValueResolver $valueResolver,
|
||||
NodeRemovingCommander $nodeRemovingCommander
|
||||
NodesToRemoveCollector $nodesToRemoveCollector
|
||||
) {
|
||||
$this->callableNodeTraverser = $callableNodeTraverser;
|
||||
$this->propertyFetchManipulator = $propertyFetchManipulator;
|
||||
$this->valueResolver = $valueResolver;
|
||||
$this->nodeRemovingCommander = $nodeRemovingCommander;
|
||||
$this->nodesToRemoveCollector = $nodesToRemoveCollector;
|
||||
}
|
||||
|
||||
public function resolveForClassMethod(ClassMethod $classMethod): string
|
||||
|
@ -87,7 +87,7 @@ final class TemplatePathResolver
|
|||
|
||||
$setViewProperty = $node->expr;
|
||||
|
||||
$this->nodeRemovingCommander->addNode($node);
|
||||
$this->nodesToRemoveCollector->addNodeToRemove($node);
|
||||
});
|
||||
|
||||
if ($setViewProperty === null) {
|
||||
|
|
|
@ -19,12 +19,12 @@ use PHPStan\Type\BooleanType;
|
|||
use Prophecy\Doubler\Generator\Node\MethodNode;
|
||||
use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfo;
|
||||
use Rector\Core\PhpParser\Node\Commander\NodeAddingCommander;
|
||||
use Rector\Core\PhpParser\Node\Commander\NodeRemovingCommander;
|
||||
use Rector\Core\PhpParser\Node\Value\ValueResolver;
|
||||
use Rector\NodeNameResolver\NodeNameResolver;
|
||||
use Rector\NodeTypeResolver\Node\AttributeKey;
|
||||
use Rector\NodeTypeResolver\NodeTypeResolver;
|
||||
use Rector\NodeTypeResolver\TypeAnalyzer\StringTypeAnalyzer;
|
||||
use Rector\PostRector\Collector\NodesToRemoveCollector;
|
||||
|
||||
final class AssertManipulator
|
||||
{
|
||||
|
@ -86,30 +86,30 @@ final class AssertManipulator
|
|||
*/
|
||||
private $nodeAddingCommander;
|
||||
|
||||
/**
|
||||
* @var NodeRemovingCommander
|
||||
*/
|
||||
private $nodeRemovingCommander;
|
||||
|
||||
/**
|
||||
* @var StringTypeAnalyzer
|
||||
*/
|
||||
private $stringTypeAnalyzer;
|
||||
|
||||
/**
|
||||
* @var NodesToRemoveCollector
|
||||
*/
|
||||
private $nodesToRemoveCollector;
|
||||
|
||||
public function __construct(
|
||||
NodeNameResolver $nodeNameResolver,
|
||||
NodeTypeResolver $nodeTypeResolver,
|
||||
ValueResolver $valueResolver,
|
||||
NodeAddingCommander $nodeAddingCommander,
|
||||
NodeRemovingCommander $nodeRemovingCommander,
|
||||
NodesToRemoveCollector $nodesToRemoveCollector,
|
||||
StringTypeAnalyzer $stringTypeAnalyzer
|
||||
) {
|
||||
$this->nodeNameResolver = $nodeNameResolver;
|
||||
$this->nodeTypeResolver = $nodeTypeResolver;
|
||||
$this->valueResolver = $valueResolver;
|
||||
$this->nodeAddingCommander = $nodeAddingCommander;
|
||||
$this->nodeRemovingCommander = $nodeRemovingCommander;
|
||||
$this->stringTypeAnalyzer = $stringTypeAnalyzer;
|
||||
$this->nodesToRemoveCollector = $nodesToRemoveCollector;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -196,7 +196,7 @@ final class AssertManipulator
|
|||
$this->nodeAddingCommander->addNodeAfterNode($callableStmt, $staticCall);
|
||||
}
|
||||
|
||||
$this->nodeRemovingCommander->addNode($staticCall);
|
||||
$this->nodesToRemoveCollector->addNodeToRemove($staticCall);
|
||||
}
|
||||
|
||||
private function processTypeCall(StaticCall $staticCall): void
|
||||
|
@ -225,7 +225,7 @@ final class AssertManipulator
|
|||
$this->nodeAddingCommander->addNodeAfterNode($callableStmt, $staticCall);
|
||||
}
|
||||
|
||||
$this->nodeRemovingCommander->addNode($staticCall);
|
||||
$this->nodesToRemoveCollector->addNodeToRemove($staticCall);
|
||||
|
||||
/** @var ClassMethod|null $methodNode */
|
||||
$methodNode = $staticCall->getAttribute(AttributeKey::METHOD_NODE);
|
||||
|
|
|
@ -10,11 +10,11 @@ use PhpParser\Node\Expr\MethodCall;
|
|||
use PhpParser\Node\Expr\PropertyFetch;
|
||||
use PhpParser\Node\Expr\Variable;
|
||||
use PhpParser\Node\Stmt\Class_;
|
||||
use Rector\Core\PhpParser\Node\Commander\NodeRemovingCommander;
|
||||
use Rector\Core\PhpParser\Node\Value\ValueResolver;
|
||||
use Rector\Core\PhpParser\NodeTraverser\CallableNodeTraverser;
|
||||
use Rector\NodeNameResolver\NodeNameResolver;
|
||||
use Rector\NodeTypeResolver\Node\AttributeKey;
|
||||
use Rector\PostRector\Collector\NodesToRemoveCollector;
|
||||
use Rector\SymfonyPHPUnit\Naming\ServiceNaming;
|
||||
use Rector\SymfonyPHPUnit\Node\KernelTestCaseNodeAnalyzer;
|
||||
|
||||
|
@ -35,11 +35,6 @@ final class OnContainerGetCallManipulator
|
|||
*/
|
||||
private $serviceNaming;
|
||||
|
||||
/**
|
||||
* @var NodeRemovingCommander
|
||||
*/
|
||||
private $nodeRemovingCommander;
|
||||
|
||||
/**
|
||||
* @var KernelTestCaseNodeAnalyzer
|
||||
*/
|
||||
|
@ -50,20 +45,25 @@ final class OnContainerGetCallManipulator
|
|||
*/
|
||||
private $valueResolver;
|
||||
|
||||
/**
|
||||
* @var NodesToRemoveCollector
|
||||
*/
|
||||
private $nodesToRemoveCollector;
|
||||
|
||||
public function __construct(
|
||||
NodeNameResolver $nodeNameResolver,
|
||||
CallableNodeTraverser $callableNodeTraverser,
|
||||
ServiceNaming $serviceNaming,
|
||||
NodeRemovingCommander $nodeRemovingCommander,
|
||||
NodesToRemoveCollector $nodesToRemoveCollector,
|
||||
KernelTestCaseNodeAnalyzer $kernelTestCaseNodeAnalyzer,
|
||||
ValueResolver $valueResolver
|
||||
) {
|
||||
$this->nodeNameResolver = $nodeNameResolver;
|
||||
$this->callableNodeTraverser = $callableNodeTraverser;
|
||||
$this->serviceNaming = $serviceNaming;
|
||||
$this->nodeRemovingCommander = $nodeRemovingCommander;
|
||||
$this->kernelTestCaseNodeAnalyzer = $kernelTestCaseNodeAnalyzer;
|
||||
$this->valueResolver = $valueResolver;
|
||||
$this->nodesToRemoveCollector = $nodesToRemoveCollector;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -160,6 +160,6 @@ final class OnContainerGetCallManipulator
|
|||
$methodName = $methodCall->getAttribute(AttributeKey::METHOD_NAME);
|
||||
$formerVariablesByMethods[$methodName][$variableName] = $type;
|
||||
|
||||
$this->nodeRemovingCommander->addNode($assign);
|
||||
$this->nodesToRemoveCollector->addNodeToRemove($assign);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -14,6 +14,7 @@ use Rector\Core\PhpParser\Printer\FormatPerservingPrinter;
|
|||
use Rector\Core\Stubs\StubLoader;
|
||||
use Rector\NodeTypeResolver\FileSystem\CurrentFileInfoProvider;
|
||||
use Rector\NodeTypeResolver\NodeScopeAndMetadataDecorator;
|
||||
use Rector\PostRector\Application\PostFileProcessor;
|
||||
use Symplify\SmartFileSystem\SmartFileInfo;
|
||||
|
||||
final class FileProcessor
|
||||
|
|
|
@ -15,10 +15,10 @@ use PhpParser\Node\Stmt\Interface_;
|
|||
use PhpParser\Node\Stmt\Property;
|
||||
use PhpParser\Node\Stmt\Trait_;
|
||||
use Rector\Core\Exception\ShouldNotHappenException;
|
||||
use Rector\Core\PhpParser\Node\Commander\NodeRemovingCommander;
|
||||
use Rector\Core\PhpParser\NodeTraverser\CallableNodeTraverser;
|
||||
use Rector\NodeNameResolver\NodeNameResolver;
|
||||
use Rector\NodeTypeResolver\NodeTypeResolver;
|
||||
use Rector\PostRector\Collector\NodesToRemoveCollector;
|
||||
|
||||
final class ClassManipulator
|
||||
{
|
||||
|
@ -32,11 +32,6 @@ final class ClassManipulator
|
|||
*/
|
||||
private $callableNodeTraverser;
|
||||
|
||||
/**
|
||||
* @var NodeRemovingCommander
|
||||
*/
|
||||
private $nodeRemovingCommander;
|
||||
|
||||
/**
|
||||
* @var NodeTypeResolver
|
||||
*/
|
||||
|
@ -47,18 +42,23 @@ final class ClassManipulator
|
|||
*/
|
||||
private $propertyFetchManipulator;
|
||||
|
||||
/**
|
||||
* @var NodesToRemoveCollector
|
||||
*/
|
||||
private $nodesToRemoveCollector;
|
||||
|
||||
public function __construct(
|
||||
NodeNameResolver $nodeNameResolver,
|
||||
CallableNodeTraverser $callableNodeTraverser,
|
||||
NodeRemovingCommander $nodeRemovingCommander,
|
||||
NodesToRemoveCollector $nodesToRemoveCollector,
|
||||
NodeTypeResolver $nodeTypeResolver,
|
||||
PropertyFetchManipulator $propertyFetchManipulator
|
||||
) {
|
||||
$this->nodeNameResolver = $nodeNameResolver;
|
||||
$this->callableNodeTraverser = $callableNodeTraverser;
|
||||
$this->nodeRemovingCommander = $nodeRemovingCommander;
|
||||
$this->nodeTypeResolver = $nodeTypeResolver;
|
||||
$this->propertyFetchManipulator = $propertyFetchManipulator;
|
||||
$this->nodesToRemoveCollector = $nodesToRemoveCollector;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -247,7 +247,7 @@ final class ClassManipulator
|
|||
continue;
|
||||
}
|
||||
|
||||
$this->nodeRemovingCommander->addNode($implement);
|
||||
$this->nodesToRemoveCollector->addNodeToRemove($implement);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -289,7 +289,7 @@ final class ClassManipulator
|
|||
return null;
|
||||
}
|
||||
|
||||
$this->nodeRemovingCommander->addNode($node);
|
||||
$this->nodesToRemoveCollector->addNodeToRemove($node);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,90 +0,0 @@
|
|||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Rector\Core\PhpParser\Node\NodeVisitor;
|
||||
|
||||
use PhpParser\Node;
|
||||
use PhpParser\Node\Expr;
|
||||
use PhpParser\Node\Expr\MethodCall;
|
||||
use PhpParser\Node\Stmt;
|
||||
use PhpParser\NodeTraverser;
|
||||
use PhpParser\NodeVisitorAbstract;
|
||||
use Rector\Core\PhpParser\Node\NodeFactory;
|
||||
use Rector\NodeNameResolver\NodeNameResolver;
|
||||
|
||||
final class NodeRemovingNodeVisitor extends NodeVisitorAbstract
|
||||
{
|
||||
/**
|
||||
* @var Stmt[]|Expr[]
|
||||
*/
|
||||
private $nodesToRemove = [];
|
||||
|
||||
/**
|
||||
* @var NodeFactory
|
||||
*/
|
||||
private $nodeFactory;
|
||||
|
||||
/**
|
||||
* @var NodeNameResolver
|
||||
*/
|
||||
private $nodeNameResolver;
|
||||
|
||||
/**
|
||||
* @param Stmt[] $nodesToRemove
|
||||
*/
|
||||
public function __construct(array $nodesToRemove, NodeFactory $nodeFactory, NodeNameResolver $nodeNameResolver)
|
||||
{
|
||||
$this->nodesToRemove = $nodesToRemove;
|
||||
$this->nodeFactory = $nodeFactory;
|
||||
$this->nodeNameResolver = $nodeNameResolver;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return int|Node|null
|
||||
*/
|
||||
public function enterNode(Node $node)
|
||||
{
|
||||
// special case for fluent methods
|
||||
foreach ($this->nodesToRemove as $key => $nodeToRemove) {
|
||||
if (! $nodeToRemove instanceof MethodCall) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (! $node instanceof MethodCall || ! $node->var instanceof MethodCall) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if ($nodeToRemove !== $node->var) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$methodName = $this->nodeNameResolver->getName($node->name);
|
||||
if ($methodName === null) {
|
||||
continue;
|
||||
}
|
||||
|
||||
unset($this->nodesToRemove[$key]);
|
||||
|
||||
return $this->nodeFactory->createMethodCall($node->var->var, $methodName, $node->args);
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return int|Node|Node[]|null
|
||||
*/
|
||||
public function leaveNode(Node $node)
|
||||
{
|
||||
foreach ($this->nodesToRemove as $key => $nodeToRemove) {
|
||||
if ($node === $nodeToRemove) {
|
||||
unset($this->nodesToRemove[$key]);
|
||||
|
||||
return NodeTraverser::REMOVE_NODE;
|
||||
}
|
||||
}
|
||||
|
||||
return $node;
|
||||
}
|
||||
}
|
|
@ -1,37 +0,0 @@
|
|||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Rector\Core\PhpParser\Node\NodeVisitorFactory;
|
||||
|
||||
use PhpParser\Node;
|
||||
use Rector\Core\PhpParser\Node\NodeFactory;
|
||||
use Rector\Core\PhpParser\Node\NodeVisitor\NodeRemovingNodeVisitor;
|
||||
use Rector\NodeNameResolver\NodeNameResolver;
|
||||
|
||||
final class NodeRemovingNodeVisitorFactory
|
||||
{
|
||||
/**
|
||||
* @var NodeFactory
|
||||
*/
|
||||
private $nodeFactory;
|
||||
|
||||
/**
|
||||
* @var NodeNameResolver
|
||||
*/
|
||||
private $nodeNameResolver;
|
||||
|
||||
public function __construct(NodeFactory $nodeFactory, NodeNameResolver $nodeNameResolver)
|
||||
{
|
||||
$this->nodeFactory = $nodeFactory;
|
||||
$this->nodeNameResolver = $nodeNameResolver;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param Node[] $nodesToRemove
|
||||
*/
|
||||
public function createFromNodesToRemove(array $nodesToRemove): NodeRemovingNodeVisitor
|
||||
{
|
||||
return new NodeRemovingNodeVisitor($nodesToRemove, $this->nodeFactory, $this->nodeNameResolver);
|
||||
}
|
||||
}
|
|
@ -20,7 +20,6 @@ use Rector\Core\Configuration\Option;
|
|||
use Rector\Core\Contract\Rector\PhpRectorInterface;
|
||||
use Rector\Core\Exclusion\ExclusionManager;
|
||||
use Rector\Core\Logging\CurrentRectorProvider;
|
||||
use Rector\NodeTypeResolver\FileSystem\CurrentFileInfoProvider;
|
||||
use Rector\NodeTypeResolver\Node\AttributeKey;
|
||||
use Rector\NodeTypeResolver\PhpDoc\NodeAnalyzer\DocBlockManipulator;
|
||||
use Rector\StaticTypeMapper\StaticTypeMapper;
|
||||
|
@ -59,11 +58,6 @@ abstract class AbstractRector extends NodeVisitorAbstract implements PhpRectorIn
|
|||
*/
|
||||
private $exclusionManager;
|
||||
|
||||
/**
|
||||
* @var CurrentFileInfoProvider
|
||||
*/
|
||||
private $currentFileInfoProvider;
|
||||
|
||||
/**
|
||||
* @var PhpDocInfoPrinter
|
||||
*/
|
||||
|
@ -109,7 +103,6 @@ abstract class AbstractRector extends NodeVisitorAbstract implements PhpRectorIn
|
|||
PhpVersionProvider $phpVersionProvider,
|
||||
BuilderFactory $builderFactory,
|
||||
ExclusionManager $exclusionManager,
|
||||
CurrentFileInfoProvider $currentFileInfoProvider,
|
||||
PhpDocInfoPrinter $phpDocInfoPrinter,
|
||||
DocBlockManipulator $docBlockManipulator,
|
||||
StaticTypeMapper $staticTypeMapper,
|
||||
|
@ -120,7 +113,6 @@ abstract class AbstractRector extends NodeVisitorAbstract implements PhpRectorIn
|
|||
$this->phpVersionProvider = $phpVersionProvider;
|
||||
$this->builderFactory = $builderFactory;
|
||||
$this->exclusionManager = $exclusionManager;
|
||||
$this->currentFileInfoProvider = $currentFileInfoProvider;
|
||||
$this->phpDocInfoPrinter = $phpDocInfoPrinter;
|
||||
$this->docBlockManipulator = $docBlockManipulator;
|
||||
$this->staticTypeMapper = $staticTypeMapper;
|
||||
|
|
|
@ -9,6 +9,7 @@ use PhpParser\Node;
|
|||
use PhpParser\Node\Stmt\Class_;
|
||||
use Rector\ChangesReporting\Rector\AbstractRector\NotifyingRemovingNodeTrait;
|
||||
use Rector\Doctrine\AbstractRector\DoctrineTrait;
|
||||
use Rector\PostRector\Rector\AbstractRector\NodeCommandersTrait;
|
||||
|
||||
trait AbstractRectorTrait
|
||||
{
|
||||
|
|
|
@ -17,7 +17,6 @@ use PhpParser\Node\Stmt\Expression;
|
|||
use PhpParser\Node\Stmt\Property;
|
||||
use PhpParser\Node\Stmt\PropertyProperty;
|
||||
use Rector\Core\Exception\ShouldNotHappenException;
|
||||
use Rector\Core\PhpParser\Node\Commander\NodeRemovingCommander;
|
||||
use Rector\Core\PhpParser\Node\Manipulator\PropertyManipulator;
|
||||
use Rector\Core\PhpParser\Printer\BetterStandardPrinter;
|
||||
use Rector\DeadCode\NodeManipulator\LivingCodeManipulator;
|
||||
|
@ -26,10 +25,11 @@ use Rector\NodeCollector\NodeFinder\FunctionLikeParsedNodesFinder;
|
|||
use Rector\NodeCollector\NodeFinder\MethodCallParsedNodesFinder;
|
||||
use Rector\NodeCollector\ValueObject\ArrayCallable;
|
||||
use Rector\NodeTypeResolver\Node\AttributeKey;
|
||||
use Rector\PostRector\Collector\NodesToRemoveCollector;
|
||||
|
||||
/**
|
||||
* Located in another trait ↓
|
||||
* @property NodeRemovingCommander $nodeRemovingCommander
|
||||
* @property NodesToRemoveCollector $nodesToRemoveCollector
|
||||
* @property FunctionLikeParsedNodesFinder $functionLikeParsedNodesFinder
|
||||
*/
|
||||
trait ComplexRemovalTrait
|
||||
|
@ -126,7 +126,7 @@ trait ComplexRemovalTrait
|
|||
$this->removeNode($propertyProperty);
|
||||
|
||||
foreach ($property->props as $prop) {
|
||||
if (! $this->nodeRemovingCommander->isNodeRemoved($prop)) {
|
||||
if (! $this->nodesToRemoveCollector->isNodeRemoved($prop)) {
|
||||
// if the property has at least one node left -> return
|
||||
return;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue
Block a user