Merge pull request #849 from zed-industries/fix-project-diagnostic-ui-glitch

Antonio Scandurra created

Remove summaries that don't contain any errors or warnings

Change summary

crates/collab/src/rpc.rs       | 19 +++++++++++++++++++
crates/project/src/project.rs  | 14 ++++----------
crates/project/src/worktree.rs | 35 +++++++++++++++++++----------------
crates/rpc/proto/zed.proto     |  2 --
crates/rpc/src/rpc.rs          |  2 +-
5 files changed, 43 insertions(+), 29 deletions(-)

Detailed changes

crates/collab/src/rpc.rs 🔗

@@ -2363,6 +2363,25 @@ mod tests {
                 ]
             );
         });
+
+        // Simulate a language server reporting no errors for a file.
+        fake_language_server.notify::<lsp::notification::PublishDiagnostics>(
+            lsp::PublishDiagnosticsParams {
+                uri: lsp::Url::from_file_path("/a/a.rs").unwrap(),
+                version: None,
+                diagnostics: vec![],
+            },
+        );
+        project_a
+            .condition(cx_a, |project, cx| {
+                project.diagnostic_summaries(cx).collect::<Vec<_>>() == &[]
+            })
+            .await;
+        project_b
+            .condition(cx_b, |project, cx| {
+                project.diagnostic_summaries(cx).collect::<Vec<_>>() == &[]
+            })
+            .await;
     }
 
     #[gpui::test(iterations = 10)]

crates/project/src/project.rs 🔗

@@ -158,8 +158,6 @@ pub struct ProjectPath {
 pub struct DiagnosticSummary {
     pub error_count: usize,
     pub warning_count: usize,
-    pub info_count: usize,
-    pub hint_count: usize,
 }
 
 #[derive(Debug)]
@@ -195,8 +193,6 @@ impl DiagnosticSummary {
         let mut this = Self {
             error_count: 0,
             warning_count: 0,
-            info_count: 0,
-            hint_count: 0,
         };
 
         for entry in diagnostics {
@@ -204,8 +200,6 @@ impl DiagnosticSummary {
                 match entry.diagnostic.severity {
                     DiagnosticSeverity::ERROR => this.error_count += 1,
                     DiagnosticSeverity::WARNING => this.warning_count += 1,
-                    DiagnosticSeverity::INFORMATION => this.info_count += 1,
-                    DiagnosticSeverity::HINT => this.hint_count += 1,
                     _ => {}
                 }
             }
@@ -214,13 +208,15 @@ impl DiagnosticSummary {
         this
     }
 
+    pub fn is_empty(&self) -> bool {
+        self.error_count == 0 && self.warning_count == 0
+    }
+
     pub fn to_proto(&self, path: &Path) -> proto::DiagnosticSummary {
         proto::DiagnosticSummary {
             path: path.to_string_lossy().to_string(),
             error_count: self.error_count as u32,
             warning_count: self.warning_count as u32,
-            info_count: self.info_count as u32,
-            hint_count: self.hint_count as u32,
         }
     }
 }
@@ -3497,8 +3493,6 @@ impl Project {
         for (_, path_summary) in self.diagnostic_summaries(cx) {
             summary.error_count += path_summary.error_count;
             summary.warning_count += path_summary.warning_count;
-            summary.info_count += path_summary.info_count;
-            summary.hint_count += path_summary.hint_count;
         }
         summary
     }

crates/project/src/worktree.rs 🔗

@@ -233,8 +233,6 @@ impl Worktree {
                             DiagnosticSummary {
                                 error_count: summary.error_count as usize,
                                 warning_count: summary.warning_count as usize,
-                                info_count: summary.info_count as usize,
-                                hint_count: summary.hint_count as usize,
                             },
                         )
                     }),
@@ -568,9 +566,15 @@ impl LocalWorktree {
         _: &mut ModelContext<Worktree>,
     ) -> Result<()> {
         let summary = DiagnosticSummary::new(&diagnostics);
-        self.diagnostic_summaries
-            .insert(PathKey(worktree_path.clone()), summary.clone());
-        self.diagnostics.insert(worktree_path.clone(), diagnostics);
+        if summary.is_empty() {
+            self.diagnostic_summaries
+                .remove(&PathKey(worktree_path.clone()));
+            self.diagnostics.remove(&worktree_path);
+        } else {
+            self.diagnostic_summaries
+                .insert(PathKey(worktree_path.clone()), summary.clone());
+            self.diagnostics.insert(worktree_path.clone(), diagnostics);
+        }
 
         if let Some(share) = self.share.as_ref() {
             self.client
@@ -581,8 +585,6 @@ impl LocalWorktree {
                         path: worktree_path.to_string_lossy().to_string(),
                         error_count: summary.error_count as u32,
                         warning_count: summary.warning_count as u32,
-                        info_count: summary.info_count as u32,
-                        hint_count: summary.hint_count as u32,
                     }),
                 })
                 .log_err();
@@ -846,15 +848,16 @@ impl RemoteWorktree {
         path: Arc<Path>,
         summary: &proto::DiagnosticSummary,
     ) {
-        self.diagnostic_summaries.insert(
-            PathKey(path.clone()),
-            DiagnosticSummary {
-                error_count: summary.error_count as usize,
-                warning_count: summary.warning_count as usize,
-                info_count: summary.info_count as usize,
-                hint_count: summary.hint_count as usize,
-            },
-        );
+        let summary = DiagnosticSummary {
+            error_count: summary.error_count as usize,
+            warning_count: summary.warning_count as usize,
+        };
+        if summary.is_empty() {
+            self.diagnostic_summaries.remove(&PathKey(path.clone()));
+        } else {
+            self.diagnostic_summaries
+                .insert(PathKey(path.clone()), summary);
+        }
     }
 }
 

crates/rpc/proto/zed.proto 🔗

@@ -453,8 +453,6 @@ message DiagnosticSummary {
     string path = 1;
     uint32 error_count = 2;
     uint32 warning_count = 3;
-    uint32 info_count = 4;
-    uint32 hint_count = 5;
 }
 
 message UpdateLanguageServer {

crates/rpc/src/rpc.rs 🔗

@@ -5,4 +5,4 @@ pub mod proto;
 pub use conn::Connection;
 pub use peer::*;
 
-pub const PROTOCOL_VERSION: u32 = 13;
+pub const PROTOCOL_VERSION: u32 = 14;