mirror of
https://github.com/nikic/PHP-Parser.git
synced 2025-04-21 22:42:06 +02:00
[PHP 7.4] Add array spread
This commit is contained in:
parent
f3b19c19ef
commit
8012faea54
@ -988,6 +988,7 @@ array_pair:
|
||||
| expr { $$ = Expr\ArrayItem[$1, null, false]; }
|
||||
| expr T_DOUBLE_ARROW '&' variable { $$ = Expr\ArrayItem[$4, $1, true]; }
|
||||
| '&' variable { $$ = Expr\ArrayItem[$2, null, true]; }
|
||||
| T_ELLIPSIS expr { $$ = Expr\ArrayItem[$2, null, false, attributes(), true]; }
|
||||
;
|
||||
|
||||
encaps_list:
|
||||
|
@ -983,6 +983,7 @@ array_pair:
|
||||
| expr { $$ = Expr\ArrayItem[$1, null, false]; }
|
||||
| expr T_DOUBLE_ARROW '&' variable { $$ = Expr\ArrayItem[$4, $1, true]; }
|
||||
| '&' variable { $$ = Expr\ArrayItem[$2, null, true]; }
|
||||
| T_ELLIPSIS expr { $$ = Expr\ArrayItem[$2, null, false, attributes(), true]; }
|
||||
| /* empty */ { $$ = null; }
|
||||
;
|
||||
|
||||
|
@ -12,6 +12,8 @@ class ArrayItem extends Expr
|
||||
public $value;
|
||||
/** @var bool Whether to assign by reference */
|
||||
public $byRef;
|
||||
/** @var bool Whether to unpack the argument */
|
||||
public $unpack;
|
||||
|
||||
/**
|
||||
* Constructs an array item node.
|
||||
@ -21,17 +23,18 @@ 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 = []) {
|
||||
public function __construct(Expr $value, Expr $key = null, bool $byRef = false, array $attributes = [], bool $unpack = false) {
|
||||
parent::__construct($attributes);
|
||||
$this->key = $key;
|
||||
$this->value = $value;
|
||||
$this->byRef = $byRef;
|
||||
$this->unpack = $unpack;
|
||||
}
|
||||
|
||||
public function getSubNodeNames() : array {
|
||||
return ['key', 'value', 'byRef'];
|
||||
return ['key', 'value', 'byRef', 'unpack'];
|
||||
}
|
||||
|
||||
|
||||
public function getType() : string {
|
||||
return 'Expr_ArrayItem';
|
||||
}
|
||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -6,142 +6,141 @@ namespace PhpParser\Parser;
|
||||
final class Tokens
|
||||
{
|
||||
const YYERRTOK = 256;
|
||||
const T_ARROW_FUNCTION = 257;
|
||||
const T_INCLUDE = 258;
|
||||
const T_INCLUDE_ONCE = 259;
|
||||
const T_EVAL = 260;
|
||||
const T_REQUIRE = 261;
|
||||
const T_REQUIRE_ONCE = 262;
|
||||
const T_LOGICAL_OR = 263;
|
||||
const T_LOGICAL_XOR = 264;
|
||||
const T_LOGICAL_AND = 265;
|
||||
const T_PRINT = 266;
|
||||
const T_YIELD = 267;
|
||||
const T_DOUBLE_ARROW = 268;
|
||||
const T_YIELD_FROM = 269;
|
||||
const T_PLUS_EQUAL = 270;
|
||||
const T_MINUS_EQUAL = 271;
|
||||
const T_MUL_EQUAL = 272;
|
||||
const T_DIV_EQUAL = 273;
|
||||
const T_CONCAT_EQUAL = 274;
|
||||
const T_MOD_EQUAL = 275;
|
||||
const T_AND_EQUAL = 276;
|
||||
const T_OR_EQUAL = 277;
|
||||
const T_XOR_EQUAL = 278;
|
||||
const T_SL_EQUAL = 279;
|
||||
const T_SR_EQUAL = 280;
|
||||
const T_POW_EQUAL = 281;
|
||||
const T_COALESCE_EQUAL = 282;
|
||||
const T_COALESCE = 283;
|
||||
const T_BOOLEAN_OR = 284;
|
||||
const T_BOOLEAN_AND = 285;
|
||||
const T_IS_EQUAL = 286;
|
||||
const T_IS_NOT_EQUAL = 287;
|
||||
const T_IS_IDENTICAL = 288;
|
||||
const T_IS_NOT_IDENTICAL = 289;
|
||||
const T_SPACESHIP = 290;
|
||||
const T_IS_SMALLER_OR_EQUAL = 291;
|
||||
const T_IS_GREATER_OR_EQUAL = 292;
|
||||
const T_SL = 293;
|
||||
const T_SR = 294;
|
||||
const T_INSTANCEOF = 295;
|
||||
const T_INC = 296;
|
||||
const T_DEC = 297;
|
||||
const T_INT_CAST = 298;
|
||||
const T_DOUBLE_CAST = 299;
|
||||
const T_STRING_CAST = 300;
|
||||
const T_ARRAY_CAST = 301;
|
||||
const T_OBJECT_CAST = 302;
|
||||
const T_BOOL_CAST = 303;
|
||||
const T_UNSET_CAST = 304;
|
||||
const T_POW = 305;
|
||||
const T_NEW = 306;
|
||||
const T_CLONE = 307;
|
||||
const T_EXIT = 308;
|
||||
const T_IF = 309;
|
||||
const T_ELSEIF = 310;
|
||||
const T_ELSE = 311;
|
||||
const T_ENDIF = 312;
|
||||
const T_LNUMBER = 313;
|
||||
const T_DNUMBER = 314;
|
||||
const T_STRING = 315;
|
||||
const T_STRING_VARNAME = 316;
|
||||
const T_VARIABLE = 317;
|
||||
const T_NUM_STRING = 318;
|
||||
const T_INLINE_HTML = 319;
|
||||
const T_CHARACTER = 320;
|
||||
const T_BAD_CHARACTER = 321;
|
||||
const T_ENCAPSED_AND_WHITESPACE = 322;
|
||||
const T_CONSTANT_ENCAPSED_STRING = 323;
|
||||
const T_ECHO = 324;
|
||||
const T_DO = 325;
|
||||
const T_WHILE = 326;
|
||||
const T_ENDWHILE = 327;
|
||||
const T_FOR = 328;
|
||||
const T_ENDFOR = 329;
|
||||
const T_FOREACH = 330;
|
||||
const T_ENDFOREACH = 331;
|
||||
const T_DECLARE = 332;
|
||||
const T_ENDDECLARE = 333;
|
||||
const T_AS = 334;
|
||||
const T_SWITCH = 335;
|
||||
const T_ENDSWITCH = 336;
|
||||
const T_CASE = 337;
|
||||
const T_DEFAULT = 338;
|
||||
const T_BREAK = 339;
|
||||
const T_CONTINUE = 340;
|
||||
const T_GOTO = 341;
|
||||
const T_FUNCTION = 342;
|
||||
const T_FN = 343;
|
||||
const T_CONST = 344;
|
||||
const T_RETURN = 345;
|
||||
const T_TRY = 346;
|
||||
const T_CATCH = 347;
|
||||
const T_FINALLY = 348;
|
||||
const T_THROW = 349;
|
||||
const T_USE = 350;
|
||||
const T_INSTEADOF = 351;
|
||||
const T_GLOBAL = 352;
|
||||
const T_STATIC = 353;
|
||||
const T_ABSTRACT = 354;
|
||||
const T_FINAL = 355;
|
||||
const T_PRIVATE = 356;
|
||||
const T_PROTECTED = 357;
|
||||
const T_PUBLIC = 358;
|
||||
const T_VAR = 359;
|
||||
const T_UNSET = 360;
|
||||
const T_ISSET = 361;
|
||||
const T_EMPTY = 362;
|
||||
const T_HALT_COMPILER = 363;
|
||||
const T_CLASS = 364;
|
||||
const T_TRAIT = 365;
|
||||
const T_INTERFACE = 366;
|
||||
const T_EXTENDS = 367;
|
||||
const T_IMPLEMENTS = 368;
|
||||
const T_OBJECT_OPERATOR = 369;
|
||||
const T_LIST = 370;
|
||||
const T_ARRAY = 371;
|
||||
const T_CALLABLE = 372;
|
||||
const T_CLASS_C = 373;
|
||||
const T_TRAIT_C = 374;
|
||||
const T_METHOD_C = 375;
|
||||
const T_FUNC_C = 376;
|
||||
const T_LINE = 377;
|
||||
const T_FILE = 378;
|
||||
const T_COMMENT = 379;
|
||||
const T_DOC_COMMENT = 380;
|
||||
const T_OPEN_TAG = 381;
|
||||
const T_OPEN_TAG_WITH_ECHO = 382;
|
||||
const T_CLOSE_TAG = 383;
|
||||
const T_WHITESPACE = 384;
|
||||
const T_START_HEREDOC = 385;
|
||||
const T_END_HEREDOC = 386;
|
||||
const T_DOLLAR_OPEN_CURLY_BRACES = 387;
|
||||
const T_CURLY_OPEN = 388;
|
||||
const T_PAAMAYIM_NEKUDOTAYIM = 389;
|
||||
const T_NAMESPACE = 390;
|
||||
const T_NS_C = 391;
|
||||
const T_DIR = 392;
|
||||
const T_NS_SEPARATOR = 393;
|
||||
const T_ELLIPSIS = 394;
|
||||
const T_INCLUDE = 257;
|
||||
const T_INCLUDE_ONCE = 258;
|
||||
const T_EVAL = 259;
|
||||
const T_REQUIRE = 260;
|
||||
const T_REQUIRE_ONCE = 261;
|
||||
const T_LOGICAL_OR = 262;
|
||||
const T_LOGICAL_XOR = 263;
|
||||
const T_LOGICAL_AND = 264;
|
||||
const T_PRINT = 265;
|
||||
const T_YIELD = 266;
|
||||
const T_DOUBLE_ARROW = 267;
|
||||
const T_YIELD_FROM = 268;
|
||||
const T_PLUS_EQUAL = 269;
|
||||
const T_MINUS_EQUAL = 270;
|
||||
const T_MUL_EQUAL = 271;
|
||||
const T_DIV_EQUAL = 272;
|
||||
const T_CONCAT_EQUAL = 273;
|
||||
const T_MOD_EQUAL = 274;
|
||||
const T_AND_EQUAL = 275;
|
||||
const T_OR_EQUAL = 276;
|
||||
const T_XOR_EQUAL = 277;
|
||||
const T_SL_EQUAL = 278;
|
||||
const T_SR_EQUAL = 279;
|
||||
const T_POW_EQUAL = 280;
|
||||
const T_COALESCE_EQUAL = 281;
|
||||
const T_COALESCE = 282;
|
||||
const T_BOOLEAN_OR = 283;
|
||||
const T_BOOLEAN_AND = 284;
|
||||
const T_IS_EQUAL = 285;
|
||||
const T_IS_NOT_EQUAL = 286;
|
||||
const T_IS_IDENTICAL = 287;
|
||||
const T_IS_NOT_IDENTICAL = 288;
|
||||
const T_SPACESHIP = 289;
|
||||
const T_IS_SMALLER_OR_EQUAL = 290;
|
||||
const T_IS_GREATER_OR_EQUAL = 291;
|
||||
const T_SL = 292;
|
||||
const T_SR = 293;
|
||||
const T_INSTANCEOF = 294;
|
||||
const T_INC = 295;
|
||||
const T_DEC = 296;
|
||||
const T_INT_CAST = 297;
|
||||
const T_DOUBLE_CAST = 298;
|
||||
const T_STRING_CAST = 299;
|
||||
const T_ARRAY_CAST = 300;
|
||||
const T_OBJECT_CAST = 301;
|
||||
const T_BOOL_CAST = 302;
|
||||
const T_UNSET_CAST = 303;
|
||||
const T_POW = 304;
|
||||
const T_NEW = 305;
|
||||
const T_CLONE = 306;
|
||||
const T_EXIT = 307;
|
||||
const T_IF = 308;
|
||||
const T_ELSEIF = 309;
|
||||
const T_ELSE = 310;
|
||||
const T_ENDIF = 311;
|
||||
const T_LNUMBER = 312;
|
||||
const T_DNUMBER = 313;
|
||||
const T_STRING = 314;
|
||||
const T_STRING_VARNAME = 315;
|
||||
const T_VARIABLE = 316;
|
||||
const T_NUM_STRING = 317;
|
||||
const T_INLINE_HTML = 318;
|
||||
const T_CHARACTER = 319;
|
||||
const T_BAD_CHARACTER = 320;
|
||||
const T_ENCAPSED_AND_WHITESPACE = 321;
|
||||
const T_CONSTANT_ENCAPSED_STRING = 322;
|
||||
const T_ECHO = 323;
|
||||
const T_DO = 324;
|
||||
const T_WHILE = 325;
|
||||
const T_ENDWHILE = 326;
|
||||
const T_FOR = 327;
|
||||
const T_ENDFOR = 328;
|
||||
const T_FOREACH = 329;
|
||||
const T_ENDFOREACH = 330;
|
||||
const T_DECLARE = 331;
|
||||
const T_ENDDECLARE = 332;
|
||||
const T_AS = 333;
|
||||
const T_SWITCH = 334;
|
||||
const T_ENDSWITCH = 335;
|
||||
const T_CASE = 336;
|
||||
const T_DEFAULT = 337;
|
||||
const T_BREAK = 338;
|
||||
const T_CONTINUE = 339;
|
||||
const T_GOTO = 340;
|
||||
const T_FUNCTION = 341;
|
||||
const T_FN = 342;
|
||||
const T_CONST = 343;
|
||||
const T_RETURN = 344;
|
||||
const T_TRY = 345;
|
||||
const T_CATCH = 346;
|
||||
const T_FINALLY = 347;
|
||||
const T_THROW = 348;
|
||||
const T_USE = 349;
|
||||
const T_INSTEADOF = 350;
|
||||
const T_GLOBAL = 351;
|
||||
const T_STATIC = 352;
|
||||
const T_ABSTRACT = 353;
|
||||
const T_FINAL = 354;
|
||||
const T_PRIVATE = 355;
|
||||
const T_PROTECTED = 356;
|
||||
const T_PUBLIC = 357;
|
||||
const T_VAR = 358;
|
||||
const T_UNSET = 359;
|
||||
const T_ISSET = 360;
|
||||
const T_EMPTY = 361;
|
||||
const T_HALT_COMPILER = 362;
|
||||
const T_CLASS = 363;
|
||||
const T_TRAIT = 364;
|
||||
const T_INTERFACE = 365;
|
||||
const T_EXTENDS = 366;
|
||||
const T_IMPLEMENTS = 367;
|
||||
const T_OBJECT_OPERATOR = 368;
|
||||
const T_LIST = 369;
|
||||
const T_ARRAY = 370;
|
||||
const T_CALLABLE = 371;
|
||||
const T_CLASS_C = 372;
|
||||
const T_TRAIT_C = 373;
|
||||
const T_METHOD_C = 374;
|
||||
const T_FUNC_C = 375;
|
||||
const T_LINE = 376;
|
||||
const T_FILE = 377;
|
||||
const T_COMMENT = 378;
|
||||
const T_DOC_COMMENT = 379;
|
||||
const T_OPEN_TAG = 380;
|
||||
const T_OPEN_TAG_WITH_ECHO = 381;
|
||||
const T_CLOSE_TAG = 382;
|
||||
const T_WHITESPACE = 383;
|
||||
const T_START_HEREDOC = 384;
|
||||
const T_END_HEREDOC = 385;
|
||||
const T_DOLLAR_OPEN_CURLY_BRACES = 386;
|
||||
const T_CURLY_OPEN = 387;
|
||||
const T_PAAMAYIM_NEKUDOTAYIM = 388;
|
||||
const T_NAMESPACE = 389;
|
||||
const T_NS_C = 390;
|
||||
const T_DIR = 391;
|
||||
const T_NS_SEPARATOR = 392;
|
||||
const T_ELLIPSIS = 393;
|
||||
}
|
||||
|
@ -545,7 +545,9 @@ class Standard extends PrettyPrinterAbstract
|
||||
|
||||
protected function pExpr_ArrayItem(Expr\ArrayItem $node) {
|
||||
return (null !== $node->key ? $this->p($node->key) . ' => ' : '')
|
||||
. ($node->byRef ? '&' : '') . $this->p($node->value);
|
||||
. ($node->byRef ? '&' : '')
|
||||
. ($node->unpack ? '...' : '')
|
||||
. $this->p($node->value);
|
||||
}
|
||||
|
||||
protected function pExpr_ArrayDimFetch(Expr\ArrayDimFetch $node) {
|
||||
|
@ -53,6 +53,7 @@ class NodeDumperTest extends \PHPUnit\Framework\TestCase
|
||||
value: Foo
|
||||
)
|
||||
byRef: false
|
||||
unpack: false
|
||||
)
|
||||
)
|
||||
)'
|
||||
|
29
test/code/formatPreservation/array_spread.test
Normal file
29
test/code/formatPreservation/array_spread.test
Normal file
@ -0,0 +1,29 @@
|
||||
Array spread
|
||||
-----
|
||||
<?php
|
||||
$items = [
|
||||
...$value
|
||||
];
|
||||
-----
|
||||
$array = $stmts[0]->expr->expr;
|
||||
$array->items[] = new Expr\ArrayItem(new Expr\Variable('b'));
|
||||
-----
|
||||
<?php
|
||||
$items = [
|
||||
...$value, $b
|
||||
];
|
||||
-----
|
||||
<?php
|
||||
$items =
|
||||
[
|
||||
... $value
|
||||
];
|
||||
-----
|
||||
$array = $stmts[0]->expr->expr;
|
||||
$array->items[] = new Expr\ArrayItem(new Expr\Variable('c'), null, false, [], true);
|
||||
-----
|
||||
<?php
|
||||
$items =
|
||||
[
|
||||
... $value, ...$c
|
||||
];
|
@ -1304,6 +1304,7 @@ array(
|
||||
)
|
||||
)
|
||||
byRef: false
|
||||
unpack: false
|
||||
)
|
||||
1: Expr_ArrayItem(
|
||||
key: null
|
||||
@ -1318,6 +1319,7 @@ array(
|
||||
)
|
||||
)
|
||||
byRef: false
|
||||
unpack: false
|
||||
)
|
||||
)
|
||||
)
|
||||
@ -1336,6 +1338,7 @@ array(
|
||||
name: value
|
||||
)
|
||||
byRef: false
|
||||
unpack: false
|
||||
)
|
||||
1: Expr_ArrayItem(
|
||||
key: null
|
||||
@ -1343,6 +1346,7 @@ array(
|
||||
name: oopsAnotherValue
|
||||
)
|
||||
byRef: false
|
||||
unpack: false
|
||||
)
|
||||
)
|
||||
)
|
||||
@ -1363,6 +1367,7 @@ array(
|
||||
name: value
|
||||
)
|
||||
byRef: false
|
||||
unpack: false
|
||||
)
|
||||
1: Expr_ArrayItem(
|
||||
key: null
|
||||
@ -1370,6 +1375,7 @@ array(
|
||||
name: oopsAnotherValue
|
||||
)
|
||||
byRef: false
|
||||
unpack: false
|
||||
)
|
||||
)
|
||||
)
|
||||
|
@ -29,6 +29,7 @@ array(
|
||||
value: a
|
||||
)
|
||||
byRef: false
|
||||
unpack: false
|
||||
)
|
||||
)
|
||||
)
|
||||
@ -42,6 +43,7 @@ array(
|
||||
value: a
|
||||
)
|
||||
byRef: false
|
||||
unpack: false
|
||||
)
|
||||
)
|
||||
)
|
||||
@ -55,6 +57,7 @@ array(
|
||||
value: a
|
||||
)
|
||||
byRef: false
|
||||
unpack: false
|
||||
)
|
||||
1: Expr_ArrayItem(
|
||||
key: null
|
||||
@ -62,6 +65,7 @@ array(
|
||||
value: b
|
||||
)
|
||||
byRef: false
|
||||
unpack: false
|
||||
)
|
||||
)
|
||||
)
|
||||
@ -75,6 +79,7 @@ array(
|
||||
value: a
|
||||
)
|
||||
byRef: false
|
||||
unpack: false
|
||||
)
|
||||
1: Expr_ArrayItem(
|
||||
key: null
|
||||
@ -82,6 +87,7 @@ array(
|
||||
name: b
|
||||
)
|
||||
byRef: true
|
||||
unpack: false
|
||||
)
|
||||
2: Expr_ArrayItem(
|
||||
key: Scalar_String(
|
||||
@ -91,6 +97,7 @@ array(
|
||||
value: d
|
||||
)
|
||||
byRef: false
|
||||
unpack: false
|
||||
)
|
||||
3: Expr_ArrayItem(
|
||||
key: Scalar_String(
|
||||
@ -100,6 +107,7 @@ array(
|
||||
name: f
|
||||
)
|
||||
byRef: true
|
||||
unpack: false
|
||||
)
|
||||
)
|
||||
)
|
||||
@ -125,6 +133,7 @@ array(
|
||||
value: 1
|
||||
)
|
||||
byRef: false
|
||||
unpack: false
|
||||
)
|
||||
1: Expr_ArrayItem(
|
||||
key: null
|
||||
@ -132,6 +141,7 @@ array(
|
||||
value: 2
|
||||
)
|
||||
byRef: false
|
||||
unpack: false
|
||||
)
|
||||
2: Expr_ArrayItem(
|
||||
key: null
|
||||
@ -139,6 +149,7 @@ array(
|
||||
value: 3
|
||||
)
|
||||
byRef: false
|
||||
unpack: false
|
||||
)
|
||||
)
|
||||
)
|
||||
@ -154,6 +165,7 @@ array(
|
||||
value: b
|
||||
)
|
||||
byRef: false
|
||||
unpack: false
|
||||
)
|
||||
)
|
||||
)
|
||||
|
@ -19,6 +19,7 @@ array(
|
||||
name: a
|
||||
)
|
||||
byRef: false
|
||||
unpack: false
|
||||
)
|
||||
1: Expr_ArrayItem(
|
||||
key: null
|
||||
@ -26,6 +27,7 @@ array(
|
||||
name: b
|
||||
)
|
||||
byRef: false
|
||||
unpack: false
|
||||
)
|
||||
)
|
||||
)
|
||||
@ -37,6 +39,7 @@ array(
|
||||
name: c
|
||||
)
|
||||
byRef: false
|
||||
unpack: false
|
||||
)
|
||||
1: Expr_ArrayItem(
|
||||
key: null
|
||||
@ -44,6 +47,7 @@ array(
|
||||
name: d
|
||||
)
|
||||
byRef: false
|
||||
unpack: false
|
||||
)
|
||||
)
|
||||
)
|
||||
@ -60,6 +64,7 @@ array(
|
||||
name: a
|
||||
)
|
||||
byRef: false
|
||||
unpack: false
|
||||
)
|
||||
2: null
|
||||
3: null
|
||||
@ -69,6 +74,7 @@ array(
|
||||
name: b
|
||||
)
|
||||
byRef: false
|
||||
unpack: false
|
||||
)
|
||||
5: null
|
||||
)
|
||||
@ -97,14 +103,17 @@ array(
|
||||
name: a
|
||||
)
|
||||
byRef: false
|
||||
unpack: false
|
||||
)
|
||||
)
|
||||
)
|
||||
byRef: false
|
||||
unpack: false
|
||||
)
|
||||
)
|
||||
)
|
||||
byRef: false
|
||||
unpack: false
|
||||
)
|
||||
2: Expr_ArrayItem(
|
||||
key: null
|
||||
@ -112,6 +121,7 @@ array(
|
||||
name: b
|
||||
)
|
||||
byRef: false
|
||||
unpack: false
|
||||
)
|
||||
)
|
||||
)
|
||||
@ -132,6 +142,7 @@ array(
|
||||
name: b
|
||||
)
|
||||
byRef: false
|
||||
unpack: false
|
||||
)
|
||||
1: Expr_ArrayItem(
|
||||
key: Scalar_String(
|
||||
@ -141,6 +152,7 @@ array(
|
||||
name: a
|
||||
)
|
||||
byRef: false
|
||||
unpack: false
|
||||
)
|
||||
)
|
||||
)
|
||||
|
432
test/code/parser/expr/arraySpread.test
Normal file
432
test/code/parser/expr/arraySpread.test
Normal file
@ -0,0 +1,432 @@
|
||||
Spread array
|
||||
-----
|
||||
<?php
|
||||
$array = [1, 2, 3];
|
||||
|
||||
function getArr() {
|
||||
return [4, 5];
|
||||
}
|
||||
|
||||
function arrGen() {
|
||||
for($i = 11; $i < 15; $i++) {
|
||||
yield $i;
|
||||
}
|
||||
}
|
||||
|
||||
[...[]];
|
||||
[...[1, 2, 3]];
|
||||
[...$array];
|
||||
[...getArr()];
|
||||
[...arrGen()];
|
||||
[...new ArrayIterator(['a', 'b', 'c'])];
|
||||
[0, ...$array, ...getArr(), 6, 7, 8, 9, 10, ...arrGen()];
|
||||
[0, ...$array, ...$array, 'end'];
|
||||
-----
|
||||
array(
|
||||
0: Stmt_Expression(
|
||||
expr: Expr_Assign(
|
||||
var: Expr_Variable(
|
||||
name: array
|
||||
)
|
||||
expr: Expr_Array(
|
||||
items: array(
|
||||
0: Expr_ArrayItem(
|
||||
key: null
|
||||
value: Scalar_LNumber(
|
||||
value: 1
|
||||
)
|
||||
byRef: false
|
||||
unpack: false
|
||||
)
|
||||
1: Expr_ArrayItem(
|
||||
key: null
|
||||
value: Scalar_LNumber(
|
||||
value: 2
|
||||
)
|
||||
byRef: false
|
||||
unpack: false
|
||||
)
|
||||
2: Expr_ArrayItem(
|
||||
key: null
|
||||
value: Scalar_LNumber(
|
||||
value: 3
|
||||
)
|
||||
byRef: false
|
||||
unpack: false
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
1: Stmt_Function(
|
||||
byRef: false
|
||||
name: Identifier(
|
||||
name: getArr
|
||||
)
|
||||
params: array(
|
||||
)
|
||||
returnType: null
|
||||
stmts: array(
|
||||
0: Stmt_Return(
|
||||
expr: Expr_Array(
|
||||
items: array(
|
||||
0: Expr_ArrayItem(
|
||||
key: null
|
||||
value: Scalar_LNumber(
|
||||
value: 4
|
||||
)
|
||||
byRef: false
|
||||
unpack: false
|
||||
)
|
||||
1: Expr_ArrayItem(
|
||||
key: null
|
||||
value: Scalar_LNumber(
|
||||
value: 5
|
||||
)
|
||||
byRef: false
|
||||
unpack: false
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
2: Stmt_Function(
|
||||
byRef: false
|
||||
name: Identifier(
|
||||
name: arrGen
|
||||
)
|
||||
params: array(
|
||||
)
|
||||
returnType: null
|
||||
stmts: array(
|
||||
0: Stmt_For(
|
||||
init: array(
|
||||
0: Expr_Assign(
|
||||
var: Expr_Variable(
|
||||
name: i
|
||||
)
|
||||
expr: Scalar_LNumber(
|
||||
value: 11
|
||||
)
|
||||
)
|
||||
)
|
||||
cond: array(
|
||||
0: Expr_BinaryOp_Smaller(
|
||||
left: Expr_Variable(
|
||||
name: i
|
||||
)
|
||||
right: Scalar_LNumber(
|
||||
value: 15
|
||||
)
|
||||
)
|
||||
)
|
||||
loop: array(
|
||||
0: Expr_PostInc(
|
||||
var: Expr_Variable(
|
||||
name: i
|
||||
)
|
||||
)
|
||||
)
|
||||
stmts: array(
|
||||
0: Stmt_Expression(
|
||||
expr: Expr_Yield(
|
||||
key: null
|
||||
value: Expr_Variable(
|
||||
name: i
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
3: Stmt_Expression(
|
||||
expr: Expr_Array(
|
||||
items: array(
|
||||
0: Expr_ArrayItem(
|
||||
key: null
|
||||
value: Expr_Array(
|
||||
items: array(
|
||||
)
|
||||
)
|
||||
byRef: false
|
||||
unpack: true
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
4: Stmt_Expression(
|
||||
expr: Expr_Array(
|
||||
items: array(
|
||||
0: Expr_ArrayItem(
|
||||
key: null
|
||||
value: Expr_Array(
|
||||
items: array(
|
||||
0: Expr_ArrayItem(
|
||||
key: null
|
||||
value: Scalar_LNumber(
|
||||
value: 1
|
||||
)
|
||||
byRef: false
|
||||
unpack: false
|
||||
)
|
||||
1: Expr_ArrayItem(
|
||||
key: null
|
||||
value: Scalar_LNumber(
|
||||
value: 2
|
||||
)
|
||||
byRef: false
|
||||
unpack: false
|
||||
)
|
||||
2: Expr_ArrayItem(
|
||||
key: null
|
||||
value: Scalar_LNumber(
|
||||
value: 3
|
||||
)
|
||||
byRef: false
|
||||
unpack: false
|
||||
)
|
||||
)
|
||||
)
|
||||
byRef: false
|
||||
unpack: true
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
5: Stmt_Expression(
|
||||
expr: Expr_Array(
|
||||
items: array(
|
||||
0: Expr_ArrayItem(
|
||||
key: null
|
||||
value: Expr_Variable(
|
||||
name: array
|
||||
)
|
||||
byRef: false
|
||||
unpack: true
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
6: Stmt_Expression(
|
||||
expr: Expr_Array(
|
||||
items: array(
|
||||
0: Expr_ArrayItem(
|
||||
key: null
|
||||
value: Expr_FuncCall(
|
||||
name: Name(
|
||||
parts: array(
|
||||
0: getArr
|
||||
)
|
||||
)
|
||||
args: array(
|
||||
)
|
||||
)
|
||||
byRef: false
|
||||
unpack: true
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
7: Stmt_Expression(
|
||||
expr: Expr_Array(
|
||||
items: array(
|
||||
0: Expr_ArrayItem(
|
||||
key: null
|
||||
value: Expr_FuncCall(
|
||||
name: Name(
|
||||
parts: array(
|
||||
0: arrGen
|
||||
)
|
||||
)
|
||||
args: array(
|
||||
)
|
||||
)
|
||||
byRef: false
|
||||
unpack: true
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
8: Stmt_Expression(
|
||||
expr: Expr_Array(
|
||||
items: array(
|
||||
0: Expr_ArrayItem(
|
||||
key: null
|
||||
value: Expr_New(
|
||||
class: Name(
|
||||
parts: array(
|
||||
0: ArrayIterator
|
||||
)
|
||||
)
|
||||
args: array(
|
||||
0: Arg(
|
||||
value: Expr_Array(
|
||||
items: array(
|
||||
0: Expr_ArrayItem(
|
||||
key: null
|
||||
value: Scalar_String(
|
||||
value: a
|
||||
)
|
||||
byRef: false
|
||||
unpack: false
|
||||
)
|
||||
1: Expr_ArrayItem(
|
||||
key: null
|
||||
value: Scalar_String(
|
||||
value: b
|
||||
)
|
||||
byRef: false
|
||||
unpack: false
|
||||
)
|
||||
2: Expr_ArrayItem(
|
||||
key: null
|
||||
value: Scalar_String(
|
||||
value: c
|
||||
)
|
||||
byRef: false
|
||||
unpack: false
|
||||
)
|
||||
)
|
||||
)
|
||||
byRef: false
|
||||
unpack: false
|
||||
)
|
||||
)
|
||||
)
|
||||
byRef: false
|
||||
unpack: true
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
9: Stmt_Expression(
|
||||
expr: Expr_Array(
|
||||
items: array(
|
||||
0: Expr_ArrayItem(
|
||||
key: null
|
||||
value: Scalar_LNumber(
|
||||
value: 0
|
||||
)
|
||||
byRef: false
|
||||
unpack: false
|
||||
)
|
||||
1: Expr_ArrayItem(
|
||||
key: null
|
||||
value: Expr_Variable(
|
||||
name: array
|
||||
)
|
||||
byRef: false
|
||||
unpack: true
|
||||
)
|
||||
2: Expr_ArrayItem(
|
||||
key: null
|
||||
value: Expr_FuncCall(
|
||||
name: Name(
|
||||
parts: array(
|
||||
0: getArr
|
||||
)
|
||||
)
|
||||
args: array(
|
||||
)
|
||||
)
|
||||
byRef: false
|
||||
unpack: true
|
||||
)
|
||||
3: Expr_ArrayItem(
|
||||
key: null
|
||||
value: Scalar_LNumber(
|
||||
value: 6
|
||||
)
|
||||
byRef: false
|
||||
unpack: false
|
||||
)
|
||||
4: Expr_ArrayItem(
|
||||
key: null
|
||||
value: Scalar_LNumber(
|
||||
value: 7
|
||||
)
|
||||
byRef: false
|
||||
unpack: false
|
||||
)
|
||||
5: Expr_ArrayItem(
|
||||
key: null
|
||||
value: Scalar_LNumber(
|
||||
value: 8
|
||||
)
|
||||
byRef: false
|
||||
unpack: false
|
||||
)
|
||||
6: Expr_ArrayItem(
|
||||
key: null
|
||||
value: Scalar_LNumber(
|
||||
value: 9
|
||||
)
|
||||
byRef: false
|
||||
unpack: false
|
||||
)
|
||||
7: Expr_ArrayItem(
|
||||
key: null
|
||||
value: Scalar_LNumber(
|
||||
value: 10
|
||||
)
|
||||
byRef: false
|
||||
unpack: false
|
||||
)
|
||||
8: Expr_ArrayItem(
|
||||
key: null
|
||||
value: Expr_FuncCall(
|
||||
name: Name(
|
||||
parts: array(
|
||||
0: arrGen
|
||||
)
|
||||
)
|
||||
args: array(
|
||||
)
|
||||
)
|
||||
byRef: false
|
||||
unpack: true
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
10: Stmt_Expression(
|
||||
expr: Expr_Array(
|
||||
items: array(
|
||||
0: Expr_ArrayItem(
|
||||
key: null
|
||||
value: Scalar_LNumber(
|
||||
value: 0
|
||||
)
|
||||
byRef: false
|
||||
unpack: false
|
||||
)
|
||||
1: Expr_ArrayItem(
|
||||
key: null
|
||||
value: Expr_Variable(
|
||||
name: array
|
||||
)
|
||||
byRef: false
|
||||
unpack: true
|
||||
)
|
||||
2: Expr_ArrayItem(
|
||||
key: null
|
||||
value: Expr_Variable(
|
||||
name: array
|
||||
)
|
||||
byRef: false
|
||||
unpack: true
|
||||
)
|
||||
3: Expr_ArrayItem(
|
||||
key: null
|
||||
value: Scalar_String(
|
||||
value: end
|
||||
)
|
||||
byRef: false
|
||||
unpack: false
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
@ -253,6 +253,7 @@ array(
|
||||
name: a
|
||||
)
|
||||
byRef: false
|
||||
unpack: false
|
||||
)
|
||||
)
|
||||
comments: array(
|
||||
@ -280,6 +281,7 @@ array(
|
||||
name: a
|
||||
)
|
||||
byRef: false
|
||||
unpack: false
|
||||
)
|
||||
1: null
|
||||
2: Expr_ArrayItem(
|
||||
@ -288,6 +290,7 @@ array(
|
||||
name: b
|
||||
)
|
||||
byRef: false
|
||||
unpack: false
|
||||
)
|
||||
)
|
||||
)
|
||||
@ -306,6 +309,7 @@ array(
|
||||
name: a
|
||||
)
|
||||
byRef: false
|
||||
unpack: false
|
||||
)
|
||||
1: Expr_ArrayItem(
|
||||
key: null
|
||||
@ -318,10 +322,12 @@ array(
|
||||
name: c
|
||||
)
|
||||
byRef: false
|
||||
unpack: false
|
||||
)
|
||||
)
|
||||
)
|
||||
byRef: false
|
||||
unpack: false
|
||||
)
|
||||
2: Expr_ArrayItem(
|
||||
key: null
|
||||
@ -329,6 +335,7 @@ array(
|
||||
name: d
|
||||
)
|
||||
byRef: false
|
||||
unpack: false
|
||||
)
|
||||
)
|
||||
)
|
||||
|
@ -544,6 +544,7 @@ array(
|
||||
value: 1
|
||||
)
|
||||
byRef: false
|
||||
unpack: false
|
||||
)
|
||||
1: Expr_ArrayItem(
|
||||
key: null
|
||||
@ -551,6 +552,7 @@ array(
|
||||
value: 2
|
||||
)
|
||||
byRef: false
|
||||
unpack: false
|
||||
)
|
||||
2: Expr_ArrayItem(
|
||||
key: null
|
||||
@ -558,6 +560,7 @@ array(
|
||||
value: 3
|
||||
)
|
||||
byRef: false
|
||||
unpack: false
|
||||
)
|
||||
)
|
||||
)
|
||||
|
@ -56,6 +56,7 @@ array(
|
||||
value: 1
|
||||
)
|
||||
byRef: false
|
||||
unpack: false
|
||||
)
|
||||
1: Expr_ArrayItem(
|
||||
key: null
|
||||
@ -63,6 +64,7 @@ array(
|
||||
value: 2
|
||||
)
|
||||
byRef: false
|
||||
unpack: false
|
||||
)
|
||||
2: Expr_ArrayItem(
|
||||
key: null
|
||||
@ -70,6 +72,7 @@ array(
|
||||
value: 3
|
||||
)
|
||||
byRef: false
|
||||
unpack: false
|
||||
)
|
||||
)
|
||||
)
|
||||
@ -90,6 +93,7 @@ array(
|
||||
value: 1
|
||||
)
|
||||
byRef: false
|
||||
unpack: false
|
||||
)
|
||||
1: Expr_ArrayItem(
|
||||
key: null
|
||||
@ -97,6 +101,7 @@ array(
|
||||
value: 2
|
||||
)
|
||||
byRef: false
|
||||
unpack: false
|
||||
)
|
||||
2: Expr_ArrayItem(
|
||||
key: null
|
||||
@ -104,6 +109,7 @@ array(
|
||||
value: 3
|
||||
)
|
||||
byRef: false
|
||||
unpack: false
|
||||
)
|
||||
)
|
||||
)
|
||||
@ -130,6 +136,7 @@ array(
|
||||
value: 1
|
||||
)
|
||||
byRef: false
|
||||
unpack: false
|
||||
)
|
||||
1: Expr_ArrayItem(
|
||||
key: null
|
||||
@ -137,6 +144,7 @@ array(
|
||||
value: 2
|
||||
)
|
||||
byRef: false
|
||||
unpack: false
|
||||
)
|
||||
2: Expr_ArrayItem(
|
||||
key: null
|
||||
@ -144,6 +152,7 @@ array(
|
||||
value: 3
|
||||
)
|
||||
byRef: false
|
||||
unpack: false
|
||||
)
|
||||
)
|
||||
)
|
||||
@ -164,6 +173,7 @@ array(
|
||||
value: 1
|
||||
)
|
||||
byRef: false
|
||||
unpack: false
|
||||
)
|
||||
1: Expr_ArrayItem(
|
||||
key: null
|
||||
@ -171,6 +181,7 @@ array(
|
||||
value: 2
|
||||
)
|
||||
byRef: false
|
||||
unpack: false
|
||||
)
|
||||
2: Expr_ArrayItem(
|
||||
key: null
|
||||
@ -178,6 +189,7 @@ array(
|
||||
value: 3
|
||||
)
|
||||
byRef: false
|
||||
unpack: false
|
||||
)
|
||||
)
|
||||
)
|
||||
|
@ -63,6 +63,7 @@ array(
|
||||
value: 1
|
||||
)
|
||||
byRef: false
|
||||
unpack: false
|
||||
)
|
||||
1: Expr_ArrayItem(
|
||||
key: null
|
||||
@ -70,6 +71,7 @@ array(
|
||||
value: 2
|
||||
)
|
||||
byRef: false
|
||||
unpack: false
|
||||
)
|
||||
2: Expr_ArrayItem(
|
||||
key: null
|
||||
@ -77,6 +79,7 @@ array(
|
||||
value: 3
|
||||
)
|
||||
byRef: false
|
||||
unpack: false
|
||||
)
|
||||
)
|
||||
)
|
||||
|
@ -19,6 +19,7 @@ array(
|
||||
name: v
|
||||
)
|
||||
byRef: true
|
||||
unpack: false
|
||||
)
|
||||
)
|
||||
)
|
||||
@ -39,6 +40,7 @@ array(
|
||||
name: v
|
||||
)
|
||||
byRef: true
|
||||
unpack: false
|
||||
)
|
||||
)
|
||||
)
|
||||
@ -57,6 +59,7 @@ array(
|
||||
name: v
|
||||
)
|
||||
byRef: true
|
||||
unpack: false
|
||||
)
|
||||
)
|
||||
)
|
||||
@ -77,6 +80,7 @@ array(
|
||||
name: v
|
||||
)
|
||||
byRef: true
|
||||
unpack: false
|
||||
)
|
||||
)
|
||||
)
|
||||
|
@ -19,6 +19,7 @@ array(
|
||||
name: b
|
||||
)
|
||||
byRef: false
|
||||
unpack: false
|
||||
)
|
||||
)
|
||||
)
|
||||
@ -32,6 +33,7 @@ array(
|
||||
value: b
|
||||
)
|
||||
byRef: false
|
||||
unpack: false
|
||||
)
|
||||
)
|
||||
)
|
||||
@ -55,10 +57,12 @@ array(
|
||||
name: c
|
||||
)
|
||||
byRef: false
|
||||
unpack: false
|
||||
)
|
||||
)
|
||||
)
|
||||
byRef: false
|
||||
unpack: false
|
||||
)
|
||||
1: Expr_ArrayItem(
|
||||
key: Scalar_String(
|
||||
@ -68,6 +72,7 @@ array(
|
||||
name: e
|
||||
)
|
||||
byRef: false
|
||||
unpack: false
|
||||
)
|
||||
)
|
||||
)
|
||||
|
@ -144,6 +144,7 @@ array(
|
||||
value: udef
|
||||
)
|
||||
byRef: false
|
||||
unpack: false
|
||||
)
|
||||
1: Expr_ArrayItem(
|
||||
key: null
|
||||
@ -151,6 +152,7 @@ array(
|
||||
value: id
|
||||
)
|
||||
byRef: false
|
||||
unpack: false
|
||||
)
|
||||
)
|
||||
)
|
||||
@ -345,6 +347,7 @@ array(
|
||||
name: obj
|
||||
)
|
||||
byRef: false
|
||||
unpack: false
|
||||
)
|
||||
1: Expr_ArrayItem(
|
||||
key: null
|
||||
@ -352,6 +355,7 @@ array(
|
||||
value: id
|
||||
)
|
||||
byRef: false
|
||||
unpack: false
|
||||
)
|
||||
)
|
||||
)
|
||||
|
@ -21,6 +21,7 @@ array(
|
||||
value: 0
|
||||
)
|
||||
byRef: false
|
||||
unpack: false
|
||||
)
|
||||
1: Expr_ArrayItem(
|
||||
key: null
|
||||
@ -28,6 +29,7 @@ array(
|
||||
value: 1
|
||||
)
|
||||
byRef: false
|
||||
unpack: false
|
||||
)
|
||||
)
|
||||
)
|
||||
@ -57,6 +59,7 @@ array(
|
||||
value: b
|
||||
)
|
||||
byRef: false
|
||||
unpack: false
|
||||
)
|
||||
)
|
||||
)
|
||||
|
@ -105,6 +105,7 @@ array(
|
||||
value: 0
|
||||
)
|
||||
byRef: false
|
||||
unpack: false
|
||||
)
|
||||
1: Expr_ArrayItem(
|
||||
key: null
|
||||
@ -112,6 +113,7 @@ array(
|
||||
value: 1
|
||||
)
|
||||
byRef: false
|
||||
unpack: false
|
||||
)
|
||||
)
|
||||
)
|
||||
|
@ -123,6 +123,7 @@ array(
|
||||
value: Test
|
||||
)
|
||||
byRef: false
|
||||
unpack: false
|
||||
)
|
||||
1: Expr_ArrayItem(
|
||||
key: null
|
||||
@ -130,6 +131,7 @@ array(
|
||||
value: Test
|
||||
)
|
||||
byRef: false
|
||||
unpack: false
|
||||
)
|
||||
)
|
||||
)
|
||||
|
@ -130,6 +130,7 @@ array(
|
||||
value: foo
|
||||
)
|
||||
byRef: false
|
||||
unpack: false
|
||||
)
|
||||
)
|
||||
)
|
||||
@ -149,6 +150,7 @@ array(
|
||||
value: foo
|
||||
)
|
||||
byRef: false
|
||||
unpack: false
|
||||
)
|
||||
1: Expr_ArrayItem(
|
||||
key: Scalar_String(
|
||||
@ -158,6 +160,7 @@ array(
|
||||
value: baz
|
||||
)
|
||||
byRef: false
|
||||
unpack: false
|
||||
)
|
||||
)
|
||||
)
|
||||
|
@ -108,6 +108,7 @@ array(
|
||||
)
|
||||
)
|
||||
byRef: false
|
||||
unpack: false
|
||||
)
|
||||
)
|
||||
)
|
||||
@ -195,6 +196,7 @@ array(
|
||||
)
|
||||
)
|
||||
byRef: false
|
||||
unpack: false
|
||||
)
|
||||
)
|
||||
)
|
||||
@ -236,6 +238,7 @@ array(
|
||||
)
|
||||
)
|
||||
byRef: false
|
||||
unpack: false
|
||||
)
|
||||
)
|
||||
)
|
||||
|
@ -87,6 +87,7 @@ array(
|
||||
name: a
|
||||
)
|
||||
byRef: false
|
||||
unpack: false
|
||||
)
|
||||
1: Expr_ArrayItem(
|
||||
key: null
|
||||
@ -94,6 +95,7 @@ array(
|
||||
name: b
|
||||
)
|
||||
byRef: false
|
||||
unpack: false
|
||||
)
|
||||
)
|
||||
)
|
||||
@ -116,6 +118,7 @@ array(
|
||||
name: b
|
||||
)
|
||||
byRef: false
|
||||
unpack: false
|
||||
)
|
||||
1: null
|
||||
2: Expr_ArrayItem(
|
||||
@ -124,6 +127,7 @@ array(
|
||||
name: c
|
||||
)
|
||||
byRef: false
|
||||
unpack: false
|
||||
)
|
||||
)
|
||||
)
|
||||
|
8
test/code/prettyPrinter/expr/arraySpread.test
Normal file
8
test/code/prettyPrinter/expr/arraySpread.test
Normal file
@ -0,0 +1,8 @@
|
||||
Array spread
|
||||
-----
|
||||
<?php
|
||||
|
||||
[$a, $b] = [...$c, ...$d];
|
||||
-----
|
||||
!!php7
|
||||
[$a, $b] = [...$c, ...$d];
|
Loading…
x
Reference in New Issue
Block a user