From 3a017aaa52fc41316b5dd2cd90b5171ca869697a Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Tue, 4 Sep 2018 11:40:45 +0300 Subject: dont change readonly files --- crates/server/src/path_map.rs | 36 +++++++++++++++++++++--------------- crates/server/src/server_world.rs | 20 +++++++++++++------- 2 files changed, 34 insertions(+), 22 deletions(-) (limited to 'crates/server') diff --git a/crates/server/src/path_map.rs b/crates/server/src/path_map.rs index f4ac47e70..de904e9db 100644 --- a/crates/server/src/path_map.rs +++ b/crates/server/src/path_map.rs @@ -3,41 +3,47 @@ use im; use relative_path::RelativePath; use libanalysis::{FileId, FileResolver}; +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum Root { + Workspace, Lib +} + #[derive(Debug, Default, Clone)] pub struct PathMap { next_id: u32, path2id: im::HashMap, id2path: im::HashMap, + id2root: im::HashMap, } impl PathMap { pub fn new() -> PathMap { Default::default() } - - pub fn get_or_insert(&mut self, path: PathBuf) -> FileId { + pub fn get_or_insert(&mut self, path: PathBuf, root: Root) -> FileId { self.path2id.get(path.as_path()) .map(|&id| id) .unwrap_or_else(|| { let id = self.new_file_id(); - self.insert(path, id); + self.insert(path, id, root); id }) } - pub fn get_id(&self, path: &Path) -> Option { self.path2id.get(path).map(|&id| id) } - - pub fn get_path(&self, id: FileId) -> &Path { - self.id2path.get(&id) + pub fn get_path(&self, file_id: FileId) -> &Path { + self.id2path.get(&file_id) .unwrap() .as_path() } - - fn insert(&mut self, path: PathBuf, id: FileId) { - self.path2id.insert(path.clone(), id); - self.id2path.insert(id, path.clone()); + pub fn get_root(&self, file_id: FileId) -> Root { + self.id2root[&file_id] + } + fn insert(&mut self, path: PathBuf, file_id: FileId, root: Root) { + self.path2id.insert(path.clone(), file_id); + self.id2path.insert(file_id, path.clone()); + self.id2root.insert(file_id, root); } fn new_file_id(&mut self) -> FileId { @@ -48,12 +54,12 @@ impl PathMap { } impl FileResolver for PathMap { - fn file_stem(&self, id: FileId) -> String { - self.get_path(id).file_stem().unwrap().to_str().unwrap().to_string() + fn file_stem(&self, file_id: FileId) -> String { + self.get_path(file_id).file_stem().unwrap().to_str().unwrap().to_string() } - fn resolve(&self, id: FileId, path: &RelativePath) -> Option { - let path = path.to_path(&self.get_path(id)); + fn resolve(&self, file_id: FileId, path: &RelativePath) -> Option { + let path = path.to_path(&self.get_path(file_id)); let path = normalize(&path); self.get_id(&path) } diff --git a/crates/server/src/server_world.rs b/crates/server/src/server_world.rs index 729418eaa..8ceec594f 100644 --- a/crates/server/src/server_world.rs +++ b/crates/server/src/server_world.rs @@ -10,7 +10,7 @@ use libanalysis::{FileId, AnalysisHost, Analysis, CrateGraph, CrateId, LibraryDa use { Result, - path_map::PathMap, + path_map::{PathMap, Root}, vfs::{FileEvent, FileEventKind}, project_model::CargoWorkspace, }; @@ -51,7 +51,7 @@ impl ServerWorldState { (event.path, text) }) .map(|(path, text)| { - (pm.get_or_insert(path), text) + (pm.get_or_insert(path, Root::Workspace), text) }) .filter_map(|(id, text)| { if mm.contains_key(&id) { @@ -73,7 +73,7 @@ impl ServerWorldState { }; (event.path, text) }) - .map(|(path, text)| (pm.get_or_insert(path), text)) + .map(|(path, text)| (pm.get_or_insert(path, Root::Lib), text)) .collect() } pub fn add_lib(&mut self, data: LibraryData) { @@ -81,9 +81,11 @@ impl ServerWorldState { } pub fn add_mem_file(&mut self, path: PathBuf, text: String) -> FileId { - let file_id = self.path_map.get_or_insert(path); + let file_id = self.path_map.get_or_insert(path, Root::Workspace); self.mem_map.insert(file_id, None); - self.analysis_host.change_file(file_id, Some(text)); + if self.path_map.get_root(file_id) != Root::Lib { + self.analysis_host.change_file(file_id, Some(text)); + } file_id } @@ -91,7 +93,9 @@ impl ServerWorldState { let file_id = self.path_map.get_id(path).ok_or_else(|| { format_err!("change to unknown file: {}", path.display()) })?; - self.analysis_host.change_file(file_id, Some(text)); + if self.path_map.get_root(file_id) != Root::Lib { + self.analysis_host.change_file(file_id, Some(text)); + } Ok(()) } @@ -105,7 +109,9 @@ impl ServerWorldState { }; // Do this via file watcher ideally. let text = fs::read_to_string(path).ok(); - self.analysis_host.change_file(file_id, text); + if self.path_map.get_root(file_id) != Root::Lib { + self.analysis_host.change_file(file_id, text); + } Ok(file_id) } pub fn set_workspaces(&mut self, ws: Vec) { -- cgit v1.2.3