• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

PHPCSStandards / PHP_CodeSniffer / 21049083710

15 Jan 2026 10:49PM UTC coverage: 78.836% (-0.07%) from 78.903%
21049083710

Pull #1292

github

web-flow
Merge 1b78d806d into 44c338e38
Pull Request #1292: Define polyfilled T_* constants from Tokenizer as int

3 of 24 new or added lines in 1 file covered. (12.5%)

6 existing lines in 1 file now uncovered.

19828 of 25151 relevant lines covered (78.84%)

98.87 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

43.24
/src/Util/Tokens.php
1
<?php
2
/**
3
 * Stores weightings and groupings of tokens.
4
 *
5
 * @author    Greg Sherwood <gsherwood@squiz.net>
6
 * @copyright 2006-2023 Squiz Pty Ltd (ABN 77 084 670 600)
7
 * @copyright 2023 PHPCSStandards and contributors
8
 * @license   https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence
9
 */
10

11
namespace PHP_CodeSniffer\Util;
12

13
// PHPCS native tokens.
14
define('T_NONE', 'PHPCS_T_NONE');
15
define('T_OPEN_CURLY_BRACKET', 'PHPCS_T_OPEN_CURLY_BRACKET');
16
define('T_CLOSE_CURLY_BRACKET', 'PHPCS_T_CLOSE_CURLY_BRACKET');
17
define('T_OPEN_SQUARE_BRACKET', 'PHPCS_T_OPEN_SQUARE_BRACKET');
18
define('T_CLOSE_SQUARE_BRACKET', 'PHPCS_T_CLOSE_SQUARE_BRACKET');
19
define('T_OPEN_PARENTHESIS', 'PHPCS_T_OPEN_PARENTHESIS');
20
define('T_CLOSE_PARENTHESIS', 'PHPCS_T_CLOSE_PARENTHESIS');
21
define('T_COLON', 'PHPCS_T_COLON');
22
define('T_NULLABLE', 'PHPCS_T_NULLABLE');
23
define('T_STRING_CONCAT', 'PHPCS_T_STRING_CONCAT');
24
define('T_INLINE_THEN', 'PHPCS_T_INLINE_THEN');
25
define('T_INLINE_ELSE', 'PHPCS_T_INLINE_ELSE');
26
define('T_NULL', 'PHPCS_T_NULL');
27
define('T_FALSE', 'PHPCS_T_FALSE');
28
define('T_TRUE', 'PHPCS_T_TRUE');
29
define('T_SEMICOLON', 'PHPCS_T_SEMICOLON');
30
define('T_EQUAL', 'PHPCS_T_EQUAL');
31
define('T_MULTIPLY', 'PHPCS_T_MULTIPLY');
32
define('T_DIVIDE', 'PHPCS_T_DIVIDE');
33
define('T_PLUS', 'PHPCS_T_PLUS');
34
define('T_MINUS', 'PHPCS_T_MINUS');
35
define('T_MODULUS', 'PHPCS_T_MODULUS');
36
define('T_BITWISE_AND', 'PHPCS_T_BITWISE_AND');
37
define('T_BITWISE_OR', 'PHPCS_T_BITWISE_OR');
38
define('T_BITWISE_XOR', 'PHPCS_T_BITWISE_XOR');
39
define('T_BITWISE_NOT', 'PHPCS_T_BITWISE_NOT');
40
define('T_GREATER_THAN', 'PHPCS_T_GREATER_THAN');
41
define('T_LESS_THAN', 'PHPCS_T_LESS_THAN');
42
define('T_BOOLEAN_NOT', 'PHPCS_T_BOOLEAN_NOT');
43
define('T_SELF', 'PHPCS_T_SELF');
44
define('T_PARENT', 'PHPCS_T_PARENT');
45
define('T_DOUBLE_QUOTED_STRING', 'PHPCS_T_DOUBLE_QUOTED_STRING');
46
define('T_COMMA', 'PHPCS_T_COMMA');
47
define('T_HEREDOC', 'PHPCS_T_HEREDOC');
48
define('T_ASPERAND', 'PHPCS_T_ASPERAND');
49
define('T_DOLLAR', 'PHPCS_T_DOLLAR');
50
define('T_CLOSURE', 'PHPCS_T_CLOSURE');
51
define('T_ANON_CLASS', 'PHPCS_T_ANON_CLASS');
52
define('T_BACKTICK', 'PHPCS_T_BACKTICK');
53
define('T_START_NOWDOC', 'PHPCS_T_START_NOWDOC');
54
define('T_NOWDOC', 'PHPCS_T_NOWDOC');
55
define('T_END_NOWDOC', 'PHPCS_T_END_NOWDOC');
56
define('T_OPEN_SHORT_ARRAY', 'PHPCS_T_OPEN_SHORT_ARRAY');
57
define('T_CLOSE_SHORT_ARRAY', 'PHPCS_T_CLOSE_SHORT_ARRAY');
58
define('T_GOTO_LABEL', 'PHPCS_T_GOTO_LABEL');
59
define('T_GOTO_COLON', 'PHPCS_T_GOTO_COLON');
60
define('T_BINARY_CAST', 'PHPCS_T_BINARY_CAST');
61
define('T_OPEN_USE_GROUP', 'PHPCS_T_OPEN_USE_GROUP');
62
define('T_CLOSE_USE_GROUP', 'PHPCS_T_CLOSE_USE_GROUP');
63
define('T_FN_ARROW', 'PHPCS_T_FN_ARROW');
64
define('T_TYPE_UNION', 'PHPCS_T_TYPE_UNION');
65
define('T_PARAM_NAME', 'PHPCS_T_PARAM_NAME');
66
define('T_MATCH_ARROW', 'PHPCS_T_MATCH_ARROW');
67
define('T_MATCH_DEFAULT', 'PHPCS_T_MATCH_DEFAULT');
68
define('T_ATTRIBUTE_END', 'PHPCS_T_ATTRIBUTE_END');
69
define('T_ENUM_CASE', 'PHPCS_T_ENUM_CASE');
70
define('T_TYPE_INTERSECTION', 'PHPCS_T_TYPE_INTERSECTION');
71
define('T_TYPE_OPEN_PARENTHESIS', 'PHPCS_T_TYPE_OPEN_PARENTHESIS');
72
define('T_TYPE_CLOSE_PARENTHESIS', 'PHPCS_T_TYPE_CLOSE_PARENTHESIS');
73

