mirror of
https://github.com/rectorphp/rector.git
synced 2024-06-01 08:50:50 +00:00
[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:
parent
5e3c2e71e0
commit
1a84313089
|
@ -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) {
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -0,0 +1,15 @@
|
|||
<?php
|
||||
|
||||
namespace Rector\Tests\Renaming\Rector\Name\RenameClassRector\FixtureAutoImportNames;
|
||||
|
||||
use CompanyB\Foo as Storage;
|
||||
|
||||
class SkipRenameDocblockConflictAlias
|
||||
{
|
||||
/**
|
||||
* @var Storage
|
||||
*/
|
||||
protected $storage;
|
||||
}
|
||||
|
||||
?>
|
|
@ -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;
|
||||
|
|
|
@ -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 . '\\'
|
||||
: '';
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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 . '\\'
|
||||
: '';
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue
Block a user