X-Git-Url: http://www.aleph1.co.uk/gitweb/?p=yaffs-website;a=blobdiff_plain;f=vendor%2Fpsy%2Fpsysh%2Fsrc%2FCodeCleaner%2FCalledClassPass.php;fp=vendor%2Fpsy%2Fpsysh%2Fsrc%2FCodeCleaner%2FCalledClassPass.php;h=280be3b7c7d7c0f1e40382b85cbd803782b1bf04;hp=0000000000000000000000000000000000000000;hb=af6d1fb995500ae68849458ee10d66abbdcfb252;hpb=680c79a86e3ed402f263faeac92e89fb6d9edcc0 diff --git a/vendor/psy/psysh/src/CodeCleaner/CalledClassPass.php b/vendor/psy/psysh/src/CodeCleaner/CalledClassPass.php new file mode 100644 index 000000000..280be3b7c --- /dev/null +++ b/vendor/psy/psysh/src/CodeCleaner/CalledClassPass.php @@ -0,0 +1,83 @@ +inClass = false; + } + + /** + * @throws ErrorException if get_class or get_called_class is called without an object from outside a class + * + * @param Node $node + */ + public function enterNode(Node $node) + { + if ($node instanceof Class_ || $node instanceof Trait_) { + $this->inClass = true; + } elseif ($node instanceof FuncCall && !$this->inClass) { + // We'll give any args at all (besides null) a pass. + // Technically we should be checking whether the args are objects, but this will do for now. + // + // @todo switch this to actually validate args when we get context-aware code cleaner passes. + if (!empty($node->args) && !$this->isNull($node->args[0])) { + return; + } + + // We'll ignore name expressions as well (things like `$foo()`) + if (!($node->name instanceof Name)) { + return; + } + + $name = strtolower($node->name); + if (in_array($name, ['get_class', 'get_called_class'])) { + $msg = sprintf('%s() called without object from outside a class', $name); + throw new ErrorException($msg, 0, E_USER_WARNING, null, $node->getLine()); + } + } + } + + /** + * @param Node $node + */ + public function leaveNode(Node $node) + { + if ($node instanceof Class_) { + $this->inClass = false; + } + } + + private function isNull(Node $node) + { + return $node->value instanceof ConstFetch && strtolower($node->value->name) === 'null'; + } +}