1*04fd306cSNickeau<?php 2*04fd306cSNickeau 3*04fd306cSNickeau/* 4*04fd306cSNickeau * This file is part of the Symfony package. 5*04fd306cSNickeau * 6*04fd306cSNickeau * (c) Fabien Potencier <fabien@symfony.com> 7*04fd306cSNickeau * 8*04fd306cSNickeau * For the full copyright and license information, please view the LICENSE 9*04fd306cSNickeau * file that was distributed with this source code. 10*04fd306cSNickeau */ 11*04fd306cSNickeau 12*04fd306cSNickeaunamespace Symfony\Polyfill\Php80; 13*04fd306cSNickeau 14*04fd306cSNickeau/** 15*04fd306cSNickeau * @author Fedonyuk Anton <info@ensostudio.ru> 16*04fd306cSNickeau * 17*04fd306cSNickeau * @internal 18*04fd306cSNickeau */ 19*04fd306cSNickeauclass PhpToken implements \Stringable 20*04fd306cSNickeau{ 21*04fd306cSNickeau /** 22*04fd306cSNickeau * @var int 23*04fd306cSNickeau */ 24*04fd306cSNickeau public $id; 25*04fd306cSNickeau 26*04fd306cSNickeau /** 27*04fd306cSNickeau * @var string 28*04fd306cSNickeau */ 29*04fd306cSNickeau public $text; 30*04fd306cSNickeau 31*04fd306cSNickeau /** 32*04fd306cSNickeau * @var int 33*04fd306cSNickeau */ 34*04fd306cSNickeau public $line; 35*04fd306cSNickeau 36*04fd306cSNickeau /** 37*04fd306cSNickeau * @var int 38*04fd306cSNickeau */ 39*04fd306cSNickeau public $pos; 40*04fd306cSNickeau 41*04fd306cSNickeau public function __construct(int $id, string $text, int $line = -1, int $position = -1) 42*04fd306cSNickeau { 43*04fd306cSNickeau $this->id = $id; 44*04fd306cSNickeau $this->text = $text; 45*04fd306cSNickeau $this->line = $line; 46*04fd306cSNickeau $this->pos = $position; 47*04fd306cSNickeau } 48*04fd306cSNickeau 49*04fd306cSNickeau public function getTokenName(): ?string 50*04fd306cSNickeau { 51*04fd306cSNickeau if ('UNKNOWN' === $name = token_name($this->id)) { 52*04fd306cSNickeau $name = \strlen($this->text) > 1 || \ord($this->text) < 32 ? null : $this->text; 53*04fd306cSNickeau } 54*04fd306cSNickeau 55*04fd306cSNickeau return $name; 56*04fd306cSNickeau } 57*04fd306cSNickeau 58*04fd306cSNickeau /** 59*04fd306cSNickeau * @param int|string|array $kind 60*04fd306cSNickeau */ 61*04fd306cSNickeau public function is($kind): bool 62*04fd306cSNickeau { 63*04fd306cSNickeau foreach ((array) $kind as $value) { 64*04fd306cSNickeau if (\in_array($value, [$this->id, $this->text], true)) { 65*04fd306cSNickeau return true; 66*04fd306cSNickeau } 67*04fd306cSNickeau } 68*04fd306cSNickeau 69*04fd306cSNickeau return false; 70*04fd306cSNickeau } 71*04fd306cSNickeau 72*04fd306cSNickeau public function isIgnorable(): bool 73*04fd306cSNickeau { 74*04fd306cSNickeau return \in_array($this->id, [\T_WHITESPACE, \T_COMMENT, \T_DOC_COMMENT, \T_OPEN_TAG], true); 75*04fd306cSNickeau } 76*04fd306cSNickeau 77*04fd306cSNickeau public function __toString(): string 78*04fd306cSNickeau { 79*04fd306cSNickeau return (string) $this->text; 80*04fd306cSNickeau } 81*04fd306cSNickeau 82*04fd306cSNickeau /** 83*04fd306cSNickeau * @return static[] 84*04fd306cSNickeau */ 85*04fd306cSNickeau public static function tokenize(string $code, int $flags = 0): array 86*04fd306cSNickeau { 87*04fd306cSNickeau $line = 1; 88*04fd306cSNickeau $position = 0; 89*04fd306cSNickeau $tokens = token_get_all($code, $flags); 90*04fd306cSNickeau foreach ($tokens as $index => $token) { 91*04fd306cSNickeau if (\is_string($token)) { 92*04fd306cSNickeau $id = \ord($token); 93*04fd306cSNickeau $text = $token; 94*04fd306cSNickeau } else { 95*04fd306cSNickeau [$id, $text, $line] = $token; 96*04fd306cSNickeau } 97*04fd306cSNickeau $tokens[$index] = new static($id, $text, $line, $position); 98*04fd306cSNickeau $position += \strlen($text); 99*04fd306cSNickeau } 100*04fd306cSNickeau 101*04fd306cSNickeau return $tokens; 102*04fd306cSNickeau } 103*04fd306cSNickeau} 104