Version 1
[yaffs-website] / vendor / psy / psysh / src / Psy / Reflection / ReflectionConstant.php
diff --git a/vendor/psy/psysh/src/Psy/Reflection/ReflectionConstant.php b/vendor/psy/psysh/src/Psy/Reflection/ReflectionConstant.php
new file mode 100644 (file)
index 0000000..12aa3f4
--- /dev/null
@@ -0,0 +1,151 @@
+<?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\Reflection;
+
+/**
+ * Somehow the standard reflection library doesn't include constants.
+ *
+ * ReflectionConstant corrects that omission.
+ */
+class ReflectionConstant implements \Reflector
+{
+    private $class;
+    private $name;
+    private $value;
+
+    /**
+     * Construct a ReflectionConstant object.
+     *
+     * @param mixed  $class
+     * @param string $name
+     */
+    public function __construct($class, $name)
+    {
+        if (!$class instanceof \ReflectionClass) {
+            $class = new \ReflectionClass($class);
+        }
+
+        $this->class = $class;
+        $this->name  = $name;
+
+        $constants = $class->getConstants();
+        if (!array_key_exists($name, $constants)) {
+            throw new \InvalidArgumentException('Unknown constant: ' . $name);
+        }
+
+        $this->value = $constants[$name];
+    }
+
+    /**
+     * Gets the declaring class.
+     *
+     * @return string
+     */
+    public function getDeclaringClass()
+    {
+        $parent = $this->class;
+
+        // Since we don't have real reflection constants, we can't see where
+        // it's actually defined. Let's check for a constant that is also
+        // available on the parent class which has exactly the same value.
+        //
+        // While this isn't _technically_ correct, it's prolly close enough.
+        do {
+            $class = $parent;
+            $parent = $class->getParentClass();
+        } while ($parent && $parent->hasConstant($this->name) && $parent->getConstant($this->name) === $this->value);
+
+        return $class;
+    }
+
+    /**
+     * Gets the constant name.
+     *
+     * @return string
+     */
+    public function getName()
+    {
+        return $this->name;
+    }
+
+    /**
+     * Gets the value of the constant.
+     *
+     * @return mixed
+     */
+    public function getValue()
+    {
+        return $this->value;
+    }
+
+    /**
+     * Gets the constant's file name.
+     *
+     * Currently returns null, because if it returns a file name the signature
+     * formatter will barf.
+     */
+    public function getFileName()
+    {
+        return;
+        // return $this->class->getFileName();
+    }
+
+    /**
+     * Get the code start line.
+     *
+     * @throws \RuntimeException
+     */
+    public function getStartLine()
+    {
+        throw new \RuntimeException('Not yet implemented because it\'s unclear what I should do here :)');
+    }
+
+    /**
+     * Get the code end line.
+     *
+     * @throws \RuntimeException
+     */
+    public function getEndLine()
+    {
+        return $this->getStartLine();
+    }
+
+    /**
+     * Get the constant's docblock.
+     *
+     * @return false
+     */
+    public function getDocComment()
+    {
+        return false;
+    }
+
+    /**
+     * Export the constant? I don't think this is possible.
+     *
+     * @throws \RuntimeException
+     */
+    public static function export()
+    {
+        throw new \RuntimeException('Not yet implemented because it\'s unclear what I should do here :)');
+    }
+
+    /**
+     * To string.
+     *
+     * @return string
+     */
+    public function __toString()
+    {
+        return $this->getName();
+    }
+}