Skip to content

Commit

Permalink
[Performance][AutoImport] Reduce double loop on NameImportingPostRect…
Browse files Browse the repository at this point in the history
…or (#5105)

* [Performance][AutoImport] Reduce double loop on NameImportingPostRector

* clean up
  • Loading branch information
samsonasik committed Oct 2, 2023
1 parent c9e0823 commit 478b257
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 39 deletions.
44 changes: 6 additions & 38 deletions packages/PostRector/Rector/NameImportingPostRector.php
Original file line number Diff line number Diff line change
Expand Up @@ -107,10 +107,6 @@ private function processNodeName(Name $name, File $file): ?Node
if ($this->classNameImportSkipper->shouldImportName($name, $currentUses)) {
$nameInUse = $this->resolveNameInUse($name, $currentUses);

if ($nameInUse instanceof FullyQualified) {
return null;
}

if ($nameInUse instanceof Name) {
return $nameInUse;
}
Expand All @@ -124,7 +120,7 @@ private function processNodeName(Name $name, File $file): ?Node
/**
* @param Use_[]|GroupUse[] $currentUses
*/
private function resolveNameInUse(Name $name, array $currentUses): null|Name|FullyQualified
private function resolveNameInUse(Name $name, array $currentUses): null|Name
{
$originalName = $name->getAttribute(AttributeKey::ORIGINAL_NAME);

Expand All @@ -137,20 +133,18 @@ private function resolveNameInUse(Name $name, array $currentUses): null|Name|Ful
return new Name($aliasName);
}

$isShortFullyQualifiedName = substr_count($name->toCodeString(), '\\') === 1;

if (! $isShortFullyQualifiedName) {
return $this->resolveLongNameInUseName($name, $currentUses);
}

return $this->resolveConflictedShortNameInUse($name, $currentUses);
return $this->resolveLongNameInUseName($name, $currentUses);
}

/**
* @param Use_[]|GroupUse[] $currentUses
*/
private function resolveLongNameInUseName(Name $name, array $currentUses): ?Name
{
if (substr_count($name->toCodeString(), '\\') === 1) {
return null;
}

$lastName = $name->getLast();
foreach ($currentUses as $currentUse) {
foreach ($currentUse->uses as $useUse) {
Expand All @@ -166,30 +160,4 @@ private function resolveLongNameInUseName(Name $name, array $currentUses): ?Name

return null;
}

/**
* @param Use_[]|GroupUse[] $currentUses
*/
private function resolveConflictedShortNameInUse(Name $name, array $currentUses): ?FullyQualified
{
$currentName = $name->toString();
foreach ($currentUses as $currentUse) {
$prefix = $this->useImportsResolver->resolvePrefix($currentUse);

foreach ($currentUse->uses as $useUse) {
$useName = $prefix . $name->toString();
$lastUseName = $name->getLast();

if (! $useUse->alias instanceof Identifier && $useName !== $currentName && $lastUseName === $currentName) {
return new FullyQualified($currentName);
}

if ($useUse->alias instanceof Identifier && $useUse->alias->toString() === $currentName) {
return new FullyQualified($currentName);
}
}
}

return null;
}
}
22 changes: 21 additions & 1 deletion rules/CodingStyle/ClassNameImport/ClassNameImportSkipper.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
namespace Rector\CodingStyle\ClassNameImport;

use PhpParser\Node;
use PhpParser\Node\Identifier;
use PhpParser\Node\Name;
use PhpParser\Node\Stmt\GroupUse;
use PhpParser\Node\Stmt\Use_;
Expand Down Expand Up @@ -51,10 +52,12 @@ public function shouldImportName(Name $name, array $uses): bool
}

$stringName = $name->toString();
$nameLastName = strtolower($name->getLast());
$lastUseName = $name->getLast();
$nameLastName = strtolower($lastUseName);

foreach ($uses as $use) {
$prefix = $this->useImportsResolver->resolvePrefix($use);
$useName = $prefix . $stringName;

foreach ($use->uses as $useUse) {
$useUseLastName = strtolower($useUse->name->getLast());
Expand All @@ -67,13 +70,30 @@ public function shouldImportName(Name $name, array $uses): bool
continue;
}

if ($this->isConflictedShortNameInUse($useUse, $useName, $lastUseName, $stringName)) {
return false;
}

return $prefix . $useUse->name->toString() === $stringName;
}
}

return true;
}

private function isConflictedShortNameInUse(
UseUse $useUse,
string $useName,
string $lastUseName,
string $stringName
): bool {
if (! $useUse->alias instanceof Identifier && $useName !== $stringName && $lastUseName === $stringName) {
return true;
}

return $useUse->alias instanceof Identifier && $useUse->alias->toString() === $stringName;
}

private function isJustRenamedClass(string $stringName, string $prefix, UseUse $useUse): bool
{
$useUseNameString = $prefix . $useUse->name->toString();
Expand Down

0 comments on commit 478b257

Please sign in to comment.