1<?php
2/**
3 * Stores weightings and groupings of tokens.
4 *
5 * @author    Greg Sherwood <gsherwood@squiz.net>
6 * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600)
7 * @license   https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence
8 */
9
10namespace PHP_CodeSniffer\Util;
11
12define('T_NONE', 'PHPCS_T_NONE');
13define('T_OPEN_CURLY_BRACKET', 'PHPCS_T_OPEN_CURLY_BRACKET');
14define('T_CLOSE_CURLY_BRACKET', 'PHPCS_T_CLOSE_CURLY_BRACKET');
15define('T_OPEN_SQUARE_BRACKET', 'PHPCS_T_OPEN_SQUARE_BRACKET');
16define('T_CLOSE_SQUARE_BRACKET', 'PHPCS_T_CLOSE_SQUARE_BRACKET');
17define('T_OPEN_PARENTHESIS', 'PHPCS_T_OPEN_PARENTHESIS');
18define('T_CLOSE_PARENTHESIS', 'PHPCS_T_CLOSE_PARENTHESIS');
19define('T_COLON', 'PHPCS_T_COLON');
20define('T_NULLABLE', 'PHPCS_T_NULLABLE');
21define('T_STRING_CONCAT', 'PHPCS_T_STRING_CONCAT');
22define('T_INLINE_THEN', 'PHPCS_T_INLINE_THEN');
23define('T_INLINE_ELSE', 'PHPCS_T_INLINE_ELSE');
24define('T_NULL', 'PHPCS_T_NULL');
25define('T_FALSE', 'PHPCS_T_FALSE');
26define('T_TRUE', 'PHPCS_T_TRUE');
27define('T_SEMICOLON', 'PHPCS_T_SEMICOLON');
28define('T_EQUAL', 'PHPCS_T_EQUAL');
29define('T_MULTIPLY', 'PHPCS_T_MULTIPLY');
30define('T_DIVIDE', 'PHPCS_T_DIVIDE');
31define('T_PLUS', 'PHPCS_T_PLUS');
32define('T_MINUS', 'PHPCS_T_MINUS');
33define('T_MODULUS', 'PHPCS_T_MODULUS');
34define('T_BITWISE_AND', 'PHPCS_T_BITWISE_AND');
35define('T_BITWISE_OR', 'PHPCS_T_BITWISE_OR');
36define('T_BITWISE_XOR', 'PHPCS_T_BITWISE_XOR');
37define('T_BITWISE_NOT', 'PHPCS_T_BITWISE_NOT');
38define('T_ARRAY_HINT', 'PHPCS_T_ARRAY_HINT');
39define('T_GREATER_THAN', 'PHPCS_T_GREATER_THAN');
40define('T_LESS_THAN', 'PHPCS_T_LESS_THAN');
41define('T_BOOLEAN_NOT', 'PHPCS_T_BOOLEAN_NOT');
42define('T_SELF', 'PHPCS_T_SELF');
43define('T_PARENT', 'PHPCS_T_PARENT');
44define('T_DOUBLE_QUOTED_STRING', 'PHPCS_T_DOUBLE_QUOTED_STRING');
45define('T_COMMA', 'PHPCS_T_COMMA');
46define('T_HEREDOC', 'PHPCS_T_HEREDOC');
47define('T_PROTOTYPE', 'PHPCS_T_PROTOTYPE');
48define('T_THIS', 'PHPCS_T_THIS');
49define('T_REGULAR_EXPRESSION', 'PHPCS_T_REGULAR_EXPRESSION');
50define('T_PROPERTY', 'PHPCS_T_PROPERTY');
51define('T_LABEL', 'PHPCS_T_LABEL');
52define('T_OBJECT', 'PHPCS_T_OBJECT');
53define('T_CLOSE_OBJECT', 'PHPCS_T_CLOSE_OBJECT');
54define('T_COLOUR', 'PHPCS_T_COLOUR');
55define('T_HASH', 'PHPCS_T_HASH');
56define('T_URL', 'PHPCS_T_URL');
57define('T_STYLE', 'PHPCS_T_STYLE');
58define('T_ASPERAND', 'PHPCS_T_ASPERAND');
59define('T_DOLLAR', 'PHPCS_T_DOLLAR');
60define('T_TYPEOF', 'PHPCS_T_TYPEOF');
61define('T_CLOSURE', 'PHPCS_T_CLOSURE');
62define('T_ANON_CLASS', 'PHPCS_T_ANON_CLASS');
63define('T_BACKTICK', 'PHPCS_T_BACKTICK');
64define('T_START_NOWDOC', 'PHPCS_T_START_NOWDOC');
65define('T_NOWDOC', 'PHPCS_T_NOWDOC');
66define('T_END_NOWDOC', 'PHPCS_T_END_NOWDOC');
67define('T_OPEN_SHORT_ARRAY', 'PHPCS_T_OPEN_SHORT_ARRAY');
68define('T_CLOSE_SHORT_ARRAY', 'PHPCS_T_CLOSE_SHORT_ARRAY');
69define('T_GOTO_LABEL', 'PHPCS_T_GOTO_LABEL');
70define('T_BINARY_CAST', 'PHPCS_T_BINARY_CAST');
71define('T_EMBEDDED_PHP', 'PHPCS_T_EMBEDDED_PHP');
72define('T_RETURN_TYPE', 'PHPCS_T_RETURN_TYPE');
73define('T_OPEN_USE_GROUP', 'PHPCS_T_OPEN_USE_GROUP');
74define('T_CLOSE_USE_GROUP', 'PHPCS_T_CLOSE_USE_GROUP');
75define('T_ZSR', 'PHPCS_T_ZSR');
76define('T_ZSR_EQUAL', 'PHPCS_T_ZSR_EQUAL');
77define('T_FN_ARROW', 'PHPCS_T_FN_ARROW');
78define('T_TYPE_UNION', 'PHPCS_T_TYPE_UNION');
79define('T_PARAM_NAME', 'PHPCS_T_PARAM_NAME');
80define('T_MATCH_ARROW', 'PHPCS_T_MATCH_ARROW');
81define('T_MATCH_DEFAULT', 'PHPCS_T_MATCH_DEFAULT');
82define('T_ATTRIBUTE_END', 'PHPCS_T_ATTRIBUTE_END');
83
84// Some PHP 5.5 tokens, replicated for lower versions.
85if (defined('T_FINALLY') === false) {
86    define('T_FINALLY', 'PHPCS_T_FINALLY');
87}
88
89if (defined('T_YIELD') === false) {
90    define('T_YIELD', 'PHPCS_T_YIELD');
91}
92
93// Some PHP 5.6 tokens, replicated for lower versions.
94if (defined('T_ELLIPSIS') === false) {
95    define('T_ELLIPSIS', 'PHPCS_T_ELLIPSIS');
96}
97
98if (defined('T_POW') === false) {
99    define('T_POW', 'PHPCS_T_POW');
100}
101
102if (defined('T_POW_EQUAL') === false) {
103    define('T_POW_EQUAL', 'PHPCS_T_POW_EQUAL');
104}
105
106// Some PHP 7 tokens, replicated for lower versions.
107if (defined('T_SPACESHIP') === false) {
108    define('T_SPACESHIP', 'PHPCS_T_SPACESHIP');
109}
110
111if (defined('T_COALESCE') === false) {
112    define('T_COALESCE', 'PHPCS_T_COALESCE');
113}
114
115if (defined('T_COALESCE_EQUAL') === false) {
116    define('T_COALESCE_EQUAL', 'PHPCS_T_COALESCE_EQUAL');
117}
118
119if (defined('T_YIELD_FROM') === false) {
120    define('T_YIELD_FROM', 'PHPCS_T_YIELD_FROM');
121}
122
123// Some PHP 7.4 tokens, replicated for lower versions.
124if (defined('T_BAD_CHARACTER') === false) {
125    define('T_BAD_CHARACTER', 'PHPCS_T_BAD_CHARACTER');
126}
127
128if (defined('T_FN') === false) {
129    define('T_FN', 'PHPCS_T_FN');
130}
131
132// Some PHP 8.0 tokens, replicated for lower versions.
133if (defined('T_NULLSAFE_OBJECT_OPERATOR') === false) {
134    define('T_NULLSAFE_OBJECT_OPERATOR', 'PHPCS_T_NULLSAFE_OBJECT_OPERATOR');
135}
136
137if (defined('T_NAME_QUALIFIED') === false) {
138    define('T_NAME_QUALIFIED', 'PHPCS_T_NAME_QUALIFIED');
139}
140
141if (defined('T_NAME_FULLY_QUALIFIED') === false) {
142    define('T_NAME_FULLY_QUALIFIED', 'PHPCS_T_NAME_FULLY_QUALIFIED');
143}
144
145if (defined('T_NAME_RELATIVE') === false) {
146    define('T_NAME_RELATIVE', 'PHPCS_T_NAME_RELATIVE');
147}
148
149if (defined('T_MATCH') === false) {
150    define('T_MATCH', 'PHPCS_T_MATCH');
151}
152
153if (defined('T_ATTRIBUTE') === false) {
154    define('T_ATTRIBUTE', 'PHPCS_T_ATTRIBUTE');
155}
156
157// Some PHP 8.1 tokens, replicated for lower versions.
158if (defined('T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG') === false) {
159    define('T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG', 'PHPCS_T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG');
160}
161
162if (defined('T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG') === false) {
163    define('T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG', 'PHPCS_T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG');
164}
165
166// Tokens used for parsing doc blocks.
167define('T_DOC_COMMENT_STAR', 'PHPCS_T_DOC_COMMENT_STAR');
168define('T_DOC_COMMENT_WHITESPACE', 'PHPCS_T_DOC_COMMENT_WHITESPACE');
169define('T_DOC_COMMENT_TAG', 'PHPCS_T_DOC_COMMENT_TAG');
170define('T_DOC_COMMENT_OPEN_TAG', 'PHPCS_T_DOC_COMMENT_OPEN_TAG');
171define('T_DOC_COMMENT_CLOSE_TAG', 'PHPCS_T_DOC_COMMENT_CLOSE_TAG');
172define('T_DOC_COMMENT_STRING', 'PHPCS_T_DOC_COMMENT_STRING');
173
174// Tokens used for PHPCS instruction comments.
175define('T_PHPCS_ENABLE', 'PHPCS_T_PHPCS_ENABLE');
176define('T_PHPCS_DISABLE', 'PHPCS_T_PHPCS_DISABLE');
177define('T_PHPCS_SET', 'PHPCS_T_PHPCS_SET');
178define('T_PHPCS_IGNORE', 'PHPCS_T_PHPCS_IGNORE');
179define('T_PHPCS_IGNORE_FILE', 'PHPCS_T_PHPCS_IGNORE_FILE');
180
181final class Tokens
182{
183
184    /**
185     * The token weightings.
186     *
187     * @var array<int|string, int>
188     */
189    public static $weightings = [
190        T_CLASS               => 1000,
191        T_INTERFACE           => 1000,
192        T_TRAIT               => 1000,
193        T_NAMESPACE           => 1000,
194        T_FUNCTION            => 100,
195        T_CLOSURE             => 100,
196
197        /*
198         * Conditions.
199         */
200
201        T_WHILE               => 50,
202        T_FOR                 => 50,
203        T_FOREACH             => 50,
204        T_IF                  => 50,
205        T_ELSE                => 50,
206        T_ELSEIF              => 50,
207        T_DO                  => 50,
208        T_TRY                 => 50,
209        T_CATCH               => 50,
210        T_FINALLY             => 50,
211        T_SWITCH              => 50,
212        T_MATCH               => 50,
213
214        T_SELF                => 25,
215        T_PARENT              => 25,
216
217        /*
218         * Operators and arithmetic.
219         */
220
221        T_BITWISE_AND         => 8,
222        T_BITWISE_OR          => 8,
223        T_BITWISE_XOR         => 8,
224
225        T_MULTIPLY            => 5,
226        T_DIVIDE              => 5,
227        T_PLUS                => 5,
228        T_MINUS               => 5,
229        T_MODULUS             => 5,
230        T_POW                 => 5,
231        T_SPACESHIP           => 5,
232        T_COALESCE            => 5,
233        T_COALESCE_EQUAL      => 5,
234
235        T_SL                  => 5,
236        T_SR                  => 5,
237        T_SL_EQUAL            => 5,
238        T_SR_EQUAL            => 5,
239
240        T_EQUAL               => 5,
241        T_AND_EQUAL           => 5,
242        T_CONCAT_EQUAL        => 5,
243        T_DIV_EQUAL           => 5,
244        T_MINUS_EQUAL         => 5,
245        T_MOD_EQUAL           => 5,
246        T_MUL_EQUAL           => 5,
247        T_OR_EQUAL            => 5,
248        T_PLUS_EQUAL          => 5,
249        T_XOR_EQUAL           => 5,
250
251        T_BOOLEAN_AND         => 5,
252        T_BOOLEAN_OR          => 5,
253
254        /*
255         * Equality.
256         */
257
258        T_IS_EQUAL            => 5,
259        T_IS_NOT_EQUAL        => 5,
260        T_IS_IDENTICAL        => 5,
261        T_IS_NOT_IDENTICAL    => 5,
262        T_IS_SMALLER_OR_EQUAL => 5,
263        T_IS_GREATER_OR_EQUAL => 5,
264    ];
265
266    /**
267     * Tokens that represent assignments.
268     *
269     * @var array<int|string, int|string>
270     */
271    public static $assignmentTokens = [
272        T_EQUAL          => T_EQUAL,
273        T_AND_EQUAL      => T_AND_EQUAL,
274        T_OR_EQUAL       => T_OR_EQUAL,
275        T_CONCAT_EQUAL   => T_CONCAT_EQUAL,
276        T_DIV_EQUAL      => T_DIV_EQUAL,
277        T_MINUS_EQUAL    => T_MINUS_EQUAL,
278        T_POW_EQUAL      => T_POW_EQUAL,
279        T_MOD_EQUAL      => T_MOD_EQUAL,
280        T_MUL_EQUAL      => T_MUL_EQUAL,
281        T_PLUS_EQUAL     => T_PLUS_EQUAL,
282        T_XOR_EQUAL      => T_XOR_EQUAL,
283        T_DOUBLE_ARROW   => T_DOUBLE_ARROW,
284        T_SL_EQUAL       => T_SL_EQUAL,
285        T_SR_EQUAL       => T_SR_EQUAL,
286        T_COALESCE_EQUAL => T_COALESCE_EQUAL,
287        T_ZSR_EQUAL      => T_ZSR_EQUAL,
288    ];
289
290    /**
291     * Tokens that represent equality comparisons.
292     *
293     * @var array<int|string, int|string>
294     */
295    public static $equalityTokens = [
296        T_IS_EQUAL            => T_IS_EQUAL,
297        T_IS_NOT_EQUAL        => T_IS_NOT_EQUAL,
298        T_IS_IDENTICAL        => T_IS_IDENTICAL,
299        T_IS_NOT_IDENTICAL    => T_IS_NOT_IDENTICAL,
300        T_IS_SMALLER_OR_EQUAL => T_IS_SMALLER_OR_EQUAL,
301        T_IS_GREATER_OR_EQUAL => T_IS_GREATER_OR_EQUAL,
302    ];
303
304    /**
305     * Tokens that represent comparison operator.
306     *
307     * @var array<int|string, int|string>
308     */
309    public static $comparisonTokens = [
310        T_IS_EQUAL            => T_IS_EQUAL,
311        T_IS_IDENTICAL        => T_IS_IDENTICAL,
312        T_IS_NOT_EQUAL        => T_IS_NOT_EQUAL,
313        T_IS_NOT_IDENTICAL    => T_IS_NOT_IDENTICAL,
314        T_LESS_THAN           => T_LESS_THAN,
315        T_GREATER_THAN        => T_GREATER_THAN,
316        T_IS_SMALLER_OR_EQUAL => T_IS_SMALLER_OR_EQUAL,
317        T_IS_GREATER_OR_EQUAL => T_IS_GREATER_OR_EQUAL,
318        T_SPACESHIP           => T_SPACESHIP,
319        T_COALESCE            => T_COALESCE,
320    ];
321
322    /**
323     * Tokens that represent arithmetic operators.
324     *
325     * @var array<int|string, int|string>
326     */
327    public static $arithmeticTokens = [
328        T_PLUS     => T_PLUS,
329        T_MINUS    => T_MINUS,
330        T_MULTIPLY => T_MULTIPLY,
331        T_DIVIDE   => T_DIVIDE,
332        T_MODULUS  => T_MODULUS,
333        T_POW      => T_POW,
334    ];
335
336    /**
337     * Tokens that perform operations.
338     *
339     * @var array<int|string, int|string>
340     */
341    public static $operators = [
342        T_MINUS       => T_MINUS,
343        T_PLUS        => T_PLUS,
344        T_MULTIPLY    => T_MULTIPLY,
345        T_DIVIDE      => T_DIVIDE,
346        T_MODULUS     => T_MODULUS,
347        T_POW         => T_POW,
348        T_SPACESHIP   => T_SPACESHIP,
349        T_COALESCE    => T_COALESCE,
350        T_BITWISE_AND => T_BITWISE_AND,
351        T_BITWISE_OR  => T_BITWISE_OR,
352        T_BITWISE_XOR => T_BITWISE_XOR,
353        T_SL          => T_SL,
354        T_SR          => T_SR,
355    ];
356
357    /**
358     * Tokens that perform boolean operations.
359     *
360     * @var array<int|string, int|string>
361     */
362    public static $booleanOperators = [
363        T_BOOLEAN_AND => T_BOOLEAN_AND,
364        T_BOOLEAN_OR  => T_BOOLEAN_OR,
365        T_LOGICAL_AND => T_LOGICAL_AND,
366        T_LOGICAL_OR  => T_LOGICAL_OR,
367        T_LOGICAL_XOR => T_LOGICAL_XOR,
368    ];
369
370    /**
371     * Tokens that represent casting.
372     *
373     * @var array<int|string, int|string>
374     */
375    public static $castTokens = [
376        T_INT_CAST    => T_INT_CAST,
377        T_STRING_CAST => T_STRING_CAST,
378        T_DOUBLE_CAST => T_DOUBLE_CAST,
379        T_ARRAY_CAST  => T_ARRAY_CAST,
380        T_BOOL_CAST   => T_BOOL_CAST,
381        T_OBJECT_CAST => T_OBJECT_CAST,
382        T_UNSET_CAST  => T_UNSET_CAST,
383        T_BINARY_CAST => T_BINARY_CAST,
384    ];
385
386    /**
387     * Token types that open parenthesis.
388     *
389     * @var array<int|string, int|string>
390     */
391    public static $parenthesisOpeners = [
392        T_ARRAY      => T_ARRAY,
393        T_LIST       => T_LIST,
394        T_FUNCTION   => T_FUNCTION,
395        T_CLOSURE    => T_CLOSURE,
396        T_ANON_CLASS => T_ANON_CLASS,
397        T_WHILE      => T_WHILE,
398        T_FOR        => T_FOR,
399        T_FOREACH    => T_FOREACH,
400        T_SWITCH     => T_SWITCH,
401        T_IF         => T_IF,
402        T_ELSEIF     => T_ELSEIF,
403        T_CATCH      => T_CATCH,
404        T_DECLARE    => T_DECLARE,
405        T_MATCH      => T_MATCH,
406    ];
407
408    /**
409     * Tokens that are allowed to open scopes.
410     *
411     * @var array<int|string, int|string>
412     */
413    public static $scopeOpeners = [
414        T_CLASS      => T_CLASS,
415        T_ANON_CLASS => T_ANON_CLASS,
416        T_INTERFACE  => T_INTERFACE,
417        T_TRAIT      => T_TRAIT,
418        T_NAMESPACE  => T_NAMESPACE,
419        T_FUNCTION   => T_FUNCTION,
420        T_CLOSURE    => T_CLOSURE,
421        T_IF         => T_IF,
422        T_SWITCH     => T_SWITCH,
423        T_CASE       => T_CASE,
424        T_DECLARE    => T_DECLARE,
425        T_DEFAULT    => T_DEFAULT,
426        T_WHILE      => T_WHILE,
427        T_ELSE       => T_ELSE,
428        T_ELSEIF     => T_ELSEIF,
429        T_FOR        => T_FOR,
430        T_FOREACH    => T_FOREACH,
431        T_DO         => T_DO,
432        T_TRY        => T_TRY,
433        T_CATCH      => T_CATCH,
434        T_FINALLY    => T_FINALLY,
435        T_PROPERTY   => T_PROPERTY,
436        T_OBJECT     => T_OBJECT,
437        T_USE        => T_USE,
438        T_MATCH      => T_MATCH,
439    ];
440
441    /**
442     * Tokens that represent scope modifiers.
443     *
444     * @var array<int|string, int|string>
445     */
446    public static $scopeModifiers = [
447        T_PRIVATE   => T_PRIVATE,
448        T_PUBLIC    => T_PUBLIC,
449        T_PROTECTED => T_PROTECTED,
450    ];
451
452    /**
453     * Tokens that can prefix a method name
454     *
455     * @var array<int|string, int|string>
456     */
457    public static $methodPrefixes = [
458        T_PRIVATE   => T_PRIVATE,
459        T_PUBLIC    => T_PUBLIC,
460        T_PROTECTED => T_PROTECTED,
461        T_ABSTRACT  => T_ABSTRACT,
462        T_STATIC    => T_STATIC,
463        T_FINAL     => T_FINAL,
464    ];
465
466    /**
467     * Tokens that open code blocks.
468     *
469     * @var array<int|string, int|string>
470     */
471    public static $blockOpeners = [
472        T_OPEN_CURLY_BRACKET  => T_OPEN_CURLY_BRACKET,
473        T_OPEN_SQUARE_BRACKET => T_OPEN_SQUARE_BRACKET,
474        T_OPEN_PARENTHESIS    => T_OPEN_PARENTHESIS,
475        T_OBJECT              => T_OBJECT,
476    ];
477
478    /**
479     * Tokens that don't represent code.
480     *
481     * @var array<int|string, int|string>
482     */
483    public static $emptyTokens = [
484        T_WHITESPACE             => T_WHITESPACE,
485        T_COMMENT                => T_COMMENT,
486        T_DOC_COMMENT            => T_DOC_COMMENT,
487        T_DOC_COMMENT_STAR       => T_DOC_COMMENT_STAR,
488        T_DOC_COMMENT_WHITESPACE => T_DOC_COMMENT_WHITESPACE,
489        T_DOC_COMMENT_TAG        => T_DOC_COMMENT_TAG,
490        T_DOC_COMMENT_OPEN_TAG   => T_DOC_COMMENT_OPEN_TAG,
491        T_DOC_COMMENT_CLOSE_TAG  => T_DOC_COMMENT_CLOSE_TAG,
492        T_DOC_COMMENT_STRING     => T_DOC_COMMENT_STRING,
493        T_PHPCS_ENABLE           => T_PHPCS_ENABLE,
494        T_PHPCS_DISABLE          => T_PHPCS_DISABLE,
495        T_PHPCS_SET              => T_PHPCS_SET,
496        T_PHPCS_IGNORE           => T_PHPCS_IGNORE,
497        T_PHPCS_IGNORE_FILE      => T_PHPCS_IGNORE_FILE,
498    ];
499
500    /**
501     * Tokens that are comments.
502     *
503     * @var array<int|string, int|string>
504     */
505    public static $commentTokens = [
506        T_COMMENT                => T_COMMENT,
507        T_DOC_COMMENT            => T_DOC_COMMENT,
508        T_DOC_COMMENT_STAR       => T_DOC_COMMENT_STAR,
509        T_DOC_COMMENT_WHITESPACE => T_DOC_COMMENT_WHITESPACE,
510        T_DOC_COMMENT_TAG        => T_DOC_COMMENT_TAG,
511        T_DOC_COMMENT_OPEN_TAG   => T_DOC_COMMENT_OPEN_TAG,
512        T_DOC_COMMENT_CLOSE_TAG  => T_DOC_COMMENT_CLOSE_TAG,
513        T_DOC_COMMENT_STRING     => T_DOC_COMMENT_STRING,
514        T_PHPCS_ENABLE           => T_PHPCS_ENABLE,
515        T_PHPCS_DISABLE          => T_PHPCS_DISABLE,
516        T_PHPCS_SET              => T_PHPCS_SET,
517        T_PHPCS_IGNORE           => T_PHPCS_IGNORE,
518        T_PHPCS_IGNORE_FILE      => T_PHPCS_IGNORE_FILE,
519    ];
520
521    /**
522     * Tokens that are comments containing PHPCS instructions.
523     *
524     * @var array<int|string, int|string>
525     */
526    public static $phpcsCommentTokens = [
527        T_PHPCS_ENABLE      => T_PHPCS_ENABLE,
528        T_PHPCS_DISABLE     => T_PHPCS_DISABLE,
529        T_PHPCS_SET         => T_PHPCS_SET,
530        T_PHPCS_IGNORE      => T_PHPCS_IGNORE,
531        T_PHPCS_IGNORE_FILE => T_PHPCS_IGNORE_FILE,
532    ];
533
534    /**
535     * Tokens that represent strings.
536     *
537     * Note that T_STRINGS are NOT represented in this list.
538     *
539     * @var array<int|string, int|string>
540     */
541    public static $stringTokens = [
542        T_CONSTANT_ENCAPSED_STRING => T_CONSTANT_ENCAPSED_STRING,
543        T_DOUBLE_QUOTED_STRING     => T_DOUBLE_QUOTED_STRING,
544    ];
545
546    /**
547     * Tokens that represent text strings.
548     *
549     * @var array<int|string, int|string>
550     */
551    public static $textStringTokens = [
552        T_CONSTANT_ENCAPSED_STRING => T_CONSTANT_ENCAPSED_STRING,
553        T_DOUBLE_QUOTED_STRING     => T_DOUBLE_QUOTED_STRING,
554        T_INLINE_HTML              => T_INLINE_HTML,
555        T_HEREDOC                  => T_HEREDOC,
556        T_NOWDOC                   => T_NOWDOC,
557    ];
558
559    /**
560     * Tokens that represent brackets and parenthesis.
561     *
562     * @var array<int|string, int|string>
563     */
564    public static $bracketTokens = [
565        T_OPEN_CURLY_BRACKET   => T_OPEN_CURLY_BRACKET,
566        T_CLOSE_CURLY_BRACKET  => T_CLOSE_CURLY_BRACKET,
567        T_OPEN_SQUARE_BRACKET  => T_OPEN_SQUARE_BRACKET,
568        T_CLOSE_SQUARE_BRACKET => T_CLOSE_SQUARE_BRACKET,
569        T_OPEN_PARENTHESIS     => T_OPEN_PARENTHESIS,
570        T_CLOSE_PARENTHESIS    => T_CLOSE_PARENTHESIS,
571    ];
572
573    /**
574     * Tokens that include files.
575     *
576     * @var array<int|string, int|string>
577     */
578    public static $includeTokens = [
579        T_REQUIRE_ONCE => T_REQUIRE_ONCE,
580        T_REQUIRE      => T_REQUIRE,
581        T_INCLUDE_ONCE => T_INCLUDE_ONCE,
582        T_INCLUDE      => T_INCLUDE,
583    ];
584
585    /**
586     * Tokens that make up a heredoc string.
587     *
588     * @var array<int|string, int|string>
589     */
590    public static $heredocTokens = [
591        T_START_HEREDOC => T_START_HEREDOC,
592        T_END_HEREDOC   => T_END_HEREDOC,
593        T_HEREDOC       => T_HEREDOC,
594        T_START_NOWDOC  => T_START_NOWDOC,
595        T_END_NOWDOC    => T_END_NOWDOC,
596        T_NOWDOC        => T_NOWDOC,
597    ];
598
599    /**
600     * Tokens that represent the names of called functions.
601     *
602     * Mostly, these are just strings. But PHP tokenizes some language
603     * constructs and functions using their own tokens.
604     *
605     * @var array<int|string, int|string>
606     */
607    public static $functionNameTokens = [
608        T_STRING       => T_STRING,
609        T_EVAL         => T_EVAL,
610        T_EXIT         => T_EXIT,
611        T_INCLUDE      => T_INCLUDE,
612        T_INCLUDE_ONCE => T_INCLUDE_ONCE,
613        T_REQUIRE      => T_REQUIRE,
614        T_REQUIRE_ONCE => T_REQUIRE_ONCE,
615        T_ISSET        => T_ISSET,
616        T_UNSET        => T_UNSET,
617        T_EMPTY        => T_EMPTY,
618        T_SELF         => T_SELF,
619        T_STATIC       => T_STATIC,
620    ];
621
622    /**
623     * Tokens that open class and object scopes.
624     *
625     * @var array<int|string, int|string>
626     */
627    public static $ooScopeTokens = [
628        T_CLASS      => T_CLASS,
629        T_ANON_CLASS => T_ANON_CLASS,
630        T_INTERFACE  => T_INTERFACE,
631        T_TRAIT      => T_TRAIT,
632    ];
633
634    /**
635     * Tokens representing PHP magic constants.
636     *
637     * @var array <int|string> => <int|string>
638     *
639     * @link https://www.php.net/language.constants.predefined PHP Manual on magic constants
640     */
641    public static $magicConstants = [
642        T_CLASS_C  => T_CLASS_C,
643        T_DIR      => T_DIR,
644        T_FILE     => T_FILE,
645        T_FUNC_C   => T_FUNC_C,
646        T_LINE     => T_LINE,
647        T_METHOD_C => T_METHOD_C,
648        T_NS_C     => T_NS_C,
649        T_TRAIT_C  => T_TRAIT_C,
650    ];
651
652
653    /**
654     * Given a token, returns the name of the token.
655     *
656     * If passed an integer, the token name is sourced from PHP's token_name()
657     * function. If passed a string, it is assumed to be a PHPCS-supplied token
658     * that begins with PHPCS_T_, so the name is sourced from the token value itself.
659     *
660     * @param int|string $token The token to get the name for.
661     *
662     * @return string
663     */
664    public static function tokenName($token)
665    {
666        if (is_string($token) === false) {
667            // PHP-supplied token name.
668            return token_name($token);
669        }
670
671        return substr($token, 6);
672
673    }//end tokenName()
674
675
676    /**
677     * Returns the highest weighted token type.
678     *
679     * Tokens are weighted by their approximate frequency of appearance in code
680     * - the less frequently they appear in the code, the higher the weighting.
681     * For example T_CLASS tokens appear very infrequently in a file, and
682     * therefore have a high weighting.
683     *
684     * Returns false if there are no weightings for any of the specified tokens.
685     *
686     * @param array<int|string> $tokens The token types to get the highest weighted
687     *                                  type for.
688     *
689     * @return int|false The highest weighted token.
690     */
691    public static function getHighestWeightedToken(array $tokens)
692    {
693        $highest     = -1;
694        $highestType = false;
695
696        $weights = self::$weightings;
697
698        foreach ($tokens as $token) {
699            if (isset($weights[$token]) === true) {
700                $weight = $weights[$token];
701            } else {
702                $weight = 0;
703            }
704
705            if ($weight > $highest) {
706                $highest     = $weight;
707                $highestType = $token;
708            }
709        }
710
711        return $highestType;
712
713    }//end getHighestWeightedToken()
714
715
716}//end class
717