4 * This file is part of Psy Shell.
6 * (c) 2012-2018 Justin Hileman
8 * For the full copyright and license information, please view the LICENSE
9 * file that was distributed with this source code.
12 namespace Psy\TabCompletion\Matcher;
15 * A class name tab completion Matcher.
17 * This matcher provides completion for all declared classes.
19 * @author Marc Garcia <markcial@gmail.com>
21 class ClassNamesMatcher extends AbstractMatcher
26 public function getMatches(array $tokens, array $info = [])
28 $class = $this->getNamespaceAndClass($tokens);
29 if (strlen($class) > 0 && $class[0] === '\\') {
30 $class = substr($class, 1, strlen($class));
32 $quotedClass = preg_quote($class);
35 function ($className) use ($class) {
36 // get the number of namespace separators
37 $nsPos = substr_count($class, '\\');
38 $pieces = explode('\\', $className);
39 //$methods = Mirror::get($class);
40 return implode('\\', array_slice($pieces, $nsPos, count($pieces)));
43 get_declared_classes(),
44 function ($className) use ($quotedClass) {
45 return AbstractMatcher::startsWith($quotedClass, $className);
54 public function hasMatched(array $tokens)
56 $token = array_pop($tokens);
57 $prevToken = array_pop($tokens);
59 $blacklistedTokens = [
60 self::T_INCLUDE, self::T_INCLUDE_ONCE, self::T_REQUIRE, self::T_REQUIRE_ONCE,
64 case self::hasToken([$blacklistedTokens], $token):
65 case self::hasToken([$blacklistedTokens], $prevToken):
66 case is_string($token) && $token === '$':
68 case self::hasToken([self::T_NEW, self::T_OPEN_TAG, self::T_NS_SEPARATOR, self::T_STRING], $prevToken):
69 case self::hasToken([self::T_NEW, self::T_OPEN_TAG, self::T_NS_SEPARATOR], $token):
70 case self::hasToken([self::T_OPEN_TAG, self::T_VARIABLE], $token):
71 case self::isOperator($token):