betterNodeFinder = $betterNodeFinder; $this->nodeNameResolver = $nodeNameResolver; } /** * @return NameAndParent[][] */ public function resolveUsedNameNodes(\PhpParser\Node $node) : array { $this->resolvedNodeNames = []; $this->resolveUsedNames($node); $this->resolveUsedClassNames($node); $this->resolveTraitUseNames($node); return $this->resolvedNodeNames; } private function resolveUsedNames(\PhpParser\Node $node) : void { /** @var Name[] $namedNodes */ $namedNodes = $this->betterNodeFinder->findInstanceOf($node, \PhpParser\Node\Name::class); foreach ($namedNodes as $namedNode) { /** node name before becoming FQN - attribute from @see NameResolver */ $originalName = $namedNode->getAttribute(\Rector\NodeTypeResolver\Node\AttributeKey::ORIGINAL_NAME); if (!$originalName instanceof \PhpParser\Node\Name) { continue; } $parentNode = $namedNode->getAttribute(\Rector\NodeTypeResolver\Node\AttributeKey::PARENT_NODE); if (!$parentNode instanceof \PhpParser\Node) { throw new \Rector\Core\Exception\ShouldNotHappenException(); } $this->resolvedNodeNames[$originalName->toString()][] = new \Rector\CodingStyle\ValueObject\NameAndParent($namedNode, $parentNode); } } private function resolveUsedClassNames(\PhpParser\Node $searchNode) : void { /** @var ClassLike[] $classLikes */ $classLikes = $this->betterNodeFinder->findClassLikes([$searchNode]); foreach ($classLikes as $classLike) { $classLikeName = $classLike->name; if (!$classLikeName instanceof \PhpParser\Node\Identifier) { continue; } $name = $this->nodeNameResolver->getName($classLikeName); if ($name === null) { continue; } $this->resolvedNodeNames[$name][] = new \Rector\CodingStyle\ValueObject\NameAndParent($classLikeName, $classLike); } } private function resolveTraitUseNames(\PhpParser\Node $searchNode) : void { /** @var Identifier[] $identifiers */ $identifiers = $this->betterNodeFinder->findInstanceOf($searchNode, \PhpParser\Node\Identifier::class); foreach ($identifiers as $identifier) { $parentNode = $identifier->getAttribute(\Rector\NodeTypeResolver\Node\AttributeKey::PARENT_NODE); if (!$parentNode instanceof \PhpParser\Node\Stmt\UseUse) { continue; } $this->resolvedNodeNames[$identifier->name][] = new \Rector\CodingStyle\ValueObject\NameAndParent($identifier, $parentNode); } } }