| Current Path : /home/rtorresani/www/vendor/rector/rector/src/NodeManipulator/ |
| Current File : //home/rtorresani/www/vendor/rector/rector/src/NodeManipulator/MethodCallManipulator.php |
<?php
declare (strict_types=1);
namespace Rector\Core\NodeManipulator;
use PhpParser\Node;
use PhpParser\Node\Expr\MethodCall;
use PhpParser\Node\Expr\Variable;
use PhpParser\Node\Stmt\ClassMethod;
use Rector\Core\PhpParser\Node\BetterNodeFinder;
use Rector\Defluent\NodeAnalyzer\FluentChainMethodCallNodeAnalyzer;
use Rector\NodeNameResolver\NodeNameResolver;
final class MethodCallManipulator
{
/**
* @readonly
* @var \Rector\Core\PhpParser\Node\BetterNodeFinder
*/
private $betterNodeFinder;
/**
* @readonly
* @var \Rector\NodeNameResolver\NodeNameResolver
*/
private $nodeNameResolver;
/**
* @readonly
* @var \Rector\Defluent\NodeAnalyzer\FluentChainMethodCallNodeAnalyzer
*/
private $fluentChainMethodCallNodeAnalyzer;
public function __construct(BetterNodeFinder $betterNodeFinder, NodeNameResolver $nodeNameResolver, FluentChainMethodCallNodeAnalyzer $fluentChainMethodCallNodeAnalyzer)
{
$this->betterNodeFinder = $betterNodeFinder;
$this->nodeNameResolver = $nodeNameResolver;
$this->fluentChainMethodCallNodeAnalyzer = $fluentChainMethodCallNodeAnalyzer;
}
/**
* @api
* @return string[]
*/
public function findMethodCallNamesOnVariable(Variable $variable) : array
{
$methodCallsOnVariable = $this->findMethodCallsOnVariable($variable);
$methodCallNamesOnVariable = [];
foreach ($methodCallsOnVariable as $methodCallOnVariable) {
$methodName = $this->nodeNameResolver->getName($methodCallOnVariable->name);
if ($methodName === null) {
continue;
}
$methodCallNamesOnVariable[] = $methodName;
}
return \array_unique($methodCallNamesOnVariable);
}
/**
* @return MethodCall[]
*/
private function findMethodCallsOnVariable(Variable $variable) : array
{
// get scope node, e.g. parent function call, method call or anonymous function
$classMethod = $this->betterNodeFinder->findParentType($variable, ClassMethod::class);
if (!$classMethod instanceof ClassMethod) {
return [];
}
$variableName = $this->nodeNameResolver->getName($variable);
if ($variableName === null) {
return [];
}
return $this->betterNodeFinder->find((array) $classMethod->stmts, function (Node $node) use($variableName) : bool {
if (!$node instanceof MethodCall) {
return \false;
}
// cover fluent interfaces too
$callerNode = $this->fluentChainMethodCallNodeAnalyzer->resolveRootExpr($node);
if (!$callerNode instanceof Variable) {
return \false;
}
return $this->nodeNameResolver->isName($callerNode, $variableName);
});
}
}