[Renaming] Skip rename docblock on conflict with alias on RenameClassRector (#2450)

* Another failing test for #7209

* fixture

* Closes #2448

* [ci-review] Rector Rectify

* clean up

* final touch: clean up

* final touch: clean up

Co-authored-by: Einar Gangsø <mail@einargangso.no>
Co-authored-by: GitHub Action <action@github.com>
This commit is contained in:
Abdul Malik Ikhsan 2022-06-07 19:47:02 +07:00 committed by GitHub
parent 5e3c2e71e0
commit 1a84313089
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
12 changed files with 45 additions and 42 deletions

View File

@ -109,9 +109,7 @@ final class ClassAnnotationMatcher
private function resolveAsAliased(array $uses, string $tag, bool $returnNullOnUnknownClass): ?string
{
foreach ($uses as $use) {
$prefix = $use instanceof GroupUse
? $use->prefix . '\\'
: '';
$prefix = $this->useImportsResolver->resolvePrefix($use);
foreach ($use->uses as $useUse) {
if (! $useUse->alias instanceof Identifier) {

View File

@ -23,6 +23,7 @@ use Rector\NodeTypeResolver\Node\AttributeKey;
use Rector\NodeTypeResolver\ValueObject\OldToNewType;
use Rector\PHPStanStaticTypeMapper\Enum\TypeKind;
use Rector\StaticTypeMapper\StaticTypeMapper;
use Rector\StaticTypeMapper\ValueObject\Type\AliasedObjectType;
use Rector\StaticTypeMapper\ValueObject\Type\ShortenedObjectType;
use Symplify\Astral\PhpDocParser\PhpDocNodeVisitor\AbstractPhpDocNodeVisitor;
@ -66,11 +67,14 @@ final class ClassRenamePhpDocNodeVisitor extends AbstractPhpDocNodeVisitor
}
$identifier = clone $node;
$namespacedName = $this->resolveNamespacedName($phpParserNode, $identifier->name);
$namespacedName = $this->resolveNamespacedName($phpParserNode, $node->name);
$identifier->name = $namespacedName;
$staticType = $this->staticTypeMapper->mapPHPStanPhpDocTypeNodeToPHPStanType($identifier, $phpParserNode);
if ($staticType instanceof AliasedObjectType) {
return null;
}
// make sure to compare FQNs
if ($staticType instanceof ShortenedObjectType) {
$staticType = new ObjectType($staticType->getFullyQualifiedName());
@ -116,8 +120,8 @@ final class ClassRenamePhpDocNodeVisitor extends AbstractPhpDocNodeVisitor
return $name;
}
$namespace = $this->betterNodeFinder->findParentType($phpParserNode, Namespace_::class);
$uses = $this->useImportsResolver->resolveForNode($phpParserNode);
$namespace = $this->betterNodeFinder->findParentType($phpParserNode, Namespace_::class);
if (! $namespace instanceof Namespace_) {
return $this->resolveNamefromUse($uses, $name);
@ -143,9 +147,7 @@ final class ClassRenamePhpDocNodeVisitor extends AbstractPhpDocNodeVisitor
private function resolveNamefromUse(array $uses, string $name): string
{
foreach ($uses as $use) {
$prefix = $use instanceof GroupUse
? $use->prefix . '\\'
: '';
$prefix = $this->useImportsResolver->resolvePrefix($use);
foreach ($use->uses as $useUse) {
if ($useUse->alias instanceof Identifier) {

View File

@ -5,7 +5,6 @@ declare(strict_types=1);
namespace Rector\PostRector\Collector;
use PhpParser\Node;
use PhpParser\Node\Stmt\GroupUse;
use Rector\Core\Provider\CurrentFileProvider;
use Rector\Core\ValueObject\Application\File;
use Rector\Naming\Naming\UseImportsResolver;
@ -64,9 +63,8 @@ final class UseNodesToAddCollector implements NodeCollectorInterface
$uses = $this->useImportsResolver->resolveForNode($node);
foreach ($uses as $use) {
$prefix = $use instanceof GroupUse
? $use->prefix . '\\'
: '';
$prefix = $this->useImportsResolver->resolvePrefix($use);
foreach ($use->uses as $useUse) {
if ($useUse->alias !== null) {
$objectTypes[] = new AliasedObjectType($useUse->alias->toString(), $prefix . $useUse->name);

View File

@ -90,9 +90,7 @@ final class NameScopeFactory
$useNamesByAlias = [];
foreach ($useNodes as $useNode) {
$prefix = $useNode instanceof GroupUse
? $useNode->prefix . '\\'
: '';
$prefix = $this->useImportsResolver->resolvePrefix($useNode);
foreach ($useNode->uses as $useUse) {
/** @var UseUse $useUse */
$aliasName = $useUse->getAlias()

View File

@ -0,0 +1,15 @@
<?php
namespace Rector\Tests\Renaming\Rector\Name\RenameClassRector\FixtureAutoImportNames;
use CompanyB\Foo as Storage;
class SkipRenameDocblockConflictAlias
{
/**
* @var Storage
*/
protected $storage;
}
?>

View File

@ -13,6 +13,7 @@ use PhpParser\Node\Stmt\UseUse;
use Rector\Core\Exception\ShouldNotHappenException;
use Rector\Core\PhpParser\Node\BetterNodeFinder;
use Rector\Core\Util\StringUtils;
use Rector\Naming\Naming\UseImportsResolver;
use Rector\NodeTypeResolver\Node\AttributeKey;
final class UseImportNameMatcher
@ -26,7 +27,8 @@ final class UseImportNameMatcher
private const SHORT_NAME_REGEX = '#^%s(\\\\[\w]+)?$#i';
public function __construct(
private readonly BetterNodeFinder $betterNodeFinder
private readonly BetterNodeFinder $betterNodeFinder,
private readonly UseImportsResolver $useImportsResolver
) {
}
@ -46,9 +48,7 @@ final class UseImportNameMatcher
public function matchNameWithUses(string $tag, array $uses): ?string
{
foreach ($uses as $use) {
$prefix = $use instanceof GroupUse
? $use->prefix . '\\'
: '';
$prefix = $this->useImportsResolver->resolvePrefix($use);
foreach ($use->uses as $useUse) {
if (! $this->isUseMatchingName($tag, $useUse)) {
continue;

View File

@ -114,7 +114,7 @@ CODE_SAMPLE
$typeFilter = $node instanceof ConstFetch ? Use_::TYPE_CONSTANT : Use_::TYPE_FUNCTION;
foreach ($useNodes as $useNode) {
$prefix = $this->resolvePrefix($useNode);
$prefix = $this->useImportsResolver->resolvePrefix($useNode);
if ($useNode->type !== $typeFilter) {
continue;
@ -134,11 +134,4 @@ CODE_SAMPLE
return null;
}
private function resolvePrefix(Use_|GroupUse $useNode): string
{
return $useNode instanceof GroupUse
? $useNode->prefix . '\\'
: '';
}
}

View File

@ -6,7 +6,6 @@ namespace Rector\Naming\Naming;
use PhpParser\Node\Identifier;
use PhpParser\Node\Name;
use PhpParser\Node\Stmt\GroupUse;
final class AliasNameResolver
{
@ -21,9 +20,7 @@ final class AliasNameResolver
$nameString = $name->toString();
foreach ($uses as $use) {
$prefix = $use instanceof GroupUse
? $use->prefix . '\\'
: '';
$prefix = $this->useImportsResolver->resolvePrefix($use);
foreach ($use->uses as $useUse) {
if (! $useUse->alias instanceof Identifier) {

View File

@ -53,4 +53,11 @@ final class UseImportsResolver
return array_filter($namespace->stmts, fn (Stmt $stmt): bool => $stmt instanceof Use_);
}
public function resolvePrefix(Use_|GroupUse $use): string
{
return $use instanceof GroupUse
? $use->prefix . '\\'
: '';
}
}

View File

@ -14,7 +14,6 @@ use PhpParser\Node\Name;
use PhpParser\Node\Name\FullyQualified;
use PhpParser\Node\Stmt\Class_;
use PhpParser\Node\Stmt\ClassLike;
use PhpParser\Node\Stmt\GroupUse;
use PhpParser\Node\Stmt\Namespace_;
use PhpParser\Node\Stmt\Use_;
use PhpParser\Node\Stmt\UseUse;
@ -421,9 +420,8 @@ final class ClassRenamer
}
foreach ($uses as $use) {
$prefix = $use instanceof GroupUse
? $use->prefix . '\\'
: '';
$prefix = $this->useImportsResolver->resolvePrefix($use);
foreach ($use->uses as $useUse) {
if ($prefix . $useUse->name->toString() === $newName) {
// name already exists

View File

@ -103,9 +103,7 @@ final class ObjectTypeSpecifier
$parent = $node->getAttribute(AttributeKey::PARENT_NODE);
foreach ($uses as $use) {
$prefix = $use instanceof GroupUse
? $use->prefix . '\\'
: '';
$prefix = $this->useImportsResolver->resolvePrefix($use);
foreach ($use->uses as $useUse) {
if ($useUse->alias === null) {
continue;

View File

@ -2,6 +2,7 @@
declare(strict_types=1);
use Isolated\Symfony\Component\Finder\Finder;
use Nette\Utils\DateTime;
use Nette\Utils\Strings;
use Rector\Compiler\Unprefixer;
@ -14,8 +15,6 @@ $dateTime = DateTime::from('now');
$timestamp = $dateTime->format('Ymd');
// @see https://github.com/humbug/php-scoper/blob/master/docs/further-reading.md
use Isolated\Symfony\Component\Finder\Finder;
$polyfillsBootstraps = array_map(
static fn (SplFileInfo $fileInfo) => $fileInfo->getPathname(),
iterator_to_array(
@ -70,7 +69,7 @@ return [
'Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator',
],
'expose-functions' => ['u', 'b', 's', 'trigger_deprecation'],
'expose-constants' => ['__RECTOR_RUNNING__', '#^SYMFONY\_[\p{L}_]+$#',],
'expose-constants' => ['__RECTOR_RUNNING__', '#^SYMFONY\_[\p{L}_]+$#'],
'patchers' => [
// fix short import bug, @see https://github.com/rectorphp/rector-scoper-017/blob/23f3256a6f5a18483d6eb4659d69ba117501e2e3/vendor/nikic/php-parser/lib/PhpParser/Builder/Declaration.php#L6