1mod manifest;
9mod resolve;
10mod validate;
11
12pub use brink_ir::FileId;
13pub use brink_ir::ResolutionMap;
14
15use brink_ir::{Diagnostic, HirFile, SymbolIndex, SymbolManifest};
16
17#[derive(Debug, Clone)]
19pub struct AnalysisResult {
20 pub index: SymbolIndex,
22 pub resolutions: ResolutionMap,
24 pub diagnostics: Vec<Diagnostic>,
26}
27
28pub fn analyze(files: &[(FileId, &HirFile, &SymbolManifest)]) -> AnalysisResult {
34 let manifest_inputs: Vec<(FileId, &SymbolManifest)> = files
35 .iter()
36 .map(|&(id, _hir, manifest)| (id, manifest))
37 .collect();
38
39 let hir_inputs: Vec<(FileId, &HirFile)> = files.iter().map(|&(id, hir, _)| (id, hir)).collect();
40
41 let (index, mut diagnostics) = manifest::merge_manifests(&manifest_inputs);
42 let (resolutions, resolve_diags) = resolve::resolve_refs(&index, &manifest_inputs);
43 diagnostics.extend(resolve_diags);
44 diagnostics.extend(validate::validate(&hir_inputs));
45
46 AnalysisResult {
47 index,
48 resolutions,
49 diagnostics,
50 }
51}