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