Skip to content

Commit b018bd5

Browse files
authored
[internal] make addVisitor() immutable, remove obsolete script to build traverser (#7825)
* cleanup * cleanup, mark refreshPhpRectors() as internal to avoid missuse * make addVisitor() immutable
1 parent 815e309 commit b018bd5

File tree

5 files changed

+18
-277
lines changed

5 files changed

+18
-277
lines changed

phpstan.neon

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -386,9 +386,7 @@ parameters:
386386
-
387387
identifier: offsetAccess.nonArray
388388
path: src/PhpParser/NodeTraverser/AbstractImmutableNodeTraverser.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
389+
392390
-
393391
message: '#Property Rector\\PhpParser\\NodeTraverser\\AbstractImmutableNodeTraverser\:\:\$visitors \(list<PhpParser\\NodeVisitor>\) does not accept array<int\|string, PhpParser\\NodeVisitor>#'
394392
path: src/PhpParser/NodeTraverser/AbstractImmutableNodeTraverser.php

scripts/create-immutable-node-visitor.php

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

src/PhpParser/NodeTraverser/AbstractImmutableNodeTraverser.php

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -34,14 +34,9 @@ public function __construct(NodeVisitor ...$visitors)
3434
$this->visitors = $visitors;
3535
}
3636

37-
/**
38-
* Adds a visitor.
39-
*
40-
* @param NodeVisitor $visitor Visitor to add
41-
*/
4237
public function addVisitor(NodeVisitor $visitor): void
4338
{
44-
$this->visitors[] = $visitor;
39+
throw new ShouldNotHappenException('The immutable node traverser does not support adding visitors.');
4540
}
4641

4742
public function removeVisitor(NodeVisitor $visitor): void

src/PhpParser/NodeTraverser/RectorNodeTraverser.php

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
use Rector\PhpParser\Node\CustomNode\FileWithoutNamespace;
1313
use Rector\PhpParser\Node\FileNode;
1414
use Rector\VersionBonding\PhpVersionedFilter;
15+
use Webmozart\Assert\Assert;
1516

1617
/**
1718
* @see \Rector\Tests\PhpParser\NodeTraverser\RectorNodeTraverserTest
@@ -50,14 +51,20 @@ public function traverse(array $nodes): array
5051
/**
5152
* @param RectorInterface[] $rectors
5253
* @api used in tests to update the active rules
54+
*
55+
* @internal Used only in Rector core, not supported outside. Might change any time.
5356
*/
5457
public function refreshPhpRectors(array $rectors): void
5558
{
59+
Assert::allIsInstanceOf($rectors, RectorInterface::class);
60+
5661
$this->rectors = $rectors;
5762
$this->visitors = [];
5863
$this->visitorsPerNodeClass = [];
5964

6065
$this->areNodeVisitorsPrepared = false;
66+
67+
$this->prepareNodeVisitors();
6168
}
6269

6370
/**

tests/PhpParser/NodeTraverser/RectorNodeTraverserTest.php

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ public function testGetVisitorsForNodeWhenNoVisitorsAvailable(): void
4848
public function testGetVisitorsForNodeWhenNoVisitorsMatch(): void
4949
{
5050
$class = new Class_('test');
51-
$this->rectorNodeTraverser->addVisitor($this->ruleUsingFunctionRector);
51+
$this->rectorNodeTraverser->refreshPhpRectors([$this->ruleUsingFunctionRector]);
5252

5353
$visitors = $this->rectorNodeTraverser->getVisitorsForNode($class);
5454

@@ -58,8 +58,10 @@ public function testGetVisitorsForNodeWhenNoVisitorsMatch(): void
5858
public function testGetVisitorsForNodeWhenSomeVisitorsMatch(): void
5959
{
6060
$class = new Class_('test');
61-
$this->rectorNodeTraverser->addVisitor($this->ruleUsingFunctionRector);
62-
$this->rectorNodeTraverser->addVisitor($this->ruleUsingClassRector);
61+
$this->rectorNodeTraverser->refreshPhpRectors([
62+
$this->ruleUsingFunctionRector,
63+
$this->ruleUsingClassRector,
64+
]);
6365

6466
$visitors = $this->rectorNodeTraverser->getVisitorsForNode($class);
6567

@@ -69,8 +71,10 @@ public function testGetVisitorsForNodeWhenSomeVisitorsMatch(): void
6971
public function testGetVisitorsForNodeWhenAllVisitorsMatch(): void
7072
{
7173
$class = new Class_('test');
72-
$this->rectorNodeTraverser->addVisitor($this->ruleUsingClassRector);
73-
$this->rectorNodeTraverser->addVisitor($this->ruleUsingClassLikeRector);
74+
$this->rectorNodeTraverser->refreshPhpRectors([
75+
$this->ruleUsingClassRector,
76+
$this->ruleUsingClassLikeRector,
77+
]);
7478

7579
$visitors = $this->rectorNodeTraverser->getVisitorsForNode($class);
7680

0 commit comments

Comments
 (0)