Skip to content

Commit 4722f41

Browse files
authored
[dx] Make registration of custom NodeVisitor is easier (#7669)
* [dx] rename ScopeResolverNodeVisitorInterface, to shorter and more explicit DecoratingNodeVisitorInterface, make its registration simple * [config] add registerDecoratingNodeVisitor()
1 parent d62611e commit 4722f41

14 files changed

+77
-27
lines changed

phpstan.neon

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -265,6 +265,11 @@ parameters:
265265
# see https://github.com/rectorphp/rector-src/actions/runs/11798721617/job/32865546672?pr=6422#step:5:110
266266
- '#Doing instanceof PHPStan\\Type\\.+ is error\-prone and deprecated#'
267267

268+
# BC layer on Rector deprecation
269+
-
270+
path: src/Configuration/RectorConfigBuilder.php
271+
identifier: classConstant.deprecatedInterface
272+
268273
# allowed internally only
269274
-
270275
message: '#Fetching (deprecated )?class constant (.*?) of (deprecated )?class (Rector\\Set\\ValueObject\\DowngradeLevelSetList|Rector\\Symfony\\Set\\(.*?))#'

src/Configuration/RectorConfigBuilder.php

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
namespace Rector\Configuration;
66

7+
use PhpParser\NodeVisitor;
78
use Rector\Bridge\SetProviderCollector;
89
use Rector\Bridge\SetRectorsResolver;
910
use Rector\Caching\Contract\ValueObject\Storage\CacheStorageInterface;
@@ -18,11 +19,13 @@
1819
use Rector\Configuration\Levels\LevelRulesResolver;
1920
use Rector\Configuration\Parameter\SimpleParameterProvider;
2021
use Rector\Console\Notifier;
22+
use Rector\Contract\PhpParser\DecoratingNodeVisitorInterface;
2123
use Rector\Contract\Rector\ConfigurableRectorInterface;
2224
use Rector\Contract\Rector\RectorInterface;
2325
use Rector\Doctrine\Set\DoctrineSetList;
2426
use Rector\Enum\Config\Defaults;
2527
use Rector\Exception\Configuration\InvalidConfigurationException;
28+
use Rector\NodeTypeResolver\PHPStan\Scope\Contract\NodeVisitor\ScopeResolverNodeVisitorInterface;
2629
use Rector\Php\PhpVersionResolver\ComposerJsonPhpVersionResolver;
2730
use Rector\Php80\Rector\Class_\AnnotationToAttributeRector;
2831
use Rector\Php80\ValueObject\AnnotationToAttribute;
@@ -1217,11 +1220,33 @@ public function withTreatClassesAsFinal(bool $isTreatClassesAsFinal = true): sel
12171220

12181221
public function registerService(string $className, ?string $alias = null, ?string $tag = null): self
12191222
{
1223+
// BC layer since 2.2.9
1224+
if ($tag === ScopeResolverNodeVisitorInterface::class) {
1225+
$tag = DecoratingNodeVisitorInterface::class;
1226+
}
1227+
12201228
$this->registerServices[] = new RegisteredService($className, $alias, $tag);
12211229

12221230
return $this;
12231231
}
12241232

1233+
/**
1234+
* DX helper
1235+
* @see https://getrector.com/documentation/creating-a-node-visitor
1236+
*/
1237+
public function registerDecoratingNodeVisitor(string $decoratingNodeVisitorClass): self
1238+
{
1239+
Assert::isAOf($decoratingNodeVisitorClass, NodeVisitor::class);
1240+
1241+
$this->registerServices[] = new RegisteredService(
1242+
$decoratingNodeVisitorClass,
1243+
null,
1244+
DecoratingNodeVisitorInterface::class
1245+
);
1246+
1247+
return $this;
1248+
}
1249+
12251250
public function withDowngradeSets(
12261251
bool $php84 = false,
12271252
bool $php83 = false,
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Rector\Contract\PhpParser;
6+
7+
use PhpParser\NodeVisitor;
8+
9+
/**
10+
* This interface can be used to tag load node visitor, that will run on parsing files to nodes.
11+
* It can be used e.g. to decorate nodes with extra attributes,
12+
* that can be used later in rules or services.
13+
*/
14+
interface DecoratingNodeVisitorInterface extends NodeVisitor
15+
{
16+
}

src/DependencyInjection/LazyContainerFactory.php

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@
6565
use Rector\Console\Style\RectorStyle;
6666
use Rector\Console\Style\SymfonyStyleFactory;
6767
use Rector\Contract\DependencyInjection\ResetableInterface;
68+
use Rector\Contract\PhpParser\DecoratingNodeVisitorInterface;
6869
use Rector\Contract\Rector\RectorInterface;
6970
use Rector\NodeDecorator\CreatedByRuleDecorator;
7071
use Rector\NodeNameResolver\Contract\NodeNameResolverInterface;
@@ -94,7 +95,6 @@
9495
use Rector\NodeTypeResolver\NodeTypeResolver\ScalarTypeResolver;
9596
use Rector\NodeTypeResolver\NodeTypeResolver\StaticCallMethodCallTypeResolver;
9697
use Rector\NodeTypeResolver\NodeTypeResolver\TraitTypeResolver;
97-
use Rector\NodeTypeResolver\PHPStan\Scope\Contract\NodeVisitor\ScopeResolverNodeVisitorInterface;
9898
use Rector\NodeTypeResolver\PHPStan\Scope\NodeVisitor\ArgNodeVisitor;
9999
use Rector\NodeTypeResolver\PHPStan\Scope\NodeVisitor\AssignedToNodeVisitor;
100100
use Rector\NodeTypeResolver\PHPStan\Scope\NodeVisitor\ByRefReturnNodeVisitor;
@@ -231,9 +231,9 @@ final class LazyContainerFactory
231231
];
232232

233233
/**
234-
* @var array<class-string<ScopeResolverNodeVisitorInterface>>
234+
* @var array<class-string<DecoratingNodeVisitorInterface>>
235235
*/
236-
private const SCOPE_RESOLVER_NODE_VISITOR_CLASSES = [
236+
private const DECORATING_NODE_VISITOR_CLASSES = [
237237
ArgNodeVisitor::class,
238238
AssignedToNodeVisitor::class,
239239
ByRefReturnNodeVisitor::class,
@@ -660,13 +660,13 @@ static function (
660660
);
661661

662662
$rectorConfig->when(PHPStanNodeScopeResolver::class)
663-
->needs('$nodeVisitors')
664-
->giveTagged(ScopeResolverNodeVisitorInterface::class);
663+
->needs('$decoratingNodeVisitors')
664+
->giveTagged(DecoratingNodeVisitorInterface::class);
665665

666666
$this->registerTagged(
667667
$rectorConfig,
668-
self::SCOPE_RESOLVER_NODE_VISITOR_CLASSES,
669-
ScopeResolverNodeVisitorInterface::class
668+
self::DECORATING_NODE_VISITOR_CLASSES,
669+
DecoratingNodeVisitorInterface::class
670670
);
671671

672672
$this->createPHPStanServices($rectorConfig);

src/NodeTypeResolver/PHPStan/Scope/Contract/NodeVisitor/ScopeResolverNodeVisitorInterface.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@
66

77
use PhpParser\NodeVisitor;
88

9+
/**
10+
* @deprecated Since 2.2.9. Use \Rector\Contract\PhpParser\DecoratingNodeVisitorInterface instead
11+
*/
912
interface ScopeResolverNodeVisitorInterface extends NodeVisitor
1013
{
1114
}

src/NodeTypeResolver/PHPStan/Scope/NodeVisitor/ArgNodeVisitor.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,10 @@
1111
use PhpParser\Node\Expr\FuncCall;
1212
use PhpParser\Node\Name;
1313
use PhpParser\NodeVisitorAbstract;
14+
use Rector\Contract\PhpParser\DecoratingNodeVisitorInterface;
1415
use Rector\NodeTypeResolver\Node\AttributeKey;
15-
use Rector\NodeTypeResolver\PHPStan\Scope\Contract\NodeVisitor\ScopeResolverNodeVisitorInterface;
1616

17-
final class ArgNodeVisitor extends NodeVisitorAbstract implements ScopeResolverNodeVisitorInterface
17+
final class ArgNodeVisitor extends NodeVisitorAbstract implements DecoratingNodeVisitorInterface
1818
{
1919
public function enterNode(Node $node): ?Node
2020
{

src/NodeTypeResolver/PHPStan/Scope/NodeVisitor/AssignedToNodeVisitor.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,13 @@
1111
use PhpParser\Node\Expr\AssignRef;
1212
use PhpParser\Node\Expr\List_;
1313
use PhpParser\NodeVisitorAbstract;
14+
use Rector\Contract\PhpParser\DecoratingNodeVisitorInterface;
1415
use Rector\NodeTypeResolver\Node\AttributeKey;
15-
use Rector\NodeTypeResolver\PHPStan\Scope\Contract\NodeVisitor\ScopeResolverNodeVisitorInterface;
1616

1717
/**
1818
* Inspired by https://github.com/phpstan/phpstan-src/blob/1.7.x/src/Parser/NewAssignedToPropertyVisitor.php
1919
*/
20-
final class AssignedToNodeVisitor extends NodeVisitorAbstract implements ScopeResolverNodeVisitorInterface
20+
final class AssignedToNodeVisitor extends NodeVisitorAbstract implements DecoratingNodeVisitorInterface
2121
{
2222
public function enterNode(Node $node): ?Node
2323
{

src/NodeTypeResolver/PHPStan/Scope/NodeVisitor/ByRefReturnNodeVisitor.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,11 @@
1010
use PhpParser\Node\Stmt\Return_;
1111
use PhpParser\NodeVisitor;
1212
use PhpParser\NodeVisitorAbstract;
13+
use Rector\Contract\PhpParser\DecoratingNodeVisitorInterface;
1314
use Rector\NodeTypeResolver\Node\AttributeKey;
14-
use Rector\NodeTypeResolver\PHPStan\Scope\Contract\NodeVisitor\ScopeResolverNodeVisitorInterface;
1515
use Rector\PhpDocParser\NodeTraverser\SimpleCallableNodeTraverser;
1616

17-
final class ByRefReturnNodeVisitor extends NodeVisitorAbstract implements ScopeResolverNodeVisitorInterface
17+
final class ByRefReturnNodeVisitor extends NodeVisitorAbstract implements DecoratingNodeVisitorInterface
1818
{
1919
public function __construct(
2020
private readonly SimpleCallableNodeTraverser $simpleCallableNodeTraverser

src/NodeTypeResolver/PHPStan/Scope/NodeVisitor/ByRefVariableNodeVisitor.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,11 @@
1111
use PhpParser\Node\Expr\Variable;
1212
use PhpParser\Node\FunctionLike;
1313
use PhpParser\NodeVisitorAbstract;
14+
use Rector\Contract\PhpParser\DecoratingNodeVisitorInterface;
1415
use Rector\NodeTypeResolver\Node\AttributeKey;
15-
use Rector\NodeTypeResolver\PHPStan\Scope\Contract\NodeVisitor\ScopeResolverNodeVisitorInterface;
1616
use Rector\PhpDocParser\NodeTraverser\SimpleCallableNodeTraverser;
1717

18-
final class ByRefVariableNodeVisitor extends NodeVisitorAbstract implements ScopeResolverNodeVisitorInterface
18+
final class ByRefVariableNodeVisitor extends NodeVisitorAbstract implements DecoratingNodeVisitorInterface
1919
{
2020
public function __construct(
2121
private readonly SimpleCallableNodeTraverser $simpleCallableNodeTraverser

src/NodeTypeResolver/PHPStan/Scope/NodeVisitor/ContextNodeVisitor.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,11 +34,11 @@
3434
use PhpParser\Node\Stmt\While_;
3535
use PhpParser\NodeVisitor;
3636
use PhpParser\NodeVisitorAbstract;
37+
use Rector\Contract\PhpParser\DecoratingNodeVisitorInterface;
3738
use Rector\NodeTypeResolver\Node\AttributeKey;
38-
use Rector\NodeTypeResolver\PHPStan\Scope\Contract\NodeVisitor\ScopeResolverNodeVisitorInterface;
3939
use Rector\PhpDocParser\NodeTraverser\SimpleCallableNodeTraverser;
4040

41-
final class ContextNodeVisitor extends NodeVisitorAbstract implements ScopeResolverNodeVisitorInterface
41+
final class ContextNodeVisitor extends NodeVisitorAbstract implements DecoratingNodeVisitorInterface
4242
{
4343
public function __construct(
4444
private readonly SimpleCallableNodeTraverser $simpleCallableNodeTraverser

0 commit comments

Comments
 (0)