move NodeRemovingRector to collector

This commit is contained in:
TomasVotruba 2020-03-31 18:39:08 +02:00
parent 7f2aef3d7d
commit 629042eeb4
23 changed files with 279 additions and 236 deletions

View File

@ -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",

View File

@ -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`

View File

@ -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

View File

@ -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

View File

@ -0,0 +1,8 @@
services:
_defaults:
public: true
autowire: true
autoconfigure: true
Rector\PostRector\:
resource: '../src'

View File

@ -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
{

View File

@ -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

View File

@ -0,0 +1,10 @@
<?php
declare(strict_types=1);
namespace Rector\PostRector\Contract\Collector;
interface NodeCollectorInterface
{
public function isActive(): bool;
}

View File

@ -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;
}

View 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);
}
}

View File

@ -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);
}
/**

View 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;
}
}

View File

@ -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\>#'

View File

@ -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) {

View File

@ -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);

View File

@ -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);
}
}

View File

@ -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

View File

@ -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);
});
}
}

View File

@ -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;
}
}

View File

@ -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);
}
}

View File

@ -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;

View File

@ -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
{

View File

@ -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;
}