Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
"require": {
"php": "^8.2",
"clue/ndjson-react": "^1.3",
"composer/pcre": "^3.3.0",
"composer/pcre": "^3.3.2",
"composer/semver": "^3.4",
"composer/xdebug-handler": "^3.0.5",
"doctrine/inflector": "^2.1",
Expand Down Expand Up @@ -50,7 +50,7 @@
"phpstan/phpstan-phpunit": "^2.0",
"phpstan/phpstan-webmozart-assert": "^2.0",
"phpunit/phpunit": "^11.5",
"rector/jack": "^0.4.0",
"rector/jack": "^0.4",
"rector/release-notes-generator": "^0.5",
"rector/swiss-knife": "^2.3",
"rector/type-perfect": "^2.1",
Expand Down
17 changes: 17 additions & 0 deletions src/PhpParser/NodeTraverser/AbstractImmutableNodeTraverser.php
Original file line number Diff line number Diff line change
Expand Up @@ -105,9 +105,19 @@ protected function traverseNode(Node $node): void
$return = $visitor->enterNode($subNode);
if ($return !== null) {
if ($return instanceof Node) {
$originalSubNodeClass = $subNode::class;

$this->ensureReplacementReasonable($subNode, $return);
$subNode = $return;
$node->{$name} = $return;

if ($originalSubNodeClass !== $subNode::class) {
// stop traversing as node has changed its class and visitors do not work
$traverseChildren = false;
$this->stopTraversal = true;
Comment thread
samsonasik marked this conversation as resolved.
Outdated
break 2;
}

} elseif ($return === NodeVisitor::DONT_TRAVERSE_CHILDREN) {
$traverseChildren = false;
} elseif ($return === NodeVisitor::DONT_TRAVERSE_CURRENT_AND_CHILDREN) {
Expand Down Expand Up @@ -181,8 +191,15 @@ protected function traverseArray(array $nodes): array
$return = $visitor->enterNode($node);
if ($return !== null) {
if ($return instanceof Node) {
$originalNodeNodeClass = $node::class;
$this->ensureReplacementReasonable($node, $return);
$nodes[$i] = $node = $return;

if ($originalNodeNodeClass !== $return::class) {
// stop traversing as node has changed its class and visitors do not work
$this->stopTraversal = true;
break 2;
Comment thread
TomasVotruba marked this conversation as resolved.
Outdated
}
} elseif (\is_array($return)) {
$doNodes[] = [$i, $return];
continue 2;
Expand Down
1 change: 1 addition & 0 deletions src/PhpParser/NodeTraverser/RectorNodeTraverser.php
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,7 @@ public function getVisitorsForNode(Node $node): array

if (! isset($this->visitorsPerNodeClass[$nodeClass])) {
$this->visitorsPerNodeClass[$nodeClass] = [];

/** @var RectorInterface $visitor */
foreach ($this->visitors as $visitor) {
foreach ($visitor->getNodeTypes() as $nodeType) {
Expand Down
16 changes: 0 additions & 16 deletions src/Rector/AbstractRector.php
Original file line number Diff line number Diff line change
Expand Up @@ -132,10 +132,6 @@ public function beforeTraverse(array $nodes): ?array
*/
final public function enterNode(Node $node): int|Node|null
{
if (! $this->isMatchingNodeType($node)) {
return null;
}

if (is_a($this, HTMLAverseRectorInterface::class, true) && $this->file->containsHTML()) {
return null;
}
Expand Down Expand Up @@ -317,16 +313,4 @@ private function refreshScopeNodes(array | Node $node, string $filePath, ?Mutati
$this->changedNodeScopeRefresher->refresh($node, $filePath, $mutatingScope);
}
}

private function isMatchingNodeType(Node $node): bool
{
$nodeClass = $node::class;
foreach ($this->getNodeTypes() as $nodeType) {
if (is_a($nodeClass, $nodeType, true)) {
return true;
}
}

return false;
}
}