Skip to content

Commit 869ea5e

Browse files
Add Asymmetric Visibility flags (#250)
Introduces new asymmetric visibility flags: MODIFIER_PUBLIC_SET, MODIFIER_PROTECTED_SET and MODIFIER_PRIVATE_SET.
1 parent faca6cc commit 869ea5e

File tree

6 files changed

+169
-4
lines changed

6 files changed

+169
-4
lines changed

README.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -237,6 +237,9 @@ ast\flags\MODIFIER_STATIC
237237
ast\flags\MODIFIER_ABSTRACT
238238
ast\flags\MODIFIER_FINAL
239239
ast\flags\MODIFIER_READONLY
240+
ast\flags\MODIFIER_PUBLIC_SET
241+
ast\flags\MODIFIER_PROTECTED_SET
242+
ast\flags\MODIFIER_PRIVATE_SET
240243
241244
// Used by ast\AST_CLOSURE, ast\AST_ARROW_FUNC (combinable)
242245
ast\flags\MODIFIER_STATIC

ast.c

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,16 @@
117117
# define ZEND_ENCAPS_VAR_DOLLAR_CURLY_VAR_VAR (1<<1)
118118
#endif
119119

120+
#if PHP_VERSION_ID < 80400
121+
# define MODIFIER_PUBLIC_SET (1 << 11)
122+
# define MODIFIER_PROTECTED_SET (1 << 12)
123+
# define MODIFIER_PRIVATE_SET (1 << 13)
124+
#else
125+
# define MODIFIER_PUBLIC_SET ZEND_ACC_PUBLIC_SET
126+
# define MODIFIER_PROTECTED_SET ZEND_ACC_PROTECTED_SET
127+
# define MODIFIER_PRIVATE_SET ZEND_ACC_PRIVATE_SET
128+
#endif
129+
120130
#if PHP_VERSION_ID >= 80400
121131
# define ZEND_DIM_ALTERNATIVE_SYNTAX (1<<1)
122132
#endif
@@ -289,11 +299,22 @@ static const char *closure_use_flags[] = {
289299
AST_FLAG(MODIFIER_FINAL), \
290300
AST_FLAG(MODIFIER_READONLY)
291301

302+
#define AST_ASYMMETRIC_VISIBILITY_FLAGS \
303+
AST_FLAG(MODIFIER_PUBLIC_SET), \
304+
AST_FLAG(MODIFIER_PROTECTED_SET), \
305+
AST_FLAG(MODIFIER_PRIVATE_SET)
306+
292307
static const char *modifier_flags[] = {
293308
AST_MODIFIER_FLAGS,
294309
NULL
295310
};
296311

312+
static const char *property_modifier_flags[] = {
313+
AST_MODIFIER_FLAGS,
314+
AST_ASYMMETRIC_VISIBILITY_FLAGS,
315+
NULL
316+
};
317+
297318
static const char *func_flags[] = {
298319
AST_MODIFIER_FLAGS,
299320
AST_FLAG(FUNC_RETURNS_REF),
@@ -341,8 +362,8 @@ static const ast_flag_info flag_info[] = {
341362
{ ZEND_AST_CLOSURE, 1, func_flags },
342363
{ ZEND_AST_ARROW_FUNC, 1, func_flags },
343364
{ ZEND_AST_PROPERTY_HOOK, 1, func_flags },
344-
{ ZEND_AST_PROP_DECL, 1, modifier_flags },
345-
{ ZEND_AST_PROP_GROUP, 1, modifier_flags },
365+
{ ZEND_AST_PROP_DECL, 1, property_modifier_flags },
366+
{ ZEND_AST_PROP_GROUP, 1, property_modifier_flags },
346367
{ ZEND_AST_CLASS_CONST_DECL, 1, modifier_flags },
347368
{ ZEND_AST_CLASS_CONST_GROUP, 1, modifier_flags },
348369
{ ZEND_AST_TRAIT_ALIAS, 1, modifier_flags },
@@ -1466,6 +1487,9 @@ PHP_MINIT_FUNCTION(ast) {
14661487
ast_register_flag_constant("MODIFIER_ABSTRACT", ZEND_ACC_ABSTRACT);
14671488
ast_register_flag_constant("MODIFIER_FINAL", ZEND_ACC_FINAL);
14681489
ast_register_flag_constant("MODIFIER_READONLY", ZEND_ACC_READONLY);
1490+
ast_register_flag_constant("MODIFIER_PUBLIC_SET", MODIFIER_PUBLIC_SET);
1491+
ast_register_flag_constant("MODIFIER_PROTECTED_SET", MODIFIER_PROTECTED_SET);
1492+
ast_register_flag_constant("MODIFIER_PRIVATE_SET", MODIFIER_PRIVATE_SET);
14691493

14701494
ast_register_flag_constant("PARAM_MODIFIER_PUBLIC", PARAM_MODIFIER_PUBLIC);
14711495
ast_register_flag_constant("PARAM_MODIFIER_PROTECTED", PARAM_MODIFIER_PROTECTED);

ast_stub.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,9 @@
129129
const MODIFIER_ABSTRACT = 64;
130130
const MODIFIER_FINAL = 32;
131131
const MODIFIER_READONLY = 128;
132+
const MODIFIER_PUBLIC_SET = 1024;
133+
const MODIFIER_PROTECTED_SET = 2048;
134+
const MODIFIER_PRIVATE_SET = 4096;
132135
const PARAM_MODIFIER_PUBLIC = 1;
133136
const PARAM_MODIFIER_PROTECTED = 2;
134137
const PARAM_MODIFIER_PRIVATE = 4;

package.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@
5252
<file name="assign_ops.phpt" role="test" />
5353
<file name="ast_dump_with_exclude_doc.phpt" role="test" />
5454
<file name="ast_dump_with_linenos.phpt" role="test" />
55+
<file name="asymmetric_visibility.phpt" role="test" />
5556
<file name="attributes_01.phpt" role="test" />
5657
<file name="attributes_02.phpt" role="test" />
5758
<file name="binary_ops.phpt" role="test" />

tests/asymmetric_visibility.phpt

Lines changed: 134 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,134 @@
1+
--TEST--
2+
Asymmetric Visibility in php 8.4
3+
--SKIPIF--
4+
<?php if (PHP_VERSION_ID < 80400) die('skip PHP >=8.4 only'); ?>
5+
--FILE--
6+
<?php
7+
require __DIR__ . '/../util.php';
8+
$code = <<<'PHP'
9+
<?php
10+
class PublicPropsWithAV
11+
{
12+
public public(set) int $p1 = 0;
13+
public protected(set) int $p2 = 0;
14+
public private(set) int $p3 = 0;
15+
protected public(set) int $p4 = 0;
16+
protected protected(set) int $p5 = 0;
17+
protected private(set) int $p6 = 0;
18+
private public(set) int $p7 = 0;
19+
private protected(set) int $pp8 = 0;
20+
private private(set) int $p9 = 0;
21+
}
22+
PHP;
23+
$node = ast\parse_code($code, $version=110);
24+
echo ast_dump($node), "\n";
25+
--EXPECTF--
26+
AST_STMT_LIST
27+
0: AST_CLASS
28+
name: "PublicPropsWithAV"
29+
docComment: null
30+
extends: null
31+
implements: null
32+
stmts: AST_STMT_LIST
33+
0: AST_PROP_GROUP
34+
flags: MODIFIER_PUBLIC | MODIFIER_PUBLIC_SET (1025)
35+
type: AST_TYPE
36+
flags: TYPE_LONG (4)
37+
props: AST_PROP_DECL
38+
0: AST_PROP_ELEM
39+
name: "p1"
40+
default: 0
41+
docComment: null
42+
hooks: null
43+
attributes: null
44+
1: AST_PROP_GROUP
45+
flags: MODIFIER_PUBLIC | MODIFIER_PROTECTED_SET (2049)
46+
type: AST_TYPE
47+
flags: TYPE_LONG (4)
48+
props: AST_PROP_DECL
49+
0: AST_PROP_ELEM
50+
name: "p2"
51+
default: 0
52+
docComment: null
53+
hooks: null
54+
attributes: null
55+
2: AST_PROP_GROUP
56+
flags: MODIFIER_PUBLIC | MODIFIER_PRIVATE_SET (4097)
57+
type: AST_TYPE
58+
flags: TYPE_LONG (4)
59+
props: AST_PROP_DECL
60+
0: AST_PROP_ELEM
61+
name: "p3"
62+
default: 0
63+
docComment: null
64+
hooks: null
65+
attributes: null
66+
3: AST_PROP_GROUP
67+
flags: MODIFIER_PROTECTED | MODIFIER_PUBLIC_SET (1026)
68+
type: AST_TYPE
69+
flags: TYPE_LONG (4)
70+
props: AST_PROP_DECL
71+
0: AST_PROP_ELEM
72+
name: "p4"
73+
default: 0
74+
docComment: null
75+
hooks: null
76+
attributes: null
77+
4: AST_PROP_GROUP
78+
flags: MODIFIER_PROTECTED | MODIFIER_PROTECTED_SET (2050)
79+
type: AST_TYPE
80+
flags: TYPE_LONG (4)
81+
props: AST_PROP_DECL
82+
0: AST_PROP_ELEM
83+
name: "p5"
84+
default: 0
85+
docComment: null
86+
hooks: null
87+
attributes: null
88+
5: AST_PROP_GROUP
89+
flags: MODIFIER_PROTECTED | MODIFIER_PRIVATE_SET (4098)
90+
type: AST_TYPE
91+
flags: TYPE_LONG (4)
92+
props: AST_PROP_DECL
93+
0: AST_PROP_ELEM
94+
name: "p6"
95+
default: 0
96+
docComment: null
97+
hooks: null
98+
attributes: null
99+
6: AST_PROP_GROUP
100+
flags: MODIFIER_PRIVATE | MODIFIER_PUBLIC_SET (1028)
101+
type: AST_TYPE
102+
flags: TYPE_LONG (4)
103+
props: AST_PROP_DECL
104+
0: AST_PROP_ELEM
105+
name: "p7"
106+
default: 0
107+
docComment: null
108+
hooks: null
109+
attributes: null
110+
7: AST_PROP_GROUP
111+
flags: MODIFIER_PRIVATE | MODIFIER_PROTECTED_SET (2052)
112+
type: AST_TYPE
113+
flags: TYPE_LONG (4)
114+
props: AST_PROP_DECL
115+
0: AST_PROP_ELEM
116+
name: "pp8"
117+
default: 0
118+
docComment: null
119+
hooks: null
120+
attributes: null
121+
8: AST_PROP_GROUP
122+
flags: MODIFIER_PRIVATE | MODIFIER_PRIVATE_SET (4100)
123+
type: AST_TYPE
124+
flags: TYPE_LONG (4)
125+
props: AST_PROP_DECL
126+
0: AST_PROP_ELEM
127+
name: "p9"
128+
default: 0
129+
docComment: null
130+
hooks: null
131+
attributes: null
132+
attributes: null
133+
type: null
134+
__declId: 0

tests/metadata.phpt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ AST_SWITCH_LIST: []
3737
AST_CATCH_LIST: []
3838
AST_PARAM_LIST: []
3939
AST_CLOSURE_USES: []
40-
AST_PROP_DECL: (combinable) [MODIFIER_PUBLIC, MODIFIER_PROTECTED, MODIFIER_PRIVATE, MODIFIER_STATIC, MODIFIER_ABSTRACT, MODIFIER_FINAL, MODIFIER_READONLY]
40+
AST_PROP_DECL: (combinable) [MODIFIER_PUBLIC, MODIFIER_PROTECTED, MODIFIER_PRIVATE, MODIFIER_STATIC, MODIFIER_ABSTRACT, MODIFIER_FINAL, MODIFIER_READONLY, MODIFIER_PUBLIC_SET, MODIFIER_PROTECTED_SET, MODIFIER_PRIVATE_SET]
4141
AST_CONST_DECL: []
4242
AST_CLASS_CONST_DECL: (combinable) [MODIFIER_PUBLIC, MODIFIER_PROTECTED, MODIFIER_PRIVATE, MODIFIER_STATIC, MODIFIER_ABSTRACT, MODIFIER_FINAL, MODIFIER_READONLY]
4343
AST_NAME_LIST: []
@@ -113,7 +113,7 @@ AST_SWITCH: []
113113
AST_SWITCH_CASE: []
114114
AST_DECLARE: []
115115
AST_PROP_ELEM: []
116-
AST_PROP_GROUP: (combinable) [MODIFIER_PUBLIC, MODIFIER_PROTECTED, MODIFIER_PRIVATE, MODIFIER_STATIC, MODIFIER_ABSTRACT, MODIFIER_FINAL, MODIFIER_READONLY]
116+
AST_PROP_GROUP: (combinable) [MODIFIER_PUBLIC, MODIFIER_PROTECTED, MODIFIER_PRIVATE, MODIFIER_STATIC, MODIFIER_ABSTRACT, MODIFIER_FINAL, MODIFIER_READONLY, MODIFIER_PUBLIC_SET, MODIFIER_PROTECTED_SET, MODIFIER_PRIVATE_SET]
117117
AST_CONST_ELEM: []
118118
AST_USE_TRAIT: []
119119
AST_TRAIT_PRECEDENCE: []

0 commit comments

Comments
 (0)