@@ -1569,6 +1569,16 @@ static ZEND_COLD void zend_ast_export_ns_name(smart_str *str, zend_ast *ast, int
1569
1569
zend_ast_export_ex (str , ast , priority , indent );
1570
1570
}
1571
1571
1572
+ static ZEND_COLD void zend_ast_export_class_name (smart_str * str , zend_ast * ast , int priority , int indent )
1573
+ {
1574
+ if (ast -> kind == ZEND_AST_CLASS_REF ) {
1575
+ ZEND_ASSERT (ast -> child [1 ] == NULL && "Generic params not supported yet" );
1576
+ zend_ast_export_ns_name (str , ast -> child [0 ], priority , indent );
1577
+ return ;
1578
+ }
1579
+ zend_ast_export_ex (str , ast , priority , indent );
1580
+ }
1581
+
1572
1582
static ZEND_COLD bool zend_ast_valid_var_char (char ch )
1573
1583
{
1574
1584
unsigned char c = (unsigned char )ch ;
@@ -1689,7 +1699,7 @@ static ZEND_COLD void zend_ast_export_name_list_ex(smart_str *str, zend_ast_list
1689
1699
if (i != 0 ) {
1690
1700
smart_str_appends (str , separator );
1691
1701
}
1692
- zend_ast_export_name (str , list -> child [i ], 0 , indent );
1702
+ zend_ast_export_ns_name (str , list -> child [i ], 0 , indent );
1693
1703
i ++ ;
1694
1704
}
1695
1705
}
@@ -1956,6 +1966,21 @@ static ZEND_COLD void zend_ast_export_type(smart_str *str, zend_ast *ast, int in
1956
1966
zend_ast_export_ns_name (str , ast , 0 , indent );
1957
1967
}
1958
1968
1969
+ static ZEND_COLD void zend_ast_export_generic_arg_list (smart_str * str , const zend_ast_list * list , int indent ) {
1970
+ // TODO Why cannot I just use
1971
+ // zend_ast_export_list(str, list, true, 0, indent);
1972
+ // ?
1973
+
1974
+ uint32_t i = 0 ;
1975
+ while (i < list -> children ) {
1976
+ if (i != 0 ) {
1977
+ smart_str_appends (str , ", " );
1978
+ }
1979
+ zend_ast_export_type (str , list -> child [i ], indent );
1980
+ i ++ ;
1981
+ }
1982
+ }
1983
+
1959
1984
static ZEND_COLD void zend_ast_export_hook_list (smart_str * str , zend_ast_list * hook_list , int indent )
1960
1985
{
1961
1986
smart_str_appends (str , " {" );
@@ -2155,10 +2180,17 @@ static ZEND_COLD void zend_ast_export_ex(smart_str *str, zend_ast *ast, int prio
2155
2180
}
2156
2181
smart_str_appends (str , "class " );
2157
2182
}
2158
- smart_str_appendl (str , ZSTR_VAL (decl -> name ), ZSTR_LEN (decl -> name ));
2159
- if (decl -> flags & ZEND_ACC_ENUM && decl -> child [4 ]) {
2160
- smart_str_appends (str , ": " );
2161
- zend_ast_export_type (str , decl -> child [4 ], indent );
2183
+ smart_str_append (str , decl -> name );
2184
+ if (decl -> child [4 ]) {
2185
+ if (decl -> flags & ZEND_ACC_ENUM ) {
2186
+ smart_str_appends (str , ": " );
2187
+ zend_ast_export_type (str , decl -> child [4 ], indent );
2188
+ } else {
2189
+ ZEND_ASSERT (decl -> flags & ZEND_ACC_INTERFACE );
2190
+ smart_str_appendc (str , '<' );
2191
+ zend_ast_export_list (str , zend_ast_get_list (decl -> child [4 ]), true, 0 , indent );
2192
+ smart_str_appendc (str , '>' );
2193
+ }
2162
2194
}
2163
2195
zend_ast_export_class_no_header (str , decl , indent );
2164
2196
smart_str_appendc (str , '\n' );
@@ -2443,6 +2475,21 @@ static ZEND_COLD void zend_ast_export_ex(smart_str *str, zend_ast *ast, int prio
2443
2475
smart_str_appends (str , "::" );
2444
2476
zend_ast_export_name (str , ast -> child [1 ], 0 , indent );
2445
2477
break ;
2478
+ case ZEND_AST_GENERIC_PARAM :
2479
+ zend_ast_export_name (str , ast -> child [0 ], 0 , indent );
2480
+ if (ast -> child [1 ]) {
2481
+ smart_str_appendl (str , ZEND_STRL (" : " ));
2482
+ zend_ast_export_type (str , ast -> child [1 ], indent );
2483
+ }
2484
+ break ;
2485
+ case ZEND_AST_CLASS_REF :
2486
+ zend_ast_export_ns_name (str , ast -> child [0 ], 0 , indent );
2487
+ if (ast -> child [1 ]) {
2488
+ smart_str_appendc (str , '<' );
2489
+ zend_ast_export_generic_arg_list (str , zend_ast_get_list (ast -> child [1 ]), indent );
2490
+ smart_str_appendc (str , '>' );
2491
+ }
2492
+ break ;
2446
2493
case ZEND_AST_CLASS_NAME :
2447
2494
if (ast -> child [0 ] == NULL ) {
2448
2495
/* The const expr representation stores the fetch type instead. */
@@ -2456,7 +2503,7 @@ static ZEND_COLD void zend_ast_export_ex(smart_str *str, zend_ast *ast, int prio
2456
2503
EMPTY_SWITCH_DEFAULT_CASE ()
2457
2504
}
2458
2505
} else {
2459
- zend_ast_export_ns_name (str , ast -> child [0 ], 0 , indent );
2506
+ zend_ast_export_class_name (str , ast -> child [0 ], 0 , indent );
2460
2507
}
2461
2508
smart_str_appends (str , "::class" );
2462
2509
break ;
@@ -2724,17 +2771,6 @@ static ZEND_COLD void zend_ast_export_ex(smart_str *str, zend_ast *ast, int prio
2724
2771
smart_str_appends (str , ": " );
2725
2772
ast = ast -> child [1 ];
2726
2773
goto tail_call ;
2727
- // TODO Export generic types
2728
- //case ZEND_AST_ASSOCIATED_TYPE:
2729
- // smart_str_appends(str, "type ");
2730
- // zend_ast_export_name(str, ast->child[0], 0, indent);
2731
- // if (ast->child[1]) {
2732
- // smart_str_appends(str, " : ");
2733
- // smart_str_appends(str, " : ");
2734
- // zend_ast_export_type(str, ast->child[1], indent);
2735
- // }
2736
- // smart_str_appendc(str, ';');
2737
- //break;
2738
2774
2739
2775
/* 3 child nodes */
2740
2776
case ZEND_AST_METHOD_CALL :
0 commit comments