ff44f5ac12f9e2ff524a68841b0d04c006722083
[yaffs-website] / vendor / psy / psysh / src / TabCompletion / Matcher / ObjectAttributesMatcher.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 attribute tab completion Matcher.
18  *
19  * This matcher provides completion for properties of objects in the current
20  * Context.
21  *
22  * @author Marc Garcia <markcial@gmail.com>
23  */
24 class ObjectAttributesMatcher 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             \array_keys(\get_class_vars(\get_class($object))),
56             function ($var) use ($input) {
57                 return AbstractMatcher::startsWith($input, $var);
58             }
59         );
60     }
61
62     /**
63      * {@inheritdoc}
64      */
65     public function hasMatched(array $tokens)
66     {
67         $token     = \array_pop($tokens);
68         $prevToken = \array_pop($tokens);
69
70         switch (true) {
71             case self::tokenIs($token, self::T_OBJECT_OPERATOR):
72             case self::tokenIs($prevToken, self::T_OBJECT_OPERATOR):
73                 return true;
74         }
75
76         return false;
77     }
78 }