diff options
-rw-r--r-- | crates/rust-analyzer/src/global_state.rs | 121 |
1 files changed, 65 insertions, 56 deletions
diff --git a/crates/rust-analyzer/src/global_state.rs b/crates/rust-analyzer/src/global_state.rs index 149b1b5f9..be5a3f8a7 100644 --- a/crates/rust-analyzer/src/global_state.rs +++ b/crates/rust-analyzer/src/global_state.rs | |||
@@ -81,7 +81,7 @@ pub(crate) struct GlobalState { | |||
81 | pub(crate) req_queue: ReqQueue, | 81 | pub(crate) req_queue: ReqQueue, |
82 | latest_requests: Arc<RwLock<LatestRequests>>, | 82 | latest_requests: Arc<RwLock<LatestRequests>>, |
83 | source_root_config: SourceRootConfig, | 83 | source_root_config: SourceRootConfig, |
84 | _proc_macro_client: ProcMacroClient, | 84 | proc_macro_client: ProcMacroClient, |
85 | workspaces: Arc<Vec<ProjectWorkspace>>, | 85 | workspaces: Arc<Vec<ProjectWorkspace>>, |
86 | } | 86 | } |
87 | 87 | ||
@@ -103,61 +103,14 @@ impl GlobalState { | |||
103 | config: Config, | 103 | config: Config, |
104 | req_queue: ReqQueue, | 104 | req_queue: ReqQueue, |
105 | ) -> GlobalState { | 105 | ) -> GlobalState { |
106 | let mut change = AnalysisChange::new(); | ||
107 | |||
108 | let project_folders = ProjectFolders::new(&workspaces); | ||
109 | |||
110 | let (task_sender, task_receiver) = unbounded::<vfs::loader::Message>(); | 106 | let (task_sender, task_receiver) = unbounded::<vfs::loader::Message>(); |
111 | let mut vfs = vfs::Vfs::default(); | ||
112 | |||
113 | let proc_macro_client = match &config.proc_macro_srv { | ||
114 | None => ProcMacroClient::dummy(), | ||
115 | Some((path, args)) => match ProcMacroClient::extern_process(path.into(), args) { | ||
116 | Ok(it) => it, | ||
117 | Err(err) => { | ||
118 | log::error!( | ||
119 | "Failed to run ra_proc_macro_srv from path {}, error: {:?}", | ||
120 | path.display(), | ||
121 | err | ||
122 | ); | ||
123 | ProcMacroClient::dummy() | ||
124 | } | ||
125 | }, | ||
126 | }; | ||
127 | 107 | ||
128 | let mut loader = { | 108 | let loader = { |
129 | let loader = vfs_notify::NotifyHandle::spawn(Box::new(move |msg| { | 109 | let loader = vfs_notify::NotifyHandle::spawn(Box::new(move |msg| { |
130 | task_sender.send(msg).unwrap() | 110 | task_sender.send(msg).unwrap() |
131 | })); | 111 | })); |
132 | Box::new(loader) | 112 | Box::new(loader) |
133 | }; | 113 | }; |
134 | let watch = match config.files.watcher { | ||
135 | FilesWatcher::Client => vec![], | ||
136 | FilesWatcher::Notify => project_folders.watch, | ||
137 | }; | ||
138 | loader.set_config(vfs::loader::Config { load: project_folders.load, watch }); | ||
139 | |||
140 | // Create crate graph from all the workspaces | ||
141 | let mut crate_graph = CrateGraph::default(); | ||
142 | let mut load = |path: &AbsPath| { | ||
143 | let contents = loader.load_sync(path); | ||
144 | let path = vfs::VfsPath::from(path.to_path_buf()); | ||
145 | vfs.set_file_contents(path.clone(), contents); | ||
146 | vfs.file_id(&path) | ||
147 | }; | ||
148 | for ws in workspaces.iter() { | ||
149 | crate_graph.extend(ws.to_crate_graph( | ||
150 | config.cargo.target.as_deref(), | ||
151 | &proc_macro_client, | ||
152 | &mut load, | ||
153 | )); | ||
154 | } | ||
155 | change.set_crate_graph(crate_graph); | ||
156 | |||
157 | let flycheck = config.check.as_ref().and_then(|c| create_flycheck(&workspaces, c)); | ||
158 | |||
159 | let mut analysis_host = AnalysisHost::new(lru_capacity); | ||
160 | analysis_host.apply_change(change); | ||
161 | 114 | ||
162 | let task_pool = { | 115 | let task_pool = { |
163 | let (sender, receiver) = unbounded(); | 116 | let (sender, receiver) = unbounded(); |
@@ -168,24 +121,80 @@ impl GlobalState { | |||
168 | sender, | 121 | sender, |
169 | config, | 122 | config, |
170 | task_pool, | 123 | task_pool, |
171 | analysis_host, | 124 | analysis_host: AnalysisHost::new(lru_capacity), |
172 | loader, | 125 | loader, |
173 | task_receiver, | 126 | task_receiver, |
174 | flycheck, | 127 | flycheck: None, |
175 | diagnostics: Default::default(), | 128 | diagnostics: Default::default(), |
176 | mem_docs: FxHashSet::default(), | 129 | mem_docs: FxHashSet::default(), |
177 | vfs: Arc::new(RwLock::new((vfs, FxHashMap::default()))), | 130 | vfs: Arc::new(RwLock::new((vfs::Vfs::default(), FxHashMap::default()))), |
178 | status: Status::default(), | 131 | status: Status::default(), |
179 | req_queue, | 132 | req_queue, |
180 | latest_requests: Default::default(), | 133 | latest_requests: Default::default(), |
181 | source_root_config: project_folders.source_root_config, | 134 | source_root_config: SourceRootConfig::default(), |
182 | _proc_macro_client: proc_macro_client, | 135 | proc_macro_client: ProcMacroClient::dummy(), |
183 | workspaces: Arc::new(workspaces), | 136 | workspaces: Arc::new(Vec::new()), |
184 | }; | 137 | }; |
185 | res.process_changes(); | 138 | res.reload(workspaces); |
186 | res | 139 | res |
187 | } | 140 | } |
188 | 141 | ||
142 | pub(crate) fn reload(&mut self, workspaces: Vec<ProjectWorkspace>) { | ||
143 | let mut change = AnalysisChange::new(); | ||
144 | |||
145 | let project_folders = ProjectFolders::new(&workspaces); | ||
146 | |||
147 | self.proc_macro_client = match &self.config.proc_macro_srv { | ||
148 | None => ProcMacroClient::dummy(), | ||
149 | Some((path, args)) => match ProcMacroClient::extern_process(path.into(), args) { | ||
150 | Ok(it) => it, | ||
151 | Err(err) => { | ||
152 | log::error!( | ||
153 | "Failed to run ra_proc_macro_srv from path {}, error: {:?}", | ||
154 | path.display(), | ||
155 | err | ||
156 | ); | ||
157 | ProcMacroClient::dummy() | ||
158 | } | ||
159 | }, | ||
160 | }; | ||
161 | let watch = match self.config.files.watcher { | ||
162 | FilesWatcher::Client => vec![], | ||
163 | FilesWatcher::Notify => project_folders.watch, | ||
164 | }; | ||
165 | self.loader.set_config(vfs::loader::Config { load: project_folders.load, watch }); | ||
166 | |||
167 | // Create crate graph from all the workspaces | ||
168 | let crate_graph = { | ||
169 | let mut crate_graph = CrateGraph::default(); | ||
170 | let vfs = &mut self.vfs.write().0; | ||
171 | let loader = &mut self.loader; | ||
172 | let mut load = |path: &AbsPath| { | ||
173 | let contents = loader.load_sync(path); | ||
174 | let path = vfs::VfsPath::from(path.to_path_buf()); | ||
175 | vfs.set_file_contents(path.clone(), contents); | ||
176 | vfs.file_id(&path) | ||
177 | }; | ||
178 | for ws in workspaces.iter() { | ||
179 | crate_graph.extend(ws.to_crate_graph( | ||
180 | self.config.cargo.target.as_deref(), | ||
181 | &self.proc_macro_client, | ||
182 | &mut load, | ||
183 | )); | ||
184 | } | ||
185 | |||
186 | crate_graph | ||
187 | }; | ||
188 | change.set_crate_graph(crate_graph); | ||
189 | |||
190 | self.flycheck = self.config.check.as_ref().and_then(|c| create_flycheck(&workspaces, c)); | ||
191 | self.source_root_config = project_folders.source_root_config; | ||
192 | self.workspaces = Arc::new(workspaces); | ||
193 | |||
194 | self.analysis_host.apply_change(change); | ||
195 | self.process_changes(); | ||
196 | } | ||
197 | |||
189 | pub(crate) fn update_configuration(&mut self, config: Config) { | 198 | pub(crate) fn update_configuration(&mut self, config: Config) { |
190 | self.analysis_host.update_lru_capacity(config.lru_capacity); | 199 | self.analysis_host.update_lru_capacity(config.lru_capacity); |
191 | if config.check != self.config.check { | 200 | if config.check != self.config.check { |