Find first base class (extends X) in a class_declaration, resolved. */
| 2428 | |
| 2429 | /* Find first base class (extends X) in a class_declaration, resolved. */ |
| 2430 | static const char *find_extends_qn(PHPLSPContext *ctx, TSNode class_node) { |
| 2431 | uint32_t nc = ts_node_child_count(class_node); |
| 2432 | for (uint32_t i = 0; i < nc; i++) { |
| 2433 | TSNode c = ts_node_child(class_node, i); |
| 2434 | if (ts_node_is_null(c) || !ts_node_is_named(c)) |
| 2435 | continue; |
| 2436 | if (strcmp(ts_node_type(c), "base_clause") != 0) |
| 2437 | continue; |
| 2438 | uint32_t bnc = ts_node_child_count(c); |
| 2439 | for (uint32_t j = 0; j < bnc; j++) { |
| 2440 | TSNode bc = ts_node_child(c, j); |
| 2441 | if (ts_node_is_null(bc) || !ts_node_is_named(bc)) |
| 2442 | continue; |
| 2443 | const char *bk = ts_node_type(bc); |
| 2444 | if (strcmp(bk, "name") == 0 || strcmp(bk, "qualified_name") == 0) { |
| 2445 | char *t = php_node_text(ctx, bc); |
| 2446 | if (t) |
| 2447 | return php_resolve_class_name(ctx, t); |
| 2448 | } |
| 2449 | } |
| 2450 | } |
| 2451 | return NULL; |
| 2452 | } |
| 2453 | |
| 2454 | static void process_class_decl(PHPLSPContext *ctx, TSNode node) { |
| 2455 | TSNode name_node = ts_node_child_by_field_name(node, "name", 4); |
no test coverage detected