Resolve usages for one file. */
| 2352 | |
| 2353 | /* Resolve usages for one file. */ |
| 2354 | static void resolve_file_usages(resolve_ctx_t *rc, resolve_worker_state_t *ws, |
| 2355 | CBMFileResult *result, const char *rel, const char *module_qn, |
| 2356 | const char **imp_keys, const char **imp_vals, int imp_count) { |
| 2357 | for (int u = 0; u < result->usages.count; u++) { |
| 2358 | CBMUsage *usage = &result->usages.items[u]; |
| 2359 | if (!usage->ref_name) { |
| 2360 | continue; |
| 2361 | } |
| 2362 | const cbm_gbuf_node_t *src = |
| 2363 | find_source_node(rc->main_gbuf, rc->project_name, rel, usage->enclosing_func_qn); |
| 2364 | if (!src) { |
| 2365 | continue; |
| 2366 | } |
| 2367 | cbm_resolution_t res = cbm_registry_resolve(rc->registry, usage->ref_name, module_qn, |
| 2368 | imp_keys, imp_vals, imp_count); |
| 2369 | if (!res.qualified_name || res.qualified_name[0] == '\0') { |
| 2370 | continue; |
| 2371 | } |
| 2372 | const cbm_gbuf_node_t *tgt = cbm_gbuf_find_by_qn(rc->main_gbuf, res.qualified_name); |
| 2373 | if (!tgt || src->id == tgt->id) { |
| 2374 | continue; |
| 2375 | } |
| 2376 | char uprops[CBM_SZ_256]; |
| 2377 | char esc_ref[CBM_SZ_256]; /* sliced source text: escape quotes/newlines */ |
| 2378 | cbm_json_escape(esc_ref, sizeof(esc_ref), usage->ref_name); |
| 2379 | snprintf(uprops, sizeof(uprops), "{\"callee\":\"%s\"}", esc_ref); |
| 2380 | cbm_gbuf_insert_edge(ws->local_edge_buf, src->id, tgt->id, "USAGE", uprops); |
| 2381 | ws->usages_resolved++; |
| 2382 | } |
| 2383 | } |
| 2384 | |
| 2385 | /* Resolve throws/raises for one file. */ |
| 2386 | static void resolve_file_throws(resolve_ctx_t *rc, resolve_worker_state_t *ws, |
no test coverage detected