Skip to content

Commit 91123fb

Browse files
committed
Parse private(namespace) visibility modifier
Extend the parser to recognize private(namespace) as a visibility modifier for methods and properties. Sets ZEND_ACC_NAMESPACE_PRIVATE flag on the member when this syntax is encountered. Also supports asymmetric visibility: public private(namespace)(set) Sets ZEND_ACC_NAMESPACE_PRIVATE_SET for property write visibility. Syntax examples: private(namespace) function foo() {} private(namespace) string $prop; public private(namespace)(set) int $count = 0;
1 parent 0fcc03b commit 91123fb

File tree

3 files changed

+26
-0
lines changed

3 files changed

+26
-0
lines changed

Zend/zend_compile.c

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -873,6 +873,10 @@ static const char *zend_modifier_token_to_string(uint32_t token)
873873
return "protected(set)";
874874
case T_PRIVATE_SET:
875875
return "private(set)";
876+
case T_PRIVATE_NAMESPACE:
877+
return "private(namespace)";
878+
case T_PRIVATE_NAMESPACE_SET:
879+
return "private(namespace)(set)";
876880
EMPTY_SWITCH_DEFAULT_CASE()
877881
}
878882
}
@@ -927,6 +931,16 @@ uint32_t zend_modifier_token_to_flag(zend_modifier_target target, uint32_t token
927931
return ZEND_ACC_PRIVATE_SET;
928932
}
929933
break;
934+
case T_PRIVATE_NAMESPACE:
935+
if (target == ZEND_MODIFIER_TARGET_PROPERTY || target == ZEND_MODIFIER_TARGET_METHOD) {
936+
return ZEND_ACC_NAMESPACE_PRIVATE;
937+
}
938+
break;
939+
case T_PRIVATE_NAMESPACE_SET:
940+
if (target == ZEND_MODIFIER_TARGET_PROPERTY || target == ZEND_MODIFIER_TARGET_CPP) {
941+
return ZEND_ACC_NAMESPACE_PRIVATE_SET;
942+
}
943+
break;
930944
}
931945

932946
char *member;

Zend/zend_language_parser.y

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,8 @@ static YYSIZE_T zend_yytnamerr(char*, const char*);
158158
%token <ident> T_PRIVATE_SET "'private(set)'"
159159
%token <ident> T_PROTECTED_SET "'protected(set)'"
160160
%token <ident> T_PUBLIC_SET "'public(set)'"
161+
%token <ident> T_PRIVATE_NAMESPACE "'private(namespace)'"
162+
%token <ident> T_PRIVATE_NAMESPACE_SET "'private(namespace)(set)'"
161163
%token <ident> T_READONLY "'readonly'"
162164
%token <ident> T_VAR "'var'"
163165
%token <ident> T_UNSET "'unset'"
@@ -1108,6 +1110,8 @@ member_modifier:
11081110
| T_PUBLIC_SET { $$ = T_PUBLIC_SET; }
11091111
| T_PROTECTED_SET { $$ = T_PROTECTED_SET; }
11101112
| T_PRIVATE_SET { $$ = T_PRIVATE_SET; }
1113+
| T_PRIVATE_NAMESPACE { $$ = T_PRIVATE_NAMESPACE; }
1114+
| T_PRIVATE_NAMESPACE_SET { $$ = T_PRIVATE_NAMESPACE_SET; }
11111115
| T_STATIC { $$ = T_STATIC; }
11121116
| T_ABSTRACT { $$ = T_ABSTRACT; }
11131117
| T_FINAL { $$ = T_FINAL; }

Zend/zend_language_scanner.l

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1798,6 +1798,14 @@ OPTIONAL_WHITESPACE_OR_COMMENTS ({WHITESPACE}|{MULTI_LINE_COMMENT}|{SINGLE_LINE_
17981798
RETURN_TOKEN_WITH_IDENT(T_PRIVATE_SET);
17991799
}
18001800

1801+
<ST_IN_SCRIPTING>"private(namespace)" {
1802+
RETURN_TOKEN_WITH_IDENT(T_PRIVATE_NAMESPACE);
1803+
}
1804+
1805+
<ST_IN_SCRIPTING>"private(namespace)(set)" {
1806+
RETURN_TOKEN_WITH_IDENT(T_PRIVATE_NAMESPACE_SET);
1807+
}
1808+
18011809
<ST_IN_SCRIPTING>"public" {
18021810
RETURN_TOKEN_WITH_IDENT(T_PUBLIC);
18031811
}

0 commit comments

Comments
 (0)