2021-09-28 16:17:28 +00:00
|
|
|
<?php
|
|
|
|
|
|
|
|
declare (strict_types=1);
|
2022-08-29 20:49:28 +00:00
|
|
|
namespace Rector\PhpDocParser\NodeVisitor;
|
2021-09-28 16:17:28 +00:00
|
|
|
|
2022-06-06 17:12:56 +00:00
|
|
|
use PhpParser\Node;
|
|
|
|
use PhpParser\Node\Expr;
|
|
|
|
use PhpParser\Node\Stmt;
|
|
|
|
use PhpParser\Node\Stmt\Expression;
|
2023-06-06 11:55:37 +00:00
|
|
|
use PhpParser\NodeTraverser;
|
2022-06-06 17:12:56 +00:00
|
|
|
use PhpParser\NodeVisitorAbstract;
|
2022-06-07 08:22:29 +00:00
|
|
|
final class CallableNodeVisitor extends NodeVisitorAbstract
|
2021-09-28 16:17:28 +00:00
|
|
|
{
|
|
|
|
/**
|
2022-02-19 18:54:29 +00:00
|
|
|
* @var callable(Node): (int|Node|null)
|
2021-09-28 16:17:28 +00:00
|
|
|
*/
|
|
|
|
private $callable;
|
2023-06-06 11:55:37 +00:00
|
|
|
/**
|
|
|
|
* @var string|null
|
|
|
|
*/
|
|
|
|
private $nodeHashToRemove;
|
2022-02-19 18:54:29 +00:00
|
|
|
/**
|
|
|
|
* @param callable(Node $node): (int|Node|null) $callable
|
|
|
|
*/
|
2021-09-28 16:17:28 +00:00
|
|
|
public function __construct(callable $callable)
|
|
|
|
{
|
|
|
|
$this->callable = $callable;
|
|
|
|
}
|
2022-06-07 08:22:29 +00:00
|
|
|
public function enterNode(Node $node)
|
2021-09-28 16:17:28 +00:00
|
|
|
{
|
|
|
|
$originalNode = $node;
|
|
|
|
$callable = $this->callable;
|
|
|
|
/** @var int|Node|null $newNode */
|
|
|
|
$newNode = $callable($node);
|
2023-06-06 11:55:37 +00:00
|
|
|
if ($newNode === NodeTraverser::REMOVE_NODE) {
|
|
|
|
$this->nodeHashToRemove = \spl_object_hash($originalNode);
|
|
|
|
return $originalNode;
|
|
|
|
}
|
2022-06-07 08:22:29 +00:00
|
|
|
if ($originalNode instanceof Stmt && $newNode instanceof Expr) {
|
|
|
|
return new Expression($newNode);
|
2021-09-28 16:17:28 +00:00
|
|
|
}
|
|
|
|
return $newNode;
|
|
|
|
}
|
2023-06-06 11:55:37 +00:00
|
|
|
/**
|
|
|
|
* @return int|\PhpParser\Node
|
|
|
|
*/
|
|
|
|
public function leaveNode(Node $node)
|
|
|
|
{
|
|
|
|
if ($this->nodeHashToRemove === \spl_object_hash($node)) {
|
|
|
|
$this->nodeHashToRemove = null;
|
|
|
|
return NodeTraverser::REMOVE_NODE;
|
|
|
|
}
|
|
|
|
return $node;
|
|
|
|
}
|
2021-09-28 16:17:28 +00:00
|
|
|
}
|