Skip to content

Commit

Permalink
[1.0] Replace NodeConnectingVisitor with ParentConnectingVisitor (#3900)
Browse files Browse the repository at this point in the history
Co-authored-by: Tomas Votruba <tomas.vot@gmail.com>
  • Loading branch information
samsonasik and TomasVotruba committed May 22, 2023
1 parent d90c645 commit 71f00d9
Show file tree
Hide file tree
Showing 7 changed files with 16 additions and 40 deletions.
2 changes: 1 addition & 1 deletion composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
"doctrine/inflector": "^2.0.6",
"fidry/cpu-core-counter": "^0.5.1",
"nette/neon": "^3.4",
"nette/utils": "^3.2.9",
"nette/utils": "^3.2",
"nikic/php-parser": "^4.15.4",
"ondram/ci-detector": "^4.1",
"phpstan/phpdoc-parser": "^1.20.3",
Expand Down
4 changes: 2 additions & 2 deletions config/config.php
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
use PhpParser\Lexer;
use PhpParser\NodeFinder;
use PhpParser\NodeVisitor\CloningVisitor;
use PhpParser\NodeVisitor\NodeConnectingVisitor;
use PhpParser\NodeVisitor\ParentConnectingVisitor;
use PHPStan\Analyser\NodeScopeResolver;
use PHPStan\Analyser\ScopeFactory;
use PHPStan\Dependency\DependencyResolver;
Expand Down Expand Up @@ -156,7 +156,7 @@

$services->set(BuilderFactory::class);
$services->set(CloningVisitor::class);
$services->set(NodeConnectingVisitor::class);
$services->set(ParentConnectingVisitor::class);
$services->set(NodeFinder::class);

$services->set(RectorConsoleOutputStyle::class)
Expand Down
3 changes: 2 additions & 1 deletion config/phpstan/static-reflection.neon
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,14 @@ parameters:
disableRuntimeReflectionProvider: false

conditionalTags:
PhpParser\NodeVisitor\NodeConnectingVisitor:
PhpParser\NodeVisitor\ParentConnectingVisitor:
phpstan.parser.richParserNodeVisitor: true

services:
- Rector\NodeTypeResolver\Reflection\BetterReflection\RectorBetterReflectionSourceLocatorFactory
- Rector\NodeTypeResolver\Reflection\BetterReflection\SourceLocator\IntermediateSourceLocator
- Rector\NodeTypeResolver\Reflection\BetterReflection\SourceLocatorProvider\DynamicSourceLocatorProvider
- PhpParser\NodeVisitor\ParentConnectingVisitor

# basically decorates native PHPStan source locator with a dynamic source locator that is also available in Rector DI
betterReflectionSourceLocator:
Expand Down
2 changes: 2 additions & 0 deletions packages/NodeTypeResolver/Node/AttributeKey.php
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,7 @@ final class AttributeKey
public const PARENT_NODE = 'parent';

/**
* @api
* @internal of php-parser, do not change
* @deprecated Use StmtsAwareInterface instead
*
Expand All @@ -89,6 +90,7 @@ final class AttributeKey
public const PREVIOUS_NODE = 'previous';

/**
* @api
* @internal of php-parser, do not change
* @deprecated Use StmtsAwareInterface instead
*
Expand Down
9 changes: 5 additions & 4 deletions packages/NodeTypeResolver/NodeScopeAndMetadataDecorator.php
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
use PhpParser\Node\Stmt;
use PhpParser\NodeTraverser;
use PhpParser\NodeVisitor\CloningVisitor;
use PhpParser\NodeVisitor\NodeConnectingVisitor;
use PhpParser\NodeVisitor\ParentConnectingVisitor;
use Rector\Core\ValueObject\Application\File;
use Rector\NodeTypeResolver\NodeVisitor\FunctionLikeParamArgPositionNodeVisitor;
use Rector\NodeTypeResolver\PHPStan\Scope\PHPStanNodeScopeResolver;
Expand All @@ -19,16 +19,17 @@ final class NodeScopeAndMetadataDecorator
public function __construct(
CloningVisitor $cloningVisitor,
private readonly PHPStanNodeScopeResolver $phpStanNodeScopeResolver,
NodeConnectingVisitor $nodeConnectingVisitor,
ParentConnectingVisitor $parentConnectingVisitor,
FunctionLikeParamArgPositionNodeVisitor $functionLikeParamArgPositionNodeVisitor,
) {
$this->nodeTraverser = new NodeTraverser();

// needed also for format preserving printing
$this->nodeTraverser->addVisitor($cloningVisitor);

// this one has to be run again to re-connect nodes with new attributes
$this->nodeTraverser->addVisitor($nodeConnectingVisitor);
// this one has to be run again to re-connect parent nodes with new attributes
$this->nodeTraverser->addVisitor($parentConnectingVisitor);

$this->nodeTraverser->addVisitor($functionLikeParamArgPositionNodeVisitor);
}

Expand Down
4 changes: 2 additions & 2 deletions src/PhpParser/NodeTraverser/NodeConnectingTraverser.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,14 @@
namespace Rector\Core\PhpParser\NodeTraverser;

use PhpParser\NodeTraverser;
use PhpParser\NodeVisitor\NodeConnectingVisitor;
use PhpParser\NodeVisitor\ParentConnectingVisitor;

final class NodeConnectingTraverser extends NodeTraverser
{
public function __construct()
{
parent::__construct();

$this->addVisitor(new NodeConnectingVisitor());
$this->addVisitor(new ParentConnectingVisitor());
}
}
32 changes: 2 additions & 30 deletions src/Rector/AbstractRector.php
Original file line number Diff line number Diff line change
Expand Up @@ -348,7 +348,7 @@ private function postRefactorProcess(Node|null $originalNode, Node $node, Node|a
$this->mirrorComments($firstNode, $originalNode);

$this->updateParentNodes($refactoredNode, $parentNode);
$this->connectNodes($refactoredNode, $node);
$this->nodeConnectingTraverser->traverse($refactoredNode);
$this->refreshScopeNodes($refactoredNode, $filePath, $currentScope);

$this->nodesToReturn[$originalNodeHash] = $refactoredNode;
Expand All @@ -362,7 +362,7 @@ private function postRefactorProcess(Node|null $originalNode, Node $node, Node|a
: $refactoredNode;

$this->updateParentNodes($refactoredNode, $parentNode);
$this->connectNodes([$refactoredNode], $node);
$this->nodeConnectingTraverser->traverse([$refactoredNode]);
$this->refreshScopeNodes($refactoredNode, $filePath, $currentScope);

$this->nodesToReturn[$originalNodeHash] = $refactoredNode;
Expand Down Expand Up @@ -432,34 +432,6 @@ private function updateParentNodes(array | Node $node, ?Node $parentNode): void
}
}

/**
* @param non-empty-array<Node> $nodes
*/
private function connectNodes(array $nodes, Node $node): void
{
$firstNode = current($nodes);
$firstNodePreviousNode = $firstNode->getAttribute(AttributeKey::PREVIOUS_NODE);

if (! $firstNodePreviousNode instanceof Node && $node->hasAttribute(AttributeKey::PREVIOUS_NODE)) {
/** @var Node $previousNode */
$previousNode = $node->getAttribute(AttributeKey::PREVIOUS_NODE);

$nodes = [$previousNode, ...$nodes];
}

$lastNode = end($nodes);
$lastNodeNextNode = $lastNode->getAttribute(AttributeKey::NEXT_NODE);

if (! $lastNodeNextNode instanceof Node && $node->hasAttribute(AttributeKey::NEXT_NODE)) {
/** @var Node $nextNode */
$nextNode = $node->getAttribute(AttributeKey::NEXT_NODE);

$nodes = [...$nodes, $nextNode];
}

$this->nodeConnectingTraverser->traverse($nodes);
}

private function printCurrentFileAndRule(): void
{
$relativeFilePath = $this->filePathHelper->relativePath($this->file->getFilePath());
Expand Down

0 comments on commit 71f00d9

Please sign in to comment.