classRenamer = $classRenamer; $this->renamedClassesDataCollector = $renamedClassesDataCollector; $this->useImportsRemover = $useImportsRemover; $this->renamedNameCollector = $renamedNameCollector; } /** * @param Stmt[] $nodes * @return Stmt[] */ public function beforeTraverse(array $nodes) : array { // ensure reset early on every run to avoid reuse existing value $this->rootNode = null; foreach ($nodes as $node) { if ($node instanceof FileWithoutNamespace || $node instanceof Namespace_) { $this->rootNode = $node; break; } } return $nodes; } public function enterNode(Node $node) : ?Node { // no longer need post rename if (!$node instanceof Name) { return null; } $oldToNewClasses = $this->renamedClassesDataCollector->getOldToNewClasses(); if ($oldToNewClasses === []) { return null; } /** @var Scope|null $scope */ $scope = $node->getAttribute(AttributeKey::SCOPE); $result = null; if ($node instanceof FullyQualified) { $result = $this->classRenamer->renameNode($node, $oldToNewClasses, $scope); } else { $result = $this->resolveResultWithPhpAttributeName($node, $oldToNewClasses, $scope); } if (!SimpleParameterProvider::provideBoolParameter(Option::AUTO_IMPORT_NAMES)) { return $result; } if (!$this->rootNode instanceof FileWithoutNamespace && !$this->rootNode instanceof Namespace_) { return $result; } $removedUses = $this->renamedClassesDataCollector->getOldClasses(); $this->rootNode->stmts = $this->useImportsRemover->removeImportsFromStmts($this->rootNode->stmts, $removedUses); return $result; } /** * @param Node[] $nodes * @return Stmt[] */ public function afterTraverse(array $nodes) : array { $this->renamedNameCollector->reset(); return $nodes; } /** * @param array $oldToNewClasses */ private function resolveResultWithPhpAttributeName(Name $name, array $oldToNewClasses, ?Scope $scope) : ?FullyQualified { $phpAttributeName = $name->getAttribute(AttributeKey::PHP_ATTRIBUTE_NAME); if (\is_string($phpAttributeName)) { return $this->classRenamer->renameNode(new FullyQualified($phpAttributeName, $name->getAttributes()), $oldToNewClasses, $scope); } return null; } }