diff --git a/src/Rector/Dynamic/NamespaceReplacerRector.php b/src/Rector/Dynamic/NamespaceReplacerRector.php index 09dc7d437d4..a6c47d17046 100644 --- a/src/Rector/Dynamic/NamespaceReplacerRector.php +++ b/src/Rector/Dynamic/NamespaceReplacerRector.php @@ -4,6 +4,7 @@ namespace Rector\Rector\Dynamic; use Nette\Utils\Strings; use PhpParser\Node; +use PhpParser\Node\Expr\New_; use PhpParser\Node\Name; use PhpParser\Node\Name\FullyQualified; use PhpParser\Node\Stmt\Namespace_; @@ -33,8 +34,11 @@ final class NamespaceReplacerRector extends AbstractRector } $name = $this->resolveNameFromNode($node); + if (! $this->isNamespaceToChange($name)) { + return false; + } - return $this->isNamespaceToChange($name); + return ! $this->isClassFullyQualifiedName($node); } public function refactor(Node $node): ?Node @@ -122,4 +126,29 @@ final class NamespaceReplacerRector extends AbstractRector return false; } + + /** + * Checks for "new \ClassNoNamespace;" + * This should be skipped, not a namespace. + */ + private function isClassFullyQualifiedName(Node $node): bool + { + $parentNode = $node->getAttribute(Attribute::PARENT_NODE); + if ($parentNode === null) { + return false; + } + + if (! $parentNode instanceof New_) { + return false; + } + + $newClassName = $parentNode->class->toString(); + foreach ($this->oldToNewNamespaces as $oldNamespace => $newNamespace) { + if ($newClassName === $oldNamespace) { + return true; + } + } + + return false; + } } diff --git a/tests/Rector/Dynamic/NamespaceReplacerRector/correct/correct.php.inc b/tests/Rector/Dynamic/NamespaceReplacerRector/correct/correct.php.inc index b7ce82561b0..bfdc67c138c 100644 --- a/tests/Rector/Dynamic/NamespaceReplacerRector/correct/correct.php.inc +++ b/tests/Rector/Dynamic/NamespaceReplacerRector/correct/correct.php.inc @@ -9,6 +9,8 @@ class SomeClass { public function someClass() { + $keepThis = new \OldNamespace; + return new \NewNamespace\SomeClass; } } diff --git a/tests/Rector/Dynamic/NamespaceReplacerRector/wrong/wrong.php.inc b/tests/Rector/Dynamic/NamespaceReplacerRector/wrong/wrong.php.inc index a7057a8f807..cb27b6bb48c 100644 --- a/tests/Rector/Dynamic/NamespaceReplacerRector/wrong/wrong.php.inc +++ b/tests/Rector/Dynamic/NamespaceReplacerRector/wrong/wrong.php.inc @@ -9,6 +9,8 @@ class SomeClass { public function someClass() { + $keepThis = new \OldNamespace; + return new \OldNamespace\SomeClass; } }