Skip to content

Add Asymmetric Visibility flags #250

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 7 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -237,6 +237,9 @@ ast\flags\MODIFIER_STATIC
ast\flags\MODIFIER_ABSTRACT
ast\flags\MODIFIER_FINAL
ast\flags\MODIFIER_READONLY
ast\flags\MODIFIER_PUBLIC_SET
ast\flags\MODIFIER_PROTECTED_SET
ast\flags\MODIFIER_PRIVATE_SET

// Used by ast\AST_CLOSURE, ast\AST_ARROW_FUNC (combinable)
ast\flags\MODIFIER_STATIC
Expand Down
28 changes: 26 additions & 2 deletions ast.c
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,16 @@
# define ZEND_ENCAPS_VAR_DOLLAR_CURLY_VAR_VAR (1<<1)
#endif

#if PHP_VERSION_ID < 80400
# define MODIFIER_PUBLIC_SET 0
# define MODIFIER_PROTECTED_SET 0
# define MODIFIER_PRIVATE_SET 0
#else
# define MODIFIER_PUBLIC_SET ZEND_ACC_PUBLIC_SET
# define MODIFIER_PROTECTED_SET ZEND_ACC_PROTECTED_SET
# define MODIFIER_PRIVATE_SET ZEND_ACC_PRIVATE_SET
#endif

