Skip to content

Commit

Permalink
[PostRector] Allow unused alias removal from Use_ on UnusedImportRemo…
Browse files Browse the repository at this point in the history
…vingPostRector (#3477)

* [PostRector] Allow unused alias removal from Use_ on UnusedImportRemovingPostRector

* uniquate name

* check prefixed

* clean up

* clean up

* clean up

* Fix phpstan

* fix

* aliased part

* aliased part

* Final touch: array_unique() in final merge

* final touch: add fixture aliased part on docblock
  • Loading branch information
samsonasik committed Mar 13, 2023
1 parent 1138101 commit c240c69
Show file tree
Hide file tree
Showing 9 changed files with 289 additions and 8 deletions.
41 changes: 33 additions & 8 deletions packages/PostRector/Rector/UnusedImportRemovingPostRector.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,12 @@

use Nette\Utils\Strings;
use PhpParser\Node;
use PhpParser\Node\Identifier;
use PhpParser\Node\Name;
use PhpParser\Node\Name\FullyQualified;
use PhpParser\Node\Stmt\Namespace_;
use PhpParser\Node\Stmt\Use_;
use PhpParser\Node\Stmt\UseUse;
use PhpParser\NodeTraverser;
use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory;
use Rector\Core\Configuration\RectorConfigProvider;
Expand Down Expand Up @@ -55,13 +57,8 @@ public function enterNode(Node $node): ?Node
}

$useUse = $namespaceStmt->uses[0];
// skip aliased imports, harder to check
if ($useUse->alias !== null) {
continue;
}

