simpleCallableNodeTraverser = $simpleCallableNodeTraverser; $this->nodeNameResolver = $nodeNameResolver; } /** * @param Stmt[] $stmts */ public function traverserStmtsForFunctions(array $stmts, callable $callable) : void { $this->traverseForType($stmts, $callable, \PhpParser\Node\Stmt\Use_::TYPE_FUNCTION); } /** * @param Stmt[] $stmts */ public function traverserStmts(array $stmts, callable $callable) : void { $this->traverseForType($stmts, $callable, \PhpParser\Node\Stmt\Use_::TYPE_NORMAL); } /** * @param Stmt[] $stmts */ private function traverseForType(array $stmts, callable $callable, int $desiredType) : void { $this->simpleCallableNodeTraverser->traverseNodesWithCallable($stmts, function (\PhpParser\Node $node) use($callable, $desiredType) { if ($node instanceof \PhpParser\Node\Stmt\Use_) { // only import uses if ($node->type !== $desiredType) { return null; } foreach ($node->uses as $useUse) { $name = $this->nodeNameResolver->getName($useUse); $callable($useUse, $name); } } if ($node instanceof \PhpParser\Node\Stmt\GroupUse) { $this->processGroupUse($node, $desiredType, $callable); } return null; }); } private function processGroupUse(\PhpParser\Node\Stmt\GroupUse $groupUse, int $desiredType, callable $callable) : void { if ($groupUse->type !== \PhpParser\Node\Stmt\Use_::TYPE_UNKNOWN) { return; } $prefixName = $groupUse->prefix->toString(); foreach ($groupUse->uses as $useUse) { if ($useUse->type !== $desiredType) { continue; } $name = $prefixName . '\\' . $this->nodeNameResolver->getName($useUse); $callable($useUse, $name); } } }