diff --git a/crates/project/src/project.rs b/crates/project/src/project.rs index 62ce02d71c83dde60a4d30a721fa2e7cfd9da8c4..cf4bdc44637cc483f999173089b8f2f41b62865a 100644 --- a/crates/project/src/project.rs +++ b/crates/project/src/project.rs @@ -713,25 +713,28 @@ impl Project { fn on_settings_changed(&mut self, cx: &mut ModelContext<'_, Self>) { let settings = cx.global::(); - self.lsp_settings_changed = Some(cx.spawn(|_, _| async { - let mut language_servers_to_start = Vec::new(); - for buffer in self.opened_buffers.values() { - if let Some(buffer) = buffer.upgrade(cx) { - let buffer = buffer.read(cx); - if let Some((file, language)) = - File::from_dyn(buffer.file()).zip(buffer.language()) - { - if settings.enable_language_server(Some(&language.name())) { - let worktree = file.worktree.read(cx); - language_servers_to_start.push(( - worktree.id(), - worktree.as_local().unwrap().abs_path().clone(), - language.clone(), - )); + self.lsp_settings_changed = Some(cx.spawn(|project, cx| async { + let language_servers_to_start = project.update(&mut cx, |project, cx| { + let mut language_servers_to_start = Vec::new(); + for buffer in self.opened_buffers.values() { + if let Some(buffer) = buffer.upgrade(cx) { + let buffer = buffer.read(cx); + if let Some((file, language)) = + File::from_dyn(buffer.file()).zip(buffer.language()) + { + if settings.enable_language_server(Some(&language.name())) { + let worktree = file.worktree.read(cx); + language_servers_to_start.push(( + worktree.id(), + worktree.as_local().unwrap().abs_path().clone(), + language.clone(), + )); + } } } } - } + language_servers_to_start + }); let mut language_servers_to_stop = Vec::new(); for language in self.languages.to_vec() { @@ -749,18 +752,20 @@ impl Project { } } - // Stop all newly-disabled language servers. - for (worktree_id, adapter_name) in language_servers_to_stop { - self.stop_language_server(worktree_id, adapter_name, cx) - .detach(); - } + project.update(&mut cx, |project, cx| { + // Stop all newly-disabled language servers. + for (worktree_id, adapter_name) in language_servers_to_stop { + self.stop_language_server(worktree_id, adapter_name, cx) + .detach(); + } - // Start all the newly-enabled language servers. - for (worktree_id, worktree_path, language) in language_servers_to_start { - self.start_language_server(worktree_id, worktree_path, language, cx); - } + // Start all the newly-enabled language servers. + for (worktree_id, worktree_path, language) in language_servers_to_start { + self.start_language_server(worktree_id, worktree_path, language, cx); + } - cx.notify(); + cx.notify(); + }); })) }