$comparedName = $useUse->name->toString();
if ($this->isUseImportUsed($comparedName, $names)) {
if ($this->isUseImportUsed($useUse, $names)) {
continue;
}

Expand Down Expand Up @@ -175,14 +172,23 @@ private function resolveUsedPhpAndDocNames(Namespace_|FileWithoutNamespace $name
$phpNames = $this->findNonUseImportNames($namespace);
$docBlockNames = $this->findNamesInDocBlocks($namespace);

return array_merge($phpNames, $docBlockNames);
$names = array_merge($phpNames, $docBlockNames);
return array_unique($names);
}

private function resolveAliasName(UseUse $useUse): ?string
{
return $useUse->alias instanceof Identifier
? $useUse->alias->toString()
: null;
}

/**
* @param string[] $names
*/
private function isUseImportUsed(string $comparedName, array $names): bool
private function isUseImportUsed(UseUse $useUse, array $names): bool
{
$comparedName = $useUse->name->toString();
if (in_array($comparedName, $names, true)) {
return true;
}
Expand All @@ -193,6 +199,8 @@ private function isUseImportUsed(string $comparedName, array $names): bool
$namespacedPrefix = $comparedName . '\\';
}

$alias = $this->resolveAliasName($useUse);

// match partial import
foreach ($names as $name) {
if (str_ends_with($comparedName, $name)) {
Expand All @@ -202,6 +210,23 @@ private function isUseImportUsed(string $comparedName, array $names): bool
if (str_starts_with($name, $namespacedPrefix)) {
return true;
}

if (! is_string($alias)) {
continue;
}

if ($alias === $name) {
return true;
}

if (! str_contains($name, '\\')) {
continue;
}

$namePrefix = Strings::before($name, '\\', 1);
if ($alias === $namePrefix) {
return true;
}
}

return false;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
<?php

namespace Rector\Core\Tests\Issues\NamespacedUse\Fixture;

use PhpParser\Node\Scalar\String_ as Foo;
use PhpParser\Node\Stmt\Expression as Bar;

class NamespacedClassAliased
{
public function run(): Foo
{
return new Foo('test');
}
}

?>
-----
<?php

namespace Rector\Core\Tests\Issues\NamespacedUse\Fixture;

use PhpParser\Node\Scalar\String_ as Foo;

class NamespacedClassAliased
{
public function run(): Foo
{
return new Foo('test');
}
}

?>
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
<?php

namespace Rector\Core\Tests\Issues\NamespacedUse\Fixture;

use PhpParser\Node\Scalar\String_ as Foo;
use PhpParser\Node\Stmt\Expression as Bar;

class NamespacedClassAliasedDocblock
{
/**
* @param Foo $param
*/
public function run($param)
{
}
}

?>
-----
<?php

namespace Rector\Core\Tests\Issues\NamespacedUse\Fixture;

use PhpParser\Node\Scalar\String_ as Foo;

class NamespacedClassAliasedDocblock
{
/**
* @param Foo $param
*/
public function run($param)
{
}
}

?>
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
<?php

namespace Rector\Core\Tests\Issues\NamespacedUse\Fixture;

use PhpParser\Node\Scalar as Foo;
use PhpParser\Node\Stmt\Expression as Bar;

class NamespacedClassAliasedPart
{
public function run2(): Foo\String_
{
return new Foo\String_('test');
}
}

?>
-----
<?php

namespace Rector\Core\Tests\Issues\NamespacedUse\Fixture;

use PhpParser\Node\Scalar as Foo;

class NamespacedClassAliasedPart
{
public function run2(): Foo\String_
{
return new Foo\String_('test');
}
}

?>
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
<?php

namespace Rector\Core\Tests\Issues\NamespacedUse\Fixture;

use PhpParser\Node\Scalar as Foo;
use PhpParser\Node\Stmt\Expression as Bar;

class NamespacedClassAliasedPartDocblock
{
/**
* @param Foo\String_ $param
*/
public function run2($param)
{
}
}

?>
-----
<?php

namespace Rector\Core\Tests\Issues\NamespacedUse\Fixture;

use PhpParser\Node\Scalar as Foo;

class NamespacedClassAliasedPartDocblock
{
/**
* @param Foo\String_ $param
*/
public function run2($param)
{
}
}

?>
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
<?php

use PhpParser\Node\Scalar\String_ as Foo;
use PhpParser\Node\Stmt\Expression as Bar;

class NoNamespacedClassAliased
{
public function run(): Foo
{
return new Foo('test');
}
}

?>
-----
<?php

use PhpParser\Node\Scalar\String_ as Foo;

class NoNamespacedClassAliased
{
public function run(): Foo
{
return new Foo('test');
}
}

?>
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
<?php

use PhpParser\Node\Scalar\String_ as Foo;
use PhpParser\Node\Stmt\Expression as Bar;

class NoNamespacedClassAliasedDocblock
{
/**
* @param Foo $param
*/
public function run($param)
{
}
}

?>
-----
<?php

use PhpParser\Node\Scalar\String_ as Foo;

class NoNamespacedClassAliasedDocblock
{
/**
* @param Foo $param
*/
public function run($param)
{
}
}

?>
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
<?php

use PhpParser\Node\Scalar as Foo;
use PhpParser\Node\Stmt\Expression as Bar;

class NoNamespacedClassAliasedPart
{
public function run2(): Foo\String_
{
return new Foo\String_('test');
}
}

?>
-----
<?php

use PhpParser\Node\Scalar as Foo;

class NoNamespacedClassAliasedPart
{
public function run2(): Foo\String_
{
return new Foo\String_('test');
}
}

?>
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
<?php

use PhpParser\Node\Scalar as Foo;
use PhpParser\Node\Stmt\Expression as Bar;

class NoNamespacedClassAliasedPartDocblock
{
/**
* @param Foo\String_ $param
*/
public function run2($param)
{
}
}

?>
-----
<?php

use PhpParser\Node\Scalar as Foo;

class NoNamespacedClassAliasedPartDocblock
{
/**
* @param Foo\String_ $param
*/
public function run2($param)
{
}
}

?>

0 comments on commit c240c69

Please sign in to comment.