diff --git a/crates/ra_db/src/input.rs b/crates/ra_db/src/input.rs index a5f4e489f7b..c103503bd55 100644 --- a/crates/ra_db/src/input.rs +++ b/crates/ra_db/src/input.rs @@ -31,9 +31,23 @@ #[derive(Default, Clone, Debug, PartialEq, Eq)] pub struct SourceRoot { + /// Sysroot or crates.io library. + /// + /// Libraries are considered mostly immutable, this assumption is used to + /// optimize salsa's query structure + pub is_library: bool, pub files: FxHashMap, } +impl SourceRoot { + pub fn new() -> SourceRoot { + Default::default() + } + pub fn new_library() -> SourceRoot { + SourceRoot { is_library: true, ..SourceRoot::new() } + } +} + /// `CrateGraph` is a bit of information which turns a set of text files into a /// number of Rust crates. Each crate is defined by the `FileId` of its root module, /// the set of cfg flags (not yet implemented) and the set of dependencies. Note diff --git a/crates/ra_ide_api/src/change.rs b/crates/ra_ide_api/src/change.rs index 895b1e966de..8d9918d164d 100644 --- a/crates/ra_ide_api/src/change.rs +++ b/crates/ra_ide_api/src/change.rs @@ -163,7 +163,8 @@ pub(crate) fn apply_change(&mut self, change: AnalysisChange) { if !change.new_roots.is_empty() { let mut local_roots = Vec::clone(&self.local_roots()); for (root_id, is_local) in change.new_roots { - self.set_source_root(root_id, Default::default()); + let root = if is_local { SourceRoot::new() } else { SourceRoot::new_library() }; + self.set_source_root(root_id, Arc::new(root)); if is_local { local_roots.push(root_id); }