Version 1
[yaffs-website] / vendor / psy / psysh / src / Psy / TabCompletion / Matcher / AbstractMatcher.php
diff --git a/vendor/psy/psysh/src/Psy/TabCompletion/Matcher/AbstractMatcher.php b/vendor/psy/psysh/src/Psy/TabCompletion/Matcher/AbstractMatcher.php
new file mode 100644 (file)
index 0000000..016c321
--- /dev/null
@@ -0,0 +1,186 @@
+<?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\TabCompletion\Matcher;
+
+/**
+ * Abstract tab completion Matcher.
+ *
+ * @author Marc Garcia <markcial@gmail.com>
+ */
+abstract class AbstractMatcher
+{
+    /** Syntax types */
+    const CONSTANT_SYNTAX = '^[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*$';
+    const VAR_SYNTAX = '^\$[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*$';
+    const MISC_OPERATORS = '+-*/^|&';
+    /** Token values */
+    const T_OPEN_TAG = 'T_OPEN_TAG';
+    const T_VARIABLE = 'T_VARIABLE';
+    const T_OBJECT_OPERATOR = 'T_OBJECT_OPERATOR';
+    const T_DOUBLE_COLON = 'T_DOUBLE_COLON';
+    const T_NEW = 'T_NEW';
+    const T_CLONE = 'T_CLONE';
+    const T_NS_SEPARATOR = 'T_NS_SEPARATOR';
+    const T_STRING = 'T_STRING';
+    const T_WHITESPACE = 'T_WHITESPACE';
+    const T_AND_EQUAL = 'T_AND_EQUAL';
+    const T_BOOLEAN_AND = 'T_BOOLEAN_AND';
+    const T_BOOLEAN_OR = 'T_BOOLEAN_OR';
+
+    const T_ENCAPSED_AND_WHITESPACE = 'T_ENCAPSED_AND_WHITESPACE';
+    const T_REQUIRE = 'T_REQUIRE';
+    const T_REQUIRE_ONCE = 'T_REQUIRE_ONCE';
+    const T_INCLUDE = 'T_INCLUDE';
+    const T_INCLUDE_ONCE = 'T_INCLUDE_ONCE';
+
+    /**
+     * Check whether this matcher can provide completions for $tokens.
+     *
+     * @param array $tokens Tokenized readline input
+     *
+     * @return bool
+     */
+    public function hasMatched(array $tokens)
+    {
+        return false;
+    }
+
+    /**
+     * Get current readline input word.
+     *
+     * @param array $tokens Tokenized readline input (see token_get_all)
+     *
+     * @return string
+     */
+    protected function getInput(array $tokens)
+    {
+        $var = '';
+        $firstToken = array_pop($tokens);
+        if (self::tokenIs($firstToken, self::T_STRING)) {
+            $var = $firstToken[1];
+        }
+
+        return $var;
+    }
+
+    /**
+     * Get current namespace and class (if any) from readline input.
+     *
+     * @param array $tokens Tokenized readline input (see token_get_all)
+     *
+     * @return string
+     */
+    protected function getNamespaceAndClass($tokens)
+    {
+        $class = '';
+        while (self::hasToken(
+            array(self::T_NS_SEPARATOR, self::T_STRING),
+            $token = array_pop($tokens)
+        )) {
+            $class = $token[1] . $class;
+        }
+
+        return $class;
+    }
+
+    /**
+     * Provide tab completion matches for readline input.
+     *
+     * @param array $tokens information substracted with get_token_all
+     * @param array $info   readline_info object
+     *
+     * @return array The matches resulting from the query
+     */
+    abstract public function getMatches(array $tokens, array $info = array());
+
+    /**
+     * Check whether $word starts with $prefix.
+     *
+     * @param string $prefix
+     * @param string $word
+     *
+     * @return bool
+     */
+    public static function startsWith($prefix, $word)
+    {
+        return preg_match(sprintf('#^%s#', $prefix), $word);
+    }
+
+    /**
+     * Check whether $token matches a given syntax pattern.
+     *
+     * @param mixed  $token  A PHP token (see token_get_all)
+     * @param string $syntax A syntax pattern (default: variable pattern)
+     *
+     * @return bool
+     */
+    public static function hasSyntax($token, $syntax = self::VAR_SYNTAX)
+    {
+        if (!is_array($token)) {
+            return false;
+        }
+
+        $regexp = sprintf('#%s#', $syntax);
+
+        return (bool) preg_match($regexp, $token[1]);
+    }
+
+    /**
+     * Check whether $token type is $which.
+     *
+     * @param string $which A PHP token type
+     * @param mixed  $token A PHP token (see token_get_all)
+     *
+     * @return bool
+     */
+    public static function tokenIs($token, $which)
+    {
+        if (!is_array($token)) {
+            return false;
+        }
+
+        return token_name($token[0]) === $which;
+    }
+
+    /**
+     * Check whether $token is an operator.
+     *
+     * @param mixed $token A PHP token (see token_get_all)
+     *
+     * @return bool
+     */
+    public static function isOperator($token)
+    {
+        if (!is_string($token)) {
+            return false;
+        }
+
+        return strpos(self::MISC_OPERATORS, $token) !== false;
+    }
+
+    /**
+     * Check whether $token type is present in $coll.
+     *
+     * @param array $coll  A list of token types
+     * @param mixed $token A PHP token (see token_get_all)
+     *
+     * @return bool
+     */
+    public static function hasToken(array $coll, $token)
+    {
+        if (!is_array($token)) {
+            return false;
+        }
+
+        return in_array(token_name($token[0]), $coll);
+    }
+}