diff --git a/rules/CodingStyle/Rector/Use_/SeparateMultiUseImportsRector.php b/rules/CodingStyle/Rector/Use_/SeparateMultiUseImportsRector.php index 33020bcbf07..afd5f92313c 100644 --- a/rules/CodingStyle/Rector/Use_/SeparateMultiUseImportsRector.php +++ b/rules/CodingStyle/Rector/Use_/SeparateMultiUseImportsRector.php @@ -5,8 +5,11 @@ namespace Rector\CodingStyle\Rector\Use_; use PhpParser\Node; +use PhpParser\Node\Stmt\Class_; +use PhpParser\Node\Stmt\Namespace_; use PhpParser\Node\Stmt\TraitUse; use PhpParser\Node\Stmt\Use_; +use Rector\Core\PhpParser\Node\CustomNode\FileWithoutNamespace; use Rector\Core\Rector\AbstractRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -51,20 +54,44 @@ class SomeClass */ public function getNodeTypes(): array { - return [Use_::class, TraitUse::class]; + return [FileWithoutNamespace::class, Namespace_::class, Class_::class]; } /** - * @param Use_|TraitUse $node - * @return Use_[]|TraitUse[]|null + * @param FileWithoutNamespace|Namespace_|Class_ $node */ - public function refactor(Node $node): ?array + public function refactor(Node $node): FileWithoutNamespace|Namespace_|Class_|null { - if ($node instanceof Use_) { - return $this->refactorUseImport($node); + $hasChanged = false; + foreach ($node->stmts as $key => $stmt) { + if ($stmt instanceof Use_) { + $refactorUseImport = $this->refactorUseImport($stmt); + if ($refactorUseImport !== null) { + unset($node->stmts[$key]); + array_splice($node->stmts, $key, 0, $refactorUseImport); + + $hasChanged = true; + } + + continue; + } + + if ($stmt instanceof TraitUse) { + $refactorTraitUse = $this->refactorTraitUse($stmt); + if ($refactorTraitUse !== null) { + unset($node->stmts[$key]); + array_splice($node->stmts, $key, 0, $refactorTraitUse); + + $hasChanged = true; + } + } + } + + if (! $hasChanged) { + return null; } - return $this->refactorTraitUse($node); + return $node; } /** diff --git a/tests/Issues/IssueTraitUseKey/Fixture/fixture.php.inc b/tests/Issues/IssueTraitUseKey/Fixture/fixture.php.inc new file mode 100644 index 00000000000..fcceb4d5721 --- /dev/null +++ b/tests/Issues/IssueTraitUseKey/Fixture/fixture.php.inc @@ -0,0 +1,63 @@ +foo = $foo; + $this->bar = $bar; + } + + public function getConst(): int + { + return self::PRIVATE_CONST ?? self::PUBLIC_CONST; + } +} + +?> +----- + diff --git a/tests/Issues/IssueTraitUseKey/IssueTraitUseKeyTest.php b/tests/Issues/IssueTraitUseKey/IssueTraitUseKeyTest.php new file mode 100644 index 00000000000..0c7b1ac0ec4 --- /dev/null +++ b/tests/Issues/IssueTraitUseKey/IssueTraitUseKeyTest.php @@ -0,0 +1,28 @@ +doTestFile($filePath); + } + + public static function provideData(): Iterator + { + return self::yieldFilesFromDirectory(__DIR__ . '/Fixture'); + } + + public function provideConfigFilePath(): string + { + return __DIR__ . '/config/configured_rule.php'; + } +} diff --git a/tests/Issues/IssueTraitUseKey/Source/TraitA.php b/tests/Issues/IssueTraitUseKey/Source/TraitA.php new file mode 100644 index 00000000000..a70dc47304a --- /dev/null +++ b/tests/Issues/IssueTraitUseKey/Source/TraitA.php @@ -0,0 +1,9 @@ +rule(SeparateMultiUseImportsRector::class); + $rectorConfig->rule(ClassPropertyAssignToConstructorPromotionRector::class); + $rectorConfig->rule(FinalizeClassesWithoutChildrenRector::class); +};