Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/ide-db/src/lib.rs')
-rw-r--r--crates/ide-db/src/lib.rs216
1 files changed, 126 insertions, 90 deletions
diff --git a/crates/ide-db/src/lib.rs b/crates/ide-db/src/lib.rs
index 96115eee6d..d3934e14ab 100644
--- a/crates/ide-db/src/lib.rs
+++ b/crates/ide-db/src/lib.rs
@@ -45,18 +45,18 @@ pub mod syntax_helpers {
pub use parser::LexedStr;
}
-pub use hir::ChangeWithProcMacros;
+pub use hir::{ChangeWithProcMacros, EditionedFileId};
+use salsa::Durability;
use std::{fmt, mem::ManuallyDrop};
use base_db::{
- ra_salsa::{self, Durability},
- AnchoredPath, CrateId, FileLoader, FileLoaderDelegate, SourceDatabase, Upcast,
- DEFAULT_FILE_TEXT_LRU_CAP,
+ CrateGraphBuilder, CratesMap, FileSourceRootInput, FileText, Files, RootQueryDb,
+ SourceDatabase, SourceRoot, SourceRootId, SourceRootInput, query_group,
};
use hir::{
- db::{DefDatabase, ExpandDatabase, HirDatabase},
FilePositionWrapper, FileRangeWrapper,
+ db::{DefDatabase, ExpandDatabase},
};
use triomphe::Arc;
@@ -67,7 +67,7 @@ pub use ::line_index;
/// `base_db` is normally also needed in places where `ide_db` is used, so this re-export is for convenience.
pub use base_db;
-pub use span::{EditionedFileId, FileId};
+pub use span::{self, FileId};
pub type FxIndexSet<T> = indexmap::IndexSet<T, std::hash::BuildHasherDefault<rustc_hash::FxHasher>>;
pub type FxIndexMap<K, V> =
@@ -76,22 +76,22 @@ pub type FxIndexMap<K, V> =
pub type FilePosition = FilePositionWrapper<FileId>;
pub type FileRange = FileRangeWrapper<FileId>;
-#[ra_salsa::database(
- base_db::SourceRootDatabaseStorage,
- base_db::SourceDatabaseStorage,
- hir::db::ExpandDatabaseStorage,
- hir::db::DefDatabaseStorage,
- hir::db::HirDatabaseStorage,
- hir::db::InternDatabaseStorage,
- LineIndexDatabaseStorage,
- symbol_index::SymbolsDatabaseStorage
-)]
+#[salsa::db]
pub struct RootDatabase {
// We use `ManuallyDrop` here because every codegen unit that contains a
// `&RootDatabase -> &dyn OtherDatabase` cast will instantiate its drop glue in the vtable,
// which duplicates `Weak::drop` and `Arc::drop` tens of thousands of times, which makes
// compile times of all `ide_*` and downstream crates suffer greatly.
- storage: ManuallyDrop<ra_salsa::Storage<RootDatabase>>,
+ storage: ManuallyDrop<salsa::Storage<Self>>,
+ files: Arc<Files>,
+ crates_map: Arc<CratesMap>,
+}
+
+impl std::panic::RefUnwindSafe for RootDatabase {}
+
+#[salsa::db]
+impl salsa::Database for RootDatabase {
+ fn salsa_event(&self, _event: &dyn Fn() -> salsa::Event) {}
}
impl Drop for RootDatabase {
@@ -100,43 +100,76 @@ impl Drop for RootDatabase {
}
}
+impl Clone for RootDatabase {
+ fn clone(&self) -> Self {
+ Self {
+ storage: self.storage.clone(),
+ files: self.files.clone(),
+ crates_map: self.crates_map.clone(),
+ }
+ }
+}
+
impl fmt::Debug for RootDatabase {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("RootDatabase").finish()
}
}
-impl Upcast<dyn ExpandDatabase> for RootDatabase {
- #[inline]
- fn upcast(&self) -> &(dyn ExpandDatabase + 'static) {
- self
+#[salsa::db]
+impl SourceDatabase for RootDatabase {
+ fn file_text(&self, file_id: vfs::FileId) -> FileText {
+ self.files.file_text(file_id)
}
-}
-impl Upcast<dyn DefDatabase> for RootDatabase {
- #[inline]
- fn upcast(&self) -> &(dyn DefDatabase + 'static) {
- self
+ fn set_file_text(&mut self, file_id: vfs::FileId, text: &str) {
+ let files = Arc::clone(&self.files);
+ files.set_file_text(self, file_id, text);
}
-}
-impl Upcast<dyn HirDatabase> for RootDatabase {
- #[inline]
- fn upcast(&self) -> &(dyn HirDatabase + 'static) {
- self
+ fn set_file_text_with_durability(
+ &mut self,
+ file_id: vfs::FileId,
+ text: &str,
+ durability: Durability,
+ ) {
+ let files = Arc::clone(&self.files);
+ files.set_file_text_with_durability(self, file_id, text, durability);
}
-}
-impl FileLoader for RootDatabase {
- fn resolve_path(&self, path: AnchoredPath<'_>) -> Option<FileId> {
- FileLoaderDelegate(self).resolve_path(path)
+ /// Source root of the file.
+ fn source_root(&self, source_root_id: SourceRootId) -> SourceRootInput {
+ self.files.source_root(source_root_id)
}
- fn relevant_crates(&self, file_id: FileId) -> Arc<[CrateId]> {
- FileLoaderDelegate(self).relevant_crates(file_id)
+
+ fn set_source_root_with_durability(
+ &mut self,
+ source_root_id: SourceRootId,
+ source_root: Arc<SourceRoot>,
+ durability: Durability,
+ ) {
+ let files = Arc::clone(&self.files);
+ files.set_source_root_with_durability(self, source_root_id, source_root, durability);
+ }
+
+ fn file_source_root(&self, id: vfs::FileId) -> FileSourceRootInput {
+ self.files.file_source_root(id)
+ }
+
+ fn set_file_source_root_with_durability(
+ &mut self,
+ id: vfs::FileId,
+ source_root_id: SourceRootId,
+ durability: Durability,
+ ) {
+ let files = Arc::clone(&self.files);
+ files.set_file_source_root_with_durability(self, id, source_root_id, durability);
}
-}
-impl ra_salsa::Database for RootDatabase {}
+ fn crates_map(&self) -> Arc<CratesMap> {
+ self.crates_map.clone()
+ }
+}
impl Default for RootDatabase {
fn default() -> RootDatabase {
@@ -146,14 +179,19 @@ impl Default for RootDatabase {
impl RootDatabase {
pub fn new(lru_capacity: Option<u16>) -> RootDatabase {
- let mut db = RootDatabase { storage: ManuallyDrop::new(ra_salsa::Storage::default()) };
- db.set_crate_graph_with_durability(Default::default(), Durability::HIGH);
- db.set_proc_macros_with_durability(Default::default(), Durability::HIGH);
- db.set_local_roots_with_durability(Default::default(), Durability::HIGH);
- db.set_library_roots_with_durability(Default::default(), Durability::HIGH);
+ let mut db = RootDatabase {
+ storage: ManuallyDrop::new(salsa::Storage::default()),
+ files: Default::default(),
+ crates_map: Default::default(),
+ };
+ // This needs to be here otherwise `CrateGraphBuilder` will panic.
+ db.set_all_crates(Arc::new(Box::new([])));
+ CrateGraphBuilder::default().set_in_db(&mut db);
+ db.set_proc_macros_with_durability(Default::default(), Durability::MEDIUM);
+ db.set_local_roots_with_durability(Default::default(), Durability::MEDIUM);
+ db.set_library_roots_with_durability(Default::default(), Durability::MEDIUM);
db.set_expand_proc_attr_macros_with_durability(false, Durability::HIGH);
db.update_base_query_lru_capacities(lru_capacity);
- db.setup_syntax_context_root();
db
}
@@ -161,57 +199,59 @@ impl RootDatabase {
self.set_expand_proc_attr_macros_with_durability(true, Durability::HIGH);
}
- pub fn update_base_query_lru_capacities(&mut self, lru_capacity: Option<u16>) {
- let lru_capacity = lru_capacity.unwrap_or(base_db::DEFAULT_PARSE_LRU_CAP);
- base_db::FileTextQuery.in_db_mut(self).set_lru_capacity(DEFAULT_FILE_TEXT_LRU_CAP);
- base_db::ParseQuery.in_db_mut(self).set_lru_capacity(lru_capacity);
- // macro expansions are usually rather small, so we can afford to keep more of them alive
- hir::db::ParseMacroExpansionQuery.in_db_mut(self).set_lru_capacity(4 * lru_capacity);
- hir::db::BorrowckQuery.in_db_mut(self).set_lru_capacity(base_db::DEFAULT_BORROWCK_LRU_CAP);
- hir::db::BodyWithSourceMapQuery.in_db_mut(self).set_lru_capacity(2048);
+ pub fn update_base_query_lru_capacities(&mut self, _lru_capacity: Option<u16>) {
+ // let lru_capacity = lru_capacity.unwrap_or(base_db::DEFAULT_PARSE_LRU_CAP);
+ // base_db::FileTextQuery.in_db_mut(self).set_lru_capacity(DEFAULT_FILE_TEXT_LRU_CAP);
+ // base_db::ParseQuery.in_db_mut(self).set_lru_capacity(lru_capacity);
+ // // macro expansions are usually rather small, so we can afford to keep more of them alive
+ // hir::db::ParseMacroExpansionQuery.in_db_mut(self).set_lru_capacity(4 * lru_capacity);
+ // hir::db::BorrowckQuery.in_db_mut(self).set_lru_capacity(base_db::DEFAULT_BORROWCK_LRU_CAP);
+ // hir::db::BodyWithSourceMapQuery.in_db_mut(self).set_lru_capacity(2048);
}
- pub fn update_lru_capacities(&mut self, lru_capacities: &FxHashMap<Box<str>, u16>) {
- use hir::db as hir_db;
-
- base_db::FileTextQuery.in_db_mut(self).set_lru_capacity(DEFAULT_FILE_TEXT_LRU_CAP);
- base_db::ParseQuery.in_db_mut(self).set_lru_capacity(
- lru_capacities
- .get(stringify!(ParseQuery))
- .copied()
- .unwrap_or(base_db::DEFAULT_PARSE_LRU_CAP),
- );
- hir_db::ParseMacroExpansionQuery.in_db_mut(self).set_lru_capacity(
- lru_capacities
- .get(stringify!(ParseMacroExpansionQuery))
- .copied()
- .unwrap_or(4 * base_db::DEFAULT_PARSE_LRU_CAP),
- );
- hir_db::BorrowckQuery.in_db_mut(self).set_lru_capacity(
- lru_capacities
- .get(stringify!(BorrowckQuery))
- .copied()
- .unwrap_or(base_db::DEFAULT_BORROWCK_LRU_CAP),
- );
- hir::db::BodyWithSourceMapQuery.in_db_mut(self).set_lru_capacity(2048);
+ pub fn update_lru_capacities(&mut self, _lru_capacities: &FxHashMap<Box<str>, u16>) {
+ // FIXME(salsa-transition): bring this back; allow changing LRU settings at runtime.
+ // use hir::db as hir_db;
+
+ // base_db::FileTextQuery.in_db_mut(self).set_lru_capacity(DEFAULT_FILE_TEXT_LRU_CAP);
+ // base_db::ParseQuery.in_db_mut(self).set_lru_capacity(
+ // lru_capacities
+ // .get(stringify!(ParseQuery))
+ // .copied()
+ // .unwrap_or(base_db::DEFAULT_PARSE_LRU_CAP),
+ // );
+ // hir_db::ParseMacroExpansionQuery.in_db_mut(self).set_lru_capacity(
+ // lru_capacities
+ // .get(stringify!(ParseMacroExpansionQuery))
+ // .copied()
+ // .unwrap_or(4 * base_db::DEFAULT_PARSE_LRU_CAP),
+ // );
+ // hir_db::BorrowckQuery.in_db_mut(self).set_lru_capacity(
+ // lru_capacities
+ // .get(stringify!(BorrowckQuery))
+ // .copied()
+ // .unwrap_or(base_db::DEFAULT_BORROWCK_LRU_CAP),
+ // );
+ // hir::db::BodyWithSourceMapQuery.in_db_mut(self).set_lru_capacity(2048);
}
-}
-impl ra_salsa::ParallelDatabase for RootDatabase {
- fn snapshot(&self) -> ra_salsa::Snapshot<RootDatabase> {
- ra_salsa::Snapshot::new(RootDatabase {
- storage: ManuallyDrop::new(self.storage.snapshot()),
- })
+ pub fn snapshot(&self) -> Self {
+ Self {
+ storage: self.storage.clone(),
+ files: self.files.clone(),
+ crates_map: self.crates_map.clone(),
+ }
}
}
-#[ra_salsa::query_group(LineIndexDatabaseStorage)]
-pub trait LineIndexDatabase: base_db::SourceDatabase {
+#[query_group::query_group]
+pub trait LineIndexDatabase: base_db::RootQueryDb {
+ #[salsa::invoke_interned(line_index)]
fn line_index(&self, file_id: FileId) -> Arc<LineIndex>;
}
fn line_index(db: &dyn LineIndexDatabase, file_id: FileId) -> Arc<LineIndex> {
- let text = db.file_text(file_id);
+ let text = db.file_text(file_id).text(db);
Arc::new(LineIndex::new(&text))
}
@@ -288,11 +328,7 @@ pub struct SnippetCap {
impl SnippetCap {
pub const fn new(allow_snippets: bool) -> Option<SnippetCap> {
- if allow_snippets {
- Some(SnippetCap { _private: () })
- } else {
- None
- }
+ if allow_snippets { Some(SnippetCap { _private: () }) } else { None }
}
}