Resolve reads/writes for one file. */
| 2688 | |
| 2689 | /* Resolve reads/writes for one file. */ |
| 2690 | static void resolve_file_rw(resolve_ctx_t *rc, resolve_worker_state_t *ws, CBMFileResult *result, |
| 2691 | const char *rel, const char *module_qn, const char **imp_keys, |
| 2692 | const char **imp_vals, int imp_count) { |
| 2693 | for (int r = 0; r < result->rw.count; r++) { |
| 2694 | CBMReadWrite *rw = &result->rw.items[r]; |
| 2695 | if (!rw->var_name) { |
| 2696 | continue; |
| 2697 | } |
| 2698 | const cbm_gbuf_node_t *src = |
| 2699 | find_source_node(rc->main_gbuf, rc->project_name, rel, rw->enclosing_func_qn); |
| 2700 | if (!src) { |
| 2701 | continue; |
| 2702 | } |
| 2703 | cbm_resolution_t res = cbm_registry_resolve(rc->registry, rw->var_name, module_qn, imp_keys, |
| 2704 | imp_vals, imp_count); |
| 2705 | if (!res.qualified_name || res.qualified_name[0] == '\0') { |
| 2706 | continue; |
| 2707 | } |
| 2708 | const cbm_gbuf_node_t *tgt = cbm_gbuf_find_by_qn(rc->main_gbuf, res.qualified_name); |
| 2709 | if (!tgt || src->id == tgt->id) { |
| 2710 | continue; |
| 2711 | } |
| 2712 | const char *etype = rw->is_write ? "WRITES" : "READS"; |
| 2713 | cbm_gbuf_insert_edge(ws->local_edge_buf, src->id, tgt->id, etype, "{}"); |
| 2714 | } |
| 2715 | } |
| 2716 | |
| 2717 | /* Resolve base_classes → INHERITS edges for one definition. */ |
| 2718 | static void resolve_def_inherits(resolve_ctx_t *rc, resolve_worker_state_t *ws, |
no test coverage detected