Revert "lsp: Do not reuse disk-based diagnostics (#46437)" (#46487)

Marshall Bowers created

This reverts commit dd43891521484dc25d520e3c1551d9d211a1f2fa.

This commit was causing issue with diagnostics:
https://zed-industries.slack.com/archives/C07NUKHLVUZ/p1767999287421729

Release Notes:

- Reverted #46437

Change summary

crates/project/src/lsp_store.rs     | 20 ------
crates/project/src/project_tests.rs | 91 -------------------------------
2 files changed, 1 insertion(+), 110 deletions(-)

Detailed changes

crates/project/src/lsp_store.rs 🔗

@@ -249,21 +249,6 @@ pub struct DocumentDiagnostics {
     version: Option<i32>,
 }
 
-#[cfg(test)]
-impl DocumentDiagnostics {
-    pub fn new(
-        diagnostics: Vec<DiagnosticEntry<Unclipped<PointUtf16>>>,
-        document_abs_path: PathBuf,
-        version: Option<i32>,
-    ) -> Self {
-        Self {
-            diagnostics,
-            document_abs_path,
-            version,
-        }
-    }
-}
-
 #[derive(Default, Debug)]
 struct DynamicRegistrations {
     did_change_watched_files: HashMap<String, Vec<FileSystemWatcher>>,
@@ -2475,10 +2460,7 @@ impl LocalLspStore {
         for (new_diagnostic, entry) in diagnostics {
             let start;
             let end;
-            if entry.diagnostic.is_disk_based {
-                if !new_diagnostic {
-                    continue;
-                }
+            if new_diagnostic && entry.diagnostic.is_disk_based {
                 // Some diagnostics are based on files on disk instead of buffers'
                 // current contents. Adjust these diagnostics' ranges to reflect
                 // any unsaved edits.

crates/project/src/project_tests.rs 🔗

@@ -3,7 +3,6 @@
 use crate::{
     Event,
     git_store::{GitStoreEvent, RepositoryEvent, StatusEntry, pending_op},
-    lsp_store::{DocumentDiagnostics, DocumentDiagnosticsUpdate},
     task_inventory::TaskContexts,
     task_store::TaskSettingsLocation,
     *,
@@ -2879,96 +2878,6 @@ async fn test_diagnostics_from_multiple_language_servers(cx: &mut gpui::TestAppC
     });
 }
 
-#[gpui::test]
-async fn test_disk_based_diagnostics_not_reused(cx: &mut gpui::TestAppContext) {
-    init_test(cx);
-
-    let fs = FakeFs::new(cx.executor());
-    fs.insert_tree(path!("/dir"), json!({ "a.rs": "fn a() { A }" }))
-        .await;
-
-    let project = Project::test(fs, [Path::new(path!("/dir"))], cx).await;
-    let lsp_store = project.read_with(cx, |project, _| project.lsp_store.clone());
-    let buffer = project
-        .update(cx, |project, cx| {
-            project.open_local_buffer(path!("/dir/a.rs"), cx)
-        })
-        .await
-        .unwrap();
-
-    // Setup an initial disk-based diagnostic, which will later become old, so
-    // we can later assert that it is ignored when merging diagnostic entries.
-    let diagnostic = DiagnosticEntry {
-        range: Unclipped(PointUtf16::new(0, 9))..Unclipped(PointUtf16::new(0, 10)),
-        diagnostic: Diagnostic {
-            is_disk_based: true,
-            ..Diagnostic::default()
-        },
-    };
-    let diagnostic_update = DocumentDiagnosticsUpdate {
-        diagnostics: DocumentDiagnostics::new(
-            vec![diagnostic],
-            PathBuf::from(path!("/dir/a.rs")),
-            None,
-        ),
-        result_id: None,
-        server_id: LanguageServerId(0),
-        disk_based_sources: Cow::Borrowed(&[]),
-        registration_id: None,
-    };
-    lsp_store.update(cx, |lsp_store, cx| {
-        lsp_store
-            .merge_diagnostic_entries(vec![diagnostic_update], |_, _, _| false, cx)
-            .unwrap();
-    });
-
-    // Quick sanity check, ensure that the initial diagnostic is part of the
-    // buffer's diagnostics.
-    buffer.update(cx, |buffer, _| {
-        let snapshot = buffer.snapshot();
-        let diagnostics: Vec<_> = snapshot
-            .diagnostics_in_range::<_, Point>(0..buffer.len(), false)
-            .collect();
-
-        assert_eq!(diagnostics.len(), 1);
-    });
-
-    // We'll now merge the diagnostic entries with a new diagnostic update, with
-    // no diagnostics. This time around, the `merge` closure will return `true`
-    // to ensure that old diagnostics are retained, ensuring that the first
-    // diagnostic does get added to the full list of diagnostics, even though
-    // it'll later be ignored.
-    let diagnostic_update = lsp_store::DocumentDiagnosticsUpdate {
-        diagnostics: lsp_store::DocumentDiagnostics::new(
-            vec![],
-            PathBuf::from(path!("/dir/a.rs")),
-            None,
-        ),
-        result_id: None,
-        server_id: LanguageServerId(0),
-        disk_based_sources: Cow::Borrowed(&[]),
-        registration_id: None,
-    };
-    lsp_store.update(cx, |lsp_store, cx| {
-        lsp_store
-            .merge_diagnostic_entries(vec![diagnostic_update], |_, _, _| true, cx)
-            .unwrap();
-    });
-
-    // We can now assert that the initial, disk-based diagnostic has been
-    // removed from the buffer's diagnostics, even if the `merge` closure
-    // returned `true`, informing that the old diagnostic could be reused.
-    // The old disk-based diagnostic should be gone, NOT retained
-    buffer.update(cx, |buffer, _| {
-        let snapshot = buffer.snapshot();
-        let diagnostics: Vec<_> = snapshot
-            .diagnostics_in_range::<_, Point>(0..buffer.len(), false)
-            .collect();
-
-        assert_eq!(diagnostics.len(), 0);
-    });
-}
-
 #[gpui::test]
 async fn test_edits_from_lsp2_with_past_version(cx: &mut gpui::TestAppContext) {
     init_test(cx);