Skip to content

Commit 842378f

Browse files
committed
make RectorNodeTraverser immutable
1 parent 9bcc8ab commit 842378f

4 files changed

Lines changed: 13 additions & 284 deletions

File tree

phpstan.neon

Lines changed: 1 addition & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ includes:
55
parameters:
66
level: 8
77

8-
# reportUnmatchedIgnoredErrors: false
8+
reportUnmatchedIgnoredErrors: false
99

1010
errorFormat: symplify
1111

@@ -373,25 +373,11 @@ parameters:
373373
- '#Method Rector\\Utils\\Rector\\RemoveRefactorDuplicatedNodeInstanceCheckRector\:\:getInstanceofNodeClass\(\) should return class\-string<PhpParser\\Node>\|null but returns class\-string#'
374374

375375
# copied from /vendor, to keep as original as possible
376-
-
377-
identifier: missingType.iterableValue
378-
path: src/PhpParser/NodeTraverser/RectorNodeTraverser.php
379376
-
380377
identifier: symplify.noDynamicName
381378
path: src/PhpParser/NodeTraverser/RectorNodeTraverser.php
382379
-
383380
identifier: offsetAccess.nonArray
384-
<<<<<<< HEAD
385-
path: src/PhpParser/NodeTraverser/AbstractImmutableNodeTraverser.php
386-
387-
=======
388-
path: src/PhpParser/NodeTraverser/RectorNodeTraverser.php
389-
-
390-
message: '#Property PhpParser\\Node\\Stmt\\ClassMethod\:\:\$stmts \(array<PhpParser\\Node\\Stmt>\|null\) does not accept array<PhpParser\\Node>#'
391-
path: scripts/create-immutable-node-visitor.php
392-
>>>>>>> bb4e608ca7 ([int] merge AbstractImmutableNodeTraverser and RectorNodeTraverser as sole child and tight design)
393-
-
394-
message: '#Property Rector\\PhpParser\\NodeTraverser\\AbstractImmutableNodeTraverser\:\:\$visitors \(list<PhpParser\\NodeVisitor>\) does not accept array<int\|string, PhpParser\\NodeVisitor>#'
395381
path: src/PhpParser/NodeTraverser/RectorNodeTraverser.php
396382

397383
# false positive

src/PhpParser/NodeTraverser/AbstractImmutableNodeTraverser.php

Lines changed: 0 additions & 236 deletions
This file was deleted.

src/PhpParser/NodeTraverser/RectorNodeTraverser.php

Lines changed: 11 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
* - no leaveNode(), as we do all in enterNode() that calls refactor() method
2626
* - cached visitors per node class for performance, e.g. when we find rules for Class_ node, they're cached for next time
2727
* - immutability features, register Rector rules once, then use; no changes on the fly
28+
* @see \Rector\Tests\PhpParser\NodeTraverser\RectorNodeTraverserTest
2829
*/
2930
final class RectorNodeTraverser implements NodeTraverserInterface
3031
{
@@ -55,17 +56,6 @@ public function __construct(
5556
) {
5657
}
5758

58-
// /**
59-
// * @param Stmt[] $rectors
60-
// * @return Stmt[]
61-
// */
62-
// public function traverse(array $nodes): array
63-
// {
64-
// $this->prepareNodeVisitors();
65-
//
66-
// return parent::traverse($nodes);
67-
// }
68-
6959
/**
7060
* @param RectorInterface[] $rectors
7161
* @api used in tests to update the active rules
@@ -93,20 +83,23 @@ public function getVisitorsForNode(Node $node): array
9383
{
9484
$nodeClass = $node::class;
9585

86+
if (! $this->areNodeVisitorsPrepared) {
87+
$this->prepareNodeVisitors();
88+
}
89+
9690
if (! isset($this->visitorsPerNodeClass[$nodeClass])) {
9791
$this->visitorsPerNodeClass[$nodeClass] = [];
9892

99-
/** @var RectorInterface $visitor */
100-
foreach ($this->visitors as $visitor) {
101-
foreach ($visitor->getNodeTypes() as $nodeType) {
93+
foreach ($this->rectors as $rector) {
94+
foreach ($rector->getNodeTypes() as $nodeType) {
10295
// BC layer matching
10396
if ($nodeType === FileWithoutNamespace::class && $nodeClass === FileNode::class) {
104-
$this->visitorsPerNodeClass[$nodeClass][] = $visitor;
97+
$this->visitorsPerNodeClass[$nodeClass][] = $rector;
10598
continue;
10699
}
107100

108101
if (is_a($nodeClass, $nodeType, true)) {
109-
$this->visitorsPerNodeClass[$nodeClass][] = $visitor;
102+
$this->visitorsPerNodeClass[$nodeClass][] = $rector;
110103
continue 2;
111104
}
112105
}
@@ -116,24 +109,9 @@ public function getVisitorsForNode(Node $node): array
116109
return $this->visitorsPerNodeClass[$nodeClass];
117110
}
118111

119-
/**
120-
// * Create a traverser with the given visitors.
121-
// *
122-
// * @param NodeVisitor ...$visitor Node visitors
123-
// */
124-
// public function __construct(NodeVisitor ...$visitors)
125-
// {
126-
// $this->visitors = $visitors;
127-
// }
128-
129-
/**
130-
* Adds a visitor.
131-
*
132-
* @deprecated @todo remove completely, even in tests to avoid mutable state
133-
*/
134112
public function addVisitor(NodeVisitor $visitor): void
135113
{
136-
$this->visitors[] = $visitor;
114+
throw new ShouldNotHappenException('The immutable node traverser does not support adding visitors.');
137115
}
138116

139117
public function removeVisitor(NodeVisitor $visitor): void
@@ -253,7 +231,7 @@ private function traverseNode(Node $node): void
253231

254232
/**
255233
* @param Node[] $nodes
256-
* @return \PhpParser\Node[] Result of traversal (may be original array or changed one)
234+
* @return Node[] Result of traversal (may be original array or changed one)
257235
*/
258236
private function traverseArray(array $nodes): array
259237
{

tests/PhpParser/NodeTraverser/RectorNodeTraverserTest.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ public function testGetVisitorsForNodeWhenNoVisitorsMatch(): void
5858
public function testGetVisitorsForNodeWhenSomeVisitorsMatch(): void
5959
{
6060
$class = new Class_('test');
61+
6162
$this->rectorNodeTraverser->refreshPhpRectors([
6263
$this->ruleUsingFunctionRector,
6364
$this->ruleUsingClassRector,

0 commit comments

Comments
 (0)