]> git.lizzy.rs Git - rust.git/commitdiff
Avoid transmitting unchanged diagnostics
authorMichał Muskała <michal@muskala.eu>
Wed, 17 Feb 2021 11:38:11 +0000 (12:38 +0100)
committerMichał Muskała <michal@muskala.eu>
Wed, 17 Feb 2021 11:45:17 +0000 (12:45 +0100)
Reading through the code for diagnostics and observing debug logs, I noticed
that diagnostics are transmitted after every change for every opened file,
even if they haven't changed (especially visible for files with no diagnostics).

This change avoids marking files as "changed" if diagnostics are the same to what
was already sent before. This will only work if diagnostics are always produced in
the same order, but from my limited testing it seems this is the case.

crates/rust-analyzer/src/diagnostics.rs

index ee6f2a867bc3eeaa50303f10cf161ef6da462b02..f01548c50a8af7cc90f90f1a555992a41ff67a81 100644 (file)
@@ -65,6 +65,17 @@ pub(crate) fn set_native_diagnostics(
         file_id: FileId,
         diagnostics: Vec<lsp_types::Diagnostic>,
     ) {
+        if let Some(existing_diagnostics) = self.native.get(&file_id) {
+            if existing_diagnostics.len() == diagnostics.len()
+                && diagnostics
+                    .iter()
+                    .zip(existing_diagnostics)
+                    .all(|(new, existing)| are_diagnostics_equal(new, existing))
+            {
+                return;
+            }
+        }
+
         self.native.insert(file_id, diagnostics);
         self.changes.insert(file_id);
     }