PHP: bases live in `base_clause` (extends) and `class_interface_clause` * (implements) child nodes; named children are `name`/`qualified_name`. */
| 2295 | /* PHP: bases live in `base_clause` (extends) and `class_interface_clause` |
| 2296 | * (implements) child nodes; named children are `name`/`qualified_name`. */ |
| 2297 | static const char **extract_php_bases(CBMArena *a, TSNode node, const char *source) { |
| 2298 | const char *bases[MAX_BASES]; |
| 2299 | int count = 0; |
| 2300 | uint32_t nc = ts_node_child_count(node); |
| 2301 | for (uint32_t i = 0; i < nc; i++) { |
| 2302 | TSNode child = ts_node_child(node, i); |
| 2303 | const char *ck = ts_node_type(child); |
| 2304 | if (strcmp(ck, "base_clause") != 0 && strcmp(ck, "class_interface_clause") != 0) { |
| 2305 | continue; |
| 2306 | } |
| 2307 | uint32_t cc = ts_node_named_child_count(child); |
| 2308 | for (uint32_t j = 0; j < cc && count < MAX_BASES_MINUS_1; j++) { |
| 2309 | push_base_text(a, ts_node_named_child(child, j), source, bases, MAX_BASES_MINUS_1, |
| 2310 | &count); |
| 2311 | } |
| 2312 | } |
| 2313 | if (count == 0) { |
| 2314 | return NULL; |
| 2315 | } |
| 2316 | const char **result = |
| 2317 | (const char **)cbm_arena_alloc(a, (size_t)(count + NULL_TERM) * sizeof(const char *)); |
| 2318 | if (!result) { |
| 2319 | return NULL; |
| 2320 | } |
| 2321 | for (int i = 0; i < count; i++) { |
| 2322 | result[i] = bases[i]; |
| 2323 | } |
| 2324 | result[count] = NULL; |
| 2325 | return result; |
| 2326 | } |
| 2327 | |
| 2328 | /* Kotlin: supertypes live in `delegation_specifier` children. Each holds |
| 2329 | * either a bare `user_type` (interface) or a `constructor_invocation` whose |
no test coverage detected