diff --git a/phpstan.neon b/phpstan.neon index 2872d2d05ab..1abf97252bc 100644 --- a/phpstan.neon +++ b/phpstan.neon @@ -346,7 +346,6 @@ parameters: identifier: symplify.noReference message: '#Use explicit return value over magic &reference#' paths: - - src/PhpDocParser/PhpDocParser/PhpDocNodeTraverser.php - rules/Php70/EregToPcreTransformer.php - src/BetterPhpDocParser/PhpDocManipulator/PhpDocClassRenamer.php - src/NodeTypeResolver/PHPStan/Type/TypeFactory.php diff --git a/rules/CodingStyle/ClassNameImport/ShortNameResolver.php b/rules/CodingStyle/ClassNameImport/ShortNameResolver.php index e4cc03494e9..a783a3c451a 100644 --- a/rules/CodingStyle/ClassNameImport/ShortNameResolver.php +++ b/rules/CodingStyle/ClassNameImport/ShortNameResolver.php @@ -9,6 +9,7 @@ use PhpParser\Node\Name; use PhpParser\Node\Stmt; use PhpParser\Node\Stmt\ClassLike; +use PHPStan\PhpDocParser\Ast\NodeTraverser; use PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagNode; use PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode; use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfo; @@ -17,7 +18,7 @@ use Rector\NodeNameResolver\NodeNameResolver; use Rector\NodeTypeResolver\Node\AttributeKey; use Rector\PhpDocParser\NodeTraverser\SimpleCallableNodeTraverser; -use Rector\PhpDocParser\PhpDocParser\PhpDocNodeTraverser; +use Rector\PhpDocParser\PhpDocParser\PhpDocNodeVisitor\CallablePhpDocNodeVisitor; use Rector\PhpParser\Node\BetterNodeFinder; use Rector\ValueObject\Application\File; @@ -176,10 +177,7 @@ private function resolveDocBlockShortNames(Node $node): array } $shortNames = []; - $phpDocNodeTraverser = new PhpDocNodeTraverser(); - $phpDocNodeTraverser->traverseWithCallable( - $phpDocInfo->getPhpDocNode(), - '', + $phpDocNodeTraverser = new NodeTraverser([new CallablePhpDocNodeVisitor( static function ($node) use (&$shortNames): null { if ($node instanceof PhpDocTagNode) { $shortName = trim($node->name, '@'); @@ -196,7 +194,8 @@ static function ($node) use (&$shortNames): null { return null; } - ); + )]); + $phpDocNodeTraverser->traverse([$phpDocInfo->getPhpDocNode()]); return $shortNames; } diff --git a/rules/DeadCode/PhpDoc/TagRemover/ParamTagRemover.php b/rules/DeadCode/PhpDoc/TagRemover/ParamTagRemover.php index e410f430b38..2b07a7fa3f1 100644 --- a/rules/DeadCode/PhpDoc/TagRemover/ParamTagRemover.php +++ b/rules/DeadCode/PhpDoc/TagRemover/ParamTagRemover.php @@ -6,13 +6,14 @@ use PhpParser\Node\FunctionLike; use PHPStan\PhpDocParser\Ast\Node; +use PHPStan\PhpDocParser\Ast\NodeTraverser; use PHPStan\PhpDocParser\Ast\PhpDoc\ParamTagValueNode; use PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagNode; use PHPStan\Type\Type; use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfo; use Rector\Comments\NodeDocBlock\DocBlockUpdater; use Rector\DeadCode\PhpDoc\DeadParamTagValueNodeAnalyzer; -use Rector\PhpDocParser\PhpDocParser\PhpDocNodeTraverser; +use Rector\PhpDocParser\PhpDocParser\PhpDocNodeVisitor\CallablePhpDocNodeVisitor; final readonly class ParamTagRemover { @@ -29,8 +30,7 @@ public function removeParamTagsIfUseless( ): bool { $hasChanged = false; - $phpDocNodeTraverser = new PhpDocNodeTraverser(); - $phpDocNodeTraverser->traverseWithCallable($phpDocInfo->getPhpDocNode(), '', function (Node $docNode) use ( + $phpDocNodeTraverser = new NodeTraverser([new CallablePhpDocNodeVisitor(function (Node $docNode) use ( $functionLike, &$hasChanged, $type, @@ -61,8 +61,9 @@ public function removeParamTagsIfUseless( } $hasChanged = true; - return PhpDocNodeTraverser::NODE_REMOVE; - }); + return NodeTraverser::REMOVE_NODE; + })]); + $phpDocNodeTraverser->traverse([$phpDocInfo->getPhpDocNode()]); if ($hasChanged) { $this->docBlockUpdater->updateRefactoredNodeWithPhpDocInfo($functionLike); diff --git a/rules/DeadCode/Rector/ClassMethod/RemoveMixedDocblockOverruledByNativeTypeRector.php b/rules/DeadCode/Rector/ClassMethod/RemoveMixedDocblockOverruledByNativeTypeRector.php index c01c313caa7..d2509423f04 100644 --- a/rules/DeadCode/Rector/ClassMethod/RemoveMixedDocblockOverruledByNativeTypeRector.php +++ b/rules/DeadCode/Rector/ClassMethod/RemoveMixedDocblockOverruledByNativeTypeRector.php @@ -10,6 +10,7 @@ use PhpParser\Node\Stmt\ClassMethod; use PhpParser\Node\Stmt\Function_; use PHPStan\PhpDocParser\Ast\Node as PhpDocNode; +use PHPStan\PhpDocParser\Ast\NodeTraverser; use PHPStan\PhpDocParser\Ast\PhpDoc\ParamTagValueNode; use PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagNode; use PHPStan\PhpDocParser\Ast\PhpDoc\ReturnTagValueNode; @@ -18,7 +19,7 @@ use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfo; use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory; use Rector\Comments\NodeDocBlock\DocBlockUpdater; -use Rector\PhpDocParser\PhpDocParser\PhpDocNodeTraverser; +use Rector\PhpDocParser\PhpDocParser\PhpDocNodeVisitor\CallablePhpDocNodeVisitor; use Rector\Rector\AbstractRector; use Rector\RuleDoc\CodeSample\CodeSample; use Rector\RuleDoc\RuleDefinition; @@ -113,8 +114,7 @@ private function removeMixedParamTags(PhpDocInfo $phpDocInfo, Node $functionLike $hasChanged = false; - $phpDocNodeTraverser = new PhpDocNodeTraverser(); - $phpDocNodeTraverser->traverseWithCallable($phpDocInfo->getPhpDocNode(), '', function (PhpDocNode $phpDocNode) use ( + $phpDocNodeTraverser = new NodeTraverser([new CallablePhpDocNodeVisitor(function (PhpDocNode $phpDocNode) use ( $declaredParamNames, &$hasChanged ): ?int { @@ -147,8 +147,9 @@ private function removeMixedParamTags(PhpDocInfo $phpDocInfo, Node $functionLike } $hasChanged = true; - return PhpDocNodeTraverser::NODE_REMOVE; - }); + return NodeTraverser::REMOVE_NODE; + })]); + $phpDocNodeTraverser->traverse([$phpDocInfo->getPhpDocNode()]); return $hasChanged; } diff --git a/rules/DeadCode/Rector/ClassMethod/RemoveNullTagValueNodeRector.php b/rules/DeadCode/Rector/ClassMethod/RemoveNullTagValueNodeRector.php index 45003a9deb4..ea5da128d60 100644 --- a/rules/DeadCode/Rector/ClassMethod/RemoveNullTagValueNodeRector.php +++ b/rules/DeadCode/Rector/ClassMethod/RemoveNullTagValueNodeRector.php @@ -11,6 +11,7 @@ use PhpParser\Node\Stmt\Function_; use PhpParser\Node\Stmt\Property; use PHPStan\PhpDocParser\Ast\Node as AstNode; +use PHPStan\PhpDocParser\Ast\NodeTraverser; use PHPStan\PhpDocParser\Ast\PhpDoc\ParamTagValueNode; use PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagNode; use PHPStan\PhpDocParser\Ast\PhpDoc\ReturnTagValueNode; @@ -19,7 +20,7 @@ use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfo; use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory; use Rector\Comments\NodeDocBlock\DocBlockUpdater; -use Rector\PhpDocParser\PhpDocParser\PhpDocNodeTraverser; +use Rector\PhpDocParser\PhpDocParser\PhpDocNodeVisitor\CallablePhpDocNodeVisitor; use Rector\Rector\AbstractRector; use Rector\RuleDoc\CodeSample\CodeSample; use Rector\RuleDoc\RuleDefinition; @@ -137,10 +138,7 @@ private function isNull(VarTagValueNode|ParamTagValueNode|ReturnTagValueNode $ta */ private function removeParamNullTag(PhpDocInfo $phpDocInfo, array $paramNames): void { - $phpDocNodeTraverser = new PhpDocNodeTraverser(); - $phpDocNodeTraverser->traverseWithCallable( - $phpDocInfo->getPhpDocNode(), - '', + $phpDocNodeTraverser = new NodeTraverser([new CallablePhpDocNodeVisitor( static function (AstNode $astNode) use ($paramNames): ?int { if (! $astNode instanceof PhpDocTagNode) { return null; @@ -151,12 +149,13 @@ static function (AstNode $astNode) use ($paramNames): ?int { } if (in_array($astNode->value->parameterName, $paramNames, true)) { - return PhpDocNodeTraverser::NODE_REMOVE; + return NodeTraverser::REMOVE_NODE; } return null; } - ); + )]); + $phpDocNodeTraverser->traverse([$phpDocInfo->getPhpDocNode()]); } /** diff --git a/rules/DeadCode/Rector/ClassMethod/RemoveReturnTagIncompatibleWithNativeTypeRector.php b/rules/DeadCode/Rector/ClassMethod/RemoveReturnTagIncompatibleWithNativeTypeRector.php index 9b1cdaa9ad4..fbb7dce7ca1 100644 --- a/rules/DeadCode/Rector/ClassMethod/RemoveReturnTagIncompatibleWithNativeTypeRector.php +++ b/rules/DeadCode/Rector/ClassMethod/RemoveReturnTagIncompatibleWithNativeTypeRector.php @@ -12,6 +12,7 @@ use PHPStan\PhpDoc\Tag\TypeAliasImportTag; use PHPStan\PhpDoc\Tag\TypeAliasTag; use PHPStan\PhpDocParser\Ast\Node as AstNode; +use PHPStan\PhpDocParser\Ast\NodeTraverser; use PHPStan\PhpDocParser\Ast\PhpDoc\ReturnTagValueNode; use PHPStan\PhpDocParser\Ast\Type\GenericTypeNode; use PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode; @@ -22,7 +23,7 @@ use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfo; use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory; use Rector\Comments\NodeDocBlock\DocBlockUpdater; -use Rector\PhpDocParser\PhpDocParser\PhpDocNodeTraverser; +use Rector\PhpDocParser\PhpDocParser\PhpDocNodeVisitor\CallablePhpDocNodeVisitor; use Rector\PHPStan\ScopeFetcher; use Rector\Rector\AbstractRector; use Rector\RuleDoc\CodeSample\CodeSample; @@ -185,18 +186,18 @@ private function containsTypeAliasName(TypeNode $typeNode, array $typeAliases): $hasTypeAliasName = false; // the traverser visits sub-nodes only, that is why the type node itself is checked above - $phpDocNodeTraverser = new PhpDocNodeTraverser(); - $phpDocNodeTraverser->traverseWithCallable($typeNode, '', static function (AstNode $astNode) use ( + $phpDocNodeTraverser = new NodeTraverser([new CallablePhpDocNodeVisitor(static function (AstNode $astNode) use ( $typeAliases, &$hasTypeAliasName ): ?int { if ($astNode instanceof IdentifierTypeNode && isset($typeAliases[$astNode->name])) { $hasTypeAliasName = true; - return PhpDocNodeTraverser::STOP_TRAVERSAL; + return NodeTraverser::STOP_TRAVERSAL; } return null; - }); + })]); + $phpDocNodeTraverser->traverse([$typeNode]); return $hasTypeAliasName; } diff --git a/rules/Php80/Rector/Class_/AnnotationToAttributeRector.php b/rules/Php80/Rector/Class_/AnnotationToAttributeRector.php index f2c9cac1bb1..942129167ed 100644 --- a/rules/Php80/Rector/Class_/AnnotationToAttributeRector.php +++ b/rules/Php80/Rector/Class_/AnnotationToAttributeRector.php @@ -17,6 +17,7 @@ use PhpParser\Node\Stmt\Property; use PhpParser\Node\Stmt\Use_; use PHPStan\PhpDocParser\Ast\Node as DocNode; +use PHPStan\PhpDocParser\Ast\NodeTraverser; use PHPStan\PhpDocParser\Ast\PhpDoc\GenericTagValueNode; use PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocChildNode; use PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagNode; @@ -37,7 +38,7 @@ use Rector\Php80\ValueObject\AttributeValueAndDocComment; use Rector\Php80\ValueObject\DoctrineTagAndAnnotationToAttribute; use Rector\PhpAttribute\NodeFactory\PhpAttributeGroupFactory; -use Rector\PhpDocParser\PhpDocParser\PhpDocNodeTraverser; +use Rector\PhpDocParser\PhpDocParser\PhpDocNodeVisitor\CallablePhpDocNodeVisitor; use Rector\Rector\AbstractRector; use Rector\RuleDoc\CodeSample\ConfiguredCodeSample; use Rector\RuleDoc\RuleDefinition; @@ -225,8 +226,7 @@ private function processGenericTags(PhpDocInfo $phpDocInfo): array { $attributeGroups = []; - $phpDocNodeTraverser = new PhpDocNodeTraverser(); - $phpDocNodeTraverser->traverseWithCallable($phpDocInfo->getPhpDocNode(), '', function (DocNode $docNode) use ( + $phpDocNodeTraverser = new NodeTraverser([new CallablePhpDocNodeVisitor(function (DocNode $docNode) use ( &$attributeGroups, ): int|PhpDocChildNode|null { @@ -263,12 +263,13 @@ private function processGenericTags(PhpDocInfo $phpDocInfo): array return new PhpDocTextNode($attributeValueAndDocComment->docComment); } - return PhpDocNodeTraverser::NODE_REMOVE; + return NodeTraverser::REMOVE_NODE; } return null; - }); + })]); + $phpDocNodeTraverser->traverse([$phpDocInfo->getPhpDocNode()]); return $attributeGroups; } diff --git a/src/BetterPhpDocParser/Contract/BasePhpDocNodeVisitorInterface.php b/src/BetterPhpDocParser/Contract/BasePhpDocNodeVisitorInterface.php index 3f11b38e534..04b4de9b324 100644 --- a/src/BetterPhpDocParser/Contract/BasePhpDocNodeVisitorInterface.php +++ b/src/BetterPhpDocParser/Contract/BasePhpDocNodeVisitorInterface.php @@ -4,8 +4,8 @@ namespace Rector\BetterPhpDocParser\Contract; -use Rector\PhpDocParser\PhpDocParser\Contract\PhpDocNodeVisitorInterface; +use PHPStan\PhpDocParser\Ast\NodeVisitor; -interface BasePhpDocNodeVisitorInterface extends PhpDocNodeVisitorInterface +interface BasePhpDocNodeVisitorInterface extends NodeVisitor { } diff --git a/src/BetterPhpDocParser/NodeDecorator/ArrayItemClassNameDecorator.php b/src/BetterPhpDocParser/NodeDecorator/ArrayItemClassNameDecorator.php index d0096e7bfd6..7dca833e404 100644 --- a/src/BetterPhpDocParser/NodeDecorator/ArrayItemClassNameDecorator.php +++ b/src/BetterPhpDocParser/NodeDecorator/ArrayItemClassNameDecorator.php @@ -6,11 +6,12 @@ use PhpParser\Node as PhpNode; use PHPStan\PhpDocParser\Ast\Node; +use PHPStan\PhpDocParser\Ast\NodeTraverser; use PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocNode; use Rector\BetterPhpDocParser\Contract\PhpDocParser\PhpDocNodeDecoratorInterface; use Rector\BetterPhpDocParser\PhpDoc\ArrayItemNode; use Rector\BetterPhpDocParser\ValueObject\PhpDocAttributeKey; -use Rector\PhpDocParser\PhpDocParser\PhpDocNodeTraverser; +use Rector\PhpDocParser\PhpDocParser\PhpDocNodeVisitor\CallablePhpDocNodeVisitor; use Rector\StaticTypeMapper\Naming\NameScopeFactory; /** @@ -20,8 +21,7 @@ final readonly class ArrayItemClassNameDecorator implements PhpDocNodeDecoratorInterface { public function __construct( - private NameScopeFactory $nameScopeFactory, - private PhpDocNodeTraverser $phpDocNodeTraverser + private NameScopeFactory $nameScopeFactory ) { } @@ -32,7 +32,7 @@ public function decorate(PhpDocNode $phpDocNode, PhpNode $phpNode): void return; } - $this->phpDocNodeTraverser->traverseWithCallable($phpDocNode, '', function (Node $node) use ( + $phpDocNodeTraverser = new NodeTraverser([new CallablePhpDocNodeVisitor(function (Node $node) use ( $phpNode ): Node|null { if (! $node instanceof ArrayItemNode) { @@ -51,7 +51,8 @@ public function decorate(PhpDocNode $phpDocNode, PhpNode $phpNode): void } return $node; - }); + })]); + $phpDocNodeTraverser->traverse([$phpDocNode]); } private function resolveClassFromScopeResolution(mixed $value, PhpNode $phpNode): ?string diff --git a/src/BetterPhpDocParser/NodeDecorator/ConstExprClassNameDecorator.php b/src/BetterPhpDocParser/NodeDecorator/ConstExprClassNameDecorator.php index 3e5f72b4ce9..91d9dca9fc3 100644 --- a/src/BetterPhpDocParser/NodeDecorator/ConstExprClassNameDecorator.php +++ b/src/BetterPhpDocParser/NodeDecorator/ConstExprClassNameDecorator.php @@ -7,10 +7,11 @@ use PhpParser\Node as PhpNode; use PHPStan\PhpDocParser\Ast\ConstExpr\ConstFetchNode; use PHPStan\PhpDocParser\Ast\Node; +use PHPStan\PhpDocParser\Ast\NodeTraverser; use PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocNode; use Rector\BetterPhpDocParser\Contract\PhpDocParser\PhpDocNodeDecoratorInterface; use Rector\BetterPhpDocParser\ValueObject\PhpDocAttributeKey; -use Rector\PhpDocParser\PhpDocParser\PhpDocNodeTraverser; +use Rector\PhpDocParser\PhpDocParser\PhpDocNodeVisitor\CallablePhpDocNodeVisitor; use Rector\StaticTypeMapper\Naming\NameScopeFactory; /** @@ -20,8 +21,7 @@ final readonly class ConstExprClassNameDecorator implements PhpDocNodeDecoratorInterface { public function __construct( - private NameScopeFactory $nameScopeFactory, - private PhpDocNodeTraverser $phpDocNodeTraverser + private NameScopeFactory $nameScopeFactory ) { } @@ -32,7 +32,7 @@ public function decorate(PhpDocNode $phpDocNode, PhpNode $phpNode): void return; } - $this->phpDocNodeTraverser->traverseWithCallable($phpDocNode, '', function (Node $node) use ( + $phpDocNodeTraverser = new NodeTraverser([new CallablePhpDocNodeVisitor(function (Node $node) use ( $phpNode ): Node|null { if (! $node instanceof ConstFetchNode) { @@ -43,7 +43,8 @@ public function decorate(PhpDocNode $phpDocNode, PhpNode $phpNode): void $node->setAttribute(PhpDocAttributeKey::RESOLVED_CLASS, $className); return $node; - }); + })]); + $phpDocNodeTraverser->traverse([$phpDocNode]); } private function resolveFullyQualifiedClass(ConstFetchNode $constFetchNode, PhpNode $phpNode): string diff --git a/src/BetterPhpDocParser/NodeDecorator/PhpDocTagGenericUsesDecorator.php b/src/BetterPhpDocParser/NodeDecorator/PhpDocTagGenericUsesDecorator.php index 58e97a14d2f..d78c63b8520 100644 --- a/src/BetterPhpDocParser/NodeDecorator/PhpDocTagGenericUsesDecorator.php +++ b/src/BetterPhpDocParser/NodeDecorator/PhpDocTagGenericUsesDecorator.php @@ -6,12 +6,13 @@ use PhpParser\Node as PhpNode; use PHPStan\PhpDocParser\Ast\Node; +use PHPStan\PhpDocParser\Ast\NodeTraverser; use PHPStan\PhpDocParser\Ast\PhpDoc\GenericTagValueNode; use PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocNode; use PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagNode; use Rector\BetterPhpDocParser\Contract\PhpDocParser\PhpDocNodeDecoratorInterface; use Rector\BetterPhpDocParser\ValueObject\PhpDocAttributeKey; -use Rector\PhpDocParser\PhpDocParser\PhpDocNodeTraverser; +use Rector\PhpDocParser\PhpDocParser\PhpDocNodeVisitor\CallablePhpDocNodeVisitor; use Rector\StaticTypeMapper\Naming\NameScopeFactory; /** @@ -23,8 +24,7 @@ final readonly class PhpDocTagGenericUsesDecorator implements PhpDocNodeDecoratorInterface { public function __construct( - private NameScopeFactory $nameScopeFactory, - private PhpDocNodeTraverser $phpDocNodeTraverser + private NameScopeFactory $nameScopeFactory ) { } @@ -35,7 +35,7 @@ public function decorate(PhpDocNode $phpDocNode, PhpNode $phpNode): void return; } - $this->phpDocNodeTraverser->traverseWithCallable($phpDocNode, '', function (Node $node) use ( + $phpDocNodeTraverser = new NodeTraverser([new CallablePhpDocNodeVisitor(function (Node $node) use ( $phpNode ): Node|null { if (! $node instanceof PhpDocTagNode) { @@ -64,7 +64,8 @@ public function decorate(PhpDocNode $phpDocNode, PhpNode $phpNode): void $node->value->setAttribute(PhpDocAttributeKey::RESOLVED_CLASS, $className); return $node; - }); + })]); + $phpDocNodeTraverser->traverse([$phpDocNode]); } private function resolveFullyQualifiedClass(string $classValue, PhpNode $phpNode): string diff --git a/src/BetterPhpDocParser/PhpDocInfo/PhpDocInfo.php b/src/BetterPhpDocParser/PhpDocInfo/PhpDocInfo.php index 5313f86c574..491c7c50df7 100644 --- a/src/BetterPhpDocParser/PhpDocInfo/PhpDocInfo.php +++ b/src/BetterPhpDocParser/PhpDocInfo/PhpDocInfo.php @@ -7,6 +7,7 @@ use Nette\Utils\Strings; use PHPStan\PhpDocParser\Ast\ConstExpr\ConstFetchNode; use PHPStan\PhpDocParser\Ast\Node; +use PHPStan\PhpDocParser\Ast\NodeTraverser; use PHPStan\PhpDocParser\Ast\PhpDoc\ExtendsTagValueNode; use PHPStan\PhpDocParser\Ast\PhpDoc\GenericTagValueNode; use PHPStan\PhpDocParser\Ast\PhpDoc\ImplementsTagValueNode; @@ -34,7 +35,7 @@ use Rector\BetterPhpDocParser\ValueObject\PhpDocAttributeKey; use Rector\BetterPhpDocParser\ValueObject\Type\ShortenedIdentifierTypeNode; use Rector\Exception\ShouldNotHappenException; -use Rector\PhpDocParser\PhpDocParser\PhpDocNodeTraverser; +use Rector\PhpDocParser\PhpDocParser\PhpDocNodeVisitor\CallablePhpDocNodeVisitor; use Rector\StaticTypeMapper\Naming\NameScopeFactory; use Rector\StaticTypeMapper\StaticTypeMapper; use Rector\Validation\RectorAssert; @@ -256,8 +257,7 @@ public function removeByType(string $typeToRemove, ?string $name = null): bool $name = null; } - $phpDocNodeTraverser = new PhpDocNodeTraverser(); - $phpDocNodeTraverser->traverseWithCallable($this->phpDocNode, '', static function (Node $node) use ( + $phpDocNodeTraverser = new NodeTraverser([new CallablePhpDocNodeVisitor(static function (Node $node) use ( $typeToRemove, &$hasChanged, $name @@ -265,22 +265,22 @@ public function removeByType(string $typeToRemove, ?string $name = null): bool if ($node instanceof PhpDocTagNode && $node->value instanceof $typeToRemove) { // keep special annotation for tools if (str_starts_with($node->name, '@psalm-')) { - return null; + return NodeTraverser::DONT_TRAVERSE_CHILDREN; } if (str_starts_with($node->name, '@phpstan-')) { - return null; + return NodeTraverser::DONT_TRAVERSE_CHILDREN; } if ($name !== null && $node->value instanceof VarTagValueNode && $node->value->variableName !== '$' . ltrim( $name, '$' )) { - return PhpDocNodeTraverser::DONT_TRAVERSE_CHILDREN; + return NodeTraverser::DONT_TRAVERSE_CHILDREN; } $hasChanged = true; - return PhpDocNodeTraverser::NODE_REMOVE; + return NodeTraverser::REMOVE_NODE; } if (! $node instanceof $typeToRemove) { @@ -288,8 +288,9 @@ public function removeByType(string $typeToRemove, ?string $name = null): bool } $hasChanged = true; - return PhpDocNodeTraverser::NODE_REMOVE; - }); + return NodeTraverser::REMOVE_NODE; + })]); + $phpDocNodeTraverser->traverse([$this->phpDocNode]); return $hasChanged; } @@ -299,18 +300,18 @@ public function removeByName(string $tagName): bool $tagName = '@' . ltrim($tagName, '@'); $hasChanged = false; - $phpDocNodeTraverser = new PhpDocNodeTraverser(); - $phpDocNodeTraverser->traverseWithCallable($this->phpDocNode, '', static function (Node $node) use ( + $phpDocNodeTraverser = new NodeTraverser([new CallablePhpDocNodeVisitor(static function (Node $node) use ( $tagName, &$hasChanged ): ?int { if ($node instanceof PhpDocTagNode && $node->name === $tagName) { $hasChanged = true; - return PhpDocNodeTraverser::NODE_REMOVE; + return NodeTraverser::REMOVE_NODE; } return null; - }); + })]); + $phpDocNodeTraverser->traverse([$this->phpDocNode]); return $hasChanged; } @@ -519,11 +520,9 @@ public function getInlineGenericUsesTagClassNames(): array */ public function getConstFetchNodeClassNames(): array { - $phpDocNodeTraverser = new PhpDocNodeTraverser(); - $classNames = []; - $phpDocNodeTraverser->traverseWithCallable($this->phpDocNode, '', static function (Node $node) use ( + $phpDocNodeTraverser = new NodeTraverser([new CallablePhpDocNodeVisitor(static function (Node $node) use ( &$classNames, ): ?ConstTypeNode { if (! $node instanceof ConstTypeNode) { @@ -536,7 +535,8 @@ public function getConstFetchNodeClassNames(): array $classNames[] = $node->constExpr->getAttribute(PhpDocAttributeKey::RESOLVED_CLASS); return $node; - }); + })]); + $phpDocNodeTraverser->traverse([$this->phpDocNode]); return $classNames; } @@ -546,11 +546,9 @@ public function getConstFetchNodeClassNames(): array */ public function getArrayItemNodeClassNames(): array { - $phpDocNodeTraverser = new PhpDocNodeTraverser(); - $classNames = []; - $phpDocNodeTraverser->traverseWithCallable($this->phpDocNode, '', static function (Node $node) use ( + $phpDocNodeTraverser = new NodeTraverser([new CallablePhpDocNodeVisitor(static function (Node $node) use ( &$classNames, ): ?ArrayItemNode { if (! $node instanceof ArrayItemNode) { @@ -568,7 +566,8 @@ public function getArrayItemNodeClassNames(): array } return $node; - }); + })]); + $phpDocNodeTraverser->traverse([$this->phpDocNode]); return $classNames; } diff --git a/src/BetterPhpDocParser/PhpDocInfo/PhpDocInfoFactory.php b/src/BetterPhpDocParser/PhpDocInfo/PhpDocInfoFactory.php index a08a9a5a702..094448fe8cb 100644 --- a/src/BetterPhpDocParser/PhpDocInfo/PhpDocInfoFactory.php +++ b/src/BetterPhpDocParser/PhpDocInfo/PhpDocInfoFactory.php @@ -118,7 +118,7 @@ private function createFromPhpDocNode( BetterTokenIterator $betterTokenIterator, Node $node ): PhpDocInfo { - $this->phpDocNodeMapper->transform($phpDocNode, $betterTokenIterator); + $phpDocNode = $this->phpDocNodeMapper->transform($phpDocNode, $betterTokenIterator); $phpDocInfo = new PhpDocInfo( $phpDocNode, diff --git a/src/BetterPhpDocParser/PhpDocManipulator/PhpDocTagRemover.php b/src/BetterPhpDocParser/PhpDocManipulator/PhpDocTagRemover.php index 52dd2f478f8..06c7c216f55 100644 --- a/src/BetterPhpDocParser/PhpDocManipulator/PhpDocTagRemover.php +++ b/src/BetterPhpDocParser/PhpDocManipulator/PhpDocTagRemover.php @@ -5,10 +5,11 @@ namespace Rector\BetterPhpDocParser\PhpDocManipulator; use PHPStan\PhpDocParser\Ast\Node; +use PHPStan\PhpDocParser\Ast\NodeTraverser; use PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagNode; use Rector\BetterPhpDocParser\PhpDoc\DoctrineAnnotationTagValueNode; use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfo; -use Rector\PhpDocParser\PhpDocParser\PhpDocNodeTraverser; +use Rector\PhpDocParser\PhpDocParser\PhpDocNodeVisitor\CallablePhpDocNodeVisitor; final class PhpDocTagRemover { @@ -46,14 +47,13 @@ public function removeTagValueFromNode(PhpDocInfo $phpDocInfo, Node $desiredNode $phpDocNode = $phpDocInfo->getPhpDocNode(); $hasChanged = false; - $phpDocNodeTraverser = new PhpDocNodeTraverser(); - $phpDocNodeTraverser->traverseWithCallable($phpDocNode, '', static function (Node $node) use ( + $phpDocNodeTraverser = new NodeTraverser([new CallablePhpDocNodeVisitor(static function (Node $node) use ( $desiredNode, &$hasChanged ): ?int { if ($node instanceof PhpDocTagNode && $node->value === $desiredNode) { $hasChanged = true; - return PhpDocNodeTraverser::NODE_REMOVE; + return NodeTraverser::REMOVE_NODE; } if ($node !== $desiredNode) { @@ -61,8 +61,9 @@ public function removeTagValueFromNode(PhpDocInfo $phpDocInfo, Node $desiredNode } $hasChanged = true; - return PhpDocNodeTraverser::NODE_REMOVE; - }); + return NodeTraverser::REMOVE_NODE; + })]); + $phpDocNodeTraverser->traverse([$phpDocNode]); return $hasChanged; } diff --git a/src/BetterPhpDocParser/PhpDocNodeFinder/PhpDocNodeByTypeFinder.php b/src/BetterPhpDocParser/PhpDocNodeFinder/PhpDocNodeByTypeFinder.php index 4a9931f0243..31dead9afeb 100644 --- a/src/BetterPhpDocParser/PhpDocNodeFinder/PhpDocNodeByTypeFinder.php +++ b/src/BetterPhpDocParser/PhpDocNodeFinder/PhpDocNodeByTypeFinder.php @@ -5,9 +5,10 @@ namespace Rector\BetterPhpDocParser\PhpDocNodeFinder; use PHPStan\PhpDocParser\Ast\Node; +use PHPStan\PhpDocParser\Ast\NodeTraverser; use PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocNode; use Rector\BetterPhpDocParser\PhpDoc\DoctrineAnnotationTagValueNode; -use Rector\PhpDocParser\PhpDocParser\PhpDocNodeTraverser; +use Rector\PhpDocParser\PhpDocParser\PhpDocNodeVisitor\CallablePhpDocNodeVisitor; final class PhpDocNodeByTypeFinder { @@ -18,11 +19,9 @@ final class PhpDocNodeByTypeFinder */ public function findByType(PhpDocNode $phpDocNode, string $desiredType): array { - $phpDocNodeTraverser = new PhpDocNodeTraverser(); - $foundNodes = []; - $phpDocNodeTraverser->traverseWithCallable($phpDocNode, '', static function (Node $node) use ( + $phpDocNodeTraverser = new NodeTraverser([new CallablePhpDocNodeVisitor(static function (Node $node) use ( &$foundNodes, $desiredType ): Node { @@ -33,7 +32,8 @@ public function findByType(PhpDocNode $phpDocNode, string $desiredType): array /** @var TNode $node */ $foundNodes[] = $node; return $node; - }); + })]); + $phpDocNodeTraverser->traverse([$phpDocNode]); return $foundNodes; } diff --git a/src/BetterPhpDocParser/PhpDocNodeMapper.php b/src/BetterPhpDocParser/PhpDocNodeMapper.php index 4c7cf3dd623..5f37c191184 100644 --- a/src/BetterPhpDocParser/PhpDocNodeMapper.php +++ b/src/BetterPhpDocParser/PhpDocNodeMapper.php @@ -4,11 +4,11 @@ namespace Rector\BetterPhpDocParser; +use PHPStan\PhpDocParser\Ast\NodeTraverser; use PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocNode; use Rector\BetterPhpDocParser\Contract\BasePhpDocNodeVisitorInterface; use Rector\BetterPhpDocParser\DataProvider\CurrentTokenIteratorProvider; use Rector\BetterPhpDocParser\ValueObject\Parser\BetterTokenIterator; -use Rector\PhpDocParser\PhpDocParser\PhpDocNodeTraverser; use Rector\PhpDocParser\PhpDocParser\PhpDocNodeVisitor\CloningPhpDocNodeVisitor; use Rector\PhpDocParser\PhpDocParser\PhpDocNodeVisitor\ParentConnectingPhpDocNodeVisitor; use Webmozart\Assert\Assert; @@ -18,7 +18,7 @@ */ final readonly class PhpDocNodeMapper { - private PhpDocNodeTraverser $phpDocNodeTraverser; + private NodeTraverser $phpDocNodeTraverser; /** * @param BasePhpDocNodeVisitorInterface[] $phpDocNodeVisitors @@ -31,18 +31,20 @@ public function __construct( ) { Assert::notEmpty($phpDocNodeVisitors); - $this->phpDocNodeTraverser = new PhpDocNodeTraverser(); - $this->phpDocNodeTraverser->addPhpDocNodeVisitor($parentConnectingPhpDocNodeVisitor); - $this->phpDocNodeTraverser->addPhpDocNodeVisitor($cloningPhpDocNodeVisitor); - - foreach ($this->phpDocNodeVisitors as $phpDocNodeVisitor) { - $this->phpDocNodeTraverser->addPhpDocNodeVisitor($phpDocNodeVisitor); - } + $this->phpDocNodeTraverser = new NodeTraverser([ + $parentConnectingPhpDocNodeVisitor, + $cloningPhpDocNodeVisitor, + ...array_values($this->phpDocNodeVisitors), + ]); } - public function transform(PhpDocNode $phpDocNode, BetterTokenIterator $betterTokenIterator): void + public function transform(PhpDocNode $phpDocNode, BetterTokenIterator $betterTokenIterator): PhpDocNode { $this->currentTokenIteratorProvider->setBetterTokenIterator($betterTokenIterator); - $this->phpDocNodeTraverser->traverse($phpDocNode); + + [$phpDocNode] = $this->phpDocNodeTraverser->traverse([$phpDocNode]); + Assert::isInstanceOf($phpDocNode, PhpDocNode::class); + + return $phpDocNode; } } diff --git a/src/BetterPhpDocParser/PhpDocNodeVisitor/ArrayTypePhpDocNodeVisitor.php b/src/BetterPhpDocParser/PhpDocNodeVisitor/ArrayTypePhpDocNodeVisitor.php index 86d01a30edd..73ca897f1a8 100644 --- a/src/BetterPhpDocParser/PhpDocNodeVisitor/ArrayTypePhpDocNodeVisitor.php +++ b/src/BetterPhpDocParser/PhpDocNodeVisitor/ArrayTypePhpDocNodeVisitor.php @@ -4,14 +4,14 @@ namespace Rector\BetterPhpDocParser\PhpDocNodeVisitor; +use PHPStan\PhpDocParser\Ast\AbstractNodeVisitor; use PHPStan\PhpDocParser\Ast\Node; use PHPStan\PhpDocParser\Ast\Type\ArrayTypeNode; use Rector\BetterPhpDocParser\Attributes\AttributeMirrorer; use Rector\BetterPhpDocParser\Contract\BasePhpDocNodeVisitorInterface; use Rector\BetterPhpDocParser\ValueObject\Type\SpacingAwareArrayTypeNode; -use Rector\PhpDocParser\PhpDocParser\PhpDocNodeVisitor\AbstractPhpDocNodeVisitor; -final class ArrayTypePhpDocNodeVisitor extends AbstractPhpDocNodeVisitor implements BasePhpDocNodeVisitorInterface +final class ArrayTypePhpDocNodeVisitor extends AbstractNodeVisitor implements BasePhpDocNodeVisitorInterface { public function __construct( private readonly AttributeMirrorer $attributeMirrorer diff --git a/src/BetterPhpDocParser/PhpDocNodeVisitor/CallableTypePhpDocNodeVisitor.php b/src/BetterPhpDocParser/PhpDocNodeVisitor/CallableTypePhpDocNodeVisitor.php index cc06ea37372..63f255f4210 100644 --- a/src/BetterPhpDocParser/PhpDocNodeVisitor/CallableTypePhpDocNodeVisitor.php +++ b/src/BetterPhpDocParser/PhpDocNodeVisitor/CallableTypePhpDocNodeVisitor.php @@ -4,14 +4,14 @@ namespace Rector\BetterPhpDocParser\PhpDocNodeVisitor; +use PHPStan\PhpDocParser\Ast\AbstractNodeVisitor; use PHPStan\PhpDocParser\Ast\Node; use PHPStan\PhpDocParser\Ast\Type\CallableTypeNode; use Rector\BetterPhpDocParser\Attributes\AttributeMirrorer; use Rector\BetterPhpDocParser\Contract\BasePhpDocNodeVisitorInterface; use Rector\BetterPhpDocParser\ValueObject\Type\SpacingAwareCallableTypeNode; -use Rector\PhpDocParser\PhpDocParser\PhpDocNodeVisitor\AbstractPhpDocNodeVisitor; -final class CallableTypePhpDocNodeVisitor extends AbstractPhpDocNodeVisitor implements BasePhpDocNodeVisitorInterface +final class CallableTypePhpDocNodeVisitor extends AbstractNodeVisitor implements BasePhpDocNodeVisitorInterface { public function __construct( private readonly AttributeMirrorer $attributeMirrorer diff --git a/src/BetterPhpDocParser/PhpDocNodeVisitor/ChangedPhpDocNodeVisitor.php b/src/BetterPhpDocParser/PhpDocNodeVisitor/ChangedPhpDocNodeVisitor.php index f0c1bd016bd..e9511e2fb9b 100644 --- a/src/BetterPhpDocParser/PhpDocNodeVisitor/ChangedPhpDocNodeVisitor.php +++ b/src/BetterPhpDocParser/PhpDocNodeVisitor/ChangedPhpDocNodeVisitor.php @@ -4,17 +4,19 @@ namespace Rector\BetterPhpDocParser\PhpDocNodeVisitor; +use PHPStan\PhpDocParser\Ast\AbstractNodeVisitor; use PHPStan\PhpDocParser\Ast\Node; use Rector\BetterPhpDocParser\ValueObject\PhpDocAttributeKey; -use Rector\PhpDocParser\PhpDocParser\PhpDocNodeVisitor\AbstractPhpDocNodeVisitor; -final class ChangedPhpDocNodeVisitor extends AbstractPhpDocNodeVisitor +final class ChangedPhpDocNodeVisitor extends AbstractNodeVisitor { private bool $hasChanged = false; - public function beforeTraverse(Node $node): void + public function beforeTraverse(array $nodes): ?array { $this->hasChanged = false; + + return null; } public function enterNode(Node $node): ?Node diff --git a/src/BetterPhpDocParser/PhpDocNodeVisitor/IntersectionTypeNodePhpDocNodeVisitor.php b/src/BetterPhpDocParser/PhpDocNodeVisitor/IntersectionTypeNodePhpDocNodeVisitor.php index f6947cf0164..3536ef2c103 100644 --- a/src/BetterPhpDocParser/PhpDocNodeVisitor/IntersectionTypeNodePhpDocNodeVisitor.php +++ b/src/BetterPhpDocParser/PhpDocNodeVisitor/IntersectionTypeNodePhpDocNodeVisitor.php @@ -4,14 +4,14 @@ namespace Rector\BetterPhpDocParser\PhpDocNodeVisitor; +use PHPStan\PhpDocParser\Ast\AbstractNodeVisitor; use PHPStan\PhpDocParser\Ast\Node; use PHPStan\PhpDocParser\Ast\Type\IntersectionTypeNode; use Rector\BetterPhpDocParser\Attributes\AttributeMirrorer; use Rector\BetterPhpDocParser\Contract\BasePhpDocNodeVisitorInterface; use Rector\BetterPhpDocParser\ValueObject\Type\BracketsAwareIntersectionTypeNode; -use Rector\PhpDocParser\PhpDocParser\PhpDocNodeVisitor\AbstractPhpDocNodeVisitor; -final class IntersectionTypeNodePhpDocNodeVisitor extends AbstractPhpDocNodeVisitor implements BasePhpDocNodeVisitorInterface +final class IntersectionTypeNodePhpDocNodeVisitor extends AbstractNodeVisitor implements BasePhpDocNodeVisitorInterface { public function __construct( private readonly AttributeMirrorer $attributeMirrorer diff --git a/src/BetterPhpDocParser/PhpDocNodeVisitor/TemplatePhpDocNodeVisitor.php b/src/BetterPhpDocParser/PhpDocNodeVisitor/TemplatePhpDocNodeVisitor.php index 366948ad7af..5e0a6343ba6 100644 --- a/src/BetterPhpDocParser/PhpDocNodeVisitor/TemplatePhpDocNodeVisitor.php +++ b/src/BetterPhpDocParser/PhpDocNodeVisitor/TemplatePhpDocNodeVisitor.php @@ -4,6 +4,7 @@ namespace Rector\BetterPhpDocParser\PhpDocNodeVisitor; +use PHPStan\PhpDocParser\Ast\AbstractNodeVisitor; use PHPStan\PhpDocParser\Ast\Attribute; use PHPStan\PhpDocParser\Ast\Node; use PHPStan\PhpDocParser\Ast\PhpDoc\TemplateTagValueNode; @@ -14,9 +15,8 @@ use Rector\BetterPhpDocParser\ValueObject\Parser\BetterTokenIterator; use Rector\BetterPhpDocParser\ValueObject\PhpDoc\SpacingAwareTemplateTagValueNode; use Rector\Exception\ShouldNotHappenException; -use Rector\PhpDocParser\PhpDocParser\PhpDocNodeVisitor\AbstractPhpDocNodeVisitor; -final class TemplatePhpDocNodeVisitor extends AbstractPhpDocNodeVisitor implements BasePhpDocNodeVisitorInterface +final class TemplatePhpDocNodeVisitor extends AbstractNodeVisitor implements BasePhpDocNodeVisitorInterface { public function __construct( private readonly CurrentTokenIteratorProvider $currentTokenIteratorProvider, diff --git a/src/BetterPhpDocParser/PhpDocNodeVisitor/UnionTypeNodePhpDocNodeVisitor.php b/src/BetterPhpDocParser/PhpDocNodeVisitor/UnionTypeNodePhpDocNodeVisitor.php index 7b0aaec4cfd..6b6110b571d 100644 --- a/src/BetterPhpDocParser/PhpDocNodeVisitor/UnionTypeNodePhpDocNodeVisitor.php +++ b/src/BetterPhpDocParser/PhpDocNodeVisitor/UnionTypeNodePhpDocNodeVisitor.php @@ -4,6 +4,7 @@ namespace Rector\BetterPhpDocParser\PhpDocNodeVisitor; +use PHPStan\PhpDocParser\Ast\AbstractNodeVisitor; use PHPStan\PhpDocParser\Ast\Node; use PHPStan\PhpDocParser\Ast\Type\UnionTypeNode; use PHPStan\PhpDocParser\Lexer\Lexer; @@ -14,9 +15,8 @@ use Rector\BetterPhpDocParser\ValueObject\PhpDocAttributeKey; use Rector\BetterPhpDocParser\ValueObject\StartAndEnd; use Rector\BetterPhpDocParser\ValueObject\Type\BracketsAwareUnionTypeNode; -use Rector\PhpDocParser\PhpDocParser\PhpDocNodeVisitor\AbstractPhpDocNodeVisitor; -final class UnionTypeNodePhpDocNodeVisitor extends AbstractPhpDocNodeVisitor implements BasePhpDocNodeVisitorInterface +final class UnionTypeNodePhpDocNodeVisitor extends AbstractNodeVisitor implements BasePhpDocNodeVisitorInterface { public function __construct( private readonly CurrentTokenIteratorProvider $currentTokenIteratorProvider, diff --git a/src/BetterPhpDocParser/Printer/PhpDocInfoPrinter.php b/src/BetterPhpDocParser/Printer/PhpDocInfoPrinter.php index 8ee9a536319..6b2595e4bc2 100644 --- a/src/BetterPhpDocParser/Printer/PhpDocInfoPrinter.php +++ b/src/BetterPhpDocParser/Printer/PhpDocInfoPrinter.php @@ -7,6 +7,7 @@ use Nette\Utils\Strings; use PhpParser\Comment; use PhpParser\Node\Stmt\InlineHTML; +use PHPStan\PhpDocParser\Ast\NodeTraverser; use PHPStan\PhpDocParser\Ast\PhpDoc\ParamTagValueNode; use PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocChildNode; use PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocNode; @@ -21,7 +22,6 @@ use Rector\BetterPhpDocParser\ValueObject\PhpDocAttributeKey; use Rector\BetterPhpDocParser\ValueObject\StartAndEnd; use Rector\Exception\ShouldNotHappenException; -use Rector\PhpDocParser\PhpDocParser\PhpDocNodeTraverser; use Rector\Util\StringUtils; /** @@ -65,7 +65,7 @@ final class PhpDocInfoPrinter private ?PhpDocInfo $phpDocInfo = null; - private readonly PhpDocNodeTraverser $changedPhpDocNodeTraverser; + private readonly NodeTraverser $changedPhpDocNodeTraverser; public function __construct( private readonly EmptyPhpDocDetector $emptyPhpDocDetector, @@ -73,10 +73,7 @@ public function __construct( private readonly RemoveNodesStartAndEndResolver $removeNodesStartAndEndResolver, private readonly ChangedPhpDocNodeVisitor $changedPhpDocNodeVisitor, ) { - $changedPhpDocNodeTraverser = new PhpDocNodeTraverser(); - $changedPhpDocNodeTraverser->addPhpDocNodeVisitor($this->changedPhpDocNodeVisitor); - - $this->changedPhpDocNodeTraverser = $changedPhpDocNodeTraverser; + $this->changedPhpDocNodeTraverser = new NodeTraverser([$this->changedPhpDocNodeVisitor]); } public function printNew(PhpDocInfo $phpDocInfo): string @@ -342,7 +339,7 @@ private function correctPreviouslyReprintedFirstNode(int $key, StartAndEnd $star private function shouldReprint(PhpDocChildNode $phpDocChildNode): bool { - $this->changedPhpDocNodeTraverser->traverse($phpDocChildNode); + $this->changedPhpDocNodeTraverser->traverse([$phpDocChildNode]); return $this->changedPhpDocNodeVisitor->hasChanged(); } diff --git a/src/NodeTypeResolver/PhpDoc/NodeAnalyzer/DocBlockClassRenamer.php b/src/NodeTypeResolver/PhpDoc/NodeAnalyzer/DocBlockClassRenamer.php index 9a03e1141f3..5eb5ab96576 100644 --- a/src/NodeTypeResolver/PhpDoc/NodeAnalyzer/DocBlockClassRenamer.php +++ b/src/NodeTypeResolver/PhpDoc/NodeAnalyzer/DocBlockClassRenamer.php @@ -5,21 +5,20 @@ namespace Rector\NodeTypeResolver\PhpDoc\NodeAnalyzer; use PhpParser\Node; +use PHPStan\PhpDocParser\Ast\NodeTraverser; use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfo; use Rector\NodeTypeResolver\PhpDocNodeVisitor\ClassRenamePhpDocNodeVisitor; use Rector\NodeTypeResolver\ValueObject\OldToNewType; -use Rector\PhpDocParser\PhpDocParser\PhpDocNodeTraverser; final readonly class DocBlockClassRenamer { - private PhpDocNodeTraverser $phpDocNodeTraverser; + private NodeTraverser $phpDocNodeTraverser; public function __construct( private ClassRenamePhpDocNodeVisitor $classRenamePhpDocNodeVisitor, ) { // the traverser + visitor are reusable across calls, so build them once - $this->phpDocNodeTraverser = new PhpDocNodeTraverser(); - $this->phpDocNodeTraverser->addPhpDocNodeVisitor($this->classRenamePhpDocNodeVisitor); + $this->phpDocNodeTraverser = new NodeTraverser([$this->classRenamePhpDocNodeVisitor]); } /** @@ -35,7 +34,7 @@ public function renamePhpDocType(PhpDocInfo $phpDocInfo, array $oldToNewTypes, N $this->classRenamePhpDocNodeVisitor->setOldToNewTypes($oldToNewTypes); - $this->phpDocNodeTraverser->traverse($phpDocInfo->getPhpDocNode()); + $this->phpDocNodeTraverser->traverse([$phpDocInfo->getPhpDocNode()]); return $this->classRenamePhpDocNodeVisitor->hasChanged(); } diff --git a/src/NodeTypeResolver/PhpDoc/NodeAnalyzer/DocBlockNameImporter.php b/src/NodeTypeResolver/PhpDoc/NodeAnalyzer/DocBlockNameImporter.php index aa644f35056..93951ce665c 100644 --- a/src/NodeTypeResolver/PhpDoc/NodeAnalyzer/DocBlockNameImporter.php +++ b/src/NodeTypeResolver/PhpDoc/NodeAnalyzer/DocBlockNameImporter.php @@ -5,9 +5,9 @@ namespace Rector\NodeTypeResolver\PhpDoc\NodeAnalyzer; use PhpParser\Node; +use PHPStan\PhpDocParser\Ast\NodeTraverser; use PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocNode; use Rector\NodeTypeResolver\PhpDocNodeVisitor\NameImportingPhpDocNodeVisitor; -use Rector\PhpDocParser\PhpDocParser\PhpDocNodeTraverser; final readonly class DocBlockNameImporter { @@ -24,9 +24,8 @@ public function importNames(PhpDocNode $phpDocNode, Node $node): bool $this->nameImportingPhpDocNodeVisitor->setCurrentNode($node); - $phpDocNodeTraverser = new PhpDocNodeTraverser(); - $phpDocNodeTraverser->addPhpDocNodeVisitor($this->nameImportingPhpDocNodeVisitor); - $phpDocNodeTraverser->traverse($phpDocNode); + $phpDocNodeTraverser = new NodeTraverser([$this->nameImportingPhpDocNodeVisitor]); + $phpDocNodeTraverser->traverse([$phpDocNode]); return $this->nameImportingPhpDocNodeVisitor->hasChanged(); } diff --git a/src/NodeTypeResolver/PhpDocNodeVisitor/ClassRenamePhpDocNodeVisitor.php b/src/NodeTypeResolver/PhpDocNodeVisitor/ClassRenamePhpDocNodeVisitor.php index 8d9db4329b2..e71a481c9f0 100644 --- a/src/NodeTypeResolver/PhpDocNodeVisitor/ClassRenamePhpDocNodeVisitor.php +++ b/src/NodeTypeResolver/PhpDocNodeVisitor/ClassRenamePhpDocNodeVisitor.php @@ -5,6 +5,7 @@ namespace Rector\NodeTypeResolver\PhpDocNodeVisitor; use PhpParser\Node as PhpNode; +use PHPStan\PhpDocParser\Ast\AbstractNodeVisitor; use PHPStan\PhpDocParser\Ast\Node; use PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode; use PHPStan\PhpDocParser\Ast\Type\TypeNode; @@ -13,13 +14,12 @@ use Rector\BetterPhpDocParser\ValueObject\PhpDocAttributeKey; use Rector\Exception\ShouldNotHappenException; use Rector\NodeTypeResolver\ValueObject\OldToNewType; -use Rector\PhpDocParser\PhpDocParser\PhpDocNodeVisitor\AbstractPhpDocNodeVisitor; use Rector\Renaming\Collector\RenamedNameCollector; use Rector\StaticTypeMapper\StaticTypeMapper; use Rector\StaticTypeMapper\ValueObject\Type\AliasedObjectType; use Rector\StaticTypeMapper\ValueObject\Type\ShortenedObjectType; -final class ClassRenamePhpDocNodeVisitor extends AbstractPhpDocNodeVisitor +final class ClassRenamePhpDocNodeVisitor extends AbstractNodeVisitor { /** * @var OldToNewType[] @@ -41,7 +41,7 @@ public function setCurrentPhpNode(PhpNode $phpNode): void $this->currentPhpNode = $phpNode; } - public function beforeTraverse(Node $node): void + public function beforeTraverse(array $nodes): ?array { if ($this->oldToNewTypes === []) { throw new ShouldNotHappenException('Configure "$oldToNewClasses" first'); @@ -52,6 +52,8 @@ public function beforeTraverse(Node $node): void } $this->hasChanged = false; + + return null; } public function enterNode(Node $node): ?Node diff --git a/src/NodeTypeResolver/PhpDocNodeVisitor/NameImportingPhpDocNodeVisitor.php b/src/NodeTypeResolver/PhpDocNodeVisitor/NameImportingPhpDocNodeVisitor.php index 7bcca246f24..990883a58a0 100644 --- a/src/NodeTypeResolver/PhpDocNodeVisitor/NameImportingPhpDocNodeVisitor.php +++ b/src/NodeTypeResolver/PhpDocNodeVisitor/NameImportingPhpDocNodeVisitor.php @@ -6,6 +6,7 @@ use Nette\Utils\Strings; use PhpParser\Node as PhpParserNode; +use PHPStan\PhpDocParser\Ast\AbstractNodeVisitor; use PHPStan\PhpDocParser\Ast\Node; use PHPStan\PhpDocParser\Ast\PhpDoc\TemplateTagValueNode; use PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode; @@ -17,7 +18,6 @@ use Rector\BetterPhpDocParser\ValueObject\PhpDocAttributeKey; use Rector\CodingStyle\ClassNameImport\ClassNameImportSkipper; use Rector\Exception\ShouldNotHappenException; -use Rector\PhpDocParser\PhpDocParser\PhpDocNodeVisitor\AbstractPhpDocNodeVisitor; use Rector\PhpParser\Node\FileNode; use Rector\StaticTypeMapper\PhpDocParser\IdentifierPhpDocTypeMapper; use Rector\StaticTypeMapper\ValueObject\Type\AliasedObjectType; @@ -25,7 +25,7 @@ use Rector\StaticTypeMapper\ValueObject\Type\ShortenedObjectType; use Rector\ValueObject\Application\File; -final class NameImportingPhpDocNodeVisitor extends AbstractPhpDocNodeVisitor +final class NameImportingPhpDocNodeVisitor extends AbstractNodeVisitor { private ?PhpParserNode $currentPhpParserNode = null; @@ -39,11 +39,13 @@ public function __construct( ) { } - public function beforeTraverse(\PHPStan\PhpDocParser\Ast\Node $node): void + public function beforeTraverse(array $nodes): ?array { if (! $this->currentPhpParserNode instanceof PhpParserNode) { throw new ShouldNotHappenException('Set "$currentPhpParserNode" first'); } + + return null; } public function enterNode(Node $node): ?Node diff --git a/src/PHPStanStaticTypeMapper/TypeMapper/ClosureTypeMapper.php b/src/PHPStanStaticTypeMapper/TypeMapper/ClosureTypeMapper.php index 330c45905a5..7853101336c 100644 --- a/src/PHPStanStaticTypeMapper/TypeMapper/ClosureTypeMapper.php +++ b/src/PHPStanStaticTypeMapper/TypeMapper/ClosureTypeMapper.php @@ -7,13 +7,14 @@ use PhpParser\Node; use PhpParser\Node\Name\FullyQualified; use PHPStan\PhpDocParser\Ast\Node as AstNode; +use PHPStan\PhpDocParser\Ast\NodeTraverser; use PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode; use PHPStan\PhpDocParser\Ast\Type\TypeNode; use PHPStan\Type\ClosureType; use PHPStan\Type\Type; use Rector\BetterPhpDocParser\ValueObject\Type\FullyQualifiedIdentifierTypeNode; use Rector\Php\PhpVersionProvider; -use Rector\PhpDocParser\PhpDocParser\PhpDocNodeTraverser; +use Rector\PhpDocParser\PhpDocParser\PhpDocNodeVisitor\CallablePhpDocNodeVisitor; use Rector\PHPStanStaticTypeMapper\Contract\TypeMapperInterface; use Rector\PHPStanStaticTypeMapper\Enum\TypeKind; use Rector\ValueObject\PhpVersion; @@ -43,10 +44,7 @@ public function mapToPHPStanPhpDocTypeNode(Type $type): TypeNode { $typeNode = $type->toPhpDocNode(); - $phpDocNodeTraverser = new PhpDocNodeTraverser(); - $phpDocNodeTraverser->traverseWithCallable( - $typeNode, - '', + $phpDocNodeTraverser = new NodeTraverser([new CallablePhpDocNodeVisitor( static function (AstNode $astNode): ?FullyQualifiedIdentifierTypeNode { if (! $astNode instanceof IdentifierTypeNode) { return null; @@ -58,7 +56,8 @@ static function (AstNode $astNode): ?FullyQualifiedIdentifierTypeNode { return new FullyQualifiedIdentifierTypeNode('Closure'); } - ); + )]); + $phpDocNodeTraverser->traverse([$typeNode]); return $typeNode; } diff --git a/src/PHPStanStaticTypeMapper/TypeMapper/IntersectionTypeMapper.php b/src/PHPStanStaticTypeMapper/TypeMapper/IntersectionTypeMapper.php index 53492099831..dafaa306b84 100644 --- a/src/PHPStanStaticTypeMapper/TypeMapper/IntersectionTypeMapper.php +++ b/src/PHPStanStaticTypeMapper/TypeMapper/IntersectionTypeMapper.php @@ -8,6 +8,7 @@ use PhpParser\Node\Identifier; use PhpParser\Node\Name\FullyQualified; use PHPStan\PhpDocParser\Ast\Node as AstNode; +use PHPStan\PhpDocParser\Ast\NodeTraverser; use PHPStan\PhpDocParser\Ast\Type\ArrayShapeItemNode; use PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode; use PHPStan\PhpDocParser\Ast\Type\TypeNode; @@ -18,7 +19,7 @@ use PHPStan\Type\ObjectWithoutClassType; use PHPStan\Type\Type; use Rector\Php\PhpVersionProvider; -use Rector\PhpDocParser\PhpDocParser\PhpDocNodeTraverser; +use Rector\PhpDocParser\PhpDocParser\PhpDocNodeVisitor\CallablePhpDocNodeVisitor; use Rector\PHPStanStaticTypeMapper\Contract\TypeMapperInterface; use Rector\PHPStanStaticTypeMapper\Enum\TypeKind; use Rector\StaticTypeMapper\Mapper\ScalarStringToTypeMapper; @@ -52,40 +53,42 @@ public function mapToPHPStanPhpDocTypeNode(Type $type): TypeNode { $typeNode = $type->toPhpDocNode(); - $phpDocNodeTraverser = new PhpDocNodeTraverser(); - $phpDocNodeTraverser->traverseWithCallable( - $typeNode, - '', - function (AstNode $astNode): int|IdentifierTypeNode { + $phpDocNodeTraverser = new NodeTraverser([new CallablePhpDocNodeVisitor( + function (AstNode $astNode) use ($typeNode): int|IdentifierTypeNode|null { + if ($astNode === $typeNode) { + return null; + } + if ($astNode instanceof UnionTypeNode) { - return PhpDocNodeTraverser::DONT_TRAVERSE_CURRENT_AND_CHILDREN; + return NodeTraverser::DONT_TRAVERSE_CURRENT_AND_CHILDREN; } if ($astNode instanceof ArrayShapeItemNode) { - return PhpDocNodeTraverser::DONT_TRAVERSE_CURRENT_AND_CHILDREN; + return NodeTraverser::DONT_TRAVERSE_CURRENT_AND_CHILDREN; } if (! $astNode instanceof IdentifierTypeNode) { - return PhpDocNodeTraverser::DONT_TRAVERSE_CURRENT_AND_CHILDREN; + return NodeTraverser::DONT_TRAVERSE_CURRENT_AND_CHILDREN; } $type = $this->scalarStringToTypeMapper->mapScalarStringToType($astNode->name); if ($type->isScalar()->yes()) { - return PhpDocNodeTraverser::DONT_TRAVERSE_CURRENT_AND_CHILDREN; + return NodeTraverser::DONT_TRAVERSE_CURRENT_AND_CHILDREN; } if ($type->isArray()->yes()) { - return PhpDocNodeTraverser::DONT_TRAVERSE_CURRENT_AND_CHILDREN; + return NodeTraverser::DONT_TRAVERSE_CURRENT_AND_CHILDREN; } if ($type instanceof MixedType && $type->isExplicitMixed()) { - return PhpDocNodeTraverser::DONT_TRAVERSE_CURRENT_AND_CHILDREN; + return NodeTraverser::DONT_TRAVERSE_CURRENT_AND_CHILDREN; } $astNode->name = '\\' . ltrim($astNode->name, '\\'); return $astNode; } - ); + )]); + $phpDocNodeTraverser->traverse([$typeNode]); return $typeNode; } diff --git a/src/PhpDocParser/PhpDocParser/Contract/PhpDocNodeVisitorInterface.php b/src/PhpDocParser/PhpDocParser/Contract/PhpDocNodeVisitorInterface.php deleted file mode 100644 index c2b0defd061..00000000000 --- a/src/PhpDocParser/PhpDocParser/Contract/PhpDocNodeVisitorInterface.php +++ /dev/null @@ -1,24 +0,0 @@ -phpDocNodeVisitors[] = $phpDocNodeVisitor; - } - - public function traverse(Node $node): void - { - foreach ($this->phpDocNodeVisitors as $phpDocNodeVisitor) { - $phpDocNodeVisitor->beforeTraverse($node); - } - - $node = $this->traverseNode($node); - - foreach ($this->phpDocNodeVisitors as $phpDocNodeVisitor) { - $phpDocNodeVisitor->afterTraverse($node); - } - } - - /** - * @param callable(Node $node): (int|null|Node) $callable - */ - public function traverseWithCallable(Node $node, string $docContent, callable $callable): void - { - $callablePhpDocNodeVisitor = new CallablePhpDocNodeVisitor($callable, $docContent); - $this->addPhpDocNodeVisitor($callablePhpDocNodeVisitor); - - $this->traverse($node); - } - - /** - * @template TNode of Node - * @param TNode $node - * @return TNode - */ - private function traverseNode(Node $node): Node - { - $objectPublicPropertiesToValues = get_object_vars($node); - $subNodeNames = array_keys($objectPublicPropertiesToValues); - - foreach ($subNodeNames as $subNodeName) { - $subNode = &$node->{$subNodeName}; - - if (\is_array($subNode)) { - $subNode = $this->traverseArray($subNode); - } elseif ($subNode instanceof Node) { - $breakVisitorIndex = null; - $traverseChildren = true; - - foreach ($this->phpDocNodeVisitors as $visitorIndex => $phpDocNodeVisitor) { - $return = $phpDocNodeVisitor->enterNode($subNode); - - if ($return !== null) { - if ($return instanceof Node) { - $subNode = $return; - } elseif ($return === self::DONT_TRAVERSE_CHILDREN) { - $traverseChildren = false; - } elseif ($return === self::DONT_TRAVERSE_CURRENT_AND_CHILDREN) { - $traverseChildren = false; - $breakVisitorIndex = $visitorIndex; - break; - } elseif ($return === self::STOP_TRAVERSAL) { - $this->stopTraversal = true; - } elseif ($return === self::NODE_REMOVE) { - unset($subNode); - continue 2; - } else { - throw new InvalidTraverseException( - 'enterNode() returned invalid value of type ' . gettype($return) - ); - } - } - } - - if ($traverseChildren) { - $subNode = $this->traverseNode($subNode); - if ($this->stopTraversal) { - break; - } - } - - foreach ($this->phpDocNodeVisitors as $visitorIndex => $phpDocNodeVisitor) { - $phpDocNodeVisitor->leaveNode($subNode); - - if ($breakVisitorIndex === $visitorIndex) { - break; - } - } - } - } - - return $node; - } - - /** - * @param array $nodes - * @return array - */ - private function traverseArray(array $nodes): array - { - foreach ($nodes as $key => &$node) { - // can be string or something else - if (! $node instanceof Node) { - continue; - } - - $traverseChildren = true; - $breakVisitorIndex = null; - - foreach ($this->phpDocNodeVisitors as $visitorIndex => $phpDocNodeVisitor) { - $return = $phpDocNodeVisitor->enterNode($node); - - if ($return !== null) { - if ($return instanceof Node) { - $node = $return; - } elseif ($return === self::DONT_TRAVERSE_CHILDREN) { - $traverseChildren = false; - } elseif ($return === self::DONT_TRAVERSE_CURRENT_AND_CHILDREN) { - $traverseChildren = false; - $breakVisitorIndex = $visitorIndex; - break; - } elseif ($return === self::STOP_TRAVERSAL) { - $this->stopTraversal = true; - } elseif ($return === self::NODE_REMOVE) { - // remove node - unset($nodes[$key]); - continue 2; - } else { - throw new InvalidTraverseException('enterNode() returned invalid value of type ' . gettype( - $return - )); - } - } - } - - // should traverse node children's properties? - if ($traverseChildren) { - $node = $this->traverseNode($node); - if ($this->stopTraversal) { - break; - } - } - - foreach ($this->phpDocNodeVisitors as $visitorIndex => $phpDocNodeVisitor) { - $return = $phpDocNodeVisitor->leaveNode($node); - - if ($return !== null) { - if ($return instanceof Node) { - $node = $return; - } elseif (\is_array($return)) { - $doNodes[] = [$key, $return]; - break; - } elseif ($return === self::NODE_REMOVE) { - $doNodes[] = [$key, []]; - break; - } elseif ($return === self::STOP_TRAVERSAL) { - $this->stopTraversal = true; - break 2; - } else { - throw new InvalidTraverseException( - 'leaveNode() returned invalid value of type ' . gettype($return) - ); - } - } - - if ($breakVisitorIndex === $visitorIndex) { - break; - } - } - } - - return $nodes; - } -} diff --git a/src/PhpDocParser/PhpDocParser/PhpDocNodeVisitor/AbstractPhpDocNodeVisitor.php b/src/PhpDocParser/PhpDocParser/PhpDocNodeVisitor/AbstractPhpDocNodeVisitor.php deleted file mode 100644 index 1f442f98baa..00000000000 --- a/src/PhpDocParser/PhpDocParser/PhpDocNodeVisitor/AbstractPhpDocNodeVisitor.php +++ /dev/null @@ -1,35 +0,0 @@ -callable = $callable; } public function enterNode(Node $node): int|Node|null { $callable = $this->callable; - return $callable($node, $this->docContent); + return $callable($node); } } diff --git a/src/PhpDocParser/PhpDocParser/PhpDocNodeVisitor/CloningPhpDocNodeVisitor.php b/src/PhpDocParser/PhpDocParser/PhpDocNodeVisitor/CloningPhpDocNodeVisitor.php index 83a81697d96..5d3be124d05 100644 --- a/src/PhpDocParser/PhpDocParser/PhpDocNodeVisitor/CloningPhpDocNodeVisitor.php +++ b/src/PhpDocParser/PhpDocParser/PhpDocNodeVisitor/CloningPhpDocNodeVisitor.php @@ -4,6 +4,7 @@ namespace Rector\PhpDocParser\PhpDocParser\PhpDocNodeVisitor; +use PHPStan\PhpDocParser\Ast\AbstractNodeVisitor; use PHPStan\PhpDocParser\Ast\Node; use Rector\PhpDocParser\PhpDocParser\ValueObject\PhpDocAttributeKey; @@ -11,7 +12,7 @@ * Mirrors * https://github.com/nikic/PHP-Parser/blob/d520bc9e1d6203c35a1ba20675b79a051c821a9e/lib/PhpParser/NodeVisitor/CloningVisitor.php */ -final class CloningPhpDocNodeVisitor extends AbstractPhpDocNodeVisitor +final class CloningPhpDocNodeVisitor extends AbstractNodeVisitor { public function enterNode(Node $node): Node { diff --git a/src/PhpDocParser/PhpDocParser/PhpDocNodeVisitor/ParentConnectingPhpDocNodeVisitor.php b/src/PhpDocParser/PhpDocParser/PhpDocNodeVisitor/ParentConnectingPhpDocNodeVisitor.php index 377ad3a7ede..5ecc2b94938 100644 --- a/src/PhpDocParser/PhpDocParser/PhpDocNodeVisitor/ParentConnectingPhpDocNodeVisitor.php +++ b/src/PhpDocParser/PhpDocParser/PhpDocNodeVisitor/ParentConnectingPhpDocNodeVisitor.php @@ -4,6 +4,7 @@ namespace Rector\PhpDocParser\PhpDocParser\PhpDocNodeVisitor; +use PHPStan\PhpDocParser\Ast\AbstractNodeVisitor; use PHPStan\PhpDocParser\Ast\Node; use Rector\PhpDocParser\PhpDocParser\ValueObject\PhpDocAttributeKey; @@ -12,16 +13,18 @@ * * @see \Rector\Tests\PhpDocParser\PhpDocParser\PhpDocNodeVisitor\ParentConnectingPhpDocNodeVisitorTest */ -final class ParentConnectingPhpDocNodeVisitor extends AbstractPhpDocNodeVisitor +final class ParentConnectingPhpDocNodeVisitor extends AbstractNodeVisitor { /** * @var Node[] */ private array $stack = []; - public function beforeTraverse(Node $node): void + public function beforeTraverse(array $nodes): ?array { - $this->stack = [$node]; + $this->stack = []; + + return null; } public function enterNode(Node $node): Node @@ -36,10 +39,7 @@ public function enterNode(Node $node): Node return $node; } - /** - * @return null|int|\PhpParser\Node|Node[] Replacement node (or special return - */ - public function leaveNode(Node $node): int|\PhpParser\Node|array|null + public function leaveNode(Node $node): null { array_pop($this->stack); return null; diff --git a/tests/BetterPhpDocParser/PhpDocNodeMapperTest.php b/tests/BetterPhpDocParser/PhpDocNodeMapperTest.php index fa0092472e7..38d38f98df0 100644 --- a/tests/BetterPhpDocParser/PhpDocNodeMapperTest.php +++ b/tests/BetterPhpDocParser/PhpDocNodeMapperTest.php @@ -28,7 +28,7 @@ public function testParamTag(): void { $phpDocNode = $this->createParamDocNode(); - $this->phpDocNodeMapper->transform($phpDocNode, new BetterTokenIterator([])); + $phpDocNode = $this->phpDocNodeMapper->transform($phpDocNode, new BetterTokenIterator([])); $childNode = $phpDocNode->children[0]; $this->assertInstanceOf(PhpDocTagNode::class, $childNode); diff --git a/tests/PhpDocParser/PhpDocParser/PhpDocNodeVisitor/ParentConnectingPhpDocNodeVisitorTest.php b/tests/PhpDocParser/PhpDocParser/PhpDocNodeVisitor/ParentConnectingPhpDocNodeVisitorTest.php index 58455673c1b..9510c34a70e 100644 --- a/tests/PhpDocParser/PhpDocParser/PhpDocNodeVisitor/ParentConnectingPhpDocNodeVisitorTest.php +++ b/tests/PhpDocParser/PhpDocParser/PhpDocNodeVisitor/ParentConnectingPhpDocNodeVisitorTest.php @@ -4,35 +4,32 @@ namespace Rector\Tests\PhpDocParser\PhpDocParser\PhpDocNodeVisitor; +use PHPStan\PhpDocParser\Ast\NodeTraverser; use PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocNode; use PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagNode; use PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTextNode; use PHPStan\PhpDocParser\Ast\PhpDoc\ReturnTagValueNode; use PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode; -use Rector\PhpDocParser\PhpDocParser\PhpDocNodeTraverser; use Rector\PhpDocParser\PhpDocParser\PhpDocNodeVisitor\ParentConnectingPhpDocNodeVisitor; use Rector\PhpDocParser\PhpDocParser\ValueObject\PhpDocAttributeKey; use Rector\Testing\PHPUnit\AbstractLazyTestCase; final class ParentConnectingPhpDocNodeVisitorTest extends AbstractLazyTestCase { - private PhpDocNodeTraverser $phpDocNodeTraverser; + private NodeTraverser $phpDocNodeTraverser; protected function setUp(): void { parent::setUp(); - $this->phpDocNodeTraverser = $this->make(PhpDocNodeTraverser::class); - - /** @var ParentConnectingPhpDocNodeVisitor $parentConnectingPhpDocNodeVisitor */ $parentConnectingPhpDocNodeVisitor = $this->make(ParentConnectingPhpDocNodeVisitor::class); - $this->phpDocNodeTraverser->addPhpDocNodeVisitor($parentConnectingPhpDocNodeVisitor); + $this->phpDocNodeTraverser = new NodeTraverser([$parentConnectingPhpDocNodeVisitor]); } public function testTypeNode(): void { $phpDocNode = $this->createPhpDocNode(); - $this->phpDocNodeTraverser->traverse($phpDocNode); + $this->phpDocNodeTraverser->traverse([$phpDocNode]); /** @var PhpDocTagNode $phpDocChildNode */ $phpDocChildNode = $phpDocNode->children[0]; diff --git a/tests/PhpDocParser/PhpDocParser/SimplePhpDocNodeTraverser/PhpDocNodeTraverserTest.php b/tests/PhpDocParser/PhpDocParser/SimplePhpDocNodeTraverser/PhpDocNodeTraverserTest.php deleted file mode 100644 index afb4e205251..00000000000 --- a/tests/PhpDocParser/PhpDocParser/SimplePhpDocNodeTraverser/PhpDocNodeTraverserTest.php +++ /dev/null @@ -1,45 +0,0 @@ -phpDocNodeTraverser = $this->make(PhpDocNodeTraverser::class); - } - - public function test(): void - { - $varTagValueNode = new VarTagValueNode(new IdentifierTypeNode('string'), '', ''); - $phpDocNode = new PhpDocNode([new PhpDocTagNode('@var', $varTagValueNode)]); - - $this->phpDocNodeTraverser->traverseWithCallable($phpDocNode, '', static function (Node $node): Node { - if (! $node instanceof VarTagValueNode) { - return $node; - } - - $node->description = self::SOME_DESCRIPTION; - return $node; - }); - - $varTagValueNodes = $phpDocNode->getVarTagValues(); - $this->assertSame(self::SOME_DESCRIPTION, $varTagValueNodes[0]->description); - } -}