Regroup result_ids (#32710)

Kirill Bulatov created

Do not cleanup the result_id data on buffer drop, as this data is meant
to be stored between buffer reopens.
Use `LanguageServerId` as keys as this way it's simpler to access the
data.

Follow-up of https://github.com/zed-industries/zed/pull/32403

Release Notes:

- N/A

Change summary

crates/project/src/lsp_store.rs | 38 ++++++++++------------------------
1 file changed, 11 insertions(+), 27 deletions(-)

Detailed changes

crates/project/src/lsp_store.rs 🔗

@@ -166,7 +166,7 @@ pub struct LocalLspStore {
     _subscription: gpui::Subscription,
     lsp_tree: Entity<LanguageServerTree>,
     registered_buffers: HashMap<BufferId, usize>,
-    buffer_pull_diagnostics_result_ids: HashMap<PathBuf, HashMap<LanguageServerId, Option<String>>>,
+    buffer_pull_diagnostics_result_ids: HashMap<LanguageServerId, HashMap<PathBuf, Option<String>>>,
 }
 
 impl LocalLspStore {
@@ -2299,9 +2299,9 @@ impl LocalLspStore {
         buffer.update(cx, |buffer, cx| {
             if let Some(abs_path) = File::from_dyn(buffer.file()).map(|f| f.abs_path(cx)) {
                 self.buffer_pull_diagnostics_result_ids
-                    .entry(abs_path)
+                    .entry(server_id)
                     .or_default()
-                    .insert(server_id, result_id);
+                    .insert(abs_path, result_id);
             }
 
             buffer.update_diagnostics(server_id, set, cx)
@@ -3144,9 +3144,8 @@ impl LocalLspStore {
             self.last_workspace_edits_by_language_server
                 .remove(server_id_to_remove);
             self.language_servers.remove(server_id_to_remove);
-            for values_per_server in self.buffer_pull_diagnostics_result_ids.values_mut() {
-                values_per_server.remove(server_id_to_remove);
-            }
+            self.buffer_pull_diagnostics_result_ids
+                .remove(server_id_to_remove);
             cx.emit(LspStoreEvent::LanguageServerRemoved(*server_id_to_remove));
         }
         servers_to_remove.into_keys().collect()
@@ -3801,19 +3800,6 @@ impl LspStore {
                     }
                 }
             }
-            BufferStoreEvent::BufferDropped(buffer_id) => {
-                let abs_path = self
-                    .buffer_store
-                    .read(cx)
-                    .get(*buffer_id)
-                    .and_then(|b| File::from_dyn(b.read(cx).file()))
-                    .map(|f| f.abs_path(cx));
-                if let Some(local) = self.as_local_mut() {
-                    if let Some(abs_path) = abs_path {
-                        local.buffer_pull_diagnostics_result_ids.remove(&abs_path);
-                    }
-                }
-            }
             _ => {}
         }
     }
@@ -9737,9 +9723,7 @@ impl LspStore {
 
     fn remove_result_ids(&mut self, for_server: LanguageServerId) {
         if let Some(local) = self.as_local_mut() {
-            for values_per_server in local.buffer_pull_diagnostics_result_ids.values_mut() {
-                values_per_server.remove(&for_server);
-            }
+            local.buffer_pull_diagnostics_result_ids.remove(&for_server);
         }
     }
 
@@ -9757,8 +9741,8 @@ impl LspStore {
             .map(|f| f.abs_path(cx))?;
         self.as_local()?
             .buffer_pull_diagnostics_result_ids
-            .get(&abs_path)?
             .get(&server_id)?
+            .get(&abs_path)?
             .clone()
     }
 
@@ -9768,10 +9752,10 @@ impl LspStore {
         };
         local
             .buffer_pull_diagnostics_result_ids
-            .iter()
-            .filter_map(|(file_path, result_ids)| {
-                Some((file_path.clone(), result_ids.get(&server_id)?.clone()?))
-            })
+            .get(&server_id)
+            .into_iter()
+            .flatten()
+            .filter_map(|(abs_path, result_id)| Some((abs_path.clone(), result_id.clone()?)))
             .collect()
     }