betterNodeFinder = $betterNodeFinder; $this->nodeNameResolver = $nodeNameResolver; } /** * @return Variable[] */ public function resolveUsedVariables(MethodCall $withConsecutiveMethodCall, ?Stmt $returnStmt) : array { $consecutiveArgs = $withConsecutiveMethodCall->getArgs(); $stmtVariables = $returnStmt instanceof Stmt ? $this->resolveUniqueVariables([$returnStmt]) : []; return $this->resolveUniqueVariables(\array_merge($consecutiveArgs, $stmtVariables)); } /** * @param Node[] $nodes * @return Variable[] */ private function resolveUniqueVariables(array $nodes) : array { /** @var Variable[] $usedVariables */ $usedVariables = $this->betterNodeFinder->findInstancesOfScoped($nodes, Variable::class); $uniqueUsedVariables = []; foreach ($usedVariables as $usedVariable) { if ($this->nodeNameResolver->isNames($usedVariable, ['this', ConsecutiveVariable::MATCHER, ConsecutiveVariable::PARAMETERS])) { continue; } $usedVariableName = $this->nodeNameResolver->getName($usedVariable); $uniqueUsedVariables[$usedVariableName] = $usedVariable; } return $uniqueUsedVariables; } }