xref: /plugin/combo/vendor/symfony/polyfill-php80/PhpToken.php (revision 04fd306c7c155fa133ebb3669986875d65988276)
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