#if PHP_VERSION_ID >= 80400
# define ZEND_DIM_ALTERNATIVE_SYNTAX (1<<1)
#endif
Expand Down Expand Up @@ -289,11 +299,22 @@ static const char *closure_use_flags[] = {
AST_FLAG(MODIFIER_FINAL), \
AST_FLAG(MODIFIER_READONLY)

#define AST_ASYMMETRIC_VISIBILITY_FLAGS \
AST_FLAG(MODIFIER_PUBLIC_SET), \
AST_FLAG(MODIFIER_PROTECTED_SET), \
AST_FLAG(MODIFIER_PRIVATE_SET)

static const char *modifier_flags[] = {
AST_MODIFIER_FLAGS,
NULL
};

static const char *property_modifier_flags[] = {
AST_MODIFIER_FLAGS,
AST_ASYMMETRIC_VISIBILITY_FLAGS,
NULL
};

static const char *func_flags[] = {
AST_MODIFIER_FLAGS,
AST_FLAG(FUNC_RETURNS_REF),
Expand Down Expand Up @@ -341,8 +362,8 @@ static const ast_flag_info flag_info[] = {
{ ZEND_AST_CLOSURE, 1, func_flags },
{ ZEND_AST_ARROW_FUNC, 1, func_flags },
{ ZEND_AST_PROPERTY_HOOK, 1, func_flags },
{ ZEND_AST_PROP_DECL, 1, modifier_flags },
{ ZEND_AST_PROP_GROUP, 1, modifier_flags },
{ ZEND_AST_PROP_DECL, 1, property_modifier_flags },
{ ZEND_AST_PROP_GROUP, 1, property_modifier_flags },
{ ZEND_AST_CLASS_CONST_DECL, 1, modifier_flags },
{ ZEND_AST_CLASS_CONST_GROUP, 1, modifier_flags },
{ ZEND_AST_TRAIT_ALIAS, 1, modifier_flags },
Expand Down Expand Up @@ -1466,6 +1487,9 @@ PHP_MINIT_FUNCTION(ast) {
ast_register_flag_constant("MODIFIER_ABSTRACT", ZEND_ACC_ABSTRACT);
ast_register_flag_constant("MODIFIER_FINAL", ZEND_ACC_FINAL);
ast_register_flag_constant("MODIFIER_READONLY", ZEND_ACC_READONLY);
ast_register_flag_constant("MODIFIER_PUBLIC_SET", MODIFIER_PUBLIC_SET);
ast_register_flag_constant("MODIFIER_PROTECTED_SET", MODIFIER_PROTECTED_SET);
ast_register_flag_constant("MODIFIER_PRIVATE_SET", MODIFIER_PRIVATE_SET);

ast_register_flag_constant("PARAM_MODIFIER_PUBLIC", PARAM_MODIFIER_PUBLIC);
ast_register_flag_constant("PARAM_MODIFIER_PROTECTED", PARAM_MODIFIER_PROTECTED);
Expand Down
3 changes: 3 additions & 0 deletions ast_stub.php
Original file line number Diff line number Diff line change
Expand Up @@ -129,6 +129,9 @@
const MODIFIER_ABSTRACT = 64;
const MODIFIER_FINAL = 32;
const MODIFIER_READONLY = 128;
const MODIFIER_PUBLIC_SET = 1024;
const MODIFIER_PROTECTED_SET = 2048;
const MODIFIER_PRIVATE_SET = 4096;
const PARAM_MODIFIER_PUBLIC = 1;
const PARAM_MODIFIER_PROTECTED = 2;
const PARAM_MODIFIER_PRIVATE = 4;
Expand Down
1 change: 1 addition & 0 deletions package.xml
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@
<file name="assign_ops.phpt" role="test" />
<file name="ast_dump_with_exclude_doc.phpt" role="test" />
<file name="ast_dump_with_linenos.phpt" role="test" />
<file name="asymmetric_visibility.phpt" role="test" />
<file name="attributes_01.phpt" role="test" />
<file name="attributes_02.phpt" role="test" />
<file name="binary_ops.phpt" role="test" />
Expand Down
134 changes: 134 additions & 0 deletions tests/asymmetric_visibility.phpt
Original file line number Diff line number Diff line change
@@ -0,0 +1,134 @@
--TEST--
Asymmetric Visibility in php 8.4
--SKIPIF--
<?php if (PHP_VERSION_ID < 80400) die('skip PHP >=8.4 only'); ?>
--FILE--
<?php
require __DIR__ . '/../util.php';
$code = <<<'PHP'
<?php
class PublicPropsWithAV
{
public public(set) int $p1 = 0;
public protected(set) int $p2 = 0;
public private(set) int $p3 = 0;
protected public(set) int $p4 = 0;
protected protected(set) int $p5 = 0;
protected private(set) int $p6 = 0;
private public(set) int $p7 = 0;
private protected(set) int $pp8 = 0;
private private(set) int $p9 = 0;
}
PHP;
$node = ast\parse_code($code, $version=110);
echo ast_dump($node), "\n";
--EXPECTF--
AST_STMT_LIST
0: AST_CLASS
name: "PublicPropsWithAV"
docComment: null
extends: null
implements: null
stmts: AST_STMT_LIST
0: AST_PROP_GROUP
flags: MODIFIER_PUBLIC | MODIFIER_PUBLIC_SET (1025)
type: AST_TYPE
flags: TYPE_LONG (4)
props: AST_PROP_DECL
0: AST_PROP_ELEM
name: "p1"
default: 0
docComment: null
hooks: null
attributes: null
1: AST_PROP_GROUP
flags: MODIFIER_PUBLIC | MODIFIER_PROTECTED_SET (2049)
type: AST_TYPE
flags: TYPE_LONG (4)
props: AST_PROP_DECL
0: AST_PROP_ELEM
name: "p2"
default: 0
docComment: null
hooks: null
attributes: null
2: AST_PROP_GROUP
flags: MODIFIER_PUBLIC | MODIFIER_PRIVATE_SET (4097)
type: AST_TYPE
flags: TYPE_LONG (4)
props: AST_PROP_DECL
0: AST_PROP_ELEM
name: "p3"
default: 0
docComment: null
hooks: null
attributes: null
3: AST_PROP_GROUP
flags: MODIFIER_PROTECTED | MODIFIER_PUBLIC_SET (1026)
type: AST_TYPE
flags: TYPE_LONG (4)
props: AST_PROP_DECL
0: AST_PROP_ELEM
name: "p4"
default: 0
docComment: null
hooks: null
attributes: null
4: AST_PROP_GROUP
flags: MODIFIER_PROTECTED | MODIFIER_PROTECTED_SET (2050)
type: AST_TYPE
flags: TYPE_LONG (4)
props: AST_PROP_DECL
0: AST_PROP_ELEM
name: "p5"
default: 0
docComment: null
hooks: null
attributes: null
5: AST_PROP_GROUP
flags: MODIFIER_PROTECTED | MODIFIER_PRIVATE_SET (4098)
type: AST_TYPE
flags: TYPE_LONG (4)
props: AST_PROP_DECL
0: AST_PROP_ELEM
name: "p6"
default: 0
docComment: null
hooks: null
attributes: null
6: AST_PROP_GROUP
flags: MODIFIER_PRIVATE | MODIFIER_PUBLIC_SET (1028)
type: AST_TYPE
flags: TYPE_LONG (4)
props: AST_PROP_DECL
0: AST_PROP_ELEM
name: "p7"
default: 0
docComment: null
hooks: null
attributes: null
7: AST_PROP_GROUP
flags: MODIFIER_PRIVATE | MODIFIER_PROTECTED_SET (2052)
type: AST_TYPE
flags: TYPE_LONG (4)
props: AST_PROP_DECL
0: AST_PROP_ELEM
name: "pp8"
default: 0
docComment: null
hooks: null
attributes: null
8: AST_PROP_GROUP
flags: MODIFIER_PRIVATE | MODIFIER_PRIVATE_SET (4100)
type: AST_TYPE
flags: TYPE_LONG (4)
props: AST_PROP_DECL
0: AST_PROP_ELEM
name: "p9"
default: 0
docComment: null
hooks: null
attributes: null
attributes: null
type: null
__declId: 0
4 changes: 2 additions & 2 deletions tests/metadata.phpt
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ AST_SWITCH_LIST: []
AST_CATCH_LIST: []
AST_PARAM_LIST: []
AST_CLOSURE_USES: []
AST_PROP_DECL: (combinable) [MODIFIER_PUBLIC, MODIFIER_PROTECTED, MODIFIER_PRIVATE, MODIFIER_STATIC, MODIFIER_ABSTRACT, MODIFIER_FINAL, MODIFIER_READONLY]
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]
AST_CONST_DECL: []
AST_CLASS_CONST_DECL: (combinable) [MODIFIER_PUBLIC, MODIFIER_PROTECTED, MODIFIER_PRIVATE, MODIFIER_STATIC, MODIFIER_ABSTRACT, MODIFIER_FINAL, MODIFIER_READONLY]
AST_NAME_LIST: []
Expand Down Expand Up @@ -113,7 +113,7 @@ AST_SWITCH: []
AST_SWITCH_CASE: []
AST_DECLARE: []
AST_PROP_ELEM: []
AST_PROP_GROUP: (combinable) [MODIFIER_PUBLIC, MODIFIER_PROTECTED, MODIFIER_PRIVATE, MODIFIER_STATIC, MODIFIER_ABSTRACT, MODIFIER_FINAL, MODIFIER_READONLY]
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]
AST_CONST_ELEM: []
AST_USE_TRAIT: []
AST_TRAIT_PRECEDENCE: []
Expand Down