cc45b1d9e92d501cdc62138318ddcafb893cb31e
[yaffs-website] / vendor / psy / psysh / src / TabCompletion / Matcher / ObjectMethodsMatcher.php
1 <?php
2
3 /*
4  * This file is part of Psy Shell.
5  *
6  * (c) 2012-2018 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 = [])
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 [];
41         }
42         $objectName = str_replace('$', '', $objectToken[1]);
43
44         try {
45             $object = $this->getVariable($objectName);
46         } catch (InvalidArgumentException $e) {
47             return [];
48         }
49
50         if (!is_object($object)) {
51             return [];
52         }
53
54         return array_filter(
55             get_class_methods($object),
56             function ($var) use ($input) {
57                 return AbstractMatcher::startsWith($input, $var) &&
58                     // also check that we do not suggest invoking a super method(__construct, __wakeup, …)
59                     !AbstractMatcher::startsWith('__', $var);
60             }
61         );
62     }
63
64     /**
65      * {@inheritdoc}
66      */
67     public function hasMatched(array $tokens)
68     {
69         $token     = array_pop($tokens);
70         $prevToken = array_pop($tokens);
71
72         switch (true) {
73             case self::tokenIs($token, self::T_OBJECT_OPERATOR):
74             case self::tokenIs($prevToken, self::T_OBJECT_OPERATOR):
75                 return true;
76         }
77
78         return false;
79     }
80 }