Skip to content

Commit 260678d

Browse files
authored
Add encaps var flags for AST_DIM/AST_VAR for php 8.2 (#227)
For https://wiki.php.net/rfc/deprecate_dollar_brace_string_interpolation Closes #224 In util.php: Don't print a 0 flag value for combinable flags For php-ast self-testing, minimize the number of changes in the future when similar combinable flags get added to existing ast var types.
1 parent e7dceba commit 260678d

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

59 files changed

+151
-228
lines changed

README.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -357,6 +357,11 @@ ast\flags\ARRAY_ELEM_REF
357357
358358
// Used by ast\AST_DIM (combinable), since PHP 7.4
359359
ast\flags\DIM_ALTERNATIVE_SYNTAX
360+
ast\flags\ENCAPS_VAR_DOLLAR_CURLY // php 8.2 deprecation, only available in php 8.2+
361+
362+
// Used by ast\AST_VAR (combinable), since PHP 8.2
363+
ast\flags\ENCAPS_VAR_DOLLAR_CURLY
364+
ast\flags\ENCAPS_VAR_DOLLAR_CURLY_VAR_VAR
360365
361366
// Used by ast\AST_CONDITIONAL (combinable), since PHP 7.4
362367
ast\flags\PARENTHESIZED_CONDITIONAL

ast.c

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,11 @@
112112
# define IS_NEVER 22
113113
#endif
114114

115+
#if PHP_VERSION_ID < 80200
116+
# define ZEND_ENCAPS_VAR_DOLLAR_CURLY (1<<0)
117+
# define ZEND_ENCAPS_VAR_DOLLAR_CURLY_VAR_VAR (1<<1)
118+
#endif
119+
115120
/* This contains state of the ast Node creator. */
116121
typedef struct ast_state_info {
117122
zend_long version;
@@ -299,9 +304,9 @@ static const char *func_flags[] = {
299304
NULL
300305
};
301306

302-
// Flags of AST_DIM are marked as combinable in case any other flags get added in the future.
303307
static const char *dim_flags[] = {
304308
AST_FLAG(DIM_ALTERNATIVE_SYNTAX),
309+
AST_FLAG(ENCAPS_VAR_DOLLAR_CURLY),
305310
NULL
306311
};
307312

@@ -311,6 +316,12 @@ static const char *conditional_flags[] = {
311316
NULL
312317
};
313318

319+
static const char *var_flags[] = {
320+
AST_FLAG(ENCAPS_VAR_DOLLAR_CURLY_VAR_VAR),
321+
AST_FLAG(ENCAPS_VAR_DOLLAR_CURLY),
322+
NULL
323+
};
324+
314325
static const ast_flag_info flag_info[] = {
315326
{ AST_NAME, 0, name_flags },
316327
{ ZEND_AST_CLASS, 1, class_flags },
@@ -339,6 +350,7 @@ static const ast_flag_info flag_info[] = {
339350
{ ZEND_AST_TRAIT_ALIAS, 1, modifier_flags },
340351
{ ZEND_AST_DIM, 1, dim_flags },
341352
{ ZEND_AST_CONDITIONAL, 1, conditional_flags },
353+
{ ZEND_AST_VAR, 1, var_flags },
342354
};
343355

344356
static inline void ast_update_property(zval *object, zend_string *name, zval *value) {
@@ -414,7 +426,8 @@ static inline zend_bool ast_kind_uses_attr(zend_ast_kind kind) {
414426
|| kind == ZEND_AST_GROUP_USE || kind == ZEND_AST_USE_ELEM
415427
|| kind == AST_NAME || kind == AST_CLOSURE_VAR || kind == ZEND_AST_CLASS_CONST_DECL
416428
|| kind == ZEND_AST_CLASS_CONST_GROUP
417-
|| kind == ZEND_AST_ARRAY || kind == ZEND_AST_DIM || kind == ZEND_AST_CONDITIONAL;
429+
|| kind == ZEND_AST_ARRAY || kind == ZEND_AST_DIM || kind == ZEND_AST_CONDITIONAL
430+
|| kind == ZEND_AST_VAR;
418431
}
419432

420433
static inline zend_bool ast_kind_is_decl(zend_ast_kind kind) {
@@ -1486,6 +1499,9 @@ PHP_MINIT_FUNCTION(ast) {
14861499

14871500
ast_register_flag_constant("PARENTHESIZED_CONDITIONAL", ZEND_PARENTHESIZED_CONDITIONAL);
14881501

1502+
ast_register_flag_constant("ENCAPS_VAR_DOLLAR_CURLY", ZEND_ENCAPS_VAR_DOLLAR_CURLY);
1503+
ast_register_flag_constant("ENCAPS_VAR_DOLLAR_CURLY_VAR_VAR", ZEND_ENCAPS_VAR_DOLLAR_CURLY_VAR_VAR);
1504+
14891505
INIT_CLASS_ENTRY(tmp_ce, "ast\\Node", class_ast_Node_methods);
14901506
ast_node_ce = zend_register_internal_class(&tmp_ce);
14911507
ast_declare_property(ast_node_ce, AST_STR(str_kind), &zv_null);

ast_stub.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -212,6 +212,8 @@
212212
const ARRAY_SYNTAX_SHORT = 3;
213213
const DIM_ALTERNATIVE_SYNTAX = 2;
214214
const PARENTHESIZED_CONDITIONAL = 1;
215+
const ENCAPS_VAR_DOLLAR_CURLY = 1;
216+
const ENCAPS_VAR_DOLLAR_CURLY_VAR_VAR = 2;
215217
// END AST FLAG CONSTANTS
216218

217219
namespace ast;

package.xml

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,10 @@
3232
- Change documentation files to properly namespace attributes as `#[\AllowDynamicProperties]`. The reflection attributes are already correct.
3333
- Deprecated AST versions 50 and 60.
3434
- Drop support for php &lt;= 7.1
35+
- Fix test failures seen in php 8.2.0beta2 due to change to var_export's output format.
3536
- Add support for php 8.2 readonly classes. Add `ast\flags\CLASS_READONLY` constant.
3637
- Add support for php 8.2 `true` type. Add `ast\flags\TYPE_TRUE` constant.
38+
- Fix bug in php 8.2 where ZEND_AST_ARROW_FUNC output did not include the stub `AST_RETURN` node that was included in php 8.1 and below.
3739
</notes>
3840
<contents>
3941
<dir name="/">
@@ -119,7 +121,9 @@
119121
<file name="php81_final_class_const.phpt" role="test" />
120122
<file name="php81_intersection_types.phpt" role="test" />
121123
<file name="php81_readonly.phpt" role="test" />
122-
<file name="php82_metadata.phpt" role="test" />
124+
<file name="php82_dynamic_property_attribute.phpt" role="test" />
125+
<file name="php82_encaps_list.phpt" role="test" />
126+
<file name="php82_readonly_class.phpt" role="test" />
123127
<file name="prop_doc_comments.phpt" role="test" />
124128
<file name="short_arrow_function.phpt" role="test" />
125129
<file name="short_arrow_function_return.phpt" role="test" />

tests/001.phpt

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,10 @@ echo ast_dump(ast\parse_code($code, $version=70));
2424
--EXPECT--
2525
AST_STMT_LIST
2626
0: AST_FUNC_DECL
27-
flags: 0
2827
name: "test"
2928
docComment: "/** Test function */"
3029
params: AST_PARAM_LIST
3130
0: AST_PARAM
32-
flags: 0
3331
type: AST_NAME
3432
flags: NAME_NOT_FQ (1)
3533
name: "Type"
@@ -69,4 +67,4 @@ AST_STMT_LIST
6967
returnType: AST_NAME
7068
flags: NAME_NOT_FQ (1)
7169
name: "Ret"
72-
__declId: 0
70+
__declId: 0

tests/array_destructuring.phpt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,4 +78,4 @@ AST_STMT_LIST
7878
key: null
7979
key: null
8080
expr: AST_VAR
81-
name: "x"
81+
name: "x"

tests/array_destructuring_old.phpt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ echo ast_dump(ast\parse_code($code, $version=70));
1818
AST_STMT_LIST
1919
0: AST_ASSIGN
2020
var: AST_ARRAY
21-
flags: ARRAY_SYNTAX_LIST (1)
21+
flags: ARRAY_SYNTAX_LIST (%d)
2222
0: AST_ARRAY_ELEM
2323
flags: 0
2424
value: AST_VAR
@@ -33,12 +33,12 @@ AST_STMT_LIST
3333
name: "x"
3434
1: AST_ASSIGN
3535
var: AST_ARRAY
36-
flags: ARRAY_SYNTAX_LIST (1)
36+
flags: ARRAY_SYNTAX_LIST (%d)
3737
0: null
3838
1: AST_ARRAY_ELEM
3939
flags: 0
4040
value: AST_VAR
4141
name: "b"
4242
key: null
4343
expr: AST_VAR
44-
name: "x"
44+
name: "x"

tests/assign_ops.phpt

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -27,55 +27,55 @@ echo ast_dump(ast\parse_code($code, $version=70)), "\n";
2727
--EXPECTF--
2828
AST_STMT_LIST
2929
0: AST_ASSIGN_OP
30-
flags: BINARY_BITWISE_OR (9)
30+
flags: BINARY_BITWISE_OR (%d)
3131
var: AST_VAR
3232
name: "a"
3333
expr: AST_VAR
3434
name: "b"
3535
1: AST_ASSIGN_OP
36-
flags: BINARY_BITWISE_AND (10)
36+
flags: BINARY_BITWISE_AND (%d)
3737
var: AST_VAR
3838
name: "a"
3939
expr: AST_VAR
4040
name: "b"
4141
2: AST_ASSIGN_OP
42-
flags: BINARY_BITWISE_XOR (11)
42+
flags: BINARY_BITWISE_XOR (%d)
4343
var: AST_VAR
4444
name: "a"
4545
expr: AST_VAR
4646
name: "b"
4747
3: AST_ASSIGN_OP
48-
flags: BINARY_CONCAT (8)
48+
flags: BINARY_CONCAT (%d)
4949
var: AST_VAR
5050
name: "a"
5151
expr: AST_VAR
5252
name: "b"
5353
4: AST_ASSIGN_OP
54-
flags: BINARY_ADD (1)
54+
flags: BINARY_ADD (%d)
5555
var: AST_VAR
5656
name: "a"
5757
expr: AST_VAR
5858
name: "b"
5959
5: AST_ASSIGN_OP
60-
flags: BINARY_SUB (2)
60+
flags: BINARY_SUB (%d)
6161
var: AST_VAR
6262
name: "a"
6363
expr: AST_VAR
6464
name: "b"
6565
6: AST_ASSIGN_OP
66-
flags: BINARY_MUL (3)
66+
flags: BINARY_MUL (%d)
6767
var: AST_VAR
6868
name: "a"
6969
expr: AST_VAR
7070
name: "b"
7171
7: AST_ASSIGN_OP
72-
flags: BINARY_DIV (4)
72+
flags: BINARY_DIV (%d)
7373
var: AST_VAR
7474
name: "a"
7575
expr: AST_VAR
7676
name: "b"
7777
8: AST_ASSIGN_OP
78-
flags: BINARY_MOD (5)
78+
flags: BINARY_MOD (%d)
7979
var: AST_VAR
8080
name: "a"
8181
expr: AST_VAR
@@ -87,14 +87,14 @@ AST_STMT_LIST
8787
expr: AST_VAR
8888
name: "b"
8989
10: AST_ASSIGN_OP
90-
flags: BINARY_SHIFT_LEFT (6)
90+
flags: BINARY_SHIFT_LEFT (%d)
9191
var: AST_VAR
9292
name: "a"
9393
expr: AST_VAR
9494
name: "b"
9595
11: AST_ASSIGN_OP
96-
flags: BINARY_SHIFT_RIGHT (7)
96+
flags: BINARY_SHIFT_RIGHT (%d)
9797
var: AST_VAR
9898
name: "a"
9999
expr: AST_VAR
100-
name: "b"
100+
name: "b"

tests/ast_dump_with_exclude_doc.phpt

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,9 @@ echo ast_dump($ast, AST_DUMP_EXCLUDE_DOC_COMMENT);
2323
--EXPECT--
2424
AST_STMT_LIST
2525
0: AST_FUNC_DECL
26-
flags: 0
2726
name: "test"
2827
params: AST_PARAM_LIST
2928
0: AST_PARAM
30-
flags: 0
3129
type: null
3230
name: "foo"
3331
default: null

tests/ast_dump_with_linenos.phpt

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,20 +25,19 @@ $ast = ast\parse_code($code, $version=70);
2525
echo ast_dump($ast, AST_DUMP_LINENOS);
2626

2727
?>
28-
--EXPECT--
28+
--EXPECTF--
2929
AST_STMT_LIST @ 1
3030
0: AST_FUNC_DECL @ 2-9
31-
flags: 0
3231
name: "test"
3332
docComment: null
3433
params: AST_PARAM_LIST @ 4
3534
stmts: AST_STMT_LIST @ 5
3635
0: AST_CALL @ 6
3736
expr: AST_NAME @ 6
38-
flags: NAME_NOT_FQ (1)
37+
flags: NAME_NOT_FQ (%d)
3938
name: "var_dump"
4039
args: AST_ARG_LIST @ 7
4140
0: AST_VAR @ 7
4241
name: "foo"
4342
returnType: null
44-
__declId: 0
43+
__declId: 0

0 commit comments

Comments
 (0)