From d6b9122615bc01e497d842c20a4c821269c7b5cd Mon Sep 17 00:00:00 2001 From: TomasVotruba Date: Thu, 26 Dec 2019 10:53:02 +0100 Subject: [PATCH] Fix double import of grouped namespaces --- .../src/Imports/UseImportsTraverser.php | 61 +++++++++++++++---- .../src/Imports/UsedImportsResolver.php | 5 +- .../Fixture/skip_grouped.php.inc | 14 +++++ 3 files changed, 66 insertions(+), 14 deletions(-) create mode 100644 packages/CodingStyle/tests/Rector/Namespace_/ImportFullyQualifiedNamesRector/Fixture/skip_grouped.php.inc diff --git a/packages/CodingStyle/src/Imports/UseImportsTraverser.php b/packages/CodingStyle/src/Imports/UseImportsTraverser.php index e1789bfbf59..e6b71e14d30 100644 --- a/packages/CodingStyle/src/Imports/UseImportsTraverser.php +++ b/packages/CodingStyle/src/Imports/UseImportsTraverser.php @@ -6,6 +6,7 @@ namespace Rector\CodingStyle\Imports; use PhpParser\Node; use PhpParser\Node\Stmt; +use PhpParser\Node\Stmt\GroupUse; use PhpParser\Node\Stmt\Use_; use Rector\PhpParser\Node\Resolver\NameResolver; use Rector\PhpParser\NodeTraverser\CallableNodeTraverser; @@ -31,22 +32,60 @@ final class UseImportsTraverser /** * @param Stmt[] $stmts */ - public function traverserStmts(array $stmts, callable $callable, int $type = Use_::TYPE_NORMAL): void + public function traverserStmtsForFunctions(array $stmts, callable $callable): void { - $this->callableNodeTraverser->traverseNodesWithCallable($stmts, function (Node $node) use ($callable, $type) { - if (! $node instanceof Use_) { - return null; + $this->traverseForType($stmts, $callable, Use_::TYPE_FUNCTION); + } + + /** + * @param Stmt[] $stmts + */ + public function traverserStmts(array $stmts, callable $callable): void + { + $this->traverseForType($stmts, $callable, Use_::TYPE_NORMAL); + } + + private function traverseForType(array $stmts, callable $callable, int $desiredType): void + { + $this->callableNodeTraverser->traverseNodesWithCallable($stmts, function (Node $node) use ( + $callable, + $desiredType + ) { + if ($node instanceof Use_) { + // only import uses + if ($node->type !== $desiredType) { + return null; + } + + foreach ($node->uses as $useUse) { + $name = $this->nameResolver->getName($useUse); + $callable($useUse, $name); + } } - // only import uses - if ($node->type !== $type) { - return null; + if ($node instanceof GroupUse) { + $this->processGroupUse($node, $desiredType, $callable); } - foreach ($node->uses as $useUse) { - $name = $this->nameResolver->getName($useUse); - $callable($useUse, $name); - } + return null; }); } + + private function processGroupUse(GroupUse $groupUse, int $desiredType, callable $callable): void + { + if ($groupUse->type !== Use_::TYPE_UNKNOWN) { + return; + } + + $prefixName = $groupUse->prefix->toString(); + + foreach ($groupUse->uses as $useUse) { + if ($groupUse->type !== Use_::TYPE_UNKNOWN) { + continue; + } + + $name = $prefixName . '\\' . $this->nameResolver->getName($useUse); + $callable($useUse, $name); + } + } } diff --git a/packages/CodingStyle/src/Imports/UsedImportsResolver.php b/packages/CodingStyle/src/Imports/UsedImportsResolver.php index f13a6f4b3c1..c060d84655b 100644 --- a/packages/CodingStyle/src/Imports/UsedImportsResolver.php +++ b/packages/CodingStyle/src/Imports/UsedImportsResolver.php @@ -8,7 +8,6 @@ use PhpParser\Node; use PhpParser\Node\Stmt; use PhpParser\Node\Stmt\Class_; use PhpParser\Node\Stmt\Namespace_; -use PhpParser\Node\Stmt\Use_; use PhpParser\Node\Stmt\UseUse; use Rector\NodeTypeResolver\Node\AttributeKey; use Rector\PhpParser\Node\BetterNodeFinder; @@ -92,12 +91,12 @@ final class UsedImportsResolver { $usedFunctionImports = []; - $this->useImportsTraverser->traverserStmts($stmts, function ( + $this->useImportsTraverser->traverserStmtsForFunctions($stmts, function ( UseUse $useUse, string $name ) use (&$usedFunctionImports): void { $usedFunctionImports[] = new FullyQualifiedObjectType($name); - }, Use_::TYPE_FUNCTION); + }); return $usedFunctionImports; } diff --git a/packages/CodingStyle/tests/Rector/Namespace_/ImportFullyQualifiedNamesRector/Fixture/skip_grouped.php.inc b/packages/CodingStyle/tests/Rector/Namespace_/ImportFullyQualifiedNamesRector/Fixture/skip_grouped.php.inc new file mode 100644 index 00000000000..2b47b4a0962 --- /dev/null +++ b/packages/CodingStyle/tests/Rector/Namespace_/ImportFullyQualifiedNamesRector/Fixture/skip_grouped.php.inc @@ -0,0 +1,14 @@ +