Skip to content

Commit

Permalink
[Experiment][Naming] Keep GroupUse Stmt on UseImportsResolver::resolv…
Browse files Browse the repository at this point in the history
…eForNode() (#2349)

Co-authored-by: GitHub Action <action@github.com>
  • Loading branch information
samsonasik and actions-user committed May 22, 2022
1 parent f8c204a commit 3fe07aa
Show file tree
Hide file tree
Showing 10 changed files with 109 additions and 93 deletions.
31 changes: 14 additions & 17 deletions packages/BetterPhpDocParser/PhpDocParser/ClassAnnotationMatcher.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@

use PhpParser\Node;
use PhpParser\Node\Identifier;
use PhpParser\Node\Stmt\GroupUse;
use PhpParser\Node\Stmt\Use_;
use PHPStan\Analyser\Scope;
use PHPStan\Reflection\ReflectionProvider;
Expand Down Expand Up @@ -48,7 +49,7 @@ public function resolveTagFullyQualifiedName(string $tag, Node $node): string
}

/**
* @param Use_[] $uses
* @param Use_[]|GroupUse[] $uses
*/
private function resolveFullyQualifiedClass(array $uses, Node $node, string $tag): string
{
Expand All @@ -72,29 +73,25 @@ private function resolveFullyQualifiedClass(array $uses, Node $node, string $tag
}

/**
* @param Use_[] $uses
* @param Use_[]|GroupUse[] $uses
*/
private function resolveAsAliased(array $uses, string $tag): string
{
foreach ($uses as $use) {
$prefix = $use instanceof GroupUse
? $use->prefix . '\\'
: '';
$useUses = $use->uses;
// skip group uses or empty
if (count($useUses) !== 1) {
continue;
}

// uses already removed
if (! isset($useUses[0])) {
continue;
}

if (! $useUses[0]->alias instanceof Identifier) {
continue;
}
foreach ($useUses as $useUse) {
if (! $useUse->alias instanceof Identifier) {
continue;
}

$alias = $useUses[0]->alias;
if ($alias->toString() === $tag) {
return $useUses[0]->name->toString();
$alias = $useUse->alias;
if ($alias->toString() === $tag) {
return $prefix . $useUse->name->toString();
}
}
}

Expand Down
8 changes: 6 additions & 2 deletions packages/PostRector/Collector/UseNodesToAddCollector.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
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 @@ -63,11 +64,14 @@ public function getUseImportTypesByNode(File $file, Node $node): array
$uses = $this->useImportsResolver->resolveForNode($node);

foreach ($uses as $use) {
$prefix = $use instanceof GroupUse
? $use->prefix . '\\'
: '';
foreach ($use->uses as $useUse) {
if ($useUse->alias !== null) {
$objectTypes[] = new AliasedObjectType($useUse->alias->toString(), (string) $useUse->name);
$objectTypes[] = new AliasedObjectType($useUse->alias->toString(), $prefix . $useUse->name);
} else {
$objectTypes[] = new FullyQualifiedObjectType((string) $useUse->name);
$objectTypes[] = new FullyQualifiedObjectType($prefix . $useUse->name);
}
}
}
Expand Down
8 changes: 6 additions & 2 deletions packages/StaticTypeMapper/Naming/NameScopeFactory.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@

use PhpParser\Node;
use PhpParser\Node\Stmt\ClassLike;
use PhpParser\Node\Stmt\GroupUse;
use PhpParser\Node\Stmt\Use_;
use PhpParser\Node\Stmt\UseUse;
use PHPStan\Analyser\NameScope;
Expand Down Expand Up @@ -81,14 +82,17 @@ public function createNameScopeFromNode(Node $node): NameScope
}

/**
* @param Use_[] $useNodes
* @param Use_[]|GroupUse[] $useNodes
* @return array<string, string>
*/
private function resolveUseNamesByAlias(array $useNodes): array
{
$useNamesByAlias = [];

foreach ($useNodes as $useNode) {
$prefix = $useNode instanceof GroupUse
? $useNode->prefix . '\\'
: '';
foreach ($useNode->uses as $useUse) {
/** @var UseUse $useUse */
$aliasName = $useUse->getAlias()
Expand All @@ -97,7 +101,7 @@ private function resolveUseNamesByAlias(array $useNodes): array
// uses must be lowercase, as PHPStan lowercases it
$lowercasedAliasName = strtolower($aliasName);

$useNamesByAlias[$lowercasedAliasName] = $useUse->name->toString();
$useNamesByAlias[$lowercasedAliasName] = $prefix . $useUse->name->toString();
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@

use Iterator;
use PhpParser\Node\Stmt\Property;
use PhpParser\Node\Stmt\Use_;
use Rector\Core\PhpParser\Node\BetterNodeFinder;
use Rector\Naming\Naming\UseImportsResolver;
use Rector\Testing\PHPUnit\AbstractTestCase;
Expand Down Expand Up @@ -45,7 +46,9 @@ public function testUsesFromProperty(SmartFileInfo $file): void

foreach ($resolvedUses as $resolvedUse) {
foreach ($resolvedUse->uses as $useUse) {
$stringUses[] = $useUse->name->tostring();
$stringUses[] = $resolvedUse instanceof Use_
? $useUse->name->tostring()
: $resolvedUse->prefix->toString() . '\\' . $useUse->name->toString();
}
}

Expand Down
16 changes: 10 additions & 6 deletions rules/CodingStyle/NodeAnalyzer/UseImportNameMatcher.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@

use Nette\Utils\Strings;
use PhpParser\Node\Stmt;
use PhpParser\Node\Stmt\GroupUse;
use PhpParser\Node\Stmt\Use_;
use PhpParser\Node\Stmt\UseUse;
use Rector\Core\PhpParser\Node\BetterNodeFinder;
Expand Down Expand Up @@ -37,35 +38,38 @@ public function matchNameWithStmts(string $tag, array $stmts): ?string
}

/**
* @param Use_[] $uses
* @param Use_[]|GroupUse[] $uses
*/
public function matchNameWithUses(string $tag, array $uses): ?string
{
foreach ($uses as $use) {
$prefix = $use instanceof GroupUse
? $use->prefix . '\\'
: '';
foreach ($use->uses as $useUse) {
if (! $this->isUseMatchingName($tag, $useUse)) {
continue;
}

return $this->resolveName($tag, $useUse);
return $this->resolveName($prefix, $tag, $useUse);
}
}

return null;
}

public function resolveName(string $tag, UseUse $useUse): string
public function resolveName(string $prefix, string $tag, UseUse $useUse): string
{
if ($useUse->alias === null) {
return $useUse->name->toString();
return $prefix . $useUse->name->toString();
}

$unaliasedShortClass = Strings::substring($tag, Strings::length($useUse->alias->toString()));
if (\str_starts_with($unaliasedShortClass, '\\')) {
return $useUse->name . $unaliasedShortClass;
return $prefix . $useUse->name . $unaliasedShortClass;
}

return $useUse->name . '\\' . $unaliasedShortClass;
return $prefix . $useUse->name . '\\' . $unaliasedShortClass;
}

private function isUseMatchingName(string $tag, UseUse $useUse): bool
Expand Down
18 changes: 14 additions & 4 deletions rules/DowngradePhp56/Rector/Use_/DowngradeUseFunctionRector.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
use PhpParser\Node\Expr\FuncCall;
use PhpParser\Node\Name;
use PhpParser\Node\Name\FullyQualified;
use PhpParser\Node\Stmt\GroupUse;
use PhpParser\Node\Stmt\Use_;
use Rector\Core\Rector\AbstractRector;
use Rector\Naming\Naming\UseImportsResolver;
Expand Down Expand Up @@ -101,7 +102,7 @@ private function isAlreadyFullyQualified(ConstFetch|FuncCall $node): bool
}

/**
* @param Use_[] $useNodes
* @param Use_[]|GroupUse[] $useNodes
*/
private function getFullyQualifiedName(array $useNodes, ConstFetch|FuncCall $node): ?string
{
Expand All @@ -113,22 +114,31 @@ 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);

if ($useNode->type !== $typeFilter) {
continue;
}

foreach ($useNode->uses as $useUse) {
if ($name === $useUse->name->toLowerString()) {
return $useUse->name->toString();
if ($name === $prefix . $useUse->name->toLowerString()) {
return $prefix . $useUse->name->toString();
}

$alias = $useUse->getAlias();
if ($name === $alias->toLowerString()) {
return $useUse->name->toString();
return $prefix . $useUse->name->toString();
}
}
}

return null;
}

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

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

final class AliasNameResolver
{
public function __construct(
private readonly NodeNameResolver $nodeNameResolver,
private readonly UseImportsResolver $useImportsResolver,
) {
}
Expand All @@ -22,25 +21,22 @@ public function resolveByName(Name $name): ?string
$nameString = $name->toString();

foreach ($uses as $use) {
$prefix = $use instanceof GroupUse
? $use->prefix . '\\'
: '';
$useUses = $use->uses;
if (count($useUses) > 1) {
continue;
}
foreach ($useUses as $useUse) {
if (! $useUse->alias instanceof Identifier) {
continue;
}

if (! isset($useUses[0])) {
continue;
}
$name = $prefix . $useUse->name->toString();
if ($name !== $nameString) {
continue;
}

$useUse = $useUses[0];
if (! $useUse->alias instanceof Identifier) {
continue;
return (string) $useUse->getAlias();
}

if (! $this->nodeNameResolver->isName($useUse->name, $nameString)) {
continue;
}

return (string) $useUse->getAlias();
}

return null;
Expand Down
33 changes: 6 additions & 27 deletions rules/Naming/Naming/UseImportsResolver.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,10 @@
namespace Rector\Naming\Naming;

use PhpParser\Node;
use PhpParser\Node\Name;
use PhpParser\Node\Stmt;
use PhpParser\Node\Stmt\GroupUse;
use PhpParser\Node\Stmt\Namespace_;
use PhpParser\Node\Stmt\Use_;
use PhpParser\Node\Stmt\UseUse;
use Rector\Core\PhpParser\Node\BetterNodeFinder;
use Rector\Core\PhpParser\Node\CustomNode\FileWithoutNamespace;

Expand All @@ -21,7 +20,7 @@ public function __construct(
}

/**
* @return Use_[]
* @return Use_[]|GroupUse[]
*/
public function resolveForNode(Node $node): array
{
Expand All @@ -33,29 +32,9 @@ public function resolveForNode(Node $node): array
return [];
}

$collectedUses = [];

foreach ($namespace->stmts as $stmt) {
if ($stmt instanceof Use_) {
$collectedUses[] = $stmt;
continue;
}

if ($stmt instanceof GroupUse) {
$groupUseUses = [];
foreach ($stmt->uses as $useUse) {
$groupUseUses[] = new UseUse(
new Name($stmt->prefix . '\\' . $useUse->name),
$useUse->alias,
$useUse->type,
$useUse->getAttributes()
);
}

$collectedUses[] = new Use_($groupUseUses, $stmt->type, $stmt->getAttributes());
}
}

return $collectedUses;
return array_filter(
$namespace->stmts,
fn (Stmt $stmt): bool => $stmt instanceof Use_ || $stmt instanceof GroupUse
);
}
}
12 changes: 9 additions & 3 deletions rules/Renaming/NodeManipulator/ClassRenamer.php
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
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 @@ -420,9 +421,14 @@ private function isValidUseImportChange(string $newName, UseUse $useUse): bool
}

foreach ($uses as $use) {
if ($this->nodeNameResolver->isName($use, $newName)) {
// name already exists
return false;
$prefix = $use instanceof GroupUse
? $use->prefix . '\\'
: '';
foreach ($use->uses as $useUse) {
if ($prefix . $useUse->name->toString() === $newName) {
// name already exists
return false;
}
}
}

Expand Down

0 comments on commit 3fe07aa

Please sign in to comment.