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