composer update

This commit is contained in:
2026-07-29 16:32:25 +02:00
parent 1ede9cc3af
commit 8ad8d279e6
1156 changed files with 22791 additions and 22591 deletions
+1 -1
View File
@@ -6,7 +6,7 @@ PHP Parser
This is a PHP 5.2 to PHP 8.2 parser written in PHP. Its purpose is to simplify static code analysis and
manipulation.
[**Documentation for version 4.x**][doc_4_x] (stable; for running on PHP >= 7.0; for parsing PHP 5.2 to PHP 8.2).
[**Documentation for version 4.x**][doc_4_x] (stable; for running on PHP >= 7.1; for parsing PHP 5.2 to PHP 8.2).
[Documentation for version 3.x][doc_3_x] (unsupported; for running on PHP >= 5.5; for parsing PHP 5.2 to PHP 7.2).
+2 -7
View File
@@ -13,18 +13,13 @@
}
],
"require": {
"php": ">=7.0",
"php": ">=7.1",
"ext-tokenizer": "*"
},
"require-dev": {
"phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0",
"phpunit/phpunit": "^7.0 || ^8.0 || ^9.0",
"ircmaxell/php-yacc": "^0.0.7"
},
"extra": {
"branch-alias": {
"dev-master": "4.9-dev"
}
},
"autoload": {
"psr-4": {
"PhpParser\\": "lib/PhpParser"
-30
View File
@@ -1,30 +0,0 @@
What do all those files mean?
=============================
* `php5.y`: PHP 5 grammar written in a pseudo language
* `php7.y`: PHP 7 grammar written in a pseudo language
* `tokens.y`: Tokens definition shared between PHP 5 and PHP 7 grammars
* `parser.template`: A `kmyacc` parser prototype file for PHP
* `tokens.template`: A `kmyacc` prototype file for the `Tokens` class
* `rebuildParsers.php`: Preprocesses the grammar and builds the parser using `kmyacc`
.phpy pseudo language
=====================
The `.y` file is a normal grammar in `kmyacc` (`yacc`) style, with some transformations
applied to it:
* Nodes are created using the syntax `Name[..., ...]`. This is transformed into
`new Name(..., ..., attributes())`
* Some function-like constructs are resolved (see `rebuildParsers.php` for a list)
Building the parser
===================
Run `php grammar/rebuildParsers.php` to rebuild the parsers. Additional options:
* The `KMYACC` environment variable can be used to specify an alternative `kmyacc` binary.
By default the `phpyacc` dev dependency will be used. To use the original `kmyacc`, you
need to compile [moriyoshi's fork](https://github.com/moriyoshi/kmyacc-forked).
* The `--debug` option enables emission of debug symbols and creates the `y.output` file.
* The `--keep-tmp-grammar` option preserves the preprocessed grammar file.
-106
View File
@@ -1,106 +0,0 @@
<?php
$meta #
#semval($) $this->semValue
#semval($,%t) $this->semValue
#semval(%n) $stackPos-(%l-%n)
#semval(%n,%t) $stackPos-(%l-%n)
namespace PhpParser\Parser;
use PhpParser\Error;
use PhpParser\Node;
use PhpParser\Node\Expr;
use PhpParser\Node\Name;
use PhpParser\Node\Scalar;
use PhpParser\Node\Stmt;
#include;
/* This is an automatically GENERATED file, which should not be manually edited.
* Instead edit one of the following:
* * the grammar files grammar/php5.y or grammar/php7.y
* * the skeleton file grammar/parser.template
* * the preprocessing script grammar/rebuildParsers.php
*/
class #(-p) extends \PhpParser\ParserAbstract
{
protected $tokenToSymbolMapSize = #(YYMAXLEX);
protected $actionTableSize = #(YYLAST);
protected $gotoTableSize = #(YYGLAST);
protected $invalidSymbol = #(YYBADCH);
protected $errorSymbol = #(YYINTERRTOK);
protected $defaultAction = #(YYDEFAULT);
protected $unexpectedTokenRule = #(YYUNEXPECTED);
protected $YY2TBLSTATE = #(YY2TBLSTATE);
protected $numNonLeafStates = #(YYNLSTATES);
protected $symbolToName = array(
#listvar terminals
);
protected $tokenToSymbol = array(
#listvar yytranslate
);
protected $action = array(
#listvar yyaction
);
protected $actionCheck = array(
#listvar yycheck
);
protected $actionBase = array(
#listvar yybase
);
protected $actionDefault = array(
#listvar yydefault
);
protected $goto = array(
#listvar yygoto
);
protected $gotoCheck = array(
#listvar yygcheck
);
protected $gotoBase = array(
#listvar yygbase
);
protected $gotoDefault = array(
#listvar yygdefault
);
protected $ruleToNonTerminal = array(
#listvar yylhs
);
protected $ruleToLength = array(
#listvar yylen
);
#if -t
protected $productions = array(
#production-strings;
);
#endif
protected function initReduceCallbacks() {
$this->reduceCallbacks = [
#reduce
%n => function ($stackPos) {
%b
},
#noact
%n => function ($stackPos) {
$this->semValue = $this->semStack[$stackPos];
},
#endreduce
];
}
}
#tailcode;
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
-184
View File
@@ -1,184 +0,0 @@
<?php
///////////////////////////////
/// Utility regex constants ///
///////////////////////////////
const LIB = '(?(DEFINE)
(?<singleQuotedString>\'[^\\\\\']*+(?:\\\\.[^\\\\\']*+)*+\')
(?<doubleQuotedString>"[^\\\\"]*+(?:\\\\.[^\\\\"]*+)*+")
(?<string>(?&singleQuotedString)|(?&doubleQuotedString))
(?<comment>/\*[^*]*+(?:\*(?!/)[^*]*+)*+\*/)
(?<code>\{[^\'"/{}]*+(?:(?:(?&string)|(?&comment)|(?&code)|/)[^\'"/{}]*+)*+})
)';
const PARAMS = '\[(?<params>[^[\]]*+(?:\[(?&params)\][^[\]]*+)*+)\]';
const ARGS = '\((?<args>[^()]*+(?:\((?&args)\)[^()]*+)*+)\)';
///////////////////////////////
/// Preprocessing functions ///
///////////////////////////////
function preprocessGrammar($code) {
$code = resolveNodes($code);
$code = resolveMacros($code);
$code = resolveStackAccess($code);
return $code;
}
function resolveNodes($code) {
return preg_replace_callback(
'~\b(?<name>[A-Z][a-zA-Z_\\\\]++)\s*' . PARAMS . '~',
function($matches) {
// recurse
$matches['params'] = resolveNodes($matches['params']);
$params = magicSplit(
'(?:' . PARAMS . '|' . ARGS . ')(*SKIP)(*FAIL)|,',
$matches['params']
);
$paramCode = '';
foreach ($params as $param) {
$paramCode .= $param . ', ';
}
return 'new ' . $matches['name'] . '(' . $paramCode . 'attributes())';
},
$code
);
}
function resolveMacros($code) {
return preg_replace_callback(
'~\b(?<!::|->)(?!array\()(?<name>[a-z][A-Za-z]++)' . ARGS . '~',
function($matches) {
// recurse
$matches['args'] = resolveMacros($matches['args']);
$name = $matches['name'];
$args = magicSplit(
'(?:' . PARAMS . '|' . ARGS . ')(*SKIP)(*FAIL)|,',
$matches['args']
);
if ('attributes' === $name) {
assertArgs(0, $args, $name);
return '$this->startAttributeStack[#1] + $this->endAttributes';
}
if ('stackAttributes' === $name) {
assertArgs(1, $args, $name);
return '$this->startAttributeStack[' . $args[0] . ']'
. ' + $this->endAttributeStack[' . $args[0] . ']';
}
if ('init' === $name) {
return '$$ = array(' . implode(', ', $args) . ')';
}
if ('push' === $name) {
assertArgs(2, $args, $name);
return $args[0] . '[] = ' . $args[1] . '; $$ = ' . $args[0];
}
if ('pushNormalizing' === $name) {
assertArgs(2, $args, $name);
return 'if (is_array(' . $args[1] . ')) { $$ = array_merge(' . $args[0] . ', ' . $args[1] . '); }'
. ' else { ' . $args[0] . '[] = ' . $args[1] . '; $$ = ' . $args[0] . '; }';
}
if ('toArray' == $name) {
assertArgs(1, $args, $name);
return 'is_array(' . $args[0] . ') ? ' . $args[0] . ' : array(' . $args[0] . ')';
}
if ('parseVar' === $name) {
assertArgs(1, $args, $name);
return 'substr(' . $args[0] . ', 1)';
}
if ('parseEncapsed' === $name) {
assertArgs(3, $args, $name);
return 'foreach (' . $args[0] . ' as $s) { if ($s instanceof Node\Scalar\EncapsedStringPart) {'
. ' $s->value = Node\Scalar\String_::parseEscapeSequences($s->value, ' . $args[1] . ', ' . $args[2] . '); } }';
}
if ('makeNop' === $name) {
assertArgs(3, $args, $name);
return '$startAttributes = ' . $args[1] . ';'
. ' if (isset($startAttributes[\'comments\']))'
. ' { ' . $args[0] . ' = new Stmt\Nop($startAttributes + ' . $args[2] . '); }'
. ' else { ' . $args[0] . ' = null; }';
}
if ('makeZeroLengthNop' == $name) {
assertArgs(2, $args, $name);
return '$startAttributes = ' . $args[1] . ';'
. ' if (isset($startAttributes[\'comments\']))'
. ' { ' . $args[0] . ' = new Stmt\Nop($this->createCommentNopAttributes($startAttributes[\'comments\'])); }'
. ' else { ' . $args[0] . ' = null; }';
}
if ('prependLeadingComments' === $name) {
assertArgs(1, $args, $name);
return '$attrs = $this->startAttributeStack[#1]; $stmts = ' . $args[0] . '; '
. 'if (!empty($attrs[\'comments\'])) {'
. '$stmts[0]->setAttribute(\'comments\', '
. 'array_merge($attrs[\'comments\'], $stmts[0]->getAttribute(\'comments\', []))); }';
}
return $matches[0];
},
$code
);
}
function assertArgs($num, $args, $name) {
if ($num != count($args)) {
die('Wrong argument count for ' . $name . '().');
}
}
function resolveStackAccess($code) {
$code = preg_replace('/\$\d+/', '$this->semStack[$0]', $code);
$code = preg_replace('/#(\d+)/', '$$1', $code);
return $code;
}
function removeTrailingWhitespace($code) {
$lines = explode("\n", $code);
$lines = array_map('rtrim', $lines);
return implode("\n", $lines);
}
//////////////////////////////
/// Regex helper functions ///
//////////////////////////////
function regex($regex) {
return '~' . LIB . '(?:' . str_replace('~', '\~', $regex) . ')~';
}
function magicSplit($regex, $string) {
$pieces = preg_split(regex('(?:(?&string)|(?&comment)|(?&code))(*SKIP)(*FAIL)|' . $regex), $string);
foreach ($pieces as &$piece) {
$piece = trim($piece);
}
if ($pieces === ['']) {
return [];
}
return $pieces;
}
-81
View File
@@ -1,81 +0,0 @@
<?php
require __DIR__ . '/phpyLang.php';
$grammarFileToName = [
__DIR__ . '/php5.y' => 'Php5',
__DIR__ . '/php7.y' => 'Php7',
];
$tokensFile = __DIR__ . '/tokens.y';
$tokensTemplate = __DIR__ . '/tokens.template';
$skeletonFile = __DIR__ . '/parser.template';
$tmpGrammarFile = __DIR__ . '/tmp_parser.phpy';
$tmpResultFile = __DIR__ . '/tmp_parser.php';
$resultDir = __DIR__ . '/../lib/PhpParser/Parser';
$tokensResultsFile = $resultDir . '/Tokens.php';
$kmyacc = getenv('KMYACC');
if (!$kmyacc) {
// Use phpyacc from dev dependencies by default.
$kmyacc = __DIR__ . '/../vendor/bin/phpyacc';
}
$options = array_flip($argv);
$optionDebug = isset($options['--debug']);
$optionKeepTmpGrammar = isset($options['--keep-tmp-grammar']);
///////////////////
/// Main script ///
///////////////////
$tokens = file_get_contents($tokensFile);
foreach ($grammarFileToName as $grammarFile => $name) {
echo "Building temporary $name grammar file.\n";
$grammarCode = file_get_contents($grammarFile);
$grammarCode = str_replace('%tokens', $tokens, $grammarCode);
$grammarCode = preprocessGrammar($grammarCode);
file_put_contents($tmpGrammarFile, $grammarCode);
$additionalArgs = $optionDebug ? '-t -v' : '';
echo "Building $name parser.\n";
$output = execCmd("$kmyacc $additionalArgs -m $skeletonFile -p $name $tmpGrammarFile");
$resultCode = file_get_contents($tmpResultFile);
$resultCode = removeTrailingWhitespace($resultCode);
ensureDirExists($resultDir);
file_put_contents("$resultDir/$name.php", $resultCode);
unlink($tmpResultFile);
echo "Building token definition.\n";
$output = execCmd("$kmyacc -m $tokensTemplate $tmpGrammarFile");
rename($tmpResultFile, $tokensResultsFile);
if (!$optionKeepTmpGrammar) {
unlink($tmpGrammarFile);
}
}
////////////////////////////////
/// Utility helper functions ///
////////////////////////////////
function ensureDirExists($dir) {
if (!is_dir($dir)) {
mkdir($dir, 0777, true);
}
}
function execCmd($cmd) {
$output = trim(shell_exec("$cmd 2>&1"));
if ($output !== "") {
echo "> " . $cmd . "\n";
echo $output;
}
return $output;
}
-17
View File
@@ -1,17 +0,0 @@
<?php
$meta #
#semval($) $this->semValue
#semval($,%t) $this->semValue
#semval(%n) $this->stackPos-(%l-%n)
#semval(%n,%t) $this->stackPos-(%l-%n)
namespace PhpParser\Parser;
#include;
/* GENERATED file based on grammar/tokens.y */
final class Tokens
{
#tokenval
const %s = %n;
#endtokenval
}
-115
View File
@@ -1,115 +0,0 @@
/* We currently rely on the token ID mapping to be the same between PHP 5 and PHP 7 - so the same lexer can be used for
* both. This is enforced by sharing this token file. */
%right T_THROW
%left T_INCLUDE T_INCLUDE_ONCE T_EVAL T_REQUIRE T_REQUIRE_ONCE
%left ','
%left T_LOGICAL_OR
%left T_LOGICAL_XOR
%left T_LOGICAL_AND
%right T_PRINT
%right T_YIELD
%right T_DOUBLE_ARROW
%right T_YIELD_FROM
%left '=' T_PLUS_EQUAL T_MINUS_EQUAL T_MUL_EQUAL T_DIV_EQUAL T_CONCAT_EQUAL T_MOD_EQUAL T_AND_EQUAL T_OR_EQUAL T_XOR_EQUAL T_SL_EQUAL T_SR_EQUAL T_POW_EQUAL T_COALESCE_EQUAL
%left '?' ':'
%right T_COALESCE
%left T_BOOLEAN_OR
%left T_BOOLEAN_AND
%left '|'
%left '^'
%left T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG
%nonassoc T_IS_EQUAL T_IS_NOT_EQUAL T_IS_IDENTICAL T_IS_NOT_IDENTICAL T_SPACESHIP
%nonassoc '<' T_IS_SMALLER_OR_EQUAL '>' T_IS_GREATER_OR_EQUAL
%left T_SL T_SR
%left '+' '-' '.'
%left '*' '/' '%'
%right '!'
%nonassoc T_INSTANCEOF
%right '~' T_INC T_DEC T_INT_CAST T_DOUBLE_CAST T_STRING_CAST T_ARRAY_CAST T_OBJECT_CAST T_BOOL_CAST T_UNSET_CAST '@'
%right T_POW
%right '['
%nonassoc T_NEW T_CLONE
%token T_EXIT
%token T_IF
%left T_ELSEIF
%left T_ELSE
%left T_ENDIF
%token T_LNUMBER
%token T_DNUMBER
%token T_STRING
%token T_STRING_VARNAME
%token T_VARIABLE
%token T_NUM_STRING
%token T_INLINE_HTML
%token T_ENCAPSED_AND_WHITESPACE
%token T_CONSTANT_ENCAPSED_STRING
%token T_ECHO
%token T_DO
%token T_WHILE
%token T_ENDWHILE
%token T_FOR
%token T_ENDFOR
%token T_FOREACH
%token T_ENDFOREACH
%token T_DECLARE
%token T_ENDDECLARE
%token T_AS
%token T_SWITCH
%token T_MATCH
%token T_ENDSWITCH
%token T_CASE
%token T_DEFAULT
%token T_BREAK
%token T_CONTINUE
%token T_GOTO
%token T_FUNCTION
%token T_FN
%token T_CONST
%token T_RETURN
%token T_TRY
%token T_CATCH
%token T_FINALLY
%token T_THROW
%token T_USE
%token T_INSTEADOF
%token T_GLOBAL
%right T_STATIC T_ABSTRACT T_FINAL T_PRIVATE T_PROTECTED T_PUBLIC T_READONLY
%token T_VAR
%token T_UNSET
%token T_ISSET
%token T_EMPTY
%token T_HALT_COMPILER
%token T_CLASS
%token T_TRAIT
%token T_INTERFACE
%token T_ENUM
%token T_EXTENDS
%token T_IMPLEMENTS
%token T_OBJECT_OPERATOR
%token T_NULLSAFE_OBJECT_OPERATOR
%token T_DOUBLE_ARROW
%token T_LIST
%token T_ARRAY
%token T_CALLABLE
%token T_CLASS_C
%token T_TRAIT_C
%token T_METHOD_C
%token T_FUNC_C
%token T_LINE
%token T_FILE
%token T_START_HEREDOC
%token T_END_HEREDOC
%token T_DOLLAR_OPEN_CURLY_BRACES
%token T_CURLY_OPEN
%token T_PAAMAYIM_NEKUDOTAYIM
%token T_NAMESPACE
%token T_NS_C
%token T_DIR
%token T_NS_SEPARATOR
%token T_ELLIPSIS
%token T_NAME_FULLY_QUALIFIED
%token T_NAME_QUALIFIED
%token T_NAME_RELATIVE
%token T_ATTRIBUTE
%token T_ENUM
@@ -19,12 +19,14 @@ class ClassConst implements PhpParser\Builder
/** @var Node\AttributeGroup[] */
protected $attributeGroups = [];
/** @var Identifier|Node\Name|Node\ComplexType */
protected $type;
/**
* Creates a class constant builder
*
* @param string|Identifier $name Name
* @param Node\Expr|bool|null|int|float|string|array $value Value
* @param Node\Expr|bool|null|int|float|string|array|\UnitEnum $value Value
*/
public function __construct($name, $value) {
$this->constants = [new Const_($name, BuilderHelpers::normalizeValue($value))];
@@ -34,7 +36,7 @@ class ClassConst implements PhpParser\Builder
* Add another constant to const group
*
* @param string|Identifier $name Name
* @param Node\Expr|bool|null|int|float|string|array $value Value
* @param Node\Expr|bool|null|int|float|string|array|\UnitEnum $value Value
*
* @return $this The builder instance (for fluid interface)
*/
@@ -116,6 +118,19 @@ class ClassConst implements PhpParser\Builder
return $this;
}
/**
* Sets the constant type.
*
* @param string|Node\Name|Identifier|Node\ComplexType $type
*
* @return $this
*/
public function setType($type) {
$this->type = BuilderHelpers::normalizeType($type);
return $this;
}
/**
* Returns the built class node.
*
@@ -126,7 +141,8 @@ class ClassConst implements PhpParser\Builder
$this->constants,
$this->flags,
$this->attributes,
$this->attributeGroups
$this->attributeGroups,
$this->type
);
}
}
+47 -1
View File
@@ -19,6 +19,8 @@ class Param implements PhpParser\Builder
protected $variadic = false;
protected $flags = 0;
/** @var Node\AttributeGroup[] */
protected $attributeGroups = [];
@@ -95,6 +97,50 @@ class Param implements PhpParser\Builder
return $this;
}
/**
* Makes the (promoted) parameter public.
*
* @return $this The builder instance (for fluid interface)
*/
public function makePublic() {
$this->flags = BuilderHelpers::addModifier($this->flags, Node\Stmt\Class_::MODIFIER_PUBLIC);
return $this;
}
/**
* Makes the (promoted) parameter protected.
*
* @return $this The builder instance (for fluid interface)
*/
public function makeProtected() {
$this->flags = BuilderHelpers::addModifier($this->flags, Node\Stmt\Class_::MODIFIER_PROTECTED);
return $this;
}
/**
* Makes the (promoted) parameter private.
*
* @return $this The builder instance (for fluid interface)
*/
public function makePrivate() {
$this->flags = BuilderHelpers::addModifier($this->flags, Node\Stmt\Class_::MODIFIER_PRIVATE);
return $this;
}
/**
* Makes the (promoted) parameter readonly.
*
* @return $this The builder instance (for fluid interface)
*/
public function makeReadonly() {
$this->flags = BuilderHelpers::addModifier($this->flags, Node\Stmt\Class_::MODIFIER_READONLY);
return $this;
}
/**
* Adds an attribute group.
*
@@ -116,7 +162,7 @@ class Param implements PhpParser\Builder
public function getNode() : Node {
return new Node\Param(
new Node\Expr\Variable($this->name),
$this->default, $this->type, $this->byRef, $this->variadic, [], 0, $this->attributeGroups
$this->default, $this->type, $this->byRef, $this->variadic, [], $this->flags, $this->attributeGroups
);
}
}
+4 -4
View File
@@ -213,7 +213,7 @@ class BuilderFactory
/**
* Creates node a for a literal value.
*
* @param Expr|bool|null|int|float|string|array $value $value
* @param Expr|bool|null|int|float|string|array|\UnitEnum $value $value
*
* @return Expr
*/
@@ -349,15 +349,15 @@ class BuilderFactory
/**
* Creates a class constant fetch node.
*
* @param string|Name|Expr $class Class name
* @param string|Identifier $name Constant name
* @param string|Name|Expr $class Class name
* @param string|Identifier|Expr $name Constant name
*
* @return Expr\ClassConstFetch
*/
public function classConstFetch($class, $name): Expr\ClassConstFetch {
return new Expr\ClassConstFetch(
BuilderHelpers::normalizeNameOrExpr($class),
BuilderHelpers::normalizeIdentifier($name)
BuilderHelpers::normalizeIdentifierOrExpr($name)
);
}
+6 -1
View File
@@ -6,6 +6,7 @@ use PhpParser\Node\ComplexType;
use PhpParser\Node\Expr;
use PhpParser\Node\Identifier;
use PhpParser\Node\Name;
use PhpParser\Node\Name\FullyQualified;
use PhpParser\Node\NullableType;
use PhpParser\Node\Scalar;
use PhpParser\Node\Stmt;
@@ -215,7 +216,7 @@ final class BuilderHelpers
* Normalizes a value: Converts nulls, booleans, integers,
* floats, strings and arrays into their respective nodes
*
* @param Node\Expr|bool|null|int|float|string|array $value The value to normalize
* @param Node\Expr|bool|null|int|float|string|array|\UnitEnum $value The value to normalize
*
* @return Expr The normalized value
*/
@@ -269,6 +270,10 @@ final class BuilderHelpers
return new Expr\Array_($items);
}
if ($value instanceof \UnitEnum) {
return new Expr\ClassConstFetch(new FullyQualified(\get_class($value)), new Identifier($value->name));
}
throw new \LogicException('Invalid value');
}
@@ -37,7 +37,7 @@ class ConstExprEvaluator
*
* @param callable|null $fallbackEvaluator To call if subexpression cannot be evaluated
*/
public function __construct(callable $fallbackEvaluator = null) {
public function __construct(?callable $fallbackEvaluator = null) {
$this->fallbackEvaluator = $fallbackEvaluator ?? function(Expr $expr) {
throw new ConstExprEvaluationException(
"Expression of type {$expr->getType()} cannot be evaluated"
@@ -19,6 +19,8 @@ class PrintableNewAnonClassNode extends Expr
{
/** @var Node\AttributeGroup[] PHP attribute groups */
public $attrGroups;
/** @var int Modifiers */
public $flags;
/** @var Node\Arg[] Arguments */
public $args;
/** @var null|Node\Name Name of extended class */
@@ -29,11 +31,12 @@ class PrintableNewAnonClassNode extends Expr
public $stmts;
public function __construct(
array $attrGroups, array $args, Node\Name $extends = null, array $implements,
array $attrGroups, int $flags, array $args, ?Node\Name $extends, array $implements,
array $stmts, array $attributes
) {
parent::__construct($attributes);
$this->attrGroups = $attrGroups;
$this->flags = $flags;
$this->args = $args;
$this->extends = $extends;
$this->implements = $implements;
@@ -46,7 +49,7 @@ class PrintableNewAnonClassNode extends Expr
// We don't assert that $class->name is null here, to allow consumers to assign unique names
// to anonymous classes for their own purposes. We simplify ignore the name here.
return new self(
$class->attrGroups, $newNode->args, $class->extends, $class->implements,
$class->attrGroups, $class->flags, $newNode->args, $class->extends, $class->implements,
$class->stmts, $newNode->getAttributes()
);
}
@@ -56,6 +59,6 @@ class PrintableNewAnonClassNode extends Expr
}
public function getSubNodeNames() : array {
return ['attrGroups', 'args', 'extends', 'implements', 'stmts'];
return ['attrGroups', 'flags', 'args', 'extends', 'implements', 'stmts'];
}
}
+1 -1
View File
@@ -69,7 +69,7 @@ class Lexer
* @param ErrorHandler|null $errorHandler Error handler to use for lexing errors. Defaults to
* ErrorHandler\Throwing
*/
public function startLexing(string $code, ErrorHandler $errorHandler = null) {
public function startLexing(string $code, ?ErrorHandler $errorHandler = null) {
if (null === $errorHandler) {
$errorHandler = new ErrorHandler\Throwing();
}
+1 -1
View File
@@ -74,7 +74,7 @@ class Emulative extends Lexer
}
}
public function startLexing(string $code, ErrorHandler $errorHandler = null) {
public function startLexing(string $code, ?ErrorHandler $errorHandler = null) {
$emulators = array_filter($this->emulators, function($emulator) use($code) {
return $emulator->isEmulationNeeded($code);
});
+1 -1
View File
@@ -36,7 +36,7 @@ class NameContext
*
* @param Name|null $namespace Null is the global namespace
*/
public function startNamespace(Name $namespace = null) {
public function startNamespace(?Name $namespace = null) {
$this->namespace = $namespace;
$this->origAliases = $this->aliases = [
Stmt\Use_::TYPE_NORMAL => [],
+1 -1
View File
@@ -27,7 +27,7 @@ class Arg extends NodeAbstract
*/
public function __construct(
Expr $value, bool $byRef = false, bool $unpack = false, array $attributes = [],
Identifier $name = null
?Identifier $name = null
) {
$this->attributes = $attributes;
$this->name = $name;
@@ -18,7 +18,7 @@ class ArrayDimFetch extends Expr
* @param null|Expr $dim Array index / dim
* @param array $attributes Additional attributes
*/
public function __construct(Expr $var, Expr $dim = null, array $attributes = []) {
public function __construct(Expr $var, ?Expr $dim = null, array $attributes = []) {
$this->attributes = $attributes;
$this->var = $var;
$this->dim = $dim;
@@ -23,7 +23,7 @@ class ArrayItem extends Expr
* @param bool $byRef Whether to assign by reference
* @param array $attributes Additional attributes
*/
public function __construct(Expr $value, Expr $key = null, bool $byRef = false, array $attributes = [], bool $unpack = false) {
public function __construct(Expr $value, ?Expr $key = null, bool $byRef = false, array $attributes = [], bool $unpack = false) {
$this->attributes = $attributes;
$this->key = $key;
$this->value = $value;
@@ -10,15 +10,15 @@ class ClassConstFetch extends Expr
{
/** @var Name|Expr Class name */
public $class;
/** @var Identifier|Error Constant name */
/** @var Identifier|Expr|Error Constant name */
public $name;
/**
* Constructs a class const fetch node.
*
* @param Name|Expr $class Class name
* @param string|Identifier|Error $name Constant name
* @param array $attributes Additional attributes
* @param Name|Expr $class Class name
* @param string|Identifier|Expr|Error $name Constant name
* @param array $attributes Additional attributes
*/
public function __construct($class, $name, array $attributes = []) {
$this->attributes = $attributes;
@@ -29,7 +29,7 @@ class ClassConstFetch extends Expr
public function getSubNodeNames() : array {
return ['class', 'name'];
}
public function getType() : string {
return 'Expr_ClassConstFetch';
}
+1 -1
View File
@@ -19,7 +19,7 @@ class Exit_ extends Expr
* @param null|Expr $expr Expression
* @param array $attributes Additional attributes
*/
public function __construct(Expr $expr = null, array $attributes = []) {
public function __construct(?Expr $expr = null, array $attributes = []) {
$this->attributes = $attributes;
$this->expr = $expr;
}
+1 -1
View File
@@ -18,7 +18,7 @@ class Yield_ extends Expr
* @param null|Expr $key Key expression
* @param array $attributes Additional attributes
*/
public function __construct(Expr $value = null, Expr $key = null, array $attributes = []) {
public function __construct(?Expr $value = null, ?Expr $key = null, array $attributes = []) {
$this->attributes = $attributes;
$this->key = $key;
$this->value = $value;
+14 -2
View File
@@ -6,7 +6,10 @@ use PhpParser\NodeAbstract;
class Name extends NodeAbstract
{
/** @var string[] Parts of the name */
/**
* @var string[] Parts of the name
* @deprecated Use getParts() instead
*/
public $parts;
private static $specialClassNames = [
@@ -30,6 +33,15 @@ class Name extends NodeAbstract
return ['parts'];
}
/**
* Get parts of name (split by the namespace separator).
*
* @return string[] Parts of name
*/
public function getParts(): array {
return $this->parts;
}
/**
* Gets the first part of the name, i.e. everything before the first namespace separator.
*
@@ -150,7 +162,7 @@ class Name extends NodeAbstract
*
* @return static|null Sliced name
*/
public function slice(int $offset, int $length = null) {
public function slice(int $offset, ?int $length = null) {
$numParts = count($this->parts);
$realOffset = $offset < 0 ? $offset + $numParts : $offset;
+1 -1
View File
@@ -34,7 +34,7 @@ class Param extends NodeAbstract
* @param AttributeGroup[] $attrGroups PHP attribute groups
*/
public function __construct(
$var, Expr $default = null, $type = null,
$var, ?Expr $default = null, $type = null,
bool $byRef = false, bool $variadic = false,
array $attributes = [],
int $flags = 0,
@@ -120,7 +120,7 @@ class String_ extends Scalar
} elseif ('u' === $str[0]) {
return self::codePointToUtf8(hexdec($matches[2]));
} else {
return chr(octdec($str));
return chr(octdec($str) & 255);
}
},
$str
+1 -1
View File
@@ -15,7 +15,7 @@ class Break_ extends Node\Stmt
* @param null|Node\Expr $num Number of loops to break
* @param array $attributes Additional attributes
*/
public function __construct(Node\Expr $num = null, array $attributes = []) {
public function __construct(?Node\Expr $num = null, array $attributes = []) {
$this->attributes = $attributes;
$this->num = $num;
}
+1 -1
View File
@@ -23,7 +23,7 @@ class Catch_ extends Node\Stmt
* @param array $attributes Additional attributes
*/
public function __construct(
array $types, Expr\Variable $var = null, array $stmts = [], array $attributes = []
array $types, ?Expr\Variable $var = null, array $stmts = [], array $attributes = []
) {
$this->attributes = $attributes;
$this->types = $types;
@@ -10,31 +10,36 @@ class ClassConst extends Node\Stmt
public $flags;
/** @var Node\Const_[] Constant declarations */
public $consts;
/** @var Node\AttributeGroup[] */
/** @var Node\AttributeGroup[] PHP attribute groups */
public $attrGroups;
/** @var Node\Identifier|Node\Name|Node\ComplexType|null Type declaration */
public $type;
/**
* Constructs a class const list node.
*
* @param Node\Const_[] $consts Constant declarations
* @param int $flags Modifiers
* @param array $attributes Additional attributes
* @param Node\AttributeGroup[] $attrGroups PHP attribute groups
* @param Node\Const_[] $consts Constant declarations
* @param int $flags Modifiers
* @param array $attributes Additional attributes
* @param Node\AttributeGroup[] $attrGroups PHP attribute groups
* @param null|string|Node\Identifier|Node\Name|Node\ComplexType $type Type declaration
*/
public function __construct(
array $consts,
int $flags = 0,
array $attributes = [],
array $attrGroups = []
array $attrGroups = [],
$type = null
) {
$this->attributes = $attributes;
$this->flags = $flags;
$this->consts = $consts;
$this->attrGroups = $attrGroups;
$this->type = \is_string($type) ? new Node\Identifier($type) : $type;
}
public function getSubNodeNames() : array {
return ['attrGroups', 'flags', 'consts'];
return ['attrGroups', 'flags', 'type', 'consts'];
}
/**
@@ -15,7 +15,7 @@ class Continue_ extends Node\Stmt
* @param null|Node\Expr $num Number of loops to continue
* @param array $attributes Additional attributes
*/
public function __construct(Node\Expr $num = null, array $attributes = []) {
public function __construct(?Node\Expr $num = null, array $attributes = []) {
$this->attributes = $attributes;
$this->num = $num;
}
@@ -18,7 +18,7 @@ class Declare_ extends Node\Stmt
* @param Node\Stmt[]|null $stmts Statements
* @param array $attributes Additional attributes
*/
public function __construct(array $declares, array $stmts = null, array $attributes = []) {
public function __construct(array $declares, ?array $stmts = null, array $attributes = []) {
$this->attributes = $attributes;
$this->declares = $declares;
$this->stmts = $stmts;
@@ -20,7 +20,7 @@ class EnumCase extends Node\Stmt
* @param AttributeGroup[] $attrGroups PHP attribute groups
* @param array $attributes Additional attributes
*/
public function __construct($name, Node\Expr $expr = null, array $attrGroups = [], array $attributes = []) {
public function __construct($name, ?Node\Expr $expr = null, array $attrGroups = [], array $attributes = []) {
parent::__construct($attributes);
$this->name = \is_string($name) ? new Node\Identifier($name) : $name;
$this->expr = $expr;
@@ -22,7 +22,7 @@ class Namespace_ extends Node\Stmt
* @param null|Node\Stmt[] $stmts Statements
* @param array $attributes Additional attributes
*/
public function __construct(Node\Name $name = null, $stmts = [], array $attributes = []) {
public function __construct(?Node\Name $name = null, $stmts = [], array $attributes = []) {
$this->attributes = $attributes;
$this->name = $name;
$this->stmts = $stmts;
@@ -18,7 +18,7 @@ class PropertyProperty extends Node\Stmt
* @param null|Node\Expr $default Default value
* @param array $attributes Additional attributes
*/
public function __construct($name, Node\Expr $default = null, array $attributes = []) {
public function __construct($name, ?Node\Expr $default = null, array $attributes = []) {
$this->attributes = $attributes;
$this->name = \is_string($name) ? new Node\VarLikeIdentifier($name) : $name;
$this->default = $default;
@@ -15,7 +15,7 @@ class Return_ extends Node\Stmt
* @param null|Node\Expr $expr Expression
* @param array $attributes Additional attributes
*/
public function __construct(Node\Expr $expr = null, array $attributes = []) {
public function __construct(?Node\Expr $expr = null, array $attributes = []) {
$this->attributes = $attributes;
$this->expr = $expr;
}
@@ -20,7 +20,7 @@ class StaticVar extends Node\Stmt
* @param array $attributes Additional attributes
*/
public function __construct(
Expr\Variable $var, Node\Expr $default = null, array $attributes = []
Expr\Variable $var, ?Node\Expr $default = null, array $attributes = []
) {
$this->attributes = $attributes;
$this->var = $var;
@@ -21,7 +21,7 @@ class TryCatch extends Node\Stmt
* @param null|Finally_ $finally Optional finally node
* @param array $attributes Additional attributes
*/
public function __construct(array $stmts, array $catches, Finally_ $finally = null, array $attributes = []) {
public function __construct(array $stmts, array $catches, ?Finally_ $finally = null, array $attributes = []) {
$this->attributes = $attributes;
$this->stmts = $stmts;
$this->catches = $catches;
+1 -1
View File
@@ -39,7 +39,7 @@ class NodeDumper
*
* @return string Dumped value
*/
public function dump($node, string $code = null) : string {
public function dump($node, ?string $code = null) : string {
$this->code = $code;
return $this->dumpRecursive($node);
}
@@ -35,7 +35,7 @@ class NameResolver extends NodeVisitorAbstract
* @param ErrorHandler|null $errorHandler Error handler
* @param array $options Options
*/
public function __construct(ErrorHandler $errorHandler = null, array $options = []) {
public function __construct(?ErrorHandler $errorHandler = null, array $options = []) {
$this->nameContext = new NameContext($errorHandler ?? new ErrorHandler\Throwing);
$this->preserveOriginalNames = $options['preserveOriginalNames'] ?? false;
$this->replaceNodes = $options['replaceNodes'] ?? true;
@@ -118,6 +118,9 @@ class NameResolver extends NodeVisitorAbstract
$this->addNamespacedName($const);
}
} else if ($node instanceof Stmt\ClassConst) {
if (null !== $node->type) {
$node->type = $this->resolveType($node->type);
}
$this->resolveAttrGroups($node);
} else if ($node instanceof Stmt\EnumCase) {
$this->resolveAttrGroups($node);
@@ -161,7 +164,7 @@ class NameResolver extends NodeVisitorAbstract
return null;
}
private function addAlias(Stmt\UseUse $use, int $type, Name $prefix = null) {
private function addAlias(Stmt\UseUse $use, int $type, ?Name $prefix = null) {
// Add prefix for group uses
$name = $prefix ? Name::concat($prefix, $use->name) : $use->name;
// Type is determined either by individual element or whole use declaration
+1 -1
View File
@@ -14,5 +14,5 @@ interface Parser
* @return Node\Stmt[]|null Array of statements (or null non-throwing error handler is used and
* the parser was unable to recover from an error).
*/
public function parse(string $code, ErrorHandler $errorHandler = null);
public function parse(string $code, ?ErrorHandler $errorHandler = null);
}
+1 -1
View File
@@ -24,7 +24,7 @@ class Multiple implements Parser
$this->parsers = $parsers;
}
public function parse(string $code, ErrorHandler $errorHandler = null) {
public function parse(string $code, ?ErrorHandler $errorHandler = null) {
if (null === $errorHandler) {
$errorHandler = new ErrorHandler\Throwing;
}
+283 -283
View File
@@ -27,7 +27,7 @@ class Php5 extends \PhpParser\ParserAbstract
protected $unexpectedTokenRule = 32767;
protected $YY2TBLSTATE = 415;
protected $numNonLeafStates = 663;
protected $numNonLeafStates = 664;
protected $symbolToName = array(
"EOF",
@@ -244,116 +244,116 @@ class Php5 extends \PhpParser\ParserAbstract
);
protected $action = array(
700, 670, 671, 672, 673, 674, 286, 675, 676, 677,
713, 714, 223, 224, 225, 226, 227, 228, 229, 230,
701, 671, 672, 673, 674, 675, 286, 676, 677, 678,
714, 715, 223, 224, 225, 226, 227, 228, 229, 230,
231, 232, 0, 233, 234, 235, 236, 237, 238, 239,
240, 241, 242, 243, 244,-32766,-32766,-32766,-32766,-32766,
-32766,-32766,-32766,-32766,-32767,-32767,-32767,-32767, 245, 246,
242, 243, 244,-32766,-32766, 678,-32766,-32766,-32766,-32766,
-32766,-32766,-32766,-32766,-32766, 1229, 245, 246, 1230, 679,
680, 681, 682, 683, 684, 685, 899, 900, 747,-32766,
-32766,-32766,-32766,-32766,-32766, 686, 687, 688, 689, 690,
691, 692, 693, 694, 695, 696, 716, 739, 717, 718,
719, 720, 708, 709, 710, 738, 711, 712, 697, 698,
699, 701, 702, 703, 741, 742, 743, 744, 745, 746,
875, 704, 705, 706, 707, 737, 728, 726, 727, 723,
724, 1046, 715, 721, 722, 729, 730, 732, 731, 733,
734, 55, 56, 425, 57, 58, 725, 736, 735, 755,
242, 243, 244,-32766,-32766, 679,-32766,-32766,-32766,-32766,
-32766,-32766,-32766,-32766,-32766, 1230, 245, 246, 1231, 680,
681, 682, 683, 684, 685, 686, 900, 901, 748,-32766,
-32766,-32766,-32766,-32766,-32766, 687, 688, 689, 690, 691,
692, 693, 694, 695, 696, 697, 717, 740, 718, 719,
720, 721, 709, 710, 711, 739, 712, 713, 698, 699,
700, 702, 703, 704, 742, 743, 744, 745, 746, 747,
876, 705, 706, 707, 708, 738, 729, 727, 728, 724,
725, 1047, 716, 722, 723, 730, 731, 733, 732, 734,
735, 55, 56, 425, 57, 58, 726, 737, 736, 756,
59, 60, -226, 61,-32766,-32766,-32766,-32766,-32766,-32766,
-32766,-32766,-32766,-32766, 337,-32767,-32767,-32767,-32767, 29,
107, 108, 109, 110, 111, 112, 113, 114, 115, 116,
117, 118, 119, 620,-32766,-32766,-32766,-32766, 62, 63,
1046,-32766,-32766,-32766, 64, 419, 65, 294, 295, 66,
67, 68, 69, 70, 71, 72, 73, 823, 25, 302,
74, 418, 984, 986, 669, 668, 1100, 1101, 1078, 755,
755, 767, 1220, 768, 470,-32766,-32766,-32766, 341, 749,
824, 54,-32767,-32767,-32767,-32767, 98, 99, 100, 101,
102, 220, 221, 222, 362, 876,-32766, 27,-32766,-32766,
-32766,-32766,-32766, 1046, 493, 126, 1080, 1079, 1081, 370,
1068, 930, 207, 478, 479, 952, 953, 954, 951, 950,
949, 128, 480, 481, 803, 1106, 1107, 1108, 1109, 1103,
1104, 319, 32, 297, 10, 211, -515, 1110, 1105, 669,
668, 1080, 1079, 1081, 220, 221, 222, 41, 364, 341,
334, 421, 336, 426, -128, -128, -128, 313, 1046, 469,
-4, 824, 54, 812, 770, 207, 40, 21, 427, -128,
471, -128, 472, -128, 473, -128, 1046, 428, 220, 221,
117, 118, 119, 621,-32766,-32766,-32766,-32766, 62, 63,
1047,-32766,-32766,-32766, 64, 419, 65, 294, 295, 66,
67, 68, 69, 70, 71, 72, 73, 824, 25, 302,
74, 418, 985, 987, 670, 669, 1101, 1102, 1079, 756,
756, 768, 1221, 769, 470,-32766,-32766,-32766, 341, 750,
825, 54,-32767,-32767,-32767,-32767, 98, 99, 100, 101,
102, 220, 221, 222, 362, 877,-32766, 27,-32766,-32766,
-32766,-32766,-32766, 1047, 492, 126, 1081, 1080, 1082, 370,
1069, 931, 207, 478, 479, 953, 954, 955, 952, 951,
950, 128, 480, 481, 804, 1107, 1108, 1109, 1110, 1104,
1105, 319, 32, 297, 10, 211, -515, 1111, 1106, 670,
669, 1081, 1080, 1082, 220, 221, 222, 41, 364, 341,
334, 421, 336, 426, -128, -128, -128, 313, 1047, 469,
-4, 825, 54, 813, 597, 207, 40, 21, 427, -128,
471, -128, 472, -128, 473, -128, 1047, 428, 220, 221,
222,-32766, 33, 34, 429, 361, 327, 52, 35, 474,
-32766,-32766,-32766, 342, 357, 358, 475, 476, 48, 207,
249, 669, 668, 477, 443, 300, 795, 846, 430, 431,
28,-32766, 814,-32766,-32766,-32766,-32766,-32766,-32766,-32766,
-32767,-32767,-32767,-32767,-32767, 952, 953, 954, 951, 950,
949, 422, 755, 424, 426, 826, 634, -128,-32766,-32766,
469, 824, 54, 288, 812, 1151, 755, 40, 21, 427,
317, 471, 345, 472, 129, 473, 9, 1186, 428, 769,
360, 324, 905, 33, 34, 429, 361, 1046, 415, 35,
474, 944, 1068, 315, 125, 357, 358, 475, 476,-32766,
-32766,-32766, 926, 302, 477, 121, 1068, 759, 846, 430,
431, 669, 668, 423, 755, 1152, 809, 1046, 480, 766,
-32766, 805,-32766,-32766,-32766,-32766, -261, 127, 347, 436,
841, 341, 1078, 1200, 426, 446, 826, 634, -4, 807,
469, 824, 54, 436, 812, 341, 755, 40, 21, 427,
444, 471, 130, 472, 1068, 473, 346, 767, 428, 768,
-211, -211, -211, 33, 34, 429, 361, 308, 1076, 35,
474,-32766,-32766,-32766, 1046, 357, 358, 475, 476,-32766,
-32766,-32766, 906, 120, 477, 539, 1068, 795, 846, 430,
431, 436,-32766, 341,-32766,-32766,-32766, 1046, 480, 810,
-32766, 925,-32766,-32766, 754, 1080, 1079, 1081, 49,-32766,
-32766,-32766, 749, 751, 426, 1201, 826, 634, -211, 30,
469, 669, 668, 436, 812, 341, 75, 40, 21, 427,
-32766, 471, 1064, 472, 124, 473, 669, 668, 428, 212,
-210, -210, -210, 33, 34, 429, 361, 51, 1186, 35,
474, 755,-32766,-32766,-32766, 357, 358, 475, 476, 213,
824, 54, 221, 222, 477, 20, 581, 795, 846, 430,
431, 220, 221, 222, 755, 222, 247, 78, 79, 80,
81, 341, 207, 517, 103, 104, 105, 752, 307, 131,
637, 1068, 207, 341, 207, 122, 826, 634, -210, 36,
249, 670, 669, 477, 443, 300, 796, 847, 430, 431,
28,-32766, 815,-32766,-32766,-32766,-32766,-32766,-32766,-32766,
-32767,-32767,-32767,-32767,-32767, 953, 954, 955, 952, 951,
950, 422, 756, 424, 426, 827, 635, -128,-32766,-32766,
469, 825, 54, 288, 813, 1152, 756, 40, 21, 427,
317, 471, 345, 472, 129, 473, 9, 1187, 428, 612,
360, 324, 906, 33, 34, 429, 361, 1047, 415, 35,
474, 945, 1069, 315, 125, 357, 358, 475, 476,-32766,
-32766,-32766, 927, 302, 477, 121, 1069, 760, 847, 430,
431, 670, 669, 423, 756, 1153, 810, 1047, 480, 767,
-32766, 806,-32766,-32766,-32766,-32766, -261, 127, 347, 436,
842, 341, 1079, 1201, 426, 446, 827, 635, -4, 808,
469, 825, 54, 436, 813, 341, 756, 40, 21, 427,
444, 471, 130, 472, 1069, 473, 346, 768, 428, 769,
-211, -211, -211, 33, 34, 429, 361, 308, 1077, 35,
474,-32766,-32766,-32766, 1047, 357, 358, 475, 476,-32766,
-32766,-32766, 907, 120, 477, 538, 1069, 796, 847, 430,
431, 436,-32766, 341,-32766,-32766,-32766, 1047, 480, 811,
-32766, 926,-32766,-32766, 755, 1081, 1080, 1082, 49,-32766,
-32766,-32766, 750, 752, 426, 1202, 827, 635, -211, 30,
469, 670, 669, 436, 813, 341, 75, 40, 21, 427,
-32766, 471, 1065, 472, 124, 473, 670, 669, 428, 212,
-210, -210, -210, 33, 34, 429, 361, 51, 1187, 35,
474, 756,-32766,-32766,-32766, 357, 358, 475, 476, 213,
825, 54, 221, 222, 477, 20, 580, 796, 847, 430,
431, 220, 221, 222, 756, 222, 247, 78, 79, 80,
81, 341, 207, 516, 103, 104, 105, 753, 307, 131,
638, 1069, 207, 341, 207, 122, 827, 635, -210, 36,
106, 82, 83, 84, 85, 86, 87, 88, 89, 90,
91, 92, 93, 94, 95, 96, 97, 98, 99, 100,
101, 102, 103, 104, 105, 1112, 307, 346, 436, 214,
341, 824, 54, 426, 123, 250, 129, 134, 106, 469,
-32766, 572, 1112, 812, 245, 246, 40, 21, 427, 251,
471, 252, 472, 341, 473, 453, 22, 428, 207, 899,
900, 638, 33, 34, 429, 824, 54, -86, 35, 474,
101, 102, 103, 104, 105, 1113, 307, 346, 436, 214,
341, 825, 54, 426, 123, 250, 129, 134, 106, 469,
-32766, 571, 1113, 813, 245, 246, 40, 21, 427, 251,
471, 252, 472, 341, 473, 453, 22, 428, 207, 900,
901, 639, 33, 34, 429, 825, 54, -86, 35, 474,
220, 221, 222, 314, 357, 358, 100, 101, 102, 239,
240, 241, 645, 477, -230, 458, 589, 135, 374, 596,
597, 207, 760, 640, 648, 642, 941, 654, 929, 662,
822, 133, 307, 837, 426,-32766, 106, 749, 43, 44,
469, 45, 442, 46, 812, 826, 634, 40, 21, 427,
240, 241, 646, 477, -230, 458, 588, 135, 374, 595,
596, 207, 761, 641, 649, 643, 942, 655, 930, 663,
823, 133, 307, 838, 426,-32766, 106, 750, 43, 44,
469, 45, 442, 46, 813, 827, 635, 40, 21, 427,
47, 471, 50, 472, 53, 473, 132, 608, 428, 302,
604, -280,-32766, 33, 34, 429, 824, 54, 426, 35,
474, 755, 957, -84, 469, 357, 358, 521, 812, 628,
363, 40, 21, 427, 477, 471, 575, 472, -515, 473,
847, 616, 428, -423,-32766, 11, 646, 33, 34, 429,
824, 54, 445, 35, 474, 462, 285, 578, 1111, 357,
358, 593, 369, 848, 594, 290, 826, 634, 477, 0,
0, 532, 0, 0, 325, 0, 0, 0, 0, 0,
651, 0, 0, 0, 322, 326, 0, 0, 0, 426,
0, 0, 0, 0, 323, 469, 316, 318, -516, 812,
862, 634, 40, 21, 427, 0, 471, 0, 472, 0,
473, 1158, 0, 428, 0, -414, 6, 7, 33, 34,
429, 824, 54, 426, 35, 474, 12, 14, 373, 469,
357, 358, -424, 812, 563, 754, 40, 21, 427, 477,
471, 248, 472, 839, 473, 38, 39, 428, 657, 658,
765, 813, 33, 34, 429, 821, 800, 815, 35, 474,
215, 216, 878, 869, 357, 358, 217, 870, 218, 798,
863, 826, 634, 477, 860, 858, 936, 937, 934, 820,
209, 804, 806, 808, 811, 933, 763, 764, 1100, 1101,
935, 659, 78, 335, 426, 359, 1102, 635, 639, 641,
469, 643, 644, 647, 812, 826, 634, 40, 21, 427,
649, 471, 650, 472, 652, 473, 653, 636, 428, 796,
1226, 1228, 762, 33, 34, 429, 215, 216, 845, 35,
474, 761, 217, 844, 218, 357, 358, 1227, 843, 1060,
831, 1048, 842, 1049, 477, 559, 209, 1106, 1107, 1108,
1109, 1103, 1104, 398, 1100, 1101, 829, 942, 867, 1110,
1105, 868, 1102, 457, 1225, 1194, 1192, 1177, 1157, 219,
1190, 1091, 917, 1198, 1188, 0, 826, 634, 24, -433,
26, 31, 37, 42, 76, 77, 210, 287, 292, 293,
604, -280,-32766, 33, 34, 429, 825, 54, 426, 35,
474, 756, 958, -84, 469, 357, 358, 520, 813, 629,
363, 40, 21, 427, 477, 471, 574, 472, -515, 473,
848, 617, 428, -423,-32766, 11, 647, 33, 34, 429,
825, 54, 445, 35, 474, 462, 285, 577, 1112, 357,
358, 592, 369, 849, 593, 290, 827, 635, 477, 0,
0, 531, 0, 0, 325, 0, 0, 0, 0, 0,
652, 0, 0, 0, 322, 326, 0, 0, 0, 426,
0, 0, 0, 0, 323, 469, 316, 318, -516, 813,
863, 635, 40, 21, 427, 0, 471, 0, 472, 0,
473, 1159, 0, 428, 0, -414, 6, 7, 33, 34,
429, 825, 54, 426, 35, 474, 12, 14, 373, 469,
357, 358, -424, 813, 562, 755, 40, 21, 427, 477,
471, 248, 472, 840, 473, 38, 39, 428, 658, 659,
814, 822, 33, 34, 429, 801, 816, 879, 35, 474,
215, 216, 870, 871, 357, 358, 217, 771, 218, 799,
864, 827, 635, 477, 770, 861, 859, 937, 938, 935,
209, 821, 805, 807, 809, 812, 934, 764, 1101, 1102,
765, 936, 24, 78, 426, 335, 1103, 359, 636, 640,
469, 642, 644, 645, 813, 827, 635, 40, 21, 427,
648, 471, 650, 472, 651, 473, 653, 654, 428, 637,
26, 660, 797, 33, 34, 429, 215, 216, 1227, 35,
474, 1229, 217, 763, 218, 357, 358, 846, 762, 845,
1228, 844, 1061, 832, 477, 558, 209, 1107, 1108, 1109,
1110, 1104, 1105, 398, 1101, 1102, 1049, 843, 1050, 1111,
1106, 830, 1103, 943, 868, 869, 457, 1226, 1158, 219,
1195, 1193, 1178, 1191, 1092, 918, 827, 635, 31, 1199,
1189, 1056, 37, 42, 76, 77, 210, 287, 292, 293,
308, 309, 310, 311, 339, 356, 416, 0, -227, -226,
16, 17, 18, 393, 454, 461, 463, 467, 553, 625,
1051, 559, 1054, 1106, 1107, 1108, 1109, 1103, 1104, 398,
907, 1116, 1050, 1026, 564, 1110, 1105, 1025, 1093, 1055,
0, 1044, 0, 1057, 1056, 219, 1059, 1058, 1075, 0,
1191, 1176, 1172, 1189, 1090, 1223, 1117, 1171, 600
16, 17, 18, 393, 454, 461, 463, 467, 552, 626,
1052, 558, 1055, 1107, 1108, 1109, 1110, 1104, 1105, 398,
908, 1117, 1051, 1027, 563, 1111, 1106, 1026, 1094, 1058,
0, -433, 1045, 0, 1057, 219, 1060, 1059, 1076, 0,
1192, 1177, 1173, 1190, 1091, 1224, 1118, 1172, 600
);
protected $actionCheck = array(
@@ -451,26 +451,26 @@ class Php5 extends \PhpParser\ParserAbstract
50, 51, 156, 156, 115, 116, 56, 156, 58, 156,
156, 156, 157, 124, 156, 156, 156, 156, 156, 156,
70, 156, 156, 156, 156, 156, 156, 156, 78, 79,
156, 158, 157, 157, 74, 157, 86, 157, 157, 157,
156, 156, 159, 157, 74, 157, 86, 157, 157, 157,
80, 157, 157, 157, 84, 156, 157, 87, 88, 89,
157, 91, 157, 93, 157, 95, 157, 157, 98, 158,
158, 158, 158, 103, 104, 105, 50, 51, 158, 109,
157, 91, 157, 93, 157, 95, 157, 157, 98, 157,
159, 158, 158, 103, 104, 105, 50, 51, 158, 109,
110, 158, 56, 158, 58, 115, 116, 158, 158, 158,
158, 158, 158, 158, 124, 135, 70, 137, 138, 139,
140, 141, 142, 143, 78, 79, 158, 158, 158, 149,
150, 158, 86, 158, 158, 158, 158, 158, 164, 159,
158, 158, 158, 158, 158, -1, 156, 157, 159, 162,
159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
158, 158, 158, 158, 158, 158, 156, 157, 159, 158,
158, 163, 159, 159, 159, 159, 159, 159, 159, 159,
159, 159, 159, 159, 159, 159, 159, -1, 160, 160,
160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
160, 135, 160, 137, 138, 139, 140, 141, 142, 143,
160, 160, 160, 160, 160, 149, 150, 160, 160, 163,
-1, 162, -1, 163, 163, 159, 163, 163, 163, -1,
-1, 162, 162, -1, 163, 159, 163, 163, 163, -1,
163, 163, 163, 163, 163, 163, 163, 163, 163
);
protected $actionBase = array(
0, 229, 310, 390, 470, 103, 325, 325, 784, -2,
0, 229, 310, 390, 470, 103, 325, 325, 785, -2,
-2, 149, -2, -2, -2, 660, 765, 799, 765, 589,
694, 870, 870, 870, 252, 404, 404, 404, 514, 177,
177, 918, 434, 118, 295, 313, 240, 491, 491, 491,
@@ -483,9 +483,9 @@ class Php5 extends \PhpParser\ParserAbstract
491, 491, 491, 491, 491, 491, 491, 491, 491, 491,
491, 491, 491, 491, 491, 491, 491, 491, 491, 491,
491, 491, 491, 491, 491, 491, 491, 491, 491, 491,
491, 491, 491, 491, 491, 491, 89, 206, 773, 550,
535, 775, 776, 777, 912, 709, 913, 856, 857, 700,
858, 859, 862, 863, 864, 855, 865, 935, 866, 599,
491, 491, 491, 491, 491, 491, 89, 206, 775, 550,
535, 776, 777, 778, 912, 709, 913, 859, 862, 700,
863, 864, 865, 866, 867, 858, 871, 935, 872, 599,
599, 599, 599, 599, 599, 599, 599, 599, 599, 599,
599, 322, 592, 285, 319, 232, 44, 691, 691, 691,
691, 691, 691, 691, 182, 182, 182, 182, 182, 182,
@@ -504,43 +504,44 @@ class Php5 extends \PhpParser\ParserAbstract
554, 554, 679, -59, -59, 381, 462, 462, 462, 528,
717, 854, 382, 382, 382, 382, 382, 382, 561, 561,
561, -3, -3, -3, 692, 115, 137, 115, 137, 678,
732, 450, 732, 338, 677, -15, 510, 810, 468, 707,
850, 711, 853, 572, 735, 267, 529, 654, 674, 463,
732, 450, 732, 338, 677, -15, 510, 812, 468, 707,
856, 711, 857, 572, 735, 267, 529, 654, 674, 463,
529, 529, 529, 529, 654, 610, 640, 608, 463, 529,
463, 718, 323, 496, 89, 570, 507, 675, 778, 293,
670, 780, 290, 373, 332, 566, 278, 435, 733, 781,
463, 718, 323, 496, 89, 570, 507, 675, 779, 293,
670, 781, 290, 373, 332, 566, 278, 435, 733, 784,
914, 917, 385, 715, 675, 675, 675, 352, 511, 278,
-8, 605, 605, 605, 605, 156, 605, 605, 605, 605,
251, 276, 375, 402, 779, 657, 657, 690, 872, 869,
869, 657, 689, 657, 690, 874, 874, 874, 874, 657,
657, 657, 657, 869, 869, 869, 688, 869, 239, 703,
704, 704, 874, 742, 743, 657, 657, 712, 869, 869,
869, 712, 695, 874, 701, 741, 277, 869, 874, 672,
251, 276, 375, 402, 780, 657, 657, 690, 869, 783,
783, 657, 689, 657, 690, 874, 874, 874, 874, 657,
657, 657, 657, 783, 783, 783, 688, 783, 239, 703,
704, 704, 874, 742, 743, 657, 657, 712, 783, 783,
783, 712, 695, 874, 701, 741, 277, 783, 874, 672,
689, 672, 657, 701, 672, 689, 689, 672, 22, 666,
668, 873, 875, 887, 790, 662, 685, 879, 880, 876,
878, 871, 699, 744, 745, 497, 669, 671, 673, 680,
719, 682, 713, 674, 667, 667, 667, 655, 720, 655,
667, 667, 667, 667, 667, 667, 667, 667, 916, 646,
731, 714, 653, 749, 553, 573, 791, 664, 811, 900,
893, 867, 919, 881, 898, 655, 920, 739, 247, 643,
882, 783, 786, 655, 883, 655, 792, 655, 902, 812,
686, 813, 814, 667, 910, 921, 923, 924, 925, 927,
928, 929, 930, 684, 931, 750, 696, 894, 299, 877,
718, 729, 705, 788, 751, 820, 328, 932, 823, 655,
655, 794, 785, 655, 795, 756, 740, 890, 757, 895,
933, 664, 708, 896, 655, 706, 825, 934, 328, 681,
683, 888, 661, 761, 886, 911, 885, 796, 649, 663,
829, 830, 831, 693, 763, 891, 892, 889, 764, 803,
665, 805, 697, 832, 807, 884, 768, 833, 834, 899,
676, 730, 710, 698, 687, 809, 835, 897, 769, 770,
771, 848, 772, 849, 0, 0, 0, 0, 0, 0,
668, 873, 875, 887, 791, 662, 685, 879, 880, 876,
878, 811, 699, 744, 497, 669, 671, 673, 680, 719,
682, 713, 674, 667, 667, 667, 655, 720, 655, 667,
667, 667, 667, 667, 667, 667, 667, 868, 646, 731,
714, 653, 745, 553, 573, 792, 664, 814, 900, 893,
919, 920, 881, 898, 655, 916, 739, 247, 643, 882,
813, 788, 655, 883, 655, 794, 655, 902, 820, 686,
823, 825, 667, 910, 921, 923, 924, 925, 927, 928,
929, 930, 684, 931, 749, 696, 894, 299, 877, 718,
729, 705, 790, 750, 829, 328, 932, 830, 655, 655,
795, 786, 655, 796, 751, 740, 890, 756, 895, 933,
664, 708, 896, 655, 706, 831, 934, 328, 681, 683,
888, 661, 757, 886, 911, 885, 803, 761, 649, 663,
832, 833, 834, 693, 763, 891, 892, 889, 764, 805,
665, 807, 768, 697, 835, 809, 884, 769, 848, 849,
899, 676, 730, 710, 698, 687, 810, 850, 897, 770,
771, 772, 853, 773, 855, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 138, 138, 138, 138, -2, -2,
-2, -2, 0, 0, -2, 0, 0, 0, 138, 138,
0, 0, 0, 0, 0, 138, 138, 138, 138, -2,
-2, -2, -2, 0, 0, -2, 0, 0, 0, 138,
138, 138, 138, 138, 138, 138, 138, 138, 138, 138,
138, 138, 138, 138, 138, 138, 138, 138, 138, 138,
138, 138, 138, 138, 0, 0, 138, 138, 138, 138,
138, 138, 138, 138, 138, 0, 0, 138, 138, 138,
138, 138, 138, 138, 138, 138, 138, 138, 138, 138,
138, 138, 138, 138, 138, 138, 138, 138, 138, 138,
138, 138, 138, 138, 138, 138, 138, 138, 138, 138,
138, 138, 138, 138, 138, 138, 138, 138, 138, 138,
@@ -549,35 +550,34 @@ class Php5 extends \PhpParser\ParserAbstract
138, 138, 138, 138, 138, 138, 138, 138, 138, 138,
138, 138, 138, 138, 138, 138, 138, 138, 138, 138,
138, 138, 138, 138, 138, 138, 138, 138, 138, 138,
138, 138, 138, 138, 138, 138, 138, 138, 138, 599,
599, 599, 599, 599, 599, 599, 599, 599, 599, 599,
599, 599, 599, 599, 599, 599, 599, 599, 599, 599,
599, 599, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 599, -21, -21, -21, -21, 599,
-21, -21, -21, -21, -21, -21, -21, 599, 599, 599,
599, 599, 599, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 599, -21, -21, -21, -21,
599, -21, -21, -21, -21, -21, -21, -21, 599, 599,
599, 599, 599, 599, 599, 599, 599, 599, 599, 599,
599, 599, 599, 599, 599, -21, 599, 599, 599, -21,
382, -21, 382, 382, 382, 382, 382, 382, 382, 382,
599, 599, 599, 599, 599, 599, -21, 599, 599, 599,
-21, 382, -21, 382, 382, 382, 382, 382, 382, 382,
382, 382, 382, 382, 382, 382, 382, 382, 382, 382,
382, 382, 382, 382, 382, 382, 382, 382, 382, 382,
382, 382, 382, 382, 382, 382, 382, 382, 382, 382,
382, 382, 382, 382, 382, 382, 599, 0, 0, 599,
-21, 599, -21, 599, -21, -21, 599, 599, 599, 599,
599, 599, 599, -21, -21, -21, -21, -21, -21, 0,
561, 561, 561, 561, -21, -21, -21, -21, 382, 382,
382, 382, 382, 382, 259, 382, 382, 382, 382, 382,
382, 382, 382, 382, 382, 382, 561, 561, -3, -3,
382, 382, 382, 382, 382, 259, 382, 382, 463, 689,
689, 689, 137, 137, 137, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 137, 463, 0,
463, 0, 382, 463, 689, 463, 657, 137, 689, 689,
463, 869, 616, 616, 616, 616, 328, 278, 0, 0,
689, 689, 0, 0, 0, 0, 0, 689, 0, 0,
0, 0, 0, 0, 869, 0, 0, 0, 0, 0,
667, 247, 0, 705, 335, 0, 0, 0, 0, 0,
0, 705, 335, 347, 347, 0, 684, 667, 667, 667,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 328
382, 382, 382, 382, 382, 382, 382, 599, 0, 0,
599, -21, 599, -21, 599, -21, -21, 599, 599, 599,
599, 599, 599, 599, -21, -21, -21, -21, -21, -21,
0, 561, 561, 561, 561, -21, -21, -21, -21, 382,
382, 382, 382, 382, 382, 259, 382, 382, 382, 382,
382, 382, 382, 382, 382, 382, 382, 561, 561, -3,
-3, 382, 382, 382, 382, 382, 259, 382, 382, 463,
689, 689, 689, 137, 137, 137, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 137, 463,
0, 463, 0, 382, 463, 689, 463, 657, 137, 689,
689, 463, 783, 616, 616, 616, 616, 328, 278, 0,
0, 689, 689, 0, 0, 0, 0, 0, 689, 0,
0, 0, 0, 0, 0, 783, 0, 0, 0, 0,
0, 667, 247, 0, 705, 335, 0, 0, 0, 0,
0, 0, 705, 335, 347, 347, 0, 684, 667, 667,
667, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 328
);
protected $actionDefault = array(
@@ -629,90 +629,90 @@ class Php5 extends \PhpParser\ParserAbstract
32767, 190, 173,32767, 400, 175, 498,32767,32767, 240,
32767, 240,32767, 400, 240,32767,32767, 240,32767, 415,
439,32767,32767,32767,32767,32767,32767,32767,32767,32767,
32767,32767,32767,32767,32767,32767, 379, 380, 493, 506,
32767, 507,32767, 413, 343, 344, 346, 322,32767, 324,
369, 370, 371, 372, 373, 374, 375, 377,32767, 419,
32767, 422,32767,32767,32767, 257,32767, 557,32767,32767,
306, 557,32767,32767,32767, 551,32767,32767, 300,32767,
32767,32767,32767, 253,32767, 169,32767, 541,32767, 558,
32767, 515,32767, 342,32767,32767,32767,32767,32767,32767,
32767,32767,32767, 516,32767,32767,32767,32767, 229,32767,
452,32767, 116,32767,32767,32767, 189,32767,32767, 304,
248,32767,32767, 550,32767,32767,32767,32767,32767,32767,
32767,32767, 114,32767, 170,32767,32767,32767, 191,32767,
32767, 515,32767,32767,32767,32767,32767,32767,32767, 295,
32767,32767,32767,32767,32767, 379, 380, 493, 506,32767,
507,32767, 413, 343, 344, 346, 322,32767, 324, 369,
370, 371, 372, 373, 374, 375, 377,32767, 419,32767,
422,32767,32767,32767, 257,32767, 557,32767,32767, 306,
557,32767,32767,32767, 551,32767,32767, 300,32767,32767,
32767,32767, 253,32767, 169,32767, 541,32767, 558,32767,
515,32767, 342,32767,32767,32767,32767,32767,32767,32767,
32767,32767, 516,32767,32767,32767,32767, 229,32767, 452,
32767, 116,32767,32767,32767, 189,32767,32767, 304, 248,
32767,32767, 550,32767,32767,32767,32767,32767,32767,32767,
32767, 114,32767, 170,32767,32767,32767, 191,32767,32767,
515,32767,32767,32767,32767,32767,32767,32767,32767, 295,
32767,32767,32767,32767,32767,32767,32767, 515,32767,32767,
233,32767,32767,32767,32767,32767,32767,32767,32767,32767,
415,32767, 276,32767,32767,32767,32767,32767,32767,32767,
32767,32767,32767,32767, 127, 127, 3, 127, 127, 260,
3, 260, 127, 260, 260, 127, 127, 127, 127, 127,
127, 127, 127, 127, 127, 216, 219, 208, 208, 164,
127, 127, 268
32767, 415,32767, 276,32767,32767,32767,32767,32767,32767,
32767,32767,32767,32767,32767, 127, 127, 3, 127, 127,
260, 3, 260, 127, 260, 260, 127, 127, 127, 127,
127, 127, 127, 127, 127, 127, 216, 219, 208, 208,
164, 127, 127, 268
);
protected $goto = array(
166, 140, 140, 140, 166, 187, 168, 144, 147, 141,
142, 143, 149, 163, 163, 163, 163, 144, 144, 165,
165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
138, 159, 160, 161, 162, 184, 139, 185, 494, 495,
377, 496, 500, 501, 502, 503, 504, 505, 506, 507,
970, 164, 145, 146, 148, 171, 176, 186, 203, 253,
138, 159, 160, 161, 162, 184, 139, 185, 493, 494,
377, 495, 499, 500, 501, 502, 503, 504, 505, 506,
971, 164, 145, 146, 148, 171, 176, 186, 203, 253,
256, 258, 260, 263, 264, 265, 266, 267, 268, 269,
277, 278, 279, 280, 303, 304, 328, 329, 330, 394,
395, 396, 543, 188, 189, 190, 191, 192, 193, 194,
395, 396, 542, 188, 189, 190, 191, 192, 193, 194,
195, 196, 197, 198, 199, 200, 201, 150, 151, 152,
167, 153, 169, 154, 204, 170, 155, 156, 157, 205,
158, 136, 621, 561, 757, 561, 561, 561, 561, 561,
561, 561, 561, 561, 561, 561, 561, 561, 561, 561,
561, 561, 561, 561, 561, 561, 561, 561, 561, 561,
561, 561, 561, 561, 561, 561, 561, 561, 561, 561,
561, 561, 561, 561, 561, 561, 561, 561, 561, 1113,
629, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113,
1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113,
1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113,
1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113,
1113, 1113, 1113, 1113, 1113, 758, 520, 531, 509, 656,
556, 1183, 750, 509, 592, 786, 1183, 888, 612, 613,
884, 617, 618, 624, 626, 631, 633, 817, 855, 855,
855, 855, 850, 856, 174, 891, 891, 1205, 1205, 177,
158, 136, 622, 560, 758, 560, 560, 560, 560, 560,
560, 560, 560, 560, 560, 560, 560, 560, 560, 560,
560, 560, 560, 560, 560, 560, 560, 560, 560, 560,
560, 560, 560, 560, 560, 560, 560, 560, 560, 560,
560, 560, 560, 560, 560, 560, 560, 560, 560, 1114,
630, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114,
1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114,
1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114,
1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114,
1114, 1114, 1114, 1114, 1114, 759, 519, 530, 508, 657,
555, 1184, 350, 508, 591, 787, 1184, 889, 613, 614,
885, 618, 619, 625, 627, 632, 634, 751, 856, 856,
856, 856, 851, 857, 174, 892, 892, 1206, 1206, 177,
178, 179, 401, 402, 403, 404, 173, 202, 206, 208,
257, 259, 261, 262, 270, 271, 272, 273, 274, 275,
281, 282, 283, 284, 305, 306, 331, 332, 333, 406,
407, 408, 409, 175, 180, 254, 255, 181, 182, 183,
498, 498, 498, 498, 498, 498, 861, 498, 498, 498,
498, 498, 498, 498, 498, 498, 498, 510, 586, 538,
601, 602, 510, 545, 546, 547, 548, 549, 550, 551,
552, 554, 587, 1209, 560, 350, 560, 560, 560, 560,
560, 560, 560, 560, 560, 560, 560, 560, 560, 560,
560, 560, 560, 560, 560, 560, 560, 560, 560, 560,
560, 560, 560, 560, 560, 560, 560, 560, 560, 560,
560, 560, 560, 560, 560, 560, 560, 560, 560, 560,
400, 607, 537, 537, 569, 533, 909, 535, 535, 497,
499, 525, 541, 570, 573, 584, 591, 298, 296, 296,
296, 298, 289, 299, 611, 378, 511, 614, 595, 947,
375, 511, 437, 437, 437, 437, 437, 437, 1163, 437,
437, 437, 437, 437, 437, 437, 437, 437, 437, 1077,
948, 338, 1175, 321, 1077, 898, 898, 898, 898, 606,
898, 898, 1217, 1217, 1202, 753, 576, 605, 756, 1077,
1077, 1077, 1077, 1077, 1077, 1069, 384, 384, 384, 391,
1217, 877, 859, 857, 859, 655, 466, 512, 886, 881,
753, 384, 753, 384, 968, 384, 895, 385, 588, 353,
414, 384, 1231, 1019, 542, 1197, 1197, 1197, 568, 1094,
386, 386, 386, 904, 915, 515, 1029, 19, 15, 372,
389, 915, 940, 448, 450, 632, 340, 1216, 1216, 1114,
615, 938, 840, 555, 775, 386, 913, 1070, 1073, 1074,
399, 1069, 1182, 660, 23, 1216, 773, 1182, 544, 603,
1066, 1219, 1071, 1174, 1071, 519, 1199, 1199, 1199, 1089,
1088, 1072, 343, 523, 534, 519, 519, 772, 351, 352,
13, 579, 583, 627, 1061, 388, 782, 562, 771, 515,
783, 1181, 3, 4, 918, 956, 865, 451, 574, 1160,
497, 497, 497, 497, 497, 497, 818, 497, 497, 497,
497, 497, 497, 497, 497, 497, 497, 509, 585, 862,
601, 602, 509, 544, 545, 546, 547, 548, 549, 550,
551, 553, 586, 338, 559, 321, 559, 559, 559, 559,
559, 559, 559, 559, 559, 559, 559, 559, 559, 559,
559, 559, 559, 559, 559, 559, 559, 559, 559, 559,
559, 559, 559, 559, 559, 559, 559, 559, 559, 559,
559, 559, 559, 559, 559, 559, 559, 559, 559, 559,
400, 607, 536, 536, 568, 532, 537, 534, 534, 496,
498, 524, 540, 569, 572, 583, 590, 298, 296, 296,
296, 298, 289, 299, 611, 1210, 510, 615, 910, 948,
375, 510, 437, 437, 437, 437, 437, 437, 594, 437,
437, 437, 437, 437, 437, 437, 437, 437, 437, 1078,
949, 388, 1176, 561, 1078, 899, 899, 899, 899, 378,
899, 899, 1218, 1218, 1164, 754, 351, 352, 757, 1078,
1078, 1078, 1078, 1078, 1078, 1070, 384, 384, 384, 606,
1218, 878, 860, 858, 860, 656, 466, 511, 887, 882,
754, 384, 754, 384, 969, 384, 391, 385, 587, 353,
414, 384, 1232, 1203, 541, 1198, 1198, 1198, 567, 1095,
386, 386, 386, 1020, 916, 514, 1030, 19, 15, 372,
776, 916, 941, 448, 450, 633, 896, 1217, 1217, 1115,
616, 939, 841, 554, 905, 386, 340, 1071, 1074, 1075,
399, 1070, 1183, 914, 23, 1217, 774, 1183, 543, 603,
389, 1220, 1072, 1175, 1072, 518, 1200, 1200, 1200, 575,
605, 1073, 343, 522, 533, 518, 518, 773, 1090, 1089,
13, 578, 582, 628, 3, 4, 783, 1067, 772, 514,
1062, 1182, 784, 661, 919, 451, 866, 573, 957, 1161,
464, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 514, 529, 0, 0, 0, 0,
514, 0, 529, 0, 0, 0, 0, 610, 513, 516,
439, 440, 1067, 619, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 780, 1224, 0, 0, 0, 0,
0, 524, 0, 0, 0, 0, 0, 0, 0, 0,
0, 778, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 513, 528, 0, 0, 0, 0,
513, 0, 528, 0, 0, 0, 0, 610, 512, 515,
439, 440, 1068, 620, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 781, 1225, 0, 0, 0, 0,
0, 523, 0, 0, 0, 0, 0, 0, 0, 0,
0, 779, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 301, 301
);
@@ -739,40 +739,40 @@ class Php5 extends \PhpParser\ParserAbstract
128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
128, 128, 128, 128, 128, 16, 102, 32, 69, 32,
32, 120, 6, 69, 32, 29, 120, 32, 32, 32,
32, 32, 32, 32, 32, 32, 32, 50, 69, 69,
32, 120, 72, 69, 32, 29, 120, 32, 32, 32,
32, 32, 32, 32, 32, 32, 32, 6, 69, 69,
69, 69, 69, 69, 27, 77, 77, 77, 77, 27,
27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
119, 119, 119, 119, 119, 119, 33, 119, 119, 119,
119, 119, 119, 119, 119, 119, 119, 119, 67, 110,
119, 119, 119, 119, 119, 119, 50, 119, 119, 119,
119, 119, 119, 119, 119, 119, 119, 119, 67, 33,
67, 67, 119, 111, 111, 111, 111, 111, 111, 111,
111, 111, 111, 142, 57, 72, 57, 57, 57, 57,
111, 111, 111, 127, 57, 127, 57, 57, 57, 57,
57, 57, 57, 57, 57, 57, 57, 57, 57, 57,
57, 57, 57, 57, 57, 57, 57, 57, 57, 57,
57, 57, 57, 57, 57, 57, 57, 57, 57, 57,
57, 57, 57, 57, 57, 57, 57, 57, 57, 57,
51, 51, 51, 51, 51, 51, 84, 51, 51, 51,
51, 51, 51, 51, 51, 51, 110, 51, 51, 51,
51, 51, 51, 51, 51, 51, 51, 5, 5, 5,
5, 5, 5, 5, 63, 46, 124, 63, 129, 98,
63, 124, 57, 57, 57, 57, 57, 57, 133, 57,
5, 5, 5, 5, 63, 142, 124, 63, 84, 98,
63, 124, 57, 57, 57, 57, 57, 57, 129, 57,
57, 57, 57, 57, 57, 57, 57, 57, 57, 57,
98, 127, 82, 127, 57, 57, 57, 57, 57, 49,
57, 57, 144, 144, 140, 11, 40, 40, 14, 57,
57, 57, 57, 57, 57, 82, 13, 13, 13, 48,
98, 12, 82, 12, 57, 57, 57, 57, 57, 46,
57, 57, 144, 144, 133, 11, 72, 72, 14, 57,
57, 57, 57, 57, 57, 82, 13, 13, 13, 49,
144, 14, 14, 14, 14, 14, 57, 14, 14, 14,
11, 13, 11, 13, 102, 13, 79, 11, 70, 70,
70, 13, 13, 103, 2, 9, 9, 9, 2, 34,
125, 125, 125, 81, 13, 13, 34, 34, 34, 34,
17, 13, 8, 8, 8, 8, 18, 143, 143, 8,
8, 8, 9, 34, 25, 125, 85, 82, 82, 82,
125, 82, 121, 74, 34, 143, 24, 121, 47, 34,
116, 143, 82, 82, 82, 47, 121, 121, 121, 126,
126, 82, 58, 58, 58, 47, 47, 23, 72, 72,
58, 62, 62, 62, 114, 12, 23, 12, 23, 13,
26, 121, 30, 30, 86, 100, 71, 65, 66, 132,
11, 13, 11, 13, 102, 13, 48, 11, 70, 70,
70, 13, 13, 140, 2, 9, 9, 9, 2, 34,
125, 125, 125, 103, 13, 13, 34, 34, 34, 34,
25, 13, 8, 8, 8, 8, 79, 143, 143, 8,
8, 8, 9, 34, 81, 125, 18, 82, 82, 82,
125, 82, 121, 85, 34, 143, 24, 121, 47, 34,
17, 143, 82, 82, 82, 47, 121, 121, 121, 40,
40, 82, 58, 58, 58, 47, 47, 23, 126, 126,
58, 62, 62, 62, 30, 30, 23, 116, 23, 13,
114, 121, 26, 74, 86, 65, 71, 66, 100, 132,
109, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, 9, 9, -1, -1, -1, -1,
9, -1, 9, -1, -1, -1, -1, 13, 9, 9,
@@ -785,39 +785,39 @@ class Php5 extends \PhpParser\ParserAbstract
);
protected $gotoBase = array(
0, 0, -172, 0, 0, 353, 201, 0, 477, 149,
0, 110, 195, 117, 426, 112, 203, 140, 171, 0,
0, 0, 0, 168, 164, 157, 119, 27, 0, 205,
-118, 0, -428, 266, 51, 0, 0, 0, 0, 0,
388, 0, 0, -24, 0, 0, 345, 484, 146, 133,
209, 75, 0, 0, 0, 0, 0, 107, 161, 0,
0, 0, 222, -77, 0, 106, 97, -343, 0, -94,
135, 123, -129, 0, 129, 0, 0, -50, 0, 143,
0, 159, 64, 0, 338, 132, 122, 0, 0, 0,
0, 0, -173, 0, 0, 353, 216, 0, 477, 149,
0, 110, 71, 117, 426, 112, 203, 170, 181, 0,
0, 0, 0, 168, 164, 143, 121, 27, 0, 205,
-127, 0, -429, 279, 51, 0, 0, 0, 0, 0,
481, 0, 0, -24, 0, 0, 379, 484, 163, 153,
268, 75, 0, 0, 0, 0, 0, 107, 161, 0,
0, 0, 222, -77, 0, 104, 96, -344, 0, -94,
135, 123, -232, 0, 169, 0, 0, -50, 0, 173,
0, 180, 64, 0, 360, 139, 122, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 98, 0,
121, 0, 165, 156, 0, 0, 0, 0, 0, 87,
273, 259, 0, 0, 114, 0, 150, 0, 0, -5,
-91, 200, 0, 0, 84, 154, 202, 77, -48, 178,
0, 0, 93, 187, 0, 0, 0, 0, 0, 0,
136, 0, 286, 167, 102, 0, 0
124, 0, 165, 166, 0, 0, 0, 0, 0, 87,
340, 259, 0, 0, 120, 0, 177, 0, 0, -5,
-91, 200, 0, 0, 84, 154, 211, -21, -48, 188,
0, 0, 93, 213, 0, 0, 0, 0, 0, 0,
175, 0, 358, 167, 102, 0, 0
);
protected $gotoDefault = array(
-32768, 468, 664, 2, 665, 835, 740, 748, 598, 482,
630, 582, 380, 1193, 792, 793, 794, 381, 368, 483,
379, 410, 405, 781, 774, 776, 784, 172, 411, 787,
1, 789, 518, 825, 1020, 365, 797, 366, 590, 799,
527, 801, 802, 137, 382, 383, 528, 484, 390, 577,
816, 276, 387, 818, 367, 819, 828, 371, 465, 455,
460, 530, 557, 609, 432, 447, 571, 565, 536, 1086,
566, 864, 349, 872, 661, 880, 883, 485, 558, 894,
452, 902, 1099, 397, 908, 914, 919, 291, 922, 417,
412, 585, 927, 928, 5, 932, 622, 623, 8, 312,
955, 599, 969, 420, 1039, 1041, 486, 487, 522, 459,
508, 526, 488, 1062, 441, 413, 1065, 433, 489, 490,
434, 435, 1083, 355, 1168, 354, 449, 320, 1155, 580,
1118, 456, 1208, 1164, 348, 491, 492, 376, 1187, 392,
1203, 438, 1210, 1218, 344, 540, 567
-32768, 468, 665, 2, 666, 836, 741, 749, 598, 482,
631, 581, 380, 1194, 793, 794, 795, 381, 368, 766,
379, 410, 405, 782, 775, 777, 785, 172, 411, 788,
1, 790, 517, 826, 1021, 365, 798, 366, 589, 800,
526, 802, 803, 137, 382, 383, 527, 483, 390, 576,
817, 276, 387, 819, 367, 820, 829, 371, 465, 455,
460, 529, 556, 609, 432, 447, 570, 564, 535, 1087,
565, 865, 349, 873, 662, 881, 884, 484, 557, 895,
452, 903, 1100, 397, 909, 915, 920, 291, 923, 417,
412, 584, 928, 929, 5, 933, 623, 624, 8, 312,
956, 599, 970, 420, 1040, 1042, 485, 486, 521, 459,
507, 525, 487, 1063, 441, 413, 1066, 433, 488, 489,
434, 435, 1084, 355, 1169, 354, 449, 320, 1156, 579,
1119, 456, 1209, 1165, 348, 490, 491, 376, 1188, 392,
1204, 438, 1211, 1219, 344, 539, 566
);
protected $ruleToNonTerminal = array(
@@ -891,7 +891,7 @@ class Php5 extends \PhpParser\ParserAbstract
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 3, 5, 4,
3, 4, 2, 3, 1, 1, 7, 6, 3, 1,
3, 4, 1, 3, 1, 1, 8, 7, 3, 1,
3, 1, 3, 1, 1, 3, 1, 3, 1, 2,
3, 1, 3, 3, 1, 3, 2, 0, 1, 1,
1, 1, 1, 3, 5, 8, 3, 5, 9, 3,
@@ -1256,7 +1256,7 @@ class Php5 extends \PhpParser\ParserAbstract
$this->semValue = new Stmt\Use_($this->semStack[$stackPos-(4-3)], $this->semStack[$stackPos-(4-2)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes);
},
102 => function ($stackPos) {
$this->semValue = $this->semStack[$stackPos-(2-1)];
$this->semValue = $this->semStack[$stackPos-(1-1)];
},
103 => function ($stackPos) {
$this->semValue = new Stmt\Const_($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
@@ -1268,10 +1268,10 @@ class Php5 extends \PhpParser\ParserAbstract
$this->semValue = Stmt\Use_::TYPE_CONSTANT;
},
106 => function ($stackPos) {
$this->semValue = new Stmt\GroupUse($this->semStack[$stackPos-(7-3)], $this->semStack[$stackPos-(7-6)], $this->semStack[$stackPos-(7-2)], $this->startAttributeStack[$stackPos-(7-1)] + $this->endAttributes);
$this->semValue = new Stmt\GroupUse($this->semStack[$stackPos-(8-3)], $this->semStack[$stackPos-(8-6)], $this->semStack[$stackPos-(8-2)], $this->startAttributeStack[$stackPos-(8-1)] + $this->endAttributes);
},
107 => function ($stackPos) {
$this->semValue = new Stmt\GroupUse($this->semStack[$stackPos-(6-2)], $this->semStack[$stackPos-(6-5)], Stmt\Use_::TYPE_UNKNOWN, $this->startAttributeStack[$stackPos-(6-1)] + $this->endAttributes);
$this->semValue = new Stmt\GroupUse($this->semStack[$stackPos-(7-2)], $this->semStack[$stackPos-(7-5)], Stmt\Use_::TYPE_UNKNOWN, $this->startAttributeStack[$stackPos-(7-1)] + $this->endAttributes);
},
108 => function ($stackPos) {
$this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)];
@@ -1738,7 +1738,7 @@ class Php5 extends \PhpParser\ParserAbstract
$this->semValue = new Stmt\StaticVar($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
},
259 => function ($stackPos) {
if ($this->semStack[$stackPos-(2-2)] !== null) { $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; }
if ($this->semStack[$stackPos-(2-2)] !== null) { $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; } else { $this->semValue = $this->semStack[$stackPos-(2-1)]; }
},
260 => function ($stackPos) {
$this->semValue = array();
@@ -2627,7 +2627,7 @@ class Php5 extends \PhpParser\ParserAbstract
$this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(2-2)], null, true, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
},
552 => function ($stackPos) {
$this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(2-2)], null, false, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes, true, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
$this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(2-2)], null, false, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes, true);
},
553 => function ($stackPos) {
$this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)];
File diff suppressed because it is too large Load Diff
+1 -1
View File
@@ -155,7 +155,7 @@ abstract class ParserAbstract implements Parser
* @return Node\Stmt[]|null Array of statements (or null non-throwing error handler is used and
* the parser was unable to recover from an error).
*/
public function parse(string $code, ErrorHandler $errorHandler = null) {
public function parse(string $code, ?ErrorHandler $errorHandler = null) {
$this->errorHandler = $errorHandler ?: new ErrorHandler\Throwing;
$this->lexer->startLexing($code, $this->errorHandler);
+33 -1
View File
@@ -2,6 +2,9 @@
namespace PhpParser;
use PhpParser\Lexer\Emulative;
use PhpParser\Parser\Php7;
class ParserFactory
{
const PREFER_PHP7 = 1;
@@ -18,7 +21,7 @@ class ParserFactory
*
* @return Parser The parser instance
*/
public function create(int $kind, Lexer $lexer = null, array $parserOptions = []) : Parser {
public function create(int $kind, ?Lexer $lexer = null, array $parserOptions = []) : Parser {
if (null === $lexer) {
$lexer = new Lexer\Emulative();
}
@@ -41,4 +44,33 @@ class ParserFactory
);
}
}
/**
* Create a parser targeting the newest version supported by this library. Code for older
* versions will be accepted if there have been no relevant backwards-compatibility breaks in
* PHP.
*
* All supported lexer attributes (comments, startLine, endLine, startTokenPos, endTokenPos,
* startFilePos, endFilePos) will be enabled.
*/
public function createForNewestSupportedVersion(): Parser {
return new Php7(new Emulative($this->getLexerOptions()));
}
/**
* Create a parser targeting the host PHP version, that is the PHP version we're currently
* running on. This parser will not use any token emulation.
*
* All supported lexer attributes (comments, startLine, endLine, startTokenPos, endTokenPos,
* startFilePos, endFilePos) will be enabled.
*/
public function createForHostVersion(): Parser {
return new Php7(new Lexer($this->getLexerOptions()));
}
private function getLexerOptions(): array {
return ['usedAttributes' => [
'comments', 'startLine', 'endLine', 'startTokenPos', 'endTokenPos', 'startFilePos', 'endFilePos',
]];
}
}
@@ -223,7 +223,7 @@ class Standard extends PrettyPrinterAbstract
// Try to find a short full-precision representation
$stringValue = sprintf('%.16G', $node->value);
if ($node->value !== (double) $stringValue) {
if ($node->value !== (float) $stringValue) {
$stringValue = sprintf('%.17G', $node->value);
}
@@ -529,7 +529,7 @@ class Standard extends PrettyPrinterAbstract
}
protected function pExpr_StaticCall(Expr\StaticCall $node) {
return $this->pDereferenceLhs($node->class) . '::'
return $this->pStaticDereferenceLhs($node->class) . '::'
. ($node->name instanceof Expr
? ($node->name instanceof Expr\Variable
? $this->p($node->name)
@@ -606,7 +606,7 @@ class Standard extends PrettyPrinterAbstract
}
protected function pExpr_ClassConstFetch(Expr\ClassConstFetch $node) {
return $this->pDereferenceLhs($node->class) . '::' . $this->p($node->name);
return $this->pStaticDereferenceLhs($node->class) . '::' . $this->pObjectProperty($node->name);
}
protected function pExpr_PropertyFetch(Expr\PropertyFetch $node) {
@@ -618,7 +618,7 @@ class Standard extends PrettyPrinterAbstract
}
protected function pExpr_StaticPropertyFetch(Expr\StaticPropertyFetch $node) {
return $this->pDereferenceLhs($node->class) . '::$' . $this->pObjectProperty($node->name);
return $this->pStaticDereferenceLhs($node->class) . '::$' . $this->pObjectProperty($node->name);
}
protected function pExpr_ShellExec(Expr\ShellExec $node) {
@@ -814,7 +814,9 @@ class Standard extends PrettyPrinterAbstract
protected function pStmt_ClassConst(Stmt\ClassConst $node) {
return $this->pAttrGroups($node->attrGroups)
. $this->pModifiers($node->flags)
. 'const ' . $this->pCommaSeparated($node->consts) . ';';
. 'const '
. (null !== $node->type ? $this->p($node->type) . ' ' : '')
. $this->pCommaSeparated($node->consts) . ';';
}
protected function pStmt_Function(Stmt\Function_ $node) {
@@ -1067,6 +1069,14 @@ class Standard extends PrettyPrinterAbstract
}
}
protected function pStaticDereferenceLhs(Node $node) {
if (!$this->staticDereferenceLhsRequiresParens($node)) {
return $this->p($node);
} else {
return '(' . $this->p($node) . ')';
}
}
protected function pCallLhs(Node $node) {
if (!$this->callLhsRequiresParens($node)) {
return $this->p($node);
@@ -1075,9 +1085,12 @@ class Standard extends PrettyPrinterAbstract
}
}
protected function pNewVariable(Node $node) {
// TODO: This is not fully accurate.
return $this->pDereferenceLhs($node);
protected function pNewVariable(Node $node): string {
if (!$this->newOperandRequiresParens($node)) {
return $this->p($node);
} else {
return '(' . $this->p($node) . ')';
}
}
/**
@@ -21,6 +21,8 @@ abstract class PrettyPrinterAbstract
const FIXUP_BRACED_NAME = 4; // Name operand that may require bracing
const FIXUP_VAR_BRACED_NAME = 5; // Name operand that may require ${} bracing
const FIXUP_ENCAPSED = 6; // Encapsed string part
const FIXUP_NEW = 7; // New/instanceof operand
const FIXUP_STATIC_DEREF_LHS = 8; // LHS of static dereferencing operation
protected $precedenceMap = [
// [precedence, associativity]
@@ -656,7 +658,7 @@ abstract class PrettyPrinterAbstract
$result .= $extraLeft;
$origIndentLevel = $this->indentLevel;
$this->setIndentLevel($this->origTokens->getIndentationBefore($subStartPos) + $indentAdjustment);
$this->setIndentLevel(max($this->origTokens->getIndentationBefore($subStartPos) + $indentAdjustment, 0));
// If it's the same node that was previously in this position, it certainly doesn't
// need fixup. It's important to check this here, because our fixup checks are more
@@ -759,7 +761,7 @@ abstract class PrettyPrinterAbstract
\assert($itemStartPos >= 0 && $itemEndPos >= 0 && $itemStartPos >= $pos);
$origIndentLevel = $this->indentLevel;
$lastElemIndentLevel = $this->origTokens->getIndentationBefore($itemStartPos) + $indentAdjustment;
$lastElemIndentLevel = max($this->origTokens->getIndentationBefore($itemStartPos) + $indentAdjustment, 0);
$this->setIndentLevel($lastElemIndentLevel);
$comments = $arrItem->getComments();
@@ -977,6 +979,19 @@ abstract class PrettyPrinterAbstract
return '(' . $this->p($subNode) . ')';
}
break;
case self::FIXUP_STATIC_DEREF_LHS:
if ($this->staticDereferenceLhsRequiresParens($subNode)
&& !$this->origTokens->haveParens($subStartPos, $subEndPos)
) {
return '(' . $this->p($subNode) . ')';
}
break;
case self::FIXUP_NEW:
if ($this->newOperandRequiresParens($subNode)
&& !$this->origTokens->haveParens($subStartPos, $subEndPos)) {
return '(' . $this->p($subNode) . ')';
}
break;
case self::FIXUP_BRACED_NAME:
case self::FIXUP_VAR_BRACED_NAME:
if ($subNode instanceof Expr
@@ -1047,13 +1062,26 @@ abstract class PrettyPrinterAbstract
}
/**
* Determines whether the LHS of a dereferencing operation must be wrapped in parenthesis.
* Determines whether the LHS of an array/object operation must be wrapped in parentheses.
*
* @param Node $node LHS of dereferencing operation
*
* @return bool Whether parentheses are required
*/
protected function dereferenceLhsRequiresParens(Node $node) : bool {
// A constant can occur on the LHS of an array/object deref, but not a static deref.
return $this->staticDereferenceLhsRequiresParens($node)
&& !$node instanceof Expr\ConstFetch;
}
/**
* Determines whether the LHS of a static operation must be wrapped in parentheses.
*
* @param Node $node LHS of dereferencing operation
*
* @return bool Whether parentheses are required
*/
protected function staticDereferenceLhsRequiresParens(Node $node): bool {
return !($node instanceof Expr\Variable
|| $node instanceof Node\Name
|| $node instanceof Expr\ArrayDimFetch
@@ -1066,10 +1094,31 @@ abstract class PrettyPrinterAbstract
|| $node instanceof Expr\StaticCall
|| $node instanceof Expr\Array_
|| $node instanceof Scalar\String_
|| $node instanceof Expr\ConstFetch
|| $node instanceof Expr\ClassConstFetch);
}
/**
* Determines whether an expression used in "new" or "instanceof" requires parentheses.
*
* @param Node $node New or instanceof operand
*
* @return bool Whether parentheses are required
*/
protected function newOperandRequiresParens(Node $node): bool {
if ($node instanceof Node\Name || $node instanceof Expr\Variable) {
return false;
}
if ($node instanceof Expr\ArrayDimFetch || $node instanceof Expr\PropertyFetch ||
$node instanceof Expr\NullsafePropertyFetch
) {
return $this->newOperandRequiresParens($node->var);
}
if ($node instanceof Expr\StaticPropertyFetch) {
return $this->newOperandRequiresParens($node->class);
}
return true;
}
/**
* Print modifiers, including trailing whitespace.
*
@@ -1171,7 +1220,7 @@ abstract class PrettyPrinterAbstract
Expr\PostDec::class => ['var' => self::FIXUP_PREC_LEFT],
Expr\Instanceof_::class => [
'expr' => self::FIXUP_PREC_LEFT,
'class' => self::FIXUP_PREC_RIGHT, // TODO: FIXUP_NEW_VARIABLE
'class' => self::FIXUP_NEW,
],
Expr\Ternary::class => [
'cond' => self::FIXUP_PREC_LEFT,
@@ -1179,10 +1228,13 @@ abstract class PrettyPrinterAbstract
],
Expr\FuncCall::class => ['name' => self::FIXUP_CALL_LHS],
Expr\StaticCall::class => ['class' => self::FIXUP_DEREF_LHS],
Expr\StaticCall::class => ['class' => self::FIXUP_STATIC_DEREF_LHS],
Expr\ArrayDimFetch::class => ['var' => self::FIXUP_DEREF_LHS],
Expr\ClassConstFetch::class => ['var' => self::FIXUP_DEREF_LHS],
Expr\New_::class => ['class' => self::FIXUP_DEREF_LHS], // TODO: FIXUP_NEW_VARIABLE
Expr\ClassConstFetch::class => [
'class' => self::FIXUP_STATIC_DEREF_LHS,
'name' => self::FIXUP_BRACED_NAME,
],
Expr\New_::class => ['class' => self::FIXUP_NEW],
Expr\MethodCall::class => [
'var' => self::FIXUP_DEREF_LHS,
'name' => self::FIXUP_BRACED_NAME,
@@ -1192,7 +1244,7 @@ abstract class PrettyPrinterAbstract
'name' => self::FIXUP_BRACED_NAME,
],
Expr\StaticPropertyFetch::class => [
'class' => self::FIXUP_DEREF_LHS,
'class' => self::FIXUP_STATIC_DEREF_LHS,
'name' => self::FIXUP_VAR_BRACED_NAME,
],
Expr\PropertyFetch::class => [
@@ -1278,6 +1330,7 @@ abstract class PrettyPrinterAbstract
'Param->default' => $stripEquals,
'Stmt_Break->num' => $stripBoth,
'Stmt_Catch->var' => $stripLeft,
'Stmt_ClassConst->type' => $stripRight,
'Stmt_ClassMethod->returnType' => $stripColon,
'Stmt_Class->extends' => ['left' => \T_EXTENDS],
'Stmt_Enum->scalarType' => $stripColon,
@@ -1319,6 +1372,7 @@ abstract class PrettyPrinterAbstract
'Stmt_Break->num' => [\T_BREAK, false, ' ', null],
'Stmt_Catch->var' => [null, false, ' ', null],
'Stmt_ClassMethod->returnType' => [')', false, ' : ', null],
'Stmt_ClassConst->type' => [\T_CONST, false, ' ', null],
'Stmt_Class->extends' => [null, false, ' extends ', null],
'Stmt_Enum->scalarType' => [null, false, ' : ', null],
'Stmt_EnumCase->expr' => [null, false, ' = ', null],
@@ -1508,6 +1562,7 @@ abstract class PrettyPrinterAbstract
'Stmt_ClassMethod->flags' => \T_FUNCTION,
'Stmt_Class->flags' => \T_CLASS,
'Stmt_Property->flags' => \T_VARIABLE,
'Expr_PrintableNewAnonClass->flags' => \T_CLASS,
'Param->flags' => \T_VARIABLE,
//'Stmt_TraitUseAdaptation_Alias->newModifier' => 0, // TODO
];