AST
9 months ago
Exec
9 months ago
Expr
9 months ago
Filter
9 months ago
Expr.php
9 months ago
FilterCollection.php
9 months ago
Lexer.php
9 months ago
OutputWalker.php
9 months ago
Parameter.php
9 months ago
ParameterTypeInferer.php
9 months ago
Parser.php
9 months ago
ParserResult.php
9 months ago
Printer.php
9 months ago
QueryException.php
9 months ago
QueryExpressionVisitor.php
9 months ago
ResultSetMapping.php
9 months ago
ResultSetMappingBuilder.php
9 months ago
SqlOutputWalker.php
9 months ago
SqlWalker.php
9 months ago
TokenType.php
9 months ago
TreeWalker.php
9 months ago
TreeWalkerAdapter.php
9 months ago
TreeWalkerChain.php
9 months ago
TreeWalkerChainIterator.php
9 months ago
index.php
9 months ago
Lexer.php
193 lines
| 1 | <?php |
| 2 | declare (strict_types=1); |
| 3 | namespace MailPoetVendor\Doctrine\ORM\Query; |
| 4 | if (!defined('ABSPATH')) exit; |
| 5 | use MailPoetVendor\Doctrine\Common\Lexer\AbstractLexer; |
| 6 | use MailPoetVendor\Doctrine\Deprecations\Deprecation; |
| 7 | use function constant; |
| 8 | use function ctype_alpha; |
| 9 | use function defined; |
| 10 | use function is_numeric; |
| 11 | use function str_contains; |
| 12 | use function str_replace; |
| 13 | use function stripos; |
| 14 | use function strlen; |
| 15 | use function strtoupper; |
| 16 | use function substr; |
| 17 | class Lexer extends AbstractLexer |
| 18 | { |
| 19 | // All tokens that are not valid identifiers must be < 100 |
| 20 | public const T_NONE = TokenType::T_NONE; |
| 21 | public const T_INTEGER = TokenType::T_INTEGER; |
| 22 | public const T_STRING = TokenType::T_STRING; |
| 23 | public const T_INPUT_PARAMETER = TokenType::T_INPUT_PARAMETER; |
| 24 | public const T_FLOAT = TokenType::T_FLOAT; |
| 25 | public const T_CLOSE_PARENTHESIS = TokenType::T_CLOSE_PARENTHESIS; |
| 26 | public const T_OPEN_PARENTHESIS = TokenType::T_OPEN_PARENTHESIS; |
| 27 | public const T_COMMA = TokenType::T_COMMA; |
| 28 | public const T_DIVIDE = TokenType::T_DIVIDE; |
| 29 | public const T_DOT = TokenType::T_DOT; |
| 30 | public const T_EQUALS = TokenType::T_EQUALS; |
| 31 | public const T_GREATER_THAN = TokenType::T_GREATER_THAN; |
| 32 | public const T_LOWER_THAN = TokenType::T_LOWER_THAN; |
| 33 | public const T_MINUS = TokenType::T_MINUS; |
| 34 | public const T_MULTIPLY = TokenType::T_MULTIPLY; |
| 35 | public const T_NEGATE = TokenType::T_NEGATE; |
| 36 | public const T_PLUS = TokenType::T_PLUS; |
| 37 | public const T_OPEN_CURLY_BRACE = TokenType::T_OPEN_CURLY_BRACE; |
| 38 | public const T_CLOSE_CURLY_BRACE = TokenType::T_CLOSE_CURLY_BRACE; |
| 39 | // All tokens that are identifiers or keywords that could be considered as identifiers should be >= 100 |
| 40 | public const T_ALIASED_NAME = TokenType::T_ALIASED_NAME; |
| 41 | public const T_FULLY_QUALIFIED_NAME = TokenType::T_FULLY_QUALIFIED_NAME; |
| 42 | public const T_IDENTIFIER = TokenType::T_IDENTIFIER; |
| 43 | // All keyword tokens should be >= 200 |
| 44 | public const T_ALL = TokenType::T_ALL; |
| 45 | public const T_AND = TokenType::T_AND; |
| 46 | public const T_ANY = TokenType::T_ANY; |
| 47 | public const T_AS = TokenType::T_AS; |
| 48 | public const T_ASC = TokenType::T_ASC; |
| 49 | public const T_AVG = TokenType::T_AVG; |
| 50 | public const T_BETWEEN = TokenType::T_BETWEEN; |
| 51 | public const T_BOTH = TokenType::T_BOTH; |
| 52 | public const T_BY = TokenType::T_BY; |
| 53 | public const T_CASE = TokenType::T_CASE; |
| 54 | public const T_COALESCE = TokenType::T_COALESCE; |
| 55 | public const T_COUNT = TokenType::T_COUNT; |
| 56 | public const T_DELETE = TokenType::T_DELETE; |
| 57 | public const T_DESC = TokenType::T_DESC; |
| 58 | public const T_DISTINCT = TokenType::T_DISTINCT; |
| 59 | public const T_ELSE = TokenType::T_ELSE; |
| 60 | public const T_EMPTY = TokenType::T_EMPTY; |
| 61 | public const T_END = TokenType::T_END; |
| 62 | public const T_ESCAPE = TokenType::T_ESCAPE; |
| 63 | public const T_EXISTS = TokenType::T_EXISTS; |
| 64 | public const T_FALSE = TokenType::T_FALSE; |
| 65 | public const T_FROM = TokenType::T_FROM; |
| 66 | public const T_GROUP = TokenType::T_GROUP; |
| 67 | public const T_HAVING = TokenType::T_HAVING; |
| 68 | public const T_HIDDEN = TokenType::T_HIDDEN; |
| 69 | public const T_IN = TokenType::T_IN; |
| 70 | public const T_INDEX = TokenType::T_INDEX; |
| 71 | public const T_INNER = TokenType::T_INNER; |
| 72 | public const T_INSTANCE = TokenType::T_INSTANCE; |
| 73 | public const T_IS = TokenType::T_IS; |
| 74 | public const T_JOIN = TokenType::T_JOIN; |
| 75 | public const T_LEADING = TokenType::T_LEADING; |
| 76 | public const T_LEFT = TokenType::T_LEFT; |
| 77 | public const T_LIKE = TokenType::T_LIKE; |
| 78 | public const T_MAX = TokenType::T_MAX; |
| 79 | public const T_MEMBER = TokenType::T_MEMBER; |
| 80 | public const T_MIN = TokenType::T_MIN; |
| 81 | public const T_NEW = TokenType::T_NEW; |
| 82 | public const T_NOT = TokenType::T_NOT; |
| 83 | public const T_NULL = TokenType::T_NULL; |
| 84 | public const T_NULLIF = TokenType::T_NULLIF; |
| 85 | public const T_OF = TokenType::T_OF; |
| 86 | public const T_OR = TokenType::T_OR; |
| 87 | public const T_ORDER = TokenType::T_ORDER; |
| 88 | public const T_OUTER = TokenType::T_OUTER; |
| 89 | public const T_PARTIAL = TokenType::T_PARTIAL; |
| 90 | public const T_SELECT = TokenType::T_SELECT; |
| 91 | public const T_SET = TokenType::T_SET; |
| 92 | public const T_SOME = TokenType::T_SOME; |
| 93 | public const T_SUM = TokenType::T_SUM; |
| 94 | public const T_THEN = TokenType::T_THEN; |
| 95 | public const T_TRAILING = TokenType::T_TRAILING; |
| 96 | public const T_TRUE = TokenType::T_TRUE; |
| 97 | public const T_UPDATE = TokenType::T_UPDATE; |
| 98 | public const T_WHEN = TokenType::T_WHEN; |
| 99 | public const T_WHERE = TokenType::T_WHERE; |
| 100 | public const T_WITH = TokenType::T_WITH; |
| 101 | public function __construct($input) |
| 102 | { |
| 103 | $this->setInput($input); |
| 104 | } |
| 105 | protected function getCatchablePatterns() |
| 106 | { |
| 107 | return [ |
| 108 | '[a-z_][a-z0-9_]*\\:[a-z_][a-z0-9_]*(?:\\\\[a-z_][a-z0-9_]*)*', |
| 109 | // aliased name |
| 110 | '[a-z_\\\\][a-z0-9_]*(?:\\\\[a-z_][a-z0-9_]*)*', |
| 111 | // identifier or qualified name |
| 112 | '(?:[0-9]+(?:[\\.][0-9]+)*)(?:e[+-]?[0-9]+)?', |
| 113 | // numbers |
| 114 | "'(?:[^']|'')*'", |
| 115 | // quoted strings |
| 116 | '\\?[0-9]*|:[a-z_][a-z0-9_]*', |
| 117 | ]; |
| 118 | } |
| 119 | protected function getNonCatchablePatterns() |
| 120 | { |
| 121 | return ['\\s+', '--.*', '(.)']; |
| 122 | } |
| 123 | protected function getType(&$value) |
| 124 | { |
| 125 | $type = TokenType::T_NONE; |
| 126 | switch (\true) { |
| 127 | // Recognize numeric values |
| 128 | case is_numeric($value): |
| 129 | if (str_contains($value, '.') || stripos($value, 'e') !== \false) { |
| 130 | return TokenType::T_FLOAT; |
| 131 | } |
| 132 | return TokenType::T_INTEGER; |
| 133 | // Recognize quoted strings |
| 134 | case $value[0] === "'": |
| 135 | $value = str_replace("''", "'", substr($value, 1, strlen($value) - 2)); |
| 136 | return TokenType::T_STRING; |
| 137 | // Recognize identifiers, aliased or qualified names |
| 138 | case ctype_alpha($value[0]) || $value[0] === '_' || $value[0] === '\\': |
| 139 | $name = 'MailPoetVendor\\Doctrine\\ORM\\Query\\TokenType::T_' . strtoupper($value); |
| 140 | if (defined($name)) { |
| 141 | $type = constant($name); |
| 142 | if ($type > 100) { |
| 143 | return $type; |
| 144 | } |
| 145 | } |
| 146 | if (str_contains($value, ':')) { |
| 147 | Deprecation::trigger('doctrine/orm', 'https://github.com/doctrine/orm/issues/8818', 'Short namespace aliases such as "%s" are deprecated and will be removed in Doctrine ORM 3.0.', $value); |
| 148 | // @phpstan-ignore classConstant.deprecated |
| 149 | return TokenType::T_ALIASED_NAME; |
| 150 | } |
| 151 | if (str_contains($value, '\\')) { |
| 152 | return TokenType::T_FULLY_QUALIFIED_NAME; |
| 153 | } |
| 154 | return TokenType::T_IDENTIFIER; |
| 155 | // Recognize input parameters |
| 156 | case $value[0] === '?' || $value[0] === ':': |
| 157 | return TokenType::T_INPUT_PARAMETER; |
| 158 | // Recognize symbols |
| 159 | case $value === '.': |
| 160 | return TokenType::T_DOT; |
| 161 | case $value === ',': |
| 162 | return TokenType::T_COMMA; |
| 163 | case $value === '(': |
| 164 | return TokenType::T_OPEN_PARENTHESIS; |
| 165 | case $value === ')': |
| 166 | return TokenType::T_CLOSE_PARENTHESIS; |
| 167 | case $value === '=': |
| 168 | return TokenType::T_EQUALS; |
| 169 | case $value === '>': |
| 170 | return TokenType::T_GREATER_THAN; |
| 171 | case $value === '<': |
| 172 | return TokenType::T_LOWER_THAN; |
| 173 | case $value === '+': |
| 174 | return TokenType::T_PLUS; |
| 175 | case $value === '-': |
| 176 | return TokenType::T_MINUS; |
| 177 | case $value === '*': |
| 178 | return TokenType::T_MULTIPLY; |
| 179 | case $value === '/': |
| 180 | return TokenType::T_DIVIDE; |
| 181 | case $value === '!': |
| 182 | return TokenType::T_NEGATE; |
| 183 | case $value === '{': |
| 184 | return TokenType::T_OPEN_CURLY_BRACE; |
| 185 | case $value === '}': |
| 186 | return TokenType::T_CLOSE_CURLY_BRACE; |
| 187 | // Default |
| 188 | default: |
| 189 | } |
| 190 | return $type; |
| 191 | } |
| 192 | } |
| 193 |