betterNodeFinder = $betterNodeFinder; } /** * @param Stmt[] $stmts */ public function matchNameWithStmts(string $tag, array $stmts) : ?string { /** @var Use_[] $uses */ $uses = $this->betterNodeFinder->findInstanceOf($stmts, \PhpParser\Node\Stmt\Use_::class); return $this->matchNameWithUses($tag, $uses); } /** * @param Use_[] $uses */ public function matchNameWithUses(string $tag, array $uses) : ?string { foreach ($uses as $use) { foreach ($use->uses as $useUse) { if (!$this->isUseMatchingName($tag, $useUse)) { continue; } return $this->resolveName($tag, $useUse); } } return null; } public function resolveName(string $tag, \PhpParser\Node\Stmt\UseUse $useUse) : string { if ($useUse->alias === null) { return $useUse->name->toString(); } $unaliasedShortClass = \RectorPrefix20220220\Nette\Utils\Strings::substring($tag, \RectorPrefix20220220\Nette\Utils\Strings::length($useUse->alias->toString())); if (\strncmp($unaliasedShortClass, '\\', \strlen('\\')) === 0) { return $useUse->name . $unaliasedShortClass; } return $useUse->name . '\\' . $unaliasedShortClass; } private function isUseMatchingName(string $tag, \PhpParser\Node\Stmt\UseUse $useUse) : bool { $shortName = $useUse->alias !== null ? $useUse->alias->name : $useUse->name->getLast(); $shortNamePattern = \preg_quote($shortName, '#'); $pattern = \sprintf(self::SHORT_NAME_REGEX, $shortNamePattern); return \Rector\Core\Util\StringUtils::isMatch($tag, $pattern); } }