use std::collections::BTreeMap;
use std::sync::Arc;
use brink_analyzer::{AnalysisOptions, AnalysisResult, ImportScope, ModuleMap};
use brink_ir::{FileId, HirFile, SymbolManifest};
pub fn analyze_with_map(
files: &[(FileId, &HirFile, &SymbolManifest)],
modules: &ModuleMap,
opts: &AnalysisOptions,
is_native: bool,
) -> AnalysisResult {
let manifest_inputs: Vec<(FileId, &SymbolManifest)> =
files.iter().map(|&(id, _hir, m)| (id, m)).collect();
let (index, mut diagnostics) = brink_analyzer::symbol_index_with_modules(
&manifest_inputs,
modules,
opts.dialect,
is_native,
);
let mut resolutions = brink_ir::ResolutionMap::new();
let mut scopes: BTreeMap<FileId, ImportScope> = BTreeMap::new();
for &(file_id, hir, manifest) in files {
let declared_module = match modules.get(&file_id) {
Some(resolved) => resolved.declared.then(|| resolved.name.clone()),
None => hir.module.as_ref().map(|m| m.name.clone()),
};
let scope = ImportScope::new(declared_module, &hir.imports);
let (file_map, file_diags) = brink_analyzer::resolve(file_id, manifest, &index, &scope);
resolutions.extend(Arc::unwrap_or_clone(file_map));
diagnostics.extend(file_diags);
scopes.insert(file_id, scope);
}
let hir_files: Vec<(FileId, &HirFile)> = files.iter().map(|&(id, hir, _)| (id, hir)).collect();
diagnostics.extend(brink_analyzer::conventions_confinement_diagnostics(
&hir_files,
modules,
opts.conventions.as_deref(),
));
brink_analyzer::finish_analysis(
files,
index,
resolutions,
diagnostics,
opts,
is_native,
None,
&scopes,
)
}