| <?php |
| |
| /* |
| * This file is part of Twig. |
| * |
| * (c) Fabien Potencier |
| * (c) Armin Ronacher |
| * |
| * For the full copyright and license information, please view the LICENSE |
| * file that was distributed with this source code. |
| */ |
| |
| namespace Twig; |
| |
| /** |
| * @author Fabien Potencier <fabien@symfony.com> |
| */ |
| final class Token |
| { |
| private $value; |
| private $type; |
| private $lineno; |
| |
| public const EOF_TYPE = -1; |
| public const TEXT_TYPE = 0; |
| public const BLOCK_START_TYPE = 1; |
| public const VAR_START_TYPE = 2; |
| public const BLOCK_END_TYPE = 3; |
| public const VAR_END_TYPE = 4; |
| public const NAME_TYPE = 5; |
| public const NUMBER_TYPE = 6; |
| public const STRING_TYPE = 7; |
| public const OPERATOR_TYPE = 8; |
| public const PUNCTUATION_TYPE = 9; |
| public const INTERPOLATION_START_TYPE = 10; |
| public const INTERPOLATION_END_TYPE = 11; |
| public const ARROW_TYPE = 12; |
| |
| public function __construct(int $type, $value, int $lineno) |
| { |
| $this->type = $type; |
| $this->value = $value; |
| $this->lineno = $lineno; |
| } |
| |
| public function __toString() |
| { |
| return sprintf('%s(%s)', self::typeToString($this->type, true), $this->value); |
| } |
| |
| /** |
| * Tests the current token for a type and/or a value. |
| * |
| * Parameters may be: |
| * * just type |
| * * type and value (or array of possible values) |
| * * just value (or array of possible values) (NAME_TYPE is used as type) |
| * |
| * @param array|string|int $type The type to test |
| * @param array|string|null $values The token value |
| */ |
| public function test($type, $values = null): bool |
| { |
| if (null === $values && !\is_int($type)) { |
| $values = $type; |
| $type = self::NAME_TYPE; |
| } |
| |
| return ($this->type === $type) && ( |
| null === $values || |
| (\is_array($values) && \in_array($this->value, $values)) || |
| $this->value == $values |
| ); |
| } |
| |
| public function getLine(): int |
| { |
| return $this->lineno; |
| } |
| |
| public function getType(): int |
| { |
| return $this->type; |
| } |
| |
| public function getValue() |
| { |
| return $this->value; |
| } |
| |
| public static function typeToString(int $type, bool $short = false): string |
| { |
| switch ($type) { |
| case self::EOF_TYPE: |
| $name = 'EOF_TYPE'; |
| break; |
| case self::TEXT_TYPE: |
| $name = 'TEXT_TYPE'; |
| break; |
| case self::BLOCK_START_TYPE: |
| $name = 'BLOCK_START_TYPE'; |
| break; |
| case self::VAR_START_TYPE: |
| $name = 'VAR_START_TYPE'; |
| break; |
| case self::BLOCK_END_TYPE: |
| $name = 'BLOCK_END_TYPE'; |
| break; |
| case self::VAR_END_TYPE: |
| $name = 'VAR_END_TYPE'; |
| break; |
| case self::NAME_TYPE: |
| $name = 'NAME_TYPE'; |
| break; |
| case self::NUMBER_TYPE: |
| $name = 'NUMBER_TYPE'; |
| break; |
| case self::STRING_TYPE: |
| $name = 'STRING_TYPE'; |
| break; |
| case self::OPERATOR_TYPE: |
| $name = 'OPERATOR_TYPE'; |
| break; |
| case self::PUNCTUATION_TYPE: |
| $name = 'PUNCTUATION_TYPE'; |
| break; |
| case self::INTERPOLATION_START_TYPE: |
| $name = 'INTERPOLATION_START_TYPE'; |
| break; |
| case self::INTERPOLATION_END_TYPE: |
| $name = 'INTERPOLATION_END_TYPE'; |
| break; |
| case self::ARROW_TYPE: |
| $name = 'ARROW_TYPE'; |
| break; |
| default: |
| throw new \LogicException(sprintf('Token of type "%s" does not exist.', $type)); |
| } |
| |
| return $short ? $name : 'Twig\Token::'.$name; |
| } |
| |
| public static function typeToEnglish(int $type): string |
| { |
| switch ($type) { |
| case self::EOF_TYPE: |
| return 'end of template'; |
| case self::TEXT_TYPE: |
| return 'text'; |
| case self::BLOCK_START_TYPE: |
| return 'begin of statement block'; |
| case self::VAR_START_TYPE: |
| return 'begin of print statement'; |
| case self::BLOCK_END_TYPE: |
| return 'end of statement block'; |
| case self::VAR_END_TYPE: |
| return 'end of print statement'; |
| case self::NAME_TYPE: |
| return 'name'; |
| case self::NUMBER_TYPE: |
| return 'number'; |
| case self::STRING_TYPE: |
| return 'string'; |
| case self::OPERATOR_TYPE: |
| return 'operator'; |
| case self::PUNCTUATION_TYPE: |
| return 'punctuation'; |
| case self::INTERPOLATION_START_TYPE: |
| return 'begin of string interpolation'; |
| case self::INTERPOLATION_END_TYPE: |
| return 'end of string interpolation'; |
| case self::ARROW_TYPE: |
| return 'arrow function'; |
| default: |
| throw new \LogicException(sprintf('Token of type "%s" does not exist.', $type)); |
| } |
| } |
| } |