86558c2dad4abcaa51e7f1ea06ba989f03299160
[yaffs-website] / vendor / psy / psysh / src / Psy / TabCompletion / Matcher / KeywordsMatcher.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 /**
15  * A PHP keyword tab completion Matcher.
16  *
17  * This matcher provides completion for all function-like PHP keywords.
18  *
19  * @author Marc Garcia <markcial@gmail.com>
20  */
21 class KeywordsMatcher extends AbstractMatcher
22 {
23     protected $keywords = array(
24         'array', 'clone', 'declare', 'die', 'echo', 'empty', 'eval', 'exit', 'include',
25         'include_once', 'isset', 'list', 'print',  'require', 'require_once', 'unset',
26     );
27
28     protected $mandatoryStartKeywords = array(
29         'die', 'echo', 'print', 'unset',
30     );
31
32     /**
33      * Get all (completable) PHP keywords.
34      *
35      * @return array
36      */
37     public function getKeywords()
38     {
39         return $this->keywords;
40     }
41
42     /**
43      * Check whether $keyword is a (completable) PHP keyword.
44      *
45      * @param string $keyword
46      *
47      * @return bool
48      */
49     public function isKeyword($keyword)
50     {
51         return in_array($keyword, $this->keywords);
52     }
53
54     /**
55      * {@inheritdoc}
56      */
57     public function getMatches(array $tokens, array $info = array())
58     {
59         $input = $this->getInput($tokens);
60
61         return array_filter($this->keywords, function ($keyword) use ($input) {
62             return AbstractMatcher::startsWith($input, $keyword);
63         });
64     }
65
66     /**
67      * {@inheritdoc}
68      */
69     public function hasMatched(array $tokens)
70     {
71         $token = array_pop($tokens);
72         $prevToken = array_pop($tokens);
73
74         switch (true) {
75             case self::hasToken(array(self::T_OPEN_TAG, self::T_VARIABLE), $token):
76 //            case is_string($token) && $token === '$':
77             case self::hasToken(array(self::T_OPEN_TAG, self::T_VARIABLE), $prevToken) &&
78                 self::tokenIs($token, self::T_STRING):
79             case self::isOperator($token):
80                 return true;
81         }
82
83         return false;
84     }
85 }