summaryrefslogtreecommitdiff
path: root/Zend/zend_ast.c
diff options
context:
space:
mode:
authorNikita Popov <nikita.ppv@gmail.com>2019-01-04 10:49:23 +0100
committerNikita Popov <nikita.ppv@gmail.com>2019-01-04 10:49:23 +0100
commit290adc41321a6fb0dfe71f1a8058a87ae4c6cab1 (patch)
tree579bd8e22a3251e007f5af47b6f8717e35e536a0 /Zend/zend_ast.c
parent03094c7af304f6fa48da641e20f91b6ec7f9876f (diff)
downloadphp-git-290adc41321a6fb0dfe71f1a8058a87ae4c6cab1.tar.gz
Introduce separate ZEND_AST_CLASS_NAME AST node
Instead of representing this as a ZEND_AST_CLASS_CONST with a "class" constant name. Class constants and ::class are unrelated features that happen to share syntax, so represent and handle them separately.
Diffstat (limited to 'Zend/zend_ast.c')
-rw-r--r--Zend/zend_ast.c14
1 files changed, 14 insertions, 0 deletions
diff --git a/Zend/zend_ast.c b/Zend/zend_ast.c
index 834696c2ca..b691dce0e0 100644
--- a/Zend/zend_ast.c
+++ b/Zend/zend_ast.c
@@ -102,6 +102,16 @@ ZEND_API zend_ast * ZEND_FASTCALL zend_ast_create_constant(zend_string *name, ze
return (zend_ast *) ast;
}
+ZEND_API zend_ast * ZEND_FASTCALL zend_ast_create_class_const_or_name(zend_ast *class, zend_ast *name) {
+ zend_string *name_str = zend_ast_get_str(name);
+ if (zend_string_equals_literal_ci(name_str, "class")) {
+ zend_string_release(name_str);
+ return zend_ast_create(ZEND_AST_CLASS_NAME, class);
+ } else {
+ return zend_ast_create(ZEND_AST_CLASS_CONST, class, name);
+ }
+}
+
ZEND_API zend_ast *zend_ast_create_decl(
zend_ast_kind kind, uint32_t flags, uint32_t start_lineno, zend_string *doc_comment,
zend_string *name, zend_ast *child0, zend_ast *child1, zend_ast *child2, zend_ast *child3
@@ -1606,6 +1616,10 @@ simple_list:
smart_str_appends(str, "::");
zend_ast_export_name(str, ast->child[1], 0, indent);
break;
+ case ZEND_AST_CLASS_NAME:
+ zend_ast_export_ns_name(str, ast->child[0], 0, indent);
+ smart_str_appends(str, "::class");
+ break;
case ZEND_AST_ASSIGN: BINARY_OP(" = ", 90, 91, 90);
case ZEND_AST_ASSIGN_REF: BINARY_OP(" =& ", 90, 91, 90);
case ZEND_AST_ASSIGN_OP: