use postgres::Client;
use crate::db;
use crate::index::api;
use crate::models::CallRelation;
pub(super) fn resolve_local_import_calls(
conn: &mut Client,
project_id: &str,
file_paths: &[String],
) -> anyhow::Result<usize> {
let pending = db::read_local_import_calls(conn, project_id, file_paths)?;
resolve_pending_local_import_calls(conn, project_id, pending)
}
pub(super) fn resolve_project_local_import_calls(
conn: &mut Client,
project_id: &str,
) -> anyhow::Result<usize> {
let pending = db::read_project_local_import_calls(conn, project_id)?;
resolve_pending_local_import_calls(conn, project_id, pending)
}
fn resolve_pending_local_import_calls(
conn: &mut Client,
project_id: &str,
pending: Vec<CallRelation>,
) -> anyhow::Result<usize> {
let mut resolved_count = 0usize;
for call in &pending {
let candidate_files = call.local_import_candidate_files();
let resolved_id = if call.local_import_uses_default_export_fallback() {
db::resolve_default_import_symbol_id(conn, project_id, &candidate_files)?
} else {
db::resolve_local_callee_symbol_id(
conn,
project_id,
&candidate_files,
&call.callee_name,
)?
};
let resolved = match resolved_id {
Some(id) => {
resolved_count += 1;
resolved_symbol_call(call, id)
}
None => unresolved_call(call),
};
api::promote_local_import_call(conn, project_id, call, &resolved)?;
}
Ok(resolved_count)
}
fn resolved_symbol_call(original: &CallRelation, callee_symbol_id: String) -> CallRelation {
CallRelation::new(
original.caller_symbol_id.clone(),
original.callee_name.clone(),
original.file_path.clone(),
original.line,
)
.with_symbol_target(callee_symbol_id)
}
fn unresolved_call(original: &CallRelation) -> CallRelation {
CallRelation::new(
original.caller_symbol_id.clone(),
original.callee_name.clone(),
original.file_path.clone(),
original.line,
)
}