From f429e2811c97689001f45c420d1d674322d00822 Mon Sep 17 00:00:00 2001 From: Tomas Votruba Date: Mon, 29 May 2023 08:28:14 +0200 Subject: [PATCH] Remove use imports directly (#4008) --- packages/NodeRemoval/NodeRemover.php | 3 +++ .../Rector/ClassRenamingPostRector.php | 2 +- phpstan.neon | 1 + .../Application/UseImportsRemover.php | 26 +++++++++---------- .../Fixture/fixture.php | 17 ++++++++++++ 5 files changed, 35 insertions(+), 14 deletions(-) create mode 100644 tests/Issues/InlineTypedFromConstructorDefaultValue/Fixture/fixture.php diff --git a/packages/NodeRemoval/NodeRemover.php b/packages/NodeRemoval/NodeRemover.php index 4cc9da60d73..afa290b87fc 100644 --- a/packages/NodeRemoval/NodeRemover.php +++ b/packages/NodeRemoval/NodeRemover.php @@ -26,6 +26,9 @@ public function __construct( ) { } + /** + * @deprecated Return NodeTraverser::* to remove node directly instead + */ public function removeNode(Node $node): void { // this make sure to keep just added nodes, e.g. added class constant, that doesn't have analysis of full code in this run diff --git a/packages/PostRector/Rector/ClassRenamingPostRector.php b/packages/PostRector/Rector/ClassRenamingPostRector.php index a04c2b4c507..7b30af5af56 100644 --- a/packages/PostRector/Rector/ClassRenamingPostRector.php +++ b/packages/PostRector/Rector/ClassRenamingPostRector.php @@ -89,7 +89,7 @@ public function enterNode(Node $node): ?Node } $removedUses = $this->renamedClassesDataCollector->getOldClasses(); - $this->useImportsRemover->removeImportsFromStmts($this->rootNode->stmts, $removedUses); + $this->rootNode->stmts = $this->useImportsRemover->removeImportsFromStmts($this->rootNode->stmts, $removedUses); return $result; } diff --git a/phpstan.neon b/phpstan.neon index 0681fe09db1..5b41d224b8c 100644 --- a/phpstan.neon +++ b/phpstan.neon @@ -755,3 +755,4 @@ parameters: - '#Parameter \$nodesToAddCollector of (.*?) has typehint with deprecated class Rector\\PostRector\\Collector\\NodesToAddCollector#' - '#Call to deprecated method addNodeToRemove\(\) of class Rector\\PostRector\\Collector\\NodesToRemoveCollector\:#' + - '#Call to deprecated method removeNode\(\) of class Rector\\NodeRemoval\\NodeRemover#' diff --git a/rules/CodingStyle/Application/UseImportsRemover.php b/rules/CodingStyle/Application/UseImportsRemover.php index f04aa5bc8de..3610d8003c8 100644 --- a/rules/CodingStyle/Application/UseImportsRemover.php +++ b/rules/CodingStyle/Application/UseImportsRemover.php @@ -6,34 +6,36 @@ use PhpParser\Node\Stmt; use PhpParser\Node\Stmt\Use_; -use Rector\NodeRemoval\NodeRemover; final class UseImportsRemover { - public function __construct( - private readonly NodeRemover $nodeRemover - ) { - } - /** * @param Stmt[] $stmts * @param string[] $removedUses + * @return Stmt[] */ - public function removeImportsFromStmts(array $stmts, array $removedUses): void + public function removeImportsFromStmts(array $stmts, array $removedUses): array { - foreach ($stmts as $stmt) { + foreach ($stmts as $key => $stmt) { if (! $stmt instanceof Use_) { continue; } - $this->removeUseFromUse($removedUses, $stmt); + $stmt = $this->removeUseFromUse($removedUses, $stmt); + + // remove empty uses + if ($stmt->uses === []) { + unset($stmts[$key]); + } } + + return $stmts; } /** * @param string[] $removedUses */ - private function removeUseFromUse(array $removedUses, Use_ $use): void + private function removeUseFromUse(array $removedUses, Use_ $use): Use_ { foreach ($use->uses as $usesKey => $useUse) { foreach ($removedUses as $removedUse) { @@ -43,8 +45,6 @@ private function removeUseFromUse(array $removedUses, Use_ $use): void } } - if ($use->uses === []) { - $this->nodeRemover->removeNode($use); - } + return $use; } } diff --git a/tests/Issues/InlineTypedFromConstructorDefaultValue/Fixture/fixture.php b/tests/Issues/InlineTypedFromConstructorDefaultValue/Fixture/fixture.php new file mode 100644 index 00000000000..195dbe7b951 --- /dev/null +++ b/tests/Issues/InlineTypedFromConstructorDefaultValue/Fixture/fixture.php @@ -0,0 +1,17 @@ +url = 'https://website.tld'; + } +} + +?>