PHP: bases live in `base_clause` (extends) and `class_interface_clause` * (implements) child nodes; named children are `name`/`qualified_name`. */
| 2174 | /* PHP: bases live in `base_clause` (extends) and `class_interface_clause` |
| 2175 | * (implements) child nodes; named children are `name`/`qualified_name`. */ |
| 2176 | static const char **extract_php_bases(CBMArena *a, TSNode node, const char *source) { |
| 2177 | const char *bases[MAX_BASES]; |
| 2178 | int count = 0; |
| 2179 | uint32_t nc = ts_node_child_count(node); |
| 2180 | for (uint32_t i = 0; i < nc; i++) { |
| 2181 | TSNode child = ts_node_child(node, i); |
| 2182 | const char *ck = ts_node_type(child); |
| 2183 | if (strcmp(ck, "base_clause") != 0 && strcmp(ck, "class_interface_clause") != 0) { |
| 2184 | continue; |
| 2185 | } |
| 2186 | uint32_t cc = ts_node_named_child_count(child); |
| 2187 | for (uint32_t j = 0; j < cc && count < MAX_BASES_MINUS_1; j++) { |
| 2188 | push_base_text(a, ts_node_named_child(child, j), source, bases, MAX_BASES_MINUS_1, |
| 2189 | &count); |
| 2190 | } |
| 2191 | } |
| 2192 | if (count == 0) { |
| 2193 | return NULL; |
| 2194 | } |
| 2195 | const char **result = |
| 2196 | (const char **)cbm_arena_alloc(a, (size_t)(count + NULL_TERM) * sizeof(const char *)); |
| 2197 | if (!result) { |
| 2198 | return NULL; |
| 2199 | } |
| 2200 | for (int i = 0; i < count; i++) { |
| 2201 | result[i] = bases[i]; |
| 2202 | } |
| 2203 | result[count] = NULL; |
| 2204 | return result; |
| 2205 | } |
| 2206 | |
| 2207 | /* Kotlin: supertypes live in `delegation_specifier` children. Each holds |
| 2208 | * either a bare `user_type` (interface) or a `constructor_invocation` whose |
no test coverage detected