use std::{fmt, sync::Arc}; use relative_path::RelativePath; use rustc_hash::FxHashMap; use rustc_hash::FxHashSet; use salsa; use crate::{symbol_index::SymbolIndex, FileResolverImp}; #[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)] pub struct FileId(pub u32); #[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)] pub struct CrateId(pub u32); #[derive(Debug, Clone, Default, PartialEq, Eq)] pub struct CrateGraph { pub(crate) crate_roots: FxHashMap, } impl CrateGraph { pub fn new() -> CrateGraph { CrateGraph::default() } pub fn add_crate_root(&mut self, file_id: FileId) -> CrateId { let crate_id = CrateId(self.crate_roots.len() as u32); let prev = self.crate_roots.insert(crate_id, file_id); assert!(prev.is_none()); crate_id } } pub trait FileResolver: fmt::Debug + Send + Sync + 'static { fn file_stem(&self, file_id: FileId) -> String; fn resolve(&self, file_id: FileId, path: &RelativePath) -> Option; } salsa::query_group! { pub(crate) trait FilesDatabase: salsa::Database { fn file_text(file_id: FileId) -> Arc { type FileTextQuery; storage input; } fn file_source_root(file_id: FileId) -> SourceRootId { type FileSourceRootQuery; storage input; } fn source_root(id: SourceRootId) -> Arc { type SourceRootQuery; storage input; } fn libraries() -> Arc> { type LibrariesQuery; storage input; } fn library_symbols(id: SourceRootId) -> Arc { type LibrarySymbolsQuery; storage input; } fn crate_graph() -> Arc { type CrateGraphQuery; storage input; } } } #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)] pub(crate) struct SourceRootId(pub(crate) u32); #[derive(Default, Clone, Debug, PartialEq, Eq)] pub(crate) struct SourceRoot { pub(crate) file_resolver: FileResolverImp, pub(crate) files: FxHashSet, } pub(crate) const WORKSPACE: SourceRootId = SourceRootId(0);