aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_lsp_server/src/server_world.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ra_lsp_server/src/server_world.rs')
-rw-r--r--crates/ra_lsp_server/src/server_world.rs76
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 @@
1use std::{ 1use std::{
2 fs, 2 fs,
3 path::{PathBuf, Path}, 3 path::{Path, PathBuf},
4 sync::Arc, 4 sync::Arc,
5}; 5};
6 6
7use rustc_hash::FxHashMap;
8use languageserver_types::Url; 7use languageserver_types::Url;
9use ra_analysis::{FileId, AnalysisHost, Analysis, CrateGraph, CrateId, LibraryData, FileResolver}; 8use ra_analysis::{Analysis, AnalysisHost, CrateGraph, CrateId, FileId, FileResolver, LibraryData};
9use rustc_hash::FxHashMap;
10 10
11use crate::{ 11use 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> {