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 0000000000..954a396bc7 --- /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 0000000000..4f51fedba7 --- /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 0051a54da7..305e5235a8 100644 --- a/rules/Renaming/Rector/Namespace_/RenameNamespaceRector.php +++ b/rules/Renaming/Rector/Namespace_/RenameNamespaceRector.php @@ -4,7 +4,6 @@ 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 @@ public function configure(array $configuration): void private function processFullyQualified(Name $name, RenamedNamespace $renamedNamespace): ?FullyQualified { - $newName = $this->isPartialNamespace($name) ? $this->resolvePartialNewName( - $name, - $renamedNamespace - ) : $renamedNamespace->getNameInNewNamespace(); + if (str_starts_with($name->toString(), $renamedNamespace->getNewNamespace() . '\\')) { + return null; + } + + $nameInNewNamespace = $renamedNamespace->getNameInNewNamespace(); $values = array_values($this->oldToNewNamespaces); - if (! isset($this->isChangedInNamespaces[$newName])) { - return new FullyQualified($newName); + if (! isset($this->isChangedInNamespaces[$nameInNewNamespace])) { + return new FullyQualified($nameInNewNamespace); } - if (! in_array($newName, $values, true)) { - return new FullyQualified($newName); + if (! in_array($nameInNewNamespace, $values, true)) { + return new FullyQualified($nameInNewNamespace); } return null; @@ -173,28 +173,4 @@ private function isClassFullyQualifiedName(Node $node): bool 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 8a1e757b57..5f6c424949 100644 --- a/rules/Renaming/ValueObject/RenamedNamespace.php +++ b/rules/Renaming/ValueObject/RenamedNamespace.php @@ -15,6 +15,15 @@ public function __construct( 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; + } }