Fix on_settings_changed, need to review that impl is correct

Isaac Clayton created

Change summary

crates/project/src/project.rs | 57 ++++++++++++++++++++----------------
1 file changed, 31 insertions(+), 26 deletions(-)

Detailed changes

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::<Settings>();
-        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();
+            });
         }))
     }