| 4677 | } |
| 4678 | |
| 4679 | static void extract_vars_mainstream(CBMExtractCtx *ctx, TSNode node, CBMArena *a, |
| 4680 | const char *kind) { |
| 4681 | (void)kind; |
| 4682 | switch (ctx->language) { |
| 4683 | case CBM_LANG_PYTHON: { |
| 4684 | TSNode left = ts_node_child_by_field_name(node, TS_FIELD("left")); |
| 4685 | if (ts_node_is_null(left)) { |
| 4686 | break; |
| 4687 | } |
| 4688 | const char *lt = ts_node_type(left); |
| 4689 | if (strcmp(lt, "identifier") == 0) { |
| 4690 | push_var_def(ctx, cbm_node_text(a, left, ctx->source), node); |
| 4691 | } else if (strcmp(lt, "pattern_list") == 0 || strcmp(lt, "tuple_pattern") == 0 || |
| 4692 | strcmp(lt, "list_pattern") == 0) { |
| 4693 | /* Tuple/list unpacking: `x, y = f()` — emit a Variable def for each |
| 4694 | * unpacked identifier on the LHS (#new_py_tuple_unpack). */ |
| 4695 | uint32_t ln = ts_node_named_child_count(left); |
| 4696 | for (uint32_t li = 0; li < ln; li++) { |
| 4697 | TSNode part = ts_node_named_child(left, li); |
| 4698 | if (strcmp(ts_node_type(part), "identifier") == 0) { |
| 4699 | push_var_def(ctx, cbm_node_text(a, part, ctx->source), node); |
| 4700 | } |
| 4701 | } |
| 4702 | } |
| 4703 | break; |
| 4704 | } |
| 4705 | case CBM_LANG_GO: { |
| 4706 | uint32_t n = ts_node_named_child_count(node); |
| 4707 | for (uint32_t i = 0; i < n; i++) { |
| 4708 | TSNode child = ts_node_named_child(node, i); |
| 4709 | const char *ck = ts_node_type(child); |
| 4710 | if (strcmp(ck, "var_spec") == 0 || strcmp(ck, "const_spec") == 0) { |
| 4711 | TSNode vname = ts_node_child_by_field_name(child, TS_FIELD("name")); |
| 4712 | if (!ts_node_is_null(vname)) { |
| 4713 | push_var_def(ctx, cbm_node_text(a, vname, ctx->source), child); |
| 4714 | } |
| 4715 | } |
| 4716 | } |
| 4717 | break; |
| 4718 | } |
| 4719 | case CBM_LANG_JAVASCRIPT: |
| 4720 | case CBM_LANG_TYPESCRIPT: |
| 4721 | case CBM_LANG_TSX: |
| 4722 | extract_js_vars(ctx, node, a); |
| 4723 | break; |
| 4724 | case CBM_LANG_JAVA: { |
| 4725 | const char *fname = extract_java_field_name(a, node, ctx->source); |
| 4726 | if (fname) { |
| 4727 | push_var_def(ctx, fname, node); |
| 4728 | } |
| 4729 | break; |
| 4730 | } |
| 4731 | case CBM_LANG_CSHARP: |
| 4732 | extract_csharp_vars(ctx, node, a); |
| 4733 | break; |
| 4734 | case CBM_LANG_CPP: |
| 4735 | case CBM_LANG_C: |
| 4736 | case CBM_LANG_OBJC: { |
no test coverage detected