Skip to content

Commit

Permalink
[Naming] Handle Grouped use import on UseImportsResolver (#2348)
Browse files Browse the repository at this point in the history
Co-authored-by: Dominik Ritter <dritter03@googlemail.com>
Co-authored-by: GitHub Action <action@github.com>
  • Loading branch information
3 people committed May 22, 2022
1 parent a9c6d9b commit f8c204a
Show file tree
Hide file tree
Showing 7 changed files with 142 additions and 2 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
<?php

namespace Rector\Tests\Naming\Naming\UseImportsResolver\Fixture;

use Rector\Tests\Naming\Naming\UseImportsResolver\Source\OtherClass;
use Rector\Tests\Naming\Naming\UseImportsResolver\Source\{FirstClass, SecondClass};

class MyGroupUse1
{
private FirstClass $firstClass;
private SecondClass $secondClass;
private OtherClass $otherClass;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
<?php

namespace Rector\Tests\Naming\Naming\UseImportsResolver\Fixture;

# Valid import for reference
use Rector\Tests\Naming\Naming\UseImportsResolver\Source\OtherClass;
use Rector\Tests\Naming\Naming\UseImportsResolver\Source\{FirstClass as ClassA, SecondClass as ClassB};

class MyGroupUse2
{
private ClassA $firstClass;
private ClassB $secondClass;
private OtherClass $otherClass;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
<?php

namespace Rector\Tests\Naming\Naming\UseImportsResolver\Source;

class FirstClass
{

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
<?php

namespace Rector\Tests\Naming\Naming\UseImportsResolver\Source;

class OtherClass
{

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
<?php

namespace Rector\Tests\Naming\Naming\UseImportsResolver\Source;

class SecondClass
{

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
<?php

declare(strict_types=1);

namespace Rector\Tests\Naming\Naming\UseImportsResolver;

use Iterator;
use PhpParser\Node\Stmt\Property;
use Rector\Core\PhpParser\Node\BetterNodeFinder;
use Rector\Naming\Naming\UseImportsResolver;
use Rector\Testing\PHPUnit\AbstractTestCase;
use Rector\Testing\TestingParser\TestingParser;
use Rector\Tests\Naming\Naming\UseImportsResolver\Source\FirstClass;
use Rector\Tests\Naming\Naming\UseImportsResolver\Source\SecondClass;
use Symplify\EasyTesting\DataProvider\StaticFixtureFinder;
use Symplify\SmartFileSystem\SmartFileInfo;

final class UseImportsResolverTest extends AbstractTestCase
{
private UseImportsResolver $useImportsResolver;

private TestingParser $testingParser;

private BetterNodeFinder $nodeFinder;

protected function setUp(): void
{
$this->boot();
$this->useImportsResolver = $this->getService(UseImportsResolver::class);
$this->testingParser = $this->getService(TestingParser::class);
$this->nodeFinder = $this->getService(BetterNodeFinder::class);
}

/**
* @dataProvider provideData()
*/
public function testUsesFromProperty(SmartFileInfo $file): void
{
$nodes = $this->testingParser->parseFileToDecoratedNodes($file->getRelativeFilePath());

$firstProperty = $this->nodeFinder->findFirstInstanceOf($nodes, Property::class);
$resolvedUses = $this->useImportsResolver->resolveForNode($firstProperty);

$stringUses = [];

foreach ($resolvedUses as $resolvedUse) {
foreach ($resolvedUse->uses as $useUse) {
$stringUses[] = $useUse->name->tostring();
}
}

$this->assertContains(FirstClass::class, $stringUses);
$this->assertContains(SecondClass::class, $stringUses);
}

/**
* @return Iterator<SmartFileInfo>
*/
public function provideData(): Iterator
{
$directory = __DIR__ . '/Fixture';
return StaticFixtureFinder::yieldDirectoryExclusively($directory);
}
}
29 changes: 27 additions & 2 deletions rules/Naming/Naming/UseImportsResolver.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,11 @@
namespace Rector\Naming\Naming;

use PhpParser\Node;
use PhpParser\Node\Stmt;
use PhpParser\Node\Name;
use PhpParser\Node\Stmt\GroupUse;
use PhpParser\Node\Stmt\Namespace_;
use PhpParser\Node\Stmt\Use_;
use PhpParser\Node\Stmt\UseUse;
use Rector\Core\PhpParser\Node\BetterNodeFinder;
use Rector\Core\PhpParser\Node\CustomNode\FileWithoutNamespace;

Expand All @@ -31,6 +33,29 @@ public function resolveForNode(Node $node): array
return [];
}

return array_filter($namespace->stmts, fn (Stmt $stmt): bool => $stmt instanceof Use_);
$collectedUses = [];

foreach ($namespace->stmts as $stmt) {
if ($stmt instanceof Use_) {
$collectedUses[] = $stmt;
continue;
}

if ($stmt instanceof GroupUse) {
$groupUseUses = [];
foreach ($stmt->uses as $useUse) {
$groupUseUses[] = new UseUse(
new Name($stmt->prefix . '\\' . $useUse->name),
$useUse->alias,
$useUse->type,
$useUse->getAttributes()
);
}

$collectedUses[] = new Use_($groupUseUses, $stmt->type, $stmt->getAttributes());
}
}

return $collectedUses;
}
}

0 comments on commit f8c204a

Please sign in to comment.