Skip to content

Commit

Permalink
[Renaming] Skip rename docblock on conflict with alias on RenameClass…
Browse files Browse the repository at this point in the history
…Rector (#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>
  • Loading branch information
3 people committed Jun 7, 2022
1 parent 5e3c2e7 commit 1a84313
Show file tree
Hide file tree
Showing 12 changed files with 45 additions and 42 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -109,9 +109,7 @@ private function resolveFullyQualifiedClass(
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) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
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;

Expand Down Expand Up @@ -66,11 +67,14 @@ public function enterNode(Node $node): ?Node
}

$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());
Expand Down Expand Up @@ -116,8 +120,8 @@ private function resolveNamespacedName(PhpParserNode $phpParserNode, string $nam
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);
Expand All @@ -143,9 +147,7 @@ private function resolveNamespacedName(PhpParserNode $phpParserNode, string $nam
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) {
Expand Down
6 changes: 2 additions & 4 deletions packages/PostRector/Collector/UseNodesToAddCollector.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@
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;
Expand Down Expand Up @@ -64,9 +63,8 @@ public function getUseImportTypesByNode(File $file, Node $node): array
$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);
Expand Down
4 changes: 1 addition & 3 deletions packages/StaticTypeMapper/Naming/NameScopeFactory.php
Original file line number Diff line number Diff line change
Expand Up @@ -90,9 +90,7 @@ private function resolveUseNamesByAlias(array $useNodes): array
$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()
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
<?php

namespace Rector\Tests\Renaming\Rector\Name\RenameClassRector\FixtureAutoImportNames;

use CompanyB\Foo as Storage;

class SkipRenameDocblockConflictAlias
{
/**
* @var Storage
*/
protected $storage;
}

?>
8 changes: 4 additions & 4 deletions rules/CodingStyle/NodeAnalyzer/UseImportNameMatcher.php
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
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
Expand All @@ -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
) {
}

Expand All @@ -46,9 +48,7 @@ public function matchNameWithStmts(string $tag, array $stmts): ?string
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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -114,7 +114,7 @@ private function getFullyQualifiedName(array $useNodes, ConstFetch|FuncCall $nod
$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;
Expand All @@ -134,11 +134,4 @@ private function getFullyQualifiedName(array $useNodes, ConstFetch|FuncCall $nod

return null;
}

private function resolvePrefix(Use_|GroupUse $useNode): string
{
return $useNode instanceof GroupUse
? $useNode->prefix . '\\'
: '';
}
}
5 changes: 1 addition & 4 deletions rules/Naming/Naming/AliasNameResolver.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@

use PhpParser\Node\Identifier;
use PhpParser\Node\Name;
use PhpParser\Node\Stmt\GroupUse;

final class AliasNameResolver
{
Expand All @@ -21,9 +20,7 @@ public function resolveByName(Name $name): ?string
$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) {
Expand Down
7 changes: 7 additions & 0 deletions rules/Naming/Naming/UseImportsResolver.php
Original file line number Diff line number Diff line change
Expand Up @@ -53,4 +53,11 @@ public function resolveBareUsesForNode(Node $node): array

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 . '\\'
: '';
}
}
6 changes: 2 additions & 4 deletions rules/Renaming/NodeManipulator/ClassRenamer.php
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@
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;
Expand Down Expand Up @@ -421,9 +420,8 @@ private function isValidUseImportChange(string $newName, UseUse $useUse): bool
}

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
Expand Down
4 changes: 1 addition & 3 deletions rules/TypeDeclaration/PHPStan/ObjectTypeSpecifier.php
Original file line number Diff line number Diff line change
Expand Up @@ -103,9 +103,7 @@ private function matchAliasedObjectType(Node $node, ObjectType $objectType, arra
$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;
Expand Down
5 changes: 2 additions & 3 deletions scoper.php
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -14,8 +15,6 @@
$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(
Expand Down Expand Up @@ -70,7 +69,7 @@
'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
Expand Down

0 comments on commit 1a84313

Please sign in to comment.