X-Git-Url: http://www.aleph1.co.uk/gitweb/?p=yaffs-website;a=blobdiff_plain;f=vendor%2Fpsy%2Fpsysh%2Fsrc%2FCodeCleaner%2FUseStatementPass.php;fp=vendor%2Fpsy%2Fpsysh%2Fsrc%2FCodeCleaner%2FUseStatementPass.php;h=d6ca878c4a2a49e94b8fd364517f330bd6745996;hp=0000000000000000000000000000000000000000;hb=af6d1fb995500ae68849458ee10d66abbdcfb252;hpb=680c79a86e3ed402f263faeac92e89fb6d9edcc0 diff --git a/vendor/psy/psysh/src/CodeCleaner/UseStatementPass.php b/vendor/psy/psysh/src/CodeCleaner/UseStatementPass.php new file mode 100644 index 000000000..d6ca878c4 --- /dev/null +++ b/vendor/psy/psysh/src/CodeCleaner/UseStatementPass.php @@ -0,0 +1,126 @@ +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 Use_) { + // Store a reference to every "use" statement, because we'll need + // them in a bit. + foreach ($node->uses as $use) { + $alias = $use->alias ?: end($use->name->parts); + $this->aliases[strtolower($alias)] = $use->name; + } + + return NodeTraverser::REMOVE_NODE; + } elseif ($node instanceof GroupUse) { + // Expand every "use" statement in the group into a full, standalone + // "use" and store 'em with the others. + foreach ($node->uses as $use) { + $alias = $use->alias ?: end($use->name->parts); + $this->aliases[strtolower($alias)] = Name::concat($node->prefix, $use->name, [ + 'startLine' => $node->prefix->getAttribute('startLine'), + 'endLine' => $use->name->getAttribute('endLine'), + ]); + } + + return NodeTraverser::REMOVE_NODE; + } elseif ($node instanceof Namespace_) { + // Start fresh, since we're done with this namespace. + $this->lastNamespace = $node->name; + $this->lastAliases = $this->aliases; + $this->aliases = []; + } 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))); + } + } + } +}