74
// Tokens used for parsing doc blocks.
75
define('T_DOC_COMMENT_STAR', 'PHPCS_T_DOC_COMMENT_STAR');
76
define('T_DOC_COMMENT_WHITESPACE', 'PHPCS_T_DOC_COMMENT_WHITESPACE');
77
define('T_DOC_COMMENT_TAG', 'PHPCS_T_DOC_COMMENT_TAG');
78
define('T_DOC_COMMENT_OPEN_TAG', 'PHPCS_T_DOC_COMMENT_OPEN_TAG');
79
define('T_DOC_COMMENT_CLOSE_TAG', 'PHPCS_T_DOC_COMMENT_CLOSE_TAG');
80
define('T_DOC_COMMENT_STRING', 'PHPCS_T_DOC_COMMENT_STRING');
81

82
// Tokens used for PHPCS instruction comments.
83
define('T_PHPCS_ENABLE', 'PHPCS_T_PHPCS_ENABLE');
84
define('T_PHPCS_DISABLE', 'PHPCS_T_PHPCS_DISABLE');
85
define('T_PHPCS_SET', 'PHPCS_T_PHPCS_SET');
86
define('T_PHPCS_IGNORE', 'PHPCS_T_PHPCS_IGNORE');
87
define('T_PHPCS_IGNORE_FILE', 'PHPCS_T_PHPCS_IGNORE_FILE');
88

89
Tokens::polyfillTokenizerConstants();
90

