Mercurial > hg > isophonics-drupal-site
comparison vendor/psy/psysh/src/TabCompletion/Matcher/AbstractMatcher.php @ 13:5fb285c0d0e3
Update Drupal core to 8.4.7 via Composer. Security update; I *think* we've
been lucky to get away with this so far, as we don't support self-registration
which seems to be used by the so-called "drupalgeddon 2" attack that 8.4.5
was vulnerable to.
author | Chris Cannam |
---|---|
date | Mon, 23 Apr 2018 09:33:26 +0100 |
parents | |
children | c2387f117808 |
comparison
equal
deleted
inserted
replaced
12:7a779792577d | 13:5fb285c0d0e3 |
---|---|
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 /** | |
15 * Abstract tab completion Matcher. | |
16 * | |
17 * @author Marc Garcia <markcial@gmail.com> | |
18 */ | |
19 abstract class AbstractMatcher | |
20 { | |
21 /** Syntax types */ | |
22 const CONSTANT_SYNTAX = '^[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*$'; | |
23 const VAR_SYNTAX = '^\$[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*$'; | |
24 const MISC_OPERATORS = '+-*/^|&'; | |
25 /** Token values */ | |
26 const T_OPEN_TAG = 'T_OPEN_TAG'; | |
27 const T_VARIABLE = 'T_VARIABLE'; | |
28 const T_OBJECT_OPERATOR = 'T_OBJECT_OPERATOR'; | |
29 const T_DOUBLE_COLON = 'T_DOUBLE_COLON'; | |
30 const T_NEW = 'T_NEW'; | |
31 const T_CLONE = 'T_CLONE'; | |
32 const T_NS_SEPARATOR = 'T_NS_SEPARATOR'; | |
33 const T_STRING = 'T_STRING'; | |
34 const T_WHITESPACE = 'T_WHITESPACE'; | |
35 const T_AND_EQUAL = 'T_AND_EQUAL'; | |
36 const T_BOOLEAN_AND = 'T_BOOLEAN_AND'; | |
37 const T_BOOLEAN_OR = 'T_BOOLEAN_OR'; | |
38 | |
39 const T_ENCAPSED_AND_WHITESPACE = 'T_ENCAPSED_AND_WHITESPACE'; | |
40 const T_REQUIRE = 'T_REQUIRE'; | |
41 const T_REQUIRE_ONCE = 'T_REQUIRE_ONCE'; | |
42 const T_INCLUDE = 'T_INCLUDE'; | |
43 const T_INCLUDE_ONCE = 'T_INCLUDE_ONCE'; | |
44 | |
45 /** | |
46 * Check whether this matcher can provide completions for $tokens. | |
47 * | |
48 * @param array $tokens Tokenized readline input | |
49 * | |
50 * @return bool | |
51 */ | |
52 public function hasMatched(array $tokens) | |
53 { | |
54 return false; | |
55 } | |
56 | |
57 /** | |
58 * Get current readline input word. | |
59 * | |
60 * @param array $tokens Tokenized readline input (see token_get_all) | |
61 * | |
62 * @return string | |
63 */ | |
64 protected function getInput(array $tokens) | |
65 { | |
66 $var = ''; | |
67 $firstToken = array_pop($tokens); | |
68 if (self::tokenIs($firstToken, self::T_STRING)) { | |
69 $var = $firstToken[1]; | |
70 } | |
71 | |
72 return $var; | |
73 } | |
74 | |
75 /** | |
76 * Get current namespace and class (if any) from readline input. | |
77 * | |
78 * @param array $tokens Tokenized readline input (see token_get_all) | |
79 * | |
80 * @return string | |
81 */ | |
82 protected function getNamespaceAndClass($tokens) | |
83 { | |
84 $class = ''; | |
85 while (self::hasToken( | |
86 [self::T_NS_SEPARATOR, self::T_STRING], | |
87 $token = array_pop($tokens) | |
88 )) { | |
89 $class = $token[1] . $class; | |
90 } | |
91 | |
92 return $class; | |
93 } | |
94 | |
95 /** | |
96 * Provide tab completion matches for readline input. | |
97 * | |
98 * @param array $tokens information substracted with get_token_all | |
99 * @param array $info readline_info object | |
100 * | |
101 * @return array The matches resulting from the query | |
102 */ | |
103 abstract public function getMatches(array $tokens, array $info = []); | |
104 | |
105 /** | |
106 * Check whether $word starts with $prefix. | |
107 * | |
108 * @param string $prefix | |
109 * @param string $word | |
110 * | |
111 * @return bool | |
112 */ | |
113 public static function startsWith($prefix, $word) | |
114 { | |
115 return preg_match(sprintf('#^%s#', $prefix), $word); | |
116 } | |
117 | |
118 /** | |
119 * Check whether $token matches a given syntax pattern. | |
120 * | |
121 * @param mixed $token A PHP token (see token_get_all) | |
122 * @param string $syntax A syntax pattern (default: variable pattern) | |
123 * | |
124 * @return bool | |
125 */ | |
126 public static function hasSyntax($token, $syntax = self::VAR_SYNTAX) | |
127 { | |
128 if (!is_array($token)) { | |
129 return false; | |
130 } | |
131 | |
132 $regexp = sprintf('#%s#', $syntax); | |
133 | |
134 return (bool) preg_match($regexp, $token[1]); | |
135 } | |
136 | |
137 /** | |
138 * Check whether $token type is $which. | |
139 * | |
140 * @param string $which A PHP token type | |
141 * @param mixed $token A PHP token (see token_get_all) | |
142 * | |
143 * @return bool | |
144 */ | |
145 public static function tokenIs($token, $which) | |
146 { | |
147 if (!is_array($token)) { | |
148 return false; | |
149 } | |
150 | |
151 return token_name($token[0]) === $which; | |
152 } | |
153 | |
154 /** | |
155 * Check whether $token is an operator. | |
156 * | |
157 * @param mixed $token A PHP token (see token_get_all) | |
158 * | |
159 * @return bool | |
160 */ | |
161 public static function isOperator($token) | |
162 { | |
163 if (!is_string($token)) { | |
164 return false; | |
165 } | |
166 | |
167 return strpos(self::MISC_OPERATORS, $token) !== false; | |
168 } | |
169 | |
170 /** | |
171 * Check whether $token type is present in $coll. | |
172 * | |
173 * @param array $coll A list of token types | |
174 * @param mixed $token A PHP token (see token_get_all) | |
175 * | |
176 * @return bool | |
177 */ | |
178 public static function hasToken(array $coll, $token) | |
179 { | |
180 if (!is_array($token)) { | |
181 return false; | |
182 } | |
183 | |
184 return in_array(token_name($token[0]), $coll); | |
185 } | |
186 } |