diff --git a/packages/BetterPhpDocParser/PhpDocParser/ClassAnnotationMatcher.php b/packages/BetterPhpDocParser/PhpDocParser/ClassAnnotationMatcher.php index e1833a4a19c..e826f1a849c 100644 --- a/packages/BetterPhpDocParser/PhpDocParser/ClassAnnotationMatcher.php +++ b/packages/BetterPhpDocParser/PhpDocParser/ClassAnnotationMatcher.php @@ -5,6 +5,7 @@ namespace Rector\BetterPhpDocParser\PhpDocParser; use PhpParser\Node; +use PhpParser\Node\Identifier; use PhpParser\Node\Stmt\Use_; use PHPStan\Analyser\Scope; use PHPStan\Reflection\ReflectionProvider; @@ -59,6 +60,40 @@ private function resolveFullyQualifiedClass(array $uses, Node $node, string $tag if ($this->reflectionProvider->hasClass($namespacedTag)) { return $namespacedTag; } + + if (! str_contains($tag, '\\')) { + return $this->resolveAsAliased($uses, $tag); + } + } + } + + return $this->useImportNameMatcher->matchNameWithUses($tag, $uses) ?? $tag; + } + + /** + * @param Use_[] $uses + */ + private function resolveAsAliased(array $uses, string $tag): string + { + foreach ($uses as $use) { + $useUses = $use->uses; + // skip group uses or empty + if (count($useUses) !== 1) { + continue; + } + + // uses already removed + if (! isset($useUses[0])) { + continue; + } + + if (! $useUses[0]->alias instanceof Identifier) { + continue; + } + + $alias = $useUses[0]->alias; + if ($alias->toString() === $tag) { + return $useUses[0]->name->toString(); } } diff --git a/rules-tests/Php80/Rector/Class_/AnnotationToAttributeRector/Fixture/alias_used.php.inc b/rules-tests/Php80/Rector/Class_/AnnotationToAttributeRector/Fixture/alias_used.php.inc new file mode 100644 index 00000000000..d115feb2cae --- /dev/null +++ b/rules-tests/Php80/Rector/Class_/AnnotationToAttributeRector/Fixture/alias_used.php.inc @@ -0,0 +1,49 @@ + +----- + diff --git a/rules-tests/Php80/Rector/Class_/AnnotationToAttributeRector/Source/UseAlias/TestOther.php b/rules-tests/Php80/Rector/Class_/AnnotationToAttributeRector/Source/UseAlias/TestOther.php new file mode 100644 index 00000000000..1997f2fd969 --- /dev/null +++ b/rules-tests/Php80/Rector/Class_/AnnotationToAttributeRector/Source/UseAlias/TestOther.php @@ -0,0 +1,8 @@ +alias !== null ? $useUse->alias->name : $useUse->name->getLast(); - $shortNamePattern = preg_quote($shortName, '#'); - $pattern = sprintf(self::SHORT_NAME_REGEX, $shortNamePattern); - return StringUtils::isMatch($tag, $pattern); - } - - private function resolveName(string $tag, UseUse $useUse): string + public function resolveName(string $tag, UseUse $useUse): string { if ($useUse->alias === null) { return $useUse->name->toString(); @@ -75,4 +67,12 @@ private function resolveName(string $tag, UseUse $useUse): string return $useUse->name . '\\' . $unaliasedShortClass; } + + private function isUseMatchingName(string $tag, 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 StringUtils::isMatch($tag, $pattern); + } }