From 290adc41321a6fb0dfe71f1a8058a87ae4c6cab1 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Fri, 4 Jan 2019 10:49:23 +0100 Subject: 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. --- Zend/zend_ast.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) (limited to 'Zend/zend_ast.c') 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: -- cgit v1.2.1