diff --git a/rules-tests/Renaming/Rector/Namespace_/RenameNamespaceRector/Fixture/fixture6.php.inc b/rules-tests/Renaming/Rector/Namespace_/RenameNamespaceRector/Fixture/fixture6.php.inc new file mode 100644 index 00000000000..954a396bc73 --- /dev/null +++ b/rules-tests/Renaming/Rector/Namespace_/RenameNamespaceRector/Fixture/fixture6.php.inc @@ -0,0 +1,27 @@ + +----- + diff --git a/rules-tests/Renaming/Rector/Namespace_/RenameNamespaceRector/Fixture/skip_already_changed.php.inc b/rules-tests/Renaming/Rector/Namespace_/RenameNamespaceRector/Fixture/skip_already_changed.php.inc new file mode 100644 index 00000000000..4f51fedba75 --- /dev/null +++ b/rules-tests/Renaming/Rector/Namespace_/RenameNamespaceRector/Fixture/skip_already_changed.php.inc @@ -0,0 +1,11 @@ + 'Short\AnyNamespace', 'PHPUnit_Framework_' => 'PHPUnit\Framework\\', 'Foo\Bar' => 'Foo\Tmp', + 'App\Repositories' => 'App\Repositories\Example', ]); }; diff --git a/rules/Renaming/Rector/Namespace_/RenameNamespaceRector.php b/rules/Renaming/Rector/Namespace_/RenameNamespaceRector.php index 0051a54da76..305e5235a8a 100644 --- a/rules/Renaming/Rector/Namespace_/RenameNamespaceRector.php +++ b/rules/Renaming/Rector/Namespace_/RenameNamespaceRector.php @@ -4,7 +4,6 @@ declare(strict_types=1); namespace Rector\Renaming\Rector\Namespace_; -use Nette\Utils\Strings; use PhpParser\Node; use PhpParser\Node\Expr\New_; use PhpParser\Node\Name; @@ -134,18 +133,19 @@ final class RenameNamespaceRector extends AbstractRector implements Configurable private function processFullyQualified(Name $name, RenamedNamespace $renamedNamespace): ?FullyQualified { - $newName = $this->isPartialNamespace($name) ? $this->resolvePartialNewName( - $name, - $renamedNamespace - ) : $renamedNamespace->getNameInNewNamespace(); - - $values = array_values($this->oldToNewNamespaces); - if (! isset($this->isChangedInNamespaces[$newName])) { - return new FullyQualified($newName); + if (str_starts_with($name->toString(), $renamedNamespace->getNewNamespace() . '\\')) { + return null; } - if (! in_array($newName, $values, true)) { - return new FullyQualified($newName); + $nameInNewNamespace = $renamedNamespace->getNameInNewNamespace(); + + $values = array_values($this->oldToNewNamespaces); + if (! isset($this->isChangedInNamespaces[$nameInNewNamespace])) { + return new FullyQualified($nameInNewNamespace); + } + + if (! in_array($nameInNewNamespace, $values, true)) { + return new FullyQualified($nameInNewNamespace); } return null; @@ -173,28 +173,4 @@ final class RenameNamespaceRector extends AbstractRector implements Configurable return array_key_exists($newClassName, $this->oldToNewNamespaces); } - - private function isPartialNamespace(Name $name): bool - { - $resolvedName = $name->getAttribute(AttributeKey::RESOLVED_NAME); - if (! $resolvedName instanceof Name) { - return false; - } - - if ($resolvedName instanceof FullyQualified) { - return ! $this->isName($name, $resolvedName->toString()); - } - - return false; - } - - private function resolvePartialNewName(Name $name, RenamedNamespace $renamedNamespace): string - { - $nameInNewNamespace = $renamedNamespace->getNameInNewNamespace(); - - // first dummy implementation - improve - $cutOffFromTheLeft = Strings::length($nameInNewNamespace) - Strings::length($name->toString()); - - return Strings::substring($nameInNewNamespace, $cutOffFromTheLeft); - } } diff --git a/rules/Renaming/ValueObject/RenamedNamespace.php b/rules/Renaming/ValueObject/RenamedNamespace.php index 8a1e757b572..5f6c4249498 100644 --- a/rules/Renaming/ValueObject/RenamedNamespace.php +++ b/rules/Renaming/ValueObject/RenamedNamespace.php @@ -15,6 +15,15 @@ final class RenamedNamespace public function getNameInNewNamespace(): string { + if ($this->newNamespace === $this->currentName) { + return $this->currentName; + } + return str_replace($this->oldNamespace, $this->newNamespace, $this->currentName); } + + public function getNewNamespace(): string + { + return $this->newNamespace; + } }