Resolve reads/writes for one file. */
| 2411 | |
| 2412 | /* Resolve reads/writes for one file. */ |
| 2413 | static void resolve_file_rw(resolve_ctx_t *rc, resolve_worker_state_t *ws, CBMFileResult *result, |
| 2414 | const char *rel, const char *module_qn, const char **imp_keys, |
| 2415 | const char **imp_vals, int imp_count) { |
| 2416 | for (int r = 0; r < result->rw.count; r++) { |
| 2417 | CBMReadWrite *rw = &result->rw.items[r]; |
| 2418 | if (!rw->var_name) { |
| 2419 | continue; |
| 2420 | } |
| 2421 | const cbm_gbuf_node_t *src = |
| 2422 | find_source_node(rc->main_gbuf, rc->project_name, rel, rw->enclosing_func_qn); |
| 2423 | if (!src) { |
| 2424 | continue; |
| 2425 | } |
| 2426 | cbm_resolution_t res = cbm_registry_resolve(rc->registry, rw->var_name, module_qn, imp_keys, |
| 2427 | imp_vals, imp_count); |
| 2428 | if (!res.qualified_name || res.qualified_name[0] == '\0') { |
| 2429 | continue; |
| 2430 | } |
| 2431 | const cbm_gbuf_node_t *tgt = cbm_gbuf_find_by_qn(rc->main_gbuf, res.qualified_name); |
| 2432 | if (!tgt || src->id == tgt->id) { |
| 2433 | continue; |
| 2434 | } |
| 2435 | const char *etype = rw->is_write ? "WRITES" : "READS"; |
| 2436 | cbm_gbuf_insert_edge(ws->local_edge_buf, src->id, tgt->id, etype, "{}"); |
| 2437 | } |
| 2438 | } |
| 2439 | |
| 2440 | /* Resolve base_classes → INHERITS edges for one definition. */ |
| 2441 | static void resolve_def_inherits(resolve_ctx_t *rc, resolve_worker_state_t *ws, |
no test coverage detected