Initial commit: queue workspace
Made-with: Cursor
This commit is contained in:
37
pro_v3.5.1/vendor/doctrine/lexer/.doctrine-project.json
vendored
Normal file
37
pro_v3.5.1/vendor/doctrine/lexer/.doctrine-project.json
vendored
Normal file
@@ -0,0 +1,37 @@
|
||||
{
|
||||
"active": true,
|
||||
"name": "Lexer",
|
||||
"slug": "lexer",
|
||||
"docsSlug": "doctrine-lexer",
|
||||
"versions": [
|
||||
{
|
||||
"name": "1.3",
|
||||
"branchName": "1.3.x",
|
||||
"slug": "latest",
|
||||
"upcoming": true
|
||||
},
|
||||
{
|
||||
"name": "1.2",
|
||||
"branchName": "1.2.x",
|
||||
"slug": "1.2",
|
||||
"current": true,
|
||||
"maintained": true,
|
||||
"aliases": [
|
||||
"current",
|
||||
"stable"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "1.1",
|
||||
"branchName": "1.1",
|
||||
"slug": "1.1",
|
||||
"maintained": false
|
||||
},
|
||||
{
|
||||
"name": "1.0",
|
||||
"branchName": "1.0",
|
||||
"slug": "1.0",
|
||||
"maintained": false
|
||||
}
|
||||
]
|
||||
}
|
||||
14
pro_v3.5.1/vendor/doctrine/lexer/.gitattributes
vendored
Normal file
14
pro_v3.5.1/vendor/doctrine/lexer/.gitattributes
vendored
Normal file
@@ -0,0 +1,14 @@
|
||||
# Auto-detect text files, ensure they use LF.
|
||||
* text=auto eol=lf
|
||||
|
||||
# Exclude non-essential files from dist
|
||||
/.github export-ignore
|
||||
/docs export-ignore
|
||||
/tests export-ignore
|
||||
/.doctrine-project.json export-ignore
|
||||
/.gitattributes export-ignore
|
||||
/.gitignore export-ignore
|
||||
/phpcs.xml.dist export-ignore
|
||||
/phpstan.neon.dist export-ignore
|
||||
/phpunit.xml.dist export-ignore
|
||||
/psalm.xml export-ignore
|
||||
3
pro_v3.5.1/vendor/doctrine/lexer/.github/FUNDING.yml
vendored
Normal file
3
pro_v3.5.1/vendor/doctrine/lexer/.github/FUNDING.yml
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
patreon: phpdoctrine
|
||||
tidelift: packagist/doctrine%2Flexer
|
||||
custom: https://www.doctrine-project.org/sponsorship.html
|
||||
27
pro_v3.5.1/vendor/doctrine/lexer/.github/workflows/coding-standards.yml
vendored
Normal file
27
pro_v3.5.1/vendor/doctrine/lexer/.github/workflows/coding-standards.yml
vendored
Normal file
@@ -0,0 +1,27 @@
|
||||
|
||||
name: "Coding Standards"
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
branches:
|
||||
- "*.x"
|
||||
paths:
|
||||
- .github/workflows/coding-standards.yml
|
||||
- composer.*
|
||||
- src/**
|
||||
- phpcs.xml.dist
|
||||
- tests/**
|
||||
push:
|
||||
branches:
|
||||
- "*.x"
|
||||
paths:
|
||||
- .github/workflows/coding-standards.yml
|
||||
- composer.*
|
||||
- src/**
|
||||
- phpcs.xml.dist
|
||||
- tests/**
|
||||
|
||||
jobs:
|
||||
coding-standards:
|
||||
name: "Coding Standards"
|
||||
uses: "doctrine/.github/.github/workflows/coding-standards.yml@3.0.0"
|
||||
20
pro_v3.5.1/vendor/doctrine/lexer/.github/workflows/composer-lint.yml
vendored
Normal file
20
pro_v3.5.1/vendor/doctrine/lexer/.github/workflows/composer-lint.yml
vendored
Normal file
@@ -0,0 +1,20 @@
|
||||
name: "Composer Lint"
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
branches:
|
||||
- "*.x"
|
||||
paths:
|
||||
- .github/workflows/composer-lint.yml
|
||||
- composer.json
|
||||
push:
|
||||
branches:
|
||||
- "*.x"
|
||||
paths:
|
||||
- .github/workflows/composer-lint.yml
|
||||
- composer.json
|
||||
|
||||
jobs:
|
||||
composer-lint:
|
||||
name: "Composer Lint"
|
||||
uses: "doctrine/.github/.github/workflows/composer-lint.yml@3.0.0"
|
||||
29
pro_v3.5.1/vendor/doctrine/lexer/.github/workflows/continuous-integration.yml
vendored
Normal file
29
pro_v3.5.1/vendor/doctrine/lexer/.github/workflows/continuous-integration.yml
vendored
Normal file
@@ -0,0 +1,29 @@
|
||||
|
||||
name: "Continuous Integration"
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
branches:
|
||||
- "*.x"
|
||||
paths:
|
||||
- .github/workflows/continuous-integration.yml
|
||||
- composer.*
|
||||
- src/**
|
||||
- phpunit.xml.dist
|
||||
- tests/**
|
||||
push:
|
||||
branches:
|
||||
- "*.x"
|
||||
paths:
|
||||
- .github/workflows/continuous-integration.yml
|
||||
- composer.*
|
||||
- src/**
|
||||
- phpunit.xml.dist
|
||||
- tests/**
|
||||
|
||||
jobs:
|
||||
phpunit:
|
||||
name: "PHPUnit"
|
||||
uses: "doctrine/.github/.github/workflows/continuous-integration.yml@3.0.0"
|
||||
with:
|
||||
php-versions: '["7.1", "7.2", "7.3", "7.4", "8.0", "8.1", "8.2"]'
|
||||
16
pro_v3.5.1/vendor/doctrine/lexer/.github/workflows/release-on-milestone-closed.yml
vendored
Normal file
16
pro_v3.5.1/vendor/doctrine/lexer/.github/workflows/release-on-milestone-closed.yml
vendored
Normal file
@@ -0,0 +1,16 @@
|
||||
name: "Automatic Releases"
|
||||
|
||||
on:
|
||||
milestone:
|
||||
types:
|
||||
- "closed"
|
||||
|
||||
jobs:
|
||||
release:
|
||||
name: "Git tag, release & create merge-up PR"
|
||||
uses: "doctrine/.github/.github/workflows/release-on-milestone-closed.yml@2.1.0"
|
||||
secrets:
|
||||
GIT_AUTHOR_EMAIL: ${{ secrets.GIT_AUTHOR_EMAIL }}
|
||||
GIT_AUTHOR_NAME: ${{ secrets.GIT_AUTHOR_NAME }}
|
||||
ORGANIZATION_ADMIN_TOKEN: ${{ secrets.ORGANIZATION_ADMIN_TOKEN }}
|
||||
SIGNING_SECRET_KEY: ${{ secrets.SIGNING_SECRET_KEY }}
|
||||
27
pro_v3.5.1/vendor/doctrine/lexer/.github/workflows/static-analysis.yml
vendored
Normal file
27
pro_v3.5.1/vendor/doctrine/lexer/.github/workflows/static-analysis.yml
vendored
Normal file
@@ -0,0 +1,27 @@
|
||||
|
||||
name: "Static Analysis"
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
branches:
|
||||
- "*.x"
|
||||
paths:
|
||||
- .github/workflows/static-analysis.yml
|
||||
- composer.*
|
||||
- src/**
|
||||
- phpstan*
|
||||
- tests/**
|
||||
push:
|
||||
branches:
|
||||
- "*.x"
|
||||
paths:
|
||||
- .github/workflows/static-analysis.yml
|
||||
- composer.*
|
||||
- src/**
|
||||
- phpstan*
|
||||
- tests/**
|
||||
|
||||
jobs:
|
||||
static-analysis:
|
||||
name: "Static Analysis"
|
||||
uses: "doctrine/.github/.github/workflows/static-analysis.yml@3.0.0"
|
||||
6
pro_v3.5.1/vendor/doctrine/lexer/.gitignore
vendored
Normal file
6
pro_v3.5.1/vendor/doctrine/lexer/.gitignore
vendored
Normal file
@@ -0,0 +1,6 @@
|
||||
/vendor
|
||||
/composer.lock
|
||||
/phpunit.xml
|
||||
/.phpunit.result.cache
|
||||
/phpcs.xml
|
||||
/.phpcs-cache
|
||||
19
pro_v3.5.1/vendor/doctrine/lexer/LICENSE
vendored
Normal file
19
pro_v3.5.1/vendor/doctrine/lexer/LICENSE
vendored
Normal file
@@ -0,0 +1,19 @@
|
||||
Copyright (c) 2006-2018 Doctrine Project
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
this software and associated documentation files (the "Software"), to deal in
|
||||
the Software without restriction, including without limitation the rights to
|
||||
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||
of the Software, and to permit persons to whom the Software is furnished to do
|
||||
so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
9
pro_v3.5.1/vendor/doctrine/lexer/README.md
vendored
Normal file
9
pro_v3.5.1/vendor/doctrine/lexer/README.md
vendored
Normal file
@@ -0,0 +1,9 @@
|
||||
# Doctrine Lexer
|
||||
|
||||
[](https://github.com/doctrine/lexer/actions)
|
||||
|
||||
Base library for a lexer that can be used in Top-Down, Recursive Descent Parsers.
|
||||
|
||||
This lexer is used in Doctrine Annotations and in Doctrine ORM (DQL).
|
||||
|
||||
https://www.doctrine-project.org/projects/lexer.html
|
||||
14
pro_v3.5.1/vendor/doctrine/lexer/UPGRADE.md
vendored
Normal file
14
pro_v3.5.1/vendor/doctrine/lexer/UPGRADE.md
vendored
Normal file
@@ -0,0 +1,14 @@
|
||||
Note about upgrading: Doctrine uses static and runtime mechanisms to raise
|
||||
awareness about deprecated code.
|
||||
|
||||
- Use of `@deprecated` docblock that is detected by IDEs (like PHPStorm) or
|
||||
Static Analysis tools (like Psalm, phpstan)
|
||||
- Use of our low-overhead runtime deprecation API, details:
|
||||
https://github.com/doctrine/deprecations/
|
||||
|
||||
# Upgrade to 2.0.0
|
||||
|
||||
`AbstractLexer::glimpse()` and `AbstractLexer::peek()` now return
|
||||
instances of `Doctrine\Common\Lexer\Token`, which is an array-like class
|
||||
Using it as an array is deprecated in favor of using properties of that class.
|
||||
Using `count()` on it is deprecated with no replacement.
|
||||
56
pro_v3.5.1/vendor/doctrine/lexer/composer.json
vendored
Normal file
56
pro_v3.5.1/vendor/doctrine/lexer/composer.json
vendored
Normal file
@@ -0,0 +1,56 @@
|
||||
{
|
||||
"name": "doctrine/lexer",
|
||||
"description": "PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.",
|
||||
"license": "MIT",
|
||||
"type": "library",
|
||||
"keywords": [
|
||||
"php",
|
||||
"parser",
|
||||
"lexer",
|
||||
"annotations",
|
||||
"docblock"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Guilherme Blanco",
|
||||
"email": "guilhermeblanco@gmail.com"
|
||||
},
|
||||
{
|
||||
"name": "Roman Borschel",
|
||||
"email": "roman@code-factory.org"
|
||||
},
|
||||
{
|
||||
"name": "Johannes Schmitt",
|
||||
"email": "schmittjoh@gmail.com"
|
||||
}
|
||||
],
|
||||
"homepage": "https://www.doctrine-project.org/projects/lexer.html",
|
||||
"require": {
|
||||
"php": "^7.1 || ^8.0",
|
||||
"doctrine/deprecations": "^1.0"
|
||||
},
|
||||
"require-dev": {
|
||||
"doctrine/coding-standard": "^9 || ^10",
|
||||
"phpstan/phpstan": "^1.3",
|
||||
"phpunit/phpunit": "^7.5 || ^8.5 || ^9.5",
|
||||
"psalm/plugin-phpunit": "^0.18.3",
|
||||
"vimeo/psalm": "^4.11 || ^5.0"
|
||||
},
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"Doctrine\\Common\\Lexer\\": "src"
|
||||
}
|
||||
},
|
||||
"autoload-dev": {
|
||||
"psr-4": {
|
||||
"Doctrine\\Tests\\Common\\Lexer\\": "tests"
|
||||
}
|
||||
},
|
||||
"config": {
|
||||
"allow-plugins": {
|
||||
"composer/package-versions-deprecated": true,
|
||||
"dealerdirect/phpcodesniffer-composer-installer": true
|
||||
},
|
||||
"sort-packages": true
|
||||
}
|
||||
}
|
||||
299
pro_v3.5.1/vendor/doctrine/lexer/docs/en/dql-parser.rst
vendored
Normal file
299
pro_v3.5.1/vendor/doctrine/lexer/docs/en/dql-parser.rst
vendored
Normal file
@@ -0,0 +1,299 @@
|
||||
DQL Lexer
|
||||
=========
|
||||
|
||||
Here is a more complicated example from the Doctrine ORM project.
|
||||
The ``Doctrine\ORM\Query\Lexer`` implementation for DQL looks something
|
||||
like the following:
|
||||
|
||||
.. code-block:: php
|
||||
|
||||
<?php
|
||||
|
||||
use Doctrine\Common\Lexer\AbstractLexer;
|
||||
|
||||
class Lexer extends AbstractLexer
|
||||
{
|
||||
// All tokens that are not valid identifiers must be < 100
|
||||
public const T_NONE = 1;
|
||||
public const T_INTEGER = 2;
|
||||
public const T_STRING = 3;
|
||||
public const T_INPUT_PARAMETER = 4;
|
||||
public const T_FLOAT = 5;
|
||||
public const T_CLOSE_PARENTHESIS = 6;
|
||||
public const T_OPEN_PARENTHESIS = 7;
|
||||
public const T_COMMA = 8;
|
||||
public const T_DIVIDE = 9;
|
||||
public const T_DOT = 10;
|
||||
public const T_EQUALS = 11;
|
||||
public const T_GREATER_THAN = 12;
|
||||
public const T_LOWER_THAN = 13;
|
||||
public const T_MINUS = 14;
|
||||
public const T_MULTIPLY = 15;
|
||||
public const T_NEGATE = 16;
|
||||
public const T_PLUS = 17;
|
||||
public const T_OPEN_CURLY_BRACE = 18;
|
||||
public const T_CLOSE_CURLY_BRACE = 19;
|
||||
|
||||
// All tokens that are identifiers or keywords that could be considered as identifiers should be >= 100
|
||||
public const T_ALIASED_NAME = 100;
|
||||
public const T_FULLY_QUALIFIED_NAME = 101;
|
||||
public const T_IDENTIFIER = 102;
|
||||
|
||||
// All keyword tokens should be >= 200
|
||||
public const T_ALL = 200;
|
||||
public const T_AND = 201;
|
||||
public const T_ANY = 202;
|
||||
public const T_AS = 203;
|
||||
public const T_ASC = 204;
|
||||
public const T_AVG = 205;
|
||||
public const T_BETWEEN = 206;
|
||||
public const T_BOTH = 207;
|
||||
public const T_BY = 208;
|
||||
public const T_CASE = 209;
|
||||
public const T_COALESCE = 210;
|
||||
public const T_COUNT = 211;
|
||||
public const T_DELETE = 212;
|
||||
public const T_DESC = 213;
|
||||
public const T_DISTINCT = 214;
|
||||
public const T_ELSE = 215;
|
||||
public const T_EMPTY = 216;
|
||||
public const T_END = 217;
|
||||
public const T_ESCAPE = 218;
|
||||
public const T_EXISTS = 219;
|
||||
public const T_FALSE = 220;
|
||||
public const T_FROM = 221;
|
||||
public const T_GROUP = 222;
|
||||
public const T_HAVING = 223;
|
||||
public const T_HIDDEN = 224;
|
||||
public const T_IN = 225;
|
||||
public const T_INDEX = 226;
|
||||
public const T_INNER = 227;
|
||||
public const T_INSTANCE = 228;
|
||||
public const T_IS = 229;
|
||||
public const T_JOIN = 230;
|
||||
public const T_LEADING = 231;
|
||||
public const T_LEFT = 232;
|
||||
public const T_LIKE = 233;
|
||||
public const T_MAX = 234;
|
||||
public const T_MEMBER = 235;
|
||||
public const T_MIN = 236;
|
||||
public const T_NEW = 237;
|
||||
public const T_NOT = 238;
|
||||
public const T_NULL = 239;
|
||||
public const T_NULLIF = 240;
|
||||
public const T_OF = 241;
|
||||
public const T_OR = 242;
|
||||
public const T_ORDER = 243;
|
||||
public const T_OUTER = 244;
|
||||
public const T_PARTIAL = 245;
|
||||
public const T_SELECT = 246;
|
||||
public const T_SET = 247;
|
||||
public const T_SOME = 248;
|
||||
public const T_SUM = 249;
|
||||
public const T_THEN = 250;
|
||||
public const T_TRAILING = 251;
|
||||
public const T_TRUE = 252;
|
||||
public const T_UPDATE = 253;
|
||||
public const T_WHEN = 254;
|
||||
public const T_WHERE = 255;
|
||||
public const T_WITH = 256;
|
||||
|
||||
/**
|
||||
* Creates a new query scanner object.
|
||||
*
|
||||
* @param string $input A query string.
|
||||
*/
|
||||
public function __construct(string $input)
|
||||
{
|
||||
$this->setInput($input);
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
protected function getCatchablePatterns(): array
|
||||
{
|
||||
return [
|
||||
'[a-z_][a-z0-9_]*\:[a-z_][a-z0-9_]*(?:\\\[a-z_][a-z0-9_]*)*', // aliased name
|
||||
'[a-z_\\\][a-z0-9_]*(?:\\\[a-z_][a-z0-9_]*)*', // identifier or qualified name
|
||||
'(?:[0-9]+(?:[\.][0-9]+)*)(?:e[+-]?[0-9]+)?', // numbers
|
||||
"'(?:[^']|'')*'", // quoted strings
|
||||
'\?[0-9]*|:[a-z_][a-z0-9_]*', // parameters
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
protected function getNonCatchablePatterns(): array
|
||||
{
|
||||
return ['\s+', '(.)'];
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
protected function getType(&$value): int
|
||||
{
|
||||
$type = self::T_NONE;
|
||||
|
||||
switch (true) {
|
||||
// Recognize numeric values
|
||||
case (is_numeric($value)):
|
||||
if (strpos($value, '.') !== false || stripos($value, 'e') !== false) {
|
||||
return self::T_FLOAT;
|
||||
}
|
||||
|
||||
return self::T_INTEGER;
|
||||
|
||||
// Recognize quoted strings
|
||||
case ($value[0] === "'"):
|
||||
$value = str_replace("''", "'", substr($value, 1, strlen($value) - 2));
|
||||
|
||||
return self::T_STRING;
|
||||
|
||||
// Recognize identifiers, aliased or qualified names
|
||||
case (ctype_alpha($value[0]) || $value[0] === '_' || $value[0] === '\\'):
|
||||
$name = 'Doctrine\ORM\Query\Lexer::T_' . strtoupper($value);
|
||||
|
||||
if (defined($name)) {
|
||||
$type = constant($name);
|
||||
|
||||
if ($type > 100) {
|
||||
return $type;
|
||||
}
|
||||
}
|
||||
|
||||
if (strpos($value, ':') !== false) {
|
||||
return self::T_ALIASED_NAME;
|
||||
}
|
||||
|
||||
if (strpos($value, '\\') !== false) {
|
||||
return self::T_FULLY_QUALIFIED_NAME;
|
||||
}
|
||||
|
||||
return self::T_IDENTIFIER;
|
||||
|
||||
// Recognize input parameters
|
||||
case ($value[0] === '?' || $value[0] === ':'):
|
||||
return self::T_INPUT_PARAMETER;
|
||||
|
||||
// Recognize symbols
|
||||
case ($value === '.'):
|
||||
return self::T_DOT;
|
||||
case ($value === ','):
|
||||
return self::T_COMMA;
|
||||
case ($value === '('):
|
||||
return self::T_OPEN_PARENTHESIS;
|
||||
case ($value === ')'):
|
||||
return self::T_CLOSE_PARENTHESIS;
|
||||
case ($value === '='):
|
||||
return self::T_EQUALS;
|
||||
case ($value === '>'):
|
||||
return self::T_GREATER_THAN;
|
||||
case ($value === '<'):
|
||||
return self::T_LOWER_THAN;
|
||||
case ($value === '+'):
|
||||
return self::T_PLUS;
|
||||
case ($value === '-'):
|
||||
return self::T_MINUS;
|
||||
case ($value === '*'):
|
||||
return self::T_MULTIPLY;
|
||||
case ($value === '/'):
|
||||
return self::T_DIVIDE;
|
||||
case ($value === '!'):
|
||||
return self::T_NEGATE;
|
||||
case ($value === '{'):
|
||||
return self::T_OPEN_CURLY_BRACE;
|
||||
case ($value === '}'):
|
||||
return self::T_CLOSE_CURLY_BRACE;
|
||||
|
||||
// Default
|
||||
default:
|
||||
// Do nothing
|
||||
}
|
||||
|
||||
return $type;
|
||||
}
|
||||
}
|
||||
|
||||
This is roughly what the DQL Parser looks like that uses the above
|
||||
Lexer implementation:
|
||||
|
||||
.. note::
|
||||
|
||||
You can see the full implementation `here <https://github.com/doctrine/doctrine2/blob/1.3.x/lib/Doctrine/ORM/Query/Parser.php>`_.
|
||||
|
||||
.. code-block:: php
|
||||
|
||||
<?php
|
||||
|
||||
class Parser
|
||||
{
|
||||
private $lexer;
|
||||
|
||||
public function __construct(string $dql)
|
||||
{
|
||||
$this->lexer = new Lexer();
|
||||
$this->lexer->setInput($dql);
|
||||
}
|
||||
|
||||
// ...
|
||||
|
||||
public function getAST(): AST\SelectStatement|AST\UpdateStatement|AST\DeleteStatement
|
||||
{
|
||||
// Parse & build AST
|
||||
$AST = $this->QueryLanguage();
|
||||
|
||||
// ...
|
||||
|
||||
return $AST;
|
||||
}
|
||||
|
||||
public function QueryLanguage(): AST\SelectStatement|AST\UpdateStatement|AST\DeleteStatement
|
||||
{
|
||||
$this->lexer->moveNext();
|
||||
|
||||
switch ($this->lexer->lookahead->type) {
|
||||
case Lexer::T_SELECT:
|
||||
$statement = $this->SelectStatement();
|
||||
break;
|
||||
case Lexer::T_UPDATE:
|
||||
$statement = $this->UpdateStatement();
|
||||
break;
|
||||
case Lexer::T_DELETE:
|
||||
$statement = $this->DeleteStatement();
|
||||
break;
|
||||
default:
|
||||
$this->syntaxError('SELECT, UPDATE or DELETE');
|
||||
}
|
||||
|
||||
// Check for end of string
|
||||
if ($this->lexer->lookahead !== null) {
|
||||
$this->syntaxError('end of string');
|
||||
}
|
||||
|
||||
return $statement;
|
||||
}
|
||||
|
||||
// ...
|
||||
}
|
||||
|
||||
Now the AST is used to transform the DQL query in to portable SQL for whatever relational
|
||||
database you are using!
|
||||
|
||||
.. code-block:: php
|
||||
|
||||
<?php
|
||||
|
||||
$parser = new Parser('SELECT u FROM User u');
|
||||
$AST = $parser->getAST(); // returns \Doctrine\ORM\Query\AST\SelectStatement
|
||||
|
||||
What is an AST?
|
||||
===============
|
||||
|
||||
AST stands for `Abstract syntax tree <http://en.wikipedia.org/wiki/Abstract_syntax_tree>`_.
|
||||
In computer science, an abstract syntax tree (AST), or just syntax tree, is a
|
||||
tree representation of the abstract syntactic structure of source code written
|
||||
in a programming language. Each node of the tree denotes a construct occurring in
|
||||
the source code.
|
||||
48
pro_v3.5.1/vendor/doctrine/lexer/docs/en/index.rst
vendored
Normal file
48
pro_v3.5.1/vendor/doctrine/lexer/docs/en/index.rst
vendored
Normal file
@@ -0,0 +1,48 @@
|
||||
Introduction
|
||||
============
|
||||
|
||||
Doctrine Lexer is a library that can be used in Top-Down, Recursive
|
||||
Descent Parsers. This lexer is used in Doctrine Annotations and in
|
||||
Doctrine ORM (DQL).
|
||||
|
||||
To write your own parser you just need to extend ``Doctrine\Common\Lexer\AbstractLexer``
|
||||
and implement the following three abstract methods.
|
||||
|
||||
.. code-block:: php
|
||||
|
||||
/**
|
||||
* Lexical catchable patterns.
|
||||
*
|
||||
* @return string[]
|
||||
*/
|
||||
abstract protected function getCatchablePatterns();
|
||||
|
||||
/**
|
||||
* Lexical non-catchable patterns.
|
||||
*
|
||||
* @return string[]
|
||||
*/
|
||||
abstract protected function getNonCatchablePatterns();
|
||||
|
||||
/** Retrieve token type. Also processes the token value if necessary. */
|
||||
abstract protected function getType(string &$value): int;
|
||||
|
||||
These methods define the `lexical <http://en.wikipedia.org/wiki/Lexical_analysis>`_
|
||||
catchable and non-catchable patterns and a method for returning the
|
||||
type of a token and filtering the value if necessary.
|
||||
|
||||
The Lexer is responsible for giving you an API to walk across a
|
||||
string one character at a time and analyze the type of each character, value and position of
|
||||
each token in the string. The low level API of the lexer is pretty simple:
|
||||
|
||||
- ``setInput($input)`` - Sets the input data to be tokenized. The Lexer is immediately reset and the new input tokenized.
|
||||
- ``reset()`` - Resets the lexer.
|
||||
- ``resetPeek()`` - Resets the peek pointer to 0.
|
||||
- ``resetPosition($position = 0)`` - Resets the lexer position on the input to the given position.
|
||||
- ``isNextToken($token)`` - Checks whether a given token matches the current lookahead.
|
||||
- ``isNextTokenAny(array $tokens)`` - Checks whether any of the given tokens matches the current lookahead.
|
||||
- ``moveNext()`` - Moves to the next token in the input string.
|
||||
- ``skipUntil($type)`` - Tells the lexer to skip input tokens until it sees a token with the given value.
|
||||
- ``isA($value, $token)`` - Checks if given value is identical to the given token.
|
||||
- ``peek()`` - Moves the lookahead token forward.
|
||||
- ``glimpse()`` - Peeks at the next token, returns it and immediately resets the peek.
|
||||
6
pro_v3.5.1/vendor/doctrine/lexer/docs/en/sidebar.rst
vendored
Normal file
6
pro_v3.5.1/vendor/doctrine/lexer/docs/en/sidebar.rst
vendored
Normal file
@@ -0,0 +1,6 @@
|
||||
.. toctree::
|
||||
:depth: 3
|
||||
|
||||
index
|
||||
simple-parser-example
|
||||
dql-parser
|
||||
103
pro_v3.5.1/vendor/doctrine/lexer/docs/en/simple-parser-example.rst
vendored
Normal file
103
pro_v3.5.1/vendor/doctrine/lexer/docs/en/simple-parser-example.rst
vendored
Normal file
@@ -0,0 +1,103 @@
|
||||
Simple Parser Example
|
||||
=====================
|
||||
|
||||
Extend the ``Doctrine\Common\Lexer\AbstractLexer`` class and implement
|
||||
the ``getCatchablePatterns``, ``getNonCatchablePatterns``, and ``getType``
|
||||
methods. Here is a very simple example lexer implementation named ``CharacterTypeLexer``.
|
||||
It tokenizes a string to ``T_UPPER``, ``T_LOWER`` and``T_NUMBER`` tokens:
|
||||
|
||||
.. code-block:: php
|
||||
<?php
|
||||
|
||||
use Doctrine\Common\Lexer\AbstractLexer;
|
||||
|
||||
/**
|
||||
* @extends AbstractLexer<CharacterTypeLexer::T_*, string>
|
||||
*/
|
||||
class CharacterTypeLexer extends AbstractLexer
|
||||
{
|
||||
const T_UPPER = 1;
|
||||
const T_LOWER = 2;
|
||||
const T_NUMBER = 3;
|
||||
|
||||
protected function getCatchablePatterns(): array
|
||||
{
|
||||
return [
|
||||
'[a-bA-Z0-9]',
|
||||
];
|
||||
}
|
||||
|
||||
protected function getNonCatchablePatterns(): array
|
||||
{
|
||||
return [];
|
||||
}
|
||||
|
||||
protected function getType(&$value): int
|
||||
{
|
||||
if (is_numeric($value)) {
|
||||
return self::T_NUMBER;
|
||||
}
|
||||
|
||||
if (strtoupper($value) === $value) {
|
||||
return self::T_UPPER;
|
||||
}
|
||||
|
||||
if (strtolower($value) === $value) {
|
||||
return self::T_LOWER;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Use ``CharacterTypeLexer`` to extract an array of upper case characters:
|
||||
|
||||
.. code-block:: php
|
||||
<?php
|
||||
|
||||
class UpperCaseCharacterExtracter
|
||||
{
|
||||
public function __construct(private CharacterTypeLexer $lexer)
|
||||
{
|
||||
}
|
||||
|
||||
/** @return list<string> */
|
||||
public function getUpperCaseCharacters(string $string): array
|
||||
{
|
||||
$this->lexer->setInput($string);
|
||||
$this->lexer->moveNext();
|
||||
|
||||
$upperCaseChars = [];
|
||||
while (true) {
|
||||
if (!$this->lexer->lookahead) {
|
||||
break;
|
||||
}
|
||||
|
||||
$this->lexer->moveNext();
|
||||
|
||||
if ($this->lexer->token->isA(CharacterTypeLexer::T_UPPER)) {
|
||||
$upperCaseChars[] = $this->lexer->token->value;
|
||||
}
|
||||
}
|
||||
|
||||
return $upperCaseChars;
|
||||
}
|
||||
}
|
||||
|
||||
$upperCaseCharacterExtractor = new UpperCaseCharacterExtracter(new CharacterTypeLexer());
|
||||
$upperCaseCharacters = $upperCaseCharacterExtractor->getUpperCaseCharacters('1aBcdEfgHiJ12');
|
||||
|
||||
print_r($upperCaseCharacters);
|
||||
|
||||
The variable ``$upperCaseCharacters`` contains all of the upper case
|
||||
characters:
|
||||
|
||||
.. code-block:: php
|
||||
Array
|
||||
(
|
||||
[0] => B
|
||||
[1] => E
|
||||
[2] => H
|
||||
[3] => J
|
||||
)
|
||||
|
||||
This is a simple example but it should demonstrate the low level API
|
||||
that can be used to build more complex parsers.
|
||||
35
pro_v3.5.1/vendor/doctrine/lexer/phpcs.xml.dist
vendored
Normal file
35
pro_v3.5.1/vendor/doctrine/lexer/phpcs.xml.dist
vendored
Normal file
@@ -0,0 +1,35 @@
|
||||
<?xml version="1.0"?>
|
||||
<ruleset>
|
||||
<arg name="basepath" value="."/>
|
||||
<arg name="extensions" value="php"/>
|
||||
<arg name="parallel" value="80"/>
|
||||
<arg name="cache" value=".phpcs-cache"/>
|
||||
<arg name="colors" />
|
||||
|
||||
<config name="php_version" value="70100"/>
|
||||
|
||||
<!-- Ignore warnings and show progress of the run -->
|
||||
<arg value="np"/>
|
||||
|
||||
<file>src</file>
|
||||
<file>tests</file>
|
||||
|
||||
<rule ref="Doctrine">
|
||||
<!-- Traversable type hints often end up as mixed[], so we skip them for now -->
|
||||
<exclude name="SlevomatCodingStandard.TypeHints.PropertyTypeHint.MissingTraversableTypeHintSpecification" />
|
||||
<exclude name="SlevomatCodingStandard.TypeHints.ParameterTypeHint.MissingTraversableTypeHintSpecification" />
|
||||
<exclude name="SlevomatCodingStandard.TypeHints.ReturnTypeHint.MissingTraversableTypeHintSpecification" />
|
||||
|
||||
<!-- Will cause BC breaks to method signatures - disabled for now -->
|
||||
<exclude name="SlevomatCodingStandard.TypeHints.ParameterTypeHint.MissingNativeTypeHint" />
|
||||
<exclude name="SlevomatCodingStandard.TypeHints.ReturnTypeHint.MissingNativeTypeHint" />
|
||||
|
||||
<!-- Disabled to avoid class renaming - to be handled in a separate PR -->
|
||||
<exclude name="SlevomatCodingStandard.Classes.SuperfluousAbstractClassNaming" />
|
||||
</rule>
|
||||
|
||||
<rule ref="SlevomatCodingStandard.Commenting.RequireOneLineDocComment.MultiLineDocComment">
|
||||
<!-- Remove when dropping PHPUnit 7 -->
|
||||
<exclude-pattern>tests/*</exclude-pattern>
|
||||
</rule>
|
||||
</ruleset>
|
||||
13
pro_v3.5.1/vendor/doctrine/lexer/phpstan.neon.dist
vendored
Normal file
13
pro_v3.5.1/vendor/doctrine/lexer/phpstan.neon.dist
vendored
Normal file
@@ -0,0 +1,13 @@
|
||||
parameters:
|
||||
level: max
|
||||
paths:
|
||||
- %rootDir%/../../../src
|
||||
- %rootDir%/../../../tests
|
||||
|
||||
ignoreErrors:
|
||||
-
|
||||
message: '#^Property Doctrine\\Common\\Lexer\\AbstractLexer\<T of int\|string\|UnitEnum,V of int\|string\>\:\:\$tokens \(array\<int, Doctrine\\Common\\Lexer\\Token\<T of int\|string\|UnitEnum, V of int\|string\>\>\) does not accept non\-empty\-array\<int, Doctrine\\Common\\Lexer\\Token\<T of int\|string\|UnitEnum, int\|string\>\>\.$#'
|
||||
path: src/AbstractLexer.php
|
||||
-
|
||||
message: '#^Method Doctrine\\Tests\\Common\\Lexer\\AbstractLexerTest\:\:dataProvider\(\) should return array\<int, array\{string, array\<int, Doctrine\\Common\\Lexer\\Token\<string, int\|string\>\>\}\> but returns array\{array\{''price\=10'', array\{Doctrine\\Common\\Lexer\\Token\<string, string\>, Doctrine\\Common\\Lexer\\Token\<string, string\>, Doctrine\\Common\\Lexer\\Token\<string, int\>\}\}\}\.$#'
|
||||
path: tests/AbstractLexerTest.php
|
||||
26
pro_v3.5.1/vendor/doctrine/lexer/phpunit.xml.dist
vendored
Normal file
26
pro_v3.5.1/vendor/doctrine/lexer/phpunit.xml.dist
vendored
Normal file
@@ -0,0 +1,26 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
|
||||
<!-- https://phpunit.de/manual/current/en/appendixes.configuration.html -->
|
||||
<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:noNamespaceSchemaLocation="http://schema.phpunit.de/4.8/phpunit.xsd"
|
||||
backupGlobals="false"
|
||||
colors="true"
|
||||
bootstrap="vendor/autoload.php"
|
||||
convertNoticesToExceptions="true"
|
||||
>
|
||||
<php>
|
||||
<ini name="error_reporting" value="-1" />
|
||||
</php>
|
||||
|
||||
<testsuites>
|
||||
<testsuite name="Doctrine lexer Test Suite">
|
||||
<directory>tests</directory>
|
||||
</testsuite>
|
||||
</testsuites>
|
||||
|
||||
<filter>
|
||||
<whitelist>
|
||||
<directory suffix=".php">src</directory>
|
||||
</whitelist>
|
||||
</filter>
|
||||
</phpunit>
|
||||
68
pro_v3.5.1/vendor/doctrine/lexer/psalm.xml
vendored
Normal file
68
pro_v3.5.1/vendor/doctrine/lexer/psalm.xml
vendored
Normal file
@@ -0,0 +1,68 @@
|
||||
<?xml version="1.0"?>
|
||||
<psalm
|
||||
errorLevel="1"
|
||||
phpVersion="8.1"
|
||||
resolveFromConfigFile="true"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xmlns="https://getpsalm.org/schema/config"
|
||||
xsi:schemaLocation="https://getpsalm.org/schema/config vendor/vimeo/psalm/config.xsd"
|
||||
>
|
||||
<projectFiles>
|
||||
<directory name="src"/>
|
||||
<directory name="tests"/>
|
||||
<ignoreFiles>
|
||||
<directory name="vendor"/>
|
||||
</ignoreFiles>
|
||||
</projectFiles>
|
||||
<plugins>
|
||||
<pluginClass class="Psalm\PhpUnitPlugin\Plugin"/>
|
||||
</plugins>
|
||||
<issueHandlers>
|
||||
<DeprecatedMethod>
|
||||
<errorLevel type="suppress">
|
||||
<referencedMethod name="Doctrine\Common\Lexer\Token::offsetGet"/>
|
||||
<referencedMethod name="Doctrine\Common\Lexer\Token::offsetSet"/>
|
||||
</errorLevel>
|
||||
</DeprecatedMethod>
|
||||
<DocblockTypeContradiction>
|
||||
<errorLevel type="suppress">
|
||||
<!-- let us assume no one actually unsets the value of a token -->
|
||||
<file name="tests/TokenTest.php" />
|
||||
</errorLevel>
|
||||
</DocblockTypeContradiction>
|
||||
<InvalidReturnStatement>
|
||||
<errorLevel type="suppress">
|
||||
<!-- https://github.com/vimeo/psalm/issues/8878 -->
|
||||
<file name="src/AbstractLexer.php" />
|
||||
</errorLevel>
|
||||
</InvalidReturnStatement>
|
||||
<InvalidReturnType>
|
||||
<errorLevel type="suppress">
|
||||
<!-- https://github.com/vimeo/psalm/issues/8878 -->
|
||||
<file name="src/AbstractLexer.php" />
|
||||
</errorLevel>
|
||||
</InvalidReturnType>
|
||||
<MixedAssignment>
|
||||
<errorLevel type="suppress">
|
||||
<file name="src/AbstractLexer.php" />
|
||||
</errorLevel>
|
||||
</MixedAssignment>
|
||||
<MixedReturnStatement>
|
||||
<errorLevel type="suppress">
|
||||
<file name="src/Token.php" />
|
||||
</errorLevel>
|
||||
</MixedReturnStatement>
|
||||
<ReferenceConstraintViolation>
|
||||
<errorLevel type="suppress">
|
||||
<!-- https://github.com/vimeo/psalm/issues/8891 -->
|
||||
<file name="src/AbstractLexer.php" />
|
||||
</errorLevel>
|
||||
</ReferenceConstraintViolation>
|
||||
<RedundantConditionGivenDocblockType>
|
||||
<errorLevel type="suppress">
|
||||
<!-- that test checks non-obvious things guaranteed by static analysis, just in case -->
|
||||
<file name="tests/AbstractLexerTest.php" />
|
||||
</errorLevel>
|
||||
</RedundantConditionGivenDocblockType>
|
||||
</issueHandlers>
|
||||
</psalm>
|
||||
346
pro_v3.5.1/vendor/doctrine/lexer/src/AbstractLexer.php
vendored
Normal file
346
pro_v3.5.1/vendor/doctrine/lexer/src/AbstractLexer.php
vendored
Normal file
@@ -0,0 +1,346 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Doctrine\Common\Lexer;
|
||||
|
||||
use ReflectionClass;
|
||||
use UnitEnum;
|
||||
|
||||
use function get_class;
|
||||
use function implode;
|
||||
use function preg_split;
|
||||
use function sprintf;
|
||||
use function substr;
|
||||
|
||||
use const PREG_SPLIT_DELIM_CAPTURE;
|
||||
use const PREG_SPLIT_NO_EMPTY;
|
||||
use const PREG_SPLIT_OFFSET_CAPTURE;
|
||||
|
||||
/**
|
||||
* Base class for writing simple lexers, i.e. for creating small DSLs.
|
||||
*
|
||||
* @template T of UnitEnum|string|int
|
||||
* @template V of string|int
|
||||
*/
|
||||
abstract class AbstractLexer
|
||||
{
|
||||
/**
|
||||
* Lexer original input string.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
private $input;
|
||||
|
||||
/**
|
||||
* Array of scanned tokens.
|
||||
*
|
||||
* @var list<Token<T, V>>
|
||||
*/
|
||||
private $tokens = [];
|
||||
|
||||
/**
|
||||
* Current lexer position in input string.
|
||||
*
|
||||
* @var int
|
||||
*/
|
||||
private $position = 0;
|
||||
|
||||
/**
|
||||
* Current peek of current lexer position.
|
||||
*
|
||||
* @var int
|
||||
*/
|
||||
private $peek = 0;
|
||||
|
||||
/**
|
||||
* The next token in the input.
|
||||
*
|
||||
* @var mixed[]|null
|
||||
* @psalm-var Token<T, V>|null
|
||||
*/
|
||||
public $lookahead;
|
||||
|
||||
/**
|
||||
* The last matched/seen token.
|
||||
*
|
||||
* @var mixed[]|null
|
||||
* @psalm-var Token<T, V>|null
|
||||
*/
|
||||
public $token;
|
||||
|
||||
/**
|
||||
* Composed regex for input parsing.
|
||||
*
|
||||
* @var string|null
|
||||
*/
|
||||
private $regex;
|
||||
|
||||
/**
|
||||
* Sets the input data to be tokenized.
|
||||
*
|
||||
* The Lexer is immediately reset and the new input tokenized.
|
||||
* Any unprocessed tokens from any previous input are lost.
|
||||
*
|
||||
* @param string $input The input to be tokenized.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function setInput($input)
|
||||
{
|
||||
$this->input = $input;
|
||||
$this->tokens = [];
|
||||
|
||||
$this->reset();
|
||||
$this->scan($input);
|
||||
}
|
||||
|
||||
/**
|
||||
* Resets the lexer.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function reset()
|
||||
{
|
||||
$this->lookahead = null;
|
||||
$this->token = null;
|
||||
$this->peek = 0;
|
||||
$this->position = 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Resets the peek pointer to 0.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function resetPeek()
|
||||
{
|
||||
$this->peek = 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Resets the lexer position on the input to the given position.
|
||||
*
|
||||
* @param int $position Position to place the lexical scanner.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function resetPosition($position = 0)
|
||||
{
|
||||
$this->position = $position;
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve the original lexer's input until a given position.
|
||||
*
|
||||
* @param int $position
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getInputUntilPosition($position)
|
||||
{
|
||||
return substr($this->input, 0, $position);
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks whether a given token matches the current lookahead.
|
||||
*
|
||||
* @param T $type
|
||||
*
|
||||
* @return bool
|
||||
*
|
||||
* @psalm-assert-if-true !=null $this->lookahead
|
||||
*/
|
||||
public function isNextToken($type)
|
||||
{
|
||||
return $this->lookahead !== null && $this->lookahead->isA($type);
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks whether any of the given tokens matches the current lookahead.
|
||||
*
|
||||
* @param list<T> $types
|
||||
*
|
||||
* @return bool
|
||||
*
|
||||
* @psalm-assert-if-true !=null $this->lookahead
|
||||
*/
|
||||
public function isNextTokenAny(array $types)
|
||||
{
|
||||
return $this->lookahead !== null && $this->lookahead->isA(...$types);
|
||||
}
|
||||
|
||||
/**
|
||||
* Moves to the next token in the input string.
|
||||
*
|
||||
* @return bool
|
||||
*
|
||||
* @psalm-assert-if-true !null $this->lookahead
|
||||
*/
|
||||
public function moveNext()
|
||||
{
|
||||
$this->peek = 0;
|
||||
$this->token = $this->lookahead;
|
||||
$this->lookahead = isset($this->tokens[$this->position])
|
||||
? $this->tokens[$this->position++] : null;
|
||||
|
||||
return $this->lookahead !== null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Tells the lexer to skip input tokens until it sees a token with the given value.
|
||||
*
|
||||
* @param T $type The token type to skip until.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function skipUntil($type)
|
||||
{
|
||||
while ($this->lookahead !== null && ! $this->lookahead->isA($type)) {
|
||||
$this->moveNext();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if given value is identical to the given token.
|
||||
*
|
||||
* @param string $value
|
||||
* @param int|string $token
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function isA($value, $token)
|
||||
{
|
||||
return $this->getType($value) === $token;
|
||||
}
|
||||
|
||||
/**
|
||||
* Moves the lookahead token forward.
|
||||
*
|
||||
* @return mixed[]|null The next token or NULL if there are no more tokens ahead.
|
||||
* @psalm-return Token<T, V>|null
|
||||
*/
|
||||
public function peek()
|
||||
{
|
||||
if (isset($this->tokens[$this->position + $this->peek])) {
|
||||
return $this->tokens[$this->position + $this->peek++];
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Peeks at the next token, returns it and immediately resets the peek.
|
||||
*
|
||||
* @return mixed[]|null The next token or NULL if there are no more tokens ahead.
|
||||
* @psalm-return Token<T, V>|null
|
||||
*/
|
||||
public function glimpse()
|
||||
{
|
||||
$peek = $this->peek();
|
||||
$this->peek = 0;
|
||||
|
||||
return $peek;
|
||||
}
|
||||
|
||||
/**
|
||||
* Scans the input string for tokens.
|
||||
*
|
||||
* @param string $input A query string.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
protected function scan($input)
|
||||
{
|
||||
if (! isset($this->regex)) {
|
||||
$this->regex = sprintf(
|
||||
'/(%s)|%s/%s',
|
||||
implode(')|(', $this->getCatchablePatterns()),
|
||||
implode('|', $this->getNonCatchablePatterns()),
|
||||
$this->getModifiers()
|
||||
);
|
||||
}
|
||||
|
||||
$flags = PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_OFFSET_CAPTURE;
|
||||
$matches = preg_split($this->regex, $input, -1, $flags);
|
||||
|
||||
if ($matches === false) {
|
||||
// Work around https://bugs.php.net/78122
|
||||
$matches = [[$input, 0]];
|
||||
}
|
||||
|
||||
foreach ($matches as $match) {
|
||||
// Must remain before 'value' assignment since it can change content
|
||||
$firstMatch = $match[0];
|
||||
$type = $this->getType($firstMatch);
|
||||
|
||||
$this->tokens[] = new Token(
|
||||
$firstMatch,
|
||||
$type,
|
||||
$match[1]
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the literal for a given token.
|
||||
*
|
||||
* @param T $token
|
||||
*
|
||||
* @return int|string
|
||||
*/
|
||||
public function getLiteral($token)
|
||||
{
|
||||
if ($token instanceof UnitEnum) {
|
||||
return get_class($token) . '::' . $token->name;
|
||||
}
|
||||
|
||||
$className = static::class;
|
||||
|
||||
$reflClass = new ReflectionClass($className);
|
||||
$constants = $reflClass->getConstants();
|
||||
|
||||
foreach ($constants as $name => $value) {
|
||||
if ($value === $token) {
|
||||
return $className . '::' . $name;
|
||||
}
|
||||
}
|
||||
|
||||
return $token;
|
||||
}
|
||||
|
||||
/**
|
||||
* Regex modifiers
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected function getModifiers()
|
||||
{
|
||||
return 'iu';
|
||||
}
|
||||
|
||||
/**
|
||||
* Lexical catchable patterns.
|
||||
*
|
||||
* @return string[]
|
||||
*/
|
||||
abstract protected function getCatchablePatterns();
|
||||
|
||||
/**
|
||||
* Lexical non-catchable patterns.
|
||||
*
|
||||
* @return string[]
|
||||
*/
|
||||
abstract protected function getNonCatchablePatterns();
|
||||
|
||||
/**
|
||||
* Retrieve token type. Also processes the token value if necessary.
|
||||
*
|
||||
* @param string $value
|
||||
*
|
||||
* @return T|null
|
||||
*
|
||||
* @param-out V $value
|
||||
*/
|
||||
abstract protected function getType(&$value);
|
||||
}
|
||||
145
pro_v3.5.1/vendor/doctrine/lexer/src/Token.php
vendored
Normal file
145
pro_v3.5.1/vendor/doctrine/lexer/src/Token.php
vendored
Normal file
@@ -0,0 +1,145 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Doctrine\Common\Lexer;
|
||||
|
||||
use ArrayAccess;
|
||||
use Doctrine\Deprecations\Deprecation;
|
||||
use ReturnTypeWillChange;
|
||||
use UnitEnum;
|
||||
|
||||
use function in_array;
|
||||
|
||||
/**
|
||||
* @template T of UnitEnum|string|int
|
||||
* @template V of string|int
|
||||
* @implements ArrayAccess<string,mixed>
|
||||
*/
|
||||
final class Token implements ArrayAccess
|
||||
{
|
||||
/**
|
||||
* The string value of the token in the input string
|
||||
*
|
||||
* @readonly
|
||||
* @var V
|
||||
*/
|
||||
public $value;
|
||||
|
||||
/**
|
||||
* The type of the token (identifier, numeric, string, input parameter, none)
|
||||
*
|
||||
* @readonly
|
||||
* @var T|null
|
||||
*/
|
||||
public $type;
|
||||
|
||||
/**
|
||||
* The position of the token in the input string
|
||||
*
|
||||
* @readonly
|
||||
* @var int
|
||||
*/
|
||||
public $position;
|
||||
|
||||
/**
|
||||
* @param V $value
|
||||
* @param T|null $type
|
||||
*/
|
||||
public function __construct($value, $type, int $position)
|
||||
{
|
||||
$this->value = $value;
|
||||
$this->type = $type;
|
||||
$this->position = $position;
|
||||
}
|
||||
|
||||
/** @param T ...$types */
|
||||
public function isA(...$types): bool
|
||||
{
|
||||
return in_array($this->type, $types, true);
|
||||
}
|
||||
|
||||
/**
|
||||
* @deprecated Use the value, type or position property instead
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
public function offsetExists($offset): bool
|
||||
{
|
||||
Deprecation::trigger(
|
||||
'doctrine/lexer',
|
||||
'https://github.com/doctrine/lexer/pull/79',
|
||||
'Accessing %s properties via ArrayAccess is deprecated, use the value, type or position property instead',
|
||||
self::class
|
||||
);
|
||||
|
||||
return in_array($offset, ['value', 'type', 'position'], true);
|
||||
}
|
||||
|
||||
/**
|
||||
* @deprecated Use the value, type or position property instead
|
||||
* {@inheritDoc}
|
||||
*
|
||||
* @param O $offset
|
||||
*
|
||||
* @return mixed
|
||||
* @psalm-return (
|
||||
* O is 'value'
|
||||
* ? V
|
||||
* : (
|
||||
* O is 'type'
|
||||
* ? T|null
|
||||
* : (
|
||||
* O is 'position'
|
||||
* ? int
|
||||
* : mixed
|
||||
* )
|
||||
* )
|
||||
* )
|
||||
*
|
||||
* @template O of array-key
|
||||
*/
|
||||
#[ReturnTypeWillChange]
|
||||
public function offsetGet($offset)
|
||||
{
|
||||
Deprecation::trigger(
|
||||
'doctrine/lexer',
|
||||
'https://github.com/doctrine/lexer/pull/79',
|
||||
'Accessing %s properties via ArrayAccess is deprecated, use the value, type or position property instead',
|
||||
self::class
|
||||
);
|
||||
|
||||
return $this->$offset;
|
||||
}
|
||||
|
||||
/**
|
||||
* @deprecated no replacement planned
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
public function offsetSet($offset, $value): void
|
||||
{
|
||||
Deprecation::trigger(
|
||||
'doctrine/lexer',
|
||||
'https://github.com/doctrine/lexer/pull/79',
|
||||
'Setting %s properties via ArrayAccess is deprecated',
|
||||
self::class
|
||||
);
|
||||
|
||||
$this->$offset = $value;
|
||||
}
|
||||
|
||||
/**
|
||||
* @deprecated no replacement planned
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
public function offsetUnset($offset): void
|
||||
{
|
||||
Deprecation::trigger(
|
||||
'doctrine/lexer',
|
||||
'https://github.com/doctrine/lexer/pull/79',
|
||||
'Setting %s properties via ArrayAccess is deprecated',
|
||||
self::class
|
||||
);
|
||||
|
||||
$this->$offset = null;
|
||||
}
|
||||
}
|
||||
306
pro_v3.5.1/vendor/doctrine/lexer/tests/AbstractLexerTest.php
vendored
Normal file
306
pro_v3.5.1/vendor/doctrine/lexer/tests/AbstractLexerTest.php
vendored
Normal file
@@ -0,0 +1,306 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Doctrine\Tests\Common\Lexer;
|
||||
|
||||
use Doctrine\Common\Lexer\Token;
|
||||
use PHPUnit\Framework\TestCase;
|
||||
|
||||
use function array_map;
|
||||
use function assert;
|
||||
use function count;
|
||||
use function setlocale;
|
||||
|
||||
use const LC_ALL;
|
||||
|
||||
class AbstractLexerTest extends TestCase
|
||||
{
|
||||
/** @var ConcreteLexer */
|
||||
private $concreteLexer;
|
||||
|
||||
public function setUp(): void
|
||||
{
|
||||
$this->concreteLexer = new ConcreteLexer();
|
||||
}
|
||||
|
||||
public function tearDown(): void
|
||||
{
|
||||
setlocale(LC_ALL, null);
|
||||
}
|
||||
|
||||
/**
|
||||
* @psalm-return list<array{string, list<Token<string, string|int>>}>
|
||||
*/
|
||||
public function dataProvider(): array
|
||||
{
|
||||
return [
|
||||
[
|
||||
'price=10',
|
||||
[
|
||||
new Token('price', 'string', 0),
|
||||
new Token('=', 'operator', 5),
|
||||
new Token(10, 'int', 6),
|
||||
],
|
||||
],
|
||||
];
|
||||
}
|
||||
|
||||
public function testResetPeek(): void
|
||||
{
|
||||
$expectedTokens = [
|
||||
new Token('price', 'string', 0),
|
||||
new Token('=', 'operator', 5),
|
||||
new Token(10, 'int', 6),
|
||||
];
|
||||
|
||||
$this->concreteLexer->setInput('price=10');
|
||||
|
||||
$this->assertEquals($expectedTokens[0], $this->concreteLexer->peek());
|
||||
$this->assertEquals($expectedTokens[1], $this->concreteLexer->peek());
|
||||
$this->concreteLexer->resetPeek();
|
||||
$this->assertEquals($expectedTokens[0], $this->concreteLexer->peek());
|
||||
}
|
||||
|
||||
public function testResetPosition(): void
|
||||
{
|
||||
$expectedTokens = [
|
||||
new Token('price', 'string', 0),
|
||||
new Token('=', 'operator', 5),
|
||||
new Token(10, 'int', 6),
|
||||
];
|
||||
|
||||
$this->concreteLexer->setInput('price=10');
|
||||
$this->assertNull($this->concreteLexer->lookahead);
|
||||
|
||||
$this->assertTrue($this->concreteLexer->moveNext());
|
||||
$this->assertEquals($expectedTokens[0], $this->concreteLexer->lookahead);
|
||||
|
||||
$this->assertTrue($this->concreteLexer->moveNext());
|
||||
$this->assertEquals($expectedTokens[1], $this->concreteLexer->lookahead);
|
||||
|
||||
$this->concreteLexer->resetPosition(0);
|
||||
|
||||
$this->assertTrue($this->concreteLexer->moveNext());
|
||||
$this->assertEquals($expectedTokens[0], $this->concreteLexer->lookahead);
|
||||
}
|
||||
|
||||
/**
|
||||
* @psalm-param list<Token<string, string|int>> $expectedTokens
|
||||
*
|
||||
* @dataProvider dataProvider
|
||||
*/
|
||||
public function testMoveNext(string $input, array $expectedTokens): void
|
||||
{
|
||||
$this->concreteLexer->setInput($input);
|
||||
$this->assertNull($this->concreteLexer->lookahead);
|
||||
|
||||
for ($i = 0; $i < count($expectedTokens); $i++) {
|
||||
$this->assertTrue($this->concreteLexer->moveNext());
|
||||
$this->assertEquals($expectedTokens[$i], $this->concreteLexer->lookahead);
|
||||
}
|
||||
|
||||
$this->assertFalse($this->concreteLexer->moveNext());
|
||||
$this->assertNull($this->concreteLexer->lookahead);
|
||||
}
|
||||
|
||||
public function testSkipUntil(): void
|
||||
{
|
||||
$this->concreteLexer->setInput('price=10');
|
||||
|
||||
$this->assertTrue($this->concreteLexer->moveNext());
|
||||
$this->concreteLexer->skipUntil('operator');
|
||||
|
||||
$this->assertEquals(
|
||||
new Token('=', 'operator', 5),
|
||||
$this->concreteLexer->lookahead
|
||||
);
|
||||
}
|
||||
|
||||
public function testUtf8Mismatch(): void
|
||||
{
|
||||
$this->concreteLexer->setInput("\xE9=10");
|
||||
|
||||
$this->assertTrue($this->concreteLexer->moveNext());
|
||||
|
||||
$this->assertEquals(
|
||||
new Token("\xE9=10", 'string', 0),
|
||||
$this->concreteLexer->lookahead
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @psalm-param list<Token<string, string|int>> $expectedTokens
|
||||
*
|
||||
* @dataProvider dataProvider
|
||||
*/
|
||||
public function testPeek(string $input, array $expectedTokens): void
|
||||
{
|
||||
$this->concreteLexer->setInput($input);
|
||||
foreach ($expectedTokens as $expectedToken) {
|
||||
$actualToken = $this->concreteLexer->peek();
|
||||
assert($actualToken !== null);
|
||||
$this->assertEquals($expectedToken, $actualToken);
|
||||
$this->assertSame($expectedToken['value'], $actualToken['value']);
|
||||
$this->assertSame($expectedToken['type'], $actualToken['type']);
|
||||
$this->assertSame($expectedToken['position'], $actualToken['position']);
|
||||
}
|
||||
|
||||
$this->assertNull($this->concreteLexer->peek());
|
||||
}
|
||||
|
||||
/**
|
||||
* @psalm-param list<Token<string, string|int>> $expectedTokens
|
||||
*
|
||||
* @dataProvider dataProvider
|
||||
*/
|
||||
public function testGlimpse(string $input, array $expectedTokens): void
|
||||
{
|
||||
$this->concreteLexer->setInput($input);
|
||||
|
||||
foreach ($expectedTokens as $expectedToken) {
|
||||
$actualToken = $this->concreteLexer->glimpse();
|
||||
assert($actualToken !== null);
|
||||
$this->assertEquals($expectedToken, $actualToken);
|
||||
$this->assertEquals($expectedToken, $this->concreteLexer->glimpse());
|
||||
$this->assertSame($expectedToken['value'], $actualToken['value']);
|
||||
$this->assertSame($expectedToken['type'], $actualToken['type']);
|
||||
$this->assertSame($expectedToken['position'], $actualToken['position']);
|
||||
$this->concreteLexer->moveNext();
|
||||
}
|
||||
|
||||
$this->assertNull($this->concreteLexer->peek());
|
||||
}
|
||||
|
||||
/**
|
||||
* @psalm-return list<array{string, int, string}>
|
||||
*/
|
||||
public function inputUntilPositionDataProvider(): array
|
||||
{
|
||||
return [
|
||||
['price=10', 5, 'price'],
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider inputUntilPositionDataProvider
|
||||
*/
|
||||
public function testGetInputUntilPosition(
|
||||
string $input,
|
||||
int $position,
|
||||
string $expectedInput
|
||||
): void {
|
||||
$this->concreteLexer->setInput($input);
|
||||
|
||||
$this->assertSame($expectedInput, $this->concreteLexer->getInputUntilPosition($position));
|
||||
}
|
||||
|
||||
/**
|
||||
* @psalm-param list<Token<string, string|int>> $expectedTokens
|
||||
*
|
||||
* @dataProvider dataProvider
|
||||
*/
|
||||
public function testIsNextToken(string $input, array $expectedTokens): void
|
||||
{
|
||||
$this->concreteLexer->setInput($input);
|
||||
|
||||
$this->concreteLexer->moveNext();
|
||||
for ($i = 0; $i < count($expectedTokens); $i++) {
|
||||
assert($expectedTokens[$i]->type !== null);
|
||||
$this->assertTrue($this->concreteLexer->isNextToken($expectedTokens[$i]->type));
|
||||
$this->concreteLexer->moveNext();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @psalm-param list<Token<string, string|int>> $expectedTokens
|
||||
*
|
||||
* @dataProvider dataProvider
|
||||
*/
|
||||
public function testIsNextTokenAny(string $input, array $expectedTokens): void
|
||||
{
|
||||
$allTokenTypes = array_map(static function ($token): string {
|
||||
assert($token->type !== null);
|
||||
|
||||
return $token->type;
|
||||
}, $expectedTokens);
|
||||
|
||||
$this->concreteLexer->setInput($input);
|
||||
|
||||
$this->concreteLexer->moveNext();
|
||||
for ($i = 0; $i < count($expectedTokens); $i++) {
|
||||
assert($expectedTokens[$i]->type !== null);
|
||||
$this->assertTrue($this->concreteLexer->isNextTokenAny([$expectedTokens[$i]->type]));
|
||||
$this->assertTrue($this->concreteLexer->isNextTokenAny($allTokenTypes));
|
||||
$this->concreteLexer->moveNext();
|
||||
}
|
||||
}
|
||||
|
||||
public function testGetLiteral(): void
|
||||
{
|
||||
$this->assertSame('Doctrine\Tests\Common\Lexer\ConcreteLexer::INT', $this->concreteLexer->getLiteral('int'));
|
||||
$this->assertSame('fake_token', $this->concreteLexer->getLiteral('fake_token'));
|
||||
}
|
||||
|
||||
/**
|
||||
* @requires PHP 8.1
|
||||
*/
|
||||
public function testGetLiteralWithEnumLexer(): void
|
||||
{
|
||||
$enumLexer = new EnumLexer();
|
||||
$this->assertSame(
|
||||
'Doctrine\Tests\Common\Lexer\TokenType::OPERATOR',
|
||||
$enumLexer->getLiteral(TokenType::OPERATOR)
|
||||
);
|
||||
}
|
||||
|
||||
public function testIsA(): void
|
||||
{
|
||||
$this->assertTrue($this->concreteLexer->isA('11', 'int'));
|
||||
$this->assertTrue($this->concreteLexer->isA('1.1', 'int'));
|
||||
$this->assertTrue($this->concreteLexer->isA('=', 'operator'));
|
||||
$this->assertTrue($this->concreteLexer->isA('>', 'operator'));
|
||||
$this->assertTrue($this->concreteLexer->isA('<', 'operator'));
|
||||
$this->assertTrue($this->concreteLexer->isA('fake_text', 'string'));
|
||||
}
|
||||
|
||||
public function testAddCatchablePatternsToMutableLexer(): void
|
||||
{
|
||||
$mutableLexer = new MutableLexer();
|
||||
$mutableLexer->addCatchablePattern('[a-z]');
|
||||
$mutableLexer->setInput('one');
|
||||
$token = $mutableLexer->glimpse();
|
||||
|
||||
$this->assertNotNull($token);
|
||||
$this->assertEquals('o', $token->value);
|
||||
|
||||
$mutableLexer = new MutableLexer();
|
||||
$mutableLexer->addCatchablePattern('[a-z]+');
|
||||
$mutableLexer->setInput('one');
|
||||
$token = $mutableLexer->glimpse();
|
||||
|
||||
$this->assertNotNull($token);
|
||||
$this->assertEquals('one', $token->value);
|
||||
}
|
||||
|
||||
public function testMarkerAnnotationLocaleTr(): void
|
||||
{
|
||||
setlocale(LC_ALL, 'tr_TR.utf8', 'tr_TR');
|
||||
$mutableLexer = new MutableLexer();
|
||||
$mutableLexer->addCatchablePattern('[a-z_\\\][a-z0-9_\:\\\]*[a-z_][a-z0-9_]*');
|
||||
$mutableLexer->addCatchablePattern('(?:[+-]?[0-9]+(?:[\.][0-9]+)*)(?:[eE][+-]?[0-9]+)?');
|
||||
$mutableLexer->addCatchablePattern('"(?:""|[^"])*+"');
|
||||
$mutableLexer->setInput('@ODM\Id');
|
||||
|
||||
self::assertNull($mutableLexer->token);
|
||||
self::assertNull($mutableLexer->lookahead);
|
||||
self::assertTrue($mutableLexer->moveNext());
|
||||
self::assertNull($mutableLexer->token);
|
||||
self::assertNotNull($mutableLexer->lookahead);
|
||||
self::assertEquals('@', $mutableLexer->lookahead->value);
|
||||
self::assertTrue($mutableLexer->moveNext());
|
||||
self::assertNotNull($mutableLexer->token);
|
||||
self::assertEquals('@', $mutableLexer->token->value);
|
||||
self::assertEquals('ODM\Id', $mutableLexer->lookahead->value);
|
||||
}
|
||||
}
|
||||
57
pro_v3.5.1/vendor/doctrine/lexer/tests/ConcreteLexer.php
vendored
Normal file
57
pro_v3.5.1/vendor/doctrine/lexer/tests/ConcreteLexer.php
vendored
Normal file
@@ -0,0 +1,57 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Doctrine\Tests\Common\Lexer;
|
||||
|
||||
use Doctrine\Common\Lexer\AbstractLexer;
|
||||
|
||||
use function in_array;
|
||||
use function is_numeric;
|
||||
|
||||
/** @extends AbstractLexer<string, string|int> */
|
||||
class ConcreteLexer extends AbstractLexer
|
||||
{
|
||||
public const INT = 'int';
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
protected function getCatchablePatterns(): array
|
||||
{
|
||||
return [
|
||||
'=|<|>',
|
||||
'[a-z]+',
|
||||
'\d+',
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
protected function getNonCatchablePatterns(): array
|
||||
{
|
||||
return [
|
||||
'\s+',
|
||||
'(.)',
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
protected function getType(&$value): string
|
||||
{
|
||||
if (is_numeric($value)) {
|
||||
$value = (int) $value;
|
||||
|
||||
return 'int';
|
||||
}
|
||||
|
||||
if (in_array($value, ['=', '<', '>'])) {
|
||||
return 'operator';
|
||||
}
|
||||
|
||||
return 'string';
|
||||
}
|
||||
}
|
||||
55
pro_v3.5.1/vendor/doctrine/lexer/tests/EnumLexer.php
vendored
Normal file
55
pro_v3.5.1/vendor/doctrine/lexer/tests/EnumLexer.php
vendored
Normal file
@@ -0,0 +1,55 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Doctrine\Tests\Common\Lexer;
|
||||
|
||||
use Doctrine\Common\Lexer\AbstractLexer;
|
||||
|
||||
use function in_array;
|
||||
use function is_numeric;
|
||||
|
||||
/** @extends AbstractLexer<TokenType, string|int> */
|
||||
class EnumLexer extends AbstractLexer
|
||||
{
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
protected function getCatchablePatterns(): array
|
||||
{
|
||||
return [
|
||||
'=|<|>',
|
||||
'[a-z]+',
|
||||
'\d+',
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
protected function getNonCatchablePatterns(): array
|
||||
{
|
||||
return [
|
||||
'\s+',
|
||||
'(.)',
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
protected function getType(&$value): TokenType
|
||||
{
|
||||
if (is_numeric($value)) {
|
||||
$value = (int) $value;
|
||||
|
||||
return TokenType::INT;
|
||||
}
|
||||
|
||||
if (in_array($value, ['=', '<', '>'])) {
|
||||
return TokenType::OPERATOR;
|
||||
}
|
||||
|
||||
return TokenType::STRING;
|
||||
}
|
||||
}
|
||||
43
pro_v3.5.1/vendor/doctrine/lexer/tests/MutableLexer.php
vendored
Normal file
43
pro_v3.5.1/vendor/doctrine/lexer/tests/MutableLexer.php
vendored
Normal file
@@ -0,0 +1,43 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Doctrine\Tests\Common\Lexer;
|
||||
|
||||
use Doctrine\Common\Lexer\AbstractLexer;
|
||||
|
||||
/** @extends AbstractLexer<int, string> */
|
||||
class MutableLexer extends AbstractLexer
|
||||
{
|
||||
/** @var string[] */
|
||||
private $catchablePatterns = [];
|
||||
|
||||
public function addCatchablePattern(string $pattern): void
|
||||
{
|
||||
$this->catchablePatterns[] = $pattern;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
protected function getCatchablePatterns(): array
|
||||
{
|
||||
return $this->catchablePatterns;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
protected function getNonCatchablePatterns(): array
|
||||
{
|
||||
return ['[\s,]+'];
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
protected function getType(&$value): int
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
54
pro_v3.5.1/vendor/doctrine/lexer/tests/TokenTest.php
vendored
Normal file
54
pro_v3.5.1/vendor/doctrine/lexer/tests/TokenTest.php
vendored
Normal file
@@ -0,0 +1,54 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Doctrine\Tests\Common\Lexer;
|
||||
|
||||
use Doctrine\Common\Lexer\Token;
|
||||
use Doctrine\Deprecations\PHPUnit\VerifyDeprecations;
|
||||
use PHPUnit\Framework\TestCase;
|
||||
|
||||
final class TokenTest extends TestCase
|
||||
{
|
||||
use VerifyDeprecations;
|
||||
|
||||
public function testIsA(): void
|
||||
{
|
||||
/** @var Token<'string'|'int', string> $token */
|
||||
$token = new Token('foo', 'string', 1);
|
||||
|
||||
self::assertTrue($token->isA('string'));
|
||||
self::assertTrue($token->isA('int', 'string'));
|
||||
self::assertFalse($token->isA('int'));
|
||||
}
|
||||
|
||||
public function testOffsetGetIsDeprecated(): void
|
||||
{
|
||||
$token = new Token('foo', 'string', 1);
|
||||
self::expectDeprecationWithIdentifier('https://github.com/doctrine/lexer/pull/79');
|
||||
self::assertSame('foo', $token['value']);
|
||||
}
|
||||
|
||||
public function testOffsetExistsIsDeprecated(): void
|
||||
{
|
||||
$token = new Token('foo', 'string', 1);
|
||||
self::expectDeprecationWithIdentifier('https://github.com/doctrine/lexer/pull/79');
|
||||
self::assertTrue(isset($token['value']));
|
||||
}
|
||||
|
||||
public function testOffsetSetIsDeprecated(): void
|
||||
{
|
||||
$token = new Token('foo', 'string', 1);
|
||||
self::expectDeprecationWithIdentifier('https://github.com/doctrine/lexer/pull/79');
|
||||
$token['value'] = 'bar';
|
||||
self::assertSame('bar', $token->value);
|
||||
}
|
||||
|
||||
public function testOffsetUnsetIsDeprecated(): void
|
||||
{
|
||||
$token = new Token('foo', 'string', 1);
|
||||
self::expectDeprecationWithIdentifier('https://github.com/doctrine/lexer/pull/79');
|
||||
unset($token['value']);
|
||||
self::assertNull($token->value);
|
||||
}
|
||||
}
|
||||
12
pro_v3.5.1/vendor/doctrine/lexer/tests/TokenType.php
vendored
Normal file
12
pro_v3.5.1/vendor/doctrine/lexer/tests/TokenType.php
vendored
Normal file
@@ -0,0 +1,12 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Doctrine\Tests\Common\Lexer;
|
||||
|
||||
enum TokenType
|
||||
{
|
||||
case INT;
|
||||
case OPERATOR;
|
||||
case STRING;
|
||||
}
|
||||
Reference in New Issue
Block a user