diff options
Diffstat (limited to 'crates/ra_lsp_server/src/server_world.rs')
-rw-r--r-- | crates/ra_lsp_server/src/server_world.rs | 76 |
1 files changed, 43 insertions, 33 deletions
diff --git a/crates/ra_lsp_server/src/server_world.rs b/crates/ra_lsp_server/src/server_world.rs index 9b3013ae8..35ff65ea1 100644 --- a/crates/ra_lsp_server/src/server_world.rs +++ b/crates/ra_lsp_server/src/server_world.rs | |||
@@ -1,18 +1,18 @@ | |||
1 | use std::{ | 1 | use std::{ |
2 | fs, | 2 | fs, |
3 | path::{PathBuf, Path}, | 3 | path::{Path, PathBuf}, |
4 | sync::Arc, | 4 | sync::Arc, |
5 | }; | 5 | }; |
6 | 6 | ||
7 | use rustc_hash::FxHashMap; | ||
8 | use languageserver_types::Url; | 7 | use languageserver_types::Url; |
9 | use ra_analysis::{FileId, AnalysisHost, Analysis, CrateGraph, CrateId, LibraryData, FileResolver}; | 8 | use ra_analysis::{Analysis, AnalysisHost, CrateGraph, CrateId, FileId, FileResolver, LibraryData}; |
9 | use rustc_hash::FxHashMap; | ||
10 | 10 | ||
11 | use crate::{ | 11 | use crate::{ |
12 | Result, | ||
13 | path_map::{PathMap, Root}, | 12 | path_map::{PathMap, Root}, |
14 | vfs::{FileEvent, FileEventKind}, | ||
15 | project_model::CargoWorkspace, | 13 | project_model::CargoWorkspace, |
14 | vfs::{FileEvent, FileEventKind}, | ||
15 | Result, | ||
16 | }; | 16 | }; |
17 | 17 | ||
18 | #[derive(Debug)] | 18 | #[derive(Debug)] |
@@ -42,16 +42,15 @@ impl ServerWorldState { | |||
42 | { | 42 | { |
43 | let pm = &mut self.path_map; | 43 | let pm = &mut self.path_map; |
44 | let mm = &mut self.mem_map; | 44 | let mm = &mut self.mem_map; |
45 | let changes = events.into_iter() | 45 | let changes = events |
46 | .into_iter() | ||
46 | .map(|event| { | 47 | .map(|event| { |
47 | let text = match event.kind { | 48 | let text = match event.kind { |
48 | FileEventKind::Add(text) => Some(text), | 49 | FileEventKind::Add(text) => Some(text), |
49 | }; | 50 | }; |
50 | (event.path, text) | 51 | (event.path, text) |
51 | }) | 52 | }) |
52 | .map(|(path, text)| { | 53 | .map(|(path, text)| (pm.get_or_insert(path, Root::Workspace), text)) |
53 | (pm.get_or_insert(path, Root::Workspace), text) | ||
54 | }) | ||
55 | .filter_map(|(id, text)| { | 54 | .filter_map(|(id, text)| { |
56 | if mm.contains_key(&id) { | 55 | if mm.contains_key(&id) { |
57 | mm.insert(id, text); | 56 | mm.insert(id, text); |
@@ -62,12 +61,17 @@ impl ServerWorldState { | |||
62 | }); | 61 | }); |
63 | self.analysis_host.change_files(changes); | 62 | self.analysis_host.change_files(changes); |
64 | } | 63 | } |
65 | self.analysis_host.set_file_resolver(Arc::new(self.path_map.clone())); | 64 | self.analysis_host |
65 | .set_file_resolver(Arc::new(self.path_map.clone())); | ||
66 | } | 66 | } |
67 | pub fn events_to_files(&mut self, events: Vec<FileEvent>) -> (Vec<(FileId, String)>, Arc<FileResolver>) { | 67 | pub fn events_to_files( |
68 | &mut self, | ||
69 | events: Vec<FileEvent>, | ||
70 | ) -> (Vec<(FileId, String)>, Arc<FileResolver>) { | ||
68 | let files = { | 71 | let files = { |
69 | let pm = &mut self.path_map; | 72 | let pm = &mut self.path_map; |
70 | events.into_iter() | 73 | events |
74 | .into_iter() | ||
71 | .map(|event| { | 75 | .map(|event| { |
72 | let text = match event.kind { | 76 | let text = match event.kind { |
73 | FileEventKind::Add(text) => text, | 77 | FileEventKind::Add(text) => text, |
@@ -86,7 +90,8 @@ impl ServerWorldState { | |||
86 | 90 | ||
87 | pub fn add_mem_file(&mut self, path: PathBuf, text: String) -> FileId { | 91 | pub fn add_mem_file(&mut self, path: PathBuf, text: String) -> FileId { |
88 | let file_id = self.path_map.get_or_insert(path, Root::Workspace); | 92 | let file_id = self.path_map.get_or_insert(path, Root::Workspace); |
89 | self.analysis_host.set_file_resolver(Arc::new(self.path_map.clone())); | 93 | self.analysis_host |
94 | .set_file_resolver(Arc::new(self.path_map.clone())); | ||
90 | self.mem_map.insert(file_id, None); | 95 | self.mem_map.insert(file_id, None); |
91 | if self.path_map.get_root(file_id) != Root::Lib { | 96 | if self.path_map.get_root(file_id) != Root::Lib { |
92 | self.analysis_host.change_file(file_id, Some(text)); | 97 | self.analysis_host.change_file(file_id, Some(text)); |
@@ -95,9 +100,10 @@ impl ServerWorldState { | |||
95 | } | 100 | } |
96 | 101 | ||
97 | pub fn change_mem_file(&mut self, path: &Path, text: String) -> Result<()> { | 102 | pub fn change_mem_file(&mut self, path: &Path, text: String) -> Result<()> { |
98 | let file_id = self.path_map.get_id(path).ok_or_else(|| { | 103 | let file_id = self |
99 | format_err!("change to unknown file: {}", path.display()) | 104 | .path_map |
100 | })?; | 105 | .get_id(path) |
106 | .ok_or_else(|| format_err!("change to unknown file: {}", path.display()))?; | ||
101 | if self.path_map.get_root(file_id) != Root::Lib { | 107 | if self.path_map.get_root(file_id) != Root::Lib { |
102 | self.analysis_host.change_file(file_id, Some(text)); | 108 | self.analysis_host.change_file(file_id, Some(text)); |
103 | } | 109 | } |
@@ -105,9 +111,10 @@ impl ServerWorldState { | |||
105 | } | 111 | } |
106 | 112 | ||
107 | pub fn remove_mem_file(&mut self, path: &Path) -> Result<FileId> { | 113 | pub fn remove_mem_file(&mut self, path: &Path) -> Result<FileId> { |
108 | let file_id = self.path_map.get_id(path).ok_or_else(|| { | 114 | let file_id = self |
109 | format_err!("change to unknown file: {}", path.display()) | 115 | .path_map |
110 | })?; | 116 | .get_id(path) |
117 | .ok_or_else(|| format_err!("change to unknown file: {}", path.display()))?; | ||
111 | match self.mem_map.remove(&file_id) { | 118 | match self.mem_map.remove(&file_id) { |
112 | Some(_) => (), | 119 | Some(_) => (), |
113 | None => bail!("unmatched close notification"), | 120 | None => bail!("unmatched close notification"), |
@@ -122,17 +129,17 @@ impl ServerWorldState { | |||
122 | pub fn set_workspaces(&mut self, ws: Vec<CargoWorkspace>) { | 129 | pub fn set_workspaces(&mut self, ws: Vec<CargoWorkspace>) { |
123 | let mut crate_roots = FxHashMap::default(); | 130 | let mut crate_roots = FxHashMap::default(); |
124 | ws.iter() | 131 | ws.iter() |
125 | .flat_map(|ws| { | 132 | .flat_map(|ws| { |
126 | ws.packages() | 133 | ws.packages() |
127 | .flat_map(move |pkg| pkg.targets(ws)) | 134 | .flat_map(move |pkg| pkg.targets(ws)) |
128 | .map(move |tgt| tgt.root(ws)) | 135 | .map(move |tgt| tgt.root(ws)) |
129 | }) | 136 | }) |
130 | .for_each(|root| { | 137 | .for_each(|root| { |
131 | if let Some(file_id) = self.path_map.get_id(root) { | 138 | if let Some(file_id) = self.path_map.get_id(root) { |
132 | let crate_id = CrateId(crate_roots.len() as u32); | 139 | let crate_id = CrateId(crate_roots.len() as u32); |
133 | crate_roots.insert(crate_id, file_id); | 140 | crate_roots.insert(crate_id, file_id); |
134 | } | 141 | } |
135 | }); | 142 | }); |
136 | let crate_graph = CrateGraph { crate_roots }; | 143 | let crate_graph = CrateGraph { crate_roots }; |
137 | self.workspaces = Arc::new(ws); | 144 | self.workspaces = Arc::new(ws); |
138 | self.analysis_host.set_crate_graph(crate_graph); | 145 | self.analysis_host.set_crate_graph(crate_graph); |
@@ -141,7 +148,7 @@ impl ServerWorldState { | |||
141 | ServerWorld { | 148 | ServerWorld { |
142 | workspaces: Arc::clone(&self.workspaces), | 149 | workspaces: Arc::clone(&self.workspaces), |
143 | analysis: self.analysis_host.analysis(), | 150 | analysis: self.analysis_host.analysis(), |
144 | path_map: self.path_map.clone() | 151 | path_map: self.path_map.clone(), |
145 | } | 152 | } |
146 | } | 153 | } |
147 | } | 154 | } |
@@ -152,9 +159,12 @@ impl ServerWorld { | |||
152 | } | 159 | } |
153 | 160 | ||
154 | pub fn uri_to_file_id(&self, uri: &Url) -> Result<FileId> { | 161 | pub fn uri_to_file_id(&self, uri: &Url) -> Result<FileId> { |
155 | let path = uri.to_file_path() | 162 | let path = uri |
163 | .to_file_path() | ||
156 | .map_err(|()| format_err!("invalid uri: {}", uri))?; | 164 | .map_err(|()| format_err!("invalid uri: {}", uri))?; |
157 | self.path_map.get_id(&path).ok_or_else(|| format_err!("unknown file: {}", path.display())) | 165 | self.path_map |
166 | .get_id(&path) | ||
167 | .ok_or_else(|| format_err!("unknown file: {}", path.display())) | ||
158 | } | 168 | } |
159 | 169 | ||
160 | pub fn file_id_to_uri(&self, id: FileId) -> Result<Url> { | 170 | pub fn file_id_to_uri(&self, id: FileId) -> Result<Url> { |