| 654 | /* ── helpers: text + emit ─────────────────────────────────────── */ |
| 655 | |
| 656 | static char *py_node_text(PyLSPContext *ctx, TSNode node) { |
| 657 | if (!ctx || ts_node_is_null(node)) |
| 658 | return NULL; |
| 659 | uint32_t start = ts_node_start_byte(node); |
| 660 | uint32_t end = ts_node_end_byte(node); |
| 661 | if (end <= start || (int)end > ctx->source_len) |
| 662 | return NULL; |
| 663 | size_t len = (size_t)(end - start); |
| 664 | char *out = (char *)cbm_arena_alloc(ctx->arena, len + 1); |
| 665 | if (!out) |
| 666 | return NULL; |
| 667 | memcpy(out, ctx->source + start, len); |
| 668 | out[len] = '\0'; |
| 669 | return out; |
| 670 | } |
| 671 | |
| 672 | /* ── lambda + dict-literal-dispatch registries ────────────────── */ |
| 673 |
no test coverage detected