| 5098 | } |
| 5099 | |
| 5100 | static void c_process_namespace(CLSPContext *ctx, TSNode ns_node) { |
| 5101 | const char *saved_ns = ctx->current_namespace; |
| 5102 | |
| 5103 | TSNode name_node = ts_node_child_by_field_name(ns_node, "name", 4); |
| 5104 | if (!ts_node_is_null(name_node)) { |
| 5105 | char *ns_name = c_node_text(ctx, name_node); |
| 5106 | if (ns_name) { |
| 5107 | if (saved_ns) { |
| 5108 | ctx->current_namespace = cbm_arena_sprintf(ctx->arena, "%s.%s", saved_ns, ns_name); |
| 5109 | } else if (ctx->module_qn) { |
| 5110 | ctx->current_namespace = |
| 5111 | cbm_arena_sprintf(ctx->arena, "%s.%s", ctx->module_qn, ns_name); |
| 5112 | } else { |
| 5113 | ctx->current_namespace = ns_name; |
| 5114 | } |
| 5115 | } |
| 5116 | } |
| 5117 | |
| 5118 | TSNode body = ts_node_child_by_field_name(ns_node, "body", 4); |
| 5119 | if (!ts_node_is_null(body)) { |
| 5120 | // Cursor walk (O(n)); namespace bodies can be very wide. |
| 5121 | TSTreeCursor cursor = ts_tree_cursor_new(body); |
| 5122 | if (ts_tree_cursor_goto_first_child(&cursor)) { |
| 5123 | do { |
| 5124 | c_process_body_child(ctx, ts_tree_cursor_current_node(&cursor)); |
| 5125 | } while (ts_tree_cursor_goto_next_sibling(&cursor)); |
| 5126 | } |
| 5127 | ts_tree_cursor_delete(&cursor); |
| 5128 | } |
| 5129 | |
| 5130 | ctx->current_namespace = saved_ns; |
| 5131 | } |
| 5132 | |
| 5133 | // ============================================================================ |
| 5134 | // Process class/struct: process method bodies |
no test coverage detected