use crate::semantic::resolver::Resolver;
use crate::semantic::workspace::{Workspace, populator::WorkspacePopulator};
use crate::syntax::SyntaxFile;
use std::path::PathBuf;
impl Workspace<SyntaxFile> {
pub fn populate_all(&mut self) -> Result<(), String> {
let mut populator = WorkspacePopulator::new(
&self.files,
&mut self.symbol_table,
&mut self.reference_index,
);
let populated_paths = populator.populate_all()?;
for path in populated_paths {
self.mark_file_populated(&path);
}
self.resolve_reference_targets();
Ok(())
}
pub fn populate_affected(&mut self) -> Result<usize, String> {
let mut populator = WorkspacePopulator::new(
&self.files,
&mut self.symbol_table,
&mut self.reference_index,
);
let populated_paths = populator.populate_affected()?;
let count = populated_paths.len();
for path in populated_paths {
self.mark_file_populated(&path);
}
self.resolve_reference_targets();
Ok(count)
}
pub fn populate_file(&mut self, path: &PathBuf) -> Result<(), String> {
let mut populator = WorkspacePopulator::new(
&self.files,
&mut self.symbol_table,
&mut self.reference_index,
);
populator.populate_file(path)?;
self.mark_file_populated(path);
self.resolve_reference_targets();
Ok(())
}
fn resolve_reference_targets(&mut self) {
let file_scopes: std::collections::HashMap<PathBuf, usize> = self
.symbol_table
.iter_symbols()
.filter_map(|sym| {
sym.source_file()
.and_then(|f| self.symbol_table.get_scope_for_file(f))
.map(|scope| (PathBuf::from(sym.source_file().unwrap()), scope))
})
.collect();
self.reference_index.resolve_targets(|simple_name, file| {
let scope_id = file_scopes.get(file).copied()?;
let resolver = Resolver::new(&self.symbol_table);
let symbol = resolver.resolve_in_scope(simple_name, scope_id)?;
Some(symbol.qualified_name().to_string())
});
}
}