name) === strtolower($this->lastNamespace)) { $this->aliases = $this->lastAliases; } } } /** * If this statement is a namespace, forget all the aliases we had. * * If it's a use statement, remember the alias for later. Otherwise, apply * remembered aliases to the code. * * @param Node $node */ public function leaveNode(Node $node) { if ($node instanceof UseStmt) { // Store a reference to every "use" statement, because we'll need // them in a bit. foreach ($node->uses as $use) { $this->aliases[strtolower($use->alias)] = $use->name; } return false; } elseif ($node instanceof GroupUseStmt) { // Expand every "use" statement in the group into a full, standalone // "use" and store 'em with the others. foreach ($node->uses as $use) { $this->aliases[strtolower($use->alias)] = Name::concat($node->prefix, $use->name, array( 'startLine' => $node->prefix->getAttribute('startLine'), 'endLine' => $use->name->getAttribute('endLine'), )); } return false; } elseif ($node instanceof NamespaceStmt) { // Start fresh, since we're done with this namespace. $this->lastNamespace = $node->name; $this->lastAliases = $this->aliases; $this->aliases = array(); } else { foreach ($node as $name => $subNode) { if ($subNode instanceof Name) { // Implicitly thunk all aliases. if ($replacement = $this->findAlias($subNode)) { $node->$name = $replacement; } } } return $node; } } /** * Find class/namespace aliases. * * @param Name $name * * @return FullyQualifiedName|null */ private function findAlias(Name $name) { $that = strtolower($name); foreach ($this->aliases as $alias => $prefix) { if ($that === $alias) { return new FullyQualifiedName($prefix->toString()); } elseif (substr($that, 0, strlen($alias) + 1) === $alias . '\\') { return new FullyQualifiedName($prefix->toString() . substr($name, strlen($alias))); } } } }