Fix double import of grouped namespaces

This commit is contained in:
TomasVotruba 2019-12-26 10:53:02 +01:00
parent 4a5408e8f1
commit d6b9122615
3 changed files with 66 additions and 14 deletions

View File

@ -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);
}
}
}

View File

@ -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;
}

View File

@ -0,0 +1,14 @@
<?php
namespace Rector\CodingStyle\Tests\Rector\Namespace_\ImportFullyQualifiedNamesRector\Fixture;
use \Rector\CodingStyle\Tests\Rector\Namespace_\ImportFullyQualifiedNamesRector\Source\Stock\Querying\{
Query
};
class SkipGrouped
{
public function run(): Query
{
}
}