diff --git a/packages/BetterPhpDocParser/src/PhpDocInfo/PhpDocInfo.php b/packages/BetterPhpDocParser/src/PhpDocInfo/PhpDocInfo.php index cb8bb0c24fb..d804436bb7c 100644 --- a/packages/BetterPhpDocParser/src/PhpDocInfo/PhpDocInfo.php +++ b/packages/BetterPhpDocParser/src/PhpDocInfo/PhpDocInfo.php @@ -157,6 +157,19 @@ final class PhpDocInfo return $this->staticTypeMapper->mapPHPStanPhpDocTypeToPHPStanType($paramTagValue, $this->node); } + /** + * @return Type[] + */ + public function getParamTypes(): array + { + $paramTypes = []; + foreach ($this->getParamTagValues() as $paramTagValue) { + $paramTypes[] = $this->staticTypeMapper->mapPHPStanPhpDocTypeToPHPStanType($paramTagValue, $this->node); + } + + return $paramTypes; + } + public function getVarType(): Type { $varTagValue = $this->getVarTagValue(); diff --git a/packages/CodingStyle/src/Rector/Use_/RemoveUnusedAliasRector.php b/packages/CodingStyle/src/Rector/Use_/RemoveUnusedAliasRector.php index a4cc064547b..a2526b1355b 100644 --- a/packages/CodingStyle/src/Rector/Use_/RemoveUnusedAliasRector.php +++ b/packages/CodingStyle/src/Rector/Use_/RemoveUnusedAliasRector.php @@ -18,10 +18,12 @@ use PhpParser\Node\Stmt\TraitUse; use PhpParser\Node\Stmt\Use_; use PhpParser\Node\Stmt\UseUse; use PhpParser\NodeVisitor\NameResolver; +use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfo; use Rector\CodingStyle\Imports\ShortNameResolver; use Rector\CodingStyle\Naming\ClassNaming; use Rector\Exception\ShouldNotHappenException; use Rector\NodeTypeResolver\Node\AttributeKey; +use Rector\PHPStan\Type\AliasedObjectType; use Rector\Rector\AbstractRector; use Rector\RectorDefinition\CodeSample; use Rector\RectorDefinition\RectorDefinition; @@ -306,6 +308,27 @@ PHP return; } + /** @var PhpDocInfo $phpDocInfo */ + $phpDocInfo = $this->getPhpDocInfo($node); + if ($phpDocInfo->getVarType()) { + $varType = $phpDocInfo->getVarType(); + if ($varType instanceof AliasedObjectType) { + $possibleDocAliases[] = $varType->getClassName(); + } + + $returnType = $phpDocInfo->getReturnType(); + if ($returnType instanceof AliasedObjectType) { + $possibleDocAliases[] = $returnType->getClassName(); + } + + foreach ($phpDocInfo->getParamTypes() as $paramType) { + if ($paramType instanceof AliasedObjectType) { + $possibleDocAliases[] = $paramType->getClassName(); + } + } + } + + // e.g. "use Dotrine\ORM\Mapping as ORM" etc. $matches = Strings::matchAll($node->getDocComment()->getText(), '#\@(?\w+)(\\\\)?#s'); foreach ($matches as $match) { $possibleDocAliases[] = $match['possible_alias']; @@ -336,6 +359,10 @@ PHP $shortNames = $this->shortNameResolver->resolveForNode($use); foreach ($shortNames as $alias => $useImport) { $shortName = $this->classNaming->getShortName($useImport); + if ($shortName === $alias) { + continue; + } + $useNamesAliasToName[$shortName][] = $alias; } diff --git a/packages/CodingStyle/tests/Rector/Use_/RemoveUnusedAliasRector/Fixture/keep_used_doc_param.php.inc b/packages/CodingStyle/tests/Rector/Use_/RemoveUnusedAliasRector/Fixture/keep_used_doc_param.php.inc new file mode 100644 index 00000000000..d79a61b079a --- /dev/null +++ b/packages/CodingStyle/tests/Rector/Use_/RemoveUnusedAliasRector/Fixture/keep_used_doc_param.php.inc @@ -0,0 +1,17 @@ +