91
final class Tokens
92
{
93

94
    /**
95
     * Tokens that represent assignments.
96
     *
97
     * @var array<int|string, int|string>
98
     */
99
    public const ASSIGNMENT_TOKENS = [
100
        T_EQUAL          => T_EQUAL,
101
        T_AND_EQUAL      => T_AND_EQUAL,
102
        T_OR_EQUAL       => T_OR_EQUAL,
103
        T_CONCAT_EQUAL   => T_CONCAT_EQUAL,
104
        T_DIV_EQUAL      => T_DIV_EQUAL,
105
        T_MINUS_EQUAL    => T_MINUS_EQUAL,
106
        T_POW_EQUAL      => T_POW_EQUAL,
107
        T_MOD_EQUAL      => T_MOD_EQUAL,
108
        T_MUL_EQUAL      => T_MUL_EQUAL,
109
        T_PLUS_EQUAL     => T_PLUS_EQUAL,
110
        T_XOR_EQUAL      => T_XOR_EQUAL,
111
        T_DOUBLE_ARROW   => T_DOUBLE_ARROW,
112
        T_SL_EQUAL       => T_SL_EQUAL,
113
        T_SR_EQUAL       => T_SR_EQUAL,
114
        T_COALESCE_EQUAL => T_COALESCE_EQUAL,
115
    ];
116

117
    /**
118
     * Tokens that represent equality comparisons.
119
     *
120
     * @var array<int|string, int|string>
121
     */
122
    public const EQUALITY_TOKENS = [
123
        T_IS_EQUAL            => T_IS_EQUAL,
124
        T_IS_NOT_EQUAL        => T_IS_NOT_EQUAL,
125
        T_IS_IDENTICAL        => T_IS_IDENTICAL,
126
        T_IS_NOT_IDENTICAL    => T_IS_NOT_IDENTICAL,
127
        T_IS_SMALLER_OR_EQUAL => T_IS_SMALLER_OR_EQUAL,
128
        T_IS_GREATER_OR_EQUAL => T_IS_GREATER_OR_EQUAL,
129
    ];
130

131
    /**
132
     * Tokens that represent comparison operator.
133
     *
134
     * @var array<int|string, int|string>
135
     */
136
    public const COMPARISON_TOKENS = (self::EQUALITY_TOKENS + [
137
        T_LESS_THAN    => T_LESS_THAN,
138
        T_GREATER_THAN => T_GREATER_THAN,
139
        T_SPACESHIP    => T_SPACESHIP,
140
        T_COALESCE     => T_COALESCE,
141
    ]);
142

143
    /**
144
     * Tokens that represent arithmetic operators.
145
     *
146
     * @var array<int|string, int|string>
147
     */
148
    public const ARITHMETIC_TOKENS = [
149
        T_PLUS     => T_PLUS,
150
        T_MINUS    => T_MINUS,
151
        T_MULTIPLY => T_MULTIPLY,
152
        T_DIVIDE   => T_DIVIDE,
153
        T_MODULUS  => T_MODULUS,
154
        T_POW      => T_POW,
155
    ];
156

157
    /**
158
     * Tokens that perform operations.
159
     *
160
     * @var array<int|string, int|string>
161
     */
162
    public const OPERATORS = (self::ARITHMETIC_TOKENS + [
163
        T_SPACESHIP   => T_SPACESHIP,
164
        T_COALESCE    => T_COALESCE,
165
        T_BITWISE_AND => T_BITWISE_AND,
166
        T_BITWISE_OR  => T_BITWISE_OR,
167
        T_BITWISE_XOR => T_BITWISE_XOR,
168
        T_SL          => T_SL,
169
        T_SR          => T_SR,
170
    ]);
171

172
    /**
173
     * Tokens that perform boolean operations.
174
     *
175
     * @var array<int|string, int|string>
176
     */
177
    public const BOOLEAN_OPERATORS = [
178
        T_BOOLEAN_AND => T_BOOLEAN_AND,
179
        T_BOOLEAN_OR  => T_BOOLEAN_OR,
180
        T_LOGICAL_AND => T_LOGICAL_AND,
181
        T_LOGICAL_OR  => T_LOGICAL_OR,
182
        T_LOGICAL_XOR => T_LOGICAL_XOR,
183
    ];
184

185
    /**
186
     * Tokens that represent casting.
187
     *
188
     * @var array<int|string, int|string>
189
     */
190
    public const CAST_TOKENS = [
191
        T_INT_CAST    => T_INT_CAST,
192
        T_STRING_CAST => T_STRING_CAST,
193
        T_DOUBLE_CAST => T_DOUBLE_CAST,
194
        T_ARRAY_CAST  => T_ARRAY_CAST,
195
        T_BOOL_CAST   => T_BOOL_CAST,
196
        T_OBJECT_CAST => T_OBJECT_CAST,
197
        T_UNSET_CAST  => T_UNSET_CAST,
198
        T_BINARY_CAST => T_BINARY_CAST,
199
        T_VOID_CAST   => T_VOID_CAST,
200
    ];
201

202
    /**
203
     * Token types that open parenthesis.
204
     *
205
     * @var array<int|string, int|string>
206
     */
207
    public const PARENTHESIS_OPENERS = [
208
        T_ARRAY      => T_ARRAY,
209
        T_LIST       => T_LIST,
210
        T_FUNCTION   => T_FUNCTION,
211
        T_CLOSURE    => T_CLOSURE,
212
        T_USE        => T_USE,
213
        T_ANON_CLASS => T_ANON_CLASS,
214
        T_WHILE      => T_WHILE,
215
        T_FOR        => T_FOR,
216
        T_FOREACH    => T_FOREACH,
217
        T_SWITCH     => T_SWITCH,
218
        T_IF         => T_IF,
219
        T_ELSEIF     => T_ELSEIF,
220
        T_CATCH      => T_CATCH,
221
        T_DECLARE    => T_DECLARE,
222
        T_MATCH      => T_MATCH,
223
        T_ISSET      => T_ISSET,
224
        T_EMPTY      => T_EMPTY,
225
        T_UNSET      => T_UNSET,
226
        T_EVAL       => T_EVAL,
227
        T_EXIT       => T_EXIT,
228
    ];
229

230
    /**
231
     * Tokens that are allowed to open scopes.
232
     *
233
     * @var array<int|string, int|string>
234
     */
235
    public const SCOPE_OPENERS = [
236
        T_CLASS      => T_CLASS,
237
        T_ANON_CLASS => T_ANON_CLASS,
238
        T_INTERFACE  => T_INTERFACE,
239
        T_TRAIT      => T_TRAIT,
240
        T_ENUM       => T_ENUM,
241
        T_NAMESPACE  => T_NAMESPACE,
242
        T_FUNCTION   => T_FUNCTION,
243
        T_CLOSURE    => T_CLOSURE,
244
        T_IF         => T_IF,
245
        T_SWITCH     => T_SWITCH,
246
        T_CASE       => T_CASE,
247
        T_DECLARE    => T_DECLARE,
248
        T_DEFAULT    => T_DEFAULT,
249
        T_WHILE      => T_WHILE,
250
        T_ELSE       => T_ELSE,
251
        T_ELSEIF     => T_ELSEIF,
252
        T_FOR        => T_FOR,
253
        T_FOREACH    => T_FOREACH,
254
        T_DO         => T_DO,
255
        T_TRY        => T_TRY,
256
        T_CATCH      => T_CATCH,
257
        T_FINALLY    => T_FINALLY,
258
        T_USE        => T_USE,
259
        T_MATCH      => T_MATCH,
260
    ];
261

262
    /**
263
     * Tokens that represent scope modifiers.
264
     *
265
     * @var array<int|string, int|string>
266
     */
267
    public const SCOPE_MODIFIERS = [
268
        T_PRIVATE       => T_PRIVATE,
269
        T_PUBLIC        => T_PUBLIC,
270
        T_PROTECTED     => T_PROTECTED,
271
        T_PUBLIC_SET    => T_PUBLIC_SET,
272
        T_PROTECTED_SET => T_PROTECTED_SET,
273
        T_PRIVATE_SET   => T_PRIVATE_SET,
274
    ];
275

276
    /**
277
     * Tokens that can prefix a method name
278
     *
279
     * @var array<int|string, int|string>
280
     */
281
    public const METHOD_MODIFIERS = [
282
        T_PRIVATE   => T_PRIVATE,
283
        T_PUBLIC    => T_PUBLIC,
284
        T_PROTECTED => T_PROTECTED,
285
        T_ABSTRACT  => T_ABSTRACT,
286
        T_STATIC    => T_STATIC,
287
        T_FINAL     => T_FINAL,
288
    ];
289

290
    /**
291
     * Tokens that open code blocks.
292
     *
293
     * @var array<int|string, int|string>
294
     */
295
    public const BLOCK_OPENERS = [
296
        T_OPEN_CURLY_BRACKET  => T_OPEN_CURLY_BRACKET,
297
        T_OPEN_SQUARE_BRACKET => T_OPEN_SQUARE_BRACKET,
298
        T_OPEN_PARENTHESIS    => T_OPEN_PARENTHESIS,
299
    ];
300

301
    /**
302
     * Tokens that represent brackets and parenthesis.
303
     *
304
     * @var array<int|string, int|string>
305
     */
306
    public const BRACKET_TOKENS = (self::BLOCK_OPENERS + [
307
        T_CLOSE_CURLY_BRACKET  => T_CLOSE_CURLY_BRACKET,
308
        T_CLOSE_SQUARE_BRACKET => T_CLOSE_SQUARE_BRACKET,
309
        T_CLOSE_PARENTHESIS    => T_CLOSE_PARENTHESIS,
310
    ]);
311

312
    /**
313
     * Tokens that don't represent code.
314
     *
315
     * @var array<int|string, int|string>
316
     */
317
    public const EMPTY_TOKENS = (self::COMMENT_TOKENS + [T_WHITESPACE => T_WHITESPACE]);
318

319
    /**
320
     * Tokens that are comments.
321
     *
322
     * @var array<int|string, int|string>
323
     */
324
    public const COMMENT_TOKENS = (self::PHPCS_ANNOTATION_TOKENS + [
325
        T_COMMENT                => T_COMMENT,
326
        T_DOC_COMMENT            => T_DOC_COMMENT,
327
        T_DOC_COMMENT_STAR       => T_DOC_COMMENT_STAR,
328
        T_DOC_COMMENT_WHITESPACE => T_DOC_COMMENT_WHITESPACE,
329
        T_DOC_COMMENT_TAG        => T_DOC_COMMENT_TAG,
330
        T_DOC_COMMENT_OPEN_TAG   => T_DOC_COMMENT_OPEN_TAG,
331
        T_DOC_COMMENT_CLOSE_TAG  => T_DOC_COMMENT_CLOSE_TAG,
332
        T_DOC_COMMENT_STRING     => T_DOC_COMMENT_STRING,
333
    ]);
334

335
    /**
336
     * Tokens that are comments containing PHPCS instructions.
337
     *
338
     * @var array<int|string, int|string>
339
     */
340
    public const PHPCS_ANNOTATION_TOKENS = [
341
        T_PHPCS_ENABLE      => T_PHPCS_ENABLE,
342
        T_PHPCS_DISABLE     => T_PHPCS_DISABLE,
343
        T_PHPCS_SET         => T_PHPCS_SET,
344
        T_PHPCS_IGNORE      => T_PHPCS_IGNORE,
345
        T_PHPCS_IGNORE_FILE => T_PHPCS_IGNORE_FILE,
346
    ];
347

348
    /**
349
     * Tokens that represent strings.
350
     *
351
     * Note that T_STRINGS are NOT represented in this list.
352
     *
353
     * @var array<int|string, int|string>
354
     */
355
    public const STRING_TOKENS = [
356
        T_CONSTANT_ENCAPSED_STRING => T_CONSTANT_ENCAPSED_STRING,
357
        T_DOUBLE_QUOTED_STRING     => T_DOUBLE_QUOTED_STRING,
358
    ];
359

360
    /**
361
     * Tokens that represent text strings.
362
     *
363
     * @var array<int|string, int|string>
364
     */
365
    public const TEXT_STRING_TOKENS = (self::STRING_TOKENS + [
366
        T_INLINE_HTML => T_INLINE_HTML,
367
        T_HEREDOC     => T_HEREDOC,
368
        T_NOWDOC      => T_NOWDOC,
369
    ]);
370

371
    /**
372
     * Tokens that make up a heredoc string.
373
     *
374
     * @var array<int|string, int|string>
375
     */
376
    public const HEREDOC_TOKENS = [
377
        T_START_HEREDOC => T_START_HEREDOC,
378
        T_END_HEREDOC   => T_END_HEREDOC,
379
        T_HEREDOC       => T_HEREDOC,
380
        T_START_NOWDOC  => T_START_NOWDOC,
381
        T_END_NOWDOC    => T_END_NOWDOC,
382
        T_NOWDOC        => T_NOWDOC,
383
    ];
384

385
    /**
386
     * Tokens that include files.
387
     *
388
     * @var array<int|string, int|string>
389
     */
390
    public const INCLUDE_TOKENS = [
391
        T_REQUIRE_ONCE => T_REQUIRE_ONCE,
392
        T_REQUIRE      => T_REQUIRE,
393
        T_INCLUDE_ONCE => T_INCLUDE_ONCE,
394
        T_INCLUDE      => T_INCLUDE,
395
    ];
396

397
    /**
398
     * Tokens used for "names", be it namespace, OO, function or constant names.
399
     *
400
     * @var array<int|string, int|string>
401
     */
402
    public const NAME_TOKENS = [
403
        T_STRING               => T_STRING,
404
        T_NAME_QUALIFIED       => T_NAME_QUALIFIED,
405
        T_NAME_FULLY_QUALIFIED => T_NAME_FULLY_QUALIFIED,
406
        T_NAME_RELATIVE        => T_NAME_RELATIVE,
407
    ];
408

409
    /**
410
     * Tokens that represent the names of called functions.
411
     *
412
     * Mostly, these are just strings. But PHP tokenizes some language
413
     * constructs and functions using their own tokens.
414
     *
415
     * @var array<int|string, int|string>
416
     */
417
    public const FUNCTION_NAME_TOKENS = (self::INCLUDE_TOKENS + self::NAME_TOKENS + [
418
        T_EVAL       => T_EVAL,
419
        T_EXIT       => T_EXIT,
420
        T_ISSET      => T_ISSET,
421
        T_UNSET      => T_UNSET,
422
        T_EMPTY      => T_EMPTY,
423
        T_SELF       => T_SELF,
424
        T_PARENT     => T_PARENT,
425
        T_STATIC     => T_STATIC,
426
        T_ANON_CLASS => T_ANON_CLASS,
427
    ]);
428

429
    /**
430
     * Tokens that open class and object scopes.
431
     *
432
     * @var array<int|string, int|string>
433
     */
434
    public const OO_SCOPE_TOKENS = [
435
        T_CLASS      => T_CLASS,
436
        T_ANON_CLASS => T_ANON_CLASS,
437
        T_INTERFACE  => T_INTERFACE,
438
        T_TRAIT      => T_TRAIT,
439
        T_ENUM       => T_ENUM,
440
    ];
441

442
    /**
443
     * Tokens representing PHP magic constants.
444
     *
445
     * @var array <int|string> => <int|string>
446
     *
447
     * @link https://www.php.net/language.constants.predefined PHP Manual on magic constants
448
     */
449
    public const MAGIC_CONSTANTS = [
450
        T_CLASS_C  => T_CLASS_C,
451
        T_DIR      => T_DIR,
452
        T_FILE     => T_FILE,
453
        T_FUNC_C   => T_FUNC_C,
454
        T_LINE     => T_LINE,
455
        T_METHOD_C => T_METHOD_C,
456
        T_NS_C     => T_NS_C,
457
        T_TRAIT_C  => T_TRAIT_C,
458
    ];
459

460
    /**
461
     * Tokens representing context sensitive keywords in PHP.
462
     *
463
     * @var array<int|string, int|string>
464
     *
465
     * https://wiki.php.net/rfc/context_sensitive_lexer
466
     */
467
    public const CONTEXT_SENSITIVE_KEYWORDS = [
468
        T_ABSTRACT     => T_ABSTRACT,
469
        T_ARRAY        => T_ARRAY,
470
        T_AS           => T_AS,
471
        T_BREAK        => T_BREAK,
472
        T_CALLABLE     => T_CALLABLE,
473
        T_CASE         => T_CASE,
474
        T_CATCH        => T_CATCH,
475
        T_CLASS        => T_CLASS,
476
        T_CLONE        => T_CLONE,
477
        T_CONST        => T_CONST,
478
        T_CONTINUE     => T_CONTINUE,
479
        T_DECLARE      => T_DECLARE,
480
        T_DEFAULT      => T_DEFAULT,
481
        T_DO           => T_DO,
482
        T_ECHO         => T_ECHO,
483
        T_ELSE         => T_ELSE,
484
        T_ELSEIF       => T_ELSEIF,
485
        T_EMPTY        => T_EMPTY,
486
        T_ENDDECLARE   => T_ENDDECLARE,
487
        T_ENDFOR       => T_ENDFOR,
488
        T_ENDFOREACH   => T_ENDFOREACH,
489
        T_ENDIF        => T_ENDIF,
490
        T_ENDSWITCH    => T_ENDSWITCH,
491
        T_ENDWHILE     => T_ENDWHILE,
492
        T_ENUM         => T_ENUM,
493
        T_EVAL         => T_EVAL,
494
        T_EXIT         => T_EXIT,
495
        T_EXTENDS      => T_EXTENDS,
496
        T_FINAL        => T_FINAL,
497
        T_FINALLY      => T_FINALLY,
498
        T_FN           => T_FN,
499
        T_FOR          => T_FOR,
500
        T_FOREACH      => T_FOREACH,
501
        T_FUNCTION     => T_FUNCTION,
502
        T_GLOBAL       => T_GLOBAL,
503
        T_GOTO         => T_GOTO,
504
        T_IF           => T_IF,
505
        T_IMPLEMENTS   => T_IMPLEMENTS,
506
        T_INCLUDE      => T_INCLUDE,
507
        T_INCLUDE_ONCE => T_INCLUDE_ONCE,
508
        T_INSTANCEOF   => T_INSTANCEOF,
509
        T_INSTEADOF    => T_INSTEADOF,
510
        T_INTERFACE    => T_INTERFACE,
511
        T_ISSET        => T_ISSET,
512
        T_LIST         => T_LIST,
513
        T_LOGICAL_AND  => T_LOGICAL_AND,
514
        T_LOGICAL_OR   => T_LOGICAL_OR,
515
        T_LOGICAL_XOR  => T_LOGICAL_XOR,
516
        T_MATCH        => T_MATCH,
517
        T_NAMESPACE    => T_NAMESPACE,
518
        T_NEW          => T_NEW,
519
        T_PRINT        => T_PRINT,
520
        T_PRIVATE      => T_PRIVATE,
521
        T_PROTECTED    => T_PROTECTED,
522
        T_PUBLIC       => T_PUBLIC,
523
        T_READONLY     => T_READONLY,
524
        T_REQUIRE      => T_REQUIRE,
525
        T_REQUIRE_ONCE => T_REQUIRE_ONCE,
526
        T_RETURN       => T_RETURN,
527
        T_STATIC       => T_STATIC,
528
        T_SWITCH       => T_SWITCH,
529
        T_THROW        => T_THROW,
530
        T_TRAIT        => T_TRAIT,
531
        T_TRY          => T_TRY,
532
        T_UNSET        => T_UNSET,
533
        T_USE          => T_USE,
534
        T_VAR          => T_VAR,
535
        T_WHILE        => T_WHILE,
536
        T_YIELD        => T_YIELD,
537
        T_YIELD_FROM   => T_YIELD_FROM,
538
    ];
539

540
    /**
541
     * Mapping table for polyfilled constants.
542
     *
543
     * @var array<int, string>
544
     */
545
    private static $polyfillMappingTable = [];
546

547
    /**
548
     * The token weightings.
549
     *
550
     * @var array<int|string, int>
551
     */
552
    private const WEIGHTINGS = [
553
        T_CLASS               => 1000,
554
        T_INTERFACE           => 1000,
555
        T_TRAIT               => 1000,
556
        T_ENUM                => 1000,
557
        T_NAMESPACE           => 1000,
558
        T_FUNCTION            => 100,
559
        T_CLOSURE             => 100,
560

561
        /*
562
         * Conditions.
563
         */
564

565
        T_WHILE               => 50,
566
        T_FOR                 => 50,
567
        T_FOREACH             => 50,
568
        T_IF                  => 50,
569
        T_ELSE                => 50,
570
        T_ELSEIF              => 50,
571
        T_DO                  => 50,
572
        T_TRY                 => 50,
573
        T_CATCH               => 50,
574
        T_FINALLY             => 50,
575
        T_SWITCH              => 50,
576
        T_MATCH               => 50,
577

578
        T_SELF                => 25,
579
        T_PARENT              => 25,
580

581
        /*
582
         * Operators and arithmetic.
583
         */
584

585
        T_BITWISE_AND         => 8,
586
        T_BITWISE_OR          => 8,
587
        T_BITWISE_XOR         => 8,
588

589
        T_MULTIPLY            => 5,
590
        T_DIVIDE              => 5,
591
        T_PLUS                => 5,
592
        T_MINUS               => 5,
593
        T_MODULUS             => 5,
594
        T_POW                 => 5,
595
        T_SPACESHIP           => 5,
596
        T_COALESCE            => 5,
597
        T_COALESCE_EQUAL      => 5,
598

599
        T_SL                  => 5,
600
        T_SR                  => 5,
601
        T_SL_EQUAL            => 5,
602
        T_SR_EQUAL            => 5,
603

604
        T_EQUAL               => 5,
605
        T_AND_EQUAL           => 5,
606
        T_CONCAT_EQUAL        => 5,
607
        T_DIV_EQUAL           => 5,
608
        T_MINUS_EQUAL         => 5,
609
        T_MOD_EQUAL           => 5,
610
        T_MUL_EQUAL           => 5,
611
        T_OR_EQUAL            => 5,
612
        T_PLUS_EQUAL          => 5,
613
        T_XOR_EQUAL           => 5,
614

615
        T_BOOLEAN_AND         => 5,
616
        T_BOOLEAN_OR          => 5,
617

618
        /*
619
         * Equality.
620
         */
621

622
        T_IS_EQUAL            => 5,
623
        T_IS_NOT_EQUAL        => 5,
624
        T_IS_IDENTICAL        => 5,
625
        T_IS_NOT_IDENTICAL    => 5,
626
        T_IS_SMALLER_OR_EQUAL => 5,
627
        T_IS_GREATER_OR_EQUAL => 5,
628
    ];
629

630
    /**
631
     * The token weightings.
632
     *
633
     * @var array<int|string, int>
634
     *
635
     * @deprecated 4.0.0 Use the Tokens::getHighestWeightedToken() method instead.
636
     */
637
    public static $weightings = self::WEIGHTINGS;
638

639
    /**
640
     * Tokens that represent assignments.
641
     *
642
     * @var array<int|string, int|string>
643
     *
644
     * @deprecated 4.0.0 Use the Tokens::ASSIGNMENT_TOKENS constant instead.
645
     */
646
    public static $assignmentTokens = self::ASSIGNMENT_TOKENS;
647

648
    /**
649
     * Tokens that represent equality comparisons.
650
     *
651
     * @var array<int|string, int|string>
652
     *
653
     * @deprecated 4.0.0 Use the Tokens::EQUALITY_TOKENS constant instead.
654
     */
655
    public static $equalityTokens = self::EQUALITY_TOKENS;
656

657
    /**
658
     * Tokens that represent comparison operator.
659
     *
660
     * @var array<int|string, int|string>
661
     *
662
     * @deprecated 4.0.0 Use the Tokens::COMPARISON_TOKENS constant instead.
663
     */
664
    public static $comparisonTokens = self::COMPARISON_TOKENS;
665

666
    /**
667
     * Tokens that represent arithmetic operators.
668
     *
669
     * @var array<int|string, int|string>
670
     *
671
     * @deprecated 4.0.0 Use the Tokens::ARITHMETIC_TOKENS constant instead.
672
     */
673
    public static $arithmeticTokens = self::ARITHMETIC_TOKENS;
674

675
    /**
676
     * Tokens that perform operations.
677
     *
678
     * @var array<int|string, int|string>
679
     *
680
     * @deprecated 4.0.0 Use the Tokens::OPERATORS constant instead.
681
     */
682
    public static $operators = self::OPERATORS;
683

684
    /**
685
     * Tokens that perform boolean operations.
686
     *
687
     * @var array<int|string, int|string>
688
     *
689
     * @deprecated 4.0.0 Use the Tokens::BOOLEAN_OPERATORS constant instead.
690
     */
691
    public static $booleanOperators = self::BOOLEAN_OPERATORS;
692

693
    /**
694
     * Tokens that represent casting.
695
     *
696
     * @var array<int|string, int|string>
697
     *
698
     * @deprecated 4.0.0 Use the Tokens::CAST_TOKENS constant instead.
699
     */
700
    public static $castTokens = self::CAST_TOKENS;
701

702
    /**
703
     * Token types that open parenthesis.
704
     *
705
     * @var array<int|string, int|string>
706
     *
707
     * @deprecated 4.0.0 Use the Tokens::PARENTHESIS_OPENERS constant instead.
708
     */
709
    public static $parenthesisOpeners = self::PARENTHESIS_OPENERS;
710

711
    /**
712
     * Tokens that are allowed to open scopes.
713
     *
714
     * @var array<int|string, int|string>
715
     *
716
     * @deprecated 4.0.0 Use the Tokens::SCOPE_OPENERS constant instead.
717
     */
718
    public static $scopeOpeners = self::SCOPE_OPENERS;
719

720
    /**
721
     * Tokens that represent scope modifiers.
722
     *
723
     * @var array<int|string, int|string>
724
     *
725
     * @deprecated 4.0.0 Use the Tokens::SCOPE_MODIFIERS constant instead.
726
     */
727
    public static $scopeModifiers = self::SCOPE_MODIFIERS;
728

729
    /**
730
     * Tokens that can prefix a method name
731
     *
732
     * @var array<int|string, int|string>
733
     *
734
     * @deprecated 4.0.0 Use the Tokens::METHOD_MODIFIERS constant instead.
735
     */
736
    public static $methodPrefixes = self::METHOD_MODIFIERS;
737

738
    /**
739
     * Tokens that open code blocks.
740
     *
741
     * @var array<int|string, int|string>
742
     *
743
     * @deprecated 4.0.0 Use the Tokens::BLOCK_OPENERS constant instead.
744
     */
745
    public static $blockOpeners = self::BLOCK_OPENERS;
746

747
    /**
748
     * Tokens that don't represent code.
749
     *
750
     * @var array<int|string, int|string>
751
     *
752
     * @deprecated 4.0.0 Use the Tokens::EMPTY_TOKENS constant instead.
753
     */
754
    public static $emptyTokens = self::EMPTY_TOKENS;
755

756
    /**
757
     * Tokens that are comments.
758
     *
759
     * @var array<int|string, int|string>
760
     *
761
     * @deprecated 4.0.0 Use the Tokens::COMMENT_TOKENS constant instead.
762
     */
763
    public static $commentTokens = self::COMMENT_TOKENS;
764

765
    /**
766
     * Tokens that are comments containing PHPCS instructions.
767
     *
768
     * @var array<int|string, int|string>
769
     *
770
     * @deprecated 4.0.0 Use the Tokens::PHPCS_ANNOTATION_TOKENS constant instead.
771
     */
772
    public static $phpcsCommentTokens = self::PHPCS_ANNOTATION_TOKENS;
773

774
    /**
775
     * Tokens that represent strings.
776
     *
777
     * Note that T_STRINGS are NOT represented in this list.
778
     *
779
     * @var array<int|string, int|string>
780
     *
781
     * @deprecated 4.0.0 Use the Tokens::STRING_TOKENS constant instead.
782
     */
783
    public static $stringTokens = self::STRING_TOKENS;
784

785
    /**
786
     * Tokens that represent text strings.
787
     *
788
     * @var array<int|string, int|string>
789
     *
790
     * @deprecated 4.0.0 Use the Tokens::TEXT_STRINGS constant instead.
791
     */
792
    public static $textStringTokens = self::TEXT_STRING_TOKENS;
793

794
    /**
795
     * Tokens that represent brackets and parenthesis.
796
     *
797
     * @var array<int|string, int|string>
798
     *
799
     * @deprecated 4.0.0 Use the Tokens::BRACKET_TOKENS constant instead.
800
     */
801
    public static $bracketTokens = self::BRACKET_TOKENS;
802

803
    /**
804
     * Tokens that include files.
805
     *
806
     * @var array<int|string, int|string>
807
     *
808
     * @deprecated 4.0.0 Use the Tokens::INCLUDE_TOKENS constant instead.
809
     */
810
    public static $includeTokens = self::INCLUDE_TOKENS;
811

812
    /**
813
     * Tokens that make up a heredoc string.
814
     *
815
     * @var array<int|string, int|string>
816
     *
817
     * @deprecated 4.0.0 Use the Tokens::HEREDOC_TOKENS constant instead.
818
     */
819
    public static $heredocTokens = self::HEREDOC_TOKENS;
820

821
    /**
822
     * Tokens that represent the names of called functions.
823
     *
824
     * Mostly, these are just strings. But PHP tokenizes some language
825
     * constructs and functions using their own tokens.
826
     *
827
     * @var array<int|string, int|string>
828
     *
829
     * @deprecated 4.0.0 Use the Tokens::FUNCTION_NAME_TOKENS constant instead.
830
     */
831
    public static $functionNameTokens = self::FUNCTION_NAME_TOKENS;
832

833
    /**
834
     * Tokens that open class and object scopes.
835
     *
836
     * @var array<int|string, int|string>
837
     *
838
     * @deprecated 4.0.0 Use the Tokens::OO_SCOPE_TOKENS constant instead.
839
     */
840
    public static $ooScopeTokens = self::OO_SCOPE_TOKENS;
841

842
    /**
843
     * Tokens representing PHP magic constants.
844
     *
845
     * @var array <int|string> => <int|string>
846
     *
847
     * @link https://www.php.net/language.constants.predefined PHP Manual on magic constants
848
     *
849
     * @deprecated 4.0.0 Use the Tokens::MAGIC_CONSTANTS constant instead.
850
     */
851
    public static $magicConstants = self::MAGIC_CONSTANTS;
852

853
    /**
854
     * Tokens representing context sensitive keywords in PHP.
855
     *
856
     * @var array<int|string, int|string>
857
     *
858
     * @link https://wiki.php.net/rfc/context_sensitive_lexer
859
     *
860
     * @deprecated 4.0.0 Use the Tokens::CONTEXT_SENSITIVE_KEYWORDS constant instead.
861
     */
862
    public static $contextSensitiveKeywords = self::CONTEXT_SENSITIVE_KEYWORDS;
863

864

865
    /**
866
     * Given a token constant, returns the name of the token.
867
     *
868
     * If passed an integer, the token name is sourced from PHP's token_name()
869
     * function. If passed a string, it is assumed to be a PHPCS-supplied token
870
     * that begins with PHPCS_T_, so the name is sourced from the token value itself.
871
     *
872
     * @param int|string $token The token constant to get the name for.
873
     *
874
     * @return string
875
     */
876
    public static function tokenName($token)
69✔
877
    {
878
        if (is_string($token) === true) {
69✔
879
            // PHPCS native token.
880
            return substr($token, 6);
9✔
881
        }
882

883
        return (self::$polyfillMappingTable[$token] ?? token_name($token));
60✔
884
    }
885

886

887
    /**
888
     * Returns the highest weighted token type.
889
     *
890
     * Tokens are weighted by their approximate frequency of appearance in code
891
     * - the less frequently they appear in the code, the higher the weighting.
892
     * For example T_CLASS tokens appear very infrequently in a file, and
893
     * therefore have a high weighting.
894
     *
895
     * If there are no weightings for any of the specified tokens, the first token
896
     * seen in the passed array will be returned.
897
     *
898
     * @param array<int|string> $tokens The token types to get the highest weighted
899
     *                                  type for.
900
     *
901
     * @return int|string The highest weighted token.
902
     *                    On equal "weight", returns the first token of that particular weight.
903
     */
904
    public static function getHighestWeightedToken(array $tokens)
39✔
905
    {
906
        $highest     = -1;
39✔
907
        $highestType = false;
39✔
908

909
        $weights = self::WEIGHTINGS;
39✔
910

911
        foreach ($tokens as $token) {
39✔
912
            if (isset($weights[$token]) === true) {
39✔
913
                $weight = $weights[$token];
30✔
914
            } else {
915
                $weight = 0;
15✔
916
            }
917

918
            if ($weight > $highest) {
39✔
919
                $highest     = $weight;
39✔
920
                $highestType = $token;
39✔
921
            }
922
        }
923

924
        return $highestType;
39✔
925
    }
926

927

928
    /**
929
     * Polyfill tokenizer (T_*) constants.
930
     *
931
     * {@internal IMPORTANT: all PHP native polyfilled tokens MUST be added to the
932
     * `PHP_CodeSniffer\Tests\Core\Util\Tokens\TokenNameTest::dataPolyfilledPHPNativeTokens()` test method!}
933
     *
934
     * @return void
935
     */
NEW
936
    public static function polyfillTokenizerConstants(): void
×
937
    {
938
        // Ideally this would be a private class constant. We cannot do that
939
        // here as the constants that we are polyfilling in this method are
940
        // used in some of the class constants for this class. If we reference
941
        // any class constants or properties before this method has fully run,
942
        // PHP will intitialise the class, leading to warnings about undefined
943
        // T_* constants.
944
        $tokensToPolyfill = [
945
            // PHP 7.4 native tokens.
NEW
946
            'T_BAD_CHARACTER',
×
947
            'T_COALESCE_EQUAL',
948
            'T_FN',
949

950
            // PHP 8.0 native tokens.
951
            'T_ATTRIBUTE',
952
            'T_MATCH',
953
            'T_NAME_FULLY_QUALIFIED',
954
            'T_NAME_QUALIFIED',
955
            'T_NAME_RELATIVE',
956
            'T_NULLSAFE_OBJECT_OPERATOR',
957

958
            // PHP 8.1 native tokens.
959
            'T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG',
960
            'T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG',
961
            'T_ENUM',
962
            'T_READONLY',
963

964
            // PHP 8.4 native tokens.
965
            'T_PRIVATE_SET',
966
            'T_PROTECTED_SET',
967
            'T_PUBLIC_SET',
968

969
            // PHP 8.5 native tokens.
970
            'T_VOID_CAST',
971
        ];
972

973
        // <https://www.php.net/manual/en/tokens.php>
974
        // The PHP manual suggests "using big numbers like 10000" for
975
        // polyfilled T_* constants. We have arbitrarily chosen to start our
976
        // numbering scheme from 135_000.
NEW
977
        $nextTokenNumber = 135000;
×
978

979
        // This variable is necessary to avoid collisions with any other
980
        // libraries which also polyfill T_* constants.
981
        // array_flip()/isset() because in_array() is slow.
NEW
982
        $existingConstants = array_flip(get_defined_constants(true)['tokenizer']);
×
NEW
983
        foreach ((get_defined_constants(true)['user'] ?? []) as $k => $v) {
×
NEW
984
            if (isset($k[2]) === false || $k[0] !== 'T' || $k[1] !== '_') {
×
985
                // We only care about T_* constants.
NEW
986
                continue;
×
987
            }
988

NEW
989
            if (isset($existingConstants[$v]) === true) {
×
NEW
990
                throw new \Exception("Externally polyfilled tokenizer constant value collision detected! $k has the same value as {$existingConstants[$v]}");
×
991
            }
992

NEW
993
            $existingConstants[$v] = $k;
×
994
        }
995

NEW
996
        $polyfillMappingTable = [];
×
997

NEW
998
        foreach ($tokensToPolyfill as $tokenName) {
×
NEW
999
            if (isset(get_defined_constants(true)['tokenizer'][$tokenName]) === true) {
×
1000
                // This is a PHP native token, which is already defined by PHP.
NEW
1001
                continue;
×
1002
            }
1003

NEW
1004
            if (defined($tokenName) === false) {
×
NEW
1005
                while (isset($existingConstants[$nextTokenNumber]) === true) {
×
NEW
1006
                    $nextTokenNumber++;
×
1007
                }
1008

NEW
1009
                define($tokenName, $nextTokenNumber);
×
NEW
1010
                $existingConstants[$nextTokenNumber] = $tokenName;
×
1011
            }
1012

NEW
1013
            $polyfillMappingTable[constant($tokenName)] = $tokenName;
×
1014
        }
1015

1016
        // Be careful to not reference this class anywhere in this method until
1017
        // *after* all constants have been polyfilled.
NEW
1018
        self::$polyfillMappingTable = $polyfillMappingTable;
×
1019
    }
1020
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc