TypeScript: walk the class_heritage container (which holds extends_clause + * implements_clause), or handle a bare interface extends_type_clause. */
| 2140 | /* TypeScript: walk the class_heritage container (which holds extends_clause + |
| 2141 | * implements_clause), or handle a bare interface extends_type_clause. */ |
| 2142 | static const char **extract_ts_bases(CBMArena *a, TSNode node, const char *source) { |
| 2143 | const char *bases[MAX_BASES]; |
| 2144 | int count = 0; |
| 2145 | uint32_t nc = ts_node_child_count(node); |
| 2146 | for (uint32_t i = 0; i < nc; i++) { |
| 2147 | TSNode child = ts_node_child(node, i); |
| 2148 | const char *ck = ts_node_type(child); |
| 2149 | if (strcmp(ck, "class_heritage") == 0) { |
| 2150 | uint32_t hc = ts_node_child_count(child); |
| 2151 | for (uint32_t j = 0; j < hc; j++) { |
| 2152 | collect_ts_bases(a, ts_node_child(child, j), source, bases, MAX_BASES_MINUS_1, |
| 2153 | &count); |
| 2154 | } |
| 2155 | } else if (strcmp(ck, "extends_type_clause") == 0) { |
| 2156 | collect_ts_bases(a, child, source, bases, MAX_BASES_MINUS_1, &count); |
| 2157 | } |
| 2158 | } |
| 2159 | if (count == 0) { |
| 2160 | return NULL; |
| 2161 | } |
| 2162 | const char **result = |
| 2163 | (const char **)cbm_arena_alloc(a, (size_t)(count + NULL_TERM) * sizeof(const char *)); |
| 2164 | if (!result) { |
| 2165 | return NULL; |
| 2166 | } |
| 2167 | for (int i = 0; i < count; i++) { |
| 2168 | result[i] = bases[i]; |
| 2169 | } |
| 2170 | result[count] = NULL; |
| 2171 | return result; |
| 2172 | } |
| 2173 | |
| 2174 | /* PHP: bases live in `base_clause` (extends) and `class_interface_clause` |
| 2175 | * (implements) child nodes; named children are `name`/`qualified_name`. */ |
no test coverage detected