Fix on_settings_changed, need to review that impl is correct

This commit is contained in:
Isaac Clayton 2022-07-05 09:39:43 +02:00
parent 4dad2eb7d7
commit db7b863d8c

View file

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