Skip to content

Commit ec71117

Browse files
authored
Use NodeTraverser from phpstan/phpdoc-parser (#8855)
1 parent f3f6268 commit ec71117

39 files changed

Lines changed: 180 additions & 523 deletions

File tree

‎phpstan.neon‎

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -346,7 +346,6 @@ parameters:
346346
identifier: symplify.noReference
347347
message: '#Use explicit return value over magic &reference#'
348348
paths:
349-
- src/PhpDocParser/PhpDocParser/PhpDocNodeTraverser.php
350349
- rules/Php70/EregToPcreTransformer.php
351350
- src/BetterPhpDocParser/PhpDocManipulator/PhpDocClassRenamer.php
352351
- src/NodeTypeResolver/PHPStan/Type/TypeFactory.php

‎rules/CodingStyle/ClassNameImport/ShortNameResolver.php‎

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
use PhpParser\Node\Name;
1010
use PhpParser\Node\Stmt;
1111
use PhpParser\Node\Stmt\ClassLike;
12+
use PHPStan\PhpDocParser\Ast\NodeTraverser;
1213
use PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagNode;
1314
use PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode;
1415
use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfo;
@@ -17,7 +18,7 @@
1718
use Rector\NodeNameResolver\NodeNameResolver;
1819
use Rector\NodeTypeResolver\Node\AttributeKey;
1920
use Rector\PhpDocParser\NodeTraverser\SimpleCallableNodeTraverser;
20-
use Rector\PhpDocParser\PhpDocParser\PhpDocNodeTraverser;
21+
use Rector\PhpDocParser\PhpDocParser\PhpDocNodeVisitor\CallablePhpDocNodeVisitor;
2122
use Rector\PhpParser\Node\BetterNodeFinder;
2223
use Rector\ValueObject\Application\File;
2324

@@ -176,10 +177,7 @@ private function resolveDocBlockShortNames(Node $node): array
176177
}
177178

