Skip to content

Commit eded56d

Browse files
committed
Expose PHP 7.1 ARRAY_SYNTAX flags
1 parent 1ba1ca7 commit eded56d

File tree

7 files changed

+172
-7
lines changed

7 files changed

+172
-7
lines changed

README.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -306,6 +306,11 @@ ast\flags\EXEC_INCLUDE
306306
ast\flags\EXEC_INCLUDE_ONCE
307307
ast\flags\EXEC_REQUIRE
308308
ast\flags\EXEC_REQUIRE_ONCE
309+
310+
// Used by ast\AST_ARRAY (exclusive), since PHP 7.1
311+
ast\flags\ARRAY_SYNTAX_SHORT
312+
ast\flags\ARRAY_SYNTAX_LONG
313+
ast\flags\ARRAY_SYNTAX_LIST
309314
```
310315

311316
AST node kinds

ast.c

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,9 @@
4747
# define IS_VOID 18
4848
# define IS_ITERABLE 19
4949
# define ZEND_TYPE_NULLABLE (1<<8)
50+
# define ZEND_ARRAY_SYNTAX_LIST 1
51+
# define ZEND_ARRAY_SYNTAX_LONG 2
52+
# define ZEND_ARRAY_SYNTAX_SHORT 3
5053
#endif
5154

5255
static inline void ast_update_property(zval *object, zend_string *name, zval *value, void **cache_slot) {
@@ -104,7 +107,8 @@ static inline zend_bool ast_kind_uses_attr(zend_ast_kind kind) {
104107
|| kind == ZEND_AST_CAST || kind == ZEND_AST_MAGIC_CONST || kind == ZEND_AST_ARRAY_ELEM
105108
|| kind == ZEND_AST_INCLUDE_OR_EVAL || kind == ZEND_AST_USE || kind == ZEND_AST_PROP_DECL
106109
|| kind == ZEND_AST_GROUP_USE || kind == ZEND_AST_USE_ELEM
107-
|| kind == AST_NAME || kind == AST_CLOSURE_VAR || kind == ZEND_AST_CLASS_CONST_DECL;
110+
|| kind == AST_NAME || kind == AST_CLOSURE_VAR || kind == ZEND_AST_CLASS_CONST_DECL
111+
|| kind == ZEND_AST_ARRAY;
108112
}
109113

110114
static inline zend_bool ast_kind_is_decl(zend_ast_kind kind) {
@@ -811,6 +815,10 @@ PHP_MINIT_FUNCTION(ast) {
811815
ast_register_flag_constant("MAGIC_CLASS", T_CLASS_C);
812816
ast_register_flag_constant("MAGIC_TRAIT", T_TRAIT_C);
813817

818+
ast_register_flag_constant("ARRAY_SYNTAX_LIST", ZEND_ARRAY_SYNTAX_LIST);
819+
ast_register_flag_constant("ARRAY_SYNTAX_LONG", ZEND_ARRAY_SYNTAX_LONG);
820+
ast_register_flag_constant("ARRAY_SYNTAX_SHORT", ZEND_ARRAY_SYNTAX_SHORT);
821+
814822
INIT_CLASS_ENTRY(tmp_ce, "ast\\Node", NULL);
815823
ast_node_ce = zend_register_internal_class(&tmp_ce);
816824

tests/array_destructuring.phpt

Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
--TEST--
2+
Array destructuring
3+
--SKIPIF--
4+
<?php if (PHP_VERSION_ID < 70100) die('skip PHP >= 7.1 only'); ?>
5+
--FILE--
6+
<?php
7+
8+
require __DIR__ . '/../util.php';
9+
10+
$code = <<<'PHP'
11+
<?php
12+
list($a, $b) = $x;
13+
list('foo' => $a, 'bar' => $b) = $x;
14+
[$a, $b] = $x;
15+
['foo' => $a, 'bar' => $b] = $x;
16+
[, [$a]] = $x;
17+
PHP;
18+
19+
echo ast_dump(ast\parse_code($code, $version=30));
20+
21+
?>
22+
--EXPECT--
23+
AST_STMT_LIST
24+
0: AST_ASSIGN
25+
var: AST_ARRAY
26+
flags: ARRAY_SYNTAX_LIST (1)
27+
0: AST_ARRAY_ELEM
28+
flags: 0
29+
value: AST_VAR
30+
name: "a"
31+
key: null
32+
1: AST_ARRAY_ELEM
33+
flags: 0
34+
value: AST_VAR
35+
name: "b"
36+
key: null
37+
expr: AST_VAR
38+
name: "x"
39+
1: AST_ASSIGN
40+
var: AST_ARRAY
41+
flags: ARRAY_SYNTAX_LIST (1)
42+
0: AST_ARRAY_ELEM
43+
flags: 0
44+
value: AST_VAR
45+
name: "a"
46+
key: "foo"
47+
1: AST_ARRAY_ELEM
48+
flags: 0
49+
value: AST_VAR
50+
name: "b"
51+
key: "bar"
52+
expr: AST_VAR
53+
name: "x"
54+
2: AST_ASSIGN
55+
var: AST_ARRAY
56+
flags: ARRAY_SYNTAX_SHORT (3)
57+
0: AST_ARRAY_ELEM
58+
flags: 0
59+
value: AST_VAR
60+
name: "a"
61+
key: null
62+
1: AST_ARRAY_ELEM
63+
flags: 0
64+
value: AST_VAR
65+
name: "b"
66+
key: null
67+
expr: AST_VAR
68+
name: "x"
69+
3: AST_ASSIGN
70+
var: AST_ARRAY
71+
flags: ARRAY_SYNTAX_SHORT (3)
72+
0: AST_ARRAY_ELEM
73+
flags: 0
74+
value: AST_VAR
75+
name: "a"
76+
key: "foo"
77+
1: AST_ARRAY_ELEM
78+
flags: 0
79+
value: AST_VAR
80+
name: "b"
81+
key: "bar"
82+
expr: AST_VAR
83+
name: "x"
84+
4: AST_ASSIGN
85+
var: AST_ARRAY
86+
flags: ARRAY_SYNTAX_SHORT (3)
87+
0: null
88+
1: AST_ARRAY_ELEM
89+
flags: 0
90+
value: AST_ARRAY
91+
flags: ARRAY_SYNTAX_SHORT (3)
92+
0: AST_ARRAY_ELEM
93+
flags: 0
94+
value: AST_VAR
95+
name: "a"
96+
key: null
97+
key: null
98+
expr: AST_VAR
99+
name: "x"

tests/multi_catch.phpt

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
--TEST--
2+
Multi catch
3+
--SKIPIF--
4+
<?php if (PHP_VERSION_ID < 70100) die('skip PHP >= 7.1 only'); ?>
5+
--FILE--
6+
<?php
7+
8+
require __DIR__ . '/../util.php';
9+
10+
$code = <<<'PHP'
11+
<?php
12+
try {
13+
} catch (A|B $b) {
14+
}
15+
PHP;
16+
17+
echo ast_dump(ast\parse_code($code, $version=30));
18+
echo ast_dump(ast\parse_code($code, $version=35));
19+
20+
?>
21+
--EXPECT--
22+
AST_STMT_LIST
23+
0: AST_TRY
24+
try: AST_STMT_LIST
25+
catches: AST_CATCH_LIST
26+
0: AST_CATCH
27+
class: AST_NAME_LIST
28+
0: AST_NAME
29+
flags: NAME_NOT_FQ (1)
30+
name: "A"
31+
1: AST_NAME
32+
flags: NAME_NOT_FQ (1)
33+
name: "B"
34+
var: AST_VAR
35+
name: "b"
36+
stmts: AST_STMT_LIST
37+
finally: nullAST_STMT_LIST
38+
0: AST_TRY
39+
try: AST_STMT_LIST
40+
catches: AST_CATCH_LIST
41+
0: AST_CATCH
42+
class: AST_NAME_LIST
43+
0: AST_NAME
44+
flags: NAME_NOT_FQ (1)
45+
name: "A"
46+
1: AST_NAME
47+
flags: NAME_NOT_FQ (1)
48+
name: "B"
49+
var: AST_VAR
50+
name: "b"
51+
stmts: AST_STMT_LIST
52+
finally: null

tests/parse_file.phpt

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,4 @@ echo ast_dump($ast);
1212
--EXPECT--
1313
AST_STMT_LIST
1414
0: AST_RETURN
15-
expr: AST_ARRAY
16-
0: AST_ARRAY_ELEM
17-
flags: 0
18-
value: 123
19-
key: null
15+
expr: 123

tests/valid_file.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
<?php
22

3-
return [123];
3+
return 123;

util.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,11 @@ function get_flag_info() : array {
127127
flags\EXEC_REQUIRE => 'EXEC_REQUIRE',
128128
flags\EXEC_REQUIRE_ONCE => 'EXEC_REQUIRE_ONCE',
129129
],
130+
ast\AST_ARRAY => [
131+
flags\ARRAY_SYNTAX_LIST => 'ARRAY_SYNTAX_LIST',
132+
flags\ARRAY_SYNTAX_LONG => 'ARRAY_SYNTAX_LONG',
133+
flags\ARRAY_SYNTAX_SHORT => 'ARRAY_SYNTAX_SHORT',
134+
],
130135
];
131136

132137
$combinable = [];

0 commit comments

Comments
 (0)