X-Git-Url: http://www.aleph1.co.uk/gitweb/?p=yaffs-website;a=blobdiff_plain;f=vendor%2Fpsy%2Fpsysh%2Fsrc%2FTabCompletion%2FAutoCompleter.php;fp=vendor%2Fpsy%2Fpsysh%2Fsrc%2FTabCompletion%2FAutoCompleter.php;h=bf538106a651cfb28ac59d24714aad08982e047f;hp=0000000000000000000000000000000000000000;hb=af6d1fb995500ae68849458ee10d66abbdcfb252;hpb=680c79a86e3ed402f263faeac92e89fb6d9edcc0 diff --git a/vendor/psy/psysh/src/TabCompletion/AutoCompleter.php b/vendor/psy/psysh/src/TabCompletion/AutoCompleter.php new file mode 100644 index 000000000..bf538106a --- /dev/null +++ b/vendor/psy/psysh/src/TabCompletion/AutoCompleter.php @@ -0,0 +1,112 @@ + + */ +class AutoCompleter +{ + /** @var Matcher\AbstractMatcher[] */ + protected $matchers; + + /** + * Register a tab completion Matcher. + * + * @param AbstractMatcher $matcher + */ + public function addMatcher(AbstractMatcher $matcher) + { + $this->matchers[] = $matcher; + } + + /** + * Activate readline tab completion. + */ + public function activate() + { + readline_completion_function([&$this, 'callback']); + } + + /** + * Handle readline completion. + * + * @param string $input Readline current word + * @param int $index Current word index + * @param array $info readline_info() data + * + * @return array + */ + public function processCallback($input, $index, $info = []) + { + // Some (Windows?) systems provide incomplete `readline_info`, so let's + // try to work around it. + $line = $info['line_buffer']; + if (isset($info['end'])) { + $line = substr($line, 0, $info['end']); + } + if ($line === '' && $input !== '') { + $line = $input; + } + + $tokens = token_get_all('matchers as $matcher) { + if ($matcher->hasMatched($tokens)) { + $matches = array_merge($matcher->getMatches($tokens), $matches); + } + } + + $matches = array_unique($matches); + + return !empty($matches) ? $matches : ['']; + } + + /** + * The readline_completion_function callback handler. + * + * @see processCallback + * + * @param string $input + * @param int $index + * + * @return array + */ + public function callback($input, $index) + { + return $this->processCallback($input, $index, readline_info()); + } + + /** + * Remove readline callback handler on destruct. + */ + public function __destruct() + { + // PHP didn't implement the whole readline API when they first switched + // to libedit. And they still haven't. + // + // So this is a thing to make PsySH work on 5.3.x: + if (function_exists('readline_callback_handler_remove')) { + readline_callback_handler_remove(); + } + } +}