178179
$shortNames = [];
179-
$phpDocNodeTraverser = new PhpDocNodeTraverser();
180-
$phpDocNodeTraverser->traverseWithCallable(
181-
$phpDocInfo->getPhpDocNode(),
182-
'',
180+
$phpDocNodeTraverser = new NodeTraverser([new CallablePhpDocNodeVisitor(
183181
static function ($node) use (&$shortNames): null {
184182
if ($node instanceof PhpDocTagNode) {
185183
$shortName = trim($node->name, '@');
@@ -196,7 +194,8 @@ static function ($node) use (&$shortNames): null {
196194

197195
return null;
198196
}
199-
);
197+
)]);
198+
$phpDocNodeTraverser->traverse([$phpDocInfo->getPhpDocNode()]);
200199

201200
return $shortNames;
202201
}

‎rules/DeadCode/PhpDoc/TagRemover/ParamTagRemover.php‎

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,14 @@
66

77
use PhpParser\Node\FunctionLike;
88
use PHPStan\PhpDocParser\Ast\Node;
9+
use PHPStan\PhpDocParser\Ast\NodeTraverser;
910
use PHPStan\PhpDocParser\Ast\PhpDoc\ParamTagValueNode;
1011
use PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagNode;
1112
use PHPStan\Type\Type;
1213
use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfo;
1314
use Rector\Comments\NodeDocBlock\DocBlockUpdater;
1415
use Rector\DeadCode\PhpDoc\DeadParamTagValueNodeAnalyzer;
15-
use Rector\PhpDocParser\PhpDocParser\PhpDocNodeTraverser;
16+
use Rector\PhpDocParser\PhpDocParser\PhpDocNodeVisitor\CallablePhpDocNodeVisitor;
1617

1718
final readonly class ParamTagRemover
1819
{
@@ -29,8 +30,7 @@ public function removeParamTagsIfUseless(
2930
): bool {
3031
$hasChanged = false;
3132

32-
$phpDocNodeTraverser = new PhpDocNodeTraverser();
33-
$phpDocNodeTraverser->traverseWithCallable($phpDocInfo->getPhpDocNode(), '', function (Node $docNode) use (
33+
$phpDocNodeTraverser = new NodeTraverser([new CallablePhpDocNodeVisitor(function (Node $docNode) use (
3434
$functionLike,
3535
&$hasChanged,
3636
$type,
@@ -61,8 +61,9 @@ public function removeParamTagsIfUseless(
6161
}
6262

6363
$hasChanged = true;
64-
return PhpDocNodeTraverser::NODE_REMOVE;
65-
});
64+
return NodeTraverser::REMOVE_NODE;
65+
})]);
66+
$phpDocNodeTraverser->traverse([$phpDocInfo->getPhpDocNode()]);
6667

6768
if ($hasChanged) {
6869
$this->docBlockUpdater->updateRefactoredNodeWithPhpDocInfo($functionLike);

‎rules/DeadCode/Rector/ClassMethod/RemoveMixedDocblockOverruledByNativeTypeRector.php‎

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
use PhpParser\Node\Stmt\ClassMethod;
1111
use PhpParser\Node\Stmt\Function_;
1212
use PHPStan\PhpDocParser\Ast\Node as PhpDocNode;
13+
use PHPStan\PhpDocParser\Ast\NodeTraverser;
1314
use PHPStan\PhpDocParser\Ast\PhpDoc\ParamTagValueNode;
1415
use PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagNode;
1516
use PHPStan\PhpDocParser\Ast\PhpDoc\ReturnTagValueNode;
@@ -18,7 +19,7 @@
1819
use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfo;
1920
use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory;
2021
use Rector\Comments\NodeDocBlock\DocBlockUpdater;
21-
use Rector\PhpDocParser\PhpDocParser\PhpDocNodeTraverser;
22+
use Rector\PhpDocParser\PhpDocParser\PhpDocNodeVisitor\CallablePhpDocNodeVisitor;
2223
use Rector\Rector\AbstractRector;
2324
use Rector\RuleDoc\CodeSample\CodeSample;
2425
use Rector\RuleDoc\RuleDefinition;
@@ -113,8 +114,7 @@ private function removeMixedParamTags(PhpDocInfo $phpDocInfo, Node $functionLike
113114

114115
$hasChanged = false;
115116

116-
$phpDocNodeTraverser = new PhpDocNodeTraverser();
117-
$phpDocNodeTraverser->traverseWithCallable($phpDocInfo->getPhpDocNode(), '', function (PhpDocNode $phpDocNode) use (
117+
$phpDocNodeTraverser = new NodeTraverser([new CallablePhpDocNodeVisitor(function (PhpDocNode $phpDocNode) use (
118118
$declaredParamNames,
119119
&$hasChanged
120120
): ?int {
@@ -147,8 +147,9 @@ private function removeMixedParamTags(PhpDocInfo $phpDocInfo, Node $functionLike
147147
}
148148

149149
$hasChanged = true;
150-
return PhpDocNodeTraverser::NODE_REMOVE;
151-
});
150+
return NodeTraverser::REMOVE_NODE;
151+
})]);
152+
$phpDocNodeTraverser->traverse([$phpDocInfo->getPhpDocNode()]);
152153

153154
return $hasChanged;
154155
}

‎rules/DeadCode/Rector/ClassMethod/RemoveNullTagValueNodeRector.php‎

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
use PhpParser\Node\Stmt\Function_;
1212
use PhpParser\Node\Stmt\Property;
1313
use PHPStan\PhpDocParser\Ast\Node as AstNode;
14+
use PHPStan\PhpDocParser\Ast\NodeTraverser;
1415
use PHPStan\PhpDocParser\Ast\PhpDoc\ParamTagValueNode;
1516
use PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagNode;
1617
use PHPStan\PhpDocParser\Ast\PhpDoc\ReturnTagValueNode;
@@ -19,7 +20,7 @@
1920
use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfo;
2021
use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory;
2122
use Rector\Comments\NodeDocBlock\DocBlockUpdater;
22-
use Rector\PhpDocParser\PhpDocParser\PhpDocNodeTraverser;
23+
use Rector\PhpDocParser\PhpDocParser\PhpDocNodeVisitor\CallablePhpDocNodeVisitor;
2324
use Rector\Rector\AbstractRector;
2425
use Rector\RuleDoc\CodeSample\CodeSample;
2526
use Rector\RuleDoc\RuleDefinition;
@@ -137,10 +138,7 @@ private function isNull(VarTagValueNode|ParamTagValueNode|ReturnTagValueNode $ta
137138
*/
138139
private function removeParamNullTag(PhpDocInfo $phpDocInfo, array $paramNames): void
139140
{
140-
$phpDocNodeTraverser = new PhpDocNodeTraverser();
141-
$phpDocNodeTraverser->traverseWithCallable(
142-
$phpDocInfo->getPhpDocNode(),
143-
'',
141+
$phpDocNodeTraverser = new NodeTraverser([new CallablePhpDocNodeVisitor(
144142
static function (AstNode $astNode) use ($paramNames): ?int {
145143
if (! $astNode instanceof PhpDocTagNode) {
146144
return null;
@@ -151,12 +149,13 @@ static function (AstNode $astNode) use ($paramNames): ?int {
151149
}
152150

153151
if (in_array($astNode->value->parameterName, $paramNames, true)) {
154-
return PhpDocNodeTraverser::NODE_REMOVE;
152+
return NodeTraverser::REMOVE_NODE;
155153
}
156154

157155
return null;
158156
}
159-
);
157+
)]);
158+
$phpDocNodeTraverser->traverse([$phpDocInfo->getPhpDocNode()]);
160159
}
161160

162161
/**

‎rules/DeadCode/Rector/ClassMethod/RemoveReturnTagIncompatibleWithNativeTypeRector.php‎

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
use PHPStan\PhpDoc\Tag\TypeAliasImportTag;
1313
use PHPStan\PhpDoc\Tag\TypeAliasTag;
1414
use PHPStan\PhpDocParser\Ast\Node as AstNode;
15+
use PHPStan\PhpDocParser\Ast\NodeTraverser;
1516
use PHPStan\PhpDocParser\Ast\PhpDoc\ReturnTagValueNode;
1617
use PHPStan\PhpDocParser\Ast\Type\GenericTypeNode;
1718
use PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode;
@@ -22,7 +23,7 @@
2223
use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfo;
2324
use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory;
2425
use Rector\Comments\NodeDocBlock\DocBlockUpdater;
25-
use Rector\PhpDocParser\PhpDocParser\PhpDocNodeTraverser;
26+
use Rector\PhpDocParser\PhpDocParser\PhpDocNodeVisitor\CallablePhpDocNodeVisitor;
2627
use Rector\PHPStan\ScopeFetcher;
2728
use Rector\Rector\AbstractRector;
2829
use Rector\RuleDoc\CodeSample\CodeSample;
@@ -185,18 +186,18 @@ private function containsTypeAliasName(TypeNode $typeNode, array $typeAliases):
185186
$hasTypeAliasName = false;
186187

187188
// the traverser visits sub-nodes only, that is why the type node itself is checked above
188-
$phpDocNodeTraverser = new PhpDocNodeTraverser();
189-
$phpDocNodeTraverser->traverseWithCallable($typeNode, '', static function (AstNode $astNode) use (
189+
$phpDocNodeTraverser = new NodeTraverser([new CallablePhpDocNodeVisitor(static function (AstNode $astNode) use (
190190
$typeAliases,
191191
&$hasTypeAliasName
192192
): ?int {
193193
if ($astNode instanceof IdentifierTypeNode && isset($typeAliases[$astNode->name])) {
194194
$hasTypeAliasName = true;
195-
return PhpDocNodeTraverser::STOP_TRAVERSAL;
195+
return NodeTraverser::STOP_TRAVERSAL;
196196
}
197197

198198
return null;
199-
});
199+
})]);
200+
$phpDocNodeTraverser->traverse([$typeNode]);
200201

201202
return $hasTypeAliasName;
202203
}

‎rules/Php80/Rector/Class_/AnnotationToAttributeRector.php‎

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
use PhpParser\Node\Stmt\Property;
1818
use PhpParser\Node\Stmt\Use_;
1919
use PHPStan\PhpDocParser\Ast\Node as DocNode;
20+
use PHPStan\PhpDocParser\Ast\NodeTraverser;
2021
use PHPStan\PhpDocParser\Ast\PhpDoc\GenericTagValueNode;
2122
use PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocChildNode;
2223
use PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagNode;
@@ -37,7 +38,7 @@
3738
use Rector\Php80\ValueObject\AttributeValueAndDocComment;
3839
use Rector\Php80\ValueObject\DoctrineTagAndAnnotationToAttribute;
3940
use Rector\PhpAttribute\NodeFactory\PhpAttributeGroupFactory;
40-
use Rector\PhpDocParser\PhpDocParser\PhpDocNodeTraverser;
41+
use Rector\PhpDocParser\PhpDocParser\PhpDocNodeVisitor\CallablePhpDocNodeVisitor;
4142
use Rector\Rector\AbstractRector;
4243
use Rector\RuleDoc\CodeSample\ConfiguredCodeSample;
4344
use Rector\RuleDoc\RuleDefinition;
@@ -225,8 +226,7 @@ private function processGenericTags(PhpDocInfo $phpDocInfo): array
225226
{
226227
$attributeGroups = [];
227228

228-
$phpDocNodeTraverser = new PhpDocNodeTraverser();
229-
$phpDocNodeTraverser->traverseWithCallable($phpDocInfo->getPhpDocNode(), '', function (DocNode $docNode) use (
229+
$phpDocNodeTraverser = new NodeTraverser([new CallablePhpDocNodeVisitor(function (DocNode $docNode) use (
230230
&$attributeGroups,
231231
): int|PhpDocChildNode|null {
232232

@@ -263,12 +263,13 @@ private function processGenericTags(PhpDocInfo $phpDocInfo): array
263263
return new PhpDocTextNode($attributeValueAndDocComment->docComment);
264264
}
265265

266-
return PhpDocNodeTraverser::NODE_REMOVE;
266+
return NodeTraverser::REMOVE_NODE;
267267

268268
}
269269

270270
return null;
271-
});
271+
})]);
272+
$phpDocNodeTraverser->traverse([$phpDocInfo->getPhpDocNode()]);
272273

273274
return $attributeGroups;
274275
}

‎src/BetterPhpDocParser/Contract/BasePhpDocNodeVisitorInterface.php‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@
44

55
namespace Rector\BetterPhpDocParser\Contract;
66

7-
use Rector\PhpDocParser\PhpDocParser\Contract\PhpDocNodeVisitorInterface;
7+
use PHPStan\PhpDocParser\Ast\NodeVisitor;
88

9-
interface BasePhpDocNodeVisitorInterface extends PhpDocNodeVisitorInterface
9+
interface BasePhpDocNodeVisitorInterface extends NodeVisitor
1010
{
1111
}

‎src/BetterPhpDocParser/NodeDecorator/ArrayItemClassNameDecorator.php‎

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,12 @@
66

77
use PhpParser\Node as PhpNode;
88
use PHPStan\PhpDocParser\Ast\Node;
9+
use PHPStan\PhpDocParser\Ast\NodeTraverser;
910
use PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocNode;
1011
use Rector\BetterPhpDocParser\Contract\PhpDocParser\PhpDocNodeDecoratorInterface;
1112
use Rector\BetterPhpDocParser\PhpDoc\ArrayItemNode;
1213
use Rector\BetterPhpDocParser\ValueObject\PhpDocAttributeKey;
13-
use Rector\PhpDocParser\PhpDocParser\PhpDocNodeTraverser;
14+
use Rector\PhpDocParser\PhpDocParser\PhpDocNodeVisitor\CallablePhpDocNodeVisitor;
1415
use Rector\StaticTypeMapper\Naming\NameScopeFactory;
1516

1617
/**
@@ -20,8 +21,7 @@
2021
final readonly class ArrayItemClassNameDecorator implements PhpDocNodeDecoratorInterface
2122
{
2223
public function __construct(
23-
private NameScopeFactory $nameScopeFactory,
24-
private PhpDocNodeTraverser $phpDocNodeTraverser
24+
private NameScopeFactory $nameScopeFactory
2525
) {
2626
}
2727

@@ -32,7 +32,7 @@ public function decorate(PhpDocNode $phpDocNode, PhpNode $phpNode): void
3232
return;
3333
}
3434

35-
$this->phpDocNodeTraverser->traverseWithCallable($phpDocNode, '', function (Node $node) use (
35+
$phpDocNodeTraverser = new NodeTraverser([new CallablePhpDocNodeVisitor(function (Node $node) use (
3636
$phpNode
3737
): Node|null {
3838
if (! $node instanceof ArrayItemNode) {
@@ -51,7 +51,8 @@ public function decorate(PhpDocNode $phpDocNode, PhpNode $phpNode): void
5151
}
5252

5353
return $node;
54-
});
54+
})]);
55+
$phpDocNodeTraverser->traverse([$phpDocNode]);
5556
}
5657

5758
private function resolveClassFromScopeResolution(mixed $value, PhpNode $phpNode): ?string

‎src/BetterPhpDocParser/NodeDecorator/ConstExprClassNameDecorator.php‎

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,11 @@
77
use PhpParser\Node as PhpNode;
88
use PHPStan\PhpDocParser\Ast\ConstExpr\ConstFetchNode;
99
use PHPStan\PhpDocParser\Ast\Node;
10+
use PHPStan\PhpDocParser\Ast\NodeTraverser;
1011
use PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocNode;
1112
use Rector\BetterPhpDocParser\Contract\PhpDocParser\PhpDocNodeDecoratorInterface;
1213
use Rector\BetterPhpDocParser\ValueObject\PhpDocAttributeKey;
13-
use Rector\PhpDocParser\PhpDocParser\PhpDocNodeTraverser;
14+
use Rector\PhpDocParser\PhpDocParser\PhpDocNodeVisitor\CallablePhpDocNodeVisitor;
1415
use Rector\StaticTypeMapper\Naming\NameScopeFactory;
1516

1617
/**
@@ -20,8 +21,7 @@
2021
final readonly class ConstExprClassNameDecorator implements PhpDocNodeDecoratorInterface
2122
{
2223
public function __construct(
23-
private NameScopeFactory $nameScopeFactory,
24-
private PhpDocNodeTraverser $phpDocNodeTraverser
24+
private NameScopeFactory $nameScopeFactory
2525
) {
2626
}
2727

@@ -32,7 +32,7 @@ public function decorate(PhpDocNode $phpDocNode, PhpNode $phpNode): void
3232
return;
3333
}
3434

35-
$this->phpDocNodeTraverser->traverseWithCallable($phpDocNode, '', function (Node $node) use (
35+
$phpDocNodeTraverser = new NodeTraverser([new CallablePhpDocNodeVisitor(function (Node $node) use (
3636
$phpNode
3737
): Node|null {
3838
if (! $node instanceof ConstFetchNode) {
@@ -43,7 +43,8 @@ public function decorate(PhpDocNode $phpDocNode, PhpNode $phpNode): void
4343
$node->setAttribute(PhpDocAttributeKey::RESOLVED_CLASS, $className);
4444

4545
return $node;
46-
});
46+
})]);
47+
$phpDocNodeTraverser->traverse([$phpDocNode]);
4748
}
4849

4950
private function resolveFullyQualifiedClass(ConstFetchNode $constFetchNode, PhpNode $phpNode): string

0 commit comments

Comments
 (0)