Version 1
[yaffs-website] / vendor / psy / psysh / src / Psy / TabCompletion / Matcher / ObjectMethodsMatcher.php
1 <?php
2
3 /*
4  * This file is part of Psy Shell.
5  *
6  * (c) 2012-2017 Justin Hileman
7  *
8  * For the full copyright and license information, please view the LICENSE
9  * file that was distributed with this source code.
10  */
11
12 namespace Psy\TabCompletion\Matcher;
13
14 use InvalidArgumentException;
15
16 /**
17  * An object method tab completion Matcher.
18  *
19  * This matcher provides completion for methods of objects in the current
20  * Context.
21  *
22  * @author Marc Garcia <markcial@gmail.com>
23  */
24 class ObjectMethodsMatcher extends AbstractContextAwareMatcher
25 {
26     /**
27      * {@inheritdoc}
28      */
29     public function getMatches(array $tokens, array $info = array())
30     {
31         $input = $this->getInput($tokens);
32
33         $firstToken = array_pop($tokens);
34         if (self::tokenIs($firstToken, self::T_STRING)) {
35             // second token is the object operator
36             array_pop($tokens);
37         }
38         $objectToken = array_pop($tokens);
39         if (!is_array($objectToken)) {
40             return array();
41         }
42         $objectName = str_replace('$', '', $objectToken[1]);
43
44         try {
45             $object = $this->getVariable($objectName);
46         } catch (InvalidArgumentException $e) {
47             return array();
48         }
49
50         return array_filter(
51             get_class_methods($object),
52             function ($var) use ($input) {
53                 return AbstractMatcher::startsWith($input, $var);
54             }
55         );
56     }
57
58     /**
59      * {@inheritdoc}
60      */
61     public function hasMatched(array $tokens)
62     {
63         $token = array_pop($tokens);
64         $prevToken = array_pop($tokens);
65
66         switch (true) {
67             case self::tokenIs($token, self::T_OBJECT_OPERATOR):
68             case self::tokenIs($prevToken, self::T_OBJECT_OPERATOR):
69                 return true;
70         }
71
72         return false;
73     }
74 }