Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/base-db/src/change.rs')
-rw-r--r--crates/base-db/src/change.rs50
1 files changed, 19 insertions, 31 deletions
diff --git a/crates/base-db/src/change.rs b/crates/base-db/src/change.rs
index 7e40f5408f..da2fb27571 100644
--- a/crates/base-db/src/change.rs
+++ b/crates/base-db/src/change.rs
@@ -3,23 +3,18 @@
use std::fmt;
-use ra_salsa::Durability;
-use rustc_hash::FxHashMap;
+use salsa::Durability;
use triomphe::Arc;
use vfs::FileId;
-use crate::{
- CrateGraph, CrateId, CrateWorkspaceData, SourceDatabaseFileInputExt, SourceRoot,
- SourceRootDatabase, SourceRootId,
-};
+use crate::{CrateGraphBuilder, CratesIdMap, RootQueryDb, SourceRoot, SourceRootId};
/// Encapsulate a bunch of raw `.set` calls on the database.
#[derive(Default)]
pub struct FileChange {
pub roots: Option<Vec<SourceRoot>>,
pub files_changed: Vec<(FileId, Option<String>)>,
- pub crate_graph: Option<CrateGraph>,
- pub ws_data: Option<FxHashMap<CrateId, Arc<CrateWorkspaceData>>>,
+ pub crate_graph: Option<CrateGraphBuilder>,
}
impl fmt::Debug for FileChange {
@@ -39,10 +34,6 @@ impl fmt::Debug for FileChange {
}
impl FileChange {
- pub fn new() -> Self {
- FileChange::default()
- }
-
pub fn set_roots(&mut self, roots: Vec<SourceRoot>) {
self.roots = Some(roots);
}
@@ -51,48 +42,45 @@ impl FileChange {
self.files_changed.push((file_id, new_text))
}
- pub fn set_crate_graph(&mut self, graph: CrateGraph) {
+ pub fn set_crate_graph(&mut self, graph: CrateGraphBuilder) {
self.crate_graph = Some(graph);
}
- pub fn set_ws_data(&mut self, data: FxHashMap<CrateId, Arc<CrateWorkspaceData>>) {
- self.ws_data = Some(data);
- }
-
- pub fn apply(self, db: &mut dyn SourceRootDatabase) {
+ pub fn apply(self, db: &mut dyn RootQueryDb) -> Option<CratesIdMap> {
let _p = tracing::info_span!("FileChange::apply").entered();
if let Some(roots) = self.roots {
for (idx, root) in roots.into_iter().enumerate() {
let root_id = SourceRootId(idx as u32);
- let durability = durability(&root);
+ let durability = source_root_durability(&root);
for file_id in root.iter() {
db.set_file_source_root_with_durability(file_id, root_id, durability);
}
+
db.set_source_root_with_durability(root_id, Arc::new(root), durability);
}
}
for (file_id, text) in self.files_changed {
let source_root_id = db.file_source_root(file_id);
- let source_root = db.source_root(source_root_id);
- let durability = durability(&source_root);
+ let source_root = db.source_root(source_root_id.source_root_id(db));
+
+ let durability = file_text_durability(&source_root.source_root(db));
// XXX: can't actually remove the file, just reset the text
let text = text.unwrap_or_default();
db.set_file_text_with_durability(file_id, &text, durability)
}
+
if let Some(crate_graph) = self.crate_graph {
- db.set_crate_graph_with_durability(Arc::new(crate_graph), Durability::HIGH);
- }
- if let Some(data) = self.ws_data {
- db.set_crate_workspace_data_with_durability(Arc::new(data), Durability::HIGH);
+ return Some(crate_graph.set_in_db(db));
}
+ None
}
}
-fn durability(source_root: &SourceRoot) -> Durability {
- if source_root.is_library {
- Durability::HIGH
- } else {
- Durability::LOW
- }
+fn source_root_durability(source_root: &SourceRoot) -> Durability {
+ if source_root.is_library { Durability::MEDIUM } else { Durability::LOW }
+}
+
+fn file_text_durability(source_root: &SourceRoot) -> Durability {
+ if source_root.is_library { Durability::HIGH } else { Durability::LOW }
}