Mercurial > hg > isophonics-drupal-site
diff vendor/psy/psysh/src/Psy/CodeCleaner/NamespacePass.php @ 0:4c8ae668cc8c
Initial import (non-working)
author | Chris Cannam |
---|---|
date | Wed, 29 Nov 2017 16:09:58 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vendor/psy/psysh/src/Psy/CodeCleaner/NamespacePass.php Wed Nov 29 16:09:58 2017 +0000 @@ -0,0 +1,77 @@ +<?php + +/* + * This file is part of Psy Shell. + * + * (c) 2012-2017 Justin Hileman + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Psy\CodeCleaner; + +use PhpParser\Node\Name; +use PhpParser\Node\Stmt\Namespace_; +use Psy\CodeCleaner; + +/** + * Provide implicit namespaces for subsequent execution. + * + * The namespace pass remembers the last standalone namespace line encountered: + * + * namespace Foo\Bar; + * + * ... which it then applies implicitly to all future evaluated code, until the + * namespace is replaced by another namespace. To reset to the top level + * namespace, enter `namespace {}`. This is a bit ugly, but it does the trick :) + */ +class NamespacePass extends CodeCleanerPass +{ + private $namespace = null; + private $cleaner; + + /** + * @param CodeCleaner $cleaner + */ + public function __construct(CodeCleaner $cleaner) + { + $this->cleaner = $cleaner; + } + + /** + * If this is a standalone namespace line, remember it for later. + * + * Otherwise, apply remembered namespaces to the code until a new namespace + * is encountered. + * + * @param array $nodes + */ + public function beforeTraverse(array $nodes) + { + if (empty($nodes)) { + return $nodes; + } + + $last = end($nodes); + if (!$last instanceof Namespace_) { + return $this->namespace ? array(new Namespace_($this->namespace, $nodes)) : $nodes; + } + + $this->setNamespace($last->name); + + return $nodes; + } + + /** + * Remember the namespace and (re)set the namespace on the CodeCleaner as + * well. + * + * @param null|Name $namespace + */ + private function setNamespace($namespace) + { + $this->namespace = $namespace; + $this->cleaner->setNamespace($namespace === null ? null : $namespace->parts); + } +}