From 71eeeedc05f7ed6978f2ebfc6f169a7bc9cc8907 Mon Sep 17 00:00:00 2001 From: Antonio Scandurra Date: Thu, 17 Nov 2022 12:21:51 +0100 Subject: [PATCH] Don't replace newer diagnostics with older ones --- .../20221109000000_test_schema.sql | 1 + .../20221111092550_reconnection_support.sql | 1 + crates/collab/src/db.rs | 11 ++++++++--- crates/collab/src/integration_tests.rs | 12 ++++++++---- crates/project/src/project.rs | 4 ++++ crates/project/src/worktree.rs | 16 ++++++++++------ crates/rpc/proto/zed.proto | 1 + 7 files changed, 33 insertions(+), 13 deletions(-) diff --git a/crates/collab/migrations.sqlite/20221109000000_test_schema.sql b/crates/collab/migrations.sqlite/20221109000000_test_schema.sql index 66925fddd55fba36464eef2fab7b4f30af75362f..bb216eb32d2e8beef1fda0ff55a4ac94a7cc7f4b 100644 --- a/crates/collab/migrations.sqlite/20221109000000_test_schema.sql +++ b/crates/collab/migrations.sqlite/20221109000000_test_schema.sql @@ -82,6 +82,7 @@ CREATE TABLE "worktree_diagnostic_summaries" ( "language_server_id" INTEGER NOT NULL, "error_count" INTEGER NOT NULL, "warning_count" INTEGER NOT NULL, + "version" INTEGER NOT NULL, PRIMARY KEY(project_id, worktree_id, path), FOREIGN KEY(project_id, worktree_id) REFERENCES worktrees (project_id, id) ON DELETE CASCADE ); diff --git a/crates/collab/migrations/20221111092550_reconnection_support.sql b/crates/collab/migrations/20221111092550_reconnection_support.sql index 4f4ad6aede8b2160c19d0899b505a9ca1c48b3aa..5696dc4a4427bcb312717eafa1715476ea5116a7 100644 --- a/crates/collab/migrations/20221111092550_reconnection_support.sql +++ b/crates/collab/migrations/20221111092550_reconnection_support.sql @@ -44,6 +44,7 @@ CREATE TABLE "worktree_diagnostic_summaries" ( "language_server_id" INTEGER NOT NULL, "error_count" INTEGER NOT NULL, "warning_count" INTEGER NOT NULL, + "version" INTEGER NOT NULL, PRIMARY KEY(project_id, worktree_id, path), FOREIGN KEY(project_id, worktree_id) REFERENCES worktrees (project_id, id) ON DELETE CASCADE ); diff --git a/crates/collab/src/db.rs b/crates/collab/src/db.rs index 9485d1aae0d201de5843950cba31ce99da84fd19..2823b49255a8d0ac77d63aa04183d4b67aa6e83a 100644 --- a/crates/collab/src/db.rs +++ b/crates/collab/src/db.rs @@ -1813,13 +1813,15 @@ where path, language_server_id, error_count, - warning_count + warning_count, + version ) - VALUES ($1, $2, $3, $4, $5, $6) + VALUES ($1, $2, $3, $4, $5, $6, $7) ON CONFLICT (project_id, worktree_id, path) DO UPDATE SET language_server_id = excluded.language_server_id, error_count = excluded.error_count, - warning_count = excluded.warning_count + warning_count = excluded.warning_count, + version = excluded.version ", ) .bind(project_id) @@ -1828,6 +1830,7 @@ where .bind(summary.language_server_id as i64) .bind(summary.error_count as i32) .bind(summary.warning_count as i32) + .bind(summary.version as i32) .execute(&mut tx) .await?; @@ -2042,6 +2045,7 @@ where language_server_id: summary.language_server_id as u64, error_count: summary.error_count as u32, warning_count: summary.warning_count as u32, + version: summary.version as u32, }); } } @@ -2666,6 +2670,7 @@ struct WorktreeDiagnosticSummary { language_server_id: i64, error_count: i32, warning_count: i32, + version: i32, } id_type!(LanguageServerId); diff --git a/crates/collab/src/integration_tests.rs b/crates/collab/src/integration_tests.rs index 1236af42cb05af4b544f74166284d34aa3e44739..d730b5d4e777640b3d3b643a31cb3b1225b195b6 100644 --- a/crates/collab/src/integration_tests.rs +++ b/crates/collab/src/integration_tests.rs @@ -2412,9 +2412,10 @@ async fn test_collaborating_with_diagnostics( path: Arc::from(Path::new("a.rs")), }, DiagnosticSummary { + language_server_id: 0, error_count: 1, warning_count: 0, - ..Default::default() + version: 2, }, )] ) @@ -2444,9 +2445,10 @@ async fn test_collaborating_with_diagnostics( path: Arc::from(Path::new("a.rs")), }, DiagnosticSummary { + language_server_id: 0, error_count: 1, warning_count: 0, - ..Default::default() + version: 2, }, )] ); @@ -2484,9 +2486,10 @@ async fn test_collaborating_with_diagnostics( path: Arc::from(Path::new("a.rs")), }, DiagnosticSummary { + language_server_id: 0, error_count: 1, warning_count: 1, - ..Default::default() + version: 3, }, )] ); @@ -2500,9 +2503,10 @@ async fn test_collaborating_with_diagnostics( path: Arc::from(Path::new("a.rs")), }, DiagnosticSummary { + language_server_id: 0, error_count: 1, warning_count: 1, - ..Default::default() + version: 3, }, )] ); diff --git a/crates/project/src/project.rs b/crates/project/src/project.rs index 503ae8d4b24cc290e539121e50e2803939a9ecc7..9d7323f989254cf9ef3728f07338e953b8b7397b 100644 --- a/crates/project/src/project.rs +++ b/crates/project/src/project.rs @@ -223,6 +223,7 @@ pub struct DiagnosticSummary { pub language_server_id: usize, pub error_count: usize, pub warning_count: usize, + pub version: usize, } #[derive(Debug, Clone)] @@ -293,12 +294,14 @@ pub struct ProjectTransaction(pub HashMap, language::Transac impl DiagnosticSummary { fn new<'a, T: 'a>( language_server_id: usize, + version: usize, diagnostics: impl IntoIterator>, ) -> Self { let mut this = Self { language_server_id, error_count: 0, warning_count: 0, + version, }; for entry in diagnostics { @@ -324,6 +327,7 @@ impl DiagnosticSummary { language_server_id: self.language_server_id as u64, error_count: self.error_count as u32, warning_count: self.warning_count as u32, + version: self.version as u32, } } } diff --git a/crates/project/src/worktree.rs b/crates/project/src/worktree.rs index 836ac55b661157f8c2f0297567b55143b8b26d2a..04e77cf09af3a395896d5bba9d7ef2fb54ba1ccf 100644 --- a/crates/project/src/worktree.rs +++ b/crates/project/src/worktree.rs @@ -366,6 +366,7 @@ impl Worktree { Worktree::Remote(worktree) => &worktree.diagnostic_summaries, } .iter() + .filter(|(_, summary)| !summary.is_empty()) .map(|(path, summary)| (path.0.clone(), *summary)) } @@ -516,7 +517,8 @@ impl LocalWorktree { .diagnostic_summaries .remove(&PathKey(worktree_path.clone())) .unwrap_or_default(); - let new_summary = DiagnosticSummary::new(language_server_id, &diagnostics); + let new_summary = + DiagnosticSummary::new(language_server_id, old_summary.version + 1, &diagnostics); if !new_summary.is_empty() { self.diagnostic_summaries .insert(PathKey(worktree_path.clone()), new_summary); @@ -1106,15 +1108,17 @@ impl RemoteWorktree { path: Arc, summary: &proto::DiagnosticSummary, ) { - let summary = DiagnosticSummary { + let old_summary = self.diagnostic_summaries.get(&PathKey(path.clone())); + let new_summary = DiagnosticSummary { language_server_id: summary.language_server_id as usize, error_count: summary.error_count as usize, warning_count: summary.warning_count as usize, + version: summary.version as usize, }; - if summary.is_empty() { - self.diagnostic_summaries.remove(&PathKey(path)); - } else { - self.diagnostic_summaries.insert(PathKey(path), summary); + if old_summary.map_or(true, |old_summary| { + new_summary.version >= old_summary.version + }) { + self.diagnostic_summaries.insert(PathKey(path), new_summary); } } diff --git a/crates/rpc/proto/zed.proto b/crates/rpc/proto/zed.proto index 30c1c89e8f8b393f96e13c96ad9ea42e14ff7a7e..b6d4b83b3b8e65c1c3c1a20ce7dc40c4452d31cb 100644 --- a/crates/rpc/proto/zed.proto +++ b/crates/rpc/proto/zed.proto @@ -652,6 +652,7 @@ message DiagnosticSummary { uint64 language_server_id = 2; uint32 error_count = 3; uint32 warning_count = 4; + uint32 version = 5; } message UpdateLanguageServer {