diff options
Diffstat (limited to 'crates/ra_lsp_server/src/server_world.rs')
-rw-r--r-- | crates/ra_lsp_server/src/server_world.rs | 20 |
1 files changed, 11 insertions, 9 deletions
diff --git a/crates/ra_lsp_server/src/server_world.rs b/crates/ra_lsp_server/src/server_world.rs index 4b1d592bb..45ad8e24e 100644 --- a/crates/ra_lsp_server/src/server_world.rs +++ b/crates/ra_lsp_server/src/server_world.rs | |||
@@ -24,7 +24,7 @@ use crate::{ | |||
24 | #[derive(Debug)] | 24 | #[derive(Debug)] |
25 | pub struct ServerWorldState { | 25 | pub struct ServerWorldState { |
26 | pub roots_to_scan: usize, | 26 | pub roots_to_scan: usize, |
27 | pub root: PathBuf, | 27 | pub roots: Vec<PathBuf>, |
28 | pub workspaces: Arc<Vec<ProjectWorkspace>>, | 28 | pub workspaces: Arc<Vec<ProjectWorkspace>>, |
29 | pub analysis_host: AnalysisHost, | 29 | pub analysis_host: AnalysisHost, |
30 | pub vfs: Arc<RwLock<Vfs>>, | 30 | pub vfs: Arc<RwLock<Vfs>>, |
@@ -37,19 +37,20 @@ pub struct ServerWorld { | |||
37 | } | 37 | } |
38 | 38 | ||
39 | impl ServerWorldState { | 39 | impl ServerWorldState { |
40 | pub fn new(root: PathBuf, workspaces: Vec<ProjectWorkspace>) -> ServerWorldState { | 40 | pub fn new(folder_roots: Vec<PathBuf>, workspaces: Vec<ProjectWorkspace>) -> ServerWorldState { |
41 | let mut change = AnalysisChange::new(); | 41 | let mut change = AnalysisChange::new(); |
42 | 42 | ||
43 | let mut roots = Vec::new(); | 43 | let mut roots = Vec::new(); |
44 | roots.push(IncludeRustFiles::member(root.clone())); | 44 | roots.extend(folder_roots.iter().cloned().map(IncludeRustFiles::member)); |
45 | for ws in workspaces.iter() { | 45 | for ws in workspaces.iter() { |
46 | roots.extend(IncludeRustFiles::from_roots(ws.to_roots())); | 46 | roots.extend(IncludeRustFiles::from_roots(ws.to_roots())); |
47 | } | 47 | } |
48 | 48 | ||
49 | let (mut vfs, roots) = Vfs::new(roots); | 49 | let (mut vfs, vfs_roots) = Vfs::new(roots); |
50 | let roots_to_scan = roots.len(); | 50 | let roots_to_scan = vfs_roots.len(); |
51 | for r in roots { | 51 | for r in vfs_roots { |
52 | let is_local = vfs.root2path(r).starts_with(&root); | 52 | let vfs_root_path = vfs.root2path(r); |
53 | let is_local = folder_roots.iter().any(|it| vfs_root_path.starts_with(it)); | ||
53 | change.add_root(SourceRootId(r.0.into()), is_local); | 54 | change.add_root(SourceRootId(r.0.into()), is_local); |
54 | } | 55 | } |
55 | 56 | ||
@@ -68,7 +69,7 @@ impl ServerWorldState { | |||
68 | analysis_host.apply_change(change); | 69 | analysis_host.apply_change(change); |
69 | ServerWorldState { | 70 | ServerWorldState { |
70 | roots_to_scan, | 71 | roots_to_scan, |
71 | root, | 72 | roots: folder_roots, |
72 | workspaces: Arc::new(workspaces), | 73 | workspaces: Arc::new(workspaces), |
73 | analysis_host, | 74 | analysis_host, |
74 | vfs: Arc::new(RwLock::new(vfs)), | 75 | vfs: Arc::new(RwLock::new(vfs)), |
@@ -90,7 +91,8 @@ impl ServerWorldState { | |||
90 | match c { | 91 | match c { |
91 | VfsChange::AddRoot { root, files } => { | 92 | VfsChange::AddRoot { root, files } => { |
92 | let root_path = self.vfs.read().root2path(root); | 93 | let root_path = self.vfs.read().root2path(root); |
93 | if root_path.starts_with(&self.root) { | 94 | let is_local = self.roots.iter().any(|r| root_path.starts_with(r)); |
95 | if is_local { | ||
94 | self.roots_to_scan -= 1; | 96 | self.roots_to_scan -= 1; |
95 | for (file, path, text) in files { | 97 | for (file, path, text) in files { |
96 | change.add_file( | 98 | change.add_file( |