mirror of
https://github.com/rectorphp/rector.git
synced 2025-02-15 13:25:30 +01:00
Fix double import of grouped namespaces
This commit is contained in:
parent
4a5408e8f1
commit
d6b9122615
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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
|
||||
{
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user