Extract base class names from a class node. Julia: a subtype declaration `Foo <: Bar` is a `binary_expression` (operator `<:`) inside the def's `type_head`. The base is the RHS identifier.
| 2347 | // Julia: a subtype declaration `Foo <: Bar` is a `binary_expression` (operator |
| 2348 | // `<:`) inside the def's `type_head`. The base is the RHS identifier. |
| 2349 | static const char **extract_julia_base_classes(CBMArena *a, TSNode node, const char *source) { |
| 2350 | TSNode th = cbm_find_child_by_kind(node, "type_head"); |
| 2351 | if (ts_node_is_null(th)) { |
| 2352 | return NULL; |
| 2353 | } |
| 2354 | TSNode inner = ts_node_named_child_count(th) > 0 ? ts_node_named_child(th, 0) : th; |
| 2355 | if (ts_node_is_null(inner) || strcmp(ts_node_type(inner), "binary_expression") != 0 || |
| 2356 | ts_node_named_child_count(inner) < 2) { |
| 2357 | return NULL; |
| 2358 | } |
| 2359 | TSNode base = ts_node_named_child(inner, ts_node_named_child_count(inner) - 1); |
| 2360 | char *bname = cbm_node_text(a, base, source); |
| 2361 | if (!bname || !bname[0]) { |
| 2362 | return NULL; |
| 2363 | } |
| 2364 | const char **result = (const char **)cbm_arena_alloc(a, 2 * sizeof(const char *)); |
| 2365 | if (!result) { |
| 2366 | return NULL; |
| 2367 | } |
| 2368 | result[0] = bname; |
| 2369 | result[1] = NULL; |
| 2370 | return result; |
| 2371 | } |
| 2372 | |
| 2373 | static const char **extract_base_classes(CBMArena *a, TSNode node, const char *source, |
| 2374 | CBMLanguage lang) { |
no test coverage detected