Skip to content

Commit 99998f1

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

File tree

7 files changed

+52
-17
lines changed

7 files changed

+52
-17
lines changed

phpstan.neon

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -433,6 +433,11 @@ parameters:
433433
- rules/Php55/Rector/String_/StringClassNameToClassConstantRector.php
434434
- rules/Php81/Enum/AttributeName.php
435435

436+
-
437+
identifier: symplify.seeAnnotationToTest
438+
paths:
439+
- tests/PhpParser/NodeTraverser/StopTraverseOnTypeChange/Class_
440+
436441
# deprecated rule
437442
- '#Rule Rector\\Php81\\Rector\\Array_\\FirstClassCallableRector must implements Rector\\VersionBonding\\Contract\\MinPhpVersionInterface#'
438443
- '#Register "Rector\\Php81\\Rector\\Array_\\FirstClassCallableRector" service to "php81\.php" config set#'

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

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,36 @@
11
<?php
22

3+
declare(strict_types=1);
4+
35
namespace Rector\Tests\PhpParser\NodeTraverser\StopTraverseOnTypeChange\Class_;
46

57
use PhpParser\Node;
8+
use PhpParser\Node\Name;
9+
use PhpParser\Node\Stmt\Class_;
10+
use PhpParser\Node\Stmt\Trait_;
611
use Rector\Rector\AbstractRector;
712
use Symplify\RuleDocGenerator\ValueObject\RuleDefinition;
813

914
final class RuleChangingClassToTraitRector extends AbstractRector
1015
{
11-
1216
public function getRuleDefinition(): RuleDefinition
1317
{
18+
return new RuleDefinition('Change node from class to trait', []);
1419
}
1520

1621
public function getNodeTypes(): array
1722
{
18-
return [Node\Stmt\Class_::class];
23+
return [Class_::class];
1924
}
2025

2126
/**
22-
* @param Node\Stmt\Class_ $node
23-
* @return Node\Stmt\Trait_
27+
* @param Class_ $node
2428
*/
25-
public function refactor(Node $node)
29+
public function refactor(Node $node): Trait_
2630
{
27-
return new Node\Stmt\Trait_('SomeTrait');
31+
$trait = new Trait_('SomeTrait');
32+
$trait->namespacedName = new Name('SomeNamespace\SomeTrait');
33+
34+
return $trait;
2835
}
2936
}

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

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
<?php
22

3+
declare(strict_types=1);
4+
35
namespace Rector\Tests\PhpParser\NodeTraverser\StopTraverseOnTypeChange\Class_;
46

57
use PhpParser\Node;
@@ -10,9 +12,9 @@
1012

1113
final class RuleCheckingClassRector extends AbstractRector
1214
{
13-
1415
public function getRuleDefinition(): RuleDefinition
1516
{
17+
return new RuleDefinition('Make sure input is class', []);
1618
}
1719

1820
public function getNodeTypes(): array
@@ -24,7 +26,7 @@ public function getNodeTypes(): array
2426
* @param Class_ $node
2527
* @return Class_
2628
*/
27-
public function refactor(Node $node)
29+
public function refactor(Node $node): Node
2830
{
2931
Assert::isInstanceOf($node, Class_::class);
3032

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: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,36 +6,45 @@
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
{
24+
parent::setUp();
25+
2126
$this->rectorNodeTraverser = $this->make(RectorNodeTraverser::class);
2227

2328
$this->rectorNodeTraverser->refreshPhpRectors([
2429
$this->make(RuleChangingClassToTraitRector::class),
25-
$this->make(RuleCheckingClassRector::class)
30+
$this->make(RuleCheckingClassRector::class),
2631
]);
2732

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

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

38-
$changedNodes = $this->rectorNodeTraverser->traverse([$class]);
39-
$this->assertContainsOnlyInstancesOf(Trait_::class, $changedNodes);
47+
$traits = $nodeFinder->findInstanceOf($changedNodes, Trait_::class);
48+
$this->assertCount(1, $traits);
4049
}
4150
}

0 commit comments

Comments
 (0)