Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
<?php

namespace Rector\Tests\CodingStyle\Rector\Use_\SeparateMultiUseImportsRector\Fixture;

use Rector\Tests\CodingStyle\Rector\Use_\SeparateMultiUseImportsRector\Source\FirstTrait;
use Rector\Tests\CodingStyle\Rector\Use_\SeparateMultiUseImportsRector\Source\SecondTrait;
use Rector\Tests\CodingStyle\Rector\Use_\SeparateMultiUseImportsRector\Source\ThirdTrait;

class SkipTraitUseAdaptationOfOtherStatement
{
use FirstTrait;
use SecondTrait, ThirdTrait {
FirstTrait::exec insteadof SecondTrait;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
<?php

namespace Rector\Tests\CodingStyle\Rector\Use_\SeparateMultiUseImportsRector\Fixture;

use Rector\Tests\CodingStyle\Rector\Use_\SeparateMultiUseImportsRector\Source\FirstTrait;
use Rector\Tests\CodingStyle\Rector\Use_\SeparateMultiUseImportsRector\Source\ThirdTrait;

class SkipUnqualifiedTraitUseAdaptation
{
use FirstTrait, ThirdTrait {
other as renamedOther;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
<?php

namespace Rector\Tests\CodingStyle\Rector\Use_\SeparateMultiUseImportsRector\Fixture;

use Rector\Tests\CodingStyle\Rector\Use_\SeparateMultiUseImportsRector\Source\FirstTrait;
use Rector\Tests\CodingStyle\Rector\Use_\SeparateMultiUseImportsRector\Source\SecondTrait;

class WithTraitUsePrecedence
{
use FirstTrait, SecondTrait {
FirstTrait::exec insteadof SecondTrait;
}
}

?>
-----
<?php

namespace Rector\Tests\CodingStyle\Rector\Use_\SeparateMultiUseImportsRector\Fixture;

use Rector\Tests\CodingStyle\Rector\Use_\SeparateMultiUseImportsRector\Source\FirstTrait;
use Rector\Tests\CodingStyle\Rector\Use_\SeparateMultiUseImportsRector\Source\SecondTrait;

class WithTraitUsePrecedence
{
use FirstTrait {
FirstTrait::exec insteadof SecondTrait;
}
use SecondTrait;
}

?>
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
<?php

declare(strict_types=1);

namespace Rector\Tests\CodingStyle\Rector\Use_\SeparateMultiUseImportsRector\Source;

trait ThirdTrait
{
public function other(): string
{
return 'baz';
}
}
22 changes: 19 additions & 3 deletions rules/CodingStyle/Rector/Use_/SeparateMultiUseImportsRector.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@
use PhpParser\Node\Stmt\Class_;
use PhpParser\Node\Stmt\Namespace_;
use PhpParser\Node\Stmt\TraitUse;
use PhpParser\Node\Stmt\TraitUseAdaptation\Alias;
use PhpParser\Node\Stmt\Use_;
use Rector\PhpParser\Node\FileNode;
use Rector\Rector\AbstractRector;
Expand Down Expand Up @@ -127,13 +126,30 @@ private function refactorTraitUse(TraitUse $traitUse): ?array
return null;
}

$traitNames = array_map(
static fn (Name $trait): string => $trait->toString(),
$traitUse->traits
);

foreach ($traitUse->adaptations as $traitAdaptation) {
// an adaptation that names no trait applies to all of them, and one that
// names a trait used elsewhere belongs to no statement here; either way it
// cannot follow a single trait, so the statement is left alone
if (! $traitAdaptation->trait instanceof Name) {
return null;
}

if (! in_array($traitAdaptation->trait->toString(), $traitNames, true)) {
return null;
}
}

$traitUses = [];
foreach ($traitUse->traits as $singleTraitUse) {
$adaptation = [];

foreach ($traitUse->adaptations as $traitAdaptation) {
if ($traitAdaptation instanceof Alias
&& $traitAdaptation->trait instanceof Name
if ($traitAdaptation->trait instanceof Name
&& $traitAdaptation->trait->toString() === $singleTraitUse->toString()) {
$adaptation[] = $traitAdaptation;
}
Expand Down
Loading