Skip to content

Commit 983c41e

Browse files
committed
add simple test to allow node change type
1 parent 24821a6 commit 983c41e

File tree

6 files changed

+42
-16
lines changed

6 files changed

+42
-16
lines changed

src/PhpParser/NodeTraverser/AbstractImmutableNodeTraverser.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,7 @@ protected function traverseNode(Node $node): void
101101
$traverseChildren = true;
102102
$visitorIndex = -1;
103103
$currentNodeVisitors = $this->getVisitorsForNode($subNode);
104+
104105
foreach ($currentNodeVisitors as $visitorIndex => $visitor) {
105106
$return = $visitor->enterNode($subNode);
106107
if ($return !== null) {
@@ -185,6 +186,7 @@ protected function traverseArray(array $nodes): array
185186
$traverseChildren = true;
186187
$visitorIndex = -1;
187188
$currentNodeVisitors = $this->getVisitorsForNode($node);
189+
188190
foreach ($currentNodeVisitors as $visitorIndex => $visitor) {
189191
$return = $visitor->enterNode($node);
190192
if ($return !== null) {

src/PhpParser/NodeTraverser/RectorNodeTraverser.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,7 @@ private function prepareNodeVisitors(): void
9595

9696
// filer out by version
9797
$this->visitors = $this->phpVersionedFilter->filter($this->rectors);
98+
9899
// filter by configuration
99100
$this->visitors = $this->configurationRuleFilter->filter($this->visitors);
100101

tests/PhpParser/NodeTraverser/StopTraverseOnTypeChange/Class_/RuleChangingClassToTraitRector.php

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,27 +3,31 @@
33
namespace Rector\Tests\PhpParser\NodeTraverser\StopTraverseOnTypeChange\Class_;
44

55
use PhpParser\Node;
6+
use PhpParser\Node\Name;
7+
use PhpParser\Node\Stmt\Class_;
8+
use PhpParser\Node\Stmt\Trait_;
69
use Rector\Rector\AbstractRector;
710
use Symplify\RuleDocGenerator\ValueObject\RuleDefinition;
811

912
final class RuleChangingClassToTraitRector extends AbstractRector
1013
{
11-
1214
public function getRuleDefinition(): RuleDefinition
1315
{
1416
}
1517

1618
public function getNodeTypes(): array
1719
{
18-
return [Node\Stmt\Class_::class];
20+
return [Class_::class];
1921
}
2022

2123
/**
22-
* @param Node\Stmt\Class_ $node
23-
* @return Node\Stmt\Trait_
24+
* @param Class_ $node
2425
*/
25-
public function refactor(Node $node)
26+
public function refactor(Node $node): ?Trait_
2627
{
27-
return new Node\Stmt\Trait_('SomeTrait');
28+
$trait = new Trait_('SomeTrait');
29+
$trait->namespacedName = new Name('SomeNamespace\SomeTrait');
30+
31+
return $trait;
2832
}
2933
}

tests/PhpParser/NodeTraverser/StopTraverseOnTypeChange/Class_/RuleCheckingClassRector.php

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010

1111
final class RuleCheckingClassRector extends AbstractRector
1212
{
13-
1413
public function getRuleDefinition(): RuleDefinition
1514
{
1615
}
@@ -26,6 +25,10 @@ public function getNodeTypes(): array
2625
*/
2726
public function refactor(Node $node)
2827
{
28+
dump('chekc here');
29+
dump($node::class);
30+
die;
31+
2932
Assert::isInstanceOf($node, Class_::class);
3033

3134
return $node;
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Rector\Tests\PhpParser\NodeTraverser\StopTraverseOnTypeChange\Fixture;
6+
7+
final class SimpleClass
8+
{
9+
}

tests/PhpParser/NodeTraverser/StopTraverseOnTypeChange/StopTraverseOnTypeChangeTest.php

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,36 +6,43 @@
66

77
use PhpParser\Node\Stmt\Class_;
88
use PhpParser\Node\Stmt\Trait_;
9-
use Rector\Application\Provider\CurrentFileProvider;
9+
use PhpParser\NodeFinder;
1010
use Rector\PhpParser\NodeTraverser\RectorNodeTraverser;
1111
use Rector\Testing\PHPUnit\AbstractLazyTestCase;
12+
use Rector\Testing\TestingParser\TestingParser;
1213
use Rector\Tests\PhpParser\NodeTraverser\StopTraverseOnTypeChange\Class_\RuleChangingClassToTraitRector;
1314
use Rector\Tests\PhpParser\NodeTraverser\StopTraverseOnTypeChange\Class_\RuleCheckingClassRector;
1415

1516
final class StopTraverseOnTypeChangeTest extends AbstractLazyTestCase
1617
{
1718
private RectorNodeTraverser $rectorNodeTraverser;
1819

20+
private TestingParser $testingParser;
21+
1922
protected function setUp(): void
2023
{
2124
$this->rectorNodeTraverser = $this->make(RectorNodeTraverser::class);
2225

2326
$this->rectorNodeTraverser->refreshPhpRectors([
2427
$this->make(RuleChangingClassToTraitRector::class),
25-
$this->make(RuleCheckingClassRector::class)
28+
$this->make(RuleCheckingClassRector::class),
2629
]);
2730

28-
$currentFileProvider = $this->make(CurrentFileProvider::class);
29-
30-
// @todo
31-
// $currentFileProvider->setFile();
31+
$this->testingParser = $this->make(TestingParser::class);
3232
}
3333

3434
public function testGetVisitorsForNodeWhenNoVisitorsAvailable(): void
3535
{
36-
$class = new Class_('test');
36+
// must be cloned + Scope set to allow node replacement
37+
$nodes = $this->testingParser->parseFileToDecoratedNodes(__DIR__ . '/Fixture/SimpleClass.php');
38+
39+
$changedNodes = $this->rectorNodeTraverser->traverse($nodes);
40+
41+
$nodeFinder = new NodeFinder();
42+
$classes = $nodeFinder->findInstanceOf($changedNodes, Class_::class);
43+
$this->assertCount(0, $classes);
3744

38-
$changedNodes = $this->rectorNodeTraverser->traverse([$class]);
39-
$this->assertContainsOnlyInstancesOf(Trait_::class, $changedNodes);
45+
$traits = $nodeFinder->findInstanceOf($changedNodes, Trait_::class);
46+
$this->assertCount(1, $traits);
4047
}
4148
}

0 commit comments

Comments
 (0)